From 5aa33919454d70f2fa383f5fbe56a29fc0d2e2fc Mon Sep 17 00:00:00 2001 From: Cedric Bastoul Date: Wed, 25 Sep 2002 17:50:10 +0100 Subject: [PATCH] piplib 1.0 --- LICENSE | 259 ++++ Makefile.in | 224 +++ README | 88 ++ configure.in | 161 +++ doc/pip.ps | 3369 +++++++++++++++++++++++++++++++++++++++++++++ example/Makefile | 21 + example/big.dat | 9 + example/big.pol | 7 + example/cg1.dat | 15 + example/cg1.pol | 13 + example/esced.dat | 79 ++ example/esced.pol | 25 + example/ex.dat | 8 + example/ex.pol | 7 + example/ex2.dat | 8 + example/ex2.pol | 7 + example/example.c | 30 + example/fimmel.dat | 12 + example/fimmel.pol | 10 + include/piplib/funcall.h | 26 + include/piplib/piplib.h | 140 ++ include/piplib/piplib32.h | 15 + include/piplib/piplib64.h | 15 + include/piplib/sol.h | 22 + include/piplib/tab.h | 51 + include/piplib/type.h | 25 + source/integrer.c | 293 ++++ source/maind.c | 258 ++++ source/piplib.c | 549 ++++++++ source/sol.c | 638 +++++++++ source/tab.c | 261 ++++ source/traiter.c | 602 ++++++++ test/boulet.dat | 72 + test/boulet.ll | 71 + test/bouleti.dat | 72 + test/bouleti.ll | 419 ++++++ test/crescat.dat | 15 + test/dirk.dat | 12 + test/dirk.ll | 41 + test/dirks.ll | 2 + test/discr.dat | 23 + test/equus.dat | 7 + test/invert.dat | 10 + test/invert.ll | 11 + test/linear.dat | 10 + test/lineri.dat | 9 + test/lineri.ll | 10 + test/loz.dat | 15 + test/loz.ll | 13 + test/max.dat | 9 + test/max.ll | 22 + test/maxb.dat | 9 + test/maxb.ll | 4 + test/pairi.dat | 7 + test/petit.dat | 9 + test/rairo.dat | 9 + test/rairoi.dat | 9 + test/test.dat | 10 + test/test10i.dat | 15 + test/test11.dat | 16 + test/test11i.dat | 16 + test/test12.dat | 17 + test/test12i.dat | 17 + test/test12i.ll | 14 + test/test2.dat | 7 + test/test2i.dat | 7 + test/test3.dat | 8 + test/test3i.dat | 8 + test/test4.dat | 9 + test/test4i.dat | 9 + test/test5.dat | 10 + test/test5i.dat | 10 + test/test6.dat | 11 + test/test6i.dat | Bin 0 -> 206 bytes test/test7.dat | 12 + test/test7i.dat | 12 + test/test8i.dat | 13 + test/test9i.dat | 14 + 78 files changed, 8372 insertions(+) create mode 100644 LICENSE create mode 100644 Makefile.in create mode 100644 README create mode 100644 configure.in create mode 100644 doc/pip.ps create mode 100644 example/Makefile create mode 100644 example/big.dat create mode 100644 example/big.pol create mode 100644 example/cg1.dat create mode 100644 example/cg1.pol create mode 100644 example/esced.dat create mode 100644 example/esced.pol create mode 100644 example/ex.dat create mode 100644 example/ex.pol create mode 100644 example/ex2.dat create mode 100644 example/ex2.pol create mode 100644 example/example.c create mode 100644 example/fimmel.dat create mode 100644 example/fimmel.pol create mode 100644 include/piplib/funcall.h create mode 100644 include/piplib/piplib.h create mode 100644 include/piplib/piplib32.h create mode 100644 include/piplib/piplib64.h create mode 100644 include/piplib/sol.h create mode 100644 include/piplib/tab.h create mode 100644 include/piplib/type.h create mode 100644 source/integrer.c create mode 100644 source/maind.c create mode 100644 source/piplib.c create mode 100644 source/sol.c create mode 100644 source/tab.c create mode 100644 source/traiter.c create mode 100644 test/boulet.dat create mode 100644 test/boulet.ll create mode 100644 test/bouleti.dat create mode 100644 test/bouleti.ll create mode 100644 test/crescat.dat create mode 100644 test/dirk.dat create mode 100644 test/dirk.ll create mode 100644 test/dirks.ll create mode 100644 test/discr.dat create mode 100644 test/equus.dat create mode 100644 test/invert.dat create mode 100644 test/invert.ll create mode 100644 test/linear.dat create mode 100644 test/lineri.dat create mode 100644 test/lineri.ll create mode 100644 test/loz.dat create mode 100644 test/loz.ll create mode 100644 test/max.dat create mode 100644 test/max.ll create mode 100644 test/maxb.dat create mode 100644 test/maxb.ll create mode 100644 test/pairi.dat create mode 100644 test/petit.dat create mode 100644 test/rairo.dat create mode 100644 test/rairoi.dat create mode 100644 test/test.dat create mode 100644 test/test10i.dat create mode 100644 test/test11.dat create mode 100644 test/test11i.dat create mode 100644 test/test12.dat create mode 100644 test/test12i.dat create mode 100644 test/test12i.ll create mode 100644 test/test2.dat create mode 100644 test/test2i.dat create mode 100644 test/test3.dat create mode 100644 test/test3i.dat create mode 100644 test/test4.dat create mode 100644 test/test4i.dat create mode 100644 test/test5.dat create mode 100644 test/test5i.dat create mode 100644 test/test6.dat create mode 100644 test/test6i.dat create mode 100644 test/test7.dat create mode 100644 test/test7i.dat create mode 100644 test/test8i.dat create mode 100644 test/test9i.dat diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e58e623 --- /dev/null +++ b/LICENSE @@ -0,0 +1,259 @@ +GNU GENERAL PUBLIC LICENSE + + Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, +Cambridge, MA 02139, 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 diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..8413586 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,224 @@ +# +# /**-------------------------------------------------------------------** +# ** PIP/PipLib ** +# **-------------------------------------------------------------------** +# ** makefile.in ** +# **-------------------------------------------------------------------** +# ** First version: july 28th 2001 ** +# **-------------------------------------------------------------------**/ +# +# makefile.in (or makefile if generated) of PIP/PipLib. makefile.in is not a +# makefile, you must run the 'configure' shellscript to generate the makefile +# thanks to this file. + + +#/***************************************************************************** +# * Variables substituted with configure * +# *****************************************************************************/ + +# PipLib's version. +VERSION = @VERSION@ +# versions to compile. +TO_BUILD = @TO_BUILD@ +# Target architecture and system +TARGET = @target@ +# C compiler. +CC = @CC@ +# Tool to create symbolic links. +LN_S = @LN_S@ +# Tool to provide speed access to archives. +RANLIB = @RANLIB@ +# Shared library extension +SHEXT = @SHEXT@ +# Executable suffix +EXEC_SUFFIX = @EXEC_SUFFIX@ +# Extra flags +EXTRA_FLAGS = @EXTRA_FLAGS@ +# Extra libraries +EXTRA_LIBS = @EXTRA_LIBS@ +# Bits for integers +INT_BITS = @INT_BITS@ +# Flags fos integers +INT_DFLAGS = @INT_DFLAGS@ +# Bits for long long +LONG_BITS = @LONG_BITS@ +# Flags fos long long +LONG_DFLAGS = @LONG_DFLAGS@ +# Installation directory. +PIPLIB_INS = @prefix@ +# Installation software. +INSTALL = @INSTALL@ +# Packages to build. +PACKAGES = @PACKAGES@ +# Packages to install. +TO_INSTALL = @TO_INSTALL@ + + +#/***************************************************************************** +# * PipLib's variables * +# *****************************************************************************/ + + +# Directory of PipLib's sources (.c). +PIPLIB_SRC = ./source +# Directory of PipLib's include (.h). +PIPLIB_INC = ./include +# Directory for object files and software and library before installation, its +# name depends on architecture and on operating system. +PIPLIB_OBJ = ./obj$(BITS)_$(TARGET) +# PipLib's installation subdirectories. +PIPLIB_INS_BIN = $(PIPLIB_INS)/bin +PIPLIB_INS_LIB = $(PIPLIB_INS)/lib +PIPLIB_INS_INC = $(PIPLIB_INS)/include + + +#/***************************************************************************** +# * Compiler and linker options * +# *****************************************************************************/ + + +INCFLAGS = -I $(PIPLIB_INC) +LDFLAGS = $(EXTRA_LIBS) +CFLAGS = -c $(INCFLAGS) -fomit-frame-pointer -O2 $(EXTRA_FLAGS) $(DFLAGS) + + +#/***************************************************************************** +# * Rules * +# *****************************************************************************/ + + +OBJ = $(PIPLIB_OBJ)/maind.o $(PIPLIB_OBJ)/piplib.o $(PIPLIB_OBJ)/integrer.o \ + $(PIPLIB_OBJ)/tab.o $(PIPLIB_OBJ)/traiter.o $(PIPLIB_OBJ)/sol.o + +all : $(TO_BUILD:%=%all) + +$(INT_BITS)all : + $(MAKE) "BITS=$(INT_BITS)" "DFLAGS=$(INT_DFLAGS)" tobuild + +$(LONG_BITS)all : + $(MAKE) "BITS=$(LONG_BITS)" "DFLAGS=$(LONG_DFLAGS)" tobuild + +tobuild : $(PACKAGES) + +pip : $(PIPLIB_OBJ) $(OBJ) + @echo " /*-----------------------------------------------*" + @echo " * MAKING PIP *" + @echo " *-----------------------------------------------*/" + $(CC) $(OBJ) -o $(PIPLIB_OBJ)/pip$(BITS)$(EXEC_SUFFIX) $(LDFLAGS) + +piplibshared : $(PIPLIB_OBJ) $(OBJ) + @echo " /*-----------------------------------------------*" + @echo " * MAKING PipLib (shared) *" + @echo " *-----------------------------------------------*/" + $(LD) $(OBJ) -o $(PIPLIB_OBJ)/libpiplib$(BITS).$(SHEXT).$(VERSION) \ + -lc -shared -fPIC $(LDFLAGS) + $(LDCONFIG) + +piplibstatic: $(PIPLIB_OBJ) $(OBJ) + @echo " /*-----------------------------------------------*" + @echo " * MAKING PipLib (static lib) *" + @echo " *-----------------------------------------------*/" + $(AR) q $(PIPLIB_OBJ)/libpiplib$(BITS).a.$(VERSION) $(OBJ) + $(RANLIB) $(PIPLIB_OBJ)/libpiplib$(BITS).a.$(VERSION) + +$(PIPLIB_OBJ)/piplib.o : $(PIPLIB_SRC)/piplib.c $(PIPLIB_INC)/piplib/piplib.h + $(CC) $(CFLAGS) $(PIPLIB_SRC)/piplib.c \ + -o $(PIPLIB_OBJ)/piplib.o + +$(PIPLIB_OBJ)/integrer.o : $(PIPLIB_SRC)/integrer.c \ + $(PIPLIB_INC)/piplib/piplib.h + $(CC) $(CFLAGS) $(PIPLIB_SRC)/integrer.c \ + -o $(PIPLIB_OBJ)/integrer.o + +$(PIPLIB_OBJ)/maind.o : $(PIPLIB_SRC)/maind.c $(PIPLIB_INC)/piplib/piplib.h + $(CC) $(CFLAGS) $(PIPLIB_SRC)/maind.c \ + -o $(PIPLIB_OBJ)/maind.o + +$(PIPLIB_OBJ)/tab.o : $(PIPLIB_SRC)/tab.c $(PIPLIB_INC)/piplib/piplib.h + $(CC) $(CFLAGS) $(PIPLIB_SRC)/tab.c \ + -o $(PIPLIB_OBJ)/tab.o + +$(PIPLIB_OBJ)/traiter.o : $(PIPLIB_SRC)/traiter.c $(PIPLIB_INC)/piplib/piplib.h + $(CC) $(CFLAGS) $(PIPLIB_SRC)/traiter.c \ + -o $(PIPLIB_OBJ)/traiter.o + +$(PIPLIB_OBJ)/sol.o : $(PIPLIB_SRC)/sol.c $(PIPLIB_INC)/piplib/piplib.h + $(CC) $(CFLAGS) $(PIPLIB_SRC)/sol.c \ + -o $(PIPLIB_OBJ)/sol.o + + +$(PIPLIB_OBJ): + $(INSTALL) -d $(PIPLIB_OBJ) + + +clean : + @echo " /*-----------------------------------------------*" + @echo " * CLEANING PIP/PipLib *" + @echo " *-----------------------------------------------*/" + $(RM) -rf obj* + +distclean: clean + @echo " /*-----------------------------------------------*" + @echo " * DISTCLEANING PIP/PipLib *" + @echo " *-----------------------------------------------*/" + $(RM) -f config.cache config.log config.status Makefile + + +install:: $(TO_BUILD:%=%install) + +$(INT_BITS)install : + $(MAKE) "BITS=$(INT_BITS)" "DFLAGS=$(INT_DFLAGS)" toinstall + +$(LONG_BITS)install : + $(MAKE) "BITS=$(LONG_BITS)" "DFLAGS=$(LONG_DFLAGS)" toinstall + +toinstall : $(TO_INSTALL) + +install_pip: + @echo " /*-----------------------------------------------*" + @echo " * INSTALLING PIP *" + @echo " *-----------------------------------------------*/" + ($(INSTALL) -d $(PIPLIB_INS_BIN) && \ + $(INSTALL) $(PIPLIB_OBJ)/pip$(BITS)$(EXEC_SUFFIX) $(PIPLIB_INS_BIN)) + +install_preparation: + ($(INSTALL) -d $(PIPLIB_INS_INC) && \ + $(INSTALL) -d $(PIPLIB_INS_INC)/piplib && \ + $(INSTALL) $(PIPLIB_INC)/piplib/* $(PIPLIB_INS_INC)/piplib) + +install_piplibshared: install_preparation + @echo " /*-----------------------------------------------*" + @echo " * INSTALLING PipLib (shared) *" + @echo " *-----------------------------------------------*/" + rm -f $(PIPLIB_INS_LIB)/libpiplib$(BITS).$(SHEXT) + ($(INSTALL) -d $(PIPLIB_INS_LIB) && \ + $(INSTALL) $(PIPLIB_OBJ)/libpiplib$(BITS).$(SHEXT).$(VERSION) \ + $(PIPLIB_INS_LIB) && \ + $(LN_S) $(PIPLIB_INS_LIB)/libpiplib$(BITS).$(SHEXT).$(VERSION) \ + $(PIPLIB_INS_LIB)/libpiplib$(BITS).$(SHEXT)) + +install_piplibstatic: install_preparation + @echo " /*-----------------------------------------------*" + @echo " * INSTALLING PipLib (static) *" + @echo " *-----------------------------------------------*/" + rm -f $(PIPLIB_INS_LIB)/libpiplib$(BITS).a + ($(INSTALL) -d $(PIPLIB_INS_LIB) && \ + $(INSTALL) $(PIPLIB_OBJ)/libpiplib$(BITS).a.$(VERSION) \ + $(PIPLIB_INS_LIB) && \ + $(LN_S) $(PIPLIB_INS_LIB)/libpiplib$(BITS).a.$(VERSION) \ + $(PIPLIB_INS_LIB)/libpiplib$(BITS).a) + +uninstall : + @echo " /*-----------------------------------------------*" + @echo " * UNINSTALLING PIP/PipLib *" + @echo " *-----------------------------------------------*/" + rm -f $(PIPLIB_INS_LIB)/libpiplib* + rm -rf $(PIPLIB_INS_INC)/piplib + rm -f $(PIPLIB_INS_BIN)/pip32$(EXEC_SUFFIX) \ + $(PIPLIB_INS_BIN)/pip64$(EXEC_SUFFIX) + +tgz: distclean + (cd .. && \ + tar cvf piplib-$(VERSION).tar piplib-$(VERSION) && \ + gzip piplib-$(VERSION).tar) + diff --git a/README b/README new file mode 100644 index 0000000..f5424c1 --- /dev/null +++ b/README @@ -0,0 +1,88 @@ +# +# /**-------------------------------------------------------------------** +# ** PIP/PipLib ** +# **-------------------------------------------------------------------** +# ** Parametric Integer Programming ** +# **-------------------------------------------------------------------** +# ** First version of this file: february 21th 2002 ** +# **-------------------------------------------------------------------**/ +# + +For complete informations about this software, how to build and use it, +please see the postscript file in the ./doc subdirectory (a pdf version +is available in the web site). + +# **-------------------------------------------------------------------** +# ** I. Description ** +# **-------------------------------------------------------------------**/ + +PIP/PipLib is the well known Paul Feautrier's parametric integer programming +solver. PIP is a software which finds the lexicographic minimum of the set of +integer points which lie inside a convex polyhedron. This polyhedron can depend +linearly on one or more integral parameters. If user ask for a non integral +solution, PIP can give the exact solution as an integral quotient. The heart +of PIP is the parametrized Gomory's cuts algorithm followed by parametrized +dual simplex method. The PIP Library (PipLib for short) was implemented to +allow the user to call PIP directly from his programs, without file accesses +or system calls. The user only needs to link his programs with C libraries. + +# **-------------------------------------------------------------------** +# ** II. Building PIP/PipLib ** +# **-------------------------------------------------------------------**/ + +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. 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: +cd to the directory containing the package's source code and type + + ./configure + +to configure the package for your system (while running, configure prints +some messages telling which features it is checking for), to compile the +package, type + + make + + +to install the program and/or the library, type + + make install + +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 + +# **-------------------------------------------------------------------** +# ** III Options ** +# **-------------------------------------------------------------------**/ + +By default, make will install the package's files in /usr/local/bin, +/usr/local/lib, etc. You can specify an installation prefix other than +/usr/local by giving onfigure} the option --prefix=PATH. + +By default, both PIP and the PipLib are compiled and installed. +By giving configure the option --without-pip you disable the +compilation and installation of PIP. By giving configure the option +--without-lib you disable the compilation and installation of the PipLib. + +By default, both int (32 bits) and long long int (64 bits) versions are +built. By giving configure the option --enable-int you ask for int +version only and by giving configure the option --enable-llint you +ask for long long int version only. + +# **-------------------------------------------------------------------** +# ** IV Running PIP ** +# **-------------------------------------------------------------------**/ + +To run PIP, simply type 'pip32' ou 'pip64', optionally followed by the name +of an input file. For more informations, please check the ./doc subdirectory. diff --git a/configure.in b/configure.in new file mode 100644 index 0000000..fbcb73b --- /dev/null +++ b/configure.in @@ -0,0 +1,161 @@ + +dnl /**-------------------------------------------------------------------** +dnl ** PIPLIB ** +dnl **-------------------------------------------------------------------** +dnl ** configure.in ** +dnl **-------------------------------------------------------------------** +dnl ** First version: august 11th 2001 ** +dnl **-------------------------------------------------------------------**/ +dnl +dnl Input file for autoconf to build a configuration shellscript. + + +AC_PREREQ(2.13) +AC_INIT(./source/piplib.c) +VERSION="1.0" + + +dnl /************************************************************************** +dnl * Checking * +dnl **************************************************************************/ + + +dnl Checks for typedefs, structures, and compiler characteristics. +AC_CANONICAL_SYSTEM + +dnl Checks for programs. +AC_PROG_CC +AC_PROG_LN_S +AC_PROG_RANLIB +AC_PROG_MAKE_SET +AC_CHECK_PROG(CD, cd) +dnl Configure needs an empty install.sh file with this, i HATE that... +AC_PROG_INSTALL + +dnl Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST +AC_TYPE_SIZE_T + + +dnl Checks for libraries. +dnl Replace `main' with a function in -lc: +dnl AC_CHECK_LIB(c, main) + + +dnl Checks for header files. +AC_HEADER_STDC + + +dnl Set some system dependant values. +case "$target" in + i*-pc-cygwin) + SHEXT="dll" + EXEC_SUFFIX=".exe" + EXTRA_FLAGS="-DCYGWIN" + EXTRA_LIBS="-lcygwin -lkernel32" + PIPLIB="piplibstatic" + INSTALL_PIPLIB="install_piplibstatic" ;; + *) + SHEXT="so" + EXEC_SUFFIX="" + EXTRA_FLAGS="" + EXTRA_LIBS="" + PIPLIB="piplibshared piplibstatic" + INSTALL_PIPLIB="install_piplibshared install_piplibstatic" ;; +esac + + +dnl Checks sizeof the two supported cases. +AC_CHECK_SIZEOF(int,1) +AC_CHECK_SIZEOF(long long int,1) + + +dnl /************************************************************************** +dnl * Option setting * +dnl **************************************************************************/ + + +dnl The different packages that can be built and installed. +PIP="pip" +INSTALL_PIP="install_pip" +TO_BUILD="64 32" +INT_BITS=`expr $ac_cv_sizeof_int \* 8` +INT_DFLAGS=-DLINEAR_VALUE_IS_INT +LONG_BITS=`expr $ac_cv_sizeof_long_long_int \* 8` +LONG_DFLAGS=-DLINEAR_VALUE_IS_LONGLONG + +dnl Options. +dnl --with-pip=yes, --with-pip=no ou --without-pip +dnl --with-lib=yes, --with-lib=no ou --without-lib +AC_ARG_WITH(pip, + [ --without-pip disable the compilation of pip], + [ echo "Package pip : $withval" && + if test "$withval"="no" ; then + PIP="" + INSTALL_PIP="" + fi ]) +AC_ARG_WITH(lib, + [ --without-lib disable the compilation of libs], + [ echo "Package lib : $withval" && + if test "$withval"="no" ; then + PIPLIB="" + INSTALL_PIPLIB="" + fi ]) + +AC_ARG_ENABLE(int-version, + [ --enable-int-version Only 'int' version is built], + [ echo "Package int : $enableval" && + if test "$enableval"="no" ; then + TO_BUILD="32" + fi ]) + +AC_ARG_ENABLE(llint-version, + [ --enable-llint-version Only 'long long int' version is built], + [ echo "Package long long int : $enableval" && + if test "$enableval"="no" ; then + TO_BUILD="64" + fi ]) + +dnl Packages to build. +PACKAGES="$PIPLIB $PIP" +TO_INSTALL="$INSTALL_PIPLIB $INSTALL_PIP" + + +dnl /************************************************************************** +dnl * Substitutions * +dnl **************************************************************************/ + + +dnl Substitutions to do in Makefile.in. +AC_SUBST(VERSION) +AC_SUBST(TO_BUILD) +AC_SUBST(target) +AC_SUBST(CC) +AC_SUBST(LN_S) +AC_SUBST(RANLIB) +AC_SUBST(SHEXT) +AC_SUBST(EXEC_SUFFIX) +AC_SUBST(EXTRA_FLAGS) +AC_SUBST(EXTRA_LIBS) + +dnl int/long bits and compilation flags +AC_SUBST(INT_BITS) +AC_SUBST(INT_DFLAGS) +AC_SUBST(LONG_BITS) +AC_SUBST(LONG_DFLAGS) + +AC_SUBST(prefix) +AC_SUBST(INSTALL) +AC_SUBST(PACKAGES) +AC_SUBST(TO_INSTALL) + +dnl Makefile creation. +AC_OUTPUT(Makefile) + + +echo " /*-----------------------------------------------*" +echo " * PIP/PipLib configuration is OK *" +echo " *-----------------------------------------------*/" +echo "It appears that your system is OK to start PIP/PipLib compilation. You" +echo "need now to type \"make\" to buid the program, then \"make install\" to" +echo "install it on your system." diff --git a/doc/pip.ps b/doc/pip.ps new file mode 100644 index 0000000..c06c195 --- /dev/null +++ b/doc/pip.ps @@ -0,0 +1,3369 @@ +%!PS-Adobe-2.0 +%%Creator: dvips(k) 5.86f Copyright 2001 Radical Eye Software +%%Title: pip.dvi +%%Pages: 23 +%%PageOrder: Ascend +%%BoundingBox: 0 0 596 842 +%%EndComments +%DVIPSWebPage: (www.radicaleye.com) +%DVIPSCommandLine: dvips -o pip.ps pip.dvi +%DVIPSParameters: dpi=600, compressed +%DVIPSSource: TeX output 2002.09.25:1728 +%%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: 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 +TeXDict begin 39158280 55380996 1000 600 600 (pip.dvi) +@start +%DVIPSBitmapFont: Fa cmr10 10 23 +/Fa 23 122 df<121C127FEAFF80A5EA7F00121C0909798817>46 +D66 D80 D<003FB812E0A3D9C003EB +001F273E0001FE130348EE01F00078160000701770A300601730A400E01738481718A4C7 +1600B3B0913807FF80011FB612E0A335397DB83C>84 D97 +DI100 DI104 DI108 D<2703F00FF0EB1FE000FFD93FFCEB7FF8913AF03F01E07E903BF1C01F +83803F3D0FF3800FC7001F802603F70013CE01FE14DC49D907F8EB0FC0A2495CA3495CB3 +A3486C496CEB1FE0B500C1B50083B5FCA340257EA445>I<3903F00FF000FFEB3FFCECF0 +3F9039F1C01F803A0FF3800FC03803F70013FE496D7EA25BA35BB3A3486C497EB500C1B5 +1280A329257EA42E>II<3903F01FE000FFEB7FF89038F1E07E9039F3 +801F803A0FF7000FC0D803FEEB07E049EB03F04914F849130116FC150016FEA3167FAA16 +FEA3ED01FCA26DEB03F816F06D13076DEB0FE001F614C09039F7803F009038F1E07E9038 +F0FFF8EC1FC091C8FCAB487EB512C0A328357EA42E>I<3807E01F00FFEB7FC09038E1E3 +E09038E387F0380FE707EA03E613EE9038EC03E09038FC0080491300A45BB3A2487EB512 +F0A31C257EA421>114 DI<1318A51338A31378A313F8120112031207001FB5FCB6FCA2D801F8C7FC +B215C0A93800FC011580EB7C03017E13006D5AEB0FFEEB01F81A347FB220>IIIIII +E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fb cmr7 7 1 +/Fb 1 50 df<13381378EA01F8121F12FE12E01200B3AB487EB512F8A215267BA521>49 +D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fc cmsy8 8 1 +/Fc 1 49 df<137813FE1201A3120313FCA3EA07F8A313F0A2EA0FE0A313C0121F1380A3 +EA3F00A3123E127E127CA35AA35A0F227EA413>48 D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fd cmex10 10 6 +/Fd 6 111 df56 D58 +D60 D62 +D88 +D110 D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fe cmr8 8 3 +/Fe 3 62 df<130C133C137CEA03FC12FFEAFC7C1200B3B113FE387FFFFEA2172C7AAB23 +>49 DI61 D +E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Ff cmmi8 8 8 +/Ff 8 117 df<000FB8FCA23B1FC003F8003F0100151F001C4A130E123C003801071406 +123000704A130EA20060010F140C12E0485CA2141FC715005DA2143FA292C8FCA25CA214 +7EA214FEA25CA21301A25CA21303A25CA21307A25C130F131F001FB512F0A2302D7FAC29 +>84 D<131FEA03FFA2EA003FA2133EA2137EA2137CA213FCA25BA21201143F9038F1FFC0 +9038F3C1F03803FF0001FC7F5BA2485A5BA25B000F13015D1380A2001F13035D13001407 +48ECC04016C0003E130F1580007E148191381F0180007C1403ED070000FCEB0F06151E48 +EB07F80070EB01E0222F7DAD29>104 D<1307EB0F80EB1FC0A2EB0F80EB070090C7FCA9 +EA01E0EA07F8EA0E3CEA1C3E123812301270EA607EEAE07C12C013FC485A120012015B12 +035BA21207EBC04014C0120F13801381381F01801303EB0700EA0F06131EEA07F8EA01F0 +122E7EAC18>I<27078007F0137E3C1FE01FFC03FF803C18F0781F0783E03B3878E00F1E +01263079C001B87F26707F8013B00060010013F001FE14E000E015C0485A491480008102 +1F130300015F491400A200034A13076049133E170F0007027EEC8080188149017C131F18 +01000F02FCEB3F03053E130049495C180E001F0101EC1E0C183C010049EB0FF0000E6D48 +EB03E0391F7E9D3E>109 D<3907C007E0391FE03FF83918F8783E393879E01E39307B80 +1F38707F00126013FEEAE0FC12C05B00815C0001143E5BA20003147E157C5B15FC0007EC +F8081618EBC00115F0000F1538913803E0300180147016E0001F010113C015E390C7EAFF +00000E143E251F7E9D2B>I<3807C01F390FF07FC0391CF8E0E0383879C138307B873870 +7F07EA607E13FC00E0EB03804848C7FCA2128112015BA21203A25BA21207A25BA2120FA2 +5BA2121FA290C8FC120E1B1F7E9D20>114 DI<130E131FA25BA2133EA2137EA2137CA213FCA2B512F8A23801F800A25BA2 +1203A25BA21207A25BA2120FA25BA2001F1310143013001470146014E0381E01C0EB0380 +381F0700EA0F0EEA07FCEA01F0152B7EA919>I E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fg cmbx12 12 53 +/Fg 53 124 df46 D49 DII<163FA25E5E +5D5DA25D5D5D5DA25D92B5FCEC01F7EC03E7140715C7EC0F87EC1F07143E147E147C14F8 +EB01F0EB03E0130714C0EB0F80EB1F00133E5BA25B485A485A485A120F5B48C7FC123E5A +12FCB91280A5C8000F90C7FCAC027FB61280A531417DC038>I<0007150301E0143F01FF +EB07FF91B6FC5E5E5E5E5E16804BC7FC5D15E092C8FC01C0C9FCAAEC3FF001C1B5FC01C7 +14C001DF14F09039FFE03FFC9138000FFE01FC6D7E01F06D13804915C0497F6C4815E0C8 +FC6F13F0A317F8A4EA0F80EA3FE0487E12FF7FA317F05B5D6C4815E05B007EC74813C012 +3E003F4A1380D81FC0491300D80FF0495AD807FEEBFFFC6CB612F0C65D013F1480010F01 +FCC7FC010113C02D427BC038>I<4AB47E021F13F0027F13FC49B6FC01079038807F8090 +390FFC001FD93FF014C04948137F4948EBFFE048495A5A1400485A120FA248486D13C0EE +7F80EE1E00003F92C7FCA25B127FA2EC07FC91381FFF8000FF017F13E091B512F89039F9 +F01FFC9039FBC007FE9039FF8003FF17804A6C13C05B6F13E0A24915F0A317F85BA4127F +A5123FA217F07F121FA2000F4A13E0A26C6C15C06D4913806C018014006C6D485A6C9038 +E01FFC6DB55A011F5C010714C0010191C7FC9038003FF02D427BC038>I65 +DIII +IIIII76 D +II<923807FFC092 +B512FE0207ECFFC0021F15F091267FFE0013FC902601FFF0EB1FFF01070180010313C049 +90C76C7FD91FFC6E6C7E49486F7E49486F7E01FF8348496F7E48496F1380A248496F13C0 +A24890C96C13E0A24819F04982003F19F8A3007F19FC49177FA400FF19FEAD007F19FC6D +17FFA3003F19F8A26D5E6C19F0A26E5D6C19E0A26C6D4B13C06C19806E5D6C6D4B13006C +6D4B5A6D6C4B5A6D6C4B5A6D6C4A5B6D01C001075B6D01F0011F5B010101FE90B5C7FC6D +90B65A023F15F8020715C002004AC8FC030713C047467AC454>II<923807FFC092B512FE0207ECFFC0021F15F091267FFE0013FC902601FFF0EB +1FFF010701C0010713C04990C700017F49486E7F49486F7E49486F7E49486F7E48496F7E +48496F1380A248496F13C0A24819E091C97E4819F0A248487013F8A3007F19FCA249177F +A300FF19FEAD007F19FCA36D17FF003F19F8A3001F19F06D5EA26C19E06E01FE5B6C9126 +03FF8014C06C6D486D4813804B13E06C9028E01F83F00F13006C903BF01E00F81FFE9026 +7FF83E90387C3FFC90263FFC3C6D485AD91FFE91381EFFF0D90FFF021F5B6D01FE5D0101 +94C7FC6D6D6CB45A023F90B512F8020703E0130202006F1307030713C792C7EA07F8716C +130F72131F9538FF80FF96B5FC7114FEA3831AFCA27213F81AF0847213E07213C0721300 +F001FC48587AC454>III<003FBA12E0 +A59026FE000FEB8003D87FE09338003FF049171F90C71607A2007E1803007C1801A30078 +1800A400F819F8481978A5C81700B3B3A20107B8FCA545437CC24E>III<903801FFE0011F13 +FE017F6D7E48B612E03A03FE007FF84848EB1FFC6D6D7E486C6D7EA26F7FA36F7F6C5A6C +5AEA00F090C7FCA40203B5FC91B6FC1307013F13F19038FFFC01000313E0000F1380381F +FE00485A5B127F5B12FF5BA35DA26D5B6C6C5B4B13F0D83FFE013EEBFFC03A1FFF80FC7F +0007EBFFF86CECE01FC66CEB8007D90FFCC9FC322F7DAD36>97 DIIIIIII<137C48B4FC4813804813C0A248 +13E0A56C13C0A26C13806C1300EA007C90C7FCAAEB7FC0EA7FFFA512037EB3AFB6FCA518 +467CC520>I107 DI<90277F8007FEEC +0FFCB590263FFFC090387FFF8092B5D8F001B512E002816E4880913D87F01FFC0FE03FF8 +913D8FC00FFE1F801FFC0003D99F009026FF3E007F6C019E6D013C130F02BC5D02F86D49 +6D7EA24A5D4A5DA34A5DB3A7B60081B60003B512FEA5572D7CAC5E>I<90397F8007FEB5 +90383FFF8092B512E0028114F8913987F03FFC91388F801F000390399F000FFE6C139E14 +BC02F86D7E5CA25CA35CB3A7B60083B512FEA5372D7CAC3E>II<90397FC00FF8B590B57E02C314E002CF14F89139DF +C03FFC9139FF001FFE000301FCEB07FF6C496D13804A15C04A6D13E05C7013F0A2EF7FF8 +A4EF3FFCACEF7FF8A318F017FFA24C13E06E15C06E5B6E4913806E4913006E495A9139DF +C07FFC02CFB512F002C314C002C091C7FCED1FF092C9FCADB67EA536407DAC3E>II<90387F807FB53881FF +E0028313F0028F13F8ED8FFC91389F1FFE000313BE6C13BC14F8A214F0ED0FFC9138E007 +F8ED01E092C7FCA35CB3A5B612E0A5272D7DAC2E>I<90391FFC038090B51287000314FF +120F381FF003383FC00049133F48C7121F127E00FE140FA215077EA27F01E090C7FC13FE +387FFFF014FF6C14C015F06C14FC6C800003806C15806C7E010F14C0EB003F020313E014 +0000F0143FA26C141F150FA27EA26C15C06C141FA26DEB3F8001E0EB7F009038F803FE90 +B55A00FC5CD8F03F13E026E007FEC7FC232F7CAD2C>III< +B6903803FFFCA5000101E09038003E006C163C80017F5D8017F8013F5D6E1301011F5D6E +1303010F5D6E13076D5DED800F6D92C7FC15C05E6DEBE01E163E6D143CEDF07C027F1378 +EDF8F8023F5B15FD021F5B15FF6E5BA36E5BA26E90C8FCA26E5AA26E5AA21578362C7EAB +3B>IIII<001FB7 +1280A49026FC001F130001E0495A5B49495A90C7485A48495B123E4A5B4A5B003C495BA2 +4A90C7FC4A5A4A5AC7FC4A5A495B495BA2495B499038800780491300A2495A4948130F49 +481400A2485B48495B485BA248495B4890C75A48485C15034848EB1FFEB7FCA4292C7DAB +32>II E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fh cmbx12 14.4 39 +/Fh 39 122 df46 D<157815FC14031407141F14FF130F0007B5FCB6FCA2147F13F0EAF800C7FCB3 +B3B3A6007FB712FEA52F4E76CD43>49 DI<91380FFF +C091B512FC0107ECFF80011F15E090263FF8077F9026FF800113FC4848C76C7ED803F86E +7E491680D807FC8048B416C080486D15E0A4805CA36C17C06C5B6C90C75AD801FC1680C9 +FC4C13005FA24C5A4B5B4B5B4B13C04B5BDBFFFEC7FC91B512F816E016FCEEFF80DA0007 +13E0030113F89238007FFE707E7013807013C018E07013F0A218F8A27013FCA218FEA2EA +03E0EA0FF8487E487E487EB57EA318FCA25E18F891C7FC6C17F0495C6C4816E001F04A13 +C06C484A1380D80FF84A13006CB44A5A6CD9F0075BC690B612F06D5D011F1580010302FC +C7FCD9001F1380374F7ACD43>I<177C17FEA2160116031607160FA2161F163F167FA216 +FF5D5DA25D5DED1FBFED3F3F153E157C15FCEC01F815F0EC03E01407EC0FC01580EC1F00 +5C147E147C5C1301495A495A5C495A131F49C7FC133E5B13FC485A5B485A1207485A485A +90C8FC123E127E5ABA12C0A5C96C48C7FCAF020FB712C0A53A4F7CCE43>I66 D<932601FFFCEC01C0047FD9FFC01303 +0307B600F81307033F03FE131F92B8EA803F0203DAE003EBC07F020F01FCC7383FF0FF02 +3F01E0EC0FF94A01800203B5FC494848C9FC4901F8824949824949824949824949824990 +CA7E494883A2484983485B1B7F485B481A3FA24849181FA3485B1B0FA25AA298C7FC5CA2 +B5FCAE7EA280A2F307C07EA36C7FA21B0F6C6D1980A26C1A1F6C7F1C006C6D606C6D187E +A26D6C606D6D4C5A6D6D16036D6D4C5A6D6D4C5A6D01FC4C5A6D6DEE7F806D6C6C6C4BC7 +FC6E01E0EC07FE020F01FEEC1FF80203903AFFE001FFF0020091B612C0033F93C8FC0307 +15FCDB007F14E0040101FCC9FC525479D261>IIII<932601FFFCEC01 +C0047FD9FFC013030307B600F81307033F03FE131F92B8EA803F0203DAE003EBC07F020F +01FCC7383FF0FF023F01E0EC0FF94A01800203B5FC494848C9FC4901F882494982494982 +4949824949824990CA7E494883A2484983485B1B7F485B481A3FA24849181FA3485B1B0F +A25AA298C8FC5CA2B5FCAE6C057FB712E0A280A36C94C7003FEBC000A36C7FA36C7FA27E +6C7FA26C7F6C7FA26D7E6D7F6D7F6D6D5E6D7F6D01FC93B5FC6D13FF6D6C6D5C6E01F0EC +07FB020F01FEEC1FF10203903AFFF001FFE0020091B6EAC07F033FEE001F030703FC1307 +DB007F02E01301040149CAFC5B5479D26A>I73 D76 +D78 +D<93380FFFC00303B6FC031F15E092B712FC0203D9FC0013FF020F01C0010F13C0023F90 +C7000313F0DA7FFC02007F494848ED7FFE4901E0ED1FFF49496F7F49496F7F4990C96C7F +49854948707F4948707FA24849717E48864A83481B804A83481BC0A2481BE04A83A2481B +F0A348497113F8A5B51AFCAF6C1BF86E5FA46C1BF0A26E5F6C1BE0A36C6D4D13C0A26C6D +4D1380A26C1B006C6D4D5A6E5E6C626D6C4C5B6D6D4B5B6D6D4B5B6D6D4B5B6D6D4B5B6D +6D4B90C7FC6D6D4B5A6D01FF02035B023F01E0011F13F0020F01FC90B512C0020390B7C8 +FC020016FC031F15E0030392C9FCDB001F13E0565479D265>II<003FBC1280A59126C0003F90 +38C0007F49C71607D87FF8060113C001E08449197F49193F90C8171FA2007E1A0FA3007C +1A07A500FC1BE0481A03A6C994C7FCB3B3AC91B912F0A553517BD05E>84 +D87 +D97 +DI<913801FFF8021FEBFF8091B612F0010315FC010F9038C00FFE903A1FFE0001 +FFD97FFC491380D9FFF05B4817C048495B5C5A485BA2486F138091C7FC486F1300705A48 +92C8FC5BA312FFAD127F7FA27EA2EF03E06C7F17076C6D15C07E6E140F6CEE1F806C6DEC +3F006C6D147ED97FFE5C6D6CEB03F8010F9038E01FF0010390B55A01001580023F49C7FC +020113E033387CB63C>I<4DB47E0407B5FCA5EE001F1707B3A4913801FFE0021F13FC91 +B6FC010315C7010F9038E03FE74990380007F7D97FFC0101B5FC49487F4849143F484980 +485B83485B5A91C8FC5AA3485AA412FFAC127FA36C7EA37EA26C7F5F6C6D5C7E6C6D5C6C +6D49B5FC6D6C4914E0D93FFED90FEFEBFF80903A0FFFC07FCF6D90B5128F0101ECFE0FD9 +003F13F8020301C049C7FC41547CD24B>I<913803FFC0023F13FC49B6FC010715C04901 +817F903A3FFC007FF849486D7E49486D7E4849130F48496D7E48178048497F18C0488191 +C7FC4817E0A248815B18F0A212FFA490B8FCA318E049CAFCA6127FA27F7EA218E06CEE01 +F06E14037E6C6DEC07E0A26C6DEC0FC06C6D141F6C6DEC3F806D6CECFF00D91FFEEB03FE +903A0FFFC03FF8010390B55A010015C0021F49C7FC020113F034387CB63D>IIII<137F497E +000313E0487FA2487FA76C5BA26C5BC613806DC7FC90C8FCADEB3FF0B5FCA512017EB3B3 +A6B612E0A51B547BD325>I108 +DII<913801FFE0021F13FE91B6 +12C0010315F0010F9038807FFC903A1FFC000FFED97FF86D6C7E49486D7F48496D7F4849 +6D7F4A147F48834890C86C7EA24883A248486F7EA3007F1880A400FF18C0AC007F1880A3 +003F18006D5DA26C5FA26C5F6E147F6C5F6C6D4A5A6C6D495B6C6D495B6D6C495BD93FFE +011F90C7FC903A0FFF807FFC6D90B55A010015C0023F91C8FC020113E03A387CB643>I< +903A3FF001FFE0B5010F13FE033FEBFFC092B612F002F301017F913AF7F8007FFE0003D9 +FFE0EB1FFFC602806D7F92C76C7F4A824A6E7F4A6E7FA2717FA285187F85A4721380AC1A +0060A36118FFA2615F616E4A5BA26E4A5B6E4A5B6F495B6F4990C7FC03F0EBFFFC9126FB +FE075B02F8B612E06F1480031F01FCC8FC030313C092CBFCB1B612F8A5414D7BB54B>I< +90397FE003FEB590380FFF80033F13E04B13F09238FE1FF89139E1F83FFC0003D9E3E013 +FEC6ECC07FECE78014EF150014EE02FEEB3FFC5CEE1FF8EE0FF04A90C7FCA55CB3AAB612 +FCA52F367CB537>114 D<903903FFF00F013FEBFE1F90B7FC120348EB003FD80FF81307 +D81FE0130148487F4980127F90C87EA24881A27FA27F01F091C7FC13FCEBFFC06C13FF15 +F86C14FF16C06C15F06C816C816C81C681013F1580010F15C01300020714E0EC003F0307 +13F015010078EC007F00F8153F161F7E160FA27E17E07E6D141F17C07F6DEC3F8001F8EC +7F0001FEEB01FE9039FFC00FFC6DB55AD8FC1F14E0D8F807148048C601F8C7FC2C387CB6 +35>I<143EA6147EA414FEA21301A313031307A2130F131F133F13FF5A000F90B6FCB8FC +A426003FFEC8FCB3A9EE07C0AB011FEC0F8080A26DEC1F0015806DEBC03E6DEBF0FC6DEB +FFF86D6C5B021F5B020313802A4D7ECB34>II119 D<007FB500F090387FFFFEA5C66C48 +C7000F90C7FC6D6CEC07F86D6D5C6D6D495A6D4B5A6F495A6D6D91C8FC6D6D137E6D6D5B +91387FFE014C5A6E6C485A6EEB8FE06EEBCFC06EEBFF806E91C9FCA26E5B6E5B6F7E6F7E +A26F7F834B7F4B7F92B5FCDA01FD7F03F87F4A486C7E4A486C7E020F7FDA1FC0804A486C +7F4A486C7F02FE6D7F4A6D7F495A49486D7F01076F7E49486E7E49486E7FEBFFF0B500FE +49B612C0A542357EB447>II E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fi cmti12 12 32 +/Fi 32 122 df12 +D19 D<13F0EA03FC1207A2EA0FFEA4EA07FCEA03CCEA +000C131C1318A2133813301370136013E0EA01C013801203EA0700120E5A5A5A5A5A0F1D +7A891E>44 D<130FEB1FC0133FEB7FE013FFA214C0EB7F801400131E90C7FCB3A5120FEA +3FC0127FA212FFA35B6CC7FC123C132B76AA1E>58 D65 D<91B712FCF0FF8019E002 +01903980001FF06E90C7EA07F84A6F7E727E4B81841A800203167F5DA314075D19FFA202 +0F17004B5C611803021F5E4B4A5A180F4E5A023F4B5A4BEC7F804EC7FCEF03FC027FEC0F +F84BEBFFC092B6C8FC18E0913AFF800007F892C7EA01FC717E187F49834A6F7EA3010383 +5CA313075CA3010F5F4A157FA24E5A131F4A4A90C7FC601703013F4B5A4A4A5A4D5A017F +4B5A4D5A4A4948C8FC01FFEC0FFEB812F817C04CC9FC41447AC345>I<91B712F818FF19 +C00201903980003FF06E90C7EA0FF84AED03FCF000FE4B157FA2F13F800203EE1FC05DF1 +0FE0A214074B16F01907A2140F5D1AF8A2141F5DA2190F143F5D1AF0A2147F4B151FA302 +FF17E092C9123FA34918C04A167F1A80A2010317FF4A1700A24E5A13074A4B5A61180701 +0F5F4A4B5A181F61011F4C5A4A4BC7FC18FE4D5A013F4B5A4A4A5A4D5A017FED3FC005FF +C8FC4AEB03FE01FFEC1FF8B812E094C9FC16F845447AC34A>68 D<027FB512E091B6FCA2 +0200EBE000ED7F8015FFA293C7FCA35C5DA314035DA314075DA3140F5DA3141F5DA3143F +5DA3147F5DA314FF92C8FCA35B5CA313035CA313075CA3130F5CA3131F5CA2133FA25CEB +FFE0B612E0A25D2B447BC326>73 D79 D<91B712F018FEF0FF800201903980007FE0 +6E90C7EA1FF04AED07F818034B15FCF001FE1403A24B15FFA21407A25DA2140FF003FE5D +A2021F16FC18074B15F8180F023F16F0F01FE04B15C0F03F80027FED7F0018FE4BEB03FC +EF0FF002FFEC7FC092B6C7FC17F892CAFC5BA25CA21303A25CA21307A25CA2130FA25CA2 +131FA25CA2133FA25CA2137FA25C497EB67EA340447AC342>I<91B77E18F818FE020190 +398001FF806E90C7EA3FC04AED1FE0F00FF04BEC07F8180319FC14034B15FEA314075DA3 +020FED07FC5DA2F00FF8141F4B15F0F01FE0F03FC0023F16804BEC7F0018FEEF03F8027F +4A5A4BEB1FC04CB4C7FC92B512F891B612E092380003F8EE00FE177F496F7E4A6E7EA284 +13034A140FA2171F13075CA2173F130F5CA24D5A131F5CA3013F170E5CA2017FEE801E19 +1C4A163C496C1638B66C90383FC070051F13F094380FE1E0CA3803FF80943800FE003F46 +7AC347>82 D87 D97 +DIIII<15FCEC03FF91390F83838091393E01CF +C091387C00EF4A13FF4948137F010315804948133F495A131F4A1400133F91C75A5B167E +13FE16FE1201495CA215011203495CA21503A2495CA21507A25EA2150F151F5E0001143F +157F6C6C13FF913801DF8090387C039F90383E0F3FEB0FFCD903F090C7FC90C7FC5DA215 +7EA215FEA25DA2001C495A127F48495A14074A5A485C023FC8FC00F8137E387C01F8381F +FFE0000390C9FC2A407BAB2D>103 D<14FE137FA3EB01FC13001301A25CA21303A25CA2 +1307A25CA2130FA25CA2131FA25C157F90393F83FFC091388F81F091381E00F802387F49 +48137C5C4A137EA2495A91C7FCA25B484814FE5E5BA2000314015E5BA2000714035E5B15 +07000F5DA249130F5E001F1678031F1370491480A2003F023F13F0EE00E090C7FC160148 +023E13C01603007E1680EE070000FEEC1E0FED1F1E48EC0FF80038EC03E02D467AC432> +I<143C147E14FE1301A3EB00FC14701400AE137C48B4FC3803C780380703C0000F13E012 +0E121C13071238A21278EA700F14C0131F00F0138012E0EA003F1400A25B137EA213FE5B +12015BA212035B141E0007131C13E0A2000F133CEBC038A21478EB807014F014E0EB81C0 +EA0783EBC7803803FE00EA00F8174378C11E>I<14FE137FA3EB01FC13001301A25CA213 +03A25CA21307A25CA2130FA25CA2131FA25C167E013F49B4FC92380783C09138000E07ED +3C1F491370ED603F017E13E0EC01C09026FE03801380913907000E00D9FC0E90C7FC5C00 +015B5C495AEBF9C03803FB8001FFC9FCA214F03807F3FCEBF07F9038E01FC06E7E000F13 +0781EBC003A2001F150FA20180140EA2003F151E161C010013E0A2485DA2007E15781670 +00FE01015B15F1489038007F800038021FC7FC2A467AC42D>107 +DIIIII114 DI<1470EB01F8A313035CA313075CA3130F5CA3131F5CA2007FB512E0B6FC15 +C0D8003FC7FCA25B137EA313FE5BA312015BA312035BA312075BA3120F5BA2EC0780001F +140013805C140E003F131EEB001C143C14385C6C13F0495A6C485AEB8780D807FEC7FCEA +01F81B3F78BD20>I<137C48B414072603C780EB1F80380703C0000F7F000E153F121C01 +07150012385E1278D8700F147E5C011F14FE00F05B00E05DEA003FEC0001A2495C137E15 +0313FE495CA215071201495CA2030F13380003167849ECC070A3031F13F0EE80E0153F00 +011581037F13C06DEBEF8300000101148090397C03C787903A3E0F07C70090391FFE01FE +903903F000782D2D78AB34>I<02F8133FD907FEEBFFE0903A0F0F83C0F0903A1C07C780 +F890393803CF03017013EE01E0EBFC07120101C013F8000316F00180EC01C000074AC7FC +13001407485C120EC7FC140F5DA3141F5DA3143F92C8FCA34AEB03C01780147EA202FEEB +0700121E003F5D267F81FC130E6E5BD8FF83143CD903BE5B26FE079E5B3A7C0F1F01E03A +3C1E0F83C0271FF803FFC7FC3907E000FC2D2D7CAB2D>120 D<137C48B414072603C780 +EB1F80380703C0000F7F000E153F001C1600130712385E0078157EEA700F5C011F14FE00 +F0495B12E0EA003FEC00015E5B137E150301FE5C5BA2150700015D5BA2150F00035D5BA2 +151F5EA2153F12014BC7FC6D5B00005BEB7C0390383E0F7EEB1FFEEB03F090C712FE5DA2 +14015D121F397F8003F0A24A5A4848485A5D48131F00F049C8FC0070137E007813F83838 +01F0381E07C06CB4C9FCEA01FC294078AB2F>I E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fj cmsl12 12 31 +/Fj 31 117 df<123E127FA2EAFF80127F13C0123FEA1FE0120FEA07F01203EA01F81200 +137C133C131E130F130610126BC431>18 D50 DII<170C171C173C173E177EA217FEA21601835EA216 +06A24C7FA2EE187FA21630A204607F173F16C0A2ED018084ED0300171F1506A25D844B13 +0FA25D157003608015E04B130714015D140392C77F02061403A2020FB6FCA24A810218C7 +12034A1401A25CA24A8183495AA249C9FC851306187F5B131CA2013C83137CEA01FE2607 +FF80913801FFF0007F01E0027FEBFFC0B5FCA242477DC649>65 D<011FB712E018FCF0FF +809026003FF8C76C7E6E48EC1FF0727E4B6E7E1803727E8584143F5D1A80A4027F17005D +606118036102FF150792C8485A614E5AF07FC04EC7FC49ED03FE4AEC0FF8EFFFE091B712 +8018F04AC7EA03FC0103ED00FF4A6F7E727E727E727EA20107707E5C85A31803130F4A15 +07A461011F160F4A5E181F4E5AA24E5A013F4C5A4A4A90C7FC4D5AEF0FFC017FED3FF001 +FF4AB45AB9128005FCC8FC17C041447CC345>II<011FB9FCA39026003FF8C7120F6E481400 +197F4B151FA2190F1907A2143F5DA21903A3147F5D1706A3190002FF5C92C7FCA2171CA2 +173C4915F84A130391B6FCA39138FE00070103EC01F04A13001770A4010715604A160CA3 +191894C7FC130F4A1630A219701960A2011F17E04A16C01801180319801807013F160F4A +ED1F006018FF017FED03FE01FF153FB9FC60A240447CC342>69 D<011FB812FEA3902600 +3FF8C7121F6E481401F0007E4B153E191EA2190EA2143F5D1906A4147F5DA2170CA21900 +02FF5C92C7FCA21738A217784915704AEB01F0160791B6FCA3903A03FE000FE04A130316 +011600A301075D5CA5010F92C8FC5CA5131F5CA5133F5CA3137FEBFFF0B612F8A33F447C +C340>II<011FB500FC017FB512F04C16E0A29026003FFCC8EBF000DA1F +F0ED7FC0A24B5EA419FF143F4B93C7FCA460147F4B5DA4180314FF92C85BA418075B4A5E +91B8FCA34AC8120F13034A5EA4181F13074A5EA4183F130F4A5EA4187F131F4A5EA418FF +133F4A93C8FCA3017F5D496C4A7FB6D8E003B67EA203C093C7FC4C447CC349>I<011FB5 +12FEA39039001FFE00EC0FF8A25DA5141F5DA5143F5DA5147F5DA514FF92C7FCA55B5CA5 +13035CA513075CA5130F5CA5131F5CA3133F497E007FB512F0B6FCA227447DC323>I<01 +1FB6FCA39026003FFCC8FCEC1FF0A25DA5143F5DA5147F5DA514FF92C9FCA55B5CA51303 +5CA513074A1503A31806A2130F4A150E180CA2181C1818011F16385C1878187018F01701 +013FED03E04A1407170F173F017FEDFFC001FF140FB9FC1880A238447CC33D>76 +D<90261FFFF84AB512F01BE081D9001F9239001FFC006E6CED07F0021F705ADA19FF6F5A +6202187FA26F6C140314389126303FE092C7FCA26F7EA26F6C5C147091266007FC1406A2 +6F7EA26F6C140E14E04A6C6D130CA2707EA2706C131C13014A6D6C1318A2707EA2706C13 +38130391C76C6C1330A2707EA270EB80705B010692387FC060A2EF3FE0A294381FF0E013 +0E010C6F6C5AA2EF07FCA2EF03FF131C01186F5BA283A2187F133872C8FC137884EA01FC +D807FF82B512F818065C4C447CC349>78 DI<011FB712C018F818FF9028003FF8000113806E489038003FE0F00FF04B +EC07F8F003FCA2F001FEA2023F16FF4B80A5027F5D5DA319FE180314FF92C813FCF007F8 +A2F00FF0F01FE049EE3FC04AED7F00EF01FEEF07F8EF3FE091B712804903FCC7FC02FCCA +FCA513075CA5130F5CA5131F5CA5133F5CA3137F497EB612E0A25D40447CC342>I<011F +B612FEEFFFE018F8903B003FF80007FE6E48903800FF80F03FC04B6E7E727E727E727EA2 +023F824B1401A5027F15035DA34E5AA202FF5E92C8485A614E5A4E5A4EC7FC49ED01FE4A +EC03F8EF1FE0EFFF8091B600FCC8FC17F0903A03FE0001FC4AEB007F717E717E717E8401 +076F7E5CA21703A21707130F5CA5011F150F5CA41A38013F18305CA21A70017F03071460 +496C17E0B600E0903903FC01C00501EB03804B903900FE0F00CBEA3FFEF007F045467CC3 +48>82 DI<0007BAFCA3270FFE0003EB000301E04AEB007F49173F90C749141F001E180FA200 +1C180712180038020715065E1230A25AA2150F5E5AA3C81600151F5EA5153F5EA5157F5E +A515FF93C9FCA55C5DA514035DA514075DA3140FEC3FFE48B712C05FA2404475C346>I< +B600E0010FB512804B1600A2000101E0C813E06C0180ED3F8072C7FC91C9120E180CA318 +1C5A491618A418381203491630A418701207491660A418E0120F495EA41701121F495EA4 +1703123F4993C8FCA45F007F16065BA2170E003F160C171C171817386D1530001F16705F +4C5A6C7E4C5A6C6C4AC9FC6C6C141E00015DD800FE14F8017FEB03E090393FE01FC0010F +B5CAFC010313FC9038003FE0414671C349>I87 +D89 D97 D101 D<143C14FEEB01FFA25BA3EB01FE14FCEB00781400ADEB03 +F8EA01FFA3EA000F130714F0A5130F14E0A5131F14C0A5133F1480A5137F1400A55B5BA3 +1201487EB512F8A318437DC21C>105 D108 D111 D<91393F803F80903A1FFF81FFF049903887C0FC92389E003F010001B8EB1F +80DA7FF0EB0FC04B14E04BEB07F05D92C7EA03F8A24A15FC4A1401A218FEA313015CA417 +03010316FC5CA3EF07F8A20107150F4A15F0EF1FE0A2EF3FC01880010F157FEFFF006E49 +5A4C5A6EEB07F002EE495AD91FE7EB1F809126C3C0FEC7FC9138C0FFF8ED3FC092C9FC13 +3FA25CA4137FA291CAFCA45B487F007F13FEA2B55A373F81AB36>I<903903F007E0D801 +FFEB3FF848EC787CEDE1FC39000FF1C1903807F383ECE70314EE9138EC01F89138FC00E0 +4A1300130F5CA35CA2131F5CA5133F5CA5137F91C8FCA55B5BA31201487EB6FCA25C262C +7DAB26>114 D<91383FE030903903FFF87090390FC01EF090381E0007017C1303491301 +5B0001EC00E0485AA412076D14C0A26D1400EA03FEEBFFE014FE6CEBFFC06C14F06D7F6D +13FE130F01017FD9000F13801401EC007F0018143F151F1238150FA4ED1F00127CA2007E +143E153C007F5C6D5B39F9C003E039F0F00FC026E07FFFC7FC38C00FF0242E7DAC26>I< +14C0A313015CA21303A21307A249C7FCA25B5B5B5B485A1203001FB512F0B6FCA2C648C7 +FC12015BA512035BA512075BA5120F5BA215C0A3001FEB018013C0A414031500A25C1406 +000F130E6D5A00075B6C6C5AC6B45AEB3F801C3E77BC26>I E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fk cmmi12 12 32 +/Fk 32 127 df<161CA21618A21638A21630A21670A21660A216E0A25EA21501A25EA215 +03A293C8FCA25DED7FE0913807FFFE91391FC63F809139FE0E07C0D901F8EB03F0903A07 +E00C00F8D91FC08090263F001C137E017E814913184848ED1F8000031438485A48480130 +14C0A248481370A248481360A248C712E0A24B133F481780481301A24B137F1800140348 +16FE92C7FC4C5A6C49495AA2007E0106495A4C5A6C010E495A4C5A261F800C49C7FC000F +15FC3A07C01C01F8D803E0EB07E03A01F8181F80D8007E01FEC8FC90381FFFF801011380 +D90030C9FCA21470A21460A214E0A25CA21301A25CA21303A291CAFCA332597BC43A>30 +D<121EEA7F80A2EAFFC0A4EA7F80A2EA1E000A0A78891B>58 D<121EEA7F8012FF13C0A2 +13E0A3127FEA1E601200A413E013C0A312011380120313005A1206120E5A5A5A12600B1D +78891B>II<127012FCB4FCEA7FC0EA1FF0EA07FCEA +01FF38007FC0EB1FF0EB07FE903801FF809038007FE0EC1FF8EC03FE913800FF80ED3FE0 +ED0FF8ED03FF030013C0EE3FF0EE0FFCEE01FF9338007FC0EF1FF0EF07FCEF01FF943800 +7FC0F01FE0A2F07FC0943801FF00EF07FCEF1FF0EF7FC04C48C7FCEE0FFCEE3FF0EEFFC0 +030390C8FCED0FF8ED3FE0EDFF80DA03FEC9FCEC1FF8EC7FE0903801FF80D907FECAFCEB +1FF0EB7FC04848CBFCEA07FCEA1FF0EA7FC048CCFC12FC12703B3878B44C>62 +D<1830187018F0A217011703A24D7EA2170F171FA21737A2176717E717C793380187FCA2 +EE0307EE07031606160CA216181638163004607FA216C0030113011680ED0300A2150615 +0E150C5D845D03707F15605DA24A5A4AB7FCA25C0206C87F5C021C157F14185CA25C14E0 +5C495A8549C9FC49163F1306130E5B133C137C01FE4C7ED807FFED01FF007F01F0027FEB +FFC0B5FC5C42477DC649>65 D<91B87E19F019FC02009039C00003FF6F480100138003FF +ED3FC01AE093C8121FF10FF0A24A17F84B1507A314035D190FA2020717F04B151F1AE019 +3F020F17C04BED7F80F1FF004E5A021F4B5A4B4A5AF01FF0F03FC0023F4AB4C7FC4BEB1F +FC92B612F018FEDA7FC0C7EA7F804BEC1FC0F00FF0727E02FF6F7E92C8FC727EA249835C +A313035CA301075F4A1503A24E5A130F4A4B5A4E5AA2011F4C5A4A4B5A4D485A013F4B48 +C7FCEF0FFC4AEC3FF801FF913801FFE0B9128005FCC8FC17C045447CC34A>I<4CB46C13 +18043F01F013384BB512FC0307D9007E1378DB1FF090380F80F0DB7F80EB03C1DA01FEC7 +EA01C34A48EC00E7DA0FF0ED7FE04A48153F4A5A02FFC9121F494817C04948160F495A13 +0F4A178049481607495A137F4948170091CAFC5A485A1906485AA2485A96C7FC121F5BA2 +123F5BA3127F5BA4485AA419C0A2180161127F180396C7FC6018066C6C160E601818001F +17386D5E000F5F6D4B5A6C6C4B5A00034CC8FC6C6C150E6C6C153C017F5DD93FC0EB01E0 +D91FF0EB0FC0D907FE017FC9FC0101B512FCD9003F13E0020790CAFC45487CC546>I<4C +B46C1318043F01F013384BB512FC0307D9007E1378DB1FF090380F80F0DB7F80EB03C1DA +01FEC7EA01C34A48EC00E7DA0FF0ED7FE04A48153F4A5A02FFC9121F494817C04948160F +495A130F4A178049481607495A137F4948170091CAFC5A485A1906485AA2485A96C7FC12 +1F5BA2123F5BA3127F5BA4485A4CB612805EA293C7EBE000725AA3007F60A218FF96C7FC +A26C7E5F606C7EA2000F16036D5E6C6C15070003160F6C6C151F6C6CED3DF8D97F801478 +6D6CEB01E0D91FF0903807C078D907FE90387F00700101B500FC1330D9003F01F090C8FC +020790CAFC45487CC54D>71 D79 D<91B712FEF0FFE019F802009039C000 +0FFE6F48EB01FF03FF9138007F80F13FC093C8EA1FE0A24AEE0FF0A25D1AF81403A25DA2 +1407F11FF05DA2020FEE3FE0A24B16C0197F021F1780F1FF004B4A5A4E5A023F4B5A4E5A +4BEC3FC006FFC7FC027FEC07FC92B612F018800380CAFC14FFA292CBFCA25BA25CA21303 +A25CA21307A25CA2130FA25CA2131FA25CA2133FA25CEBFFE0B612E0A345447CC33F>I< +9339FF8001800307EBF003033F13FC9239FF007E07DA01F8EB0F0FDA07E09038079F004A +486DB4FC4AC77E023E804A5D187E5C495A183C495AA213074A1538A3130F183080A295C7 +FC806D7E8014FF6D13E015FC6DEBFFC06D14FC6E13FF6E14C0020F80020314F8EC003F03 +077F9238007FFE160F1603707E8283A283A21206A4000E163EA2120C177E001E167CA25F +5F003F15014C5A6D4A5A4C5A486C4AC8FC6D143ED87CF85CD8787E495A3AF01FC00FE0D8 +E007B51280010149C9FC39C0003FF039487BC53C>83 D<48BA12C05AA291C7D980001380 +D807F092C7121F4949150F0180170748C75B1903120E48020316005E1218123800301407 +4C5C00701806126000E0140F485DA3C8001F92C7FC5EA3153F5EA3157F5EA315FF93CAFC +A35C5DA314035DA314075DA3140F5DA3141F5DA3143F5DA2147FA214FF01037F001FB612 +FCA25E42447EC339>I<020FB812C05C1A809326800001130003F8C7FCDA3FE04A5A0380 +4A5A92C8485A027E4B5A027C4B5A02784B5A4A4B5AA24A4A90C7FC4A4A5A01014B5A4D5A +4A4A5A01034B5A91C8485A4D5AA290C84890C8FC4C5A4C5A4C5A4C5A4C5A4C5A4C5AA24B +90C9FC4B5A4B5A4B5A4B5A4B5A4B5AA24B5A4A90CAFC4A5A4A4814064A5A4A5A4A48140E +4A48140CA24A48141C4990C8121849481538495A49485D495A494815F049485D17014948 +14034890C8485A4848150F4848151F48484B5A484815FF48481403043F90C8FC48B8FCB9 +FC5F42447BC343>90 D97 DIII102 D<14FE137FA3EB01FC13001301A25CA21303A25C +A21307A25CA2130FA25CA2131FA25CED3FC090393F81FFF0913887C0FC91380E007E023C +133ED97F70133F4A7F4A14805C13FF91C7FC5BA24848143F17005BA200035D167E5BA200 +0715FE5E5B1501000F5DA24913035E001F1607030713064914E0150F003FEDC00E170C90 +C7141CEE80184816381730007E167017E000FE91380781C0EEC38048913801FF000038EC +007C30467BC438>104 D<141E143F5C5CA3147E143891C7FCAE133EEBFF803801C3C038 +0781E0380601F0120E121CEA180312381230A2EA700700605BA2EAE00F00C05BEA001F5C +A2133F91C7FCA25B137E13FE5BA212015BEC03800003140013F01207495A1406140E140C +EBC01C141814385C00035BEBE1C0C6B45A013EC7FC19437DC121>I<163C16FEA21501A3 +16FCED00701600AE15FCEC03FF91380F0780021C13C091383803E0147014E014C01301EC +8007130314005B0106130F130E010C14C090C7FC151FA21680A2153FA21600A25DA2157E +A215FEA25DA21401A25DA21403A25DA21407A25DA2140FA25DA2141F5DA2143F001C91C7 +FC127F48137E5CA248485AEB03E038F807C038781F80D83FFEC8FCEA07F0275681C128> +I<14FE137FA3EB01FC13001301A25CA21303A25CA21307A25CA2130FA25CA2131FA25C16 +3F013FECFFC0923803C0E09138000703ED1E0F491338ED701F017E13E0EC01C001FE0180 +13C00203EB07004948C8FC140E00015B5C495A5C3803FBC001FFC9FC8014F83807F1FE90 +38F03F809038E00FE06E7E000F130381EBC001A2001FED01C017801380A2003F15031700 +010013F05E481506160E007E150C161C00FE01005BED787048EC3FE00038EC0F802B467B +C433>II<01F8D903FCEC7F80D803FED91FFF +903803FFE0D8071F903B7C0FC00F81F83E0E0F80E007E01C00FC001C9026C3C003017813 +7C271807C700D9F0E0137E02CE902601F1C0133E003801DCDAFB80133F003001D892C7FC +D90FF814FF0070495C0060495CA200E04949485CD8C01F187E4A5C1200040715FE013F60 +91C75BA2040F14014960017E5D1903041F5D13FE494B130762043F160E0001060F130C49 +92C713C0191F4CED801C00031A1849027E1638F2003004FE167000071A60494A16E0F201 +C0030192380F0380000FF18700494AEC03FED80380D90070EC00F84F2D7DAB55>I<01F8 +EB03FCD803FEEB1FFFD8071F90387C0FC03B0E0F80E007E03A0C07C3C003001CD9C7007F +001801CE1301003801DC80003013D8EB0FF800705B00605BA200E0491303D8C01F5D5C12 +001607013F5D91C7FCA2160F495D137E161F5F13FE49143F94C7FC187000014B13604914 +7E16FE4C13E0000317C049150104F81380170300071700495D170EEE781C000FED7C3849 +EC1FF0D80380EC07C0342D7DAB3A>I112 D<01F8EB0FC0D803FEEB7FF0D8070FEB +F038000E903883C07C3A0C07C701FC001C13CE0018EBDC03003813D8003013F8D90FF013 +F800709038E000E0006015005C12E0EAC01F5C1200A2133F91C8FCA35B137EA313FE5BA3 +12015BA312035BA312075BA3120F5BEA0380262D7DAB2C>114 D<02FCEB07E0903A03FF +801FFC903A0F07C0781E903A1C03E0E01F903A3801F1C07FD9700013804901FB13FF4848 +EBFF00495B000316FE90C71438484A130012061401000E5C120CC7FC14035DA314075DA3 +140F5DA3021F143817305D1770023F1460121E003F16E0267F807FEB01C0026F148000FF +01EF1303D901CFEB070000FE903887C00E267C03835B3A3C0F01E0783A1FFC00FFE0D803 +F0EB3F80302D7EAB37>120 D<133ED9FF8014E02603C3C0EB03F0380703E0380601F000 +0E1507001C16E0EA180312380030150F007016C0EA60075C161FD8E00F158000C05BEA00 +1F4A133F1700133F91C7FC5E49147E137EA216FE01FE5C5BA215015E485AA215035EA200 +001407150F6D5C017C131F153F6D13FF90391F03CFC0903807FF8F903801FC0F90C7121F +5EA2153F93C7FCD807C05BD81FE0137E5DA24848485A4A5A01805B39380007C00018495A +001C49C8FC6C137C380781F83803FFE0C66CC9FC2C407DAB30>I<027CEB018049B41303 +4901801300010F6D5A49EBE00E6F5A90393F03F838903978007EF80170EB1FF00160EB01 +E001E05C49495A90C748C7FC150E5D5D5D5D4A5A4A5A4AC8FC140E5C5C5C5CEB03C049C9 +FC130E49141C4914185B49143848481430491470D8039014F048B4495A3A0FEFC007C039 +1E03F01FD81C01B55A486C91C7FC485C00606D5A00E0EB3FF048EB0FC0292D7CAB2D>I< +16301678167CA2163C163E163F82007FB712C0B8FCA27EC9EA7F0016FC4B5A4B5A5E4B5A +A26FC7FC2A146EC631>126 D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fl cmtt12 12 81 +/Fl 81 126 df<903903E001F0A2496C487EA8010F1307A202E05BA4007FB712E0A2B812 +F0A36C16E06C16C03B001FC00FE000013F131FA202805BA9017F133FA202005B003FB712 +C04816E0B812F0A36C16E0A2C648C66CC7FCA400015CA2495BA86C48137CA22C3D7DBC33 +>35 D39 +D<140FEC3F80147F14FF491300495AEB07F8495A495A495A495A49C7FC5B12015B485A12 +075B120F5B121F5BA2123F5BA2127F90C8FCA45A5AAD7E7EA47F123FA27F121FA27F120F +7F12077F12036C7E7F12007F6D7E6D7E6D7E6D7E6D7EEB03FE6D7E6D1380147F143FEC0F +00194D6FC433>I<127812FE7E7F6C7E6C7EEA0FF06C7E6C7E6C7E6C7E6D7E133F80131F +6D7E801307801303801301A2801300A28080A41580143FAD147F1500A45C5CA213015CA2 +13035C13075C130F5C495A133F5C137F49C7FC485A485A485A485AEA3FE0485A485A90C8 +FC5A1278194D78C433>I<14F0497EA8007015E000F8EC01F000FE140700FF140F01C113 +3F01F113FF263FF9F913C0000FB61200000314FCC614F06D5B011F1380D907FEC7FC9038 +1FFF80017F13E090B57E000314FC000F14FF263FF9F913C026FFF1F813F001C1133F0101 +130F00FE140700F814010070EC00E000001500A86D5A242B79B333>I<141FA24A7EB000 +7FB71280A2B812C0A36C1680A2C7D83F80C7FCB06EC8FCA22A2B7CB333>II<007FB612FEA2B8FCA36C15FEA228077BA1 +33>I<121FEA3F80EA7FC0EAFFE0A5EA7FC0EA3F80EA1F000B0B6C8A33>I<167816F8ED01 +FCA21503A2ED07F8A2ED0FF0A2ED1FE0A216C0153FA2ED7F80A2EDFF00A24A5AA25D1403 +A24A5AA24A5AA24A5AA25D143FA24A5AA24AC7FCA2495AA25C1303A2495AA2495AA25C13 +1FA2495AA2495AA249C8FCA25B1201A2485AA2485AA2485AA25B121FA2485AA2485AA248 +C9FCA25AA2127CA2264D7AC433>I<14FF010313C0010F13F0497F497F497F9038FF81FF +3A01FE007F804848EB3FC049131F4848EB0FE0A24848EB07F0A24848EB03F8A24848EB01 +FCA348C812FEA4007E157E00FE157FAE6C15FF6C15FEA46D1301003F15FCA26D1303001F +15F8A26C6CEB07F0A26C6CEB0FE06D131F6C6CEB3FC0A26CB4EBFF806C018113006DB45A +6D5B6D5B6D5B010313C0010090C7FC283F7BBD33>III<9038 +01FFC0010F13F8013F13FE90B67E48814881489038807FF03A0FFC000FF801F06D7E4848 +13036F7EA21500A26C5A6C5AC9FC15015EA215034B5A150F4B5A4B5A913803FFC00103B5 +5A4991C7FC5D8116C06D8090C76C7EED0FF8ED03FC6F7E6F7E821780163FA2EE1FC0A312 +3C127EB4FCA2163F1780167F6C16006D5C6D495A6C6C1303D81FF8EB0FFC3A0FFF807FF8 +6C90B55A6C5D6C15806C6C91C7FC010F13FC010113C02A3F7CBD33>I<15FF4A7F5C5CA2 +5C5C15DFEC3F9FA2EC7F1F14FEA2EB01FCA2EB03F8EB07F0A2EB0FE0EB1FC0A2EB3F80A2 +EB7F0013FEA2485A12035B485AA2485A485AA2485AA248C7FC12FEB812E017F0A46C16E0 +C8381F8000AC021FB512804A14C04A14E0A26E14C06E14802C3E7DBD33>I<0007B612F0 +4815F85AA316F001C0C8FCB0ECFFC001C713F801DF7F90B6FC168016C0028013E09039FC +001FF001F0EB0FF849130749EB03FC6C4813016CC713FEC9FCA216FF167FA41218127EA2 +B415FF16FEA24814016C15FC6C14036DEB07F86D130F6C6CEB1FF06C6CEB7FE09039FE03 +FFC06CB612806C150000015C6C14F8013F13E0010390C7FC283E7BBC33>II<127CB8128017C0A4178048C813004B5A4B5A007C4A5AC8485A5E +151F4B5A4B5A93C7FC5D5D4A5A14035D14075D140F5D141F5D143F5DA24AC8FCA25C5CA2 +13015CA3495AA413075CA5130F5CAA6D5A6D5A2A3F7CBD33>II<49B47E010F13E0013F13F84913FE90B6 +FC0003158048018113C09038FC007F4848EB1FE04848EB0FF0485A49EB07F84848130390 +C7FCED01FC5A5A16FE1500A416FFA37E7E6D5BA26C6C5B6D5B6C6C5B6C6C5BD807FE137F +90B7FC6C157F6C14FC6C6CEBF8FF6DEBE0FE010F1380903800200091C7FC150116FCA215 +0316F8150716F0000F140F486CEB1FE0486C133F16C0EDFF804A13004A5A381FF01F90B5 +12F86C5C6C5C6C1480C649C7FCEB3FF0283F7BBD33>I<121FEA3F80EA7FC0EAFFE0A5EA +7FC0EA3F80EA1F00C7FCB3A3121FEA3F80EA7FC0EAFFE0A5EA7FC0EA3F80EA1F000B2B6C +AA33>II<161E167E16FF15035DED1FFE157FEDFFF80203 +13F04A13C0021F138091383FFE00ECFFF8495B010713C0495BD93FFEC7FC495A3801FFF0 +485B000F13804890C8FCEA7FFC5BEAFFE05B7FEA7FF87FEA1FFF6C7F000313E06C7F3800 +7FFC6D7E90380FFF806D7F010113F06D7FEC3FFE91381FFF80020713C06E13F0020013F8 +ED7FFE151FED07FF811500167E161E28337BB733>I<007FB71280A2B812C0A36C16806C +1600CBFCA9003FB7FC481680B812C0A36C1680A22A177CA933>I<1278127EB4FC13C07F +EA7FF813FEEA1FFF6C13C000037F6C13F86C6C7EEB1FFF6D7F010313E06D7F9038007FFC +6E7E91380FFF806E13C0020113F06E13F8ED3FFE151FED07FF815DED1FFE153FEDFFF84A +13F0020713C04A138091383FFE004A5A903801FFF0495B010F13804990C7FCEB7FFC4848 +5A4813E0000F5B4890C8FCEA7FFE13F8EAFFE05B90C9FC127E127828337BB733>I64 DI<007FB512F8B7FC16C082826C813A03F8000FFC +ED03FE15016F7E82A2EE3F80A7EE7F00A25E4B5AA2ED07FCED1FF890B65A5E1680828216 +F89039F8000FFCED01FE6F7EEE7F80163F17C0161FA2EE0FE0A7161F17C0A2163FEE7F80 +16FF4B1300150F007FB65AB75A5E16E05E6C4AC7FC2B3D7DBC33>I<91391FE00780DAFF +FC13C00103EBFF0F010F148F4914FF5B90387FF81F9038FFC00748497E4848487E497F48 +5A167F485A49143F121F5B003F151F5BA2127F90C8EA0F8093C7FCA25A5AAD7E7EA36DEC +0F80003FED1FC0A27F121F7F000F153F6D15806C7E167F6C6CECFF007F3A01FF8003FE6C +6D485A90397FF81FF86DB55A6D5C6D5C010391C7FC010013FCEC1FE02A3F7CBD33>I<00 +3FB512F04814FCB7FC826C816C813A03F8007FF0ED1FF8ED07FC15036F7E8281EE7F80A2 +163F17C0161FA217E0160FA4EE07F0AD160F17E0A4161F17C0163FA21780167FEEFF00A2 +4B5A15034B5AED1FF8ED7FF0003FB6FC4815C0B75A93C7FC6C14FC6C14F02C3D7EBC33> +I<003FB712E04816F0B8FCA27E7ED801FCC71207A8EE03E093C7FCA6151F4B7EA490B6FC +A69038FC003FA46FC7FC92C8FCA817F8EE01FCA9003FB7FC5AB8FCA27E6C16F82E3D7EBC +33>I<003FB712E04816F0B8FCA27E7ED801FCC71207A8EE03E093C7FCA7151F4B7EA490 +B6FCA69038FC003FA46FC7FC92C8FCB1383FFFF8487FB57EA26C5B6C5B2C3D7DBC33>I< +91387F803C903901FFF03E0107EBFC7E011F13FE49EBFFFE5B9038FFE07F48EB803FEC00 +0FEA03FC00071407491303485A491301121F5B123F491300A2127F90C8FC167C93C7FCA2 +5A5AA992387FFFC092B512E0A37E6C6E13C0923800FE00A36D1301123FA27F121F6D1303 +120F7F6C6C1307A26C6C130F6C6C131F9038FF803F6CEBE0FF6DB5FC7F6D13FE010713F8 +0101EBF07C9026007F80C7FC2B3F7CBD33>I<3B7FFFC00FFFF8B56C4813FCA46C496C13 +F8D803F8C7EA7F00B3A290B7FCA601F8C77EB3A53B7FFFC00FFFF8B56C4813FCA46C496C +13F82E3D7EBC33>I<003FB612804815C0B712E0A26C15C06C1580260003F8C7FCB3B3AD +003FB612804815C0B712E0A26C15C06C1580233D78BC33>I<387FFFF8B57E80A25C6C5B +D801FCC9FCB3B3A3EE03E0EE07F0A9007FB7FCB8FCA46C16E02C3D7DBC33>76 +DII<90381FFFF890B6FC000315C0000F15F0A24815F83A3FFC003FFC01E0130749 +13034848EB01FEA290C8FCA500FE157FB3AC6C15FF6C15FEA46D1301A36C6CEB03FC01F0 +130F01FC133F6CB612F86C15F0A2000315C0C61500011F13F8283F7BBD33>I<003FB512 +FC48ECFF80B712E016F86C816C813A01FC000FFF030313801500EE7FC0163FEE1FE0160F +A217F01607A6160F17E0A2161FEE3FC0167FEEFF801503030F130090B65A5E5E16E01680 +03FCC7FC01FCC9FCB3383FFFE0487FB57EA26C5B6C5B2C3D7EBC33>I<90381FFFF890B6 +FC000315C0000F15F0A24815F83A3FFC003FFC01F0130F01C013034848EB01FEA290C8FC +A54815FF48157FB3AA143F6C90387F80FF6C15FEEC3FC0A2EC1FE0A29038800FF1A23A3F +C007FBFC01F013FFEBFC036CB612F86C15F0A2000315C0C61500011F148090C7EA7FC015 +3F16E0151F16F0150F16F8150716FC150316FE1501ED00FC284C7BBD33>I<007FB57EB6 +12F815FE81826C812603F8007FED3FF0ED0FF815076F7E1501A26F7EA74B5AA215034B5A +150FED3FF0EDFFE090B65A5E93C7FC5D8182D9F8007F153F6F7E150F821507AA173E177F +A416F8030313FF267FFFC014FEB538E001FF17FC81EE7FF86C49EB3FF0C9EA0FC0303E7E +BC33>II<003FB712F84816FCB8FCA43AFE000FE001A8007CED00 +F8C71500B3B3A40107B512C049804980A26D5C6D5C2E3D7EBC33>I<273FFFE001B5FC48 +6D481480B56C4814C0A26C496C14806C496C1400D801FCC7EA0FE0B3B3A36D141F00005E +A26D143F6D5DA26D6C49C7FC6E5B6D6C485AECF00390390FFC0FFC6DB55A6D5C6D5C6D6C +1380DA1FFEC8FCEC07F8323E80BC33>II<3A3FFF807FFF486DB51280A4 +6C496C13003A01FE000FE0151F6C7E4B5AEB7F805E90383FC07F93C7FC6D6C5A5DEB0FF1 +5DEB07FB5DEB03FF5D7F5D7F5D147F6E5AA34A7EA24A7E815B81EB03FB81EB07F181EB0F +E081011F7F02C07F013F133F02807F017F131F02007F49130F4980150700018149130300 +0381491301D87FFF90380FFFE0B56C4813F05DA2816C496C13E02C3D7DBC33>88 +DI<001FB612FE48815AA490C7EA01FE4B5AA24B5A +5E150F4B5AA2003E4A5AC8485AA24BC7FC5D14014A5AA24A5A4A5AA24A5A5D143F4A5AA2 +4AC8FC495AA2495A5C1307495AA2495A495AA2495A91C9FC5B4848141FEE3F80485A485A +A2485A5B121F485AA2485A90B7FCB8FCA46C1600293D7BBC33>I<007FB512C0B612E0A4 +15C048C8FCB3B3B3ABB612C015E0A46C14C01B4D6CC433>I<007FB512C0B612E0A47EC7 +120FB3B3B3AB007FB5FCB6FCA46C14C01B4D7DC433>93 D<007FB612FEA2B8FCA36C15FE +A228077B7D33>95 D97 DIIIIIII<14E0EB03F8A2497E +A36D5AA2EB00E091C8FCAA383FFFF8487FA47EEA0001B3AD007FB612C0B712E016F0A216 +E06C15C0243E78BD33>I<1570EC01FCA2EC03FEA3EC01FCA2EC00701500AA90383FFFFC +4913FE90B5FCA27F7F90C7FCB3B3A9140115FCA21218007EEB03F81407B414F0140F9038 +803FE090B512C06C14806C14006C5B6C13F8000113E01F557BBD33>II<383FFFFC487FB5FCA27E7EC7FCB3B3AD003FB612F84815FC +B712FEA26C15FC6C15F8273D7ABC33>I<02FC137E3B7FC3FF01FF80D8FFEF01877F90B5 +00CF7F15DF92B57E6C010F13872607FE07130301FC01FE7F9039F803FC01A201F013F8A4 +01E013F0B3A53C7FFE0FFF07FF80B548018F13C0A46C486C01071380322C80AB33>I<4A +B4FC263FFC0713C0267FFE1F13F000FF017F7F91B5FC6CB67E6CEC07FEC6EBF801ECF000 +4A7F4A7F5CA291C7FCA35BB3A43B3FFFF80FFFFC486D4813FEB56C4813FFA26C496C13FE +6C496C13FC302C7FAB33>III<02FF137C0107EBE0FE011F13F0017F13FC90B512FE4814FF4813C03907FE003F48 +48131F01F0130F484813071503485A491301127F90C7FC15005A5AA97E7E15017F123F6D +130315076C7E6C6C130F6D131FD807FE137F3903FF81FF6CEBFFFE6C14FC6D13F86D13F0 +010F13C0903801FE0090C8FCAF92387FFFFC92B512FEA46F13FC2F427CAB33>II<90381FFE0F90B5EA8F80000314FF120F5A5AEBF007387F800190C7FC00FE147F5A +153FA37E007FEC1F0001C090C7FCEA3FF8EBFFC06C13FF6C14E0000314F8C680011F13FF +01001480020713C0EC007FED1FE0007C140F00FEEC07F01503A27EA27F15076D14E06D13 +0F6DEB3FC09038FE01FF90B61280160000FD5C00FC14F8D8F83F13E0D8780790C7FC242E +79AC33>III<3B3FFFC00FFFF0486D4813F8B56C4813FCA26C496C13F86C49 +6C13F0D801F8C7EA7E006D14FE00005DA26D1301017E5CA2017F13036D5CA2EC8007011F +5CA2ECC00F010F5CA36D6C485AA3ECF03F010391C7FCA26E5A0101137EA2ECFCFE01005B +A214FF6E5AA36E5AA26E5A6E5A2E2B7EAA33>I<3B7FFF8007FFF8B56C4813FC6E5AA24A +7E6C496C13F8D80FC0C7EA0FC06D141F00071680A56D143F00031600A3EC0FC0EC1FE0A2 +3A01F83FF07EA3EC7FF8147CA20000157C9039FCFCFCFCA3ECF87CA2017C5C017D137EEC +F03EA2017F133FA26D486C5AA3ECC00F90390F8007C02E2B7EAA33>I<3B3FFFC07FFF80 +486DB512C0B500F114E0A26C01E014C06C496C13803B00FE000FE000017F495AEB3F804B +5A6D6C48C7FC90380FE07E903807F0FEECF1FC903803FBF8EB01FF6D5B5D6E5A143F6E5A +143F814A7E14FF903801FBF0ECF9F8903803F1FCEB07E0157E90380FC07F011F6D7E9038 +3F801F02007F496D7E01FE6D7E484813033B7FFFC03FFFE0B56C4813F0A46C496C13E02C +2B7DAA33>I<3B7FFF801FFFE0B56C4813F06E4813F8A24A6C13F06C496C13E0D803F8C7 +EAFC00000114015E7F000014036D5C137EA2017F495A7FA26E485A131FA26D6C485AA214 +E0010749C7FCA214F01303157EEB01F8A2157C010013FC14FC5D147C147DEC3FF0A36E5A +A36E5AA2141F5DA2143F92C8FCA3147EA214FE003F5B1301387F81F81383EB87F0139FEB +FFE06C5B5C6C90C9FCEA0FFCEA03F02D427DAA33>I<000FB712804816C05AA317800180 +C713004B5A4B5A4B5A4B5A6CC7485AC8485A4B5A4BC7FC4A5A4A5A4A5A4A5A4A5A4A5A4A +5A4AC8FC495A495A495A495A495A495A495A49C7EA0F804848EC1FC0485A485A485A485A +485A48B7FCB8FCA46C16802A2B7DAA33>II<127CA212FEB3B3B3B3127CA2074D6AC433>II E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fm cmsy10 12 12 +/Fm 12 107 df<007FB912E0BA12F0A26C18E03C04789A4D>0 D<0060160600F8160F6C +161F007E163F6C167E6C6C15FC6C6CEC01F86C6CEC03F06C6CEC07E06C6CEC0FC06C6CEC +1F80017EEC3F006D147E6D6C5B6D6C485A6D6C485A6D6C485A6D6C485A6D6C485ADA7E3F +C7FCEC3F7E6E5A6E5A6E5AA24A7E4A7EEC3F7EEC7E3F4A6C7E49486C7E49486C7E49486C +7E49486C7E49486C7E49C7127E017E8049EC1F804848EC0FC04848EC07E04848EC03F048 +48EC01F84848EC00FC48C9127E007E163F48161F48160F00601606303072B04D>2 +D<49B4FC010F13E0013F13F8497F48B6FC4815804815C04815E04815F0A24815F8A24815 +FCA3B712FEA96C15FCA36C15F8A26C15F0A26C15E06C15C06C15806C15006C6C13FC6D5B +010F13E0010190C7FC27277BAB32>15 D<19E0F003F0180FF03FE0F0FF80943803FE00EF +0FF8EF3FE0EFFF80DC03FEC7FCEE0FF8EE3FE0EEFF80DB03FEC8FCED1FF8ED7FE0913801 +FF80DA07FEC9FCEC1FF0EC7FC04948CAFCEB07FCEB1FF0EB7FC04848CBFCEA07FCEA1FF0 +EA7FC048CCFCA2EA7FC0EA1FF0EA07FCEA01FF38007FC0EB1FF0EB07FCEB01FF9038007F +C0EC1FF0EC07FC913801FF809138007FE0ED1FF8ED07FE923800FF80EE3FE0EE0FF8EE03 +FE933800FF80EF3FE0EF0FF8EF03FE943800FF80F03FE0F00FF01803F000E01900B0007F +B912E0BA12F0A26C18E03C4E78BE4D>20 D<127012FCB4FCEA7FC0EA1FF0EA07FCEA01FF +38007FC0EB1FF0EB07FCEB01FF9038007FC0EC1FF0EC07FC913801FF809138007FE0ED1F +F8ED07FE923800FF80EE3FE0EE0FF8EE03FE933800FF80EF3FE0EF0FF8EF03FE943800FF +80F03FE0F00FF0A2F03FE0F0FF80943803FE00EF0FF8EF3FE0EFFF80DC03FEC7FCEE0FF8 +EE3FE0EEFF80DB03FEC8FCED1FF8ED7FE0913801FF80DA07FEC9FCEC1FF0EC7FC04948CA +FCEB07FCEB1FF0EB7FC04848CBFCEA07FCEA1FF0EA7FC048CCFC12FC1270CDFCB0007FB9 +12E0BA12F0A26C18E03C4E78BE4D>I<07C01403DE03E0EC0F80060F153FDE3FC0ECFF00 +DEFF80EB03FEDD03FEC7EA0FF8DD07F8EC1FE0DD1FE0EC7F80DD7F80D901FEC7FCDC01FE +C7EA07F8DC07FCEC1FF0DC1FF0EC7FC0DC3FC04AC8FC04FFC7EA03FCDB03FCEC0FF0DB0F +F0EC3FC0DB3FE0ECFF80DBFF80D903FEC9FC4A48C7EA07F8DA07F8EC1FE0DA1FE0EC7F80 +DA7F80D901FECAFC4948C7EA07FCD907FCEC1FF0D90FF0EC3FC0D93FC002FFCBFC01FFC7 +EA03FCD803FCEC0FF0D80FF8EC3FE0D83FE0ECFF80D87F804948CCFC00FEC7EA03F8A2D8 +7F80EB01FED83FE06D6C7ED80FF8EC3FE0D803FCEC0FF0C6B4EC03FCD93FC0EB00FFD90F +F0EC3FC0D907FCEC1FF0D901FFEC07FC6D6C6CEB01FEDA1FE09038007F80DA07F8EC1FE0 +DA01FEEC07F86E6C6CEB03FEDB3FE0903800FF80DB0FF0EC3FC0DB03FCEC0FF0DB00FFEC +03FCDC3FC0EB00FFDC1FF0EC7FC0DC07FCEC1FF0DC01FEEC07F89326007F80EB01FEDD1F +E09038007F80DD07F8EC1FE0DD03FEEC0FF8942600FF80EB03FEDE3FC0EB00FFDE0FE0EC +3F800603150FDE00C0EC030059407BB864>28 D<16C04B7EB3B3B3A7007FBA1280BB12C0 +A26C198042427BC14D>63 D<031FB512C00203B7FC021F16E091B812F8010317FE010F71 +7E90283FE07FC03F80D9FE00020080D801F8041F7FD803E04A01077F48481601000F716C +7E4848717E003F02FF151F007F180F90C7707E00FE92C8FC488400F01A80008084C75AA2 +4B81A414035DA21B00A24A5AA24F5AA24A5A621903624A5A4F5AA24B4B5A023F5F191F4B +5E027F4CC7FC197E92C9127C4A5E4E5A4A4B5A01014C5AF01F804A033EC8FC01035E4A4A +5AEF07E00107ED1FC04A02FFC9FC010FEC07FC4AEBFFF091B612C0017F4ACAFC90B612F0 +4815804802F8CBFC4891CCFC49447EC34D>68 D<0403B712F8043F16FE4BB9FC1507151F +157F912601FC0090C7EA07FE912603F001ED01FCDA07C04915F0DA0F80EE0080021F1800 +EC3F004A495A5C5C495A4A495A5C495A6DC7FC90C8485AA35F161FA34C5AA35F167F94B6 +12C0A293B7FC624B93C7FC19FC04FCC71270030392C8FC5EA24B5AA2150F5E151F5EA24B +5AA24BCBFCA215FEA24A5AA24A5AEA0180000F495AEA1FC0486C485AD87FF05B39FFFC1F +80D87FFF90CCFC14FE6C5B6C13F06C5B00031380D800FCCDFC50477EC348>70 +D102 +D<12FEEAFFE0EA07F8EA00FEEB7F806D7E6D7E130F6D7EA26D7EB3AD6D7EA26D7E806E7E +6E7EEC0FE0EC03FC913800FFE0A2913803FC00EC0FE0EC3FC04A5A4AC7FC5C495AA2495A +B3AD495AA2495A131F495A495A01FEC8FCEA07F8EAFFE048C9FC236479CA32>I<126012 +F0B3B3B3B3B3A81260046474CA1C>106 D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fn cmr12 12 80 +/Fn 80 124 df<9239FFC001FC020F9038F80FFF913B3F803E3F03C0913BFC00077E07E0 +D903F890390FFC0FF0494890383FF81F4948EB7FF0495A494814E049C7FCF00FE0499139 +3FC0038049021F90C7FCAFB912F0A3C648C7D81FC0C7FCB3B2486CEC3FF0007FD9FC0FB5 +12E0A33C467EC539>11 D<4AB4FC020F13E091387F80F8903901FC001C49487FD907E013 +0F4948137F011FECFF80495A49C7FCA25B49EC7F00163E93C7FCACEE3F80B8FCA3C648C7 +FC167F163FB3B0486CEC7FC0007FD9FC1FB5FCA330467EC536>I<913801FFC0020FEBFB +8091387F803F903801FC00494813FFEB07E0EB1FC0A2495A49C7FC167F49143F5BAFB8FC +A3C648C7123FB3B2486CEC7FC0007FD9FC1FB5FCA330467EC536>II<001EEB03C0397F800FF000FF131F01C013F8A201E013FCA3007F130F39 +1E6003CC0000EB000CA401E0131C491318A3000114384913300003147090C712604814E0 +000614C0000E130148EB038048EB070048130E0060130C1E1D7DC431>34 +D<121EEA7F8012FF13C0A213E0A3127FEA1E601200A413E013C0A312011380120313005A +1206120E5A5A5A12600B1D78C41B>39 D<140C141C1438147014E0EB01C01303EB0780EB +0F00A2131E5BA25B13F85B12015B1203A2485AA3485AA348C7FCA35AA2123EA2127EA412 +7CA312FCB3A2127CA3127EA4123EA2123FA27EA36C7EA36C7EA36C7EA212017F12007F13 +787FA27F7FA2EB0780EB03C01301EB00E014701438141C140C166476CA26>I<12C07E12 +707E7E7E120F6C7E6C7EA26C7E6C7EA21378137C133C133E131E131FA2EB0F80A3EB07C0 +A3EB03E0A314F0A21301A214F8A41300A314FCB3A214F8A31301A414F0A21303A214E0A3 +EB07C0A3EB0F80A3EB1F00A2131E133E133C137C13785BA2485A485AA2485A48C7FC120E +5A5A5A5A5A16647BCA26>I<16C04B7EB3AB007FBAFCBB1280A26C1900C8D801E0C9FCB3 +AB6F5A41407BB84C>43 D<121EEA7F8012FF13C0A213E0A3127FEA1E601200A413E013C0 +A312011380120313005A1206120E5A5A5A12600B1D78891B>II< +121EEA7F80A2EAFFC0A4EA7F80A2EA1E000A0A78891B>I<1618163C167CA2167816F8A2 +16F01501A216E01503A216C01507A21680150FA2ED1F00A2151E153EA2153C157CA21578 +15F8A25D1401A24A5AA25D1407A25D140FA292C7FC5CA2141E143EA2143C147CA25CA25C +1301A25C1303A25C1307A25C130FA291C8FC5BA2133EA2133C137CA2137813F8A25B1201 +A25B1203A2485AA25B120FA290C9FC5AA2121E123EA2123C127CA2127812F8A25A126026 +647BCA31>I<14FF010713E090381F81F890383E007C01FC133F4848EB1F8049130F4848 +EB07C04848EB03E0A2000F15F0491301001F15F8A2003F15FCA390C8FC4815FEA54815FF +B3A46C15FEA56D1301003F15FCA3001F15F8A26C6CEB03F0A36C6CEB07E0000315C06D13 +0F6C6CEB1F806C6CEB3F00013E137C90381F81F8903807FFE0010090C7FC28447CC131> +I<143014F013011303131F13FFB5FC13E713071200B3B3B0497E497E007FB6FCA3204278 +C131>II<49B4FC010F13E0013F13FC +9038FE01FE3A01F0007F80D803C0EB3FC048C7EA1FE0120EED0FF0EA0FE0486C14F8A215 +077F5BA26C48130FEA03C0C813F0A3ED1FE0A2ED3FC01680ED7F0015FE4A5AEC03F0EC1F +C0D90FFFC7FC15F090380001FCEC007FED3F80ED1FC0ED0FE016F0ED07F816FC150316FE +A2150116FFA3121EEA7F80487EA416FE491303A2007EC713FC00701407003015F8003814 +0F6C15F06CEC1FE06C6CEB3FC0D803E0EB7F803A01FE01FE0039007FFFF8010F13E00101 +90C7FC28447CC131>II<000615C0D807C0130701FCEB7F8090B612005D5D5D +15E0158026063FFCC7FC90C9FCAE14FF010713C090381F01F090383800FC01F0137ED807 +C07F49EB1F8016C090C7120F000615E0C8EA07F0A316F81503A216FCA5123E127F487EA4 +16F890C712075A006015F0A20070140F003015E00038EC1FC07E001EEC3F806CEC7F006C +6C13FE6C6C485A3901F807F039007FFFE0011F90C7FCEB07F826447BC131>II<121CA2EA1F8090B712C0A3481680A217005E0038C8120C0030 +151C00705D0060153016705E5E4814014B5A4BC7FCC81206150E5D151815385D156015E0 +4A5AA24A5A140792C8FC5CA25C141E143EA2147E147CA214FCA21301A3495AA41307A613 +0FAA6D5AEB01C02A457BC231>I<14FF010713E0011F13F890387F00FE01FC133FD801F0 +EB1F804848EB0FC049EB07E00007EC03F048481301A290C713F8481400A47FA26D130116 +F07F6C6CEB03E013FC6C6CEB07C09039FF800F806C9038C01F006CEBF03EECF87839007F +FEF090383FFFC07F01077F6D13F8497F90381E7FFFD97C1F1380496C13C02601E00313E0 +48486C13F000079038007FF84848EB3FFC48C7120F003EEC07FE150148140016FF167F48 +153FA2161FA56C151E007C153EA2007E153C003E157C6C15F86DEB01F06C6CEB03E06C6C +EB07C0D803F8EB1F80C6B4EBFF0090383FFFFC010F13F00101138028447CC131>I<14FF +010713E0011F13F890387F80FC9038FC007E48487F4848EB1F804848EB0FC0000FEC07E0 +485AED03F0485A16F8007F140190C713FCA25AA216FE1500A516FFA46C5CA36C7E5D121F +7F000F5C6C6C130E150C6C6C131C6C6C5BD8007C5B90383F01E090390FFF80FE903801FE +0090C8FC150116FCA4ED03F8A216F0D80F801307486C14E0486C130F16C0ED1F80A249EB +3F0049137E001EC75A001C495A000F495A3907E01FE06CB51280C649C7FCEB1FF028447C +C131>I<121EEA7F80A2EAFFC0A4EA7F80A2EA1E00C7FCB3A5121EEA7F80A2EAFFC0A4EA +7F80A2EA1E000A2B78AA1B>I<121EEA7F80A2EAFFC0A4EA7F80A2EA1E00C7FCB3A5121E +127FEAFF80A213C0A4127F121E1200A512011380A3120313005A1206120E120C121C5A5A +12600A3E78AA1B>I<007FBAFCBB1280A26C1900CEFCB0007FBAFCBB1280A26C19004118 +7BA44C>61 D63 D<16C04B7EA34B7EA34B7EA34B7EA3ED19FE +A3ED30FFA203707FED607FA203E07FEDC03FA2020180ED801FA2DA03007F160FA2020680 +1607A24A6D7EA34A6D7EA34A6D7EA20270810260147FA202E08191B7FCA249820280C712 +1FA249C87F170FA20106821707A2496F7EA3496F7EA3496F7EA201788313F8486C83D80F +FF03037FB500E0027FEBFFC0A342477DC649>65 DIIIIIIII75 DIIIIIII<49B41303010FEBE007013F13F89039FE00 +FE0FD801F8131FD807E0EB079F49EB03DF48486DB4FC48C8FC4881003E81127E82127C00 +FC81A282A37E82A27EA26C6C91C7FC7F7FEA3FF813FE381FFFE06C13FE6CEBFFE06C14FC +6C14FF6C15C0013F14F0010F80010180D9001F7F14019138001FFF03031380816F13C016 +7F163F161F17E000C0150FA31607A37EA36C16C0160F7E17806C151F6C16006C5D6D147E +D8FBC05CD8F9F0495AD8F07C495A90393FC00FE0D8E00FB51280010149C7FC39C0003FF0 +2B487BC536>I<003FB912F8A3903BF0001FF8001F01806D481303003EC7150048187C00 +78183CA20070181CA30060180CA5481806A5C81600B3B3A54B7EED7FFE49B77EA33F447D +C346>II87 D89 D<001FB81280A39126800001130001 +FCC7FC01F04A5A01C04A5A5B90C8485A121E4C5A484B5AA200384B5A4C5AA24B90C7FC00 +304A5AA24B5AA24B5AC8485AA24B5A4B5AA24B5A5C93C8FC4A5AA24A5A4A5AA24A5A4A5A +A24A5A14FF5D4990C9FCEF0180495A495AA2495A494814031800495AA2495A495A5F4890 +C8FC485A5F485A48485D5F48485D17FE484814034848140F16FFB8FCA331447BC33C>I< +EAFFFCA4EAF000B3B3B3B3B3A2EAFFFCA40E6476CA1B>I<01C013180001143848481370 +48C712E0000EEB01C0000C1480001C13030018140000385B003013060070130E0060130C +A300E0131C481318A400CFEB19E039FFC01FF801E013FCA3007F130FA2003F130701C013 +F8390F0001E01E1D71C431>II< +EB07FC90383FFF809038F80FE03903C003F048C66C7E000E6D7ED80FC0137E486C137F6D +6D7EA36F7EA26C5AEA0380C8FCA4EC0FFF49B5FC90380FFE1FEB3FC0EBFF00EA03FC485A +485A485A485A127F5B176048C7FCA3153FA36D137F007F14EF6D9038C7E0C0003F13013A +1FE00783F13B07F81E03FF802701FFFC0113003A001FE0007C2B2E7CAC31>97 +DII<167FED3FFFA315018182B3EC7F80903803FFF090380FC07C +90383F000E017E1307496D5AD803F87F48487F5B000F81485AA2485AA2127FA290C8FC5A +AB7E7FA2123FA26C7EA2000F5D7F6C6C5B00035C6C6C9038077F806C6C010E13C0013F01 +1C13FE90380FC0F8903803FFE09026007F0013002F467DC436>III +III<143C14FFA2491380A46D1300A2143C91C7FCADEC7F80EB +3FFFA31300147F143FB3B3AA123E127F39FF807F00A2147EA25C6C485A383C01F06C485A +3807FF80D801FEC7FC195785C21E>IIII<3901FC01FE00FF903807FFC091381E07F091383801F800070170 +7F0003EBE0002601FDC07F5C01FF147F91C7FCA25BA35BB3A8486CECFF80B5D8F83F13FE +A32F2C7DAB36>II<3901FC03FC00FF9038 +0FFF8091383C07E091387001F83A07FDE000FE00030180137FD801FFEC3F8091C7EA1FC0 +4915E049140F17F0160717F8160317FCA3EE01FEABEE03FCA3EE07F8A217F0160F6D15E0 +EE1FC06D143F17806EEB7E00D9FDC05B9039FCF003F891383C0FE091381FFF80DA03FCC7 +FC91C9FCAE487EB512F8A32F3F7DAB36>I<91387F8003903903FFE00790380FE0789039 +3F801C0F90387E000E496D5AD803F8EB039F0007EC01BF4914FF48487F121F5B003F81A2 +485AA348C8FCAB6C7EA3123F7F121F6D5C120F6D5B12076C6C5B6C6C497E6C6C130E013F +131C90380FC0F8903803FFE09038007F0091C7FCAEEEFF80033F13FEA32F3F7DAB33>I< +3903F803F000FFEB1FFCEC3C3EEC707F0007EBE0FF3803F9C000015B13FBEC007E153C01 +FF13005BA45BB3A748B4FCB512FEA3202C7DAB26>I<90383FE0183901FFFC383907E01F +78390F0003F8001E1301481300007C1478127800F81438A21518A27EA27E6C6C13006C7E +13FC383FFFE06C13FC6C13FF6C14C06C14E0C614F0011F13F81300EC0FFC140300C0EB01 +FE1400157E7E153EA27EA36C143C6C147C15786C14F86CEB01F039F38003E039F1F00F80 +39E07FFE0038C00FF01F2E7DAC26>I<1306A5130EA4131EA3133E137EA213FE12011207 +001FB512F0B6FCA2C648C7FCB3A4150CAA017E131C017F1318A26D133890381F8030ECC0 +70903807E0E0903801FFC09038007F001E3E7EBC26>IIIIII<003FB612E0A29038C0003F90C713C0003CEC7F800038EC +FF00A20030495A0070495AA24A5A0060495AA24A5A4A5AA2C7485A4AC7FC5B5C495A1307 +5C495A131F4A1360495A495AA249C712C0485AA2485A485A1501485A48481303A24848EB +07804848131F00FF14FF90B6FCA2232B7DAA2B>II +E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fo cmbx12 17.28 28 +/Fo 28 122 df<16F04B7E1507151F153FEC01FF1407147F010FB5FCB7FCA41487EBF007 +C7FCB3B3B3B3007FB91280A6395E74DD51>49 D<913801FFF8021FEBFFC091B612F80103 +15FF010F16C0013F8290267FFC0114F89027FFE0003F7F4890C7000F7F48486E7FD807F8 +6E148048486E14C048486E14E048486F13F001FC17F8486C816D17FC6E80B56C16FE8380 +A219FFA283A36C5BA26C5B6C90C8FCD807FC5DEA01F0CA14FEA34D13FCA219F85F19F04D +13E0A294B512C019804C14004C5B604C5B4C5B604C13804C90C7FC4C5A4C5A4B13F05F4B +13804B90C8FC4B5AED1FF84B5A4B5A4B48143F4A5B4A48C8FC4A5A4A48157E4A5A4A5AEC +7F8092C9FC02FE16FE495A495A4948ED01FCD90FC0150749B8FC5B5B90B9FC5A4818F85A +5A5A5A5ABAFCA219F0A4405E78DD51>I<92B5FC020F14F8023F14FF49B712C04916F001 +0FD9C01F13FC90271FFC00077FD93FE001017F49486D8049C86C7F484883486C6F7F14C0 +486D826E806E82487FA4805CA36C5E4A5E6C5B6C5B6C495E011FC85A90C95CA294B55A61 +4C91C7FC604C5B4C5B4C5B4C5B047F138092260FFFFEC8FC020FB512F817E094C9FC17F8 +17FF91C7003F13E0040713F8040113FE707F717F7113E085717FA2717F85A285831A80A3 +1AC0EA03FCEA0FFF487F487F487FA2B57EA31A80A34D14005C7E4A5E5F6C495E49C8485B +D81FF85F000F5ED807FE92B55A6C6C6C4914806C01F0010791C7FC6C9026FF803F5B6D90 +B65A011F16F0010716C001014BC8FCD9001F14F0020149C9FC426079DD51>II73 D76 D80 +D82 DI< +B96C023FB612FEA6D8000102C0CA0007EBF000E2007FC7FCB3B3B3AA656D63A2821C0180 +6570170380525A6E7F6E4F5A70171F6E626E6D4D5A6E6D177F525A6E6E030390C8FC033F +01E04B5A6F6DED1FFC6F01FCED7FF80303D9FF80903803FFE06F02F8017F5B6F6C90B7C9 +FC041F5E040716F8040016C0050F4ACAFCDD003F13C06F647AE17C>85 +D<913803FFFE027FEBFFF00103B612FE010F6F7E4916E090273FFE001F7FD97FE001077F +D9FFF801017F486D6D7F717E486D6E7F85717FA2717FA36C496E7FA26C5B6D5AEB1FC090 +C9FCA74BB6FC157F0207B7FC147F49B61207010F14C0013FEBFE004913F048B512C04891 +C7FC485B4813F85A5C485B5A5CA2B55AA45FA25F806C5E806C047D7F6EEB01F96C6DD903 +F1EBFF806C01FED90FE114FF6C9027FFC07FC01580000191B5487E6C6C4B7E011F02FC13 +0F010302F001011400D9001F90CBFC49437CC14E>97 D<903807FF80B6FCA6C6FC7F7FB3 +A8EFFFF8040FEBFF80047F14F00381B612FC038715FF038F010014C0DBBFF0011F7FDBFF +C001077F93C76C7F4B02007F03F8824B6F7E4B6F13804B17C0851BE0A27313F0A21BF8A3 +7313FCA41BFEAE1BFCA44F13F8A31BF0A24F13E0A24F13C06F17804F1300816F4B5A6F4A +5B4AB402075B4A6C6C495B9126F83FE0013F13C09127F00FFC03B55A4A6CB648C7FCDAC0 +0115F84A6C15E091C7001F91C8FC90C8000313E04F657BE35A>I<92380FFFF04AB67E02 +0F15F0023F15FC91B77E01039039FE001FFF4901F8010113804901E0010713C049018049 +13E0017F90C7FC49484A13F0A2485B485B5A5C5A7113E0485B7113C048701380943800FE +0095C7FC485BA4B5FCAE7EA280A27EA2806C18FCA26C6D150119F87E6C6D15036EED07F0 +6C18E06C6D150F6D6DEC1FC06D01E0EC7F806D6DECFF00010701FCEB03FE6D9039FFC03F +FC010091B512F0023F5D020F1580020102FCC7FCDA000F13C03E437BC148>II<92380FFFC0 +4AB512FC020FECFF80023F15E091B712F80103D9FE037F499039F0007FFF011F01C0011F +7F49496D7F4990C76C7F49486E7F48498048844A804884485B727E5A5C48717EA35A5C72 +1380A2B5FCA391B9FCA41A0002C0CBFCA67EA380A27EA27E6E160FF11F806C183F6C7FF1 +7F006C7F6C6D16FE6C17016D6C4B5A6D6D4A5A6D01E04A5A6D6DEC3FE0010301FC49B45A +6D9026FFC01F90C7FC6D6C90B55A021F15F8020715E0020092C8FC030713F041437CC14A +>III<903807FF80B6FCA6C6FC7F7FB3A8EF1FFF94B512F0040714 +FC041F14FF4C8193267FE07F7F922781FE001F7FDB83F86D7FDB87F07FDB8FC0814C7F03 +9FC78015BE03BC8003FC825DA25DA25DA45DB3B2B7D8F007B71280A651647BE35A>II<903807FF80B6 +FCA6C6FC7F7FB3B3B3B3ADB712E0A623647BE32C>108 D<902607FF80EB1FFFB691B512 +F0040714FC041F14FF4C8193267FE07F7F922781FE001F7FC6DA83F86D7F6DD987F07F6D +D98FC0814C7F039FC78015BE03BC8003FC825DA25DA25DA45DB3B2B7D8F007B71280A651 +417BC05A>110 D<923807FFE092B6FC020715E0021F15F8027F15FE494848C66C6C7E01 +0701F0010F13E04901C001037F49496D7F4990C87F49486F7E49486F7E48496F13804819 +C04A814819E048496F13F0A24819F8A348496F13FCA34819FEA4B518FFAD6C19FEA46C6D +4B13FCA36C19F8A26C6D4B13F0A26C19E06C6D4B13C0A26C6D4B13806C6D4B13006D6C4B +5A6D6D495B6D6D495B010701F0010F13E06D01FE017F5B010090B7C7FC023F15FC020715 +E0020092C8FC030713E048437CC151>I114 +D<913A3FFF8007800107B5EAF81F011FECFE7F017F91B5FC48B8FC48EBE0014890C7121F +D80FFC1407D81FF0801600485A007F167F49153FA212FF171FA27F7F7F6D92C7FC13FF14 +E014FF6C14F8EDFFC06C15FC16FF6C16C06C16F06C826C826C826C82013F1680010F16C0 +1303D9007F15E0020315F0EC001F1500041F13F81607007C150100FC81177F6C163FA217 +1F7EA26D16F0A27F173F6D16E06D157F6D16C001FEEDFF806D0203130002C0EB0FFE02FC +EB7FFC01DFB65A010F5DD8FE0315C026F8007F49C7FC48010F13E035437BC140>II<902607FFC0ED3F +FEB60207B5FCA6C6EE00076D826D82B3B3A260A360A2607F60183E6D6D147E4E7F6D6D49 +48806D6DD907F0ECFF806D01FFEB3FE06D91B55A6E1500021F5C020314F8DA003F018002 +F0C7FC51427BC05A>I119 D121 +D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fp cmr10 10.95 32 +/Fp 32 122 df12 D<121EEA7F8012FF13C0A213E0A3 +127FEA1E601200A413E013C0A312011380120313005A120E5A1218123812300B1C79BE19 +>39 D<121EEA7F8012FF13C0A213E0A3127FEA1E601200A413E013C0A312011380120313 +005A120E5A1218123812300B1C798919>44 DI<121EEA7F80A2 +EAFFC0A4EA7F80A2EA1E000A0A798919>I73 D77 D80 D<003FB91280A3903AF0007FE001018090393FC0003F48C7ED1FC0007E170712 +7C00781703A300701701A548EF00E0A5C81600B3B14B7E4B7E0107B612FEA33B3D7DBC42 +>84 DI97 DI<49B4FC010F +13E090383F00F8017C131E4848131F4848137F0007ECFF80485A5B121FA24848EB7F0015 +1C007F91C7FCA290C9FC5AAB6C7EA3003FEC01C07F001F140316806C6C13076C6C140000 +03140E6C6C131E6C6C137890383F01F090380FFFC0D901FEC7FC222A7DA828>IIII<167C903903F801FF903A1FFF078F8090397E0FDE1F9038F803F83803 +F001A23B07E000FC0600000F6EC7FC49137E001F147FA8000F147E6D13FE00075C6C6C48 +5AA23901F803E03903FE0FC026071FFFC8FCEB03F80006CAFC120EA3120FA27F7F6CB512 +E015FE6C6E7E6C15E06C810003813A0FC0001FFC48C7EA01FE003E140048157E825A82A4 +6C5D007C153E007E157E6C5D6C6C495A6C6C495AD803F0EB0FC0D800FE017FC7FC90383F +FFFC010313C0293D7EA82D>III108 D<2701F801FE14FF00FF902707FFC00313E091 +3B1E07E00F03F0913B7803F03C01F80007903BE001F87000FC2603F9C06D487F00010180 +5C01FBD900FF147F91C75B13FF4992C7FCA2495CB3A6486C496CECFF80B5D8F87FD9FC3F +13FEA347287DA74C>I<3901F801FE00FF903807FFC091381E07E091387803F000079038 +E001F82603F9C07F0001138001FB6D7E91C7FC13FF5BA25BB3A6486C497EB5D8F87F13FC +A32E287DA733>I<14FF010713E090381F81F890387E007E01F8131F4848EB0F804848EB +07C04848EB03E0000F15F04848EB01F8A2003F15FCA248C812FEA44815FFA96C15FEA36C +6CEB01FCA3001F15F86C6CEB03F0A26C6CEB07E06C6CEB0FC06C6CEB1F80D8007EEB7E00 +90383F81FC90380FFFF0010090C7FC282A7EA82D>I<3901FC03FC00FF90381FFF809138 +7C0FE09039FDE003F03A07FFC001FC6C496C7E6C90C7127F49EC3F805BEE1FC017E0A2EE +0FF0A3EE07F8AAEE0FF0A4EE1FE0A2EE3FC06D1580EE7F007F6E13FE9138C001F89039FD +E007F09039FC780FC0DA3FFFC7FCEC07F891C9FCAD487EB512F8A32D3A7EA733>I<3901 +F807E000FFEB1FF8EC787CECE1FE3807F9C100031381EA01FB1401EC00FC01FF13304913 +00A35BB3A5487EB512FEA31F287EA724>114 D<90383FC0603901FFF8E03807C03F381F +000F003E1307003C1303127C0078130112F81400A27E7E7E6D1300EA7FF8EBFFC06C13F8 +6C13FE6C7F6C1480000114C0D8003F13E0010313F0EB001FEC0FF800E01303A214017E14 +00A27E15F07E14016C14E06CEB03C0903880078039F3E01F0038E0FFFC38C01FE01D2A7D +A824>I<131CA6133CA4137CA213FCA2120112031207001FB512C0B6FCA2D801FCC7FCB3 +A215E0A912009038FE01C0A2EB7F03013F138090381F8700EB07FEEB01F81B397EB723> +II< +B539E00FFFE0A32707FE000313006C48EB00FC5E00015D7F00005DA26D13016D5CA26D6C +485AA2ECC007011F91C7FCA290380FE00EA2ECF01E0107131CA26D6C5AA2ECFC78010113 +70A2ECFEF001005BA2EC7FC0A36E5AA26EC8FCA3140E2B287EA630>IIII E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fq cmbx10 10.95 7 +/Fq 7 117 df<16FCA24B7EA24B7EA34B7FA24B7FA34B7FA24B7FA34B7F157C03FC7FED +F87FA2020180EDF03F0203804B7E02078115C082020F814B7E021F811500824A81023E7F +027E81027C7FA202FC814A147F49B77EA34982A2D907E0C7001F7F4A80010F835C83011F +8391C87E4983133E83017E83017C81B500FC91B612FCA5463F7CBE4F>65 +D<903807FFC0013F13F848B6FC48812607FE037F260FF8007F6DEB3FF0486C806F7EA36F +7EA26C5A6C5AEA01E0C8FC153F91B5FC130F137F3901FFFE0F4813E0000F1380381FFE00 +485A5B485A12FF5BA4151F7F007F143F6D90387BFF806C6C01FB13FE391FFF07F36CEBFF +E100031480C6EC003FD91FF890C7FC2F2B7DA933>97 D<13FFB5FCA512077EAFEDFFE002 +0713FC021FEBFF80027F80DAFF8113F09139FC003FF802F06D7E4A6D7E4A13074A807013 +80A218C082A318E0AA18C0A25E1880A218005E6E5C6E495A6E495A02FCEB7FF0903AFCFF +01FFE0496CB55AD9F01F91C7FCD9E00713FCC7000113C033407DBE3A>II<3901FE01FE00FF903807FF804A13E04A13F0EC3F1F91387C3F +F8000713F8000313F0EBFFE0A29138C01FF0ED0FE091388007C092C7FCA391C8FCB3A2B6 +FCA525297DA82B>114 D<90383FFC1E48B512BE000714FE5A381FF00F383F800148C7FC +007E147EA200FE143EA27E7F6D90C7FC13F8EBFFE06C13FF15C06C14F06C806C806C806C +80C61580131F1300020713C014000078147F00F8143F151F7EA27E16806C143F6D140001 +E013FF9038F803FE90B55A15F0D8F87F13C026E00FFEC7FC222B7DA929>II +E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fr cmr12 14.4 32 +/Fr 32 122 df19 D24 D<120FEA3FC0EA7FE012FF13F0A213F8A3127F123FEA0F381200A513 +781370A313F013E0A2120113C0120313801207EA0F00121EA25A5A12300D23768B21>44 +DI48 +D<14075C5C147F5C1307133F000FB5FCB6FC13F913C1EAF0011200B3B3B3A7497F010F13 +E0B712FEA4274F75CE3B>II65 DII70 D<49B612FEA490C7003F13 +8092380FFE001507B3B3B3A21206EA3FC0487E487EA44B5AA25B007F5D0180131F0078C7 +5B6C143F003E4A5A6C5D6C6C495A2707E003FEC7FC3901FC07FC6CB512F0013F13C0D907 +FCC8FC2F547BD13C>74 D80 D83 D86 D97 DII<17FF4BB5FCA4ED +0007160182B3A6EC0FF8EC7FFF49B512E0903907FC03F090391FE0007C49487F49C7120F +01FE80484880485A000781484880A2485AA2485AA2127FA35B12FFAB127FA27FA2123FA2 +7F121FA26C6C5C00075D7F6C6C5C6C6C5C6C6C021E7F6D6C017C13E0D91FC049EBFF8090 +390FF807E00103B512800100495ADA1FF091C7FC39547CD241>II104 D<1378EA01FE487E487FA6 +6C90C7FC6C5AEA007890C8FCB0EB7F80B5FCA41203C6FC137FB3B3A43801FFE0B61280A4 +19507CCF21>I +108 D<01FFD907FEEC03FFB590261FFFC0010F13E0037F01F0013F13F8912701F80FFC90 +38FC07FE913D03C003FE01E001FF000390260700019038038000C6010E6D6C48C76C7E6D +48DA7F8E6E7E4A159CA24ADA3FF86E7E02605D14E04A5DA34A5DB3AD2601FFE0DAFFF0EC +7FF8B6D8C07F9026FFE03FB512F0A45C347CB363>I<01FFEB07FCB590383FFF8092B512 +E0913901F00FF8913903C007FC000349C66C7EC6010E13016D486D7E5C143002706E7E14 +6014E05CA35CB3AD2601FFE0903801FFE0B600C0B612C0A43A347CB341>II<90397F8007FCB590387FFF800281B512E0913987F00FF891398F8003 +FC000390399E0001FFC601BC6D7FD97FF86E7E4A6E7E4A6E7E4A140F844A6E7EA2717EA3 +717EA4711380AB4D1300A44D5AA24D5AA2606E140F4D5A6E5D6E4A5A6E4A5A02BC4AC7FC +029E495A028FEB07FC913987E01FF00281B512C0DA807F90C8FCED0FF892CAFCB13801FF +E0B612C0A4394B7DB341>I<01FFEB1F80B5EB7FF0913801FFF8913803E1FC91380783FE +0003EB0F07C6131EEB7F1C1438143091387003FC91386000F0160014E05CA45CB3AA8048 +487EB612F0A427347DB32E>114 DIII121 D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fs cmr17 20.74 29 +/Fs 29 122 df14 D39 D[<1638167816F0ED01E0ED03C0ED0780ED +0F00151E153E5D5D4A5A4A5AA24A5A4A5A141F92C7FC143E147E147C14FC495AA2495AA2 +495AA2495AA2495AA2133F91C8FC5B137EA213FE5B1201A25B1203A3485AA4485AA4485A +A5123F5BA5127FA390C9FCA65AB3A87EA67FA3123FA57F121FA56C7EA46C7EA46C7EA312 +017FA212007F137EA2137F7F80131FA26D7EA26D7EA26D7EA26D7EA26D7E147C147E143E +8081140F6E7E6E7EA26E7E6E7E157C81151E81ED0780ED03C0ED01E0ED00F016781638> +37 172 113 256 61 I[<12E07E12787E7E7E6C7E6C7E7F6C7E6C7E137C7FA27F6D7E80 +13076D7E801301806D7EA2147EA280A26E7EA26E7EA2811407811403A281140181A21400 +81A3157FA4ED3F80A4ED1FC0A516E0150FA516F0A31507A616F8B3A816F0A6150FA316E0 +A5151F16C0A5ED3F80A4ED7F00A415FEA35D1401A25D14035DA214075D140F5DA24A5AA2 +4AC7FCA2147EA25CA2495A5C13035C495A130F5C49C8FC133EA25B5B485A485A5B485A48 +C9FC121E5A5A5A5A>37 172 120 256 61 I58 D65 D69 D71 +D73 D80 D83 D85 D<913803FF80021F13F891B512FE903A03FC01FF80903A07E0003FE0D91F80EB0F +F8013EC76C7E496E7E01F06E7E48486E7F717E4848153F4982D807A06F7E13FC487E6D6F +7E80A2717EA46C90C8FC6C5A6C5ACAFCA6EE07FF0303B5FC157F913903FFFE07021F1380 +91387FF800903801FFC0010790C7FCEB1FFCEB3FF0EBFFE0485B485B4890C8FC5B485A48 +5AA2485A1A0E485AA312FF5B170FA4171FA26D153F007F163B177B6DDBF1FE131C003F16 +E16C6C14016C6C912603C0FF13386C6CEC0F806C6C6C903A1F007F80706C6D017CECE1E0 +28007FF803F8EB3FFF011FB500E06D1380010391C7000713009026003FF8EC01FC474D79 +CB4F>97 D<191FF07FFF051FB5FCA5EF001F180784A284B3B0ED07FE92387FFFC00203B5 +12F091390FFC01FC91393FE0001FDAFF80EB07814990C7EA03E1D903FCEC01F14948EC00 +79D91FF0153D4948151D4A151F49488101FF824890C9FC48835B0007835B120F5B121FA2 +123F5BA2127FA35BA212FFAE127FA27FA3123FA36C7EA36C7EA200075F7F00035F6C7E60 +6C6D5D6D6C153D013F16396D6C03797F6D6C15F16D6CDA03E17FD903FEDA078113F0D900 +FFDA1F01EBFFF0DA7FC0137E91391FF803F80207B512E0020114809127001FF800EC8000 +4C797AF758>100 DII< +F103F8F13FFEDB1FF891B5FC92B5903903FC078002079139E007E01F913D1FF00FF81F80 +3FC0913B3FC003FC3E0002FFC7B45A49486E5A49486E5A49486E48EB1F8049486E6CEB06 +0097C7FC49486E7E013F82A249486E7EA201FF82A24A80A24884AA6C95C8FCA26E5CA201 +7F5EA26D6C4A5AA2011F5E6D6C4A5AA26D6C4A5A6D6C4A5A496C4A5A6E4AC9FC903A0F3F +C003FC903A1E1FF00FF80207B512E0D91C0091CAFC013CEB1FF892CCFCA25BA3137CA413 +7EA27F8080EB1FF091B612FE6DEDFFF818FF6D17E06D17F8010017FE010383010F84D93F +E0C7000114E001FFC9120FD801FC04017F48489338003FF84848171F4848717E48481707 +003F727E49170148CBFC737EA200FE85A76C616C616D1701003F616D17036C6C4D5A6C6C +4D5A6C6C4D5A6C6C4D5A6C6C4D5A26007F80DB01FEC7FCD93FE0ED07FCD90FF8ED1FF0D9 +03FFEDFFC0010001F8011F90C8FC021FB612F802011580DA000F01F0C9FC4A707DCC4F> +I<131EEB7F80497E487F487FA66C5B6C5B6D5A011EC7FC90C8FCB3A7EB01F0EA07FFB5FC +A51201EA007F133FA2131FB3B3B3A3497EEBFFFEB612FCA51E727AF12A>105 +D108 DIII113 DII<1407A85CA65CA35CA35CA25CA25BA25B5B5B5B5B5B48B712FE12 +0FB8FCA3D8000190C9FCB3B3A2EF01C0B0EF03806D7FA3027FEC0700815F6E6C130E021F +141E6F131C6E6C5B6E6C13F8913901FF01F09139007FFFC0031F5BDB03FCC7FC326B7EE9 +3D>I<02F8EE0F80D803FFEE3FFFB5030FB5FCA5C6EE000F013F1603011F82A2010F82B3 +B3A660A460A3601307606E150E0103161E606E4B7F010116706D6C03F07F6FD903E013F8 +6E6C4948EBFFF8DA1FE0EB1F00DA0FFE13FE0203B512F8DA007F13E0030790C7EBC0004D +4C7ACA58>II121 D E +%EndDVIPSBitmapFont +end +%%EndProlog +%%BeginSetup +%%Feature: *Resolution 600dpi +TeXDict begin +%%PaperSize: A4 + +%%EndSetup +%%Page: 1 1 +1 0 bop 350 976 a Fs(Solving)54 b(Systems)d(of)i(A\016ne)f +(\(In\)Equalities:)73 b(PIP's)1528 1183 y(User's)53 b(Guide)1603 +1479 y Fr(P)m(aul)37 b(F)-10 b(eautrier)549 1726 y(Additions)37 +b(b)m(y)i(Jean-F)-10 b(ran\030)-52 b(cois)37 b(Collard)g(and)h(C)m +(\023)-55 b(edric)37 b(Bastoul)1052 1846 y(F)-10 b(ourth)38 +b(V)-10 b(ersion,)38 b(Septem)m(b)s(er)e(22,)i(2001)1770 +2177 y Fq(Abstract)638 2309 y Fp(This)f(do)s(cumen)m(t)i(is)f(the)i +(User's)f(Man)m(ual)g(of)h(PIP)-8 b(,)39 b(a)h(soft)m(w)m(are)g(whic)m +(h)e(solv)m(es)501 2421 y(P)m(arametric)h(In)m(teger)g(Programming)f +(problems.)62 b(That)38 b(is,)i(PIP)e(\014nds)e(the)i(lexi-)501 +2534 y(cographic)e(minim)m(um)c(of)j(the)h(set)g(of)f(in)m(teger)h(p)s +(oin)m(ts)e(whic)m(h)g(lie)g(inside)f(a)j(con)m(v)m(ex)501 +2647 y(p)s(olyhedron,)22 b(when)f(that)h(p)s(olyhedron)e(dep)s(ends)g +(linearly)g(on)i(one)g(or)g(more)g(in)m(tegral)501 2760 +y(parameters.)257 3088 y Fo(1)161 b(In)l(tro)t(duction)257 +3307 y Fn(The)39 b(seman)m(tic)e(analysis)g(of)g(programs)g(accessing)h +(arra)m(ys)h(often)e(b)s(oils)f(do)m(wn)j(to)e(\014nding)257 +3428 y(in)m(teger)31 b(solutions)e(to)h(parametric)f(linear)g +(programming)f(problems.)42 b(This)31 b(is)f(due)h(to)f(t)m(w)m(o)257 +3548 y(main)h(phenomena:)403 3724 y Fm(\017)48 b Fn(Arra)m(y)36 +b(subscripts)h(are)f(v)m(ery)h(often)e(linear)f(functions)i(of)f +(surrounding)g(lo)s(op)g(coun-)501 3844 y(ters)e(;)403 +4038 y Fm(\017)48 b Fn(The)34 b(program's)e(execution)h(order)g +(enforces)g(an)g(order)f(on)h(p)s(ossible)f(solutions.)404 +4214 y(Let)g(us)i(consider)f(the)g(follo)m(wing)c(example:)462 +4390 y Fl(for)52 b(i:=)h(0)e(to)h(m)f(do)667 4511 y(for)i(j)e(:=)h(0)f +(to)h(n)g(do)718 b({I})873 4631 y(a[2*i+j])53 b(:=)f(i+j;)404 +4807 y Fn(After)24 b(completion)f(of)h(execution,)i(for)e(whic)m(h)h(v) +-5 b(alues)24 b(of)g Fk(k)k Fn(is)c Fl(A[)p Fk(k)s Fl(])h +Fn(de\014ned,)i(and)e(whic)m(h)257 4927 y(instances)37 +b(of)f(the)g(assignmen)m(t)g(wrote)g(in)m(to)g(this)f(arra)m(y)i +(elemen)m(t?)53 b(W)-8 b(e)37 b(can)f(easily)f(c)m(hec)m(k)257 +5048 y(that)28 b(answ)m(ering)g(this)g(question)g(is)f(equiv)-5 +b(alen)m(t)28 b(to)f(\014nding)h(the)g(solutions)f(of)g(the)h(follo)m +(wing)257 5168 y(system,)34 b(where)g Fk(i;)17 b(j)38 +b Fn(and)33 b Fk(k)j Fn(are)c(the)h(unkno)m(wns:)1702 +5356 y(0)28 b Fm(\024)104 b Fk(i)h Fm(\024)28 b Fk(m;)1243 +b Fn(\(1\))1702 5501 y(0)28 b Fm(\024)98 b Fk(j)104 b +Fm(\024)28 b Fk(n;)1270 b Fn(\(2\))1608 5646 y(2)p Fk(i)22 +b Fn(+)g Fk(j)89 b Fn(=)83 b Fk(k)s(:)1379 b Fn(\(3\))1946 +5896 y(1)p eop +%%Page: 2 2 +2 1 bop 257 266 a Fj(2)98 b(USING)32 b(THE)i(PIP)f(SOFTW)-11 +b(ARE)1879 b Fn(2)404 573 y(Moreo)m(v)m(er,)30 b(if)c(w)m(e)i(w)m(an)m +(t)h(to)e(kno)m(w)h(whic)m(h)g(instance)g(ga)m(v)m(e)g(its)f +Fi(\014nal)g Fn(v)-5 b(alue)26 b(to)h Fl(A[)p Fk(k)s +Fl(])p Fn(,)j(that)257 693 y(is)k(if)f(w)m(e)i(are)f(lo)s(oking)e(for)h +(the)i Fi(last)f Fn(instance)g(writing)e(in)m(to)i Fl(A[)p +Fk(k)s Fl(])p Fn(,)h(then)g(w)m(e)g(ha)m(v)m(e)g(to)f(lo)s(ok)257 +814 y(for)h(the)g(maximal)d(v)-5 b(alue)34 b(of)h(v)m(ector)h(\()p +Fk(i;)17 b(j)6 b Fn(\))35 b(according)f(to)h(lexicographic)e(order.)51 +b(W)-8 b(e)35 b(th)m(us)257 934 y(consider)e(the)g(follo)m(wing)d +Fi(p)-5 b(olyhe)g(dr)g(on)32 b Fm(F)10 b Fn(\()p Fk(k)s(;)17 +b(m;)g(n)p Fn(\):)741 1152 y Fm(F)10 b Fn(\()p Fk(k)s(;)17 +b(m;)g(n)p Fn(\))27 b(=)g Fm(f)p Fk(<)h(i;)17 b(j)33 +b(>)28 b Fm(j)p Fn(0)f Fm(\024)h Fk(i)g Fm(\024)g Fk(m;)17 +b Fn(0)28 b Fm(\024)g Fk(j)34 b Fm(\024)28 b Fk(n;)17 +b Fn(2)p Fk(i)22 b Fn(+)g Fk(j)34 b Fn(=)27 b Fk(k)s +Fm(g)p Fk(:)359 b Fn(\(4\))257 1370 y(What)39 b(is)e(the)i +(lexicographical)c(maxim)m(um)h(of)i(the)h(in)m(teger-v)-5 +b(alued)37 b(v)m(ectors)i(included)f(in)257 1491 y Fm(F)10 +b Fn(\()p Fk(k)s(;)17 b(m;)g(n)p Fn(\)?)52 b(The)37 b(aim)c(of)i(PIP)i +(is)e(to)g(solv)m(e)h(suc)m(h)h(problems.)52 b(The)36 +b(reader)g(is)f(refered)i(to)257 1611 y([1])c(for)f(a)g(mathematical)e +(description)i(of)g(the)h(metho)s(d.)257 1900 y Fh(1.1)136 +b(General)45 b(form)l(ulation)257 2085 y Fn(Let)33 b +Fm(F)42 b Fn(b)s(e)33 b(a)f(p)s(olyhedron:)1189 2303 +y Fm(F)10 b Fn(\()n Fk(~)-47 b(z)t Fn(\))28 b(=)f Fm(f)n +Fk(~)-47 b(x)p Fm(j)n Fk(~)g(x)28 b Fm(\025)g Fn(0)p +Fk(;)17 b Fg(A)n Fk(~)-48 b(x)23 b Fn(+)f Fg(B)n Fk(~)-47 +b(z)27 b Fn(+)17 b Fk(~)-44 b(c)27 b Fm(\025)h Fn(0)p +Fm(g)p Fk(:)807 b Fn(\(5\))257 2521 y(In)29 b(this)f(form)m(ula,)d +Fk(~)-47 b(x)29 b Fn(is)e(a)h(v)m(ector)h(with)f Fk(n)g +Fn(en)m(tries:)42 b(the)29 b(v)m(ector)g(of)f(all)e(unkno)m(wns.)43 +b Fk(~)-48 b(z)5 b Fn(,)27 b Fk(~)-47 b(z)33 b Fm(\025)28 +b Fn(0,)257 2641 y(is)d(the)h(v)m(ector)g(built)e(from)g(parameters)h +(and)g(has)h Fk(p)f Fn(en)m(tries.)41 b(P)m(olyhedron)26 +b Fm(F)10 b Fn(\()n Fk(~)-47 b(z)t Fn(\))25 b(is)g(a)g(subset)257 +2762 y(of)32 b Fg(R)452 2726 y Ff(n)532 2762 y Fn(and)g(is)g(de\014ned) +i(b)m(y)g Fk(n)22 b Fn(+)g Fk(l)35 b Fn(inequalities:)42 +b Fk(n)32 b Fn(inequalities)f(expressing)1850 2980 y +Fk(~)-48 b(x)29 b Fm(\025)f Fn(0)257 3198 y(and)36 b(the)g +Fk(l)i Fn(inequalities)c(correp)s(onding)h(to)h(ro)m(ws)g(of)g(matrix)e +Fg(A)h Fn(of)h(size)g Fk(l)26 b Fm(\002)f Fk(n)p Fn(,)37 +b(matrix)d Fg(B)257 3319 y Fn(of)e(size)h Fk(l)25 b Fm(\002)d +Fk(p)p Fn(,)33 b(and)g(constan)m(t)g(v)m(ector)28 b Fk(~)-43 +b(c)32 b Fn(of)g(size)h Fk(l)r Fn(.)404 3439 y(Size)f(parameters)h(can) +g(themselv)m(es)g(b)s(e)g(constrained)g(b)m(y)h(a)e(set)h(of)f(a\016ne) +h(inequalities)1699 3657 y Fg(M)n Fk(~)-47 b(z)28 b Fn(+)1969 +3631 y Fk(~)1976 3657 y(h)f Fm(\025)i Fn(0)p Fk(;)257 +3875 y Fn(whic)m(h)j(is)f(called)g(the)g Fi(c)-5 b(ontext)32 +b Fn(of)f(the)h(problem.)41 b Fg(M)32 b Fn(is)f(an)g +Fk(m)21 b Fm(\002)f Fk(p)31 b Fn(matrix)f(and)3248 3849 +y Fk(~)3255 3875 y(h)h Fn(a)g(v)m(ector)257 3996 y(of)37 +b(dimension)g Fk(m)p Fn(.)58 b(All)36 b(data)h(of)g(a)h(PIP)g(problem:) +52 b(\()p Fg(A)p Fk(;)17 b Fg(B)p Fk(;)g Fg(M)p Fk(;)11 +b(~)-43 b(c)o(;)2756 3970 y(~)2763 3996 y(h)p Fn(\))37 +b(are)h(assumed)g(to)f(b)s(e)257 4116 y(in)m(teger-v)-5 +b(alued.)257 4449 y Fo(2)161 b(Using)54 b(the)f(PIP)h(Soft)l(w)l(are) +257 4697 y Fh(2.1)136 b(W)-11 b(riting)45 b(the)g(Input)g(File)257 +4882 y Fn(The)34 b(input)e(text)h(\014le)f(follo)m(ws)g(the)h(follo)m +(wing)d(con)m(text-free)j(grammar:)257 5083 y Fg(Grammar)k(1)49 +b Fi(:)257 5285 y Fl(File)258 b(::=)52 b(Problem)h(...)257 +5406 y(Problem)105 b(::=)52 b(\()f(Comments)j(Nn)e(Np)f(Nl)h(Nm)g(Bg)g +(Nq)g(Tableau)h(Context)g(\))257 5526 y(Comments)h(::=)e(List)257 +5646 y(List)258 b(::=)52 b(Atom)g(|)g(\()f(List)i(...)f(\))p +eop +%%Page: 3 3 +3 2 bop 257 266 a Fj(2)98 b(USING)32 b(THE)i(PIP)f(SOFTW)-11 +b(ARE)1879 b Fn(3)257 573 y Fl(Tableau)105 b(::=)52 b(\()f(Vector)i +(...)f(\))257 693 y(Context)105 b(::=)52 b(\()f(Vector)i(...)f(\))257 +814 y(Vector)156 b(::=)52 b(#[)g(Integer)h(...)f(])257 +934 y(Nn)g(::=)g(Integer)257 1054 y(Np)g(::=)g(Integer)257 +1175 y(Nl)g(::=)g(Integer)257 1295 y(Nm)g(::=)g(Integer)257 +1416 y(Bg)g(::=)g(Integer)257 1536 y(Nq)g(::=)g(0)g(|)f(1)257 +1716 y Fn(This)36 b(syn)m(tax)i(w)m(as)e(c)m(hosen)i(so)e(as)g(to)f +(ease)i(the)f(generation)f(of)g(problems)h(b)m(y)g(a)g(Lisp)f(pro-)257 +1837 y(gram.)51 b(In)35 b(particular,)g(eac)m(h)h Fl(Problem)h +Fn(is)e(a)g(balanced)g(list,)f(as)i(far)f(as)g(b)s(oth)g(paren)m +(theses)257 1957 y(and)e(brac)m(k)m(ets)i(are)d(concerned.)403 +2155 y Fm(\017)48 b Fl(Comments)36 b Fn(are)d(arbitrary)g(lists.)45 +b(These)35 b(commen)m(ts)e(are)h(written)f(v)m(erbatim)g(to)g(the)501 +2275 y(output)g(\014le,)f(and)h(are)g(useful)f(to)g(k)m(eep)j(trac)m(k) +e(of)f(problems)g(and)g(solutions.)501 2433 y(Note)47 +b(that)f(sev)m(eral)h Fl(Problem)p Fn(s)i(can)e(b)s(e)g(giv)m(en)f(to)g +(PIP)i(in)d(the)i(same)g(\014le.)85 b(The)501 2553 y(problems)26 +b(ma)m(y)g(b)s(e)g(separated)h(b)m(y)h(an)m(y)f(text)g(that)f(do)s(es)g +(not)g(con)m(tain)g(a)g(paren)m(thesis.)501 2674 y(By)39 +b(using)f(Unix)g(FIF)m(O's)g(as)g(input)g(and)g(output)h(\014les,)h(it) +d(is)g(easy)j(to)d(con)m(v)m(ert)j(the)501 2794 y(presen)m(t)34 +b(implemen)m(tation)c(of)i(PIP)h(in)m(to)f(a)h(linear)e(programming)e +(serv)m(er.)403 2990 y Fm(\017)48 b Fl(Nn)34 b Fn(is)e(the)i(n)m(um)m +(b)s(er)f(of)g(unkno)m(wns)i(in)d(the)h(program)f(\(whic)m(h)h(w)m(as)h +(denoted)g(b)m(y)g Fk(n)f Fn(in)501 3110 y(the)g(\014rst)g(section\).) +403 3306 y Fm(\017)48 b Fl(Np)33 b Fn(is)f(the)h(n)m(um)m(b)s(er)g(of)f +(\(sym)m(b)s(olic\))g(parameters)g(\()p Fk(p)p Fn(\))403 +3502 y Fm(\017)48 b Fl(Nl)33 b Fn(is)f(the)h(n)m(um)m(b)s(er)g(of)f +(inequalities)f(de\014ning)i(the)g(domain)e(of)h(the)h(unkno)m(wns)h +(\()p Fk(l)r Fn(\).)403 3697 y Fm(\017)48 b Fl(Nm)33 +b Fn(is)f(the)h(n)m(um)m(b)s(er)g(of)f(inequalities)f(satis\014ed)i(b)m +(y)h(the)f(parameters)f(\()p Fk(m)p Fn(\).)403 3893 y +Fm(\017)48 b Fl(Bg)28 b Fn(is)f(the)h(index)f(of)g(a)g(\\Big")f +(parameter)g(whose)j(v)-5 b(alue)27 b(is)f(assumed)i(to)f(b)s(e)h +(in\014nitely)501 4014 y(large.)61 b(That)39 b(is,)h(if)e(the)h(big)f +(parameter)g(app)s(ears)h(with)f(a)h(p)s(ositiv)m(e)f(co)s(e\016cien)m +(t)h(in)501 4134 y(a)45 b(form)e Fk(\036)p Fn(,)48 b(then)d(w)m(e)h +(can)e(immediately)e(deduce)k(that)f Fk(\036)j(>)g Fn(0.)80 +b(If)44 b Fl(Bg)h Fn(is)f(set)i(to)501 4254 y(a)39 b(nonp)s(ositiv)m(e) +g(v)-5 b(alue,)40 b(then)g(there)g(is)f(no)g(big)f(parameter)h(in)g +(the)g(problem)f(to)h(b)s(e)501 4375 y(solv)m(ed.)501 +4533 y(Be)30 b(a)m(w)m(are)g(that)g Fl(Bg)g Fn(is)f(the)h(column)e +(rank)i(of)f(the)h(corresp)s(onding)f(parameter)g(in)g(the)501 +4653 y Fl(Tableau)p Fn(,)35 b(and)d(that)h(the)g(\014rst)g(v)-5 +b(alid)31 b(v)-5 b(alue)32 b(for)g(it)f(is)h Fl(Nn+1)p +Fn(.)403 4849 y Fm(\017)48 b Fl(Nq)29 b Fn(is)e(an)h(in)m(teger)g(but)h +(should)f(b)s(e)g(in)m(terpreted)h(as)f(a)g(b)s(o)s(olean)e(v)-5 +b(alue)28 b Fj(\022)-49 b(a)28 b(la)e Fn(C,)j(that)f(is,)501 +4969 y(it)f(denotes)h(\\true")g(if)e(its)h(v)-5 b(alue)27 +b(is)g(nonzero.)42 b(If)28 b Fl(Nq)g Fn(is)f(true,)i(then)f(an)f(in)m +(teger-v)-5 b(alued)501 5090 y(solution)44 b(is)g(lo)s(ok)m(ed)h(for.) +80 b(Otherwise,)48 b(PIP)e(\014nds)g(the)f(lexicographic)f(minim)m(um) +501 5210 y(rational)30 b(solution)h(to)i(the)g(problem.)403 +5406 y Fm(\017)48 b Fl(Tableau)f Fn(stores)f(the)f(set)h(of)e +(inequalities)f(de\014ning)i(the)h(domain)d(of)h(unkno)m(wns.)501 +5526 y(Eac)m(h)38 b Fl(Vector)g Fn(represen)m(ts)g(one)f(inequalit)m(y) +-8 b(.)54 b(The)37 b(en)m(tries)g(in)f Fl(Vector)i Fn(are,)f(in)f(this) +501 5646 y(order:)p eop +%%Page: 4 4 +4 3 bop 257 266 a Fj(2)98 b(USING)32 b(THE)i(PIP)f(SOFTW)-11 +b(ARE)1879 b Fn(4)611 573 y Fg({)49 b Fn(the)33 b(co)s(e\016cien)m(ts)h +(of)e(the)h(unkno)m(wns)h(\(I.e.,)g(a)e(ro)m(w)h(of)f(matrix)f +Fg(A)p Fn(\),)611 721 y Fg({)49 b Fn(the)33 b(\(additiv)m(e\))f +(constan)m(t,)h(\(I.e.,)h(an)e(en)m(try)i(of)e(v)m(ector)c +Fk(~)-44 b(c)p Fn(\),)611 868 y Fg({)49 b Fn(the)33 b(co)s(e\016cien)m +(ts)h(of)e(the)h(parameters)f(\(I.e.,)i(a)e(ro)m(w)h(of)f(matrix)f +Fg(B)p Fn(\))501 1058 y(This)h(notation)e(hea)m(vily)i(dep)s(ends)h(on) +e(the)h(p)s(ositions)f(giv)m(en)g(to)h(unkno)m(wns)h(and)f(pa-)501 +1178 y(rameters:)43 b(it)31 b(is)h(the)g(resp)s(onsabilit)m(y)f(of)g +(the)i(user)f(to)g(enforce)g(a)g(coheren)m(t)h(ordering)501 +1299 y(of)38 b(co)s(e\016cien)m(ts)h(and)f(to)f(set)i(a)e(co)s +(e\016cien)m(t)i(to)e(zero)i(when)g(the)f(corresp)s(onding)g(un-)501 +1419 y(kno)m(wn/parameter)33 b(do)s(es)h(not)e(app)s(ear.)501 +1574 y(There)c(are)f Fk(l)i Fn(suc)m(h)g Fl(Vector)p +Fn(s)g(in)d Fl(Tableau)p Fn(,)k(and)d(eac)m(h)h Fl(vector)g +Fn(exactly)f(has)h Fk(n)11 b Fn(+)g(1)g(+)g Fk(p)501 +1694 y Fn(en)m(tries.)403 1883 y Fm(\017)48 b Fn(In)39 +b(a)f(similar)d(w)m(a)m(y)-8 b(,)41 b Fl(Context)g Fn(is)d(a)g(list)f +(of)h Fl(Vector)p Fn(s.)63 b(Eac)m(h)39 b Fl(Vector)h +Fn(represen)m(ts)h(a)501 2004 y(ro)m(w)30 b(of)f(Matrix)g +Fg(M)h Fn(follo)m(w)m(ed)f(b)m(y)h(the)g(corresp)s(onding)g(en)m(try)h +(in)d(v)m(ector)3191 1978 y Fk(~)3198 2004 y(h)p Fn(.)43 +b Fl(Context)501 2124 y Fn(th)m(us)34 b(includes)e Fk(m)h +Fl(Vector)p Fn(s)i(of)d Fk(p)22 b Fn(+)g(1)32 b(en)m(tries.)257 +2377 y Fg(2.1.1)113 b(Example)257 2561 y Fn(This)33 b(example)f(is)g +(tak)m(en)i(from)d([2].)44 b(W)-8 b(e)33 b(consider)f(the)h(lo)s(op)f +(nest)h(b)s(elo)m(w:)257 2723 y Fl(for)52 b(i:=)g(0)g(to)g(m)f(do)411 +2843 y(for)h(j)g(:=)g(0)f(to)h(n)f(do)719 b({II})565 +2963 y(for)52 b(k)g(:=)f(0)h(to)g(i+j)g(do)g(...)257 +3124 y Fn(and)42 b(w)m(e)g(wish)g(to)f(rewrite)h(this)f(nest)h(in)f +(the)h(order)g Fl(k,)51 b(j,)h(i)p Fn(.)71 b(The)42 b(b)s(ounds)g(on)g +Fl(k)f Fn(can)257 3245 y(easily)g(b)s(e)h(guessed)h(\(0)g +Fm(\024)g Fk(k)j Fm(\024)e Fk(m)28 b Fn(+)g Fk(n)p Fn(\),)44 +b(so)e(let's)f(lo)s(ok)g(for)g(the)h(lo)m(w)m(er)f(b)s(ound)h(on)g +Fl(j)f Fn(in)257 3365 y(the)33 b(rewritten)f(nest.)45 +b(This)32 b(lo)m(w)m(er)h(b)s(ound)f(on)g Fl(j)h Fn(can)f(b)s(e)h +(found)f(b)m(y)h(solving)f(the)g(follo)m(wing)257 3486 +y(problem:)1047 3606 y Fm(D)1124 3621 y Fe(2)1163 3606 +y Fn(\()p Fk(k)s Fn(\))c(=)f Fm(f)17 b Fk(<)11 b(j;)17 +b(i)11 b(>)44 b Fm(j)p Fk(i)28 b Fm(\024)g Fk(m;)17 b(j)34 +b Fm(\024)28 b Fk(n;)17 b(k)31 b Fm(\024)d Fk(i)22 b +Fn(+)g Fk(j)6 b Fm(g)p Fk(:)404 3759 y Fn(This)37 b(problem)f(is)g(to)h +(b)s(e)g(solv)m(ed)h(in)e(the)h(con)m(text)h Fk(k)h Fm(\024)c +Fk(m)26 b Fn(+)f Fk(n)p Fn(.)57 b(The)38 b(input)e(\014le)h(ma)m(y)257 +3880 y(th)m(us)d(lo)s(ok)d(lik)m(e)h(this:)257 4041 y +Fl(\()52 b(\(Lower)h(bound)f(on)g(j)g(after)g(loop)h(inversion)514 +4161 y(\(unknowns)g(j)f(i\))514 4282 y(\(parameters)i(k)d(m)h(n\)\))360 +4402 y(2)f(3)h(3)f(1)h(-1)g(1)360 4522 y(\()f(#[0)h(-1)g(0)g(0)f(1)h +(0])462 4643 y(#[-1)h(0)e(0)h(0)f(0)h(1])462 4763 y(#[1)g(1)g(0)g(-1)f +(0)h(0])411 4883 y(\))360 5004 y(\()f(#[-1)i(1)e(1)h(0]\))257 +5124 y(\))257 5285 y Fn(The)30 b(\014rst)f(sequence)i(of)d(in)m(tegers) +h(should)g(b)s(e)g(read)f(as:)42 b(This)29 b(problem)e(has)i(2)g(unkno) +m(wns)h(\()p Fk(i)257 5406 y Fn(and)k Fk(j)6 b Fn(\))33 +b(and)g(3)g(parameters)h(\()p Fk(k)s Fn(,)f Fk(m)h Fn(and)f +Fk(n)p Fn(\).)46 b(The)34 b(domain)e(is)g(de\014ned)j(b)m(y)f(3)f +(inequalities,)257 5526 y(the)d(con)m(text)h(b)m(y)f(1)f(inequalit)m(y) +-8 b(.)41 b(There)31 b(is)e(no)g(\(-1\))f(big)h(parameter)g(and)g(it)f +(is)h(true)h(\(1\))f(that)257 5646 y(w)m(e)34 b(are)f(lo)s(oking)d(for) +i(an)h(in)m(teger)f(solution.)p eop +%%Page: 5 5 +5 4 bop 257 266 a Fj(2)98 b(USING)32 b(THE)i(PIP)f(SOFTW)-11 +b(ARE)1879 b Fn(5)257 573 y Fh(2.2)136 b(Calling)46 b(PIP)257 +758 y Fn(PIP)34 b(is)e(called)f(b)m(y)j(the)f(follo)m(wing)d(command:) +514 961 y Fl(pip)52 b([-s|-v])h([-z])f([input)h([output]])257 +1164 y Fn(PIP)39 b(prin)m(ts)f(some)f(information)e(on)i(the)h(screen)i +(after)d(ha)m(ving)g(solv)m(ed)i(a)e(problem.)58 b(The)257 +1285 y Fl(-s)29 b Fn(\(silen)m(t)f(mo)s(de\))g(switc)m(hes)i(this)f +(feature)g(o\013.)42 b(On)28 b(the)h(con)m(trary)-8 b(,)30 +b(the)f(v)m(erb)s(ose)h Fl(-v)g Fn(option)257 1405 y(tells)39 +b(PIP)i(to)f(cop)m(y)-8 b(,)43 b(in)c(a)h(\014le,)h(all)d(the)i(input)g +(data)g(and)g(all)e(the)i(in)m(termediary)f(results.)257 +1526 y(The)33 b(name)f(of)f(this)g(\014le)h(is)f(giv)m(en)h(either)g(b) +m(y)h(the)f(v)-5 b(ariable)30 b Fl(DEBUG)j Fn(in)e(the)i(en)m(vironmen) +m(t)f(or)257 1646 y(is)g(built)f(b)m(y)j Fl(mktemp)p +Fn(.)404 1766 y(If)27 b(the)h Fl(-z)h Fn(option)d(is)i(giv)m(en,)g +(then)h(the)f(solution)e(is)h(somewhat)h(simpli\014ed)e(\(see)j(b)s +(elo)m(w\).)404 1887 y Fl(input)d Fn(and)g Fl(output)h +Fn(are)f(the)g(names)f(of)g(the)h(input)f(\(data\))g(and)h(output)g +(\(results\))f(\014les,)257 2007 y(resp)s(ectiv)m(ely)-8 +b(.)65 b(If)39 b(no)g Fl(output)i Fn(\()p Fl(input)p +Fn(\))f(\014le)f(is)f(giv)m(en,)j(then)f(the)g(results)f(are)h(prin)m +(ted)f(to)257 2127 y(the)33 b(standard)g(output)g(\(input\).)257 +2387 y Fg(2.2.1)113 b(Messages)403 2572 y Fm(\017)48 +b Fl(Version)53 b(X.x)p Fn(.)45 b(Curren)m(tly)-8 b(,)33 +b Fl(D.1)p Fn(.)403 2775 y Fm(\017)48 b Fl(cross)53 b(:)103 +b(,)52 b(alloc)h(:)102 b()41 b Fn(This)g(message)g(is)f(output)g +(after)g(solving)g(eac)m(h)501 2896 y(problem.)j(The)33 +b(v)-5 b(alue)32 b(of)g Fl()h Fn(giv)m(es)g(an)g(idea)f(of)g(the)h +(complexit)m(y)f(of)g(the)h(problem.)257 3156 y Fg(Errors)k(related)g +(to)g(the)g(input)403 3359 y Fm(\017)48 b Fl(Syntax)53 +b(error)p Fn(:)45 b(un)m(balanced)33 b(paren)m(theses)i(in)d(the)h +(input.)403 3562 y Fm(\017)48 b Fl(Your)53 b(computer)g(doesn't)g(have) +f(enough)h(memory)p Fn(:)45 b(self)33 b(explanatory)-8 +b(.)257 3822 y Fg(Errors)37 b(related)g(to)g(the)g(solution)403 +4026 y Fm(\017)48 b Fl(Integer)53 b(Overflow)p Fn(:)78 +b(A)49 b(n)m(um)m(b)s(er)g(has)g(b)s(een)g(generated)g(that)g(is)f(to)s +(o)f(large)h(to)501 4146 y(b)s(e)41 b(accommo)s(dated)e(in)g(a)h(32)g +(bit)f(in)m(teger.)67 b(Chec)m(k)42 b(the)f(input)f(and/or)g(switc)m(h) +h(to)501 4266 y(Zbigniew)32 b(Chamski's)g(in\014nite)g(precision)g(PIP) +-8 b(.)403 4470 y Fm(\017)48 b Fl(The)k(solution)i(is)e(too)g(complex)p +Fn(:)44 b(the)31 b(solution)e(quast)j(has)f(gro)m(wn)g(b)s(ey)m(ond)h +(the)501 4590 y(memory)k(allo)s(cated)f(to)h(it.)55 b(Chec)m(k)38 +b(the)f(input)g(and/or)f(c)m(hange)h(the)g(v)-5 b(alue)37 +b(of)f(con-)501 4710 y(stan)m(t)d Fl(SOL)p 907 4710 31 +4 v 38 w(SIZE)h Fn(in)d(\014le)i Fl(type.h)p Fn(,)h(then)f(rebuild)f +(PIP)-8 b(.)403 4914 y Fm(\017)48 b Fl(Memory)53 b(overflow)p +Fn(:)46 b(self)32 b(explanatory)-8 b(.)403 5117 y Fm(\017)48 +b Fl()53 b(unaccessible)p Fn(:)62 b(one)41 b(of)f(the)h(input,)h +(output)f(or)f(debug)h(\014le)f(cannot)g(b)s(e)501 5238 +y(op)s(ened.)p eop +%%Page: 6 6 +6 5 bop 257 266 a Fj(2)98 b(USING)32 b(THE)i(PIP)f(SOFTW)-11 +b(ARE)1879 b Fn(6)257 573 y Fg(Dimension)36 b(errors)403 +766 y Fm(\017)48 b Fl(Too)k(much)h(variables)403 966 +y Fm(\017)48 b Fl(Too)k(much)h(parameters)37 b Fn(:)48 +b(Chec)m(k)37 b(the)f(input)e(and/or)h(c)m(hange)h(the)f(v)-5 +b(alue)34 b(of)h(con-)501 1087 y(stan)m(ts)f Fl(MAXCOL)g +Fn(and)f Fl(MAXPARM)h Fn(in)e(\014le)g Fl(type.h)p Fn(,)i(then)f +(rebuild)f(PIP)-8 b(.)257 1345 y Fg(Implemen)m(tation)42 +b(errors)97 b Fn(All)37 b(suc)m(h)j(error)e(messages)h(b)s(egin)f(b)m +(y)h(the)g(w)m(ord)g Fl(Syserr)p Fn(.)257 1465 y(These)i(messages)f +(indicate)d(a)i(bug)g(in)f(the)h(implemen)m(tation.)59 +b(Y)-8 b(ou)39 b(should)f(rep)s(ort)h(suc)m(h)257 1585 +y(ev)m(en)m(ts)82 b(b)m(y)f(sending)f(a)f(cop)m(y)i(of)e(the)h(input)f +(\014le)g(b)m(y)i(e-mail)76 b(to)k(the)g(author,)257 +1706 y Fl(Paul.Feautrier@prism.uvs)q(q.f)q(r)32 b Fn(who)26 +b(will)d(endea)m(v)m(or)28 b(to)d(solv)m(e)i(the)f(problem)f(as)h(so)s +(on)257 1826 y(as)33 b(p)s(ossible.)257 2113 y Fh(2.3)136 +b(Output)44 b(Data)257 2298 y Fn(The)34 b(output)f(\014le)f(can)h(b)s +(e)f(describ)s(ed)i(b)m(y)f(the)g(follo)m(wing)d(grammar:)257 +2491 y Fg(Grammar)37 b(2)49 b Fi(:)257 2684 y Fl(File)k(::=)f(Result)h +(...)257 2805 y(Result)g(::)f(\()g(Comments)h(Solution)g(\))257 +2925 y(Solution)h(::=)e(Quast_group)462 3046 y(|)g(void)257 +3166 y(Quast_group)j(::=)d(Quast)462 3286 y(|)g(Newparm)h(...)f(Quast) +257 3407 y(Quast)h(::=)f(Form)462 3527 y(|)g(\(if)g(Vector)h +(Quast_group)h(Quast_group\))257 3647 y(Form)f(::=)f(\(list)g(Vector)h +(...\))462 3768 y(|)f(nil)257 3888 y(Newparm)h(::=)g(\(newparm)g +(Integer)g(Vector)g(Integer\))257 4009 y(Vector)g(::=)f(#[)g +(Coefficient)i(...)e(])257 4129 y(Coefficient)j(::=)d(Integer)h(|)e +(Integer)i(/)f(Integer)257 4322 y Fn(The)38 b Fl(Comments)g +Fn(are)f(copied)f(from)g(the)h(input)f(\014le.)55 b(The)37 +b Fl(Solution)i Fn(is)d(said)g(to)g(b)s(e)h Fl(void)257 +4443 y Fn(when)k(the)g(initial)36 b(con)m(text)41 b(is)e(v)m(oid.)65 +b(Otherwise,)42 b(it)d(is)g(giv)m(en)h(as)g(a)g(quast)h(written)e +Fj(\022)-49 b(a)40 b(la)257 4563 y Fn(Lisp.)i(The)30 +b(quast)g(ma)m(y)e(p)s(ossibly)h(b)s(e)g(preceded)h(b)m(y)g(the)f +(de\014nition)f(of)g(one)i(or)e(sev)m(eral)i(new)257 +4683 y(parameters.)404 4804 y(The)22 b(v)m(ector)h(co)s(e\016cien)m(ts) +g(ma)m(y)f(b)s(e)g(either)f(in)m(tegers)h(or)g(rationals)d(written)j +(as)g Fl(num/denom)p Fn(.)257 4924 y(The)34 b(latter)d(case)j(o)s +(ccurs)f(if)f Fl(Nq)h Fn(had)f(b)s(een)i(set)f(to)f(0)h(in)e(the)i +(input)f(\014le.)404 5045 y(In)24 b(the)h(solution,)f(a)g +Fl(Vector)i Fn(represen)m(ts)h(an)d(a\016ne)h(form;)h(eac)m(h)f(en)m +(try)g(is)f(the)h(co)s(e\016cien)m(t)257 5165 y(of)j(the)h(corresp)s +(onding)f(parameter)f(\(the)i(parameter)e(of)h(the)h(same)f(rank\).)42 +b(The)29 b(last)e(en)m(try)257 5285 y(is)32 b(the)h(additiv)m(e)f +(constan)m(t.)404 5406 y(The)39 b(de\014nition)f(of)g(a)h(new)g +(parameter)f(b)s(egins)h(with)f(the)h(k)m(ey-w)m(ord)i +Fl(newparm)p Fn(,)h(then)257 5526 y(a)e(rank)g(n)m(um)m(b)s(er,)i(a)e +(v)m(ector)h(of)e(co)s(e\016cien)m(ts,)k(and)d(a)f(denominator.)64 +b(The)41 b(new)g(parame-)257 5646 y(ter)e(is)f(equal)h(to)f(the)h(in)m +(teger)g(division)e(of)h(the)h(v)m(ector)g(b)m(y)h(the)f(denominator.) +60 b(The)40 b(new)p eop +%%Page: 7 7 +7 6 bop 257 266 a Fj(2)98 b(USING)32 b(THE)i(PIP)f(SOFTW)-11 +b(ARE)1879 b Fn(7)257 573 y(parameter)38 b(can)h(only)f(app)s(ear)g(in) +g(the)h Fl(Quast)h Fn(follo)m(wing)35 b(its)j(de\014nition.)61 +b(In)m(tro)s(ducing)38 b(a)257 693 y(new)d(parameter)e(adds)h(one)g(en) +m(try)g(in)f(the)h(list)e(of)h(parameters,)h(so)g(the)g(length)f(of)g +(v)m(ectors)257 814 y(in)40 b(the)g(solution)f(is)g(not)h(constan)m(t.) +67 b(Ho)m(w)m(ev)m(er,)44 b(this)c(length)f(is)h(alw)m(a)m(ys)g(equal)g +(to)g(1)g(plus)257 934 y(the)34 b(n)m(um)m(b)s(er)f(of)g(original)c +(parameters)k(plus)g(the)g(n)m(um)m(b)s(er)h(of)e(new)i(parameters)f +(curren)m(tly)257 1054 y(de\014ned.)404 1175 y(The)26 +b(solution)e(is)g(a)h(m)m(ulti-lev)m(el)d(conditional)h(expression)j +(\(a)f(tree)h(of)f(nested)h(condition-)257 1295 y(als.\))62 +b(A)39 b(predicate)g(expression)h Fk(p)f Fn(should)g(b)s(e)g(understo)s +(o)s(d)g(as)g(the)h(b)s(o)s(olean)d(expression)257 1416 +y Fk(p)46 b Fm(\025)f Fn(0.)75 b(Lea)m(v)m(es)45 b(of)d(the)h +(conditional)e(tree)i(are)g(either)g Fl(nil)p Fn(,)j(meaning)c(that)h +(the)g(input)257 1536 y(problem)28 b(has)h(no)f(solution,)g(or)g(a)g +Fl(Form)p Fn(.)44 b(A)28 b Fl(Form)i Fn(is)e(a)g(list)f(of)h(v)m +(ectors,)j(eac)m(h)f(v)m(ector)f(giving)257 1656 y(the)k(v)-5 +b(alue)32 b(of)g(the)h(corresp)s(onding)g(unkno)m(wn.)257 +1916 y Fg(2.3.1)113 b(Example)257 2101 y Fn(The)29 b(output)f(of)f(PIP) +h(is)g(not)f(in)m(tended)h(for)f(h)m(uman)h(consumption.)41 +b(No)28 b(attempt)f(has)h(b)s(een)257 2221 y(made)38 +b(to)g(implemen)m(t)f(a)h(prett)m(y-prin)m(ter.)61 b(In)39 +b(the)g(in)m(terest)g(of)f(readabilit)m(y)-8 b(,)38 b(some)g(of)g(the) +257 2342 y(result)31 b(\014les)g(in)e(this)i(pap)s(er)f(ha)m(v)m(e)i(b) +s(een)g(b)s(eauti\014ed)e(b)m(y)i(hand.)43 b(The)31 b(reader)g(should)g +(not)f(b)s(e)257 2462 y(surprised)k(if)d(he)i(gets)g(results)g(with)f +(di\013eren)m(t)h(la)m(y)m(outs)g(when)h(running)e(the)h(examples.)404 +2582 y(Here)g(is)f(the)h(output)g(solution)e(\014le)h(for)g(the)h +(example)f(ab)s(o)m(v)m(e)i(\(2.1.1\):)257 2786 y Fl(\()52 +b(\(Lower)h(bound)f(on)g(j)g(after)g(loop)h(inversion)565 +2906 y(\(unknowns)h(j)d(i\))565 3026 y(\(parameters)j(k)e(m)f(n\))h(1)g +(\)\(if)g(#[)g(-1)f(1)h(0)g(0])257 3147 y(\(list)h(#[)f(0)f(0)h(0)f(0]) +257 3267 y(#[)h(1)g(0)f(0)h(0])257 3388 y(\))257 3508 +y(\(list)h(#[)f(1)f(-1)h(0)g(0])257 3628 y(#[)g(0)g(1)f(0)h(0])257 +3749 y(\))257 3869 y(\))257 3990 y(\))257 4193 y Fn(T)-8 +b(o)46 b(express)i(this)e(solution,)h(no)f(new)g(parameter)g(had)g(to)f +(b)s(e)h(in)m(tro)s(duced.)83 b(The)47 b(form)257 4313 +y(asso)s(ciated)33 b(to)f(the)h(\014rst)g(conditional)d(is:)1091 +4533 y Fm(\000)p Fn(1)22 b Fm(\002)h Fk(k)i Fn(+)d(1)g +Fm(\002)g Fk(m)h Fn(+)f(0)g Fm(\002)g Fk(n)h Fn(+)f(0)g +Fm(\002)g Fn(1)28 b(=)f Fk(m)c Fm(\000)f Fk(k)257 4753 +y Fn(so)28 b(the)f(test)h(should)f(b)s(e)g(read)h(as)f +Fk(m)11 b Fm(\000)g Fk(k)31 b Fm(\025)e Fn(0.)41 b(If)27 +b(this)g(inequalit)m(y)f(holds,)i(then)f(the)h(solution)257 +4874 y(is)k Fk(<)c Fn(0)p Fk(;)17 b(k)30 b(>)p Fn(.)44 +b(Otherwise,)33 b(the)g(solution)e(is)h Fk(<)c(m)22 b +Fm(\000)h Fk(k)s(;)17 b(m)27 b(>)p Fn(.)404 4994 y(T)-8 +b(o)32 b(sum)h(things)f(up,)h(the)g(lexicographical)d(minim)m(um)f(of)j +Fm(D)2671 5009 y Fe(2)2743 4994 y Fn(is:)462 5198 y Fl(if)52 +b(m-k)g(>=)g(0)g(then)g(<0,)g(k>)g(else)g(.)257 +5401 y Fn(Hence)34 b(the)f(lo)m(w)m(er)g(b)s(ound)g(on)f(the)h(\014rst) +g(co)s(ordinate:)462 5604 y Fl(if)52 b(m-k)g(>=)g(0)g(then)g(0)f(else)i +(m-k)p eop +%%Page: 8 8 +8 7 bop 257 266 a Fj(2)98 b(USING)32 b(THE)i(PIP)f(SOFTW)-11 +b(ARE)1879 b Fn(8)257 573 y Fg(2.3.2)113 b(Simplifying)34 +b(the)k(solution)257 758 y Fn(The)32 b(solution)e(of)h(a)g(parametric)e +(problem)h(ma)m(y)h(b)s(e)g(in)g(the)g(form)f(of)h(a)g(quast)h(all)d +(of)h(whose)257 878 y(lea)m(v)m(es)g(are)f(nil.)41 b(This)29 +b(means)g(in)f(fact)h(that)f(the)i(original)25 b(p)s(olyhedron)k(is)f +(empt)m(y)i(whatev)m(er)257 998 y(the)j(v)-5 b(alues)32 +b(of)f(the)i(parameters.)43 b(An)32 b(example,)g(due)h(to)e(Dirk)g +(Fimmel,)e(is)j(the)g(follo)m(wing:)257 1207 y Fl(\(\(\(i)53 +b(j)e(1\)\(m)i(n\)\))309 1328 y(2)e(2)h(7)f(0)h(-1)g(1)309 +1448 y(\(#[2)g(6)f(-9)h(0)g(0])360 1568 y(#[5)g(-3)g(0)f(0)h(0])360 +1689 y(#[2)g(-10)g(15)g(0)f(0])360 1809 y(#[-2)h(6)g(-3)g(0)f(0])360 +1930 y(#[-2)h(-6)g(17)g(0)f(0])360 2050 y(#[0)h(1)f(0)h(-1)g(0])360 +2170 y(#[1)g(0)f(0)h(0)g(-1])309 2291 y(\))309 2411 y(\(\))257 +2532 y(\))257 2741 y Fn(Without)32 b(the)h Fl(-z)g Fn(option,)f(the)h +(solution)e(is:)257 2930 y Fl(\(\(\(i)53 b(j)e(1\)\(m)i(n\))e(-1)h(\)) +309 3050 y(\(if)g(#[)f(-4)h(0)g(5])360 3170 y(\(if)g(#[)g(0)f(-4)h(3]) +411 3291 y(\(\))411 3411 y(\(if)g(#[)g(0)g(-2)f(9])462 +3531 y(\(if)h(#[)g(0)g(-2)g(3])514 3652 y(\(newparm)h(2)f(\(div)g(#[)g +(0)f(2)h(3])g(6\)\))514 3772 y(\(newparm)h(3)f(\(div)g(#[)g(0)f(2)h(10) +g(7])f(12\)\))514 3893 y(\(newparm)i(4)f(\(div)g(#[)g(0)f(4)h(0)f(2)h +(1])g(6\)\))514 4013 y(\(\))514 4133 y(\(if)g(#[)g(0)f(-2)h(7])565 +4254 y(\(newparm)h(2)f(\(div)g(#[)g(0)g(4)f(3])h(6\)\))565 +4374 y(\(if)g(#[)g(0)f(-8)h(6)g(11])g(\(\))g(\(\)\))565 +4494 y(\(\)\)\))462 4615 y(\(\)\)\))360 4735 y(\(if)g(#[)g(-1)g(0)f(3]) +411 4856 y(\(if)h(#[)g(-1)g(0)f(2])462 4976 y(\(if)h(#[)g(10)g(-2)g +(-15])g(\(\)\(\)\))462 5096 y(\(\)\))360 5217 y(\(\)\)\))257 +5337 y(\))257 5526 y Fn(Insp)s(ection)27 b(rev)m(eals)h(that)e(all)f +(lea)m(v)m(es)j(are)e Fl(\(\))p Fn(.)42 b(With)26 b(the)h +Fl(-z)h Fn(option,)f(the)g(solution)e(is)h(m)m(uc)m(h)257 +5646 y(simpler:)p eop +%%Page: 9 9 +9 8 bop 257 266 a Fj(2)98 b(USING)32 b(THE)i(PIP)f(SOFTW)-11 +b(ARE)1879 b Fn(9)257 573 y Fl(\(\(\(i)53 b(j)e(1\)\(m)i(n\))e(-1)h +(\)\(\))257 693 y(\))257 981 y Fh(2.4)136 b(The)44 b(P)l(o)l(w)l(er)i +(of)g(PIP)257 1166 y Fn(In)g(the)g(follo)m(wing)d(sections,)49 +b(w)m(e)e(explain)e(ho)m(w)h(PIP)g(can)g(b)s(e)g(used)g(to)g(solv)m(e)f +(extended)257 1286 y(classes)34 b(of)e(problems:)403 +1485 y Fm(\017)48 b Fn(Problems)32 b(where)i(equalities)d(o)s(ccur.)403 +1686 y Fm(\017)48 b Fn(Problems)32 b(where)i(a)e(lexicographical)e +Fi(maximum)i Fn(has)h(to)f(b)s(e)h(found.)403 1888 y +Fm(\017)48 b Fn(Cases)34 b(when)g(linear)d(cost)i(functions)g(are)f(to) +g(b)s(e)h(optimized.)403 2090 y Fm(\017)48 b Fn(Problems)32 +b(where)i(unkno)m(wns)h(and/or)d(parameters)h(ma)m(y)f(b)s(e)h(negativ) +m(e)257 2349 y Fg(2.4.1)113 b(Handling)36 b(Equalities)257 +2533 y Fn(When)i(the)f(input)f(problem)g(con)m(tains)h +Fk(r)i Fn(a\016ne)e(equalities)f Fk(f)2584 2548 y Ff(i)2647 +2533 y Fn(=)e(0,1)h Fm(\024)g Fk(i)g Fm(\024)g Fk(r)s +Fn(,)j(one)f(ma)m(y)257 2654 y(just)k(write)g Fk(r)i +Fn(inequalities)c Fk(f)1372 2669 y Ff(i)1442 2654 y Fm(\025)i +Fn(0)g(and)g Fk(r)i Fn(inequalties)d Fk(f)2477 2669 y +Ff(i)2546 2654 y Fm(\024)i Fn(0,)h(th)m(us)e(satisfying)f(PIP's)257 +2774 y(input)c(syn)m(tax.)55 b(Ho)m(w)m(ev)m(er,)39 b(one)d(ma)m(y)g +(notice)g(that)f(only)h Fk(r)27 b Fn(+)d(1)36 b(inequalities)e(are)i +(needed:)257 2894 y Fk(f)305 2909 y Ff(i)361 2894 y Fm(\025)28 +b Fn(0,)33 b(1)27 b Fm(\024)h Fk(i)g Fm(\024)h Fk(r)s +Fn(,)j(and)h(the)g(follo)m(wing)c(inequalit)m(y:)1802 +3053 y Ff(r)1759 3078 y Fd(X)1762 3260 y Ff(i)p Fe(=1)1896 +3161 y Fk(f)1944 3176 y Ff(i)2000 3161 y Fm(\024)f Fn(0)p +Fk(:)257 3484 y Fg(2.4.2)113 b(The)38 b(bigparm)e(tric)m(k)257 +3669 y Fn(In)30 b(some)f(cases,)j(it)c(is)h(useful)g(to)g(supp)s(ose)i +(that)e(one)h(parameter)f(in)f(a)h(PIP)i(problem)d(gro)m(ws)257 +3789 y(\\v)m(ery)40 b(large".)60 b(Some)39 b(examples)f(will)e(b)s(e)j +(giv)m(en)g(in)f(the)h(follo)m(wing)d(sections.)62 b(Let)39 +b Fk(B)k Fn(b)s(e)257 3910 y(the)36 b(name)e(of)g(this)h(parameter.)49 +b(Supp)s(ose)36 b(that)e(in)g(the)i(solution,)d(one)i(of)g(the)g +(predicates)257 4030 y(is:)1720 4150 y Fk(aB)27 b Fn(+)22 +b Fk(b)28 b Fm(\025)g Fn(0)p Fk(;)257 4322 y Fn(where)35 +b Fk(b)f Fn(ma)m(y)g(dep)s(end)g(on)g(all)d(other)j(parameters.)47 +b(F)-8 b(or)33 b Fk(B)38 b Fn(large)33 b(enough,)h(if)f +Fk(a)c(>)h Fn(0)j(then)257 4443 y(the)k(predicate)f(is)g(true,)i(and)e +(if)f Fk(a)g(<)e Fn(0)j(then)h(the)g(predicate)f(is)g(false.)54 +b(One)37 b(can)f(\014nd)h(the)257 4563 y(limit)e(shap)s(e)j(of)g(the)g +(solution)f(b)m(y)i(remo)m(ving)e(suc)m(h)i(tests)h(and)e(replacing)e +(them)i(b)m(y)h(their)257 4683 y(true)32 b(of)f(false)g(branc)m(h,)h +(as)g(appropriate.)42 b(This)32 b(can)f(b)s(e)h(done)f +Fj(a)g(p)s(osteriori)k Fn(on)c(the)h(results)257 4804 +y(of)c(PIP)-8 b(,)28 b(or)g(PIP)g(can)g(do)g(it)e(\\on)i(the)g(\015y")g +(while)f(solving)f(the)j(problem.)40 b(This)28 b(last)f(metho)s(d)257 +4924 y(is)32 b(more)g(e\016cien)m(t,)i(since)f(it)e(tends)j(to)e +(simplify)e(the)j(solution.)404 5045 y(PIP)e(is)g(noti\014ed)f(of)g +(the)i(presence)g(of)f(a)f(big)g(parameter)g(b)m(y)i(setting)e(the)i +Fl(Bg)f Fn(argumen)m(t)257 5165 y(to)37 b(a)f(p)s(ositiv)m(e)g(v)-5 +b(alue.)56 b(This)37 b(v)-5 b(alue)36 b(is)h(the)g(rank)g(of)f(the)h +(big)f(parameter)g(in)h(the)g(problem)257 5285 y(tableau.)43 +b(Hence,)34 b(the)f(lo)m(w)m(est)g(admissible)e(v)-5 +b(alue)32 b(for)g Fl(Bg)h Fn(is)f Fl(Nn)52 b(+)f(1)p +Fn(.)404 5406 y(The)38 b(reader)f(should)g(con)m(vince)h(himself)d +(that)i(in)f(the)h(presence)j(of)c(t)m(w)m(o)i(big)e(parame-)257 +5526 y(ters,)e(no)e(suc)m(h)i(simpli\014cations)29 b(are)j(p)s(ossible) +g(unless)h(one)g(has)f(some)h(information)c(on)j(the)257 +5646 y(relativ)m(e)f(size)h(of)f(the)g(parameters.)43 +b(Suc)m(h)33 b(situations)d(should)i(b)s(e)f(handled)h(b)m(y)g(giving)e +(PIP)p eop +%%Page: 10 10 +10 9 bop 257 266 a Fj(2)98 b(USING)32 b(THE)i(PIP)f(SOFTW)-11 +b(ARE)1830 b Fn(10)257 573 y(ordinary)34 b(parameters,)g(and)g(doing)f +(the)i(simpli\014cation)30 b(on)k(the)h(solution)d(in)h(the)i(ligh)m(t) +d(of)257 693 y(extra)h(kno)m(wledge.)257 949 y Fg(2.4.3)113 +b(Computing)36 b(Lexicographical)h(Maxima)257 1134 y +Fn(T)-8 b(o)33 b(get)f(the)g(maxim)m(um)e(of)i(an)g(unkno)m(wn)i +Fk(x)p Fn(,)f(minimize)c Fk(B)d Fm(\000)c Fk(x)p Fn(,)33 +b(where)g(B)f(is)g(a)g(new)h("big")257 1254 y(parameter.)63 +b(Adding)39 b(a)g(parameter)f(just)i(adds)g(one)f(column)f(in)h(the)g +(problem)f(tableau.)257 1375 y(The)c(fact)e(that)g(this)f(column)h +(corresp)s(onds)h(to)f(a)g(Big)f(parameter)h(is)g(sp)s(eci\014ed)h(b)m +(y)g(setting)257 1495 y(the)e(5-th)f(switc)m(h)h(to)f(a)f(p)s(ositiv)m +(e)h(v)-5 b(alue,)30 b(this)g(v)-5 b(alue)30 b(b)s(eing)f(the)i(p)s +(osition)d(of)i(the)h(column)e(of)257 1616 y(B)k(in)f(the)h(problem)e +(tableau.)404 1736 y(These)f(cases)f(can)f(b)s(e)h(handled)f +(systematically)e(in)i(the)g(follo)m(wing)d(w)m(a)m(y)-8 +b(.)44 b(Supp)s(ose)29 b(that)257 1856 y(w)m(e)34 b(are)f(ask)m(ed)h +(for)e(the)h(in)m(teger)f(maxim)m(um)e(of)i(the)h(p)s(olyhedron:)1684 +2052 y Fk(x)84 b Fm(\025)f Fn(0)p Fk(;)1689 2197 y(y)j +Fm(\025)d Fn(0)p Fk(;)1499 b Fn(\(6\))1640 2342 y(3)p +Fk(y)86 b Fm(\024)d Fk(x)23 b Fn(+)f(12)p Fk(;)1689 2487 +y(y)86 b Fm(\025)d Fn(2)p Fk(x)23 b Fm(\000)f Fn(3)p +Fk(:)257 2683 y Fn(Let)33 b(us)g(in)m(tro)s(duce)g(the)g(new)g(unkno)m +(wns:)1445 2878 y Fk(x)1500 2837 y Fc(0)1551 2878 y Fn(=)28 +b Fk(B)f Fm(\000)c Fk(x;)72 b(y)2062 2837 y Fc(0)2112 +2878 y Fn(=)28 b Fk(B)f Fm(\000)c Fk(y)t(;)257 3073 y +Fn(where)34 b Fk(B)k Fn(is)32 b(the)h(big)f(parameter.)43 +b(System)33 b(\(6\))f(translates)g(to:)1880 3268 y Fm(\000)p +Fk(x)2012 3227 y Fc(0)2058 3268 y Fn(+)22 b Fk(B)88 b +Fm(\025)c Fn(0)p Fk(;)1884 3414 y Fm(\000)p Fk(y)2013 +3372 y Fc(0)2058 3414 y Fn(+)22 b Fk(B)88 b Fm(\025)c +Fn(0)p Fk(;)1368 3559 y Fm(\000)p Fk(x)1500 3518 y Fc(0)1547 +3559 y Fn(+)22 b(3)p Fk(y)1746 3518 y Fc(0)1790 3559 +y Fn(+)g(12)g Fm(\000)h Fn(2)p Fk(B)87 b Fm(\025)d Fn(0)p +Fk(;)1542 3704 y Fn(2)p Fk(x)1646 3663 y Fc(0)1692 3704 +y Fm(\000)22 b Fk(y)1843 3663 y Fc(0)1888 3704 y Fn(+)g(3)g +Fm(\000)g Fk(B)88 b Fm(\025)c Fn(0)p Fk(:)257 3899 y +Fn(Finding)26 b(the)i(maxim)m(um)d(of)i(\()p Fk(x;)17 +b(y)t Fn(\))1560 3863 y Ff(T)1642 3899 y Fn(is)27 b(equiv)-5 +b(alen)m(t)27 b(to)g(\014nding)g(the)h(minim)m(um)d(of)i(\()p +Fk(x)3421 3863 y Fc(0)3444 3899 y Fk(;)17 b(y)3540 3863 +y Fc(0)3562 3899 y Fn(\))3600 3863 y Ff(T)3655 3899 y +Fn(,)257 4020 y(pro)m(vided)33 b Fk(B)38 b Fn(is)32 b(large)g(enough.) +44 b(The)33 b(solution)e(of)h(the)h(ab)s(o)m(v)m(e)h(problem)d(is:)257 +4202 y Fl(\(\(a)52 b(maximization)j(problem)e(1)f(\))309 +4322 y(\(if)g(#[)f(-1)h(6])360 4443 y(\(if)g(#[)g(-1)g(3])411 +4563 y(\(list)h(#[)f(0)f(0])719 4683 y(#[)h(0)f(0]\))411 +4804 y(\(if)h(#[)g(-5)g(27])462 4924 y(\(newparm)i(1)d(\(div)i(#[)e(1)h +(1])g(2\)\))462 5045 y(\(list)h(#[)f(1)f(-1)h(-1])770 +5165 y(#[)g(0)f(0)h(0]\))462 5285 y(\(list)h(#[)f(1)f(-4])770 +5406 y(#[)h(1)f(-5]\)\)\))360 5526 y(\(list)h(#[)g(1)g(-4])667 +5646 y(#[)g(1)g(-5]\)\)\))p eop +%%Page: 11 11 +11 10 bop 257 266 a Fj(2)98 b(USING)32 b(THE)i(PIP)f(SOFTW)-11 +b(ARE)1830 b Fn(11)404 573 y(Supp)s(ose)33 b(w)m(e)h(tell)d(PIP)i(that) +g Fk(B)k Fn(is)32 b(a)h(large)e(parameter.)43 b(The)34 +b(input)e(\014le)g(is)g(no)m(w:)257 764 y Fl(\(\(a)52 +b(maximization)j(problem\))309 884 y(2)c(1)h(4)f(0)h(3)f(1)309 +1005 y(\(#[-1)h(0)g(0)f(1])360 1125 y(#[0)h(-1)g(0)f(1])360 +1245 y(#[-1)h(3)g(12)g(-2])360 1366 y(#[2)g(-1)g(3)f(-1])309 +1486 y(\))309 1607 y(\(\))257 1727 y(\))257 1918 y Fn(and)33 +b(the)g(solution)e(is)h(m)m(uc)m(h)h(simpler:)257 2109 +y Fl(\(\(a)52 b(maximization)j(problem)e(1)f(\))309 2229 +y(\(list)g(#[)g(1)g(-4])616 2350 y(#[)g(1)g(-5]\)\))257 +2541 y Fn(The)39 b(reader)f(ma)m(y)g(care)g(to)f(c)m(hec)m(k)j(that)d +(this)h(result)f(is)g(equiv)-5 b(alen)m(t)38 b(to)f(the)h(previous)g +(one)257 2661 y(as)k(so)s(on)f(as)g Fk(B)47 b(>)42 b +Fn(5.)69 b(The)42 b(p)s(osition)d(of)i(the)h(minim)m(um)37 +b(is:)61 b Fk(x)2671 2625 y Fc(0)2736 2661 y Fn(=)43 +b Fk(B)33 b Fm(\000)28 b Fn(4)p Fk(;)17 b(y)3212 2625 +y Fc(0)3276 2661 y Fn(=)42 b Fk(B)33 b Fm(\000)c Fn(5,)257 +2781 y(from)35 b(whic)m(h)g(w)m(e)i(deduce:)51 b Fk(x)33 +b Fn(=)f(4)p Fk(;)17 b(y)35 b Fn(=)d(5.)52 b(As)36 b(exp)s(ected,)i +Fk(B)j Fn(has)35 b(disapp)s(eared)h(from)e(the)257 2902 +y(solution.)56 b(If)37 b(this)g(do)s(es)h(not)f(happ)s(en,)i(w)m(e)f +(observ)m(e)h(\014rst)e(that)g Fk(B)43 b Fn(m)m(ust)37 +b(ha)m(v)m(e)h(a)f(p)s(ositiv)m(e)257 3022 y(co)s(e\016cien)m(t)c(in)f +(the)h(result)f(\(if)f(not,)i(one)f(of)g(the)h(inequalities)e +Fk(x;)17 b(y)31 b Fm(\025)d Fn(0)k(w)m(ould)g(b)s(e)h(violated)257 +3142 y(for)39 b Fk(B)44 b Fn(large)37 b(enough\).)63 +b(This)39 b(means)g(that)f(the)h(original)d(p)s(olyhedron)j(is)f(not)h +(b)s(ounded,)257 3263 y(since,)k(whatev)m(er)f Fk(B)5 +b Fn(,)43 b(it)c(con)m(tains)h(a)g(p)s(oin)m(t)g(whose)h(co)s +(ordinates)f(are)g Fk(O)s Fn(\()p Fk(B)5 b Fn(\),)42 +b(and)e(hence)257 3383 y(has)33 b(no)g(maxim)m(um.)257 +3641 y Fg(2.4.4)113 b(Optimizing)34 b(Linear)k(Cost)f(F)-9 +b(unctions)257 3826 y Fn(The)36 b(problem)d(here)j(is)e(to)g(compute)g +(the)h(minim)m(um)d(of)i(a)g(linear)f(function)h Fk(cx)h +Fn(in)f(a)g(p)s(oly-)257 3946 y(hedron)k Fk(P)14 b Fn(,)38 +b(where)h Fk(c)e Fn(is)g(a)g(v)m(ector)h(with)f(in)m(teger)g(co)s +(e\016cien)m(ts.)59 b(Let)37 b(us)h(in)m(tro)s(duce)g(a)f(new)257 +4066 y(unkno)m(wn)e Fk(y)t Fn(.)45 b(Solv)m(e)33 b(the)h(linear)e +(programming)e(problem)i(obtained)h(b)m(y)h(adding)e(the)i(con-)257 +4187 y(strain)m(t)e Fk(y)f Fm(\025)d Fk(cx)33 b Fn(to)f(the)g +(de\014ning)g(constrain)m(ts)h(of)f Fk(P)14 b Fn(.)42 +b Fk(y)36 b Fn(should)c(b)s(e)g(the)h(\014rst)f(unkno)m(wn)i(in)257 +4307 y(the)28 b(lexicographic)d(ordering.)41 b(Let)27 +b Fk(y)1640 4322 y Ff(s)1676 4307 y Fk(;)17 b(x)1775 +4322 y Ff(s)1839 4307 y Fn(b)s(e)27 b(the)h(solution.)40 +b(Supp)s(ose)28 b(that)e(the)i(minim)m(um)257 4428 y(of)j +Fk(cx)g Fn(in)g Fk(P)44 b Fn(is)30 b(obtained)h(at)g +Fk(x)1384 4443 y Ff(m)1482 4428 y Fn(and)g(set)g Fk(y)1868 +4443 y Ff(m)1962 4428 y Fn(=)d Fk(cx)2163 4443 y Ff(m)2230 +4428 y Fn(.)43 b(Since)31 b Fk(x)2608 4443 y Ff(s)2676 +4428 y Fn(is)g(in)f Fk(P)14 b Fn(,)31 b(and)g Fk(y)3256 +4443 y Ff(s)3320 4428 y Fm(\025)d Fk(cx)3522 4443 y Ff(s)3559 +4428 y Fn(,)k(it)257 4548 y(is)26 b(clear)f(that)g Fk(y)827 +4563 y Ff(s)891 4548 y Fm(\025)j Fk(y)1044 4563 y Ff(m)1110 +4548 y Fn(.)42 b(Con)m(v)m(ersely)-8 b(,)29 b(\()p Fk(y)1772 +4563 y Ff(m)1838 4548 y Fk(;)17 b(x)1937 4563 y Ff(m)2003 +4548 y Fn(\))26 b(satis\014es)g(the)g(constrain)m(ts)g(of)g(the)g +(problem)257 4668 y(of)33 b(whic)m(h)h(\()p Fk(y)735 +4683 y Ff(s)771 4668 y Fk(;)17 b(x)870 4683 y Ff(m)937 +4668 y Fn(\))33 b(is)f(the)i(lexicographic)d(minim)m(um.)42 +b(Hence)34 b(\()p Fk(y)2715 4683 y Ff(s)2752 4668 y Fk(;)17 +b(x)2851 4683 y Ff(s)2888 4668 y Fn(\))28 b Fm(\034)g +Fn(\()p Fk(y)3168 4683 y Ff(m)3234 4668 y Fk(;)17 b(x)3333 +4683 y Ff(m)3400 4668 y Fn(\),)33 b(and,)257 4789 y(since)38 +b Fk(y)j Fn(is)c(the)h(\014rst)g(unkno)m(wn,)i Fk(y)1570 +4804 y Ff(s)1643 4789 y Fm(\024)c Fk(y)1804 4804 y Ff(m)1871 +4789 y Fn(.)58 b(Hence,)40 b Fk(y)2327 4804 y Ff(m)2429 +4789 y Fn(=)c Fk(y)2589 4804 y Ff(s)2625 4789 y Fn(.)59 +b(There)38 b(is)f(no)h(guaran)m(tee,)257 4909 y(ho)m(w)m(ev)m(er,)d +(that)e Fk(x)925 4924 y Ff(s)990 4909 y Fn(=)27 b Fk(x)1148 +4924 y Ff(m)1215 4909 y Fn(.)257 5167 y Fg(2.4.5)113 +b(Negativ)m(e)36 b(Unkno)m(wns)j(and)f(P)m(arameters)257 +5351 y Fn(Supp)s(ose)32 b(w)m(e)f(w)m(an)m(t)g(to)f(\014nd)h(the)f +(minim)m(um)d(of)j Fk(f)11 b Fn(\()p Fk(i;)17 b(j)6 b +Fn(\))27 b(=)h Fk(i)17 b Fm(\000)h Fn(2)p Fk(j)36 b Fn(o)m(v)m(er)31 +b(the)g(square)g(domain)257 5472 y(represen)m(ted)k(in)d(Figure)g(1) +1246 5436 y Fe(1)1285 5472 y Fn(.)p 257 5555 1371 4 v +370 5616 a Fb(1)407 5646 y Fa(This)27 b(example)h(w)n(as)e(prop)r(osed) +h(and)g(solv)n(ed)g(b)n(y)g(Pierre)f(Boulet.)p eop +%%Page: 12 12 +12 11 bop 257 266 a Fj(2)98 b(USING)32 b(THE)i(PIP)f(SOFTW)-11 +b(ARE)1830 b Fn(12)p 257 477 3426 4 v 952 2012 a @beginspecial +0 @llx 0 @lly 362 @urx 273 @ury 1842 @rhi @setspecial +%%BeginDocument: images/negatifs.eps +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /tmp/xfig-fig001441 +%%Creator: fig2dev Version 2.1.8 Patchlevel 0 +%%CreationDate: Thu May 9 15:32:56 1996 +%%For: jfcollar@monet (Jean-Francois COLLARD) +%%Orientation: Portrait +%%BoundingBox: 0 0 362 273 +%%Pages: 0 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/l {lineto} bind def +/m {moveto} bind def +/s {stroke} bind def +/n {newpath} bind def +/gs {gsave} bind def +/gr {grestore} bind def +/clp {closepath} bind def +/graycol {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul +4 -2 roll mul setrgbcolor} bind def +/col-1 {} def +/col0 {0 0 0 setrgbcolor} bind def +/col1 {0 0 1 setrgbcolor} bind def +/col2 {0 1 0 setrgbcolor} bind def +/col3 {0 1 1 setrgbcolor} bind def +/col4 {1 0 0 setrgbcolor} bind def +/col5 {1 0 1 setrgbcolor} bind def +/col6 {1 1 0 setrgbcolor} bind def +/col7 {1 1 1 setrgbcolor} bind def +/col8 {.68 .85 .9 setrgbcolor} bind def +/col9 {0 .39 0 setrgbcolor} bind def +/col10 {.65 .17 .17 setrgbcolor} bind def +/col11 {1 .51 0 setrgbcolor} bind def +/col12 {.63 .13 .94 setrgbcolor} bind def +/col13 {1 .75 .8 setrgbcolor} bind def +/col14 {.7 .13 .13 setrgbcolor} bind def +/col15 {1 .84 0 setrgbcolor} 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 translate xrad yrad scale 0 0 1 startangle endangle arc + savematrix setmatrix + } def + + end +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def +%%EndProlog + +$F2psBegin +0 setlinecap 0 setlinejoin +-94.0 513.0 translate 0.900 -0.900 scale +0.500 setlinewidth +% Ellipse +n 374 389 2 2 0 360 DrawEllipse gs 0.00 setgray fill gr +gs col0 s gr +% Ellipse +n 314 329 2 2 0 360 DrawEllipse gs 0.00 setgray fill gr +gs col0 s gr +% Ellipse +n 314 509 2 2 0 360 DrawEllipse gs 0.00 setgray fill gr +gs col0 s gr +% Ellipse +n 314 449 2 2 0 360 DrawEllipse gs 0.00 setgray fill gr +gs col0 s gr +% Ellipse +n 134 389 2 2 0 360 DrawEllipse gs 0.00 setgray fill gr +gs col0 s gr +% Ellipse +n 194 389 2 2 0 360 DrawEllipse gs 0.00 setgray fill gr +gs col0 s gr +% Ellipse +n 254 389 2 2 0 360 DrawEllipse gs 0.00 setgray fill gr +gs col0 s gr +% Polyline +n 104 389 m 506 389 l gs col-1 s gr +n 498.000 387.000 m 506.000 389.000 l 498.000 391.000 l gs 2 setlinejoin col-1 s gr +% Polyline +n 314 569 m 314 281 l gs col-1 s gr +n 312.000 289.000 m 314.000 281.000 l 316.000 289.000 l gs 2 setlinejoin col-1 s gr +% Polyline +n 254 329 m 134 449 l 254 569 l 374 449 l 254 329 l gs col-1 s gr +% Polyline +n 314 554 m 314 266 l gs col-1 s gr +n 312.000 274.000 m 314.000 266.000 l 316.000 274.000 l gs 2 setlinejoin col-1 s gr +/Times-Italic findfont 18.00 scalefont setfont +479 374 m +gs 1 -1 scale (i) col-1 show gr +/Times-Italic findfont 18.00 scalefont setfont +299 299 m +gs 1 -1 scale (j) col-1 show gr +/Times-Italic findfont 18.00 scalefont setfont +231 407 m +gs 1 -1 scale (-n-5) col-1 show gr +/Times-Italic findfont 18.00 scalefont setfont +358 405 m +gs 1 -1 scale (n+5) col-1 show gr +/Times-Italic findfont 18.00 scalefont setfont +320 454 m +gs 1 -1 scale (-n-5) col-1 show gr +/Times-Italic findfont 18.00 scalefont setfont +322 333 m +gs 1 -1 scale (n+5) col-1 show gr +$F2psEnd + +%%EndDocument + @endspecial 1404 2215 a(Figure)31 b(1:)43 b(Problem)32 +b(domain)404 2499 y(As)i(ab)s(o)m(v)m(e,)g(w)m(e)h(in)m(tro)s(duce)e(a) +h(new)g(unkno)m(wn)h Fk(f)45 b Fn(and)33 b(the)h(inequalit)m(y)f +Fk(f)g Fm(\000)23 b Fk(i)g Fn(+)g(2)p Fk(j)35 b Fm(\025)30 +b Fn(0.)257 2620 y(Since)j(w)m(e)h(w)m(an)m(t)f(to)f(optimize)f +Fk(f)11 b Fn(,)32 b Fk(f)44 b Fn(will)30 b(app)s(ear)i(as)h(the)g +(\014rst)g(unkno)m(wn.)404 2740 y(The)24 b(tric)m(k)f(for)f(solving)g +(the)i(problem)d(in)i Fk(Z)29 b Fn(is)23 b(to)g(in)m(tro)s(duce)g(the)g +(follo)m(wing)d(parameters:)403 2941 y Fm(\017)48 b Fk(G)28 +b Fm(\025)g Fk(max)p Fn(\(0)p Fk(;)17 b Fm(\000)p Fk(i;)g +Fm(\000)p Fk(j;)g Fm(\000)p Fk(f)11 b Fn(\).)403 3144 +y Fm(\017)48 b Fk(P)41 b Fn(=)28 b Fk(max)p Fn(\(0)p +Fk(;)17 b Fm(\000)p Fk(n)p Fn(\).)257 3346 y(This)33 +b(c)m(hoice)g(insure)g(that)f(the)h(new)h(v)-5 b(ariables)31 +b(and)i(parameters:)1680 3563 y Fk(f)1739 3522 y Fc(0)1845 +3563 y Fn(=)83 b Fk(G)22 b Fn(+)g Fk(f)1706 3709 y(i)1739 +3667 y Fc(0)1845 3709 y Fn(=)83 b Fk(G)22 b Fn(+)g Fk(i)1693 +3854 y(j)1739 3813 y Fc(0)1845 3854 y Fn(=)83 b Fk(G)22 +b Fn(+)g Fk(j)1681 3999 y(n)1739 3958 y Fc(0)1845 3999 +y Fn(=)83 b Fk(P)36 b Fn(+)22 b Fk(n)257 4217 y Fn(are)41 +b(all)d(p)s(ositiv)m(e.)66 b(This)41 b(prop)s(ert)m(y)g(sta)m(ys)g +(true)g(if)e Fk(G)h Fn(gro)m(ws.)68 b(Hence,)44 b Fk(G)c +Fn(is)g(again)e(a)i(big)257 4337 y(parameter.)78 b(Ho)m(w)m(ev)m(er,)50 +b Fk(P)57 b Fn(m)m(ust)45 b(b)s(e)f(considered)h(as)g(an)f(ordinary)f +(parameter.)78 b(After)257 4458 y(replacemen)m(t)39 b(of)e +Fk(i;)17 b(j;)g(n;)g(f)49 b Fn(b)m(y)40 b(the)e(new)h(v)-5 +b(ariables)37 b Fk(i)2248 4422 y Fc(0)2272 4458 y Fk(;)17 +b(j)2362 4422 y Fc(0)2385 4458 y Fk(;)g(n)2487 4422 y +Fc(0)2510 4458 y Fk(;)g(f)2613 4422 y Fc(0)2636 4458 +y Fn(,)39 b(w)m(e)h(get)e(a)g(system)h(whic)m(h)257 4578 +y(corresp)s(onds)34 b(to)e(the)h(follo)m(wing)d(input:)257 +4804 y Fl(\()309 4924 y(\()51 b(Solving)i(MIN\(i-2.j\))h(under)f(the)f +(following)i(constraints:)411 5045 y(Unknowns)g(may)e(be)f(negative.) +411 5165 y(Order:)411 5285 y(f')h(i')g(j')g(constant)h(G)e(P)h(n')360 +5406 y(\))309 5526 y(3)f(3)h(5)f(0)h(4)f(1)309 5646 y(\()p +eop +%%Page: 13 13 +13 12 bop 257 266 a Fj(2)98 b(USING)32 b(THE)i(PIP)f(SOFTW)-11 +b(ARE)1830 b Fn(13)360 573 y Fl(#[)52 b(0)f(1)h(1)f(20)h(-2)g(-4)g(4)f +(])360 693 y(#[)h(1)f(-1)h(2)g(0)f(-2)h(0)f(0)h(])360 +814 y(#[)g(0)f(-1)h(-1)g(0)f(2)h(0)f(0)h(])360 934 y(#[)g(0)f(1)h(-1)g +(10)f(0)h(-2)g(2)f(])360 1054 y(#[)h(0)f(-1)h(1)g(10)f(0)h(-2)g(2)f(]) +411 1175 y(\))309 1295 y(\()g(\)\))404 1496 y Fn(The)33 +b(result)g(is:)257 1679 y Fl(\()309 1800 y(\()51 b(Solving)i +(MIN\(i-2.j\))h(under)f(the)f(following)i(constraints:)411 +1920 y(Unknowns)g(may)e(be)f(negative.)411 2040 y(Order:)411 +2161 y(f')h(i')g(j')g(constant)h(G)e(P)h(n')411 2281 +y(-1)g(\)\(if)g(#[)g(0)g(-1)f(1)h(5])257 2402 y(\(list)h(#[)f(1)f(3)h +(-3)g(-15])257 2522 y(#[)g(1)g(1)f(-1)h(-5])257 2642 +y(#[)g(1)g(-1)f(1)h(5])257 2763 y(\))257 2883 y(\(\))257 +3004 y(\))257 3124 y(\))257 3307 y Fn(whic)m(h)33 b(should)g(b)s(e)g +(read)f(as:)422 3503 y(\()p Fk(f)519 3462 y Fc(0)542 +3503 y Fk(;)17 b(i)619 3462 y Fc(0)642 3503 y Fk(;)g(j)732 +3462 y Fc(0)755 3503 y Fn(\))83 b(=)g Fl(if)50 b Fm(\000)23 +b Fk(P)36 b Fn(+)22 b Fk(n)1542 3462 y Fc(0)1587 3503 +y Fm(\000)h Fn(5)k Fm(\025)i Fn(0)1035 3648 y Fl(then)g +Fn(\()p Fk(G)22 b Fn(+)g(3)p Fk(P)35 b Fm(\000)23 b Fn(3)p +Fk(n)1857 3607 y Fc(0)1902 3648 y Fm(\000)g Fn(15)p Fk(;)17 +b(G)k Fn(+)h Fk(P)36 b Fm(\000)22 b Fk(n)2596 3607 y +Fc(0)2642 3648 y Fm(\000)h Fn(5)p Fk(;)17 b(G)k Fm(\000)i +Fk(P)35 b Fn(+)22 b Fk(n)3287 3607 y Fc(0)3333 3648 y +Fn(+)g(5\))1035 3794 y Fl(else)29 b Fm(?)257 3990 y Fn(That)k(is,)f(in) +g(the)h(original)d(co)s(ordinate)h(system:)722 4186 y(\()p +Fk(f)5 b(;)17 b(i;)g(j)6 b Fn(\))28 b(=)f Fl(if)h Fk(n)g +Fm(\025)g Fn(5)g Fl(then)h Fn(\()p Fm(\000)p Fn(3)p Fk(n)22 +b Fm(\000)h Fn(15)p Fk(;)17 b Fm(\000)p Fk(n)22 b Fm(\000)g +Fn(5)p Fk(;)17 b(n)22 b Fn(+)g(5\))28 b Fl(else)g Fm(?)257 +4382 y Fn(I.e.,)35 b(the)g(minim)m(um)30 b(v)-5 b(alue)34 +b(for)f(function)g Fk(f)45 b Fn(is)33 b Fm(\000)p Fn(3)p +Fk(n)24 b Fm(\000)f Fn(15,)34 b(and)g(this)g(v)-5 b(alue)33 +b(is)h(reac)m(hed)h(at)257 4503 y(p)s(oin)m(t)c(\()p +Fm(\000)p Fk(n)19 b Fm(\000)h Fn(5)p Fk(;)d(n)i Fn(+)g(5\).)42 +b(This)31 b(minim)m(um)d(exists)k(only)f(if)e Fk(n)f +Fm(\025)h Fn(5;)i(otherwise,)h(the)f(feasible)257 4623 +y(set)j(is)e(empt)m(y)-8 b(.)257 4879 y Fg(2.4.6)113 +b(Mixed)37 b(Programming)257 5064 y Fn(A)43 b(mixed)e(program)g(is)h(a) +g(program)f(in)g(whic)m(h)i(some)f(v)-5 b(ariables)41 +b(are)h(constrained)g(to)g(b)s(e)257 5185 y(in)m(tegers)28 +b(while)f(others)h(ma)m(y)g(tak)m(e)g(rational)d(v)-5 +b(alues.)42 b(Supp)s(ose)28 b(for)f(instance)h(that)g(w)m(e)g(ha)m(v)m +(e)257 5305 y(to)33 b(solv)m(e:)1441 5501 y Fk(S)89 b +Fn(=)83 b(min)15 b Fk(ax)23 b Fn(+)f Fk(by)t(;)1749 5646 +y(Ax)h Fn(+)f Fk(B)5 b(y)25 b Fn(+)d Fk(c)28 b Fm(\025)g +Fn(0)p Fk(;)p eop +%%Page: 14 14 +14 13 bop 257 266 a Fj(3)98 b(USING)32 b(THE)i(PIP)f(LIBRAR)-8 +b(Y)1947 b Fn(14)257 573 y(where)34 b Fk(y)i Fn(is)c(the)h(v)m(ector)h +(of)e(the)h(in)m(teger)f(v)-5 b(ariables.)42 b(First,)32 +b(solv)m(e)1439 902 y Fk(T)96 b Fn(=)83 b(min)16 b Fk(ax;)1751 +1047 y(Ax)23 b Fn(+)f Fk(B)5 b(y)25 b Fn(+)e Fk(c)k Fm(\025)h +Fn(0)p Fk(;)257 1255 y Fn(in)22 b(rational,)h(with)f +Fk(y)k Fn(as)e(parameters.)40 b(The)24 b(result)e(is)h(a)f(quast.)42 +b(T)-8 b(o)22 b(eac)m(h)i(leaf)e Fk(i)h Fn(is)g(asso)s(ciated)257 +1376 y(a)40 b(linear)e(function)i Fk(f)1062 1391 y Ff(i)1090 +1376 y Fn(\()p Fk(y)t Fn(\))f(and)h(a)g(set)h(of)e(inequalities)f +Fk(C)2411 1391 y Ff(i)2439 1376 y Fk(y)30 b Fn(+)d Fk(d)2671 +1391 y Ff(i)2740 1376 y Fm(\025)40 b Fn(0.)66 b Fk(T)53 +b Fn(is)40 b(equal)g(to)f Fk(f)3654 1391 y Ff(i)257 1496 +y Fn(when)33 b Fk(y)h Fn(is)c(suc)m(h)j(that)d(the)i(corresp)s(onding)f +(inequalities)e(are)i(satis\014ed.)43 b(F)-8 b(or)31 +b(eac)m(h)g Fk(i)p Fn(,)h(solv)m(e)257 1616 y(the)h(problem:)1485 +1825 y Fk(S)1545 1840 y Ff(i)1657 1825 y Fn(=)83 b(min)15 +b Fk(f)2043 1840 y Ff(i)2071 1825 y Fn(\()p Fk(y)t Fn(\))21 +b(+)h Fk(by)t(;)1816 1970 y(C)1886 1985 y Ff(i)1914 1970 +y Fk(y)j Fn(+)d Fk(d)2136 1985 y Ff(i)2191 1970 y Fm(\025)29 +b Fn(0)p Fk(;)257 2178 y Fn(in)41 b(in)m(tegers.)69 b(The)43 +b(\014nal)d(result)h(is)g(the)g(minim)m(um)d(of)j(all)e +Fk(S)2571 2193 y Ff(i)2599 2178 y Fn(.)69 b(Ob)m(viously)-8 +b(,)44 b(the)d(metho)s(d)257 2299 y(can)34 b(accomo)s(date)e +(parameters)g(in)h(the)g(constrain)m(ts.)45 b(The)33 +b Fk(S)2554 2314 y Ff(i)2615 2299 y Fn(will)e(b)s(e)i(functions)g(of)f +(these)257 2419 y(parameters,)h(and)g(the)g(minim)m(um)c(m)m(ust)k(b)s +(e)f(computed)h(sym)m(b)s(olically)-8 b(.)257 2750 y +Fo(3)161 b(Using)54 b(the)f(PIP)h(Library)257 2969 y +Fn(The)42 b(PIP)f(Library)e(\(PipLib)g(for)h(short\))h(w)m(as)g +(implemen)m(ted)e(to)h(allo)m(w)e(the)j(user)g(to)f(call)257 +3090 y(PIP)f(directly)d(from)h(his)g(programs,)g(without)g(\014le)g +(accesses)j(or)d(system)i(calls.)56 b(The)39 b(user)257 +3210 y(only)i(needs)h(to)f(link)e(his)i(programs)f(with)h(C)g +(libraries.)66 b(The)42 b(PipLib)e(mainly)f(pro)m(vides)257 +3330 y(one)29 b(function)f(whic)m(h)g(tak)m(es)i(as)e(input)g(the)h +(problem)e(description)g(and)i(some)f(options,)g(and)257 +3451 y(returns)43 b(a)f Fl(Quast)h Fn(\(see)g(grammar)d(2)h(in)h +(section)g(2.3\))f(corresp)s(onding)h(to)g(the)g(solution.)257 +3571 y(Some)c(other)g(functions)f(are)h(pro)m(vided)h(for)e(con)m(v)m +(enience)j(reasons)f(;)h(they)f(are)f(describ)s(ed)257 +3691 y(in)k(section)h(3.2.)73 b(Most)43 b(of)f(them)g(require)h(some)g +(sp)s(eci\014c)g(structures)h(to)f(represen)m(t)h(the)257 +3812 y(problem)32 b(or)g(the)h(solution)e(;)i(these)g(structures)i(are) +d(describ)s(ed)i(in)e(section)g(3.1.)257 4099 y Fh(3.1)136 +b(PipLib)44 b(data)i(structures)f(description)257 4284 +y Fg(3.1.1)113 b(PipMatrix)36 b(structure)257 4468 y +Fl(struct)53 b(pipmatrix)257 4589 y({)f(unsigned)h(NbRows,)g(NbColumns) +h(;)360 4709 y(Entier)f(**)f(p)f(;)360 4830 y(Entier)i(*)e(p_Init)i(;) +257 4950 y(})f(;)257 5070 y(typedef)h(struct)g(pipmatrix)h(PipMatrix)g +(;)257 5285 y Fn(The)49 b Fl(PipMatrix)h Fn(structure)f(is)f(dev)m +(oted)h(to)e(represen)m(t)j(a)e(constrain)m(ts)g(matrix)e(in)h(the)257 +5406 y(P)m(olyLib)41 b(shap)s(e)h([3)o(].)70 b(The)42 +b(whole)f(matrix)e(is)i(arranged)g(ro)m(w)h(after)e(ro)m(w)i(at)f(the)g +Fl(p)p 3446 5406 31 4 v 38 w(Init)257 5526 y Fn(adress.)k +Fl(p)33 b Fn(is)f(an)h(arra)m(y)g(of)f(p)s(oin)m(ters)g(in)g(whic)m(h)h +Fl(p[i])h Fn(p)s(oin)m(ts)e(to)h(the)g(b)s(eginning)e(of)h(the)h(i)3613 +5490 y Ff(th)257 5646 y Fn(ro)m(w.)44 b Fl(NbRows)31 +b Fn(and)g Fl(NbColumns)i Fn(are)d(resp)s(ectiv)m(ely)h(the)g(n)m(um)m +(b)s(er)g(of)f(ro)m(ws)h(and)f(columns)g(of)p eop +%%Page: 15 15 +15 14 bop 257 266 a Fj(3)98 b(USING)32 b(THE)i(PIP)f(LIBRAR)-8 +b(Y)1947 b Fn(15)257 573 y(the)38 b(matrix.)56 b(W)-8 +b(e)37 b(use)h(this)f(structure)i(to)d(carry)i(p)s(olyhedrons.)58 +b(Eac)m(h)38 b(ro)m(w)f(corresp)s(onds)257 693 y(to)c(a)f(constrain)m +(t)h(whic)m(h)g(the)g(p)s(olyhedron)g(m)m(ust)g(satisfy)-8 +b(.)44 b(The)33 b(constrain)m(t)g(is)f(an)h(equalit)m(y)257 +814 y(if)e(the)i(\014rst)g(elemen)m(t)f(is)f(0,)h(an)g(inequalit)m(y)g +Fk(p)p Fn(\()p Fk(x)p Fn(\))27 b Fm(\025)i Fn(0)i(if)h(the)g(\014rst)h +(elemen)m(t)f(is)f(1.)43 b(The)34 b(next)257 934 y(elemen)m(ts)47 +b(are)e(the)i(unkno)m(wn)g(co)s(e\016cien)m(ts,)k(follo)m(w)m(ed)45 +b(b)m(y)i(the)f(parameter)f(co)s(e\016cien)m(ts.)257 +1054 y(The)38 b(last)d(elemen)m(t)h(is)g(the)g(constan)m(t)i(factor.)54 +b(F)-8 b(or)35 b(instance,)i(in)f(the)h(problem)e(of)g(section)257 +1175 y(2.1.1)d(the)h(domain)e(is)h(de\014ned)i(b)m(y)g(3)e(constrain)m +(ts:)1608 1302 y Fd(8)1608 1377 y(>)1608 1402 y(<)1608 +1552 y(>)1608 1576 y(:)1723 1380 y Fm(\000)p Fk(i)23 +b Fn(+)f Fk(m)28 b Fm(\025)h Fn(0)1723 1501 y Fm(\000)p +Fk(j)g Fn(+)22 b Fk(n)28 b Fm(\025)g Fn(0)1723 1621 y +Fk(j)h Fn(+)22 b Fk(i)g Fm(\000)h Fk(k)30 b Fm(\025)f +Fn(0)257 1829 y(the)k(ro)m(ws)h(corresp)s(onding)e(to)h(these)g +(constrain)m(ts)g(w)m(ould)g(b)s(e:)257 2027 y Fl(#)52 +b(eq/in)104 b(i)154 b(j)g(k)g(m)g(n)g(cst)462 2147 y(1)206 +b(0)103 b(-1)154 b(0)g(1)g(0)205 b(0)462 2268 y(1)154 +b(-1)h(0)f(0)g(0)g(1)205 b(0)462 2388 y(1)h(1)154 b(1)103 +b(-1)154 b(0)g(0)205 b(0)257 2587 y Fn(The)34 b(con)m(text)g(is)e +(de\014ned)i(b)m(y)f(one)g(constrain)m(t:)1547 2704 y +Fd(n)1644 2800 y Fm(\000)p Fk(k)26 b Fn(+)c Fk(m)g Fn(+)g +Fk(n)28 b Fm(\025)g Fn(0)257 3015 y(the)33 b(ro)m(w)g(corresp)s(onding) +g(to)f(this)g(constrain)m(t)h(w)m(ould)f(b)s(e:)257 3213 +y Fl(#)52 b(eq/in)104 b(k)154 b(m)g(n)g(cst)462 3334 +y(1)g(-1)h(1)f(1)205 b(0)257 3593 y Fg(3.1.2)113 b(PipV)-9 +b(ector)35 b(structure)257 3777 y Fl(struct)53 b(pipvector)257 +3898 y({)f(int)g(nb_elements)i(;)360 4018 y(Entier)f(*)e(the_vector)j +(;)360 4138 y(Entier)f(*)e(the_deno)j(;)257 4259 y(})e(;)257 +4379 y(typedef)h(struct)g(pipvector)h(PipVector)g(;)257 +4601 y Fn(The)34 b Fl(PipVector)g Fn(structure)g(represen)m(ts)h(a)d +Fl(Vector)i Fn(as)e(describ)s(ed)i(in)d(grammar)f(2)i(in)g(sec-)257 +4721 y(tion)h(2.3.)45 b Fl(nb)p 764 4721 31 4 v 37 w(elements)36 +b Fn(is)c(the)i(n)m(um)m(b)s(er)g(of)f(v)m(ector)h(elemen)m(ts,)g +Fl(the)p 2853 4721 V 38 w(vector)g Fn(is)f(an)g(arra)m(y)257 +4842 y(whic)m(h)e(con)m(tains)f(the)h(n)m(umerators)f(of)f(these)j +(elemen)m(ts)e(and)g Fl(the)p 2688 4842 V 38 w(deno)h +Fn(is)f(an)g(arra)m(y)g(whic)m(h)257 4962 y(con)m(tains)j(their)f +(denominators:)42 b(the)33 b(i)1714 4926 y Ff(th)1816 +4962 y Fn(elemen)m(t)g(is)f Fl(the)p 2434 4962 V 38 w(vector[i]/the)p +3135 4962 V 40 w(deno[i])p Fn(.)257 5221 y Fg(3.1.3)113 +b(PipNewparm)36 b(structure)257 5406 y Fl(struct)53 b(pipnewparm)257 +5526 y({)f(int)g(rank)g(;)360 5646 y(PipVector)i(*)d(vector)i(;)p +eop +%%Page: 16 16 +16 15 bop 257 266 a Fj(3)98 b(USING)32 b(THE)i(PIP)f(LIBRAR)-8 +b(Y)1947 b Fn(16)360 573 y Fl(Entier)53 b(deno)f(;)360 +693 y(struct)h(pipnewparm)h(*)d(next)i(;)257 814 y(})f(;)257 +934 y(typedef)h(struct)g(pipnewparm)h(PipNewparm)g(;)257 +1162 y Fn(The)29 b Fl(PipNewparm)h Fn(structure)f(represen)m(ts)h(a)d +Fl(NULL)i Fn(terminated)d(link)m(ed)i(list)e(of)h Fl(Newparm)i +Fn(as)257 1283 y(describ)s(ed)36 b(in)f(grammar)e(2)i(in)f(section)h +(2.3.)51 b(F)-8 b(or)35 b(eac)m(h)h Fl(Newparm)p Fn(,)h(the)f(rank)f +(is)g Fl(rank)p Fn(,)i(the)257 1403 y(v)m(ector)32 b(of)d(co)s +(e\016cien)m(ts)j(is)d(p)s(oin)m(ted)h(b)m(y)h Fl(vector)p +Fn(,)i(and)d(the)h(denominator)d(is)i Fl(deno)p Fn(.)44 +b Fl(next)31 b Fn(is)257 1523 y(a)i(p)s(oin)m(ter)f(to)g(the)h(next)g +Fl(PipNewparm)j Fn(structure.)257 1783 y Fg(3.1.4)113 +b(PipList)35 b(structure)257 1968 y Fl(struct)53 b(piplist)257 +2088 y({)f(PipVector)i(*)d(vector)i(;)360 2209 y(struct)g(piplist)g(*)e +(next)i(;)257 2329 y(})f(;)257 2449 y(typedef)h(struct)g(piplist)g +(PipList)h(;)257 2678 y Fn(The)48 b Fl(PipList)g Fn(structure)f +(represen)m(ts)i(a)d Fl(NULL)h Fn(terminated)e(link)m(ed)h(list)f(of)h +Fl(Vector)h Fn(as)257 2798 y(describ)s(ed)38 b(in)d(grammar)f(2)i(in)g +(section)h(2.3.)54 b Fl(vector)38 b Fn(is)e(a)g(p)s(oin)m(ter)g(to)g +(the)h(v)m(ector)g(of)f(the)257 2919 y(curren)m(t)e(no)s(de)f(and)g +Fl(next)g Fn(is)f(a)g(p)s(oin)m(ter)g(to)h(the)g(next)g +Fl(PipList)i Fn(structure.)257 3178 y Fg(3.1.5)113 b(PipQuast)37 +b(structure)257 3363 y Fl(struct)53 b(pipquast)257 3483 +y({)f(PipNewparm)i(*)d(newparm)i(;)360 3604 y(PipList)g(*)f(list)g(;) +360 3724 y(PipVector)i(*)d(condition)j(;)360 3845 y(struct)f(pipquast)g +(*)f(next_then)h(;)360 3965 y(struct)g(pipquast)g(*)f(next_else)h(;)360 +4085 y(struct)g(pipquast)g(*)f(father)h(;)257 4206 y(})f(;)257 +4326 y(typedef)h(struct)g(pipquast)h(PipQuast)f(;)257 +4554 y Fn(The)29 b Fl(PipQuast)i Fn(represen)m(ts)f(a)e +Fl(Quast)h Fn(as)g(describ)s(ed)f(in)g(grammar)e(2)h(in)h(section)g +(2.3.)42 b(Eac)m(h)257 4675 y Fl(Quast)24 b Fn(has)f(a)g(tree)g +(structure)h(and)f(b)s(egins)f(with)h(a)f(list)f(of)i +Fl(Newparm)h Fn(\(\014eld)e Fl(newparm)p Fn(\).)42 b(If)23 +b(the)257 4795 y(p)s(oin)m(ter)37 b Fl(condition)j Fn(is)d(not)g +Fl(NULL)p Fn(,)i(the)e(list)f(of)h Fl(Newparm)i Fn(is)e(follo)m(w)m(ed) +g(b)m(y)h(a)f(conditional)257 4916 y(structure)50 b(:)76 +b(if)47 b(the)i(condition)e(p)s(oin)m(ted)h(b)m(y)i Fl(condition)h +Fn(is)d(true,)53 b(then)c(the)g(solution)257 5036 y(con)m(tin)m(ues)28 +b(in)d(the)i Fl(Quast)h Fn(p)s(oin)m(ted)e(b)m(y)h Fl(next)p +1917 5036 31 4 v 38 w(then)p Fn(,)h(in)e(the)h Fl(Quast)g +Fn(p)s(oin)m(ted)f(b)m(y)i Fl(next)p 3446 5036 V 38 w(else)257 +5156 y Fn(otherwise.)61 b(If)38 b(the)h(p)s(oin)m(ter)e +Fl(condition)k Fn(is)d Fl(NULL)p Fn(,)h(the)f(list)f(of)h +Fl(Newparm)i Fn(is)d(follo)m(w)m(ed)h(b)m(y)257 5277 +y(a)e(list)f(of)h(v)m(ectors)h(\(\014eld)f Fl(list)p +Fn(\).)55 b(F)-8 b(or)36 b Fl(Quast)h Fn(manipulation)c(con)m(v)m +(enience,)39 b(a)d(p)s(oin)m(ter)g(to)257 5397 y(the)e(father)e(in)g +(the)i(tree)f(is)f(pro)m(vided)h(\(\014eld)g Fl(father)p +Fn(\),)h(ob)m(viously)f(the)g(father)g(of)f(the)h(ro)s(ot)257 +5518 y(is)f Fl(NULL)p Fn(.)p eop +%%Page: 17 17 +17 16 bop 257 266 a Fj(3)98 b(USING)32 b(THE)i(PIP)f(LIBRAR)-8 +b(Y)1947 b Fn(17)257 573 y Fh(3.2)136 b(PipLib)44 b(functions)h +(description)257 758 y Fg(3.2.1)113 b(pip)p 763 758 34 +4 v 40 w(solv)m(e)37 b(function)257 942 y Fl(PipQuast)54 +b(*)d(pip_solve)257 1063 y(\()h(PipMatrix)i(*)d(domain,)360 +1183 y(PipMatrix)j(*)d(context,)360 1303 y(int)h(Bg,)360 +1424 y(int)g(Nq,)360 1544 y(int)g(Verbose,)360 1665 y(int)g(Simplify,) +360 1785 y(int)g(Max)257 1905 y(\))g(;)257 2134 y Fn(The)47 +b Fl(pip)p 630 2134 31 4 v 37 w(solve)g Fn(function)e(solv)m(es)h(a)f +(linear)f(problem)g(pro)m(vided)i(as)f(input.)82 b(The)46 +b(\014rst)257 2254 y(three)d(parameters)g(describ)s(e)f(the)h(problem)e +(that)h(the)h(user)g(w)m(an)m(ts)g(to)f(solv)m(e.)73 +b(The)43 b(last)257 2374 y(four)33 b(parameters)g(describ)s(e)h(the)f +(options)g(that)g(the)g(user)h(has)f(to)g(set.)46 b(These)35 +b(parameters)257 2495 y(are:)377 2698 y(1.)48 b Fl(domain)p +Fn(:)c(a)29 b(p)s(oin)m(ter)f(to)h(the)h(equations)f(and)h(inequations) +e(system)j(whic)m(h)e(describ)s(es)501 2819 y(the)k(unkno)m(wn)i +(domain)30 b(in)i(the)h(P)m(olyLib)f(constrain)m(ts)h(matrix)e(shap)s +(e,)377 3022 y(2.)48 b Fl(context)p Fn(:)64 b(a)41 b(p)s(oin)m(ter)h +(to)f(the)h(equations)g(and)g(inequations)g(system)g(satis\014ed)h(b)m +(y)501 3142 y(the)34 b(parameters)g(con)m(text)h(in)e(the)h(P)m(olyLib) +f(constrain)m(ts)h(matrix)e(shap)s(e)i(\(it)e(can)i(b)s(e)501 +3263 y(NULL)f(if)e(there)j(is)e(no)g(con)m(text\),)377 +3466 y(3.)48 b Fl(Bg)p Fn(:)i(the)36 b(column)e(rank)i(of)f(the)g(bign) +m(um)g(\(\014rst)g(column)g(rank)g(is)g(0\),)h(or)f(a)g(negativ)m(e)501 +3587 y(v)-5 b(alue)32 b(if)g(there)h(is)f(no)h(big)e(parameter)h(in)g +(the)h(problem)e(to)i(b)s(e)f(solv)m(ed,)377 3790 y(4.)48 +b Fl(Nq)p Fn(:)c(a)33 b(b)s(o)s(olean)e(set)i(to)f(1)g(if)g(an)g(in)m +(teger)h(solution)e(is)h(needed,)i(0)e(otherwise,)377 +3993 y(5.)48 b Fl(Verbose)p Fn(:)d(a)31 b(b)s(o)s(olean)e(set)j(to)e(1) +h(if)f(debug)i(informations)c(are)j(needed)i(\(in)d(this)h(case,)501 +4114 y(most)i(of)h(the)g(pro)s(cessing)g(will)e(b)s(e)i(prin)m(ted)g +(in)f(a)g(\014le.)47 b(The)35 b(\014le)e(name)g(is)h(generated)501 +4234 y(at)e(random)g(\(b)m(y)i Fi(mkstemp)6 b Fn(\))31 +b(or)h(set)i(with)e(constan)m(t)h(DEBUG\),)g(0)f(if)f(not,)377 +4438 y(6.)48 b Fl(Simplify)p Fn(:)42 b(a)26 b(b)s(o)s(olean)e(set)i(to) +g(1)f(if)g(some)g(trivial)e(quast)k(simpli\014cations)22 +b(are)k(needed)501 4558 y(\(recursiv)m(e)40 b(elimination)35 +b(of)j(degenerated)h(patterns)h(lik)m(e)e Fl(if)51 b(#[...])104 +b(\(\))52 b(\(\))p Fn(\),)41 b(0)501 4678 y(otherwise,)377 +4882 y(7.)48 b Fl(Max)p Fn(:)c(not)33 b(in)f(use)h(y)m(et,)h(please)f +(set)g(it)f(to)g(0)g(for)g(future)h(compatibilit)m(y)-8 +b(.)257 5085 y(This)33 b(function)f(returns)i(a)e(p)s(oin)m(ter)g(to)g +(a)g Fl(PipQuast)j Fn(structure)f(con)m(taining)d(the)i(solution,)257 +5205 y(it)f(will)e(b)s(e)j Fl(NULL)h Fn(if)d(the)i(con)m(text)h(is)e +Fl(void)p Fn(.)p eop +%%Page: 18 18 +18 17 bop 257 266 a Fj(3)98 b(USING)32 b(THE)i(PIP)f(LIBRAR)-8 +b(Y)1947 b Fn(18)257 573 y Fg(3.2.2)113 b(pip)p 763 573 +34 4 v 40 w(matrix)p 1132 573 V 39 w(allo)s(c)36 b(function)257 +758 y Fl(PipMatrix)54 b(*)e(pip_matrix_alloc)257 878 +y(\()g(unsigned)h(nb_rows,)360 998 y(unsigned)g(nb_columns)257 +1119 y(\))f(;)257 1309 y Fn(The)c Fl(pip)p 631 1309 31 +4 v 37 w(matrix)p 974 1309 V 39 w(alloc)f Fn(function)f(allo)s(cates)e +(the)j(memory)e(space)j(for)d(a)h Fl(PipMatrix)257 1429 +y Fn(structure)53 b(with)d Fl(nb)p 1042 1429 V 37 w(rows)i +Fn(ro)m(ws)g(and)f Fl(nb)p 1889 1429 V 38 w(columns)h +Fn(columns.)98 b(It)51 b(\014lls)f(the)h Fl(Nb)p 3419 +1429 V 37 w(Rows)p Fn(,)257 1549 y Fl(Nb)p 365 1549 V +38 w(Columns)35 b Fn(and)f Fl(p)g Fn(\014elds)g(and)g(initializes)d +(the)j(matrix)e(en)m(tries)i(to)g(0,)g(then)g(it)f(returns)i(a)257 +1670 y(p)s(oin)m(ter)d(to)h(this)f(structure.)257 1925 +y Fg(3.2.3)113 b(pip)p 763 1925 34 4 v 40 w(matrix)p +1132 1925 V 39 w(read)38 b(function)257 2109 y Fl(PipMatrix)54 +b(*)e(pip_matrix_read\(FILE)k(*\))c(;)257 2299 y Fn(The)45 +b Fl(pip)p 628 2299 31 4 v 38 w(matrix)p 972 2299 V 38 +w(read)g Fn(function)e(read)g(a)g(matrix)f(from)h(a)g(\014le.)76 +b(It)43 b(tak)m(es)i(as)f(input)f(a)257 2420 y(p)s(oin)m(ter)g(to)f +(the)i(\014le)e(it)g(has)i(to)e(read)i(\(p)s(ossibly)e +Fl(stdin)p Fn(\),)47 b(and)c(returns)h(a)f(p)s(oin)m(ter)f(to)h(a)257 +2540 y Fl(PipMatrix)35 b Fn(structure.)45 b(The)34 b(input)e(has)h(the) +g(follo)m(wing)d(syn)m(tax:)403 2715 y Fm(\017)48 b Fn(some)33 +b(optional)d(commen)m(t)i(lines)g(whic)m(h)h(b)s(egin)f(with)g +Fl(#)p Fn(,)403 2909 y Fm(\017)48 b Fn(the)34 b(ro)m(w)f(n)m(um)m(b)s +(ers)h(and)f(column)f(n)m(um)m(b)s(ers,)j(p)s(ossibly)d(follo)m(w)m(ed) +g(b)m(y)i(commen)m(ts,)g(on)501 3029 y(a)f(single)e(line,)403 +3223 y Fm(\017)48 b Fn(the)32 b(matrix)e(ro)m(ws,)i(eac)m(h)h(ro)m(w)e +(m)m(ust)h(b)s(e)g(on)f(a)g(single)f(line)g(and)i(is)f(p)s(ossibly)f +(follo)m(w)m(ed)501 3343 y(b)m(y)k(commen)m(ts.)257 3518 +y(F)-8 b(or)32 b(instance,)h(in)f(the)h(problem)e(of)h(section)h(2.1.1) +f(the)h(domain)e(is)h(de\014ned)i(as)f(follo)m(ws)257 +3693 y Fl(#)52 b(This)g(is)g(the)g(domain)257 3813 y(3)g(7)872 +b(#)51 b(3)h(lines)g(and)g(7)g(columns)257 3933 y(1)103 +b(0)52 b(-1)103 b(0)g(1)f(0)h(0)52 b(#)f(-i)h(+)g(m)f(>=)h(0)257 +4054 y(1)g(-1)103 b(0)g(0)g(0)f(1)h(0)52 b(#)f(-j)h(+)g(n)f(>=)h(0)257 +4174 y(1)103 b(1)g(1)51 b(-1)104 b(0)e(0)h(0)52 b(#)f(j)h(+)f(i)h(-)f +(k)h(>=)g(0)257 4429 y Fg(3.2.4)113 b(Prin)m(ting)35 +b(F)-9 b(unctions)257 4614 y Fl(void)53 b(pip_matrix_print\(FILE)k(*,) +51 b(PipMatrix)j(*\))e(;)257 4734 y(void)h(pip_vector_print\(FILE)k(*,) +51 b(PipVector)j(*\))e(;)257 4855 y(void)h(pip_newparm_print\(FILE)k +(*,)52 b(PipNewparm)i(*,)d(int)h(indent\))i(;)257 4975 +y(void)f(pip_list_print\(FILE)j(*,)c(PipList)h(*,)f(int)g(indent\))h(;) +257 5095 y(void)g(pip_quast_print\(FILE)j(*,)c(PipQuast)h(*,)f(int)g +(indent\))h(;)257 5285 y Fn(There)40 b(is)f(a)f(prin)m(ting)f(function) +i(for)f(eac)m(h)i(structure)g(of)e(the)h(PipLib.)61 b(They)40 +b(all)d(tak)m(e)i(as)257 5406 y(input)32 b(a)g(p)s(oin)m(ter)g(to)g(a)g +(\014le)g(\(p)s(ossibly)g Fl(stdout)p Fn(\))i(and)e(a)g(p)s(oin)m(ter)g +(to)g(a)g(structure.)45 b(Some)32 b(of)257 5526 y(them)g(tak)m(es)h(as) +f(input)f(an)h(inden)m(t)g(step.)44 b(They)33 b(prin)m(t)f(the)g +(structure)h(con)m(ten)m(ts)g(to)f(the)g(\014le)257 5646 +y(without)g(inden)m(t)h(if)f Fl(indent)i Fk(<)27 b Fn(0,)33 +b(with)f(an)g(inden)m(tation)g(step)h(of)g Fl(indent)h +Fn(otherwise.)p eop +%%Page: 19 19 +19 18 bop 257 266 a Fj(3)98 b(USING)32 b(THE)i(PIP)f(LIBRAR)-8 +b(Y)1947 b Fn(19)257 573 y Fg(3.2.5)113 b(Memory)37 b(Deallo)s(cation)f +(F)-9 b(unctions)257 758 y Fl(void)53 b(pip_matrix_free\(PipMatrix)58 +b(*\))51 b(;)257 878 y(void)i(pip_vector_free\(PipVector)58 +b(*\))51 b(;)257 998 y(void)i(pip_newparm_free\(PipNewpar)q(m)k(*\))52 +b(;)257 1119 y(void)h(pip_list_free\(PipList)k(*\))51 +b(;)257 1239 y(void)i(pip_quast_free\(PipQuast)k(*\))52 +b(;)257 1467 y Fn(There)35 b(is)e(a)h(memory)f(deallo)s(cation)d +(function)k(for)f(eac)m(h)h(structure)h(of)e(the)h(PipLib.)46 +b(They)257 1588 y(free)33 b(the)g(allo)s(cated)e(memory)h(for)g(the)h +(structure.)257 1877 y Fh(3.3)136 b(Example)257 2061 +y Fn(Here)42 b(is)e(a)h(simple)e(example)h(sho)m(wing)h(ho)m(w)g(one)g +(can)g(use)h(the)f(PipLib,)h(assuming)e(that)257 2182 +y(a)c(basic)g(installation)c(w)m(as)37 b(done.)53 b(The)37 +b(follo)m(wing)c(C)j(program)f(reads)h(a)g(domain)e(and)i(its)257 +2302 y(con)m(text)i(on)e(the)h(standard)f(input)g(then)h(prin)m(ts)f +(the)h(solution)e(on)h(the)h(standard)f(output.)257 2423 +y(Options)47 b(are)g(preselected)i(:)73 b(there)48 b(is)f(no)g(bign)m +(um,)j(w)m(e)f(are)e(lo)s(oking)e(for)i(an)g(in)m(tegral)257 +2543 y(solution)31 b(without)i(simpli\014cation)c(and)j(w)m(e)i(don't)f +(w)m(an)m(t)g(debug)g(informations.)257 2746 y Fl(/*)52 +b(example.c)i(*/)257 2867 y(#)e(include)h()257 +2987 y(#)f(include)h()257 3228 y(int)f(main\(\))257 +3348 y({)g(PipMatrix)i(*)d(domain,)i(*)f(context)104 +b(;)360 3469 y(PipQuast)53 b(*)f(solution)h(;)360 3709 +y(domain)g(=)e(pip_matrix_read\(stdin\))57 b(;)360 3830 +y(context)c(=)f(pip_matrix_read\(stdin\))57 b(;)360 4070 +y(solution)c(=)f(pip_solve\(domain,context,-)q(1,1)q(,0,0)q(,0\))58 +b(;)360 4311 y(pip_matrix_free\(domain\))f(;)360 4432 +y(pip_matrix_free\(context\))h(;)360 4672 y(pip_quast_print\(stdout,so) +q(luti)q(on,0)q(\))f(;)257 4793 y(})257 4996 y Fn(The)34 +b(compilation)29 b(command)i(could)i(b)s(e)f(:)257 5200 +y Fl(gcc)52 b(example.c)i(-lpiplib64)g(-o)e(example)257 +5403 y Fn(Supp)s(osing)30 b(that)g(the)g(user)h(w)m(an)m(ts)g(to)e +(solv)m(e)i(the)f(problem)e(of)i(section)g(2.1.1,)g(he)g(will)d(t)m(yp) +s(e:)p eop +%%Page: 20 20 +20 19 bop 257 266 a Fj(4)98 b(INST)-8 b(ALLING)33 b(PIP)2377 +b Fn(20)257 573 y Fl(3)52 b(7)257 693 y(1)103 b(0)52 +b(-1)103 b(0)g(1)f(0)h(0)257 814 y(1)52 b(-1)103 b(0)g(0)g(0)f(1)h(0) +257 934 y(1)g(1)g(1)51 b(-1)104 b(0)e(0)h(0)257 1054 +y(1)52 b(5)257 1175 y(1)g(-1)103 b(1)g(1)g(0)257 1351 +y Fn(And)33 b(the)g(program)f(will)e(prin)m(t)i(:)257 +1527 y Fl(\(if)52 b(#[)g(-1)g(1)g(0)f(0])309 1648 y(\(list)360 +1768 y(#[)h(0)f(0)h(0)f(0])360 1889 y(#[)h(1)f(0)h(0)f(0])309 +2009 y(\))309 2129 y(\(list)360 2250 y(#[)h(1)f(-1)h(0)g(0])360 +2370 y(#[)g(0)f(1)h(0)f(0])309 2490 y(\))257 2611 y(\))257 +2939 y Fo(4)161 b(Installing)56 b(PIP)257 3187 y Fh(4.1)136 +b(Implemen)l(tation)47 b(Notes)257 3372 y Fn(The)28 b(main)c(problem)h +(with)h(an)m(y)h(in)m(teger)f(programming)d(soft)m(w)m(are)k(is)f +(that,)h(since)g(one)f(m)m(ust)257 3492 y(distinguish)c(b)s(et)m(w)m +(een)k(in)m(teger)d(and)h(rationals,)f(all)e(computations)h(are)i(to)f +(b)s(e)g(done)h(exactly)-8 b(.)257 3613 y(Rationals)41 +b(m)m(ust)h(b)s(e)h(represen)m(ted)h(as)f(quotien)m(ts)g(with)f(an)g +(in)m(teger)g(n)m(umerator)g(and)h(an)257 3733 y(in)m(teger)36 +b(denominator.)53 b(In)36 b(the)g(preceding)h(v)m(ersion,)g(there)g(w)m +(as)g(only)f(one)g(denominator)257 3853 y(for)46 b(the)h(whole)g +(tableau.)85 b(The)47 b(consequence)j(w)m(as)d(that)g +(simpli\014cations)c(where)48 b(most)257 3974 y(unlik)m(ely)-8 +b(,)25 b(and)e(that)g(the)g(in)m(tegers)h(in)e(the)h(tableau)g(w)m(ere) +h(gro)m(wing)e(un)m(til)g(o)m(v)m(er\015o)m(ws)k(o)s(ccured.)404 +4094 y(In)c(the)h(presen)m(t)h(v)m(ersion,)h(there)e(is)f(one)g +(denominator)f(p)s(er)i(ro)m(w)f(of)g(the)h(tableau.)39 +b(Reduc-)257 4214 y(tion)30 b(to)h(lo)m(w)m(er)g(terms)g(o)s(ccurs)h +(frequen)m(tly)-8 b(,)32 b(and)f(the)g(gro)m(wth)h(of)e(n)m(um)m(b)s +(ers)i(in)e(the)i(problem)257 4335 y(tableau)i(is)f(limited.)44 +b(As)35 b(a)e(consequence,)38 b(m)m(uc)m(h)c(larger)f(problems)g(can)h +(b)s(e)g(solv)m(ed.)48 b(This)257 4455 y(has)37 b(had)g(the)g +(unfortunate)f(consequence)k(that)c(sev)m(eral)h(bugs,)i(whic)m(h)e(w)m +(ere)g(b)s(ey)m(ond)h(the)257 4576 y(domain)c(of)i(the)g(old)f(v)m +(ersion,)i(ha)m(v)m(e)h(no)m(w)e(surfaced.)54 b(These)38 +b(bugs)e(ha)m(v)m(e)i(b)s(een)e(corrected.)257 4696 y(As)g(far)e(as)g +(the)i(author)e(can)h(tell,)f(these)h(bugs)h(mainly)c(ga)m(v)m(e)k +(correct)f(results)g(whic)m(h)g(w)m(ere)257 4816 y(not)f(in)e(simplest) +h(form:)44 b(the)34 b(quast)g(had)f(extraneous)i(lea)m(v)m(es.)47 +b(In)34 b(some)g(cases,)h(the)f(result)257 4937 y(w)m(as)h(wrong)f(but) +g(the)g(error)g(w)m(as)h(self)e(eviden)m(t:)47 b(for)33 +b(instance,)i(there)f(w)m(ere)i(denominators)257 5057 +y(in)c(in)m(teger)h(results.)257 5341 y Fh(4.2)136 b(License)257 +5526 y Fn(This)44 b(program)e(is)h(free)h(soft)m(w)m(are;)50 +b(y)m(ou)44 b(can)g(redistribute)f(it)f(and/or)h(mo)s(dify)f(it)h +(under)257 5646 y(the)32 b(terms)g(of)f(the)g(GNU)h(General)e(Public)h +(License)h(v)m(ersion)g(2)f(as)h(published)f(b)m(y)i(the)e(F)-8 +b(ree)p eop +%%Page: 21 21 +21 20 bop 257 266 a Fj(4)98 b(INST)-8 b(ALLING)33 b(PIP)2377 +b Fn(21)257 573 y(Soft)m(w)m(are)34 b(F)-8 b(oundation.)404 +693 y(This)28 b(program)e(is)i(distributed)f(in)h(the)g(hop)s(e)g(that) +g(it)f(will)f(b)s(e)i(useful,)h(but)f(WITHOUT)257 814 +y(ANY)39 b(W)-11 b(ARRANTY;)39 b(without)f(ev)m(en)i(the)f(implied)d(w) +m(arran)m(t)m(y)k(of)e(MER)m(CHANT)-8 b(ABIL-)257 934 +y(ITY)49 b(or)f(FITNESS)h(F)m(OR)e(A)h(P)-8 b(AR)g(TICULAR)49 +b(PURPOSE.)g(See)g(the)g(GNU)e(General)257 1054 y(Public)32 +b(License)h(for)g(more)e(details.)43 b Fl(http://www.gnu.org/copylef)q +(t/g)q(pl.h)q(tml)257 1340 y Fh(4.3)136 b(Building)45 +b(the)g(Executable)h(and)f(the)g(Library)257 1525 y Fn(T)-8 +b(o)40 b(build)e(PIP)-8 b(,)41 b(\014rst)f(cop)m(y)h(the)f(ab)s(o)m(v)m +(e)g(tar\014le)f(to)g(an)m(y)h(con)m(v)m(enien)m(t)i(directory)-8 +b(.)64 b(Expand)257 1645 y(the)33 b(tar\014le)f(using:)257 +1829 y Fl(zcat)53 b(pip.tar.Z)g(|)f(tar)g(xvf)g(-)257 +2013 y Fn(Y)-8 b(ou)33 b(should)f(obtain)g(the)h(follo)m(wing)d +(\014les:)403 2198 y Fm(\017)48 b Fn(header)34 b(\014les)e(in)g(the)h +Fl(include)h Fn(directory)-8 b(,)403 2395 y Fm(\017)48 +b Fn(C)33 b(co)s(de)g(\014les)g(in)f(the)h Fl(source)h +Fn(directory)-8 b(,)403 2592 y Fm(\017)48 b Fn(a)33 b(lot)f(of)g(data)h +(\014les)g Fl(*.dat)h Fn(and)f(of)g(result)g(\014les)g +Fl(*.ll)h Fn(in)e(the)i Fl(test)g Fn(directory)f(\(y)m(ou)501 +2712 y(should)e(then)g(run)f(at)h(least)f(some)g(of)g(the)h +Fl(*.dat)h Fn(\014les)e(and)h(compare)f(the)h(results)g(to)501 +2832 y(the)i(corresp)s(onding)g Fl(*.ll)g Fn(\014le\),)403 +3029 y Fm(\017)48 b Fn(a)31 b(simple)f(example)h(sho)m(wing)h(ho)m(w)g +(to)f(use)i(the)e(PipLib)g(in)f(the)i Fl(example)i Fn(directory)-8 +b(,)403 3226 y Fm(\017)48 b Fn(a)33 b(p)s(ostscript)f(v)m(ersion)h(of)f +(the)h(presen)m(t)i(do)s(cumen)m(t,)e Fl(pip.ps)h Fn(in)d(the)i +Fl(doc)h Fn(directory)-8 b(,)403 3423 y Fm(\017)48 b +Fn(\014les)33 b(needed)h(for)e(compilation)d(and)k(installation)c(in)j +(the)h(PIP)g(ro)s(ot)f(directory)-8 b(.)257 3680 y Fg(4.3.1)113 +b(basic)37 b(installation)257 3864 y Fn(The)f Fl(configure)i +Fn(shell)c(script)h(attempts)g(to)f(guess)j(correct)e(v)-5 +b(alues)35 b(for)g(v)-5 b(arious)34 b(system-)257 3985 +y(dep)s(enden)m(t)45 b(v)-5 b(ariables)42 b(used)i(during)e +(compilation.)72 b(It)43 b(uses)h(those)g(v)-5 b(alues)43 +b(to)f(create)i(a)257 4105 y Fl(Makefile)p Fn(.)79 b(The)45 +b(\014le)e Fl(configure.in)k Fn(is)c(used)i(to)e(create)h +Fl(configure)i Fn(b)m(y)f(a)e(program)257 4226 y(called)28 +b Fl(autoconf)p Fn(.)44 b(Y)-8 b(ou)28 b(only)g(need)h +Fl(configure.in)j Fn(if)27 b(y)m(ou)i(w)m(an)m(t)g(to)f(c)m(hange)h(it) +e(or)h(regen-)257 4346 y(erate)33 b Fl(configure)i Fn(using)d(a)h(new)m +(er)h(v)m(ersion)f(of)f Fl(autoconf)p Fn(.)404 4466 y(The)h(simplest)f +(w)m(a)m(y)h(to)g(compile)d(this)j(pac)m(k)-5 b(age)33 +b(is:)403 4651 y Fm(\017)48 b Fl(cd)71 b Fn(to)e(the)i(directory)e(con) +m(taining)g(the)h(pac)m(k)-5 b(age's)71 b(source)g(co)s(de)g(and)f(t)m +(yp)s(e)501 4771 y Fl(./configure)55 b Fn(to)c(con\014gure)i(the)f(pac) +m(k)-5 b(age)52 b(for)f(y)m(our)h(system)h(\(while)e(running,)501 +4891 y Fl(configure)35 b Fn(prin)m(ts)e(some)f(messages)i(telling)c +(whic)m(h)j(features)g(it)f(is)g(c)m(hec)m(king)i(for\),)403 +5088 y Fm(\017)48 b Fn(t)m(yp)s(e)34 b Fl(make)f Fn(to)g(compile)d(the) +j(pac)m(k)-5 b(age)33 b(and)g(install)d(the)j(program)e(and)i(the)g +(library)-8 b(,)403 5285 y Fm(\017)48 b Fn(y)m(ou)33 +b(can)f(remo)m(v)m(e)h(the)f(program)f(binaries)g(and)h(ob)5 +b(ject)33 b(\014les)f(from)f(the)h(source)h(co)s(de)501 +5406 y(directory)j(b)m(y)g(t)m(yping)g Fl(make)52 b(clean)p +Fn(.)i(T)-8 b(o)35 b(also)g(remo)m(v)m(e)h(the)g(\014les)g(that)f +Fl(configure)501 5526 y Fn(created)i(\(so)g(y)m(ou)g(can)g(compile)d +(the)j(pac)m(k)-5 b(age)37 b(for)f(a)g(di\013eren)m(t)g(kind)h(of)f +(computer\))501 5646 y(t)m(yp)s(e)e Fl(make)52 b(distclean)p +Fn(.)p eop +%%Page: 22 22 +22 21 bop 257 266 a Fj(REFERENCES)2659 b Fn(22)404 573 +y(PIP)27 b(and)g(the)h(PipLib)d(ha)m(v)m(e)k(b)s(een)e(successfully)i +(compiled)c(on)h(the)i(follo)m(wing)c(systems:)403 776 +y Fm(\017)48 b Fn(PC's)34 b(under)g(Lin)m(ux,)e(with)h(the)g +Fl(gcc)g Fn(compiler,)403 980 y Fm(\017)48 b Fn(PC's)26 +b(under)g(Windo)m(ws)f(\(Cygwin\),)i(with)e(the)g Fl(gcc)g +Fn(compiler)e(\(but)i(b)s(ecause)h(of)f(some)501 1100 +y(Cygwin)31 b(limitations,)26 b(only)j(32)g(bits)h(v)m(ersion)g(will)e +(w)m(ork)j(and)f(user)h(ma)m(y)e(exp)s(erience)501 1220 +y(some)k(problems)e(when)j(linking)d(with)h(PipLib\),)403 +1424 y Fm(\017)48 b Fn(SparcStations,)33 b(with)f(the)h +Fl(gcc)g Fn(compiler.)257 1684 y Fg(4.3.2)113 b(optionnal)36 +b(features)403 1868 y Fm(\017)48 b Fn(By)67 b(default,)73 +b Fl(make)67 b Fn(will)c(install)h(the)i(pac)m(k)-5 b(age's)67 +b(\014les)f(in)f Fl(/usr/local/bin)p Fn(,)501 1989 y +Fl(/usr/local/lib)p Fn(,)52 b(etc.)81 b(Y)-8 b(ou)44 +b(can)h(sp)s(ecify)h(an)e(installation)e(pre\014x)k(other)e(than)501 +2109 y Fl(/usr/local)35 b Fn(b)m(y)f(giving)d Fl(configure)k +Fn(the)e(option)e Fl(--prefix=PATH)p Fn(.)403 2313 y +Fm(\017)48 b Fn(By)37 b(default,)g(b)s(oth)g(PIP)g(and)g(the)g(PipLib)e +(are)i(compiled)d(and)j(installed.)54 b(By)37 b(giv-)501 +2433 y(ing)31 b Fl(configure)i Fn(the)f(option)e Fl(--without-pip)35 +b Fn(y)m(ou)d(disable)e(the)i(compilation)27 b(and)501 +2553 y(installation)38 b(of)j(PIP)-8 b(.)43 b(By)f(giving)e +Fl(configure)k Fn(the)e(option)f Fl(--without-lib)k Fn(y)m(ou)501 +2674 y(disable)32 b(the)h(compilation)c(and)k(installation)c(of)j(the)h +(PipLib.)403 2877 y Fm(\017)48 b Fn(By)32 b(default,)f(b)s(oth)g(in)m +(t)f(\(32)h(bits\))g(and)g(long)f(long)g(in)m(t)g(\(64)h(bits\))g(v)m +(ersions)h(are)f(built.)501 2997 y(By)f(giving)d Fl(configure)k +Fn(the)e(option)f Fl(--enable-int)k Fn(y)m(ou)d(ask)h(for)e(in)m(t)h(v) +m(ersion)g(only)501 3118 y(and)g(b)m(y)g(giving)e Fl(configure)k +Fn(the)e(option)f Fl(--enable-llint)k Fn(y)m(ou)d(ask)g(for)f(long)g +(long)501 3238 y(in)m(t)k(v)m(ersion)h(only)-8 b(.)257 +3498 y Fg(4.3.3)113 b(uninstallation)257 3683 y Fn(Y)-8 +b(ou)44 b(can)g(easily)f(remo)m(v)m(e)h(PIP)g(and)g(the)g(PipLib)e +(from)h(y)m(our)h(system)h(b)m(y)f(t)m(yping)f Fl(make)257 +3803 y(uninstall)p Fn(.)404 4042 y(Rep)s(ort)32 b(all)e(bugs,)k +(problems,)e(inaccuracies)g(in)g(the)h(do)s(cumen)m(tation)e(to:)404 +4162 y Fl(Paul.Feautrier@prism.uvsq.)q(fr)404 4282 y +Fn(Praise)h(is)g(also)g(appreciated.)404 4403 y(Let)g(the)h(p)s(o)m(w)m +(er)h(of)e(parametric)f(in)m(teger)i(programming)c(b)s(e)k(with)f(y)m +(ou.)257 4736 y Fo(References)257 4955 y Fn([1])49 b(P)m(aul)67 +b(F)-8 b(eautrier.)147 b(P)m(arametric)67 b(in)m(teger)g(programming.) +145 b Fi(RAIR)n(O)67 b(R)-5 b(e)g(cher)g(che)409 5075 +y(Op)n(\023)-47 b(er)-5 b(ationnel)5 b(le)p Fn(,)30 b(22:243{268,)h +(Septem)m(b)s(er)i(1988.)257 5278 y([2])49 b(P)m(aul)g(F)-8 +b(eautrier.)94 b(Seman)m(tical)48 b(analysis)h(and)g(mathematical)e +(programming;)55 b(ap-)409 5399 y(plication)45 b(to)j(parallelization) +43 b(and)48 b(v)m(ectorization.)89 b(In)48 b(M.)g(Cosnard,)53 +b(Y.)48 b(Rob)s(ert,)409 5519 y(P)-8 b(.)41 b(Quin)m(ton,)i(and)e(M.)h +(Ra)m(ynal,)g(editors,)h Fi(Workshop)f(on)h(Par)-5 b(al)5 +b(lel)42 b(and)g(Distribute)-5 b(d)409 5639 y(A)n(lgorithms,)34 +b(Bonas)p Fn(,)e(pages)h(309{320.)e(North)h(Holland,)f(1989.)p +eop +%%Page: 23 23 +23 22 bop 257 266 a Fj(REFERENCES)2659 b Fn(23)257 573 +y([3])49 b(Doran)28 b(K.)h(Wilde.)36 b(A)28 b(library)g(for)g(doing)f +(p)s(olyhedral)h(op)s(erations.)36 b(T)-8 b(ec)m(hnical)29 +b(Rep)s(ort)409 693 y(785,)j(IRISA,)h(Rennes,)h(F)-8 +b(rance,)33 b(1993.)p eop +%%Trailer +end +userdict /end-hook known{end-hook}if +%%EOF diff --git a/example/Makefile b/example/Makefile new file mode 100644 index 0000000..f0ab1ab --- /dev/null +++ b/example/Makefile @@ -0,0 +1,21 @@ +# Please enter here the locations for PipLib include and libraries if they +# aren't the default values (/usr/lib and /usr/include). +PIPLIB_INC = #$(HOME)/progs/linux/include +PIPLIB_LIB = #$(HOME)/progs/linux/lib + +CC = gcc +LDLIBS= -lpiplib32 +CFLAGS= -I $(PIPLIB_INC) -L $(PIPLIB_LIB) + + +example: example.c + @echo " /*-----------------------------------------------*" + @echo " * Making example *" + @echo " *-----------------------------------------------*/" + $(CC) example.c -o example $(CFLAGS) $(LDLIBS) + +clean: + @echo " /*-----------------------------------------------*" + @echo " * Cleaning example *" + @echo " *-----------------------------------------------*/" + -rm -f example example.exe core diff --git a/example/big.dat b/example/big.dat new file mode 100644 index 0000000..7548a67 --- /dev/null +++ b/example/big.dat @@ -0,0 +1,9 @@ +(() +2 1 4 0 -1 1 +( #[ -1 0 0 1] + #[ 0 -1 0 1] + #[ -1 3 12 -2] + #[ 2 -1 3 -1] +) +() +) diff --git a/example/big.pol b/example/big.pol new file mode 100644 index 0000000..90901fa --- /dev/null +++ b/example/big.pol @@ -0,0 +1,7 @@ +4 5 +1 -1 0 1 0 +1 0 -1 1 0 +1 -1 3 -2 12 +1 2 -1 -1 3 + +0 3 diff --git a/example/cg1.dat b/example/cg1.dat new file mode 100644 index 0000000..8e0a597 --- /dev/null +++ b/example/cg1.dat @@ -0,0 +1,15 @@ +((( c2 i j)(1)(c1 n)) +3 2 8 2 -1 1 +( #[ 0 1 0 0 -1 0] + #[ 0 -1 0 0 1 0] + #[ 1 0 0 0 0 -1] + #[-1 0 0 0 0 1] + #[ 0 1 0 -1 0 0] + #[ 0 -1 0 0 0 1] + #[ 0 -1 1 -1 0 0] + #[ 0 0 -1 0 0 1] +) +( #[ 1 0 -1] + #[-1 1 0] +) +) diff --git a/example/cg1.pol b/example/cg1.pol new file mode 100644 index 0000000..e740dc4 --- /dev/null +++ b/example/cg1.pol @@ -0,0 +1,13 @@ +8 7 + 1 0 1 0 -1 0 0 + 1 0 -1 0 1 0 0 + 1 1 0 0 0 -1 0 + 1 -1 0 0 0 1 0 + 1 0 1 0 0 0 -1 + 1 0 -1 0 0 1 0 + 1 0 -1 1 0 0 -1 + 1 0 0 -1 0 1 0 + +2 4 + 1 1 0 -1 + 1 -1 1 0 diff --git a/example/esced.dat b/example/esced.dat new file mode 100644 index 0000000..b2cbc29 --- /dev/null +++ b/example/esced.dat @@ -0,0 +1,79 @@ +(( Programme esced : + Code : + do i=1,n + (S1) a(i) = i + do j=1,m + (S2) b(j) = b(j) + a(i) + endo + endo + + Farkas : + O(S1,i) = n1 + n2(i-1) + n3(n-i) + O(S2,i,j) = n4 + n5(i-1) + n6(n-i) + n7(j-1) + n8(m-j) + + (-1)*n1 + (1)*n4 >= 0 + (-1)*n2 + (1)*n5 >= 0 + (-1)*n3 + (1)*n5 >= 0 + (1)*n5 + (-1)*n6 >= 0 + (1)*n7 >= 0 + (1)*n8 >= 0 + + Chunking : + TS1 = [ [ 1 ] ] + TS2 = [ [ 0 1 ] [ 0 0 ] + + Decalages : + - pour TS1 + (1)*n1 + (-1)*n2 == b1 + (1)*n3 == bn1 + - pour TS2 + (1)*n4 + (-1)*n5 + (-1)*n7 == b2 + (1)*n6 == bn2 + (1)*n8 == bm2 + + Construction : + - pour TS1 + (1)*n2 + (-1)*n3 == (1)*CS1,1 + - pour TS2 + (1)*n5 + (-1)*n6 == (0)*CS2,1 + (0)*CS2,2 + (1)*n7 + (-1)*n8 == (1)*CS2,1 + (0)*CS2,2 + + Non nullite (simplifiee) : + (1)*CS1,1 >= 1 + (1)*CS2,1 + (1)*CS2,2 >= 1 + ) + 16 0 24 0 -1 1 + (#[0 0 0 0 0 0 0 0 -1 0 0 1 0 0 0 0 0] + #[0 0 0 0 0 0 0 0 0 -1 0 0 1 0 0 0 0] + #[0 0 0 0 0 0 0 0 0 0 -1 0 0 1 0 0 0] + #[0 0 0 0 0 0 0 0 0 0 0 0 1 -1 0 0 0] + #[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0] + #[0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0] + + + #[0 0 0 -1 0 0 0 0 1 -1 0 0 0 0 0 0 0] + #[0 0 0 1 0 0 0 0 -1 1 0 0 0 0 0 0 0] + #[0 0 0 0 -1 0 0 0 0 0 1 0 0 0 0 0 0] + #[0 0 0 0 1 0 0 0 0 0 -1 0 0 0 0 0 0] + + #[-1 0 0 0 0 0 0 0 0 1 -1 0 0 0 0 0 0] + #[1 0 0 0 0 0 0 0 0 -1 1 0 0 0 0 0 0] + + + #[0 0 0 0 0 -1 0 0 0 0 0 1 -1 0 -1 0 0] + #[0 0 0 0 0 1 0 0 0 0 0 -1 1 0 1 0 0] + #[0 0 0 0 0 0 -1 0 0 0 0 0 0 1 0 0 0] + #[0 0 0 0 0 0 1 0 0 0 0 0 0 -1 0 0 0] + #[0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 1 0] + #[0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 -1 0] + + #[0 0 0 0 0 0 0 0 0 0 0 0 1 -1 0 0 0] + #[0 0 0 0 0 0 0 0 0 0 0 0 -1 1 0 0 0] + #[0 -1 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 0] + #[0 1 0 0 0 0 0 0 0 0 0 0 0 0 -1 1 0] + + #[1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1] + #[0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 -1] + ) + () +) diff --git a/example/esced.pol b/example/esced.pol new file mode 100644 index 0000000..a58ca89 --- /dev/null +++ b/example/esced.pol @@ -0,0 +1,25 @@ +16 18 +1 0 0 0 0 0 0 0 0 -1 0 0 1 0 0 0 0 0 +1 0 0 0 0 0 0 0 0 0 -1 0 0 1 0 0 0 0 +1 0 0 0 0 0 0 0 0 0 0 -1 0 0 1 0 0 0 +1 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 0 0 0 +1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 +1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + + +0 0 0 0 -1 0 0 0 0 1 -1 0 0 0 0 0 0 0 +0 0 0 0 0 -1 0 0 0 0 0 1 0 0 0 0 0 0 + +0 -1 0 0 0 0 0 0 0 0 1 -1 0 0 0 0 0 0 + +0 0 0 0 0 0 -1 0 0 0 0 0 1 -1 0 -1 0 0 +0 0 0 0 0 0 0 -1 0 0 0 0 0 0 1 0 0 0 +0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 1 0 + +0 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 0 0 0 +0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 0 + +1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 +1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 + +0 2 diff --git a/example/ex.dat b/example/ex.dat new file mode 100644 index 0000000..7cecff1 --- /dev/null +++ b/example/ex.dat @@ -0,0 +1,8 @@ +(() +2 3 3 1 -1 1 +( #[ 0 -1 0 0 1 0] + #[ -1 0 0 0 0 1] + #[ 1 1 0 -1 0 0] +) +( #[ -1 1 1 0] +)) diff --git a/example/ex.pol b/example/ex.pol new file mode 100644 index 0000000..7344864 --- /dev/null +++ b/example/ex.pol @@ -0,0 +1,7 @@ +3 7 +1 0 -1 0 1 0 0 +1 -1 0 0 0 1 0 +1 1 1 -1 0 0 0 + +1 5 +1 -1 1 1 0 diff --git a/example/ex2.dat b/example/ex2.dat new file mode 100644 index 0000000..9d10ed2 --- /dev/null +++ b/example/ex2.dat @@ -0,0 +1,8 @@ +(() +2 3 3 1 -1 1 +( #[ 0 -1 0 0 1 0] + #[ -1 0 0 0 0 1] + #[ 1 1 0 -1 0 0] +) +( #[ -1 1 1 0] +)) diff --git a/example/ex2.pol b/example/ex2.pol new file mode 100644 index 0000000..48259d9 --- /dev/null +++ b/example/ex2.pol @@ -0,0 +1,7 @@ +3 7 +1 0 -1 0 1 0 0 +1 -1 0 0 0 1 0 +1 1 1 -1 0 0 0 + +1 5 +1 -1 1 1 0 diff --git a/example/example.c b/example/example.c new file mode 100644 index 0000000..632fd13 --- /dev/null +++ b/example/example.c @@ -0,0 +1,30 @@ +/* This is a very simple example of how to use the PipLib inside your programs. + * You should compile it by typing 'make' (after edition of the makefile), then + * test it for instance by typing 'more FILE.pol | ./example'. Finally you can + * compare results given by PIP by typing 'pip32 FILE.dat' + */ + +# include +# include + +int main() +{ PipMatrix * domain, * context ; + PipQuast * solution ; + + printf("Enter the Matrices :\n") ; + domain = pip_matrix_read(stdin) ; + pip_matrix_print(stdout,domain) ; + context = pip_matrix_read(stdin) ; + pip_matrix_print(stdout,context) ; + printf("\n") ; + + solution = pip_solve(domain,context,-1,1,0,0,0) ; + + pip_matrix_free(domain) ; + pip_matrix_free(context) ; + + pip_quast_print(stdout,solution,0) ; + + pip_quast_free(solution) ; + return 0 ; +} diff --git a/example/fimmel.dat b/example/fimmel.dat new file mode 100644 index 0000000..8c75c99 --- /dev/null +++ b/example/fimmel.dat @@ -0,0 +1,12 @@ +(((i j 1)(m n)) +2 2 7 0 -1 1 +( #[2 6 -9 0 0] + #[5 -3 0 0 0] + #[2 -10 15 0 0] + #[-2 6 -3 0 0] + #[-2 -6 17 0 0] + #[0 1 0 -1 0] + #[1 0 0 0 -1] +) +() +) diff --git a/example/fimmel.pol b/example/fimmel.pol new file mode 100644 index 0000000..3415985 --- /dev/null +++ b/example/fimmel.pol @@ -0,0 +1,10 @@ +7 6 +1 2 6 0 0 -9 totot +1 5 -3 0 0 0 +1 2 -10 0 0 15 +1 -2 6 0 0 -3 +1 -2 -6 0 0 17 +1 0 1 -1 0 0 +1 1 0 0 -1 0 + +0 4 diff --git a/include/piplib/funcall.h b/include/piplib/funcall.h new file mode 100644 index 0000000..1cae61b --- /dev/null +++ b/include/piplib/funcall.h @@ -0,0 +1,26 @@ +Entier pgcd(Entier, Entier); +int sol_hwm(void); +void sol_simplify(int); +int is_not_Nil(int); +int sol_edit(FILE *, int); +void tab_reset(struct high_water_mark); +void sol_reset(int); +struct high_water_mark tab_hwm(void); +Tableau *tab_get(FILE *, int,int,int); +void sol_init(void); +void tab_init(void); +void sol_if(void); +void sol_forme(int); +void sol_val(Entier, Entier); +void sol_nil(void); +void sol_error(int); +int integrer(Tableau **, Tableau **, Entier, int *, int *, int *, int *); +Tableau * tab_alloc(int, int, int); +void sol_list(int); +void tab_display(Tableau *, FILE *); +Entier traiter(Tableau *, Tableau *, int, Entier, int, int, int, int, int); +Tableau * expanser(Tableau *, int, int, int, int, int, int); +int llog(Entier); +Entier mod(Entier,Entier); +void sol_new(int); +void sol_div(void); diff --git a/include/piplib/piplib.h b/include/piplib/piplib.h new file mode 100644 index 0000000..19c4c1c --- /dev/null +++ b/include/piplib/piplib.h @@ -0,0 +1,140 @@ + + /**-------------------------------------------------------------------** + ** PIPLIB ** + **-------------------------------------------------------------------** + ** piplib.h ** + **-------------------------------------------------------------------** + ** Premiere version du 18 septembre 2002 ** + **-------------------------------------------------------------------**/ + + +#if !defined(LINEAR_VALUE_IS_LONGLONG) && !defined(LINEAR_VALUE_IS_INT) +# error Please define LINEAR_VALUE_IS_* or #include polylib32.h or polylib64.h +# endif + +#if defined(LINEAR_VALUE_IS_LONGLONG) +# define Entier long long +# define FORMAT "%lld" +# define UN 1LL +# define ZERO 0LL +#elif defined(LINEAR_VALUE_IS_INT) +# define Entier long int +# define FORMAT "%ld" +# define UN 1L +# define ZERO 0L +#endif + +# include +# include +# include +# include + + +/* Structure PipMatrix : + * Structure de matrice au format PolyLib. Le premier element d'une ligne + * indique quand il vaut 1 que la ligne decrit une inequation de la forme + * p(x)>=0 et quand il vaut 0, que la ligne decrit une egalite de la forme + * p(x)=0. Le dernier element de chaque ligne correspond au coefficient + * constant. + */ +struct pipmatrix +{ unsigned NbRows, NbColumns ; + Entier **p ; + Entier *p_Init ; +} ; +typedef struct pipmatrix PipMatrix ; + + +/* Structure PipVector : + * Cette structure contient un Vector de 'nb_elements' la ieme composante de + * ce vecteur vaut the_vector[i]/the_deno[i]. + */ +struct pipvector +{ int nb_elements ; /* Nombre d'elements du vecteur. */ + Entier * the_vector ; /* Numerateurs du vecteur. */ + Entier * the_deno ; /* Denominateurs du vecteur. */ +} ; +typedef struct pipvector PipVector ; + + +/* Structure PipNewparm : + * Liste chainee de Newparm, les informations d'un newparm etant son rang, un + * vecteur de coefficients et un denominateur. Le newparm est egal a la division + * du vecteur par le denominateur. + */ +struct pipnewparm +{ int rank ; /* Rang du 'newparm'. */ + PipVector * vector ; /* Le vector decrivant le newparm. */ + Entier deno ; /* Denominateur du 'newparm'. */ + struct pipnewparm * next ; /* Pointeur vers le newparm suivant. */ +} ; +typedef struct pipnewparm PipNewparm ; + + +/* Structure PipList : + * Liste chainee de Vector. + */ +struct piplist +{ PipVector * vector ; /* Le vector contenant la partie de solution. */ + struct piplist * next ; /* Pointeur vers l'element suivant. */ +} ; +typedef struct piplist PipList ; + + +/* Structure pipquast : + * Arbre binaire. Conformement a la grammaire de sortie (voir mode d'emploi), un + * noeud de l'arbre des solutions debute par une liste de 'newparm'. Il continue + * ensuite soit par une 'list' (alors condition vaut null), soit par un 'if' + * (alors le champ condition contient la condition). + */ +struct pipquast +{ PipNewparm * newparm ; /* Les 'newparm'. */ + PipList * list ; /* La 'list' si pas de 'if'. */ + PipVector * condition ; /* La condition si 'if'. */ + struct pipquast * next_then ; /* Noeud si condition et si verifiee. */ + struct pipquast * next_else ; /* Noeud si condition et si non verifiee. */ + struct pipquast * father ; /* Pointeur vers le quast pere. */ +} ; +typedef struct pipquast PipQuast ; + + +/* Prototypes des fonctions d'affichages des structures de la PipLib. */ +void pip_matrix_print(FILE *, PipMatrix *) ; +void pip_vector_print(FILE *, PipVector *) ; +void pip_newparm_print(FILE * foo, PipNewparm *, int indent) ; +void pip_list_print(FILE * foo, PipList *, int indent) ; +void pip_quast_print(FILE *, PipQuast *, int) ; + + +/* Prototypes des fonctions de liberation memoire des structures de la PipLib.*/ +void pip_matrix_free(PipMatrix *) ; +void pip_vector_free(PipVector *) ; +void pip_newparm_free(PipNewparm *) ; +void pip_list_free(PipList *) ; +void pip_quast_free(PipQuast *) ; + + +/* Prototypes des fonctions d'acquisition de matrices de contraintes.*/ +PipMatrix * pip_matrix_alloc(unsigned, unsigned) ; +PipMatrix * pip_matrix_read(FILE *) ; + + +/* Prototype de la fonction de resolution : + * pip_solve resoud le probleme qu'on lui passe en parametre, suivant les + * options elles aussi en parametre. Elle renvoie la solution sous forme + * d'un arbre de PipQuast. Parametres : + * - probleme : + * 1 PipMatrix : systeme des inequations definissant le domaine des inconnues, + * 2 PipMatrix : systeme des inequations satisfaites par les parametres, + * 3 int : Bg le bignum, + * - options : + * 4 int : Nq pour savoir si on cherche une solution entiere. + * 5 int : Verbose pour savoir si on veut creer un fichier de tracage. + * 6 int : Simplify pour demander a Pip de simplifier sa solution. + * 7 int : Max encore inutilise, doit etre mis a 0. + */ +PipQuast * pip_solve(PipMatrix *, PipMatrix *, int, int, int, int, int) ; + +/* Ced : ajouts specifiques a la PipLib pour funcall. */ +Tableau * tab_Matrix2Tableau(PipMatrix *, int, int, int) ; +PipQuast * sol_quast_edit(int *, PipQuast *) ; diff --git a/include/piplib/piplib32.h b/include/piplib/piplib32.h new file mode 100644 index 0000000..b63e359 --- /dev/null +++ b/include/piplib/piplib32.h @@ -0,0 +1,15 @@ + + /**-------------------------------------------------------------------** + ** PIPLIB32 ** + **-------------------------------------------------------------------** + ** piplib32.h ** + **-------------------------------------------------------------------** + ** Premiere version du 29 juillet 2001 ** + **-------------------------------------------------------------------**/ + +/* Ce fichier d'inclusions regroupe tout les elements accessibles aux + * utilisateurs de la PipLib. + */ + +# define LINEAR_VALUE_IS_INT +# include diff --git a/include/piplib/piplib64.h b/include/piplib/piplib64.h new file mode 100644 index 0000000..5be5572 --- /dev/null +++ b/include/piplib/piplib64.h @@ -0,0 +1,15 @@ + + /**-------------------------------------------------------------------** + ** PIPLIB64 ** + **-------------------------------------------------------------------** + ** piplib64.h ** + **-------------------------------------------------------------------** + ** Premiere version du 29 juillet 2001 ** + **-------------------------------------------------------------------**/ + +/* Ce fichier d'inclusions regroupe tout les elements accessibles aux + * utilisateurs de la PipLib. + */ + +# define LINEAR_VALUE_IS_LONGLONG +# include diff --git a/include/piplib/sol.h b/include/piplib/sol.h new file mode 100644 index 0000000..a0a7b37 --- /dev/null +++ b/include/piplib/sol.h @@ -0,0 +1,22 @@ +/*--------------------------------------------------------------------*/ +/* S O L . H */ +/* */ +/* Copyright Paul Feautrier, 1988, 1993, 1994, 1996 */ +/* This file is part of the PIP software */ +/* PIP is NOT public domain. It can be */ +/* used freely for research and teaching */ +/* but NOT for commercial advantage. */ +/*--------------------------------------------------------------------*/ + +void sol_init(); +int sol_hwm(); +void sol_reset(); +void sol_nil(); +void sol_if(); +void sol_list(); +void sol_form(); +void sol_new(); +void sol_div(); +void sol_val(); +int sol_edit(); +int is_not_Nil(); diff --git a/include/piplib/tab.h b/include/piplib/tab.h new file mode 100644 index 0000000..61e9888 --- /dev/null +++ b/include/piplib/tab.h @@ -0,0 +1,51 @@ +/*--------------------------------------------------------------------*/ +/* T A B . H */ +/* */ +/* Copyright Paul Feautrier, 1988, 1993, 1994 */ +/* This file is part of the PIP software */ +/* PIP is NOT public domain. It can be */ +/* used freely for research and teaching */ +/* but NOT for commercial advantage. */ +/*--------------------------------------------------------------------*/ +struct A + {struct A *precedent; + char *bout; + }; + +struct L + {int flags; + Entier d; + float size; + union { int unit; + Entier * val; + } objet; + }; + +struct high_water_mark { + int chunk; + void * top; + }; + +#define Unit 1 +#define Plus 2 +#define Minus 4 +#define Zero 8 +#define Critic 16 +#define Unknown 32 + +#define Sign 62 + +#define Index(p,i,j) (p)->row[i].objet.val[j] +#define Flag(p,i) (p)->row[i].flags +#define Denom(p,i) (p)->row[i].d +#define MAX_DETERMINANT 4 + +struct T + {int height, width; + Entier determinant[MAX_DETERMINANT]; + int l_determinant; + struct L row[1]; + }; + +typedef struct T Tableau; + diff --git a/include/piplib/type.h b/include/piplib/type.h new file mode 100644 index 0000000..12193dd --- /dev/null +++ b/include/piplib/type.h @@ -0,0 +1,25 @@ +/*--------------------------------------------------------------------*/ +/* T Y P E . H */ +/* */ +/* Copyright Paul Feautrier, 1988, 1993, 1994 */ +/* This file is part of the PIP software */ +/* PIP is NOT public domain. It can be */ +/* used freely for research and teaching */ +/* but NOT for commercial advantage. */ +/*--------------------------------------------------------------------*/ + +#define SOL_SIZE 4096 + +#define True 1 +#define False 0 + + +#ifdef TC +#define DEBUG 8 +#endif + +#define Q if(cross_product>=limit) + +#define MAXCOL 512 +#define MAXPARM 50 + diff --git a/source/integrer.c b/source/integrer.c new file mode 100644 index 0000000..e905041 --- /dev/null +++ b/source/integrer.c @@ -0,0 +1,293 @@ +/****************************************************************************** + * PIP : Parametric Integer Programming * + ****************************************************************************** + * * + * Copyright Paul Feautrier, 1988, 1993, 1994, 1996 * + * * + * This is free software; you can 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 software is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * + * for more details. * + * * + * You should have received a copy of the GNU General Public License along * + * with software; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * + * * + * Written by Paul Feautrier * + * * + ******************************************************************************/ + +#include +#include + +#include + +/* The routines in this file are used to build a Gomory cut from + a non-integral row of the problem tableau */ + +extern long int cross_product, limit; +extern int verbose; +extern FILE * dump; + +/* mod(x,y) computes the remainder of x when divided by y. The difference + with x%y is that the result is guaranteed to be positive, which is not + always true for x%y */ + +Entier mod(x, y) +Entier x, y; +{Entier r; + r = x % y; + if(r<0) r += y; + return(r); +} + +/* this routine is useless at present */ + +int non_borne(tp, nvar, D, bigparm) +Tableau *tp; +int nvar, bigparm; +Entier D; +{int i, ff; + for(i = 0; i 0) + {if(ff & Unit)return(True); + if(Index(tp, i, bigparm) != D) return(True); + } + } + return(False); +} + +Tableau *expanser(); + +/* integrer(.....) add a cut to the problem tableau, or return 0 when an + integral solution has been found, or -1 when no integral solution + exists. + + Since integrer may add rows and columns to the problem tableau, its + arguments are pointers rather than values. If a cut is constructed, + ni increases by 1. If the cut is parametric, nparm increases by 1 and + nc increases by 2. + */ + +int integrer(ptp, pcontext, D, pnvar, pnparm, pni, pnc) +Tableau **ptp, **pcontext; +int *pnvar, *pnparm, *pni, *pnc; +Entier D; +{int ncol = *pnvar+*pnparm+1; + int nligne = *pnvar + *pni; + int nparm = *pnparm; + int nvar = *pnvar; + int ni = *pni; + int nc = *pnc; + Entier coupure[MAXCOL]; + int i, j, k, ff; + Entier x, d; + int ok_var, ok_const, ok_parm; + Entier discrp[MAXPARM], discrm[MAXPARM]; + int llog(); + + if(ncol+1 >= MAXCOL) { + fprintf(stderr, "Too much variables : %d\n", ncol); + exit(3); + } + +/* search for a non-integral row */ + for(i = 0; i 0) ok_var = True; + } +/* Done for the coefficient of the variables. */ + + x = coupure[nvar] = - mod(-Index(*ptp, i, nvar), D); + ok_const = (x != 0); +/* This is the constant term */ + ok_parm = False; + for(j = nvar+1; j> part is not divisible + by D then bottom else .... + F T T + T F F (a) continue, integral row + T F T (d) constant cut + T T F + (e) parametric cut + T T T + + case (a) */ + + if(!ok_parm && !ok_const) continue; + if(!ok_parm) + if(ok_var) { /* case (d) */ + if(nligne >= (*ptp)->height) { + int d, dth, dtw; + d = llog(D); + dth = d; + *ptp = expanser(*ptp, nvar, ni, ncol, 0, dth, 0); + } + /* The cut has a negative <> part */ + Flag(*ptp, nligne) = Minus; + Denom(*ptp, nligne) = D; + /* Insert the cut */ + for(j = 0; j= 0. */ + + + if(nparm >= MAXPARM) { + fprintf(stderr, "Too much parameters : %d\n", *pnparm); + exit(4); + } +/* Build the definition of the new parameter into the solution : + p_{nparm} = -(sum_{j=0}^{nparm-1} c_{nvar + 1 + j} p_j + + c_{nvar})/D (3) + The minus sign is there to compensate the one in (1) */ + + sol_new(nparm); + sol_div(); + sol_forme(nparm+1); + for(j = 0; j (*pcontext)->height || nparm+1 > (*pcontext)->width) { + int dcw, dch; + dcw = llog(D); + dch = 2 * dcw + *pni; + *pcontext = expanser(*pcontext, 0, nc, nparm+1, 0, dch, dcw); + } + /* Flag(*pcontext, *pnc) = 0; Probably useless see line A */ + +/* Since a new parameter is to be added, the constant term has to be moved + right and a zero has to be inserted in all rows of the old context */ + + for(k = 0; k < nc; k++) { + Index(*pcontext, k, nparm+1) = Index(*pcontext, k, nparm); + Index(*pcontext, k, nparm) = 0; + } +/* Now, insert the new rows */ + + for(j = 0; j <= nparm+1; j++) { + Index(*pcontext, nc, j) = discrp[j]; + Index(*pcontext, nc+1, j) = discrm[j]; + } + Flag(*pcontext, nc) = Unknown; /* A */ + Denom(*pcontext, nc) = UN; + Flag(*pcontext, nc+1) = Unknown; + Denom(*pcontext, nc+1) = UN; + (*pnparm)++; + (*pnc) += 2; + /* end of the construction of the new parameter */ + + if(ok_var) { /* case (e) */ + if(nligne >= (*ptp)->height || ncol >= (*ptp)->width) { + int d, dth, dtw; + d = llog(D); + dth = d + ni; + dtw = d; + *ptp = expanser(*ptp, nvar, ni, ncol, 0, dth, dtw); + } + /* Zeroing out the new column seems to be useless + since <> does it anyway */ + + /* The cut has a negative <> part */ + Flag(*ptp, nligne) = Minus; + Denom(*ptp, nligne) = D; + /* Insert the cut */ + for(j = 0; j= (*ptp)-> width) { + int dtw; + dtw = llog(D); + *ptp = expanser(*ptp, *pnvar, *pni, ncol, 0, 0, dtw); + } + /* The new column is zeroed out by <> */ +/* Let c be the coefficient of parameter p in the i row. In <>, + this parameter has coefficient - mod(-c, D). In <>, this same + parameter has coefficient mod(-c, D). The sum c + mod(-c, D) is obviously + divisible by D. */ + + for (j = 0; j <= nparm; j++) + Index(*ptp, i, j + nvar + 1) += discrp[j]; + tab_display(*ptp, stderr); + exit(0); + continue; + } + /* The solution is integral. */ + return 0; +} + diff --git a/source/maind.c b/source/maind.c new file mode 100644 index 0000000..8a493d4 --- /dev/null +++ b/source/maind.c @@ -0,0 +1,258 @@ +/****************************************************************************** + * PIP : Parametric Integer Programming * + ****************************************************************************** + * * + * Copyright Paul Feautrier, 1988, 1993, 1994, 1996 * + * * + * This is free software; you can 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 software is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * + * for more details. * + * * + * You should have received a copy of the GNU General Public License along * + * with software; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * + * * + * Written by Paul Feautrier * + * * + ******************************************************************************/ + +#include +#include +#include +#include +#include +#ifdef __TURBOC__ +#include +#endif +#define min(x,y) ((x) < (y)? (x) : (y)) + +#include + +#ifdef UNIX +#include +struct tms chrono; +#endif + +char version[]="Version E.2\n"; + +long int cross_product, limit; +int allocation, comptage; +int verbose = 0; +int profondeur = 0; +int compa_count; + +FILE *dump = NULL; +char dump_name[] = "XXXXXX"; + +#define INLENGTH 1024 + +char inbuff[INLENGTH]; +int inptr = 256; +int proviso = 0; + + +int dgetc(FILE *foo) +{ + char *p; + if(inptr >= proviso) + {p = fgets(inbuff, INLENGTH, foo); + if(p == NULL) return EOF; + proviso = min(INLENGTH, strlen(inbuff)); + inptr = 0; + if(verbose > 0) fprintf(dump, "-- %s", inbuff); + } + return inbuff[inptr++]; +} + +int dscanf(FILE *foo, char *format, Entier *val) +{ + char * p; + int c; + for(;inptr < proviso; inptr++) + if(inbuff[inptr] != ' ' && inbuff[inptr] != '\n' && inbuff[inptr] != '\t') + break; + while(inptr >= proviso) + {p = fgets(inbuff, 256, foo); + if(p == NULL) return EOF; + proviso = strlen(inbuff); + if(verbose > 0) { + fprintf(dump, ".. %s", inbuff); + fflush(dump); + } + for(inptr = 0; inptr < proviso; inptr++) + if(inbuff[inptr] != ' ' + && inbuff[inptr] != '\n' + && inbuff[inptr] != '\t') break; + } + if(sscanf(inbuff+inptr, FORMAT, val) != 1) return -1; + + for(; inptr < proviso; inptr++) + if((c = inbuff[inptr]) != '-' && !isdigit(c)) break; + return 0; +} + +void balance(FILE *foo, FILE *bar) +{ + int level = 0; + int c; + while((c = dgetc(foo)) != EOF) + { + switch(c) + {case '(' : level++; break; + case ')' : if(--level == 0) return; + } + putc(c, bar); + } +} + +void escape(FILE *foo, FILE *bar, int level) +{int c; + while((c = dgetc(foo)) != EOF) + switch(c) + {case '(' : level ++; break; + case ')' : if(--level == 0) + { fprintf(bar, "\nSyntax error\n)\n"); + return; + } + } +} + +char * getenv(); + +int main(int argc, char *argv[]) + +{ + FILE *in, *out; + Tableau *ineq, *context, *ctxt; + int nvar, nparm, ni, nc, bigparm; + int nq; char * g; + int simple = 0; + struct high_water_mark hq; + int c, non_vide; + int p, q, xq; + long temps; + char *date; + Entier D, x; + + in = stdin; out = stdout; + p = 1; + if(argc > 1) + if(strcmp(argv[1], "-s") == 0) + {verbose = -1; + p = 2; + } + else if(strcmp(argv[1], "-v") == 0) + {verbose = 1; + p = 2; + g = getenv("DEBUG"); + if(g && *g) + {dump = fopen(g, "w"); + if(dump == NULL) + {fprintf(stderr, "%s unaccessible\n", g); + verbose = 0; + } + } + else + { + mkstemp(dump_name); + dump = fopen(dump_name, "w"); + } + } + if(verbose >= 0) fprintf(stderr, version); + if(argc > p) + if(strcmp(argv[p], "-z") == 0) { + simple = 1; + p++; + } + if(argc>p) + {in = fopen(argv[p], "r"); + if(in == NULL) + {fprintf(stderr, "%s unaccessible\n", argv[p]); + exit(1); + } + } + p++; + if(argc>p) + {out = fopen(argv[p], "w"); + if(out == NULL) + {fprintf(stderr, "%s unaccessible\n", argv[p]); + exit(2); + } + } + limit = 0L; + p++; + if(argc > p) limit = atol(argv[p]); + sol_init(); + tab_init(); + while((c = dgetc(in)) != EOF) + {if(c != '(') continue; + fprintf(out, "("); + balance(in, out); + if(dscanf(in, FORMAT, &x) < 0){escape(in, out, 1); continue;} + else nvar = (int) x; + if(dscanf(in, FORMAT, &x) < 0){escape(in, out, 1); continue; } + else nparm = (int) x; + if(dscanf(in, FORMAT, &x) < 0){escape(in, out, 1); continue; } + else ni = (int) x; + if(dscanf(in, FORMAT, &x) < 0){escape(in, out, 1); continue; } + else nc = (int) x; + if(dscanf(in, FORMAT, &x) < 0){escape(in, out, 1); continue; } + else bigparm = (int) x; + if(dscanf(in, FORMAT, &x) < 0){escape(in, out, 1); continue; } + else nq = (int) x; + if(verbose > 0) {fprintf(dump, "%d %d %d %d %d %d\n",nvar, nparm, ni, nc, + bigparm, nq); + fflush(dump); + } + cross_product = 0; + hq = tab_hwm(); + if(verbose > 0) {fprintf(dump, "hwm %x\n", g); + fflush(dump); + } + ineq = tab_get(in, ni, nvar+nparm+1, nvar); + if(ineq == NULL){escape(in, out, 2); continue;} + context = tab_get(in, nc, nparm+1, 0); + if(ineq == NULL){escape(in, out, 2); continue;} + xq = p = sol_hwm(); +/* verification de la non-vacuite' du contexte */ + if(nc) + {ctxt = expanser(context, nparm, nc, nparm+1, nparm, 0, 0); + traiter(ctxt, NULL, True, UN, nparm, 0, nc, 0, -1); + non_vide = is_not_Nil(p); + sol_reset(p); + } + else non_vide = True; + if(non_vide) { + compa_count = 0; + D = traiter(ineq, context, nq, UN, nvar, nparm, ni, nc, bigparm); + putc(' ',out); + fprintf(out, FORMAT, D); + fputs(" )",out); + if(simple) sol_simplify(xq); + q = sol_hwm(); + while((xq = sol_edit(out, xq)) != q); + sol_reset(p); + } + else fprintf(out, "void\n"); + tab_reset(hq); + if(verbose > 0) fflush(dump); + fprintf(out, ")\n"); + fflush(out); + if(verbose >= 0) fprintf(stderr,"cross : %ld, alloc : %d, compa : %d\n\r", + cross_product, allocation, compa_count); + comptage++; + } +#ifdef UNIX + times(& chrono); + fprintf(stderr, "n %d u %d''' s %d'''\r\n", + comptage, chrono.tms_utime, chrono.tms_stime); +#endif + exit(0); +} + diff --git a/source/piplib.c b/source/piplib.c new file mode 100644 index 0000000..fe0dd96 --- /dev/null +++ b/source/piplib.c @@ -0,0 +1,549 @@ + + /**-------------------------------------------------------------------** + ** PIPLIB ** + **-------------------------------------------------------------------** + ** piplib.c ** + **-------------------------------------------------------------------** + ** Premiere version du 30 juillet 2001 ** + **-------------------------------------------------------------------**/ + + +/****************************************************************************** + * PIP : Parametric Integer Programming * + ****************************************************************************** + * * + * Copyright Paul Feautrier, 1988, 1993, 1994, 1996 * + * * + * This is free software; you can 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 software is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * + * for more details. * + * * + * You should have received a copy of the GNU General Public License along * + * with software; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * + * * + * Written by Cedric Bastoul * + * * + ******************************************************************************/ + + +# include +# include +# include + +#include + +extern long int cross_product, limit ; +extern int verbose ; +extern FILE * dump ; +extern int compa_count ; +extern char dump_name[] ; + + +/****************************************************************************** + * Fonctions d'affichage des structures * + ******************************************************************************/ + + +/* Fonction pip_matrix_print : + * Cette fonction se charge d'imprimer sur le flux 'foo' les informations + * que contient la structure de type PipMatrix qu'elle recoit en parametre. + * Premiere version : Ced. 29 juillet 2001. + */ +void pip_matrix_print(FILE * foo, PipMatrix * Mat) +{ Entier * p; + int i, j ; + unsigned NbRows, NbColumns ; + + fprintf(foo,"%d %d\n", NbRows=Mat->NbRows, NbColumns=Mat->NbColumns) ; + for (i=0;ip+i) ; + for (j=0;jnb_elements;i++) + { fprintf(foo," ") ; + fprintf(foo,FORMAT,vector->the_vector[i]) ; + if (vector->the_deno[i] != UN) + { fprintf(foo,"/") ; + fprintf(foo,FORMAT,vector->the_deno[i]) ; + } + } + fprintf(foo,"]") ; + } +} + + +/* Fonction pip_newparm_print : + * Cette fonction se charge d'imprimer sur le flux 'foo' les informations + * que contient la structure de type PipNewparm qu'elle recoit en parametre. + * Le parametre indent est le nombre d'espaces blancs en debut de chaque + * ligne avant indentation. Une valeur negative de indent signifie qu'on ne + * desire pas d'indentation. + * Premiere version : Ced. 18 octobre 2001. + */ +void pip_newparm_print(FILE * foo, PipNewparm * newparm, int indent) +{ int i ; + + if (newparm != NULL) + { do + { for (i=0;irank) ; + fprintf(foo," (div ") ; + pip_vector_print(foo,newparm->vector) ; + fprintf(foo," ") ; + fprintf(foo,FORMAT,newparm->deno) ; + fprintf(foo,"))\n") ; + } + while ((newparm = newparm->next) != NULL) ; + } +} + + +/* Fonction pip_list_print : + * Cette fonction se charge d'imprimer sur le flux 'foo' les informations + * que contient la structure de type PipList qu'elle recoit en parametre. + * Le parametre indent est le nombre d'espaces blancs en debut de chaque + * ligne avant indentation. Une valeur negative de indent signifie qu'on ne + * desire pas d'indentation. + * Premiere version : Ced. 18 octobre 2001. + */ +void pip_list_print(FILE * foo, PipList * list, int indent) +{ int i ; + + if (list == NULL) + { for (i=0;ivector) ; + fprintf(foo,"\n") ; + } + while ((list = list->next) != NULL) ; + for (i=0;inewparm,indent) ; + if (solution->condition == NULL) + pip_list_print(foo,solution->list,indent) ; + else + { for (i=0;icondition) ; + fprintf(foo,"\n") ; + if (indent>=0) /* Indent. */ + { pip_quast_print(foo,solution->next_then,indent+1) ; + pip_quast_print(foo,solution->next_else,indent+1) ; + } + else + { pip_quast_print(foo,solution->next_then,indent) ; + pip_quast_print(foo,solution->next_else,indent) ; + } + for (i=0;ip_Init) ; + free(matrix->p) ; + free(matrix) ; + } +} + + +/* Fonction pip_vector_free : + * Cette fonction libere la memoire reservee a la structure de type PipVector + * que pointe son parametre. + * 20 juillet 2001 : Premiere version, Ced. + * 18 octobre 2001 : simplification suite a l'eclatement de PipVector. + */ +void pip_vector_free(PipVector * vector) +{ free(vector->the_vector) ; + free(vector->the_deno) ; + free(vector) ; +} + + +/* Fonction pip_newparm_free : + * Cette fonction libere la memoire reservee a la structure de type PipNewparm + * que pointe son parametre. Sont liberes aussi tous les elements de la + * liste chainee dont il pouvait etre le depart. + * Premiere version : Ced. 18 octobre 2001. + */ +void pip_newparm_free(PipNewparm * newparm) +{ PipNewparm * next ; + + while (newparm != NULL) + { next = newparm->next ; + pip_vector_free(newparm->vector) ; + free(newparm) ; + newparm = next ; + } +} + + +/* Fonction pip_list_free : + * Cette fonction libere la memoire reservee a la structure de type PipList + * que pointe son parametre. Sont liberes aussi tous les elements de la + * liste chainee dont il pouvait etre le depart. + * Premiere version : Ced. 18 octobre 2001. + */ +void pip_list_free(PipList * list) +{ PipList * next ; + + while (list != NULL) + { next = list->next ; + pip_vector_free(list->vector) ; + free(list) ; + list = next ; + } +} + + +/* Fonction pip_quast_free : + * Cette fonction libere la memoire reservee a la structure de type + * PipSolution que pointe son parametre. Sont liberees aussi toutes les + * differentes listes chainees qui pouvaient en partir. + * 20 juillet 2001 : Premiere version, Ced. + * 18 octobre 2001 : simplification suite a l'eclatement de PipVector. + */ +void pip_quast_free(PipQuast * solution) +{ if (solution != NULL) + { if (solution->newparm != NULL) + pip_newparm_free(solution->newparm) ; + + if (solution->list != NULL) + pip_list_free(solution->list) ; + + if (solution->condition != NULL) + { pip_vector_free(solution->condition) ; + pip_quast_free(solution->next_then) ; + pip_quast_free(solution->next_else) ; + } + free(solution) ; + } +} + + +/****************************************************************************** + * Fonctions d'acquisition de matrices * + ******************************************************************************/ + + +/* Fonction pip_matrix_alloc : + * Fonction (tres) modifiee de Matrix_Alloc de la polylib. Elle alloue l'espace + * memoire necessaire pour recevoir le contenu d'une matrice de NbRows lignes + * et de NbColumns colonnes, et initialise les valeurs a 0. Elle retourne un + * pointeur sur l'espace memoire alloue. + * Premiere version : Ced. 18 octobre 2001. + */ +PipMatrix * pip_matrix_alloc(unsigned NbRows, unsigned NbColumns) +{ PipMatrix * matrix ; + Entier ** p, * q ; + int i, j ; + + matrix = (PipMatrix *)malloc(sizeof(PipMatrix)) ; + if (matrix == NULL) + { fprintf(stderr, "Memory Overflow.\n") ; + exit(1) ; + } + matrix->NbRows = NbRows ; + matrix->NbColumns = NbColumns ; + if (NbRows == 0) + { matrix->p = NULL ; + matrix->p_Init= NULL ; + } + else + { if (NbColumns == 0) + { matrix->p = NULL ; + matrix->p_Init = NULL ; + } + else + { p = (Entier **)malloc(NbRows*sizeof(Entier *)) ; + if (p == NULL) + { fprintf(stderr, "Memory Overflow.\n") ; + exit(1) ; + } + q = (Entier *)malloc(NbRows * NbColumns * sizeof(Entier)) ; + if (q == NULL) + { fprintf(stderr, "Memory Overflow.\n") ; + exit(1) ; + } + matrix->p = p ; + matrix->p_Init = q ; + for (i=0;ip_Init ; + for (i=0;iNbRows;i++) + { do + { c = fgets(s,1024,foo) ; + while (isspace(*c) && (*c != '\n')) + c++ ; + } + while (c != NULL && (*c == '#' || *c == '\n')); + + if (c == NULL) + { fprintf(stderr, "Not enough rows.\n") ; + exit(1) ; + } + for (j=0;jNbColumns;j++) + { if (c == NULL || *c == '#' || *c == '\n') + { fprintf(stderr, "Not enough columns.\n") ; + exit(1) ; + } + /* NdCed : Dans le n ca met strlen(str). */ + if (sscanf(c,"%s%n",str,&n) == 0) + { fprintf(stderr, "Not enough rows.\n") ; + exit(1) ; + } + sscanf(str,FORMAT,p++) ; /* Attention dans le cas multiple precision ! */ + c += n ; + } + } + return matrix ; +} + + +/****************************************************************************** + * Fonction de resolution * + ******************************************************************************/ + + +/* Fonction pip_solve : + * Cette fonction fait un appel a Pip pour la resolution d'un probleme. Le + * probleme est fourni dans les arguments. Deux matrices de la forme de celles + * utilisees dans la Polylib forment les systemes d'equations/inequations : + * un pour les inconnues, l'autre pour les parametres. Bg est le 'bignum', Nq + * est un booleen renseignant si on cherche une solution entiere (vrai=1) ou + * non (faux=0). Verbose est un booleen permettant de rendre Pip bavard + * (Verbose a vrai=1), il imprimera alors la plupart de ses traitements dans le + * fichier dont le nom est dans la variable d'environnement DEBUG, ou si DEBUG + * n'est pas placee, dans un nouveau fichier de nom genere par mkstemp, si + * Verbose est a faux=0, Pip restera muet. Simplify est un booleen permettant + * de demander a Pip de simplifier sa solution (en eliminant les formes de type + * 'if #[...] () ()') quand il est a vrai=1, ou non quand il est a faux=0. Max + * n'est pas encore utilise et doit etre mis a 0. Cette fonction retourne la + * solution sous la forme d'un arbre de structures PipQuast. + * 30 juillet 2001 : Premiere version, Ced. + * 18 octobre 2001 : suppression de l'argument Np, le nombre de parametres. Il + * est a present deduit de ineqpar. Si ineqpar vaut NULL, + * c'est que Np vaut 0. S'il y a des parametres mais pas de + * contraintes dessus, ineqpar sera une matrice de 0 lignes + * mais du bon nombre de colonnes (Np + 2). + */ +PipQuast * pip_solve(inequnk, ineqpar, Bg, Nq, Verbose, Simplify, Max) +PipMatrix * inequnk, * ineqpar ; +int Bg, Nq, Verbose, Simplify, Max ; +{ Tableau * ineq, * context, * ctxt ; + int i, Np, Nn, Nl, Nm, p, q, xq, non_vide ; + char * g ; + struct high_water_mark hq ; + Entier D, x ; + PipQuast * solution ; + + /* initialisations diverses : + * - la valeur de Verbose est placee dans sa variable globale. Dans le cas + * ou on doit etre en mode verbose, on ouvre le fichier dans lequel + * ecrire les tracages. Si la variable d'environnement DEBUG est placee, + * on ecrira dans le nom de fichier correspondant, sinon, dans un nouveau + * fichier de nom genere par mkstemp, + * - limit est mis au 0 long int (sa valeur par defaut dans Pip original), + * - on lance les initialisations pour tab et sol (autres mises en place + * de variables globales). + */ + verbose = Verbose ; + if (verbose) + { g = getenv("DEBUG") ; + if(g && *g) + { dump = fopen(g, "w") ; + if(dump == NULL) + { fprintf(stderr,"%s unaccessible\n",g) ; + verbose = 0 ; + } + } + else + { mkstemp(dump_name) ; + dump = fopen(dump_name, "w") ; + } + } + limit = ZERO ; + sol_init() ; + tab_init() ; + + /* Si inequnk est NULL, la solution est automatiquement void (NULL). */ + if (inequnk != NULL) + { /* Np vaut 0 si ineqpar vaut NULL, ineqpar->NbColumns - 2 sinon (on a -1 + * pour la constante et -1 pour le marqueur d'egalite/inegalite = -2). + */ + Np = (ineqpar == NULL) ? 0 : ineqpar->NbColumns - 2 ; + /* Calcul du nombre d'inconnues du probleme. Comme les matrices d'entree + * sont sous la forme de la polylib. + */ + Nn = inequnk->NbColumns - Np - 2 ; + /* Calcul du nombre d'inequations du probleme. Le format de matrice de la + * polylib permet les egalites, on doit donc les compter double quand il + * y en a. + */ + Nl = inequnk->NbRows ; + for (i=0;iNbRows;i++) + if (**(inequnk->p + i) == 0) + Nl ++ ; + + /* On prend les 'marques' de debut de traitement. */ + cross_product = 0 ; + hq = tab_hwm() ; + xq = p = sol_hwm(); + + /* On s'assure d'abord que le systeme pour le contexte n'est pas vide + * avant de commencer le traitement. Si c'est le cas, la solution est + * void (NULL). + */ + if (ineqpar != NULL) + { Nm = ineqpar->NbRows ; + for (i=0;iNbRows;i++) + if (**(ineqpar->p + i) == 0) + Nm ++ ; + + context = tab_Matrix2Tableau(ineqpar,Nm,Np,0) ; + if (Nm) + { /* Traduction du format de matrice de la polylib vers celui de + * traitement de Pip. Puis traitement proprement dit. + */ + ctxt = expanser(context, Np, Nm, Np+1, Np, 0, 0) ; + traiter(ctxt, NULL, True, UN, Np, 0, Nm, 0, -1) ; + non_vide = is_not_Nil(p) ; + sol_reset(p) ; + } + else + non_vide = True ; + } + else + { Nm = 0 ; + context = NULL ; /* ATTENTION, en toute rigueur on devrait faire un + * tab_Matrix2Tableau d'une matrice 0*0. + */ + non_vide = True ; + } + + if (verbose) + fprintf(dump, "%d %d %d %d %d %d\n",Nn, Np, Nl, Nm, Bg, Nq) ; + + /* S'il est possible de trouver une solution, on passe au traitement. */ + if (non_vide) + { ineq = tab_Matrix2Tableau(inequnk,Nl,Nn,Nn) ; + compa_count = 0 ; + D = traiter(ineq, context, Nq, UN, Nn, Np, Nl, Nm, Bg) ; + + if (Simplify) + sol_simplify(xq) ; + q = sol_hwm() ; + /* On traduit la solution du format de solution de Pip vers un arbre + * de structures de type PipQuast. + */ + solution = sol_quast_edit(&xq,NULL) ; + sol_reset(p) ; + } + else + return NULL ; + tab_reset(hq) ; + } + else + return NULL ; + + return(solution) ; +} diff --git a/source/sol.c b/source/sol.c new file mode 100644 index 0000000..86dc8ef --- /dev/null +++ b/source/sol.c @@ -0,0 +1,638 @@ +/****************************************************************************** + * PIP : Parametric Integer Programming * + ****************************************************************************** + * * + * Copyright Paul Feautrier, 1988, 1993, 1994, 1996 * + * * + * This is free software; you can 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 software is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * + * for more details. * + * * + * You should have received a copy of the GNU General Public License along * + * with software; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * + * * + * Written by Paul Feautrier and Cedric Bastoul * + * * + ******************************************************************************/ + +#include +#include +#include + +#include + +extern long int cross_product, limit; +extern int verbose; +extern FILE *dump; + +struct S + {int flags; + Entier param1, param2; + }; + +#define Free 0 +#define Nil 1 +#define If 2 +#define List 3 +#define Form 4 +#define New 5 +#define Div 6 +#define Val 7 +#define Error 8 + +struct S sol_space[SOL_SIZE]; +static int sol_free; + +Entier mod(Entier, Entier); + +Entier pgcd(Entier x, Entier y) +{Entier r; + while(y) + {r = mod(x, y); + x = y; + y = r; + } + return(x>= 0? x : -x); +} + +void sol_init(void) +{ + sol_free = 0; +} + +int sol_hwm() +{ + return(sol_free); +} + +void sol_reset(p) +int p; +{ + if(p<0 || p>=SOL_SIZE) + {fprintf(stderr, "Syserr : sol_reset : Memory allocation error\n"); + exit(40); + } + sol_free = p; +} + +struct S *sol_alloc(void) +{struct S *r; + r = sol_space + sol_free; + r->flags = Free; + r->param1 = r->param2 = 0; + sol_free++; + if(sol_free >= SOL_SIZE) + {fprintf(stderr, "The solution is too complex! : sol\n"); + exit(26); + } + return(r); +} + +void sol_nil(void) +{ + struct S * r; + r = sol_alloc(); + r -> flags = Nil; + if(verbose > 0) + {fprintf(dump, "\nNil"); + fflush(dump); + } +} + +void sol_error(int c) +{ + struct S *r; + r = sol_alloc(); + r->flags = Nil; + r->param1 = c; + if(verbose > 0) { + fprintf(dump, "Erreur %d\n", c); + fflush(dump); + } +} + +int is_not_Nil(p) +int p; +{ + return(sol_space[p].flags != Nil); +} + +void sol_if(void) +{ + struct S *r; + r = sol_alloc(); + r -> flags = If; + if(verbose > 0) { + fprintf(dump, "\nIf "); + fflush(dump); + } +} + +void sol_list(n) +int n; +{struct S * r; + r = sol_alloc(); + r->flags = List; + r->param1 = n; + if(verbose > 0) { + fprintf(dump, "\nList %d ", n); + fflush(dump); +} +} + +void sol_forme(l) +int l; +{ + struct S *r; + r = sol_alloc(); + r -> flags = Form; + r -> param1 = l; + if(verbose > 0) { + fprintf(dump, "\nForme %d ", l); + fflush(dump); + } +} + +void sol_new(k) +int k; +{ + struct S *r; + r = sol_alloc(); + r -> flags = New; + r -> param1 = k; + if(verbose > 0) { + fprintf(dump, "New %d ", k); + fflush(dump); + } +} + +void sol_div() +{ + struct S *r; + r = sol_alloc(); + r -> flags = Div; + if(verbose > 0) { + fprintf(dump, "Div "); + fflush(dump); + } +} + +void sol_val(n, d) +Entier n, d; +{ + struct S *r; + r = sol_alloc(); + r -> flags = Val; + r -> param1 = n; + r -> param2 = d; + if(verbose > 0) { + fprintf(dump, "val("); + fprintf(dump, FORMAT, n); + fprintf(dump, "/"); + fprintf(dump, FORMAT, d); + fprintf(dump, ") "); + fflush(dump); + } +} + +int skip(int); + +/* a` partir d'un point de la solution, sauter un objet +bien forme' ainsi qu'un e'ventuel New et pointer sur l'objet +suivant */ + +int skip_New (int i) +{ + if(sol_space[i].flags != New) return i; + i = skip(i+1); /* sauter le Div */ + return i; +} +/* au lancement, i indexe une cellule qui est la te^te d'un objet. + la valeur retourne'e est la te^te de l'objet qui suit. Les + objets de type New sont e'limine's */ + +int skip (int i) +{int n, f; + while((f = sol_space[i].flags) == Free || f == Error) i++; + switch (sol_space[i].flags) { + case Nil : case Val : i++; break; + case New : i = skip_New(i); break; + case If : i = skip(i+1); /* sauter le pre'dicat */ + i = skip(i); /* sauter le vrai */ + i = skip(i); break; /* sauter le faux */ + case List : case Form : n = sol_space[i].param1; + i++; + while(n--) i = skip(i); + break; + case Div : i = skip(i+1); /* sauter la forme */ + i = skip(i); /* sauter le diviseur */ + break; + default : fprintf(stderr, + "Syserr : skip : unknown %d\n", sol_space[i].flags); + } + return skip_New(i); +} +/* simplification de la solution : e'limination des constructions + (if p () ()). N'est en service qu'en pre'sence de l'option -z */ + +void sol_simplify(int i) +{int j, k, l; + if(sol_space[i].flags == If) { + j = skip(i+1); /* j : de'but de la partie vraie */ + k = skip(j); /* k : d‚but de la partie fausse */ + sol_simplify(k); + sol_simplify(j); + if(sol_space[j].flags == Nil && sol_space[k].flags == Nil) { + sol_space[i].flags = Nil; + if(k >= sol_free - 1) sol_free = i+1; + else for(l = i+1; l<=k; l++) sol_space[l].flags = Free; + } + } + +} +/* e'dition de la solution */ + +int sol_edit(FILE *foo, int i) +{int j, n; + struct S *p; + Entier N, D, d; + p = sol_space + i; + for(;;) { + if(p->flags == Free) { + p++; + i++; + continue; + } + if(p->flags == New) { + n = p->param1; + fprintf(foo, "(newparm %d ", n); + if(verbose>0)fprintf(dump, "(newparm %d ", n); + i = sol_edit(foo, ++i); + p = sol_space +i; + fprintf(foo, ")\n"); + if(verbose>0)fprintf(dump, ")\n"); + continue; + } + break; + } + switch(p->flags){ + case Nil : fprintf(foo, "()\n"); + if(verbose>0)fprintf(dump, "()\n"); + i++; break; + case Error : fprintf(foo, "Error %d\n", p->param1); + if(verbose>0)fprintf(dump, "Error %d\n", p->param1); + i++; break; + case If : fprintf(foo, "(if "); + if(verbose>0)fprintf(dump, "(if "); + i = sol_edit(foo, ++i); + i = sol_edit(foo, i); + i = sol_edit(foo, i); + fprintf(foo, ")\n"); + if(verbose>0)fprintf(dump, ")\n"); + break; + case List: fprintf(foo, "(list "); + if(verbose>0)fprintf(dump, "(list "); + n = p->param1; + i++; + while(n--) i = sol_edit(foo, i); + fprintf(foo, ")\n"); + if(verbose>0)fprintf(dump, ")\n"); + break; + case Form: fprintf(foo, "#["); + if(verbose>0)fprintf(dump, "#["); + n = p->param1; + for(j = 0; jparam1; D = p->param2; + d = pgcd(N, D); + if(d == D){ + putc(' ', foo); + fprintf(foo, FORMAT, N/d); + if(verbose>0){ + putc(' ', dump); + fprintf(dump, FORMAT, N/d); + } + } + else{ + putc(' ', foo); + fprintf(foo,FORMAT,N/d); + fprintf(foo,"/"); + fprintf(foo,FORMAT, D/d); + if(verbose>0){ + putc(' ', dump); + fprintf(dump,FORMAT,N/d); + fprintf(dump,"/"); + fprintf(dump,FORMAT, D/d); + } + } + } + fprintf(foo, "]\n"); + if(verbose>0)fprintf(dump, "]\n"); + i++; + break; + case Div : fprintf(foo, "(div "); + if(verbose>0)fprintf(dump, "(div "); + i = sol_edit(foo, ++i); + i = sol_edit(foo, i); + fprintf(foo, ")\n"); + if(verbose>0)fprintf(dump, ")\n"); + break; + case Val : N = p->param1; D = p->param2; + d = pgcd(N, D); + if(d == D){putc(' ', foo); + fprintf(foo, FORMAT, N/d); + if(verbose>0) + {putc(' ', dump); + fprintf(dump, FORMAT, N/d); + } + } + else{putc(' ', foo); + fprintf(foo, FORMAT, N/d); + fprintf(foo, "/"); + fprintf(foo, FORMAT, D/d); + if(verbose>0) + {putc(' ', dump); + fprintf(dump, FORMAT, N/d); + fprintf(dump, "/"); + fprintf(dump, FORMAT, D/d); + } + } + i++; + break; + default : fprintf(foo, "Inconnu : sol\n"); + if(verbose>0)fprintf(dump, "Inconnu : sol\n"); + } + return(i); +} + + +/* Fonction sol_vector_edit : + * Cette fonction a pour but de placer les informations correspondant + * a un Vector dans la grammaire dans une structure de type PipVector. Elle + * prend en parametre un pointeur vers une case memoire contenant le + * numero de cellule du tableau sol_space a partir de laquelle on doit + * commencer la lecture des informations. Elle retourne un pointeur vers + * une structure de type PipVector contenant les informations de ce Vector. + * Premiere version : Ced. 20 juillet 2001. + */ +PipVector * sol_vector_edit(int * i) +{ int j, n ; + struct S *p ; + Entier N, D, d ; + PipVector * vector ; + + vector = (PipVector *)malloc(sizeof(PipVector)) ; + if (vector == NULL) + { fprintf(stderr, "Memory Overflow.\n") ; + exit(1) ; + } + p = sol_space + (*i) ; + n = p->param1 ; + vector->nb_elements = n ; + vector->the_vector = (Entier *)malloc(sizeof(Entier)*n) ; + if (vector->the_vector == NULL) + { fprintf(stderr, "Memory Overflow.\n") ; + exit(1) ; + } + vector->the_deno = (Entier *)malloc(sizeof(Entier)*n) ; + if (vector->the_deno == NULL) + { fprintf(stderr, "Memory Overflow.\n") ; + exit(1) ; + } + + for (j=0;jparam1 ; + D = p->param2 ; + d = pgcd(N, D) ; + + vector->the_vector[j] = N/d ; + if (d == D) + vector->the_deno[j] = UN ; + else + vector->the_deno[j] = D/d ; + } + (*i)++ ; + + return(vector) ; +} + + +/* Fonction sol_newparm_edit : + * Cette fonction a pour but de placer les informations correspondant + * a un Newparm dans la grammaire dans une structure de type PipNewparm. Elle + * prend en parametre un pointeur vers une case memoire contenant le + * numero de cellule du tableau sol_space a partir de laquelle on doit + * commencer la lecture des informations. Elle retourne un pointeur vers + * une structure de type PipNewparm contenant les informations de ce Newparm. + * Premiere version : Ced. 18 octobre 2001. + */ +PipNewparm * sol_newparm_edit(int * i) +{ struct S * p ; + PipNewparm * newparm, * newparm_new, * newparm_now ; + + /* On place p au lieu de lecture. */ + p = sol_space + (*i) ; + /* On passe le New et le Div pour aller a Form et lire le VECTOR. */ + (*i) += 2 ; + + newparm = (PipNewparm *)malloc(sizeof(PipNewparm)) ; + if (newparm == NULL) + { fprintf(stderr, "Memory Overflow.\n") ; + exit(1) ; + } + newparm->vector = sol_vector_edit(i) ; + newparm->rank = p->param1 ; + /* On met p a jour pour lire le denominateur (un Val de param2 UN). */ + p = sol_space + (*i) ; + newparm->deno = p->param1 ; + newparm->next = NULL ; + + newparm_now = newparm ; + if (verbose) + { fprintf(dump,"\n(newparm ") ; + fprintf(dump,FORMAT,newparm->rank) ; + fprintf(dump," (div ") ; + pip_vector_print(dump,newparm->vector) ; + fprintf(dump," ") ; + fprintf(dump,FORMAT,newparm->deno) ; + fprintf(dump,"))") ; + } + + /* On passe aux elements suivants. */ + (*i) ++ ; + p = sol_space + (*i) ; + while (p->flags == New) + { (*i) += 2 ; + newparm_new = (PipNewparm *)malloc(sizeof(PipNewparm)) ; + if (newparm_new == NULL) + { fprintf(stderr, "Memory Overflow.\n") ; + exit(1) ; + } + newparm_new->vector = sol_vector_edit(i) ; + newparm_new->rank = p->param1 ; + p = sol_space + (*i) ; + newparm_new->deno = p->param1 ; + newparm_new->next = NULL ; + + newparm_now->next = newparm_new ; + newparm_now = newparm_now->next ; + if (verbose) + { fprintf(dump,"\n(newparm ") ; + fprintf(dump,FORMAT,newparm_new->rank) ; + fprintf(dump," (div ") ; + pip_vector_print(dump,newparm_new->vector) ; + fprintf(dump," ") ; + fprintf(dump,FORMAT,newparm_new->deno) ; + fprintf(dump,"))") ; + } + (*i) ++ ; + p = sol_space + (*i) ; + } + return(newparm) ; +} + + +/* Fonction sol_list_edit : + * Cette fonction a pour but de placer les informations correspondant + * a une List dans la grammaire dans une structure de type PipList. Elle + * prend en parametre un pointeur vers une case memoire contenant le + * numero de cellule du tableau sol_space a partir de laquelle on doit + * commencer la lecture des informations. Elle retourne un pointeur vers + * une structure de type PipList contenant les informations de cette List. + * Premiere version : Ced. 18 octobre 2001. + */ +PipList * sol_list_edit(int * i, int nb_elements) +{ PipList * list, * list_new, * list_now ; + + /* Pour le premier element. */ + list = (PipList *)malloc(sizeof(PipList)) ; + if (list == NULL) + { fprintf(stderr, "Memory Overflow.\n") ; + exit(1) ; + } + list->vector = sol_vector_edit(i) ; + list->next = NULL ; + + list_now = list ; + if (verbose) + { fprintf(dump,"\n(list ") ; + pip_vector_print(dump,list->vector) ; + } + nb_elements-- ; + + /* Pour les elements suivants. */ + while (nb_elements--) + { list_new = (PipList *)malloc(sizeof(PipList)) ; + if (list_new == NULL) + { fprintf(stderr, "Memory Overflow.\n") ; + exit(1) ; + } + list_new->vector = sol_vector_edit(i) ; + list_new->next = NULL ; + + if (verbose) + { fprintf(dump,"\n") ; + pip_vector_print(dump,list_new->vector) ; + } + list_now->next = list_new ; + list_now = list_now->next ; + } + if (verbose) + fprintf(dump,"\n)") ; + + return(list) ; +} + + +/* Fonction sol_quast_edit : + * Cette fonction a pour but de placer les informations de la solution + * (qui sont contenues dans le tableau sol_space) dans une structure de + * type PipQuast en vue d'une utilisation directe de la solution par une + * application exterieure. Elle prend en parametre un pointeur vers une + * case memoire contenant le numero de cellule du tableau sol_space + * a partir de laquelle on doit commencer la lecture des informations. Elle + * recoit aussi l'adresse du PipQuast qui l'a appelle (pour le champ father). + * Elle retourne un pointeur vers une structure de type PipQuast qui + * contient toutes les informations sur la solution (sous forme d'arbre). + * Remarques : cette fonction lit les informations comme elles doivent + * se presenter a la fin du traitement. Elle respecte scrupuleusement + * la grammaire attendue et n'accepte de passer des cellules a Free + * qu'entre une des trois grandes formes (if, list ou suite de newparm). + * 20 juillet 2001 : Premiere version, Ced. + * 31 juillet 2001 : Ajout du traitement de l'option verbose = code*2 :0( + * 18 octobre 2001 : Grands changements dus a l'eclatement de la structure + * PipVector en PipVector, PipNewparm et PipList, et + * eclatement de la fonction avec sol_newparm_edit et + * sol_list_edit. + */ +PipQuast * sol_quast_edit(int * i, PipQuast * father) +{ int nb_elements ; + struct S * p ; + PipQuast * solution ; + PipList * list_new, * list_now ; + PipNewparm * newparm_new, * newparm_now ; + + /* On place p au lieu de lecture. */ + p = sol_space + (*i) ; + /* En cas d'utilisation de l'option de simplification, une plage de + * structures S peut avoir les flags a Free. On doit alors les passer. + */ + while (p->flags == Free) + { p ++ ; + (*i) ++ ; + } + + solution = (PipQuast *)malloc(sizeof(PipQuast)) ; + if (solution == NULL) + { fprintf(stderr, "Memory Overflow.\n") ; + exit(1) ; + } + solution->newparm = NULL ; + solution->list = NULL ; + solution->condition = NULL ; + solution->next_then = NULL ; + solution->next_else = NULL ; + solution->father = father ; + + /* On peut commencer par une chaine de nouveaux parametres... */ + if (p->flags == New) + { solution->newparm = sol_newparm_edit(i) ; + p = sol_space + (*i) ; + } + + /* ...ensuite soit par une liste (vide ou non) soit par un if. */ + (*i)++ ; /* Factorise de List, Nil et If. */ + switch (p->flags) + { case List : if ((nb_elements = p->param1) != 0) + solution->list = sol_list_edit(i,nb_elements) ; + break ; + case Nil : if (verbose) + fprintf(dump,"\n()") ; + break ; + case If : solution->condition = sol_vector_edit(i) ; + if (verbose) + { fprintf(dump,"\n(if ") ; + pip_vector_print(dump,solution->condition) ; + } + solution->next_then = sol_quast_edit(i,solution) ; + solution->next_else = sol_quast_edit(i,solution) ; + if (verbose) + fprintf(dump,"\n)") ; + break ; + default : fprintf(stderr,"\nAie !!! Flag %d inattendu.\n",p->flags) ; + if (verbose) + fprintf(dump,"\nAie !!! Flag %d inattendu.\n",p->flags) ; + exit(1) ; + } + + return(solution) ; +} diff --git a/source/tab.c b/source/tab.c new file mode 100644 index 0000000..8ab0de0 --- /dev/null +++ b/source/tab.c @@ -0,0 +1,261 @@ +/****************************************************************************** + * PIP : Parametric Integer Programming * + ****************************************************************************** + * * + * Copyright Paul Feautrier, 1988, 1993, 1994, 1996 * + * * + * This is free software; you can 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 software is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * + * for more details. * + * * + * You should have received a copy of the GNU General Public License along * + * with software; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * + * * + * Written by Paul Feautrier and Cedric Bastoul * + * * + ******************************************************************************/ + + +#include +#include + +#include + +#define TAB_CHUNK 4096*sizeof(Entier) + +static char *tab_free, *tab_top; +static struct A *tab_base; + +extern int allocation; +extern long int cross_product, limit; +static int chunk_count; + +int dgetc(FILE *); +int dscanf(FILE *, char *, Entier *); + +extern FILE * dump; + +void tab_init(void) +{ + tab_free = malloc(sizeof (struct A)); + if(tab_free == NULL) + {fprintf(stderr, "Your computer doesn't have enough memory\n"); + exit(1); + } + allocation = 1; + tab_top = tab_free + sizeof (struct A); + tab_base = (struct A *)tab_free; + tab_free += sizeof(struct A); + tab_base->precedent = NULL; + tab_base->bout = tab_top; + chunk_count = 1; +} + +struct high_water_mark tab_hwm(void) +{struct high_water_mark p; + p.chunk = chunk_count; + p.top = tab_free; + return p; +} + +void tab_reset(struct high_water_mark p) + +{struct A *g; + while(chunk_count > p.chunk) + { + g = tab_base->precedent; + free(tab_base); + tab_base = g; + tab_top = tab_base->bout; + chunk_count--; + } + if(chunk_count > 0) tab_free = p.top; + else { + fprintf(stderr, "Syserr: tab_reset : error in memory allocation\n"); + exit(1); + } +} + +Tableau * tab_alloc(int h, int w, int n) + +/* h : le nombre de ligne reelles; + n : le nombre de lignes virtuelles +*/ +{ + char *p; Tableau *tp; + Entier *q; + unsigned long taille; + int i, j; + taille = sizeof(struct T) + (h+n-1) * sizeof (struct L) + + h * w * sizeof (Entier); + if(tab_free + taille >= tab_top) + {struct A * g; + unsigned long d; + d = taille + sizeof(struct A); + if(d < TAB_CHUNK) d = TAB_CHUNK; + tab_free = malloc(d); + if(tab_free == NULL) + {printf("Memory overflow\n"); + exit(23); + } + chunk_count++; + g = (struct A *)tab_free; + g->precedent = tab_base; + tab_top = tab_free + d; + tab_free += sizeof(struct A); + tab_base = g; + g->bout = tab_top; + } + p = tab_free; + tab_free += taille; + tp = (Tableau *)p; + q = (Entier *)(p + sizeof(struct T) + (h+n-1) * sizeof (struct L)); + tp->determinant[0] = (Entier) 1; + tp->l_determinant = 1; + for(i = 0; irow[i].flags = Unit; + tp->row[i].objet.unit = i; + Denom(tp, i) = UN ; + } + for(i = n; i < (h+n); i++){ + tp->row[i].flags = 0; + tp->row[i].objet.val = q; + for(j = 0; j < w; j++) *q++ = 0; + Denom(tp, i) = ZERO ; + } + tp->height = h + n; tp->width = w; + return(tp); +} + +Tableau * tab_get(foo, h, w, n) +FILE * foo; +int h, w, n; +{ + Tableau *p; + int i, j, c; + Entier x; + p = tab_alloc(h, w, n); + while((c = dgetc(foo)) != EOF) + if(c == '(')break; + for(i = n; irow[i].flags = Unknown; + Denom(p, i) = UN; + while((c = dgetc(foo)) != EOF)if(c == '[')break; + for(j = 0; jrow[i].objet.val[j] = x; + } + while((c = dgetc(foo)) != EOF)if(c == ']')break; + } + while((c = dgetc(foo)) != EOF)if(c == ')')break; + return((Tableau *) p); +} + + +/* Fonction tab_Matrix2Tableau : + * Cette fonction effectue la conversion du format de matrice de la polylib + * vers le format de traitement de Pip. matrix est la matrice a convertir. + * Nineq est le nombre d'inequations necessaires (dans le format de la + * polylib, le premier element d'une ligne indique si l'equation decrite + * est une inequation ou une egalite. Pip ne gere que les inequations. On + * compte donc le nombre d'inequations total pour reserver la place + * necessaire, et on scinde toute egalite p(x)=0 en p(x)>=0 et -p(x)>=0). + * Nv est le nombre de variables dans la premiere serie de variables (c'est + * a dire que si les premiers coefficients dans les lignes de la matrice + * sont ceux des inconnues, Nv est le nombre d'inconnues, resp. parametres). + * n est le nombre de lignes 'virtuelles' contenues dans la matrice (c'est + * a dire en fait le nombre d'inconnues). + * 27 juillet 2001 : Premiere version, Ced. + * 30 juillet 2001 : Nombreuses modifications. Le calcul du nombre total + * d'inequations (Nineq) se fait a present a l'exterieur. + * 3 octobre 2001 : Pas mal d'ameliorations. + */ +Tableau * tab_Matrix2Tableau(PipMatrix * matrix, int Nineq, int Nv, int n) +{ Tableau * p ; + unsigned i, j, end, current, new, nb_columns, decal=0 ; + Entier * entier, inequality ; + + nb_columns = matrix->NbColumns - 1 ; + p = tab_alloc(Nineq,nb_columns,n) ; + + /* La variable decal sert a prendre en compte les lignes supplementaires + * issues des egalites. + */ + end = matrix->NbRows + n ; + for (i=n;ip + i - n) ; + /* Pour passer l'indicateur d'egalite/inegalite. */ + inequality = *entier ; + entier ++ ; + + /* Dans le format de la polylib, l'element constant est place en + * dernier. Dans le format de Pip, il se trouve apres la premiere + * serie de variables (inconnues ou parametres). On remet donc les + * choses dans l'ordre de Pip. Ici pour p(x) >= 0. + */ + for (j=0;jrow[current].objet.val + j) = *entier++ ; + for (j=Nv+1;jrow[current].objet.val + j) = *entier++ ; + *(p->row[current].objet.val + Nv) = *entier ; + + /* Et ici lors de l'ajout de -p(x) >= 0 quand on traite une egalite. */ + if (!inequality) + { decal ++ ; + new = current + 1 ; + Flag(p,new)= Unknown ; + Denom(p,new) = UN ; + + for (j=0;jrow[new].objet.val + j) = -(*(p->row[current].objet.val + j)) ; + } + } + return(p); +} + + +char *Attr[] = {"Unit", "+", "-", "0", "*", "?"}; + +void tab_display(p, foo) +FILE *foo; +Tableau *p; +{ + + int i, j, ff, fff, n; + Entier x, d; + fprintf(foo, "%ld/[%d * %d]\n", cross_product, p->height, p->width); + for(i = 0; iheight; i++){ + fff = ff = p->row[i].flags; + /* if(fff ==0) continue; */ + d = Denom(p, i); + n = 0; + while(fff){ + if(fff & 1) fprintf(foo, "%s ",Attr[n]); + n++; fff >>= 1; + } + fprintf(foo, "%f #[", p->row[i].size); + if(ff & Unit) + for(j = 0; jwidth; j++) + fprintf(foo, " /%d/",(j == p->row[i].objet.unit)? 1: 0); + else + for(j = 0; jwidth; j++){ + x = Index(p,i,j); + fprintf(foo, FORMAT, x); + fprintf(foo, " "); + } + fprintf(foo, "]/"); + fprintf(foo, "%d", (int)d); + putc('\n', foo); + } +} diff --git a/source/traiter.c b/source/traiter.c new file mode 100644 index 0000000..fb71b82 --- /dev/null +++ b/source/traiter.c @@ -0,0 +1,602 @@ +/****************************************************************************** + * PIP : Parametric Integer Programming * + ****************************************************************************** + * * + * Copyright Paul Feautrier, 1988, 1993, 1994, 1996 * + * * + * This is free software; you can 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 software is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * + * for more details. * + * * + * You should have received a copy of the GNU General Public License along * + * with software; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * + * * + * Written by Paul Feautrier * + * * + ******************************************************************************/ + +#include +#include + +#include + +#define max(x,y) ((x) > (y)? (x) : (y)) + +extern long int cross_product, limit; +extern int verbose; +extern FILE *dump; +extern int profondeur; +extern int compa_count; + +int llog(Entier x) +{int n = 0; +/* x must be positive, you dummy */ + if(x<0) x=-x; + while(x) x >>= 1, n++; + return(n); +} + +int chercher(Tableau *p, int masque, int n) +{int i; + for(i = 0; irow[i].flags & masque) break; + return(i); +} + +/* il est convenu que traiter ne doit modifier ni le tableau, ni le contexte; + le tableau peut grandir en cas de coupure (+1 en hauteur et +1 en largeur + si nparm != 0) et en cas de partage (+1 en hauteur)(seulement si nparm != 0). + le contexte peut grandir en cas de coupure (+2 en hauteur et +1 en largeur) + (seulement si nparm !=0) et en cas de partage (+1 en hauteur)(nparm !=0). + On estime le nombre de coupures a llog(D) et le nombre de partages a + ni. +*/ + +Tableau *expanser(Tableau *tp, int virt, int reel, int ncol, + int off, int dh, int dw) +{ + int i, j, ff; + char *q; Entier *pq; + Entier *pp, *qq; + Tableau *rp; + if(tp == NULL) return(NULL); + rp = tab_alloc(reel+dh, ncol+dw, virt); + rp->l_determinant = tp->l_determinant; + for(i=0; il_determinant; i++) + rp->determinant[i] = tp->determinant[i]; + pq = (Entier *) & (rp->row[virt+reel+dh]); + for(i = off; irow[i].objet.unit = tp->row[i-off].objet.unit; + else { + rp->row[i].objet.val = pq; + pq +=(ncol + dw); + pp = tp->row[i-off].objet.val; + qq = rp->row[i].objet.val; + for(j = 0; jheight; i++) + {ff = Flag(tp,i); + if(ff == 0) break; + if(ff == Unknown) + {if(bigparm >= 0 && (x = Index(tp,i, bigparm))) + {if(x<0) {Flag(tp, i) = Minus; + return(i); + } + else Flag(tp, i) = Plus; + continue; + } + ff = Zero; + p = &(tp->row[i].objet.val[nvar+1]); + for(j = nvar+1; j0) fff = Plus; + else fff = Zero; + if(fff != Zero && fff != ff) + if(ff == Zero) ff = fff; + else {ff = Unknown; + break; + } + } +/* bug de'tecte' par [paf], 16/2/93 ! + Si tous les coefficients des parame`tres sont ne'gatifs + et si le terme constant est nul, le signe est inconnu!! + On traite donc spe'cialement le terme constant. */ + x = Index(tp, i, nvar); + if(x<0) fff = Minus; + else if(x>0) fff = Plus; + else fff = Zero; +/* ici on a le signe du terme constant */ + switch(ff){ +/* le signe est inconnu si les coefficients sont positifs et + le terme constant ne'gatif */ + case Plus: if(fff == Minus) ff = Unknown; break; +/* si les coefficients sont tous nuls, le signe est celui + du terme constant */ + case Zero: ff = fff; break; +/* le signe est inconnu si les coefficients sont ne'gatifs, + sauf si le terme constant est ‚galement n‚gatif. */ + case Minus: if(fff != Minus) ff = Unknown; break; +/* enfin, il n'y a rien a` dire si le signe des coefficients est inconnu */ + } + Flag(tp, i) = ff; + if(ff == Minus) return(i); + } + } + return(i); +} + +void compa_test(Tableau *tp, Tableau *context, + int ni, int nvar, int nparm, int nc) +{ + Entier discr[MAXPARM]; + int i, j; + int ff; + int cPlus, cMinus, isCritic; + int verbold; + Tableau *tPlus, *tMinus; + int p; + struct high_water_mark q; + + if(nparm == 0) return; + if(nparm >= MAXPARM) { + fprintf(stderr, "Too much parameters : %d\n", nparm); + exit(1); + } + q = tab_hwm(); + for(i = 0; i 0) + {isCritic = False; + break; + } + compa_count++; + for(j = 0; j < nparm; j++) discr[j] = Index(tp, i, j+nvar+1); + discr[nparm] = Index(tp, i, nvar)- (isCritic ? 0 : 1); + /* NdCed : Attention au contexte == NULL ! */ + tPlus = expanser(context, nparm, nc, nparm+1, nparm, 1, 0); + Flag(tPlus, nparm+nc) = Unknown; + for(j = 0; j<=nparm; j++)Index(tPlus, nparm+nc, j) = discr[j]; + Denom(tPlus, nparm+nc) = UN; + + p = sol_hwm(); + traiter(tPlus, NULL, True, UN, nparm, 0, nc+1, 0, -1); + cPlus = is_not_Nil(p); + if(verbose>0){ + fprintf(dump, "\nThe positive case has been found "); + fprintf(dump, cPlus? "possible\n": "impossible\n"); + fflush(dump); + } + + sol_reset(p); + for(j = 0; j0){ + fprintf(dump, "\nThe negative case has been found "); + fprintf(dump, cMinus? "possible\n": "impossible\n"); + fflush(dump); + } + + sol_reset(p); + if (cPlus && cMinus) { + Flag(tp,i) = isCritic ? Critic : Unknown; + } + else if (cMinus) + {Flag(tp,i) = Minus; + break; + } + else { + Flag(tp,i) = cPlus ? Plus : Zero; + } + } + } + tab_reset(q); + return; +} + +Entier valeur(Tableau *tp, int i, int j, Entier D) +{ + if(Flag(tp, i) & Unit) + return(tp->row[i].objet.unit == j ? Denom(tp,i) : 0); + else return(Index(tp, i, j)); +} + +void solution(Tableau *tp, int nvar, int nparm, Entier D) +{int i, j; + int ncol = nvar + nparm + 1; + sol_list(nvar); + for(i = 0; i= MAXCOL) { + fprintf(stderr, "Too much variables\n"); + exit(1); + } + if(0 > pivi || pivi >= nligne || Flag(tp, pivi) == Unit) { + fprintf(stderr, "Syserr : pivoter : wrong pivot row\n"); + exit(1); + } + pivj = choisir_piv(tp, pivi, nvar, nligne, D); + if(pivj < 0) return(-1); + if(pivj >= nvar) { + fprintf(stderr, "Syserr : pivoter : wrong pivot\n"); + exit(1); + } + pivot = Index(tp, pivi, pivj); + dpiv = Denom(tp, pivi); + d = pgcd(pivot, dpiv); + ppivot = pivot/d; + dppiv = dpiv/d; + if(verbose){ + fprintf(dump, format_format, ppivot, dppiv); + fprintf(dump, "%d x %d\n", pivi, pivj); + } + for(i=0; i< tp->l_determinant; i++){ + d=pgcd(tp->determinant[i], dppiv); + tp->determinant[i] /= d; + dppiv /= d; + } + if(dppiv != 1) { + fprintf(stderr, "Integer overflow : %d\n", D); +/* tab_display(tp, stdout); */ + if(verbose) fflush(dump); + exit(1); + } + for(i=0; il_determinant; i++) + if(llog(tp->determinant[i]) + llog(ppivot) < 8*sizeof(Entier)){ + tp->determinant[i] *= ppivot; + break; + } + if(i >= tp->l_determinant){ + tp->l_determinant++; + if(tp->l_determinant >= MAX_DETERMINANT){ + fprintf(stderr, "Integer overflow : %d\n", tp->l_determinant); + exit(1); + } + tp->determinant[i] = ppivot; + } + if(verbose){ + fprintf(dump, "determinant "); + for(i=0; il_determinant; i++) + fprintf(dump, FORMAT, tp->determinant[i]); + fprintf(dump, "\n"); + } + for(j = 0; jrow[k].objet.val; + q = tp->row[pivi].objet.val; + for(j = 0; jrow[k].objet.val; + for(j = 0; jrow[pivi].objet.val; + for(k = 0; krow[k].objet.unit == pivj) break; + Flag(tp, k) = Plus; + tp->row[k].objet.val = p; + for(j = 0; jrow[pivi].objet.unit = pivj; + + for(k = 0; krow[i].size = s; + smax = max(s, smax); + } + + for(i=nvar; irow[j].size < s){ + s = tp->row[i].size; + pivi = j; + } + } + if(pivi != i) { + temp = tp->row[pivi]; + tp->row[pivi] = tp->row[i]; + tp->row[i]=temp; + } + } + + if(verbose){ + fprintf(dump, "just sorted\n"); + tab_display(tp, dump); + } + + for(;;) { + nligne = nvar+ni; ncol = nvar+nparm+1; + if(nligne > tp->height || ncol > tp->width) { + fprintf(stderr, "Syserr : traiter : tableau too small\n"); + exit(1); + } + pivi = chercher(tp, Minus, nligne); + if(pivi < nligne) goto pirouette; /* There is a negative row */ + + pivi = exam_coef(tp, nvar, ncol, bigparm); + + if(verbose > 0){ + fprintf(dump, "coefs examined\n"); + tab_display(tp, dump); + } + + if(pivi < nligne) goto pirouette; + /* There is a row whose coefficients are negative */ + compa_test(tp, context, ni, nvar, nparm, nc); + if(verbose>0){ + fprintf(dump, "compatibility tested\n"); + tab_display(tp, dump); + fflush(dump); + } + pivi = chercher(tp, Minus, nligne); + if(pivi < nligne) goto pirouette; + /* The compatibility test has found a negative row */ + pivi = chercher(tp, Critic, nligne); + if(pivi >= nligne)pivi = chercher(tp, Unknown, nligne); + /* Here, the problem tree splits */ + if(pivi < nligne) { + Tableau * ntp; + Entier com_dem; + struct high_water_mark q; + if(nc >= context->height) { + dcw = llog(D); + dch = 2 * dcw + 1; + context = expanser(context, 0, nc, nparm+1, 0, dch, dcw); + } + if(nparm >= MAXPARM) { + fprintf(stderr, "Too much parameters : %d\n", nparm); + exit(2); + } + q = tab_hwm(); + if(verbose) + fprintf(stderr,"profondeur %d %lx\n", profondeur, q.top); + ntp = expanser(tp, nvar, ni, ncol, 0, 0, 0); + sol_if(); + sol_forme(nparm+1); + com_dem = 0; + for(j = 0; j 0) goto pirouette; + /* A cut has been inserted and is always negative */ +/* Here, either there is an integral solution, */ + if(pivi == 0) solution(tp, nvar, nparm, D); +/* or no solution exists */ + else sol_nil(); + break; + +/* Here, a negative row has been found. The call to <> executes + a pivoting step */ + +pirouette : + if((D = pivoter(tp, pivi, D, nvar, nparm, ni, iq)) < 0) { + sol_nil(); + break; + } + } +/* Danger : a premature return would induce memory leaks */ + tab_reset(x); + return D; +} + + + + + + + diff --git a/test/boulet.dat b/test/boulet.dat new file mode 100644 index 0000000..90ca398 --- /dev/null +++ b/test/boulet.dat @@ -0,0 +1,72 @@ +( + ( Cree par l'interface Caml/PIP. + Résoudre MIN(x', y', z', i, j, k, i', j', k') + sous les contraintes : + { i >= 1, + i+j-k >= 0, + i-n <= 0, + 2*i+4*j+4*k-x-y-z <= 0, + 2*i-z >= 0, + i' >= 1, + i'+j'-k' >= 0, + i'-n <= 0, + 2*i'+4*j'+4*k'-x'-y'-z' <= 0, + 2*i'-z' >= 0, + j >= 1, + j-n <= 0, + 4*j+3*k-y >= 0, + j' >= 1, + j'-n <= 0, + 4*j'+3*k'-y' >= 0, + k >= 1, + k-x >= 0, + k' >= 1, + k'-x' >= 0, + n >= 1, + x-x' >= 0, + x-x'+y-y' <= 0, + y-y' >= 0, + z-z' <= -1 + } + en nombres entiers ) + 9 6 24 1 10 + 0 + ( + #[ 0 0 0 -1 0 0 0 0 0 0 1 -1 1 0 0 0 ] + #[ 0 0 0 0 0 0 -1 0 0 0 1 -1 1 0 0 0 ] + #[ 0 0 0 0 -1 0 0 0 0 0 1 -1 1 0 0 0 ] + #[ 0 0 0 0 0 0 0 -1 0 0 1 -1 1 0 0 0 ] + #[ 0 0 0 0 0 1 0 0 0 0 -1 1 0 -1 0 0 ] + #[ -1 0 0 0 0 0 0 0 0 0 1 -1 0 1 0 0 ] + #[ 0 -1 0 0 0 0 0 0 0 0 1 -1 0 0 1 0 ] + #[ 0 0 1 0 0 0 0 0 0 -1 -1 1 0 0 0 -1 ] + #[ 0 0 0 1 0 0 0 0 0 -1 -1 0 0 0 0 0 ] + #[ 0 0 0 1 1 -1 0 0 0 0 -1 0 0 0 0 0 ] + #[ 0 0 -1 0 0 0 2 0 0 0 -1 0 0 0 0 0 ] + #[ 0 0 0 0 0 0 1 0 0 -1 -1 0 0 0 0 0 ] + #[ 0 0 0 0 0 0 1 1 -1 0 -1 0 0 0 0 0 ] + #[ 0 0 0 0 1 0 0 0 0 -1 -1 0 0 0 0 0 ] + #[ 0 0 0 0 0 0 0 1 0 -1 -1 0 0 0 0 0 ] + #[ 0 0 0 0 0 1 0 0 0 -1 -1 0 0 0 0 0 ] + #[ 0 0 0 0 0 0 0 0 1 -1 -1 0 0 0 0 0 ] + #[ 1 1 0 0 0 0 0 0 0 0 -2 2 0 -1 -1 0 ] + #[ 0 0 0 2 0 0 0 0 0 0 -2 1 0 0 0 -1 ] + #[ 0 -1 0 0 0 0 0 4 3 0 -6 0 0 0 0 0 ] + #[ 0 0 0 0 4 3 0 0 0 0 -7 1 0 0 -1 0 ] + #[ 1 1 1 0 0 0 -2 -4 -4 0 7 0 0 0 0 0 ] + #[ 0 0 0 -2 -4 -4 0 0 0 0 10 -3 0 1 1 1 ] + #[ -1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ] + ) + ( + #[ 0 -1 1 0 0 0 -1 ] + ) + ) + + + + + + + + + diff --git a/test/boulet.ll b/test/boulet.ll new file mode 100644 index 0000000..4155705 --- /dev/null +++ b/test/boulet.ll @@ -0,0 +1,71 @@ +( + ( Cree par l'interface Caml/PIP. + Résoudre MIN(x', y', z', i, j, k, i', j', k') + sous les contraintes : + { i >= 1, + i+j-k >= 0, + i-n <= 0, + 2*i+4*j+4*k-x-y-z <= 0, + 2*i-z >= 0, + i' >= 1, + i'+j'-k' >= 0, + i'-n <= 0, + 2*i'+4*j'+4*k'-x'-y'-z' <= 0, + 2*i'-z' >= 0, + j >= 1, + j-n <= 0, + 4*j+3*k-y >= 0, + j' >= 1, + j'-n <= 0, + 4*j'+3*k'-y' >= 0, + k >= 1, + k-x >= 0, + k' >= 1, + k'-x' >= 0, + n >= 1, + x-x' >= 0, + x-x'+y-y' <= 0, + y-y' >= 0, + z-z' <= -1 + } + en nombres entiers -1 )(if #[ 0 -1 2 0 0 -1 -1] +) +(if #[ 0 -9 4 3 -1 -3 6 0] +(if #[ 0 -1 0 0 0 -1 2 0] +(newparm 7 (div #[ 0 3 0 3 3 1 2 0] + 4) +) +(if #[ 0 -6 0 -3 -3 -4 4 4 0] +(newparm 8 (div #[ 0 0 0 0 0 1 2 2 0] + 3) +) +(newparm 9 (div #[ 0 0 0 0 0 1 0 0 1 0] + 2) +) +(newparm 10 (div #[ 0 1 0 0 0 1 0 0 0 0 1] + 2) +) +(newparm 11 (div #[ 0 2 0 3 3 0 0 0 0 0 0 0] + 4) +) +(list #[ 1 -1 0 1 0 0 0 0 0 0 0 0 0] +#[ 1 -1 0 0 1 0 0 0 0 0 0 0 0] +#[ 1 2 0 3 3 2 0 0 0 0 -2 -4 2] +#[ 1 0 0 0 0 1 -1 0 0 0 0 0 0] +#[ 1 2 0 0 1 3 0 0 0 -3 0 0 0] +#[ 1 -3 0 0 -1 -4 0 0 0 4 0 0 0] +#[ 1 0 0 0 0 1 0 0 0 0 -1 0 1] +#[ 1 -1 0 -3 -2 0 0 0 0 0 0 3 0] +#[ 1 1 0 4 3 0 0 0 0 0 0 -4 0] +) +() +) +() +) +() +) +() +() +() +() +) diff --git a/test/bouleti.dat b/test/bouleti.dat new file mode 100644 index 0000000..497733d --- /dev/null +++ b/test/bouleti.dat @@ -0,0 +1,72 @@ +( + ( Cree par l'interface Caml/PIP. + Résoudre MIN(x', y', z', i, j, k, i', j', k') + sous les contraintes : + { i >= 1, + i+j-k >= 0, + i-n <= 0, + 2*i+4*j+4*k-x-y-z <= 0, + 2*i-z >= 0, + i' >= 1, + i'+j'-k' >= 0, + i'-n <= 0, + 2*i'+4*j'+4*k'-x'-y'-z' <= 0, + 2*i'-z' >= 0, + j >= 1, + j-n <= 0, + 4*j+3*k-y >= 0, + j' >= 1, + j'-n <= 0, + 4*j'+3*k'-y' >= 0, + k >= 1, + k-x >= 0, + k' >= 1, + k'-x' >= 0, + n >= 1, + x-x' >= 0, + x-x'+y-y' <= 0, + y-y' >= 0, + z-z' <= -1 + } + en nombres entiers ) + 9 6 24 1 10 + 1 + ( + #[ 0 0 0 -1 0 0 0 0 0 0 1 -1 1 0 0 0 ] + #[ 0 0 0 0 0 0 -1 0 0 0 1 -1 1 0 0 0 ] + #[ 0 0 0 0 -1 0 0 0 0 0 1 -1 1 0 0 0 ] + #[ 0 0 0 0 0 0 0 -1 0 0 1 -1 1 0 0 0 ] + #[ 0 0 0 0 0 1 0 0 0 0 -1 1 0 -1 0 0 ] + #[ -1 0 0 0 0 0 0 0 0 0 1 -1 0 1 0 0 ] + #[ 0 -1 0 0 0 0 0 0 0 0 1 -1 0 0 1 0 ] + #[ 0 0 1 0 0 0 0 0 0 -1 -1 1 0 0 0 -1 ] + #[ 0 0 0 1 0 0 0 0 0 -1 -1 0 0 0 0 0 ] + #[ 0 0 0 1 1 -1 0 0 0 0 -1 0 0 0 0 0 ] + #[ 0 0 -1 0 0 0 2 0 0 0 -1 0 0 0 0 0 ] + #[ 0 0 0 0 0 0 1 0 0 -1 -1 0 0 0 0 0 ] + #[ 0 0 0 0 0 0 1 1 -1 0 -1 0 0 0 0 0 ] + #[ 0 0 0 0 1 0 0 0 0 -1 -1 0 0 0 0 0 ] + #[ 0 0 0 0 0 0 0 1 0 -1 -1 0 0 0 0 0 ] + #[ 0 0 0 0 0 1 0 0 0 -1 -1 0 0 0 0 0 ] + #[ 0 0 0 0 0 0 0 0 1 -1 -1 0 0 0 0 0 ] + #[ 1 1 0 0 0 0 0 0 0 0 -2 2 0 -1 -1 0 ] + #[ 0 0 0 2 0 0 0 0 0 0 -2 1 0 0 0 -1 ] + #[ 0 -1 0 0 0 0 0 4 3 0 -6 0 0 0 0 0 ] + #[ 0 0 0 0 4 3 0 0 0 0 -7 1 0 0 -1 0 ] + #[ 1 1 1 0 0 0 -2 -4 -4 0 7 0 0 0 0 0 ] + #[ 0 0 0 -2 -4 -4 0 0 0 0 10 -3 0 1 1 1 ] + #[ -1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ] + ) + ( + #[ 0 -1 1 0 0 0 -1 ] + ) + ) + + + + + + + + + diff --git a/test/bouleti.ll b/test/bouleti.ll new file mode 100644 index 0000000..6f90a11 --- /dev/null +++ b/test/bouleti.ll @@ -0,0 +1,419 @@ +( + ( Cree par l'interface Caml/PIP. + Résoudre MIN(x', y', z', i, j, k, i', j', k') + sous les contraintes : + { i >= 1, + i+j-k >= 0, + i-n <= 0, + 2*i+4*j+4*k-x-y-z <= 0, + 2*i-z >= 0, + i' >= 1, + i'+j'-k' >= 0, + i'-n <= 0, + 2*i'+4*j'+4*k'-x'-y'-z' <= 0, + 2*i'-z' >= 0, + j >= 1, + j-n <= 0, + 4*j+3*k-y >= 0, + j' >= 1, + j'-n <= 0, + 4*j'+3*k'-y' >= 0, + k >= 1, + k-x >= 0, + k' >= 1, + k'-x' >= 0, + n >= 1, + x-x' >= 0, + x-x'+y-y' <= 0, + y-y' >= 0, + z-z' <= -1 + } + en nombres entiers -1 )(if #[ 0 -1 2 0 0 -1 -1] +(if #[ 0 0 1 -1 0 0 1] +(if #[ 0 -1 0 0 0 1 -1] +(if #[ 0 -1 0 1 0 0 -2] +(if #[ 0 2 0 -3 1 0 -4] +(if #[ 0 -6 4 3 -1 0 0] +(if #[ 0 4 0 -7 1 2 2] +(if #[ 0 1 0 0 0 -1 2] +(if #[ 0 -6 0 7 -1 0 -4] +(if #[ 0 3 2 -7 1 1 0] +(if #[ 0 3 0 -5 1 1 -2] +(if #[ 0 4 0 -7 1 2 0] +(newparm 6 (div #[ 0 1 0 1 1 1 0] + 2) +) +(newparm 7 (div #[ 0 1 0 0 0 1 0 1] + 2) +) +(newparm 8 (div #[ 0 2 0 3 3 0 0 0 0] + 4) +) +(list #[ 1 -1 0 1 0 0 0 0 0 0] +#[ 1 -1 0 0 1 0 0 0 0 0] +#[ 1 2 0 3 3 2 0 -2 -4 2] +#[ 1 -2 0 4 0 0 -1 0 0 0] +#[ 1 1 0 -3 0 0 1 0 0 0] +#[ 1 -1 0 1 0 0 0 0 0 0] +#[ 1 0 0 0 0 1 0 -1 0 1] +#[ 1 -1 0 -3 -2 0 0 0 3 0] +#[ 1 1 0 4 3 0 0 0 -4 0] +) +() +) +() +) +() +) +(if #[ 0 -9 4 3 -1 3 -6] +(if #[ 0 -1 0 0 0 1 -2] +(newparm 6 (div #[ 0 3 0 3 3 3 2] + 4) +) +(if #[ 0 -6 0 -3 -3 0 4 -8] +(newparm 7 (div #[ 0 0 0 0 0 0 2 2] + 3) +) +(newparm 8 (div #[ 0 0 0 0 0 0 0 1 0] + 2) +) +(newparm 9 (div #[ 0 1 0 0 0 1 0 0 0 1] + 2) +) +(newparm 10 (div #[ 0 2 0 3 3 0 0 0 0 0 0] + 4) +) +(list #[ 1 -1 0 1 0 0 0 0 0 0 0 0] +#[ 1 -1 0 0 1 0 0 0 0 0 0 0] +#[ 1 2 0 3 3 2 0 0 0 -2 -4 2] +#[ 1 0 0 0 0 0 0 0 0 0 0 1] +#[ 1 2 0 0 1 0 0 0 -3 0 0 3] +#[ 1 -3 0 0 -1 0 0 0 4 0 0 -4] +#[ 1 0 0 0 0 1 0 0 0 -1 0 1] +#[ 1 -1 0 -3 -2 0 0 0 0 0 3 0] +#[ 1 1 0 4 3 0 0 0 0 0 -4 0] +) +() +) +() +) +() +) +) +(if #[ 0 -1 0 2 0 -1 -2] +(if #[ 0 -4 0 7 -1 -2 0] +(if #[ 0 3 2 -7 1 1 0] +(if #[ 0 3 0 -5 1 1 -2] +(if #[ 0 4 0 -7 1 2 0] +(newparm 6 (div #[ 0 1 0 1 1 1 0] + 2) +) +(if #[ 0 2 0 -9 -1 0 4 0] +(newparm 7 (div #[ 0 1 0 0 0 1 0 1] + 2) +) +(newparm 8 (div #[ 0 2 0 3 3 0 0 0 0] + 4) +) +(list #[ 1 -1 0 1 0 0 0 0 0 0] +#[ 1 -1 0 0 1 0 0 0 0 0] +#[ 1 2 0 3 3 2 0 -2 -4 2] +#[ 1 -2 0 4 0 0 -1 0 0 0] +#[ 1 1 0 -3 0 0 1 0 0 0] +#[ 1 -1 0 1 0 0 0 0 0 0] +#[ 1 0 0 0 0 1 0 -1 0 1] +#[ 1 -1 0 -3 -2 0 0 0 3 0] +#[ 1 1 0 4 3 0 0 0 -4 0] +) +() +) +() +) +() +) +() +) +(newparm 6 (div #[ 0 1 0 0 0 1 0] + 2) +) +(if #[ 0 -9 4 3 -1 -3 6 0] +(if #[ 0 -1 0 0 0 -1 2 0] +(newparm 7 (div #[ 0 3 0 3 3 1 2 0] + 4) +) +(if #[ 0 -6 0 -3 -3 -4 4 4 0] +(newparm 8 (div #[ 0 0 0 0 0 1 2 2 0] + 3) +) +(newparm 9 (div #[ 0 0 0 0 0 1 0 0 1 0] + 2) +) +(newparm 10 (div #[ 0 1 0 0 0 1 0 0 0 0 1] + 2) +) +(newparm 11 (div #[ 0 2 0 3 3 0 0 0 0 0 0 0] + 4) +) +(list #[ 1 -1 0 1 0 0 0 0 0 0 0 0 0] +#[ 1 -1 0 0 1 0 0 0 0 0 0 0 0] +#[ 1 2 0 3 3 2 0 0 0 0 -2 -4 2] +#[ 1 0 0 0 0 1 -1 0 0 0 0 0 0] +#[ 1 2 0 0 1 3 0 0 0 -3 0 0 0] +#[ 1 -3 0 0 -1 -4 0 0 0 4 0 0 0] +#[ 1 0 0 0 0 1 0 0 0 0 -1 0 1] +#[ 1 -1 0 -3 -2 0 0 0 0 0 0 3 0] +#[ 1 1 0 4 3 0 0 0 0 0 0 -4 0] +) +() +) +() +) +() +) +) +(newparm 6 (div #[ 0 1 0 0 0 1 0] + 2) +) +(if #[ 0 -9 4 3 -1 -3 6 0] +(if #[ 0 -1 0 0 0 -1 2 0] +(newparm 7 (div #[ 0 3 0 3 3 1 2 0] + 4) +) +(if #[ 0 -6 0 -3 -3 -4 4 4 0] +(newparm 8 (div #[ 0 0 0 0 0 1 2 2 0] + 3) +) +(newparm 9 (div #[ 0 0 0 0 0 1 0 0 1 0] + 2) +) +(newparm 10 (div #[ 0 1 0 0 0 1 0 0 0 0 1] + 2) +) +(newparm 11 (div #[ 0 2 0 3 3 0 0 0 0 0 0 0] + 4) +) +(list #[ 1 -1 0 1 0 0 0 0 0 0 0 0 0] +#[ 1 -1 0 0 1 0 0 0 0 0 0 0 0] +#[ 1 2 0 3 3 2 0 0 0 0 -2 -4 2] +#[ 1 0 0 0 0 1 -1 0 0 0 0 0 0] +#[ 1 2 0 0 1 3 0 0 0 -3 0 0 0] +#[ 1 -3 0 0 -1 -4 0 0 0 4 0 0 0] +#[ 1 0 0 0 0 1 0 0 0 0 -1 0 1] +#[ 1 -1 0 -3 -2 0 0 0 0 0 0 3 0] +#[ 1 1 0 4 3 0 0 0 0 0 0 -4 0] +) +() +) +() +) +() +) +) +) +() +) +() +) +() +) +(if #[ 0 -3 0 1 1 1 -10] +(if #[ 0 1 0 0 0 -1 2] +(if #[ 0 -9 4 3 -1 3 -6] +(if #[ 0 -1 0 0 0 1 -2] +(if #[ 0 -1 0 1 0 0 -1] +(newparm 6 (div #[ 0 3 0 3 3 3 2] + 4) +) +(if #[ 0 -6 0 -3 -3 0 4 -8] +(newparm 7 (div #[ 0 0 0 0 0 0 2 2] + 3) +) +(newparm 8 (div #[ 0 0 0 0 0 0 0 1 0] + 2) +) +(newparm 9 (div #[ 0 1 0 0 0 1 0 0 0 1] + 2) +) +(newparm 10 (div #[ 0 2 0 3 3 0 0 0 0 0 0] + 4) +) +(list #[ 1 0 0 0 0 0 0 0 0 0 0 1] +#[ 1 0 0 4 4 0 0 0 0 0 -4 -1] +#[ 1 0 0 0 0 2 0 0 0 -2 0 2] +#[ 1 0 0 0 0 0 0 0 0 0 0 1] +#[ 1 2 0 0 1 0 0 0 -3 0 0 3] +#[ 1 -3 0 0 -1 0 0 0 4 0 0 -4] +#[ 1 0 0 0 0 1 0 0 0 -1 0 1] +#[ 1 0 0 1 1 0 0 0 0 0 -1 -1] +#[ 1 0 0 0 0 0 0 0 0 0 0 1] +) +() +) +() +) +() +) +() +) +(if #[ 0 -2 0 1 1 0 -8] +(if #[ 0 -6 4 3 -1 0 0] +(if #[ 0 -1 0 1 0 0 -1] +(newparm 6 (div #[ 0 1 0 0 0 1 0] + 2) +) +(if #[ 0 -9 4 3 -1 -3 6 0] +(if #[ 0 -1 0 0 0 -1 2 0] +(newparm 7 (div #[ 0 3 0 3 3 1 2 0] + 4) +) +(if #[ 0 -6 0 -3 -3 -4 4 4 0] +(newparm 8 (div #[ 0 0 0 0 0 1 2 2 0] + 3) +) +(newparm 9 (div #[ 0 0 0 0 0 1 0 0 1 0] + 2) +) +(newparm 10 (div #[ 0 1 0 0 0 1 0 0 0 0 1] + 2) +) +(newparm 11 (div #[ 0 2 0 3 3 0 0 0 0 0 0 0] + 4) +) +(list #[ 1 0 0 0 0 0 0 0 0 0 0 0 1] +#[ 1 0 0 4 4 0 0 0 0 0 0 -4 -1] +#[ 1 0 0 0 0 2 0 0 0 0 -2 0 2] +#[ 1 0 0 0 0 1 -1 0 0 0 0 0 0] +#[ 1 2 0 0 1 3 0 0 0 -3 0 0 0] +#[ 1 -3 0 0 -1 -4 0 0 0 4 0 0 0] +#[ 1 0 0 0 0 1 0 0 0 0 -1 0 1] +#[ 1 0 0 1 1 0 0 0 0 0 0 -1 -1] +#[ 1 0 0 0 0 0 0 0 0 0 0 0 1] +) +() +) +() +) +() +) +() +) +() +) +() +) +) +() +) +) +() +) +(if #[ 0 -1 2 -1 0 0 0] +(if #[ 0 -1 2 -2 0 1 1] +(if #[ 0 1 -2 2 0 -1 0] +(if #[ 0 -4 0 7 -1 -2 -2] +() +(if #[ 0 -6 4 3 -1 0 0] +(if #[ 0 4 0 -7 1 2 0] +(newparm 6 (div #[ 0 1 0 1 1 1 0] + 2) +) +(newparm 7 (div #[ 0 1 0 0 0 1 0 1] + 2) +) +(newparm 8 (div #[ 0 0 1 0 2 0 0 0 0] + 3) +) +(list #[ 1 -1 0 1 0 0 0 0 0 0] +#[ 1 -1 0 0 1 0 0 0 0 0] +#[ 1 2 0 -1 3 2 0 -2 -4 2] +#[ 1 -2 0 4 0 0 -1 0 0 0] +#[ 1 1 0 -3 0 0 1 0 0 0] +#[ 1 -1 0 1 0 0 0 0 0 0] +#[ 1 0 0 0 0 1 0 -1 0 1] +#[ 1 -1 0 0 -2 0 0 0 3 0] +#[ 1 1 0 0 3 0 0 0 -4 0] +) +() +) +() +) +) +(if #[ 0 -4 0 7 -1 -2 -2] +() +(if #[ 0 -6 4 3 -1 0 0] +(if #[ 0 -4 0 7 -1 -2 0] +(if #[ 0 4 0 -7 1 2 0] +(newparm 6 (div #[ 0 1 0 1 1 1 0] + 2) +) +(if #[ 0 2 0 -9 -1 0 4 0] +(newparm 7 (div #[ 0 1 0 0 0 1 0 1] + 2) +) +(newparm 8 (div #[ 0 2 0 3 3 0 0 0 0] + 4) +) +(list #[ 1 -1 0 1 0 0 0 0 0 0] +#[ 1 -1 0 0 1 0 0 0 0 0] +#[ 1 2 0 3 3 2 0 -2 -4 2] +#[ 1 -2 0 4 0 0 -1 0 0 0] +#[ 1 1 0 -3 0 0 1 0 0 0] +#[ 1 -1 0 1 0 0 0 0 0 0] +#[ 1 0 0 0 0 1 0 -1 0 1] +#[ 1 -1 0 -3 -2 0 0 0 3 0] +#[ 1 1 0 4 3 0 0 0 -4 0] +) +() +) +() +) +(newparm 6 (div #[ 0 1 0 0 0 1 0] + 2) +) +(if #[ 0 -9 4 3 -1 -3 6 0] +(if #[ 0 -1 0 0 0 -1 2 0] +(newparm 7 (div #[ 0 3 0 3 3 1 2 0] + 4) +) +(if #[ 0 -6 0 -3 -3 -4 4 4 0] +(newparm 8 (div #[ 0 0 0 0 0 1 2 2 0] + 3) +) +(newparm 9 (div #[ 0 0 0 0 0 1 0 0 1 0] + 2) +) +(newparm 10 (div #[ 0 1 0 0 0 1 0 0 0 0 1] + 2) +) +(newparm 11 (div #[ 0 2 0 3 3 0 0 0 0 0 0 0] + 4) +) +(list #[ 1 -1 0 1 0 0 0 0 0 0 0 0 0] +#[ 1 -1 0 0 1 0 0 0 0 0 0 0 0] +#[ 1 2 0 3 3 2 0 0 0 0 -2 -4 2] +#[ 1 0 0 0 0 1 -1 0 0 0 0 0 0] +#[ 1 2 0 0 1 3 0 0 0 -3 0 0 0] +#[ 1 -3 0 0 -1 -4 0 0 0 4 0 0 0] +#[ 1 0 0 0 0 1 0 0 0 0 -1 0 1] +#[ 1 -1 0 -3 -2 0 0 0 0 0 0 3 0] +#[ 1 1 0 4 3 0 0 0 0 0 0 -4 0] +) +() +) +() +) +() +) +) +() +) +) +) +() +) +() +) +) +() +) +) diff --git a/test/crescat.dat b/test/crescat.dat new file mode 100644 index 0000000..aa7fc23 --- /dev/null +++ b/test/crescat.dat @@ -0,0 +1,15 @@ +((( 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 1)()) + 26 0 9 0 -1 1 + (#[1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2] + #[1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3] + #[1 2 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -13] + #[1 2 3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -25] + #[1 2 3 4 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -121] + #[1 2 3 4 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -721] + #[1 2 3 4 5 6 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -5041] + #[1 2 3 4 5 6 7 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -40321] + #[1 2 3 4 5 6 7 8 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -362281] + ) + () + ) + diff --git a/test/dirk.dat b/test/dirk.dat new file mode 100644 index 0000000..29a57e4 --- /dev/null +++ b/test/dirk.dat @@ -0,0 +1,12 @@ +(((i j 1)(m n)) + 2 2 7 0 -1 1 + (#[2 6 -9 0 0] + #[5 -3 0 0 0] + #[2 -10 15 0 0] + #[-2 6 -3 0 0] + #[-2 -6 17 0 0] + #[0 1 0 -1 0] + #[1 0 0 0 -1] + ) + () +) diff --git a/test/dirk.ll b/test/dirk.ll new file mode 100644 index 0000000..b48c861 --- /dev/null +++ b/test/dirk.ll @@ -0,0 +1,41 @@ +(((i j 1)(m n) -1 )(if #[ -4 0 5] +(if #[ 0 -4 3] +() +(if #[ 0 -2 9] +(if #[ 0 -2 3] +(newparm 2 (div #[ 0 2 3] + 6) +) +(newparm 3 (div #[ 0 2 10 7] + 12) +) +(newparm 4 (div #[ 0 4 0 2 1] + 6) +) +() +(if #[ 0 -2 7] +(newparm 2 (div #[ 0 4 3] + 6) +) +(if #[ 0 -8 6 11] +() +() +) +() +) +) +() +) +) +(if #[ -1 0 3] +(if #[ -1 0 2] +(if #[ 10 -2 -15] +() +() +) +() +) +() +) +) +) diff --git a/test/dirks.ll b/test/dirks.ll new file mode 100644 index 0000000..b8a13f6 --- /dev/null +++ b/test/dirks.ll @@ -0,0 +1,2 @@ +(((i j 1)(m n) -1 )() +) diff --git a/test/discr.dat b/test/discr.dat new file mode 100644 index 0000000..5ff9234 --- /dev/null +++ b/test/discr.dat @@ -0,0 +1,23 @@ +((un discriminant de Newpip) + 8 0 18 0 -1 1 + (#[0 -1 1 0 0 0 0 0 -1] + #[0 -1 2 0 0 -1 0 0 -1] + #[0 0 1 -1 0 0 0 0 1] + #[0 -1 0 0 0 1 0 0 -1] + #[0 -1 0 1 0 0 0 0 -2] + #[0 2 0 -3 1 0 0 0 -4] + #[0 -6 4 3 -1 0 0 0 0] + #[0 4 0 -7 1 2 0 0 2] + #[0 1 0 0 0 -1 0 0 2] + #[0 -6 0 7 -1 0 0 0 -4] + #[0 3 2 -7 1 1 0 0 0] + #[0 3 0 -5 1 1 0 0 -2] + #[0 4 0 -7 1 2 0 0 0] + #[0 1 0 1 1 1 -2 0 0] + #[0 -1 0 -1 -1 -1 2 0 1] + #[0 1 0 0 0 1 0 -2 1] + #[0 -1 0 0 0 -1 0 2 0] + #[0 1 -1 0 0 1 0 -1 0] + ) + () +) diff --git a/test/equus.dat b/test/equus.dat new file mode 100644 index 0000000..d17d2c7 --- /dev/null +++ b/test/equus.dat @@ -0,0 +1,7 @@ +((equation impossible) + 1 1 2 0 -1 1 + (#[4 -1 2] + #[-4 1 -2] + ) + () +) diff --git a/test/invert.dat b/test/invert.dat new file mode 100644 index 0000000..8f472fc --- /dev/null +++ b/test/invert.dat @@ -0,0 +1,10 @@ +( (Lower bound on j after loop inversion + (unknowns j i) + (parameters k m n)) + 2 3 3 1 -1 1 + ( #[0 -1 0 0 1 0] + #[-1 0 0 0 0 1] + #[1 1 0 -1 0 0] + ) + ( #[-1 1 1 0]) +) diff --git a/test/invert.ll b/test/invert.ll new file mode 100644 index 0000000..266603a --- /dev/null +++ b/test/invert.ll @@ -0,0 +1,11 @@ +( (Lower bound on j after loop inversion + (unknowns j i) + (parameters k m n) 1 )(if #[ -1 1 0 0] +(list #[ 0 0 0 0] +#[ 1 0 0 0] +) +(list #[ 1 -1 0 0] +#[ 0 1 0 0] +) +) +) diff --git a/test/linear.dat b/test/linear.dat new file mode 100644 index 0000000..65d5a51 --- /dev/null +++ b/test/linear.dat @@ -0,0 +1,10 @@ +((linearisation d'un tableau 100 100) + 2 1 4 1 -1 1 + (#[100 1 0 -1] + #[-100 -1 0 1] + #[-1 0 99 0] + #[0 -1 99 0] + ) + (#[-1 9999] + ) +) diff --git a/test/lineri.dat b/test/lineri.dat new file mode 100644 index 0000000..4c13e66 --- /dev/null +++ b/test/lineri.dat @@ -0,0 +1,9 @@ +((linearisation d'un tableau 100 100) + 1 1 3 1 -1 1 + (#[-1 99 0] + #[-100 0 1] + #[100 99 -1] + ) + (#[-1 9999] + ) +) diff --git a/test/lineri.ll b/test/lineri.ll new file mode 100644 index 0000000..ea05d6d --- /dev/null +++ b/test/lineri.ll @@ -0,0 +1,10 @@ +((linearisation d'un tableau 100 100 1 )(if #[ -1 99] +(list #[ 0 0] +) +(newparm 1 (div #[ 99 99] + 100) +) +(list #[ 1 -1 0] +) +) +) diff --git a/test/loz.dat b/test/loz.dat new file mode 100644 index 0000000..234dd9c --- /dev/null +++ b/test/loz.dat @@ -0,0 +1,15 @@ +( + ( Solving MIN(i-2.j) under the following constraints: + Unknowns may be negative. + Order: + f' i' j' constant G P n' + ) + 3 3 5 0 4 1 + ( + #[ 0 1 1 20 -2 -4 4 ] + #[ 1 -1 2 0 -2 0 0 ] + #[ 0 -1 -1 0 2 0 0 ] + #[ 0 1 -1 10 0 -2 2 ] + #[ 0 -1 1 10 0 -2 2 ] + ) + ( )) diff --git a/test/loz.ll b/test/loz.ll new file mode 100644 index 0000000..5bdd379 --- /dev/null +++ b/test/loz.ll @@ -0,0 +1,13 @@ +( + ( Solving MIN(i-2.j) under the following constraints: + Unknowns may be negative. + Order: + f' i' j' constant G P n' + -1 )(if #[ 0 -1 1 5] +(list #[ 1 3 -3 -15] +#[ 1 1 -1 -5] +#[ 1 -1 1 5] +) +() +) +) diff --git a/test/max.dat b/test/max.dat new file mode 100644 index 0000000..fdb71c5 --- /dev/null +++ b/test/max.dat @@ -0,0 +1,9 @@ +((a maximization problem) + 2 1 4 0 -1 1 + (#[-1 0 0 1] + #[0 -1 0 1] + #[-1 3 12 -2] + #[2 -1 3 -1] + ) + () +) diff --git a/test/max.ll b/test/max.ll new file mode 100644 index 0000000..205ce06 --- /dev/null +++ b/test/max.ll @@ -0,0 +1,22 @@ +((a maximization problem 1 )(if #[ -1 6] +(if #[ -1 3] +(list #[ 0 0] +#[ 0 0] +) +(if #[ -5 27] +(newparm 1 (div #[ 1 1] + 2) +) +(list #[ 1 -1 -1] +#[ 0 0 0] +) +(list #[ 1 -4] +#[ 1 -5] +) +) +) +(list #[ 1 -4] +#[ 1 -5] +) +) +) diff --git a/test/maxb.dat b/test/maxb.dat new file mode 100644 index 0000000..02db81a --- /dev/null +++ b/test/maxb.dat @@ -0,0 +1,9 @@ +((a maximization problem) + 2 1 4 0 3 1 + (#[-1 0 0 1] + #[0 -1 0 1] + #[-1 3 12 -2] + #[2 -1 3 -1] + ) + () +) diff --git a/test/maxb.ll b/test/maxb.ll new file mode 100644 index 0000000..c033988 --- /dev/null +++ b/test/maxb.ll @@ -0,0 +1,4 @@ +((a maximization problem 1 )(list #[ 1 -4] +#[ 1 -5] +) +) diff --git a/test/pairi.dat b/test/pairi.dat new file mode 100644 index 0000000..9f604cd --- /dev/null +++ b/test/pairi.dat @@ -0,0 +1,7 @@ +((les nombres pairs) + 1 1 2 0 -1 1 + (#[2 0 -1] + #[-6 1 3] + ) + () +) diff --git a/test/petit.dat b/test/petit.dat new file mode 100644 index 0000000..5d23e19 --- /dev/null +++ b/test/petit.dat @@ -0,0 +1,9 @@ +((( 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 1)()) + 3 0 3 0 -1 1 + (#[1 0 0 -2] + #[1 2 0 -3] + #[1 2 3 -7] + ) + () + ) + diff --git a/test/rairo.dat b/test/rairo.dat new file mode 100644 index 0000000..f315858 --- /dev/null +++ b/test/rairo.dat @@ -0,0 +1,9 @@ +((test du papier RAIRO) + 2 3 4 0 -1 0 + (#[-1 0 0 0 1 0] + #[0 -1 0 0 0 1] + #[-2 -1 0 -1 2 1] + #[2 1 0 1 -2 -1] + ) + () +) diff --git a/test/rairoi.dat b/test/rairoi.dat new file mode 100644 index 0000000..09f6d0b --- /dev/null +++ b/test/rairoi.dat @@ -0,0 +1,9 @@ +((test du papier RAIRO) + 2 3 4 0 -1 1 + (#[-1 0 0 0 1 0] + #[0 -1 0 0 0 1] + #[-2 -1 0 -1 2 1] + #[2 1 0 1 -2 -1] + ) + () +) diff --git a/test/test.dat b/test/test.dat new file mode 100644 index 0000000..00ba803 --- /dev/null +++ b/test/test.dat @@ -0,0 +1,10 @@ +((variables : a b c d ...., pas de parametres) + 5 0 3 0 -1 0 + (#[1 0 0 0 0 -2] + #[1 2 0 0 0 -3] + #[1 2 3 0 0 -7] + #[1 2 3 4 0 -25] + #[1 2 3 4 5 -121] + ) + () +) diff --git a/test/test10i.dat b/test/test10i.dat new file mode 100644 index 0000000..abcfc1a --- /dev/null +++ b/test/test10i.dat @@ -0,0 +1,15 @@ +((variables : a b c d ...., pas de parametres) + 10 0 10 0 -1 1 + (#[1 0 0 0 0 0 0 0 0 0 -2] + #[1 2 0 0 0 0 0 0 0 0 -3] + #[1 2 3 0 0 0 0 0 0 0 -7] + #[1 2 3 4 0 0 0 0 0 0 -25] + #[1 2 3 4 5 0 0 0 0 0 -121] + #[1 2 3 4 5 6 0 0 0 0 -721] + #[1 2 3 4 5 6 7 0 0 0 -5041] + #[1 2 3 4 5 6 7 8 0 0 -40321] + #[1 2 3 4 5 6 7 8 9 0 -362881] + #[1 2 3 4 5 6 7 8 9 10 -3628801] + ) + () +) diff --git a/test/test11.dat b/test/test11.dat new file mode 100644 index 0000000..70cf418 --- /dev/null +++ b/test/test11.dat @@ -0,0 +1,16 @@ +((variables : a b c d ...., pas de parametres) + 11 0 11 0 -1 0 + (#[1 0 0 0 0 0 0 0 0 0 0 -2] + #[1 2 0 0 0 0 0 0 0 0 0 -3] + #[1 2 3 0 0 0 0 0 0 0 0 -7] + #[1 2 3 4 0 0 0 0 0 0 0 -25] + #[1 2 3 4 5 0 0 0 0 0 0 -121] + #[1 2 3 4 5 6 0 0 0 0 0 -721] + #[1 2 3 4 5 6 7 0 0 0 0 -5041] + #[1 2 3 4 5 6 7 8 0 0 0 -40321] + #[1 2 3 4 5 6 7 8 9 0 0 -362881] + #[1 2 3 4 5 6 7 8 9 10 0 -3628801] + #[1 2 3 4 5 6 7 8 9 10 11 -39916801] + ) + () +) diff --git a/test/test11i.dat b/test/test11i.dat new file mode 100644 index 0000000..13fbf2e --- /dev/null +++ b/test/test11i.dat @@ -0,0 +1,16 @@ +((variables : a b c d ...., pas de parametres) + 11 0 11 0 -1 1 + (#[1 0 0 0 0 0 0 0 0 0 0 -2] + #[1 2 0 0 0 0 0 0 0 0 0 -3] + #[1 2 3 0 0 0 0 0 0 0 0 -7] + #[1 2 3 4 0 0 0 0 0 0 0 -25] + #[1 2 3 4 5 0 0 0 0 0 0 -121] + #[1 2 3 4 5 6 0 0 0 0 0 -721] + #[1 2 3 4 5 6 7 0 0 0 0 -5041] + #[1 2 3 4 5 6 7 8 0 0 0 -40321] + #[1 2 3 4 5 6 7 8 9 0 0 -362881] + #[1 2 3 4 5 6 7 8 9 10 0 -3628801] + #[1 2 3 4 5 6 7 8 9 10 11 -39916801] + ) + () +) diff --git a/test/test12.dat b/test/test12.dat new file mode 100644 index 0000000..41cbd05 --- /dev/null +++ b/test/test12.dat @@ -0,0 +1,17 @@ +((variables : a b c d ...., pas de parametres) + 12 0 12 0 -1 0 + (#[1 0 0 0 0 0 0 0 0 0 0 0 -2] + #[1 2 0 0 0 0 0 0 0 0 0 0 -3] + #[1 2 3 0 0 0 0 0 0 0 0 0 -7] + #[1 2 3 4 0 0 0 0 0 0 0 0 -25] + #[1 2 3 4 5 0 0 0 0 0 0 0 -121] + #[1 2 3 4 5 6 0 0 0 0 0 0 -721] + #[1 2 3 4 5 6 7 0 0 0 0 0 -5041] + #[1 2 3 4 5 6 7 8 0 0 0 0 -40321] + #[1 2 3 4 5 6 7 8 9 0 0 0 -362881] + #[1 2 3 4 5 6 7 8 9 10 0 0 -3628801] + #[1 2 3 4 5 6 7 8 9 10 11 0 -39916801] + #[1 2 3 4 5 6 7 8 9 10 11 12 -479001601] + ) + () +) diff --git a/test/test12i.dat b/test/test12i.dat new file mode 100644 index 0000000..5881897 --- /dev/null +++ b/test/test12i.dat @@ -0,0 +1,17 @@ +((variables : a b c d ...., pas de parametres) + 12 0 12 0 -1 1 + (#[1 0 0 0 0 0 0 0 0 0 0 0 -2] + #[1 2 0 0 0 0 0 0 0 0 0 0 -3] + #[1 2 3 0 0 0 0 0 0 0 0 0 -7] + #[1 2 3 4 0 0 0 0 0 0 0 0 -25] + #[1 2 3 4 5 0 0 0 0 0 0 0 -121] + #[1 2 3 4 5 6 0 0 0 0 0 0 -721] + #[1 2 3 4 5 6 7 0 0 0 0 0 -5041] + #[1 2 3 4 5 6 7 8 0 0 0 0 -40321] + #[1 2 3 4 5 6 7 8 9 0 0 0 -362881] + #[1 2 3 4 5 6 7 8 9 10 0 0 -3628801] + #[1 2 3 4 5 6 7 8 9 10 11 0 -39916801] + #[1 2 3 4 5 6 7 8 9 10 11 12 -479001601] + ) + () +) diff --git a/test/test12i.ll b/test/test12i.ll new file mode 100644 index 0000000..0ecb1a6 --- /dev/null +++ b/test/test12i.ll @@ -0,0 +1,14 @@ +((variables : a b c d ...., pas de parametres 15120 )(list #[ 2] +#[ 1] +#[ 1] +#[ 5] +#[ 19] +#[ 100] +#[ 617] +#[ 4410] +#[ 35840] +#[ 326592] +#[ 3298910] +#[ 36590400] +) +) diff --git a/test/test2.dat b/test/test2.dat new file mode 100644 index 0000000..686dc36 --- /dev/null +++ b/test/test2.dat @@ -0,0 +1,7 @@ +((variables : a b c d ...., pas de parametres) + 2 0 2 0 -1 0 + (#[1 0 -2] + #[1 2 -3] + ) + () +) diff --git a/test/test2i.dat b/test/test2i.dat new file mode 100644 index 0000000..1f64e93 --- /dev/null +++ b/test/test2i.dat @@ -0,0 +1,7 @@ +((variables : a b c d ...., pas de parametres) + 2 0 2 0 -1 1 + (#[1 0 -2] + #[1 2 -3] + ) + () +) diff --git a/test/test3.dat b/test/test3.dat new file mode 100644 index 0000000..87f4753 --- /dev/null +++ b/test/test3.dat @@ -0,0 +1,8 @@ +((variables : a b c d ...., pas de parametres) + 3 0 3 0 -1 0 + (#[1 0 0 -2] + #[1 2 0 -3] + #[1 2 3 -7] + ) + () +) diff --git a/test/test3i.dat b/test/test3i.dat new file mode 100644 index 0000000..e9a1198 --- /dev/null +++ b/test/test3i.dat @@ -0,0 +1,8 @@ +((variables : a b c d ...., pas de parametres) + 3 0 3 0 -1 1 + (#[1 0 0 -2] + #[1 2 0 -3] + #[1 2 3 -7] + ) + () +) diff --git a/test/test4.dat b/test/test4.dat new file mode 100644 index 0000000..87f95f6 --- /dev/null +++ b/test/test4.dat @@ -0,0 +1,9 @@ +((variables : a b c d ...., pas de parametres) + 4 0 4 0 -1 0 + (#[1 0 0 0 -2] + #[1 2 0 0 -3] + #[1 2 3 0 -7] + #[1 2 3 4 -25] + ) + () +) diff --git a/test/test4i.dat b/test/test4i.dat new file mode 100644 index 0000000..dfd15f6 --- /dev/null +++ b/test/test4i.dat @@ -0,0 +1,9 @@ +((variables : a b c d ...., pas de parametres) + 4 0 4 0 -1 1 + (#[1 0 0 0 -2] + #[1 2 0 0 -3] + #[1 2 3 0 -7] + #[1 2 3 4 -25] + ) + () +) diff --git a/test/test5.dat b/test/test5.dat new file mode 100644 index 0000000..f7ab36d --- /dev/null +++ b/test/test5.dat @@ -0,0 +1,10 @@ +((variables : a b c d ...., pas de parametres) + 5 0 5 0 -1 0 + (#[1 0 0 0 0 -2] + #[1 2 0 0 0 -3] + #[1 2 3 0 0 -7] + #[1 2 3 4 0 -25] + #[1 2 3 4 5 -121] + ) + () +) diff --git a/test/test5i.dat b/test/test5i.dat new file mode 100644 index 0000000..bd29aea --- /dev/null +++ b/test/test5i.dat @@ -0,0 +1,10 @@ +((variables : a b c d ...., pas de parametres) + 5 0 5 0 -1 1 + (#[1 0 0 0 0 -2] + #[1 2 0 0 0 -3] + #[1 2 3 0 0 -7] + #[1 2 3 4 0 -25] + #[1 2 3 4 5 -121] + ) + () +) diff --git a/test/test6.dat b/test/test6.dat new file mode 100644 index 0000000..b3c3e5c --- /dev/null +++ b/test/test6.dat @@ -0,0 +1,11 @@ +((variables : a b c d ...., pas de parametres) + 6 0 6 0 -1 0 + (#[1 0 0 0 0 0 -2] + #[1 2 0 0 0 0 -3] + #[1 2 3 0 0 0 -7] + #[1 2 3 4 0 0 -25] + #[1 2 3 4 5 0 -121] + #[1 2 3 4 5 6 -721] + ) + () +) diff --git a/test/test6i.dat b/test/test6i.dat new file mode 100644 index 0000000000000000000000000000000000000000..4fe34ab19f60e97574aed000674f3820f7ea06c1 GIT binary patch literal 206 zcwP(e3{U`pfFLgh1Xz)_UO{i;J8=ev5JxAlypy9hlDtOwb%m8)$$UV0*WeHnpuCG? z2$H;8^d<$Kc@u!FfFS=c&tQKA6%`c)gnWbd7bp*;Ujb8p