DyLP-1.6.0/0000755000076700007670000000000011414302700007254 5ustar DyLP-1.6.0/README0000644000076700007670000000042010444601524010140 0ustar To install this package, please look at the INSTALL file. This package contains several subdirectories corresponding to COIN-OR projects (www.coin-or.org). The AUTHORS, LICENSE and README files in each of the subdirectories give more information about these projects. DyLP-1.6.0/INSTALL0000644000076700007670000001016511267165330010324 0ustar These instructions are for UNIX-like systems (including Linux, Cygwin and MSys) only. If Microsoft Developer Studio projects are maintained for this package, you can find instructions at https://projects.coin-or.org/MSVisualStudio ********************************************************************** *** DOWNLOAD *** ********************************************************************** You can obtain the source code for the DyLP package in two ways: 1. Obtain the source directly from the COIN-OR subversion repository (recommended). For this you needs the program 'svn' installed on your machine, and output of "svn --version" must contain "handles 'https' scheme". Assuming that you want to download the code into a subdirectory "COIN-DyLP", you type svn co https://projects.coin-or.org/svn/DyLP/trunk Coin-DyLP 2. Download the tarball from http://www.coin-or.org/Tarballs/DyLP and extract it, for example, with gunzip DyLP_2006Jun07.tgz tar xvf DyLP_2006Jun07.tar (Here "2006Jun07" is of course replaced by the string in the tarball you downloaded.) More detailed download instructions can be found at https://projects.coin-or.org/BuildTools/wiki/user-download ********************************************************************** *** CONFIGURATION *** ********************************************************************** Go into the directory that you just downloaded or extracted (e.g., Coin-DyLP or DyLP_2006Jun07). Then you type ./configure Note that you might have to specify additional options, in case you don't want to use the default choices that configure makes (e.g., compilers). Please visit https://projects.coin-or.org/BuildTools/wiki/user-configure and the DyLP Trac page https://projects.coin-or.org/DyLP for more information. If everything went fine, you will see at the end of the output "Main configuration of DyLP successful" ********************************************************************** *** COMPILATION AND INSTALLATION *** ********************************************************************** In the directory where you ran the configure script: 1. Compile the code by typing make 2. To test if the code works, you can type make test 3. To install the code, you type make install After this, you will find the executables, libraries and header files in the "bin", "lib" and "include" subdirectory, respectively. More information on the compilation and installation can be found at https://projects.coin-or.org/BuildTools/wiki/user-compile ********************************************************************** *** USING THE LIBRARIES *** ********************************************************************** Now you can link your own code with the installed libraries. You can find examples in the DyLP/examples/ subdirectory. To build dylp's example drivers, cd to DyLP/examples and read the README file there. It contains detailed instructions. See also the information at https://projects.coin-or.org/BuildTools/wiki/user-examples ********************************************************************** *** DOCUMENTATION *** ********************************************************************** In the DyLP/doc directory, you'll find a longish (about 90 pages) tech report (PostScript and PDF) which explains the algorithms used in dylp and the options and interfaces that are available. The code itself is heavily commented. Section 12, `Dynamic Simplex', (in particular, Fig. 3) is your best bet for a high-level overview of the dynamic simplex algorithm. OsiDylp, the OSI interface layer for dylp, is commented using doxygen conventions, but dylp is not (yet). LaTeX source for the tech report is included, should you want to build the documentation from scratch. There's no guarantee this will go smoothly, but your chances are fairly good if you have a modern TeX distribution. See the README in DyLP/doc. DyLP-1.6.0/Dependencies0000644000076700007670000000011111414231451011562 0ustar BuildTools https://projects.coin-or.org/svn/BuildTools/releases/0.5.30/ DyLP-1.6.0/depcomp0000755000076700007670000003710010442173473010647 0ustar #! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2005-07-09.11 # Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by `PROGRAMS ARGS'. object Object file output by `PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputing dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> $depfile echo >> $depfile # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> $depfile else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts `$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'` tmpdepfile="$stripped.u" if test "$libtool" = yes; then "$@" -Wc,-M else "$@" -M fi stat=$? if test -f "$tmpdepfile"; then : else stripped=`echo "$stripped" | sed 's,^.*/,,'` tmpdepfile="$stripped.u" fi if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi if test -f "$tmpdepfile"; then outname="$stripped.o" # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mecanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for `:' # in the target name. This is to cope with DOS-style filenames: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # X makedepend shift cleared=no for arg in "$@"; do case $cleared in no) set ""; shift cleared=yes ;; esac case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix="`echo $object | sed 's/^.*\././'`" touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. "$@" || exit $? IFS=" " for arg do case "$arg" in "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: DyLP-1.6.0/LICENSE0000644000076700007670000000032310445627054010276 0ustar For licensing information for files in this directory, please see the comments in the header of each file. For licensing of files in each of the subdirectories, please see the LICENSE file in that subdirectory. DyLP-1.6.0/Makefile.in0000644000076700007670000005644211267165330011350 0ustar # Makefile.in generated by automake 1.9.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2006 International Business Machines and others. # All Rights Reserved. # This file is distributed under the Common Public License. # Author: Andreas Waechter IBM 2006-04-13 # Copyright (C) 2006, 2007 International Business Machines and others. # All Rights Reserved. # This file is distributed under the Common Public License. # Author: Andreas Waechter IBM 2006-04-13 ######################################################################## # Documentation installation # ######################################################################## srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = . am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = README $(am__configure_deps) \ $(srcdir)/BuildTools/Makemain.inc $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(top_srcdir)/configure INSTALL \ config.guess config.sub depcomp install-sh ltmain.sh missing @HAVE_EXTERNALS_TRUE@am__append_1 = Externals @HAVE_EXTERNALS_TRUE@am__append_2 = .Externals-stamp subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno configure.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-exec-recursive install-info-recursive \ install-recursive installcheck-recursive installdirs-recursive \ pdf-recursive ps-recursive uninstall-info-recursive \ uninstall-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ { test ! -d $(distdir) \ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -fr $(distdir); }; } DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ ADD_CFLAGS = @ADD_CFLAGS@ ADD_CXXFLAGS = @ADD_CXXFLAGS@ ADD_FFLAGS = @ADD_FFLAGS@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AUX_DIR = @AUX_DIR@ AWK = @AWK@ BUILDTOOLSDIR = @BUILDTOOLSDIR@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CDEFS = @CDEFS@ CFLAGS = @CFLAGS@ COIN_SKIP_PROJECTS = @COIN_SKIP_PROJECTS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEFS = @CXXDEFS@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DBG_CFLAGS = @DBG_CFLAGS@ DBG_CXXFLAGS = @DBG_CXXFLAGS@ DBG_FFLAGS = @DBG_FFLAGS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ HAVE_EXTERNALS_FALSE = @HAVE_EXTERNALS_FALSE@ HAVE_EXTERNALS_TRUE = @HAVE_EXTERNALS_TRUE@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBEXT = @LIBEXT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLM4 = @LIBTOOLM4@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_LDFLAGS = @LT_LDFLAGS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ MPICC = @MPICC@ MPICXX = @MPICXX@ MPIF77 = @MPIF77@ OBJEXT = @OBJEXT@ OPT_CFLAGS = @OPT_CFLAGS@ OPT_CXXFLAGS = @OPT_CXXFLAGS@ OPT_FFLAGS = @OPT_FFLAGS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ RPATH_FLAGS = @RPATH_FLAGS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ VPATH_DISTCLEANFILES = @VPATH_DISTCLEANFILES@ abs_bin_dir = @abs_bin_dir@ abs_include_dir = @abs_include_dir@ abs_lib_dir = @abs_lib_dir@ abs_source_dir = @abs_source_dir@ ac_c_preproc_warn_flag = @ac_c_preproc_warn_flag@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ ac_cxx_preproc_warn_flag = @ac_cxx_preproc_warn_flag@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ have_autoconf = @have_autoconf@ have_automake = @have_automake@ have_svn = @have_svn@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sol_cc_compiler = @sol_cc_compiler@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ AUTOMAKE_OPTIONS = foreign EXTRA_DIST = doxydoc/doxygen.conf INSTALL LICENSE README \ $(am__append_1) ######################################################################## # Subdirectories # ######################################################################## # subdirs is set by configure as the list of all subdirectories to recurse # into SUBDIRS = $(subdirs) ######################################################################## # Maintainer Stuff # ######################################################################## # Files that are generated and should be cleaned with make distclean DISTCLEANFILES = $(am__append_2) $(VPATH_DISTCLEANFILES) DocFiles = README AUTHORS LICENSE DocInstallDir = $(prefix)/share/doc/coin/$(PACKAGE_NAME) all: all-recursive .SUFFIXES: am--refresh: @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/BuildTools/Makemain.inc $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \ cd $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(am__remove_distdir) mkdir $(distdir) $(mkdir_p) $(distdir)/BuildTools $(distdir)/doxydoc @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(mkdir_p) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ distdir) \ || exit 1; \ fi; \ done -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r $(distdir) dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod a+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && cd $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}' distuninstallcheck: @cd $(distuninstallcheck_dir) \ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-libtool \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-exec-am: install-info: install-info-recursive install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-info-am uninstall-info: uninstall-info-recursive .PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \ check-am clean clean-generic clean-libtool clean-recursive \ ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \ dist-shar dist-tarZ dist-zip distcheck distclean \ distclean-generic distclean-libtool distclean-recursive \ distclean-tags distcleancheck distdir distuninstallcheck dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-exec install-exec-am \ install-info install-info-am install-man install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic \ maintainer-clean-recursive mostlyclean mostlyclean-generic \ mostlyclean-libtool mostlyclean-recursive pdf pdf-am ps ps-am \ tags tags-recursive uninstall uninstall-am uninstall-info-am ######################################################################## # Extra Targets # ######################################################################## test: all cd DyLP; $(MAKE) test tests: all for dir in $(subdirs); do \ if test -r $$dir/test/Makefile; then \ (cd $$dir; $(MAKE) test) \ fi; \ done unitTests: tests doxydoc: cd $(srcdir); doxygen doxydoc/doxygen.conf .PHONY: tests unitTests doxydoc install-doc: $(DocFiles) test -z "$(DocInstallDir)" || $(mkdir_p) "$(DESTDIR)$(DocInstallDir)" for file in $(DocFiles); do \ if test -f "$$file"; then dir=; else dir="$(srcdir)/"; fi; \ if test -f "$$dir$$file"; then $(INSTALL_DATA) "$$dir$$file" "$(DESTDIR)$(DocInstallDir)/$$file"; fi; \ done uninstall-doc: for file in $(DocFiles); do \ rm -f "$(DESTDIR)$(DocInstallDir)/$$file"; \ done ######################################################################## # Maintainer Stuff # ######################################################################## # Make sure acinclude is using most recent coin.m4 @MAINTAINER_MODE_TRUE@$(srcdir)/acinclude.m4: $(BUILDTOOLSDIR)/coin.m4 @MAINTAINER_MODE_TRUE@ cat $(LIBTOOLM4) $< > $@ # Make sure the autotools scripts are up to date @MAINTAINER_MODE_TRUE@$(AUX_DIR)/install-sh: $(BUILDTOOLSDIR)/install-sh @MAINTAINER_MODE_TRUE@ cp $< $@ @MAINTAINER_MODE_TRUE@$(AUX_DIR)/missing: $(BUILDTOOLSDIR)/missing @MAINTAINER_MODE_TRUE@ cp $< $@ @MAINTAINER_MODE_TRUE@$(AUX_DIR)/config.guess: $(BUILDTOOLSDIR)/config.guess @MAINTAINER_MODE_TRUE@ cp $< $@ @MAINTAINER_MODE_TRUE@$(AUX_DIR)/config.sub: $(BUILDTOOLSDIR)/config.sub @MAINTAINER_MODE_TRUE@ cp $< $@ @MAINTAINER_MODE_TRUE@$(AUX_DIR)/depcomp: $(BUILDTOOLSDIR)/depcomp @MAINTAINER_MODE_TRUE@ cp $< $@ @MAINTAINER_MODE_TRUE@$(AUX_DIR)/ltmain.sh: $(BUILDTOOLSDIR)/ltmain.sh @MAINTAINER_MODE_TRUE@ cp $< $@ # Take care of updating externals (if Externals file exists) @HAVE_EXTERNALS_TRUE@@MAINTAINER_MODE_TRUE@$(top_builddir)/Makefile: .Externals-stamp @HAVE_EXTERNALS_TRUE@@MAINTAINER_MODE_TRUE@.Externals-stamp: $(srcdir)/Externals @HAVE_EXTERNALS_TRUE@@MAINTAINER_MODE_TRUE@ cd $(srcdir); svn propset svn:externals -F Externals . @HAVE_EXTERNALS_TRUE@@MAINTAINER_MODE_TRUE@ touch .Externals-stamp @HAVE_EXTERNALS_TRUE@@MAINTAINER_MODE_TRUE@update-externals: .Externals-stamp @HAVE_EXTERNALS_TRUE@@MAINTAINER_MODE_TRUE@ cd $(srcdir); svn update .PHONY: install-doc uninstall-doc update-externals # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: DyLP-1.6.0/DyLP/0000755000076700007670000000000011414302677010101 5ustar DyLP-1.6.0/DyLP/README0000644000076700007670000000537711267165330010774 0ustar Dylp: An implementation of the dynamic simplex algorithm Dylp is a linear programming solver, based on the dynamic simplex algorithm. Roughly, this means that dylp attempts to maintain an active constraint system which consists of only those constraints and variables that are relevant at the current extreme point. The bet is that this will be a useful property in situations where the same constraint system is repeatedly modified and reoptimised (e.g., in a branch-cut-price MIP code). You can also tell dylp to operate with the full constraint system, which is useful for obtaining an initial solution. Dylp is built to be a research and development code. It can produce a range of statistics, and it can tell you more about how it's solving your problem than most people will ever want to know. It also includes extensive cross checks to catch errors during program development. Dylp development takes place in a Sun Solaris/Workshop programming environment, most recently Solaris 10 and Sun Studio 12 (cc 5.9). It is also tested in Linux and Windows environments. COIN-OR places some importance on Windows compatibility, and if you can build COIN at all, then dylp should run. If it doesn't, please report the problem by filing a ticket at https://projects.coin-or.org/DyLP/ Generally speaking, if your computing environment supports IEEE floating point then it should be possible to port dylp with very little effort. ============================================================================ Maintainer: Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca Web pages: Eh, what to say here. COIN is still settling into its infrastructure, so this may be out-of-date by the time you read it. But, if you've managed to acquire the code, you're probably over that already. Here's a selection of resources: http://www.coin-or.org/projects The main COIN-OR projects page. https://projects.coin-or.org/DyLP Dylp's Trac page. From here, you can read about dylp, browse the code, and file tickets for bug reports. SVN repository: https://www.coin-or.org/svn/DyLP/trunk development branch https://www.coin-or.org/svn/DyLP/stable stable branches https://www.coin-or.org/svn/DyLP/releases releases The releases are frozen snapshots of the corresponding stable branches. Stable branches get bug fixes, which eventually trigger a new release. Unless you have some good reason to do otherwise, pick the highest numbered stable branch or release. Mailing list: http://list.coin-or.org/mailman/listinfo/dylp If you're using DyLP via the OsiDylp interface, you probably want to monitor the Osi mailing list. DyLP-1.6.0/DyLP/test/0000755000076700007670000000000011414302674011055 5ustar DyLP-1.6.0/DyLP/test/dytest_solutions.c0000644000076700007670000007101711245632140014656 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2008 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains routines to test dylp's solution routines: dy_colPrimals, dy_rowPrimals, dy_colDuals, dy_rowDuals, and dy_allDuals. */ #include "dylp.h" extern ioid dy_logchn ; extern bool dy_gtxecho ; int dytest_rowDuals (lpprob_struct *main_lp, lptols_struct *main_lptols, lpopts_struct *main_lpopts) /* This routine checks the dual variables returned by dy_rowDuals. It checks that y = c(inv(B)). Columns of the basis inverse are obtained from the routine dy_betaj. Parameters: main_lp: the lp problem structure main_lptols: the lp tolerance structure main_lpopts: the lp options structure Returns: 0 if y = cinv(B), error count otherwise. */ { int i,j,k,m,n ; consys_struct *sys ; flags *status ; double *y ; double *cB ; int *basis2sys ; basisel_struct *basisVec ; int basisLen ; double *betai ; double cBdotbetai ; int errcnt ; char *rtnnme = "dytest_rowDuals" ; /* Do a little initialisation. Mention that we've started. */ sys = main_lp->consys ; m = sys->concnt ; n = sys->varcnt ; # ifndef DYLP_NDEBUG if (main_lpopts->print.soln >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: checking y = cinv(B) using %s (%d x %d).", rtnnme,sys->nme,m,n) ; if (main_lpopts->print.soln >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, " basis contains %d entries.\n",main_lp->basis->len) ; } } # endif /* Acquire the row duals and the status vector. For this check, we can use the min primal sign convention. */ y = NULL ; dy_rowDuals(main_lp,&y,FALSE) ; status = main_lp->status ; /* Make a vector c of objective coefficients in basis order. This is considerably easier than creating a basis matrix (as is done for tableau testing). By construction, the basic variables for inactive constraints are the logicals, which have an objective coefficient of zero, and this is how cB and basis2sys are initialised. All that need be done for c is to change the entries that are associated with architecturals. For the basis, we need to set all entries (logicals can be basic out of natural position). Recall that basic logicals are represented by negative indices. */ cB = (double *) MALLOC((m+1)*sizeof(double)) ; basis2sys = (int *) MALLOC((m+1)*sizeof(int)) ; for (i = 1 ; i <= m ; i++) { cB[i] = 0.0 ; basis2sys[i] = -i ; } basisLen = main_lp->basis->len ; basisVec = main_lp->basis->el ; for (k = 1 ; k <= basisLen ; k++) { i = basisVec[k].cndx ; j = basisVec[k].vndx ; if (j > 0) { cB[i] = sys->obj[j] ; basis2sys[i] = j ; } else { basis2sys[i] = j ; } } # ifndef DYLP_NDEBUG if (main_lpopts->print.soln >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\tc =") ; k = 0 ; for (i = 1 ; i <= m ; i++) { if (cB[i] != 0) { if ((++k)%4 == 0) { k = 0 ; dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t ") ; } j = basis2sys[i] ; dyio_outfmt(dy_logchn,dy_gtxecho," (%d %g %s %d)", i,cB[i],consys_nme(sys,'v',j,FALSE,NULL),j) ; } } } # endif /* Now step through the rows (equivalently, walk the basis) and see if y = cbeta, where beta is the column of inv(B) such that x is basic in pos'n i. */ errcnt = 0 ; betai = NULL ; for (i = 1 ; i <= m ; i++) { j = basis2sys[i] ; if (dy_betaj(main_lp,j,&betai) == FALSE) { errcnt++ ; if (j < 0) { j = n-j ; } errmsg(952,rtnnme,sys->nme,"column",i,"variable", consys_nme(sys,'v',j,FALSE,NULL),j-n) ; continue ; } cBdotbetai = 0 ; for (k = 1 ; k <= m ; k++) { /* dyio_outfmt(dy_logchn,dy_gtxecho, "\n %s (%d) %g * %g", consys_nme(sys,'c',k,FALSE,NULL),k,cB[k],betai[k]) ; */ cBdotbetai += cB[k]*betai[k] ; } if (fabs(cBdotbetai-y[i]) > main_lptols->cost) { errcnt++ ; if (j < 0) { j = n-j ; } dyio_outfmt(dy_logchn,dy_gtxecho, "\n ERROR: pos'n %d %s (%d) c dot beta = %g; ", i,consys_nme(sys,'v',j,FALSE,NULL),j-n,cBdotbetai) ; dyio_outfmt(dy_logchn,dy_gtxecho,"expected %g; err %g, tol %g.", y[i],(cBdotbetai-y[i]),main_lptols->zero) ; } } /* Free up space and report the result. */ if (cB != NULL) FREE(cB) ; if (basis2sys != NULL) FREE(basis2sys) ; if (betai != NULL) FREE(betai) ; if (y != NULL) FREE(y) ; if (errcnt != 0) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: found %d errors testing y = cinv(B).\n", rtnnme,errcnt) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho,"\n%s: pass y = cinv(B).\n",rtnnme) ; } return (errcnt) ; } int dytest_colDuals (lpprob_struct *main_lp, lptols_struct *main_lptols, lpopts_struct *main_lpopts) /* This routine checks the dual variables returned by dy_colDuals (more usually called the reduced costs of the architectural variables). It checks that cbar = c - yN, where y is the vector of row duals returned by dy_rowDuals and N is the set of nonbasic architectural columns of A (or the matching index set, as appropriate). It also checks that the reduced cost is in agreement with the status. Parameters: main_lp: the lp problem structure main_lptols: the lp tolerance structure main_lpopts: the lp options structure Returns: 0 if cbar = c - yN, error count otherwise. */ { int j,m,n ; flags statj ; consys_struct *sys ; double *obj ; double *y ; flags *status ; double *cbarN ; double cbarj ; int errcnt ; bool staterr ; char *errstring ; char *rtnnme = "dytest_colDuals" ; /* Do a little initialisation. Mention that we've started. */ sys = main_lp->consys ; m = sys->concnt ; n = sys->varcnt ; # ifndef DYLP_NDEBUG if (main_lpopts->print.soln >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: checking cbar = c - yN using %s (%d x %d).", rtnnme,sys->nme,m,n) ; } # endif /* Acquire the row duals, column duals, status vector, and objective. We want both the (row) duals and reduced costs (column duals) to come through with sign unchanged, appropriate for a minimisation primal. */ y = NULL ; dy_rowDuals(main_lp,&y,FALSE) ; cbarN = NULL ; dy_colDuals(main_lp,&cbarN,FALSE) ; status = NULL ; dy_colStatus(main_lp,&status) ; obj = sys->obj ; /* Now step through the columns checking that cbar = c - dot(y,a). Also check to see that the sign is correct for the status of the variable in a minimisation problem. For status values not listed (vstatSB and any of the basic status codes), there's no `correct' sign. */ errcnt = 0 ; for (j = 1 ; j <= n ; j++) { cbarj = obj[j] - consys_dotcol(sys,j,y) ; statj = status[j] ; if (fabs(cbarj-cbarN[j]) > main_lptols->cost) { errcnt++ ; dyio_outfmt(dy_logchn,dy_gtxecho, "\nERROR: col %s (%d) %s cbar<%d> = %g; expected %g;", consys_nme(sys,'v',j,FALSE,NULL),j,dy_prtvstat(statj), j,cbarj,cbarN[j]) ; dyio_outfmt(dy_logchn,dy_gtxecho," error %g, tol %g.", fabs(cbarj),main_lptols->cost) ; } staterr = FALSE ; switch (statj) { case vstatNBLB: { if (cbarj < -main_lptols->zero) { staterr = TRUE ; errstring = "positive" ; } break ; } case vstatNBUB: { if (cbarj > main_lptols->zero) { staterr = TRUE ; errstring = "negative" ; } break ; } case vstatNBFR: { if (fabs(cbarj) > main_lptols->zero) { staterr = TRUE ; errstring = "zero" ; } break ; } default: { break ; } } if (staterr == TRUE) { errcnt++ ; dyio_outfmt(dy_logchn,dy_gtxecho, "\nERROR: col %s (%d) %s cbar<%d> = %g; should be %s.", consys_nme(sys,'v',j,FALSE,NULL),j,dy_prtvstat(statj), j,cbarj,errstring) ; } } /* Free up space and report the result. */ if (y != NULL) FREE(y) ; if (cbarN != NULL) FREE(cbarN) ; if (status != NULL) FREE(status) ; if (errcnt != 0) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: found %d errors testing cbar = c - yN.\n", rtnnme,errcnt) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: pass cbar = c - yN.\n",rtnnme) ; } return (errcnt) ; } int dytest_allDuals (lpprob_struct *main_lp, lptols_struct *main_lptols, lpopts_struct *main_lpopts) /* This routine uses the dual variables returned by dy_rowDuals and dy_colDuals and checks that yA >= (-c) (row duals only) and y'A' = (-c), where y' is both row and column duals and A' is A, expanded as needed with coefficients to add explicit bound constraints for nonbasic architecturals. As with so many things involving faking dual simplex on the primal constraint system with implicit bounds, we have to be a bit careful when working with the duals corresponding to nonbasic primal variables. Consider a primal variable x NBUB. The reduced cost cbar will be negative at optimality in dylp's min primal world. This is not correct for the sign convention of the true dual problem, where all duals are positive, so it's negated when we ask for the true dual sign convention. But then only a little thought reveals that we're considering yA + y = (-c), and if y >= 0 it's clear that yA <= (-c). So we have to invert the sense of that test when processing a column with an NBUB primal. Since the sign of the reduced cost for an NBFX variable can go either way, no test is possible using only the row duals. Parameters: main_lp: the lp problem structure main_lptols: the lp tolerance structure main_lpopts: the lp options structure Returns: 0 if yA = c, error count otherwise. */ { int i,j,k,m,n ; consys_struct *sys ; double *obj ; double *y,*cbar ; double ydotaj,cj,cbarj ; flags *status ; flags statj ; int errcnt ; char *rtnnme = "dytest_allDuals" ; /* Do a little initialisation. Mention that we've started. */ sys = main_lp->consys ; m = sys->concnt ; n = sys->varcnt ; obj = sys->obj ; # ifndef DYLP_NDEBUG if (main_lpopts->print.soln >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: checking yA = c using %s (%d x %d).", rtnnme,sys->nme,m,n) ; } # endif /* Acquire the row and column duals and column status. Go with the sign convention that matches the true dual problem. */ y = NULL ; dy_rowDuals(main_lp,&y,TRUE) ; cbar = NULL ; dy_colDuals(main_lp,&cbar,TRUE) ; status = NULL ; dy_colStatus(main_lp,&status) ; /* Open a loop to walk the columns. First check that yA >= (-c) for a column with an NBLB primal variable, yA <= (-c) for a column with an NBUB primal variable. For an NBFX variable, the dual could go either way, so we can't check. */ errcnt = 0 ; for (j = 1 ; j <= n ; j++) { statj = status[j] ; cj = -obj[j] ; ydotaj = consys_dotcol(sys,j,y) ; if ((flgon(statj,vstatNBLB) && ydotaj-cj < -main_lptols->cost) || (flgon(statj,vstatNBUB) && ydotaj-cj > main_lptols->cost)) { errcnt++ ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n ERROR: %s (%d) y dot a = %g; ", consys_nme(sys,'v',j,FALSE,NULL),j,ydotaj) ; dyio_outfmt(dy_logchn,dy_gtxecho,"expected %s %g; err %g, tol %g.", (flgon(statj,vstatNBUB)?"<=":">="), cj,ydotaj-cj,main_lptols->cost) ; } /* Now add any contribution due to an architectural at bound. After this we should have equality. For an upper bound, we have x <= u. For a lower bound, it's -x <= -l. For a fixed variable, it's an equality x = u, so lump NBFX with NBUB. */ if (flgon(statj,vstatNONBASIC)) { cbarj = cbar[j] ; switch (statj) { case vstatNBLB: { ydotaj -= cbarj ; break ; } case vstatNBUB: case vstatNBFX: { ydotaj += cbarj ; break ; } default: { errmsg(1,rtnnme,__LINE__) ; errcnt += 10000 ; ydotaj = quiet_nan(42.0L) ; break ; } } } if (fabs(ydotaj-cj) > main_lptols->cost) { errcnt++ ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n ERROR: %s (%d) y dot a = %g; ", consys_nme(sys,'v',j,FALSE,NULL),j,ydotaj) ; dyio_outfmt(dy_logchn,dy_gtxecho,"expected %g; err %g, tol %g.", cj,fabs(ydotaj-cj),main_lptols->cost) ; } } /* Free up space and report the result. */ if (y != NULL) FREE(y) ; if (cbar != NULL) FREE(cbar) ; if (status != NULL) FREE(status) ; if (errcnt != 0) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: found %d errors testing yA = c.\n", rtnnme,errcnt) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho,"\n%s: pass yA = c.\n",rtnnme) ; } return (errcnt) ; } int dytest_colPrimals (lpprob_struct *main_lp, lptols_struct *main_lptols, lpopts_struct *main_lpopts) /* This routine checks the values of the primal architectural variables returned by dy_colPrimals. For basic variables x, the routine checks x = inv(B)b - inv(B)Nx To do this, the routine accumulates the values of the basic variables during the column scan. When the current column is basic in pos'n i, the routine calculates dot(beta,b) and adds it to the total. When the current column is nonbasic, the routine calculates abarx and subtracts it from the total. Just to make things really annoying, we have to account for nonbasic bounded slacks due to range constraints tight at their lower bound (which makes the slack nonbasic at its upper bound). For a nonbasic variable, the routine checks the value of x against the bound specified by the status of x. Parameters: main_lp: the lp problem structure main_lptols: the lp tolerance structure main_lpopts: the lp options structure Returns: 0 if the values check out, error count otherwise. */ { int i,i_bpos,j,k,m,n ; flags statj,stati ; double xj,lbj,ubj,betaidotb ; consys_struct *sys ; flags *status,*logstatus ; double *rhs,*rhslow,*vlb,*vub,*betai,*xB,*abarj ; contyp_enum *ctyp ; basisel_struct *basis ; double *x ; int berrs,nberrs ; bool staterr ; char *rtnnme = "dytest_colPrimals" ; /* Do a little initialisation. Mention that we've started. */ sys = main_lp->consys ; m = sys->concnt ; n = sys->varcnt ; # ifndef DYLP_NDEBUG if (main_lpopts->print.soln >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: checking primal architectural variables using %s (%d x %d).", rtnnme,sys->nme,m,n) ; } # endif /* Acquire the variable bound and status vectors, the constraint type, rhs, and rhslow vectors, the basis vector, and the values of the primal architectural variables. Allocate a vector to accumulate x */ x = NULL ; dy_colPrimals(main_lp,&x) ; basis = main_lp->basis->el ; status = main_lp->status ; ctyp = sys->ctyp ; rhs = sys->rhs ; rhslow = sys->rhslow ; vlb = sys->vlb ; vub = sys->vub ; xB = (double *) CALLOC((m+1),sizeof(double)) ; /* Now step through the columns checking the values in x. For a variable basic in pos'n i, add dot(beta,b) to the running total for the basic variable. For a nonbasic variable, confirm that the value, bound, and status agree. Then subtract abarx from x if x is at a nonzero bound. The only nonbasic status code not explicitly listed is SB (superbasic). This really should never appear. The only legitimate reason is that dylp patched the basis in primal phase II and then discovered the problem to be unbounded before the SB variable could be pivoted back into the basis. This is sufficiently exotic to deserve a message. */ berrs = 0 ; nberrs = 0 ; betai = NULL ; abarj = NULL ; for (j = 1 ; j <= n ; j++) { statj = status[j] ; xj = x[j] ; if (((int) statj) < 0) { k = -((int) statj) ; i_bpos = basis[k].cndx ; if (dy_betai(main_lp,i_bpos,&betai) == FALSE) { berrs++ ; errmsg(952,rtnnme,sys->nme,"row",i_bpos,"variable", consys_nme(sys,'v',j,FALSE,NULL),j) ; continue ; } betaidotb = 0 ; for (i = 1 ; i <= m ; i++) { betaidotb += betai[i]*rhs[i] ; } xB[i_bpos] += betaidotb ; } else { staterr = FALSE ; lbj = vlb[j] ; ubj = vub[j] ; statj = getflg(statj,vstatSTATUS) ; switch (statj) { case vstatNBLB: { if (fabs(xj-lbj) > main_lptols->zero) { staterr = TRUE ; betaidotb = lbj ; } break ; } case vstatNBUB: { if (fabs(xj-ubj) > main_lptols->zero) { staterr = TRUE ; betaidotb = ubj ; } break ; } case vstatNBFX: { if (fabs(xj-lbj) > main_lptols->zero) { staterr = TRUE ; betaidotb = lbj ; } break ; } case vstatNBFR: { if (fabs(xj) > main_lptols->zero) { staterr = TRUE ; betaidotb = 0.0 ; } break ; } default: { staterr = TRUE ; betaidotb = quiet_nan(42.0L) ; break ; } } if (staterr == TRUE) { nberrs++ ; dyio_outfmt(dy_logchn,dy_gtxecho, "\nERROR: %s col %s (%d) = %g; expected %g;", dy_prtvstat(statj),consys_nme(sys,'v',j,FALSE,NULL),j, xj,betaidotb) ; dyio_outfmt(dy_logchn,dy_gtxecho," error %g, tol %g.", fabs(xj-betaidotb),main_lptols->zero) ; continue ; } if (xj == 0.0) continue ; if (dy_abarj(main_lp,j,&abarj) == FALSE) { nberrs++ ; errmsg(953,rtnnme,sys->nme,"ftran'd","column", consys_nme(sys,'v',j,FALSE,NULL),j) ; continue ; } for (k = 1 ; k <= m ; k++) { xB[k] -= abarj[k]*xj ; } } } /* But wait! We're not quite done. We need to account for bounded slacks associated with range constraints. If the constraint is tight at its lower bound, the slack is nonbasic at its upper bound. */ logstatus = NULL ; dy_logStatus(main_lp,&logstatus) ; for (i = 1 ; i <= m ; i++) { stati = getflg(logstatus[i],vstatSTATUS) ; if (ctyp[i] == contypRNG && stati == vstatNBUB) { xj = rhs[i]-rhslow[i] ; if (dy_abarj(main_lp,-i,&abarj) == FALSE) { nberrs++ ; errmsg(953,rtnnme,sys->nme,"ftran'd","column", consys_nme(sys,'v',n+i,FALSE,NULL),i) ; continue ; } for (k = 1 ; k <= m ; k++) { xB[k] -= abarj[k]*xj ; } } } /* Scan the variables one more time and check the values of the basic variables. */ for (j = 1 ; j <= n ; j++) { statj = status[j] ; xj = x[j] ; if (((int) statj) < 0) { k = -((int) statj) ; i_bpos = basis[k].cndx ; if (fabs(xj-xB[i_bpos]) > main_lptols->zero) { berrs++ ; dyio_outfmt(dy_logchn,dy_gtxecho, "\nERROR: basis pos'n %d %s (%d) = %g; expected %g;", i_bpos,consys_nme(sys,'v',j,FALSE,NULL),j,xj,xB[i_bpos]) ; dyio_outfmt(dy_logchn,dy_gtxecho," error %g, tol %g.", fabs(xj-xB[i_bpos]),main_lptols->zero) ; } } } /* Free up space and report the result. */ if (logstatus != NULL) FREE(logstatus) ; if (abarj != NULL) FREE(abarj) ; if (xB != NULL) FREE(xB) ; if (betai != NULL) FREE(betai) ; if (x != NULL) FREE(x) ; if ((berrs+nberrs) != 0) { if (berrs != 0) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: found %d errors testing x = inv(B)b.\n", rtnnme,berrs) ; } if (nberrs != 0) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: found %d errors testing x against bounds & status.\n", rtnnme,nberrs) ; } } else { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: pass test of primal architectural variable values.\n", rtnnme) ; } return (berrs+nberrs) ; } int dytest_rowPrimals (lpprob_struct *main_lp, lptols_struct *main_lptols, lpopts_struct *main_lpopts) /* This routine checks the ind and x vectors returned by dy_rowPrimals. It first cross-checks the basis, status and indB arrays, bailing out if the cross-checks fail. Next it checks the values of the basic variables, architectural and logical. For basic variables x, the routine checks x = inv(B)b - inv(B)Nx To do this, it first walks the rows of the constraint system and initialises x with dot(beta,b). Then it walks the columns and accumulates the contributions abarx from nonzero nonbasic variables. Finally, it walks the rows again and subtracts the contributions from nonbasic bounded logicals (due to range constraints tight at the lower bound). Parameters: main_lp: the lp problem structure main_lptols: the lp tolerance structure main_lpopts: the lp options structure Returns: 0 if the basic variables validate, error count otherwise. */ { int i,j,k,m,n,i_basis ; flags statj,stati ; double xj,betaidotb,tol ; consys_struct *sys ; flags *status,*logstatus ; double *rhs,*rhslow,*vlb,*vub,*betai,*xBaccum,*abarj ; contyp_enum *ctyp ; basisel_struct *basis ; int basisLen ; double *xB ; int *indB ; int berrs,nberrs,inderrs ; char *rtnnme = "dytest_rowPrimals" ; /* Do a little initialisation. Mention that we've started. */ sys = main_lp->consys ; m = sys->concnt ; n = sys->varcnt ; # ifndef DYLP_NDEBUG if (main_lpopts->print.soln >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: checking primal basic variables using %s (%d x %d).", rtnnme,sys->nme,m,n) ; } # endif /* Acquire the variable bound and status vectors, the constraint type, rhs, and rhslow vectors, and the basis vector. */ basisLen = main_lp->basis->len ; basis = main_lp->basis->el ; status = main_lp->status ; ctyp = sys->ctyp ; rhs = sys->rhs ; rhslow = sys->rhslow ; vlb = sys->vlb ; vub = sys->vub ; /* Call dy_rowPrimals to acquire x (values of basic variables) and ind (indices of basic variables). */ xB = NULL ; indB = NULL ; dy_rowPrimals(main_lp,&xB,&indB) ; /* Validate ind, status, and basis against each other, within the limits of each. IndB specifies basic variables in row order. Logicals are specified as the negative of the row. IndB contains an entry for every constraint. By construction, the basic variable for an inactive constraint should be the logical for the constraint. Basis has one entry for each active constraint. Each entry in basis specifies a constraint and a basic variable. Basic logicals are specified by the negative of the constraint index. Then for an active constraint i and a basis entry k such that basis[k].cndx == i, indB[i] == basis[k].vndx. Status only contains information on architecturals. A basic architectural is specified as the negative of its entry in the basis vector. Thus basis[-status[j]].vndx == j. */ inderrs = 0 ; for (i = 1 ; i <= m ; i++) { /* Scan the basis vector for an entry for this constraint. If it's not present, assume the constraint is inactive. */ i_basis = -1 ; for (k = 1 ; k <= basisLen ; k++) { if (basis[k].cndx == i) { i_basis = k ; break ; } } j = indB[i] ; /* Inactive constraints should specify the associated logical as the basic variable. */ if (i_basis < 0) { if (j > 0) { inderrs++ ; dyio_outfmt(dy_logchn,dy_gtxecho,"\nERROR: constraint %s (%d)", consys_nme(sys,'c',i,FALSE,NULL),i) ; dyio_outfmt(dy_logchn,dy_gtxecho, "; basis entry = %d; should specify a logical.",j) ; } else if (-j != i) { inderrs++ ; dyio_outfmt(dy_logchn,dy_gtxecho,"\nERROR: basis[%d] (%s)", i,consys_nme(sys,'c',i,FALSE,NULL)) ; dyio_outfmt(dy_logchn,dy_gtxecho," is %s (%d);", consys_nme(sys,'c',n-j,FALSE,NULL),-j) ; dyio_outfmt(dy_logchn,dy_gtxecho," expected %s (%d).", consys_nme(sys,'c',n+i,FALSE,NULL),i) ; } } /* The constraint is active. We should have indB[i] = basis[i_basis].vndx. It takes way more work than it should to construct the error message. */ else { k = basis[i_basis].vndx ; if (j != k) { inderrs++ ; dyio_outfmt(dy_logchn,dy_gtxecho,"\nERROR: constraint %s (%d)", consys_nme(sys,'c',i,FALSE,NULL),i) ; statj = (k < 0)?(n-k):(k) ; dyio_outfmt(dy_logchn,dy_gtxecho, "; basis[%d] specifies %s (%d)", i_basis,consys_nme(sys,'v',statj,FALSE,NULL),k) ; statj = (j < 0)?(n-j):(j) ; dyio_outfmt(dy_logchn,dy_gtxecho, "; indB[%d] specifies %s (%d); they should agree.", i,consys_nme(sys,'v',statj,FALSE,NULL),j) ; } /* If the basic variable k is an architectural, status[k] should agree that it's basic and point to the basis vector entry. */ if (k > 0) { statj = -((int) status[k]) ; if (i_basis != statj) { inderrs++ ; dyio_outfmt(dy_logchn,dy_gtxecho,"\nERROR: constraint %s (%d)", consys_nme(sys,'c',i,FALSE,NULL),i) ; dyio_outfmt(dy_logchn,dy_gtxecho, "; status[%d] = %d but basis[%d].vndx = %d", k,statj,i_basis,k) ; dyio_outfmt(dy_logchn,dy_gtxecho, "; they should point to each other.") ; } } } } if (inderrs > 0) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: found %d errors cross-checking basis index vectors.\n", rtnnme,inderrs) ; dyio_outfmt(dy_logchn,dy_gtxecho, "\tTests of basic variable values not performed.\n") ; if (xB != NULL) FREE(xB) ; if (indB != NULL) FREE(indB) ; return (inderrs) ; } /* Now we know the index arrays are correct and we can use them with confidence. Step through the rows, placing the initial component dot(beta,b) into each position. */ xBaccum = (double *) CALLOC((m+1),sizeof(double)) ; berrs = 0 ; betai = NULL ; for (i = 1 ; i <= m ; i++) { if (dy_betai(main_lp,i,&betai) == FALSE) { berrs++ ; j = indB[i] ; if (j < 0) { statj = n-j ; } else { statj = j ; } errmsg(952,rtnnme,sys->nme,"row",i,"basic variable", consys_nme(sys,'v',statj,FALSE,NULL),j) ; continue ; } betaidotb = 0 ; for (k = 1 ; k <= m ; k++) { betaidotb += betai[k]*rhs[k] ; } xBaccum[i] += betaidotb ; } /* Now step through the columns. Subtract abarx from x if x is at a nonzero bound. Anything other than the enumerated status codes is extraordinary. vstatSB might be correct if dylp declared unboundedness immediately after refactoring in primal phase II, but that's such an unlikely coincidence it deserves attention. Anything else is outright wrong. */ nberrs = 0 ; abarj = NULL ; for (j = 1 ; j <= n ; j++) { statj = status[j] ; if (((int) statj) < 0) continue ; statj = getflg(statj,vstatSTATUS) ; switch (statj) { case vstatNBLB: case vstatNBFX: { xj = vlb[j] ; break ; } case vstatNBUB: { xj = vub[j] ; break ; } case vstatNBFR: { xj = 0.0 ; break ; } default: { nberrs++ ; dyio_outfmt(dy_logchn,dy_gtxecho,"\nERROR: constraint %s (%d)", consys_nme(sys,'c',i,FALSE,NULL),i) ; dyio_outfmt(dy_logchn,dy_gtxecho,"; status of %s (%d) is %s.", consys_nme(sys,'v',j,FALSE,NULL),j,dy_prtvstat(statj)) ; xj = 0.0 ; break ; } } if (xj == 0.0) continue ; if (dy_abarj(main_lp,j,&abarj) == FALSE) { nberrs++ ; errmsg(953,rtnnme,sys->nme,"ftran'd","column", consys_nme(sys,'v',j,FALSE,NULL),j) ; continue ; } for (k = 1 ; k <= m ; k++) { xBaccum[k] -= abarj[k]*xj ; } } /* We're not quite done. We need to account for bounded slacks associated with range constraints. If the constraint is tight at its lower bound, the slack is nonbasic at its upper bound. */ logstatus = NULL ; dy_logStatus(main_lp,&logstatus) ; for (i = 1 ; i <= m ; i++) { stati = getflg(logstatus[i],vstatSTATUS) ; if (ctyp[i] == contypRNG && stati == vstatNBUB) { xj = rhs[i]-rhslow[i] ; if (dy_abarj(main_lp,-i,&abarj) == FALSE) { nberrs++ ; errmsg(953,rtnnme,sys->nme,"ftran'd","column", consys_nme(sys,'v',n+i,FALSE,NULL),i) ; continue ; } for (k = 1 ; k <= m ; k++) { xBaccum[k] -= abarj[k]*xj ; } } } /* Scan the rows one more time and check the values of the basic variables. Scale this test just a bit so we don't get spurious indications due to roundoff. The average of the two values seems safest as a scaling factor. */ for (i = 1 ; i <= m ; i++) { tol = ((fabs(xBaccum[i])+fabs(xB[i]))/2)+1 ; if (fabs(xBaccum[i]-xB[i]) > tol*main_lptols->zero) { berrs++ ; j = indB[i] ; if (j < 0) { statj = n-j ; } else { statj = j ; } dyio_outfmt(dy_logchn,dy_gtxecho, "\nERROR: basis pos'n %d %s (%d) = %g; expected %g;", i,consys_nme(sys,'v',statj,FALSE,NULL),j,xB[i],xBaccum[i]) ; dyio_outfmt(dy_logchn,dy_gtxecho," error %g, tol %g.", fabs(xB[i]-xBaccum[i]),main_lptols->zero) ; } } /* Free up space and report the result. */ if (logstatus != NULL) FREE(logstatus) ; if (abarj != NULL) FREE(abarj) ; if (xB != NULL) FREE(xB) ; if (indB != NULL) FREE(indB) ; if (xBaccum != NULL) FREE(xBaccum) ; if (betai != NULL) FREE(betai) ; if ((berrs+nberrs) != 0) { if (berrs != 0) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: found %d errors testing x = inv(B)b.\n", rtnnme,berrs) ; } if (nberrs != 0) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: found %d errors attempting to use nonbasic variables.\n", rtnnme,nberrs) ; } } else { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: pass test of primal basic variable values.\n", rtnnme) ; } return (berrs+nberrs) ; } DyLP-1.6.0/DyLP/test/Makefile.in0000644000076700007670000004014511037243540013123 0ustar # Makefile.in generated by automake 1.9.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2006 International Business Machines and others. # All Rights Reserved. # This file is distributed under the Common Public License. # Author: Andreas Waechter IBM 2006-04-13 srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = unitTest$(EXEEXT) subdir = test DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ac_c_add_to_includes.m4 \ $(top_srcdir)/m4/ac_c_get_sunpro_libs.m4 \ $(top_srcdir)/m4/ac_dylp_equiv_for_cpp_bool.m4 \ $(top_srcdir)/m4/ac_dylp_find_fp_funcs.m4 \ $(top_srcdir)/m4/ac_dylp_fix_cppflags.m4 \ $(top_srcdir)/m4/ac_dylp_options.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/inc/config_dylp.h CONFIG_CLEAN_FILES = PROGRAMS = $(noinst_PROGRAMS) am_unitTest_OBJECTS = dytest_problems.$(OBJEXT) dytest_rays.$(OBJEXT) \ dytest_solutions.$(OBJEXT) dytest_tableau.$(OBJEXT) \ unitTest.$(OBJEXT) unitTest_OBJECTS = $(am_unitTest_OBJECTS) unitTest_DEPENDENCIES = $(DYLPOBJDIR)/src/Dylp/libDylp.la depcomp = $(SHELL) $(top_srcdir)/../depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(unitTest_SOURCES) DIST_SOURCES = $(unitTest_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADDLIBS = @ADDLIBS@ ADD_CFLAGS = @ADD_CFLAGS@ ADD_CXXFLAGS = @ADD_CXXFLAGS@ ALWAYS_FALSE_FALSE = @ALWAYS_FALSE_FALSE@ ALWAYS_FALSE_TRUE = @ALWAYS_FALSE_TRUE@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AUX_DIR = @AUX_DIR@ AWK = @AWK@ BUILDTOOLSDIR = @BUILDTOOLSDIR@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CDEFS = @CDEFS@ CFLAGS = @CFLAGS@ COINUTILSDOCDIR = @COINUTILSDOCDIR@ COINUTILSOBJDIR = @COINUTILSOBJDIR@ COINUTILSSRCDIR = @COINUTILSSRCDIR@ COIN_HAS_COINUTILS_FALSE = @COIN_HAS_COINUTILS_FALSE@ COIN_HAS_COINUTILS_TRUE = @COIN_HAS_COINUTILS_TRUE@ COIN_HAS_DYLP_FALSE = @COIN_HAS_DYLP_FALSE@ COIN_HAS_DYLP_TRUE = @COIN_HAS_DYLP_TRUE@ COIN_HAS_OSI_FALSE = @COIN_HAS_OSI_FALSE@ COIN_HAS_OSI_TRUE = @COIN_HAS_OSI_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEFS = @CXXDEFS@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DBG_CFLAGS = @DBG_CFLAGS@ DBG_CXXFLAGS = @DBG_CXXFLAGS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DYLPDOCDIR = @DYLPDOCDIR@ DYLPOBJDIR = @DYLPOBJDIR@ DYLPSRCDIR = @DYLPSRCDIR@ DYLP_ERRMSGDIR = @DYLP_ERRMSGDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FADDLIBS = @FADDLIBS@ FFLAGS = @FFLAGS@ HAVE_EXTERNALS_FALSE = @HAVE_EXTERNALS_FALSE@ HAVE_EXTERNALS_TRUE = @HAVE_EXTERNALS_TRUE@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBEXT = @LIBEXT@ LIBOBJS = @LIBOBJS@ # List additional libraries LIBS = @LIBS@ $(ADDLIBS) LIBTOOL = @LIBTOOL@ LIBTOOLM4 = @LIBTOOLM4@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_LDFLAGS = @LT_LDFLAGS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ MPICC = @MPICC@ MPICXX = @MPICXX@ OBJEXT = @OBJEXT@ OPT_CFLAGS = @OPT_CFLAGS@ OPT_CXXFLAGS = @OPT_CXXFLAGS@ OSIDOCDIR = @OSIDOCDIR@ OSIOBJDIR = @OSIOBJDIR@ OSISRCDIR = @OSISRCDIR@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ RPATH_FLAGS = @RPATH_FLAGS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ VPATH_DISTCLEANFILES = @VPATH_DISTCLEANFILES@ abs_bin_dir = @abs_bin_dir@ abs_include_dir = @abs_include_dir@ abs_lib_dir = @abs_lib_dir@ abs_source_dir = @abs_source_dir@ ac_c_preproc_warn_flag = @ac_c_preproc_warn_flag@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ ac_cxx_preproc_warn_flag = @ac_cxx_preproc_warn_flag@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ have_autoconf = @have_autoconf@ have_automake = @have_automake@ have_svn = @have_svn@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sol_cc_compiler = @sol_cc_compiler@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ AUTOMAKE_OPTIONS = foreign unitTest_SOURCES = \ dytest_problems.c \ dytest_rays.c \ dytest_solutions.c \ dytest_tableau.c \ unitTest.c # List libraries of COIN projects unitTest_LDADD = $(DYLPOBJDIR)/src/Dylp/libDylp.la # Here list all include flags, relative to this "srcdir" directory. This # "cygpath" stuff is necessary to compile with native compilers on Cygwin AM_CPPFLAGS = \ -I`$(CYGPATH_W) $(srcdir)/../src/DylpStdLib` \ -I`$(CYGPATH_W) $(srcdir)/../src/Dylp` # This line is necessary to allow VPATH compilation with MS compilers # on Cygwin DEFAULT_INCLUDES = -I. -I`$(CYGPATH_W) $(srcdir)` -I$(top_builddir)/inc ######################################################################## # Cleaning stuff # ######################################################################## # Here we list everything that is not generated by the compiler, e.g., # output files of a program DISTCLEANFILES = all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign test/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign test/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done unitTest$(EXEEXT): $(unitTest_OBJECTS) $(unitTest_DEPENDENCIES) @rm -f unitTest$(EXEEXT) $(LINK) $(unitTest_LDFLAGS) $(unitTest_OBJECTS) $(unitTest_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dytest_problems.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dytest_rays.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dytest_solutions.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dytest_tableau.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unitTest.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-libtool distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstPROGRAMS ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-exec \ install-exec-am install-info install-info-am install-man \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am \ uninstall-info-am test: unitTest$(EXEEXT) ./unitTest$(EXEEXT) .PHONY: test # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: DyLP-1.6.0/DyLP/test/unitTest.c0000644000076700007670000011177511406161225013050 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2008 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This is the main routine for the dylp unit test. The following defines select the test problems, a convenience during code development. Normally, you'll want them all set to 1 for a thorough test. */ #define RUN_EXMIP1 1 #define RUN_AFIRO 1 #define RUN_BOEING2 1 #define RUN_EXPRIMALRAY 1 #define RUN_EXDUALRAY 1 #define RUN_GALENETBNDS 1 #define RUN_GALENETLEQ 1 #define RUN_GALENETMIXED 1 #define RUN_GALENET 1 #include "dylp.h" /* Macro cleverness to specify a default error message file. Depends on ANSI C merge of consecutive string constants. DYLP_ERRMSGDIR should have the form "path/to/distribution/DyLP/src/Dylp/", including the quotes. See DyLP/src/DylpStdLib/DylpConfig.h for further information. */ #ifdef DYLP_ERRMSGDIR # define DYLP_ERRMSGPATH DYLP_ERRMSGDIR "dy_errmsgs.txt" #else # define DYLP_ERRMSGPATH "dy_errmsgs.txt" #endif /* Variables which control i/o operations. ttyout i/o id for output to the user's terminal ttyin i/o id for input from the user's terminal dy_cmdchn i/o id for input from the command file dy_logchn i/o id for the execution log file dy_cmdecho controls echoing of command input to stdout dy_gtxecho controls echoing of generated text to stdout */ ioid dy_cmdchn,dy_logchn ; bool dy_cmdecho, dy_gtxecho ; /* Define these as globals for the benefit of cmdint.c::process_cmds. */ lpopts_struct* main_lpopts ; lptols_struct* main_lptols ; static lpret_enum do_lp (lpprob_struct *lp, lptols_struct *lptols, lpopts_struct *lpopts, int printlvl) /* This routine is a convenience wrapper which handles statistics and timing. It also allows for easy adjustment of the print level by making a local copy of the options. Parameters: lp: lp problem to be solved lptols: tolerances lpopts: options printlvl: desired output level Returns: lp status code; lpINV is used in the event of a fatal error that's not really dylp's fault. */ { lpret_enum lpret ; lpopts_struct *local_lpopts ; lpstats_struct *local_lpstats ; consys_struct *sys ; /* const char *rtnnme = "do_lp" ; */ lpret = lpINV ; sys = lp->consys ; /* Set up options and statistics. */ local_lpopts = (lpopts_struct *) MALLOC(sizeof(lpopts_struct)) ; memcpy(local_lpopts,lpopts,sizeof(lpopts_struct)) ; dy_setprintopts(printlvl,local_lpopts) ; # ifdef DYLP_STATISTICS local_lpstats = NULL ; dy_initstats(&local_lpstats,sys) ; # else local_lpstats = NULL ; # endif /* Let dylp know we're not done, and make the call to solve the lp. */ lp->phase = dyINV ; lpret = dylp(lp,local_lpopts,lptols,local_lpstats) ; /* Dump the statistics and free the dylp statistics structure. */ /* stats_lp(outpath,FALSE,lp,&diff,local_lpstats) ; */ # ifdef DYLP_STATISTICS dy_freestats(&local_lpstats) ; # endif if (local_lpopts != NULL) FREE(local_lpopts) ; return (lpret) ; } int main (int argc, char **argv) { bool errecho = TRUE ; ioid ttyin,ttyout,outchn ; const char *errmsgpath = DYLP_ERRMSGPATH ; char *errlogpath = NULL ; /* These need to be globals to keep cmdint.c::process_cmds happy. lpopts_struct *main_lpopts ; lptols_struct *main_lptols ; */ consys_struct *main_sys ; lpprob_struct *main_lp ; lpret_enum lpretval ; double z ; int errcnt,cnt ; /* Set this to TRUE if you want to see the solutions for the test lp problems. */ bool dumpsoln = TRUE ; char *rtnnme = argv[0] ; /* dy_basis.c */ extern void dy_initbasis(int concnt, int factor_freq, double zero_tol), dy_freebasis(void) ; /* dytest_problems.c */ extern consys_struct *dytest_exmip1sys(lptols_struct *tols) ; extern consys_struct *dytest_exprimalraysys(lptols_struct *tols) ; extern consys_struct *dytest_exdualraysys(lptols_struct *tols) ; extern consys_struct *dytest_galenetbndssys(lptols_struct *tols) ; extern consys_struct *dytest_galenetleqsys(lptols_struct *tols) ; extern consys_struct *dytest_galenetmixedsys(lptols_struct *tols) ; extern consys_struct *dytest_galenetsys(lptols_struct *tols) ; extern consys_struct *dytest_afirosys(lptols_struct *tols) ; extern consys_struct *dytest_boeing2sys(lptols_struct *tols) ; /* dytest_tableau.c */ extern int dytest_betaj(lpprob_struct *lp, lptols_struct *lptols,lpopts_struct *lpopts) ; extern int dytest_betai(lpprob_struct *lp, lptols_struct *lptols,lpopts_struct *lpopts) ; extern int dytest_abarj(lpprob_struct *lp, lptols_struct *lptols,lpopts_struct *lpopts) ; extern int dytest_abari(lpprob_struct *lp, lptols_struct *lptols,lpopts_struct *lpopts) ; /* dytest_solutions.c */ extern int dytest_rowDuals(lpprob_struct *lp, lptols_struct *lptols,lpopts_struct *lpopts) ; extern int dytest_allDuals(lpprob_struct *lp, lptols_struct *lptols,lpopts_struct *lpopts) ; extern int dytest_colDuals(lpprob_struct *lp, lptols_struct *lptols,lpopts_struct *lpopts) ; extern int dytest_colPrimals(lpprob_struct *lp, lptols_struct *lptols,lpopts_struct *lpopts) ; extern int dytest_rowPrimals(lpprob_struct *lp, lptols_struct *lptols,lpopts_struct *lpopts) ; /* dytest_rays.c */ extern int dytest_primalRays(int *p_numRays,lpprob_struct *lp, lptols_struct *lptols,lpopts_struct *lpopts) ; extern int dytest_dualRays(int *p_numRays,lpprob_struct *lp, lptols_struct *lptols,lpopts_struct *lpopts) ; outchn = IOID_INV ; /* Execute initialization routines for the i/o and error reporting packages. */ errinit(errmsgpath,errlogpath,errecho) ; if (dyio_ioinit() != TRUE) { errmsg(1,rtnnme,__LINE__) ; exit (2) ; } /* Connect ttyout to the standard output. Initialize ttyin, setting the mode to line-oriented. Serious internal confusion if we can't manage these. Set the initial command input channel to stdin. */ ttyout = dyio_openfile("stdout","w") ; if (ttyout == IOID_INV) { errmsg(1,rtnnme,__LINE__) ; exit(3) ; } ttyin = dyio_openfile("stdin","r") ; if (ttyin == IOID_INV) { errmsg(1,rtnnme,__LINE__) ; exit(4) ; } (void) dyio_setmode(ttyin,'l') ; dy_cmdchn = ttyin ; dy_logchn = IOID_NOSTRM ; dy_cmdecho = TRUE ; dy_gtxecho = TRUE ; /* Announce we're running. */ dyio_outfmt(ttyout,dy_gtxecho,"Dylp v%s unit test start.\n",DYLP_VERSION) ; dyio_flushio(ttyout,dy_gtxecho) ; errcnt = 0 ; /* Acquire default option and tolerance structures. Allocate an lpprob_struct to be our top-level handle. */ main_lpopts = NULL ; main_lptols = NULL ; dy_defaults(&main_lpopts,&main_lptols) ; main_lp = (lpprob_struct *) CALLOC(1,sizeof(lpprob_struct)) ; /* Initialise the basis factorisation package with a data structure capable of 50 constraints. The second parameter controls how many basis updates the basis can hold before it requires refactoring. Adding 5 to dylp's refactor interval should give a safety margin. */ dy_initbasis(50,main_lpopts->factor+5,0.0) ; #if RUN_EXMIP1 > 0 /* Load the exmip1 example and see if we can solve it. */ dyio_outfmt(ttyout,dy_gtxecho, "\n\nLoading exmip1 example from static data.\n") ; main_sys = dytest_exmip1sys(main_lptols) ; if (main_sys == NULL) { dyio_outfmt(ttyout,dy_gtxecho, "Failed to load exmip1 constraint system.\n") ; errcnt++ ; } /* Check over the option settings, now that we know how big the constraint system will be. */ else { dy_checkdefaults(main_sys,main_lpopts,main_lptols) ; /* Initialise the main_lp structure to pass the problem in to dylp. * We need to retain the data structures (NOFREE) so that we can consult them when dylp returns. * The phase needs to be dyINV at the start. * We need to specify the constraint system, and its size. * Let dylp work with a partial system and purge at the end. This stresses the routines we're testing; they need to synthesize parts of the values they return. * The remaining options specify an all-logical basis, allow scaling, and force a cold start. */ setflg(main_lp->ctlopts,lpctlNOFREE) ; main_lp->phase = dyINV ; main_lp->consys = main_sys ; main_lp->rowsze = main_sys->rowsze ; main_lp->colsze = main_sys->colsze ; main_lpopts->forcecold = TRUE ; main_lpopts->fullsys = FALSE ; main_lpopts->finpurge.vars = TRUE ; main_lpopts->finpurge.cons = TRUE ; main_lpopts->coldbasis = ibLOGICAL ; main_lpopts->scaling = 0 ; main_lpopts->forcecold = TRUE ; /* main_lpopts->print.major = 1 ; main_lpopts->print.scaling = 1 ; main_lpopts->print.setup = 6 ; main_lpopts->print.crash = 3 ; main_lpopts->print.conmgmt = 3 ; main_lpopts->print.varmgmt = 3 ; main_lpopts->print.soln = 3 ; */ /* Solve. */ dyio_outfmt(ttyout,dy_gtxecho,"Solving exmip1 ... ") ; lpretval = do_lp(main_lp,main_lptols,main_lpopts,1) ; /* And the result is ... */ dyio_outfmt(ttyout,dy_gtxecho,"\n %s, z = %.12f.\n", dy_prtlpret(lpretval),main_lp->obj) ; z = 3.236842105263 ; if (!(fabs(main_lp->obj-z) <= main_lptols->cost)) { errcnt++ ; dyio_outfmt(ttyout,dy_gtxecho, " ERROR: z = %g, expected %g, error %g, tol %g.\n", main_lp->obj,z,fabs(main_lp->obj-z),main_lptols->cost) ; } if (dumpsoln == TRUE) { dy_dumpcompact(dy_logchn,dy_gtxecho,main_lp,FALSE) ; } /* Test the tableau, solution, and ray routines. The tests are predominantly mathematical identities, with a bit of data structure consistency thrown in for good measure. Completely problem-independent. */ errcnt += dytest_betaj(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_abarj(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_betai(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_abari(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_rowDuals(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_colDuals(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_allDuals(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_colPrimals(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_rowPrimals(main_lp,main_lptols,main_lpopts) ; /* Call dylp to free internal structures, then free main_sys. */ comflg(main_lp->ctlopts,lpctlONLYFREE|lpctlNOFREE) ; dylp(main_lp,main_lpopts,main_lptols,NULL) ; consys_free(main_sys) ; main_sys = NULL ; main_lp->consys = NULL ; dy_freesoln(main_lp) ; } #endif #if RUN_AFIRO > 0 /* Let's try another. Load and solve afiro. */ dyio_outfmt(ttyout,dy_gtxecho, "\n\nLoading afiro example from static data.\n") ; main_sys = dytest_afirosys(main_lptols) ; if (main_sys == NULL) { dyio_outfmt(ttyout,dy_gtxecho, "Failed to load afiro constraint system.\n") ; errcnt++ ; } else { dy_checkdefaults(main_sys,main_lpopts,main_lptols) ; comflg(main_lp->ctlopts,lpctlONLYFREE|lpctlNOFREE) ; main_lp->phase = dyINV ; main_lp->consys = main_sys ; main_lp->rowsze = main_sys->rowsze ; main_lp->colsze = main_sys->colsze ; main_lpopts->forcecold = TRUE ; main_lpopts->fullsys = FALSE ; main_lpopts->finpurge.vars = TRUE ; main_lpopts->finpurge.cons = TRUE ; main_lpopts->coldbasis = ibLOGICAL ; main_lpopts->scaling = 2 ; dyio_outfmt(ttyout,dy_gtxecho,"Solving afiro ... ") ; lpretval = do_lp(main_lp,main_lptols,main_lpopts,1) ; dyio_outfmt(ttyout,dy_gtxecho,"\n %s, z = %.12f.\n", dy_prtlpret(lpretval),main_lp->obj) ; z = -464.753142857143 ; if (!(fabs(main_lp->obj-z) <= main_lptols->cost)) { errcnt++ ; dyio_outfmt(ttyout,dy_gtxecho, " ERROR: z = %g, expected %g, error %g, tol %g.\n", main_lp->obj,z,fabs(main_lp->obj-z),main_lptols->cost) ; } if (dumpsoln == TRUE) { dy_dumpcompact(dy_logchn,dy_gtxecho,main_lp,FALSE) ; } errcnt += dytest_betaj(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_abarj(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_betai(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_abari(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_rowDuals(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_colDuals(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_allDuals(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_colPrimals(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_rowPrimals(main_lp,main_lptols,main_lpopts) ; comflg(main_lp->ctlopts,lpctlONLYFREE|lpctlNOFREE) ; dylp(main_lp,main_lpopts,main_lptols,NULL) ; consys_free(main_sys) ; main_sys = NULL ; main_lp->consys = NULL ; dy_freesoln(main_lp) ; } #endif #if RUN_BOEING2 > 0 /* Let's try another. Load and solve boeing2. */ dyio_outfmt(ttyout,dy_gtxecho, "\n\nLoading boeing2 example from static data.\n") ; main_sys = dytest_boeing2sys(main_lptols) ; if (main_sys == NULL) { dyio_outfmt(ttyout,dy_gtxecho, "Failed to load boeing2 constraint system.\n") ; errcnt++ ; } else { dy_checkdefaults(main_sys,main_lpopts,main_lptols) ; comflg(main_lp->ctlopts,lpctlONLYFREE|lpctlNOFREE) ; main_lp->phase = dyINV ; main_lp->consys = main_sys ; main_lp->rowsze = main_sys->rowsze ; main_lp->colsze = main_sys->colsze ; main_lpopts->forcecold = TRUE ; main_lpopts->fullsys = FALSE ; main_lpopts->finpurge.vars = TRUE ; main_lpopts->finpurge.cons = TRUE ; main_lpopts->coldbasis = ibLOGICAL ; main_lpopts->scaling = 2 ; main_lpopts->print.phase2 = 0 ; /* main_lpopts->print.major = 1 ; main_lpopts->print.phase1 = 4 ; main_lpopts->print.dual = 4 ; main_lpopts->print.tableau = 4 ; main_lpopts->print.soln = 3 ; main_lpopts->print.rays = 5 ; */ dyio_outfmt(ttyout,dy_gtxecho,"Solving boeing2 ... ") ; lpretval = do_lp(main_lp,main_lptols,main_lpopts,1) ; dyio_outfmt(ttyout,dy_gtxecho,"\n %s, z = %.12f.\n", dy_prtlpret(lpretval),main_lp->obj) ; z = -315.0187280152 ; if (!(fabs(main_lp->obj-z) <= main_lptols->cost)) { errcnt++ ; dyio_outfmt(ttyout,dy_gtxecho, " ERROR: z = %g, expected %g, error %g, tol %g.\n", main_lp->obj,z,fabs(main_lp->obj-z),main_lptols->cost) ; } if (dumpsoln == TRUE) { dy_dumpcompact(dy_logchn,dy_gtxecho,main_lp,FALSE) ; } errcnt += dytest_betaj(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_abarj(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_betai(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_abari(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_rowDuals(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_colDuals(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_allDuals(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_colPrimals(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_rowPrimals(main_lp,main_lptols,main_lpopts) ; comflg(main_lp->ctlopts,lpctlONLYFREE|lpctlNOFREE) ; dylp(main_lp,main_lpopts,main_lptols,NULL) ; consys_free(main_sys) ; main_sys = NULL ; main_lp->consys = NULL ; dy_freesoln(main_lp) ; } #endif #if RUN_EXPRIMALRAY > 0 /* Let's try another. Load and solve exprimalray. The polyhedron for exprimalray is carefully crafted to provide an initial bounded optimum point with two rays that are exposed by the proper change in objective. Force dylp to use the full system for this test and do not allow final purging, lest we miss the point and rays we're aiming for. */ dyio_outfmt(ttyout,dy_gtxecho, "\n\nLoading exprimalray example from static data.\n") ; main_sys = dytest_exprimalraysys(main_lptols) ; if (main_sys == NULL) { dyio_outfmt(ttyout,dy_gtxecho, "Failed to load exprimalray constraint system.\n") ; errcnt++ ; } else { dy_checkdefaults(main_sys,main_lpopts,main_lptols) ; comflg(main_lp->ctlopts,lpctlONLYFREE|lpctlNOFREE) ; main_lp->phase = dyINV ; main_lp->consys = main_sys ; main_lp->rowsze = main_sys->rowsze ; main_lp->colsze = main_sys->colsze ; main_lpopts->forcecold = TRUE ; main_lpopts->fullsys = TRUE ; main_lpopts->finpurge.vars = FALSE ; main_lpopts->finpurge.cons = FALSE ; main_lpopts->coldbasis = ibLOGICAL ; main_lpopts->scaling = 2 ; dyio_outfmt(ttyout,dy_gtxecho,"Solving exprimalray ... ") ; lpretval = do_lp(main_lp,main_lptols,main_lpopts,1) ; dyio_outfmt(ttyout,dy_gtxecho,"\n %s, z = %.12f.\n", dy_prtlpret(lpretval),main_lp->obj) ; z = -21 ; if (!(fabs(main_lp->obj-z) <= main_lptols->cost)) { errcnt++ ; dyio_outfmt(ttyout,dy_gtxecho, " ERROR: z = %g, expected %g, error %g, tol %g.\n", main_lp->obj,z,fabs(main_lp->obj-z),main_lptols->cost) ; } if (dumpsoln == TRUE) { dy_dumpcompact(dy_logchn,dy_gtxecho,main_lp,FALSE) ; } /* Now tweak the objective to 3x1+x2+x3, giving us two rays. Solve, then test that we have valid primal rays. First ask for just one, then ask for five, expecting two. */ main_sys->obj[1] = -1.0 ; main_sys->obj[2] = -4.0 ; setflg(main_lp->ctlopts,lpctlOBJCHG) ; main_lpopts->forcecold = FALSE ; dyio_outfmt(dy_logchn,dy_gtxecho,"Resolving exprimalray ...") ; lpretval = do_lp(main_lp,main_lptols,main_lpopts,1) ; dyio_outfmt(ttyout,dy_gtxecho,"\n %s, z = %.12f.\n", dy_prtlpret(lpretval),main_lp->obj) ; if (dumpsoln == TRUE) { dy_dumpcompact(dy_logchn,dy_gtxecho,main_lp,FALSE) ; } cnt = 1 ; errcnt += dytest_primalRays(&cnt,main_lp,main_lptols,main_lpopts) ; if (cnt != 1) { errcnt++ ; dyio_outfmt(ttyout,dy_gtxecho, " ERROR: %d primal rays returned, expected %d.\n", cnt,1) ; } cnt = 5 ; errcnt += dytest_primalRays(&cnt,main_lp,main_lptols,main_lpopts) ; if (cnt != 2) { errcnt++ ; dyio_outfmt(ttyout,dy_gtxecho, " ERROR: %d primal rays returned, expected %d.\n", cnt,2) ; } /* Run the remainder of the tests, to make sure they run without error when dylp finishes unbounded. */ errcnt += dytest_betaj(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_abarj(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_betai(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_abari(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_rowDuals(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_colDuals(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_allDuals(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_colPrimals(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_rowPrimals(main_lp,main_lptols,main_lpopts) ; comflg(main_lp->ctlopts,lpctlONLYFREE|lpctlNOFREE) ; dylp(main_lp,main_lpopts,main_lptols,NULL) ; consys_free(main_sys) ; main_sys = NULL ; main_lp->consys = NULL ; dy_freesoln(main_lp) ; } #endif #if RUN_EXDUALRAY > 0 /* Let's try another. Load and solve exdualray. Exdualray takes advantage of duality: The dual polyhedron is exactly the primal polyhedron of the previous problem. The symmetry should be clear from the output (objective, dual, and primal values are negated, but otherwise identical) */ dyio_outfmt(ttyout,dy_gtxecho, "\n\nLoading exdualray example from static data.\n") ; main_sys = dytest_exdualraysys(main_lptols) ; if (main_sys == NULL) { dyio_outfmt(ttyout,dy_gtxecho, "Failed to load exdualray constraint system.\n") ; errcnt++ ; } else { dy_checkdefaults(main_sys,main_lpopts,main_lptols) ; comflg(main_lp->ctlopts,lpctlONLYFREE|lpctlNOFREE) ; main_lp->phase = dyINV ; main_lp->consys = main_sys ; main_lp->rowsze = main_sys->rowsze ; main_lp->colsze = main_sys->colsze ; main_lpopts->forcecold = TRUE ; main_lpopts->fullsys = TRUE ; main_lpopts->finpurge.vars = FALSE ; main_lpopts->finpurge.cons = FALSE ; main_lpopts->coldbasis = ibLOGICAL ; main_lpopts->scaling = 2 ; /* main_lpopts->print.major = 1 ; main_lpopts->print.phase1 = 4 ; main_lpopts->print.phase2 = 4 ; main_lpopts->print.dual = 4 ; main_lpopts->print.tableau = 4 ; main_lpopts->print.soln = 3 ; main_lpopts->print.rays = 5 ; */ dyio_outfmt(ttyout,dy_gtxecho,"Solving exdualray ... ") ; lpretval = do_lp(main_lp,main_lptols,main_lpopts,1) ; dyio_outfmt(ttyout,dy_gtxecho,"\n %s, z = %.12f.\n", dy_prtlpret(lpretval),main_lp->obj) ; z = 21 ; if (!(fabs(main_lp->obj-z) <= main_lptols->cost)) { errcnt++ ; dyio_outfmt(ttyout,dy_gtxecho, " ERROR: z = %g, expected %g, error %g, tol %g.\n", main_lp->obj,z,fabs(main_lp->obj-z),main_lptols->cost) ; } if (dumpsoln == TRUE) { dy_dumpcompact(dy_logchn,dy_gtxecho,main_lp,FALSE) ; } /* Tweak the rhs to (-1)*(-1 -4 1) to produce a pair of rays in the dual. */ main_sys->rhs[2] = 4.0 ; setflg(main_lp->ctlopts,lpctlRHSCHG) ; main_lpopts->forcecold = FALSE ; main_lpopts->print.force = 1 ; dyio_outfmt(dy_logchn,dy_gtxecho,"Resolving exdualray ...") ; lpretval = do_lp(main_lp,main_lptols,main_lpopts,1) ; dyio_outfmt(ttyout,dy_gtxecho,"\n %s, z = %.12f.\n", dy_prtlpret(lpretval),main_lp->obj) ; if (dumpsoln == TRUE) { dy_dumpcompact(dy_logchn,dy_gtxecho,main_lp,FALSE) ; } /* Test that we have valid dual rays. First ask for just one, then ask for five, expecting two. */ errcnt += dytest_rowDuals(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_colDuals(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_allDuals(main_lp,main_lptols,main_lpopts) ; cnt = 1 ; errcnt += dytest_dualRays(&cnt,main_lp,main_lptols,main_lpopts) ; if (cnt != 1) { errcnt++ ; dyio_outfmt(ttyout,dy_gtxecho, " ERROR: %d dual rays returned, expected %d.\n", cnt,1) ; } cnt = 5 ; errcnt += dytest_dualRays(&cnt,main_lp,main_lptols,main_lpopts) ; if (cnt != 2) { errcnt++ ; dyio_outfmt(ttyout,dy_gtxecho, " ERROR: %d dual rays returned, expected %d.\n", cnt,2) ; } /* Run the remainder of the tests, to make sure they run without error when dylp finishes infeasible. */ errcnt += dytest_betaj(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_abarj(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_betai(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_abari(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_colPrimals(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_rowPrimals(main_lp,main_lptols,main_lpopts) ; comflg(main_lp->ctlopts,lpctlONLYFREE|lpctlNOFREE) ; dylp(main_lp,main_lpopts,main_lptols,NULL) ; consys_free(main_sys) ; main_sys = NULL ; main_lp->consys = NULL ; dy_freesoln(main_lp) ; } #endif #if RUN_GALENETBNDS > 0 /* Now a sequence of three problems based on galenet that really exercise the dual ray code. Galenet is a straightforward primal infeasible / dual unbounded problem. The objective is identically zero, so it's a pure feasibility problem. The objective returned from dylp will be z = 48, the amount of primal infeasibility. The first version is galenetbnds. All equalities from galenet are converted to inequalities, all implicit bounds are converted to explicit bound constraints, and then all >= constraints are converted to <= constraints. This is the simplest possible case for returning dual rays. */ dyio_outfmt(ttyout,dy_gtxecho, "\n\nLoading galenetbnds example from static data.\n") ; main_sys = dytest_galenetbndssys(main_lptols) ; if (main_sys == NULL) { dyio_outfmt(ttyout,dy_gtxecho, "Failed to load galenetbnds constraint system.\n") ; errcnt++ ; } else { dy_checkdefaults(main_sys,main_lpopts,main_lptols) ; comflg(main_lp->ctlopts,lpctlONLYFREE|lpctlNOFREE) ; main_lp->phase = dyINV ; main_lp->consys = main_sys ; main_lp->rowsze = main_sys->rowsze ; main_lp->colsze = main_sys->colsze ; main_lpopts->forcecold = TRUE ; main_lpopts->fullsys = TRUE ; main_lpopts->finpurge.vars = FALSE ; main_lpopts->finpurge.cons = FALSE ; main_lpopts->coldbasis = ibLOGICAL ; main_lpopts->scaling = 2 ; /* main_lpopts->print.major = 1 ; main_lpopts->print.phase1 = 4 ; main_lpopts->print.phase2 = 4 ; main_lpopts->print.dual = 4 ; main_lpopts->print.tableau = 4 ; main_lpopts->print.soln = 3 ; main_lpopts->print.rays = 5 ; */ dyio_outfmt(ttyout,dy_gtxecho,"Solving galenetbnds ... ") ; lpretval = do_lp(main_lp,main_lptols,main_lpopts,1) ; dyio_outfmt(ttyout,dy_gtxecho,"\n %s, z = %.12f.\n", dy_prtlpret(lpretval),main_lp->obj) ; z = 48.0 ; if (!(fabs(main_lp->obj-z) <= main_lptols->cost)) { errcnt++ ; dyio_outfmt(ttyout,dy_gtxecho, " ERROR: z = %g, expected %g, error %g, tol %g.\n", main_lp->obj,z,fabs(main_lp->obj-z),main_lptols->cost) ; } dumpsoln = TRUE ; if (dumpsoln == TRUE) { dy_dumpcompact(dy_logchn,dy_gtxecho,main_lp,FALSE) ; } /* Test that we have valid dual rays. First ask for just one, then ask for five, expecting three. */ cnt = 1 ; errcnt += dytest_dualRays(&cnt,main_lp,main_lptols,main_lpopts) ; if (cnt != 1) { errcnt++ ; dyio_outfmt(ttyout,dy_gtxecho, " ERROR: %d dual rays returned, expected %d.\n", cnt,1) ; } cnt = 5 ; errcnt += dytest_dualRays(&cnt,main_lp,main_lptols,main_lpopts) ; if (cnt != 3) { errcnt++ ; dyio_outfmt(ttyout,dy_gtxecho, " ERROR: %d dual rays returned, expected %d.\n", cnt,2) ; } /* Run the remainder of the tests, to make sure they run without error when dylp finishes infeasible. */ errcnt += dytest_betaj(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_abarj(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_betai(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_abari(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_rowDuals(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_colDuals(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_allDuals(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_colPrimals(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_rowPrimals(main_lp,main_lptols,main_lpopts) ; comflg(main_lp->ctlopts,lpctlONLYFREE|lpctlNOFREE) ; dylp(main_lp,main_lpopts,main_lptols,NULL) ; consys_free(main_sys) ; main_sys = NULL ; main_lp->consys = NULL ; dy_freesoln(main_lp) ; } #endif #if RUN_GALENETLEQ > 0 /* Now load and solve galenetleq --- galenetbnds, but the bound constraints on variables are now handled in the usual manner, as implicit bounds. We'll need the full ray (explicit duals y = cinv(B) as well as duals associated with nonbasic bounded variables) in order to pass the mathematical tests rb < 0, rA > 0. */ dyio_outfmt(ttyout,dy_gtxecho, "\n\nLoading galenetleq example from static data.\n") ; main_sys = dytest_galenetleqsys(main_lptols) ; if (main_sys == NULL) { dyio_outfmt(ttyout,dy_gtxecho, "Failed to load galenetleq constraint system.\n") ; errcnt++ ; } else { dy_checkdefaults(main_sys,main_lpopts,main_lptols) ; comflg(main_lp->ctlopts,lpctlONLYFREE|lpctlNOFREE) ; main_lp->phase = dyINV ; main_lp->consys = main_sys ; main_lp->rowsze = main_sys->rowsze ; main_lp->colsze = main_sys->colsze ; main_lpopts->forcecold = TRUE ; main_lpopts->fullsys = TRUE ; main_lpopts->finpurge.vars = FALSE ; main_lpopts->finpurge.cons = FALSE ; main_lpopts->coldbasis = ibLOGICAL ; main_lpopts->scaling = 2 ; /* main_lpopts->print.major = 1 ; main_lpopts->print.phase1 = 4 ; main_lpopts->print.phase2 = 4 ; main_lpopts->print.dual = 4 ; main_lpopts->print.tableau = 4 ; main_lpopts->print.soln = 3 ; main_lpopts->print.rays = 5 ; */ dyio_outfmt(ttyout,dy_gtxecho,"Solving galenetleq ... ") ; lpretval = do_lp(main_lp,main_lptols,main_lpopts,1) ; dyio_outfmt(ttyout,dy_gtxecho,"\n %s, z = %.12f.\n", dy_prtlpret(lpretval),main_lp->obj) ; z = 48.0 ; if (!(fabs(main_lp->obj-z) <= main_lptols->cost)) { errcnt++ ; dyio_outfmt(ttyout,dy_gtxecho, " ERROR: z = %g, expected %g, error %g, tol %g.\n", main_lp->obj,z,fabs(main_lp->obj-z),main_lptols->cost) ; } dumpsoln = TRUE ; if (dumpsoln == TRUE) { dy_dumpcompact(dy_logchn,dy_gtxecho,main_lp,FALSE) ; } /* Test that we have valid dual rays. First ask for just one, then ask for five, expecting three. */ cnt = 1 ; errcnt += dytest_dualRays(&cnt,main_lp,main_lptols,main_lpopts) ; if (cnt != 1) { errcnt++ ; dyio_outfmt(ttyout,dy_gtxecho, " ERROR: %d dual rays returned, expected %d.\n", cnt,1) ; } cnt = 5 ; errcnt += dytest_dualRays(&cnt,main_lp,main_lptols,main_lpopts) ; if (cnt != 3) { errcnt++ ; dyio_outfmt(ttyout,dy_gtxecho, " ERROR: %d dual rays returned, expected %d.\n", cnt,2) ; } /* Run the remainder of the tests, to make sure they run without error when dylp finishes infeasible. */ errcnt += dytest_betaj(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_abarj(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_betai(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_abari(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_rowDuals(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_colDuals(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_allDuals(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_colPrimals(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_rowPrimals(main_lp,main_lptols,main_lpopts) ; comflg(main_lp->ctlopts,lpctlONLYFREE|lpctlNOFREE) ; dylp(main_lp,main_lpopts,main_lptols,NULL) ; consys_free(main_sys) ; main_sys = NULL ; main_lp->consys = NULL ; dy_freesoln(main_lp) ; } #endif #if RUN_GALENETMIXED > 0 /* Now load and solve galenetmixed --- bound constraints on variables are handled implicitly, and the constraint system is a mix of <= and >= constraints (the equalities are handled as a pair of inequalities). As with galenetleq, we'll need the full ray (explicit duals y = cinv(B) as well as duals associated with nonbasic bounded variables) in order to pass the mathematical tests rb < 0, rA > 0. */ dyio_outfmt(ttyout,dy_gtxecho, "\n\nLoading galenetmixed example from static data.\n") ; main_sys = dytest_galenetmixedsys(main_lptols) ; if (main_sys == NULL) { dyio_outfmt(ttyout,dy_gtxecho, "Failed to load galenetmixed constraint system.\n") ; errcnt++ ; } else { dy_checkdefaults(main_sys,main_lpopts,main_lptols) ; comflg(main_lp->ctlopts,lpctlONLYFREE|lpctlNOFREE) ; main_lp->phase = dyINV ; main_lp->consys = main_sys ; main_lp->rowsze = main_sys->rowsze ; main_lp->colsze = main_sys->colsze ; main_lpopts->forcecold = TRUE ; main_lpopts->fullsys = TRUE ; main_lpopts->finpurge.vars = FALSE ; main_lpopts->finpurge.cons = FALSE ; main_lpopts->coldbasis = ibLOGICAL ; main_lpopts->scaling = 2 ; /* main_lpopts->print.major = 1 ; main_lpopts->print.phase1 = 4 ; main_lpopts->print.phase2 = 4 ; main_lpopts->print.dual = 4 ; main_lpopts->print.tableau = 4 ; main_lpopts->print.soln = 3 ; main_lpopts->print.rays = 5 ; */ dyio_outfmt(ttyout,dy_gtxecho,"Solving galenetmixed ... ") ; lpretval = do_lp(main_lp,main_lptols,main_lpopts,1) ; dyio_outfmt(ttyout,dy_gtxecho,"\n %s, z = %.12f.\n", dy_prtlpret(lpretval),main_lp->obj) ; z = 48.0 ; if (!(fabs(main_lp->obj-z) <= main_lptols->cost)) { errcnt++ ; dyio_outfmt(ttyout,dy_gtxecho, " ERROR: z = %g, expected %g, error %g, tol %g.\n", main_lp->obj,z,fabs(main_lp->obj-z),main_lptols->cost) ; } dumpsoln = TRUE ; if (dumpsoln == TRUE) { dy_dumpcompact(dy_logchn,dy_gtxecho,main_lp,FALSE) ; } /* Test that we have valid dual rays. First ask for just one, then ask for five, expecting three. */ cnt = 1 ; errcnt += dytest_dualRays(&cnt,main_lp,main_lptols,main_lpopts) ; if (cnt != 1) { errcnt++ ; dyio_outfmt(ttyout,dy_gtxecho, " ERROR: %d dual rays returned, expected %d.\n", cnt,1) ; } cnt = 5 ; errcnt += dytest_dualRays(&cnt,main_lp,main_lptols,main_lpopts) ; if (cnt != 3) { errcnt++ ; dyio_outfmt(ttyout,dy_gtxecho, " ERROR: %d dual rays returned, expected %d.\n", cnt,2) ; } /* Run the remainder of the tests, to make sure they run without error when dylp finishes infeasible. */ errcnt += dytest_betaj(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_abarj(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_betai(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_abari(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_rowDuals(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_colDuals(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_allDuals(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_colPrimals(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_rowPrimals(main_lp,main_lptols,main_lpopts) ; comflg(main_lp->ctlopts,lpctlONLYFREE|lpctlNOFREE) ; dylp(main_lp,main_lpopts,main_lptols,NULL) ; consys_free(main_sys) ; main_sys = NULL ; main_lp->consys = NULL ; dy_freesoln(main_lp) ; } #endif #if RUN_GALENET > 0 /* Now load and solve the original galenet --- bound constraints on variables are handled implicitly, and the constraint system is a mix of <=, =, and >= constraints. As with galenetleq, we'll need the full ray (explicit duals y = cinv(B) as well as duals associated with nonbasic bounded variables) in order to pass the mathematical tests rb < 0, rA > 0. */ dyio_outfmt(ttyout,dy_gtxecho, "\n\nLoading galenet example from static data.\n") ; main_sys = dytest_galenetsys(main_lptols) ; if (main_sys == NULL) { dyio_outfmt(ttyout,dy_gtxecho, "Failed to load galenet constraint system.\n") ; errcnt++ ; } else { dy_checkdefaults(main_sys,main_lpopts,main_lptols) ; comflg(main_lp->ctlopts,lpctlONLYFREE|lpctlNOFREE) ; main_lp->phase = dyINV ; main_lp->consys = main_sys ; main_lp->rowsze = main_sys->rowsze ; main_lp->colsze = main_sys->colsze ; main_lpopts->forcecold = TRUE ; main_lpopts->fullsys = TRUE ; main_lpopts->finpurge.vars = FALSE ; main_lpopts->finpurge.cons = FALSE ; main_lpopts->coldbasis = ibLOGICAL ; main_lpopts->scaling = 2 ; /* main_lpopts->print.major = 1 ; main_lpopts->print.phase1 = 4 ; main_lpopts->print.phase2 = 4 ; main_lpopts->print.dual = 4 ; main_lpopts->print.tableau = 4 ; main_lpopts->print.soln = 3 ; main_lpopts->print.rays = 5 ; */ dyio_outfmt(ttyout,dy_gtxecho,"Solving galenet ... ") ; lpretval = do_lp(main_lp,main_lptols,main_lpopts,1) ; dyio_outfmt(ttyout,dy_gtxecho,"\n %s, z = %.12f.\n", dy_prtlpret(lpretval),main_lp->obj) ; z = 46.0 ; if (!(fabs(main_lp->obj-z) <= main_lptols->cost)) { errcnt++ ; dyio_outfmt(ttyout,dy_gtxecho, " ERROR: z = %g, expected %g, error %g, tol %g.\n", main_lp->obj,z,fabs(main_lp->obj-z),main_lptols->cost) ; } dumpsoln = TRUE ; if (dumpsoln == TRUE) { dy_dumpcompact(dy_logchn,dy_gtxecho,main_lp,FALSE) ; } /* Test that we have valid dual rays. First ask for just one, then ask for five, expecting two. Note that we end up at a different vertex than the previous expanded versions of galenet. */ cnt = 1 ; errcnt += dytest_dualRays(&cnt,main_lp,main_lptols,main_lpopts) ; if (cnt != 1) { errcnt++ ; dyio_outfmt(ttyout,dy_gtxecho, " ERROR: %d dual rays returned, expected %d.\n", cnt,1) ; } cnt = 5 ; errcnt += dytest_dualRays(&cnt,main_lp,main_lptols,main_lpopts) ; if (cnt != 2) { errcnt++ ; dyio_outfmt(ttyout,dy_gtxecho, " ERROR: %d dual rays returned, expected %d.\n", cnt,2) ; } /* Run the remainder of the tests, to make sure they run without error when dylp finishes infeasible. */ errcnt += dytest_betaj(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_abarj(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_betai(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_abari(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_rowDuals(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_colDuals(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_allDuals(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_colPrimals(main_lp,main_lptols,main_lpopts) ; errcnt += dytest_rowPrimals(main_lp,main_lptols,main_lpopts) ; comflg(main_lp->ctlopts,lpctlONLYFREE|lpctlNOFREE) ; dylp(main_lp,main_lpopts,main_lptols,NULL) ; consys_free(main_sys) ; main_sys = NULL ; main_lp->consys = NULL ; dy_freesoln(main_lp) ; } #endif /* Report the result before we shut down. */ if (errcnt > 0) { dyio_outfmt(ttyout,dy_gtxecho, "\n ERROR: %d total errors for all tests.\n\n", errcnt) ; } else { dyio_outfmt(ttyout,dy_gtxecho, "\n All tests completed successfully.\n\n") ; } dy_freebasis() ; /* Final cleanup. Free space used by the remaining main_* structures and close down any i/o. */ if (main_lp != NULL) { dy_freesoln(main_lp) ; if (main_lp->consys != NULL) consys_free(main_lp->consys) ; FREE(main_lp) ; } if (main_lpopts != NULL) FREE(main_lpopts) ; if (main_lptols != NULL) FREE(main_lptols) ; if (outchn != IOID_INV && outchn != ttyout) { (void) dyio_closefile(outchn) ; } if (dy_logchn != IOID_INV && dy_logchn != IOID_NOSTRM) { (void) dyio_closefile(dy_logchn) ; } dyio_ioterm() ; errterm() ; return (errcnt) ; } DyLP-1.6.0/DyLP/test/dytest_problems.c0000644000076700007670000017414411245632140014447 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2008 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains static data definitions for several test problems, as well as some utility routines for loading the static data into a constraint system. */ #include "dylp.h" extern ioid dy_logchn ; extern bool dy_gtxecho ; /* The exmip1 example used throughout COIN unit tests. This example is drawn from the OSL documentation, "Passing Your Model Using Mathematical Programming System (MPS) Format." It's probably not possible to find this any longer, unless you happen to know someone old enough to have worked with OSL. */ static const int exmip1_rowcnt = 6 ; static const int exmip1_colcnt = 8 ; static const int exmip1_coeffcnt = 17 ; static const int exmip1_maxColLen = 3 ; static const char *exmip1_objname = "OBJ" ; static const int exmip1_objndx = 1 ; static const char *exmip1_rowname[] = { "bogus", "OBJ", "ROW01", "ROW02", "ROW03", "ROW04", "ROW05" } ; static const char exmip1_rowsense[] = { 'B', 'N', 'G', 'L', 'E', 'R', 'R' } ; static const double exmip1_rowlb[] = { -42.42, -1e100, 2.5, -1e100, 4.0, 1.8, 3.0 } ; static const double exmip1_rowub[] = { -42.42, 1e100, 1e100, 2.1, 4.0, 5.0, 15.0 } ; static const char *exmip1_colname[] = { "bogus", "COL01", "COL02", "COL03", "COL04", "COL05", "COL06", "COL07", "COL08" } ; static const double exmip1_collb[] = { -42.42, 2.5, 0.0, 0.0, 0.0, 0.5, 0.0, 0.0, 0.0 } ; static const double exmip1_colub[] = { -42.42, 1e100, 4.1, 1.0, 1.0, 4.0, 1e100, 1e100, 4.3 } ; static const int exmip1_rowndx[] = {-42, 1, 2, 6, 2, 3, 3, 4, 2, 5, 1, 2, 6, 4, 5, 1, 2, 6 } ; static const int exmip1_colndx[] = {-42, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 8, 8, 8 } ; static const double exmip1_coeff[] = { -42.42, 1.0, 3.0, 5.6, 1.0, 2.0, 1.1, 1.0, -2.0, 2.8, 2.0, -1.0, 1.0, 1.0, -1.2, -1.0, -1.0, 1.9 } ; /* The exprimalray example is used to test the routine that returns primal rays. The coefficient matrix is: 6 x1 + 15 x2 + 8 x3 >= 210 face1 9 x1 - 6 x2 - 7 x3 <= 30 face2 - 3 x1 + 21 x2 - 4 x3 <= 180 face3 -216 x1 + 315 x2 - 136 x3 <= 1218 face4 66 x1 + 336 x2 - 83 x3 <= 4305 face5 x1, x2, x3 free The overall shape is a cone formed by face1, face2, and face3, with origin at (10,10,0), opening upward (increasing x3). Face4 forms an extreme point with faces 1 and 3 at (8,10,3/2), cutting off ray13 emanating from (10,10,0) and forming two more rays emanating from (8,10,3/2). Face5 forms an extreme point with faces 2 and 3 at (13,11,3), cutting off ray 23 emanating from (10,10,0) and forming two more rays emanating from (13,11,3). ray12 = ( 1 -2 3) ray13 = (-4 0 3) [ truncated by face4 at (8,10,3/2) ] ray23 = ( 3 1 3) [ truncated by face5 at (13,11,3) ] ray14 = (-40 -8 45) ray34 = (-28 8 63) ray25 = (10 1 12) ray35 = ( 7 9 42) An objective of min x1 + x2 + 2x3 will find (10,10,0), the base of the cone. An objective of min (1 0 1) will find (8,10,3/2) with z = 9.5. An objective of min (1 1 1) will want to go unbounded from (8,10,3/2) along ray14. An objective of min (3 1 1) will want to go unbounded from (8,10,3/2) along both of ray14 and ray34. An objective of min (-1 -1 1) (coded below) will find (13,11,3). An objective of min (-1 -4 1) will want to go unbounded along either of ray25 or ray35. This portion of the polytope works better in exdualray (we don't run afoul of the orthant constraints in the dual). */ static const int exprimalray_rowcnt = 6 ; static const int exprimalray_colcnt = 3 ; static const int exprimalray_coeffcnt = 18 ; static const int exprimalray_maxColLen = 5 ; static const char *exprimalray_objname = "obj" ; static const int exprimalray_objndx = 1 ; static const char *exprimalray_rowname[] = { "bogus", "obj", "face1", "face2", "face3", "face4", "face5" } ; static const char exprimalray_rowsense[] = { 'B', 'N', 'G', 'L', 'L', 'L', 'L' } ; static const double exprimalray_rowlb[] = { -42.42, -1e100, 210, -1e100, -1e100, -1e100, -1e100 } ; static const double exprimalray_rowub[] = { -42.42, 1e100, 1e100, 30, 180, 1218, 4305 } ; static const char *exprimalray_colname[] = { "bogus", "x1", "x2", "x3" } ; static const double exprimalray_collb[] = { -42.42, -1e100, -1e100, -1e100 } ; static const double exprimalray_colub[] = { -42.42, 1e100, 1e100, 1e100 } ; static const int exprimalray_rowndx[] = { -42, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6 } ; static const int exprimalray_colndx[] = { -42, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3 } ; static const double exprimalray_coeff[] = { -42.42, -1.0, 6.0, 9.0, -3.0, -216.0, 66.0, -1.0, 15.0, -6.0, 21.0, 315.0, 336.0, 1.0, 8.0, -7.0, -4.0, -136.0, -83.0 } ; /* The exdualray example is used to test the routine that returns dual rays. It uses the polyhedron of exprimalray to define the dual space, resulting in this primal coefficient matrix: -6 face1 + 9 face2 - 3 face3 - 216 face4 + 66.0 face5 >= 1.0 x1 -15 face1 - 6 face2 + 21 face3 + 315 face4 + 336.0 face5 >= 1.0 x2 -8 face1 - 7 face2 - 4 face3 - 136 face4 - 83.0 face5 >= -1.0 x3 0 <= face1, face2, face3, face4, face5 <= infty The objective of c = (-210 30 180 1218 4305) coded into the arrays below completes the definition of the dual polytope. With b = (1 1 -1) as shown, there should be a finite minimum at y = (13,11,3). To translate the primal objective of exprimalray to the rhs of exdualray, note first that the primal min objective is negated to get a max objective, which is then used as the rhs here according to the standard primal -> dual transform. (Specified using rowlb!) */ static const int exdualray_rowcnt = 4 ; static const int exdualray_colcnt = 5 ; static const int exdualray_coeffcnt = 20 ; static const int exdualray_maxColLen = 3 ; static const char *exdualray_objname = "obj" ; static const int exdualray_objndx = 1 ; static const char *exdualray_rowname[] = { "bogus", "obj", "x1", "x2", "x3" } ; static const char exdualray_rowsense[] = { 'B', 'N', 'G', 'G', 'G' } ; static const double exdualray_rowub[] = { -42.42, 1e100, 1e100, 1e100, 1e100 } ; static const double exdualray_rowlb[] = { -42.42, -1e100, 1.0, 1.0, -1.0 } ; /* static const char exdualray_rowsense[] = { 'B', 'N', 'L', 'G', 'G' } ; static const double exdualray_rowub[] = { -42.42, 1e100, -1.0, 1e100, 1e100 } ; static const double exdualray_rowlb[] = { -42.42, -1e100, -1e100, 1.0, -1.0 } ; */ static const char *exdualray_colname[] = { "bogus", "face1", "face2", "face3", "face4", "face5" } ; static const double exdualray_collb[] = { -42.42, 0, 0, 0, 0, 0 } ; static const double exdualray_colub[] = { -42.42, 1e100, 1e100, 1e100, 1e100, 1e100 } ; static const int exdualray_rowndx[] = { -42, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4 } ; static const int exdualray_colndx[] = { -42, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5 } ; static const double exdualray_coeff[] = { -42.42, -210.0, -6.0, -15.0, -8.0, 30.0, 9.0, -6.0, -7.0, 180.0, -3.0, 21.0, -4.0, 1218.0, -216.0, 315.0, -136.0, 4305.0, 66.0, 336.0, -83.0 } ; /* Correct for constraint x1 a G constraint static const double exdualray_coeff[] = { -42.42, -210.0, 6.0, -15.0, -8.0, 30.0, -9.0, -6.0, -7.0, 180.0, 3.0, 21.0, -4.0, 1218.0, 216.0, 315.0, -136.0, 4305.0, -66.0, 336.0, -83.0 } ; */ /* galenet, from Data/Infeas. This problem is a small network flow problem: three sources, two intermediate nodes, three sinks. It's a feasibility problem (objective coefficients are all zero, hence duals and reduced costs are also zero) and it's primal infeasible and dual unbounded. It was used in the OsiClp unit test, and it turns out to be good from several viewpoints. It's small enough to do manual checks, it has a nice mix of <=, =, and >= constraints, and it has bounded variables. Three more versions of this problem follow: * galenetmixed, in which the equalities are converted to a pair of <= and >= constraints; * galenetleq, in which all constraints are converted to <= constraints; and * galenetbnds, in which all bounds are converted to explicit inequalities, then all inequalities are converted to <= constraints. Galenetbnds is the easy case for dual ray generation, with all constraints explicit. This makes it easy to recreate the canonical dual without worrying about handling implicit bound constraints. Galenetbnds and galenetleq both exercise the unscaled alternatives in the various solution generation routines. Galenetmixed turns out to exercise some interesting cases. In addition to the inversion required to convert to >= constraints in the original system, there's one case where dylp's BLLB slack attached to the internal <= constraint must be viewed as a BUUB surplus in order to successfully generate the correct ray. */ /* First galenet as originally formulated, with a mix of >=, =, and <= constraints. */ static const int galenet_rowcnt = 9 ; static const int galenet_colcnt = 8 ; static const int galenet_coeffcnt = 16 ; static const int galenet_maxColLen = 2 ; static const char *galenet_objname = "COST" ; static const int galenet_objndx = 9 ; static const char *galenet_rowname[] = { "bogus", "S1", "S2", "S3", "NODE4", "NODE5", "D6", "D7", "D8", "COST" } ; static const char galenet_rowsense[] = { 'B', 'L', 'L', 'L', 'E', 'E', 'G', 'G', 'G', 'N' } ; static const double galenet_rowlb[] = { -42.42, -1e100, -1e100, -1e100, 0.0, 0.0, 10., 20., 30., -1e100 } ; static const double galenet_rowub[] = { -42.42, 20., 20., 20., 0.0, 0.0, 1e100, 1e100, 1e100, 1e100 } ; static const char *galenet_colname[] = { "bogus", "T14", "T24", "T25", "T35", "T46", "T47", "T57", "T58" } ; static const double galenet_collb[] = { -42.42, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 } ; static const double galenet_colub[] = { -42.42, 30., 20., 10., 10., 10., 2., 20., 30. } ; static const int galenet_rowndx[] = {-42, 1, 4, 2, 4, 2, 5, 3, 5, 6, 4, 7, 4, 7, 5, 8, 5 } ; static const int galenet_colndx[] = {-42, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8 } ; static const double galenet_coeff[] = { -42.42, 1., 1., 1., 1., 1., 1., 1., 1., 1., -1., 1., -1., 1., -1., 1., -1. } ; /* Galenetmixed, with the equalities converted to a pair of inequalities. */ static const int galenetmixed_rowcnt = 11 ; static const int galenetmixed_colcnt = 8 ; static const int galenetmixed_coeffcnt = 24 ; static const int galenetmixed_maxColLen = 3 ; static const char *galenetmixed_objname = "COST" ; static const int galenetmixed_objndx = 11 ; static const char *galenetmixed_rowname[] = { "bogus", "S1", "S2", "S3", "NODE4U", "NODE4L", "NODE5U", "NODE5L", "D6", "D7", "D8", "COST" } ; static const char galenetmixed_rowsense[] = { 'B', 'L', 'L', 'L', 'L', 'G', 'L', 'G', 'G', 'G', 'G', 'N' } ; static const double galenetmixed_rowlb[] = { -42.42, -1e100, -1e100, -1e100, -1e100, 0.0, -1e100, 0.0, 10., 20., 30., -1e100 } ; static const double galenetmixed_rowub[] = { -42.42, 20., 20., 20., 0.0, 1e100, 0.0, 1e100, 1e100, 1e100, 1e100, 1e100 } ; static const char *galenetmixed_colname[] = { "bogus", "T14", "T24", "T25", "T35", "T46", "T47", "T57", "T58" } ; static const double galenetmixed_collb[] = { -42.42, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 } ; static const double galenetmixed_colub[] = { -42.42, 30., 20., 10., 10., 10., 2., 20., 30. } ; static const int galenetmixed_rowndx[] = {-42, 1, 4, 5, 2, 4, 5, 2, 6, 7, 3, 6, 7, 8, 4, 5, 9, 4, 5, 9, 6, 7, 10, 6, 7 } ; static const int galenetmixed_colndx[] = {-42, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8 } ; static const double galenetmixed_coeff[] = { -42.42, 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., -1., -1., 1., -1., -1., 1., -1., -1., 1., -1., -1. } ; /* Galenetleq, with equalities converted to inequalities and >= constraints converted to <= constraints. */ static const int galenetleq_rowcnt = 11 ; static const int galenetleq_colcnt = 8 ; static const int galenetleq_coeffcnt = 24 ; static const int galenetleq_maxColLen = 3 ; static const char *galenetleq_objname = "COST" ; static const int galenetleq_objndx = 11 ; static const char *galenetleq_rowname[] = { "bogus", "S1", "S2", "S3", "NODE4U", "NODE4L", "NODE5U", "NODE5L", "D6", "D7", "D8", "COST" } ; static const char galenetleq_rowsense[] = { 'B', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'N' } ; static const double galenetleq_rowlb[] = { -42.42, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100 } ; static const double galenetleq_rowub[] = { -42.42, 20., 20., 20., 0.0, 0.0, 0.0, 0.0, -10., -20., -30., 1e100 } ; static const char *galenetleq_colname[] = { "bogus", "T14", "T24", "T25", "T35", "T46", "T47", "T57", "T58" } ; static const double galenetleq_collb[] = { -42.42, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 } ; static const double galenetleq_colub[] = { -42.42, 30., 20., 10., 10., 10., 2., 20., 30. } ; static const int galenetleq_rowndx[] = {-42, 1, 4, 5, 2, 4, 5, 2, 6, 7, 3, 6, 7, 8, 4, 5, 9, 4, 5, 9, 6, 7, 10, 6, 7 } ; static const int galenetleq_colndx[] = {-42, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8 } ; static const double galenetleq_coeff[] = { -42.42, 1., 1., -1.0, 1., 1., -1.0, 1., 1., -1., 1., 1., -1., -1., -1., 1.0, -1., -1., 1.0, -1., -1., 1., -1., -1., 1. } ; /* Galenetbnds, with bounds on variables made into explicit <= constraints. Useful when checking just how rA > 0 fails in the presence of implicit bounds. */ static const int galenetbnds_rowcnt = 27 ; static const int galenetbnds_colcnt = 8 ; static const int galenetbnds_coeffcnt = 40 ; static const int galenetbnds_maxColLen = 5 ; static const char *galenetbnds_objname = "COST" ; static const int galenetbnds_objndx = 27 ; static const char *galenetbnds_rowname[] = { "bogus", "S1", "S2", "S3", "NODE4U", "NODE4L", "NODE5U", "NODE5L", "D6", "D7", "D8", "T14UB", "T14LB", "T24UB", "T24LB", "T25UB", "T25LB", "T35UB", "T35LB", "T46UB", "T46LB", "T47UB", "T47LB", "T57UB", "T57LB", "T58UB", "T58LB", "COST" } ; static const char galenetbnds_rowsense[] = { 'B', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'N' } ; static const double galenetbnds_rowlb[] = { -42.42, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100 } ; static const double galenetbnds_rowub[] = { -42.42, 20., 20., 20., 0.0, 0.0, 0.0, 0.0, -10., -20., -30., 30., 0.0, 20., 0.0, 10., 0.0, 10., 0.0, 10., 0.0, 2., 0.0, 20., 0.0, 30., 0.0, 1e100 } ; static const char *galenetbnds_colname[] = { "bogus", "T14", "T24", "T25", "T35", "T46", "T47", "T57", "T58" } ; static const double galenetbnds_collb[] = { -42.42, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100 } ; static const double galenetbnds_colub[] = { -42.42, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100 } ; static const int galenetbnds_rowndx[] = {-42, 1, 4, 5, 11, 12, 2, 4, 5, 13, 14, 2, 6, 7, 15, 16, 3, 6, 7, 17, 18, 8, 4, 5, 19, 20, 9, 4, 5, 21, 22, 9, 6, 7, 23, 24, 10, 6, 7, 25, 26 } ; static const int galenetbnds_colndx[] = {-42, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8 } ; static const double galenetbnds_coeff[] = { -42.42, 1., 1., -1.0, 1., -1., 1., 1., -1.0, 1., -1., 1., 1., -1., 1., -1., 1., 1., -1., 1., -1., -1., -1., 1.0, 1., -1., -1., -1., 1.0, 1., -1., -1., -1., 1., 1., -1., -1., -1., 1., 1., -1. } ; /* The afiro example, smallest of the Netlib problems. */ static const int afiro_rowcnt = 28 ; static const int afiro_colcnt = 32 ; static const int afiro_coeffcnt = 88 ; static const int afiro_maxColLen = 4 ; static const char *afiro_objname = "COST" ; static const int afiro_objndx = 1 ; static const char *afiro_rowname[] = { "bogus", "COST", "R09", "R10", "R12", "R13", "R19", "R20", "R22", "R23", "X05", "X17", "X18", "X19", "X20", "X21", "X27", "X40", "X41", "X42", "X43", "X44", "X45", "X46", "X47", "X48", "X49", "X50", "X51" } ; static const char afiro_rowsense[] = { 'B', 'N', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L' } ; static const double afiro_rowlb[] = { -42.42, -1e100, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 44., -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100, -1e100 } ; static const double afiro_rowub[] = { -42.42, 1e100, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 44., 80., 80., 0.0, 0.0, 0.0, 0.0, 500., 500., 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 310., 300. } ; static const char *afiro_colname[] = { "bogus", "X01", "X02", "X03", "X04", "X06", "X07", "X08", "X09", "X10", "X11", "X12", "X13", "X14", "X15", "X16", "X22", "X23", "X24", "X25", "X26", "X28", "X29", "X30", "X31", "X32", "X33", "X34", "X35", "X36", "X37", "X38", "X39" } ; static const double afiro_collb[] = { -42.42, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 } ; static const double afiro_colub[] = { -42.42, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100 } ; static const int afiro_rowndx[] = {-42, 25, 2, 3, 10, 15, 2, 1, 23, 2, 27, 3, 26, 4, 5, 11, 26, 4, 5, 12, 26, 4, 5, 13, 26, 4, 5, 14, 22, 11, 22, 12, 22, 13, 22, 14, 15, 4, 1, 24, 4, 28, 5, 23, 6, 7, 16, 21, 6, 1, 25, 6, 22, 6, 27, 7, 24, 8, 9, 17, 24, 8, 9, 18, 24, 8, 9, 19, 24, 8, 9, 20, 22, 17, 22, 18, 22, 19, 22, 20, 21, 9, 1, 26, 9, 28, 8, 9, 1 } ; static const int afiro_colndx[] = {-42, 1, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 16, 16, 16, 16, 17, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 29, 30, 30, 31, 31, 32, 32 } ; static const double afiro_coeff[] = { -42.42, .301, -1., -1.06, 1., -1., 1., -.4, -1., 1., 1., 1., .301, -1., -1.06, 1., .313, -1., -1.06, 1., .313, -1., -.96, 1., .326, -1., -.86, 1., 2.364, -1., 2.386, -1., 2.408, -1., 2.429, -1., 1.4, 1., -.32, -1., 1., 1., 1., .109, -1., -.43, 1., -1., 1., -.6, -1., 1., -1., 1., 1., 1., .109, -.43, 1., 1., .108, -.43, 1., 1., .108, -.39, 1., 1., .107, -.37, 1., 1., 2.191, -1., 2.219, -1., 2.249, -1., 2.279, -1., 1.4, -1., -.48, -1., 1., 1., 1., 1., 10. } ; /* boeing2, the smallest problem that's a good mix of L, G, E, and R constraints. */ static const int boeing2_rowcnt = 167 ; static const int boeing2_colcnt = 143 ; static const int boeing2_coeffcnt = 1339 ; static const int boeing2_maxColLen = 24 ; static const char *boeing2_objname = "OBJECTIV" ; static const int boeing2_objndx = 3 ; static const char *boeing2_rowname[] = { "bogus", "REVENUES", "ACOCOSTS", "OBJECTIV", "FUELAVAL", "SYSTDEPT", "ACMILES", "ASMILES", "PASSNGRS", "RPMILES", "LFRPMASM", "ATONMILE", "RTONMILE", "LFTNMILE", "FLAV*1", "FLAV*2", "FLAV*3", "FLAV*4", "LF1003S1", "LF1003B1", "LF1003C1", "LF1005S1", "LF1005B1", "LF1005C1", "LF1011S1", "LF1011S2", "LF1011B1", "LF1011B2", "LF1011C1", "LF1011C2", "LF1013S1", "LF1013S2", "LF1013B1", "LF1013B2", "LF1013C1", "LF1013C2", "LF1015S1", "LF1015B1", "LF1015C1", "LF1017S1", "LF1017B1", "LF1017C1", "LF1019S1", "LF1019S2", "LF1019B1", "LF1019B2", "LF1019C1", "LF1019C2", "LF1021S1", "LF1021B1", "LF1021C1", "LF1002S1", "LF1002B1", "LF1002C1", "LF1004S1", "LF1004B1", "LF1004C1", "LF1006S1", "LF1006S2", "LF1006B1", "LF1006B2", "LF1006C1", "LF1006C2", "LF1008S1", "LF1008S2", "LF1008B1", "LF1008B2", "LF1008C1", "LF1008C2", "LF1010S1", "LF1010S2", "LF1010S3", "LF1010B1", "LF1010B2", "LF1010B3", "LF1010C1", "LF1010C2", "LF1010C3", "LF1012S1", "LF1012B1", "LF1012C1", "LF1014S1", "LF1014S2", "LF1014B1", "LF1014B2", "LF1014C1", "LF1014C2", "LF1100S1", "LF1100S2", "LF1100S3", "LF1100S4", "LF1100S5", "LF1100B1", "LF1100B2", "LF1100B3", "LF1100B4", "LF1100B5", "LF1100C1", "LF1100C2", "LF1100C3", "LF1100C4", "LF1100C5", "LF1102S1", "LF1102S2", "LF1102S3", "LF1102S4", "LF1102B1", "LF1102B2", "LF1102B3", "LF1102B4", "LF1102C1", "LF1102C2", "LF1102C3", "LF1102C4", "LF1200S1", "LF1200B1", "LF1200C1", "LF1201S1", "LF1201B1", "LF1201C1", "NOPTCLE0", "CONTBOS1", "CONTBOS2", "CONTBOS3", "CONTBOS4", "CONTORD1", "CONTORD2", "CONTORD3", "CONTORD4", "CONTLGA2", "CONTLGA4", "CONTCLE1", "CONTCLE2", "CONTCLE3", "CONTCLE4", "DMBOSORD", "DMBOSLGA", "DMBOSCLE", "DMORDBOS", "DMORDLGA", "DMORDCLE", "DMLGABOS", "DMLGAORD", "DMLGACLE", "DMCLEBOS", "DMCLEORD", "DMCLELGA", "MSBOSORD", "MSBOSLGA", "MSBOSCLE", "MSORDBOS", "MSORDLGA", "MSORDCLE", "MSLGABOS", "MSLGAORD", "MSLGACLE", "MSCLEBOS", "MSCLEORD", "MSCLELGA", "DCBOSORD", "DCBOSCLE", "DCORDBOS", "DCORDLGA", "DCLGAORD", "DCLGACLE", "DCCLELGA", "MCORDBOS", "MCLGAORD" } ; static const char boeing2_rowsense[] = { 'B', 'G', 'G', 'N', 'L', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'E', 'E', 'E', 'E', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'G', 'G' } ; static const double boeing2_rowlb[] = { -42.42, 0.0, 0.0, -1e100, -1e100, 50., 0.0, 0.0, 9431., 0.0, 0.0, 0.0, 0.0, 0.0, 30., 45., 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 24., 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 241.0, 1881.0, 113.0, 241.0, 412.0, 495.0, 2194.0, 569.0, 413.0, 104.0, 569.0, 327.0, 3., 7., 1., 3., 4., 5., 7., 5., 4., 1., 6., 3., 0.0, 12.8, 19.2, 10.4, 36.0, 12.8, 0.0, 1., 2. } ; static const double boeing2_rowub[] = { -42.42, 1e100, 1e100, 1e100, 100000., 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 30., 45., 0.0, 0.0, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 302., 2352., 142., 302., 515., 619., 2743., 712., 517., 131., 712., 409., 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 12., 16., 24., 13., 45., 16., 5., 1e100, 1e100 } ; static const char *boeing2_colname[] = { "bogus", "PBOSORD0", "PBOSORD1", "PBOSORD2", "PBOSORD3", "PBOSORD4", "PBOSLGA0", "PBOSLGA1", "PBOSLGA2", "PBOSLGA3", "PBOSCLE0", "PBOSCLE1", "PBOSCLE2", "PBOSCLE3", "PORDBOS0", "PORDBOS1", "PORDBOS2", "PORDBOS3", "PORDBOS4", "PORDLGA0", "PORDLGA1", "PORDLGA2", "PORDLGA3", "PORDCLE0", "PORDCLE1", "PORDCLE2", "PORDCLE3", "PLGABOS0", "PLGABOS1", "PLGABOS2", "PLGABOS3", "PLGABOS4", "PLGABOS5", "PLGAORD0", "PLGAORD1", "PLGAORD2", "PLGAORD3", "PLGACLE0", "PLGACLE1", "PLGACLE2", "PCLEBOS0", "PCLEBOS1", "PCLEBOS2", "PCLEBOS3", "PCLEBOS4", "PCLEORD0", "PCLEORD1", "PCLEORD2", "PCLEORD3", "PCLEORD4", "PCLELGA0", "PCLELGA1", "PCLELGA2", "PCLELGA3", "BBOSORD0", "BBOSORD1", "BBOSCLE0", "BBOSCLE1", "BORDBOS0", "CBOSORD0", "CBOSORD1", "CBOSORD2", "CBOSORD3", "CBOSORD4", "CBOSCLE0", "CBOSCLE1", "CBOSCLE2", "CBOSCLE3", "CORDBOS0", "CORDBOS1", "CORDBOS2", "CORDBOS3", "CORDBOS4", "CORDLGA0", "CORDLGA1", "CORDLGA2", "CORDLGA3", "CLGAORD0", "CLGAORD1", "CLGAORD2", "CLGAORD3", "CLGACLE0", "CLGACLE1", "CLGACLE2", "CCLELGA0", "CCLELGA1", "CCLELGA2", "CCLELGA3", "GRDTIMO1", "GRDTIMN1", "GRDTIMO2", "GRDTIMN2", "GRDTIMN3", "GRDTIMN4", "N1003AC1", "N1003AC2", "N1003AC3", "N1003AC4", "N1005AC1", "N1005AC2", "N1005AC3", "N1005AC4", "N1011AC1", "N1011AC2", "N1011AC3", "N1011AC4", "N1013AC2", "N1013AC4", "N1015AC2", "N1015AC4", "N1017AC2", "N1017AC4", "N1019AC2", "N1019AC4", "N1021AC1", "N1021AC2", "N1021AC3", "N1021AC4", "N1002AC1", "N1002AC2", "N1002AC3", "N1002AC4", "N1004AC2", "N1004AC4", "N1006AC1", "N1006AC2", "N1006AC3", "N1006AC4", "N1008AC2", "N1008AC4", "N1010AC2", "N1010AC4", "N1012AC2", "N1012AC4", "N1014AC2", "N1014AC4", "N1100AC2", "N1100AC4", "N1102AC2", "N1102AC4", "N1200AC2", "N1200AC4", "N1201AC2", "N1201AC4" } ; static const double boeing2_collb[] = { -42.42, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -100., 0.0, -90., -45., -45., 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 } ; static const double boeing2_colub[] = { -42.42, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 1e100, 0., 1e100, 0., 0., 0., 7., 7., 2., 2., 7., 7., 2., 2., 7., 7., 2., 2., 14., 2., 7., 2., 7., 2., 7., 2., 7., 7., 2., 2., 7., 7., 2., 2., 7., 2., 7., 7., 2., 2., 14., 2., 14., 2., 7., 2., 14., 2., 7., 7., 7., 7., 14., 7., 14., 7. } ; static const int boeing2_rowndx[] = {-42, 1, 3, 8, 9, 10, 135, 18, 1, 3, 8, 9, 10, 135, 24, 25, 1, 3, 8, 9, 10, 135, 30, 31, 1, 3, 8, 9, 10, 135, 87, 88, 89, 1, 3, 8, 9, 10, 135, 102, 103, 1, 3, 8, 9, 10, 136, 30, 1, 3, 8, 9, 10, 136, 87, 1, 3, 8, 9, 10, 136, 102, 103, 104, 1, 3, 8, 9, 10, 136, 114, 1, 3, 8, 9, 10, 137, 21, 1, 3, 8, 9, 10, 137, 24, 1, 3, 8, 9, 10, 137, 87, 88, 1, 3, 8, 9, 10, 137, 102, 1, 3, 8, 9, 10, 138, 57, 58, 1, 3, 8, 9, 10, 138, 63, 64, 1, 3, 8, 9, 10, 138, 69, 70, 71, 1, 3, 8, 9, 10, 138, 90, 91, 1, 3, 8, 9, 10, 138, 104, 105, 1, 3, 8, 9, 10, 139, 54, 1, 3, 8, 9, 10, 139, 63, 1, 3, 8, 9, 10, 139, 69, 70, 1, 3, 8, 9, 10, 139, 104, 1, 3, 8, 9, 10, 140, 51, 1, 3, 8, 9, 10, 140, 57, 1, 3, 8, 9, 10, 140, 69, 1, 3, 8, 9, 10, 140, 90, 1, 3, 8, 9, 10, 141, 64, 1, 3, 8, 9, 10, 141, 71, 1, 3, 8, 9, 10, 141, 82, 1, 3, 8, 9, 10, 141, 88, 89, 90, 91, 1, 3, 8, 9, 10, 141, 105, 1, 3, 8, 9, 10, 141, 117, 1, 3, 8, 9, 10, 142, 31, 1, 3, 8, 9, 10, 142, 39, 1, 3, 8, 9, 10, 142, 42, 43, 1, 3, 8, 9, 10, 142, 88, 89, 1, 3, 8, 9, 10, 143, 36, 1, 3, 8, 9, 10, 143, 42, 1, 3, 8, 9, 10, 143, 88, 1, 3, 8, 9, 10, 144, 58, 1, 3, 8, 9, 10, 144, 70, 71, 1, 3, 8, 9, 10, 144, 81, 82, 1, 3, 8, 9, 10, 144, 91, 1, 3, 8, 9, 10, 144, 103, 104, 105, 1, 3, 8, 9, 10, 145, 25, 1, 3, 8, 9, 10, 145, 43, 1, 3, 8, 9, 10, 145, 48, 1, 3, 8, 9, 10, 145, 89, 1, 3, 8, 9, 10, 145, 103, 1, 3, 8, 9, 10, 146, 70, 1, 3, 8, 9, 10, 146, 78, 1, 3, 8, 9, 10, 146, 81, 1, 3, 8, 9, 10, 146, 103, 104, 1, 3, 12, 13, 159, 19, 1, 3, 12, 13, 159, 26, 27, 1, 3, 12, 13, 160, 22, 1, 3, 12, 13, 160, 26, 1, 3, 12, 13, 161, 59, 60, 1, 3, 12, 13, 159, 20, 1, 3, 12, 13, 159, 28, 29, 1, 3, 12, 13, 159, 34, 35, 1, 3, 12, 13, 159, 97, 98, 99, 1, 3, 12, 13, 159, 110, 111, 1, 3, 12, 13, 160, 23, 1, 3, 12, 13, 160, 28, 1, 3, 12, 13, 160, 97, 98, 1, 3, 12, 13, 160, 110, 1, 3, 12, 13, 161, 61, 62, 1, 3, 12, 13, 161, 67, 68, 1, 3, 12, 13, 161, 75, 76, 77, 1, 3, 12, 13, 161, 100, 101, 1, 3, 12, 13, 161, 112, 113, 1, 3, 12, 13, 162, 56, 1, 3, 12, 13, 162, 67, 1, 3, 12, 13, 162, 75, 76, 1, 3, 12, 13, 162, 112, 1, 3, 12, 13, 163, 35, 1, 3, 12, 13, 163, 41, 1, 3, 12, 13, 163, 46, 47, 1, 3, 12, 13, 163, 98, 99, 1, 3, 12, 13, 164, 38, 1, 3, 12, 13, 164, 46, 1, 3, 12, 13, 164, 98, 1, 3, 12, 13, 165, 76, 1, 3, 12, 13, 165, 80, 1, 3, 12, 13, 165, 85, 1, 3, 12, 13, 165, 111, 112, 14, 2, 3, 14, 2, 3, 15, 2, 3, 15, 2, 3, 16, 2, 3, 17, 2, 3, 2, 3, 4, 5, 6, 7, 10, 14, 11, 13, 18, 19, 121, 125, 147, 2, 3, 4, 5, 6, 7, 10, 15, 18, 122, 126, 147, 2, 3, 4, 5, 6, 16, 11, 13, 20, 123, 127, 2, 3, 4, 5, 6, 17, 11, 13, 20, 124, 128, 2, 3, 4, 5, 6, 7, 10, 14, 11, 13, 21, 22, 120, 121, 131, 149, 2, 3, 4, 5, 6, 7, 10, 15, 21, 120, 122, 132, 149, 2, 3, 4, 5, 6, 16, 11, 13, 23, 120, 123, 133, 2, 3, 4, 5, 6, 17, 11, 13, 23, 120, 124, 134, 2, 3, 4, 5, 6, 7, 10, 14, 11, 13, 24, 25, 26, 27, 120, 121, 125, 149, 147, 157, 2, 3, 4, 5, 6, 7, 10, 15, 24, 25, 120, 122, 126, 149, 147, 157, 2, 3, 4, 5, 6, 16, 11, 13, 28, 29, 120, 123, 127, 2, 3, 4, 5, 6, 17, 11, 13, 28, 29, 120, 124, 128, 2, 3, 4, 5, 6, 7, 10, 15, 30, 31, 122, 126, 148, 147, 154, 2, 3, 4, 5, 6, 17, 11, 13, 34, 35, 124, 128, 167, 2, 3, 4, 5, 6, 7, 10, 15, 36, 120, 129, 132, 155, 2, 3, 4, 5, 6, 17, 11, 13, 38, 120, 130, 134, 2, 3, 4, 5, 6, 7, 10, 15, 39, 129, 126, 154, 2, 3, 4, 5, 6, 17, 11, 13, 41, 130, 128, 167, 2, 3, 4, 5, 6, 7, 10, 15, 42, 43, 120, 129, 126, 155, 154, 157, 2, 3, 4, 5, 6, 17, 11, 13, 46, 47, 120, 130, 128, 167, 2, 3, 4, 5, 6, 7, 10, 14, 11, 13, 48, 49, 120, 131, 125, 157, 2, 3, 4, 5, 6, 7, 10, 15, 48, 120, 132, 126, 157, 2, 3, 4, 5, 6, 16, 11, 13, 50, 120, 133, 127, 2, 3, 4, 5, 6, 17, 11, 13, 50, 120, 134, 128, 2, 3, 4, 5, 6, 7, 10, 14, 11, 13, 51, 52, 120, 125, 131, 152, 2, 3, 4, 5, 6, 7, 10, 15, 51, 120, 126, 132, 152, 2, 3, 4, 5, 6, 16, 11, 13, 53, 120, 127, 133, 2, 3, 4, 5, 6, 17, 11, 13, 53, 120, 128, 134, 2, 3, 4, 5, 6, 7, 10, 15, 54, 126, 129, 151, 2, 3, 4, 5, 6, 17, 11, 13, 56, 128, 130, 2, 3, 4, 5, 6, 7, 10, 14, 11, 13, 57, 58, 59, 60, 120, 125, 121, 152, 150, 156, 2, 3, 4, 5, 6, 7, 10, 15, 57, 58, 120, 126, 122, 152, 150, 156, 2, 3, 4, 5, 6, 16, 11, 13, 61, 62, 120, 127, 123, 166, 2, 3, 4, 5, 6, 17, 11, 13, 61, 62, 120, 128, 124, 166, 2, 3, 4, 5, 6, 7, 10, 15, 63, 64, 126, 122, 151, 150, 153, 2, 3, 4, 5, 6, 17, 11, 13, 67, 68, 128, 124, 166, 2, 3, 4, 5, 6, 7, 10, 15, 69, 70, 71, 120, 126, 122, 152, 151, 150, 158, 156, 153, 2, 3, 4, 5, 6, 17, 11, 13, 75, 76, 77, 120, 128, 124, 166, 2, 3, 4, 5, 6, 7, 10, 15, 78, 120, 132, 129, 158, 2, 3, 4, 5, 6, 17, 11, 13, 80, 120, 134, 130, 2, 3, 4, 5, 6, 7, 10, 15, 81, 82, 120, 132, 122, 158, 156, 153, 2, 3, 4, 5, 6, 17, 11, 13, 85, 86, 120, 134, 124, 2, 3, 4, 5, 6, 7, 10, 15, 87, 88, 89, 90, 91, 120, 148, 149, 147, 155, 154, 153, 157, 152, 150, 156, 2, 3, 4, 5, 6, 17, 11, 13, 97, 98, 99, 100, 101, 120, 167, 166, 2, 3, 4, 5, 6, 7, 10, 15, 102, 103, 104, 105, 120, 149, 147, 148, 157, 158, 156, 151, 150, 153, 2, 3, 4, 5, 6, 17, 11, 13, 110, 111, 112, 113, 120, 166, 2, 3, 4, 5, 6, 7, 10, 15, 114, 122, 129, 148, 2, 3, 4, 5, 6, 17, 11, 13, 116, 124, 130, 2, 3, 4, 5, 6, 7, 10, 15, 117, 129, 122, 153, 2, 3, 4, 5, 6, 17, 11, 13, 119, 130, 124 } ; static const int boeing2_colndx[] = {-42, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 37, 38, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 41, 41, 42, 42, 42, 42, 42, 42, 42, 42, 43, 43, 43, 43, 43, 43, 43, 44, 44, 44, 44, 44, 44, 44, 44, 44, 45, 45, 45, 45, 45, 45, 45, 46, 46, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 48, 49, 49, 49, 49, 49, 49, 49, 50, 50, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 52, 52, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 55, 55, 56, 56, 56, 56, 56, 56, 57, 57, 57, 57, 57, 57, 58, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 60, 60, 61, 61, 61, 61, 61, 61, 61, 62, 62, 62, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 63, 63, 64, 64, 64, 64, 64, 64, 65, 65, 65, 65, 65, 65, 66, 66, 66, 66, 66, 66, 66, 67, 67, 67, 67, 67, 67, 68, 68, 68, 68, 68, 68, 68, 69, 69, 69, 69, 69, 69, 69, 70, 70, 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, 71, 71, 71, 72, 72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75, 75, 76, 76, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 78, 78, 79, 79, 79, 79, 79, 79, 79, 80, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 82, 82, 82, 82, 82, 82, 83, 83, 83, 83, 83, 83, 84, 84, 84, 84, 84, 84, 85, 85, 85, 85, 85, 85, 86, 86, 86, 86, 86, 86, 87, 87, 87, 87, 87, 87, 87, 88, 88, 88, 89, 89, 89, 90, 90, 90, 91, 91, 91, 92, 92, 92, 93, 93, 93, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143 } ; static const double boeing2_coeff[] = { -42.42, .075, -.075, 1., .86441, -.86441, 1., -1., .075, -.075, 1., .87605, -.87605, 1., -1., -1., .075, -.075, 1., .91637, -.91637, 1., -1., -1., .075, -.075, 1., .91722, -.91722, 1., -1., -1., -1., .075, -.075, 1., .87605, -.87605, 1., -1., -1., .027, -.027, 1., .18557, -.18557, 1., -1., .027, -.027, 1., .18557, -.18557, 1., -1., .027, -.027, 1., 1.60685, -1.60685, 1., -1., -1., -1., .027, -.027, 1., .18557, -.18557, 1., -1., .053, -.053, 1., .56156, -.56156, 1., -1., .053, -.053, 1., .56156, -.56156, 1., -1., .053, -.053, 1., .60273, -.60273, 1., -1., -1., .053, -.053, 1., .56156, -.56156, 1., -1., .075, -.075, 1., .87605, -.87605, 1., -1., -1., .075, -.075, 1., .91637, -.91637, 1., -1., -1., .075, -.075, 1., .91722, -.91722, 1., -1., -1., -1., .075, -.075, 1., .87605, -.87605, 1., -1., -1., .075, -.075, 1., .91637, -.91637, 1., -1., -1., .068, -.068, 1., .7308, -.7308, 1., -1., .068, -.068, 1., .7308, -.7308, 1., -1., .068, -.068, 1., .73165, -.73165, 1., -1., -1., .068, -.068, 1., .7308, -.7308, 1., -1., .035, -.035, 1., .3145, -.3145, 1., -1., .035, -.035, 1., .3145, -.3145, 1., -1., .035, -.035, 1., .3145, -.3145, 1., -1., .035, -.035, 1., .3145, -.3145, 1., -1., .027, -.027, 1., .18557, -.18557, 1., -1., .027, -.027, 1., .18557, -.18557, 1., -1., .027, -.027, 1., .18557, -.18557, 1., -1., .027, -.027, 1., 1.6077, -1.6077, 1., -1., -1., -1., -1., .027, -.027, 1., .18557, -.18557, 1., -1., .027, -.027, 1., .18557, -.18557, 1., -1., .068, -.068, 1., .7308, -.7308, 1., -1., .068, -.068, 1., .7308, -.7308, 1., -1., .068, -.068, 1., .73165, -.73165, 1., -1., -1., .068, -.068, 1., .73165, -.73165, 1., -1., -1., .037, -.037, 1., .41715, -.41715, 1., -1., .037, -.037, 1., .41715, -.41715, 1., -1., .037, -.037, 1., .41715, -.41715, 1., -1., .053, -.053, 1., .56156, -.56156, 1., -1., .053, -.053, 1., .60273, -.60273, 1., -1., -1., .053, -.053, 1., .60273, -.60273, 1., -1., -1., .053, -.053, 1., .56156, -.56156, 1., -1., .053, -.053, 1., 1.23087, -1.23087, 1., -1., -1., -1., .035, -.035, 1., .3145, -.3145, 1., -1., .035, -.035, 1., .3145, -.3145, 1., -1., .035, -.035, 1., .3145, -.3145, 1., -1., .035, -.035, 1., .3145, -.3145, 1., -1., .035, -.035, 1., .3145, -.3145, 1., -1., .037, -.037, 1., .41715, -.41715, 1., -1., .037, -.037, 1., .41715, -.41715, 1., -1., .037, -.037, 1., .41715, -.41715, 1., -1., .037, -.037, 1., 1.0453, -1.0453, 1., -1., -1., .75, -.75, .86441, -.86441, 1., -1., .75, -.75, .87605, -.87605, 1., -1., -1., .53, -.53, .56156, -.56156, 1., -1., .53, -.53, .56156, -.56156, 1., -1., .75, -.75, .87605, -.87605, 1., -1., -1., .75, -.75, .86441, -.86441, 1., -1., .75, -.75, .87605, -.87605, 1., -1., -1., .75, -.75, .91637, -.91637, 1., -1., -1., .75, -.75, .91722, -.91722, 1., -1., -1., -1., .75, -.75, .87605, -.87605, 1., -1., -1., .53, -.53, .56156, -.56156, 1., -1., .53, -.53, .56156, -.56156, 1., -1., .53, -.53, .60273, -.60273, 1., -1., -1., .53, -.53, .56156, -.56156, 1., -1., .75, -.75, .87605, -.87605, 1., -1., -1., .75, -.75, .91637, -.91637, 1., -1., -1., .75, -.75, .91722, -.91722, 1., -1., -1., -1., .75, -.75, .87605, -.87605, 1., -1., -1., .75, -.75, .91637, -.91637, 1., -1., -1., .68, -.68, .7308, -.7308, 1., -1., .68, -.68, .7308, -.7308, 1., -1., .68, -.68, .73165, -.73165, 1., -1., -1., .68, -.68, .7308, -.7308, 1., -1., .68, -.68, .7308, -.7308, 1., -1., .68, -.68, .7308, -.7308, 1., -1., .68, -.68, .73165, -.73165, 1., -1., -1., .68, -.68, .73165, -.73165, 1., -1., -1., .37, -.37, .41715, -.41715, 1., -1., .37, -.37, .41715, -.41715, 1., -1., .37, -.37, .41715, -.41715, 1., -1., .37, -.37, .41715, -.41715, 1., -1., .37, -.37, .41715, -.41715, 1., -1., .37, -.37, .41715, -.41715, 1., -1., .37, -.37, 1.0453, -1.0453, 1., -1., -1., 1., .65, .65, 1., -.05, -.05, 1., .275, .275, 1., -.02889, -.02889, 1., -.03611, -.03611, 1., -.01333, -.01333, .01, .01, 7.98429, 1., .86441, 351.81396, 211.088376, 2.32729, 25.93224, 12.96612, 305., 12., 1., -1., 1., .02, .02, 2.51914, 1., .86441, 113.23743, 67.942458, 2.10966, 98., 1., -1., 1., .03, .03, 3.15178, 1., .86441, 2.10966, 34.57631, 17.288155, 30., 1., -1., .04, .04, 1.99337, 1., .86441, 2.10966, 12.96612, 6.48306, 11.25, 1., -1., 4.04337, 4.04337, 5.83404, 1., .56156, 228.55299, 137.131794, 1000., 16.84665, 8.423325, 305., 12., 1., 1., -1., 1., 1.60964, 1.60964, 1.82258, 1., .56156, 73.56374, 44.138244, 2000., 98., 1., 1., -1., 1., 1.93119, 1.93119, 2.27351, 1., .56156, 3000., 22.4622, 11.2311, 30., 1., 1., -1., 1.34618, 1.34618, 1.41795, 1., .56156, 1500., 8.42333, 4.211665, 11.25, 1., 1., -1., 1.1, 1.1, 9.91398, 2., .87605, 356.55371, 213.932226, 25., 26.2816, 13.1408, 305., 305., 12., 12., 2., 1., -1., 1., 1., 1., 1.2, 1.2, 3.07692, 2., .87605, 114.76299, 68.857794, 25., 98., 98., 2., 1., -1., 1., 1., 1., 1.3, 1.3, 3.83055, 2., .87605, 26., 35.04214, 17.52107, 30., 30., 2., 1., -1., 2.34647, 2.34647, 2.3665, 2., .87605, 27., 13.1408, 6.5704, 11.25, 11.25, 2., 1., -1., 2.36783, 2.36783, 3.16965, 2., .91637, 120.04449, 72.026694, 2.65943, 98., 98., 1., -1., 1., 1., 1., 1.90292, 1.90292, 2.4431, 2., .91637, 2.65943, 13.74556, 6.87278, 11.25, 11.25, 1., -1., 1., 1.36416, 1.36416, 1.49045, 1., .41715, 54.64705, 32.78823, 1.25093, 98., 1., 1., -1., 1., 1.14401, 1.14401, 1.14359, 1., .41715, 1.25093, 6.25729, 3.128645, 11.25, 1., 1., -1., 1.64736, 1.64736, 2.21183, 1., .7308, 95.73444, 57.440664, 1.85313, 98., 1., -1., 1., 1.33312, 1.33312, 1.73951, 1., .7308, 1.85313, 10.96196, 5.48098, 11.25, 1., -1., 1., 2.55381, 2.55381, 2.7448, 2., .73165, 95.8463, 57.50778, 2.30477, 98., 98., 2., 1., -1., 1., 1., 1., 2.14431, 2.14431, 2.09214, 2., .73165, 2.30477, 10.97477, 5.487385, 11.25, 11.25, 2., 1., -1., 1., 3.12679, 3.12679, 4.07994, 1., .3145, 128.00075, 76.80045, 1.34295, 9.43495, 4.717475, 305., 12., 1., 1., -1., 1., 1.18965, 1.18965, 1.25435, 1., .3145, 41.19926, 24.719556, 1.05384, 98., 1., 1., -1., 1., 1.42472, 1.42472, 1.55704, 1., .3145, 1.05384, 12.57993, 6.289965, 30., 1., 1., -1., 1.0003, 1.0003, .94855, 1., .3145, 1.05384, 4.71747, 2.358735, 11.25, 1., 1., -1., 3.12679, 3.12679, 4.07994, 1., .3145, 128.00075, 76.80045, 1.34295, 9.43495, 4.717475, 305., 12., 1., 1., -1., 1., 1.18965, 1.18965, 1.25435, 1., .3145, 41.19926, 24.719556, 1.05384, 98., 1., 1., -1., 1., 1.42472, 1.42472, 1.55704, 1., .3145, 1.05384, 12.57993, 6.289965, 30., 1., 1., -1., 1.0003, 1.0003, .94855, 1., .3145, 1.05384, 4.71747, 2.358735, 11.25, 1., 1., -1., 1.64736, 1.64736, 2.21183, 1., .7308, 95.73444, 57.440664, 1.85313, 98., 1., -1., 1., 1.33312, 1.33312, 1.73951, 1., .7308, 1.85313, 10.96196, 5.48098, 11.25, 1., -1., 7.17016, 7.17016, 9.91398, 2., .87605, 356.55371, 213.932226, 3.12813, 26.2816, 13.1408, 305., 305., 12., 12., 2., 1., -1., 1., 1., 1., 2.79929, 2.79929, 3.07692, 2., .87605, 114.76299, 68.857794, 2.58202, 98., 98., 2., 1., -1., 1., 1., 1., 3.35591, 3.35591, 3.83055, 2., .87605, 2.58202, 35.04214, 17.52107, 30., 30., 2., 1., -1., 1., 2.34647, 2.34647, 2.3665, 2., .87605, 2.58202, 13.1408, 6.5704, 11.25, 11.25, 2., 1., -1., 1., 2.36783, 2.36783, 3.16965, 2., .91637, 120.04449, 72.026694, 2.65943, 98., 98., 1., -1., 1., 1., 1., 1.90292, 1.90292, 2.4431, 2., .91637, 2.65943, 13.74556, 6.87278, 11.25, 11.25, 1., -1., 1., 3.27428, 3.27428, 3.70262, 3., .91722, 120.15637, 72.093822, 3.11107, 98., 98., 98., 2., 1., -1., 1., 1., 1., 1., 1., 1., 2.71411, 2.71411, 2.79573, 3., .91722, 3.11107, 13.75836, 6.87918, 11.25, 11.25, 11.25, 2., 1., -1., 1., 1.36416, 1.36416, 1.49045, 1., .41715, 54.64705, 32.78823, 1.25093, 98., 1., 1., -1., 1., 1.14401, 1.14401, 1.14359, 1., .41715, 1.25093, 6.25729, 3.128645, 11.25, 1., 1., -1., 2.08463, 2.08463, 2.44827, 2., .60273, 78.95706, 47.374236, 2.05723, 98., 98., 1., 1., -1., 1., 1., 1., 1.71382, 1.71382, 1.84718, 2., .60273, 2.05723, 9.04089, 4.520445, 11.25, 11.25, 1., 1., -1., 6.07357, 6.07357, 6.77953, 5., 1.79328, 234.91937, 140.951622, 5.69309, 98., 98., 98., 98., 98., 4., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 5.06059, 5.06059, 5.16223, 5., 1.79328, 5.69309, 26.89915, 13.449575, 11.25, 11.25, 11.25, 11.25, 11.25, 4., 1., 1., 5.16712, 5.16712, 6.24657, 4., 1.79242, 234.80756, 140.884536, 5.24145, 98., 98., 98., 98., 2., 1., 1., 1., 1., 1., 1., 1., 1., 1., 4.24939, 4.24939, 4.8096, 4., 1.79242, 5.24145, 26.88635, 13.443175, 11.25, 11.25, 11.25, 11.25, 2., 1., .72047, .72047, .95782, 1., .18557, 24.31007, 14.586042, .8063, 98., 1., -1., 1., .5698, .5698, .70359, 1., .18557, .8063, 2.7836, 1.3918, 11.25, 1., -1., .72047, .72047, .95782, 1., .18557, 24.31007, 14.586042, .8063, 98., 1., -1., 1., .5698, .5698, .70359, 1., .18557, .8063, 2.7836, 1.3918, 11.25, 1., -1. } ; #define INFTY_CHECK(zz_val_zz,zz_InftyIn_zz,zz_InftyOut_zz) \ (((zz_val_zz) == (zz_InftyIn_zz))?(zz_InftyOut_zz):\ (((zz_val_zz) == (-zz_InftyIn_zz))?(-zz_InftyOut_zz):(zz_val_zz))) static consys_struct *load_consys ( const int m, const int n, const int q, const int maxColLen, const double infty, const char *probname, const int objndx, const char *objname, const char **rowname, const char *rowsense, const double *rlb, const double *rub, const char **colname, const double *vlb, const double *vub, const int *colndx, const int *rowndx, const double *coeff) /* A routine to load a problem into a constraint system from initialised data arrays. This routine has far too many parameters, but it'll do for the task at hand. The idea is that a fairly simple awk script (or equivalent) has preprocessed an MPS file into a set of static arrays. This routine simply loads the arrays into a consys. Rows and columns are assumed to be numbered from 1, and position [0] of all arrays is garbage. This goes along with dylp's convention of 1-based indexing. The objective function is assumed to be included in (colndx,rowndx,coeff) just like any other row. A separate objective vector is built along with the constraint system, and the objective row is deleted from the constraint system at the end of the routine. Infinity is a never-ending pain. It's expected that the data arrays will use the value 1e100 as infinity (well outside any reasonable value, but well within the range of a float). This is (almost) hardwired --- a single local variable, mpsInfinity, is initialised to 1e100. Any occurrences of mpsInfinity in the input data will be replaced by the value infty passed in as a parameter. The rlb and rub arrays are expected to contain correct values as if for a range constraint. This routine will take care of dylp's idiosyncracies for G (>=) constraints. It's expected that the preprocessing script will change the rowsense letter to R to indicate an honest range constraint (i.e., finite lower and upper bounds). The routine will attempt to free the constraint system in the event of an error during construction. There's a nontrivial chance of failure. Parameters: m,n,q: number of rows, columns, and coefficients, respectively maxColLen: maximum number of nonzeros in a column infty: the desired value for infinity (either IEEE infinity, or the classic finite infinity, DBL_MAX) probname: the problem name objndx: index of the objective function objname: name of the objective function rowname: names for rows (constraints) rowsense: the rowsense letters N, E, L, G, from the MPS ROWS section, modified to include R for range constraints. rlb,rub: row lower and upper bounds, respectively. See notes above. colname: names for columns (variables) vlb,vub: column lower and upper bounds, respectively. colndx,rowndx,coeff: three correlated arrays specifying the nonzero coefficients of the constraint matrix, in column-major order. Returns: a pointer to a constraint system, or NULL if an error occurs. */ { int i,j,k,curCol,v ; const double mpsInfty = 1e100 ; pkvec_struct *ai,*aj ; pkcoeff_struct *coeffj ; consys_struct *sys ; char typlett ; contyp_enum ctypi ; double rlbi,rubi,cj,aij,vlbj,vubj ; bool retval ; int printlvl = 0 ; const char *rtnnme = "load_consys" ; /* Define the desired set of attached vectors and any options. */ const flags parts = CONSYS_OBJ | CONSYS_VUB | CONSYS_VLB | CONSYS_VTYP | CONSYS_RHS | CONSYS_RHSLOW | CONSYS_CTYP ; const flags opts = CONSYS_WRNATT ; /* Start off by creating an empty constraint system with the required capacity. Insert the objective name while we're at it. Note that we have one extra row, the objective, which we'll filter out as the need arises. */ sys = consys_create(probname,parts,opts,m,n,infty) ; if (sys == NULL) { errmsg(152,rtnnme,probname) ; return (NULL) ; } consys_chgnme(sys,'o',0,objname) ; /* Insert empty rows, excepting the objective function, which is kept separately. We need to convert the rowsense letter to the appropriate contyp_enum value, and we need to convert any mpsInfty values to the actual infty value. */ ai = pkvec_new(0) ; for (i = 1 ; i <= m ; i++) { ai->nme = rowname[i] ; typlett = rowsense[i] ; switch (typlett) { case 'L': { ctypi = contypLE ; break ; } case 'E': { ctypi = contypEQ ; break ; } case 'R': { ctypi = contypRNG ; break ; } case 'G': { ctypi = contypGE ; break ; } case 'N': { ctypi = contypNB ; break ; } default: { ctypi = contypINV ; errmsg(154,rtnnme,sys->nme,((unsigned) typlett),typlett,ai->nme) ; break ; } } /* One of dylp's idiosyncracies is that it uses rhs to hold the right-hand-side for both >= and <= constraints. Because the rhs and rhslow arrays are uniformly assumed to be rhslow[i] <= ax <= rhs[i], we need a special case for a >= constraint. */ if (ctypi == contypGE) { rlbi = INFTY_CHECK(rub[i],mpsInfty,infty) ; rubi = INFTY_CHECK(rlb[i],mpsInfty,infty) ; } else { rlbi = INFTY_CHECK(rlb[i],mpsInfty,infty) ; rubi = INFTY_CHECK(rub[i],mpsInfty,infty) ; } retval = consys_addrow_pk(sys,'c',ctypi,ai,rubi,rlbi,NULL,NULL) ; # ifndef DYLP_NDEBUG if (printlvl >= 2) { typlett = (ctypi == contypGE)?'>':'<' ; dyio_outfmt(dy_logchn,dy_gtxecho, "%s: installing row %g <= %s (%d) <= %g ", rtnnme,rlb[i],ai->nme,i,rub[i]) ; dyio_outfmt(dy_logchn,dy_gtxecho,"as %g %c= %s (%d, %s) %c= %g.\n", rlbi,typlett,consys_nme(sys,'c',ai->ndx,FALSE,NULL),ai->ndx, consys_prtcontyp(ctypi),typlett,rubi) ; } # endif if (retval == FALSE) { errmsg(156,rtnnme,"row",sys->nme,ai->nme) ; } if (retval == FALSE || ctypi == contypINV) { retval = FALSE ; break ; } } if (ai != NULL) pkvec_free(ai) ; if (retval == FALSE) { consys_free(sys) ; return (NULL) ; } /* Now load the coefficient matrix. We need to scan the column-major arrays that specify the coefficients and load the columns into memory. The approach is to scan along, loading a vector with coefficients, until we hit a change of column index. At that point, the current column is added to the constraint system and we start again. Do a bit of prep before we start into the scan loop: Allocate a packed vector large enough for the longest column, and make it look like colndx[1] is the current column, and reset column length and objective coefficient. */ aj = pkvec_new(maxColLen) ; coeffj = aj->coeffs ; curCol = colndx[1] ; v = 0 ; cj = 0.0 ; for (k = 1 ; k <= q ; k++) { i = rowndx[k] ; if (i == objndx) { cj = INFTY_CHECK(coeff[k],mpsInfty,infty) ; } else { coeffj[v].ndx = i ; aij = INFTY_CHECK(coeff[k],mpsInfty,infty) ; coeffj[v].val = coeff[k] ; v++ ; } /* Have we just processed the last coefficient for this column? If so, install it. */ if (k+1 > q || colndx[k+1] != curCol) { j = curCol ; aj->cnt = v ; aj->nme = colname[j] ; vlbj = INFTY_CHECK(vlb[j],mpsInfty,infty) ; vubj = INFTY_CHECK(vub[j],mpsInfty,infty) ; retval = consys_addcol_pk(sys,vartypCON,aj,cj,vlbj,vubj) ; # ifndef DYLP_NDEBUG if (printlvl >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "%s: installing column %g <= %s (%d) <= %g, %d coefficients, ", rtnnme,vlb[j],aj->nme,j,vub[j],aj->cnt) ; dyio_outfmt(dy_logchn,dy_gtxecho,"as %g <= %s (%d) <= %g, cj = %g.\n", vlbj,consys_nme(sys,'v',aj->ndx,FALSE,NULL),aj->ndx,vubj,cj) ; } # endif if (retval == FALSE) { errmsg(156,rtnnme,"column",sys->nme,aj->nme) ; break ; } if (k+1 <= q) { v = 0 ; cj = 0.0 ; curCol = colndx[k+1] ; } } } if (aj != NULL) pkvec_free(aj) ; if (retval == FALSE) { consys_free(sys) ; return (NULL) ; } /* One final act: delete the objective function from the constraint system. */ retval = consys_delrow_stable(sys,objndx) ; if (retval == FALSE) { errmsg(112,rtnnme,sys->nme,"delete","constraint", consys_nme(sys,'c',objndx,FALSE,NULL),objndx) ; consys_free(sys) ; return (NULL) ; } { return (sys) ; } } /* Convenience routines to create specific constraint systems. */ consys_struct *dytest_exmip1sys (lptols_struct *tols) /* Create a constraint system loaded with the exmip1 example. Parameters: tols: lptols_struct, used to specify infinity Returns: pointer to a loaded constraint system, or NULL if there's an error. */ { consys_struct *sys ; sys = load_consys(exmip1_rowcnt,exmip1_colcnt,exmip1_coeffcnt, exmip1_maxColLen,tols->inf,"exmip1", exmip1_objndx,exmip1_objname, exmip1_rowname,exmip1_rowsense,exmip1_rowlb,exmip1_rowub, exmip1_colname,exmip1_collb,exmip1_colub, exmip1_colndx,exmip1_rowndx,exmip1_coeff) ; return (sys) ; } consys_struct *dytest_exprimalraysys (lptols_struct *tols) /* Create a constraint system loaded with the exprimalray example. Parameters: tols: lptols_struct, used to specify infinity Returns: pointer to a loaded constraint system, or NULL if there's an error. */ { consys_struct *sys ; sys = load_consys(exprimalray_rowcnt,exprimalray_colcnt,exprimalray_coeffcnt, exprimalray_maxColLen,tols->inf,"exprimalray", exprimalray_objndx,exprimalray_objname, exprimalray_rowname,exprimalray_rowsense, exprimalray_rowlb,exprimalray_rowub, exprimalray_colname,exprimalray_collb,exprimalray_colub, exprimalray_colndx,exprimalray_rowndx,exprimalray_coeff) ; return (sys) ; } consys_struct *dytest_exdualraysys (lptols_struct *tols) /* Create a constraint system loaded with the exdualray example. Parameters: tols: lptols_struct, used to specify infinity Returns: pointer to a loaded constraint system, or NULL if there's an error. */ { consys_struct *sys ; sys = load_consys(exdualray_rowcnt,exdualray_colcnt,exdualray_coeffcnt, exdualray_maxColLen,tols->inf,"exdualray", exdualray_objndx,exdualray_objname, exdualray_rowname,exdualray_rowsense, exdualray_rowlb,exdualray_rowub, exdualray_colname,exdualray_collb,exdualray_colub, exdualray_colndx,exdualray_rowndx,exdualray_coeff) ; return (sys) ; } consys_struct *dytest_galenetsys (lptols_struct *tols) /* Create a constraint system loaded with the galenet example. Parameters: tols: lptols_struct, used to specify infinity Returns: pointer to a loaded constraint system, or NULL if there's an error. */ { consys_struct *sys ; sys = load_consys(galenet_rowcnt,galenet_colcnt,galenet_coeffcnt, galenet_maxColLen,tols->inf,"galenet", galenet_objndx,galenet_objname, galenet_rowname,galenet_rowsense, galenet_rowlb,galenet_rowub, galenet_colname,galenet_collb,galenet_colub, galenet_colndx,galenet_rowndx,galenet_coeff) ; return (sys) ; } consys_struct *dytest_galenetmixedsys (lptols_struct *tols) /* Create a constraint system loaded with the galenetmixed example. Parameters: tols: lptols_struct, used to specify infinity Returns: pointer to a loaded constraint system, or NULL if there's an error. */ { consys_struct *sys ; sys = load_consys(galenetmixed_rowcnt,galenetmixed_colcnt, galenetmixed_coeffcnt, galenetmixed_maxColLen,tols->inf,"galenetmixed", galenetmixed_objndx,galenetmixed_objname, galenetmixed_rowname,galenetmixed_rowsense, galenetmixed_rowlb,galenetmixed_rowub, galenetmixed_colname,galenetmixed_collb,galenetmixed_colub, galenetmixed_colndx,galenetmixed_rowndx, galenetmixed_coeff) ; return (sys) ; } consys_struct *dytest_galenetleqsys (lptols_struct *tols) /* Create a constraint system loaded with the galenetleq example. Parameters: tols: lptols_struct, used to specify infinity Returns: pointer to a loaded constraint system, or NULL if there's an error. */ { consys_struct *sys ; sys = load_consys(galenetleq_rowcnt,galenetleq_colcnt,galenetleq_coeffcnt, galenetleq_maxColLen,tols->inf,"galenetleq", galenetleq_objndx,galenetleq_objname, galenetleq_rowname,galenetleq_rowsense, galenetleq_rowlb,galenetleq_rowub, galenetleq_colname,galenetleq_collb,galenetleq_colub, galenetleq_colndx,galenetleq_rowndx,galenetleq_coeff) ; return (sys) ; } consys_struct *dytest_galenetbndssys (lptols_struct *tols) /* Create a constraint system loaded with the galenetbnds example. Parameters: tols: lptols_struct, used to specify infinity Returns: pointer to a loaded constraint system, or NULL if there's an error. */ { consys_struct *sys ; sys = load_consys(galenetbnds_rowcnt,galenetbnds_colcnt,galenetbnds_coeffcnt, galenetbnds_maxColLen,tols->inf,"galenetbnds", galenetbnds_objndx,galenetbnds_objname, galenetbnds_rowname,galenetbnds_rowsense, galenetbnds_rowlb,galenetbnds_rowub, galenetbnds_colname,galenetbnds_collb,galenetbnds_colub, galenetbnds_colndx,galenetbnds_rowndx,galenetbnds_coeff) ; return (sys) ; } consys_struct *dytest_afirosys (lptols_struct *tols) /* Create a constraint system loaded with the afiro example. Parameters: tols: lptols_struct, used to specify infinity Returns: pointer to a loaded constraint system, or NULL if there's an error. */ { consys_struct *sys ; sys = load_consys(afiro_rowcnt,afiro_colcnt,afiro_coeffcnt, afiro_maxColLen,tols->inf,"afiro", afiro_objndx,afiro_objname, afiro_rowname,afiro_rowsense,afiro_rowlb,afiro_rowub, afiro_colname,afiro_collb,afiro_colub, afiro_colndx,afiro_rowndx,afiro_coeff) ; return (sys) ; } consys_struct *dytest_boeing2sys (lptols_struct *tols) /* Create a constraint system loaded with the boeing2 example. Parameters: tols: lptols_struct, used to specify infinity Returns: pointer to a loaded constraint system, or NULL if there's an error. */ { consys_struct *sys ; sys = load_consys(boeing2_rowcnt,boeing2_colcnt,boeing2_coeffcnt, boeing2_maxColLen,tols->inf,"boeing2", boeing2_objndx,boeing2_objname, boeing2_rowname,boeing2_rowsense,boeing2_rowlb,boeing2_rowub, boeing2_colname,boeing2_collb,boeing2_colub, boeing2_colndx,boeing2_rowndx,boeing2_coeff) ; return (sys) ; } DyLP-1.6.0/DyLP/test/Makefile.am0000644000076700007670000000302311037243540013104 0ustar # Copyright (C) 2006 International Business Machines and others. # All Rights Reserved. # This file is distributed under the Common Public License. ## $Id$ # Author: Andreas Waechter IBM 2006-04-13 AUTOMAKE_OPTIONS = foreign ######################################################################## # unitTest for DyLP # ######################################################################## noinst_PROGRAMS = unitTest unitTest_SOURCES = \ dytest_problems.c \ dytest_rays.c \ dytest_solutions.c \ dytest_tableau.c \ unitTest.c # List libraries of COIN projects unitTest_LDADD = $(DYLPOBJDIR)/src/Dylp/libDylp.la # List additional libraries LIBS += $(ADDLIBS) # Here list all include flags, relative to this "srcdir" directory. This # "cygpath" stuff is necessary to compile with native compilers on Cygwin AM_CPPFLAGS = \ -I`$(CYGPATH_W) $(srcdir)/../src/DylpStdLib` \ -I`$(CYGPATH_W) $(srcdir)/../src/Dylp` # This line is necessary to allow VPATH compilation with MS compilers # on Cygwin DEFAULT_INCLUDES = -I. -I`$(CYGPATH_W) $(srcdir)` -I$(top_builddir)/inc test: unitTest$(EXEEXT) ./unitTest$(EXEEXT) .PHONY: test ######################################################################## # Cleaning stuff # ######################################################################## # Here we list everything that is not generated by the compiler, e.g., # output files of a program DISTCLEANFILES = DyLP-1.6.0/DyLP/test/dytest_rays.c0000644000076700007670000003642711262455465013617 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2008 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains routines to test dylp's ray routines: dy_primalRays and dy_dualRays. */ #include "dylp.h" extern ioid dy_logchn ; extern bool dy_gtxecho ; int dytest_primalRays (int *p_numRays, lpprob_struct *main_lp, lptols_struct *main_lptols, lpopts_struct *main_lpopts) /* This routine checks the primal rays returned by dy_primalRays. For a ray r, the first test is that dot(c,r) < 0 (remember, dylp minimises). Then, for a constraint ax <= b, we should have dot(a,r) <= 0. For a constraint ax >= b, the test is dot(a,r) >= 0. It's up to the calling routine to determine if the number of rays is as expected. In particular, it's not an error if dy_primalRays returns fewer rays than requested. If dy_primalRays returns zero rays, this is treated as the degenerate case of `all rays pass' and the routine will return TRUE. Parameters: p_numRays: (i) the number of rays to request from dy_primalRays (o) the number of rays returned by dy_primalRays main_lp: the lp problem structure main_lptols: the lp tolerance structure main_lpopts: the lp options structure Returns: 0 if all rays returned tested as valid rays, error count otherwise. */ { int m,n,i,j,k ; consys_struct *sys ; double **rays ; int reqRays,rcvRays ; double *rayk ; double aidotrayk ; bool error ; int errcnt ; char *rtnnme = "dytest_primalRays" ; /* Do a little initialisation. Mention that we've started. */ sys = main_lp->consys ; n = sys->varcnt ; m = sys->concnt ; # ifndef DYLP_NDEBUG if (main_lpopts->print.rays >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "%s: checking primal rays using %s (%d x %d).\n", rtnnme,sys->nme,m,n) ; } # endif /* Ask for the requested number of rays. */ rays = NULL ; reqRays = *p_numRays ; rcvRays = reqRays ; *p_numRays = 0 ; if (dy_primalRays(main_lp,&rcvRays,&rays) == FALSE) { errmsg(955,rtnnme,sys->nme,"primal") ; if (rays != NULL) { for (k = 0 ; k < rcvRays ; k++) { if (rays[k] != NULL) FREE(rays[k]) ; } FREE(rays) ; } return (1) ; } *p_numRays = rcvRays ; # ifndef DYLP_NDEBUG if (main_lpopts->print.rays >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n requested %d rays, received %d.", reqRays,rcvRays) ; } # endif /* Now test each ray. Check first that we actually have a nonzero ray, then check dot(c,r) < 0, and finally that dot(a,r) <= 0 for ax <= b (dot(a,r) >= 0 for ax >= b). */ errcnt = 0 ; for (k = 0 ; k < rcvRays ; k++) { rayk = rays[k] ; if (rayk == NULL) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n ERROR: ray %d is NULL.",k) ; errcnt++ ; continue ; } aidotrayk = exvec_1norm(rayk,n) ; if (fabs(aidotrayk) <= 0.0) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n ERROR: ray %d is zero.",k) ; FREE(rayk) ; rays[k] = NULL ; continue ; } /* Check dot(c,r) < 0. */ aidotrayk = 0 ; if (main_lpopts->print.rays >= 5) { dyio_outchr(dy_logchn,dy_gtxecho,'\n') ; } for (j = 1 ; j <= n ; j++) { if (rayk[j] != 0.0) { aidotrayk += rayk[j]*sys->obj[j] ; if (main_lpopts->print.rays >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho," (%s (%d) %g*%g)", consys_nme(sys,'v',j,FALSE,NULL), j,rayk[j],sys->obj[j]) ; } } } if (aidotrayk >= 0) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n ERROR: dot(c,ray[%d]) = %g; should be < 0.", k,aidotrayk) ; errcnt++ ; } else { if (main_lpopts->print.rays >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n dot(c,ray[%d]) = %g.", k,aidotrayk) ; } } /* Check dot(a,r) <= 0 or >= 0, as appropriate for the constraint. We need dot(a,r) = 0 for range constraints and equalities. */ for (i = 1 ; i <= m ; i++) { aidotrayk = consys_dotrow(sys,i,rayk) ; error = FALSE ; if (sys->ctyp[i] != contypLE) { if (aidotrayk < -main_lptols->zero) { error = TRUE ; } } if (sys->ctyp[i] != contypGE) { if (aidotrayk > main_lptols->zero) { error = TRUE ; } } if (error == TRUE) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n ERROR: a<%d> dot ray<%d> = %g ; should be %s 0.", i,k,aidotrayk,((sys->ctyp[i] == contypGE)?">=":"<=")) ; errcnt++ ; } } FREE(rayk) ; rays[k] = NULL ; } /* We're done. Clean up and go home. */ FREE(rays) ; if (errcnt != 0) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: found %d errors in %d rays testing cr < 0, Ar <= 0.\n", rtnnme,errcnt,rcvRays) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: pass cr < 0, Ar <= 0.\n",rtnnme) ; } return (errcnt) ; } int dytest_dualRays (int *p_numRays, lpprob_struct *main_lp, lptols_struct *main_lptols, lpopts_struct *main_lpopts) /* This routine checks the dual rays returned by dy_dualRays. For a ray r, we do two tests: * for the dual objective b, dot(r,b) < 0 * for a dual constraint ya >= c, dot(r,a) >= 0. Note that the math doesn't necessarily hold unless the constraint system and dual ray contain *all* components. The ray must have components for the usual row duals (cinv(B)) and for the duals associated with implicit bound constraints. Which implies we need to fabricate coefficients as needed to make implicit bound constraints explicit in the constraint system. It's up to the calling routine to determine if the number of rays is as expected. In particular, it's not an error if dy_dualRays returns fewer rays than requested. If dy_dualRays returns zero rays, this is treated as the degenerate case of `all rays pass' and the routine will return TRUE. Parameters: p_numRays: (i) the number of rays to request from dy_dualRays (o) the number of rays returned by dy_dualRays main_lp: the lp problem structure main_lptols: the lp tolerance structure main_lpopts: the lp options structure Returns: 0 if all rays returned tested as valid rays, error count otherwise. */ { int m,n,i,j,k,l ; consys_struct *sys ; double **rays ; int reqRays,rcvRays ; double *rayk ; double ajdotrayk ; bool fullRay ; int bposj ; flags *status ; flags statj ; double *x ; double xj ; int errcnt ; char *rtnnme = "dytest_dualRays" ; /* Do a little initialisation. Mention that we've started. */ sys = main_lp->consys ; n = sys->varcnt ; m = sys->concnt ; # ifndef DYLP_NDEBUG if (main_lpopts->print.rays >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "%s: checking dual rays using %s (%d x %d).", rtnnme,sys->nme,m,n) ; } # endif /* Ask for the requested number of rays. Go for the true dual sign convention, lest we go completely mad. */ rays = NULL ; reqRays = *p_numRays ; rcvRays = reqRays ; *p_numRays = 0 ; fullRay = TRUE ; if (dy_dualRays(main_lp,fullRay,&rcvRays,&rays,TRUE) == FALSE) { errmsg(955,rtnnme,sys->nme,"dual") ; if (rays != NULL) { for (k = 0 ; k < rcvRays ; k++) { if (rays[k] != NULL) FREE(rays[k]) ; } FREE(rays) ; } return (1) ; } *p_numRays = rcvRays ; # ifndef DYLP_NDEBUG if (main_lpopts->print.rays >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n requested %d rays, received %d.", reqRays,rcvRays) ; } # endif /* Now test each ray. Check first that we actually have a nonzero ray, then check dot(r,b) < 0, and then dot(r,a) >= 0 for all columns j. */ errcnt = 0 ; if (rcvRays > 0) { for (k = 0 ; k < rcvRays ; k++) { rayk = rays[k] ; if (rayk == NULL) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n ERROR: ray %d is NULL.",k) ; errcnt++ ; continue ; } ajdotrayk = exvec_1norm(rayk,m) ; if (fabs(ajdotrayk) <= 0.0) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n ERROR: ray %d is zero.",k) ; FREE(rayk) ; rays[k] = NULL ; continue ; } # ifndef DYLP_NDEBUG if (main_lpopts->print.rays >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n ray<%d> non-zeros:",k) ; j = 0 ; for (i = 1 ; i <= m ; i++) { if (rayk[i] != 0) { if (j == 0) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t") ; } dyio_outfmt(dy_logchn,dy_gtxecho," (%s (%d) %g)", consys_nme(sys,'c',i,FALSE,NULL),i,rayk[i]) ; j = (j+1)%3 ; } } if (fullRay == TRUE) { i = j ; dyio_outfmt(dy_logchn,dy_gtxecho," *") ; for (j = 1 ; j <= n ; j++) { if (rayk[m+j] != 0) { if (i == 0) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t") ; } dyio_outfmt(dy_logchn,dy_gtxecho," (%s (%d) %g)", consys_nme(sys,'v',j,FALSE,NULL),j,rayk[m+j]) ; i = (i+1)%3 ; } } } } # endif /* Check dot(r,b) < 0. For the first m elements, it's just a straightforward dot product of ray elements with the rhs values. */ ajdotrayk = 0 ; if (main_lpopts->print.rays >= 5) { dyio_outchr(dy_logchn,dy_gtxecho,'\n') ; } for (i = 1 ; i <= m ; i++) { if (rayk[i] != 0.0) { ajdotrayk += rayk[i]*sys->rhs[i] ; if (main_lpopts->print.rays >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho," (%s (%d) %g*%g)", consys_nme(sys,'c',i,FALSE,NULL), i,rayk[i],sys->rhs[i]) ; } } } /* For the remaining components corresponding to architecturals, we're synthesizing bound constraints on the fly. If the ray component corresponds to a variable x that's NBUB or NBFX, use u as the rhs value; NBLB, -l. Check that ray components are zero for variables that are not NBLB, NBUB, or NBFX. Serious confusion if it's otherwise, eh? */ status = main_lp->status ; x = main_lp->x ; if (fullRay == TRUE) { if (main_lpopts->print.rays >= 5) dyio_outchr(dy_logchn,dy_gtxecho,'\n') ; l = 0 ; for (j = 1 ; j <= n ; j++) { statj = status[j] ; if (((int) statj) > 0) { if (main_lpopts->print.rays >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho," (%s (%d) %s", consys_nme(sys,'v',j,FALSE,NULL),j, dy_prtvstat(statj)) ; } if (flgon(statj,vstatNBUB|vstatNBFX)) { ajdotrayk += rayk[m+j]*sys->vub[j] ; if (main_lpopts->print.rays >= 5 && (sys->vub[j] != 0.0 || rayk[m+j] != 0)) { dyio_outfmt(dy_logchn,dy_gtxecho," %g*%g)", rayk[m+j],sys->vub[j]) ; } } else if (flgon(statj,vstatNBLB)) { ajdotrayk -= rayk[m+j]*sys->vlb[j] ; if (main_lpopts->print.rays >= 5 && (sys->vlb[j] != 0.0 || rayk[m+j] != 0)) { dyio_outfmt(dy_logchn,dy_gtxecho," %g*(-%g))", rayk[m+j],sys->vlb[j]) ; } } else if (rayk[m+j] != 0.0) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n ERROR: %s (%d) %s not tight at a bound!.", consys_nme(sys,'v',j,FALSE,NULL),j, dy_prtvstat(statj)) ; errcnt++ ; } } /* Let's not forget that there's a nonbasic dual that's driving this ray, which will correspond to a basic primal variable. Keep count, because there should be at most one nonzero coefficient here and it better not be within bounds. Use the closest bound to the variable's value. */ else if (rayk[m+j] != 0) { l++ ; bposj = -((int) statj) ; xj = x[bposj] ; if (main_lpopts->print.rays >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho," (%s (%d) %s", consys_nme(sys,'v',j,FALSE,NULL),j, dy_prtvstat(vstatB)) ; } if (xj > sys->vub[j]) { ajdotrayk += rayk[m+j]*sys->vub[j] ; if (main_lpopts->print.rays >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho," %g*%g)", rayk[m+j],sys->vub[j]) ; } } else if (xj < sys->vlb[j]) { ajdotrayk -= rayk[m+j]*sys->vlb[j] ; if (main_lpopts->print.rays >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho," %g*(-%g))", rayk[m+j],sys->vlb[j]) ; } } else { dyio_outfmt(dy_logchn,dy_gtxecho, "\n ERROR: %s (%d) %s = %g, lb = %g, ub = %g,", consys_nme(sys,'v',j,FALSE,NULL),j, dy_prtvstat(vstatB),xj,sys->vlb[j],sys->vub[j]) ; dyio_outfmt(dy_logchn,dy_gtxecho, " should not be in bounds to spawn dual ray!") ; errcnt++ ; } } } /* There should be at most one coefficient for nonbasic duals. `At most', because the basic variable for the constraint that spawned this ray might be a logical. */ if (l > 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n ERROR: ray[%d] has %d nonzeroes matching",k,l) ; dyio_outfmt(dy_logchn,dy_gtxecho, " nonbasic duals; should be at most 1.") ; errcnt++ ; } } /* Ok, we've added the contribution of the row and column duals. What's the result? */ if (ajdotrayk >= 0) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n ERROR: dot(ray[%d],b) = %g; should be < 0.", k,ajdotrayk) ; errcnt++ ; } else { if (main_lpopts->print.rays >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n dot(ray[%d],b) = %g.", k,ajdotrayk) ; } } /* Now test dot(r,a) > 0. Again, it's straightforward for the explicit component. Then, look at the entry in the full ray which matches the column we're processing; if it's nonzero, we need to synthesize bound constraints. An upper bound constraint should look like x <= u, a lower bound constraint -x <= -l. As with the objective, we need to do a little work to figure out which bound constraint to use. There's no need to redo the ray coefficient consistency tests. */ for (j = 1 ; j <= n ; j++) { ajdotrayk = consys_dotcol(sys,j,rayk) ; if (main_lpopts->print.rays >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t dotcol = %g",ajdotrayk) ; } if (fullRay == TRUE) { statj = status[j] ; if (((int) statj) > 0) { if (main_lpopts->print.rays >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho," (%s (%d) %s", consys_nme(sys,'v',j,FALSE,NULL),j, dy_prtvstat(statj)) ; } if (flgon(statj,vstatNBUB|vstatNBFX)) { ajdotrayk += rayk[m+j] ; if (main_lpopts->print.rays >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho," %g*%g)", rayk[m+j],1.0) ; } } else if (flgon(statj,vstatNBLB)) { ajdotrayk -= rayk[m+j] ; if (main_lpopts->print.rays >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho," %g*(%g))", rayk[m+j],-1.0) ; } } } else { bposj = -((int) statj) ; xj = x[bposj] ; if (main_lpopts->print.rays >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho," (%s (%d) %s", consys_nme(sys,'v',j,FALSE,NULL),j, dy_prtvstat(vstatB)) ; } if (xj > sys->vub[j]) { ajdotrayk += rayk[m+j] ; if (main_lpopts->print.rays >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho," %g*%g)", rayk[m+j],1.0) ; } } else if (xj < sys->vlb[j]) { ajdotrayk -= rayk[m+j] ; if (main_lpopts->print.rays >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho," %g*(%g))", rayk[m+j],-1.0) ; } } } } if (ajdotrayk < -main_lptols->zero) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n ERROR: dot(ray<%d>, a<%s (%d)>) = %g ; should be >= 0.", k,consys_nme(sys,'v',j,FALSE,NULL),j,ajdotrayk) ; errcnt++ ; } else { if (main_lpopts->print.rays >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n dot(ray<%d>, a<%s (%d)>) = %g.", k,consys_nme(sys,'v',j,FALSE,NULL),j,ajdotrayk) ; } } } FREE(rayk) ; rays[k] = NULL ; } } /* We're done. Clean up and go home. */ FREE(rays) ; if (errcnt != 0) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: found %d errors in %d rays testing rA >= 0.\n", rtnnme,errcnt,rcvRays) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho,"\n%s: pass rb < 0, rA >= 0.\n",rtnnme) ; } return (errcnt) ; } DyLP-1.6.0/DyLP/test/dytest_tableau.c0000644000076700007670000005237211245632140014237 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2008 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains routines to test dylp's tableau routines: dy_betaj, dy_betai, dy_abarj, and dy_abari. */ #include "dylp.h" extern ioid dy_logchn ; extern bool dy_gtxecho ; static int compare_basisel (const void *el1, const void *el2) /* Helper routine to sort the basis vector by row index. Since the basis vector cannot have equal indices, this routine will never return 0. Parameters: a pair of basisel_struct's Returns: -1 if el1 < el2 0 if el1 = el2 1 if el1 > el2 */ { const basisel_struct *basisel1,*basisel2 ; basisel1 = (const basisel_struct *) el1 ; basisel2 = (const basisel_struct *) el2 ; if (basisel1->cndx < basisel2->cndx) { return (-1) ; } else { return (1) ; } } static consys_struct *create_basis (lpprob_struct *main_lp, lptols_struct *main_lptols, lpopts_struct *main_lpopts, int **p_basis2sys) /* This routine builds a basis matrix to match the basis returned by dylp. Very handy for testing dylp's tableau routines. If this basis matrix is to be directly useable in calculations involving the basis inverse, we need to install rows and columns in the proper order. The row order must correspond to the row order of the external system and the basic variable that is associated with row i must be placed in column i. Each entry in the basis vector returned from dylp specifies indices, in the external frame of reference, for the constraint and variable associated with the basis position. However, the order of basis entries matches the constraint order in dylp's active system, which has no predictable relationship to the order of constraints in the external system. In addition, if dylp is working with a partial system, not all constraints will be included. So we have some work to do. Parameters: main_lp: the lp problem structure main_lptols: the lp tolerance structure main_lpopts: the lp options structure p_basis2sys: (i) vector to hold translation from basis column order to external system column order; allocated if NULL. (o) completed translation vector Note that basis2sys is an attached vector for basis and will be freed when the constraint system is freed. Returns: pointer to a basis matrix, or NULL if an error occurs during construction */ { int m,n,i,j,k ; double infty ; consys_struct *sys ; consys_struct *basis ; basisel_struct *basisVec ; int basisLen,lastRow ; int *basis2sys ; pkvec_struct *ai,*aj ; char *rtnnme = "create_basis" ; # ifndef DYLP_NDEBUG int printlvl ; printlvl = maxx(main_lpopts->print.tableau,main_lpopts->print.rays) ; /* printlvl = 3 ; */ # endif /* Do a little initialisation. */ sys = main_lp->consys ; m = sys->concnt ; n = sys->varcnt ; infty = main_lptols->inf ; # ifndef DYLP_NDEBUG if (printlvl >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "%s: generating basis matrix from %s (%d x %d).\n", rtnnme,sys->nme,m,n) ; } # endif /* Construct the basis based on the solution in main_lp. All we need here is the bare coefficient matrix. None of the usual attached vectors are required. */ basisLen = main_lp->basis->len ; # ifndef DYLP_NDEBUG if (printlvl >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, " basis contains %d entries.\n",basisLen) ; } # endif /* Create a constraint system to hold the basis. */ basis = consys_create("basisMtx",0,0,m,m,infty) ; if (basis == NULL) { errmsg(152,rtnnme,"basis") ; return (FALSE) ; } # ifndef DYLP_NDEBUG if (printlvl >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho," created system %s (%d x %d).\n", basis->nme,basis->rowsze,basis->colsze) ; } # endif /* Copy over the row headers for all constraints. */ ai = pkvec_new(0) ; for (i = 1 ; i <= m ; i++) { if (consys_getrow_pk(sys,i,&ai) == FALSE) { errmsg(122,rtnnme,sys->nme,"row",consys_nme(sys,'c',i,FALSE,NULL),i) ; if (ai != NULL) pkvec_free(ai) ; consys_free(basis) ; return (NULL) ; } if (consys_addrow_pk(basis,'a',0,ai,0,0,NULL,NULL) == FALSE) { errmsg(112,rtnnme,basis->nme,"add row","constraint", consys_nme(sys,'c',i,FALSE,NULL),i) ; if (ai != NULL) pkvec_free(ai) ; consys_free(basis) ; return (NULL) ; } # ifndef DYLP_NDEBUG if (printlvl >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho," added %s (%d) to basis as row %d.\n", consys_nme(sys,'c',i,FALSE,NULL),i,ai->ndx) ; } # endif } if (ai != NULL) pkvec_free(ai) ; /* Now install the basic columns. As explained at the head of the routine, we have some work to do. First, make a copy of the basis vector and sort it by row index, so that the basis entries we have match the order in sys. Then we can walk the basis and install the columns in order. Basic logicals that were part of the basis in dylp's active system are represented by the negative of the index of the associated constraint. When we encounter one, synthesize a unit column for the logical. Except ... the basis will not mention inactive constraints. Each time we encounter a gap in constraint indices, install unit columns as needed. We're doing a sort of on-the-fly activation of inactive constraints, using the logical as the basic variable. With all that, we'll need a translation vector, to take indices in the basis frame and translate them to indices in the sys frame. */ if (consys_attach(basis, CONSYS_ROW,sizeof(int),((void **) p_basis2sys)) == FALSE) { errmsg(100,rtnnme,basis->nme,"basis2sys") ; consys_free(basis) ; return (NULL) ; } basis2sys = *p_basis2sys ; basisVec = CALLOC((basisLen+1),sizeof(basisel_struct)) ; memcpy(basisVec,main_lp->basis->el,(basisLen+1)*sizeof(basisel_struct)) ; qsort(((void *) &basisVec[1]), basisLen,sizeof(basisel_struct),compare_basisel) ; aj = pkvec_new(sys->maxcollen) ; lastRow = 0 ; for (k = 1 ; k <= basisLen ; k++) { i = basisVec[k].cndx ; while ((i-lastRow) > 1) { lastRow++ ; aj->coeffs[0].ndx = lastRow ; aj->coeffs[0].val = 1.0 ; aj->nme = consys_nme(sys,'v',n+lastRow,FALSE,NULL) ; aj->cnt = 1 ; if (consys_addcol_pk(basis,vartypCON,aj,0.0,0.0,0.0) == FALSE) { errmsg(112,rtnnme, basis->nme,"add column","variable",aj->nme,lastRow) ; if (aj != NULL) pkvec_free(aj) ; if (basisVec != NULL) FREE(basisVec) ; consys_free(basis) ; return (NULL) ; } basis2sys[aj->ndx] = -lastRow ; # ifndef DYLP_NDEBUG if (printlvl >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho, " fabricated unit column for inactive %s (%d) at %d.\n", aj->nme,lastRow,aj->ndx) ; } # endif } j = basisVec[k].vndx ; if (j < 0) { aj->coeffs[0].ndx = -j ; aj->coeffs[0].val = 1.0 ; aj->nme = consys_nme(sys,'v',n-j,FALSE,NULL) ; aj->cnt = 1 ; } else { if (consys_getcol_pk(sys,j,&aj) == FALSE) { errmsg(122,rtnnme,sys->nme,"column", consys_nme(sys,'v',j,FALSE,NULL),j) ; if (aj != NULL) pkvec_free(ai) ; if (basisVec != NULL) FREE(basisVec) ; consys_free(basis) ; return (NULL) ; } } if (consys_addcol_pk(basis,vartypCON,aj,0.0,0.0,0.0) == FALSE) { errmsg(112,rtnnme,basis->nme,"add column","variable",aj->nme,abs(j)) ; if (aj != NULL) pkvec_free(aj) ; if (basisVec != NULL) FREE(basisVec) ; consys_free(basis) ; return (NULL) ; } basis2sys[aj->ndx] = j ; # ifndef DYLP_NDEBUG if (printlvl >= 5) { if (j < 0) { dyio_outfmt(dy_logchn,dy_gtxecho, " fabricated unit column for %s (%d) at %d.\n", aj->nme,-j,aj->ndx) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho, " inserted column for %s (%d) at %d.\n", aj->nme,j,aj->ndx) ; } } # endif lastRow++ ; } if (basisVec != NULL) FREE(basisVec) ; /* There's no guarantee that we've covered all constraints. See if there are any left. Those that remain are definitely inactive. */ for (k = lastRow+1 ; k <= m ; k++) { aj->coeffs[0].ndx = k ; aj->coeffs[0].val = 1.0 ; aj->nme = consys_nme(sys,'v',n+k,FALSE,NULL) ; aj->cnt = 1 ; if (consys_addcol_pk(basis,vartypCON,aj,0.0,0.0,0.0) == FALSE) { errmsg(112,rtnnme, basis->nme,"add column","variable",aj->nme,k) ; if (aj != NULL) pkvec_free(aj) ; consys_free(basis) ; return (NULL) ; } basis2sys[aj->ndx] = -k ; # ifndef DYLP_NDEBUG if (printlvl >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho, " fabricated unit column for inactive %s (%d) at %d.\n", aj->nme,k,aj->ndx) ; } # endif } if (aj != NULL) pkvec_free(aj) ; # ifndef DYLP_NDEBUG if (printlvl >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho," Basis matrix is:\n") ; dyio_outfmt(dy_logchn,dy_gtxecho, "Pos'n\tConstraint\t Variable\t Orig.Col\n") ; for (i = 1 ; i <= m ; i++) { dyio_outfmt(dy_logchn,dy_gtxecho, "%5d\t%-16s",i,consys_nme(basis,'c',i,FALSE,NULL)) ; dyio_outfmt(dy_logchn,dy_gtxecho, " %-16s %5d\n",consys_nme(basis,'v',i,FALSE,NULL), basis2sys[i]) ; } } # endif return (basis) ; } int dytest_betaj (lpprob_struct *main_lp, lptols_struct *main_lptols, lpopts_struct *main_lpopts) /* This routine checks the accuracy of the tableau routine dy_betaj (column beta of the basis inverse) by testing that B beta = e. Parameters: main_lp: the lp problem structure main_lptols: the lp tolerance structure main_lpopts: the lp options structure Returns: 0 if Binv(B) = I, number of errors otherwise. */ { int m,i,j,k ; consys_struct *sys ; consys_struct *basis ; int *basis2sys ; double *betaj ; double aidotbetaj,expected ; int errcnt ; char *rtnnme = "dytest_betaj" ; /* Do a little initialisation. Mention that we've started. */ sys = main_lp->consys ; # ifndef DYLP_NDEBUG if (main_lpopts->print.tableau >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "%s: checking columns of basis inverse using %s (%d x %d).\n", rtnnme,sys->nme,sys->concnt,sys->varcnt) ; if (main_lpopts->print.tableau >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, " basis contains %d entries.\n",main_lp->basis->len) ; } } # endif /* Create the basis matrix. */ basis2sys = NULL ; basis = create_basis(main_lp,main_lptols,main_lpopts,&basis2sys) ; if (basis == NULL || basis2sys == NULL) { errmsg(152,rtnnme,"basisMtx") ; consys_free(basis) ; if (basis2sys != NULL) FREE(basis2sys) ; return (1) ; } /* Now that we have a basis matrix with columns in the proper order, matching the constraints, we can simply call dy_betaj to obtain columns of the basis inverse and call consys_dotrow(i,beta), i = 1, ..., m, and check that we have e. */ m = sys->concnt ; betaj = NULL ; errcnt = 0 ; for (k = 1 ; k <= m ; k++) { j = basis2sys[k] ; if (dy_betaj(main_lp,j,&betaj) == FALSE) { errmsg(952,rtnnme,sys->nme,"column",j,"variable", consys_nme(sys,'v',j,FALSE,NULL),j) ; errcnt++ ; continue ; } for (i = 1 ; i <= m ; i++) { aidotbetaj = consys_dotrow(basis,i,betaj) ; if (i == k) { expected = 1.0 ; } else { expected = 0.0 ; } if (fabs(aidotbetaj-expected) > main_lptols->zero) { errcnt++ ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n ERROR: a<%d> dot beta<%d> = %g ; expected %g; ", i,j,aidotbetaj,expected) ; dyio_outfmt(dy_logchn,dy_gtxecho,"err %g, tol %g.", (aidotbetaj-expected),main_lptols->zero) ; } } } /* We're done. Do a bit of cleanup. */ if (betaj != 0) FREE(betaj) ; consys_free(basis) ; if (basis2sys != NULL) FREE(basis2sys) ; if (errcnt != 0) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n%s: found %d errors testing Binv(B).\n", rtnnme,errcnt) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho,"\n%s: pass Binv(B).\n",rtnnme) ; } return (errcnt) ; } int dytest_abarj (lpprob_struct *main_lp, lptols_struct *main_lptols, lpopts_struct *main_lpopts) /* This routine checks the accuracy of the tableau routine dy_abarj, where abar = inv(B)a, by testing that B abar = a. Parameters: main_lp: the lp problem structure main_lptols: the lp tolerance structure main_lpopts: the lp options structure Returns: 0 if B(inv(B)A) = A, error count otherwise. */ { int m,n,i,j,k ; consys_struct *sys ; consys_struct *basis ; int *basis2sys ; double *abarj,*aj ; double aidotabarj ; int errcnt ; char *rtnnme = "dytest_abarj" ; /* Do a little initialisation. Mention that we've started. */ sys = main_lp->consys ; m = sys->concnt ; n = sys->varcnt ; # ifndef DYLP_NDEBUG if (main_lpopts->print.tableau >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "%s: checking ftran'd columns abar using %s (%d x %d).\n", rtnnme,sys->nme,m,n) ; if (main_lpopts->print.tableau >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, " basis contains %d entries.\n",main_lp->basis->len) ; } } # endif /* Create the basis matrix. */ basis2sys = NULL ; basis = create_basis(main_lp,main_lptols,main_lpopts,&basis2sys) ; if (basis == NULL || basis2sys == NULL) { errmsg(152,rtnnme,"basisMtx") ; consys_free(basis) ; if (basis2sys != NULL) FREE(basis2sys) ; return (1) ; } /* Now that we have a basis matrix with columns in the proper order, matching the constraints, we can simply call dy_abarj to obtain ftran'd columns abar and call consys_dotrow(i,abar), i = 1, ..., m, and check that we have a. */ aj = NULL ; abarj = NULL ; errcnt = 0 ; for (j = 1 ; j <= n ; j++) { if (dy_abarj(main_lp,j,&abarj) == FALSE) { errmsg(953,rtnnme,sys->nme,"ftran'd","column", consys_nme(sys,'v',j,FALSE,NULL),j) ; errcnt++ ; continue ; } if (consys_getcol_ex(sys,j,&aj) == FALSE) { errmsg(122,rtnnme,sys->nme,"column",consys_nme(sys,'v',j,FALSE,NULL),j) ; errcnt++ ; continue ; } for (i = 1 ; i <= m ; i++) { aidotabarj = consys_dotrow(basis,i,abarj) ; if (fabs(aidotabarj-aj[i]) > main_lptols->zero) { errcnt++ ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n ERROR: a<%d> dot abar<%d> = %g ; expected %g; ", i,j,aidotabarj,aj[i]) ; dyio_outfmt(dy_logchn,dy_gtxecho,"err %g, tol %g.", (aidotabarj-aj[i]),main_lptols->zero) ; } } } /* And to be really thorough, test the columns associated with logicals. */ memset(aj,0,((size_t) ((m+1)*sizeof(double)))) ; for (k = 1 ; k <= m ; k++) { if (dy_abarj(main_lp,-k,&abarj) == FALSE) { errmsg(953,rtnnme,sys->nme,"ftran'd","column", consys_nme(sys,'v',n+k,FALSE,NULL),k) ; errcnt++ ; continue ; } aj[k] = 1.0 ; for (i = 1 ; i <= m ; i++) { aidotabarj = consys_dotrow(basis,i,abarj) ; if (fabs(aidotabarj-aj[i]) > main_lptols->zero) { errcnt++ ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n ERROR: a<%d> dot abar<%d> = %g ; expected %g; ", i,-k,aidotabarj,aj[i]) ; dyio_outfmt(dy_logchn,dy_gtxecho,"err %g, tol %g.", (aidotabarj-aj[i]),main_lptols->zero) ; } } aj[k] = 0.0 ; } /* We're done. Do a bit of cleanup. */ if (abarj != 0) FREE(abarj) ; if (aj != 0) FREE(aj) ; consys_free(basis) ; if (basis2sys != NULL) FREE(basis2sys) ; if (errcnt != 0) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: found %d errors testing B(inv(B)A) = A.\n", rtnnme,errcnt) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho,"\n%s: pass B(inv(B)A).\n",rtnnme) ; } return (errcnt) ; } int dytest_betai (lpprob_struct *main_lp, lptols_struct *main_lptols, lpopts_struct *main_lpopts) /* This routine checks the accuracy of the tableau routine dy_betai (row beta of the basis inverse) by testing that beta B = e. Parameters: main_lp: the lp problem structure main_lptols: the lp tolerance structure main_lpopts: the lp options structure Returns: 0 if inv(B)B = I, error count otherwise. */ { int m,i,j ; consys_struct *sys ; consys_struct *basis ; int *basis2sys ; double *betai ; double betaidotaj,expected ; int errcnt ; char *rtnnme = "dytest_betai" ; /* Do a little initialisation. Mention that we've started. */ sys = main_lp->consys ; # ifndef DYLP_NDEBUG if (main_lpopts->print.tableau >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "%s: checking rows of basis inverse using %s (%d x %d).\n", rtnnme,sys->nme,sys->concnt,sys->varcnt) ; if (main_lpopts->print.tableau >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, " basis contains %d entries.\n",main_lp->basis->len) ; } } # endif /* Create the basis matrix. */ basis2sys = NULL ; basis = create_basis(main_lp,main_lptols,main_lpopts,&basis2sys) ; if (basis == NULL || basis2sys == NULL) { errmsg(152,rtnnme,"basisMtx") ; consys_free(basis) ; if (basis2sys != NULL) FREE(basis2sys) ; return (1) ; } /* Now that we have a basis matrix with columns in the proper order, matching the constraints, we can simply call dy_betai to obtain rows of the basis inverse and call consys_dotcol(j,beta), j = 1, ..., m, and check that we have e. */ m = sys->concnt ; betai = NULL ; errcnt = 0 ; for (i = 1 ; i <= m ; i++) { if (dy_betai(main_lp,i,&betai) == FALSE) { errmsg(952,rtnnme,sys->nme,"row",i,"constraint", consys_nme(sys,'c',i,FALSE,NULL),i) ; errcnt++ ; continue ; } for (j = 1 ; j <= m ; j++) { betaidotaj = consys_dotcol(basis,j,betai) ; if (i == j) { expected = 1.0 ; } else { expected = 0.0 ; } if (fabs(betaidotaj-expected) > main_lptols->zero) { errcnt++ ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n ERROR: beta<%d> dot a<%d> = %g ; expected %g; ", i,j,betaidotaj,expected) ; dyio_outfmt(dy_logchn,dy_gtxecho,"err %g, tol %g.", (betaidotaj-expected),main_lptols->zero) ; } } } /* We're done. Do a bit of cleanup. */ if (betai != 0) FREE(betai) ; consys_free(basis) ; if (basis2sys != NULL) FREE(basis2sys) ; if (errcnt != 0) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n%s: found %d errors testing inv(B)B.\n", rtnnme,errcnt) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho,"\n%s: pass inv(B)B.\n",rtnnme) ; } return (errcnt) ; } int dytest_abari (lpprob_struct *main_lp, lptols_struct *main_lptols, lpopts_struct *main_lpopts) /* This routine checks the accuracy of the tableau routine dy_abari, which calculates row i of inv(B)[ B N I ], where B is the basic columns, N the nonbasic columns, and I is the identity matrix produced by the coefficients of logical variables. This is an inconvenient calculation to check --- we can't premultiply the resulting row by the basis, as we do for all the other routines. So we do the next best thing: call dy_abarj and check that abar matches. It's expensive, but hey, this is a test routine. This does imply that dy_abarj should be tested first. Parameters: main_lp: the lp problem structure main_lptols: the lp tolerance structure main_lpopts: the lp options structure Returns: 0 if inv(B)B = I, error count otherwise. */ { int m,n,i,j ; consys_struct *sys ; double *abari,*abarj,*betai ; double abarij,expected ; int errcnt ; char *rtnnme = "dytest_abari" ; /* Do a little initialisation. Mention that we've started. */ sys = main_lp->consys ; m = sys->concnt ; n = sys->varcnt ; # ifndef DYLP_NDEBUG if (main_lpopts->print.tableau >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "%s: checking rows of inv(B)A using %s (%d x %d).\n", rtnnme,sys->nme,m,n) ; } # endif /* Open a pair of loops to do the testing. */ errcnt = 0 ; abari = NULL ; betai = NULL ; abarj = NULL ; for (i = 1 ; i <= m ; i++) { if (dy_abari(main_lp,i,&abari,&betai) == FALSE) { errmsg(953,rtnnme,sys->nme,"transformed","row", consys_nme(sys,'c',i,FALSE,NULL),i) ; errcnt++ ; continue ; } for (j = 1 ; j <= n ; j++) { if (dy_abarj(main_lp,j,&abarj) == FALSE) { errmsg(953,rtnnme,sys->nme,"ftran'd","column", consys_nme(sys,'v',j,FALSE,NULL),j) ; errcnt++ ; continue ; } expected = abarj[i] ; abarij = abari[j] ; if (fabs(abarij-expected) > main_lptols->zero) { errcnt++ ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n ERROR: beta<%d> dot a<%d> = %g ; expected %g; ", i,j,abarij,expected) ; dyio_outfmt(dy_logchn,dy_gtxecho,"err %g, tol %g.", (abarij-expected),main_lptols->zero) ; } } /* Now test the columns for the logical variables. */ for (j = 1 ; j <= m ; j++) { if (dy_abarj(main_lp,-j,&abarj) == FALSE) { errmsg(953,rtnnme,sys->nme,"ftran'd","column", consys_nme(sys,'v',n+j,FALSE,NULL),j) ; errcnt++ ; continue ; } expected = abarj[i] ; abarij = betai[j] ; if (fabs(abarij-expected) > main_lptols->zero) { errcnt++ ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n ERROR: beta<%d> dot a<%d> = %g ; expected %g; ", i,-j,abarij,expected) ; dyio_outfmt(dy_logchn,dy_gtxecho,"err %g, tol %g.", (abarij-expected),main_lptols->zero) ; } } } /* We're done. Do a bit of cleanup. */ if (abari != 0) FREE(abari) ; if (betai != 0) FREE(betai) ; if (abarj != 0) FREE(abarj) ; if (errcnt != 0) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: found %d errors testing e(inv(B)A) against inv(B)a.\n", rtnnme,errcnt) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: pass e(inv(B)A) against inv(B)a.\n",rtnnme) ; } return (errcnt) ; } DyLP-1.6.0/DyLP/m4/0000755000076700007670000000000011414302675010417 5ustar DyLP-1.6.0/DyLP/m4/ac_dylp_find_fp_funcs.m40000644000076700007670000000461210445170147015162 0ustar # AC_DYLP_FIND_ISFINITE # ------------------------------------------------------ # Determines the name of the finite() function in this environment. This is the # function that recognises whether an IEEE floating point value is finite. The # variable ac_name_of_finite will be set to the proper name on return and # DYLP_ISFINITE will be defined to the same value. # ------------------------------------------------------ AC_DEFUN([AC_DYLP_FIND_ISFINITE], [ AC_MSG_NOTICE([Checking for proper name for isfinite().]) ac_name_of_isfinite="unavailable" AC_CHECK_FUNC([finite],[ac_name_of_isfinite=finite]) if test "$ac_name_of_isfinite" = "unavailable"; then AC_CHECK_FUNC([_finite],[ac_name_of_isfinite=_finite]) fi if test "$ac_name_of_isfinite" = "unavailable"; then AC_CHECK_FUNC([isfinite],[ac_name_of_isfinite=isfinite]) fi if test "$ac_name_of_isfinite" = "unavailable"; then AC_MSG_WARN([Cannot find a C function to check if an IEEE floating point value is finite. There is no hope of building dylp on this system.]) fi AC_DEFINE_UNQUOTED([DYLP_ISFINITE], [$ac_name_of_isfinite], [Define to be the name of the C function used to check that an IEEE floating point value is finite.]) AC_MSG_NOTICE([Using $ac_name_of_isfinite as isfinite().]) ]) # AC_DYLP_FIND_ISNAN # ------------------------------------------------------ # Determines the name of the isnan() function in this environment. This is the # function that recognises whether an IEEE floating point value is NaN. The # variable ac_name_of_isnan will be set to the proper name on return and # DYLP_ISNAN will be defined to the same value. # ------------------------------------------------------ AC_DEFUN([AC_DYLP_FIND_ISNAN], [ AC_MSG_NOTICE([Checking for proper name for isnan().]) ac_name_of_isnan="unavailable" AC_CHECK_FUNC([isnan],[ac_name_of_isnan=isnan]) if test "$ac_name_of_isnan" = "unavailable"; then AC_CHECK_FUNC([_isnan],[ac_name_of_isnan=_isnan]) fi if test "$ac_name_of_isnan" = "unavailable"; then AC_MSG_WARN([Cannot find a C function to check if an IEEE floating point value is NaN. There is no hope of building dylp on this system.]) fi AC_DEFINE_UNQUOTED([DYLP_ISNAN], [$ac_name_of_isnan], [Define to be the name of the C function used to check that an IEEE floating point value is NaN.]) AC_MSG_NOTICE([Using $ac_name_of_isnan as isnan().]) ]) DyLP-1.6.0/DyLP/m4/ac_dylp_equiv_for_cpp_bool.m40000644000076700007670000000551310540374343016234 0ustar # AC_DYLP_EQUIV_FOR_CPP_BOOL # ------------------------------------------------------------------------ # Calls to _AC_COMPUTE_INT lifted from the definition of AC_CHECK_SIZEOF in # autoconf/types.m4. Use of _AC_COMPUTE_INT automatically deals with cross # compilation (no mean feat; check the macro in autoconf/general.m4!). The # use of (long) (sizeof (bool)) as the expression is a workaround for some # HP compiler bug. See full comment in AC_CHECK_SIZEOF. # ------------------------------------------------------------------------ AC_DEFUN([AC_DYLP_EQUIV_FOR_CPP_BOOL], [ AC_MSG_NOTICE([Determining C type equivalent for C++ bool.]) # Autoconf 2.59 has issues with the MSVC cl compiler which are fixed in 2.61. # Until we upgrade, just force sizeof(bool) to 1. case $CXX in cl* | */cl*) ac_cv_sizeof_cpp_bool="1 " ;; *) AC_LANG_PUSH(C++) _AC_COMPUTE_INT([(long) (sizeof (bool))], [ac_cv_sizeof_cpp_bool], [AC_INCLUDES_DEFAULT([$3])], [AC_MSG_FAILURE([cannot compute sizeof (bool) for C++])]) AC_LANG_POP(C++) ;; esac # Force a particular value to test the code below. # ac_cv_sizeof_cpp_bool=8 AC_MSG_NOTICE([C++ bool is $ac_cv_sizeof_cpp_bool bytes.]) AC_LANG_PUSH(C) dylp_booltype="no" _AC_COMPUTE_INT([(long) (sizeof (char))], [ac_cv_sizeof_c_bool], [AC_INCLUDES_DEFAULT([$3])], [AC_MSG_FAILURE([cannot compute sizeof (char) for C])]) if test $ac_cv_sizeof_cpp_bool = $ac_cv_sizeof_c_bool; then dylp_booltype="char" fi if test $dylp_booltype = "no"; then _AC_COMPUTE_INT([(long) (sizeof (int))], [ac_cv_sizeof_c_bool], [AC_INCLUDES_DEFAULT([$3])], [AC_MSG_FAILURE([cannot compute sizeof (int) for C])]) if test $ac_cv_sizeof_cpp_bool = $ac_cv_sizeof_c_bool; then dylp_booltype="int" fi fi if test $dylp_booltype = "no"; then _AC_COMPUTE_INT([(long) (sizeof (short int))], [ac_cv_sizeof_c_bool], [AC_INCLUDES_DEFAULT([$3])], [AC_MSG_FAILURE([cannot compute sizeof (short int) for C])]) if test $ac_cv_sizeof_cpp_bool = $ac_cv_sizeof_c_bool; then dylp_booltype="short int" fi fi if test $dylp_booltype = "no"; then _AC_COMPUTE_INT([(long) (sizeof (long int))], [ac_cv_sizeof_c_bool], [AC_INCLUDES_DEFAULT([$3])], [AC_MSG_FAILURE([cannot compute sizeof (long int) for C])]) if test $ac_cv_sizeof_cpp_bool = $ac_cv_sizeof_c_bool; then dylp_booltype="long int" fi fi if test $dylp_booltype = "no"; then dylp_booltype="char" AC_MSG_WARN([Cannot determine C type to match C++ bool. Defaulting to char. Dylp will compile, but will certainly crash when executed.]) fi AC_DEFINE_UNQUOTED([BOOL],[$dylp_booltype], [Define to the C type whose size in bytes matches the size in bytes of the the C++ bool type.]) AC_LANG_POP(C) AC_MSG_NOTICE([C $dylp_booltype will be used as bool by dylp.]) ]) DyLP-1.6.0/DyLP/m4/ac_c_get_sunpro_libs.m40000644000076700007670000000350610705706605015033 0ustar # AC_DYLP_GET_SUNSTUDIO_LIBDIRS # ------------------------------------------------------ # Determines the correct set of Sun Studio libraries to add to the final link # command for libDylp. Why do we need this? Glad you asked. Libtool, in its # wisdom, elects to issue a bare `ld' command for the final link, instead of # using cc as the linker. Hence ld does not get the set of library directories # that cc would normally pass to ld with a -YP option. Which means it doesn't # find libsunmath, which it needs for quiet_nan. I really should just get rid # of quiet_nan, but at this point it's an obsession. To get cc to cough up the # value of the YP spec, we can run it on an empty file with the -xdryrun flag. # We need to actually do the run because the set of directories will vary # depending on command line flags. And, just to make life interesting, libtool # does not grok -YP and happily discards it, if you try to use it directly. So # we need to convert it into a bunch of -L specs. # At the end of this macro, SUNSTUDIOLIBDIRS will be set to a sequence of -L # specs matching the -YP spec. # ------------------------------------------------------ AC_DEFUN([AC_DYLP_GET_SUNSTUDIO_LIBDIRS], [ AC_MSG_NOTICE([Determining Sun Studio library directories ... ]) cat /dev/null > dylp_ac_studiodirs.c # The autoconf convention seems to be to put output in a file. Avoids problems # stuffing too-long strings into variables, I suppose. $CC -xdryrun $CFLAGS $CPPFLAGS dylp_ac_studiodirs.c 2> dylp_ac_studiodirs.c # Now find the -YP option. Remember that autoconf does not take kindly to [] in # macros, so we need to use quadrigraphs. SUNSTUDIO_LIBDIRS=`cat dylp_ac_studiodirs.c | \ sed -n -e 's/.*-Y@<:@^,@:>@*,\(@<:@^ "@:>@*\).*/-L\1/p' | \ sed -n -e 's/:/ -L/gp'` rm -f dylp_ac_studiodirs.c AC_MSG_NOTICE(["$SUNSTUDIO_LIBDIRS"]) ]) DyLP-1.6.0/DyLP/m4/ac_dylp_fix_cppflags.m40000644000076700007670000000443311026315405015017 0ustar # This macro makes corrections to CPPFLAGS, CFLAGS, AND CXXFLAGS. It does # additions and deletions of options that are problematic on some systems, # and it looks for flags in CXXFLAGS and/or CFLAGS that really should be # in CPPFLAGS because they affect the preprocessor's search path. # (See Section 4.7.1 in the autoconf manual.) # Current tests are: # -mno-cygwin Sort of a special case, needs to be in preprocess, compile, # and link. (Should be handled properly in BuildTools as of # 07.02.01). # Additions: # -wd4996 Suppress warning C4996 (deprecated function) for MSVC cl. # Deletions: # -pedantic-errors On some systems, standard system files will fail to # compile when this is specified. AC_DEFUN([AC_DYLP_FIX_CPPFLAGS], [ # Transfer flags from CFLAGS/CXXFLAGS to CPPFLAGS. case "$CXXFLAGS $CFLAGS" in *-mno-cygwin*) CXXFLAGS=`echo $CXXFLAGS | sed -e 's/-mno-cygwin//g'` CFLAGS=`echo $CFLAGS | sed -e 's/-mno-cygwin//g'` CPPFLAGS="-mno-cygwin $CPPFLAGS" LDFLAGS="-mno-cygwin $LDFLAGS" ;; esac # Add flags. Strip the option first, then add once, to avoid repetition. case "$CXX" in cl* | */cl*) CXXFLAGS=`echo $CXXFLAGS | sed -e 's/-wd4996//g'` CXXFLAGS="$CXXFLAGS -wd4996" ;; esac case "$CC" in cl* | */cl*) CFLAGS=`echo $CFLAGS | sed -e 's/-wd4996//g'` CFLAGS="$CFLAGS -wd4996" ;; esac # Darwin will refuse to compile its own standard headers if pedantic-errors is # requested. case "$build" in *-darwin*) CXXFLAGS=`echo $CXXFLAGS | sed -e 's/-[-]*pedantic-errors//g'` CFLAGS=`echo $CFLAGS | sed -e 's/-[-]*pedantic-errors//g'` ;; esac # DyLP's command parser (bnfrdr) makes heavy use of type-punning. We cannot # allow GCC to enforce strict-aliasing. And we can't simply test to see if it's # present; specifying -O2, -O3, or -Os also enables it. As above, strip # anything already present and insert one -fno-strict-aliasing. if test x"$ac_cv_c_compiler_gnu" = xyes ; then CFLAGS=`echo $CFLAGS | sed -e 's/-[-]*fn*o*-*strict-aliasing//g'` CFLAGS="$CFLAGS -fno-strict-aliasing" fi if test x"$ac_cv_cxx_compiler_gnu" = xyes ; then CXXFLAGS=`echo $CXXFLAGS | sed -e 's/-[-]*fn*o*-*strict-aliasing//g'` CXXFLAGS="$CXXFLAGS -fno-strict-aliasing" fi ]) DyLP-1.6.0/DyLP/m4/ac_c_add_to_includes.m40000644000076700007670000000050410445170147014745 0ustar # AC_C_ADD_TO_INCLUDES (header-file) # ------------------------------------------------------ # Augments the list of default include files with the specified header. # ------------------------------------------------------ AC_DEFUN([AC_C_ADD_TO_INCLUDES], [ ac_includes_default="\ $ac_includes_default @%:@include <$1>" ]) DyLP-1.6.0/DyLP/m4/ac_dylp_options.m40000644000076700007670000000406611026315405014047 0ustar # AC_DYLP_PARANOIA(dflt) # ------------------------------------------------------------------ # Processes the paranoia option. # ------------------------------------------------------------------ AC_DEFUN([AC_DYLP_PARANOIA], [ AC_ARG_ENABLE([dylp-paranoia], AS_HELP_STRING([--enable-dylp-paranoia], [Enable dylp's paranoid checks (default=$1)]), [dylp_paranoia=$enableval], [dylp_paranoia=$1]) if test "$dylp_paranoia" = "yes"; then AC_DEFINE([DYLP_PARANOIA],[1], [Define this variable to enable dylp's paranoid checks.]) AC_MSG_NOTICE([Dylp paranoid checks enabled.]) else AC_MSG_NOTICE([Dylp paranoid checks disabled.]) fi ]) # AC_DYLP_STATISTICS(dflt) # ------------------------------------------------------------------ # Processes the statistics option. # ------------------------------------------------------------------ AC_DEFUN([AC_DYLP_STATISTICS], [ AC_ARG_ENABLE([dylp-stats], AS_HELP_STRING([--enable-dylp-stats], [Enable dylp's statistics collection features (default=$1)]), [dylp_stats=$enableval], [dylp_stats=$1]) if test "$dylp_stats" = "yes"; then AC_DEFINE([DYLP_STATISTICS],[1], [Define this variable to enable dylp's statistics collection features.]) AC_MSG_NOTICE([Dylp statistics collection enabled.]) else AC_MSG_NOTICE([Dylp statistics collection disabled.]) fi ]) # AC_DYLP_INFO(dflt) # ------------------------------------------------------------------ # Processes the information printing (info) option. # ------------------------------------------------------------------ AC_DEFUN([AC_DYLP_INFO], [ AC_ARG_ENABLE([dylp-info], AS_HELP_STRING([--enable-dylp-info], [Enable dylp's informational printing features (default=$1)]), [dylp_info=$enableval], [dylp_info=$1]) if test "$dylp_info" = "no"; then AC_DEFINE([DYLP_NDEBUG],[1], [Define this variable to disable dylp's informational printing features.]) AC_MSG_NOTICE([Dylp informational printing disabled.]) else AC_MSG_NOTICE([Dylp informational printing enabled.]) fi ]) DyLP-1.6.0/DyLP/NEWS0000644000076700007670000000054711267165330010605 0ustar 091016 DyLP/stable/1.6 Dylp now has a set of output routines which will generate tableau vectors, primal and dual solutions, and primal and dual rays, in the context of the original system, without requiring that dylp activate the full system internally. Along with this comes a full independent unit test, and updated documentation. DyLP-1.6.0/DyLP/LICENSE0000644000076700007670000002653310632415522011112 0ustar Common Public License Version 1.0 THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. 1. DEFINITIONS "Contribution" means: a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and b) in the case of each subsequent Contributor: i) changes to the Program, and ii) additions to the Program; where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program. "Contributor" means any person or entity that distributes the Program. "Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. "Program" means the Contributions distributed in accordance with this Agreement. "Recipient" means anyone who receives the Program under this Agreement, including all Contributors. 2. GRANT OF RIGHTS a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. 3. REQUIREMENTS A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: a) it complies with the terms and conditions of this Agreement; and b) its license agreement: i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. When the Program is made available in source code form: a) it must be made available under this Agreement; and b) a copy of this Agreement must be included with each copy of the Program. Contributors may not remove or alter any copyright notices contained within the Program. Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. 4. COMMERCIAL DISTRIBUTION Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. 5. NO WARRANTY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. 6. DISCLAIMER OF LIABILITY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 7. GENERAL If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. DyLP-1.6.0/DyLP/doc/0000755000076700007670000000000011416017274010644 5ustar DyLP-1.6.0/DyLP/doc/dylp.tex0000644000076700007670000000677611263240452012352 0ustar \documentclass[titlepage]{article} \usepackage{loubookman} \usepackage{loustandard} \usepackage{graphics} \usepackage{amsmath} \usepackage{loumath} \usepackage{codedocn} %\newcommand{\mypath}{/cs/mitacs1/lou/Bonsai/Doc/Dylp.Coin091002} \input{dylpabsdir} \newcommand{\figures}{\mypath/Figures} \newsavebox{\tmpbox} \newcommand{\bonsai}{\textbf{bonsai}\xspace} \newcommand{\glpk}{GLPK\xspace} \newcommand{\consys}{\textsc{consys}\xspace} \newcommand{\dylp}{\textsc{dylp}\xspace} \newcommand{\Dylp}{\textsc{Dylp}\xspace} \newcommand{\bonsaiG}{\textbf{bonsaiG}\xspace} \newcommand{\coin}{\textsc{Coin-OR}\xspace} \newcommand{\netlib}{Netlib\xspace} \newcommand{\miplib}{MIPLIB\xspace} \renewcommand{\textfraction}{.1} \renewcommand{\topfraction}{.9} \renewcommand{\bottomfraction}{\topfraction} \makeatletter % numberline amounts to \hbox to \@tempdima {box contents}. This change % will set the section number (#1) right-justified, with a bit more space % before the section title. See texmf-dist/tex/latex/base/latex.ltx. \renewcommand{\numberline}[1]{\hb@xt@\@tempdima{\hfil#1\hspace{1.5ex}}} % In order to accommodate the extra space for numberline, we have to go in % and change the space for l@section and l@subsection. (Don't need % l@subsubsection so far, but it's here if needed.) See texmf-dist/tex/latex/ % base/article.cls and Sec. 2.3.2 in the Latex Companion, 2e. \renewcommand*{\l@section}[2]{% \ifnum \c@tocdepth >\z@ \addpenalty\@secpenalty \addvspace{1.0em \@plus\p@}% \setlength\@tempdima{3.5em}% \begingroup \parindent \z@ \rightskip \@pnumwidth \parfillskip -\@pnumwidth \leavevmode \bfseries \advance\leftskip\@tempdima \hskip -\leftskip #1\nobreak\hfil \nobreak\hb@xt@\@pnumwidth{\hss #2}\par \endgroup \fi} \renewcommand*{\l@subsection}{\@dottedtocline{2}{3.5em}{3.5em}} \renewcommand*{\l@subsubsection}{\@dottedtocline{3}{3.8em}{3.2em}} \makeatother \title{\bfseries \dylp: a dynamic LP code} \author{Lou Hafer} \date{October, 2009} \begin{document} \maketitle \thispagestyle{empty} \vspace*{\fill} \noindent Copyright (C) 2005, 2006, 2007, 2008, 2009 Lou Hafer \noindent An earlier version of this document is available as SFU-CMPT TR 2005-18. \noindent All rights reserved. This documentation is made available under the terms of the Common Public License v1.0 which accompanies this distribution. A copy of the CPL v1.0 can also be obtained from the URL \texttt{http://www.ibm.com/developerworks/library/os-cpl.html} \begin{abstract}\noindent \dylp is a full implementation of the dynamic simplex algorithm for linear programming. Dynamic simplex attempts to maintain a reduced active constraint system by regularly purging loose constraints and variables with unfavourable reduced costs, and adding violated constraints and variables with favourable reduced costs. In abstract, the code alternates between primal and dual simplex algorithms, using dual simplex to reoptimise after updating the constraint set and primal simplex to reoptimise after updating the variable set. \end{abstract} \tableofcontents \pagebreak \listoffigures \listoftables \include{intro} \include{notation} \include{updateformulae} \include{pricing} \include{perturbed} \include{antidegenlite} \include{lpbasis} \include{accuracy} \include{scaling} \include{solutions} \include{startup} \include{dynamic} \include{dual} \include{primal} \include{varmgmt} \include{conmgmt} \include{interface} \include{statistics} \include{debug} \bibliographystyle{louplain} \bibliography{dylp} \end{document} DyLP-1.6.0/DyLP/doc/README0000644000076700007670000000716611267165330011537 0ustar This file contains instructions for building the DyLP documentation from source. Before you go further, ask yourself ``Do I really want to do this?'' If all you want to do is read the documentation, look at dylp.ps or dylp.pdf. There's a copy of each in this directory, in the build directory, and (if you've run `make install') installed in the COIN documentation directory. If you really want to build from source read on. You should be able to build the dylp documentation from source, in the build directory, by going to /DyLP and typing `make doc'. There will follow a massive amount of output with all sorts of warnings (latex is run three times, bibtex once, and pdflatex once). Ultimately, it'll settle down and you should be left with dylp.dvi, dylp.ps, and dylp.pdf. The latter two come with the distribution, so dylp.dvi is the real sign of success. If that failed, well, read on further ... The dylp documentation makes heavy use of my highly customised local TeX environment. In particular, I don't like Computer Modern and have gone to great lengths to remove it. I've tried to include all the necessary custom TeX style and font files in the TexMF subdirectory, but expect problems. See the README there. COIN distributions are set up so that they can be built in a build directory, distinct from the distribution directory. This is very useful for maintaining binaries for different environments, but not so critical for documentation. In any event, you should be working in the DyLP/doc directory in the build directory tree (the directory tree where you ran configure). LaTeX is not supported by Gnu autotools. In partial compensation, there is a script, build_dylpdoc, created in the build directory from build_dylpdoc.in when you ran configure. Build_dylpdoc will arrange for latex and bibtex to find inputs in this directory and subdirectories. It does this using hooks provided in the TeX Live distribution. (See, for example, http://tug.org/texlive/). I don't have access to other TeX distributions and cannot guarantee that these same hooks will work. Makefile_dylpdoc assumes that you have latex, pdflatex, dvips, and epstopdf (the latter to convert .eps files to .pdf files for figures). Replace with your local equivalent if necessary. Xdvi may have trouble locating the .vf (virtual font) files down in TexMF/fonts/vf. If your version of xdvi uses kpathsea as the underlying file search engine, try setting TEXMFHOME according to the value in build_dylpdoc. Otherwise, you're on your own. Build_dylpdoc will invoke make, using makefile.dylpdoc (created from makefile.dylpdoc.in during configure). Makefile.dylpdoc assumes that you're using Gnu make. If you're not, it will almost surely fail. The general sequence is to build the figures in Figures, then run latex, then run bibtex, then run latex two more times. By the end of all this, all references should be correctly resolved. This gets DVI output; to generate PDF output, a final run of pdflatex is executed. PostScript is generated using dvips. The figures in the dylp documentation were originally created with a proprietary program, IslandDraw from Island Graphics. For purposes of building the documentation, the source files are Figures/*.epsu. This is EPS pumped out by IslandDraw. It needs some cleanup; this is accomplished by the epsupatch.sed script. The result is a clean .eps file suitable for use by latex. The .eps files (and the .pdf versions required for PDF output) are placed in the Figures subdirectory in the build directory tree. Lou Hafer, 090415 DyLP-1.6.0/DyLP/doc/pricing.tex0000644000076700007670000003260511263240452013023 0ustar \section{Pricing Algorithms} \label{sec:PricingAlgorithms} \subsection{Projected Steepest Edge Pricing} \label{sec:PSEPricing} The primal simplex algorithm in \dylp uses projected steepest edge (PSE) pricing; the algorithm used is described as dynamic projected steepest edge (`dynamic') in Forrest and Goldfarb \cite{For92}. To understand the operation of projected steepest edge (PSE) pricing, it will be helpful to start with the definition of a direction of motion. The values of the basic and nonbasic variables can be expressed as \begin{equation} \label{eqn:allPrimalDirs} \begin{bmatrix} x^B \\ x^N \end{bmatrix} = \begin{bmatrix} b \\ l/u \end{bmatrix} - \begin{bmatrix} \inv{B} A^N \\ -I \end{bmatrix} \Delta \end{equation} where $l/u$ is intended to indicate use of the lower or upper bound as appropriate for the particular nonbasic variable. When a given nonbasic variable $x_j$ is moved by an amount $\Delta_j$, the values of $x$ will change as \begin{equation} \label{eqn:onePrimalDir} -\begin{bmatrix} \inv{B} a_j \\ -e_j \end{bmatrix} \Delta_j = -\begin{bmatrix} \overline{a}_j \\ -e_j \end{bmatrix} \Delta_j = \eta_j\Delta_j \end{equation} The vector $\eta_j$ is the direction of motion as $x_j$ is changed; alternatively, it is the edge of the polyhedron which is traversed as $x_j$ is changed. Let $\gamma_j = \norm{\eta_j}$ be the norm of $\eta_j$. For pricing, it can be immediately seen that $c\eta_j = c_j - c^B \, \overline{a}_j$ is the reduced cost $\overline{c}_j$. Dantzig pricing chooses an entering variable $x_j$ such that $\overline{c}_j$ has appropriate sign and the largest magnitude over all reduced costs, but it can be misled by differences in scaling from one column to the next. Steepest edge (SE) pricing scales $\overline{c}_j$ by $\gamma_j$, choosing an entering variable $x_j$ with $\overline{c}_j$ of appropriate sign and the largest $\displaystyle \abs{\frac{c \eta_j}{\norm{\eta_j}}}$, effectively calculating the change in objective value over a unit vector in the direction of motion. This gives a uniform pricing comparison, using the slope of the edge. Projected steepest edge (PSE) pricing uses `projected' column norms which are calculated using a vector $\tilde{\eta}_j$ which contains only the components of $\eta_j$ included in a reference frame. Initially, this reference frame contains only the nonbasic variables, so that $\tilde{\gamma}_j = 1$ for all $x_j \in x^N$. In order to avoid calculating $\tilde{\gamma}_j$ from scratch each time a column must be priced, the norms are iteratively updated. To derive the update formul\ae{} for $\tilde{\gamma}_j$, it is useful to start with the update formul\ae{} for the full vector $\eta_j$. As mentioned in \secref{sec:DualUpdates}, for $x_i$ leaving basis position $k$ and $x_j$ entering, $B\inv[0]{(B')} = I + a_i(\beta')_k - a_j(\beta')_k$. Taking this one step further, $\inv[0]{(B')} = \inv{B} + \overline{a}_i(\beta')_k - \overline{a}_j(\beta')_k$. Then for an arbitrary column $a_p$, \begin{align} \inv[0]{(B')} a_p & = \inv{B} a_p + \overline{a}_i(\beta')_k a_p - \overline{a}_j(\beta')_k a_p \notag \\ \overline{a}'_p & = \overline{a}_p + e_k ( \frac{\overline{a}_{kp}}{\overline{a}_{kj}} ) - \overline{a}_j ( \frac{\overline{a}_{kp}}{\overline{a}_{kj}} ) \label{Eqn:abarupdate} \end{align} (recalling that $(\beta')_k = \beta_k/\overline{a}_{kj}$). To see that (\ref{Eqn:abarupdate}) amounts to $\eta'_p = \eta_p - \eta_j( \dfrac{\overline{a}_{kp}}{\overline{a}_{kj}} )$, it's helpful to expand the vectors: \begin{equation*} \overline{a}'_p = \begin{bmatrix} \overline{a}_{1p} \\ \vdots \\ \overline{a}_{kp} \\ \vdots \\ \overline{a}_{mp} \end{bmatrix} + \begin{bmatrix} 0 \\ \vdots \\ 1 \\ \vdots \\ 0 \end{bmatrix}\frac{\overline{a}_{kp}}{\overline{a}_{kj}} - \begin{bmatrix} \overline{a}_{1j} \\ \vdots \\ \overline{a}_{kj} \\ \vdots \\ \overline{a}_{mj} \end{bmatrix} \frac{\overline{a}_{kp}}{\overline{a}_{kj}} . \end{equation*} With a little thought, it can be seen that the middle term represents one half of the permutation which moves $x_j$ into the basic partition of $\eta'_j$. (The other half moves $x_i$ into the nonbasic partition). When updating $\eta_i$, the update formula can be collapsed to $\eta'_i = - \eta_j/\overline{a}_{kj}$, since $\overline{a}_{ki} = 1$. Summarising, the update formul\ae{} for the edge directions $\eta_j$ are \begin{equation} \begin{split} \eta'_p & = \eta_p - \eta_j( \frac{\overline{a}_{kp}}{\overline{a}_{kj}} ), \qquad p \neq i \\ \eta'_i & = - \eta_j/\overline{a}_{kj}. \label{Eqn:etaupdate} \end{split} \end{equation} In fact, the code actually stores and updates $\gamma_j^{\,2}$. With (\ref{Eqn:etaupdate}) in hand, derivation of the update formul\ae{} are straightforward: \begin{align} \begin{split} (\gamma^{\,\prime}_p)^2 & = \eta'_p \cdot \eta'_p \\ & = (\eta_p - \eta_j( \frac{\overline{a}_{kp}}{\overline{a}_{kj}} )) \cdot (\eta_p - \eta_j( \frac{\overline{a}_{kp}}{\overline{a}_{kj}} )) \\ & = \eta_p \cdot \eta_p - 2( \frac{\overline{a}_{kp}}{\overline{a}_{kj}} )\eta_j \cdot \eta_p + ( \frac{\overline{a}_{kp}}{\overline{a}_{kj}} )^2 \eta_j \cdot \eta_j \\ & = \gamma_p^{\,2} - 2( \frac{\overline{a}_{kp}}{\overline{a}_{kj}} ) \begin{bmatrix} \overline{a}^T_j & e^T_j \end{bmatrix} \begin{bmatrix} \overline{a}_p \\ e_p \end{bmatrix} + ( \frac{\overline{a}_{kp}}{\overline{a}_{kj}} )^2 \gamma_j^{\,2} \\ & = \gamma_p^{\,2} - 2( \frac{\overline{a}_{kp}}{\overline{a}_{kj}} ) (\overline{a}^T_j \inv{B}) a_p + ( \frac{\overline{a}_{kp}}{\overline{a}_{kj}} )^2 \gamma_j^{\,2} \label{Eqn:gammapupdate} \end{split} \\[.5ex] \begin{split} (\gamma^{\,\prime}_i)^2 & = \eta'_i \cdot \eta'_i \\ & = \eta_j/\overline{a}_{kj} \cdot \eta_j/\overline{a}_{kj} \\ & = \gamma_j^{\,2}/\overline{a}^2_{kj} \label{Eqn:gammaiupdate} \end{split} \end{align} Equations (\ref{Eqn:etaupdate}) can be used directly to update the $\tilde{\eta}_j$. To adapt (\ref{Eqn:gammapupdate}) and (\ref{Eqn:gammaiupdate}) for the $\tilde{\gamma}_j$, a little algebra should serve to see that it's sufficient to substitute $\tilde{a}_j$ in (\ref{Eqn:gammapupdate}), as well as using $\tilde{\gamma}_p$ and $\tilde{\gamma}_j$. It is straightforward to observe that when equations (\ref{Eqn:etaupdate}) are premultiplied by $c$, they can be used to update the reduced costs as \begin{align*} \begin{split} \overline{c}'_p & = \overline{c}_p - \overline{c}_j( \frac{\overline{a}_{kp}}{\overline{a}_{kj}} ) \qquad p \neq i \\ \overline{c}'_i & = - \overline{c}_j/\overline{a}_{kj}. \end{split} \end{align*} \subsection{Dual Steepest Edge Pricing} \label{sec:DSEPricing} The dual simplex in \dylp uses dual steepest edge (DSE) pricing; the algorithm used is described as dual algorithm 1 (`steepest 1') in Forrest and Goldfarb \cite{For92}. The values $\overline{b} = \inv{B}b$ are the reduced costs of the nonbasic dual variables. Analogous to Dantzig pricing in the primal case, one can choose a entering dual variable $y_i$ such that $\overline{b}_i$ has appropriate sign and the largest magnitude over all reduced costs, but there is the same problem with scaling. The version of dual steepest edge (DSE) pricing implemented in \dylp scales $\overline{b}_i = \beta_i b$ by $\rho_i = \norm{\beta_i}$, choosing a leaving variable $x_i$ with $\overline{b}_i$ of appropriate sign and the largest $\displaystyle \abs{\frac{\beta_i b}{\norm{\beta_i}}}$, effectively calculating the change in the dual objective value over a unit vector in the dual direction of motion in the space of the dual variables. This gives a uniform pricing comparison, using the slope of the dual edge. In the next few paragraphs, an alternative motivation of the algorithm is presented which (perhaps) clarifies the relationship between dual algorithm 1 and dual algorithm 2 in that paper% \footnote{Those who have read \cite{For92} are warned that the author's notation is in no way compatible with that of Forrest and Goldfarb.}. To see how DSE operates within the context of the revised primal simplex tableau, we can refer back to equations \eqnref{Eqn:DualBasicVars} and \eqnref{Eqn:DualObj} from \secref{sec:Notation}, repeated here: \begin{equation} \begin{split} \begin{bmatrix} \sigma^\mathcal{B} & y^\mathcal{B} \end{bmatrix} & = (-c)\inv[-2]{\mathcal{B}} - \begin{bmatrix} \sigma^\mathcal{N} & y^\mathcal{N} \end{bmatrix} \mathcal{N}\inv[-2]{\mathcal{B}} \\ & = \begin{bmatrix} c^N - c^B \inv[0]{(B^t)} N^t & -c^B \inv[0]{(B^t)} \end{bmatrix} - \begin{bmatrix} \sigma^\mathcal{N} & y^\mathcal{N} \end{bmatrix} \begin{bmatrix} -\inv[0]{(B^t)} N^t & -\inv[0]{(B^t)} \\ B^l\inv[0]{(B^t)} N^t - N^l & B^l\inv[0]{(B^t)} \end{bmatrix} \end{split} \tag{\ref{Eqn:DualBasicVars}} \end{equation} and \begin{equation} \begin{split} z & = \begin{bmatrix} \sigma^\mathcal{B} & y^\mathcal{B} \end{bmatrix} \begin{bmatrix} 0 & b^t \end{bmatrix}^T + \begin{bmatrix} \sigma^\mathcal{N} & y^\mathcal{N} \end{bmatrix} \begin{bmatrix} 0 & b^l \end{bmatrix}^T \\ & = (-c)\inv[-2]{\mathcal{B}} b^\mathcal{B} + \begin{bmatrix} \sigma^\mathcal{N} & y^\mathcal{N} \end{bmatrix} (b^\mathcal{N} - \mathcal{N}\inv[-2]{\mathcal{B}} b^\mathcal{B}) \\ & = -c^B \inv[0]{(B^t)} b^t + \begin{bmatrix} \sigma^\mathcal{N} & y^\mathcal{N} \end{bmatrix} \begin{bmatrix} \inv[0]{(B^t)} b^t \\ b^l - B^l\inv[0]{(B^t)} b^t \end{bmatrix} \end{split} \tag{\ref{Eqn:DualObj}} \end{equation} Recall that the values of the dual basic variables are the reduced costs of the primal problem, and the reduced costs of the dual variables are the values of the primal basic variables (\cf equations \eqnref{Eqn:PrimalBasicVars} and \eqnref{Eqn:PrimalObj}). By analogy to the primal pivoting rules, for dual simplex we want to choose a nonbasic dual variable which will move us in a direction of steepest descent. If the nonbasic dual is to increase, its reduced cost must be less than 0 in order to see a reduction in the dual objective. This corresponds to the case of a primal variable which will be increased and driven out of the basis at its lower bound with a positive primal reduced cost. If the nonbasic dual is to decrease, its reduced cost must be greater than 0 in order to see a reduction in the dual objective. This corresponds to the case of a primal variable which will be decreased and driven out of the basis at its upper bound with a negative primal reduced cost. The actual direction of motion in the full dual space ($y$ and $\sigma$) is specified by a row of \begin{equation*} \mathcal{N}\inv[-2]{\mathcal{B}} = \begin{bmatrix} -\inv[0]{(B^t)} N^t & -\inv[0]{(B^t)} \\ B^l\inv[0]{(B^t)} N^t - N^l & B^l\inv[0]{(B^t)} \end{bmatrix}, \end{equation*} a vector which is not readily available in the revised primal simplex\footnote{% It's necessary to calculate one such row $\overline{a}_i$ once the entering dual variable has been selected, but only one. For the typical problem in which the number of variables greatly exceeds the number of constraints, the norms of these vectors are expensive to calculate when initialising the pricing algorithm, and the updates are expensive. The algorithm which uses the full dual direction of motion is the one that Forrest and Goldfarb describe as dual algorithm 2.}. However, one can make an argument that there's no need to consider the component of the direction of motion in the subspace of the dual surplus variables when choosing the entering dual variable. (More positively, we can take the view that we're only interested in motion in the polyhedron $\{y \in R^m \mid yA \geq -c, y \geq 0\}$ defined by the dual variables.) Changes in the surplus variables cannot affect the objective directly, as they account for the 0's in the augmented and partitioned $b$ vector. Algebraically, we can see that the dual basic portion of $b$, $\begin{bmatrix}0 & b^t \end{bmatrix}^T$, guarantees that there will never be any direct contribution from the columns of $\mathcal{N}\inv[-2]{\mathcal{B}}$ involving $N$. The component of motion in the space of the dual variables $y$ is then simply the rows $\beta_i$ of $\inv{B}$, which are easily available from the primal tableau. (The analogous action in the primal problem --- ignore the component of $\eta_j$ in the subspace of the primal slack variables --- offers no computational advantage.) Given a rationale for taking the rows $\beta_i$ of $\inv{B}$ as the component of interest in the dual direction of motion, what remains is to work out the details. Since we're aiming for a steepest edge algorithm, we'll be interested in iteratively updating $\norm{\beta_i}^2 = \beta_i \cdot \beta_i$, the square of the norm of a row $\beta_i$. Given the update formul\ae{} for $\beta_i$ derived in \secref{sec:BasisUpdates}, the development of the update formul\ae{} for $\rho_i = \norm{\beta_i}^2$ is straightforward algebra. Let $x_i$ be the leaving variable and $x_j$ be the entering variable, and assume $x_i$ occupies row $k$ of the basis $B$ before the update. We have \begin{align} \begin{alignedat}{2} \rho'_i & = \rho_i - 2\frac{\overline{a}_{lj}}{\overline{a}_{kj}}\beta_i\cdot\beta_k + (\frac{\overline{a}_{lj}}{\overline{a}_{kj}})^2\rho_k & \qquad\qquad i \neq k \\ \rho'_k & = (\frac{1}{\overline{a}_{kj}})^2\rho_k \end{alignedat} \end{align} Since the update will be performed for all rows in the basis, it's worth calculating the vector $\tau = \inv{B}\beta^T_k$ to obtain all the inner products $\beta_i \cdot \beta_k$ in one calculation. DyLP-1.6.0/DyLP/doc/intro.tex0000644000076700007670000001232711263240452012522 0ustar \section{Introduction} \label{sec:Intro} \dylp is a linear programming (LP) code designed to be used as the underlying LP code in a branch-and-cut integer linear programming (IP) code. It emphasises convenience of use by the client, particularly with respect to fixing variables and adding and deleting constraints and variables. The target user population is IP algorithm developers; as such, \dylp emphasises controllability and convenience over efficiency and is capable of producing copious amounts of output for use in debugging. \dylp implements a dynamic simplex algorithm along the lines set out by Padberg in \cite[\S6.6]{Pad95}. The core idea is that, at any given time, many of the constraints of a LP problem are loose, and many nonbasic variables are unlikely to ever be considered for pivoting because their reduced costs are very unfavourable. A rough outline of the algorithm, neglecting unboundedness, infeasibility, and implementation issues, is as follows. From the problem supplied by the client, \dylp chooses an initial subset of constraints and variables to become the active system. This system is solved to optimality with primal simplex. \dylp then enters a minor loop where it deactivates variables whose reduced costs are worse than a threshold, activates variables whose reduced costs are favourable, and reoptimises the system with primal simplex. This minor loop is repeated until there are no more variables suitable for entry. Next, \dylp deactivates any loose constraints, activates any constraints which are violated at the current basic solution, and reoptimises with dual simplex. On regaining feasibility, it returns to primal simplex and the deactivate/activate variable loop. When there are no variables with favourable reduced costs among the inactive variables and no violated constraints among the inactive constraints, the solution is optimal. The primal simplex algorithm used by \dylp is a two-phase algorithm. Phase I uses a dynamically modified objective to attain a primal feasible solution. Both phase I and phase II use a projected steepest edge (PSE) pricing algorithm outlined by Forrest \& Goldfarb \cite[algorithm `dynamic']{For92}. There are two antidegeneracy methods. The first, referred to as `anti-degeneracy lite', attempts to resolve ties among degenerate pivots by choosing the pivot in such a way as to make tight a hyperplane which has a desirable alignment. The second, applied when the first takes too long to resolve the degeneracy, is a perturbation algorithm which builds on a method described by Ryan \& Osborne \cite{Rya88}. The dual simplex algorithm provides only a second phase with dual steepest edge (DSE) pricing \cite[algorithm `steepest 1']{For92}, standard or generalised pivoting, and implementations of anti-degeneracy lite and perturbation-based antidegeneracy in the dual space. In the context of \dylp, it is the subordinate simplex, used for reoptimisation after adding constraints and as the initial simplex when the problem is dual feasible but not primal feasible. The active and inactive constraint systems are maintained with the \consys subroutine library \cite{Haf98b}. Basis factoring and pivoting are handled using the basis maintenance package from \glpk \cite{GLPK,Mak01}. \dylp is written in C and provides a native C interface. It can be used as a standalone simplex LP code with only a minimal shell required to generate the constraint system. In the context of a branch-and-cut code, \dylp expects that the dominant mode of use will be successive calls to reoptimise a constraint system that is incrementally modified between calls. On request, it will maintain its internal state (constraint system, basis inverse, and support data structures) between calls to support efficient hot starts for reoptimisation. Because \dylp maintains this internal state, it does not provide a native capability to interleave optimisation and reoptimisation of distinct constraint systems. \dylp provides two specialised interface routines to support two queries commonly required in a branch-and-cut context, pricing a new variable and pricing a dual pivot. \dylp can be used with \coin \cite{COIN} software through the C++ \coderef{}{OsiDylp} OSI interface class. An OSI interface object maintains a copy of the constraint system as well as providing an interface to the underlying solver. Multiple \pgmid{OsiDylp} objects with distinct constraint systems can exist simultaneously and calls to optimise and reoptimise the systems can be interleaved. There is some loss of efficiency as the state of the underlying solver is changed, but the necessary bookkeeping is handled by the \pgmid{OsiDylp} objects. The next section specifies the notation used for the primal and dual problems in the remainder of the report. Sections \ref{sec:UpdatingFormulas} through \ref{sec:Startup} describe individual components of the implementation. Sections \ref{sec:DynamicSimplex} through \ref{sec:ConstraintManagement} describe the simplex algorithms and the variable and constraint management algorithms used in \dylp. %Section \ref{sec:Performance} gives performance data for \dylp on the %\netlib and \miplib problem suites. Sections \ref{sec:DylpInterface} through \ref{sec:DylpDebugging} describe the interface and parameters provided by \dylp. DyLP-1.6.0/DyLP/doc/perturbed.tex0000644000076700007670000001052511171477034013367 0ustar \section{Anti-Degeneracy Using a Perturbed Subproblem} \label{sec:PerturbedAntiDegeneracy} In both primal and dual simplex, \dylp implements an anti-degeneracy algorithm using a perturbed subproblem. It builds on a method described by Ryan \& Osborne \cite{Rya88} in which all variables are assumed to have lower bounds of zero and upper bounds of infinity. The original algorithm is easily described in terms of the primal problem. When degeneracy is detected, a restricted subproblem is formed consisting only of the constraints involved in the degeneracy (\ie, constraints $i$ such that $\overline{b}_i = 0$). The values $\overline{b}_i$ are given (relatively) large perturbations and pivots are performed within the context of the restricted subproblem until a direction of recession from the degenerate vertex is found (indicated by apparent unboundedness). The original unperturbed values of $\overline{b}_i$ are then restored (since all pivots were, in actuality, simply changes of basis while remaining at the degenerate vertex) and the full problem is resumed. An alternative view goes directly back to the constraints involved in the degeneracy. By perturbing their right-hand-side values $b_i$, the single vertex formed by the constraints is fractured into many vertices. For the simple case of $0 \leq x \leq \infty$, we have $\overline{b} = B^{\,-1} b$, so perturbing $\overline{b}$ by the vector $\xi$ is equivalent to perturbing $b$ by the vector $-B\xi$. In dual simplex, this algorithm can be implemented directly. The restricted subproblem is formed from the dual constraints (primal columns) corresponding to basic dual variables (primal reduced costs) whose value is zero. The perturbation is introduced directly to the values $\overline{c}_j$, taking care to maintain dual feasibility. The perturbation is maintained by the incremental update of the dual variables and reduced costs after each pivot. When accuracy checks are performed, the correct value of zero can be substituted on the fly for the perturbed values. The trick to implementing this algorithm in the context of variables with arbitrary upper and lower bounds is to distinguish between apparent motion due to the introduced perturbations and real motion (along a direction of recession) which is nonetheless limited by a bound on a variable. \dylp uses an array, \pgmid{dy_brkout}, to record the direction of change (away from the current bound) required for nondegenerate but bounded motion. A second, more subtle problem, is that the perturbation for a given variable must be sufficiently small to avoid a false indication of a nondegenerate pivot. \dylp scales the perturbation to be at most $.001(u_i - l_i)$, but there is no easy way to guarantee that this is sufficiently small. Consider two variables $x_i$ and $x_k$, and assume that they occupy rows $i$ and $k$ in the basis, with perturbed values $\tilde{b}_i$ and $\tilde{b}_k$, respectively. For concreteness, assume that each was originally degenerate at its lower bound, so that a pivot which resulted in one variable leaving at its upper bound would be nondegenerate. For $\overline{a}_{ij}$ and $\overline{a}_{kj}$ of appropriate sign to move $x_i$ toward $l_i$ and $x_k$ toward $u_k$, given a situation where $|\overline{a}_{ij}| \ll |\overline{a}_{kj}|$, it is not possible to assure that \begin{displaymath} \frac{\tilde{b}_i - l_i}{\overline{a}_{ij}} < \frac{u_k - \tilde{b}_k}{\overline{a}_{kj}} \end{displaymath} without actually testing each pair. In this case, the perturbation introduced for $x_i$ is too large, and the resulting $\Delta_{ij}$ \textit{appears} to allow $x_k$ to become the limiting variable, leaving the basis with a bounded but nondegenerate change. When \dylp detects this problem, it will reduce the perturbation by a factor of 10 and form the restricted subproblem again. If a (small) limit on the number of attempts is exceeded, \dylp simply gives up and takes a degenerate pivot. A second problem occurs when a perturbation is so small as to be indistinguishable next to the bound. Specifically, the test to determine if a variable $x_i$ is at bound is $\pgmid{dy_tols.zero}(1+|\mathit{bnd}_i|) < |x_i - \mathit{bnd}_i|$. If $\mathit{bnd}_i$ is large, the perturbation can be swamped. This situation can arise if $u_i$ and $l_i$ as given to \dylp are nearly equal, or due to reduction of the perturbation as described in the previous paragraph. DyLP-1.6.0/DyLP/doc/statistics.tex0000644000076700007670000001576611263240452013573 0ustar \section{\dylp Statistics} \label{sec:DylpStatistics} \dylp will collect detailed statistics if the conditional compilation symbol \pgmid{DYLP_STATISTICS} is defined. The available statistics are described briefly in the paragraphs which follow; for details on subfields, consult \coderef{dylp.h}{}. Routines in the file \coderef{statistics.c}{} provide initialisation (\pgmid{dy_initstats}), printing (\pgmid{dy_dumpstats}), and release of the data structure (\pgmid{dy_freestats}). \begin{codedoc} \item \Varhdr{angle}{max, min, hist} Statistics on the angles of inequality constraints to the objective function. For constraint $i$, this is calculated as $\displaystyle \frac{180}{\pi} \cos^{-1} \frac{a_i c}{\norm{a_i}\norm{c}}$. The maximum and minimum angle is recorded, and a histogram in $\degs{5}$ increments with a dedicated $\degs{90}$ bin. \item \Varhdr{cons}{sze, angle, actcnt, deactcnt, init, fin} Information about individual constraints: the angle of the constraint with the objective function, the number of times it's activated and deactivated, and booleans to indicate if the constraint is active in the initial and final active systems. \item\Varhdr{d2}{pivs, iters} Total pivot and iteration counts for \dylp. The pivot count is the number of successful simplex pivots. The iteration count also includes pivot attempts which did not succeed for some reason (\eg, a primal pivot in which the entering variable was eventually rejected because the pivot element was numerically unstable). \item\Varhdr{ddegen}{cnt, avgsiz, maxsiz, totpivs, avgpivs, maxpivs} Statistics on the amount of time spent in restricted subproblems trying to escape dual degeneracy. For each level (\ie, each nested level of restricted subproblem), \dylp records the number of times this level was reached, the average and maximum number of variables involved in a degeneracy, the total and average number of pivots executed at this level, and the maximum number of pivots executed in any one subproblem at this level. The array is generously sized (by compile time constant) to accommodate a maximum of 25 levels. \item\Varhdr{dmulti}% {flippable, cnt, cands, promote, nontrivial, evals, flips, pivrnks, maxrnk} Statistics on the behaviour of the generalised dual pivoting algorithm. Each call to \pgmid{dualmultiin} collects a list of candidate variables to enter the basis and sorts the list. This process may produce a unique candidate for entry, or it may leave a list of requiring further evaluation to determine the best sequence of flips and final pivot. The \pgmid{flippable} field records the number of flippable variables in the problem (\ie, variables with finite lower and upper bounds). The \pgmid{cnt} field records the total number of calls to \pgmid{dualmultiin}, and \pgmid{nontrivial} records the number of times the initial scan and sort did not identify a unique entering variable. The remaining fields, with one exception, are totals. They record the number of candidates queued for evaluation, the number of times that a sane pivot was promoted over an unstable pivot, the number of columns transformed ($B^{-1}a_k$) for evaluation, the number of bound-to-bound flips, the rank in the sorted list of the variable selected to enter, and the maximum rank for a variable selected to enter. \item\Varhdr{factor}{cnt, prevpiv, avgpivs, maxpivs} Statistics about basis factoring. The \pgmid{cnt} field records the total number of times the basis was refactored. The \pgmid{avgpivs} and \pgmid{maxpivs} fields record the average and maximum number of pivots between basis refactoring. \item\Varhdr{infeas}{prevpiv, maxcnt, totpivs, maxpivs, chgcnt1, chgcnt2} Statistics on the resolution of infeasibility during primal phase I. The maximum number of infeasible variables is recorded, as well as the total pivots in phase I and the maximum number of pivots with no change in the number of infeasible variables. \dylp also counts the number of times that the number of infeasible variables changed without requiring recalculation of the reduced costs (\pgmid{chgcnt1}), and the number of times when it did (\pgmid{chgcnt2}). Specifically, if exactly one variable gains feasibility, and it leaves the basis as it does so, the reduced costs do not have to be recalculated. \item\Varhdr{p1}{pivs, iters} Total pivot and iteration counts for primal phase~1 simplex. \item\Varhdr{p2}{pivs, iters} Total pivot and iteration counts for primal phase~2 simplex. \item\Varhdr{pdegen}{cnt, avgsiz, maxsiz, totpivs, avgpivs, maxpivs} Statistics on the amount of time spent in restricted subproblems trying to escape primal degeneracy. The content of individual fields is as for \pgmid{ddgen}. \item\Varhdr{pivrej}% {max, mad, sing, pivtol_red, min_pivtol, puntcall, puntret} Statistics on the management of variables judged unsuitable for pivoting. Variables are queued on the rejected pivot list when a pivot attempt fails because the pivot element is numerically unstable or because the pivot produced a singular basis. During primal simplex, candidate entering variables are queued; during dual simplex, candidate leaving variables. The \pgmid{max} field records the maximum length of the rejected pivot list. The fields \pgmid{mad} and \pgmid{singular} record the number of variables queued for unstable pivots and singular basis, respectively. The \pgmid{puntcall} field records the number of times the routine \pgmid{dy_dealWithPunt} was called in an attempt to remove variables from the rejected pivot list. The \pgmid{pivtol_red} field records the number of times that the pivot selection multiplier was reduced in order to consider candidate variables previously rejected for numeric instability; \pgmid{min_pivtol} is the minimum multiplier value used. The \pgmid{puntret} field records the number of times \pgmid{dy_dealWithPunt} was unable to remove any candidates from the rejected pivot list and therefore recommended termination of the current simplex phase. \item\Varhdr{pmulti}{cnt, cands, nontrivial, promote} Statistics on the behaviour of the extended primal pivoting algorithm. Each call to \pgmid{primalmultiout} collects a list of candidate variables to leave the basis. This process may produce a unique candidate to leave, or it may leave a list of candidates requiring further evaluation to determine the final pivot. The \pgmid{cnt} field records the total number of calls to \pgmid{primalmultiout}, and \pgmid{nontrivial} records the number of times the initial scan did not identify a unique leaving variable. The \pgmid{promote} field records the number of times that a sane pivot was promoted over an unstable pivot, \item\Varhdr{tot}{pivs, iters} Total pivot and iteration counts for the call to \pgmid{dylp}. \item\Varhdr{vars}{sze, actcnt, deactcnt} Information about individual variables: the number of times a variable is activated and deactivated. \end{codedoc} DyLP-1.6.0/DyLP/doc/antidegenlite.tex0000644000076700007670000004013411171477034014206 0ustar \section{Lightweight Anti-Degeneracy Measures Based on Hyperplane Alignment} \label{sec:AntiDegenLite} \newcommand{\nblb}{\,\underline{\makebox[\width-3pt][c]{$\scriptstyle \,N$}}} \newcommand{\nbub}{\;\overline{\makebox[\width-3pt][c]{$\scriptstyle N\,$}}} In addition to the perturbed subproblem anti-degeneracy algorithm described in \secref{sec:PerturbedAntiDegeneracy}, \dylp provides a light-weight anti-degeneracy mechanism based on hyperplane alignment. In the code and documentation, this is referred to as `anti-degen lite'. Each constraint $a_k x \leq b_k$ defines an associated hyperplane at equality. In the absence of degeneracy, a simplex pivot consists of moving away from one hyperplane along an edge until another hyperplane blocks further progress. The hyperplane being left becomes loose, and the blocking hyperplane becomes tight. The choice of entering variable $x_j$ determines the constraint that will become loose, and the choice of leaving variable $x_i$ determines the constraint that will become tight. Ideally, the choice of constraints is unique, but life is seldom ideal. Most often the lack of uniqueness is due to degeneracy, in which one or more basic variables are at their upper or lower bounds. Geometrically, there are more tight constraints than required to define the current extreme point. In this case the change of basis that occurs with the pivot will not result in a move to a new extreme point. This section describes a suite of measures based on hyperplane alignment which try to better the odds of selecting hyperplanes which will form an edge that escapes from the degenerate extreme point. Because all constraints at a degenerate vertex are tight, some terminology will be useful to describe the changes associated with a pivot. For this section only, the terms activate and deactivate will be used as follows: \begin{itemize} \item When the slack variable for a constraint moves to the basic partition, the constraint is deactivated. When the slack variable moves to the nonbasic partition, the constraint is activated. \item When an architectural variable moves to the basic partition, the relevant bound constraint is deactivated. When an architectural variable moves to the nonbasic partition, the relevant bound constraint is activated. \end{itemize} \subsection{Activation of Constraints} In both the primal and dual simplex algorithms, the constraint which is activated by a pivot depends on the leaving variable and its direction of motion. Before discussing the types of alignment calculations, it will be useful to discuss the activation of constraints. Knowing the type of constraint (`$\leq$' or `$\geq$') is necessary because it determines the direction of the normal with respect to the feasible region. \dylp assumes that the majority of explicit constraints of the primal problem are of the form $a_k x \leq b_k$. It also understands range constraints of the form $\check{b}_k \leq a_k x \leq b_k$. These are implemented by placing an upper bound on the associated slack variable $s_k$, but for purposes of determining the constraint to be activated we need to recognise that there are really two constraints, $a_k x \geq \check{b}_k$ and $a_k x \leq b_k$. Bounded variables are handled implicitly by the primal simplex algorithm. When a bounded variable becomes nonbasic at its lower bound, the constraint $x_k \geq l_k$ is activated; when it becomes nonbasic at its upper bound, the constraint $x_k \leq u_k$ is activated. A final complication is introduced in phase I of the primal simplex, where it's possible to approach a constraint from the `wrong' side in the process of finding a primal feasible basic solution. For example, if a slack variable $s_k < 0$ will increase and leave the basis at 0, the constraint which is becoming tight is actually $a_k x \geq b_k$. \aside{Is this really a valid insight? In terms of blocking motion, it's true. In terms of alignment with the objective, for example, I have doubts.} Turning to the dual problem, the question of what constraint is being activated is substantially obscured by the mechanics of running the dual simplex algorithm from the primal data structures. A much clearer picture can be obtained by expanding the primal system to include explicit upper and lower bound constraints and examining the resulting dual constraints (\cite[\S3.4]{For92}, or see \cite{Haf98a} for an extended development). Briefly, let $y$ be the dual variables associated with the original explicit constraints $a_k x \leq b_k$ (the architectural constraints), $\check{y}$ be the dual variables associated with the lower bound constraints, and $\hat{y}$ be the dual variables associated with the upper bound constraints. A superscript $\underline{N}$ will represent the set of primal variables at their lower bound, $\overline{N}$ the set of primal variables at their upper bound, and $B$ the set of basic primal variables. The set of dual constraints can then be written as \begin{equation*} \begin{aligned} yB - \check{y}^{B}I + \hat{y}^{B}I & = c^B \\ y\underline{N} - \check{y}^{\nblb}I + \hat{y}^{\nblb}I & = c^{\nblb} \\ y\overline{N} - \check{y}^{\nbub}I + \hat{y}^{\nbub}I & = c^{\nbub} \end{aligned} \end{equation*} where the first term in each dual constraint comes from the primal architectural constraints, the second term from the lower bound constraints, and the third term from the upper bound constraints. The variables $\check{y}^{B}$, $\hat{y}^{B}$, $\hat{y}^{\nblb}$, and $\check{y}^{\nbub}$ are dual nonbasic and therefore have the value zero. (They are associated with primal bound constraints which are not tight.) We can rewrite the dual constraints as \begin{equation*} \begin{aligned} yB = c^B \\ y\underline{N} - \check{y}^{\nblb}I = c^{\nblb} \\ y\overline{N} + \hat{y}^{\nbub}I = c^{\nbub} \end{aligned} \end{equation*} We can then interpret the constraints $y\underline{N} - \check{y}^{\nblb}I = c^{\nblb}$ as $y\underline{N} \geq c^{\nblb}$, with $\check{y}^{\nblb}$ acting as the surplus variables. Similarly, the constraints $y\overline{N} + \hat{y}^{\nbub}I = c^{\nbub}$ can be interpreted as $y\overline{N} \leq c^{\nbub}$, with $\hat{y}^{\nbub}$ acting as the slack variables. With this interpretation in hand, it's easy to determine the hyperplane that's activated by a pivot. When a dual variable $\check{y}^{\nblb}_k$ is driven out of the basis at 0 ($x_k$ enters rising from its lower bound), the constraint $y a_k \geq c_k$ becomes tight. When a dual variable $\hat{y}^{\nbub}_k$ is driven out of the basis at 0 ($x_k$ enters decreasing from its upper bound), the constraint $y a_k \leq c_k$ becomes tight. This interpretation is uniform for the original primal variables as well as the primal slack variables. For the most common case of a primal constraint $a_i x \leq b_i$, with associated slack $s_i$, $0 \leq s_i \leq \infty$, the dual constraint reduces to $y_i \geq 0$, and this is handled as an implicit bound by the dual simplex algorithm implemented in \dylp. (Range constraints complicate the interpretation, but not the mechanics, of the implementation. Again, see \cite{Haf98a} for a detailed explanation.) In the sections which follow, the alignment calculations are developed in terms of the most common constraint form ($a_k x \leq b_k$ in the case of the primal simplex, and $y a_k \geq c_k$ in the case of the dual simplex). Accommodating the different constraint types described in this section is simply a matter of correcting the sign of the calculation as needed to account for the direction of the constraint normal. \subsection{Alignment With Respect to the Objective Function} The primal objective used in \dylp is $\min cx$. We need to move in the direction $-c$ until we reach an extreme point of the polytope where the cone formed by the normals of the active constraints includes $-c$. If the goal is to travel in the direction $-c$, one approach would be to leave each vertex by moving along the edge which most nearly points in the direction $-c$. The edges traversed by the simplex algorithm are simply the intersections of active hyperplanes. If we're trying to construct an edge with which we can leave a degenerate vertex, we could choose to activate a hyperplane $a_k x = b_k$ such that $-c$ most nearly lies in the hyperplane, on the theory that its intersection with other active hyperplanes at the vertex is more likely to produce an edge with the desired orientation. This is the `Aligned' strategy, because we want the hyperplanes most closely aligned with the normal of the objective. Going to the other extreme, at the optimal vertex it must be true that the active hyperplanes block further motion in the direction $-c$, and $-c$ must lie within the cone of normals of the active hyperplanes. One can make the argument that a good choice of hyperplane would the one that most nearly blocks motion in the direction $-c$, as it's likely to be active at the optimal vertex. This is called the `Perpendicular' strategy, because we want the hyperplanes which are most nearly perpendicular to the normal of the objective. For constraints $a_k x \leq b_k$ the normal points out of the feasible region. Let the alignment of the normal $a_k$ with $-c$ be calculated as $\displaystyle \frac{a_i \cdot c}{\norm{a_i}\norm{c}}$. Then for the Perpendicular strategy, we want to select the hyperplane $a_i x = b_i$ such that $\displaystyle i = \arg \max_k \frac{a_k \cdot c}{\norm{a_k}}$ over all constraints $a_k x \leq b_k$ in the degenerate set. For the Aligned strategy, the criteria is a bit more subtle. If $a_k \cdot -c = 0$, $-c$ lies in the hyperplane $a_k x = b_k$. Selecting the hyperplane $i$ such that $\displaystyle i = \arg \min_k \abs{\frac{a_k \cdot c}{\norm{a_k}}}$ is not quite sufficient. Where possible, \dylp attempts to choose hyperplanes which are tilted in the direction of the objective, so as to bound the problem. The preferred hyperplane is $a_i x = b_i$ such that $\displaystyle i = \arg \min_{\{k \mid a_k \cdot c \geq 0\}} \frac{a_k \cdot c}{\norm{a_k}}$ over the constraints in the degenerate set. If $a_k \cdot c < 0$ for all $k$, the preferred hyperplane is chosen as $\displaystyle i = \arg \max_k \frac{a_k \cdot c}{\norm{a_k}}$. The dual objective used in \dylp is $\min yb$, but we must be careful here to to include the effect of the bounds on the primal variables. The objective is properly stated as $\min \begin{bmatrix} y & \check{y} & \hat{y} \end{bmatrix} \trans{\begin{bmatrix} b & -l & u \end{bmatrix}}$, and we will need to include the coefficients of $\check{y}$ and $\hat{y}$ in the constraint normals. (In the primal we could ignore this effect, because the objective coefficients associated with the slack variables are uniformly zero.) For dual constraints $y a_k \geq c_k$, the normal $\begin{bmatrix} a_k & -e_k & 0 \end{bmatrix}$ will point into the feasible region and \dylp calculates the alignment of $\begin{bmatrix} -b & l & -u \end{bmatrix}$ with the hyperplane as $\displaystyle \frac{b \cdot a_k + l_k} {(\norm{a_k}+1)\norm{\begin{bmatrix} b & -l & u \end{bmatrix}}}$, so that a positive result identifies a constraint which blocks motion in the direction of the objective. For a constraint $y a_k \leq c_k$, the calculation is $\displaystyle \frac{(-b) \cdot a_k - u_k} {(\norm{a_k}+1)\norm{\begin{bmatrix} b & -l & u \end{bmatrix}}}$. Selection of a specific leaving variable $\check{y}^{\nblb}_k$ or $\hat{y}^{\nbub}_k$ is done using the same criteria outlined for the Perpendicular and Aligned cases in the primal problem. \subsection{Alignment With Respect to the Direction of Motion} The selection of an entering variable specifies the desired direction of motion for the pivot. At a degenerate vertex, we cannot move in the desired direction because the set of active hyperplanes does not contain this edge. Intuitively, activating a hyperplane which is closely aligned with the desired direction of motion might increase the chance of being able to move in that direction. For the primal simplex, the direction of motion derived in \secref{sec:PSEPricing} is $\eta_j = \trans{\begin{bmatrix} -B^{\,-1}a_j & -e_j \end{bmatrix}}$. The normal of a constraint $a_k x \leq b_k$ points out of the feasible region. The alignment of $\eta_j$ and the normal $a_k$ is calculated as $\displaystyle \frac{a_k \cdot \eta_j}{\norm{a_k}\norm{\eta_j}}$, so that a positive value identifies a hyperplane which blocks motion in the direction $\eta_j$. It's important to note that normal $a_k$ in this calculation is that of the inequality --- the coefficient associated with the slack $s_k$ is \textit{not} included. This means that $a_k \cdot \eta_j \equiv -\overline{a}_{kj}$. For a bound constraint, the relation is obvious by inspection. If, for example, the constraint is $x_k \leq u_k$, the normal is $e_k$, and $e_k \cdot -\overline{a}_j = -\overline{a}_{kj}$. For an architectural constraint, it's necessary to look at the calculation in a way that separates the contributions of the architectural and slack variables, and basic and nonbasic variables. We are interested in the structure of the product $\begin{bmatrix} B & N \end{bmatrix} \begin{bmatrix} -B^{\,-1}N \\ I \end{bmatrix}$ for loose constraints which will be activated by pivoting the associated slack variable out of the basis. Breaking up the matrices as detailed in \secref{sec:Notation}, we have \begin{align*} \begin{bmatrix} B^l & I & N^l & 0 \end{bmatrix} \begin{bmatrix} -B^{\,-1}N \\ I \end{bmatrix} & = \begin{bmatrix} B^l & I & N^l & 0 \end{bmatrix} \begin{bmatrix} -\begin{bmatrix} (B^t)^{-1} & 0 \\ -B^l(B^t)^{-1} & I \end{bmatrix} \begin{bmatrix} N^t \\ N^l \end{bmatrix} \\ \begin{bmatrix} I & 0 \\ 0 & I \end{bmatrix} \end{bmatrix} \\ & = \begin{bmatrix} B^l & I & N^l & 0 \end{bmatrix} \begin{bmatrix} -(B^t)^{-1} N^t & -(B^t)^{-1} \\ B^l(B^t)^{-1}N^t - N^l & B^l(B^t)^{-1} \\ I & 0 \\ 0 & I \end{bmatrix} \\ & = \begin{bmatrix} -B^l(B^t)^{-1} N^t + B^l(B^t)^{-1} N^t - N^l + N^l & -B^l(B^t)^{-1} + B^l(B^t)^{-1} \end{bmatrix} \end{align*} Removing the contribution due to the basic slack variables, we have $\begin{bmatrix} -B^l(B^t)^{-1} N^t + N^l & -B^l(B^t)^{-1} \end{bmatrix}$. Because the leaving variable for the pivot is a slack, the pivot element $\overline{a}_{kj}$ will be drawn from the component $\begin{bmatrix} B^l(B^t)^{-1}N^t - N^l & B^l(B^t)^{-1} \end{bmatrix}$ in $-B^{-1}N$, and the equivalence is verified. To finish the alignment calculation for the purposes of selecting a leaving variable, all that is needed is to perform the normalisation by $\norm{a_k}\norm{\eta_j}$, and since $\norm{\eta_j}$ is constant during the selection of the leaving variable, we need only divide by $\norm{a_k}$ for comparison purposes. The selection of a leaving variable using the Aligned strategy is as outlined in the previous section. Given that $a_k \cdot \eta_j \equiv -\overline{a}_{kj}$, it's worth taking a moment to consider a common tie-breaking rule for selecting the leaving variable --- pick the variable with the largest $\abs{\overline{a}_{kj}}$, to maintain numerical stability. In fact, this amounts to selecting a hyperplane to activate using an unnormalised variation of the Perpendicular strategy. The obvious corollary is that using the Aligned strategy presents a potential danger to numerical stability by deliberately choosing small pivots. For the dual simplex, the direction of motion $\zeta_i$ is more complicated. Fortunately, we need only consider the portion of $\zeta_i$ in the space of the dual variables $y$. As derived in \secref{sec:DSEPricing}, this is simply row $\beta_i$ of $B^{\,-1}$. For the dual constraints $y a_k \geq c_k$, the normal points into the feasible region. To maintain the convention that the alignment calculation should produce a positive result if the constraint blocks motion, the alignment calculation used by \dylp is $\displaystyle -\frac{\zeta_i \cdot a_k}{\norm{\zeta_i}\norm{a_k}}$. Given that we're only interested in the portion of $\zeta_i \cdot a_k$ contributed by the dual variables $y$, it's immediately apparent that the alignment calculation can be reduced to $\displaystyle -\frac{\overline{a}_{ik}}{\norm{a_k}}$ for purposes of selecting the leaving dual variable. The final selection of a leaving dual variable using the Aligned or Perpendicular strategy proceeds as outlined in the previous section. DyLP-1.6.0/DyLP/doc/dylpfigs.tex0000644000076700007670000000233311171477034013212 0ustar \documentclass[titlepage]{article} \usepackage{graphics} \usepackage{loustandard} \usepackage{loubookman} %\newcommand{\mypath}{/cs/mitacs1/lou/Bonsai/Doc/Dylp.Coin} \input{dylpabsdir} \newcommand{\figures}{\mypath/Figures} \newcommand{\dylp}{\textsc{dylp}\xspace} \begin{document} \markright{\dylp Figures} \begin{figure} \begin{center} \includegraphics{\figures/dylpnormalflow} \end{center} \caption{\dylp normal execution flow} \end{figure} \begin{figure} \begin{center} \includegraphics{\figures/dualerrorflow} \end{center} \caption{\dylp dual simplex error recovery} \end{figure} \begin{figure} \begin{center} \includegraphics{\figures/primalerrorflow} \end{center} \caption{\dylp primal simplex error recovery} \end{figure} \begin{figure} \begin{center} \scalebox{.9}{\includegraphics{\figures/dual2flow}} \end{center} \caption{Dual Phase II Algorithm Flow} \label{fig:DualPhaseIIFlow} \end{figure} \begin{figure} \centering \scalebox{.85}{\includegraphics{\figures/primal1flow}} \caption{Primal Phase I Algorithm Flow} \label{fig:PrimalPhaseIFlow} \end{figure} \begin{figure} \centering \includegraphics{\figures/primal2flow} \caption{Primal Phase II Algorithm Flow} \label{fig:PrimalPhaseIIFlow} \end{figure} \end{document} DyLP-1.6.0/DyLP/doc/varmgmt.tex0000644000076700007670000002567011171477034013057 0ustar \section{Variable Management} \label{sec:VariableManagement} Activation and deactivation of variables and constraints is a core activity for dynamic simplex. The activation or deactivation of variables can occur as an independent activity or as a consequence of constraint activation and deactivation (\vid \secref{sec:ConstraintManagement}). During normal execution (\vid Fig.~\ref{fig:DylpFlow}) variables are activated (\pgmid{dy_activateVars}) when primal simplex returns an indication of infeasibility or when primal or dual simplex achieve optimality. Variables are deactivated (\pgmid{dy_deactivateVars}) when dual simplex achieves optimality and returns to primal phase~II after adding variables. In a somewhat different context, dual feasible variables are evaluated as dual bounding constraints and activated (\pgmid{dy_dualaddvars}) when dual simplex indicates an unbounded dual (infeasible primal). Dual feasible variables are also activated (\pgmid{dy_activateVars}) when dual simplex will be reentered after adding constraints without an intervening primal simplex phase. The motivation is to increase the probability that the dual problem will remain bounded. Figure \ref{fig:VarmgmtCalls} shows the call structure for the top-level variable activation and deactivation routines. \begin{figure}[htbp] \centering \includegraphics{\figures/varmgmtcalls} \caption{Call Graph for Variable Management Routines}\label{fig:VarmgmtCalls} \end{figure} \subsection{Variable Management Primitives} There are two primitive variable management routines: \begin{itemize} \item \pgmid{dy_actNBPrimArch} activates a primal architectural variable into the nonbasic partition. \item \pgmid{dy_deactNBPrimArch} deactivates a nonbasic primal architectural variable. \end{itemize} \dylp assumes that inactive variables are feasible and at bound and provides no independent way to specify the value of the variable. As a special case, inactive free variables are assumed to have the value zero. A consequence of this is that it is not possible to deactivate a basic variable; the variable must first be forced into the nonbasic partition. Unless the variable is basic at bound, this will change the variable's value. The special-purpose routine \pgmid{dy_deactBPrimArch} performs this service when \dylp is attempting to force primal feasibility by deactivating infeasible basic variables. \dylp provides no method for activating an architectural variable into the basic partition. When activating a constraint, the logical variable associated with the constraint is always used as the new basic variable. \subsection{Activation of Variables} \label{sec:VariableActivation} \dylp looks for variables to activate whenever optimality is attained for the current set of constraints and variables, or when the active system is found to be infeasible. The set of inactive variables is scanned and any variables with favourable reduced costs are activated and placed in the primal nonbasic partition. If an optimal solution has been found for the active constraint system by either primal or dual simplex, \pgmid{scanPrimVarStdAct} is called to select a set of variables to be activated under the assumption that primal phase~II iterations will resume after the variables are added. The reduced costs are calculated using the original objective function for the problem. Variables are selected for activation if their reduced cost indicates they are not at their optimal bound (\ie, dual infeasible). If phase~I of the primal simplex has found the problem to be infeasible, \pgmid{scanPrimVarStdAct} is again used to select the set of variables to be activated, but the reduced costs are calculated using the phase~I objective (as described in \secref{sec:PrimalPhaseI}). Primal phase~I iterations resume after variables are added. Normally, when dual simplex indicates optimality, primal phase~II is executed after adding variables with favourable (dual infeasible) reduced costs. It can happen, however, that there are no such variables. In this case, \dylp will attempt to add violated constraints and, if any are found, resume execution of dual simplex. To increase the likelihood that the dual problem will remain bounded, \dylp will again attempt to add variables before resuming dual simplex iterations, but the criteria in this case will be variables whose reduced costs are dual feasible (\ie, unfavourable from a primal perspective). Activating a variable into the nonbasic partition will not change to the basis, primal or dual variable values, or DSE pricing information. The reduced cost and the projected column norm used for PSE pricing must be properly initialised for the new variable. The action taken for the projected column norm depends on the context of variable activation. If primal simplex was executing prior to variable activation and will be resumed after variable activation, the projected column norms are up-to-date and correct values must be calculated for the new variables. In other cases, PSE pricing information will be initialised when primal simplex iterations resume and no action is required. If the dual simplex has found the problem to be primal infeasible (dual unbounded), the problem of selecting variables to add should be viewed from the perspective of looking for dual constraints which will bound the problem. The goal is to activate one or more dual constraints and return to dual simplex iterations. The selection of the candidate entering dual variable $y_i$ (leaving primal variable $x_i$) has fixed the direction of travel, $\zeta_i$. The best outcome will be to add dual constraints (primal variables) which block travel in the direction $\zeta_i$. If that isn't possible (because activating any bounding dual constraint would result in the loss of dual feasibility) a second possibility is to activate variables which will change the dual reduced costs (the values of the primal basic variables) so that a different dual variable $y_k$ is selected to enter. The hope is that motion in a different direction $\zeta_k$ may make it possible to activate constraints which will bound the dual without loss of feasibility. The subroutine \pgmid{dy_dualaddvars} controls the search process, and can activate three classes of variables, for convenience called type~1, type~2, and type~3. Type~1 variables are those variables which constitute feasible dual constraints which bound the dual problem. These can be activated and placed in the primal nonbasic partition without losing dual feasibility. Type~1 variables are preferred, as \pgmid{dy_dualaddvars} can activate any number of them in a given call. If there are no type~1 variables, \pgmid{dy_dualaddvars} considers type~2 variables. Type~2 variables are those variables which constitute dual constraints that bound the dual problem and which, while not dual feasible if activated into the primal nonbasic partition, will give a dual feasible solution if activated and immediately pivoted into the basis. This is equivalent to adding a cutting plane which renders the current solution infeasible and executing a single pivot to regain feasibility; necessarily, the objective will deteriorate. In the context of Table \ref{Tbl:DualPivotRules} in \secref{sec:DualStdSelectInVar}, this amounts to selecting a pivot with the signs of $\overline{c}_j$ and $\overline{a}_{ij}$ reversed. The pivot is sufficiently similar to a normal dual pivot that it can be handled by \pgmid{dy_dualpivot}. It is not standard in that the entering primal variable will move away from its bound toward the infeasible side (\eg, $x_j$ would enter falling from its lower bound with $\overline{c}_j < 0$ and $\overline{a}_{ij} > 0$). One such variable can be activated on each call to \pgmid{dy_dualaddvars}. In the absence of type~1 or type~2 variables, type~3 variables are considered. These are variables which are not dual feasible at their current bound but which will reduce the infeasibility of the leaving primal variable if activated and changed to their opposite bound. The motivation for activating a type~3 variable is that it makes the reduced cost of $y_i$ less desirable, so that some other variable $y_k$ can be selected to enter (thus moving in a different direction $\zeta_k$). The routine \pgmid{type3activate} will attempt to activate as many type~3 variables as required in order to change the entering dual variable $y_i$. Activation of type~2 or type~3 variables is generally not cost-effective. By default, \dylp limits \pgmid{dy_dualaddvars} to type~1 activations. The dynamic simplex algorithm will revert to primal phase~I if no type~1 variables exist. An option allows the client to specify whether type~1, type~2, or type~3 variables will be considered. Activation of a type~1 variable is no different from any other activation into the nonbasic partition, as described above. For type~2 variables, the pivot will cause a change of basis. \pgmid{dy_dualpivot} will take care of the required calculations and updates in the context of dual simplex. For type~3 variables, the basis doesn't change, and the values of the dual variables and DSE norms are unchanged. The values of the primal variables do change, however, and this changes the DSE pricing information. \subsection{Deactivation of Variables} \label{sec:VariableDeactivation} Deactivation of variables occurs when dual simplex finds an optimal solution for the active constraint system and variable activation identifies dual infeasible variables for activation. In this case, variable deactivation is performed before entering primal phase~II simplex. The subroutine \pgmid{dy_deactivateVars} is called to deactivate variables according to a client-specified threshold, expressed as a percentage of the maximum unfavourable reduced cost over all active variables. Specifically, \pgmid{dy_deactivateVars} scans the reduced costs of the active variables and determines a pair of values $\displaystyle \check{c} = \max_{\{k : c_k < 0\}}\abs{c_k}$ and $\displaystyle \hat{c} = \max_{\{k : c_k > 0\}}\abs{c_k}$. It then deactivates variables with $c_k > \hat{c}(\pgmid{dy_tols.purgevar})$ or $c_k < -\check{c}(\pgmid{dy_tols.purgevar})$. \subsection{Initial Variable Selection} For a cold start, the initial set of active variables is completely determined by the initial set of constraints. All variables referenced in the constraints are activated. As noted in \secref{sec:Startup}, the client can set parameters which will cause variable deactivation to be executed prior to starting simplex iterations. For a hot start, the initial set of active variables is the set that was active at return from the previous call to \pgmid{dylp}. For a warm start, the set of active constraints is specified by the basis. The initial set of active variables can be determined from the constraints as for a cold start, or the client can specify a set of variables which should be activated as the active constraint system is created. As noted in \secref{sec:Startup}, for a hot or warm start the client can set parameters which will cause variable activation to be executed prior to starting simplex iterations. DyLP-1.6.0/DyLP/doc/debug.tex0000644000076700007670000001331511171477034012461 0ustar \section{\dylp Debugging Features} \label{sec:DylpDebugging} \dylp incorporates two types of debugging features: a controllable printing facility and paranoid checks. The printing facility is enabled when the symbol \pgmid{NDEBUG} is not defined at compile time, and is intended to allow the generation of log information at whatever level of detail is desired by the user. The paranoid checks are enabled when the symbol \pgmid{PARANOIA} is defined at compile time and are intended to provide significant (and expensive) cross-checks during code development. \subsection{Printing} The amount of output generated by \dylp can be varied from next to nothing to a level of detail intended only for detailed debugging. The paragraphs which follow briefly outline the capabilities; for specific output at a given print level, please refer to the file \coderef{dylp.h}{}. \begin{codedoc} \item\varhdr{basis} Prints information related to management of the basis, including adjustments to suppress numerical instability and recover from singularity. \item\varhdr{conmgmt} Prints information on the management of constraints, including activation and deactivation, changes to primal and dual variables, and (at the highest level) a running commentary on all constraint and variable additions, deletions, and motions attributable to activation and deactivation of constraints. \item\varhdr{crash} Prints information regarding the generation of the initial basis, including factoring, the initial set of basic variables, and their values. For a cold start, information on the selection of the basic variables can be printed. \item\varhdr{degen} Prints information about degenerate pivots and restricted subproblem formation to deal with degeneracy. \item\varhdr{dual} Prints information about the execution of the dual simplex, with capabilities similar to \pgmid{phase1}. \item\varhdr{major} Tracks the major state transitions of the dynamic simplex algorithm as \dylp solves an LP. \item\varhdr{phase1} Prints information about the execution of phase I of the primal simplex. At the low end, messages are printed for extraordinary events --- unboundedness, serious pivoting problems, \etc At a medium level, a one line message is printed summarising each pivot, as well as messages about routine but infrequent events --- refactoring, accuracy checks, and various minor problems. At the highest level, all primal and dual variables are printed as they are recalculated for each pivot, along with detailed information about reduction of infeasibility and changes to the phase I objective function. This is \textit{an enormous amount} of output for large problems. \item\varhdr{phase2} Prints information about the execution of phase II of the primal simplex, with capabilities similar to \pgmid{phase1}. \item\varhdr{pivoting} Prints information on the evaluation of candidates for the leaving primal or entering dual variable and details of the pivot column or row. At least one line per pivot; at the highest level, produces \textit{a lot} of output. \item\varhdr{pivreject} Prints information on the operation of \dylp's pivot rejection mechanism. \item\varhdr{pricing} Prints information regarding the pricing of candidates for the entering primal or leaving dual variable. At any level above 1 you'll get \textit{many} lines of output per pivot; that's \textit{an enormous amount} of output for large problems. \item\varhdr{scaling} Prints information regarding numerical scaling of the constraint system. \item\varhdr{setup} Prints information regarding the loading and initialisation of an LP problem, including the constraints and variables which are activated and the angle of inequalities to the objective function. \item\varhdr{varmgmt} Prints information on the activation and deactivation of variables, much as \pgmid{conmgmt}. \end{codedoc} \subsection{Paranoia} Because it is intended as a development code, \dylp incorporates a large number of sanity checks, enabled by defining the conditional compilation symbol \pgmid{PARANOIA}. Many of these tests are cheap and simple --- checks for null parameters, sensible constraint and variable counts, proper major phase, and range checks on indices. Others are more elaborate and expensive. There are two dedicated subroutines which are used at several points to check the integrity of the current simplex point (basis, status, and primal variable values) and the constraint system: \begin{itemize} \item \pgmid{dy_chkstatus} implements extensive checks to make sure that the status and value of a primal variable agree across multiple data structures and are appropriate for the current major phase. \item \pgmid{dy_chkdysys} implements extensive checks to ensure that the active constraint system and associated data structures are correct and consistent. \end{itemize} There is another set of checks which track the numerical accuracy of calculations by performing an independent calculation of a quantity. These are of little use unless there is some reason to doubt the correctness of the calculation, hence the separate conditional compilation symbols. \begin{itemize} \item Checks on the accuracy of the calculations to produce unscaled rows of the basis inverse are controlled by the symbol \pgmid{CHECK_UNSCALED_BETAI}. \item Checks on the accuracy of iterative updating for PSE column norms and DSE row norms are controlled by the conditional compilation symbols \pgmid{CHECK_PSE_UPDATES} and \pgmid{CHECK_DSE_UPDATES}. These checks calculate the norms directly for comparison with the updated values, and the computational expense is unacceptable unless there is specific reason to suspect an error. \end{itemize} DyLP-1.6.0/DyLP/doc/Makefile.in0000644000076700007670000003171111263240452012710 0ustar # Makefile.in generated by automake 1.9.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2009 Lou Hafer # All Rights Reserved. # This file is distributed under the Common Public License. # Author: Lou Hafer SFU 2009.04.15 srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = doc DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/build_dylpdoc.in $(srcdir)/dylpabsdir.tex.in \ $(srcdir)/makefile.dylpdoc.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ac_c_add_to_includes.m4 \ $(top_srcdir)/m4/ac_c_get_sunpro_libs.m4 \ $(top_srcdir)/m4/ac_dylp_equiv_for_cpp_bool.m4 \ $(top_srcdir)/m4/ac_dylp_find_fp_funcs.m4 \ $(top_srcdir)/m4/ac_dylp_fix_cppflags.m4 \ $(top_srcdir)/m4/ac_dylp_options.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/inc/config_dylp.h SOURCES = DIST_SOURCES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; am__installdirs = "$(DESTDIR)$(DyLPDocInstalldir)" DyLPDocInstallDATA_INSTALL = $(INSTALL_DATA) DATA = $(DyLPDocInstall_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADDLIBS = @ADDLIBS@ ADD_CFLAGS = @ADD_CFLAGS@ ADD_CXXFLAGS = @ADD_CXXFLAGS@ ALWAYS_FALSE_FALSE = @ALWAYS_FALSE_FALSE@ ALWAYS_FALSE_TRUE = @ALWAYS_FALSE_TRUE@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AUX_DIR = @AUX_DIR@ AWK = @AWK@ BUILDTOOLSDIR = @BUILDTOOLSDIR@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CDEFS = @CDEFS@ CFLAGS = @CFLAGS@ COINUTILSDOCDIR = @COINUTILSDOCDIR@ COINUTILSOBJDIR = @COINUTILSOBJDIR@ COINUTILSSRCDIR = @COINUTILSSRCDIR@ COIN_HAS_COINUTILS_FALSE = @COIN_HAS_COINUTILS_FALSE@ COIN_HAS_COINUTILS_TRUE = @COIN_HAS_COINUTILS_TRUE@ COIN_HAS_DYLP_FALSE = @COIN_HAS_DYLP_FALSE@ COIN_HAS_DYLP_TRUE = @COIN_HAS_DYLP_TRUE@ COIN_HAS_OSI_FALSE = @COIN_HAS_OSI_FALSE@ COIN_HAS_OSI_TRUE = @COIN_HAS_OSI_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEFS = @CXXDEFS@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DBG_CFLAGS = @DBG_CFLAGS@ DBG_CXXFLAGS = @DBG_CXXFLAGS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DYLPDOCDIR = @DYLPDOCDIR@ DYLPOBJDIR = @DYLPOBJDIR@ DYLPSRCDIR = @DYLPSRCDIR@ DYLP_ERRMSGDIR = @DYLP_ERRMSGDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FADDLIBS = @FADDLIBS@ FFLAGS = @FFLAGS@ HAVE_EXTERNALS_FALSE = @HAVE_EXTERNALS_FALSE@ HAVE_EXTERNALS_TRUE = @HAVE_EXTERNALS_TRUE@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBEXT = @LIBEXT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLM4 = @LIBTOOLM4@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_LDFLAGS = @LT_LDFLAGS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ MPICC = @MPICC@ MPICXX = @MPICXX@ OBJEXT = @OBJEXT@ OPT_CFLAGS = @OPT_CFLAGS@ OPT_CXXFLAGS = @OPT_CXXFLAGS@ OSIDOCDIR = @OSIDOCDIR@ OSIOBJDIR = @OSIOBJDIR@ OSISRCDIR = @OSISRCDIR@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ RPATH_FLAGS = @RPATH_FLAGS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ VPATH_DISTCLEANFILES = @VPATH_DISTCLEANFILES@ abs_bin_dir = @abs_bin_dir@ abs_include_dir = @abs_include_dir@ abs_lib_dir = @abs_lib_dir@ abs_source_dir = @abs_source_dir@ ac_c_preproc_warn_flag = @ac_c_preproc_warn_flag@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ ac_cxx_preproc_warn_flag = @ac_cxx_preproc_warn_flag@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ have_autoconf = @have_autoconf@ have_automake = @have_automake@ have_svn = @have_svn@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sol_cc_compiler = @sol_cc_compiler@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ AUTOMAKE_OPTIONS = foreign # See the comment for distclean-local in ../Makefile.am CONFIG_CLEAN_FILES = DyLPDocInstalldir = @DYLPDOCDIR@ DyLPDocInstall_DATA = dylp.pdf dylp.ps # Make sure the source files are distributed. BUT NOTE that Coin doesn't handle # distributions this way and it's highly unlikely this will work as you'd # like. EXTRA_DIST = $(dylpdoc_SOURCES) # The TeX source files for the dylp documentation. dylpfigs.tex is actually a # shell to build just the figures. Handy for presentations. dylpdoc_SOURCES = accuracy.tex \ antidegenlite.tex \ conmgmt.tex \ debug.tex \ dual.tex \ dylp.tex \ dylpfigs.tex \ dynamic.tex \ interface.tex \ intro.tex \ lpbasis.tex \ notation.tex \ perturbed.tex \ pricing.tex \ primal.tex \ scaling.tex \ solutions.tex \ startup.tex \ statistics.tex \ updateformulae.tex \ varmgmt.tex all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign doc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh dylpabsdir.tex: $(top_builddir)/config.status $(srcdir)/dylpabsdir.tex.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ makefile.dylpdoc: $(top_builddir)/config.status $(srcdir)/makefile.dylpdoc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ build_dylpdoc: $(top_builddir)/config.status $(srcdir)/build_dylpdoc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: install-DyLPDocInstallDATA: $(DyLPDocInstall_DATA) @$(NORMAL_INSTALL) test -z "$(DyLPDocInstalldir)" || $(mkdir_p) "$(DESTDIR)$(DyLPDocInstalldir)" @list='$(DyLPDocInstall_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(DyLPDocInstallDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(DyLPDocInstalldir)/$$f'"; \ $(DyLPDocInstallDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(DyLPDocInstalldir)/$$f"; \ done uninstall-DyLPDocInstallDATA: @$(NORMAL_UNINSTALL) @list='$(DyLPDocInstall_DATA)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(DyLPDocInstalldir)/$$f'"; \ rm -f "$(DESTDIR)$(DyLPDocInstalldir)/$$f"; \ done tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(DyLPDocInstalldir)"; do \ test -z "$$dir" || $(mkdir_p) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-libtool dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-DyLPDocInstallDATA install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-DyLPDocInstallDATA uninstall-info-am .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install \ install-DyLPDocInstallDATA install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall \ uninstall-DyLPDocInstallDATA uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: DyLP-1.6.0/DyLP/doc/dual.tex0000644000076700007670000005436111171477034012326 0ustar \section{Dual Simplex} \dylp will choose dual simplex whenever the current basic solution is dual feasible but not primal feasible. The primary role of dual simplex in \dylp is reoptimisation following the addition of violated constraints. The implementation reflects this role and does not provide a dual phase~I for achieving dual feasibility. The dual simplex implementation incorporates dual steepest edge (DSE) pricing (\secref{sec:DSEPricing}), standard (\secref{sec:DualStdSelectInVar}) and generalised (\secref{sec:DualGenSelectInVar}) pivoting, and perturbation-based (\secref{sec:PerturbedAntiDegeneracy}) and alignment-based (\secref{sec:AntiDegenLite}) antidegeneracy algorithms. Because the dual simplex implementation does not provide a phase~I, a number of exceptional conditions will cause \dylp fall back from dual simplex to primal simplex. In dynamic simplex, apparent primal infeasibility can result because only a subset of the variables are present in the active constraint system. In some cases, the variables needed to regain feasibility cannot be activated into the nonbasic partition while maintaining dual feasibility. In the context of the dual problem, the problem is unbounded and any dual constraint which would bound it would also make the current basic solution dual infeasible. \dylp implements a variable activation procedure which can pivot a single variable into the basis as it is activated in order to maintain dual feasibilty. It is still possible, however, to reach a basic solution where multiple pivots are required to regain dual feasibility for any candidate variable. When this occurs, \dylp reverts to primal simplex. If primal infeasible variables remain but they cannot be pivoted because their pivot coefficients do not satisfy the current pivot selection tolerances, \pgmid{dy_dual} will punt and \dylp will return to phase~I of the primal simplex algorithm in the hope that addition of variables and/or the application of primal pivoting rules will allow pivoting to continue. In addition, if the dual simplex terminates due to stalling or loss of feasibility, \dylp will try the primal simplex algorithm before giving up. Figure \ref{fig:DualCallGraph} shows the call structure of the dual simplex implementation. \begin{figure}[htb] \centering \includegraphics{\figures/dualcalls} \caption{Call Graph for Dual Simplex} \label{fig:DualCallGraph} \end{figure} \subsection{Dual Top Level} Dual simplex is executed when the dynamic simplex state machine enters state \pgmid{dyDUAL}. If required, DSE pricing is initialised by calculating the square of the norms of the rows of the basis inverse (\vid \secref{sec:DSEPricing}) and the dual simplex routine \pgmid{dy_dual} is called. \pgmid{dy_dual} is a trivial shell which calculates the objective (\pgmid{dy_calcobj}) and calls the dual phase~II routine \pgmid{dual2} to do the optimisation. \subsection{Dual Phase II} The overall flow of phase~II of the dual algorithm is shown in Figure \ref{fig:DualPhaseIIFlow}. \begin{figure}[htbp] \begin{center} \scalebox{.9}{\includegraphics{\figures/dual2flow}} \end{center} \caption{Dual Phase II Algorithm Flow} \label{fig:DualPhaseIIFlow} \end{figure} The body of the routine is structured as two nested loops. The outer loop handles startup and termination, and the inner loop handles the majority of routine pivots. On entry to \pgmid{dual2}, the outer loop is entered and \pgmid{dy_dualout} is called to select the initial leaving variable. Then the inner loop is entered and \pgmid{dy_dualpivot} is called to perform the pivot. \pgmid{dy_dualpivot} (\vid \secref{sec:DualPivoting}) will calculate the coefficients of the pivot row (\pgmid{dualpivrow}), select an entering variable (\pgmid{dualin}), pivot the basis (\pgmid{dy_pivot}), update the primal and dual variables (\pgmid{dualupdate}), and update the DSE pricing information and reduced costs (\pgmid{dseupdate}). For a routine pivot, \pgmid{dseupdate} will also select a leaving variable for the next pivot. \pgmid{dy_duenna} evaluates the outcome of the pivot, handles error detection and recovery where possible, and performs the routine maintenance activities of accuracy checks and refactoring of the basis. If there are no problems, the pivoting loop iterates, using the leaving variable selected in \pgmid{dseupdate}. The loop continues until optimality is reached, the problem is determined to be primal infeasible (dual unbounded), or an exception or fatal error occurs. One common reason for a failure to select a leaving variable for the next pivot is that the current pivot was aborted due to numerical problems (an unsuitable pivot coefficient being the most common of these). In this case, \pgmid{dseupdate} never executes. Once \pgmid{dy_duenna} has taken the necessary corrective action, the flow of control escapes to the outer loop and calls \pgmid{dy_dualout} to select a new leaving variable. Another common reason for failure to select a leaving variable is that all candidates were previously flagged as unsuitable pivots. In this case, \pgmid{dy_dualout} will indicate a `punt' and \pgmid{dy_dealWithPunt} will be called to reevaluate the flagged variables. If it is able to make new candidates available, control returns to \pgmid{dy_dualout} for another attempt to find a leaving variable. If all flagged variables remain unsuitable, control flow moves to the preoptimality actions with an indication that dual simplex has punted. When \pgmid{dy_dualout} indicates optimality (primal feasibility) or \pgmid{dy_dualpivot} indicates optimality, dual unboundedness (primal infeasibility), or loss of dual feasibility, the inner loop ends and \pgmid{preoptimality} is called for confirmation. \pgmid{preoptimality} will refactor the basis, check for accuracy, recompute the primal and dual variables, and confirm dual and primal feasibility status. If there are no surprises, dual phase~II terminates with an indication of optimality, dual unboundedness, or loss of dual feasibility. Loss of dual feasibility stems from loss of numeric accuracy, but it cannot be corrected within dual phase~II. The error recovery actions taken by the dynamic simplex algorithm are described in \secref{sec:ErrorRecovery}. Loss of primal feasibility can occur for two distinct reasons. In the less common case, loss of primal feasibility stems from loss of numeric accuracy. The pivot selection rules are tightened and dual simplex iterations are resumed. When the number of false indications of optimality exceeds a hard-coded limit (currently 15), dual simplex terminates with a fatal error. The more common reason for apparent loss of primal feasibility at the termination of dual simplex is that it is ending with a punt, as described above. The variables flagged as unsuitable for pivoting are not primal feasible, and when the flags are removed to perform the preoptimality checks, primal feasibility is revealed as an illusion. No further action is possible within dual simplex; the reader is again referred to \secref{sec:ErrorRecovery}. Other errors (\eg, stalling, accuracy checks, \etc) not shown in Figure~\ref{fig:DualPhaseIIFlow} can occur and result in termination of the dual simplex algorithm with the appropriate error indication. \subsection{Pivoting} \label{sec:DualPivoting} \dylp offers two flavours of dual pivoting: A standard dual pivot algorithm in which a single primal variable is selected and pivoted into the basis, and a generalised dual pivot algorithm \cite[\S10.2]{Mar03} in which multiple primal variables may undergo bound-to-bound flips prior to the basis pivot. The choice of standard or generalised dual pivoting can be controlled with an option; \dylp will use generalised pivoting by default. Figure~\ref{fig:DualPivotCallGraph} shows the call structure of the dual pivot algorithm. The routine \pgmid{dualin} implements standard dual pivoting; \pgmid{dualmultin} implements generalised dual pivoting. \begin{figure}[htb] \centering \includegraphics{\figures/dualpivcalls} \caption{Call Graph for Dual Pivoting} \label{fig:DualPivotCallGraph} \end{figure} The first activity in \pgmid{dy_dualpivot} is the calculation of the coefficients of the pivot row, $\overline{a}_{i} = \beta_i N$, by the routine \pgmid{dualpivrow}. With the leaving primal variable and the basis inverse row in hand, one of \pgmid{dy_dualin} or \pgmid{dualmultiin} are called to select the entering variable. (If generalised dual pivoting is in use, \pgmid{dualmultiin} will perform any bound-to-bound flips before returning.) Once the entering and leaving variables have been chosen, the actual pivot is performed in several steps. Prior to the pivot, the vector $\tau = B^{\,-1}\beta^T_k$ is calculated for use during the update of the DSE pricing information. The basis is pivoted next; this involves calls to \pgmid{dy_ftran} and \pgmid{dy_pivot}, as outlined in \secref{sec:BasisPivoting}. If the basis change succeeds, the primal and dual variables are updated by \pgmid{dualupdate} using the iterative update formul\ae{} of \secref{sec:UpdatingFormulas}, and then the DSE pricing information and reduced costs are updated by \pgmid{dseupdate}, using the update formul\ae{} of \secref{sec:DSEPricing}. As a side effect, \pgmid{dseupdate} will select a leaving variable for the next pivot. \subsection{Selection of the Leaving Variable} The selection of the leaving primal variable $x_i$ (entering dual variable $y_i$) is made using the dual steepest edge criterion described in \secref{sec:DSEPricing}. As outlined above, the normal case is that the leaving variable for the following pivot will be selected as \pgmid{dseupdate} updates the DSE pricing information for the current pivot. In various exceptional circumstances where this does not occur, the routine \pgmid{dy_dualout} is called to make the selection. \subsection{Standard Dual Pivot} \label{sec:DualStdSelectInVar} For the standard dual pivot algorithm, the selection of the entering primal variable (leaving dual variable) is made using the usual dual pivoting rules and a set of tie-breaking strategies. Let $x_i$ be the leaving primal variable, for simplicity of exposition occupying basis position $i$. $\beta_{i}$ is obtained by calling \pgmid{dy_btran} to calculate $e_{i}B^{\,-1}$, where $e_{i}$ is the unit row vector with $1$ in position~${i}$. The pivot coefficient for a variable $x_k$ is $\overline{a}_{ik} = \beta_i a_k$. Let $y_i$ be the dual variable associated with the constraint in basis position $i$ and let $y_k$ be the dual variable associated with the tight bound constraint for the nonbasic primal variable $x_k$. Abstractly, we need to check $y_k = \overline{c}_k + \overline{a}_{ik}\delta_{ik}$ to find the maximum allowable $\delta_{ij}$ such that $y_k \geq 0 \: \forall k \in \mathcal{B}$ and $y_j = 0$ for some $j$. The index $j$ of the entering primal variable $x_j$ will be \begin{equation} \label{eq:AbstractDualPivot} j = \arg \mathop{\min}_{k} \abs{\frac{\overline{c}_k}{\overline{a}_{ik}}} \end{equation} for suitable $x_k \in N$. In practice, it's impossible to explain `suitable $x_k$' properly without going deep into the details of the workings of the revised dual simplex algorithm (\vid \cite{Haf98a}). Table~\ref{Tbl:DualPivotRules} gives the rules in tabular form, from the perspective that when all is said and done, the leaving primal variable must end up nonbasic at bound and the sign of the reduced cost must be appropriate for that bound. \begin{table} \renewcommand{\arraystretch}{2.5}\setlength{\tabcolsep}{.75\tabcolsep} \begin{tabular}{*{7}{>{$}c<{$}}>{$\displaystyle}c<{$}} \text{leaving } x_i & \text{entering } y_i & \text{resulting } \overline{c}_i & \text{entering } x_j & \text{leaving } y_j & \text{initial } \overline{c}_j & \text{pivot } \overline{a}_{ij} & -\frac{\overline{c}_j}{\overline{a}_{ij}} = \overline{c}_i \\[.5\baselineskip] \nearrow \mathit{lb} & 0 \nearrow & \geq 0 & \mathit{lb} \nearrow & \searrow 0 & \geq 0 & < 0 & -\frac{(+)}{(-)} = (+) \\ & & & \mathit{ub} \searrow & \nearrow 0 & \leq 0 & > 0 & -\frac{(-)}{(+)} = (+) \\ \searrow \mathit{ub} & 0 \searrow & \leq 0 & \mathit{lb} \nearrow & \searrow 0 & \geq 0 & > 0 & -\frac{(+)}{(+)} = (-) \\ & & & \mathit{ub} \searrow & \nearrow 0 & \leq 0 & < 0 & -\frac{(-)}{(-)} = (-) \\ \end{tabular} \caption{Summary of Dual Simplex Pivoting Rules} \label{Tbl:DualPivotRules} \end{table} Interpreting the table, the second line says that if the leaving variable will be made primal feasible by rising to its lower bound, the resulting reduced cost must be positive to retain primal optimality, hence the corresponding dual variable must enter by rising from zero. If the entering primal variable will be decreasing from its upper bound, the current reduced cost must be negative, hence the corresponding dual variable must leave by rising to zero\footnote{% Properly accounting for these \textit{apparently} negative dual variables is the difficulty in trying to explain pivoting from the dual simplex perspective. In fact, negative dual variables are an artifact of running the dual simplex algorithm using representation and data structures appropriate for primal simplex with implicit bound constraints.}. The final columns simply illustrate that the sign of the pivot is well-defined from the update formula. \dylp provides a selection of tie-breaking strategies when there are multiple candidates with equal $\abs{\delta_{ik}} = \delta_{\mathrm{min}}$. The simplest is to select the first variable $x_k$ such that $\delta_{ik} = 0$. A slightly more sophisticated strategy is to scan all variables $x_k$ eligible to enter and pick $x_j$ such that $j = \arg \max_{k \in K} \abs{\overline{a}_{ik}}$, $K = \{ k \mid \abs{\delta_{ik}} = \delta_{\mathrm{min}} \}$; \dylp will use this strategy by default. \dylp also provides four additional strategies based on hyperplane alignment as described in \secref{sec:AntiDegenLite}. An option allows the tie-breaking strategy to be selected by the client. In case of degeneracy, the perturbed subproblem anti-degeneracy algorithm described in \secref{sec:PerturbedAntiDegeneracy} is also available. The client can control the use of perturbed subproblems through two options which specify whether a perturbed subproblem can be used, and how many consecutive degenerate pivots must occur before the perturbed subproblem is created. By default, \dylp uses perturbed subproblems aggressively and will introduce one when faced with a second consecutive degenerate pivot. \subsection{Generalised Dual Pivot} \label{sec:DualGenSelectInVar} Suppose that an entering dual variable $y_i$ has been chosen, and the ratio test of equation \eqnref{eq:AbstractDualPivot} has been used to select a leaving variable $y_j$ and determine the change $\delta_{ij}$ in $y_i$ required to drive $y_j = \overline{c}_j$ to zero. Generalised dual pivoting asks the question ``What happens when we push past this limit?'' Immediately, dual feasibility is lost as the value of $y_j$ changes sign. But $\ldots$ suppose that the corresponding nonbasic primal variable $x_j$ has both an upper and lower bound. If the value of this variable is changed to the opposite bound (`flipped'), the sign of $y_j$ is again correct with respect to the value of $x_j$ and dual feasibility is restored. Flipping $x_j$ will change the value of any basic primal variable $x_k$ where $\overline{a}_{kj} = \beta_k a_j \neq 0$. In particular, the value of $x_i$ will move toward feasibility. In terms of dual simplex, the reduced cost $\overline{b}_i = x_i$ of $y_i$ will be reduced. If $\overline{b}_i$ is not yet reduced to zero, $y_i$ can still be used as the entering dual variable (albeit with a less favourable reduced cost) and the ratio test can be repeated to determine a new leaving dual variable $y_{j'}$. Repeating this procedure will identify a maximum sequence of primal variable flips. The sequence ends for one of two reasons: \begin{itemize} \item The primal variable $x_{f}$ associated with a dual variable $y_f$ has only one finite bound and cannot be flipped. \item Flipping the primal variable $x_f$ will push $x_i$ over its bound and into feasibility. In dual simplex terms, $y_i$ will acquire an unfavourable reduced cost and will no longer be a suitable choice for the entering dual variable. \end{itemize} The dual variable $y_f$ corresponding to $x_f$ becomes the leaving dual variable. The dual basis pivot will have $y_f$ leaving and $y_i$ entering; the corresponding primal pivot has $x_i$ leaving and $x_f$ entering. This sequence of primal variable flips culminating in a final pivot is generalised dual pivoting. Note that it's possible to choose any variable within the maximum sequence of flips and use it as the pivot variable. \dylp implements generalised dual pivoting by first collecting the set of potential leaving dual variables $y_k$ (and associated entering primal variables $x_k$). This set is then sorted using nondecreasing value of $\abs{\delta_{ik}}$ and numerical stability of the pivot as the primary and secondary sort criteria. (Numerical stability is a binary condition for this purpose; a pivot is either acceptable or not.) The tertiary sort criterion varies according to whether $\delta_{ik} = 0$ or $\delta_{ik} \neq 0$. \begin{itemize} \item For variables with $\delta_{ik} = 0$, give preference to primal variables which can be flipped to their opposite bound. \item For variables with $\delta_{ik} \neq 0$, give preference to variables which cannot be flipped. \end{itemize} Any remaining ties are broken with a preference for pivot coefficients with better numerical stability (compared as an analog value). This final tie-breaking criterion is important when flipping a sequence of variables because numerical stability is relative to the largest coefficient value $\abs{\overline{a}_{iq}} = \max_k \abs{\overline{a}_{ik}}$ in a column. An unstable pivot has a small ratio $\abs{\overline{a}_{ik}/\overline{a}_{iq}}$; this implies a high probability that when $x_k$ is flipped, other basic primal variables (at the least, $x_q$) will incur large changes. Stability of primal variable values is thus improved by preferring large pivot coefficients. A nondegenerate dual pivot is clearly preferable to a degenerate pivot, and this motivates the preference for flippable variables within the set of candidates with $\delta_{ik} = 0$. Ideally, all variables in this group can be flipped; failing this, it's preferable to flip as many as possible. When consideration moves into the group of candidates with $\delta_{ik} \neq 0$, the goal changes. Quick selection of a good pivot will minimise further unpredictable changes to other dual reduced costs (primal basic variables). Since pivoting is the goal, it is reasonable to give preference to variables that must be pivoted. The process of scanning for candidates and sorting the resulting set is implemented in the routines \pgmid{scanForDualInCands} and \pgmid{dualcand_cmp}. The sorting procedure just described may result in an ordered list where one or more unflippable candidates $y_u$ with numerically unstable pivots $\overline{a}_{iu}$ precede the first candidate $y_s$ with a stable pivot $\overline{a}_{is}$. In this case, a final attempt is made to promote the candidate with a stable pivot so that it precedes the the unsuitable candidates $y_u$. From the sort criteria, it must be that $\abs{\delta_{is}} \geq \abs{\delta_{iu}}$. For a given variable $y_u$, if $\abs{y_u - \overline{a}_{iu} \delta_{is}}$ is less than the dual feasibilty tolerance, the resulting dual infeasibility will be tolerable and $y_s$ can be promoted over $y_u$. This promotion of a stable pivot over an unstable pivot is implemented in \pgmid{promoteSanePivot}. At the end of the above sort algorithm, the list of candidates is ordered so that it begins with a maximum sequence of flippable variables, followed by a variable which must be pivoted. The routine \pgmid{selectWithoutInf} scans the sorted list and selects the actual pivot variable according to the criteria specified above for a maximum sequence of flips and final pivot. \dylp implements one additional experimental capability within generalised dual pivoting. As mentioned above, flipping nonbasic primal variables will, in general, change the values of an arbitrary set of the basic primal variables. It is possible, but expensive, to track this change; the major cost is the calculation of $\overline{a}_k = B^{\,-1} a_k$ for each candidate column. With this information in hand, it is possible to locate, within the sequence of variables eligible to be flipped or pivoted, the point at which the maximum primal infeasibility is at a minimum over the basic variables; this variable becomes the pivot variable. This method of selecting the pivot variable is implemented in the routine \pgmid{selectWithInf}. Computational experience shows that using the minimum maximum primal infeasibility to choose the pivot variable $x_f$ is not a good strategy when dual simplex is behaving well. Dual simplex moves through a sequence of primal infeasible basic solutions. Observation of dual simplex in operation often shows a pattern where the values of primal variables grow increasingly infeasible and then, within a relatively few pivots, collapse to feasibility (hence optimality). Attempting to suppress the initial growth of primal infeasibility is counterproductive, lengthening the sequence of pivots required to attain optimality. However, very large infeasible primal values present challenges to numerical accuracy, so that it may be desirable in extreme cases to choose pivots with a goal of reducing primal infeasibility. \dylp by default implements a flexible strategy which normally chooses the maximum sequence of flips followed by a final pivot (\ie, the pivot is chosen to maximise the improvement in the dual objective). If it detects that the magnitude of the primal variables has grown to a point where numerical accuracy may be compromised, it will switch to choosing the pivot variable to minimise the maximum infeasibility over the primal variables. The strategy used for generalised dual pivoting is controlled by the same option used to choose between standard and generalised dual pivoting. The complete set of options is standard dual pivoting; generalised dual pivoting to maximise dual objective improvement; generalised dual pivoting to minimise maximum primal infeasibility; and the flexible generalised strategy used as the default. Antidegeneracy using perturbed subproblems is used with generalised dual pivoting. The alignment-based anti-degeneracy strategies are not implemented. DyLP-1.6.0/DyLP/doc/scaling.tex0000644000076700007670000000440111263240452013001 0ustar \section{Scaling} \label{sec:Scaling} \dylp provides the capability for row and column scaling of the original LP problem. This section develops the algebra used for scaling and describes some additional details of the implementation. The following section (\secref{sec:Solutions}) describes unscaling in the context of generating solution, ray, and tableau vectors for the client. Let $R$ be a diagonal matrix used to scale the rows of the LP problem and $S$ be a diagonal matrix used to scale the columns of the LP problem. The original problem \eqnref{Eqn:BoundedPrimal} is scaled as \begin{align*} \min \:(cS)(\inv{S}x) & \\ (RAS)(\inv{S}x) & \leq (Rb) \\ (\inv{S}l) \leq (\inv{S}x) & \leq (\inv{S}u) \intertext{to produce the scaled problem} \min \breve{c}\breve{x} & & \\ \breve{A}\breve{x} & \leq \breve{b} \\ \breve{l} \leq \breve{x} & \leq \breve{u} \\ \end{align*} where $\breve{A} = RAS$, $\breve{b} = Rb$, $\breve{c} = cS$, $\breve{l} = \inv{S}l$, $\breve{u} = \inv{S}u$, and $\breve{x} = \inv{S}x$. \dylp then treats the scaled problem as the original problem. By default, \dylp will calculate scaling matrices $R$ and $S$ and scale the constraint system unless the coefficients satisfy the conditions $.5 < \min_{ij} \abs{a_{ij}}$ and $\max_{ij} \abs{a_{ij}} < 2$. The client can forbid scaling entirely, or supply a pair of vectors that will be used as the diagonal coefficients of $R$ and $S$. A few additional details are helpful to understand the implementation. The first is that \dylp uses row scaling to convert `$\geq$' constraints to `$\leq$' constraints. Given a constraint system with `$\geq$' constraints, \dylp will generate scaling vectors with coefficients of $\pm 1.0$ even if scaling is otherwise forbidden. If scaling is active for numerical reasons, the relevant row scaling coefficients will be negated. \dylp scales the original constraint system before generating logical variables. Nonetheless, it is desirable to maintain a coefficient of 1.0 for each logical. The row scaling coefficient $r_{ii}$ for constraint $i$ is already determined. To keep the coefficients of logical variables at $1.0$, the column scaling factor is chosen to be $1/r_{ii}$ and the column scaling matrix $S$ is conceptually extended to include logical variables. DyLP-1.6.0/DyLP/doc/interface.tex0000644000076700007670000020650411263240452013331 0ustar \section{\dylp Interface} \label{sec:DylpInterface} This section describes the native interface for \dylp. In addition to the main routine, \pgmid{dylp}, routines are provided for access to the solution, including rays and tableau vectors; for pricing; for printing; and for a few miscellaneous services. Sections~\ref{sec:SimplexSolver}~--~\ref{sec:StartUpShutdownSummary} document the basic use of \dylp. Sections~\ref{sec:SolutionRoutines}~--~\ref{sec:UtilityRoutines} describe the routines used to access the solution, and the routines provided for pricing, printing, and miscellaneous services. Sections ~\ref{sec:LPProbSpec}~--~\ref{sec:DylpTolerances} describe the parameters, options, and tolerances provided by \dylp. For additional details on how to use \dylp, consult the comments in the source, particularly in \coderef{dylp.h}{} and \coderef{dy_setup.c}{}, and the example drivers supplied in the distribution. \dylp's native interface is peculiar to \dylp and a bit low-level in places. Many individuals will find it more convenient to use \dylp as an embedded component within the software infrastructure provided by the \coin project \cite{COIN}. For details of the \coin OSI layer for \dylp, OsiDylp, please consult the \textsc{Coin} documentation. An added advantage of this approach is that the OSI API provides a solver-independent interface. The underlying solver can be easily changed because the OSI layer insulates the client from the details of the solver's native interface. The \dylp distribution provides a simple C driver program using \dylp's native interface in the file \coderef{osi_dylp.c}{}. The command `\pgmid{osi_dylp -h}' will print a message describing the available command line options. \dylp assumes that the constraint system passed to it as a parameter \textit{does not} contain logical variables (\ie, slacks and artificials). On occasion, it must return values for logical variables; in such cases, it will use the negative of the index of the associated constraint. \subsection{Simplex Solver} \label{sec:SimplexSolver} \dylp is called as \begin{subrdoc} \item \subrhdr{lpret_enum dylp} {lpprob_struct *orig_lp, lpopts_struct *orig_opts, lptols_struct *orig_tols, \\ lpstats_struct *orig_stats} The \pgmid{orig_lp} structure (\secref{sec:LPProbSpec}) specifies the constraint system, control options, and (optionally) an initial basis and status vector and an initial active variable set. It is used to return the final status, primal and dual variable values, basis, and status vector, and (optionally) the active variables. The \pgmid{orig_opts} structure (\secref{sec:DylpOptions}) specifies option settings to control \dylp's actions. The \pgmid{orig_tols} structure (\secref{sec:DylpTolerances}) specifies numeric tolerances and related control information. The optional structure \pgmid{orig_stats} (\secref{sec:DylpStatistics}) can be used (in conjunction with conditionally compiled code) to return detailed statistics about \dylp's actions. \end{subrdoc} \subsection{Parameter Routines} \label{sec:ParameterRoutines} The normal sequence to establish parameter values for \dylp is as follows: \begin{enumerate} \item The client calls \pgmid{dy_defaults} to allocate option and tolerance structures and populate them with default values. The client can then adjust the parameters as desired. \item The client somehow establishes the original copy of the constraint system. Typically, this will be a call to a constraint system generator\footnote{% Consult the \pgmid{consys} documentation for information on how to use the routines in the \pgmid{consys} package to build a constraint system from scratch.}, or a call to a routine which will read an MPS file. \item The client calls \pgmid{dy_checkdefaults} to to set parameter values which are calculated based on properties of the constraint system, and to ensure that all parameters are within acceptable bounds. \end{enumerate} \begin{subrdoc} \item \subrhdr{void dy_defaults}% {lpopts_struct **opts, lptols_struct **tols} This routine will allocate an options structure \pgmid{opts} and a tolerance structure \pgmid{tols} and populate them with the standard default values for \dylp. Note that default values for some parameters are calculated in \pgmid{dy_checkdefaults} based on the size of the constraint system. \item \subrhdr{void dy_checkdefaults}% {consys_struct *sys, lpopts_struct *opts, lptols_struct *tols} This routine checks limits on parameter values and calculates values which depend on the size of the constraint system. User-supplied values are \textit{not} overridden unless they are outside of \dylp's bounds for the parameter. \item \subrhdr{void dy_setprintopts}% {int lvl, lpopts_struct *opts} This routine is provided purely for convenience; it will set all of \dylp's print levels based on the single value supplied for \pgmid{lvl}. Roughly, $\pgmid{lvl} = 0$ suppresses all output, $\pgmid{lvl} = 1$ establishes the default print levels, which allow messages about extraordinary events, and $\pgmid{lvl} \geq 2$ provides increasing amounts of information. Consult the code for details. \end{subrdoc} \subsection{Basis Package Initialisation} \label{sec:GLPKBasisInit} The \glpk basis package used in \dylp maintains static data structures that must be initialised before use and freed after use. For efficiency, it is useful to postpone initialisation until the size of the constraint system is known and can be used to estimate the size of the basis package's data structures, but \dylp will expand the basis structures if it detects that the constraint system has grown too large for the allocated capacity. Initialisation must occur before the first call to \pgmid{dylp}. The basis structures should be freed when they are no longer needed. \begin{subrdoc} \item \subrhdr{void dy_initbasis}% {int concnt, int factor_freq, double zero_tol} \pgmid{dy_initbasis} initialises the data structures used by the \glpk basis maintenance package. \pgmid{concnt} specifies the maximum allowable number of rows (constraints). \pgmid{factor_freq} is the maximum number of basis updates which can occur between each (re)factorisation of the basis. A conservative value will be a bit larger than the regular refactorisation interval; for \dylp, $\pgmid{lpopts.factor}+5$. The final parameter, \pgmid{zero_tol}, can be used to override \glpk's default zero tolerance if it is set to any value other than zero. Be sure you understand the ramifications of overriding the default. The routine sets several other parameters important to pivoting. Interested readers should consult the comments in the code (\coderef{dy_basis.c}{dy_initbasis}). \item \subrhdr{void dy_freebasis}{void} This routine will free the data structures allocated by the call to \pgmid{dy_initbasis}. \end{subrdoc} \subsection{Information and Error Messages} \label{sec:IOandErrorMsgs} \dylp uses private library packages for information and error messages\footnote{% This usage is historical, rooted in an ancient era when i/o was still a roll-your-own enterprise that differed dramatically from one operating system and programming environment to the next.}. The most visible value-added service provided by the libraries is integration of file and terminal output. Routines which generate output accept parameters to specify whether the output generated by a call should be sent to a file, to the terminal, both, or neither. The library packages must be initialised during startup. A brief explanation is provided here. \subheading[l]{Information Messages} The I/O library provides a convenient means to generate information messages. Information messages may use any of the standard C conversion specifications; the underlying print engine for the current implementation is \pgmid{vfprintf}. In addition to integrated file and terminal i/o, the library manages open file descriptors and coordinates activity with the error message library. See the code for examples of usage of the routines used to generate information messages (\pgmid{outchr}, \pgmid{outfmt}, and \pgmid{outfxd}). The simple driver in \coderef{osi_dylp.c}{} contains a fragment of code which uses the \pgmid{chgerrlog} routine to merge information and error messages in a single log file. Initialisation and shutdown of the error message package is accomplished with the routines \pgmid{ioinit} and \pgmid{ioterm}. \begin{subrdoc} \item \subrhdr{bool ioinit}{void} Initialises internal data structures. \item \subrhdr{void ioterm}{void} Cleans up and shuts down the i/o package. Note that \pgmid{ioterm} \textit{does not} close open streams. It is assumed that the client will close open streams as appropriate, and that remaining streams can be left open until closed by the operating system at program termination. \end{subrdoc} \subheading[l]{Error Messages} The error message library provides a convenient means to generate warning and error messages. Error messages may use any of the standard C conversion specifications; the underlying print engine for the current implementation is \pgmid{vfprintf}. The text of error messages reside in a file (\coderef{bonsaierrs.txt}{} in the \dylp distribution). Error messages are printed using the routines \pgmid{warn} and \pgmid{errmsg}. In calls to these routines, the error message is specified by a number. If an error message file cannot be located, a generic error message giving the error number will be produced. See the code for examples of usage of the routines used to generate warning (\pgmid{warn}) and error (\pgmid{errmsg}) messages. Initialisation and shutdown of the error message package is accomplished with the routines \pgmid{errinit} and \pgmid{errterm}. \begin{subrdoc} \item \subrhdr{void errinit}% {const char *emsgpath, const char *elogpath, bool errecho)} The parameter \pgmid{emsgpath} specifies the file containing the error messages. The parameter \pgmid{elogpath} specifies a file name to be used to log error messages; if null, error messages are not logged. The parameter \pgmid{errecho} should be set to true if error messages should be echoed to \pgmid{stderr}, false otherwise. \item \subrhdr{void errterm}{void} Cleans up and shuts down the error message package. In keeping with the behaviour of \pgmid{ioterm}, it is left to the client or operating system to close any error log file. \end{subrdoc} On startup, the error message package should be initialised first, followed by the i/o package. At termination, the i/o package should be shut down first. \subsection{Summary of \dylp Startup and Shutdown} \label{sec:StartUpShutdownSummary} Pulling together the information from the previous sections, the sequence of actions required to use \dylp is listed below. \begin{enumerate} \item Initialise the error message and i/o packages. Open log files for information and error messages (optional). \item Establish default parameter structures. Open and parse a file of \dylp option specifications (optional). \item Create a constraint system using a constraint generator or by reading an input file. Adjust options and tolerances to match the constraint system. At some point between creating the constraint system and calling \pgmid{dylp}, convert any `$\geq$' constraints to other forms. \item Initialise the basis package. \item Construct parameter structures and call \pgmid{dylp}. \item Process the answer, restoring `$\geq$' constraints and adjusting the answer appropriately, if the application demands it. \item Free data structures. This may require an additional call to \pgmid{dylp}, if the parameters given in the previous call instructed \dylp to retain internal data structures for efficient reoptimisation. It will certainly require calls to \pgmid{dy_freebasis}, \pgmid{dy_freesoln}, and \pgmid{consys_free}. \item Close files and shut down the i/o and error message packages. \end{enumerate} Consult the sample drivers provided with \dylp for example implementations. \subsection{Solution, Ray, and Tableau Routines} \label{sec:SolutionRoutines} \dylp's natural inclination is to return a compact version of the basis and the primal and dual solutions within the \pgmid{lpprob_struct} passed as the \pgmid{orig_lp} parameter to \pgmid{dylp}. This is not always convenient or sufficient for the client, so \dylp also provides a variety of routines to return individual components of the solution, rays (when present), and tableau vectors. \subheading[l]{Solution Routines} The following routines return the values of primal and dual variables and the status of primal variables. In all cases, if the client does not provide a vector for the result, a vector will be allocated. \begin{subrdoc} \item \subrhdr{void dy_colDuals}% {lpprob_struct *orig_lp, double **p_cbar, bool trueDuals} Returns the values of the dual variables associated with nonbasic primal variables, $\overline{c}^N = c^N - c^B B^{\,-1}N$, in column order. Put another way, the dual variables associated with architecturals at bound (tight implicit bound constraints) and logicals at bound (tight explicit constraints). If \pgmid{trueDuals} is false, the sign convention is that of the minimisation primal problem with implicit bounds solved by \dylp, hence the vector returned is precisely the reduced costs. If \pgmid{trueDuals} is true, the sign convention is that of the true dual problem with all implicit bound constraints made explicit, hence reduced costs corresponding to primal variables nonbasic at upper bound are negated to get the correct value for the dual variable. \item \subrhdr{void dy_rowDuals}% {lpprob_struct *orig_lp, double **p_y, bool trueDuals} Returns the values of the dual variables associated with the constraints, $y = c^B B^{\,-1}$, in row order. If \pgmid{trueDuals} is false, the sign convention is that of the minimisation primal problem solved by \dylp. If \pgmid{trueDuals} is true, the sign convention is that of the true dual problem. In either case, dual variables associated with `$\geq$' constraints are negated. (This convention is adopted so that $yA$ `just works' on a constraint system with a mix of `$\leq$' and `$\geq$' constraints.) \item \subrhdr{void dy_colPrimals}% {lpprob_struct *orig_lp, double **p_x} Returns the values of all primal variables, in column order. (See also \pgmid{dy_expandxopt}.) \item \subrhdr{void dy_rowPrimals}% {lpprob_struct *orig_lp, double **p_xB, int **p_indB} Returns the values of the basic primal variables, in row (basis) order. The indices of the variables are returned in \pgmid{p_indB}. The indices of basic logical variables are encoded as the negative of the index of the associated constraint. \item \subrhdr{void dy_logPrimals}% {lpprob_struct *orig_lp, double **p_logx} Returns the values of the primal logical variables, in row order. \item \subrhdr{void dy_colStatus}% {lpprob_struct *orig_lp, flags **p_colstat} Returns the status of all primal variables, in column order. Note that this routine returns the full range of status codes used by \dylp. \item \subrhdr{void dy_logStatus}% {lpprob_struct *orig_lp, flags **p_logstat} Returns the status of all logical variables, in row order. Note that this routine returns the full range of status codes used by \dylp. \item \subrhdr{bool dy_expandxopt}% {lpprob_struct *lp, double **p_xopt} This routine examines the \pgmid{lp} data structure and assembles the values of the basic and nonbasic primal variables into a single vector. (See also \pgmid{dy_colPrimals}.) \end{subrdoc} \subheading[l]{Ray Routines} This pair of routines return the rays emanating from the current primal or dual extreme point, when available, up to the number specified by the client. The number of rays returned will be less than or equal to the number requested. \dylp always returns a status code in the context of the primal problem. An indication of primal unbounded guarantees the existence of primal rays. An indication of primal infeasibility will \textit{almost always} indicate dual unboundedness, but keep in mind that it is possible for a problem to be both primal and dual infeasible. \begin{subrdoc} \item \subrhdr{bool dy_primalRays}% {lpprob_struct *orig_lp, int *p_numRays, double ***p_rays} Returns all primal rays emanating from the current extreme point, up to the limit specified by \pgmid{p_numRays}. On return, \pgmid{p_numRays} will be set to the number of rays actually returned, and each entry in \pgmid{p_rays} will point to a vector containing one ray with components in column order. If no vector is supplied for \pgmid{p_rays}, one will be allocated. Do not supply vectors for individual rays, these are allocated as needed. This routine should only be called when \dylp has found the problem to be primal unbounded. If the problem was solved to optimality or found to be primal infeasible, a warning will be issued but the routine will still return true. If the routine is called for any other result, it will print an error message and return false. \item \subrhdr{bool dy_dualRays}% {lpprob_struct *orig_lp, bool fullRay, int *p_numRays, double ***p_rays, \\ bool trueDuals} Returns all dual rays emanating from the current extreme point, up to the limit specified by \pgmid{p_numRays}. On return, \pgmid{p_numRays} will be set to the number of rays actually returned. If \pgmid{fullRay} is false, each ray is returned as an $m$-vector containing only the components associated with the row duals, in row order. If \pgmid{fullRay} is true, each ray is returned as an $(m+n$)-vector. The first $m$ entries contain the components associated with the row duals. The remaining $n$ entries contain the components associated with nonbasic primal variables (\ie, the ray components associated with tight implicit bounds). If no vector is supplied for \pgmid{p_rays}, one will be allocated. Do not supply vectors for individual rays, these are allocated as needed. If \pgmid{trueDuals} is false, the sign convention used is appropriate for a minimisation primal with implicit bounds (matching the values returned by \pgmid{dy_rowDuals} and \pgmid{dy_colDuals}). If \pgmid{trueDuals} is true, the sign convention used is appropriate for the true dual problem with all implicit bound constraints made explicit. In either case, duals associated with explicit `$\geq$' constraints are negated. This routine should only be called when \dylp has returned an indication that the problem is primal infeasible. As mentioned above, this will almost always correspond to dual unboundedness. If the problem was solved to optimality or found to be primal unbounded (hence dual infeasible), a warning will be issued but the routine will still return true. If the routine is called for any other result, it will print an error message and return false. \end{subrdoc} \subheading[l]{Tableau Routines} These four routines return rows and columns of the basis inverse and rows and columns of the constraint matrix multiplied by the basis inverse. \begin{subrdoc} \item \subrhdr{bool dy_abarj}% {lpprob_struct *orig_lp, int tgt_j, double **p_abarj} Returns $\overline{a}_j = B^{\,-1}a_j$ for a column $a_j$ of the constraint matrix. \item \subrhdr{bool dy_betaj}% {lpprob_struct *orig_lp, int tgt_j, double **p_betaj} Returns column $j$ of the basis inverse, $\overline{\beta}_j = B^{\,-1}e_j$. \item \subrhdr{bool dy_abari}% {lpprob_struct *orig_lp, int tgt_i, double **p_abari, double **p_betai} Returns $\overline{a}_i = a_i B^{\,-1}$ for a row $a_i$ of the constraint matrix. Since the routine actually calculates $\beta_i A$, it can return $\beta_i$ at no extra computational cost. If \pgmid{p_betai} is provided, it will be loaded with $\beta_i$ on return. \item \subrhdr{bool dy_betai}% {lpprob_struct *orig_lp, int tgt_i, double **p_betai} Returns row $i$ of the basis inverse, $\overline{\beta}_i = e_i B^{\,-1}$. \end{subrdoc} \subsection{Pricing Routines} \label{sec:PricingRoutines} \dylp provides two additional routines which are useful in a mixed-integer linear programming environment. \pgmid{dy_pricenbvars} will calculate the reduced cost for a specified set of nonbasic variables and \pgmid{dy_pricedualpiv} will calculate the cost of the first dual pivot (a generalised penalty calculation) given a specified set of candidate nonbasic variables. \begin{subrdoc} \item \subrhdr{bool dy_pricenbvars}% {lpprob_struct *orig_lp, flags priceme, \\ double **p_ocbar, int *p_nbcnt, int **p_nbvars} This routine calculates the reduced cost of nonbasic variables, tapping the \dylp data structures for active variables and calculating the reduced cost as needed for inactive variables. \pgmid{priceme} provides limited additional control by allowing the client to specify the status of the nonbasic variables that should be priced. For example, to price all variables that are nonbasic at their upper or lower bound, \pgmid{priceme} should be set to \pgmid{vstatNBUB|vstatNBLB}. Other nonbasic variables (fixed, free, or superbasic) will not be priced. (See the section on status codes in \coderef{dylp.h} for additional information.) The routine returns a compact list of \pgmid{p_nbcnt} indices of priced variables in \pgmid{p_nbvars}, with the corresponding reduced costs in \pgmid{p_ocbar}. The indices returned in \pgmid{p_nbvars} are the indices used in the original constraint system, which does not contain logical variables. Where nonbasic logical variables are present in the active system, they are identified in \pgmid{p_nbvars} by the negative of the index of the associated constraint. In particular, the values returned are appropriate for use as the \pgmid{nbcnt}, \pgmid{nbvars}, and \pgmid{cbar} parameters to \pgmid{dy_pricedualpiv}. \item \subrhdr{bool dy_pricedualpiv}% {lpprob_struct *orig_lp, int oxindx, double nubi, double xi, double nlbi, \\ int nbcnt, int *nbvars, double *cbar, double *p_upeni, double *p_dpeni} This routine calculates the cost of the first dual pivot associated with forcing the value of the basic variable $x_i$ down to a new upper bound $u_i$ (a down penalty) or up to a new lower bound $l_i$ (an up penalty). The up penalty is $\displaystyle \mathit{upen}_i = \min_k \left\lgroup -(l_i - x_i) \frac{\overline{c}_k}{\overline{a}_{ik}} \right\rgroup$ for $\{k \in N \mid \overline{a}_{ik} < 0 \wedge x_k < u_k \vee \overline{a}_{ik} > 0 \wedge x_k > l_k\}$. The down penalty is $\displaystyle \mathit{dpen}_i = \min_k \left\lgroup -(u_i - x_i) \frac{\overline{c}_k}{\overline{a}_{ik}}\right\rgroup$ for $\{k \in N \mid \overline{a}_{ik} > 0 \wedge x_k < u_k \vee \overline{a}_{ik} < 0 \wedge x_k > l_k\}$. To perform the standard penalty calculation for forcing a basic variable to an integral value, the new lower bound would be $\ceil{x_i}$ and the new upper bound would be $\floor{x_i}$. The basic variable $x_i$ can be an architectural or a logical variable. The routine is capable of pricing a pivot involving the logical variable for a constraint that is not currently active. \pgmid{oxindx} specifies the basic variable to be priced (a logical is specified as the negative of the index of the associated constraint). \pgmid{xi} is the current value of $x_i$ in the optimal solution to the LP. (In the case of the logical for an inactive constraint, the value is obtained by evaluating the constraint at the current solution.) \pgmid{nubi} is the new upper bound $u_i$, and \pgmid{nlbi} is the new lower bound $l_i$. It should be true that $\pgmid{nubi} \leq \pgmid{xi} \leq \pgmid{nlbi}$. \pgmid{nbcnt}, \pgmid{nbvars}, and \pgmid{cbar} are as described for \pgmid{dy_pricenbvars}. The up and down penalties will be returned in \pgmid{p_upeni} and \pgmid{p_dpeni}, respectively. \end{subrdoc} \subsection{Print Routines} \label{sec:PrintRoutines} There are three routines to supply strings for \dylp status, phase, and return codes, a routine to print the compact solution returned by \pgmid{dylp}, and a routine to print the contents of the statistics structure. \begin{subrdoc} \item \subrhdr{dy_dumpcompact}% {ioid chn, bool echo, lpprob_struct *soln, bool nbzeros} This routine prints the solution returned by \pgmid{dylp} in \pgmid{soln} using a human-readable format. Output is directed to the channel specified by \pgmid{chn}, and echoed to the terminal if \pgmid{echo} is true. Normally, nothing is printed for nonbasic variables with a value of zero; set \pgmid{nbzeros} to true to force them to be printed. \item \subrhdr{dy_dumpstats}% {ioid chn, bool echo, lpstats_struct *lpstats, consys_struct *orig_sys} This routine prints the contents of the \pgmid{lpstats} structure in a human-readable format. \pgmid{chn} and \pgmid{echo} are as for \pgmid{dy_dumpcompact}. \pgmid{orig_sys} should be the same constraint system referenced in the \pgmid{orig_lp} parameter to \pgmid{dylp} \item \subrhdr{dy_prtlpret}{lpret_enum lpret} Returns a pointer to a string for the return code specified in \pgmid{lpret}. \item \subrhdr{dy_prtlpphase}{dyphase_enum phase, bool abbrv} Returns a pointer to a string for the return code specified in \pgmid{phase}. If \pgmid{abbrv} is true, this will be a two-character abbreviation. \item \subrhdr{dy_prtvstat}{flags status} Returns a pointer to a static buffer containing a string representation of the status flags specified in \pgmid{status}. The buffer is overwritten at each call. \end{subrdoc} \subsection{Utility Routines} \label{sec:UtilityRoutines} And a final pair of utility routines. \begin{subrdoc} \item \subrhdr{bool dy_dupbasis}% {int dst_basissze, basis_struct **p_dst_basis, basis_struct *src_basis, \\ int dst_statussze, flags **p_dst_status, int src_statuslen, flags *src_status} This routine will duplicate the basis and status arrays. Data structures will be allocated as required if they are not supplied as parameters. \item \subrhdr{dy_freesoln}% {lpprob_struct *lpprob} This routine will free the data structures used to hold the LP solution, including data structures for the basis, status vector, primal and dual variable values, and the active variables vector. \end{subrdoc} \subsection{The LP Problem Specification} \label{sec:LPProbSpec} The structure \pgmid{lpprob_struct *orig_lp} is used to define the LP problem to \dylp and to return the answer to the client. It holds pointers to the constraint system, an active variable vector, a basis vector, a status vector, and vectors for the primal and dual variables, as well as fields for information and control. Each field is discussed below; for precise details, the reader should consult the file \coderef{dylp.h}{}. \begin{codedoc} \item\varhdr{actvars} A vector used to specify and/or return the set of active variables. The vector supplied as an input parameter will be overwritten on output. \begin{description}[\textbf{(o)}] \item[\textbf{(i)}] For a warm start, an initial set of active variables can be specified. This information will be used only if the \pgmid{lpctlACTVARSIN} flag is set in the \pgmid{ctlopts} field. For a cold or hot start, a vector can be provided to return the final set of active variables. \item[\textbf{(o)}] The final set of active variables. If no vector was supplied as an input parameter, \dylp will allocate one on output. Active variable information is returned only if the \pgmid{lpctlACTVARSOUT} flag is set when \dylp is called. Valid information is returned only if an optimal solution is found. If valid information is not returned, the \pgmid{lpctlACTVARSOUT} flag will be reset. \end{description} \item\varhdr{basis} A data structure for the LP basis. Because the set of active constraints at optimum will not, in general, include all constraints, the basis vector specifies the constraint and the primal variable in each basis position. \begin{description}[\textbf{(o)}] \item[\textbf{(i)}] For a warm start, an initial basis must be provided. For a cold or hot start, a structure can be provided to return the final basis. \item[\textbf{(o)}] The final basis. If no vector was supplied as an input parameter, \dylp will allocate one on output. \end{description} \item\varhdr{colsze} The allocated column capacity of the data structure. The \pgmid{status} and \pgmid{actvars} data structures, if provided by the client, must be capable of holding this many entries. If \pgmid{colsze} is insufficient to return the answer, \dylp will reallocate the data structures. \item\varhdr{consys} The constraint system, in the format described for the \consys constraint system subroutine library \cite{Haf98b}. \item\varhdr{ctlopts} A vector of flags used to specify optional actions and status. The current set of flags can be used to control allocation and deallocation of internal \dylp data structures (\pgmid{lpctlDYVALID}, \pgmid{lpctlNOFREE}, \pgmid{lpctlONLYFREE}), specify the presence of changes to the problem bounds (\pgmid{lpctlUBNDCHG}, \pgmid{lpctlLBNDCHG}, \pgmid{lpctlRHSCHG}) and objective (\pgmid{lpctlOBJCHG}), specify initial variable and/or constraint activation (\pgmid{lpctlINITACTVAR}, \pgmid{lpctlINITACTCON}), and specify the exchange of active variable information (\pgmid{lpctlACTVARSIN}, \pgmid{lpctlACTVARSOUT}). \item\varhdr{iters} The total number of simplex iterations. \item\varhdr{lpret} The return code from the simplex routine. If no errors occur, the code should be one of \pgmid{lpOPTIMAL} (optimal), \pgmid{lpINFEAS} (primal infeasible), or \pgmid{lpUNBOUNDED} (primal unbounded). Error returns include \pgmid{lpPUNT} (nonbasic variables exist with favourable reduced costs, but they cannot be pivoted due to unsuitable pivot coefficients), \pgmid{lpLOSTFEAS} (primal feasibility has been lost and \dylp has exceeded its limit on attempts to regain feasibility), \pgmid{lpSTALLED} (the limit on pivots without improvement in the objective has been exceeded, due to cycling or stalling), \pgmid{lpITERLIM} (a limit on pivots per phase or total pivots has been exceeded), \pgmid{lpACCCHK} (a numerical accuracy check has occurred), \pgmid{lpNOSPACE} (the \glpk basis routines could not acquire sufficient space to maintain the basis inverse), \pgmid{lpFATAL} (an unspecified fatal error has occurred), and \pgmid{lpINV} (\dylp aborted due to internal confusion). \item\varhdr{obj} For an optimal result, the value of the objective function. For an infeasible result, the total primal infeasibility. For an unbounded result, the index of the unbounded variable, negated if the variable can decrease without bound, positive if it can increase without bound. For any other return status, this field is undefined. \item\varhdr{phase} \begin{description}[\textbf{(o)}] \item[\textbf{(i)}] If the phase is set to \pgmid{dyDONE}, \dylp will assume that the only purpose of the call is to free internal data structures. Other values are ignored. \item[\textbf{(o)}] The termination phase of the dynamic simplex algorithm; should be \pgmid{dyDONE} unless an error has occurred, in which case it'll be \pgmid{dyINV}. \end{description} \item\varhdr{rowsze} The allocated row capacity of the data structure. The \pgmid{basis}, \pgmid{x}, and \pgmid{y} data structures, if provided by the client, must be capable of holding this many entries. If \pgmid{rowsze} is insufficient to return the answer, \dylp will reallocate the data structures. \item\varhdr{status} A data structure to hold the status of variables. For nonbasic variables, an entry is a \dylp status code (\pgmid{vstatNBFX}, \pgmid{vstatNBUB}, \pgmid{vstatNBLB}, or \pgmid{vstatNBFR}). For basic variables, an entry is the negative of the basis position. \begin{description}[\textbf{(o)}] \item[\textbf{(i)}] For a warm start, an initial status must be provided. For a cold or hot start, a structure can be provided to return the final status. \item[\textbf{(o)}] The final status vector. The value of nonbasic primal variables is returned through this vector. If no vector was supplied as an input parameter, \dylp will allocate one on output. \end{description} \item\varhdr{x} A data structure to hold the values of the basic primal variables. \begin{description}[\textbf{(o)}] \item[\textbf{(i)}] A structure can be provided to return the final values. \item[\textbf{(o)}] The values of the basic primal variables, indexed by basis position. If no vector was supplied as an input parameter, \dylp will allocate one on output. \end{description} \item\varhdr{y} A data structure to hold the values of the dual variables. \begin{description}[\textbf{(o)}] \item[\textbf{(i)}] A structure can be provided to return the final values. \item[\textbf{(o)}] The values of the dual variables, indexed by basis position. If no vector was supplied as an input parameter, \dylp will allocate one on output. \end{description} \end{codedoc} \subsection{\dylp Options} \label{sec:DylpOptions} \dylp is intended to be a flexible testbed, and as such has a large number of options. Many, in fact, have argued that it has entirely too many options. The author offers two observations in his own defense: \begin{itemize} \item All of them, at some point, were useful to him, and \item if you're not interested, ignore them all and let \dylp choose what it thinks are reasonable values. \end{itemize} If you look through the code, you may notice a few options that aren't documented here. By and large, this is because the best choice is clear and choices other than the current default give uniformly poor performance. Options are held internally in a \pgmid{lpopts_struct} structure. Each field is described briefly below, including default values. The reader is encouraged to consult \coderef{dylp.h}{} for details, and \coderef{dy_setup.c}{} to confirm that default values have not changed since this documentation was written. Most options can be set using commands read from an options file. This file is parsed by a simple command interpreter (contained in \coderef{cmdint.c}{}) and support routines in \coderef{dy_setup.c}{} and in the i/o library (\vid \secref{sec:IOandErrorMsgs}). If your application has some other way to acquire options from the user, all that's really necessary is a way to create and load a \pgmid{lpopts_struct} to pass as a parameter to \pgmid{dylp}. As described in \secref{sec:ParameterRoutines}, the routines \pgmid{dy_defaults} and \pgmid{dy_checkdefaults} will, respectively, initialise a \pgmid{lpopts_struct} with default values and adjust those values to match the constraint system. In the individual option descriptions which follow, the first line provides the syntax expected by the simple command interpreter mentioned above. information about acceptable values. Where applicable, for simple numeric parameters, the next line gives the lower bound, default value, and upper bound for the option in the notation $(\text{lower bound}) \leq (\text{default value}) \leq (\text{upper bound})$. The remainder of the entry describes the action of the option. \begin{codedoc} \item\Varhdr{active}{cons, vars} \bgroup \raggedright \kw{lpcontrol active} \bnflist[\raise2pt\hbox{\kw{,}}]{\nt{size-spec}} \kw{;} \\ \nt{size-spec} \bnfeq \kw{variables} \te{float} | \kw{constraints} \te{float} \egroup $0.0 \leq .25 \leq 1.0$ for both The values \pgmid{active.vars} and \pgmid{active.cons} specify the fraction of variables and constraints, respectively, which are expected to be active at any one time. The initial allocated capacity of the active constraint system data structure will be the specified fraction of the number of variables and constraints in the constraint system passed to \pgmid{dylp}. They do not represent limits --- the constraint system will be expanded as required. They are exposed for efficiency in the event that the client can provide a better estimate for the expected size of the active constraint system. Note that specifying $\pgmid{active.vars} = 1.0$ and $\pgmid{active.cons} = 1.0$ is \textit{not} the same as specifying that \dylp use the full constraint system (\cf \pgmid{fullsys}). The data structure for the active constraint system will be created with the capacity to hold the full constraint system, but constraint and variable activation and deactivation will proceed as usual. \item\varhdr{addvar} \kw{lpcontrol actvarlim} \te{integer} \kw{;} Limits the maximum number of variables which can be activated in any one execution of the variable activation phase. A value of 0 (the default) means that no limit is enforced. \item\varhdr{check} \kw{lpcontrol check} \te{integer} \kw{;} $1 \leq \pgmid{factor}/2 \leq \infty$ The nominal interval between accuracy checks, expressed in terms of the number of pivots which actually change the basis. Accuracy checks attempt to detect the accumulation of numerical inaccuracy, and \dylp will perform a check earlier if it suspects numerical problems. While there's no enforced upper limit on the number of pivots between accuracy checks, in practice an accuracy check is performed each time the basis is factored during simplex phases. \item\varhdr{coldvars} \kw{lpcontrol coldvars} \te{integer} \kw{;} $0 \leq 5000 \leq 100000$. When the number of active variables in the constraint system on a cold start exceeds \pgmid{coldvars}, and the client has not requested that \dylp work with the full constraint system, \dylp will attempt to deactivate variables before beginning simplex iterations. The upper limit is soft; \dylp will issue a warning if a higher value is requested, but will not enforce the limit. \item\varhdr{con}{actlvl, actlim, deactlvl} \begin{itemize} \item[\pgmid{con.actlvl}] \kw{lpcontrol actconlvl} \te{integer} \kw{;} Specifies the constraint activation strategy. There are two levels: \begin{description} \item[0 (strict)] Activate only constraints which are strictly violated. \item[1 (tight)] Activate constraints which are tight or strictly violated. \end{description} \item[\pgmid{con.actlim}] \kw{lpcontrol actconlim} \te{integer} \kw{;} Limits the maximum number of constraints which can be activated in any one execution of the constraint activation phase. A value of 0 (the default) means that no limit is enforced. \item[\pgmid{con.deactlvl}] \kw{lpcontrol deactconlvl} [\kw{normal}|\kw{aggressive}|\kw{fanatic}] \kw{;} Specifies the constraint deactivation strategy. There are three levels: \begin{description} \item[0 (\kw{normal})] Deactivate only inequalities which are strictly loose (\ie, the associated slack is basic and not at bound). \item[1 (\kw{aggressive})] (default) Deactivate loose inequalities and tight inequalities whose associated dual variable is zero. \item[2 (\kw{fanatic})] Deactivate loose inequalities and any tight constraint (inequality or equality) whose associated dual variable is zero. \end{description} \end{itemize} \item\varhdr{copyorigsys} \kw{lpcontrol forcecopy} \te{boolean} \kw{;} If set to true, \dylp will always make a local copy of the original system. By default, a local copy is made only when necessary. \dylp needs access to a copy of the original constraint system in order to scan it for constraints or variables that should be added. Normally this access is read-only, and \dylp uses the constraint system supplied as a parameter. When scaling is needed, \dylp makes a local copy of the original constraint system, applies scaling, and uses the scaled local copy as the original constraint system. \item\varhdr{degen} \kw{lpcontrol antidegen} \te{boolean} \kw{;} If set to false, \dylp will not use the perturbation-based anti-degeneracy algorithm described in \secref{sec:PerturbedAntiDegeneracy}. The default is to use perturbation-based anti-degeneracy. \item\varhdr{degenlite} \bgroup\raggedright \kw{lpcontrol degenlite} \\ \hfil [\kw{pivotabort}|\kw{pivot}|\kw{alignobj}| \kw{alignedge}|\kw{perpobj}|\kw{perpedge}] \kw{;} \egroup This option specifies the tie-breaking strategy used for choosing between candidates with equal deltas when selecting the leaving primal or dual variable, as described in~\secref{sec:AntiDegenLite}. The options are: \begin{description}[0 (\kw{pivotabort})] \item[0 (\kw{pivotabort})] Break ties using the magnitude of the pivot coefficient, and abort the search at the first basic variable which gives a delta of zero. \item[1 (\kw{pivot})] (default) Break ties using the magnitude of the pivot coefficient, scanning all basic variables. \item[2 (\kw{alignobj})] Break ties by choosing the leaving variable which will make tight the hyperplane most closely aligned with the normal of the objective function (\ie, the normal most nearly lies in the hyperplane). \item[3 (\kw{alignedge})] Break ties by choosing the leaving variable which will make tight the hyperplane most closely aligned with the direction of motion specified by the entering variable (\ie, the edge most nearly lies in the hyperplane). \item[4 (\kw{perpobj})] Break ties by choosing the leaving variable which will make tight the hyperplane most nearly perpendicular to the normal of the objective function (\ie, the hyperplane most nearly blocks motion in the direction of the normal of the objective) \item[5 (\kw{perpedge})] Break ties by choosing the leaving variable which will make tight the hyperplane most nearly perpendicular to the direction of motion specified by the entering variable (\ie, the hyperplane most nearly blocks motion in the direction of the edge). \end{description} \item\varhdr{degenpivlim} \kw{lpcontrol degenpivs} \te{boolean} \kw{;} $1 \leq 1 \leq \infty$ Limits the number of consecutive degenerate pivots which are required to trigger the perturbation-based anti-degeneracy algorithm. A perturbed subproblem is formed when the number of consecutive degenerate pivots exceeds \pgmid{degenpivlim}. The current default of 1 is very aggressive. \item\Varhdr{dpsel}{strat, flex, allownopiv} \kw{lpcontrol dualmultipiv} \te{integer} \kw{;} There are four dual pivoting strategies accessible from the \kw{dualmultipiv} command, specified by the following integer codes: \begin{description} \item[0] standard dual pivoting (\vid \secref{sec:DualStdSelectInVar}) \item[1] generalised dual pivoting (\vid \secref{sec:DualGenSelectInVar}); pivot chosen for maximum dual objective improvement \item[2] generalised dual pivoting; pivot chosen to mimimise the maximum infeasibility over primal variables \item[3] generalised dual pivoting; pivot chosen to minimise the maximum infeasibility over primal variables only if the infeasibility can be reduced; otherwise the pivot is chosen for maximum dual objective improvement \end{description} The pivoting strategy currently in use is held in \pgmid{dpsel.strat}. Two additional values are used to control generalised dual pivoting; these can only be changed under program control. \pgmid{dpsel.flex} defaults to true, allowing \dylp to move between strategies~1 and~3. If the client specifies a pivoting strategy using the \kw{dualmultipiv} command, \pgmid{dpsel.flex} is set to false. \pgmid{dpsel.allownopiv} controls whether \dylp will consider a generalised dual `pivot' which consists of a sequence of variable flips without a final pivot. Computational experience says that this is very prone to cycling and \pgmid{dpsel.allownopiv} is set to false by default. The default initial setting for the dual pivoting options is $\pgmid{dpsel.strat} = 1$, $\pgmid{dpsel.flex} = \pgmid{true}$, and $\pgmid{dpsel.allownopiv} = \pgmid{false}$. \item\varhdr{dualadd} \kw{lpcontrol dualacttype} \te{integer} \kw{;} This option controls the amount of effort that \dylp will expend attempting to add variables (dual constraints) to bound a constraint system which is dual unbounded (\vid \secref{sec:VariableActivation}). \begin{itemize} \item[0] Variable activation is not attempted. \item[1] Type~1 variables are activated. These are variables which could potentially bound the dual problem and which will be dual feasible if activated and placed in the nonbasic partition. Multiple variables of this type can be activated simultaneously. \item[2] Type~2 variables will be activated if there are no type~1 variables. Type~2 variables are variables which would be dual infeasible if placed in the nonbasic partition, but which can be activated and immediately pivoted into the basis to regain dual feasibility. Only one variable of this type can be activated at a time, so this level is computationally expensive. \item[3] (default) Type~3 variables will be activated if there are no type~1 or type~2 variables. Type~3 variables are variables which can be activated and placed in the nonbasic partition with a bound-to-bound pivot. \end{itemize} If the limits placed on dual variable activation do not allow the dual to be bounded \dylp will revert to primal simplex. Allowing up to type~3 activations by default is somewhat risky; limiting activations to type~1 would be a more conservative choice. \item\varhdr{factor} \kw{lpcontrol factor} \te{integer} \kw{;} $1 \leq 50 \leq 100$ The nominal interval for refactoring the basis, in terms of the number of pivots which actually change the basis. Put another way, \pgmid{factor} limits the total number of eta matrices in the multiplicative representation of the basis. As eta matrices accumulate, the work required to perform multiplication by the basis inverse increases, numerical inaccuracy increases, and the data structure grows (\vid \secref{sec:GLPKBasisInit}). This parameter attempts to balance these considerations against the work required to refactor the basis. \dylp will refactor earlier if it suspects numerical problems. The upper limit is soft; \dylp will issue a warning if a higher value is requested, but will not enforce the limit. \item\varhdr{finpurge}{vars, cons} \bgroup \raggedright \kw{lpcontrol final purge} \bnflist[\raise2pt\hbox{\kw{,}}]{\nt{purge-spec}} \kw{;} \\ \nt{purge-spec} \bnfeq [ \kw{variables}|\kw{constraints}] \te{boolean} \egroup Specifies whether \dylp should perform a final round of constraint and/or variable deactivation when the problem has been solved to optimality. By default, \dylp will perform a final round of constraint deactivation and a final round of variable deactivation before it returns. This application of constraint and/or variable deactivation is \textit{not} suppressed by the \pgmid{fullsys} option. \item\varhdr{forcecold} \kw{lpcontrol cold} \te{boolean} \kw{;} When set to true, this option will force \dylp to perform a cold start. \pgmid{forcecold} dominates \pgmid{forcewarm}. The absence of \pgmid{forcecold} and \pgmid{forcewarm} allows a hot start. \item\varhdr{forcewarm} \kw{lpcontrol warm} \te{boolean} \kw{;} When set to \pgmid{true}, this option will force \dylp to perform a warm start. The absence of \pgmid{forcecold} and \pgmid{forcewarm} allows a hot start. \item\varhdr{fullsys} \kw{lpcontrol fullsys} \te{boolean} \kw{;} When set to true, \pgmid{fullsys} forces the use of the full constraint system at all times. \dylp will load the entire constraint system at startup and no constraint or variable activation or deactivation will be performed. In the context of a branch-and-bound MIP code, where the bulk of the LPs are reoptimisations from a known basis, the use of dynamic simplex can save considerable work. To solve an LP once from scratch, or to solve the initial LP relaxation in a branch-and-bound context, use of the full system is usually (but not always) more efficient. \item\varhdr{groom} \kw{lpcontrol groom} [\kw{silent}|\kw{warn}|\kw{abort}] \kw{;} Specifies the action taken when \dylp detects a nontrivial change in the status of a variable when it performs a check following refactoring. The possible values are \begin{description} \item[0 (\kw{silent})] Do nothing. \item[1 (\kw{warn})] (default) Issue a warning message. \item[2 (\kw{abort})] Issue an error message and force an abort. \end{description} The working assumption is that refactoring the basis removed accumulated numerical inaccuracy, causing the change in the status of the variable. \item\Varhdr{heroics}{d2p, p2d} These parameters control whether \dylp will attempt difficult deactivations when trying to force a transition to dual or primal feasibility. \begin{description} \item[\pgmid{d2p}] If true, \dylp will attempt to deactivate primal infeasible basic architectural variables when trying to force primal feasibility. \item[\pgmid{p2d}] If true, \dylp will attempt to deactivate tight constraints (\ie, nonbasic logicals) when trying to force dual feasibility. \end{description} Both of these default to false. Computational experience says that setting them to true is not useful. They can be adjusted only under program control. \item\varhdr{idlelim} \kw{lpcontrol idle} \te{integer} \kw{;} $0 \leq 1000 \leq 2*(\pgmid{concnt}+\pgmid{archvcnt}) \le 50000 \leq 2^{\pgmid{sizeof(int)}-3}$ The limit on the number of pivots allowed without an improvement in the value of the objective function. A pivot in which the change in the objective function value is less than \pgmid{dy_tols.dchk} is defined to be an idle pivot. Too many consecutive idle pivots are taken as an indication that the LP has stalled and may be cycling. If the number of pivots without change in the objective exceeds \pgmid{idlelim}, \dylp aborts and returns \pgmid{lpSTALLED}. Left to its own devices, \dylp will enforce the inner limits of $1000 \leq \pgmid{idlelim} \leq 50000$; the client can explicitly specify any value within the outer limits. \item\varhdr{initbasis} \kw{lpcontrol coldbasis} [\kw{slack}|\kw{logical}|\kw{architectural}] \kw{;} This parameter specifies the type of initial basis constructed for a cold start, as described in \secref{sec:ColdStart}. \begin{description}[2 (\kw{architectural})] \item[1 (\kw{logical})] (default) Prefer slack, then artificial, variables for basic variables. Architectural variables will not be used. \item[1 (\kw{slack})] Prefer slack, then architectural, variables for basic variables. Artificial variables will be used if absolutely necessary. \item[2 (\kw{architectural})] Prefer architectural, then slack, variables for basic variables. Artificial variables will be used if absolutely necessary. \end{description} \item\Varhdr{initcons}{frac, i1lopen, i1l, i1uopen, i1u, i2lopen, i2l, i2uopen, i2u} \bgroup \raggedright \kw{lpcontrol load} [\nt{load-fraction}] \bnflist[\raise2pt\hbox{\kw{,}}]{\nt{interval}} \kw{;} \\ \nt{load-fraction} \bnfeq \te{float} \\ \nt{interval} \bnfeq \nt{open-delim} \nt{ub} \nt{lb} \nt{close-delim} \\ \nt{ub} \bnfeq \te{float} \\ \nt{lb} \bnfeq \te{float} \\ \nt{open-delim} \bnfeq \kw{(} | \kw{[} \\ \nt{close-delim} \bnfeq \kw{)} | \kw{]} \egroup These parameters control the loading of a partial constraint system during a cold start. As described in \secref{sec:ColdStart}, constraints are ranked by the angle formed by the constraint normal and the objective normal, and a specified fraction of one or two angular intervals is loaded. The parameter \pgmid{frac} specifies what fraction of the inequalities in the specified intervals will be loaded. The parameters \pgmid{i1l} and \pgmid{i1u} specify the upper and lower bounds of one interval. If \pgmid{i1lopen} is true, the lower boundary is open; if \pgmid{i1uopen} is true, the upper boundary is open. The parameters \pgmid{i2l}, \pgmid{i2u}, \pgmid{i2lopen}, and \pgmid{i2uopen} can be used to specify an optional second interval. A few examples will make the usage clear. By default, \dylp loads 50\% of all inequalities, with the exception of inequalities which form an angle of $\degs{90}$ with the objective. This is specified as \begin{flushleft} \kw{lpcontrol load .5 [180 90) (90 0] ;} \end{flushleft} To load 75\% of the inequalities with angles between $\degs{100}$ and $\degs{80}$, inclusive, the specification would be \begin{flushleft} \kw{lpcontrol load .75 [100 80] ;} \end{flushleft} Loading the complete constraint system with the specification \begin{flushleft} \kw{lpcontrol load 1.0 [180 0] ;} \end{flushleft} is \textit{not} equivalent to asking \dylp to always use the full constraint system (\cf \pgmid{fullsys}). It will look pretty much the same from the outside, but \dylp will spend time internally performing scans related to constraint and variable activation and deactivation. \item\varhdr{iterlim} \kw{lpcontrol iters} \te{integer} \kw{;} $0 \leq 10000 \leq 5*(\pgmid{concnt}+\pgmid{archvcnt}) \le 100000 \leq 2^{\pgmid{sizeof(int)}-3}$ The pivot limit for each occurrence of a simplex phase (primal phases~I and II and dual phase~II). The overall pivot limit, cumulative over all occurrences of all phases, is $3*\pgmid{iterlim}$. If either the per phase or total limit is exceeded, \dylp terminates the problem and returns \pgmid{lpITERLIM}. Left to its own devices, \dylp will enforce the inner limits of $10000 \leq \pgmid{iterlim} \leq 100000$; the client can explicitly specify any value within the outer limits. \item\varhdr{patch} \kw{lpcontrol patch} \te{boolean} \kw{;} If set to false, \dylp is forbidden from patching a singular basis. By default, \dylp will patch a singular basis and keep going. You really don't want to set this to false. \item\varhdr{ppsel} \kw{lpcontrol primmultipiv} \te{integer} \kw{;} There are two primal pivoting strategies accessible from the \kw{primmultipiv} command, specified by the following integer codes: \begin{description} \item[0] standard primal pivoting (\vid \secref{sec:PrimalStdSelectOutVar}) \item[1] (default) extended primal pivoting (\vid \secref{sec:PrimalGenSelectOutVar}) \end{description} The pivoting strategy currently in use is held in \pgmid{ppsel.strat}. \item\varhdr{print} \bgroup \raggedright \kw{lpprint} \nt{what} \te{integer} \kw{;} \\ \nt{what} \bnfeq \kw{basis}|\kw{conmgmt}|\kw{crash}|\kw{degen}|\kw{dual}| \kw{major}|\kw{phase1}|\kw{phase2}|\kw{pivoting}| \\ \hspace{8ex} \kw{pivreject}|\kw{pricing}|\kw{scaling}|\kw{setup}|\kw{varmgmt} \egroup The print options control the amount of output which \dylp produces as it runs. This can be varied from absolutely nothing to copious output useful only during detailed debugging. Printing options are covered in detail in \secref{sec:DylpDebugging}, which describes debugging options and capabilities. If \dylp is compiled with the compile-time constant \pgmid{NDEBUG} defined, virtually all informational printing is removed. \item\varhdr{scaling} \kw{lpcontrol scaling} \te{integer} \kw{;} Specifies how \dylp should scale the constraint system (\secref{sec:Scaling}). \begin{itemize} \item[0] \dylp is not allowed to apply scaling. \item[1] \dylp should use scaling vectors attached to the constraint system. \item[2] (default) \dylp should evaluate the constraint system and apply scaling if necessary. \end{itemize} \item\varhdr{scan} \kw{lpcontrol scan} \te{integer} \kw{;} $200 \le \pgmid{archvcnt}/2 \le 1000$. Specifies the minimum number of columns which will be scanned in primal simplex to select a new candidate entering variable. This parameter applies only when \pgmid{dy_primalin} is called to select the entering variable (\vid \secref{sec:PrimalStdSelectInVar}). \item\varhdr{usedual} \kw{lpcontrol usedual} \te{boolean} \kw{;} When set to false, this option prevents \dylp from using dual simplex. By default, \dylp will use dual simplex when possible. \end{codedoc} \subsection{\dylp Tolerances} \label{sec:DylpTolerances} \dylp has a number of numeric tolerances and related control information which are used in equality and accuracy checks and associated algorithms which attempt to control the accumulation of numerical accuracy. Each is described briefly below; again, the reader is encouraged to consult \coderef{dylp.h}{} for details. Several of the tolerances described below are dynamically adjusted by \dylp in response to its assessment of the numerical stability of the current basis. As a general rule, tread carefully when overriding \dylp's defaults, and please take the time to read the code comments and consider the interrelationships between the tolerances. \begin{codedoc} \item\varhdr{bogus} \kw{lpcontrol bogus} \te{double} \kw{;} Default: 1.0 The `bogus number' tolerance. Values such that $\pgmid{zero} < \abs{x} \le \pgmid{zero}*\pgmid{bogus}$ are considered likely to be the result of accumulated numerical inaccuracy, rather than legitimate values. Pivot coefficients and primal variable values within this range will trigger refactoring of the basis. For dual variables, the same test is applied, using the dual zero tolerance (\pgmid{cost}). The default value is $1.0$. Experience seems to show that for the majority of problems increasing this value will cause the basis to be refactored more often and will not improve performance or accuracy. It's better to rely on \dylp's accuracy checks to determine if the basis should be refactored before the normal refactor interval has passed. Increasing \pgmid{bogus} may be useful if scaling is disabled, or if \pgmid{factor} has been set to a very large value. \item\varhdr{cost} \kw{lpcontrol costz} \te{double} \kw{;} Default: $1.0\times10^{-11}$ The zero tolerance applied to values associated with the dual problem (dual variables and reduced costs). This tolerance may be tightened if \dylp scales the constraint system for numerical stability. Let $\psi = ((\max_{ij} \abs{a_{ij}})/(\min_{ij} \abs{a_{ij}}))^{1/2}$. Let $\psi_u$ be the value calculated for the unscaled matrix $A$ and $\psi_s$ be the value calculated for the scaled matrix $\breve{A}$. Let $s = \max (0, \floor{\log \psi_u/\psi_s + .5}-2$. The dual zero tolerance will be tightened by $10^{-s}$ (\ie, $\pgmid{cost} = \pgmid{cost} \times 10^{-s}$). In english, if scaling really did make a difference, so that the scaled matrix is significantly more stable than the unscaled matrix, \dylp should be extra careful about accuracy so that the scaled solution is still a solution after unscaling. \item\varhdr{dchk} \kw{lpcontrol dchk} \te{double} \kw{;} Default: $1.0 \times 10^{s-4}$, where $s = \max (0, \floor{\log \pgmid{archccnt} + .5}-2$ The dual accuracy check tolerance, as described in \secref{sec:AccuracyChecks}. The adjustment by $s$ progressively loosens the accuracy check tolerance for systems with more than $10^{2.5} \approx 300$ dual variables. In english, when there are many dual variables, accumulating numerical inaccuracy warrants some relaxation of the accuracy check tolerance. This adjustment is made in \coderef{}{dy_checkdefaults}. \item\varhdr{dfeas} The dual feasibility check tolerance, dynamically calculated using \pgmid{cost} as the base value, as described in \secref{sec:AccuracyChecks}. \item\varhdr{dfeas_scale} \kw{lpcontrol dfeas} \te{double} \kw{;} Default: $1.0 \times 10^{s+2}$, where $s = \max (0, \floor{\log \pgmid{archccnt} + .5}-2$ Decoupling multiplier for scaling \pgmid{dfeas}. This multiplier may be increased if the constraint system contains many dual variables or if the constraint system is scaled. The adjustment for a large number of dual variables is the same adjustment applied for \pgmid{dchk}. The adjustment for matrix scaling follows the adjustment described for \pgmid{cost}. Using the definitions for $\psi_u$ and $\psi_s$ given for \pgmid{cost}, $s = \max (0, \floor{\log \psi_u/\psi_s + .5}-1$ and \pgmid{dfeas_scale} will be increased by $10^s$. In english, the separation between the dual zero tolerance and the dual feasibility tolerance is increased to compensate for tightening the dual zero tolerance. \item\varhdr{inf} \kw{lpcontrol infinity} [\kw{IEEE}|\kw{DBL\_MAX}|\te{double}] \kw{;} Infinity. \dylp can work with an infinite or finite infinity. Default: \pgmid{HUGE_VAL} \pgmid{HUGE_VAL} will be IEEE 754 infinity on most modern systems. Many numerical programs still use that mathematical oxymoron, a finite infinity. Most commonly, this will be the value defined for the ANSI C symbol \coderef{float.h}{DBL_MAX}, the maximum representable value for type \pgmid{double}. Finite and infinite infinity do not play well together. If \dylp is being used by a client program which uses a finite infinity, set \pgmid{inf} to the client's value of infinity. \item\varhdr{pchk} \kw{lpcontrol pchk} \te{double} \kw{;} Default: $1.0 \times 10^{s-5}$, where $s = \max (0, \floor{\log \pgmid{archvcnt} + .5}-2$ The primal accuracy check tolerance, as described in \secref{sec:AccuracyChecks}. The adjustment by $s$ progressively loosens the accuracy check tolerance for systems with more than $10^{2.5} \approx 300$ variables. In english, when there are many variables, accumulating numerical inaccuracy warrants some relaxation of the accuracy check tolerance. This adjustment is made in \coderef{}{dy_checkdefaults}. \item\varhdr{pfeas} The primal feasibility check tolerance, dynamically calculated using \pgmid{zero} as the base value, as described in \secref{sec:AccuracyChecks}. \item\varhdr{pfeas_scale} \kw{lpcontrol pfeas} \te{double} \kw{;} Default: $1.0 \times 10^{s+2}$, where $s = \max (0, \floor{\log \pgmid{archvcnt} + .5}-2$ A decoupling multiplier used to adjust the separation of \pgmid{pfeas} and \pgmid{zero} as described in \secref{sec:AccuracyChecks}. This multiplier may be increased if the constraint system contains many variables or if the constraint system is scaled. The adjustment for a large number of variables, specified with the default value, is the same adjustment applied for \pgmid{pchk}. In english, when there are many variables, accumulating numerical inaccuracy warrants some relaxation of the feasibility tolerance. The adjustment for matrix scaling follows the adjustment described for \pgmid{zero}. Using the definitions for $\psi_u$ and $\psi_s$ given for \pgmid{zero}, $s = \max (0, \floor{\log \psi_u/\psi_s + .5}-1$ and \pgmid{pfeas_scale} will be increased by $10^s$. In english, the separation between the zero tolerance and the feasibility tolerance is increased to compensate for tightening the zero tolerance. \item\varhdr{pivot} \kw{lpcontrol pivot} \te{double} \kw{;} Default: $1.0 \times 10^-5$ The pivot selection multiplier. A pivot coefficient $\overline{a}_{ij}$ will be accepted as numerically stable in the primal algorithm if $\abs{\overline{a}_{ij}} \ge (\pgmid{pivot})(\pgmid{piv_tol})\norm[1]{\overline{a}_j}$, where \pgmid{piv_tol} is the stable pivot tolerance used during factoring in \glpk. In the dual algorithm, the 1-norm is calculated over the pivot row $\overline{a}_i$. The pivot selection multiplier may be reduced if \dylp finds itself at an extreme point where all potential pivots $x_i$, $x_j$ have been rejected because the pivot coefficients $\overline{a}_{ij}$ were judged numerically unstable (\vid \secref{sec:ErrorRecovery}). In english, if \pgmid{pivot} were set to 1, the pivot coefficient $\overline{a}_{ij}$ for every simplex pivot would have to satisfy the same stability criterion that the \glpk basis package applies when factoring the basis. This would be overly restrictive, however --- when executing simplex pivots, \dylp needs to choose the pivot row and column to maximise progress toward an optimal extreme point. Some compromise is necessary; the value of \pgmid{pivot} controls the balance between numerical stability and progress toward an optimal solution. When \dylp finds itself in a difficult spot, it will tilt the balance in order to make progress toward optimality. \item\varhdr{purge} \kw{lpcontrol purgecon} \te{double} \kw{;} Default: $1.0 \times 10^{-4}$ The required percentage change in the value of the objective function before constraint or variable deactivation is allowed. This should be strictly greater than zero in order to minimise the possibility of a cycle involving activation/deactivation of constraints or variables. \item\varhdr{purgevar} \kw{lpcontrol purgevar} \te{double} \kw{;} Default: .5 Used to calculate the variable deactivation threshold as a percentage of the maximum unfavourable reduced costs, as described in \secref{sec:VariableDeactivation}. \item\varhdr{reframe} \kw{lpcontrol reframe} \te{double} \kw{;} Default: .1 The percentage error in the updated column or row norms which is required to trigger a reset of the PSE reference frame or the DSE row norms, respectively. A relatively large error can be tolerated here. The consequence of inaccuracy, a chance of a suboptimal choice of primal entering or dual leaving variable, is not too serious. In contrast, for the dual the computational cost of recalculating the basis inverse row norms $\norm{\beta_k}$ is high. For the primal, all column norms are reset to 1, effectively reverting to unscaled (`Dantzig') pricing. \item\varhdr{swing} \kw{lpcontrol swing} \te{double} \kw{;} Default: $1.0 \times 10^{15}$ This tolerance is used to detect excessive change in the values of the primal variables. The magnitude of the value prior to a pivot is compared to the magnitude after the pivot. If the ratio exceeds the value of \pgmid{swing}, the simplex phase will abort and \dylp will attempt to bound the primal swing (\vid \secref{sec:ErrorRecovery}). \item\varhdr{toobig} Default: $1.0\times 10^{30}$. This value is used to control changes in the dual multipivot strategy. The breakpoints are currently hardcoded in \coderef{dy_dualmultipivot}{dualmultiin} (which see). \item\varhdr{zero} \kw{lpcontrol zero} \te{double} \kw{;} Default: $1.0\times 10^{-11}$. The zero tolerance. Values smaller than $\abs{\pgmid{zero}}$ are set to a clean floating-point zero. This tolerance may be tightened if \dylp scales the constraint matrix for numerical stability. Let $\psi = ((\max_{ij} \abs{a_{ij}})/(\min_{ij} \abs{a_{ij}}))^{1/2}$. Let $\psi_u$ be the value calculated for the unscaled matrix $A$ and $\psi_s$ be the value calculated for the scaled matrix $\breve{A}$. Let $s = \max (0, \floor{\log \psi_u/\psi_s + .5}-2$. The zero tolerance will be tightened by $10^{-s}$ (\ie, $\pgmid{zero} = \pgmid{zero} \times 10^{-s}$). In english, if scaling really did make a difference, so that the scaled matrix is significantly more stable than the unscaled matrix, \dylp should be extra careful about accuracy so that the scaled solution is still a solution after unscaling. \end{codedoc} DyLP-1.6.0/DyLP/doc/accuracy.tex0000644000076700007670000001001411263240452013150 0ustar \section{Accuracy Checks and Maintenance} \label{sec:AccuracyChecks} Primal and dual accuracy checks, primal and dual feasibility checks, and factoring of the basis can be requested through the routine \pgmid{dy_accchk}; each action can be requested separately. \dylp refactors the basis and performs accuracy checks at regular intervals, based on a count of pivots which actually change the basis. By default, primal and dual accuracy checks are performed at twice this frequency. During phase II of the primal and dual simplex algorithms, the appropriate feasibility check is performed following each accuracy check. \pgmid{dy_duenna} tracks the pivot count and requests checks and factoring at the scheduled intervals. \pgmid{dy_accchk} uses \pgmid{dy_factor} to factor the basis and recalculate the primal and dual variables. When the basis has been factored and has passed the accuracy checks, the routine \pgmid{groombasis} checks that the status of the basic variables matches their values and makes any necessary adjustments. Failure of an accuracy check will cause the basis to be refactored. Failure of an accuracy check immediately after refactoring will cause the current pivot selection tolerances to be tightened by one increment before another attempt is made. \pgmid{dy_accchk} will repeat this cycle until the accuracy checks are satisfied or there's no more room to tighten the pivot selection parameters. On the other hand, each time that an accuracy check is passed without refactoring the basis, the current pivot selection tolerances are loosened by one increment, to a floor given by the minimum pivot selection tolerance. The minimum pivot selection tolerance is reset to the loosest possible setting at the start of each simplex phase. If \pgmid{groombasis} detects and corrects major status errors (indicating that an unacceptable amount of inaccuracy accumulated since the basis was last factored), it will raise the minimum pivot selection tolerance. Similarly, if the primal phase~I objective is found to be incorrect, or primal or dual feasibility is lost when attempting to verify an optimal solution, the current and minimum pivot selection tolerances will be raised before returning to simplex pivots. Raising the minimum pivot selection tolerance provides long-term control (for the duration of a simplex phase) over reduction in the current pivot selection tolerance. The primal accuracy check is $B x^B = b - N x^N$. Comparisons are made against the scaled tolerance $\norm[1]{b}(\pgmid{dy_tols.pchk})$. To pass the primal accuracy check, it must be that \begin{equation*} \norm[1]{(b - N x^N) - B x^B} \leq \norm[1]{b}(\pgmid{dy\_tols.pchk}) \end{equation*} The dual accuracy check is $y B = c^B$. Comparisons are made against the scaled tolerance $\norm[1]{c}(\pgmid{dy_tols.dchk})$. To pass the dual accuracy check, it must be that \begin{equation*} \norm[1]{c^B - y B} \leq \norm[1]{c}(\pgmid{dy\_tols.dchk}) \end{equation*} The primal feasibility check is $l \leq x \leq u$. For each variable, it must be true that $x_j \geq l_j - (\pgmid{dy_tols.pfeas}) (1 + \abs{l_j})$ and $x_j \leq u_j + (\pgmid{dy_tols.pfeas}) (1 + \abs{u_j})$. In the implementation, only the basic variables are actually tested; nonbasic variables are assumed to be within bound as an invariant property of the simplex algorithm. $\pgmid{dy_tols.pfeas}$ is scaled from \pgmid{dy_tols.zero} as \begin{equation*} \pgmid{dy\_tols.pfeas} = \min ( 1, \log \left( \frac{\norm[1]{x_B}}{\sqrt{m}} \right)) (\pgmid{dy\_tols.zero})(\pgmid{dy_tols.pfeas_scale}). \end{equation*} The dual feasibility check is $\overline{c} = c^N - y N$ of appropriate sign. For each variable, it must be true that $\overline{c}_j \leq \pgmid{dy_tols.dfeas}$ for $x_j$ nonbasic at $u_j$ and $\overline{c}_j \geq -\pgmid{dy_tols.dfeas}$ for $x_j$ nonbasic at $l_j$. $\pgmid{dy_tols.dfeas}$ is scaled from \pgmid{dy_tols.cost} as \begin{equation*} \pgmid{dy\_tols.dfeas} = \min ( 1, \log \left( \frac{\norm[1]{y_k}}{\sqrt{m}} \right)) (\pgmid{dy\_tols.cost})(\pgmid{dy_tols.dfeas_scale}). \end{equation*} DyLP-1.6.0/DyLP/doc/updateformulae.tex0000644000076700007670000000752311171477034014414 0ustar \section{Updating Formul\ae} \label{sec:UpdatingFormulas} For purposes of the updating formul\ae, the distinction between original variables $x$ and slack variables $s$ is not important. For simplicity, $x_k$ is used to represent both original variables and slack variables in this section. In the same vein, $c^B$ and $c^N$ will denote $\begin{bmatrix} c^B & 0 \end{bmatrix}$ and $\begin{bmatrix} c^N & 0 \end{bmatrix}$, respectively. \subsection{Basis Updates} \label{sec:BasisUpdates} While these formul\ae{} are not applied directly to update the basis, they are useful in deriving update formul\ae{} for other values. Suppose that $x_i$ will leave basis position $k$ and be replaced by $x_j$. The new basis $B'$ can be expressed as $B' = B - a_i e_k + a_j e_k$. Premultiplying by $B^{\,-1}$ and postmultiplying by $(B')^{\,-1}$, we have \begin{align} \begin{split}\label{Eqn:BasisUpdate} B^{\,-1}B'(B')^{\,-1} & = B^{\,-1}B(B')^{\,-1} - B^{\,-1}a_i e_k(B')^{\,-1} + B^{\,-1}a_j e_k(B')^{\,-1} \\ B^{\,-1} & = (B')^{\,-1} - \overline{a}_i \beta'_k + \overline{a}_j \beta'_k \\ (B')^{\,-1} & = B^{\,-1} + \overline{a}_i \beta'_k - \overline{a}_j \beta'_k \\ \end{split} \end{align} Since $x_i$ was basic, $\overline{a}_i = e_k$. This gives \begin{equation*} (B')^{\,-1} = B^{\,-1} + e_k\beta'_k - \overline{a}_{j} \beta'_k. \end{equation*} Premultiplying by $e_l$ to obtain an update formula for row $l$, we have \begin{align} \begin{alignedat}{2} \beta'_l & = \beta_l - \frac{\overline{a}_{lj}}{\overline{a}_{kj}}\beta_k & \qquad l \neq k & \\ \beta'_k & = \frac{1}{\overline{a}_{kj}}\beta_k \end{alignedat} \label{Eqn:betaupdate} \end{align} \subsection{Primal Variable Updates} Updating the primal variables is straightforward and follows directly from \eqref{Eqn:PrimalBasicVars}. Both primal and dual pivots calculate the change in the entering primal variable, $\Delta_j$. The entering variable $x_j$ is set to $u_j+\Delta_j$ or $l_j+\Delta_j$, for $x_j$ entering from its upper or lower bound, respectively. The leaving variable $x_i$ is set to $u_i$ or $l_i$, for $x_i$ leaving at its upper or lower bound, respectively. The remaining basic variables $x_k$, $k \neq i$, are updated according to the formula \begin{equation*} x_k = \overline{b}_k - \overline{a}_{kj}\Delta_j. \end{equation*} \subsection{Dual Variable Updates} \label{sec:DualUpdates} Updating the dual variables is simple in the final implementation, but a little work is necessary to derive the updating formula. The difficulty lies in the fact that the dual variables of interest are $y = \begin{bmatrix} y^\mathcal{B} & y^\mathcal{N} \end{bmatrix}$, \ie, a mixture of basic and nonbasic dual variables. Direct application of \eqref{Eqn:DualBasicVars} is not possible. Assume that the leaving variable $x_i$ occupies row $k$ in the basis $B$. The new vector of basic costs, $(c')^B$, can be expressed as $(c')^B = c^B - [0 \ldots c_i \ldots 0] + [0 \ldots c_j \ldots 0]$, where $c_i$ and $c_j$ occur in the $k$\textsuperscript{th} position. From \eqnref{Eqn:BasisUpdate}, it is easy to show $B(B')^{-1} = I + a_i(\beta')_k - a_j(\beta')_k$. We can proceed to derive the update formul\ae{} for $y$ as follows: \begin{align*} y' & = (c')^B (B')^{-1} \\ & = c^B B^{\,-1} B (B')^{-1} - c_i(\beta')_k + c_j(\beta')_k \\ & = y(I + a_i(\beta')_k - a_j(\beta')_k) - c_i(\beta')_k + c_j(\beta')_k \\ & = y + (c_j - y a_j)(\beta')_k - (c_i - y a_i)(\beta')_k . \\ % \intertext{Recognising that $\overline{c}_j = c_j - y a_j$ is the reduced cost of $x_j$ before the basis change, and noting that $\overline{c}_i = c_i - y a_i = 0$ since $x_i$ was basic, we have} % y' & = y + \overline{c}_j(\beta')_k . \\ % \intertext{As a further observation, note that $(\beta')_k = \beta_k/\overline{a}_{kj}$, so we can update $y$ using a row of $B^{\,-1}$ as} % y' & = y + \overline{c}_j\beta_k/\overline{a}_{kj}. \end{align*} DyLP-1.6.0/DyLP/doc/primal.tex0000644000076700007670000004676711171477034012700 0ustar \section{Primal Simplex} \label{sec:PrimalSimplex} The primal simplex implementation in \dylp is a two-phase algorithm. \dylp will choose primal simplex phase~II whenever the current basic solution is primal feasible but not dual feasible. It will choose primal simplex phase~I when the current basic solution is neither primal or dual feasible. The primary role of primal simplex in \dylp is to reoptimise following the addition of variables. Since primal phase~I requires neither primal or dual feasibility, it is the fallback simplex. The primal simplex implementation incorporates projected steepest edge (PSE) pricing (\secref{sec:PSEPricing}), standard (\secref{sec:PrimalStdSelectOutVar}) and generalised (\secref{sec:PrimalGenSelectOutVar}) pivoting, and perturbation-based (\secref{sec:PerturbedAntiDegeneracy}) and alignment-based (\secref{sec:AntiDegenLite}) antidegeneracy algorithms. Figure \ref{fig:PrimalCallGraph} shows the call structure of the primal simplex implementation. \begin{figure}[htb] \centering \includegraphics{\figures/primalcalls} \caption{Call Graph for Primal Simplex} \label{fig:PrimalCallGraph} \end{figure} \subsection{Primal Top Level} Primal simplex is executed when the dynamic simplex state machine enters one of the states \pgmid{dyPRIMAL1} or \pgmid{dyPRIMAL2}. If required, the PSE reference frame is initialised to the nonbasic variables and the projected column norms are initialised to one (\vid \secref{sec:PSEPricing}), and the primal simplex routine \pgmid{dy_primal} is called. \pgmid{dy_primal} controls the use of phase~I (\pgmid{primal1}) and phase~II (\pgmid{primal2}) of the primal simplex algorithm. The primary purpose of \pgmid{dy_primal} is to provide a loop which allows a limited number (currently hardwired to 10) of reversions to phase~I if primal feasibility is lost during phase II. Loss of primal feasibility is treated as a numeric accuracy problem; with each such reversion the minimum pivot selection tolerances are tightened by one step. To maintain primal feasibility when repairing a singular basis (\secref{sec:BasisFactoring}) in primal phase~II, superbasic variables may be created. Superbasic variables will not normally be created during phase~I and the code assumes that it will not encounter them\footnote{% More strongly, superbasic variables are introduced only in primal phase~II for the purpose of maintaining feasibility during repair of a singular basis. They will appear outside of \pgmid{primal2} only if the problem is unbounded or if \pgmid{primal2} terminates with an error condition.}. Rarely, a sequence of errors during phase~II will cause \dylp to lose primal feasibility and revert to phase~I with superbasic variables still present in the nonbasic partition. The routine \pgmid{forcesuperbasic} is called to ensure that any superbasic variables are forced to bound in such a phase~II to phase~I transition. \subsection{Primal Phase I} \label{sec:PrimalPhaseI} The overall flow of phase I of the primal simplex is shown in Figure \ref{fig:PrimalPhaseIFlow}. \begin{figure}[htbp] \centering \resizebox{\linewidth}{!}{\includegraphics{\figures/primal1flow}} \caption{Primal Phase I Algorithm Flow} \label{fig:PrimalPhaseIFlow} \end{figure} The body of the routine is structured as two nested loops. The outer loop handles startup and termination, and the inner loop handles the majority of routine pivots. A pivot iteration in phase~I normally consists of three steps: the actual pivot and variable updates, routine maintenance checks, and revision of the objective. A dynamically modified artificial objective is used to guide pivoting to feasibility during phase~I\@. The (minimisation) coefficients assigned to variables are -1 for variables below their bound, 0 for variables within bounds, and +1 for variables above their bound. On entry to phase~I, \pgmid{dy_initp1obj} forms a working set containing all infeasible variables, constructs the corresponding objective, swaps out the original objective, and installs the phase~I objective. Once the phase~I objective has been constructed, the outer loop is entered and \pgmid{dy_primalin} is called to select the initial entering variable. Then the inner loop is entered and \pgmid{dy_primalpivot} is called to perform the pivot. \pgmid{dy_primalpivot} (\vid \secref{sec:PrimalPivoting}) will choose a leaving variable (\pgmid{primalout}), pivot the basis (\pgmid{dy_pivot}), update the primal and dual variables (\pgmid{primalupdate}), and update the PSE pricing information and reduced costs (\pgmid{pseupdate}). For a routine pivot, \pgmid{pseupdate} will also select an entering variable for the next pivot. \pgmid{dy_duenna} evaluates the outcome of the pivot, handles error detection and recovery where possible, and performs the routine maintenance activities of accuracy checks and refactoring of the basis. As the final step in a routine pivot, \pgmid{tweakp1obj} scans the working set and removes any newly feasible variables. The objective function is adjusted to reflect any changes and reduced costs and dual variables are adjusted or recalculated as required. If there are no problems, the pivoting loop iterates, using the leaving variable selected in \pgmid{pseupdate}. The loop continues until primal feasibility is reached, the problem is determined to be infeasible, or an exception or fatal error occurs. When the working set becomes empty, \pgmid{tweakp1obj} will give a preliminary indication of primal feasibility. If \pgmid{verifyp1obj} confirms that all variables are primal feasible, the pivoting loop will end. If accumulated numerical inaccuracy has caused previously feasible variables to become infeasible, the pivot selection parameters will be tightened, \pgmid{dy_initp1obj} will be called to build a new working set and objective, and pivoting will resume. Changes to the objective coefficients may make it necessary to select a new entering variable. This situation arises when a variable gains feasibility but remains basic, as changing an entry of $c^B$ can potentially affect all reduced costs\footnote{% Less commonly, the problem arises because the newly feasible leaving variable of the just-completed pivot has been selected to reenter. The objective coefficient for this variable is incorrect when it is used by \pgmid{pseupdate}.}. The variable selected in \pgmid{pseupdate} may no longer be the best (or even a good) choice. The flow of control is redirected to the outer loop, where \pgmid{dy_primalin} will be called to select an entering variable. It can happen that no entering variable is selected by \pgmid{pseupdate} for use in the next iteration. Here, too, control flow is redirected to \pgmid{dy_primalin}. The single most common reason in primal simplex is a bound-to-bound `pivot' of a nonbasic variable --- since there is no basis change, \pgmid{pseupdate} is not called. Another common reason for failure to select an entering variable is that all candidates were previously flagged as unsuitable pivots. In this case, \pgmid{dy_primalin} will indicate a `punt' and \pgmid{dy_dealWithPunt} will be called to reevaluate the flagged variables. If it is able to make new candidates available, control returns to \pgmid{dy_primalin} for another attempt to find an entering variable. If all flagged variables remain unsuitable, control flow moves to the preoptimality actions with an indication that primal phase~I has punted. If the current pivot is aborted due to numerical problems (an unsuitable pivot coefficient being the most common of these), \pgmid{pseupdate} is not executed. Once \pgmid{dy_duenna} has taken the necessary corrective action, the flow of control moves to the outer loop and \pgmid{dy_primalin}. When \pgmid{dy_primalin} indicates optimality, \pgmid{dy_primalpivot} indicates optimality or unboundedness, or \pgmid{tweakp1obj} indicates primal feasibility, the inner pivoting loop ends and \pgmid{verifyp1obj} is called to verify feasibility. If feasibility is confirmed, \pgmid{preoptimality} is called to refactor the basis, perform accuracy checks, and confirm primal and dual feasibility. If there are no surprises, primal phase I terminates with an indication of optimality (primal feasibility), unboundedness, or primal infeasibility. In any event, if \pgmid{preoptimality} reports that the solution is primal feasible, phase~I will end with an indication of optimality even if it was not expected from the pivot loop termination condition. If a primal feasible solution has been found, the original objective will be restored before returning from \pgmid{primal1}. The transition to phase~II entails calculating the objective, dual variables, and reduced costs for the original objective. If the problem is infeasible or unbounded, the phase~I objective is left in place and \dylp will use it as it attempts to activate variables or constraints to deal with the problem (\secref{sec:ErrorRecovery}). Loss of primal feasibility can occur when the basis is factored during the preoptimality checks. The pivot selection parameters are tightened and pivoting resumes. Loss of dual feasibility is considered only when it is accompanied by lack of primal feasibility (\ie, a false indication of infeasibility). Loss of dual feasibility can occur for two distinct reasons. In the less common case, loss of dual feasibility stems from loss of numeric accuracy. The pivot selection rules are tightened and pivoting resumes. The more common reason for apparent loss of dual feasibility at the termination of phase~I primal simplex is that it is ending with a punt, as described above. The variables flagged as unsuitable for pivoting are not dual feasible, and when the flags are removed to perform the preoptimality checks, dual feasibility is revealed as an illusion. No further action is possible within primal simplex; the reader is again referred to \secref{sec:ErrorRecovery}. When the number of false indications of optimality exceeds a hard-coded limit (currently 15), primal simplex terminates with a fatal error. Other errors also result in termination of the primal simplex algorithm, and ultimately in an error return from \dylp. \subsection{Primal Phase II} \label{sec:PrimalPhaseII} The overall flow of phase~II of the primal simplex is shown in Figure \ref{fig:PrimalPhaseIIFlow}. \begin{figure}[htbp] \centering \resizebox{\linewidth}{!}{\includegraphics{\figures/primal2flow}} \caption{Primal Phase II Algorithm Flow} \label{fig:PrimalPhaseIIFlow} \end{figure} The major differences from phase~I are that the problem is know to be feasible and the original objective function is used instead of an artificial objective function. This considerably simplifies the flow of \pgmid{primal2}. The inner pivoting loop has only two steps: the pivot itself (\pgmid{dy_primalpivot}) and the maintenance and error recovery functions (\pgmid{dy_duenna}). When \pgmid{dy_primalin} indicates optimality or \pgmid{dy_primalpivot} indicates optimality or unboundedness the inner loop ends and \pgmid{preoptimality} is called for confirmation. \pgmid{preoptimality} will refactor the basis, perform accuracy checks, recompute the primal and dual variables, and confirm primal and dual feasibility. If there are no surprises, primal phase~II will end with an indication of optimality or unboundedness. Loss of dual feasibility (including punts) is handled as described for primal phase~I. Loss of primal feasibility causes \pgmid{primal2} to return with an indication that it has lost primal feasibility, and \pgmid{dy_primal} will arrange a return to primal phase~I\@. \subsection{Pivoting} \label{sec:PrimalPivoting} \dylp offers two flavours of primal pivoting: A standard primal pivot algorithm in which a single primal variable is selected and pivoted into the basis, and an extended primal pivot algorithm which allows somewhat greater flexibility in the choice of leaving variable. By default, \dylp will use the extended algorithm. Figure~\ref{fig:PrimalPivotCallGraph} shows the call structure of the primal pivot algorithm. The routine \pgmid{primalout} implements standard primal pivoting; \pgmid{primmultiout} implements extended primal pivoting. \begin{figure}[htb] \centering \includegraphics{\figures/primalpivcalls} \caption{Call Graph for Primal Pivoting} \label{fig:PrimalPivotCallGraph} \end{figure} The first activity in \pgmid{dy_primalpivot} is the calculation of the coefficients of the pivot column, $\overline{a}_{j} = B^{\,-1} a_j$, by the routine \pgmid{dy_ftran}. With the entering primal variable and the ftran'd column in hand, one of \pgmid{primalout} or \pgmid{primmultiout} are called to select the leaving variable. If the entering and leaving variables are the same (\ie, a nonbasic variable is moving from one bound to the other), all that is required is to call \pgmid{primalupdate} to update the values of the primal variables. The basis, dual variables, reduced costs, and PSE pricing information are unchanged. If the entering and leaving variables are distinct, the pivot is performed in several steps. Prior to the pivot, the $i$\textsuperscript{th} row of the basis inverse, $\beta_i$, and the vector $\trans{\tilde{a}_j} B^{\,-1}$ are calculated for use during the update of the PSE pricing information. The basis is pivoted next; this involves calls to \pgmid{dy_ftran} and \pgmid{dy_pivot}, as outlined in \secref{sec:BasisPivoting}. If the basis change succeeds, the primal and dual variables are updated by \pgmid{primalupdate} using the iterative update formul\ae{} of \secref{sec:UpdatingFormulas}, and then the PSE pricing information and reduced costs are updated by \pgmid{pseupdate}, using the update formul\ae{} of \secref{sec:PSEPricing}. As a side effect, \pgmid{pseupdate} will select an entering variable for the next pivot. \subsection{Selection of the Entering Variable} \label{sec:PrimalStdSelectInVar} Selection of the entering variable $x_j$ for a primal pivot is made using the primal steepest edge criterion described in \secref{sec:PSEPricing}. As outlined above, the normal case is that the entering variable for the following pivot will be selected as \pgmid{pseupdate} updates the PSE pricing information for the current pivot. In various exceptional circumstances where this does not occur, the routine \pgmid{dy_primalin} is called to make the selection. \subsection{Standard Primal Pivot} \label{sec:PrimalStdSelectOutVar} Selection of the leaving variable $x_i$ is made using standard primal pivoting rules and a set of tie-breaking strategies. Abstractly, we need to check $x_k = \overline{b}_k - \overline{a}_{kj}\Delta_{kj}$ to find the maximum allowable $\Delta_{kj}$ such that $l_k \leq x_k \leq u_k \: \forall k \in B$ and $x_i = l_i$ or $x_i = u_i$ for some $i$. The index $i$ of the leaving variable will be \begin{displaymath} i = \arg \min_{k} \abs{\frac{\overline{b}_k}{a_{kj}}} \end{displaymath} for suitable $x_k \in B$. The primal pivoting rules are the standard set for revised simplex with bounded variables, and are summarised in Table \ref{Tbl:PrimalPivotRules}. \begin{table}[htb] \renewcommand{\arraystretch}{2.5}\setlength{\tabcolsep}{.75\tabcolsep} \begin{center} \begin{tabular}{*{3}{>{$}c<{$}}} \text{leaving } x_i & \text{entering } x_j & \text{pivot } \overline{a}_{ij} \\[.5\baselineskip] \nearrow \mathit{ub} & \mathit{lb} \nearrow & < 0 \\ & \mathit{ub} \searrow & > 0 \\ \searrow \mathit{lb} & \mathit{lb} \nearrow & > 0 \\ & \mathit{ub} \searrow & < 0 \\ \end{tabular} \end{center} \caption{Summary of Primal Simplex Pivoting Rules} \label{Tbl:PrimalPivotRules} \end{table} During phase~I, when a variable is infeasible below its lower bound and must increase to become feasible, \dylp sets the limiting $\Delta_j$ based on the upper bound, if it is finite, and uses the lower bound only when the upper bound is infinite. Similarly, when a variable must decrease to its upper bound, the lower bound is used to calculate the limiting $\Delta_j$ if it is finite. \dylp provides a selection of tie-breaking strategies when there are multiple candidates with equal $\abs{\Delta_{kj}} = \Delta_{\mathrm{min}}$. The simplest is to select the first variable $x_k$ such that $\Delta_{kj} = 0$. A slightly more sophisticated strategy is to scan all variables eligible to leave and pick $x_i$ such that $i = \arg \max_{k \in K} \abs{\overline{a}_{kj}}$, $K = \{ k \mid \abs{\Delta_{kj}} = \Delta_{\mathrm{min}} \}$; \dylp will use this strategy by default. \dylp also provides four additional strategies based on hyperplane alignment, as described in \secref{sec:AntiDegenLite}. An option allows the tie-breaking strategy to be selected by the client. In case of degeneracy, the perturbed subproblem anti-degeneracy algorithm described in \secref{sec:PerturbedAntiDegeneracy} is also available. The client can control the use of perturbed subproblems through two options which specify whether a perturbed subproblem can be used, and how many consecutive degenerate pivots must occur before the perturbed subproblem is created. By default, \dylp uses perturbed subproblems aggressively and will introduce one when faced with a second consecutive degenerate pivot. \subsection{Extended Primal Pivot} \label{sec:PrimalGenSelectOutVar} All dual variables have a single finite bound of zero, so it's not possible to develop a generalised primal pivoting algorithm analogous to the dual pivoting algorithm of \secref{sec:DualGenSelectInVar}. It is, however, possible to introduce some flexibility in the selection of the leaving variable. We can also apply the same strategy used in generalised dual pivoting to promote a numerically stable pivot candidate over an unstable candidate. In phase~I, for an infeasible basic variable with finite upper and lower bounds, there are two points where the variable can be pivoted out of the basis: When the variable moves from infeasibility to one of its bounds (the `near' bound), and when it has crossed the feasible region to the opposite (`far') bound. Pivoting when the near bound is reached is optional; pivoting at the far bound is mandatory if primal feasibility is to be maintained. The same notion can be applied in phase~II, but its utility is much more limited: In cases where a basic variable is at its near bound and could be pushed to the far bound, we may prefer to choose a degenerate and numerically stable pivot over a degenerate and numerically unstable pivot. \dylp implements extended primal pivoting by first collecting the set of candidates $x_i$ to leave the basis. Variables with two finite bounds get two entries, one with the value of $\Delta_{ij}$ associated with the near bound, the other the value associated with the far bound. The set is then sorted using nondecreasing value of $\abs{\Delta_{kj}}$, with numerical stability as the tie-breaker. The process of scanning for candidates and sorting the resulting set is implemented in the routines \pgmid{scanForPrimalOutCands} and \pgmid{primalcand_cmp}. For efficiency, \pgmid{scanForPrimalOutCands} keeps a `best candidate' using the standard primal pivoting rules. If this candidate is good (nondegenerate and numerically stable), it is accepted as the leaving variable and no further processing is required. If a good candidate is not identified by the scan, an attempt is made to promote a good candidate to the front of the sorted list. The criteria is as outlined for generalised dual pivoting: If the amount of primal infeasibility that would result from promoting a stable, nondegenerate candidate is tolerable, that candidate is promoted and made the leaving variable. This promotion of a stable pivot over an unstable pivot is implemented in the primal version of \pgmid{promoteSanePivot}. Antidegeneracy using perturbed subproblems is used with extended primal pivoting. The alignment-based anti-degeneracy strategies are not implemented. DyLP-1.6.0/DyLP/doc/dylpabsdir.tex.in0000644000076700007670000000044711171477034014137 0ustar % The sole purpose of this file is to provide a hook for configure to set the % absolute name of the documentation source directory. This is used when % pulling in PostScript source for figures. Otherwise, various dvi viewers may % not be able to find it. \newcommand{\mypath}{@abs_builddir@} DyLP-1.6.0/DyLP/doc/Figures/0000755000076700007670000000000011414302676012251 5ustar DyLP-1.6.0/DyLP/doc/Figures/dualerrorflow.epsu0000644000076700007670000036716111171477034016055 0ustar %!PS-Adobe-3.0 EPSF-3.0 %%Title: /cs/mitacs1/lou/Bonsai/Doc/Dylp.New/dualerrorflow.epsu %%Creator: IslandDraw for lou %%CreationDate: Fri Aug 19 15:57:49 2005 %%Pages: 1 %%BoundingBox: 61 175 513 723 %%DocumentNeededResources: (atend) %%DocumentSuppliedResources: (atend) %%EndComments %%BeginPreview: 566 686 1 1372 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000040000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000008c0000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000840000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000079e5c71f000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000cc862f88000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000084842808000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000084842808000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000008c842c88000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000078ee771c000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000038ffcf3e000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000000c0000c00000 % 000000000000007c4219900000000000000001f81e38e7f00000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000040000400000 % 000000000000004042109000000000000000008c211c42300000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000040000400000 % 0000000000000040421090000000000000000086411442080000000000000001 % 0000000000000000000000000000000000000000000000000000000000000000007c4278400000 % 0000000000000064421190000000000000000082409642400000000000000001 % 000000000000000000000000000000000000000000000000000000000000000000c4c684400000 % 0000000000000038e70f38000000000000000082409343c00000000000000001 % 00000000000000000000000000000000000000000000000000000000000000000084421c400000 % 0000000000000000000000000000180000000082409342400000000000000001 % 000000000000000000000000000000000000000000000000000000000000000000844264400000 % 00000000000000000000000000001f00000000864191c2080000000000000001 % 0000000000000000000000000000000000000000000000000000000000000000008c468c400000 % 00000000000000000000000000001fe0000000842110c2100000000000000001 % 000000000000000000000000000000000000000000000000000000000000000000763b76e00000 % 7ffffffffffffffffffffffffffffffc000001f81e38c7f00000000000000002 % 0000000000000000000000000000000000c0000003000030000000000000000000000000000000 % 7ffffffffffffffffffffffffffffffc00000000000000000000000000000002 % 000000000000000000000000000000000040002001000010000000000000000000000000000000 % 00000000000000000000000000001ff000000000000000000000000000000002 % 000000000000000000000000000000000040002001000010000000000000000000000000000000 % 00000000000000000000000000001f8000000000000000000000000000000002 % 00000000000000000000000000000000004786f81f109e10000000000000000000000000000000 % 00000000000000000000000000001c0000000000000000000000000000000002 % 00000000000000000000000000000000004cc9203131a110000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000002 % 0000000000000000000000000000000000484ea02110871000000000000000000200000c000000 % 0000000000000000000000000000000000800400000000000008000000000002 % 00000000000000000000000000000000004841a021109910000000000000000002000004000000 % 0000000000000000000000000000000001004c00000000000008000000000002 % 000000000000000000000000000000000048c8a02311a310000000000000000000000004000000 % 0000000000000000000000000000000002004400000000000004000000000002 % 0000000000000000000000000000000000e78f381d8eddb80000000000002000d66ecdc473b800 % 00000000000000000000000000000000023cf5c39f039f7de7c4000000000002 % 000000000000000000000000000000000000000000000000000000000001f00122332e64f8b000 % 0000000000000000000000000000000002664627c807c8233204000000000002 % 000000000000000000000000000000000000000000000000000000000007c001d2222424804000 % 0000000000000000000000000000000002424424080408221204000000000002 % 00000000000000000000000000000000000000000000000000000000003e00003222242480e000 % 0000000000000000000000000000000002424424080408221204000000000002 % 0000000000000000000000000000000000000000000000000000000000f8000112222464c93000 % 0000000000000000000000000000000002464426480648223204000000000002 % 0000000000000000000000000000000000000000000000000000000007c00001e77777ce73b800 % 00000000000000000000000000000000023c7e739c039c71e704000000000002 % 0000000000000000000000000000000001c0000160262000000000001f00000000000400000000 % 0000000000000000000000000000000002000000000000000004000000000002 % 00000000000000000000000000000000020000012022240000000000f800000000000400000000 % 0000000000000000000000000000000001000000000000000008000000000002 % 00000000000000000000000000000000020000002002040000000003e000000000000e00000000 % 0000000000000000000000000000000000000000000000000000000000000002 % 000000000000000000000000000000000738786b2e626f770000001f0000000008000003000000 % 7000000000000000000000000000000000000000000000000000000000000002 % 00000000000000000000000000000000027c8491332224220000007c0000000018000003000000 % 7e00000000000000000000000000000000000000000000000000000000000002 % 0000000000000000000000000000000002401ce921222432000003e00000000018000001800000 % 0fc0000000000000000000000000000000000000000000000000000000000002 % 00000000000000000000000000000000024064192122241400000f800000000018000001800000 % 01f8000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000002648c892322241400007c000000000010000000c00000 % 003f800000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000073876f3be7777080001f0000000000030000000c00000 % 0007f00000000000000000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000008000f80000000000030000000c00000 % 00007e0000000000000000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000038003e00000000000030000000600000 % 00000fc000000000000000000000000000000000000000000000000000000002 % 00000000000000000000000000000000000000000000006001f000000000000060000000600000 % 000001f800000000000000000000000000000000000000000000000000000002 % 00000000000000000000000000000000000000000000000007c000000000000060000000600000 % 0000003f80000000000000000000000000000000000000000000000000000002 % 0000000000000000000000000000000000000000000000003e0000000000000060000000300000 % 00000007f0000000000000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000000f800000000000000c0000000300000 % 000000007e000000000000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000007c000000000000000c0000000180000 % 000000000fc00000000000000000000000000000000000000000000000000002 % 00000000000000000000000000000000000000000000001f0000000000000000c0000000180000 % 0000000001f80000000000000000000000000000000000000000000000000003 % 0000000000000000000000000000000000000000000000f8000000000000000080000000180000 % 00000000003f8000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000003e00000000000000001800000000c0000 % 000000000007f000000000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000001f000000000000000001800000000c0000 % 0000000000007e00000000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000007c000000000000000001800000000e0000 % 0000000000000fc0000000000000000000000000000000000000000000000001 % 00000000000000000000000000000000000000000003e000000000000000000300000000060000 % 00000000000001f8000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000f8000000000000000000300000000060000 % 000000000000003f800000000000000000000000000000000000000000000003 % 0000000000000000000000000000000000000000707c0000000000000000000300000000030000 % 0000000000000007f00000000000000000000000000000000000000000000001 % 0000000000000000000000000000000000000000f1f00000000000000000000600000000030000 % 00000000000000007e0000000000000000000000000000000000000000000001 % 0000000000000000000000000000000000000001ff800000000000000000000600000000030000 % 00000000000000000fc000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000003fe000000000000000000000600000000018000 % 000000000000000001f800000000000000000000000000000000000000000002 % 0000000000000000000000000000000000000007f8000000000000000000000400000000018000 % 0000000000000000003f80000000000000000000000000000000000000000001 % 000000000000000000000000000000000000000ffc000000000000000000000c0000000001c000 % 00000000000000000007f0000000000000000000000000000000000000000000 % 000000000000000000000000000000000000003ffc000000000000000000000c0000000000c000 % 000000000000000000007e000000000000000000000000000000000000000002 % 000000000000000000000000000000000000003fc0000000000000000000000c0000000000c000 % 000000000000000000000fc00000000000000000000000000000000000000001 % 000000000000000000000000000000000000000000000000000000000000001800000000006000 % 0000000000000000000001f80000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000001800000000006000 % 00000000000000000000003f8000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000001800000000006000 % 00001e3c7909f787bb800007f000000000000000000000000000000000000001 % 000000000000000000000000000000000000000000000000000000000000003000000000003000 % 00002162c718884c510000007e00000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000003000000000003000 % 00000740810881c8190000000fc0000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000003000000000001800 % 00001940810886480a00000001f8000000000000000000000000000000000001 % 000000000000000000000000000000000000000000000000000000000000002000000000001800 % 00002362c51888cc4a000000003f800000000000000000000000000000000001 % 000000000000000000000000000000000000000000000000000000000000006000000000001800 % 00001dbc78edc767840000000007f00000000000000000000000000000000000 % 0000000000000000000000001c0000000300003000000000000000000000006000000000000c00 % 00000000000000000400000000007e0000000000000000000000000000000003 % 000000000000000000000000200000000100001000000000000000000000006000000000000c00 % 00000000000000001c00000000000fc000000000000000000000000000000001 % 00000000000000000000000020000000010000100000000000000000000000c000000000000c00 % 000000000000000030000000000001f802000000000000000000000000000000 % 00000000000000000000000073cfbc701f108f100000000000000000000000c000000000000600 % 0000000000000000000000000000003f87800000000000000000000000000002 % 000000000000000000000000266462f8313190900000000000000000000000c000000000000600 % 00000000000000000000000000000007f7c00000000000000000000000000001 % 000000000000000000000000242440802110839000000000000000000000018000000000000300 % 00000000100000c000000000000000007ff00000000000000000000000000000 % 0000000000000000000000002424408021108c9000000000000000000000018000000000000300 % 000000003000004000000000000000000ff80000000000000000000000000003 % 000000000000000000000000246462c82311919000000000000000000000018000000000000300 % 000000001000005600000000000000000ffc0000000000000000000000000001 % 00000000000000000000000073ce3c701d8ecef800000000000000000000010000000000000180 % 00000007970e3c4800000000000000000fff0000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000030000000000000180 % 0000000c589f625000000000000000000fff0000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000300000000000001c0 % 0000000810904078000000000000000000000000000000000000000000000001 % 0000000000000000000000000000000000000000000000000000000000000300000000000000c0 % 0000000810904048000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000600000000000000c0 % 0000000c5099624c000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000060000000000000060 % 00000007b9ce3cee000000000000000000000000000000000000000000000000 % 0000000000000000000000000e0000130162000000000000000000000000060000000000000060 % 0000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000001000001101222000000000000000000000000c0000000000000060 % 0000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000001000000100202000000000000000000000000c0000000000000030 % 0000000000000000000000000000000000000000000000000000000000000001 % 00000000000000000000000039c7837173267bb8000000000000000000000c0000000000000030 % 000000000000000000000000000000000000e033000000000000000000000000 % 00000000000000000000000013e844919922211000000000000000000000080000000000000038 % 0000000000000000000000000000000000010011000000000000000000000003 % 0000000000000000000000001201c7510922219000000000000000000000180000000000000018 % 0000000000000000000000000000000000010011000000000000000000000000 % 000000000000000000000000120640d1092220a000000000000000000000180000000000000018 % 0000000000000000000000000000000000039091000000000000000000000000 % 0000000000000000000000001328c451192220a00000000000000000000018000000000000000c % 0000000000000000000000000000000000013191000000000000000000000002 % 00000000000000000000000039c767b9f3f738400000000000000000000030000000000000000c % 0000000000000000000000000000000000011091000000000000000000000003 % 00000000000000000000000000000000000000400000000000000000000030000000000000000c % 0000000000000000000000000000000000011091000000000000000000000000 % 00000000000000000000000000000000000001c000000000000000000000300000000000000006 % 0000000000000000000000000000000000011191000000000000000000000000 % 000000000000000000000000000000000000030000000000000000000000600000000000000006 % 0000000000000000000000000000000000038efb800000000000000000000000 % 000000000000000000000018000000018000000000000000000000000000600000000000000003 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000038000000018000000000000000000000000000600000000000000003 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000070000000018000000000000000000000000000400000000000000003 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000003bb83400001e0000000018000000000000000000000000000c00000000000000001 % 8000000000000000000000000000000000000000000000000000000000000000 % 00000000000117c480000380000000018000000000000000000000000000c00000000000000001 % 8000000000000000000000000000000000000000000000000000000000000000 % 000000000001940740000700000000018000000000000000000000000000c00000000000000001 % 8000000000000000000000000000000000000000000000000000000000000000 % 000000000000a400c0000e00000000018000000000000000000000000001800000000000000000 % c000000000000000000000000000000000000000000e00000000000000000000 % 000000000000a64440003c00000000018000000000000000000000000001800000000000000000 % c000000000000000000000000000000000000800003100000000000000000000 % 000000000000438780007000000000018000000000000000000000000001800000000000000000 % 6000000000000000000000000000000000000800002100000000000000000000 % 00000000000040000000e000000000018000000000000000000000000003000000000000000000 % 600000000000000000000000000000006bbb5e73760100000000000000000000 % 000000000001c0000001c000000000018000000000000000000000000003000000000000000000 % 60000000000000000000000000000000911488f9990200000000000000000000 % 000000000003000000078000000000018000000000000000000000000003000000000000000000 % 30000000000000000000000000000000e9974881110400000000000000000000 % 0000000000000000000e00000371e0018000000000000000000000000002000000000000000000 % 3000000000000000000000000000000018a0c881110400000000000000000000 % 0000000000000000001c0000018b30018000000000000000000000000006000000000000000000 % 3800000000000000000000000000000088a448c9110c00000000000000000000 % 000000000000000000380000010a10018000000000000000000000000006000000000000000000 % 18000000000000000000000000000000f0478e73bb8c00000000000000000000 % 000000000000000000f00000010a10018000000000000000000000000006000000000000000000 % 1800000000000000000000000000000000400000000000000000000000000000 % 000000000000000001c00000010a3001800000000000000000000000000c000000000000000000 % 0c00000000000000000000000000000001c00000000000000000000000000000 % 000000000000000003800000039de001800000000000000000000000000c000000000000000000 % 0c00000000000000000000000000000003000000000000000000000000000000 % 00000000000000000700000000000001800000000000000000000000000c000000000000000000 % 0c00000000000000000000000000000000000000000000000000000000000000 % 00000000000000001e000000000000018000000000000000000000000018000000000000000000 % 0600000000000000000000000000000000000000000000000000000000000000 % 000000000000000038000000000000018000000000000000000000000018000000000000000000 % 0600000000000000000000000000000000000000000000000000000000000000 % 000000000000000070000000000000018000000000000000000000000018000000000000000000 % 0700000000000000000000000000000000000000000000000000000000000000 % 0000000000000000e0000000000000018000000000000000000000000010000000000000000000 % 0300000000000000000000000000000000000000000000000000000000000000 % 0000000000000003c0000000000000018000000000000000000000000030000000000000000000 % 0300000000000000000000000000000000000000000000000000000000000000 % 000000000000000700000000000000018000000000000000000000000030000000000000000000 % 0180000000000000000000000000000000000000000000000000000000000000 % 000000000000000e000000000000000ff000000000000000000000000030000000000000000000 % 0180000000000000000000000000000000000000000000000000000000000000 % 000000000000021c000000000000000ff000000000000000000000000060000000000000000000 % 0180000000000000000000000000000000000000000000000000000000000000 % 0000000000000778000000000000000fe000000000000000000000000060000000000000000000 % 00c0000000000000000000000000000006000000600000000000000000000001 % 0000000000000fe0000000000000000fe000000000000000000000000060000000000000000000 % 00c000000000000000000000000000000e000000700000000000000000000001 % 0000000000000fc00000000000000007e0000000000000000000000000c0000000000000000000 % 006000000000000000000000000000003c0000003c0000000000000000000001 % 0000000000001fc00000000000000007c0000000000000000000000000c0000000000000000000 % 0060000000000000000000003bf06800700000000e000dc78000000000000001 % 0000000000003fe00000000000000007c0000000000000000000000000c0000000000000000000 % 00600000000000000000000011f89000e00000000700062cc000000000000001 % 0000000000003fe00000000000000003c000000000000000000000000080000000000000000000 % 0030000000000000000000001980e803c000000003c004284000000000000001 % 0000000000007f8000000000000000038000000000000000000000000180000000000000000000 % 0030000000000000000000000a8018070000000000e004284000000000000002 % 000000000000fe0000000000000000038000000000000000000000000180000000000000000000 % 0030000000000000000000000ac8880e0000000000700428c000000000000002 % 000000000000f00000000000000000018000000000000000000000000180000000000000000000 % 0018000000000000000000000470f03c00000000003c0e778000000000000002 % 000000000000800000000000000000010000000000000000000000000300000000000000000000 % 0018000000000000000000000400007000000000000e00000000000000000002 % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 000c000000000000000000001c0000e000000000000700000000000000000002 % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 000c00000000000000000000300003c0000000000003c0000000000000000002 % 000000000000000000000000000000000000000000000000000000000600000000000000000000 % 000c0000000000000000000000000700000000000000e0000000000000000002 % 000000000000000000000000000000000000000000000000000000000600000000000000000000 % 00060000000000000000000000000e0000000000000070000000000000000002 % 000000000000000000000000000000000000000000000000000000000600000000000000000000 % 00060000000000000000000000003c000000000000003c000000000000000002 % 000000000000000000000000000000000000000000000000000000000400000000000000000000 % 000700000000000000000000000070000000000000000e000000000000000002 % 000000000000000000000000000000000000000000000000000000000c00000000000000000000 % 0003000000000000000000000000e00000000000000007000000000000000002 % 000000000000000000000000000000000000000000000000000000000c00000000000000000000 % 0003000000000000000000000043c00000000000000003c60000000000000002 % 000000200000000000000000000000100000000000000000000000000c00000000000000000000 % 00018000000000000000000000e7000000000000000000e70000000000000002 % 000004200010000000000000000002100004000000000000000000001800000000000000000000 % 00018000000000000000000000fe0000000000000000007f0000000000000002 % 000004000010000000000000000002000004000000000000000000001800000000000000000000 % 00018000000000000000000001fc0000000000000000003f8000000000000002 % 01e3cf6eef3ce000000000000078f7b3bf8f700000000000000000001800000000000000000000 % 0000c000000000000000000003f80000000000000000003fc000000000000002 % 021624245091f0000000000000858a111844f80000000000000000003000000000000000000000 % 0000c000000000000000000007fc0000000000000000003fc000000000000002 % 007404268391000000000000001d0211a1c4800000000000000000003000000000000000000000 % 00006000000000000000000007fc0000000000000000007fe000000000000002 % 019404228c9100000000000000650210a644800000000000000000003000000000000000000000 % 0000600000000000000000000ff80000000000000000001ff000000000000002 % 023624231191900000000000008d8a10c8c4c80000000000000000002000000000000000000000 % 0000600000000000000000001fc000000000000000000003f000000000000002 % 01dbc7710edce000000000000076f3b84767700000000000000000006000000000000000000000 % 0000300000000000000000001e00000000000000000000007800000000000002 % 000000000000000000000000000000000000000000000000000000006000000000000000000000 % 0000300000000000000000001000000000000000000000000800000000000000 % 000000000000000000000000000000000000000000000000000000006000000000000000000000 % 0000300000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000c000000000000000000000 % 0000180000000000000000000000000000000000000000000000000000000002 % 00000000000000000000000000000000000000000000000000000000c000000000000000000000 % 0000180000000000000000000000000000000000000000000000000000000002 % 00000000000000000000000000000000000000000000000000000000c000000000000000000000 % 00000c0000000000000000000000000000000000000000000000000000000002 % 0000010060c0000000000000000000803030000000000000000000018000000000000000000000 % 00000c0000000000000000000000000000000000000000000000000000000002 % 000001002040000000000000000000801010000000000000000000018000000000000000000000 % 00000c0000000000000000000000000000000000000000000000000000000002 % 000000002040000000000000000000001010000000000000000000018000000000000000000000 % 0000060000000000000000000000000000000000000000000000000000000002 % 3bbcfb3c2e470680000000000efe3f8f1711c34000000000000000010000000000000000000000 % 000006000000000000007e078e3bf800000000000000200000000e0330000002 % 11424142334f890000000000046110909993e48000000000000000030000000000000000000000 % 0000060000000000000023084711180000000000000420000800100110000002 % 1a0e410e21480e8000000000068710839092074000000000000000030000000000000000000000 % 0000030000000000000021904511040000000000000400000800100110000003 % 0a32413221480180000000000299108c909200c000000000000000030000000000000000000000 % 0000030000000000000020902591200000000000f1ef677f1ee0390910000000 % 0c464146234c888000000000032310919193244000000000000000060000000000000000000000 % 00000180000000000000209024d1e000000000010b14223089f0131910000002 % 043be3bb3ee70f0000000000011db9cedf39c78000000000000000060000000000000000000000 % 00000180000000000000209024d12000000000003a0423438900110910000002 % 000000000000000000000000000000000000000000000000000000060000000000000000000000 % 0000018000000000000021906471040000000000ca04214c8900110910000001 % 0000000000000000000000000000000000000000000000000000000c0000000000000000000000 % 000000c0000000000000210844310800000000011b1421918990111910000000 % 0000000000000000000000000000000000000000000000000000000c0000000000000000000000 % 000000c00000000000007e078e33f80000000000ede7708ecee038efb8000003 % 0000000000000000000000000000000000000000000000000000000c0000000000000000000000 % 000000e000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000000000000000000000000000000080000000000000000000000 % 0000006000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000000000000000000000000000000180000000000000000000000 % 0000006000000000000000000000000000000000000000000000000000000000 % 00000bf07080000000000000000001f81080000000000000000000180000000000000000000000 % 0000003000000000000000000000000000000000000000000000000000000002 % 000011188880000000000000000002447080000000000000000000180000000000000000000000 % 0000003000000000000000000000000000000000000000000000000000000001 % 0000210c8840000000000000000004441040000000000000000000300000000000000000000000 % 0000003000000000000000000000000000000000000000000000000000000000 % 000021048840000000000000000004441040000000000000000000300000000000000000000000 % 0000001800000000008000000000000000000000000000080000000000000002 % 000021041840000000000000000004781040000000000000000000300000000000000000000000 % 0000001800000000010000000000000000000000001000080080000004000001 % 000021041040000000000000000004401040000000000000000000600000000000000000000000 % 0000000c00000000020000000000000000000000001000000080000004000000 % 0000210c2040000000000000000004401040000000000000000000600000000000000000000000 % 0000000c00000000023c78f213ef0f770001e79b86bdf799b9e035ddaf39bb02 % 000021084440000000000000000004603040000000000000000000600000000000000000000000 % 0000000c000000000242c58e311098a200031ccc49108848c480488a447ccc81 % 000023f0f840000000000000000004e07840000000000000000000400000000000000000000000 % 0000000600000000020e810211039032000208484e9081c8848074cba4408880 % 000020000040000000000000000004000040000000000000000000c00000000000000000000000 % 000000060000000002328102110c9014000208484190864884800c5064408880 % 000010000080000000000000000002000080000000000000000000c00000000000000000000000 % 00000006000000000246c58a31119894000318c8489088c88480445224648881 % 000000000000000000000000000000000000000000000000000000c00000000000000000000000 % 0000000300000000023b78f1db8ecf080001e79cef1dc77dcee07823c739ddc1 % 000000000000000000000000000000000000000000000000000001800000000000000000000000 % 0000000300000000020000000000000800000000000000000000002000000000 % 000000000000000000000000000000000000000000000000000001800000000000000000000000 % 000000018000000001000000000000380000000000000000000000e000000003 % 000000000000000000000000000000000000000000000000000001800000000000000000000000 % 0000000180000000000000000000006000000000000000000000018000000001 % 000000060000000000000000000000018000000000000000000003000000000000000000000000 % 0000000180000000000000000000000000000000000000000800000000000000 % 000000060000000000000000000000018000000000000000000003000000000000000000000000 % 00000000c0000000000000000000000000000000000000000800000000000002 % 000000060000000000000000000000018000000000000000000003000000000000000000000000 % 00000000c0000000000001000018080000000000000000000800000000000001 % 000000060000000000000000000000018000000000000000000002000000000000000000000000 % 00000000c0000000000003000008080000000000000000000800000000000000 % 000000060000000000000000000000018000000000000000000006000000000000000000000000 % 000000006000000000000100000ac40000000000000000000800000000000003 % 000000060000000000000000000000018000000000000000000006000000000000000000000000 % 00000000600000000000f171c789040000000000000000000800000000000001 % 000000060000000000000000000000018000000000000000000006000000000000000000000000 % 00000000300000000001898bec4a040000000000000000000800000000000000 % 00000006000000000000000000000001800000000000000000000c000000000000000000000000 % 00000000300000000001010a080f040000000000000000000800000000000000 % 00000006000000000000000000000001800000000000000000000c000000000000000000000000 % 00000000300000000001010a0809040000000000000000000800000000000001 % 00000006000000000000000000000001800000000000000000000c000000000000000000000000 % 00000000180000000001890b2c49840000000000000000000800000000000000 % 000000060000000000000000000000018000000000000000000018000000000000000000000000 % 00000000180000000000f39dc79dc40000000000000000000800000000000003 % 000000060000000000000000000000018000000000000000000018000000000000000000000000 % 000000001c000000000000000000040000000000000000000800000000000000 % 000000060000000000000000000000018000000000000000000018000000000000000000000000 % 000000000c000000000000000000080000000000000000000800000000000000 % 000000060000000000000000000000018000000000000000000010000000000000000000000000 % 000000000c000000000000000000000000000000000000000800000000000000 % 000000060000000000000000000000018000000000000000000030000000000000000000000000 % 0000000006000000000000000000000000000000000000000800000000000001 % 000000060000000000000000000000018000000000000000000030000000000000000000000000 % 0000000006000000000000000000000000000000000000000800000000000000 % 000000060000000000000000000000018000000000000000000030000000000000000000000000 % 0000000006000000000000000000000000000000000000000800000000000003 % 000000060000000000000000000000018000000000000000000060000000000000000000000000 % 0000000003000000000000000000000000000000000000000800000000000000 % 000000060000000000000000000000018000000000000000000060000000000100000000000000 % 0000000003000000000000000000000000000000000000000800000000000000 % 000000060000000000000000000000018000000000000000000060000000000100000000000000 % 0000000001800000000000000000000000000000000000000800000000000002 % 0000000600000000000000000000000180000000000000000000c0000000000000000000000000 % 0000000001800000000000000000000000000000000000000800000000000003 % 0000000600000000000000000000000180000000000000000000c1c7779c1a6b3bf00000000000 % 0000000001800000000000000000000000000000000000000800000000000000 % 0000000600000000000000000000000180000000000000000000c3e16c7e249111f80000000000 % 0000000000c00000000000000000000000000000000000000800000000000000 % 0000000600000000000000000000000180000000000000000000820088203ae91a800000000000 % 0000000000c00000000000000000000000000000000000000800000000000000 % 00000006000000000000000000000001800000000000000000018201c82006190a800000000000 % 0000000000c00000000000000000000000000000000000000800000000000000 % 0000003fc0000000000000000000000ff000000000000000000183226c7222890cc80000000000 % 0000000000600000000000000000000000000000000000007f80000000000000 % 0000003fc0000000000000000000000ff000000000000000000181c7779c3cf384700000000000 % 0000000000600000000000000000000000000000000000007f00000000000000 % 0000001fc0000000000000000000000fe000000000000000000300000000000000000000000000 % 0000000000300000000000000000000000000000000000007f00000000000000 % 0000001f800000000000000000000007e000000000000000000300000000000000000000000000 % 0000000000300000000000000000000000000000000000003f00000000000000 % 0000001f800000000000000000000007e000000000000000000300000000000000000000000000 % 0000000000300000000000000000000000000000000000003e00000000000000 % 0000000f800000000000000000000007c000000000000000000600000000000000000000000000 % 0000000000180000000000000000000000000000000000003e00000000000000 % 0000000f000000000000000000000003c000000000000000000600000000000000000000000000 % 0000000000180000000000000000000000000000000000001e00000000000000 % 0000000f000000000000000000000003c000000000000000000600000000200000000000000000 % 0000000000180000000000000000000000000000000000001c00000000000000 % 000000070000000000000000000000038000000000000000000400000000200000000000000000 % 00000000000c0000000000000000000000000000000000001c00000000000000 % 000000060000000000000000000000018000000000000000000c00000000000030000000000000 % 00000000000c0000000000000000000000000000000000000c00000000000000 % 000000060000000000000000000000018000000000000000000c00001bfbe6e1c0000000000000 % 0000000000060000000000000000000000000000000000000800000000000000 % 000000000000000000000000000000000000000000000000000c00002491231220000000000000 % 0000000000060000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000001800003ad9221220000000000000 % 0000000000060000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000180000066a2211c0000000000000 % 0000000000030000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000180000226c221200000000000000 % 0000000000030000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000003000003c24773be0000000000000 % 0000000000038000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000003000000000000230000000000000 % 0000000000018000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000003000000000000630000000000000 % 0000000000018000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000020000000000003c0000000000000 % 000000000000c000000000000000000000000000000000000000000000000000 % 00000c0000c0000000000000000000200001800000000000006000000000000000000000000000 % 000000000000c0000000000000000000000000000100000c00000060000c0000 % 000004000040000000000000000000200000800000000000006000000000000000000000000000 % 000002000000c000000000000000000000000000010000040000002000040000 % 000004000040000000000000000000000000800000000000006000000000000000000000000000 % 0000020000006000000000000000000000000000000000040000002000040000 % 00007c427840000000000000001b9f6dd87880000000000000c00000000000000000000000000d % c42dc783cf8060000000000000000000000000dcfb6ec3c4079f03e423c40000 % 0000c4c68440000000000000001cc826648480000000000000c00000000000000000000000000e % 6c662206640030000000000000000000000000e6413324240cc8062c64240000 % 000084421c4000000000000000084824441c80000000000000c000000000000000000000000004 % 2424220424003000000000000000000000000042412220e40848042420e40000 % 000084426440000000000000000848244464800000000000018000000000000000000000000004 % 2424220424003000000000000000000000000042412223240848042423240000 % 00008c468c400000000000000008c824448c800000000000018000000000000000000000000004 % 64642204640018000000000000000000000000464122246408c8046464640001 % 0000763b76e0000000000000000f9c7eee77c00000000000018000000000000000000000000007 % c3be7383ce00180000000000000000000000007ce3f773be079c03b3b3be0001 % 000000000000000000000000000800000000000000000000010000000000000000000000000004 % 0000000000001800000000000000000000000040000000000000000000000001 % 000000000000000000000000000800000000000000000000030000000000000000000000000004 % 0000000000000c00000000000000000000000040000000000000000000000001 % 000000000000000000000000001c0000000000000000000003000000000000000000000000000e % 0000000000000c000000000000000000000000e0000000000000000000000001 % 000000000000000000000000000000000000000000000000030000000000000000000000000000 % 0000000000000600000000000000000000000000000000000000000000000001 % 000000000000000000000000000000000000000000000000060000000000000000000000000000 % 0000000000000600000000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000000060000000000000000000000000000 % 0000000000000600000000000000000000000000000000000000000000000002 % 000200000c00000000000000000100000600000000000000060000000000000000000000000000 % 000000cc00000300000000000000000000000000000008000030000000000002 % 0002000004000000000000000001000002000000000000000c0000000000000000000000000000 % 0004004400000300000000000000000000000000000008000010000000000002 % 0000000004000000000000000000000002000000000000000c0000000000000000000000000000 % 0004004400000300000000000000000000000000000000000010000000000002 % 00d66ecdc473b80000000000003737637238ee00000000000c0000000000000000000000000000 % 00df3c44000001800000000000000000000000000001b9bb1b91c77000000002 % 0122332e64f8b00000000000004919939a7c2c0000000000080000000000000000000000000000 % 0124424400000180000000000000000000000000000248cc9cd3e16000000002 % 01d222242480400000000000007511110a40100000000000180000000000000000000000000000 % 01d40e44000000c00000000000000000000000000003a8888852008000000002 % 003222242480e00000000000000d11110a40380000000000180000000000000000000000000000 % 00343244000000c000000000000000000000000000006888885201c000000002 % 0112222464c9300000000000004511111a644c0000000000180000000000000000000000000000 % 01144644000000c00000000000000000000000000002288888d3226000000002 % 01e77777ce73b80000000000007bbbb9f738ee0000000000300000000000000000000000000000 % 01e73bee000000600000000000000000000000000003ddddcfb9c77000000002 % 000000040000000000000000000000010000000000000000300000000000000000000000000000 % 0000000000000060000000000000000000000000000000000800000000000002 % 000000040000000000000000000000010000000000000000300000000000000000000000000000 % 0000000000000070000000000000000000000000000000000800000000000002 % 0000000e0000000000000000000000038000000000000000600000000000000000000000000000 % 0000000000000030000000000000000000000000000000001c00000000000002 % 000000000000000000000000000000000000000000000000600000000000000000000000000000 % 0000000000000030000000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000000600000000000000000000000000000 % 0000000000000018000000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000000400000000000000000000000000000 % 0000000000000018000000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000000c00000000000000000000000000000 % 0000000000000018000000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000000c00000000000000000000000000000 % 000000000000000c000000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000000c00000000000000000000000000000 % 000000000000000c000000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000001800000000000000000000000000000 % 0000000000000006000000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000001800000000000000000000000000000 % 0000000000000006000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000001800000000000000000000000000000 % 0000000000000006000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000003000000000000000000000000000000 % 0000000000000003000000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000003000000000000000000000000000000 % 0000000000000003000000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000003000000000000000000000000000000 % 0000000000000003000000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000002000000000000000000000000000000 % 0000000000000001800000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000006000000000000000000000000000000 % 0000000000000001800000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000006000000000000000000000000000000 % 0000000000000000c00000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000006000000000000000000000000000000 % 0000000000000000c00000000000000000000000000000000000000000000002 % 00000000000000000000000000000000000000000000000c000000000000000000000000000000 % 0000000000000000c00000000000000000000000000000000000000000000002 % 00000000000000000000000000000000000000000000000c000000000000000000000000000000 % 0000000000000000600000000000000000000000000000000000000000000003 % 00000000000000000000000000000000000000000000000c000000000000000000000000000000 % 0000000000000000600000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000018000000000000000000000000000000 % 0000000000000000600000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000018000000000000000000000000000000 % 0000000000000000300000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000018000000000000000000000000000000 % 0000000000000000300000000000000000000000000000000000000000000001 % 000000000000000000000000000000000000000000000010000000000000000000000000000000 % 0000000000000000180000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000030000000000000000000000000000000 % 0000000000000000180000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000030000000000000000000000000000000 % 00000000000000001b8000000000000000000000000000000000000000000001 % 000000000000000000000000000000000000000000000030000000000000000000000000000000 % 00000000000000000f8000000000000000000000000000000000000000000001 % 000000000000000000000000000000000000000000000060000000000000000000000000000000 % 00000000000000007f8000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000060000000000000000000000000000000 % 00000000000000007f8000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000060000000000000000000000000000000 % 00000000000000003f8000000000000000000000000000000000000000000001 % 0000000000000000000000000000000000000000000000c0000000000000000000000000000000 % 00000000000000001f8000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000c0000000000000000000000000000000 % 00000000000000001f8000000000000000000000000000000000000000000002 % 0000000000000000000000000000000000000000000000c0000000000000000000000000000000 % 00000000000000000f8000000000000000000000000000000000000000000001 % 000000000000000000000000000000000000000000000080000000000000000000000000000000 % 0000000000000000078000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000f80000000000000000000000000000000 % 0000000000000000038000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000fe0000000000000000000000000000000 % 0000000000000000018000000000000000000000000000000000000000000001 % 000000000000000000000000000000000000000000000ff0000000000000000000000000000000 % 0000000000000000008000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000fe0000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000fe0000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000000000000000000000fc0000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000000000000000000000f80000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000f80000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000f00000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000000000000000000000e00000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000c00000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000c00000000000000000000000000000000 % 0000000000000000000000010000000000000000000000000000000000000001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000210000800000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000200000800000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000f1e7b7779e70000000000000000000000000000000001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000010b12122848f8000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000003a021341c880000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000ca0211464880000000000000000000000000000000001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000011b121188c8c8000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000ede3b8876e70000000000000000000000000000000003 % 000000000000000000000000000000000000000000008000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000088000200000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000080000200000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000003c79f9dde79c000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000001 % 00000000000000000000000000000000000000042c4888a123e000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000e8088d07220000000000000000000000000000 % 0000000000000000000000000001000000000000000000000000000000000003 % 000000000000000000000000000000000000000328088519220000000000000000000000000000 % 0000000000000000000000040001001000000000000000000000000000000000 % 00000000000000000000000000000000000000046c488623232000000000000000000000000000 % 0000000000000000000000040000001000000000000000000000000000000000 % 0000000000000000000000000000000000000003b78fc21db9c000000000000000000000000000 % 000000000000000078f370df7cf3373c68000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000c59989242109189090000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000810909d420391090e8000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000008109083420c9109018000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000c51909142119109088000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000078f39de770efb9dcf0000000000000000000000000000000 % 000000000000000000000000000000000000000000000000400000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000010000400400000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000010000000400000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000001e79b837df78db8f34000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000031ccc44908844c4448000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000020848475081c484474000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000002084840d086448440c000000000000000000000000 % 00000000000000000020100c0000019000000000000000000000000000000000 % 000000000000000000000000000000000000318c8445088c484444000000000000000000000000 % 0000000000000000004010040080009000000000000000000000000000000000 % 0000000000000000000000000000000000001e79ce79dc76fce778000000000000000000000000 % 0000000000000000008000040080008800000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000009df3c479e70f8800000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000889664848f988800000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000008d14241c88108800000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000008514246488108800000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000008614648c8c918800000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000823bce76e70ec800000000000000000000000000000000 % 000000000000000000000000000000000000018000000018800020000000000000000000000000 % 0000000000000000008000000000000800000000000000000000000000000000 % 000000000000000000000000000000000000028000000008800020000000000000000000000000 % 0000000000000000004000000000001000000000000000000000000000000000 % 0000000000000000000000000000000000000480000000080000d0000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000004b8f109b8f9b70710000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000004cd9b18c588988890000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000048509088508908890000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000048509088508908710000000000000000000000000 % 0000000000000003000000003000000000000000000000000000000000000000 % 000000000000000000000000000000000000048d19188518908810000000000000000000000000 % 0000000000000007000000003000000000000000000000000000000000000000 % 00000000000000000000000000000000000004f8f0edceedf9cf90000000000000000000000000 % 000000000000001e000000003000000000000000000000000000000000000000 % 0000000000000000000000000000000000000400000000000008d0000000000000000000000000 % 0000dc73f7000078000000003000000000000000000000000000000000000000 % 0000000000000000000000000000000000000200000000000018e0000000000000000000000000 % 000062f9220000f0000000003000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000f00000000000000000000000000 % 00004281b20003c0000000003000000000000000000000000000000000000001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00004280d4000f00000000003000000000000000000000000000000000000001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000042c8d8001e00000000003000000000000000000000000000000000000001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000e77048007800000000003000000000000000000000000000000000000001 % 000000000000000000000000000000000000c00000000c00000000000000000000000000000000 % 000000000001e000000000003000000000000000000000000000000000000001 % 000000000000000000000000000000000003c00000000c00000000000000000000000000000000 % 000000000003c000000000003000000000000000000000000000000000000001 % 000000000000000000000000000000000007000000000c00000000000000000000000000000000 % 00000000000f0000000000003000000000000000000000000000000000000002 % 0000000000000000000000006e1cfdc0001e000000000c00000000000000000000000000000000 % 00000000003c000000000000300370f371c00000000000000000000000000002 % 000000000000000000000000313e48800078000000000c00000000000000000000000000000000 % 000000000078000000000000300189998be00000000000000000000000000002 % 00000000000000000000000021206c8000e0000000000c00000000000000000000000000000000 % 0000000001e0000000000000300109090a000000000000000000000000000002 % 0000000000000000000000002120350003c0000000000c00000000000000000000000000000000 % 000000000780000000000000300109090a000000000000000000000000000002 % 000000000000000000000000213236000f00000000000c00000000000000000000000000000000 % 000000000f00000000000000300109190b200000000000000000000000000002 % 000000000000000000000000739c12001c00000000000c00000000000000000000000000000000 % 000000003c0000000000000030039cf39dc00000000000000000000000000002 % 000000000000000000000000000000007800000000000c00000000000000000000000000000000 % 00000020f0000000000000003000000000000000000000000000000000000002 % 00000000000000000000000000000001e000000000000c00000000000000000000000000000000 % 00000071e0000000000000003000000000000000000000000000000000000002 % 000000000000000000000000000000038000000000000c00000000000000000000000000000000 % 000000ff80000000000000003000000000000000000000000000000000000002 % 0000000000000000000000000000000f0000000000000c00dc79b8e00000000000000000000000 % 000000fe00000000000000003000000000000000000000000000000000000002 % 0000000000000000000000000000003c0000000000000c0062ccc5f00000000000000000000000 % 000001fc00000000000000003000000000000000000000000000000000000002 % 000000000000000000000000000000700000000000000c00428485000000000000000000000000 % 000003fc00000000000000003000000000000000000000000000000000000002 % 000000000000000000000000000001e00000000000000c00428485000000000000000000000000 % 000007fe00000000000000003000000000000000000000000000000000000002 % 000000000000000000000000000007800000000000000c00428c85900000000000000000000000 % 00000ffe0000000000000001fe00000000000000000000000000000000000002 % 00000000000000000000000000000e000000000000000c00e779cee00000000000000000000000 % 00001fe00000000000000001fe00000000000000000000000000000000000002 % 00000000000000000000000000083c000000000000000c00000000000000000000000000000000 % 00001c000000000000000000fe00000000000000000000000000000000000002 % 000000000000000000000000001cf0000000000000000c00000000000000000000000000000000 % 000000000000000000000000fc00000000000000000000000000000000000002 % 000000000000000000000000003dc0000000000000000c00000000000000000000000000000000 % 000000000000000000000000fc00000000000000000000000000000000000002 % 000000000000000000000000007f80000000000000000c00000000000000000000000000000000 % 0000000000000000000000007c00000000000000000000000000000000000002 % 00000000000000000000000000ff00000000000000000c00000000000000000000000000000000 % 0000000000000000000000007800000000000000000000000000000000000002 % 00000000000000000000000000ff00000000000000000c00000000000000000000000000000000 % 0000000000000000000000007800000000000000000000000000000000000000 % 00000000000000000000000001ff80000000000000000c00000000000000000000000000000000 % 0000000000000000000000003800000000000000000000000000000000000000 % 00000000000000000000000003ff00000000000000007f80000000000000000000000000000000 % 0000000000000000000000003000000000000000000000000000000000000002 % 00000000000000000000000007f000000000000000007f80000000000000000000000000000000 % 0000000000000000000000003000000000000000000000000000000000000002 % 000000000000000000000000060000000000000000007f00000000000000000000000000000000 % c0000c0000000000000000001000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000003f00000000000000000000000000000000 % 4000040000000000000000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000003f00000000000000000000000000000000 % 4000040000000000000000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000003e00000000000000000000000000000007 % c423c40000000000000000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000001e0000000000000000000000000000000c % 4c64240000000000000000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000001e00000000000000000000000000000008 % 4420e40000000000000000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000001c00000000000000000000000000000008 % 4423240000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000c00000000000000000000000000000008 % c464640000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000c00000000000000000000000000000007 % 63b3be0000000000000000000000000000000000000000000000000000000002 % 000000000000000000003000030000000000000000000800000000000000000000000000000000 % 0000000000000000e0000000000200000c000000000000000000000000000002 % 000000000000000000001000010000000000000000000000000000000000000000000000000000 % 0000000000000001000000000002000004000000000000000000000000000001 % 000000000000000000001000010000000000000000000000000000000000000000000000000000 % 0000000000000001000000000000000004000000000000000000000000000000 % 00000000000000000001f109e10000000000000000000000000000000000000000000000000000 % 00000000000000039e7cf380ddf66ec784000000000000000000000000000003 % 00000000000000000003131a110000000000000000000000000000000000000000000000000000 % 000000000000000133218fc0e682332844000000000000000000000000000001 % 000000000000000000021108710000000000000000000000000000000000000000000000000020 % 0000c000000000012121040042822221c4000000000000000000000000000001 % 000000000000000000021109910000000000000000000000000000000000000000000000000020 % 0000400000000001212104004282222644000000000000000000000000000000 % 00000000000000000002311a310000000000000000000000000000000000000000000000000000 % 000040000000000123218e4046822228c4000000000000000000000000000002 % 00000000000000000001d8eddb800000000000180000600c0c00000000000000000000000006e6 % ec6e471dc00000039e70f3807dc777776e000000000000000000000000000001 % 000000000000000000000000000000000000000800002004040000000000000000000000000923 % 32734f8580000000000000004000000000000000000000000000000000000000 % 000000000000000000000000000000000000000800002004040000000000000000000000000ea2 % 2221480200000000000000004000000000000000000000000000000000000002 % 0000000000000000000000000000000000000008f1e3e3c5c4e0000000000000000000000001a2 % 222148070000000000000000e000000000000000000000000000000000000001 % 00000000000000000000000000000000000000099a16242665f0000000000000000000000008a2 % 22234c8980000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000009087420e4250000000000000000000000000f77 % 773ee71dc0000000000000000000000000000000000000000000000000000002 % 000000000000000000080000300000000000000909942324250000000000000000000000000000 % 002000000000000001c000016026200000000000000000000000000000000001 % 00000000000000000008000010000000000000091a346464659000000000000000000000000000 % 0020000000000000020000012022240000000000000000000000000000000000 % 000000000000000000000000100000000000001cf1dbb3b7cee000000000000000000000000000 % 0070000000000000020000002002040000000000000000000000000000000000 % 00000000000000000359bb3711cee0000000000000000000000000000000000000000000000000 % 00000000000000000738786b2e626f7700000000000000000000000000000001 % 00000000000000000488ccb993e2c0000000000000000000000000000000000000000000000000 % 0000000000000000027c84913322242200000000000000000000000000000001 % 000000000000000007488890920100000000000000000000000000000000000000000000000000 % 000000000000000002401ce92122243200000000000000000000000000000000 % 000000000000000000c88890920380000000000000000000000000000000000000000000000000 % 0000000000000000024064192122241400000000000000000000000000000003 % 0000000000000000044888919324c0000000000000000000000000000000000000000000000000 % 000000000000000002648c892322241400000000000000000000000000000001 % 0000000000000000079ddddf39cee0000000000000000000000000000000000000000000000000 % 0000000000000000073876f3be77770800000000000000000000000000000000 % 000000000000000000000010000000000000000000200c0c000380000000000000000000000000 % 0000000000000000000000000000000800000000000000000000000000000002 % 000000000000000000000010000000000000000000200404000c40000000000000000000000000 % 0000000000000000000000000000003800000000000000000000000000000001 % 000000000000000000000038000000000000000000000404000840000000000000000000000000 % 0000000000000000000000000000006000000000000000000000000000000000 % 00000000000000000000000000000000000003bf9f63c5c4e0d040000000000000000000000000 % 0000000000000003000000003000000000000000000000000000000000000003 % 000000000000000000000000000000000000011848242665f12080000000000000000000000000 % 0000000000000007000000003000000000000000000000000000000000000001 % 00000000000000000000000000000000000001a1c820e42501d100000000000000000000000000 % 000000000000000e000000003000000000000000000000000000000000000000 % 00000000000000000000000000000000000000a648232425003100000000000000000000000000 % 0000001ddc34001c000000003000000000000000000000000000000000000000 % 00000000000000000000000000000000000000c8c8246465911300000000000000000000000000 % 00000008be480078000000003000000000000000000000000000000000000001 % 00000000000000000000000000000000000000477c73b7cee1e300000000000000000000000000 % 0000000ca07400e0000000003000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000005200c01c0000000003000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000532440380000000003000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000021c780f00000000003000000000000000000000000000000000000000 % 000000000000000000000000000000000000c00000000c00000000000000000000000000000000 % 0000000200001c00000000003000000000000000000000000000000000000000 % 000000000000000000000000000000000003c00000000c00000000000000000000000000000000 % 0000000e00003800000000003000000000000000000000000000000000000001 % 00000000000000000000000000000000000f000000000c00000000000000000000000000000000 % 0000001800007000000000003000000000000000000000000000000000000000 % 0000000000000000000000000001b8f0001e000000000c00000000000000000000000000000000 % 000000000001e000000000003006e3c000000000000000000000000000000003 % 0000000000000000000000000000c5980078000000000c00000000000000000000000000000000 % 0000000000038000000000003003166000000000000000000000000000000000 % 0000000000000000000000000000850801e0000000000c00000000000000000000000000000000 % 0000000000070000000000003002142000000000000000000000000000000000 % 0000000000000000000000000000850803c0000000000c00000000000000000000000000000000 % 00000000000e0000000000003002142000000000000000000000000000000002 % 000000000000000000000000000085180f00000000000c00000000000000000000000000000000 % 00000000003c0000000000003002146000000000000000000000000000000003 % 0000000000000000000000000001cef03c00000000000c00000000000000000000000000000000 % 00000000007000000000000030073bc000000000000000000000000000000000 % 000000000000000000000000000000007800000000000c00000000000000000000000000000000 % 0000000000e00000000000003000000000000000000000000000000000000000 % 00000000000000000000000000000001e000000000000c00000000000000000000000000000000 % 0000000001c00000000000003000000000000000000000000000000000000000 % 000000000000000000000000000000078000000000000c00000000000000000000000000000000 % 0000000007800000000000003000000000000000000000000000000000000000 % 0000000000000000000000000000000f0000000000000c0eee1a00000000000000000000000000 % 000000000e000000000000003000000000000000000000000000000000000000 % 0000000000000000000000000000003c0000000000000c045f2400000000000000000000000000 % 000000001c000000000000003000000000000000000000000000000000000000 % 000000000000000000000000000000f00000000000000c06503a00000000000000000000000000 % 0000000038000000000000003000000000000000000000000000000000000000 % 000000000000000000000000000001e00000000000000c02900600000000000000000000000000 % 00000000f0000000000000003000000000000000000000000000000000000000 % 000000000000000000000000000007800000000000000c02992200000000000000000000000000 % 00000001c000000000000001fe00000000000000000000000000000000000000 % 00000000000000000000000000001e000000000000000c010e3c00000000000000000000000000 % 000000438000000000000001fe00000000000000000000000000000000000000 % 00000000000000000000000000083c000000000000000c01000000000000000000000000000000 % 000000e70000000000000000fe00000000000000000000000000000000000000 % 000000000000000000000000001cf0000000000000000c07000000000000000000000000000000 % 000000fe0000000000000000fc00000000000000000000000000000000000000 % 000000000000000000000000003fc0000000000000000c0c000000000000000000000000000000 % 000001f80000000000000000fc00000000000000000000000000000000000000 % 000000000000000000000000007f80000000000000000c00000000000000000000000000000000 % 000003fc00000000000000007c00000000000000000000000000000000000000 % 00000000000000000000000000ff00000000000000000c00000000000000000000000000000000 % 000003fc00000000000000007800000000000000000000000000000000000000 % 00000000000000000000000001ff00000000000000000c00000000000000000000000000000000 % 000007fe00000000000000007800000000000000000000000000000000000000 % 00000000000000000000000001ff80000000000000000c00000000000000000000000000000000 % 00000ff800000000000000003800000000000000000000000000000000000000 % 00000000000000000000000003ff00000000000000007f80000000000000000000000000000000 % 00000fc000000000000000003000000000000000000000000000000000000000 % 00000000000000000000000007e000000000000000007f80000000000000000000000000000000 % 00001e0000000000000000003000000000000000000000000000000000000000 % 000000000000000000000000060000000000000000007f00000000000000000000000000000000 % 0000100000000000000000001000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000003f00000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000003f00000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000003e00000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000001e00000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000001e00000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000001c00000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000c00000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000200000c00000000000000000c00000000000000000000000000000000 % 0200000000000000000000010000000000000000000000000000000000000000 % 000000000000000000000200000400000000000000000800000000000000000000000000000000 % 4200010000000000000000210000800000000000000000000000000000000000 % 000000000000000000000000000400000000000000000000000000000000000000000000000000 % 4000010000000000000000200000800000000000000000000000000000000000 % 000000000000000000dcfe6ec3c400000000000000000000000000000000000000000000001e1e % f677f3ce00000000000f1e7b7779e70000000000000000000000000000000001 % 000000000000000000e64233242400000000000000000000000000000000000000000000002131 % 4223091f000000000010b12122848f8000000000000000000000000000000001 % 00000000000000000042422220e400000000000000000000000000000000000000000000000720 % 42343910000000000003a021341c880000000000000000000000000000000001 % 000000000000000000424222232400000000000000000000000000000000000000000000001920 % 4214c91000000000000ca0211464880000000000000000000000000000000001 % 000000000000000000464222246400000000000000000000000000000000000000000000002331 % 42191919000000000011b121188c8c8000000000000000000000000000000001 % 0000000000000000007ce77773be00000000000000000000000000000000000000000000001d9e % 7708edce00000000000ede3b8876e70000000000000000000000000000000001 % 000000000000000000400000000000000000000000008000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000002 % 000000000000000000400000000000000000000000088000200000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000002 % 000000000000000000e00000000000000000000000080000200000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000002 % 0000000000000000000000000000000000000003c79f9dde79c000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000002 % 00000000000000000000000000000000000000042c4888a123e000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000002 % 0000000000000000000000000000000000000000e8088d07220000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000002 % 000000000000000000080000300000000000000328088519220000000000000000000000000000 % 1006060000000000000000080306000000000000000000000000000000000002 % 00000000000000000008000010000000000000046c488623232000000000000000000000000000 % 1002020000000000000000080102000000000000000000000000000000000002 % 0000000000000000000000001000000000000003b78fc21db9c000000000000000000000000000 % 0002020000000000000000000102000000000000000000000000000000000002 % 00000000000000000359bb3711cee000000000000000000000000000000000000000000001dfcf % b1e2e2706800000001dde7d9e172383400000000000000000000000000000002 % 00000000000000000488ccb993e2c0000000000000000000000000000000000000000000008c24 % 121332f890000000008a120a119a7c4800000000000000000000000000000002 % 00000000000000000748889092010000000000000000000000000000000000000000000000d0e4 % 10721280e800000000d07208710a407400000000000000000000000000000002 % 000000000000000000c88890920380000000000000000000000000000000000000000000005324 % 119212801800000000519209910a400c00000000000000000000000000000002 % 0000000000000000044888919324c0000000000000000000000000000000000000000000006464 % 123232c8880000000062320a311a644400000000000000000000000000000002 % 0000000000000000079ddddf39cee00000000000000000000000000000000000000000000023be % 39dbe770f00000000021df1dd9f7387800000000000000000000000000000002 % 000000000000000000000010000000000000000000040181800000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000002 % 000000000000000000000010000000000000000000040080800000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000002 % 000000000000000000000038000000000000000000000080800000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000007779fc78b88e1a00000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000002 % 0000000000000000000000000000000000000022848484cc9f2400000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000002 % 00000000000000000000000000000000000000341c841c84903a00000000000000000000000000 % 3f0e1000000000000000002f8110000000000000000000000000000000000002 % 000000000000000000000000000000000000001464846484900600000000000000000000000000 % 4891100000000000000000444710000000000000000000000000000000000000 % 00000000000000000000000000000000000000188c848c8c992200000000000000000000000000 % 8891080000000000000000844108000000000000000000000000000000000000 % 000000000000000000000000000000000000000877ce76f9ce3c00000000000000000000000000 % 8891080000000000000000844108000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 8f03080000000000000000878108000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 8802080000000000000000840108000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 8804080000000000000000840108000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 8c08880000000000000000860308000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 9c1f0800000000000000008e0788000000000000000000000000000000000002 % 00000000000000000000000000000000000000000017e0e2000000000000000000000000000000 % 8000080000000000000000800008000000000000000000000000000000000002 % 000000000000000000000000000000000000000000223112000000000000000000000000000000 % 4000100000000000000000400010000000000000000000000000000000000002 % 000000000000000000000000000000000000000000421911000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000420911000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000420831000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000420821000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000421841000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000001 % 00000000000000000000000000000000000000e000421089000000000000000000000000000000 % 0000180000000000000000003000000000000000000000000000000000000000 % 00000000000000000000000000000000000003c00047e1f1000000000000000000000000000000 % 00001e0000000000000000003000000000000000000000000000000000000003 % 000000000000000000000000000000000000078000400001000000000000000000000000000000 % 0000070000000000000000003000000000000000000000000000000000000001 % 00000000000000000000000000371c7ee0001e0000200002000000000000000000000000000000 % 0000038000000000000000003000000000000000000000000000000000000001 % 0000000000000000000000000018be244000780000000000000000000000000000000000000000 % 000001c000000000000000003000000000000000000000000000000000000000 % 0000000000000000000000000010a0364000f00000000000000000000000000000000000000000 % 000000f000000000000000003000000000000000000000000000000000000002 % 0000000000000000000000000010a01a8003c00000000000000000000000000000000000000000 % 0000003800000000000000003000000000000000000000000000000000000001 % 0000000000000000000000000010b21b000f000000000000000000000000000000000000000000 % 0000001c00000000000000003000000000000000000000000000000000000000 % 0000000000000000000000000039dc09001e000000000000000000000000000000000000000000 % 0000000e00000000000000003000000000000000000000000000000000000002 % 000000000000000000000000000000000078000000000c00000000000000000000000000000000 % 0000000780000000000000003000000000000000000000000000000000000001 % 0000000000000000000000000000000001e0000000000c00000000000000000000000000000000 % 00000001c0000000000000003000000000000000000000000000000000000000 % 0000000000000000000000000000000003c0000000000c00000000000000000000000000000000 % 00000000e0000000000000003000000000000000000000000000000000000002 % 000000000000000000000000000000000f00000000000c00000000000000000000000000000000 % 0000000070000000000000003000000000000000000000000000000000000001 % 000000000000000000000000000000003c00000000000c00000000000000000000000000000000 % 000000003c000000000000003000000000000000000000000000000000000000 % 000000000000000000000000000000007800000000000c00000000000000000000000000000000 % 000000000e000000000000003000000000000000000000000000000000000000 % 00000000000000000000000000000001e000000000000c00000000000000000000000000000000 % 0000000007000000000000003000000000000000000000000000000000000001 % 000000000000000000000000000000078000000000000c00000000000000000000000000000000 % 0000000003800000000000003000000000000000000000000000000000000001 % 0000000000000000000000000000000f0000000000000c00000000000000000000000000000000 % 0000000001e00000000000003000000000000000000000000000000000000000 % 00000000000000000000000000000c3c0000000000000c00000000000000000000000000000000 % 0000000000700000000000003000000000000000000000000000000000000003 % 00000000000000000000000000001ef00000000000000c00000000000000000000000000000000 % 0000000000380000000000003000000000000000000000000000000000000001 % 00000000000000000000000000001fe00000000000000c00dc79b8e00000000000000000000000 % 00000000001c0000000000003000000000000000000000000000000000000000 % 00000000000000000000000000003f800000000000000c0062ccc5f00000000000000000000000 % 00000000000f0000000000003000000000000000000000000000000000000002 % 00000000000000000000000000007f800000000000000c00428485000000000000000000000000 % 0000000000038000000000003000000000000000000000000000000000000001 % 0000000000000000000000000000ff800000000000000c00428485000000000000000000000000 % 000000000001c000000000003000000000000000000000000000000000000000 % 0000000000000000000000000001ffc00000000000000c00428c85900000000000000000000000 % 000000000000e000000000003000000000000000000000000000000000000003 % 0000000000000000000000000003fe000000000000000c00e779cee00000000000000000000000 % 000000000000780000000001fe00000000000000000000000000000000000001 % 0000000000000000000000000003e0000000000000000c00000000000000000000000000000000 % 0000000000001c6000000001fe00000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000c00000000000000000000000000000000 % 0000000000000ee000000000fe00000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000c00000000000000000000000000000000 % 00000000000007f000000000fc00000000000000000000000000000000000001 % 000000000000000000000000000000000000000000000c00000000000000000000000000000000 % 00000000000003f800000000fc00000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000c00000000000000000000000000000000 % 00000000000007f8000000007c00000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000c00000000000000000000000000000000 % 00000000000007fc000000007800000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000c00000000000000000000000000000000 % 00000000000007fc000000007800000000000000000000000000000000000000 % 000000000000000000000000000000000000000000007f80000000000000000000000000000000 % 00000000000000fe000000003800000000000000000000000000000000000000 % 000000000000000000000000000000000000000000007f80000000000000000000000000000000 % 000000000000003f000000003000000000000000000000000000000000000001 % 000000000000000000003000030000000000000000007f80000000000000000000000000000000 % 0000000000000007000000003000000000000000000000000000000000000000 % 000000000000000000001000010000000000000000003f00000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000001000010000000000000000003f00000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000001f109e10000000000000000003f00000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000003131a110000000000000000001e00000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000002 % 000000000000000000021108710000000000000000001e00000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000021109910000000000000000001e00000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000002311a310000000000000000000c00000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000001d8eddb8000000000000000000c00000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000c00000000000000000000000000000000 % 000000000000000000c000000200000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000004000004200010000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000004000004000010000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000007c71e3cf6eef3ce00000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000c4fa1624245091f00000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000084807404268391000000000000000000000000000000000 % 000000000000000000080000300000000000000000000000000000000000000000000000000000 % 0000000000000000084819404228c91000000000000000000000000000000000 % 000000000000000000080000100000000000000000000000000000000000000000000000000000 % 000000000000000008cca3624231191900000000000000000000000000000000 % 000000000000000000000000100000000000000000000000000000000000000000000000000000 % 000000000000000007671dbc7710edce00000000000000000000000000000000 % 00000000000000000359bb3711cee0000000000000008000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000488ccb993e2c0000000000000088000200000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000007488890920100000000000000080000200000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000c888909203800000000003c79f9dde79c000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000044888919324c000000000042c4888a123e000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000079ddddf39cee00000000000e8088d07220000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000010000000000000000328088519220000000000000000000000000000 % 0000000000000000000000080306000000000000000000000000000000000000 % 00000000000000000000001000000000000000046c488623232000000000000000000000000000 % 0000000000000000000000080102000000000000000000000000000000000000 % 0000000000000000000000380000000000000003b78fc21db9c000000000000000000000000000 % 0000000000000000000000000102000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000001dde7d9e172383400000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000008a120a119a7c4800000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000d07208710a407400000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000519209910a400c00000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000062320a311a644400000000000000000000000000000000 % 000000000000000000000000000000000000000000040181800000000000000000000000000000 % 00000000000000000021df1dd9f7387800000000000000000000000000000000 % 000000000000000000000000000000000000000000040080800000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000080800000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000007779fc78b88e1a00000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000022848484cc9f2400000000000000000000000000 % 0000000000000000000000003000000000000000000000000000000000000001 % 00000000000000000000000000000000000000341c841c84903a00000000000000000000000000 % 0000000000000000000000003000000000000000000000000000000000000001 % 000000000000000000000000000000000000001464846484900600000000000000000000000000 % 0000000000000000000000003000000000000000000000000000000000000001 % 00000000000000000000000000000000000000188c848c8c992200000000000000000000000000 % 0000000000000000000000003000000000000000000000000000000000000001 % 000000000000000000000000000000000000000877ce76f9ce3c00000000000000000000000000 % 0000000000000000000000003000000000000000000000000000000000000001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000003000000000000000000000000000000000000001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000003000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000003000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000003000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000003000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000003000000000000000000000000000000000000002 % 0000000000000000000000000000000000000000000be084000000000000000000000000000000 % 0000000000000000000000003000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000111384000000000000000000000000000000 % 0000000000000000000000003000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000211082000000000000000000000000000000 % 0000000000000000000000003000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000211082000000000000000000000000000000 % 0000000000000000000000003000000000000000000000000000000000000002 % 00000000000000000000000000000000000000000021e082000000000000000000000000000000 % 0000000000000000000000003000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000210082000000000000000000000000000000 % 0000000000000000000000003000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000210082000000000000000000000000000000 % 0000000000000000000000003000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000218182000000000000000000000000000000 % 0000000000000000000000003000000000000000000000000000000000000002 % 0000000000000000000000000000000000000000002383c2000000000000000000000000000000 % 0000000000000000000000003000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000200002000000000000000000000000000000 % 0000000000000000000000003000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000100004000000000000000000000000000000 % 0000000000000000000000003000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000003000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000003000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000001fe00000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000001fe00000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000c00000000000000000000000000000000 % 000000000000000000000001fe00000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000c00000000000000000000000000000000 % 000000000000000000000000fe00000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000c00000000000000000000000000000000 % 000000000000000000000000fc00000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000c00000000000000000000000000000000 % 000000000000000000000000fc00000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000c00000000000000000000000000000000 % 0000000000000000000000007c00000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000c00000000000000000000000000000000 % 0000000000000000000000007800000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000c00000000000000000000000000000000 % 0000000000000000000000007800000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000c00000000000000000000000000000000 % 0000000000000000000000003800000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000c00000000000000000000000000000000 % 0000000000000000000000003000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000c00000000000000000000000000000000 % 0000000000000000000000003000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000c00000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000c00000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000c00000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000c00000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000c00000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000c00000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000000000000000000000c00000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000c00000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000c00000000000000000000000000000000 % 0000000000000000000000040000180000000000000000000000000000000001 % 000000000000000000000000000000000000000000000c00000000000000000000000000000000 % 0000000000000000000000040000080000000000000000000000000000000001 % 000000000000000000000000000000000000000000000c00000000000000000000000000000000 % 0000000000000000000000000000080000000000000000000000000000000000 % 000000000000000000000000000000000000000000000c00000000000000000000000000000000 % 00000000000000000001b9fcdd87880000000000000000000000000000000002 % 000000000000000000000000000000000000000000000c00000000000000000000000000000000 % 00000000000000000001cc846648480000000000000000000000000000000001 % 000000000000000000000000000000000000000000000c00000000000000000000000000000000 % 0000000000000000000084844441c80000000000000000000000000000000000 % 000000000000000000000000000000000000000000000c00000000000000000000000000000000 % 0000000000000000000084844446480000000000000000000000000000000002 % 000000000000000000000000000000000000000000007f80000000000000000000000000000000 % 000000000000000000008c844448c80000000000000000000000000000000001 % 000000000000000000000000000000000000000000007f80000000000000000000000000000000 % 00000000000000000000f9ceeee77c0000000000000000000000000000000000 % 000000000000000000000000000000000000000000007f00000000000000000000000000000000 % 0000000000000000000080000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000003f00000000000000000000000000000000 % 0000000000000000000080000000000000000000000000000000000000000001 % 000000000000000000000000000000000000000000003f00000000000000000000000000000000 % 00000000000000000001c0000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000003e00000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000001e00000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000000000000000000001e00000000000000000000000000000000 % 0000000000000000000010000060000000000000000000000000000000000001 % 000000000000000000000000000000000000000000001c00000000000000000000000000000000 % 0000000000000000000010000020000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000c00000000000000000000000000000000 % 0000000000000000000000000020000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000c00000000000000000000000000000000 % 00000000000000000006b6ec6e239dc000000000000000000000000000000001 % 000000000000000000000000000000000000000000000800000000000000000000000000000000 % 0000000000000000000913327327c58000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000e92222124020000000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000192222124070000000000000000000000000000000001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000892222326498000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000f3f773e739dc000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000002000000000000000000000000000000000000001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000002000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000007000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000010000060000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000000000000000000010000020000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000020000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000003 % 00000000000000000000000000000000000000006efb3763c20000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000073411994220000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000021411110e20000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000021411113220000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000000000000000023411114620000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000003ee3bbbbb70000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000020000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000020000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000070000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000008000018000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000008000008000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000008000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000001b9bb1b89c77000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000248cc9ccbe16000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000003a888884a008000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000006888884a01c000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000002288888cb226000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000003ddddcf9dc77000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000800000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000800000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000001c00000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000 %%EndPreview save /d_sv_obj exch def userdict /IslandDrawDict 300 dict dup begin put /bdef {bind def} bind def /E {exch} bdef /FF {findfont} bdef /MF {makefont} bdef /RO {rotate} bdef /SC {scale} bdef /SF {setfont} bdef /SG {setgray} bdef /TR {translate} bdef /bp {lj lw rgb} bdef /bpbw {lj lw setgray} bdef /c {curveto} bdef /cl {closepath} bdef /fi {eofill} bdef /g {setgray} bdef /gr {grestore} bdef /gs {gsave} bdef /l {lineto} bdef /lj {setlinejoin} bdef /lw {setlinewidth} bdef /m {moveto} bdef /n {newpath} bdef /nx {/x E def} bdef /r {rmoveto} bdef /rl {rlineto} bdef /rgb {setrgbcolor} bdef /s {show} bdef /sd {setdash} bdef /sp {x 0 rmoveto} bdef /ss {currentpoint pop E m} bdef /st {stroke} bdef %% pattern stuff /BPSIDE 32 def %% pixels per pattern side /PATFREQ 3.0 def %% pattern pixels per mm /dp_mat [PATFREQ 0 0 PATFREQ 0 0] def /dp_pw BPSIDE def %% pattern pixel width /dp_ph BPSIDE def %% pattern pixel height /dp_w dp_pw PATFREQ div def %% pattern mm width /dp_h dp_ph PATFREQ div def %% pattern mm height /savemat matrix def /topmat matrix def /patmat matrix def %% catch nocurrentpoint error for: pathbbox /ncpoint errordict /nocurrentpoint get def errordict begin /nocurrentpoint { dup /pathbbox load eq {pop 0 0 1 1} {ncpoint} ifelse } bdef end /ar { %% sa ea sx sy rot tx ty matrix currentmatrix 8 1 roll TR RO SC n 0 0 1 5 3 roll arc setmatrix } bdef /arn { %% sa ea sx sy rot tx ty TR RO SC matrix currentmatrix 8 1 roll n 0 0 1 5 3 roll arcn setmatrix } bdef /el { %% sx sy rot tx ty matrix currentmatrix 6 1 roll TR RO SC n 0 0 1 0 360 arc setmatrix cl } bdef /image_raster { %% sw sh sd dw dh xs ys TR SC /sd E def /sh E def /sw E def /imagebuf sw sd mul 7 add 8 idiv string def sw sh sd [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop} image } bdef /imagemask_raster { TR SC /sh E def /sw E def /imagebuf sw 7 add 8 idiv string def sw sh false [sw 0 0 sh 0 0] {currentfile imagebuf readhexstring pop} imagemask } bdef /dither_color_raster { % bool sw sh sd dw dh xs ys TR SC /sd E def /sh E def /sw E def sd 8 eq and { /imagebuf 3 string def /grayval 1 string def sw sh sd [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop pop imagebuf 0 get 0.299 mul imagebuf 1 get 0.587 mul add imagebuf 2 get 0.114 mul add cvi grayval exch 0 exch put grayval } image } { /imagebuf sw 3 mul sd mul 7 add 8 idiv string def sh { currentfile imagebuf readhexstring pop pop } repeat } ifelse } bdef /image_color_raster { % bool sw sh sd dw dh xs ys /colorimage where not { dither_color_raster } { pop TR SC /sd E def /sh E def /sw E def pop /imagebuf sw 3 mul sd mul 7 add 8 idiv string def sw sh sd [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop} false 3 colorimage } ifelse } bdef /patpath { /inv E def topmat setmatrix pathbbox %% get lo - hi indecies /hy E dp_h div floor cvi def /hx E dp_w div floor cvi def /ly E dp_h div floor cvi def /lx E dp_w div floor cvi def lx 1 hx { dp_w mul ly 1 hy { dp_h mul E dup 3 1 roll E patmat currentmatrix pop TR dp_pw dp_ph inv dp_mat dp_proc imagemask patmat setmatrix } for pop } for } bdef % setpattern brush of patterns instead of gray /setpattern { /blue E def /green E def /red E def /freq E def /bwidth E def /bpside E def /bstring E def /onbits 0 def /offbits 0 def freq 0 {/y E def /x E def /xindex x 1 add 2 div bpside mul cvi def /yindex y 1 add 2 div bpside mul cvi def bstring yindex bwidth mul xindex 8 idiv add get not 1 7 xindex 8 mod sub bitshift and 0 ne {/onbits onbits 1 add def 1} {/offbits offbits 1 add def 0} ifelse } setscreen {} settransfer systemdict /setcmykcolor known { /fact 1 onbits offbits onbits add div sub def 1 red sub fact mul 1 green sub fact mul 1 blue sub fact mul 0 setcmykcolor } { offbits offbits onbits add div setgray} ifelse } bdef /dmatrix matrix def /dpi 72 0 dmatrix defaultmatrix dtransform dup mul E dup mul add sqrt def /B {gs bp st gr} bdef %% brush: gr lw lj /Bbw {gs bpbw st gr} bdef %% brush: gr lw lj /F {gs rgb eofill gr} bdef %% fill: gr /Fbw {gs setgray eofill gr} bdef %% fill: gr /PB {gs lj lw setpattern st gr} bdef /PF {gs eoclip patpath gr} bdef /BB {gs rgb lj lw strokepath clip patpath gr} bdef /xdef {exch def} bdef /clip_region { /ht xdef /wd xdef /bm xdef /lm xdef newpath lm bm moveto 0 ht rlineto wd 0 rlineto 0 ht neg rlineto closepath clip } bdef %! Island text prolog Version 3.1 %% %%BeginProlog /reencode_small_dict 12 dict def /ReencodeSmall { reencode_small_dict begin /new_codes_and_names exch def /new_font_name exch def /base_font_name exch def /base_font_dict base_font_name findfont def /newfont base_font_dict maxlength dict def base_font_dict { exch dup /FID ne { dup /Encoding eq { exch dup length array copy newfont 3 1 roll put } { exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall newfont /FontName new_font_name put new_codes_and_names aload pop new_codes_and_names length 2 idiv { newfont /Encoding get 3 1 roll put } repeat new_font_name newfont definefont pop end %reencode_small_dict } def /extended_Zapf [ 8#223 /a89 8#224 /a90 8#225 /a93 8#226 /a94 8#227 /a91 8#230 /a92 8#231 /a205 8#232 /a85 8#233 /a206 8#234 /a86 8#235 /a87 8#236 /a88 8#237 /a95 8#240 /a96 ] def /extended_Standard [ 29 /thorn 30 /yacute 31 /divide 128 /Acircumflex 129 /Adieresis 130 /Agrave 131 /Aring 132 /Atilde 133 /Ccedilla 134 /Eacute 135 /Ecircumflex 136 /Edieresis 137 /Egrave 138 /Iacute 139 /Icircumflex 140 /Idieresis 141 /Igrave 142 /Ntilde 143 /Oacute 144 /Ocircumflex 145 /Odieresis 146 /Ograve 147 /Otilde 148 /Scaron 149 /Uacute 150 /Ucircumflex 151 /Udieresis 152 /Ugrave 153 /Ydieresis 154 /Zcaron 155 /aacute 156 /acircumflex 157 /adieresis 158 /agrave 159 /aring 160 /atilde 161 /exclamdown 162 /cent 163 /sterling 164 /fraction 165 /yen 166 /florin 167 /section 168 /currency 169 /quotesingle 170 /quotedblleft 171 /guillemotleft 172 /guilsinglleft 173 /guilsinglright 174 /fi 175 /fl 176 /plusminus 177 /endash 178 /dagger 179 /daggerdbl 180 /periodcentered 181 /twosuperior 182 /paragraph 183 /bullet 184 /quotesinglbase 185 /quotedblbase 186 /quotedblright 187 /guillemotright 188 /ellipsis 189 /perthousand 190 /threesuperior 191 /questiondown 192 /mu 193 /grave 194 /acute 195 /circumflex 196 /tilde 197 /macron 198 /breve 199 /dotaccent 200 /dieresis 201 /onesuperior 202 /ring 203 /cedilla 204 /onequarter 205 /hungarumlaut 206 /ogonek 207 /caron 208 /emdash 209 /ccedilla 210 /copyright 211 /eacute 212 /ecircumflex 213 /edieresis 214 /egrave 215 /iacute 216 /icircumflex 217 /idieresis 218 /igrave 219 /logicalnot 220 /minus 221 /ntilde 222 /oacute 223 /ocircumflex 224 /odieresis 225 /AE 226 /onehalf 227 /ordfeminine 228 /ograve 229 /otilde 230 /registered 231 /scaron 232 /Lslash 233 /Oslash 234 /OE 235 /ordmasculine 236 /trademark 237 /uacute 238 /ucircumflex 239 /udieresis 240 /ugrave 241 /ae 242 /ydieresis 243 /zcaron 244 /Aacute 245 /dotlessi 246 /threequarters 247 /Eth 248 /lslash 249 /oslash 250 /oe 251 /germandbls 252 /multiply 253 /Yacute 254 /Thorn 255 /eth ] def /extended_Symbol [ ] def /extend_font { % stack: fontname newfontname exch dup (ZapfDingbats) eq { cvn exch cvn extended_Zapf ReencodeSmall } { dup (Symbol) eq { cvn exch cvn extended_Symbol ReencodeSmall } { cvn exch cvn extended_Standard ReencodeSmall } ifelse } ifelse } bind def /extend_font_name { % stack: font_name_string dup length 1 add string /extended_font_name exch def extended_font_name 0 (_) putinterval extended_font_name 1 3 -1 roll putinterval extended_font_name } bind def /gf { /f exch def f cvn where { f exch begin cvn load exec setfont end } { f 0 f length 8 sub getinterval dup /localfont exch extend_font_name def localfont extend_font localfont findfont /xsz f f length 4 sub 4 getinterval cvi def /ysz f f length 8 sub 4 getinterval cvi def [ xsz 0 0 ysz neg 0 0 ] makefont dup f cvn exch def setfont } ifelse } bind def /gfns { /f exch def f cvn where { f exch begin cvn load exec setfont end } { f 0 f length 8 sub getinterval cvn findfont /xsz f f length 4 sub 4 getinterval cvi def /ysz f f length 8 sub 4 getinterval cvi def [ xsz 0 0 ysz neg 0 0 ] makefont dup f cvn exch def setfont } ifelse } bind def /ul { % space drop thickness gs currentpoint currentlinewidth currentpoint n m 6 -3 roll lw 0 exch r 0 rl st lw m gr } bind def /nxtab { currentpoint pop 1000.0 mul cvi tab mod tab exch sub 1000.0 div 0 rmoveto } bind def /nx { /x exch def } bind def 0. nx %%EndProlog gsave 2.83465 -2.83465 scale 0 -279.4 translate topmat currentmatrix pop n savemat currentmatrix pop [1 0 0 1 57.5 50] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -486 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (force dual) s -468 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (feasibility) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 30 70] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -378 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (activate) s -438 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (variables) s -202 231 m 463 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(D2\)) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 37.5 57.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -158 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (yes) s savemat setmatrix n 35 65 m 36.734 62.32 l 37.995 63.897 l cl 0 0 0 F n 47.5 55 m 37.364 63.108 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 30 95] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -218 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dual) s -376 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (simplex) s savemat setmatrix n 30 90 m 28.991 86.972 l 31.009 86.972 l cl 0 0 0 F n 30 80 m 30 86.972 l gsave 0 0 0 0.176 0 B grestore n 57.5 65 m 56.491 61.972 l 58.509 61.972 l cl 0 0 0 F n 57.5 55 m 57.5 61.972 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 52.5 60] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -122 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (no) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 57.5 70] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -378 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (activate) s -438 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (variables) s -184 231 m 463 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(P1\)) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 57.5 95] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -318 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (primal) s -376 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (simplex) s savemat setmatrix n 57.5 90 m 56.491 86.972 l 58.509 86.972 l cl 0 0 0 F n 57.5 80 m 57.5 86.972 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 72.5 117.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -378 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (activate) s -552 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (constraints) s -524 231 m 463 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(bounding\)) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 47.5 140] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -218 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dual) s -376 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (simplex) s savemat setmatrix n 72.5 137.5 m 71.491 134.47 l 73.509 134.47 l cl 0 0 0 F n 72.5 127.5 m 72.5 134.47 l gsave 0 0 0 0.176 0 B grestore n 50 135 m 52.077 132.58 l 53.116 134.31 l cl 0 0 0 F n 62.5 127.5 m 52.596 133.44 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 52.5 130] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -196 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (new) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 80 132.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -240 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (none) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 72.5 142.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -408 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (loadable) s -492 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (variables?) s savemat setmatrix n 50 155 m 52.077 152.58 l 53.116 154.31 l cl 0 0 0 F n 62.5 147.5 m 52.596 153.44 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 47.5 160] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -318 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (primal) s -376 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (simplex) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 55 150] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -122 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (no) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 72.5 162.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -378 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (activate) s -438 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (variables) s -202 231 m 463 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(D2\)) s savemat setmatrix n 72.5 157.5 m 71.491 154.47 l 73.509 154.47 l cl 0 0 0 F n 72.5 147.5 m 72.5 154.47 l gsave 0 0 0 0.176 0 B grestore n 52.5 177.5 m 54.577 175.08 l 55.616 176.81 l cl 0 0 0 F n 65 170 m 55.096 175.94 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 55 172.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -196 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (new) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 47.5 182.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -218 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dual) s -376 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (simplex) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 72.5 187.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -378 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (activate) s -438 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (variables) s -184 231 m 463 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(P1\)) s savemat setmatrix n 72.5 182.5 m 71.491 179.47 l 73.509 179.47 l cl 0 0 0 F n 72.5 172.5 m 72.5 179.47 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 77.5 152.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -158 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (yes) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 80 177.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -240 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (none) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 72.5 212.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -318 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (primal) s -376 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (simplex) s savemat setmatrix n 72.5 207.5 m 71.491 204.47 l 73.509 204.47 l cl 0 0 0 F n 72.5 197.5 m 72.5 204.47 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 100 32.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -218 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dual) s -376 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (simplex) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 137.5 140] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -586 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (force primal) s -468 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (feasibility) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 137.5 160] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -378 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (activate) s -438 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (variables) s -184 231 m 463 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(P1\)) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 112.5 160] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -378 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (activate) s -438 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (variables) s -184 231 m 463 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(P2\)) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 137.5 115] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -378 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (activate) s -552 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (constraints) s -438 231 m 463 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(violated\)) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 112.5 137.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -218 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dual) s -376 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (simplex) s savemat setmatrix n 137.5 135 m 136.49 131.97 l 138.51 131.97 l cl 0 0 0 F n 137.5 125 m 137.5 131.97 l gsave 0 0 0 0.176 0 B grestore n 115 132.5 m 117.08 130.08 l 118.12 131.81 l cl 0 0 0 F n 127.5 125 m 117.6 130.94 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 117.5 127.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -196 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (new) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 145 130] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -240 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (none) s savemat setmatrix n 115 155 m 116.73 152.32 l 117.99 153.9 l cl 0 0 0 F n 127.5 145 m 117.36 153.11 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 137.5 205] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -318 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (primal) s -376 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (simplex) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 142.5 150] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -122 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (no) s savemat setmatrix n 137.5 180 m 136.49 176.97 l 138.51 176.97 l cl 0 0 0 F n 137.5 170 m 137.5 176.97 l gsave 0 0 0 0.176 0 B grestore n 137.5 155 m 136.49 151.97 l 138.51 151.97 l cl 0 0 0 F n 137.5 145 m 137.5 151.97 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 120 147.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -158 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (yes) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 137.5 185] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -492 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (deactivate) s -438 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (variables) s savemat setmatrix n 127.5 180 m 124.51 178.9 l 125.77 177.32 l cl 0 0 0 F n 115 170 m 125.14 178.11 l gsave 0 0 0 0.176 0 B grestore n 137.5 200 m 136.49 196.97 l 138.51 196.97 l cl 0 0 0 F n 137.5 190 m 137.5 196.97 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 157.5 32.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -306 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (DONE) s -588 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(other error\)) s savemat setmatrix n 65 45 m 67.437 42.938 l 68.186 44.813 l cl 0 0 0 F n 90 35 m 67.811 43.875 l gsave 0 0 0 0.176 0 B grestore n 72.5 112.5 m 72.403 109.31 l 74.337 109.89 l cl 0 0 0 F n 95 37.5 m 73.37 109.6 l gsave 0 0 0 0.176 0 B grestore n 130 110 m 127.98 107.53 l 129.87 106.81 l cl 0 0 0 F n 102.5 37.5 m 128.93 107.17 l gsave 0 0 0 0.176 0 B grestore n 150 50 m 146.81 50.06 l 147.41 48.133 l cl 0 0 0 F n 110 37.5 m 147.11 49.097 l gsave 0 0 0 0.176 0 B grestore n 145 32.5 m 141.97 33.509 l 141.97 31.491 l cl 0 0 0 F n 110 32.5 m 141.97 32.5 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 67.5 35] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -426 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (lost dual) s -468 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (feasibility) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 90 87.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -450 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (excessive) s -280 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (swing) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 115 95] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -366 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (punt or) s -208 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (stall) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 122.5 47.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -438 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (accuracy) s -284 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (check) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 130 27.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -256 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (other) s -240 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (error) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 152.5 55] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -160 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (full) s -396 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (system?) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 165 75] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -602 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (activate full ) s -874 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (constraint system) s savemat setmatrix n 165 70 m 161.97 68.991 l 163.18 67.376 l cl 0 0 0 F n 155 62.5 m 162.58 68.183 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 137.5 75] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -306 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (DONE) s -468 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(accuracy) s -314 231 m 463 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (check\)) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 165 95] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -700 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (primal or dual) s -376 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (simplex) s savemat setmatrix n 165 90 m 163.99 86.972 l 166.01 86.972 l cl 0 0 0 F n 165 80 m 165 86.972 l gsave 0 0 0 0.176 0 B grestore n 137.5 70 m 139.32 67.376 l 140.53 68.991 l cl 0 0 0 F n 147.5 62.5 m 139.92 68.183 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 140 65] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -158 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (yes) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 162.5 65] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -122 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (no) s savemat setmatrix userdict /#copies 1 put grestore %%Trailer %%DocumentNeededResources: font Bookman-Light %%DocumentSuppliedResources: end d_sv_obj restore DyLP-1.6.0/DyLP/doc/Figures/primalerrorflow.epsu0000644000076700007670000043303311171477034016404 0ustar %!PS-Adobe-3.0 EPSF-3.0 %%Title: /cs/mitacs1/lou/Bonsai/Doc/Dylp.New/primalerrorflow.epsu %%Creator: IslandDraw for lou %%CreationDate: Fri Aug 19 17:19:40 2005 %%Pages: 1 %%BoundingBox: 71 90 577 652 %%DocumentNeededResources: (atend) %%DocumentSuppliedResources: (atend) %%EndComments %%BeginPreview: 633 703 1 2109 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000a % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0014 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000000000000040000000000000000000400001800 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0035 % 000000000000000000000000000000000000000000000000040000000000000000000400000800 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 003f % 000000000000000000000000000000000000000000000000000000000000000000000000000800 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0052 % 00000000000000000000000000000000000000039dde3868dceee0000000000001bbecdd8f0800 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 005c % 0000000000000000000000000000000000000007c5b17c912445f0000000000001cd0466508800 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0066 % 0000000000000000000000000000000000000004022040e9d46900000000000000850444438800 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0070 % 0000000000000000000000000000000000000004072040183429000000000000008504444c8800 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 007a % 000000000000000000000000000000000000000649b164891431900000000000008d0444518800 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0004 % 00000000000000000000000000000000000000039dde38f1ee10e0000000000000fb8eeeeedc00 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000e % 000000000000000000000000000000000000000000000000000000000000000000800000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0018 % 000000000000000000000000000000000000000000000000000000000000000000800000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0022 % 000000000000000000000000000000000000000000000000000000000000000001c00000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000040000000000000000000100000600000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000040000000000000000000100000200000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000006000000000000000000000200000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 00000000000000000000000000000000000000000037f7cdc38000000000000006b6ec6e239dc0 % 038000000000000000000000000000000080000000000000000000000000000000000000000000 % 0055 % 00000000000000000000000000000000000000000049224624400000000000000913327327c580 % 03f800000000000000000000000000001180000000000000000000000000000000000000000000 % 0055 % 00000000000000000000000000000000000000000075b24424400000000000000e922221240200 % 007f00000000000000000000000000001080000000000000000000000000000000000000000000 % 0055 % 0000000000000000000000000000000000000000000cd444238000000000000001922221240700 % 0007f00000000000000000000000000f3cb8e7c000000000000000000000000000000000000000 % 0055 % 00000000000000000000000000000000000000000044d844240000000000000008922223264980 % 00007f0000000000000000000000001990c5f20000000000000000000000000000000000000000 % 0055 % 0000000000000000000000000000000000000000007848ee77c00000000000000f3f773e739dc0 % 000007f00000000000000000000000109085020000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000046000000000000000000020000000 % 000000ff0000000000000000000000109085020000000000000000000000000000000000000000 % 0055 % 0000000000000000000000000000000000000000000000000c6000000000000000000020000000 % 0000000ff000000000000000000000119085920000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000078000000000000000000070000000 % 00000000fe000000000000000000000f1dcee70000000000000000000000000000000000000000 % 0055 % 0000000000000000000000000002000000000000000000000000000000000f0000c00000000c06 % 000000000fe0000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000004200008000000000000000000000000001ff0000c00000000c07 % c000000000fe000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 00000000000000000000000000400000800000000000000000000000003fe00001c00000000e01 % f0000000000fe00000000000000000000000000000000000000000000000000000000000000000 % 0055 % 00000000000000000000000f1ef677f1ee000000000000000000000007fc000001800000000600 % 7c0000000001fe0000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000010b14223089f0000000000000000000000ff80000003800000000600 % 1f00000000001fe000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000003a042343890000000000000000000001ff000000003000000000300 % 07c00000000001fc00000000000000000000000000000000000000000000000000000000000000 % 0055 % 00000000000000000000000ca04214c89000000000000000000003fe0000000007000000000300 % 01f000000000001fc0000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000011b1421918990000000000000000007fc00000000006000000000180 % 003c000000000001fc000000000000000000000000000000000000000000000000000000000000 % 0055 % 00000000000000000000000ede7708ecee00000000000000000ff800000000000e000000000180 % 000f0000000000001fc00000000000000000000000000000000000000000000000000000000000 % 0055 % 00000000000000000000000000000000000000000000000001ff0000000000000c0000000000c0 % 0003c0000000000003fc0000000000073efbcf8000000000000000000000000000000000000000 % 0055 % 0000000000000000000000000000000000000000000000003fe00000000000001c0000000000c0 % 0000f00000000000003fc0000000000f9046640000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000007fc00000000000000180000000000e0 % 00003c00000000000003f800000000081044240000000000000000000000000000000000000000 % 0055 % 0000000000000000000000000000000000000000008000ff800000000000000038000000000060 % 00000f800000000000003f80000000081044240000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000003c01ff0000000000000000030000000000060 % 000003e000000000000003f80000000c9044640000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000007c3fe00000000000000000070000000000030 % 000000f8000000000000003f8000000738e3ce0000000000000000000000000000000000000000 % 0055 % 00000000000000000000000000000002000000001fffc000000000000000000060000000000030 % 0000003e0000000000000007f80000000000000000000000000000000000000000000000000000 % 0055 % 00000000000000000000000000040002002000007ff800000000000000000000e0000000000018 % 0000000f80000000000000007f8000000000000000000000000000000000000000000000000000 % 0055 % 0000000000000000000000000004000000200001ffc000000000000000000000c0000000000018 % 00000003e00000000000000007f000000000000000000000000000000000000000000000000000 % 0055 % 0000000000000000000079e6e1af7de66e78d001ffe000000000000000000001c000000000001c % 000000007800000000000000007f00000000000000000000000000000000000000000000000000 % 0055 % 00000000000000000000c73312442212312120001fe0000000000000000000018000000000000c % 000000001e000000000000000007f0000000000000000000000000000000000000000000000000 % 0055 % 00000000000000000000821213a420722121d0000000000000000000000000038000000000000c % 00000000078000000000000000007f000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000008212106421922120300000000000000000000000000300000000000006 % 0000000001e000000000000000000ff00000000000000000000000000000000000000000000000 % 0011 % 00000000000000000000c632122422322121100000000000000000000000000700000000000006 % 000000000078000000000000000000ff0000000000000000000000000000000000000000000000 % 0055 % 0000000000000000000079e73bc771df73b9e00000000000000000000000000600000000000003 % 00000000001f0000000000000000000fe000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000e00000000000003 % 000000000007c0000000000000000000fe00000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000c00000000000001 % 800000000001f00000000000000000000fe0000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000001c00000000000001 % 8000000000007c00000000000000000000fe000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000001800000000000001 % c000000000001f000000000000000000001fe00000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000003800000000203000 % c0000000000007c000000000000000000001fe0000000000000000000000000000000000000000 % 002c % 000000000000000000000e00000000640000800000000000000000000000003000000000202000 % c0000000000000f0000000000000000000001fc000000000000000000000000000000000000000 % 002b % 000000000000000000001200000000240000800000000000000000000000007000dc42dc782000 % 600000000000003c0000000000000000000001fc00000000000000000000000000000000000000 % 002b % 000000000000000000002200000000200006400000000000000000000000006000e6c662204000 % 600000000000000f00000000000000000000001fc0000000000000000000000000000000000000 % 002c % 0000000000000000000022e3c42dc3ecdc3840000000000000000000000000e000424242204000 % 3000000000000003c00000000000000000000001fc000000000000000000000000000000000000 % 002b % 0000000000000000000023366c662624624440000000000000000000000000c000424242208000 % 3000000000000000f000000000000000000000003fc00000000000000000000000000000000000 % 002b % 00000000000000000000221424242424424440000000000000000000000001c000464642208000 % 38000000000000003e000000000000000000000003fc0000000000000000000000000000000000 % 002c % 0000000000000000000022142424242442384000000000000000000000000180007c3be7390000 % 18000000000000000f8000000000000000000000003f8000000000000000000000000000000000 % 002b % 000000000000000000002234646424644240400000000000000000000000038000400000010000 % 180000000000000003e0000000000000000000000003f800000000000000000000000000000000 % 002b % 0000000000000000000023e3c3be73bee77c400000000000000000000000030000400000030000 % 0c0000000000000000f80000000000000000000000003f80000000000000000000000000000000 % 002c % 000000000000000000002000000000000046400000000000000000000000070000e00000000000 % 0c00000000000000003e00000000000000000000000003f8008000000000000000000000000000 % 002b % 00000001b8e3f700000010000000000000c6800000000000000000000000060000000000000000 % 0600000000000000000f800000000000000000000000007f80e000000000000000000000000000 % 002b % 00000000c5f12200000000000000000000780000000000000000000000000e0000000000000000 % 06000000000000000001e000000000000000000000000007f8f800000000000000000000000000 % 002c % 000000008501b200000000000000000000000000000000000000000000000c0000000000cc0000 % 0300000000000000000078000000000000000000000000007ffc00000000000000000000000000 % 002b % 000000008500d400000000000000000000000000000000000000000000001c0000000400440000 % 030000000000000000001e0000000000000000000000000007ff00000000000000000000000000 % 002b % 000000008590d80000000000000000000000000000000000000000000000180000000400440000 % 03800000000000000000078000000000000000000000000001ff80000000000000000000000000 % 002c % 00000001cee048000600000000000000000000000000000000000000000038000000df3c440000 % 0180000000000000000001e000000000000000000000000001ffe03f03c71dfc00000000000000 % 002b % 00000000000000000e000000000030000000000000000000000000000000300000012442440000 % 01800000000000000000007c00000000000000000000000003ffe0118423888c00000000000000 % 002b % 00000000000000003c00000000003000000000000000000000000000000070000001d40e440000 % 00c00000000000000000001f00000000000000000000000000000010c822888200000000000000 % 0000 % 000000000000000078000000000030000000000000000000000000000000600000003432440000 % 00c000000000000000000007c00000000000000000000000000000104812c89000000000000000 % 002b % 0000000000000001e0000000000030000000000000000000000000000000e00000011446440000 % 006000000000000000000001f0000000000000000000000000000010481268f000000000000000 % 002b % 0000000000000003c0000000000030000000000000000000000000000000c0000001e73bee0000 % 0060000000000000000000007c0000000000000000000000000000104812689000000000000000 % 002c % 000000000000000f00000000000030000000000000000000000000000001c00000000000000000 % 0070000000000000000000001f000000000000000000000000000010c832388200000000000000 % 002b % 000000000000001e00000000000030000000000000000000000000000001800000000000000000 % 00300000000000000000000003c000000000000000000000000000108422188400000000000000 % 002b % 000000000000007800000000000030000000000000000000000000000003800000000000000000 % 00300000000000000000000000f0000000000000000000000000003f03c719fc00000000000000 % 002c % 00000000000020f000000000000030000000000000000000000000000003000000000000000000 % 001800000000000000000000003c00000000000000000000000000000000000000000000000000 % 002b % 00000000000073c000000000000030000000000000000000000000000007000000000000000000 % 001800000000000000000000000f00000000000000000000000000000000000000000000000000 % 002b % 0000000000007f8000000000000030000000000000000000000000000006000000000000000000 % 000c000000000000000000000003c0000000000000000000000000000000000000000000000000 % 002b % 000000000000fe00000000000000300371e6e3800000000000000000000e000000000000000000 % 000c000000000000000000000000f8000000000000000000000000000000000000000000000000 % 0008 % 000000000001fc0000000000000030018b3317c00000000000000000000c000000000000000000 % 00060000000000000000000000003e000000000000000000000000000000000000000000000000 % 0038 % 000000000003fe0000000000000030010a1214000000000000000000001c000000000000000000 % 00060000000000000000000000000f800000000000000000000000000000000000000000000000 % 0058 % 000000000007fe0000000000000030010a12140000000000000000000018000000000000000000 % 000700000000000000000000000003e00000000000000000001000800000000000020000000000 % 0058 % 000000000007fc0000000000000030010a32164000000000000000000038000000000000000000 % 000300000000000000000000000000f80000000000000000002011800000000000020000000000 % 002b % 00000000000fe00000000000000030039de73b8000000000000000000030000000000000000000 % 0003000000000000000000000000003e0000000000000000004010800000000000010000000000 % 0001 % 00000000001e000000000000000030000000000000000000000000000070000000000000000000 % 000180000000000000000000000000078000000000000000004f3cb8e3e0e3ff3cf90000000000 % 0000 % 000000000000000000000000000030000000000000000000000000000060000000000000000000 % 00018000000000000000000000000001e000000000000000005990c5f101f10866410000000000 % 0044 % 0000000000000000000000000000300000000000000000000000000000e0000000000000000000 % 0000c0000000000000000000000000007800000000000000005090850101010842410000000000 % 0000 % 0000000000000000000000000000300000000000000000000000000000c0000000000000000000 % 0000c0000000000000000000000000001e00000000000000005090850101010842410000000000 % 0028 % 0000000000000000000000000000300000000000000000000000000001c0000000000000000000 % 0000e0000000000000000000000000000780000000000000005190859101910846410000000000 % 0070 % 000000000000000000000000000030000000000000000000000000000180000000000000000000 % 0000600000000000000000000000000001f0000000000000004f1dcee380e39c3ce10000000000 % 0000 % 000000000000000000000000000030000000000000000000000000000380000000000000000000 % 00006000000000000000000000000000007c000000000000004000000000000000010000000000 % 0000 % 0000000000000000000000000001fe000000000000000000000000000300000000000000000000 % 00003000000000000000000000000000001f000000000000002000000000000000020000000000 % 0027 % 0000000000000000000000000001fe000000000000000000000000000700000000000000000000 % 000030000000000000000000000000000007c00000000000000000000000000000000000000000 % 0002 % 0000080000300000000000000001fc000000000000000000000000000600000000000000000000 % 000018000000000000000000000000000001f00000000000000000000000000000000000000000 % 0064 % 0000080000100000000000000001fc000000000000000000000000000e00000000000000000000 % 0000180000000000000000000000000000007c0000000000000000000000000000000000000000 % 0038 % 0000000000100000000000000000fc000000000000000000000000000c00000000000000000000 % 00000c0000000000000000000000000000000f0000000000000000000000000000000000000000 % 000a % 0373f9bb0f100000000000000000f8000000000000000000000000001c00000000000000000000 % 00000c00000000000f1e3c84fbc3ddc0000003c000000000000000000000000000000000000000 % 0014 % 039908cc90900000000000000000f8000000000000000000000000001800000000000000000000 % 00000e000000000010b1638c44262880000000f000000000000000000000000000000000000000 % 002b % 010908888390000000000000000078000000000000000000000000003800000000000000000000 % 000006000000000003a0408440e40c800000003c00000000000000000000000000000000000000 % 0035 % 010908888c90000000000000000070000000000000000000000000003000000000000000000000 % 00000600000000000ca04084432405000000000f00000000000000000000000000000000000000 % 003f % 011908889190000000000000000070000000000000000000000000007000000000000000000000 % 000003000000000011b1628c4466250000000003e0000000000000000000000000000000000000 % 0052 % 01f39dddcef8000000000000000030000000000000000000000000006000000000000000000000 % 00000300000000000ede3c76e3b3c20000000000f8000000000000000000000000000000000000 % 005c % 01000000000000000000000000002000000000000000000000000000e000000000000000000000 % 00000180000000000000000000000200000000003e000000000000000000000000000000000000 % 0066 % 01000000000000000000000000000000000000000000000000000000c000000000000000000000 % 00000180000000000000000000000e00000000000f800000000000000000000000000000000000 % 0070 % 03800000000000000000000000000000000000000000000000000001c000000000000000000000 % 000001c00000000000000000000018000000000003e00000000000000000000000000000000000 % 007a % 000000000000000000000000000000000000000000000000000000018000000000000000000000 % 000000c00000000000000000000000000000000000f80000000000000000000000000000000000 % 0004 % 000000000000000000000000000000000000000000000000000000038000000000000000000000 % 000000c000000000000000000000000000000000001e0000000000000000000000000000000000 % 000e % 00200000c000000000000000000000000000000000000000000000030000000000000000000000 % 000000600000000000000800006000000000000000078000000000000000000000000000000000 % 0018 % 002000004000000000000000000000000000000000000000000000070000000000000000000000 % 00000060000000000000180000200000000000000001e000000000000000000000000000000000 % 0022 % 000000004000000000000000000000000000000000000000000000060000000000000000000000 % 000000300000000000000800002b00000000000000007800000000000000000000000000000000 % 0055 % 0d6dd8dc473b8000000000000000000000000000000000000000000e0000000000000000000000 % 00000030000000000003cb871e2400000000000000001e00000000000000000000000000000000 % 0055 % 122664e64f8b0000000000000002000000000000000000000000000c0000000000000000000000 % 000000180000000000062c4fb128000000000000000007c0000000000000000000000000000000 % 0055 % 1d24444248040000000000000042000080000000000000000000001c0000000000000000000000 % 000000180000000000040848203c000000000000000001f0c00000000000000000000000000000 % 0055 % 03244442480e000000000000004000008000000000000000000000180000000000000000000000 % 0000001c000000000004084820240000000000000000007ce00000000000000000000000000000 % 0055 % 112444464c9300000000000f1ef677f1ee00000000000000000000380000000000000000000000 % 0000000c000000000006284cb1260000000000000000001ff80000000000000000000000000000 % 0055 % 1e7eee7ce73b800000000010b14223089f00000000000000000000300000000000000000000000 % 0000000c000000000003dce71e7700000000000000000007fc0000000000000000000000000000 % 0055 % 000000400000000000000003a04234389000000000000000000000700000000000000000000000 % 000000060000000000000000000000000000000000000003fe0000000000000000000000000000 % 0055 % 00000040000000000000000ca04214c89000000000000000000000600000000000000000000000 % 000000060000000000000000000000000000000000000003ff0000000000000000000000000000 % 0055 % 000000e00000000000000011b14219189900000000000000000000e00000000000000000000000 % 000000030000000000000000000000000000000000000003ff8000000000000000000000000000 % 0055 % 00000000000000000000000ede7708ecee00000000000000000000c00000000000000000000000 % 000000030000000000000000000000000000000000000000ffc000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000001c00000000000000000000000 % 00000003800000000000000000000000000000000000000000c01c066000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000001800000000000000000000000 % 000000018000000000000000000000000000000000000000000020022000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000003800000000000000000000000 % 000000018000000000000000000000000000000000000000000020022000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000003000000000000000000000000 % 00000000c000000000000000000000000000000000000000000072122000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000007000000000000000000000000 % 00000000c000000000000000000000000000000000000000000026322000000000000000000000 % 0055 % 000000000000000000000000000000020000000000000000000006000000000000000000000000 % 000000006000000000000000000000000000000000000000000022122000000000000000000000 % 0055 % 00000000000000000000000000040002002000000000000000000e000000000000000000000000 % 000000006000000000000000000000000000000000000000000022122000000000000000000000 % 0055 % 00000000000000000000000000040000002000000000000000000c000000000000000000000000 % 000000003000000000000000000000000000000000000000000022322000000000000000000000 % 0055 % 0000000000000000060079e6e1af7de66e78d0000000000000001c000000000000000000000000 % 000000003000000000000000000000000000000000000000000071df7000000000000000000000 % 0055 % 00000000000000000e00c733124422123121200000000000000018000000000000000000000000 % 000000003800000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 00000000000000003c00821213a420722121d00000000000000038000000000000000000000000 % 000000001800000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000078008212106421922120300000000000000030000000000000000000000000 % 000000001800000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 0000000000000001e000c632122422322121100000000000000070000000000000000000000000 % 000000000c00000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 0000000000000003c00079e73bc771df73b9e00000000000000060000000000000000000000000 % 000000000c00000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000f000000000000000000000000000000000000e0000000000000000000000000 % 000000000600000000000000000000000000000000000000000000000001c00000000000000000 % 0055 % 000000000000001e000000000000000000000000000000000000c0000000000000000000000000 % 000000000600000000000000000000000000000000000000000001000006200000000000000000 % 0055 % 0000000000000078000000000000000000000000000000000001c0000000000000000000000000 % 000000000700000000000000000000000000000000000000000001000004200000000000000000 % 0055 % 00000000000020f000000000000000000000000000000000000180000000000000000000000000 % 0000000003000000000000000000000000000000000000000dee6bdc6ec0200000000000000000 % 0055 % 00000000000073c000000000000000000000000000000000000380000000000000000000000000 % 0000000003000000000000000000000000000000000000001244913e3320400000000000000000 % 0055 % 0000000000007f8000000000000000000000000000000000000300000000000000000000000000 % 0000000001800000000000000000000000000000000000001d64e9202220800000000000000000 % 0055 % 000000000000fe0000000020200c00000310000000000000000700000000000000000000000000 % 000000000180000000000000000000000000000000000000032819202220800000000000000000 % 0055 % 000000000001fc0000000040200400800110000000000000000600000000000000000000000000 % 0000000000c0000000000000000000000000000000000000112889322221800000000000000000 % 0055 % 000000000003fe0000000080000400800108000000000000000e00000000000000000000000000 % 0000000000c00000000000000000000000000000000000001e10f1dc7771800000000000000000 % 0055 % 000000000007fe000000009de3c479e71f08000000000000000c00000000000000000000000000 % 000000000060000000000000000000000000000000000000001000000000000000000000000000 % 0055 % 000000000007fc0000000088a664848fb108000000000000001c00000000000000000000000000 % 000000000060000000000000000000000000000000000000007000000000000000000000000000 % 0055 % 00000000000fe0000000008d24241c882108000000000000001800000000000000000000000000 % 00000000007000000000000000000000000000000000000000c000000000000000000000000000 % 0011 % 00000000001e000000000085242464882108000000000000003800000000000000000000000000 % 000000000030000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 00000000000000000000008624648c8ca308000000000000003000000000000000000000000000 % 000000000030000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 00000000000000000000008273ce76e71d88000000000000007000000000000000000000000000 % 000000000018000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000080000000000008000000000000006000000000000000000000000000 % 000000000018000000000000000000000000000000077706800000000000000000000000000000 % 0055 % 00000000000000000000004000000000001000000000000000e000000000000000000000000000 % 00000000000c000000000000000000000000000000022f89000000000000000000000000000000 % 0055 % 00000000000000000000000000000000000000000000000000c000000000000000000000000000 % 00000000000c00000000000000000000000000000003280e800000000000000000000000000000 % 0055 % 00000000000000000000000000000000000000000000000001c000000000000000000000000000 % 00000000000e000000000000000000000000000000014801800000000000000000000000000000 % 002c % 0000000000000000000000000000000000000000000000001d8000000000000000000000000000 % 000000000007c00000000000000000000000000000014c88800000000000000000000000000000 % 002b % 0000000000000000000000000000000000000000000000001f8000000000000000000000000000 % 000000000007c0000000000000000000000000000000870f000000000000000000000000000000 % 002b % 0000000400001800000000000000000000000000000000001fc000000000000000000000000000 % 00000000001fc0000000000000000000000000000000800000c00000000c000000000000000000 % 002c % 0000000400000800000000000000000000000000000000001fe000000000000000000000000000 % 00000000001fe0000000000000000000000000000003800001c00000000e000000000000000000 % 002b % 0000000000000800000000000000000000000000000000001fc000000000000000000000000000 % 00000000000fe00000000000000000000000000000060000038000000006000000000000000000 % 002b % 0001bbecdd8f0800000000000000000000000000000000001f8000000000000000000000000000 % 00000000000fe00000000000000000000000000000000000070000000003000000000000000000 % 002c % 0001cd0466508800000000000000000000000000000000001f0000000000000000000000000000 % 000000000007e000000000000000000000000000000000000e0000000003800000000000000000 % 002b % 0000850444438800000000000000000000000000000000003e0000000000000000000000000000 % 000000000003e000000000000000000000000000000000001c0000000001800000000000000000 % 002b % 00008504444c8800000000000000000000000000000000003c0000000000000000000000000000 % 000000000001e00000000000000000000000000000000000380000000000c00000000000000000 % 002c % 00008d044451880000000000000000000000000000000000380000000000000000000000000000 % 000000000000e00000000000000000000000000000000000700000000000e00000000000000000 % 002b % 0000fb8eeeeedc0000000000000000000000000000000000300000000000000000000000000000 % 000000000000600000000000000000000000000000000000e00000000000600000000000000000 % 002b % 000080000000000000000000000000000000000000000000200000000000000000000000000000 % 000000000000200000000000000000000000000000000001c00000000000300000000000000000 % 002c % 000080000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000003800000000000380000000000000000 % 002b % 0001c0000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000007000000000000180000000000000000 % 002b % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000e0000000000000c0000dc7800000000 % 002c % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000001c0000000000000e000062cc00000000 % 002b % 000010000060000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000038000000000000060000428400000000 % 002b % 000010000020000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000070000000000000030000428400000000 % 0000 % 000000000020000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000e000000000000003b000428c00000000 % 002b % 0006b6ec6e239dc000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000019c000000000000001f800e77800000000 % 002b % 000913327327c58000000000000000000000000000000002000000000000000000000000000000 % 000000000002000000000000000000000000000000003f8000000000000001f800000000000000 % 002c % 000e92222124020000000000000000000000000000000042000100000000000000000000000000 % 000000000042000080000000000000000000000000003f0000000000000007f800000000000000 % 002b % 000192222124070000000000000000000000000000000040000100000000000000000000000000 % 000000000040000080000000000000000000000000007f0000000000000007f800000000000000 % 002b % 0008922223264980000000000000000000000000001e1ef677f3ce000000000000000000000000 % 0000000f1ef677f1ee000000000000000000000000007f8000000000000003fc00000000000000 % 002c % 000f3f773e739dc00000000000000000000000000021314223091f000000000000000000000000 % 00000010b14223089f00000000000000000000000000ff8000000000000001fc00000000000000 % 002b % 000000002000000000000000000000000000000000072042343910000000000000000000000000 % 00000003a04234389000000000000000000000000000ff00000000000000007c00000000000000 % 002b % 00000000200000000000000000000000000000000019204214c910000000000000000000000000 % 0000000ca04214c89000000000000000000000000001fc00000000000000003c00000000000000 % 002b % 000000007000000000000000000000000000000000233142191919000000000000000000000000 % 00000011b14219189900000000000000000000000001f000000000000000001e00000000000000 % 0008 % 0000000000000000000000000000000000000000001d9e7708edce000000000000000000000000 % 0000000ede7708ecee00000000000000000000000003c000000000000000000e00000000000000 % 0038 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000030000000000000000000200000000000000 % 0058 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0058 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000010060600000000000000000000000000 % 000000000010060600000000000000000000000000000000000000000000000000000000000000 % 0044 % 000000000000000000000000000000000000000000000010020200000000000000000000000000 % 000000000010020200000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000020200000000000000000000000000 % 000000000000020200000000000000000000000000000000000000000000000000000000000000 % 0028 % 000000000000000000000000000000000000000001dfcfb1e2e270680000000000000000000000 % 000001dfc7f1e2e23868000000000000003f03c71cfe00000000000000000100000000e0198000 % 0070 % 0000000000000000000000000000000000000000008c24121332f8900000000000000000000000 % 0000008c221213327c900000000000000011842388460000000000000000210000800100088000 % 0000 % 000000000000000000000000000000000000000000d0e410721280e80000000000000000000000 % 000000d0e210721240e80000000000000010c82288410000000000000000200000800100088000 % 0000 % 000000000000000000000000000000000000000000532411921280180000000000000000000000 % 0000005322119212401800000000000000104812c8480000000000000f1e7b7779e70390888000 % 0027 % 0000000000000000000000000000000000000000006464123232c8880000000000000000000000 % 0000006462123232648800000000000000104812687800000000000010b12122848f8131888000 % 0002 % 00000000000000000000000000000000000000000023be39dbe770f00000000000000000000000 % 00000023b739dbe738f000000000000000104812684800000000000003a021341c880110888000 % 0064 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000010c83238410000000000000ca0211464880110888000 % 0038 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000108422184200000000000011b121188c8c8111888000 % 000a % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000003f03c718fe0000000000000ede3b8876e7038eddc000 % 0014 % 000000000000000000000000000000000000000300000000000000000000000000000000000000 % 000300000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000700000000000000000000000000000000000000 % 000700000000000000000000000000000000000000000000000000000000000000000000000000 % 0035 % 000000000000000000000000000000000000000e00000000000000000000000000000000000000 % 000e00000000000000000000000000000000000000000000000000000000000000000000000000 % 003f % 000000000000000000000000000000dc73f7001c0000005f021000000000000000000000dc71fb % 801c0000002f8e1000000000000000000000000000000000000000000000000000000000000000 % 0052 % 00000000000000000000000000000062f9220038000000888e100000000000000000000062f891 % 003800000044511000000000000000000000000000000000000000000000000000000000000000 % 005c % 0000000000000000000000000000004281b20070000001088208000000000000000000004280d9 % 007000000084510800000000000000000000000000000000000000000000000000000000000000 % 0066 % 0000000000000000000000000000004280d400e00000010882080000000000000000000042806a % 00e000000084510800000000000000002000000000000000000000000000000100000000000000 % 0070 % 00000000000000000000000000000042c8d801c00000010f02080000000000000000000042c86c % 01c000000087830800000000000000004000000000000000000000000004000100100000010000 % 007a % 000000000000000000000000000000e77048038000000108020800000000000000000000e77024 % 038000000084020800000000000000008000000000000000000000000004000000100000010000 % 0004 % 000000000000000000000000000000000000070000000108020800000000000000000000000000 % 070000000084040800000000000000008f1e3c84fbc3ddc0000078f370df7cf3373c06f737ce37 % 600e % 0000000000000000000000000000000000000e000000010c060800000000000000000000000000 % 0e00000000860888000000000000000090b1638c442628800000c5998924210918900922491f19 % 9018 % 0000000000000000000000000000000000001c000000011c0f0800000000000000000000000000 % 1c000000008e1f08000000000000000083a0408440e40c800000810909d4203910900eb2751011 % 1022 % 000000000000000000000000000000000000380000000100000800000000000000000000000000 % 380000000080000800000000000000008ca040844324050000008109083420c9109001940d1011 % 1055 % 000000000000000000000000000000000000700000000080001000000000000000000000000000 % 7000000000400010000000000000000091b1628c446625000000c5190914211910900894451911 % 1055 % 000000000000000000000000000000000000e00000000000000000000000000000000000000000 % e00000000000000000000000000000008ede3c76e3b3c200000078f39de770efb9dc0f0879ce3b % b855 % 000000000000000000000000000000000001c00000000000000000000000000000000000000001 % c00000000000000000000000000000008000000000000200000000000000000000000008000000 % 0055 % 000000000000000000000000000000000003800000000000000000000000000000000000000003 % 800000000000000000000000000000004000000000000e00000000000000000000000038000000 % 0055 % 000000000000000000000000000000000067000000000000000000000000000000000000000067 % 000000000000000000000000000000000000000000001800000000000000000000000060000000 % 0055 % 0000000000000000000000000000000000fe0000000000000000000000000000000000000000fe % 000000000000300000000000000000000000000000000000000000000000000001000000000000 % 0055 % 0000000000000000000000000000000000fc0000000000000000000000000000000000000000fc % 000000000000300000000000000000000000000000000000000000000000000001000000000000 % 0055 % 0000000000000000000000000000000001fc0000000000000000000000000000000000000001fc % 000000000000300000000000000000000000800006040000000000000000000001000000000000 % 0055 % 0000000000000000000000000000000001fe0000000000000000000000000000000000000001fe % 000000000000300000000000000000000001800002040000000000000000000001000000000000 % 0055 % 0000000000000000000000000000000003fe0000000000000000000000000000000000000003fe % 000000000000300000000000000000000000800002b20000000000000000000001000000000000 % 0055 % 0000000000000000000000000000000003fc0000000000000000000000000000000000000003fc % 00000000000030000000000000000000003cb871e2420000000000000000000001000000000000 % 0055 % 0000000000000000000000000000000007f00000000000000000000000000000000000000007f0 % 000000000000300000000000000000000062c4fb12820000000000000000000001000000000000 % 0055 % 0000000000000000000000000000000007c00000000000000000000000000000000000000007c0 % 000000000000300000000000000000000040848203c20000000000000000000001000000000000 % 0055 % 000000000000000000000000000000000f00000000000000000000000000000000000000000f00 % 000000000000300000000000000000000040848202420000000000000000000001000000000000 % 0055 % 000000000000000000000000000000000c00000000000000200000000000000000000000000c00 % 00000000000030000000000000000000006284cb12620000000000000000000001000000000000 % 0055 % 000000000000000000000000000000000000000000000000200000000000000000000000000000 % 00000000000030000000000000000000003dce71e7720000000000000000000001000000000000 % 0055 % 000000000000000000000000000000000000000000000000200000000000000000000000000000 % 000000000000300000000000000000000000000000020000000000000000000001000000000000 % 0055 % 000000000000000000000000000000000000000000000000200371e6e380000000000000000000 % 000000000000300371e6e380000000000000000000040000000000000000000001000000000000 % 0055 % 00000000000000000000000000000000000000000000000020018b3317c0000000000000000000 % 00000000000030018b3317c0000000000000000000000000000000000000000001000000000000 % 0055 % 00000000000000000000000000000000000000000000000020010a121400000000000000000000 % 00000000000030010a121400000000000000000000000000000000000000000001000000000000 % 0055 % 00000000000000000000000000000000000000000000000020010a121400000000000000000000 % 00000000000030010a121400000000000000000000000000000000000000000001000000000000 % 0055 % 00000000000000000000000000000000000000000000000020010a321640000000000000000000 % 00000000000030010a321640000000000000000000000000000000000000000001000000000000 % 0055 % 00000000000000000000000000000000000000000000000020039de73b80000000000000000000 % 00000000000030039de73b80000000000000000000000000000000000000000001000000000000 % 0055 % 000000000000000000000000000400003000000000000000200000000000000000000400001800 % 000000000000300000000000000000000000000000000000000000000000000001000000000000 % 0055 % 000000000000000000000000000400001000000000000000200000000000000000000400000800 % 000000000000300000000000000000000000000000000000000000000000000001000000000000 % 0055 % 000000000000000000000000000000001000000000000000200000000000000000000000000800 % 000000000000300000000000000000000000000000000000000000000000000001000000000000 % 0055 % 00000000000000000000000373edbb0f1000000000000000200000000000000001bbecdd8f0800 % 000000000000300000000000000000000000000000000000000000000000000001000000000000 % 0055 % 0000000000000000000000039904cc909000000000000000200000000000000001cd0466508800 % 000000000000300000000000000000000000000000000000000000000000000001000000000000 % 0055 % 000000000000000000000001090488839000000000000000200000000000000000850444438800 % 000000000000300000000000000000000000000000000000000000000000000001000000000000 % 0055 % 0000000000000000000000010904888c90000000000000002000000000000000008504444c8800 % 000000000000300000000000000000000000000000000000000000000000000001000000000000 % 0055 % 0000000000000000000000011904889190000000000000002000000000000000008d0444518800 % 00000000000030000000000000000000000000000000000000000000000000001fe00000000000 % 0055 % 000000000000000000000001f38fddcef800000000000000200000000000000000fb8eeeeedc00 % 00000000000030000000000000000000000000000000000000000000000000000fe00000000000 % 0055 % 000000000000000000000001000000000000000000000000200000000000000000800000000000 % 00000000000030000000000000000000000000000000000000000000000000000fe00000000000 % 0055 % 000000000000000000000001000000000000000000000000200000000000000000800000000000 % 00000000000030000000000000000000000000000000000000000000000000000fe00000000000 % 0055 % 000000000000000000000003800000000000000000000000200000000000000001c00000000000 % 000000000000300000000000000000000000000000000000000000000000000007c00000000000 % 0055 % 000000000000000000000000000000000000000000000000200000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000007c00000000000 % 0011 % 000000000000000000000000000000000000000000000000200000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000007c00000000000 % 0055 % 000000000000000000000000200000c00000000000000000200000000000000000100000600000 % 000000000000300000000000000000000000000000000000000000000000000003800000000000 % 0000 % 000000000000000000000000200000400000000000000000200000000000000000100000200000 % 000000000000300000000000000000000000000000000000000000000000000003800000000000 % 0055 % 000000000000000000000000000000400000000000000003fe0000000000000000000000200000 % 000000000000300000000000000000000000000000000000000000000000000003800000000000 % 0055 % 000000000000000000000006e6ec6e471dc0000000000001fc0000000000000006b6ec6e239dc0 % 000000000000300000000000000000000000000000000000000000000000000001000000000000 % 0055 % 0000000000000000000000092332734f8580000000000001fc000000000000000913327327c580 % 000000000000300000000000000000000000000000000000000000000000000001000000000000 % 0055 % 00000000000000000000000ea22221480200000000000001fc000000000000000e922221240200 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 002c % 000000000000000000000001a22221480700000000000000f80000000000000001922221240700 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000008a222234c8980000000000000f80000000000000008922223264980 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 002b % 00000000000000000000000f77773ee71dc0000000000000f8000000000000000f3f773e739dc0 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 002c % 000000000000000000000000000020000000000000000000700000000000000000000020000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000020000000000000000000700000000000000000000020000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000070000000000000000000700000000000000000000070000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 002c % 000000000000000000000000000000000000000000000000200000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000040000180000018000180 % 002b % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000040000080000008000080 % 002b % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000080000008000080 % 002c % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000003000000000000000000000000000000000000000001b9fcdd87880f3e0f8847880 % 002b % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000003000000000000000000000000000000000000000001cc8466484819901898c8480 % 002b % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000084844441c81090108841c80 % 002c % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000084844446481090108846480 % 002b % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000030000000000000000000000000000000000000000008c844448c811901188c8c80 % 002b % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000003000000000000000000000000000000000000000000f9ceeee77c0f380ec7677c0 % 002c % 000000000000000000000000000000000000000000000002000000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000080000000000000000000000 % 002b % 000000000000000000000000000000000000000000000042000100000000000000000000000000 % 000000000000300000000000000000000000000000000000000000080000000000000000000000 % 002b % 000000000000000000000000000000000000000000000040000100000000000000000000000000 % 0000000000003000000000000000000000000000000000000000001c0000000000000000000000 % 0000 % 0000000000000000000000000000000000000000001e1ef677f3ce000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 002b % 00000000000000000000000000000000000000000021314223091f000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000000072042343910000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 002c % 00000000000000000000000000000000000000000019204214c910000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000010000060000000000 % 002b % 000000000000000000000000000000000000000000233142191919000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000010000020000000000 % 002b % 0000000000000000000000000000000000000000001d9e7708edce000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000020000000000 % 002c % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000003000000000000000000000000000000000000000000000006b3766e239dc000000 % 002b % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000911997327c58000000 % 002b % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000e91112124020000000 % 002b % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000191112124070000000 % 0008 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000891112326498000000 % 0038 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000f3bbbbe739dc000000 % 0058 % 000000000000000000000000000000000000000000000000000200000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000002000000000000 % 0058 % 000000000000000000000000000000000000000000000004000200200000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000002000000000000 % 002b % 000000000000000000000000000000000000000000000004000000200000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000007000000000000 % 0001 % 0000000000000000000000000000000000000000f1e6e1aff9e66e78d000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0000 % 00000000000000000000000000000000000000018b331244421231212000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0044 % 0000000000000000000000000000000000000001021213a440722121d000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000102121064419221203000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0028 % 00000000000000000000000000000000000000018a321224423221211000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0070 % 0000000000000000000000000000000000000000f1e73bc7e1df73b9e000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0027 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0064 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0038 % 00000000000000000000000000000000000000000020200c000003100000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 000a % 000000000000000000000000000000000000000000402004008001100000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0014 % 000000000000000000000000000000000000000000800004008001080000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000000bbe3c4f1ee1f080000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0035 % 000000000000000000000000000000000000000000912665089f31080000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 003f % 0000000000000000000000000000000000000000009a2424389021080000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0052 % 0000000000000000000000000000000000000400008a2424c89021080000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 005c % 0000000000000000000000000000000000000e00008c2465189923080000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0066 % 0000000000000000000000000000000000001c00008473ceecee1d880000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0070 % 000000000000000000000000000000000000380000800000000000080000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 007a % 0000000000000000000000000001b8e3f700700000400000000000100000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0004 % 0000000000000000000000000000c5f12200e00000000000000000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 000e % 00000000000000000000000000008501b201c00000000000000000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0018 % 00000000000000000000000000008500d403800000000000000000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0022 % 00000000000000000000000000008590d807000000000000000000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 0000000000000000000000000001cee0480e000000000000000000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 00000000000000000000000000000000001c000000000000200000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000038000000000000200000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000070000000000000200000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 0000000000000000000000000000000000e0000000000000200000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 0000000000000000000000000000000001c0000000000000200000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000380000000000000200000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000700000000000000200000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000008e00000000000000200000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 00000000000000000000000000000001dc00000000000000200000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 00000000000000000000000000000001f800000000000000200000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 00000000000000000000000000000003f000000000000000200000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 00000000000000000000000000000003f800000000000000200371e6e380000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 00000000000000000000000000000007fc0000000000000020018b3317c0000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 00000000000000000000000000000007fc0000000000000020010a121400000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 0000000000000000000000000000000ff00000000000000020010a121400000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 0000000000000000000000000000000fc00000000000000020010a321640000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 0000000000000000000000000000001f000000000000000020039de73b80000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 0000000000000000000000000000001c0000000000000000200000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000200000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000200000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000200000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000200000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000200000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000200000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000003fe0000000000000000000000000000 % 000000000001fe0000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000003fc0000000000000000000000000000 % 000000000001fe0000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000080000300000000000000001fc0000000000000000000000000000 % 000000000001fc0000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000080000100000000000000001fc0000000000000000000000000000 % 000000000001fc0000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000100000000000000001f80000000000000000000000000000 % 000000000000fc0000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000377d9bb1e100000000000000000f80000000000000000000000000000 % 000000000000f80000000000000000000000000000000000000000000000000000000000000000 % 0055 % 00000000000000000000039a08cca1100000000000000000f80000000000000000000000000000 % 000000000000f80000000000000000000000000000000000000000000000000000000000000000 % 0055 % 00000000000000000000010a088887100000000000000000f00000000000000000000000000000 % 000000000000780000000000000000000000000000000000000000000000000000000000000000 % 0055 % 00000000000000000000010a088899100000000000000000700000000000000000000000000000 % 000000000000700000000000000000000000000000000000000000000000000000000000000000 % 0055 % 00000000000000000000011a0888a3100000000000000000700000000000000000000000000000 % 000000000000700000000000000000000000000000000000000000000000000000000000000000 % 0055 % 0000000000000000000001f71dddddb80000000000000000600000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0011 % 000000000000000000000100000000000000000000000000200000000000000000000000000000 % 000000000000200000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000100000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000380000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 0000000000000000000000400000c0000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000040000040000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002c % 000000000000000000000000000040000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000dcdd8dc4e3b8000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 00000000000000000000124664e65f0b0000000003800000006000060000000000000000000000 % 000003800000006000060000000000000000000000000000000000000000000000000000000000 % 002c % 000000000000000000001d44444250040000000004000000002000020000000000000000000000 % 000004000000002000020000000000000000000000000000000000000000000000000000000000 % 002b % 0000000000000000000003444442500e0000000004000000002000020000000000000000000000 % 000004000000002000020000000000000000000000000000000000000000000000000000000000 % 002b % 00000000000000000000114444465913000000000e79f78e03e213c20000000000000000000000 % 00000e79f78e03e211e20000000000000000000000000000000000000000000000000000000000 % 002c % 000000000000000000001eeeee7cee3b8000000004cc8c5f062634220000000000000000000000 % 000004cc8c5f062632120000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000004000000000000004848810042210e20000000000000000000000 % 000004848810042210720000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000004000000000000004848810042213220000000000000000000000 % 000004848810042211920000000000000000000000000000000000000000000000000000000000 % 002c % 00000000000000000000000000e0000000000000048c8c59046234620000000000000000000000 % 0000048c8c59046232320000000000000000000000000000000000000000000000000000000000 % 002b % 00000000000000000000000000000000000000000e79c78e03b1dbb70000000000000000000000 % 00000e79c78e03b1d9df0000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002c % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002c % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000001c00002604c40000000000000000000000000 % 000001c00002602640000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000002000002204444000000000000000000000000 % 000002000002202244000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000002000000200404000000000000000000000000 % 000002000000200204000000000000000000000000000000000000000000000000000000000000 % 002b % 00000000000000000000000000000000000000000738f0d62ec4cfee0000000000000000000000 % 00000738786e2e62cf770000000000000000000000000000000000000000000000000000000000 % 002b % 0000000000000000000000000000000000000000027d0922334444440000000000000000000000 % 0000027c8492332244220000000000000000000000000000000000000000000000000000000000 % 002c % 0000000000000000000000000000000000000000024039d2214444640000000000000000000000 % 000002401cea212244320000000000000000000000000000000000000000000000000000000000 % 002b % 00000000000000000000000000000000000000000240c832214444280000000000000000000000 % 00000240641a212244140000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000002651912234444280000000000000000000000 % 000002648c8a232244140000000000000000000000000000000000000000000000000000000000 % 002c % 00000000000000000000000000000000000000000738ede73eeee7100000000000000000000000 % 0000073876f73e77e7080000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000000000000000000100000000000000000000000 % 000000000000000000080000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000000000000000000700000000000000000000000 % 000000000000000000380000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000000000000000000c00000000000000000000000 % 000000000000000000600000000000000000000000000000000000000000000000000000000000 % 0008 % 000000000000000000000000000000000000060000000000200000000000000000000000000000 % 000300000000000000000000000000000000000000000000000000000000000000000000000000 % 0038 % 0000000000000000000000000000000000000e0000000000200000000000000000000000000000 % 000700000000000000000000000000000000000000000000000000000000000000000000000000 % 0058 % 0000000000000000000000000000000000001c0000000000200000000000000000000000000000 % 000600000000000000000000000000000000000000000000000000000000000000000000000000 % 0058 % 00000000000000000000000000007770d0003800000000002000000000000000000000000006e1 % e00c00000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000022f92000700000000000300000000000000000000000000313 % 301c00000000000000000000000000000000000000000000000000000000000000000000000000 % 0001 % 00000000000000000000000000003281d000e00000000000300000000000000000000000000212 % 103800000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000014803001c00000000000300000000000000000000000000212 % 107000000000000000000000000000000000000000000000000000000000000000000000000000 % 0044 % 000000000000000000000000000014c91003800000000000300000000000000000000000000212 % 30e000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 00000000000000000000000000000871e007000000000000300000000000000000000000000739 % e1c000000000000000000000000000000000000000000000000000000000000000000000000000 % 0028 % 00000000000000000000000000000800000e000000000000300000000000000000000000000000 % 018000000000300000000000000000000000000000000000000000000000000000000000000000 % 0070 % 00000000000000000000000000003800001c000000000000300000000000000000000000000000 % 030000000000300000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000060000038000000000000300000000000000000000000000000 % 070000000000300000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000070000000000000300dc7800000000000000000000000 % 0e0000000000303bb8680000000000000000000000000000000000000000000000000000000000 % 0027 % 0000000000000000000000000000000000e000000000000030062cc00000000000000000000000 % 1c000000000030117c900000000000000000000000000000000000000000000000000000000000 % 0002 % 0000000000000000000000000000000001c0000000000000300428400000000000000000000000 % 380000000000301940e80000000000000000000000000000000000000000000000000000000000 % 0064 % 000000000000000000000000000000000380000000000000100428400000000000000000000000 % 700000000000300a40180000000000000000000000000000000000000000000000000000000000 % 0038 % 000000000000000000000000000000000700000000000000100428c00000000000000000000000 % e00000000000300a64880000000000000000000000000000000000000000000000000000000000 % 000a % 00000000000000000000000000000000ce00000000000000100e77800000000000000000000000 % c00000000000300438f00000000000000000000000000000000000000000000000000000000000 % 0014 % 00000000000000000000000000000001fc00000000000000100000000000000000000000000001 % 800000000000300400000000000000000000000000000000000000000000000000000000000000 % 002b % 00000000000000000000000000000001f800000000000000180000000000000000000000000003 % 800000000000301c00000000000000000000000000000000000000000000000000000000000000 % 0035 % 00000000000000000000000000000003f800000000000000180000000000000000000000000007 % 000000000000303000000000000000000000000000000000000000000000000000000000000000 % 003f % 00000000000000000000000000000003fc0000000000000018000000000000000000000000000e % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0052 % 00000000000000000000000000000007fc0000000000000018000000000000000000000000001c % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 005c % 00000000000000000000000000000007f800000000000000180000000000000000000000000038 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0066 % 0000000000000000000000000000000fe000000000000000180000000000000000000000000030 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0070 % 0000000000000000000000000000000f8000000000000000180000000000000000000000000060 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 007a % 0000000000000000000000000000001e00000000000000001800000000000000000000000000e0 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0004 % 0000000000000000000000000000001800000000000000001800000000000000000000000001c0 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 000e % 000000000000000000000000000000000000000000000000180000000000000000000000000380 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0018 % 000000000000000000000000000000000000000000000000180000000000000000000000000700 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0022 % 000000000000000000000000000000000000000000000000080000000000000000000000000e00 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000080000000000000000000000001c00 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000080000000000000000000000001800 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000080000000000000000000000003000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 0000000000000000000000000000000000000000000000000c0000000000000000000000007000 % 000000000001fe0000000000000000000000000000000000000000000000000000000000000000 % 0055 % 0000000000000000000000000000000000000000000000000c000000000000000000000000e000 % 000000000001fe0000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000c000000200000000000000000c000000000000000000000001c000 % 000000000001fc0000000000000000000000000000000000000000000000000000000000000000 % 0055 % 0000000000000000000000004000004200008000000000000c0000000000000000000000038000 % 000000000000fc0000000000000000000000000000000000000000000000000000000000000000 % 0055 % 0000000000000000000000004000004000008000000000000c0000000000000000000000070000 % 000000000000fc0000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000007c70f1ef677f1ee00000000000c0000000000000000000000060000 % 000000000000f80000000000000000000000000000000000000000000000000000000000000000 % 0055 % 00000000000000000000000c4f90b14223089f00000000000c00000000000000000000000c0000 % 000000000000780000000000000000000000000000000000000000000000000000000000000000 % 0055 % 0000000000000000000000084803a04234389000000000000c00000000000000000000001c0000 % 000000000000780000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000008480ca04214c89000000000000c0000000000000000000000380000 % 000000000000700000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000008cc91b14219189900000000000c0000000000000000000000700000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000007670ede7708ecee0000000000040000000000000000000000e00000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000040000000000000000000001c00000 % 000000000000200000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000040000000000000000000003800000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000040000000000000000000003000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000040000000000000000000006000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 00000000000000000000000000000000000000000000000006000000000000000000000e000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 00000000000000000000000000000000010000000000000006000000000000000000001c000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000002000100100000000000060000000000000000000038000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000002000000100000000000060000000000000000000070000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 00000000000000000000003cf370d7bef3373c68000000000600000000000000000000e0000000 % 000000000002000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 0000000000000000000000639989221109189090000000000600000000000000000000c0000000 % 000000000042000080000000000000000000000000000000000000000000000000000000000000 % 0055 % 0000000000000000000000410909d210391090e800000000060000000000000000000180000000 % 000000000040000080000000000000000000000000000000000000000000000000000000000000 % 0055 % 00000000000000000000004109083210c910901800000000060000000000000000000380000000 % 0000000f1ef677f1ee000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000063190912111910908800000000060000000000000000000700000000 % 00000010b14223089f000000000000000000000000000000000000000000000000000000000000 % 0055 % 00000000000000000000003cf39de3b8efb9dcf000000000060000000000000000000e00000000 % 00000003a042343890000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000020000000000000000001c00000000 % 0000000ca04214c890000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000020000000000000000003800000000 % 00000011b142191899000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000020000000000000000007000000000 % 0000000ede7708ecee000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000100000000000000000020000000000000000006000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 00000000000000000000000000000010000000000000000002000000000000000000c000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 00000000000000000000000000000010000000000000000003000000000000000001c000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000100000000000000000030000000000000000038000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000100000000000000000030000000000000000070000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0011 % 0000000000000000000000000000001000000000000000000300000000000000000e0000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 0000000000000000000000000000001000000000000000000300000000000000001c0000000000 % 000000000000000100000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000100000000000000000030000000000000000180000000000 % 000000000004000100100000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000100000000000000000030000000000000000300000000000 % 000000000004000000100000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000100000000000000000030000000000000000600000000000 % 000079e6e0df7de36e3cd000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000100000000000000000030000000000000000e00000000000 % 0000c7331124221131112000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000100000000000000000030000000000000001c00000000000 % 0000821211d420712111d000000000000000000000000000000000000000000000000000000000 % 002c % 000000000000000000000000000000100000000000000000010000000000000003800000000000 % 000082121034219121103000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000100000000000000000010000000000000007000000000000 % 0000c6321114223121111000000000000000000000000000000000000000000000000000000000 % 002b % 00000000000000000000000000000010000000000000000001000000000000000e000000000000 % 000079e739e771dbf39de000000000000000000000000000000000000000000000000000000000 % 002c % 00000000000000000000000000000010000000000000000001000000000000000c000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000100000000000000000010000000000000018000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000100000000000000000018000000000000038000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002c % 000000000000000000000000000000100000000000000000018000000000000070000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 0000000000000000000000000000001000000000000000000180000000000000e0000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 0000000000000000000000000000001000000000000000000180000000000001c0000000000000 % 00000020200c000003100000000000000000000000000000000000000000000000000000000000 % 002c % 000000000000000000000000000000100000000000000000018000000000000380000000000000 % 000000402004008001100000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000100000000000000000018000000000000300000000000000 % 000000800004008001080000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000100000000000000000018000000000000600000000000000 % 0000009de3c479e71f080000000000000000000000000000000000000000000000000000000000 % 002c % 000000000000000000000000000000100000000000000000018000000000000c00000000000000 % 00000088a664848fb1080000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000ff0000000000000000018000000000001c00000000000000 % 0000008d24241c8821080000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000ff0000000000000000018000000000003800000000000000 % 000000852424648821080000000000000000000000000000000000000000000000000000000000 % 002c % 000000000000000000000000000000fe0000000000000000008000000000007000000000000000 % 0e00008624648c8ca3080000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000fe000000000000000000800000000000e000000000000000 % 3e00008273ce76e71d880000000000000000000000000000000000000000000000000000000000 % 002b % 0000000000000000000000000000007e000000000000000000800000000001c000000000000000 % f80000800000000000080000000000000000000000000000000000000000000000000000000000 % 0000 % 0000000000000000000000000000007c0000000000000000008000000000018000000000000003 % e00000400000000000100000000000000000000000000000000000000000000000000000000000 % 002b % 0000000000000000000000000000007c000000000000000000800000000003000000000000000f % 800000000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 0000000000000000000000000000003c000000000000000000c00000000007000000000000003e % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002c % 00000000000000000000000000000038000000000000000000c0000000000e00000000000000f8 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 00000000000000000000000000000038000000000000000000c0000000001c00000000000003e0 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 00000000000000000000000000000018000000000000000000c000000000380000000000000f80 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002c % 00000000000000000000000000000010000000000000000000c000000000700000000000003e00 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 002b % 00000000000000000000000000000000000000000000000000c00000000060000000000000f800 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 002b % 00000000000000000000000000000000000000000000000000c000000000c0000000000003e000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 002b % 00000000000000000000000000000000000000000000000000c0000000018000000000000f8000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0008 % 00000000000000000000000000000000000000000000000000c0000000038000000000003e0000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0038 % 00000000000000000000000000000000000000000000000000c000000007000000000000f80000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0058 % 00000000000000000000000000000000000000000000000000400000000e000000000003e00000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0058 % 00000000000000000000000000000000000000000000000000400000001c00000000000f800000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 002b % 00000000000000000000000000000000000000000000000000400000003800000000003e000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0001 % 0000000000000000000000000000600006000000000000000040000000300000000000f8000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0000 % 0000000000000000000000000000200002000000000000000040000000600000000003e0000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0044 % 0000000000000000000000000000200002000000000000000060000000e0000000000f80000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0000 % 0000000000000000000000000003e211e2000000000000000060000001c0000000003e000001b8 % f371c000000030dc73f70000000000000000000000000000000000000000000000000000000000 % 0028 % 00000000000000000000000000062632120000000000000000600000038000000000f8000000c5 % 998be00000003062f9220000000000000000000000000000000000000000000000000000000000 % 0070 % 00000000000000000000000000042210720000000000000000600000070000000003e000000085 % 090a00000000304281b20000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000422119200000000000000006000000e000000000f8000000085 % 090a00000000304280d40000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000462323200000000000000006000000c000000003e0000000085 % 190b200000003042c8d80000000000000000000000000000000000000000000000000000000000 % 0027 % 0000000000000000000000000003b1d9df00000000000000006000001800000000f800000001ce % f39dc000000030e770480000000000000000000000000000000000000000000000000000000000 % 0002 % 000000000000000000000000000000000000000000000000006000003000000003e00000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0064 % 00000000000000000000000000000000000000000000000000600000700000000f800000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0038 % 00000000000000000000000000000000000000000000000000600000e00000003e000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 000a % 00000000000000000000000000000000000000000000000000200001c0000000f8000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0014 % 0000000000000000000000000000000000000000000000000020000380000003e0000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000001000006000000000000000002000070000000f80000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0035 % 000000000000000000000000001000002000000000000000003e00060000003e00000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 003f % 00000000000000000000000000000000200000000000000001fe00cc000000f800000000000000 % 000000000001fe0000000000000000000000000000000000000000000000000000000000000000 % 0052 % 00000000000000000000000003737637238ee0000000000001fc01fc000003e000000000000000 % 000000000001fe0000000000000000000000000000000000000000000000000000000000000000 % 005c % 00000000000000000000000004919939a7c2c0000000000001fc01f800040f8000000000000000 % 000000000001fc0000000000000000000000000000000000000000000000000000000000000000 % 0066 % 00000000000000000000000007511110a40100000000000000fc03f8000e3e0000000000000000 % 000000000000fc0000000000000000000000000000000000000000000000000000000000000000 % 0070 % 00000000000000000000000000d11110a40380000000000000fc03fc001ef80000000000000000 % 000000000000fc0000000000000000000000000000000000000000000000000000000000000000 % 007a % 00000000000000000000000004511111a644c0000000000000f803fc003fe00000000000000000 % 000000000000f80000000000000000000000000000000000000000000000000000000000000000 % 0004 % 00000000000000000000000007bbbb9f738ee00000000000007807f8007f800000000000000000 % 000000000000780000000000000000000000000000000000000000000000000000000000000000 % 000e % 000000000000000000000000000000100000000000000000007807e000ff800000000000000000 % 000000000000780000000000000000000000000000000000000000000000000000000000000000 % 0018 % 00000000000000000000000000000010000000000000000000380f8001ff800000000000000000 % 000000000000700000000000000000000000000000000000000000000000000000000000000000 % 0022 % 00000000000000000000000000000038000000000000000000300f0003ffc00000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 00000000000000000000000000000000000000000000000000300c0007f0000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000e03300000000000000000000000 % 000000c00000040000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000001001100000000000000000000000 % 000000400000440001000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000001001100000000000000000000000 % 000000400000400001000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000003909100000000000000000000000 % 000007ce1e3cfceef3ce0000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000001319100000000000000000000000 % 00000c5f21624445091f0000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000001109100000000000000000000000 % 000008500740446839100000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000001109100000000000000000000000 % 0000085019404428c9100000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000001119100000000000000000000000 % 000008d92362443119190000000000000000000000000000000000000000000000000000000000 % 0055 % 0000000000000000000000000000000000000000000000000038efb80000000000000000000000 % 0000076e1dbc7e10edce0000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 0000000000000000000000000000000000000000000000000000000000e0000000000000000000 % 000000000000000100000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000080000310000000000000000000 % 000000000004000100100000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000080000210000000000000000000 % 000000000004000000100000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000006f735ee376010000000000000000000 % 000079e6e0df7de36e3cd000000000000000000000000000000000000000000000000000000000 % 0055 % 00000000000000000000000000000000000000000000000922489f199020000000000000000000 % 0000c7331124221131112000000000000000000000000000000000000000000000000000000000 % 0055 % 00000000000000000000000000000000000000000000000eb27490111040000000000000000000 % 0000821211d420712111d000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000001940c90111040000000000000000000 % 000082121034219121103000000000000000000000000000000000000000000000000000000000 % 0055 % 0000000000000000000000000000000000000000000000089444991110c0000000000000000000 % 0000c6321114223121111000000000000000000000000000000000000000000000000000000000 % 0055 % 00000000000000000000000000000000000000000000000f0878ee3bb8c0000000000000000000 % 000079e739e771dbf39de000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000080000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000380000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000600000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0011 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000003bb8340000000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 00000000000000000000000000000000000000000117c480000000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000001940740000000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000a400c0000000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 002c % 000000000000000000000000000000000000000000a64440000000000000000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000000438780200000000200000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000000400000600000000600000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 002c % 000000000000000000000000000000000000000001c00000c00000000300000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000003000001800000000380000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000000000003000000000180000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 002c % 0000000000000000000000000000000000000000000000060000000000c0000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 002b % 00000000000000000000000000000000000000000000000c0000000000e0000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000000000018000000000060000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 002c % 000000000000000000000000000000000000000000000030000000000030000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000000000060000000000038000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 002b % 0000000000000000000000000000000000000000000000c0000000000018000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 002c % 00000000000000000000000000000000000000000000018000000000000c000000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 002b % 00000000000000000000000000000000000000000000030000000000000e00006e3c0000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000000000600000000000006000031660000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 002c % 000000000000000000000000000000000000000000000c00000000000003000021420000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000000001800000000000003800021420000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000000003000000000000001880021460000000000 % 000000000001fe0000000000000000000000000000000000000000000000000000000000000000 % 0000 % 0000000000000000000000000000000000000000000c6000000000000000f80073bc0000000000 % 000000000001fe0000000000000000000000000000000000000000000000000000000000000000 % 002b % 0000000000000000000000000000000000000000000ec000000000000000fc0000000000000000 % 000000000001fc0000000000000000000000000000000000000000000000000000000000000000 % 002b % 0000000000000000000000000000000000000000001f8000000000000001fc0000000000000000 % 000000000001fc0000000000000000000000000000000000000000000000000000000000000000 % 002c % 0000000000000000000000000000000000000000001f8000000000000003fc0000000000000000 % 000000000000fc0000000000000000000000000000000000000000000000000000000000000000 % 002b % 0000000000000000000000000000000000000000003fc000000000000001fe0000000000000000 % 000000000000f80000000000000000000000000000000000000000000000000000000000000000 % 002b % 0000000000000000000000000000000000000000003fe000000000000000fe0000000000000000 % 000000000000f80000000000000000000000000000000000000000000000000000000000000000 % 002c % 0000000000000000000000000000000000000000007fc0000000000000007e0000000000000000 % 000000000000780000000000000000000000000000000000000000000000000000000000000000 % 002b % 0000000000000000000000000000000000000000007f00000000000000003e0000000000000000 % 000000000000700000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000000fc00000000000000000f0000000000000000 % 000000000000700000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000000f00000000000000000070000000000000000 % 000000000000300000000000000000000000000000000000000000000000000000000000000000 % 0008 % 000000000000000000000000000000000000000001c00000000000000000030000000000000000 % 000000000000200000000000000000000000000000000000000000000000000000000000000000 % 0038 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0058 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0058 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0044 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0028 % 000000000000000000000000000000000fc0f1c77f00000000000000000080000000380cc00000 % 000000000060000c00000000000000000000000000000000000000000000000000000000000000 % 0070 % 00000000000000000000000000000000046108e223000000000000000010800040004004400000 % 000000000020000400000000000000000000000000000000000000000000000000000000000000 % 0000 % 00000000000000000000000000000000043208a220800000000000000010000040004004400000 % 000000000020000400000000000000000000000000000000000000000000000000000000000000 % 0000 % 00000000000000000000000000000000041204b2240000000000000787bd9dfcf380e424400000 % 0000000003e423c400000000000000000000000000000000000000000000000000000000000000 % 0027 % 000000000000000000000000000000000412049a3c000000000000084c5088c247c04c64400000 % 00000000062c642400000000000000000000000000000000000000000000000000000000000000 % 0002 % 000000000000000000000000000000000412049a2400000000000001c8108d0e44004424400000 % 00000000042420e400000000000000000000000000000000000000000000000000000000000000 % 0064 % 0000000000000000000000000000000004320c8e20800000000000064810853244004424400000 % 000000000424232400000000000000000000000000000000000000000000000000000000000000 % 0038 % 00000000000000000000000000000000042108862100000000000008cc50864646404464400000 % 000000000464646400000000000000000000000000000000000000000000000000000000000000 % 000a % 000000000000000000000000000000000fc0f1c67f00000000000007679dc23b7380e3bee00000 % 0000000003b3b3be00000000000000000000000000000000000000000000000000000000000000 % 0014 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0035 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 003f % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0052 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 005c % 000000000000000000000000000000000800000000000000000000000000008000000000000000 % 000000002000006000000000000000000000000000000000000000000000000000000000000000 % 0066 % 000000000000000000000000000000001000000101800000000000000100008008000000400000 % 000000002000002000000000000000000000000000000000000000000000000000000000000000 % 0070 % 000000000000000000000000000000002000000101000000000000000100000008000000400000 % 000000000000002000000000000000000000000000000000000000000000000000000000000000 % 007a % 0000000000000000000000000000000026e216e3c1000000003c79b86bfe799b9e037b9af71bb0 % 00000006e6ec6e271dc00000000000000000000000000000000000000000000000000000000000 % 0004 % 0000000000000000000000000000000027363311020000000062ccc49110848c480491244f8cc8 % 000000092332732f85800000000000000000000000000000000000000000000000000000000000 % 000e % 00000000000000000000000000000000221212110200000000408484e9101c884807593a480888 % 0000000ea222212802000000000000000000000000000000000000000000000000000000000000 % 0018 % 00000000000000000000000000000000221212110400000000408484191064884800ca06480888 % 00000001a222212807000000000000000000000000000000000000000000000000000000000000 % 0022 % 00000000000000000000000000000000223232110400000000628c8489108c8848044a224c8888 % 00000008a222232c89800000000000000000000000000000000000000000000000000000000000 % 0055 % 0000000000000000000000000000000023e1df39c8000000003c79cef1f877dcee07843c771ddc % 0000000f77773e771dc00000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000002200000008000000000000000000000000000400000000 % 000000000000200000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000001200000018000000000000000000000000001c00000000 % 000000000000200000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000700000000000000000000000000000000003000000000 % 000000000000700000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000080000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000080000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000006620000000000000000000000080000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000002002220000000000000000000000080000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000002002210000000000000000000000080000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 00000000000000000000000000000000006f9e2210000000000000000000000080000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000092212210000000000000000000000080000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 0000000000000000000000000000000000ea072210000000000000000000000080000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 00000000000000000000000000000000001a192210000000000000000000000080000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 00000000000000000000000000000000008a232210000000000000000000000080000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 0000000000000000000000000000000000f39df710000000000000000000000080000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000010000000000000000000000080000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000020000000000000000000000080000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000080000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000080000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000080000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000080000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000080000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000080000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000080000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000080000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000080000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000080000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000080000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000ff8000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000ff0000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 0000000000000000000000000000000000000000000000000000000000000007f0000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 0000000000000000000000000000000000000000000000000000000000000007f0000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 0000000000000000000000000000000000000000000000000000000000000007e0000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 0000000000000000000000000000000000000000000000000000000000000003e0000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 0000000000000000000000000000000000000000000000000000000000000003e0000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0011 % 0000000000000000000000000000000000000000000000000000000000000003c0000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 0000000000000000000000000000000000000000000000000000000000000001c0000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 0000000000000000000000000000000000000000000000000000000000000001c0000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000080000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0055 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002c % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002c % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002c % 00000000000000000000000000000000000000000000000000000000200000c000000c0000c000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000000000000000000002000004000000400004000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000000000000000000000000004000000400004000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002c % 00000000000000000000000000000000000000000000000000000dcfe6ec3c4079f07c423c4000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 00000000000000000000000000000000000000000000000000000e6423324240cc80c4c6424000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 0000000000000000000000000000000000000000000000000000042422220e40848084420e4000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002c % 000000000000000000000000000000000000000000000000000004242222324084808442324000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 00000000000000000000000000000000000000000000000000000464222246408c808c46464000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000000000000000007ce77773be079c0763b3be000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002c % 000000000000000000000000000000000000000000000000000004000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000000000000000004000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 00000000000000000000000000000000000000000000000000000e000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000000000000000000000000800003000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002c % 000000000000000000000000000000000000000000000000000000000000800001000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000000000000000000000000000001000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 0000000000000000000000000000000000000000000000000000000000359bb3711cee00000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002c % 0000000000000000000000000000000000000000000000000000000000488ccb993e2c00000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000000000000000000000074888909201000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 00000000000000000000000000000000000000000000000000000000000c888909203800000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000000000000000000000044888919324c00000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0008 % 000000000000000000000000000000000000000000000000000000000079ddddf39cee00000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0038 % 000000000000000000000000000000000000000000000000000000000000000100000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0058 % 000000000000000000000000000000000000000000000000000000000000000100000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0058 % 000000000000000000000000000000000000000000000000000000000000000380000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 002b % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0001 %%EndPreview save /d_sv_obj exch def userdict /IslandDrawDict 300 dict dup begin put /bdef {bind def} bind def /E {exch} bdef /FF {findfont} bdef /MF {makefont} bdef /RO {rotate} bdef /SC {scale} bdef /SF {setfont} bdef /SG {setgray} bdef /TR {translate} bdef /bp {lj lw rgb} bdef /bpbw {lj lw setgray} bdef /c {curveto} bdef /cl {closepath} bdef /fi {eofill} bdef /g {setgray} bdef /gr {grestore} bdef /gs {gsave} bdef /l {lineto} bdef /lj {setlinejoin} bdef /lw {setlinewidth} bdef /m {moveto} bdef /n {newpath} bdef /nx {/x E def} bdef /r {rmoveto} bdef /rl {rlineto} bdef /rgb {setrgbcolor} bdef /s {show} bdef /sd {setdash} bdef /sp {x 0 rmoveto} bdef /ss {currentpoint pop E m} bdef /st {stroke} bdef %% pattern stuff /BPSIDE 32 def %% pixels per pattern side /PATFREQ 3.0 def %% pattern pixels per mm /dp_mat [PATFREQ 0 0 PATFREQ 0 0] def /dp_pw BPSIDE def %% pattern pixel width /dp_ph BPSIDE def %% pattern pixel height /dp_w dp_pw PATFREQ div def %% pattern mm width /dp_h dp_ph PATFREQ div def %% pattern mm height /savemat matrix def /topmat matrix def /patmat matrix def %% catch nocurrentpoint error for: pathbbox /ncpoint errordict /nocurrentpoint get def errordict begin /nocurrentpoint { dup /pathbbox load eq {pop 0 0 1 1} {ncpoint} ifelse } bdef end /ar { %% sa ea sx sy rot tx ty matrix currentmatrix 8 1 roll TR RO SC n 0 0 1 5 3 roll arc setmatrix } bdef /arn { %% sa ea sx sy rot tx ty TR RO SC matrix currentmatrix 8 1 roll n 0 0 1 5 3 roll arcn setmatrix } bdef /el { %% sx sy rot tx ty matrix currentmatrix 6 1 roll TR RO SC n 0 0 1 0 360 arc setmatrix cl } bdef /image_raster { %% sw sh sd dw dh xs ys TR SC /sd E def /sh E def /sw E def /imagebuf sw sd mul 7 add 8 idiv string def sw sh sd [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop} image } bdef /imagemask_raster { TR SC /sh E def /sw E def /imagebuf sw 7 add 8 idiv string def sw sh false [sw 0 0 sh 0 0] {currentfile imagebuf readhexstring pop} imagemask } bdef /dither_color_raster { % bool sw sh sd dw dh xs ys TR SC /sd E def /sh E def /sw E def sd 8 eq and { /imagebuf 3 string def /grayval 1 string def sw sh sd [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop pop imagebuf 0 get 0.299 mul imagebuf 1 get 0.587 mul add imagebuf 2 get 0.114 mul add cvi grayval exch 0 exch put grayval } image } { /imagebuf sw 3 mul sd mul 7 add 8 idiv string def sh { currentfile imagebuf readhexstring pop pop } repeat } ifelse } bdef /image_color_raster { % bool sw sh sd dw dh xs ys /colorimage where not { dither_color_raster } { pop TR SC /sd E def /sh E def /sw E def pop /imagebuf sw 3 mul sd mul 7 add 8 idiv string def sw sh sd [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop} false 3 colorimage } ifelse } bdef /patpath { /inv E def topmat setmatrix pathbbox %% get lo - hi indecies /hy E dp_h div floor cvi def /hx E dp_w div floor cvi def /ly E dp_h div floor cvi def /lx E dp_w div floor cvi def lx 1 hx { dp_w mul ly 1 hy { dp_h mul E dup 3 1 roll E patmat currentmatrix pop TR dp_pw dp_ph inv dp_mat dp_proc imagemask patmat setmatrix } for pop } for } bdef % setpattern brush of patterns instead of gray /setpattern { /blue E def /green E def /red E def /freq E def /bwidth E def /bpside E def /bstring E def /onbits 0 def /offbits 0 def freq 0 {/y E def /x E def /xindex x 1 add 2 div bpside mul cvi def /yindex y 1 add 2 div bpside mul cvi def bstring yindex bwidth mul xindex 8 idiv add get not 1 7 xindex 8 mod sub bitshift and 0 ne {/onbits onbits 1 add def 1} {/offbits offbits 1 add def 0} ifelse } setscreen {} settransfer systemdict /setcmykcolor known { /fact 1 onbits offbits onbits add div sub def 1 red sub fact mul 1 green sub fact mul 1 blue sub fact mul 0 setcmykcolor } { offbits offbits onbits add div setgray} ifelse } bdef /dmatrix matrix def /dpi 72 0 dmatrix defaultmatrix dtransform dup mul E dup mul add sqrt def /B {gs bp st gr} bdef %% brush: gr lw lj /Bbw {gs bpbw st gr} bdef %% brush: gr lw lj /F {gs rgb eofill gr} bdef %% fill: gr /Fbw {gs setgray eofill gr} bdef %% fill: gr /PB {gs lj lw setpattern st gr} bdef /PF {gs eoclip patpath gr} bdef /BB {gs rgb lj lw strokepath clip patpath gr} bdef /xdef {exch def} bdef /clip_region { /ht xdef /wd xdef /bm xdef /lm xdef newpath lm bm moveto 0 ht rlineto wd 0 rlineto 0 ht neg rlineto closepath clip } bdef %! Island text prolog Version 3.1 %% %%BeginProlog /reencode_small_dict 12 dict def /ReencodeSmall { reencode_small_dict begin /new_codes_and_names exch def /new_font_name exch def /base_font_name exch def /base_font_dict base_font_name findfont def /newfont base_font_dict maxlength dict def base_font_dict { exch dup /FID ne { dup /Encoding eq { exch dup length array copy newfont 3 1 roll put } { exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall newfont /FontName new_font_name put new_codes_and_names aload pop new_codes_and_names length 2 idiv { newfont /Encoding get 3 1 roll put } repeat new_font_name newfont definefont pop end %reencode_small_dict } def /extended_Zapf [ 8#223 /a89 8#224 /a90 8#225 /a93 8#226 /a94 8#227 /a91 8#230 /a92 8#231 /a205 8#232 /a85 8#233 /a206 8#234 /a86 8#235 /a87 8#236 /a88 8#237 /a95 8#240 /a96 ] def /extended_Standard [ 29 /thorn 30 /yacute 31 /divide 128 /Acircumflex 129 /Adieresis 130 /Agrave 131 /Aring 132 /Atilde 133 /Ccedilla 134 /Eacute 135 /Ecircumflex 136 /Edieresis 137 /Egrave 138 /Iacute 139 /Icircumflex 140 /Idieresis 141 /Igrave 142 /Ntilde 143 /Oacute 144 /Ocircumflex 145 /Odieresis 146 /Ograve 147 /Otilde 148 /Scaron 149 /Uacute 150 /Ucircumflex 151 /Udieresis 152 /Ugrave 153 /Ydieresis 154 /Zcaron 155 /aacute 156 /acircumflex 157 /adieresis 158 /agrave 159 /aring 160 /atilde 161 /exclamdown 162 /cent 163 /sterling 164 /fraction 165 /yen 166 /florin 167 /section 168 /currency 169 /quotesingle 170 /quotedblleft 171 /guillemotleft 172 /guilsinglleft 173 /guilsinglright 174 /fi 175 /fl 176 /plusminus 177 /endash 178 /dagger 179 /daggerdbl 180 /periodcentered 181 /twosuperior 182 /paragraph 183 /bullet 184 /quotesinglbase 185 /quotedblbase 186 /quotedblright 187 /guillemotright 188 /ellipsis 189 /perthousand 190 /threesuperior 191 /questiondown 192 /mu 193 /grave 194 /acute 195 /circumflex 196 /tilde 197 /macron 198 /breve 199 /dotaccent 200 /dieresis 201 /onesuperior 202 /ring 203 /cedilla 204 /onequarter 205 /hungarumlaut 206 /ogonek 207 /caron 208 /emdash 209 /ccedilla 210 /copyright 211 /eacute 212 /ecircumflex 213 /edieresis 214 /egrave 215 /iacute 216 /icircumflex 217 /idieresis 218 /igrave 219 /logicalnot 220 /minus 221 /ntilde 222 /oacute 223 /ocircumflex 224 /odieresis 225 /AE 226 /onehalf 227 /ordfeminine 228 /ograve 229 /otilde 230 /registered 231 /scaron 232 /Lslash 233 /Oslash 234 /OE 235 /ordmasculine 236 /trademark 237 /uacute 238 /ucircumflex 239 /udieresis 240 /ugrave 241 /ae 242 /ydieresis 243 /zcaron 244 /Aacute 245 /dotlessi 246 /threequarters 247 /Eth 248 /lslash 249 /oslash 250 /oe 251 /germandbls 252 /multiply 253 /Yacute 254 /Thorn 255 /eth ] def /extended_Symbol [ ] def /extend_font { % stack: fontname newfontname exch dup (ZapfDingbats) eq { cvn exch cvn extended_Zapf ReencodeSmall } { dup (Symbol) eq { cvn exch cvn extended_Symbol ReencodeSmall } { cvn exch cvn extended_Standard ReencodeSmall } ifelse } ifelse } bind def /extend_font_name { % stack: font_name_string dup length 1 add string /extended_font_name exch def extended_font_name 0 (_) putinterval extended_font_name 1 3 -1 roll putinterval extended_font_name } bind def /gf { /f exch def f cvn where { f exch begin cvn load exec setfont end } { f 0 f length 8 sub getinterval dup /localfont exch extend_font_name def localfont extend_font localfont findfont /xsz f f length 4 sub 4 getinterval cvi def /ysz f f length 8 sub 4 getinterval cvi def [ xsz 0 0 ysz neg 0 0 ] makefont dup f cvn exch def setfont } ifelse } bind def /gfns { /f exch def f cvn where { f exch begin cvn load exec setfont end } { f 0 f length 8 sub getinterval cvn findfont /xsz f f length 4 sub 4 getinterval cvi def /ysz f f length 8 sub 4 getinterval cvi def [ xsz 0 0 ysz neg 0 0 ] makefont dup f cvn exch def setfont } ifelse } bind def /ul { % space drop thickness gs currentpoint currentlinewidth currentpoint n m 6 -3 roll lw 0 exch r 0 rl st lw m gr } bind def /nxtab { currentpoint pop 1000.0 mul cvi tab mod tab exch sub 1000.0 div 0 rmoveto } bind def /nx { /x exch def } bind def 0. nx %%EndProlog gsave 2.83465 -2.83465 scale 0 -279.4 translate topmat currentmatrix pop n savemat currentmatrix pop [1 0 0 1 105 52.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -318 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (primal) s -376 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (simplex) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 187.5 127.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -700 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (primal or dual) s -376 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (simplex) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 187.5 107.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -570 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (activate full) s -874 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (constraint system) s savemat setmatrix n 187.5 122.5 m 186.49 119.47 l 188.51 119.47 l cl 0 0 0 F n 187.5 112.5 m 187.5 119.47 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 175 87.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -160 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (full) s -396 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (system?) s savemat setmatrix n 185 102.5 m 182.48 100.54 l 184.16 99.421 l cl 0 0 0 F n 180 95 m 183.32 99.981 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 165 95] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -158 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (yes) s savemat setmatrix n 162.5 102.5 m 163.93 99.645 l 165.35 101.07 l cl 0 0 0 F n 170 95 m 164.64 100.36 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 190 100] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -122 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (no) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 157.5 107.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -306 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (DONE) s -468 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(accuracy) s -314 231 m 463 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (check\)) s savemat setmatrix n 80 125 m 78.991 121.97 l 81.009 121.97 l cl 0 0 0 F n 80 115 m 80 121.97 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 80 102.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -378 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (activate) s -438 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (variables) s -184 231 m 463 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(P1\)) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 127.5 102.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -378 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (activate) s -438 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (variables) s -184 231 m 463 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(P2\)) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 57.5 120] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -318 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (primal) s -376 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (simplex) s savemat setmatrix n 62.5 115 m 63.927 112.15 l 65.355 113.57 l cl 0 0 0 F n 70 107.5 m 64.641 112.86 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 62.5 110] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -196 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (new) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 135 117.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -240 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (none) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 105 120] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -318 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (primal) s -376 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (simplex) s savemat setmatrix n 110 115 m 111.43 112.15 l 112.85 113.57 l cl 0 0 0 F n 117.5 107.5 m 112.14 112.86 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 110 110] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -196 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (new) s savemat setmatrix n 127.5 150 m 126.49 146.97 l 128.51 146.97 l cl 0 0 0 F n 127.5 112.5 m 127.5 146.97 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 80 130] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -378 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (activate) s -552 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (constraints) s -438 231 m 463 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(violated\)) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 55 150] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -318 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (primal) s -376 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (simplex) s savemat setmatrix n 60 145 m 61.427 142.15 l 62.855 143.57 l cl 0 0 0 F n 67.5 137.5 m 62.141 142.86 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 60 140] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -196 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (new) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 80 155] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -486 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (force dual) s -468 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (feasibility) s savemat setmatrix n 80 150 m 78.991 146.97 l 81.009 146.97 l cl 0 0 0 F n 80 140 m 80 146.97 l gsave 0 0 0 0.176 0 B grestore n 60 167.5 m 61.427 164.65 l 62.855 166.07 l cl 0 0 0 F n 67.5 160 m 62.141 165.36 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 60 172.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -492 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (deactivate) s -552 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (constraints) s savemat setmatrix n 60 187.5 m 58.991 184.47 l 61.009 184.47 l cl 0 0 0 F n 60 177.5 m 60 184.47 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 60 192.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -218 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dual) s -376 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (simplex) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 127.5 155] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -486 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (force dual) s -468 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (feasibility) s savemat setmatrix n 127.5 172.5 m 126.49 169.47 l 128.51 169.47 l cl 0 0 0 F n 127.5 162.5 m 127.5 169.47 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 132.5 165] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -158 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (yes) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 127.5 177.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -378 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (activate) s -552 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (constraints) s -438 231 m 463 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(violated\)) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 127.5 202.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -492 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (deactivate) s -552 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (constraints) s savemat setmatrix n 127.5 217.5 m 126.49 214.47 l 128.51 214.47 l cl 0 0 0 F n 127.5 207.5 m 127.5 214.47 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 127.5 222.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -218 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dual) s -376 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (simplex) s savemat setmatrix n 127.5 197.5 m 126.49 194.47 l 128.51 194.47 l cl 0 0 0 F n 127.5 187.5 m 127.5 194.47 l gsave 0 0 0 0.176 0 B grestore n 82.5 197.5 m 81.291 194.55 l 83.306 194.41 l cl 0 0 0 F n 80 160 m 82.299 194.48 l gsave 0 0 0 0.176 0 B grestore n 85 197.5 m 86.22 194.55 l 87.746 195.87 l cl 0 0 0 F n 117.5 160 m 86.983 195.21 l gsave 0 0 0 0.176 0 B grestore n 90 197.5 m 92.257 195.24 l 93.16 197.05 l cl 0 0 0 F n 115 185 m 92.708 196.15 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 85 165] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -122 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (no) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 112.5 162.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -122 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (no) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 60 162.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -158 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (yes) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 87.5 145] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -240 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (none) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 87.5 117.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -240 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (none) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 115 192.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -240 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (none) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 132.5 192.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -196 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (new) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 97.5 242.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -700 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (primal or dual) s -376 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (simplex) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 97.5 222.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -570 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (activate full) s -874 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (constraint system) s savemat setmatrix n 97.5 237.5 m 96.491 234.47 l 98.509 234.47 l cl 0 0 0 F n 97.5 227.5 m 97.5 234.47 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 85 202.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -160 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (full) s -396 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (system?) s savemat setmatrix n 95 217.5 m 92.481 215.54 l 94.16 214.42 l cl 0 0 0 F n 90 210 m 93.32 214.98 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 75 210] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -158 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (yes) s savemat setmatrix n 72.5 217.5 m 73.927 214.65 l 75.355 216.07 l cl 0 0 0 F n 80 210 m 74.641 215.36 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 100 215] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -122 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (no) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 67.5 222.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -306 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (DONE) s -324 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(punt/) s -238 231 m 463 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (stall\)) s savemat setmatrix n 70 62.5 m 72.771 60.916 l 73.167 62.896 l cl 0 0 0 F n 95 57.5 m 72.969 61.906 l gsave 0 0 0 0.176 0 B grestore n 80 97.5 m 80.451 94.34 l 82.257 95.243 l cl 0 0 0 F n 100 57.5 m 81.354 94.792 l gsave 0 0 0 0.176 0 B grestore n 127.5 97.5 m 125.36 95.13 l 127.21 94.321 l cl 0 0 0 F n 110 57.5 m 126.29 94.726 l gsave 0 0 0 0.176 0 B grestore n 170 85 m 166.83 84.604 l 167.7 82.783 l cl 0 0 0 F n 112.5 57.5 m 167.27 83.694 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 180 72.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -306 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (DONE) s -588 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(other error\)) s savemat setmatrix n 172.5 70 m 169.32 70.212 l 169.82 68.259 l cl 0 0 0 F n 115 55 m 169.57 69.236 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 57.5 60] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -378 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (activate) s -552 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (constraints) s -524 231 m 463 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(bounding\)) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 32.5 80] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -318 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (primal) s -376 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (simplex) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 57.5 85] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -378 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (activate) s -552 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (constraints) s -438 231 m 463 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(violated\)) s savemat setmatrix n 57.5 80 m 56.491 76.972 l 58.509 76.972 l cl 0 0 0 F n 57.5 70 m 57.5 76.972 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 37.5 70] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -196 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (new) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 65 75] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -240 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (none) s savemat setmatrix n 37.5 75 m 39.46 72.481 l 40.579 74.16 l cl 0 0 0 F n 45 70 m 40.019 73.32 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 35 97.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -318 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (primal) s -376 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (simplex) s savemat setmatrix n 37.5 92.5 m 39.46 89.981 l 40.579 91.66 l cl 0 0 0 F n 45 87.5 m 40.019 90.82 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 77.5 52.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -450 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (excessive) s -280 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (swing) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 105 67.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -294 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (punt/) s -208 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (stall) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 140 80] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -438 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (accuracy) s -284 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (check) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 152.5 57.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -256 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (other) s -240 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (error) s savemat setmatrix userdict /#copies 1 put grestore %%Trailer %%DocumentNeededResources: font Bookman-Light %%DocumentSuppliedResources: end d_sv_obj restore DyLP-1.6.0/DyLP/doc/Figures/dualpivcalls.drw0000644000076700007670000005520711171477034015464 0ustar ª» €7)€ ˆÈ sÇH6eb P%Ì™2SÒè)ƒBFŒ.r°q#‡ )XL3›0y˜¤³ðˆœ7uà,¤RK!rêÌAƒ¢I*E¤!† 8p°p‰E 0R„¤‹]È€ãêÑ¢_Zö«<ÞˆQフ'P@Ø Ã&Í7m¥$9‚„ ºvñò¨ 0bÚB‘÷‰*Iž8 ÂÙ­ J¶[¸dbnÄÔaƒNÛ1@ˆ&]Æ4§ ÆÌi‹BÈ›7kÚ„q“"¶™¶mÊIS§ï0›A.,BÌÉ1kDÄf#‡v'G˜$™‚¤÷I7gê8,Ó6† ºç¬i«–­2y¾ÏN;oè ¥S“Î:r”F_”á>(’.Á$ƒ/Å4Sµå´SO?5XH)ÅTNA% 7ØpÔ 7\uQF1hD–UbqèŒf¡Õ^[oÅ5W]wåµW_ñ(a†!¦cP8™d”Y¦Ugplv”Ÿ…6Zi§¥¶–¯&m¶á¦o¾'qÆar<,§Í=ÝtÕñ€ÂuÙm×ß…7^y祷^Zk%8`nì×ßXà .H“MêÄ“O@ E”XI-5ˆOE4¸`ƒ 4¨8ƒ 7p5£Œ1¾(ãY„²å\rÖ#La„_º9e‘Ÿ-ÖØc‘MVÙePJ UfpT¹ekYªv%µ]Æ6›aæ¶[ojš9\qÇ%çfœa@'ÝÔY‡vÜy·›ŸŠ^ê±Wè{ÃÉAF~häGr(j£h ‚ Š4éM^š¡¦vúaˆ¢²@*«3¤C 8°êª¬1ÆZ–U´Þx«ŽÁ¶Õë¯AÖ‘‡‹¤’É6É,´ÎRÙ–•¬¹†šµA—çå¶µÝæ-™áòܸi®iî›èªK§»yÆËç¼âÕûZ øz£büKGÀ̘ð£ KJ!N–b˜é†œzø)Æ#n|jªO…ÜjW$ŸüjŒ)ºr®Bºì+°6lÍG»¤²Nb¦Y›Ãzöó´Bky­k°}É­Òc‚û›Óg’«&›n2ç\ºs²[çïê)/x]“÷õ½ùÖjh|c ±†}vìŸÛŽ.©ÃsGl·†›eñÞ¡ö]ê _%êƒnxá(Û¨xŽŒËÌëã1ïJ³‘<›$²L.û$Ïœ?ë9h WÛ¶¦Kš˜¾U&ÖA­\mz“ìä´®vÙ OðÚSŸzg/AéË=ðùÂÞà3¤Am } pŸü(a̓TƳUêB˜¢^ÅôÖ”ì-h¤L䀫(€ 2Á ´Ò½§ÜÀ5XQ€""zlE¢ZPC\H7N oÖ£!¨DtÃî°‡"Y¢¨¢!&1Œ2iâ÷žX©H±…<©¢ÄîV½yª†\ Ý Ã:ðЇbâUtÄ3þ0GäÇÚ8"RQz1¤XÞî¸ÅŒ)`}ü#Q0FEÊÀŒJD$y7.¨ARÀÃ^8GNòb6ÔFP¥‘¤|¤Eâ£ÑX —8[¡oGêÓ _ §¾÷ÙÌr9³Ÿæ¢”?Ÿñotþƒ&‘Ö­ÔðihB`ìà4;«Ùkܽ|gà‰m_‡bCFC‡4¤!Qk[ó¦B¹QJŽÓ“d)É·ä T28‰L´ÂÎdºdA/q„+`îêeÄtßäà'?œÕ/sÍj&´¤%Í¡ý¯tÔD›†M×I-çêf툻¬Ikú…§€9Œa7FxƒDH—$¸a»!ÃN8O¸=O•Ñ«[$±hGXæñŸZ(˜eЄ"tVæóeC[¶>˜qÕ˜•›ßåtv¿Íqf£Ÿë¨èŠ6M0‰”i«+iÔ`§@n2ðjÌÖ&ÓrÎtls(BÆ@‡+¤ál0¡ƒOÍ@ÔFÑ3nл'$¯XÇëá1cP ¨ 4FБô+äShVʲÈA´}Âzåâw3úangfí\´ÒÊVJ¤n \Å•Í×Mm´kàí ¨»­ñ®¯` `[Âöl‹mìÛœ·ÂUâs©•Õb?YYæ ³U…hy9ÚÅ9T0§ýêD)ÖdbgÝиd[¶âötºUoMJ×”Þõ›yu©8)(Ó°]px_ˆ ZX8È! ºaÃPãÙ6ǵºIµ"gÈÏXvw³O¡j.eÚ…š—«éXY‹Ì‹Â–™ñí3k»V.ÝW€KÓ¯{{ÒmVm¥ÃÕëKë5¿˜¦Ü`?–P?^ž…©kOˆ)•²vjÆb0h–D‚ó¬UÇ›PÿÅìS¯j)ÚÚ±*3£1æ(‰fã£å6Ç×lÝ\k×àâµ¥á4î8+xä±9ø mÈDvSâÊl“òtëY+kØ•ûÔòˆ°‚‘\„³O oÉÈŒUáØ´iVñzÃjÑ×–Ʋ•3}kŒ­Ws¤qÕ³6ëúcႳ¸|-rrÏéž›²a ‹æU馲H•ì•7üJì= Þqh¯Š¸òžÕ^UõšÙÛj².³ghñ¬é\k;ãÏ$ÕµoQJ5•ú:À69‡}à÷ÄÇ Ú³{TëN–Ú™¶ö–k2ä E8]#S[}).æªYÜ^¿Ýòý_}묭;[3Þœ·íýgâî¦Â6g¿3ðÀ3Ò($ø §ǃcº© o$&¿H™|,d9€A-Û¸I¬¬*éK/e#yÎÊ|2Õ²•ºýÆC:¥d)ÑfqÀt¯_ÄDb—¥ÔßøÈiÿëÛ½äÖ5éuO³J 7(»Ñ.ÕBºQ$T¿.–«}Y­ó‘è›´{Úq –Pr’ïc÷ûÔáXuìf9è]<<׋ŽÅKUïA„¼Æ$Ïöž»]Ÿ@/|æ3Ùõ%z~³I/å&#~÷È#ñïŽ4ý¥Q÷XÊ]ótw}ؽ úÇ×~ô·Ÿ|Ûwuíú~è›OüðA Ù{ö‹'}¥+?ø¯h:$1#‰Àwv—eööV#7„ëd µ3ÛxE]kn8Çš¶ëþ¨»q|ò\§¼Ç¼ÆrhÀs¾36étS¢Amwa7äGvPsÀ}—zY>483 ~yw~âzÔWÑ1HD"â7jcfIC hoç|y´&Èe X#8‚7tƒ(X$RH;È‚¸‡Jbp§×|–G@h·m¤Öm·~Áô#•Z…±Zóçfï[ú#có…-#×n%÷ný·_{FoÀåM,årC6h¦\èDÈówð€T¶}‚w½÷T«"Ç6f¢6>äU…¥…q©¦qãÆjô÷fðuêF†´F:ûwk»µcüÅg½ÖrB6`È%s4¥dss ù±Al ‡”m–ÖJ¼Gƒ˜ˆƒhà#f;Xbê·ˆÕˆõˆWn’†Î4†¡Ãn˜x†ü‡kj¸kþåg‡¢s…Nñ!wsò4e¯x>7‹Kè‚s×z2{‘"§r{³‡éHˆŒTz2(Žß§GåÈydÇ*·X|èx‹¤wJr„&‹JXcDv„Ã="sˆ Å‹Š˜>»"L@¢f[Èf-æjç¦Q!§VÊh4̨‰:&WÐXoÿõ†¡(hfdtˆA¥` æŠÐ†„Ì—]ã8"v÷O£á#…èWj*sq¿nŽX‘ä‰_ka(k–Ø‘m…†Îȉk¸r%d†’£x”Û“7VG“õx“4“†8qSXq?i…A™…ñ'Œ]è^/rb(r—è‘’yöýE’Òh’U©o„¶’&TeðN‡Å•&m3yyªÇ]d“WQˆ i–=I…ié‹èŒZH,è…q©‘sÉ‘ú÷‘o’ò€Ñè†T™o˜Äf(vø`cPk€˜ò؇3X“«‡x×ç40–‘éw³W*¿™“ ¤|ºG`‰yö|æÈIÄ œ1P~ìXwF!ˆ 9D3@9€{à˜„ËÙ˜¿ÇzøÆYbä›ÒÙDI„{2©œŒ™ðZ4…"è— ‘™)”ÁH” —šJ™Œ£y—¥™—<¶—md¿örD¶o¤ˆ€ñd@:t‡e ¶É‡áXÌi:ÈeöÙ‚#ffj¹Ÿl)9nÙfš‘q†KY !•_Ú‰lØgªÙ q˜’ü†dôAeðnðN ‹óè¡ ¢ eÚvŸ‰˜Ÿçå8ü¹™\È¢碔ˆŒÑd_™x (— ž(€~Éšêš3G.ÉEúž_ŸÛ¥¤cv¡F™%Ú‹ú)¥)ºboy¥ö—”0J ·Õ¥4ú¥6*•}¹šX¦søšþökBX:µ¦^iy„'Ÿpz4Ф$ŠŸçs¢x *êŸÃh”Ÿù¢•¨\Jšƒê`z£Ÿ8' ˜‹:sñ‘N@*¤‰%©Š Ÿ•ú¦!:šº‹OÚ©˜ù©É™£ê™jªZÊe¸ŒºªÏ¨r8•:ZŠ•Vse9 žnK—zvsÊ“uúQÚUy*VŠ‘}zŒtÉ”¶æ¥¬Z¨Õz¨×j•ÖXhØøÈcBÞZTTv›žò9ž¼¹Dëø„Å7–)ˆ‡œGаq}Á' „k} +~Óyœ+®½ú|÷¸Ië=·I ‹|í9²‹Y²y¤°Ñçu)Û±$èu-KJQx”‡›ôÈœ4›±(p³[á±2±³30±0Ë« 'žûœF»²: ²3>»|N‹{²6+„8ëx;KL›µÉÙ¦2KŽÎÉyS‹´(0¶X›{;®3µl ¶G›³±5P¶r ´Hš°v‹²xKµ{˱5·ß³O+¸^»Dm«·I ²6À´ZÇ:5­±8„¹<¤RpbP‰{9°Y[1!!öáÑÑEž»¡;º[„0²ºB3 °«S²+º,ð˜ , voP »¼k± ºÀû=JÁeVA½«›¼ËÛÏ+wÑ;»N1JA3°µºÎQe Ê[ÝÛ¹¾+½£ #á„èËê»»½û¹à*˜ªk´º$„¹w@0ª¿eð¾Ë¿ý{µõkÑ·«Ë#h@™±yÀêËÀß ¼á7Á„S2°ºp@ë{b ìÀ ¨ë„WÑ*«+’aâ¡æ ¼¿¿;ºõy‚µt«Xa*\,ìÃòëÜ3Á@8–«›Äy XÜÂü;½¥+¥‹D|¼'ŒVŒÅopZüä „a»S¼¼dÆMlÕ ¢Ã[ÂÇ{pl /ÇL ¾^ÌÆ2L¶««SÌVƤqÆr È_\¹ÞƒÇ"`Á<t‘hn°È\<2P½1`¼"@ÉêÄA˜L»Ta¾ Ö«{h t0ÊQÊ¨ÂÆ[¾…ù¼» AV­ÁšË °ËwÑËA¿-`78—*ML¿,ÍÒ<ÍÔ,ÍMŒƒõ›*^lIÂÌÃtÀ`dÇœÌbÌ ¾AÌeJa\ÍîLÍ×Ü·§ÜÌËß\ÌEÁã¬Ìæ,ŒÌÆ\ÐüÎ=Ç]üÅ^ÜHÝLÌá¬ÏÈÌÏçÌŶ+Ð]ÑͱžV¿1 Ðö ÎcáÐäœý|ÍâË™j¾Æ[Ñï<ÇEÄÑ1=Ì÷ÜÐæ"åg>¾%2P5Ð* Ïàë̉ÓÞìÑù\Ó(bŽÜÄ;ÝÔ6àÓ?mÍè,Áêè|Næ"næ%Žæ–}è7.æpþ›¤þ›Qnä£^ꦾã˜-êw®ê«¾è]žêªnåRê1ë±né³þê°në>>éº~êLN륮éúíÜ ÝiŽâ\ñì!¶ÒÃP1íÒbÐŽÚÎxŒdûíÞîà¾íäŽí!†ÙÖNíÔníæþìÜNîÞïß.îñNîïÞî›î˜½îëŽïö®íò.ïôN¶ÿÎxøžî[ÁïÒÞêÙ8ÿðóñPñîÜŽì#®ì(ÀìŸ~I30ÿñòò$/ò!oò%Oò)ò'Ÿò˜Íò3°ò+ó0/ó,Oó.¯6_ò8ò;oò=¯ò,Ù3ÿó#ô!oñœ¾ì&Þì/CõRâ[õTßðÏZ¯õøNõ^_õQöRï+do¾"öbÙ_ÿõX*[Ïõ ¿ö`/õb_öeöSoõU¿ïþþöpoîrOõxõvoöF0ø7øK‹ïûî÷PÑõz/øt?ö†_öJOâLïéÿðN(é;žÚ Oí_ðþÎùBîù7úœ?ú¥úŒŽë,®ú¡Ïúöþúé~鬾á£ú[aûïï—ñÿßPQˆÇßíÈËßüÊÿüÉýÌýÓ/ýÎoý8Û¾òÙÛoöž]­âøŸ= MþØþÕŸþׯþÙ¯è¿þðOýñÿþ8Àý ÝýàÏý îþâøåoôþ ¿3çßPÜ'9€P×Ñ€¤À L "ÀA+ üðb6ø; Œ€Ð"\ÀˆC T{°‚À HI`DºÎ¢À¸%` °ÓÀVw{ ü@°òÀ H‹ ¬€Cð*Á%Ø“ ‚90óí@÷ÝŠ[qs|0À VÁ-¨OÛyガ vA08Ë ø‚¶M ’Á5hÛàä~Ï ºÁ(˜ñšÞÆ39êÁ<È÷`üƒ{PB@ø á „„еBCh!#d„‡Ð:BÌ ¡$\„—0fÂBx)a$¬„~pêA:XüPœ‚p ¨ÂU¨ ¯[† m¬ºBGáŒ@,\…³PÀ¥¶[Ø 9œ.œpæÂ· …¡/$†¤Zx ‹á-Lm¤Ðþ·$Wœa,LmÔÐÊBÒF k¡2ĆINâBná7$‡CNöÂÑ– “!/¬…íp´ÃÑ 5Š‹‡¢­èÃ}¨Áa:$mB Ä€ès\-ä‡ü° ¾¸Ô6¢Btq© ³!Ä}øClˆæ¸Ô6õ!<,‡£ #fDz’[™Ã|uÐʾG©[r#Ð%î:ç) Llt1®%úºZæFàJTq &^À›(- °ûu=q(îÄcWñ[²#€'î'xã$NdqT1×I<=—YœU,ŠÎmŤh¥âW$‹añÎÅPwßYd‹JÑÑI¼z8$Š;î..Å—è^¬Š~q/Îć¥bPÌ‹ÑÑ ;Äè÷Ž"OŒQ0ÒºÀ T€XК@]—Gà Ü€œÑñiÆ ˆE£gÜŒ°®ñù½Ñ(Kãj<¤14ú½šXc#¬ëŒ2:=Þ'Ú€ÜøÀñ7zÀÔæƒ#pŽÀ°8Ç!€G›r4ŽÍ±7î¾å(; qÜqÔ‘9ZGÒöƒã t€×ñÆeG¨ï €èñ<ªÇôÈÕãz|í1>ÂÇõ(å£k›ò?êÇúù£T÷±=îÇéÿ£œûî@*Èó(Ë£šƒABJÈÑ7ú¨¡„ŒÒ*ZEj˜!3äÔôÎBvÈ "凼$’Þ}È™äPd†¤ïDŽH©"÷\‹‘’FšÈ$ç l}ÝÎïy@,Xðô"d|{ûHþÈH$•dbŒqMÒÞ©Æ·7$äËŒG’J^I$©ª¤ãs’X2ÆõÈóÆÎÊdâ[€h’T¨É4¹Ÿ›,“f2N²É5I'ÛdœDw²ýÍÉ=©&ßä›Ì“g²N J;é'ýd™ä“PPÊÄ(¥£\”‹ÒQ"J—'%Ÿä“‹rL*!P8¥§ ¼°SŠJOYGå¨T†ŸòS·T)*1›24•¤¸ÁÊN‰*g媜•ÊP"²J!P*we­d•·’U¾Ê]9ÝxÛ¬¿ÒT7M‰ûøðƒwÍrÚ=KnçïÐ]í“xN2ZŠ>lyû°žéSÓàiËßÇ-ƒŸ·¼–52[žËt.q³„­1v@Öˆ9à¼ô‰–5ª:H/ ¼|€ýò“€FXÇ/áe½ü—0`ÂÀÔØ%ï弌³jJ|Ú(&h³˜Ÿ cnÈ+&Hm3d~ÌÐ&äFæÅ4™enL•É1+b5Ôˆ ‘´iÊS¨ i&/´™·gÆÂSè*o¦‚«™?Óg8 94ß!€ š9iîL¥É ufÓTp=3iM©)à”áÄ ‡¼2k! 2‡œÖÔš]Ó f¶¯¹5Ãæ‹#›¼ÒlBD´Y2ÿ!;LrhseºM‰5·¦ÝäšO®cžL¯y7í¦ÆÔ”vñIzÅ8Ã$‹}zÎHBIÂÉßžX¤w…“KÚEÆ™%µÞã x‘së%NÊ %çŠ}šÒ¾@ÑIg4PæËÓÙGgë,¯“u>ÀÏØ0g'ì´²ÓºNÜ™:; º»ºx6À8§æ4ž–yB…Ì™‰pŸðsª0?ë' XZøó~æÏüY?é§ÿ|Ÿ~²Oô9^Þ…ñ3~úÏþ)î§ÅŸûÓ2Ðÿ™@ßç]Ÿ4}ºÊ @è} 4‚.­ :?9¨Í …¶OÚþ<¨ý¡"PQA‰À»¼€1/‡æÐfHÚH Õ¡´ˆvŒWÚ’h=oLô³9ÑzDCÛ¢PSoJѨD—h‡“™M1Ä=EX¡=£h å€5ÊFÛ¨ý.i4ŽªÑ7JGרÅlr´ŽÖQ9šGõèå£q”úQ7 HÓè %¤…ôŒÖQAúG©=¤mÔ|ÉNFI3 (3“jRñU$[Ÿ%­¤\f“jÒN*%(µ¤¢4“rR%éIOi(U¥£”•Þ¾OjI%",U¥²´•ÒÒW*JIiðÛ¥—ô–bRµçKµ0奰´àÍLyèøj*tsoï"¼ÌT˜¸Þž‹ n.Žàq…˜i WÉÔz9γå8²%M"rNhÈåj˜äÎé8-§ms³¡Ót3Ýiâ"xåÔ™î;N!"5…¦\/q ¸ äüžEmD@›r=TËg=‰ÄO¢8% ;^dõ¨S;„l«zUJT7ˆR©,5¥¾T¥šT5ejK€<’¶ÀJXë0,¬õ¯"Ö¨Xàw$¬u±>ÀÈJX+¤¬’•2˶ÇYÛ]jów µ³ŠÖ§ÀðB+¶û¬£5µšVÑZZ³j]­°UµÊÖZ[kë³ #·N•¬Ê[Qaó­¼U· שB\Ap®½µ·×å:\cÀ<®Yº¢ŠæÊ\‰«týMÒµºR×N&]Ñ]r®Úµº^×ïšUÃks%¯¿5¹¶:óº\Çkvm®WÓkŠDµ™¸D"Þœ›sÈa6ûJ_ke™pS$¶Í3]ÜůûôlÎ×¼é2,%‰,À$n:”X ¬‚ň԰#jè`_œ†å˜ÖÅ}Ø‹a“܈•¯ÑŠ؎Èaì;±9.ÄzSc/lC̰1¾ÆX›ãŠ@ð±@6´Ø[å‚,±<ÖÃþØ%ëc‡ìÕrFöÇ:Ù¨bW”m²$öÉY&+e³ì@ä˜WVÈzYÈ!¯¬¦|KòbA4û%™¤ã£iÖ®ÙgàœÍ€…±vÊÙ7KgÛ¬šå³xÖÏ:@ðYíú¬t³~ïÌZ*‰hß›=´ÖïÁYAkg­¬³ ðÎ^ZÇgY“‚¦E€˜ÖÓZZPKi ¡…a‹vëyÉ·g>9_©µ’6ô…Ú k­Ý©]µ[ÏÕ¾ZZëheílÔ³•¶Öò»YK$u-£u¬p°×¦;bëP#¬S¼xPq7rÖÕW.·+®¤Ñ•ªKs·ï¨-½›¤Àô2jÛ‡7.÷]»¼¶âv—nÛlçmå]’œ¥§4Ý‚R%©)É—½ÝN⋺þ;Š>‹ ð·w?Ö¿«T‹À%=¸wÈ…Ëpe€Úk®œ5†¶Š‰›ñcR½¸F ©r„[~nÀ½½·Ú•˜¶>~ûoKnÀ­wàÜ•{pnÃÕ®moßIÜŠKqã#ÆÅ¸—ãšO›kz.Vð¹>W>FJ÷ú]%~lu@÷çb…¥k„nž$ºÇÕèò\¦‹ÐÕmºóqè’Wô*uáãÕUºI7@¾G­ ]¹n¦|¨6¢ªDp)ñH U$£Ïí<¸+ñhãS˜»#0îŽÀ·›wÛ.¾ä»Pï^@Àk¯´Šv×ðV@Â[§‹<2ÀDÞÉkh@å½¼–—òR^ËËy+oßú¼NèñnÔÐ zq$ pmšWòbÞÕ›z#oçå¼ ·ô>ÞØzM¯êÕ¼®íõ^ÞÖ»za/é­½³÷÷ö-ÛË{u/ @½·Wõ_Ú;|ƒ/íÕ”À X}’S}î©È¸w“~Öè«Y˜÷=L ûÂÒÔV}§¯ÃÕy\ÆúFÞ‹«}{è÷ (é÷_Œ;~I[ùÕ,÷÷T¸6ö«J·/š¿ï7ü&ÕþK~Ó¯ùÍ¿ë7ûfÒóëå/ü Àô“ª¶â ä*°¾À8ï> Ì;°¶ÀRñ‹à¼Iðž™§0«àÌ‚[0Ï<š.8Ëàü‚i° ¾Á1Šâà|f…ˆÞdp“ a!Òö~ðŽ€Fx“•¾$¬'càÂEø $,…—°>]R ”¸§…©°¶ÂF8'a¾Ç…“°ÂÂíŽQ)X9¤o8sX8L‡ß°®ÃpxÇa:Ì1ñ°†›~XÌV¹=ü‡½f ¾Ã„¸Êú×C¬åqÄŽ×aˈ±ÖÃxXÇ*Ù(Ë!¿\Žã²GVËyâ'A± þÄ£Æ]ÙN¼èL¬)VÄTî¯bQÜŠ_¬)îéXÉÍb0wã(°¥£Å¿˜cT\‹‰qŒƒÅ¹¸ÒÉ8`¼Œ…q3›±XÇ%ãhL䊱4vž6Òã8f¼‡œ$Ý’ªkÉÖ÷%Åq8¦x·Ök=09Žá•$Ç¿– Iu,Ûñ»+Ç­ïÔI|쎭†¶dTÚIH»g²Aî‘ö ŸÞd«j­BÞµy wZ^‘rB®ÈyÐ2dŒ<ñ²Ö3Ÿ¹sd‘,‘7ò:VÇ!%Wäw 9òInÉ.ù%o;}‘I2 ÅT–‚¾\êKÿ꿹Åt'çä‚ç“y2ãÊïN(e¢mq“ØÂI-© ßö[•}“WJêM=©-uqÛ¯™šR‹jK½Ûl[¤Õ•ºòy¿ï7]%ªVÕeo žjNªí¦&›´zRKDX]ªYÛ¬Õ°8ûú*;â)$Ö¡ÒXgQd} 5챉Åz">ë ›µ²ÖÐ:YKkǬc!œÞÖØ#Fk„èW+hÔC€l7Ë=DÛý<×ý¯Û·§ð=>[n¡¹¡ú½Ï–„À à•©p~ÊCIýÙõ¤mäo´u¿SÚº_Ã&mÝÏ`;ìò7àèrRÕ×Ôózn¸!pOC›NUqßïÅm6é©=ÏcÙF \«6‘ÃohK×nùþeÁ|}®iöøƒ ¢M^[Q–¯ïµ µÙXl~í¯‡¶-Ø•`#ÔdHÚv>mÝmbÛ?… ±«6ÕFØûc¸kg¯7vÇm;„ìk:þXœg;Ùd;D«Á·ÇIý­Öƒª ãñ¹åzGÇÎg«OPXuä‘( ãI×Ç×”~’B]É]N€8`¥â€ÓEK w¢%pÿÆMØ&÷t¥%;s[îLEK6 åÆÜž&HîÆíí÷TÜ”ÛpƒÝ„GØüöùüM‚o3¼}?I«û«Û Wnlm ·ƒdÛÒúú–…‘wR®@-»`H 6pzHYË»y…éôÔDBôvÞWKuYoæí¼IXwÚÞÒ[dToåͽ_ÃÞåû–l4ðíîŽñ"ßÍ{ˆ|Œ0¿+ÂGp8è;~»!‚Çê÷ª˜N†äz¯ †IRþˆ€öã C(™b t/–È€|¸$Ay¹¤lW_Ü‚'¯9œEY Hpþ`,øpa|¢ÀSø  9!ÈTÄA¸xÝk^  ÂAEx',AüðîeŠÿBœ",-©£Å M3æ€ÁQE *\ XB¦0ü÷¯D(SZ!óFL™3\ÀQ£"”(A% 6et€xA§ œ0dܰqcŒ4dƼ±©²Ä9eÂÐy#Gf’9l¸!CDN˜; Ì0ÁæM¢G“ÒIóÆ ¥1APASÄ”2p@Ĩ!—†Ž7tÀ¸B 5ŠB s¦Ì™1Š ñ:5›3‹ñÈ´1£/ häÀlÃoQ"oÆÔiSÆ 'eÊQ-ŰW9c ËDvjŠÏ¡G—¦3¥8lÒ°v]¶l´é”&s{e‘©C†’6=GÁœ0vÊÌ$óeŽ/Õ€(ƒg «Í(PPgN9dÒŒ¡3óiÔ©U¯‘OßçÈøó¡çápÔAÇz/ˆ‘^{ˆáè•aFNX¡z/!yæaè … ¼`„š1¡V¦‰˜^‰M ¸Ga¬aaYt¸Hâ R<¡oЖŽN1„sŒLD–8…ŒîÑÁb޾øÂG YgX•G“/P!„tXåTCV¹£p@Ȇxl`%Çb€É¦w¸ 'VQvÆ—jr8„¢É‘ÝR`ŽÁ¡]¹‡Rh€©â‡o¨È`ž¡%—^f*„]¶R™ÎêuÙ¹èÁ¹±åªª±i«e¨ñ†cªæ¹G”´Þ‘Zb¶ñÆ¡° û‚ºzÇ£À‚é¾€I‚ùér‹¬¶«ÊA+¢ÊÎ)Ʀæ Õ•`šº+oÜÑ.›’ÆÁŽÈámîqíHÝûj»îŠ”ipÜj‚oÄUm´K’e¾ac“+!¨”rr¸ÂtÔa‡B`”΀كÑe°1‚ïiLÇÏT%BFHQD „ôŸ… ´¼ñ{» ³Ì4Ëq%’Ç4Ò·…Ï@ MôH#qôÐ €ÝņU_ Gž%OqòÃ,—`3ξ3¾’lÚ_ÀFm¿½aÒrCK·Ów£QFg ±à V‘gäkƒ ¶×è¥aÇàJßÌôÔxÿŠßS~ÞådÇ·yÜsÞF (θã%¢ZFÖ+%ÇËhÓÔ0îYï~­•Я;ï/•€’t˜‚¹Éq0 ;Fß{@J­US $-bˆñ%º1Fõ cÏ€ô-ýôèÓW}/ª–a å¿¿[üR@È0 |/|ããÊÂ@¡2ÄA€{HX\À&¹ô‚æ‹ß3ÄÌ= hÒrJ†m c×O>v­9ä@¢®E‡<0x¼3Ønpx-TH—R‹@Ð#· A€£` @@—Ê‘ (á>¶%†PY%dÖN(·&……{a A0C2ÚPˆD|‚ox¼kéÐ4<—øD$–íŽKl" ßD)權m¼¢¾J3qŒ.Ü£ ihÃÄñ5i#lðC>BQLi\c’ˆÇ;ÎÀ#‘"#Y¦²AVJ ó«€ì=†D!ŸÎ3 ‘+d8f–‡ê$“FšI-±•ažn&V©ž¼@•„)ƒDö1>Q¨ u€"_H!Es+åcЖ€9ÌòcÚ‚9ï8|±ól[„¤¥´ÍÂLÓ 0LJ.ɲÝS‚¬'ÏÀ$PÍa ­¼ÇøË!óîd¦2‰I"g ôžÕÁ6ÉÐM|ssýtÌȹNwšaIî:±BAwš ‚òLL<ºJiR) TÜ.Å9R€ ° ÷Z*w`½ç êbJB_)58u‹r3êÎaÞ=ºä¥/9aRH¢=æ†&ÊLÓ‡ŒâT (@§>³¦­LHÇù¢¸ÕOy°Ã’*8בÖÕ©%¥e:×ÙÒó¼Ô® ØC[ ‚˜Îô¢7Õ§Nûʰ¸Hp±N…,>G2¿²¹@9ÈIJ‰YšF£Kì, \Pð›Päfi5Û¨Ö1ˆ F[Ž6Öi°­—ô Ev<å9O‚ä7Ü%-vƒ™­©7¨Xľõ´Ô\ge`‹NÞj4оõ¦êÂéO¿V°ç‰gq¦7OÓÚ3²9å'O+K_ !b™®G=(³*K Hå£R]¹P¨è S lw¯šKì½à ’º»šâMqHy^ ˜9£Ê!ÀëZ*Ç@@ÝÅ^±\õ*EñÖ“u¬'v+mµëÝarw£ý(yEJNÀžs˜+eçÇŽ x6v½»i/mqºÏ–·²ÐÍ JµS T¿ü i@¥|¡ÏtÃæÊš€¥ÀwQ²¢÷ …@je¬³]A bÜ •a Âñå ÐðB¸]í<ã5CW¶2à’sÏ×ò³ä2·9A#Xj…n]_À†>£çÏŒÎÊ !mèI³!Ñ—^t 7ý[IWôÓDµªËØPc¶¥­tª_XÝbÖ݃ۀ*CGK’D€k&å‘¥·CIž¸¡À¦.ÕvÇØ!ÙWÃå€4E ØÅSÊ(ÕÜj m¯´'ö6S†ªž.nÉpŸƒÚsžJµ®c3sÌ+wãµvç^ZÇÀ,6ÔA;` Ui\ü¤|õÐf@JŽ'Ñ1:[ÍŠ%,Ê’ùe‘fv4WÊ ç89žÖ‘ìá–.¦µ&Þ=kÙùZ×Z"7k;^6E\;Ü49™‡—C¸‚3_8m¾3ïê¼® ¨ø|{>ò(oÀò.|.^pμ³Ð[P÷–È—©7½‡{…æP1dhãhè }¤B¡‘¸ Ø'ϸKf&÷Ý·ÅŒÁ«õñ×{d~—9Þ“ ƒ½g¹¿úR’2ð=`(Je’Ê<(³öR9m`Ÿ0·4†6äa Á wþò' ÐëNwÀϽÞnðûÌÇKv³×•ŽªùXÙ¥ ñ9Û}êéã{ù[;µç=ñ³Y6`G©óŸ§ðt9Ü÷×Wß-ÁÙ§Ný”¿ âG+Y-¸7ÀÌÊo¡0d“”ÂCOäÏ´=ª p@ÜÕu\¸;ó9ÄA ’bÇcÔ’ hÒ‘gu%ä%Õ0/ä,Ék{DËEb6¹†B‰#ESIF© Hyxág“T_ •þµ=á¨K¹0&‚#N‡x#ùÚ±\\‰Ž×¸Ží†E]Ao—UkÉŽSa–CX;y˜ñQ6Ù•íóÊÈcE”O„ PyA÷•_õb ˜r‰yYËÁˆ%ÐË8ÚX’Wd%µ¸ªñZp€O[ 802 •ña€9€šª)»åš9²¹šta›3›2@I¶I¾É¶™©Éš#a›2›3°D®éqœ*3¯ª9­~aÌY›¯ÉÒ¹›¯yÌ œ¯‰ÌIœaÖI›É¹žÜy6ž‰ÊÑtÜ1B2%”N Z3,LÁ?>1y¢¡ Мۡ9;£ÑèC/x£!häá þ¡ññ†‘Õ¡~’ª Z^%Š:l°%ÚšCñq)aP¢µYª <¢»Y*m`¡ä¢ÀYŠ:ó¡3@œE0¢;:š9Š  *Z/?Z¡01¤4œIp¤ú¡4àœIà¤J*ê,ꢺ՚O0¥;JµùY¤[z¦»ù`š¤g œO`¦ºEœO°¦q ¡S $@Â?ºe¥U§ZÉYu*¤êœU°§ú¨*Z€Z­™˜ú¡5P›Z€¨eñ¨âé¨saž“z§s¡ž¡ú¨JVA¢sa¥%$R JÔI¨»êœ ™/ŠÚ3¦±«­ÉT­rŒ1`µ™p:§ú¬»™¥±«Àéhþ´«ÄéóAÅ ¡o46ô¬Vu$ú0á 7œêÊ®dÐo0a ‚Îyu ‚·$÷š¯é7ü*S:ã® ¯­Y°2#Rl°;#°Ñš𺛂¯À íÑŽÑðJœËq/£ƒj/gP•‡Vj²([¯§8œøµ;b‡¬£ŠÎIw Š¾ñd‘²—1b~â79ÛšÓt)[’³µ9¯Êq°gÀ™³» µªÑoU ³À‰µ. ±´³Äɰ0a,¥±9 ¡1…| ³V:³Úlç ·ùŸhÀxd7³AK·Î©®¢"®Qzt«¢ØD· [«;šÞy ‰»›­z¡1Àé«‘Kœ42‰J·ªne`«¡µAb 6ÛŸ± ʧ~áœea?K³•ç*Š¢~Ñš2ª‚5êµ¹ºêZBCº»ÉQB£ BºÀ™‹«+T~Aœ¦Ê?~¡¶™'²¤k¥cP»4ÚŸ1œBy¶ "¹5IÁ¸Ø«¢w–j§ ¾­©¤™ ¾µ©?ˆ‹½»™Ž ¾À)è ¤” ¾ÄùM§¿0;ŒS¿àk¥]a JÂYן~1뻚Îi2墫©¢ D¾«Ùš¡Ñ¿Zº¾´939ÀÕ¡›3EÁÇë*h°$걚Ĺ>4Á—Áš‹œ¡A’Á<ƒœ3‡z³dП&š$%tª¬©¢L€&ø‚Än ţÚsÚ¬¹›ëcP¢A+H<¹V±4"Ê»¤3Qù ¥gü¸äÚVZ±êžgl¦´éœaÄhJ qL­©ÍÛŸrºÂùK»É/a:È“{·©±»È‹€Ì¤{C›*3QÅ´i¥ªxÉU ©&Ä5°¯ïA#SÑo)\„û~bXiýé©3‘ù;ª3±ÚÊ»¹%£#Ÿ;ò™öùSm >PtšºÌ!¼Ì¹E'Nº21%n9–М €’q£Yšûñý¸q)0Ovà1kXhäLŸ ÉÙŒOÕ(“«‘ሔ.9 (ðËÁÌGß\“â|ÎÎcÎÈUŸ«qŸÀ,ÌD”îŒÚ(Ï¿ÅÏçáÏÇšøÉvûYÐÖèðD„•!t•à·e2Ÿ]–Ñl` ÓÌÏŒnÙ<¥/Ézu‚7vóõÌ(-–ûH"5-Òb9(ðß¼\ÖóÄUÍèÜËŽ)KT-ÐkO9¦AÔεÓIíÑSÑ;g€OŠ…z79VøäÏw€a<³Eø´†åè1þ— 3S%Y™DÖw„O:u>”|ó3Ô†²W/Y"]ÑÀo=ÇÌÓù"-ÃL9ØS¢‡Í‘d°ØÖ2z–]×ç±[É·[yÕ{ EG·#½TÙøD×/}w½{œ½%zM\¥†6[à`”-d£}ˆ#EAgC#62‘-ýÕãÜÕ/âÖ8²Ñ-"½#Y}&sÈÕ9]Ú }aj“e=gýÜj\w6Jo}ÕqmÙ#aÚ‰ÚºgvÍ1®íÏ-Ù»DÚ—}Ú™1Þï]ÞR Ú&Ú³íܘ-Gð½ÚPmÞ{ÚêÛëMÛ³MŠB–Û5r# ÓÛÏÝÜÖ±%‹Ñ-HÇÍ!ÌGÒè$q,ò1zˆ¬5Iñ3lÓÓ+§$®0£1“$gNäkŒÍR]]yE‚Tó€~ÕV2-BbvêElÃâô•½!FghAvG\fa`vk˜|H¾ZÿNã-¯Bbâã;2-‰5×ÒÜ\.!^®«õ<äãSQŒvŒ%ˆAì804`tÑ2@çvŽçÓÀÚ1z~9à»5h‚ f†;Gsù1rÎèHGÆÖ0*µDJ”t1ðY0g#棭lèuÑ¥™Öé±ê#Á]-­Ä3EATCQnF3U®ä9Wßê¡MM›»Õêw43ƒ‹a1¤ÜL0;t«î0ðÍY­V6"aí¥{‚ €dψÆlà2v$ß\¶ƒf€TJä“3‘®m^éq±˜ÞI;!7À¹U.‘êeÁ<¥¾[º…êã¥ê¬ÞêÌ÷ê€.d³Þä2Pç×.«®ëÌàëÑáCÂÞNÅ~ìkì˱ÎþÐ.íhñÕîYÙN' °í´$ŽQîÖÑîô‘fÄîÙ!éD¼S•ò.dK„4à!ð êñ ê?9êß«ï/§W¾9ÏêÞ¥ðKèwÔðµþð·.ñIŽðômj½.ëÃÞñöñR¡ìÌ>ò#oòÔŽòp¿òfçòñAÂg3+óç®m6¯î\ é9ïî“Îó×âóóŽër4ô=ï0‹ôŸîïLð§õrqíTïêëXßê%âð_º¹ö¯‹Ë^7€µ¸¸{g]8%qŽDQk‡(ÉH"I žA÷kb|{Ž.ÀøåÂ\à "Îv€¿!ˆ[vÂA‚¡d0&(Gœà Ä :p æÀ*˜ï°`äCгÁ/˜EÅü{5 ®¦4¨QÖàüYPÎmAvÒ ƒJðâ¼üüÿ‹w‡¯‚à}—ÉäˆòS9 ’ºçgê ô;x¢ÏêźHë"àöózV®¢ _—[h€Æsq¦ÏØ‘?¨úžÝ_p{"pýɽ–ÇíÀl 1Ö¿¾×û¡Î›ðÒ= ¸>‹±ªw©K6½Nõ>áÁ«~ ðê1<hë&`÷S…¤/üÅBÔG ÍŸ-Œvé/b»ö7÷P€sF€)¬À%‘ÜÀ`;s€þé>X ñß1,6ÂÏð-Ãfø›0ƒÎòtÌïßmÂX Þô+] ðÏiCìW »!èû†»ÎBØ1g¡P{æäÝÂt8c_ t0a>\—/D=4úò×áûê_ð‹?1ÓDc…lB”†’Ï:DPˆ %â(ä|Q^įIÄF²p~ÄØìÎßH %1âÉ>”xgèÀJ/1&¢;ÂW÷áMìyý/.‘ˆ$×O\zÅhã t)° ÌC6ÐǨŒ»,fÆF¸ÿ8£ÿC|UÊb† ü’Pä„Oo.J=ÔX5ß6LЧ°/V<^wÅ!mŒŠ¶‘0VÅsˆ ³â.Üv·h(°«) Ê@q|æn^Æuç5#@ĉiqF#}ÇïèBO|‹Í¯4fÇÓH#¢w¤ˆ{ÑÂÆñ¨£LTñ^Åݨò£ìk`cà%öÊrœ‰ü1žÅ =£td†¢ññ‘Æi¸ ­á廋Ùp5j=SÈ1"…ü‹æ10¢ÇòWÙ#ILŒr1òÂÆˆ¯Ìĉ$†˜±?2ÇÍ[d'™ ÊÏä¾p Gc‚¤‘Ño(^Cé‘b„\Š©06:E Y‰äzÌíIöÆ%é횤Tx’ûñïååÇï䈀!¡ONB7¨ãàj™ƒG°ŠA¤ 'CÒ£$ƒv¬ªGé' ¥ 4”…†Á%ø÷øÝ£œŽò@á„DÐ &ÊM©aä§”#ÂNTòÄRi)… 9”ªò*JNé1<娬”°CV’J å­Ì”«22Ê^Ùé~eÝ –>ñWºbm%D”º’U.KWé,Ce´œ•ÔòTbJl‰íà¶ô•Æ É¹8a)Ghe±¼”Ç’\îÊV©"¡sT‹r•éÀž€ôÒ ¸Ž Q;V¾‰#âæcà±GNȰ· [À Ð-AòBºI ©ÕoÔŠ%ðå±%q—:À“ÊQ.¨Œ}ù'A­L?áÒX^Ë\Y.%QQP£”Ì%µ/Ýeµ„ƒñ’eÎËmY/›c•„„ËÐø†I⽤B“B‘.rG2™ͤöS˜iòG&¦bVÄl“å°HÂÉ#y1ßc/\âHÜiE–£‰ûhhêÄZø‚ ¨Ž2òKņ¨4 &…sGZÄ×5¦l„…ç‘ÞÆÈúc×d‡¼PÔ¹udÈÔÙ¼=“JHµÙIrÛÜ’“$$XÇ97f]L92o¶Æðè#ýæš¼šC2k¾ÉÂÉ!Õ¡’|_@ ÌŸÇ9™áj!tn3fK}‡;'‰©T™„P^jK28 ‘æôs°ã6O·i3ÅeÎ4„-“WJɳIé~fgü{n.¼ 9ãæÑìœ rLÌ©Ÿ¦„웣Ï)RÍh„:§z¤˜qòp¾Nnç#Z ý0r¢MI9Ÿ§T\øŽ_nN¹‰ÃdÝŸwS5ŠÎ„y>)žé{íÓ#¾OÃ?“䜄²ÓI Ã}%S¤M´—Öó9VÿI(ÜLˆ‘¯€&Ííh7DèüŽg’o:Ðô Ag£tŸ’‚rM Š1}ã3rŽÁ%àÏ(©?«ç伞þ³ÓP¹ð6 çT¡t“…"Pj0a¨ùD“3ôû±ÉÔ98µ&ë´˜<ÔkjLÉðÀ¢ü6ºÊDie°zr*€ÆÌwi-ƒ§Îžx޲Q¼ ;mçgé“|ÔÌ€ß /W&ôÜ™ÄSÊQ>¨Fã¨\à„´Ž¦ÊCŠGÍæŠ~øÒÏé–¢é=ShÀ Ÿ72¾PyEe¨÷#O±#Æj$ gEœ°“›˜ÍÔ-‹2ñ’æÄN¢I? ‚üžPÔs.ÍñY&f E…Y•nQŠ¿¨ë¼ _³EéÒ ó#Í“–„QºD4© ˆ‘(4.ÖH1J©(ùtš<²žÒ AWi3­sÊ>i?•Ã-ͦ>s›fÒMç(¦'56rÓ¦iLK)2]§@Ò†JLÕ ?w¨ëœ§urZ1…{:=u©•D|štLýÒ:Nh9Å›V4bQ„ú79bà” ¬tkºÒ‡š1½Æ\ …z(ŠZD &]†½œL€JNª(­¢¤T¤šÒ¦XCç E©ïtC‚Q–êCí¤ ©4Ÿ¦M$ZA4i à¤áTAP)úQhHÝ›•¨–G…Š5»èê„§KUž¶Ô¾á㕉ôïuˆ<3­ŒF#ŽâLCª)•%,¡:¯º¸¹ºéPf$Ý«v”’úÕ¿X7]ƒ„µ]¦ÌBšXûª¹ü«wõ±N’˜Ùõ*ª”ƒwt±zŒÆ*…]dQyõf~V\©X/+cͬ¦•³ÒZ‰X'©eu™¯5°jÖÓŠê<ë¸ ­®u´ÂÖÁÊY m]­È2[ŠV»ª[ck`õd¾õyÞVéIZ+då¬5à°"Wá¹\«ën嬼*ºòÕdéZÛÃ{ЬÀGàÌ;b @0ÀL¬Ø[€0@WÀzÐañ@ ƒðÀ=0#[¼Ëd¸û€Àƒ) @> $o  ¨/ز$öˆÙðîÁÀ< (Y@0x¬š Y9„@°³að0;‚Á ðáà4@ À>@(ƒ ÎÀ`´àцY[0‚Á6x€ÀÚ/ f¿l``Ä’ZF­A èZÐj»ì¬…]0ä,©E¸v@ðcý«ý±¸¶Ô"pp@ßø²Ö `€‹0@'0ò¨T`k¥í‡5kãø| `´%µ@Ô` @Æ– g½¬A€_ö pÀ0àZ{ `À£M ä€O D=¸;€ \Rkp@ˆ÷ ˜' Xxž`âðhÔ3¸Ÿ`üƒwà þÁúàØ‚G @À—M€ÃþX8 ¸37ÏúXº?øôÀü7@pÍC¨‚5À<X” Ú§ 0À³¼Ö c{º:xïàt3 uÁ£]À ?ÀmáÁ³1—Ժݮ úÁ:Xþ`ô` jI- ´ D‚xP xÀ*Ъ Ô€˜+wï ±à´ƒJ°žÁ> ¼“WÉ ÙA˜²”wô*YÓ‹zIì£ àÚ.s»ìë}¹­×öðrÁ®» ´?Ûd¡míu´»÷ˆ^? „‰uÞvYPho‡}´À¿ xïAHG ÈwÀa?À#HàöfZ}cãåª@||Ð J¸^àøƒP¸À(ˆ¹€ÝY@ 8@<мœ—Ëþwð¾7гàüXs±u²€@@ z €öí²pÀøvÝ]keùÁ+à?€Ë€˜{€˜õ«@hàBo lVüƒ}@ƒC/ñ´]öl]dW°’Å`Ð (@¦¼À ZÀà >#–òB) i@ `@k}`ƒ¶h_rðt슥¼0 wY囀Á‡…Àô¾ÜÙk„ÈÃJvZÊ `é½|˜bðsÁ(¶yVÔÆÜ¯éŒ8Y ‰•,¨Ä—ðƒ Ð °>pøÝÄ«xY@ 8¨ \ЉÿÁÞ}¹äà|{ð ®?¨Å€àÑ`†Áœ­–ò‚`l€Á”}´Av?Ýg,zAí=½àõ–Þ˜k@À#v²]VÔêÞÒk*ðHh´€r@¼ïëåøÇâ p*Bø¾À¯^P{#À?`ÿ@ €SŠ3Ðǰ—ä[r°Þ€>ÈÿÀØ„l€©­Ãöõ kÇ1€ç +YBòëe  #€“ TòëE-9о^ \òÞ» ;,“•l`Æ(Šðë–—,ÙàðQ63àÑ€ª@ÀODeFAðè #ðh0˜€€àZškh.0h"Ò+dá2Íeƒ¶Ë²ƒ¸Œ­À³ˆà€«{6˜Âì¶ @˜W²A8Ì`Öw°ü?±4WGfq€d@-@+V÷2XÐa…ì“ÙX>šðȹ$€‚ g(ƒö5ëÜÌàr—ÍÍï¶ËŽYU|³k΀Íî<`œ•ð²ø`øú€ð€m u΀ÀëÛ% àÃ~Ïú9[08è¿À\æëÜh_3< Ï(ÙT2€Šð€Ì>€¾ iÙm7覀|ÛÄûd€àyÙ[À ³øVölƒCòò0Î` çrp´1 ¨Á]¶ä6{²À!ðÐ ƒ[zÛu÷®X@†0&câêÛo}®8¶Ñäh¨kÞ?P’`éþhÒ+hstÀYÀ*;]€u—ôêý,Ø€oPTîÚµÒy0〖Ás£ ýtä$|¦ýPÉ~™:ó8}¦û#°ÉÀ@Pk³øaôih<áÁ †´à ör£Æ€x¹ 5ò5À €0ôAqîɘz €® 0ΚöÄ‚ì<þ;@ÕŒø``¸Á:èÉà°0p¨Àp0 W_{€j-ò-`0€ ,õ£= '‹~lŠ~Ö   +û Òîµþ±€ƒ1Ë ÐAäUÁ9ºØ0 œÏ/pƸºh° Á¬`à€^mÚ&0ÖÐØôFp¨ €°Æ€QËX€8ND€ˇîØcà„ƒjpþAÐ~AÈ~ÍÔjƒÀ@4ò ²žkÊë ˜AŸ¦¼ËÀ mHû Ì€ŒF€À8³à&0œ,‰W³à" 4v¸2[kwÝ3€ –‡)H« ˆí °ÁÝÀtƒvÀe Ì`g Y ¶É4XÚ (íÄ#€)`ÔŽÚ€0 ä.ˆÚ„»<ÏN] îÔ†´ ju  |³Ý†´ ¼m{`¹“q—el Vßê2Œº7 ®Û,m`l€P¦{ÝN' Àå.`pj_À örÌ­±Ý£T£ã iï º€\îpjÀ7XÝ}8ÀZ àîÞ}úËA0€!À^þ²```à2úVvè>¢Ñw³éà ÀŸ¾›í¿€ðï.«gõr‡%µ¼ú€Üð}oc-Å­µÝ2p^;Á‹µ@*+å!ËÈp7@*3j PV쬕Ê€܃k` L¸AÃ5v¸UÀŠ€ găÖð°ì+ÈXÉ’Z „?0(«6/sœÄ ¨Á¤–M8ÀÄìÑ€ píÍ¥Þ!¼Û 8P8¸äi0Á¾¨Ú3.fçȃàH‚`P¨Akö± à´ƒ|ÐÚ¸»¸5«[ dã.'Àµ¡ÔàÐ &¹·ä€[@ðai¬Ñ@  iÀÿûÔh;$€0àU`”€{È÷Á=PåvÄÊÝGn½{¹Îu²ƒ]Ñû÷0w²Õ€ÄÊèc®dI,ž=怠ú*YvËÌBP¾XX€Îs!@£U»v÷Në‰Mlc3 ËZóf®d·y9gç € Àˆ×9X– hHkÏ€$€Ÿ›s  Pç±îo.m_¸(;€¡×óÝ« èÒœøƒpè,ºjGÀ*ø ù03¢ƒ€.ì"9Ћ<Æžcä`¶@ƒp¼¹é4|tª`°ÂJoé™·0ò®PÙq4`–„ mñ÷m´I–©§Îb—ú>hêO}É„Pšº¨õ±€«cõ»Õ»úTÏê`]¬Ÿu*»ÕUîT¹r÷¸u|@j?x\Ÿë>ÖÔ¹ÞÔóúêåëSݯ?jƒp r`׺ë·ëvº~l»Àíëˆæ>ö·~l3‰ÕЖÌZÂÁÿÁf¿ì™ý×rvˆ,ÚA;ÐìÒV²¿ÏžÚ—:<ííVµ³ö‚+Û).ÍÖMÝBÛvƒpV;©%¹¼Ý·çYš{„;½¥¹gÀ¸s]p^ûi'µËý8wÔö.î°½ºÓÜC0Ý /]¾÷ ©ÇÜÔkyåî-ïS}¼‹Þò>ÎzÇê½ò2il\{ÀëÇ`µ×^ÇŒƒ¹{fßï·×¿ŸöãûzÀÐïVF€t€¥-»]ð žv‡u<à-±ýžÄ\°k?f×âµ9؃ï‚Õú/½>˜øN,À^7ëüà©÷a$Lz7À0¸ê§]ÆCa.lÐçŽ?ñZ˜Ç;€¨œÙu¼’=ä׬äÌžŠã0é}Kþ´7y@ŒƒÁ7ò~˜Ê€A€ÞùÍíÃ…øƒ.ÿå1“]^½Sâ3Ÿæ}ð'¦Ë³ ÍS^M—'œ±ÖËÿ÷Ðbiî˜Ïì4÷silþ|…‡Æƒž€10âOû£ÕÆÖØ 0z@/’å®# Ñó ýŽã±VÖô~õzúê+½ó®½ Ôßw~hUý4GûÝÕh ë3;§É ¹Ò“d“¬dQ²M>µ1yÃä¼|><>øÑ3{cìoò²÷ê=9üäg?Õ›}@ÊÔþØ÷d­LÜ™ý¶ßÊÌÝØ#cšK– »¸ËmÙÜ7õqoæòz·Ë/¯ÞÉ®íin_ž÷‹]ÆÓ\Èl é½¾ï²Ø ¬Cû²LšÃºY§êºw|µŽð°RÖ¹ _ÆOaØlðÇúofÄÁy¯óhËoÙs¥Õÿàhz+ýs¡³ÈgòìyÝ“×~ þ84æ²\¨?Ç_ü]6QãǯŠ3ò‘ÚP~Å}#¿¦Þüó‹jÐ_øU5 ý _VÔ®¬¿,ÿjð ;8hͲŸX×~Žš/²f»_‹÷þ²­ Að¿ý…?[ƒãûç°¸fþ…_]Ã~Ûßü€¼¦ýÔ¿ðçëÉŸý~¿Æ½ƒƒ ~ù6#ÿ?ˆ·þƒm пWÿeÙa÷?þ ÿÅôþwÙ‘òá.›ÿ—ð9›xùA›H´m„›´Í__¶á5m '6ZT[ˆËY_צ^€Ùö6€mÛØhmxx› h„ 3 nx‚›‡Çñ=a–á&jq4 À¸Ý€à@ˆÌ< ˜ ¦[‹‡'`£…º!+àøáõ€„›ö»5€€ Àúmxµê÷¹ÑnÀ˜àm›®µája Šç¼yAð—ø5fžöV¶Æß˜voL ©%ð€–©µü=y ’ ÔJV€ ¦0šZ°Ÿ¨À‰à xÁ àÀÝ[œwlA4×`Ø"— n‚Q©•Áš ´Å ¦Y Ü'h v €*Xݱ‚LZ)ø j]D\ & ž‚BÜ«•äÝ‚ Çð‚]^öÄE[°—Z Èxz1XxýufÝ1èjÅuÍà2 š‚2^Z× Vƒ_u÷Õeƒ %gÉ8Àðá9ƒ+–A'Rƒ@9蜃Õ÷Uì 0Ö å ë7z_IV<8æƒ÷ RăÞ×7 Å_@Ä[öÆGs$–“ÅÌ%sJÖ2·Î)tÏœ5Í‘XÔÜ:WÎ]{;Ǩoé3§Ð¹s ¡É¤žh˜\U)èÓ2Dm% W±Àô˜®i´›5ÅY2ÏvúXÐbíùTŸTa 4¸ 6„¥èÝvÉ‚ZlQ×\ìbJé_D]J\š&¶XcAÙd•]–—¦ ˆªR•¯kl¯ºÖ*ç³g›²·òæpÂñz\rË ±Ó…QÝucd·Ý}ãEûдòY{ŸylÀÔíÊâ’kr(«;ð»/ÇŒ¢ŠÌ×ìŒ Șó9îTgx¢-$‘j­$ÒN®„ÂÖ]²@¢U§é>üV³P–ìcu¿RlŠ6œrÒÉŽÊ>½•m]ËÚE¶4ƒ)QzC”¡öÆ(¿=*p‡ãA_˜ÁLÊ0˜S\§÷¸PIŽT•óLK¢¹ÏɆ5žƒlh3:ÜèÆtºJгº_1Ç9¯+–ìŽU»d- wÍÚ]ïÌ󻾯@ßZPoðB‡dšO$Kb¦úª’5ê%¼…\ð=e%ó¸¡@9ùSÙ—fôׄß÷MÿtŠãÇr·pV€75$Ÿ† ‰(9\jqC¥„?Ü´O)~£•pëh~¶‡Xø5Wr'†õøJÚÇ„yág™Š" g )htF&“6g³eèLí„€D¥€ú‡Šå\‘9P76 )¨sXjèsYåbLPF@wøb"t‹±VcIw‚Kˆ ó‹ ã‚¿6ŒˆXŒ4hƒK–l^·lPÖD1`â=È8 :>P"fm xf¥(@Ey4‰Q53`?‡!dfQ]SÙw.&IpH •µ‚ƒ‡‹…7k»8–½ˆw–Á˜–‡huG¶ˆ5¨dÈ–ƒ_Çlti—Š•—{Y+n ŽŠCiŠ…‰T4©AÀ—y6b®•<7™²˜A–‰™šÙjœé•G§‹~(šMç‹‚Œ|)u†Hd2¸šYךÈèˆq ‰<èŒzÉ—~IfGHŽƒ‰Ž†™†SR—˜,å“oøŠ{Çœ?W™—™™[i‹2¶‡`i‚éukÙIš?vš‘ž÷Uy¬é–¯©Œ:(›ž7vëY+í ˜ãÈ›.G”f8Ÿ ©ŠQ³˜aL³ŸÊ ‹×U•t•Y9 ÓY žÉ‡a™ ª2še¹¦Ù…H_Áž:žšyÈŒb'j¹ù—h÷¡‚Y†ÄD¢3G=r|ù‰9A-ÚŸsøŸ1Š•Ñx5jt¹š×™x<úB> W@*Œ©I¤Šh¤®‰¤ç©¤’¨¡·é¤º‰m¢H¥GÅa%jœQ%rV*]ú¥Ó™8¦0úA2z¦C—¦#ø™}ˆx ª‚=ZšrZ+Þ)¤1¡wzŒ˜—Œš›s™¡Lú§}¨HØ›„9¢Ày”–&[ Mrã¥, ©R)©*V•J£yØ™_Y‚¡é¦ ú© :§¨ ¡‰hŒÆÖˆp¹Œ;ØŒVÖ¤>ð¤î˜‚D¨k&sThœÄ·˜ÂI%w—œÀºœÂÊpQ¬›y¬Ô¹¦›*–Ìê©p ªð­:¤¦J­Œø–°)—‘読¥»9¥"Z¥·z¨Z1%]²«I¾Ê®oÈwÍI©fj¬0†¬Õɦœº£Íº¯Ï*ªA ƒÄ8ƒ–Gž©jžØŠ¡¶Éž² Ÿâ wh(±0p¢ˆê3°¥¹±þ9©Äú±ó²õª©9jk&«¯î5ˆþú;­m™§ªš¤Ùº¤ «Þê¡ ›môtM´ä’ÞÇ‘øW¿)>êxN•>P|fÁoS£@tO ¤† è›¶j¨Wª5ÃYœ§”Ÿ7ð«Dû®Ýõœš´]i£Éj%»^PËx)+WÑZµlù²Gšµ{ºµ}úª6 ¥¬'¥áú°…j@«oŠš7Ш†‡K¦;£Œûj™Š£ê´’Ëcfª–û¯¥jµš‹µ2{¡­Z³¸y³ :ŠŸé·åŠ·V‚vç¨%&™ˆ;‹X»zx£º¬Ê»qÚ¯*K§Òš¹J¼×j¼Ûƒ’Smù2m±ze6«)Ÿ3Ùÿ§Z2!½öö|M &z{S¹j(|lrSy}—ÀL}«„(zË’i¶NØ‘2ɶ é¶ý[’lo,û3ÁÂwÂYÑÀÙ7¶³¤‘g “P±L“oÛLLÂ`¢P9Lw®¢|Kèû·ø‚+[]Q¸ »E;¬p¡¸– ‚ôê¸#{¯:º»N7¾¡S¾—¼è‹§å¹¾¬Ú¾ê « ;ºa;¨¦;®q÷· ¼ºëºKŒ½±(»GK»Ò9ÅjÊ´¹Ë‹'µÜÉÅÀ۲≪ÖZ°è©­~Ê—_˰‚J«ú ½!9hûf¿õºtü¢N¬AÛ›ÇJKÅöÚ´~<¹½K¾¿Kµ^ì²éƈ̧냱Q‰ýrec.Ï&¿tdGU¤¼‚¹$ÖôÂÍ黽ÀÅᬕ“{ ÍDÝÆåê˜WQ¸üa`1ØÁZØ\´^ݽK²Ž-Îd­å+«–ªéå[ÞZK³eÌȧýÌ‘<Ä­>%²U740%5@œÒ]ëÔÝ]]=åÞ¼Øa¹ÝýëP7µçÜå•]ì`ξnM›T†¼¶qÆ^çUX$ƒ 1*  "’p‡âc]ŸqØïá:‡ ñ#ŠDuˆò¦a5¼†Ùp:…n8ë¾a8‰01&ÊDrg¢M¼‰è°&âĸu"O$‰!Á$ZCl¨ 9ÄJ ÞP€C#À›¢S|ŠP1*JÅ©H«"T\ŠV1+jÅ­ÈVìŠ`1,rů(»bI¤†C1%ÅÁ³‚K47.ÊŸX™b\¼‹r±.6E¼xÉ¢Xä‹yQ/ÎÅÁýbUŒtQ0"Ʊ¨¤âbŒgñ$E•È‘bKTŠñ1BEÍ9£SôŒO1F»8cg,Ž5NEÐÈÁ!kÜ‹ªq3ÆÆÓiã`¤±6ÊFÝ#cZ,ŠÜÐ2ºEÌ‹£iü‹Æ±u)Æäxp#WdŽÇ1,BG©è;#s\ŽÉ‘1:Æë¨}#JŽG‘ø]FpÊ£y,ˆ&=¦Çóx›{¼1€=šGõ¨åcy„ï±ØÇ éãz´ù>îGÿˆhö#~Ä’@’Gy [‚ô2@êGI ÷clñ‘BBHûˆ!k€wœŒk´E9ƒ¤ü;‘Õn?¢Hi"«‹¤*òEºH ©d䉌‘+rBÊG™"ícŽ”-rE.Hùø#u${ä‘0ÒGòÈ ù"id‘d’7RIæÈ©ƒ£xŽC’=vH 7º$Ü’KzÉ/iÁá–ô‘c’LîÈ0‰&Ód„lYò<¦I5y$Ù$‘œ“o2?:I<É ¤˜“TÍ$û|Ÿð3~O÷)?ë§ýŸôó~²Oò0‰#j\Œ‹ñÐÿI@(^tt0 Ðj@¨E €q6Ð ê@)h\ä™0À‚VP¹È?Ÿå[ÌF„ŠÐJBEè=¡%”„¦PzBYè U¡,t)²PêB_( ¥¡/Ô†ÚPpˆCQ¨¡?4…ÑúByhí¡%‰ŽÐj>‰#w„ŠD ŠJÑ(º³cTœ¢S´ŠG܈E¥¨-ŽR±‹RQëhE¯b@£_†Q4JFãí¢¸q:^Q6Úƒ"ZüŽÍ²öGùF±¨T$5 fѨH¹(}Š€TzQBÊG ãí¢´‘BÑCêé…£j*ZÒI I£"•››ô)QJJGi$õRQ¨ÒUªJO)}Ä¥´”ºRõ˜JYé*¥é‘:*€XJJq)¢©¥¶TøÒ@yé(Å¡Ô)ÓVêIí¨d¬’qs<*é<ÿ¤—¤¦ÂÓšvIù<µ)<Ý´MŽIl:?§©8½¦²šžÓmšN³iÚ¬äxzSðI¥i<ýûQkÞS­ "Ÿ&7U§òQŸ¶ÓàÙOSå>Ý™æ4 ÚʃZPq%CM›U>†S"ù4ë)–L¨ìñÎÓ|j7*Dí¨ëô›šGR“d@5‡`³<ÂSûHR亂d© U>O>yRËá<µ¨Ðr{ÎIéOœú£â~`5¬‚Õä)¿ªX «dÕ‘šÕ³:Ò*T\«gÕ­>EÉVÇ*ò,«ö±®¶Õ»êUój]õžº¯ÊG½š<¹*f\ˆ$ÖŪXkbu¬•±JÖÈêX'ëd]Š”u²fÖÍjY#kgý¬³2VÎJZ?+h=­”¢ÖÕªX'«a%0 ÄÖÙJ6É& ­²5·jM­ Hu«n5ž»5UÞVßJ[ƒë©ì­¸µ¸¦Jà*\ drÕ­µõX"Wâ]—kt®ÄU¶V×ãJ _ëK4‡Å¼"Ot^m*L-‡ð°¼’ÃäI^•eLͨçVbPö_Ý«y­©åP½‚Ä9^ëëª|¯çÑ»J‰+[¨—vÓ®­"XK` l-°¶ªØ »`ßGƒ•-VJO ‹ì„Ͱò&ÃJØ Ëa-,„Ű'VJØiG.9,ˆ}° vÄ–Ø c!,ˆ]±–úÆbS¬ŒÅ±¶ÆXï*Š@‘=²FAŒÙ%{dÿ'“e²b” Y$»§ì’‡QöÉ6YĨel”µ²E¶ÊvÙ( »¬0å²`öËvY1ke³,˜]ŠhV˪Y+»½«Ùt•d3¼ÞÙF™gu%ÃDšx¶mº×=»(û¬¦$´¯RÚR©3³æ¢”ˆÖiZW=+5å£]–Îô7æQНêì䞺ÓÓÒÎ9™<Ÿ§§œªi²ÔJÕ§Jj‘§¨-žŠ¶Õ†ÚU‹Uemî|µÒ3MÖ[Kk?­­ÅÞ5™6Eaˉ­0¶…4“"RIºlQ)#u¶š”Ù:Å= m›-}¦ØöÙ¾Re[I¥í°õ¶LQÀ2Ç( Éí¸£åÝ2G,«n“£¹u·íÖ8¾[y+F]ã¹í¢éßÞ[,šoùíº}¤þÞê[‹Eƒ-¦×dK nÂe¸þq):\… qéãĦ—–^\j{mµ­z¼¸Ç܆\Tzq“í0¹ÆÖ»rÔûšQêy%‡ µRÒÈ–ÚråÊ…¹>ÒŸ¾ÜýšO].~‡1·Þ\  Q}.|e¹r²¢fZ< 09í®ÅÑ3yF]ä9uugÕͧ–xJ]æ¹uµ.Õåº_—x>ÝÛyu¡.صºg7w–ÝÛ™u{g×u»a·wªÜ+‡nÝ¥»QÁîæÝŠtG*€õ»}·<ÒÜóxSªlý»‚ñÞÀ»xq®Lý®Ž÷èF^Âk½+ ˜ˆ˜÷òfÞÌKp@çý¼LCÄÑKz{–é…& äôš^Ò;z[¯ç}½Ÿ÷òÊ^ÌK.g¯ì½ ·õ²^! zQ/êU½»×õâ^Ïk{1ïæ•½Xö¾^Ý«{{oÏú½¿7øŠ^å{/X-¾0`øv^3)}oê…¾0@úb,íkgg9¿çWŽBÅç‰~ѯú}ЦV´ßôûDá¯ù¿.¥þ:Eö‹ímµ¿Âÿæßÿ»ïïü…ޏ‘ÿ`ýÛ½« xÀ8K` ”*°¾ÀJik`Œ;pÞÀàp{`¼EðÆÀ%XóÐ|SðfÁ-ØG`¼‚Q° æÀ0¸[^®IœzðÜ(3 a5•¥öÁA8 á",_­êþÁJ8 Ëbù„‰S^ÂSØÏVá2{…‰p–”Ux+ a,Ì„3åÜ8Ã=x 'aêY†Á0>Ã]ØÒJ EÍa ˆŽÕŽ^bÚ‰¢!‡éÑ4¦Ç¸‡)SôÃ5`ŠCúHéãû(Ĺ«Çã« %’xbjýc<츙XBâÄ8‰q.íÈÆ""šã˜ˆkd94ÄN‘D-Wgå]º ÒhJÓb¹:¥åƒ­8@ÈÖ<\w| Œ¼¼A`¤x©ûÑ”€ÏÎsL©¬¦±: ¦b•7½x"jØÙX}ñ§ÆÂxãÈÖb|?ä2VÆîd;cɧ0¡‰46Ô8ƒjclܳ&â/ÎÆð0`¬]ÇñW‡Mé#tìÜrÀ˜ÆÑx"ÂãPçq7öÆô8ëcà)˱?&ÈÈx;¦€,s@;–Çט!{W©X=Krî$É&9%ëÒ”¬’£"K6É(YwŽÝ’“_2_…Š6™"ó×Àê’s2ò´³–arJ©(”ƒ²Q.ʲ(#J¢|”›²R6ÊIyX2å§L•²UNÀV¹*Cï:5"Óø `±4C± –½²YîÊó,“å°–ÑòY6ËÆS-¹ŒXÞ²[NËlYzÒå»l—ç]ö”y™8ñå»L—áÆ^îËn90e¶l&óY.ÌŠ™/\ÿ¸L®È¤•9ã¦Gp˜™/sÃ]¦šÑTfŽKK=nzìÌÕ¶ÛRfЬ ¹í·]ÍÁ4åâbh ;¥)ffÍþјÛ› ¤nN¶¨™>þæÏÜ›s³1åͶ”4§Çá ›m) eÎ7o[èüq¥³zÔÍ“9:gáŠ@wþÎÈ™•öVïLž»3p¶ÎËù;—çð¼Jdzz6ÏÄ99_×Üüž½3{V¥î¹<ïæø,ž[³~Ïü¹=WÈÿ\¼kôŒ¯ýµhñª;Ï¡P…¼ã¾*h扠´9\Ðèu'çNM¡ô†¾Ð:¿vO‰g…þÐåÐ@‡èõš É!†fÑzB‹]$´‹^ѺEûCý54îäÐ&ÚCÿh¤E´L¦Ñ€‚G×h--ïÔÒ·ÓAÿÊ=¤/t°DÒ6š"ºJ*¥¥ô–ÎÐYú!~i#¢ô”&Ó¸ƒ>i(=$Ρ崻•¿á¹üTç4Æ´VZZA{h«ðö´Ó”–SÆJxxi¿òœþÓO8PK¶y)Ó«>ÔGP+Kïºó*õ ØydÐ-×èRù>Žo£q‡ :ƒRV)Kõ ,4U£ê¯0d@«nÕ†RS3Lð MP‰­Õ’•!ëj#À9‚¯Ž'ŸæR kLý–âªìÔ¶÷SÀPJ+©Æ¦Ú+¨êTm˜_µ«.oYgÂCZ-ªou³Ž¬»zWÿê_mysuŠ ­]ŸëÉ b!ó^±’ÕLžë5¯Ñ5»æ±î:/óØo½XÕµºö”þÚ"Üë ›¯Õò¾Î¬;]×kÑ YÛu`ŽÌ–R?Íç©5Ÿ'٤ضÒb?Íü <+¶ó¼ØÎÓc O-< õ±ÔØ©cŸì=±C¶­äØ¿“dO‘›gólŸM´{öý8Úçf㤴³+ÕlŒB[gí©µsvÑ&ÚH»iß쬴¶ÔÚKñjÿìª=µ±6ÓîÚ[ûl߯M¶Å6 XŠm»lsíµ¶¹¶w ZA«L¸¼ÝZÜ ¯æÕC˜(ãm-¡%¶Bs'6`W+a©È·õ¶ x—†Ûqÿí¸£¢á)ˆûrîÄý·wTlÜ„t»“¥¨«+÷úÜ™uîÎ „§¢è®‘›pOn!ü¸]3SÔÜ©ûp¯n†œ„§âÜÝÀ;x ïáM¼Ófñ>ÞÈ;yoë¼›·ó6ÞÏ[y‹[èH½«·õ¾ÞØûßfïíͽ»wõö¿Þ;|‹ïë ¾Ç÷ö6ÐÁ8};¦ãé˜Úw0Ö™ê[}/Ïøí˜º&ýÖÉì›~Ão÷ݾç7ÿŽš‚ú~×Nêù¿±5Ì,àþ;~Ûïÿ¿ùwË|”÷;׎ÉÀ‡ev®ù$ƒËL™7¸Ï'½UƒgpÌüÁ=x²-á#¼á¢ð ÂQ8 á,¼BÂp! œEó oá"ü…—pþÁó —á.\…Ãð žžÿsoÕô±>Ãç ¹#ý³?âMBh(~$}³¯áF²=èúLŵ8}6â­ùA&ñ)^!íãï®âL'q$^Ùø|¼]|>–ñ(¾Æéx·ã›£zñ:®Æïxã¼@¦Í8Žçx ÷³YP–O¹Y„Á«}uäÿ5¿>rI®)çë$_¯—|SGrHÎhÁt&‡ú”rMÞÉ1ùªÄ œ’—rrhyGb˜–‰¯<'bi& ËiyLœÉô'Ær˜˜È²£?í`ÌÏ9z<,»g ïaÚhHú)19.¶j¦ŒYú_[/=¶Rn™îõ¹>ÿçþ¼Ÿ—YNÐ)q¦?Ý0t†Ñ!:4žè8%õ Ñ5ºG÷è¤GõIzø5‰[¥Ÿô•s6<Žé1=Ìt±îì)9ë10z¢u´­Ûz©þ0pýÓÄæ)×ãºÏvëm=êõ³Þv}ç^×ëxý­×u¹=;\7Õ¦ú¯Ÿõ½Ö;b‡Öv°ÓõÈ~×»bOëØó²SÏÇÞ³ û\'žž½²ãu;[…y¹¶Ó1QNainÊ95j7í}zN^,}ÚŸpjÔG&šs7lÛa{¦ æäPƒ&îá^—Š;q?îÆ=¹÷ZU…»rîÈ=º'wæ^#ŒÒ=»C÷çN݃û ÁÛ]»‹÷“ïöå6Ü“;½‡kÀmLÏ;ßVïð!ëf¾Í·Iw|WïºÙ½£÷õÎß-¦1¥ïû]½Û÷pß|кïë}¾ëw/àwi{7ðý½¿cçD¾i›(ŒkVÕ Ïá›"êt¤^,~x­XC¼ Ã€ä†ÎâW|Í4™TÅ·xÿâK'`äÌ 7Ç ÓÏãiüÐDœUVÇçøßãk|Ÿ¸XvÆ»øŸ£Œ'òLÞÆ;y!¿ã•¼WÜ¥L>ÆSy+¿äkæô6Ž•9ËSèæ•ì˜ÿ·e¾‹êf2¿LÅ?yÝ xtÆb ÀQè½ Fyf$°‡‹±Å`FHžy ¼P„ƒà‰GႾ`„šaV£}È`†M¸Ga¬aYt¨¢O8(Çtœeãy/L1„ƒsŒL?f8…‹ëÑb®äD–AÇUå‘ä THá U¹ñ”Q†(²áWÉq†[ž)Æi®yU“X†¡e™@ŽáàgrT§Ô–c°ñ'WëÁ‘[šÈá&²ÁÆ–gTye–”Êá –ƒ)u¥sl:]u[ºGonXùF©jXŠjj¼±X©tîÑä«wüD£|f؆ƒm¼!誽¾à†ƒ©Þ¡è®[º‡ƒ/àAÒ…fl©ér;¬µ¦Êñê Åº)†¥âÅ•[†j+oÜ‘.–’Ƽ‚ähî!íHÙ «jºêzÔhpÈ:ZoÀUm¤K‘`¾!c’+˜”qr¸ÂtÔaB`”Î ƒ T Gx”ÁƲg1k<ÇOedET!EQ€ÒH(«|1{¯ÜòË1ËÁp’Ç0Æ·ÅÎ=ÿôH#aí3Ð pݵQO !O1òÂE—0sͲì2¹’±kÙ_ÀFi¯MmÊn/ ·Òs£QFg à RAgãgƒàµÖýÙñ·Ñ4#ý4ݺ¢÷Þ79ØîYÞöÛš·Ñ†#®x†£–Q5ÃIÉÁ2Ù4%<{Õ¶K+å²»×~ûŠD%`$âà†gÁ LGÁ‹ÅÇÞŽNgÅT ,‹†b¼G†nŒýÁÓ/å|3-/°hÏŸ`ñ­X~{þ ¸øÌËáüøï¡@dÐ ´Ç=ïmå a`Kâð¿= .\‹K\úÐÀðñ‚ Hƒ\¶$é8 õ@P±é|' “Öò‚ŇÒ¢Cþǻۭo45”$¸#I K ÀQ[†ð?E0 ¨ÐZøŠp ³R=X,k$t› ‘’±Ѕ €agøC)ñ C¤¡ð¤uÚ¬;DbÙPİÙ‰JœÈ›IqT´W†\æ ,vq…L|a g˜€‚ Ž´›È†2ž1 0âí8Œä‰Qt#˜lHÇ-¥F‚ùBU8ÆžB–ðN㙃„®B†ñàfyˆN€(¤™ÈrZ òåxØf_^…˜çIÀ N˜2ˆÁc»[ÚP‡JÞ dË’ËqÌvŒ![æË±e ä´ãHè¥Î±a±‘²3óL3´)µÏ7s„ÁƒóÌ™)Q)»y­A•ó˜ƒþÇË!˜Å|A:‘ù¿e´žÑÄ 6É MpÓ›£ çŠÆYN3i= @çU"ÈN±5ži€‰G/ Í£$Ðp· i?P‚Âhk¤”ܳ+ö|Á\KA(+‚¦bÑmÝkbFÙùK2ÐÒ–¸ÔeC}Éd>Ô«=¦8¹ÃbS* ü_S-ÚLŒêqŸ"ÅPÖš§<ØáH„k?GÚÔtRõœédéx\:Wø¯°M…©LŠQ›æ3§àÜiÂü©Ö¦Î´­Ð üÂæä  «fe›ÊXh"q³0pA ppMjV2›£½,=¡)Ôº€'sqíFÙ2;¤u½k%;4Øï„g<z_–„[Y ’– ÿÃàa×ZZ{¦Sºý¥n¯™M8z´tÓ©8û:žw6}ñ”­3kŠOœêÕŸð¥ÐQà–èztƒ/h±zÔ&&u• }j€Þ U¿Ær–äÁ*rYQ¤ÚŽ t3ÜQ”Ç£ö§¨rèï¹”Š1H·²¬ìV%ÚUj}ÕÄa…¨=C\X¶ÎÖºWÁn5ÍZkîÖ» odÇ;Õ§4°vliØÜùÈóŽ&½Õ½çMõ)^žVÖ¤ù]¢ƒj_ rP¿‚`R´·Pe.ÆrM€Rà0»&M1{‹*à³*¶Y®€ ¬ûm„Ê0ßèòh`!Û¦6ðš+ZéíoGŠgiíÙq•à  &hq¾€ z&Ÿýg3Ú·Žfƒ¡%h?/ú‘˜©¦%ˆ†gMײ»Škc iR³ð°œôª±Ç6éQŽ”$ÉÿÐ,Ê"ë}Ždñ.¥°kÈÑÒlãùr±§6;ÈíŠýiP±¼¤„òÌ–õ0V–[SÈzBÅ­$8͉Aê¤P—1˜-†• Áºë ;r-c]Vê`°rJ4*žÉQJLh3%WPÝv•ð3ݬ<*®¨ÞæBбc0-þ1ŒÃŒhr5¸YG²‡Dz㛩2ñ0giI ‰Ý=Y7‡‡[G·V¹É[¾` Æ<ÑÇYA=h¹&`ââÍÏçÔ¹¡³\*àÁ1x»»Ùå!{H¼æÓË£C†½-s¨ƒ*4h0>QaËHRµë’_Ü%0{{ÆaÎQǃЂ”<.ïŽÃÝçu& ðnåüÚ·IE: À÷@¡&)*sØ þ·BV¶á|ñ‘¨•ÆÐ†<¬ÁÁ XÃòîà ¿À¤èC¢Üãî÷Œ¯þÆà ûØG*ǵlLìX út{ZÅÛ ÷¨ï´oëÈ>÷»Ÿ1 vÝ$Î{ÞÁѵ°Þù>ý¿¿¾»±·R]Šßn‰ ŽtäPW†ÉMüæ C5EÙ;ò<^LÖƒ¤ÛZÃE·ÝCä€ â½@¢Bsá\èÂ'†tné&X²W¡&"s€rr'Êõ#ˆnô¢€NÃ&[¡â"g3âòS•„%X1‘Âø¸!JuE‚+H€)è6+Ø‚/ƒ0£& Jå–1ˆ‚Å 3eà½Ë¢=6X,BЃ18‚@Èß$1o±(Ô„3…F˜exL{@\ÔB(M¨Je0 daX °VŠcˆ!kul1‡ç±Vb°:xø†3Á|¸"M•,Úã‡Ùˆ²:Ú¢*†hY#‡Þ²Œ˜mMe‡v‰©¢ØT©ÒO˜8‰]ø‰Â……’pnça 0iFàpÐCoÐOVÀ7Ó†!a+qk¸P@‹g!¾å‘0")_€y“Ñè#%©!ÆXSŒ•ä?Åøue€ŒGÂËX?¿XzÆRwÐ_å1_v_àaJx\¸“,_ð$ëØŽÖa†R"ó²ôÈŽ¡a\É“û84òè£ëA£Qÿh"Rñ$ñHމüXÌ#xŒÁp̸"©t`ñá?ø(@F02Ê“3X@p¡!áóuüô „E% y 'BYòH ÃBÉ‘·¶G•”\¦4 ?I#K„k>D”TxÞg”ðõ@E •úe=ݨIy0"B#N`)YŽý–É¥•ähŽƒ‘ŽRÁƒM\o!&ÓˆŽêèmy“ '%•[™yËaŒ1¹YA9Gr E9_õ%cù}I-’‘!v”XÙxŒs`"IER‹Ç±_ aö´ €# 2 G/8¥yš”1aËgš¨©D«™3ðš¨)I¹I¼)×”›†a›û!›9 ¼9H´š{áÆ)«‰Ðyš3 ša°6°œs1Ûiœ¸Éš7°œ¾Éš8°œÃ9›ÕI#‘›Û96›‰ÆuØ1=""tN àY3±+KQzÇirºw 9Ü×ÑM8£1 ;ôAPg¬ ÊŸêì1i1 A'Õ¡ ê ‘%¢ÒbÁå!¢ª9­á’"ÚE0 Æ!¢¸Yjú=ê›E€¡Gq3:ÃY š3Ú I`£J: õI°£ >zò!¤Ê¡4МI¤ 3á)º¢r¡šOà¤aÚO@¥mУaŠ›O ¥D¦¾ù`*Ãùeª¤4РS`$;Rzr¥U ¦šÑžUà¦pªÍYtº¡ ZÒYyZª™‘Ê¡y1Z ¨d1©á‰¨5PžŒj¥“šž›:© U¢š¥"ÄO êI²Ù§µÚœ—×.„jÒÙ£Q«ª¹T¨2Œ1`Ýipº'¡š¬¸™¢Q«¾YiàT«Ã¹ð1¿Ú 743”¬QuÀ#Ê0¡ 7Оäj®d ’b™1gP&(;<f0¯7 ÷S7ƒ®üꯪ°/ÃOl`;‰ã¯Ëšꊛ¦®¾ÉêÑ‹¡ê:œÇ1/žC¯ */g “G¯Q*²$û®t8Оôe;_'¬³ ŠÍIw@ŠºÁcQ²8 ŠRy¢75«šÏ¯óŠÝÙ®Æ1°gÀY³¸É´k¯Q˲¾Iµ*˰¯Ã²Ã‰°0,£Ô°5Û .Ó„uʲQú²þ©i§ ´ÙŸh xa÷²= ·ÍI®Â­Azp+Ô·ûªJš݉¨9€›§J¡:ᛸªà #c0¨pÛ çV°úY×Á#º'³ûÉŒãC*©{Ñœd1; ³“·ÒY¢{¡š/j‚2ºÝyºä*B󹸉uÀ"Pq Ÿë›µxºAµà ª¥·f{yû¹Q:±£ûíp\‹ 2p/€Ÿq£Ý+t–ú¦¨Ú½ª¹¢»¥ÕÛkH¸Õ‹›i ¦Ýë›ïa¾<š¾ô:Ü”¡uÚ½ Š8òÛ½QÊb$l`uû¹3±n ±¨Ùœ£S+ŠšÒ‰@á›3¨©šž¡¿UJ¡¨Y»«z›3EÐÀÄ›*hp$çšÃi>Á’ØÀ Z‹l¡?õ¯ÒÄŽ[å#rp¼F:u`¿3Рu°¸ß“šQZ%Œ¥/P`JÍ,¦&÷ƪ©Ê»Ÿ4ÐA`¿4€›ñƒq3~ì¸sk·Ë¸èÇGz7”Ñ /LLQJŠ–,Å5ОoÀÁ–a¯ì#R¯Ñ!”úÀ뇊¶Ÿ˜:Y`¿Ê%ì’1®Œ›Vâ9ð"œIŸ_0yÐÝSI¤¹Ë@ÒËØ‘XDBá¥{k Ob—aÍö¨5I )šøÁú) “RÙ[c†âl\óYØ‘Íö/YÕØE¹’‚À,ÌMôÍ Îv0ÎðXÎÈì™õ<ÌAdíLÖÏ ÆÏÉãÏòÙ™õyŸòÒ-ÚøÎ>ô”Ý'P `•d!ñyÎ É–†ÅÌãÌÐ\v™:¥,¹¢“ãAw`'^ßÛо¼˜÷òcÓèÒÒ<(ðßœ\ÑÃÌõÏÉŒÒ`‰DzÔL9”RÔr$ÖÌÓž‰Ó-¸söä?§}VLöTÎw a*‰` á˜ÐoàAg¡‘’IAXdO#aOx9;t|ð#ÕÂõ©øhžáÂJi†ÈìÓ`¹"\¡ÀrÍÓ ©‹MØãdð$rKz€ÖxýÒ 7Ç7}=FW9"¹”Ùö´Ù©×·7v m%~MÚ¡†![ ‡sÙtÚ)ÙO460"#ÙÒc½Ïi½"MbÙ}eY-!!ÂÕbâ†_bÍÖe¡RiOfh?SÎo©@-EÇ]ØZM×h}×.½ÚÞÅ×°-ÚS]IåLÙ–-·­Ùç Ó àÙ¸÷ÚbÁÞ]Ú@¢Û©]ß ·×ù \ë1ý=ÛçQÛ˜­N 6ߟèà¾#3r0ÂÍÖÒ}á=¬ÉmxâÑ!2c†/ºgd°#p±+ï!z‡¬1ØFüãk΃+M§0î>ÊÃ0 I !” Ù+•Ö“Ç/•Ä1A5 ¸Üñ(Ÿa0væõkƒãTi½|!C×h=2vÁBÿ“åi}|TžZD3sü²ˆJ¡m¢ÕRâ,#-Å]L®æ’ZÊó=Ê!Áè_ÂÔÁÁ.€3@6 D- 胾1 l#Qè7.0ï7&7:f³Io—Óç—ndìw;T¹HtDtaèJÄ!¡¬206A>IáÊ‘<æ–"Á¸>t-]Ä2APCM :4#æVŽs Ž-P9°C#±:ë3(€CÊ-À®C0°|ÁíßÌÕ æ\sëœÅ#¨(À(@y°ŒüæìÈ)ðÍÑáÔže~:Þ½J4ÒNík`íØÞ°ÛŽëÞ\ç!îå>îæþ&?޳ˆ¹ì“ÝtsaPÔì>eÀô®-`7°Cú®ã4` üNþðÙ>ðÝÎß~ðäŽðî(0?÷Õ!y°ñ±Sf4Jߣ1ï7pêÖË0jEô#±²2€ô¨<¦¾ ôCõª%õ…ââ±îžZô*I#!.>¤ž’36ÃéÖ†é>_¢îàHd½QH_¬NÇës!X ^¶Žë¹®[»¾èþë^>ìänìÏ>cþ­ì6ð³víÓïöïQqí)Ïí*ßòáþòœ¿ðc‡îêÎîî~$+c<"ïïÔÉêëÂNò’_í•ðŠ£ò™oð›Ï0Oî2¿0>ìóátW¶Óä0±©_¥ÚúH´:‚þV¯Oùn`ùùî¹ûºÏðè^ú< 󲡯¿1o½Éyß6€];ž¸‘oò“òÓOð,oûׯðü¢ý( òb üõ ¯ƒÁ €L"ú¬—ã³êou$§kRò¦]û‹}—þÁÍ7ÿ^ ±Ë#[Ì8pÒ˜í c„¿zךæÂÔq<Ù­?û¢ŸìÓvÔ/þY¿ÎGÿ.àçC¼Îx¢XäÒ¨?I}gL’¤@в::ÔNX'¾¿•7å ´€2ÿ¿2 óÐ^|03€Dcج¤W~®ÔXP!¡êý««ÇôÂà©Ûvd°4Ùº§÷Ò`Öãs!*‚Œ»¯gGħàKÁìmºêÐé Ü§“¡nÔm’6¨DþØmtuÏÕq¯ëô­‹ ·Îïé:ÁëÝãË…Ð>\wì_²ãxžìé¸hÇþZ ô›}1° Î@ìÇ ëß }í.€‰®@PŸøsj0 ñ=>几 Œ€L>Á˜gÿr ú€ >0øÍª)Xù µÁ‚>O+Á‘5XŸ]…2ƒ÷mé]C¡§D:™ÔÛ‚OÏÒ‘7¸õä g¡ƒaoìuŠ<( w^ÚótÁf²´=RGãB©r× $»‡Êá¬K4}Ïï%¾JøŽ„%´†Ànì>þ€ø®Ü'lëÊÙÂ^h _ í«~.¯BAû§î^ ÉÈ%ä[XïvÂ\xv¼°&Á_¸kß*¬Äð­€6tf ¤¾Ä%I†˜È;úB(…¡FŒ‰ ¯sÝÃBLOr&"[¤¾–%IšŸŽC€ûîù¹?TXàQÌ~2)Ü ÑdH3ës ”+Øóz‡4‡§ŽRyÁÉ€ 5CÔ+ƒÜ0.¬«oH õ¢6„‹öð.Ú¸T»Þm‘{uPâÁ£ ë!–ú‚9!Ò–NârÀ¿’zÖ+$„2Êh%Ã8¤#æÐ4F4˜G¬a=䌗‘ŽÀÁœa½bL‡w°ìƸõ £­£ FºÔ¨ `€fD"º‘ðƬgãÕV^°7F½àÈW#דƒ‡QÚA²Ç5F=ì FÏzÝFÐb½žeÄŒ¾Qµ¼½\X¯Ég|ŽvD4ZGÒXê’ãu$ßQ5FèˆAÀt\‡Œq=F½UA@rºzü1 ²i¤ÒàÈýˆ&é${\P‚±P—ù¨N¢cbŒÕq®El2<„Å.EN¤§¬lÀ>|uý0Fî½™%!ࣄ‚Ï×aÂ`·‹tˆEçK¤Ù(×Þ‰¤‡ÒpEÍå™)›'@—ZSzâH„˜ ‰Ýõì„îí!–ªwy6W"’¤—]RoÞKt×»ºGïBgº²eÍMˆ‰6%&•Óþú4æ˜|†m‘e˜É¸·`]Œ[tdHæEà8±áîä }ñ…&+.ÈB)g_Ô ‘3~rN }§‡ !RRÚE÷q£¬ƒtÂ<þÆ#º±htpêQˆ6Èìø'qc•AÓ‡JGài4;”ÊT"_9•ÇÉ€Ä#f£ßqA!=#z‹£u„_4;¢Ñkb3Ùdï¤?”‹êAá åÒ„”¤CAMêÄHhMô³j:Âû™5'Ḡ•9²n°‰ìR¥²cNÔ{ÚMð¹6‡áø< #c¤>ö4A‘HÀ´ ]ƒ>A™7?>h³œ"Öñx–NÓ(Fhã£(s‰ÞÒø89$ˆ¢<Áéºh¢¤úËÆÔ;šG­—EñèE”F“úA¥™R)‘ Ú ["©É-5¥óÄŸŽTÑMOQY=ýgC¬¤c“vÏSú='f½T ÝÒààFéÇ+¥šô€¦ÒйJ9¢Û<$‘ã P^Èü€";ݤî4fÐØ@]–‚3}ŠÐõù§©­¦ÔR–N0m*5[Ý‹ì–ß´‘ŠKqº?»¦$í‘”ÔZRP(ÖiÝÔ§²’ŸjD™'Àá~t æ+Ù+)¨—û4o.Ô†g UÒ!öc¤Eˆ:"§úŒ ÒuÂÉ/(¥êÍÔÂiBbU=ÙKïh¡üÐTbSö5‚Þgy{ŸåŠªÁ[ÇÓjm£Pô-–ѪWC¡†­¡)´Ø¹ÕeêU;ä3-š£S£ÂQ9º&Ô|«,ÊŒv¯ÃºL‰c\¥º³è…ÑÈÊX¥^_=‡y4¬ŽPGDá+³kô®¬¾ ZôHãS-0´ÀÕLyæ™ì‹_еî8®j½<«i媗Õ5þUü¸Gçðd{Ö”.„„Ï"IÝ­C¤Ü”y.Ò)Rm¤þäš„TZÏsªRƒ$ë+ GÒ"®¾œàIÞéPEw9©.J‰úóŽfEMš•iFÊÖÔY®“A~"A8éÃäZ?—+§§#•\’Ó“š.±':ÕžµÕ¥FÌvº]WŸwí§7°žŠW2 KÍ+‰ì£î³xBét‚¬s‰¤2RNõk$•®æôTþW Áñú¥€­ Ö“pWŠ)Tlà ¯3¢†Ðò*MÑk„ý£(R…Š+*!=^†õ¦ÖS:×G:N?ì¹ ±)5€®Ô`bQ"v–¯ÀvW…êbÁ«+uªÕÁ2J’^ƒk‡ ƒzd|ý¹ðcí'så°ù’òO;Iýku%×5ŸjWk`©ìLÅ€W–¼¶Cß aM¤„”Ù´y7;éWÔ´³ˆ™ÀÍ[Þ%Ý ¹05|‚ÞŠúæX„ çå6XÕ;9WG¢›œt¤fR'©w}QhiÒ«é²É»*Aéõ-¿¼“PúU±Ë[¥¡7Ä¡FÝžÕÕëu€e`«ô×é:VÖ* µ/µ¿ÅnûÒ‘÷Û/nnšR³Îaj‹(w,À¼43šQ¬¥Ÿ(ÿÕ‚â—ŠîG¬9‘ný=À`uìžÛ…‹x%³«°ØíÂÝ:y·æµÕ¹Ù6{’X&ë/á%й½öóþ^æ{r‰-é=¶fWÝ’:ê´xdãs¼•ÞÂ^{ë‚7îåÁ#VU‚Üìms0à݈DwÁ‚Ð\vM/ËE½€¶dŽÁ@»‚ƒ,~®/ø SW\‹{”Ï彜TI¶Øp+O­=›5øøRa SçpàEwˆ"~¼M]© }bAu~È—+ßO›¯XLdQ$ÞÛ¡0çÿU£côë‰$Âô¦.½®ªµ—ºQ¨š8/qÓËÄ[gV¬r½ðÙÃ&X¯Ò=׫„knìmÂF¶öb^¬*A‚Þ¼}w`ÊáLË|ç©(½…¤UêáJ«6‡ñòmÄQøNây/1i}e-sþŽVÛ*4_Åû7=6FšU/±F•¥+«í^=$¦ Õqñ“Ü8eZVõ‹Yw«èlŒîx2LUuUYT e鸟b6*Šk\¨™å8;>Í&ZGçq3ýª«¸ýÆRY«æ2‚jõGm☉D«ÇoOHs¬"i«<ÆÈˆUÛã ºújgv¼‡ß1›æÌ“¯É몌àø#„ÖŠaá2B là ¸4Êg@…ˆ÷%†<鼕ów-ÆÁ&¼7pO H}ä9ÌûæSÇry¦ÎÀ÷X²ÅÞgT_§yËoÇ%Qò‡Ís•uxH54(UµüT±”lͺWO¶šßåÈ&±T¢;*7'Ê„ì {åHÍÝð7Ó¦šéˆ<.Ñ K½f©'G3‡Þ¡@ìBä•}ßþq—"³uù8ËÝü9•Óð^nÎ×ZWal¥Ûf.·eR=°fôFö²3¤,iV¢@ªBLa´y<‡ÒpÈ@j˜«¡5†ms0´2‚à ›}ä†ÝÐ~Ä[&X35—¶Cw¸'÷X4&T€AØ€Äì™-³k6pÀƒ›³w6Î:›gmŸÝ³…vÐþÙAû0& ˆà„¤6 Ú€j[m¬-äÁÒnÚ€Àk€«mÔÚg›l/í³ÍÒ6×fÛn»lŸm·×¶A ÛAm›í»]·€=0Hm`ð·Ç6×.Ü{pn½]¸ >0@`qn  €A@¹%wÙþÛ•Û ‚€èÜy{r‡nð È|uîÏM¹-7(‰àœ* »wí6œàü|Àz·ê¶ÝC`¼i7pܲ;Lî`¹èK;‚Èm¤7íÝ@@ØÞ…Û{/mÐm>€˜Ó 8ƒ/Àà÷Þ{(À>ø À`ÜàúAx;À0µ B€mœto äÁ2èO€ À€ØÙÏ;Lƒtà 4·>Çß $ñà 6yÖNâ@€çƒ€z÷ÖÜ‹œð0̳6B·Ü€¢{tüƱ÷àc[†+€¥ Á³6ö6å€à¡Á€| ؃sð ¼7ðæ(”òÓ×ø0§"Б\ðÀ*PH½¤pæÈùç]S‘fЬøo`ìr (†€’ð.Á*ÈŒï¥MÆÇÀ9xž€ PrK~þÁ=˜}­ßC`J&å ”€Y¾´Å9ÿoàtÌÛ¸A˜ë LƒwàÀÁ."} SrS ¤6·Ü^ `b`ÚùGã£$qÀÄÀøVàƒÓ~’¸æ¦äR»øp^¶I8ÚÞáYÛ‡;wàÜ!ÀÙvà`@„Ow$@؆îú;»'vŶ7þ[jûç.®ûÛÎÙî]n—oðÝñ÷{ ¾«ï½ >€àðÀ¹ïw¨> È9[Àßwíà¶‚—ï@;‡Cç®·Ù¶„§ðïð€ Ÿº!<àð³Ûn€Ÿà;¼ˆÇ ÞwWñÿ ù„7ñ~û³çp àâ1ü÷¶Ütõò ¹k<ŒgßK€àÖk8/ñ!>Ƈnà:@x>ÀÈûø$ä€%8yà 0)ä}÷’—à¼Àå®í+}Œßõÿyßt æ=»Gó*ò 2wůÜsàp? v"xå7ß°€RÀRÀ •ÀØï—ÿïW…°ï`0‚}€*>õ.Û©¤ü[_ñ€åŽìÝå÷úzƒ<é.ù?þwçƒu ÞØ8;è€pP *€ÈÙ !ÈýmÐlÁ:øëÀ }XoôÁÒvƒßÖ¯û±ò¹>ÓoÜ7ý‹ýqïëoú=ŸüÛ~r»{ƒ Ð:æ7ù[€ €Ž>ÚÞ¢?¥ûÓOø?å‡ùŽŸñ#nÏôÏ6Hñþö3~Ûû!¼îýüý÷g~ßßûE¼ð7ù~÷>Püù;‰þs»ùGÙoþÀç¿ú_ÿì¯B8@gŸsórîïý ÁØæåƒð Á+pD ý¯ÿÛMØA òŸúwà=~A7xèêŸþçý 8Àò–ÿ…À ä¶Î‚@wï€ÃŸ¥×¤z×À=à|@2° ÜŸ0 (ºP¨¨/` 0€ ’×Ä{À?0ÔþÀ=ð ô¤@ö`9  *€àƒóãµ'*y!\d—è¿Ý8€~”['”0@)p L î-_>° ˆ  x&€$Üæ‡þUqÆ"7ê%€Û@ò™qA‹wúYÿÀ°×íq}°È {Ú_¸×az@$,rz›>ÇÚ­p€¬œ5€‚\›!ÈÔ•rm+÷|¡$X¶ésÀ` q —íá”]’Ç :€ð¼-]¸Âýzû'ÈÍ€ ÀæžV'ÎeršàÒÆ â@/à HmòÞó6ÈA0 ŽzP¼ÅqœŸ9 ÐEž€g‡Ú‚8°×wÿ@ Ñå]? µÅ‚Ùà^÷$qÞ ðô¾ Úw› 妼@'ЕoÇö¦ 6Xš}À/  9€÷7Üt@1h m³ +Pä€pƵqÃp(„Øà!7ÔŸ@„dÜæF,¿^FxØnÀ HŒïÀ À 0½  *uåSGÆÝŒ€°`1¡!˜Â­pv /wü7€.0ÂxjÜ;èü+rÐ\¬·¼­pz ŒçÒ„YÛ6hÜÉ ¡M—Ô-rÜàØÖ~v7& èt‘àòvÓ!`ÀC—f{=ð Иœ[˜3@°¸.€Ø…ñ Ü¶@1ðü `è ÆZ¡ÔÆäpØ w®pd˜â‚Laúgƃ@1h@p2@ ÇËm†‹¡À¼ýï2„s@ʄϛå&Lœ0°Â¹†Ì 1Øß½ @·Â9¯áUˆÚv¯!Tø ‡HaõgÜaš!Œgûõm¶Ÿs¼†gÛP¼ À€4xžA`.m €@ p‡¹ßuøüöyèûõm^[0Xw0^{8ÀuÛHmôaÞ¦´¹‡Ð@Ú¶ ÀuxppÜáÏÆ\‡€ˆËßux ∗¶ýlxÛØF!Nˆð]ÞÈYq„›†¸´YnH0œ}÷  Æ…n$@FÞâv"ZnÀ7àü‘€?Ð"zˆ("+Ð<„VÀ8¶½ˆ¼Ü7`ô€>à#šˆ¿SǼ À‘Èq}.¢œ§Ãýˆ¿[G¾•nÌ[‰$€¹À”ˆ$Vn@9ð d@8ð˜b"¨˜À/ °U@›X»µ|ßÀðDïÀ€¾uoOâ^Ì{éÛ“8㊟ §¿EoO¢>ØÇ…‰Sb ð" $À+p<À; µ5p/â°œ«€ÀTJÀŸˆ¿uжÀ? <À7`$rŠŸÝ+¸×ÁŠ(¢HØ{À 0+"Š¡>W€ºÇ+Zn>À#Ðø>€.€ DŠ@bð TÕ‚5ð¸ÁŠ¡›Æ÷ÈwÀ>°³ÑŠ¿^)È-Š€¢œ7x@ƒ')n‚[׿õü€á‡¿!t·]U(€à.;€dnÀÀQ(8ßÀ>p/æ‹0éˆrÝ[¾TË%Œ¼0x@0×½Amºàð€aÖÖæ¡qÞÙÖ1"žÝÀÀ€ àÕS›q·êvÿ@e˜Ìª€Êؽ±Œ]7(ÀzÌXžäÀ;`3âo8#R׌ˆ0”ŒÀÀ>0 üÞÍX¶ p@0 ö0$†R£ðˆ†0@0Ð ÔcÀ\§Ó±Œ À×¹¬ž>@Ù |p/âŒbØgð„•°Ì€Û"§š{C=°¼Q#ÑØ7N…AU88úÀ*x[7äpa!47äQ$ àÝœŸä¸×EvV›»ØÊuoœ£ˆ(:· þV:z‚YÛ:œc€ø‘ŒL];@:Ê|€°'¦p¶£ê(óဠà@ï;Ê|p@F÷ D„Æ#瀷Ð;†ß0P\á`Üå‡c›áwìÅøÜ0§‡Ý#ð=¢q €€€æÞsW>~áNà<À°Â‘Ô£ùø5À à °`À0°Âµmy›÷xðŒ @J÷ X!¶U¬cF7µ-rbþ8°Ž`_Ì'!UÜ1h –‚À95ÂŒ“£A =⇀ €Ðµãئ0’o@Éå‹À=WÆ¥cp d«À'° ¤îb¹h ÖV€‘4ucž÷è­^løä¿@€ œ…yžWX¥€»ØÄ%Žn¡¢èlý àÜéuN§Æa‡ÿ<°×cdxFÒsÅ Ðǵ€d˜ÃÉ¢çÚzÀ°ÂÕ‘¤pºy >g<]À5 4S8*ŠÀ/@’ôÜ0€,*€$ d(Š@ày>LÀ6à ” #YEfm À'ð€´Ü  ”t$k÷HNmÕã çG"Žº¤‡8Än¸à ‡7jnndÖÓõwB§ñ±zÜ! Gâ Ù]ÖMÞm›ºX¾åTbgˆàát+œ8ˆH"ÐÖàuŒhœÄõÀئ…v£ ,RÀ?¼“"œß¨NÇ"0pOš%],‰¥`9yà @Á¸ PŒ¶Û×øGêsÀp À†_Áé© P9>”K P  †I<½ ‡ÞålcDi|ì@HÉÆ‰†(¸­Ëâ?ó!8@5)¤ü›M92¢áðà)åÒ6Ó†8™ ¾‚¥P‚§M¦pîbS'\R@TÉËU“L]U Qf×€V üIwQ^„˜µ}?`V.mœ À9¶‘yÛ9·A†úÜCþ~˜^yîñr¼AÐWæm,#pðŸ.`G–¼©A ‹åØVX>‘Q$.ðMRm!:Pº’c›fiÊq–€€g™Âe–(0Ú•ÈdÞ–:ù€Ô†ìu€@êH4xly Ž|éß^W[ª–e'äCÚ–½e7ü‡@>°³í–cÛ-˜ø–ò@, hÙs[—€=ðŒé,`>—ɧ¼Iß%oÉËÑ–Ä¥ÙÆ9wÖåmÙÇ€è×ǵ—½¥PÜÇÀ Àîˆqù\âÊ@& Èê@1pô—¼åsyh—³@‘˜*Ò—¼Üqh@˜³å„I\ž—¦yÉZº–æ† ¼–uå]bÒ•cj H–˜"&ŠIb&æi™b²˜@a‡bʘ€@7ÀùÙ˜å›Í†c;¦Aœ}Ç wp~¤[iÊÑœ_æfdòx5aÖ¦´qbðõ=™ Að,m ð²I=÷‰p/:<•$– lô@P8™œ“h™eæÙtøÝhfnü@ È|T&j7äÁl"“ɰqÝ’yö1€™Ùòƒõà h’| Àt_&¤ÈÔt3€)àŠh5G@U 7¼0Cs À.p‹È¹ˆÆ`èÔt¦‰ ø˜2%Byš›d’·9‡|»¹Aª›í&¬Ç!zn0ß cÖ€iŸ×W¾µ–ºÝ\é»é›¿‰oÆy§ÀéoNn§zwpÒn g¿™oâxçégÔÿÀkظQœž¤®7qVœgè¨Û¹‹gÆÙ2ªw 'ÆÙq nH]ÈÙq¦'<˜µ±œ"çËÙržwý[aÀÀÿ¦Û¥o: Þ¥o¤0p\ÞœéÝÎÙ½átC'<ÐèœþÐ9È%Ó tZnIg uˆß:ðs~t€Ïit²t€×Ùt~t7€×‰ðœg€ÙÉsžòÀ? e:çÙùÑmgËwº–<ç1p\ ÖÛÝùaòœaÀÞ €> µse Ä‚gð žÄcâ d§«xxJž€à Xž‘çG×hžEâåùÑšçy"žÝ@üdá)zâo€58׆gëyz&ž¬kǼў¬ç /ævIœÀÄñždåˆÜMmÚ¥n·È±‘ðΨ¾e—êÝò¹=:ŸÞ¦Ë¸×Qw&äôÙqZŸÍ]ö‰RŸSÛ·ÞyŸø)â1ŸæçÞÖeêw÷]~gÞexþ~xx^ƒ‡è x僇ä៞òÔIÁ†ç>-àôýÝÍâ¦]–  ¾™¸1 -àßæ€ n(8²ž 臸âa ÔßZ>œèêrž|BÜ? |6€UÅy‚F €› ú¸± )¨ ú‚B1è Jƒ– 6è؂ʠ((:ƒž~>hxõ©ƒ'VÈ‚¡¡çØv?ŽY›í–„¡P Z„.¡iŸjµQ¡qžª„RÏʼnµÁ çJƒ†¡\(Š‚š¡`¨Z†ª¡g( †®ž¤Ûêvž¡p(:‡Ê¡qèZ‡â¡vhšö½…껢hHˆ ¢“Û!š*¢Ô#jˆv‚h:„úø@ö7‰Æ–¨íF‰f¢€&Jý]¢®%'ZÅy¢B¨&JŠ‚¡® Ê!Ö~9Ú ¯hÚŠúŸÇŸ»Y‹Â›±(ò·ü¹¢Ìßꊠºèˆ—ªƒÛúÜ›Xè¿Âœê]2Šp.£§3ÊpB£ÍhJêvÒ(š7î›ÕhzúÙèÉ÷À¡5$ :ŽºåèHŽÂ çh ÇŽ®£æ(<ªŽ¢£'$Õ6¦põh¶Çn£&>°Âå£:(?Êoú£Þ§=Jp†pýè?*9f{Êh×Zž 9§ *Àí£éCÚþoHEêò éR§âщ A°tJ¤#há’îuQ'IŠ šrÇÀÿÆ€Z*iZè.i`¤;cZXÖ¤Á9€“.„€pw2 -)IJÀPú¸’éã¶’âJiëØ”Ž †  ”æÀÝ)|öƒ2)8ð´–v'¿y”z¥`©?àa¥pÀðß}üæSú•ºû[ºµÅƒHé[p~m©LêØ¥øÀ7—Ò¥_z>+éðžêv‚+éO¸íu¦çbª·%…êÝix¦\›qøÙM†‰ãX¸‘ž •£gºa‚¦i h:&ž—á[úa.œ‹awšZ…Á ðšv…gÀl×_p¸´ewI(= ›>pŠ)à›Â¦À0×›þ¦Ì[êü¦(乜æ†L[púœ.„€ ðð&h LJ® <)Âq§êàr¸ÂýØ)s‡‹ž‰)y:¸Å„gzº³©§æ©¹éžŽ•å)W(ŸŸïi}ÊžzŸé©~j‹B¦þi’'â\›|È=ªmö!~h–§ð!¸ÐÀ‚Š:¨å€(¡x„ x¡6¨y›†ŠÞ1¨êݶ¡†¨ï& p!æmg›ZŠ&“U\ò $“ú¦Š àÁ¨–›Œú¢zˆ1êw£R‰9ꊊ£Ö¨:*Ú¿©¢”9Șa‘j©Ža2i¤"©Nê’ ¥*©L*¤R‰Oj“J¥N©§bùf<\ê¹(e‚©Zj—:¦Ê˜;ª˜ú¥¢©ž¤w¦ú¨fêš §ª©dêŒ.¾©vjœZ§¦©g$J÷ߘ碾I’˜ªŸjµµ©è  ¨ö©Äè¡. ªÿÝ'Pž‚+\¡Ú¨²n“j¥j(.m!Ü©†‹¨àËyª‡g¥º³ ©*ªöwŸê»X¾aªê¨Úªâ‹å «²ª¥*Ä€¤êóH|šªå0Ы‚¿êŸ´µqÃj±Š¿xäÿ–sµg¥Š3‚Žv'ä¹öžRcÖÖ`«†ã¢X¾ÁÜj À2z«7g¸:®ªåjHÚ­¢«àªº*®¶ŽœXŠ µç^÷®Vqú¤Ý˜µÕ«ÙjÝ(ÂQ…ˆ ¿Š¿EŽ…èFÉK²žöê\И+Âz;º‡Ÿ€Î 8wôªÃê;À ±"tÇcPª±ž«óÈ|¬ÄcÈZ¾á$+8`²p@Êj²§'BgA^¿y ~òäX©£Š9ë°³’™›ÏŠò¬_£Ðj¥ò¬¤ÑÊ ­c%XZ¢B-£wZA~‚ç'‚"äÒ&ÀIŽ9ó™B"tO¨¿ ¶¡‰§sGªØ[[êoš­­*3:¶­­&ä§ê†­¯$®J<–rÝšDÆ­¹*ªª·Š‘|ëÝz7îu0€NçÜýÿ[ÇVÂréŠy¸b¤5¤½ §®c%äj²©u+âj‚F®˜ëÞZ¹n®—ëœú¸‚®’kžJ¹j®|§E(¸Í}¦e暸ÖÕße´®ž«æÊÖ“,ä"G»"‰À2yBÎd[yM £YW¹Èƒê4™MN„X!òªÛrÀ7év§ý›ËÈ ‘^a:‰Þ¹Œï¤‘Š Å›óêèsÿÛMÇ$‚&høê2’¯ܫо‚¯ €øÊ¾Þt™Ü÷Ê<Àú ”¯µ*ô©Ûͯîkò9¾î¯í+ªê¿°:'4g¤ °|¢“s€sÚÀÖ§” V8H°r~Q¡üšÁú§WÉM"‘l[VæmìzºV ¯(ì;¸‘pï [âŒOhñÃ౫ÕfÃê°Œep*úƒ<¬d™ÃŽm;,ÛÃÖ°/& [„"„ ¥kµ1±¤ågÅŽ–y›h¹»¢–»ëj9¦—}œj ü‘· ٿ٬`ìÒÖÅ’±¼¥ëÅ–±j,Û\š±c,~XÆÊ| è[Ô±æåË­^—tì›:ê±$ ÈÚ±xìÛDzl!ËÇV˜å¥!Ûv˜[ìˆyb˜+f‹)ɺ˜•ì‹iÉΘV›]Icî˜;¦Žyc¶™L¢nggÊ™C^=Gd™eŸ‘ ™*›É㚃œ‘ D™Sf›Iò™væ G€k¦¡ÉùÁ™}æœYg–™¾¬Š¸gšg €€fŸI€H©,KºÉ™ P+€øçLf'@kÚš¸æ8ËkBDyLP-1.6.0/DyLP/doc/Figures/conmgmtcalls.drw0000644000076700007670000004303211171477034015455 0ustar ª» €#€ ˆÈ sÇH6eb P%Ì™2SÒè)ƒBFŒ.r°q#‡ )XL3›0y˜¤³ðˆœ7uà´|s!•2xX ‘SgM’P)"¥0\À`á%Š0`¤IC†‹g¸¸#‹J‘†MºìR²,ü(àñFŒ<¨<ÂN6iθ;¤ˆ“¡R@ÜÍ»—ƨ 脊”¹O¤PIòÄI& ÀÊ€¢$\²œK2æáFL6éÀm„iÔeTó€ b̸(„¼y³¦M7)j›Û¦ ™4uÚógÎ"Äœ³FDm6rpû=Â$É$ÁOº9SÇa¸mß* “çK˜1tÒØ¥SfÈ7sÖÒÏ9‡Žœ2a´ñEnáƒ!)pSN¹ñäPBe”XK5•ÇSQMÅBG[Å€ÃFšuõÕX$–UbZk¥—\tÙ…—^|ù˜`/vgŠæd’Qff!vÇgJ…Çh¥–Új­½¶älœÙ†›n¼ùœpćœrc˜ÁÏ9BtÓUw]v< °]wß…÷yæ¡çÖ칟|aÐgEräÇÃ~tô÷_€x`‚ êäàOA6!Zb(UH6ØàB 7xƒ¥›iz"ZfQˆ"[sÆ5W]ƒÁÈEA„Áucb‹5ö‘MVÙe™¹°™D"&\IÂ&k®)\´I™&•½ý\—Y—ÜrÍ…Iæ{fŽvNpçx ˆçCÌÚ‚os¬!§zsŒñr¤Ñ†}nLAAÀ§Nú €ˆ H.Á$“‚7Ø£u¤]Õ¤_Ápƒ¯3ÐÀ !zzÖ‰¡¢¥©o™Úbª…I‘ÄH¼Ê²¬EҪ㭹úÈkžYó°¤9¹,È -[³·=»[´WRËCqÖrée¶bnKuÞ¢©f¸l’knyèΦ.»î¢Lg{ïÑ!oœA¯½øªÔß¿ü LhÁ‡Š”¨Ã6*áÄJáða¤kÈÅ ÃÇ!8ò㎋z²Š*£ZcŒ«ª³æh+ºþØë¯=ƒ&$’F3™¬±ÌF™tnK[9ípOkym—_† tÜbýmškŽëæx`Ÿgözh÷vÛoß{ÝJ°¡3ÌàNCè(à0ÎTÅ’^ƒ¥5h„x§‘£ꉓ—ʢ屮ڪ̗V³ç<ìˆk»é«‘Á2ê”u¬&°uµy´d‡¥ÚE [`ÓîÊä;­¯MåzSñÒµ®0´ë]gûÞ2Œáy˜ V(ƒ%¨!tø öú±Gnpà+\‚ðE˜ÈKQdr‘¤XÄ|dIПRŒñcIÔCò$ÃEiïoòá2´Ãûô°? â¡‚¥ÐÀ+3H¢HÆx83¢1ŠRLXM¬§¨ìùMb¢Ú"Æp@¥ä`q2à”ˆJF2ö¥È}§rQü\3úůsµÊÎø':ž ÉgÂ:±RG4²J œRì¤Õ@¨m ‚ºï®v&p‰ ƒ_‹“Ø:øÁãÕé=cÖ½ÞzˆjØ !¶½<æ‹,ÈXÎè•@þOd¢ZäÚ—²÷)RU¬rÕælt¿Hê/gý1)ÀM°“«{ÒDY%R:Í”·›ZµµÊnýnk¯ôše¹)Z–MEÈû‚—àó9ôÒnÓs¡H`XE;Ö{Z<&ÆÀCq2ÁF<ÔÌÃ(Q&9H G7âÑ©$HŽ c(߈‰E²DÔ):IEÁxQ!ÊćùŠG1Š‚l +2°J LºP*®ôŠxt)aŠLŠzÑ¢b”‰O¯²¡~8 K•BÔ)Æð¨w´a÷–j±¦Î4Œ<*P­ÊÓ¬.E%}¡Q‡‰T±¾´¬=kM—¨Öª^åªnÝãH“…í®a…(YÃ’ñ}ä,8ã3ÓWÈi²š‰œ³mÒ 1øû&%wö?`‘ótæüdÑιN¥µ³i´ƒ§Ôr'AUR°•Àãšð2H<~ŽÍƒÿœS@Ó†'ú¡@øò |™Ð¼)¥6¦›ÅÅÆ”JñidGHÈuwT”³¦fû’¹Àh’7ÎüGºKšhÅzÒj?ÙZؽvvÕ:%î¨6ÁÞáŸ]Þ¹ŒÐxÍ«^ÎsÃqùå¯ÖMz-tîa§ûÐê~©ƒŠG.ò!É¢ï»Ò”ÜeW”ÙúeÓ‘œëfz÷:Ò¶7€¨ Ú9ç«N×±“iøu ~å™J«ÙÓ‚º…å>ÃÖO²0 fðÏo a¼UO¥ˆ­°R/ŒW)ê5ª²Ê;¬F›bhc[Žì`VØ…@™ÂÅœ²­üTšb¹¯4èòg®JñÌMó ©ÌX™¶­^†³œošÓ­NJ®_²žÇÊç˜:Õ _4_*f®¶5§pµsW¡KG°JyÏkn¬¥hYÇ~øSaù.5I¼²úqÅÜ­7'ÙböŽó½š”±j=YãPºÇ¥´Ýlùk[ÿfÍ•æí€9hd[¶‡ ºÓ|ês媡®Þ„óÜRPKTC•ºT¦XPî¢ÚD–5[å®Y˜{Ö~²^18+YÚÒý,×ñ‡Vߺ3¶ÂFem}\Adï6–Dþm- ,/74_ú"¢M&³ÐÉ'-s§ÝmF‡:c}ìØâL=ÈsSv)«^·f_ýnô~ŽÅë§iq=À]§“ß6þ5ßðýγjõ,xnó)à βمvÚ–ç6ÇmnŽÞÅ©7ér;©Þưáb–Jy…äÐT_ª ©nñšx~-WñËçíâ[ß»æòå5Î}m_`óü>ïqÐÿ{A}ö6áþY‚\IF8ð•ìˆ5hŽh¹—`I$Up%EVÙ“ZÉs9”E‘XqfÉ—Ny—©L‚‚ù–YY†”ti—„ØaÍ$7è˜gÉŽ3YŠYsX™< —…¹)7ðšA€})7€ˆµ¹!X(š£)…GÙDªy•—Y‚® ›9›(p›È™›ºÙ”Å(–‡C–t˜ ƒÉše8œ7›A$…ɉ›¹œÆ™yé–«œe”Ä)›Å¸µÙË ™%(žÀ—åùš×Yœéi›øÉžº •Tø™ qgyBw(7,ñ’ii€|>3ø14ˆƒ\ Fpz¡jº¡Ú¡ª¡¢ú¡$Z¢Š¡j¢*º¡"*¢+ú¢-:¢š¢/ ¢'š¡5j¢1Š£/J£º£9j¢@h c€  Ê rà ‹ó ^!) ¤ ¥$*¥J¥?z£>Z¥7ª£[¥]:¥_Ú¡j¥Z£^j¦`Цez¢Yº¦.z¥jÚ¡Cz  º  êʤªôÙ§<¤ê§ô ¨Q*¨7Ц„Z¡†š¨Uº¨Ѝ:ꨌ ¢’Ú£Z¨‚:©:§EZ§Hª¤ú{¤Zª¤ÚD¨Šª¦jªåÖª«Zª©šª±Jª¯êª5P«A0¡³ªªµŠ«¯ª«½ÚDºz«·*¬Ã:¡Âj¬å†¬½Z¬Àš«¿:¬ºÊ«Ì «Óú¬µz­5À©Fj§IЧK¡NªÂÚ‘èZ4 «éš®çª®ðº®µÚ®ðZ­ ¯ñÊ®øÚ‘ïÚ®úJ¯ý¯Ê:¯û*­±Z°ò«ôʯ¿º°öº°»ªû¯øê­žz§’§ä:°±Ê­ìjƒ kƒË ¬²"[«ê±ój²'{°×Z²& ­Ìʱ«Ê²-+±/»²,+³¸ú°6;²Æ ³!k±Gб( ±¢Z®]±´P¡80°PQ µMË´Ýsµ8pµ0g\»µ]ÛµX¶UÛ´:µO+µgKµVKFa›µ[û¶\ûµoÛ¶W;¶]a¶›1¡i›¶v˶Yû·Q!·6·s ¸€Û·x‹¶S›²kK·n+¸‚†Û=D ® ª§å:3 ¹œ»¹žÛ¹ŸºË¹£+º¡kº¥Kº¦;¡©;¨‹º­Ûº¯›º±»º 0»¢[»¥‹»£«»§›º »¼ë¹Ã˹•û©âªMʺ70Íû¼8ÐzÒ½{1Qq½QÑ·Ñ»½Òë¼Þû¼­¾FÐ*ßû½ʽÜ[½Ø»¾Ú;½Ýû¼ß+¾â[¾Ðë¾Ñ«·}»¾ØÛ¾è»¹ð ¾ãÀäû¿ÎÛ¿ÔÛ·z«¿Ù»¶ì¿ô+¿|¼F‹´Ë«‰;±µJ¢{µ‘;¹8¿‰Ë«›ÁºÁgÛÁm Â&Œ°4kªœ¸(l¸*l¶«j&¼1Œµù+Áᚱ㚴 lnKÄQaćXÄJ|ÄKœÄLüÄNÅH<ÅMLÄ4Ú*ŠÅ㛡EÀ ¬¡C°¡a ÅTLÆU|ÆL<Äh,Åk\ÆllÆLœÅªÅ]œÅ‡ª `,Æ8üÆ~LÅ>|¹kÁAUÈAe³4 8Š¼ÈŒ,8ˆlȆÌu’<É”Ìu\ȊȼɊüÈ—l•Ê–üɈ|¾œ¼Éž|É¢,ÊŸ š6ËɦÜÈ© ɫʜ¼˜›²µ¼Ë¼Ü˾¼ËºüËÂ<ÌÄ<ÉÁ\ÌȜ̫|ÌÊìË· ÄÊ»§@:Í[šÇÔ|Í[ŠÍcšÍÕ¬ÀØüÍÜ ÎÛ£ÖÎæ Îè̦xìÍçÜÎ1úÌGÄl9@Ïö\Ïø|Ïù¼Ï÷lÏýÌÏû ÐÿìÏ¢-Ð=ÐЭР=¡ ÍÏ}ÐÝÏÐ Ñ Ñú|Ñö Ï,͕ʡDPÒ&]ÒS:ÒzÒ'Ò‚zÃ,mÒ.í§$Ó(©4ý¨aÓ3ݧ5ÍÓ8íÓjÓDpÆú§+ Ô Òò¼§ÃZ?Ó$úÔQÍÒS¬—ê¡D}Õ½ZÕ-ý¡T­Ó[ ÖÃêÕ2MÖ]=Ô6}Ãa­ÕJ-§!A¤ßŠ¼ÐœË÷ZÖZz½×zÍÕ³J¢BØ‚Ø~ª7Ì×|]ب ؃-ØŠÝD$:¡ˆ½× ÕÚØŽÖד]l׊لý¡LÍåZ¬¡,´ ‹Ú•¬Ú7kªÌ,É®°«*ʳÍÚ”ÜÂ¥ŠÈ¸=É·½­©² ÀÛÀÝÚ:k²¥m×½-ÛµJ¸\»Ü\ǮΠöjÛÍ-¸Ð­ ;ÝÙ­Û¤:Ý´mªÖ½Ýr›Ýö Þæ=¯Ó܃¬«yüÛ±úÞDzç­Àð½ªò­°?ÛÜ ìÝA@Üñmßó½Úü­¿>»³¾¾³ÍÞBLÈ—ŒÈyÌʤl³Ê­œÉ®Àþிɥ¼Înáβ^É­ áý­nÈ*>â•Ìàóü¡º:6~ã6ÎÉ$Zã8~ã:®Ó<ÞãCðãä=Näj¯Bžã›¼ãµºäCÞä4þäKËŒìä± åœ,ã{ŠÃ^®Ç`þåbæQ1æfNæg.æiŽæ0¢l~æoçk®ær^ç8ìæcnçznæs¾çl®·}èh~æ\~ÚÔ}èAÞŠþÔˆÞè‘+¸Oè’~虬èrËè“>éîÜ‘Þ艹•~éÃê釾é_Ûé™néÓÍ«£žêŸ®ê\ûÔ…žÀ ìÁyÌÉyì¸ùß+®ëµ¾É¹nëàµÞ¶´¾¾¸~ët;ì¼^ì“»âÉîìaËì¦:ë|º‹Ø~|´í‰ÜíܾíÚîØžíäîíæþí‰,îá®îØžÉèþîéNîÚ.ïØ~îöîòÎîÚ~ïî~îú.8ÿ~ï÷®ïïï>¦ôNïûnðþ.ïÖ.Eño6ñ/ñÙ|ñOÔ?ñ@Úñ?¡D­ñ¿£$ñòòD-Ù /ÿò)ò+ò#ÿòOz£'/3¯ñ@jí3¼·; ¸ê ÃÓíÁù[¶&<ôZô|ô)ܸ!<ÜPÿìNÂUÏÃR¿ô«®Â~õ:œõ ô$Îá,ËÉ-^Èš¼É¢\¶%n²h_ö þÊl/÷†Œág_÷(þö!÷{oö&k勜ö‡L÷límÝ¡‰Ï¡‹¿¡¯¡OýÙií¡o•_ù¬>ùŠÚ›¯ùŒÏùŸß«’¿Ù”ú›×tZ´?Ϧ=¦†JÔG û¯oÓ±Oû†*ò¶/¨²¯û¹ï§»ïûkͧ³ÓµOüÃÏÒÅü·¿ÓÆÏûÍü1øe óÔoBpùÃZýÕý¢O¡ÚoýÜ?«ßó៪ÖþÔŸù¤ßùâþç_þ‹=þ‘ŸÕ쟪ãoù¦¯¡ÖîÞÔ^ªèàØKº•7á¶ëLÕÿ#v N½ @ˆ½üÛlv ¼.þgà v€×K.kÇÉZYüdð’…@HË Üd‚@(Y $|Š,62ÈÈhà"³ŠÌíµÀ¸yà%Û0*PÀ`¤n°ÿ}7%˜è˜`ô+nA˜ ¬‚6LÄA蘵ƒC ŠA7Å Àg0 ~0!Ø d=p0¸®8Ý`¼ƒh0¦Á2‡ëâƒ0@ ªÁ;h…”ƒrB<(Ñ $ƒ}P Š<=˜ !!<„¬'&ÂEÈ)ጄ}šAOˆR'Ä„sPÂNè!! {•ÌuÉBYxÔH”(›…³°~¨¶w»p¡ëÒ…êúÂÒ¤Ò4”0ô…®/SíÂP6 ‰¡2 †Ìpµv q!0„k,@®]¬ÕÒÊU¥ø†à0VŠ@Ë¡9<‡9@ªÃoˆÛa9\‡jºCw¸åá Õ«¢BZ;‹ê*{¥*•ª°U¬ŠMD*NÅ£Èøx•þZŠ$M/f/¤ÖÇô¤[8lsiŒ¬p€ Htq1T…ò³®À`˜Au©üà” 1ã´qœñƒá°æ¥Ç²Vb ƒÚŽ'žFgãc¼<‰N2R¥Žd1£ ™‘3V¡½Òh4¢Qc FÓÈzÂàbs›KoÅE×øébãdÌŒµ4ÙÆr“†@hüŒa8Æ€Ñ8‘£bÔv`î5.ÇRhÁ(£sœŽ–Q7¢GÐÈç iÔŽFÀÚ‘¨SF¯Ü‡ªøD6¯—éã|ì§ì?62èï#€Drê@Hýh äáC}Jõ ²—¿*dã²…êËBjHõŸ6$TÀ2CŠÈ Ù!­ˆ‘(2D†Hj˜"[$Tà€åƒ}°ª@#AÓ!³‘42FêH#q$ެ‘5’G É2™¬ G4É!)#“¤ J’LrIÖ $Y¶€¤’Œ’LÒIZɪ€%‰ä–¼‘@2euI!©%¡$‘”~½J´]¿ü‡ÿÒ¤hƒWQ¨I8Yæ$›|jjRýÝÅú‡ªì¤çs|ÙïMbµÊæ'ׇB“âOPöªÎV𤢜UŒrþÊT)%f{j•ÒMb6=‰ª2e¢¼”ÃÊSÚ¿GiØ€¨ì“¤²Sv6D9*Aå¢ EVÊJGé*g•¬Œ•¸RR¦Ê&‚+oe •-ÒõÊ\i)§ä•¾2VËÁ&,“å²lóoXÎÊbÉ,©•´,Ö®•Ý:`§À´å¯kdyìÂiAìíÖ—·Ô_å{Ëõµ Ãå'Û–à²[¾ËoÉÈŽºœ—è’[F9×&XS+Wë’\êKs‰/‘ÝÀ¼——Ì^^¯ty½æÂ<˜ ³`6@þ/õ—Ô\Sjİ9 Çeļdð’‘å±/˜¸èå" —&,džL”¹¸<&Ƭ˜æ2ešLE–ëJ¦þj—ÝRfæK˜3ÍÖÌ Sqí-•I3½ ¿Ü†²‚=®'·"Nœ’¤ìiž‘¯·¶ô–Ñkš*Qj¦8©é!–ØÓ[LoFjͨù©¦ÝºšpKo9Í‹¸5Ë&ݲvU(nvŒÖ³$é–( ƒA1o€ ˜æô£ßŽE€ÎÁI†€ 0œˆSœ/"©¾Taá Sc¼¹íH9Àvä˜ó:©ž¹)7£$Oœ\wsoŠN½Ù7£éÄ„“p&ÎÄ%«—Þrœ’3rr3W9+gæÌœ_vZ„Ý©8x'ïÑ9*EñhD£Vt‹òQEêG %Q@PWIÒIJI+©%n—4“jÒM:Iý'ý¤ “†RN:š)=¥¨4•ªÒi(üV©+}¥°”•ÆÒYJK]i2¬¥¯4[:Æ]Š5nü¥Ž±zñR^úȆ)naÆ”<úRc*Lé/-¦ÎôƒI½dâ’i§``ÑÔ•±¬l*MÏ&5}eÙaSc M‡i;š— ²H'‚@;}§xÒÊÓvÊNç©;§ïTžÎ?{ O³?ý•Ô*ŸöÓ4ùOë©@=–u² T~ŠOí©A§’R¡>+zOý)Ee•2YTmu°¬¥³¤VÙjVI6éB*­º–%µ£¾Ji‰P•­D© U¥BJ’ŠÕ\êIý¨uUER‰SyjNeU=¨þÔRÕRMª¯’©´Ê¨+¥Zü[Jõ©¶’©ÚÔ£ºªŠ*R¥ªBuV-Äe‡.¹ª´#z]õÙ);Ã4}ÝXva­~U­u3½žWM«`Ù½U¹*VéjØ*«fÕ®ÆÕõõsÝΙ~5°¾LÀ*X£BYe˜…Õ`òÌÄÊ.)&ae¬ueBÖÈš]ædE¬0 ¯2Va7Yõ*[M¬x•³vÖ…9WG«Ú,­—µvV†W7«j=Œ/‘#j°Øúç#Ýúœ=q¶öÄ‘h[iëµuºÕ·z°Þº[o+ýãPÅ•·’6tj¹Ôiƒ#@ֺƀ¢X¨« (ޱ`W¸AÛ`w…y‰NC…W#P-TyU Ñ ½FÄ›Xn¢uLtïõ·Ê€¢è‹âå)!E»†˜G€ø+¦0ÖÑBN å l ˜8ìÀâ° €F©[ƒ•®ÒÕºZWÉ–]·+T;#0Ãñ:^ÏëyÅĶ×32bc@|¯õµ{ÌW·ˆ_ïkÐ[üu×#`ÿ뀎 8*ØËƒ`lPd°Aq(bŠ!›)Z‘%²óo’š%«z®Ó'k²Lö&Yà˜)ªìÕ´ÌÊVÙ)«£l“mePÊžÎÓ©e‡¬¸<²[vÌvÙ0KjÀ¬—•²j¶ÌÙO†f1ÅùR³”Í:ÙK¦gál’z%²’D®™ZeØJ´¬g&ZA›5/b;¬t+&Zh+nU´qÒŽ=æJ×XŸ]+gàìõˆÚMAjG­©-µ¨vÔ©G˧ÜÙŒMµ°öÔÊZT»jÙYŒg'jÖêÚX kk­þJgñ×îÚaû_ß§õ—­ŒBQqF›mí¤¢­J[gKm·#£\¶ZôŽV[gË(¥-ݶÏöÚzÛgK9µmíì¶Ø–Ù’[j+n±-¸u¶’-Ú¦Ûu»n¥f]_š*ߪ(V«oûm ûb:Íßjª<¤n˜ÀņÚ0ÖµAöñÜÌ#ä5âB\†Åî÷ƒ¸7âR\ 5¡î_ÆÍ¸×FÅ(+q5®Ûb[êþ‰¼’;qOnÅM¹—åš\ùeqÝßǸ’ÍåŠÜEro.Å-¥‚JM޼ÎvÔ„nÅ#ºËÏèÆ4FYtEÛÐlMwS2?–Æt •Ò¥ºH7è:ÝàWuµ.f{ºˆM>Fª EplœáQAñu(ÖCv®ÛâQ¦Á•F„€Ü-»9ÀÆÝZÛÕ_$íC…1¥ÅÊ*‡Òb‡7¯ý]|;ÇïŸj¯Û±0"AÃz©†@^äP‘Tq±¹ØÇ¸ =ã¼b·D½¦Uº(‡g÷ðj ¹KvY/+s 2*Àݧ%wéî*t½Šƒì] •wgÀî%¯}·CÝ4á;Ô¯âÕPY ñ6^Â{|Ioó=½—ë¬]R…|+ïåÝP™7lÞ§ÆLU†Ê ÷ØrÃÙZ5†äe=Y+(^/ãØ5—–…š[í n†­E€XÏÅx8LpH²¬…zi€ñœ¿7R:¶Wµ‡¬cæ9d!eký‘8Äuú¯dü#jï+IÐ$ã¶Àg„g2Œ€°‰µA 8[`ÐT€=®Bxw`%Éuøïà¿c…þFñAŸV×4œ ìýJEöë¶Ð¯èÄ^ï7*¬ %ÂÊÀpIg Í…€ØÀ"7$A4á',RÖ“H˜ÂP¸a +ì„¡p 9@ wá¤Àr“ÀÂf¡(!.ü„— ×Ãmx+%8\.¦ ÃVá…a6\‡ã&âÃZSœ¡3Ü…µÂVB ¢¸4(P€¸=I  À0ž(Jdà 4v~€ÂpE,&‘p‰31'NÒ"ˆ€,P*q‚(Å_`¸0¾@qĬØ‹ž€úďި <'ô&Â8!øAÉp – „ñBÆ‚" ,c÷0ÂÑŠ" Å M3æ€A5 *\€HB ü÷¯D(SZ!óFL™3\ÀQ£"”(A% 6et€xA§ œ0bÐÀCŒ4dƼ±©²Ä9eÂÐy#Gf’9l¸!CDN˜; Ì0ÁæM¢G“ÒIóÆ ¥1ALQª¶ 1nÀ…¡ƒF2f€ð £FQ(aΔ™#3FQ!^§¦qs1™5p€°£ˆ0FÞ¨áw%‘7cê´)ㆎ“2eȤ–2Ø«œ1ƒe¢@;5EÑÏ¡G—žR6iV·®ó:6ˆÙtH“±½²ÈÔ!CuÓ™£`N;ef’ù2ÇΗŽj@”Á3 Õf(¨3§Œ2iÆÐ™ù4êÔªW‰ÄŸ?#óùýçõ‚Gg,uÐ¡Þ b —Àb,FÆye˜ÑÇ€R˜Þ E<8^y6X¡/aăfH¨Ui!¢Gb'îÑFkTX-Žø‚O<(Çt •ã†S ñàc„Ó$Nc{t¬ˆã€.¾0ÅG–AÇVåÁä THñ V¹•Tê(²XÉq†_®)Æm¾‰”\†áešŽñ`hr`·Ô—c°1hWíÁ¡_¦èá)²ÁÆ—gd¹e—˜Êñ —ƒ-…¦s|jv_*ºpnhùFªjhÊjj¼±Xªxîå¬wE¤€’ØÆƒm¼aè«Á¾àƃ­Þáè¯_ºÇƒ/àA’†_zº‡Å›­ªrÌzh²rŠ¡i¹Bu%Ç—¥êŠÆw°K†¦d„1°"n8›{X;·ÆºÊn»„"U¶–vàoBìÒq$™oÔÈäJ*•œn€0u˜±¡%AD‡3È aÑe°1ÇîeLÇÆÏT$BFHQD „4’ƒ-kì^Ç.Ã,3Ír<܉dÀñÅŒómá3ÐB=ÒH[=4_w¡!ÕVÃ'ÉS˜ì0Ò%ØŒó/Ç B¯düŠöp ‘Ûn¯œôÍKÓí4h”‘Æh(øBÕ_à ¹Ú „Ýõv÷³s·ÑÆÝ¾¢±·ß“›gùØðe·Ü…{ޏâŒ;~jX?¬”/ŸMõc»µU>Ûûí¹»XTIÒQn€FœÁt ¼Ø|îýµVM%À³hˆ!ÆxèÆÒ+\=SðÉ7Só“}Âó 6Ÿ‹ç¿ ‹‰ï¼З/ñ!ƒ€^À=ï+oÄʇˆìaoù\àÒŽÏL@̳ö(€IÊ!Q´ŒYGt°òßå®}¥±¡µ$¾ÁR x¤–!D¤cì¡eôò# Žp Ó’?˜¬.k%ŒÛ “¢Bµð… ˆaiD) ñ E¬!ñ¬…Ú¬<ô¡¥ŽH¶:*±hrdž˜3)®‘Šù"QÌ”Å.²Ð‡0”!  C´±‘6˜`õ(D"‰ŽI¬ã l0’'FÑdº!Y¥4ÌH0_°ÊÇÜCHîÉÕÒÚ‡5(khÞÜ á”T}=Œ;ÜûŽqÕO]–R»ØEŠëÔx,ìMVŸuM›øœáþôóÙý€ôÙç>ø/†Á®¡´ùÎ+عÎûÞ¥ïw×üÆ|âTDïÁ/‘¡‘¬RÕx{•-ü C5Aù»ó8ÞLØ›¬dÝZ¿Åº0ŸCä  ã½@¦2 oñ1Ç5$…dnè&\ÂXá&$"w€v²'ñ³.€r€çv/ 5pÂj@"1r3S.âA)0¥G\b€S)l° { ‚Ÿ4W%È‚x+x‚.øP€183n€Ÿdo9S_!83eÀñÏÂ=7xeBàƒ2H‚AØÞT1nñ(ŽÔ„6…)˜,xL{@\è(M˜JeP eAX VS`.’Vw0!c8"i%Ÿs‡é‘Vl°‡sÈ U¤qŒe0ʨGdŒo€ŒspÌx?ÀHzÊ2ˆø¥sðh÷n£¡„ä±g:Ò,_ %êÈŽÙa†jb/e07R£!ï¨;b üXߨ>ÙIþ˜)2R¢;Í‘ ¹ôØŒ3‚0Á ׌.R‘ yó@f8@F`2‚¨X$@oÁ!ã³û$ „E%ùy 7B]âH ÓBy#x„k?¤G2D“ù“ skyT\F©ÜP*9Y¤aP9_Ý—L¡$£¤”˜g7âö(ˆw’ëøE©òH瘎g9{ÔðÖak¹ƒŽSÑ@H8i*ãQSé•3áÇ“šÅ”¹V”Vé^ð%ôø–d‘è1‰ÙaÊQ‰% Üè—GEU"‹Ê‘_ aõ´ €# y1a€9š«)4àš9 |ªÉš–ña3 ›¬I¼™4œ2 Ãi¹Ù¶)À9=Ä›>áË©2¼‰Ô¹š3 Ò 6ðœµyß¹œ»ùš7ðœÂùš8ðœÈÙ›ÙI›#1œßi6Ÿ‰ÉtÛ1A2#dN ÐY3ñ+LAzÌYraɡЩÜ´3 2 /sö¢Ñgãñ :¡ðბÔ}‚º š^'jA0l 'ÊCða)ap¢áYš <#¢»Yš>"*œEСH¡3!:ÈY%Ú£3 ¡I°£ *¢ŸõI¤ DJñ™Hú¡!JÑ™Oú 4`Nà¢0ªÜùTÚ£4žO ¥m0¤hº›O¦JЦÂùgªÈùl*§:Iò#¤§WZqú ˜1U`§xZÑY| ¢jU¨5ÀY©!ZᩉZZžZéI©\ ©í)ª*¡a&ZW:Bûô œäš…Ê«Ñù!Qayð²¨6`°Q¼ÊIÅ*Ä6žw cªÐº›y@¼*œ”öM¼Šœí!da¬ŠCc@CÐz¥qP@ò¡Œzñ¹®íJb`)¢ qgP'H;@f ¯å7ý S:ó®K°Üy°2³Ol€;±¯Òšñº›}¯ÂùìÑ‹ÁñŠœÊa/¢Z/g ’Wв*k¯£<1ï…;Û˜¬“ŠÑIwPнád±²8`Žb}Ò7;ËÏ„¯úŠáI¯É‘°gÀ¹³»)µ©q¯W+³Â©µ0+±³³Èé°0Q,¡4±2+¡1Ó„}*³WZ³Êh÷ · hx`W³Ck·Ñ¹®¡2®1zvkÔd· k«=Jœ®‰ ‹»›®š¡1Âù«“‹œ32Šj·jnep«ž¥@r 8ûŸþñ8Á‘¤šêÑYƒ´6+y>a*êÜI£'x£>ž®»®#´1¦»›hPŒ1B¢ bºÂi‹®ûS>œ§Jz>Á¶–G²¦{¥c€»6úŸ1ŸBy ¶ "µ5Iá¸Ükr–z§¯J¾Ü™©+¦Üžk¨¸Ü»›ið¨ä+œñÁ¾Bú¾q1Ûä¡}J¾º8øK¾WÚ’$l`uÿé3á±n²¬¥S0ÊšÖ™@èËšÜ ¼¥Êš¼+«º9AP¼¼­‚J’¬‰œèÃA<‰,¡¶¸À $Ì3yŸHQ I¥³yH2B¨šÖÉgr/ÿ¹3ñQ,:yA§.œ»‰>³2Å•kª1#rà¼L:uÀ¿QªÆ‘>yq¥u Â^ªÆgJ›ÑBœ¦3‘tÌz½ÿ9§,Ì¿4°›ñƒ¡3ƒ\¹y‹¾Ë¹8ÈMª7´)¡2RL›WZŠšŒÅ‘ZqB\üê32÷J2P†»~©øhÿù©3‘üKª3AïÂ1±¼›Z":ô©# ‰Ÿ_0yÐߣG¨ùËÌÛ‘XTBÝu k R™^ù– P“ÇAš¦©Œ1Ó‘29•€Ö1ÄUÎyŸª±Ü\OÒø’ªa\i•+) (@ÌÆüCâÌ@älæèÌÌ¢‰ÏǼ:  +?Ìó0“ÑfL4”1ÞÃ’÷/zD€85 ˜Õ²öb^Bv04^•Ý›"Qs$bçuaåÄMßs!åG#uÿˆK¡a¢ÕU"-„5Ö"ÝËmæ#‚ZÌ>Í1˜_Ä(‚×!Ä.€3@6`- {Þçî1œ#è7.P›ïw& fµóHoD—“ç“.^ì—;U¹=”IišZ{ò ¡f#㣱Üèp1§_ž91 ™1ëØõÒKS454¡ä{Áç²Þå¨5Bgàé¡-°èægãê43(€sÊ-À‹Ó8=1ë|!Î\­Áþ5¿¾í.4'1Ždè(®u•Ða&âL³3f~Já“3˜Î”ï“å逕uŒ~&»±Îº2pêe‘<«^›:QÇ5ë³NëÖeë‡Xº®åj4#åÁNå VìÇn’!ìu4ÌîìkíÒ;Õž×Þ[éáí,ÿë$¨âNîÔÊMha#4ë^ó>Öïjy騑éM¾éÖÒéŸnG“a´Åï=­œ•Ï“©>¾5Àêÿêp!ë _ërëˆ^GÏëÿë?åÞñê‘ëòÿ5òRíÓN'òؾòÝ~÷þñò(°Än Œ¦”îúIJ9ßîÕöî¿óó†?õÞ~FŸïsqœÕçEóïP/ðS_ð­ŽðR§ð /ì/æðJòõÂN"ïëþQö OÚÄ®ž2¯ìÃöÏþö%Oí|A÷*¯íxÏíyî0?îåNBÀ¶è÷mîÒþ1…¿óŸ4Eòôô®éÀ¶^øžI"ë9¡•ÿô¦.õ¿ÊVïê‡æù[ßð]ÿð¹núbú?ëfÿbúíú9µ`¿öÇ!ò$÷sŸòÙÞòþÁÛé=áG­Šßñ[0é®ùI?ž‡ø^†âs~ÓY¿£WñàB Pz5à³@'ïõP]ø«zü%<­ÇðB_ú}ý‰±—úàßê›mÆCí-»ü×ööŸÉË}þÏîÀÞ÷íÄNð#wn Õ)@ÚqøˆÞÏ« ¨…5 WªždN£Ï™( ÂíâB´ª#B Å%)QÁ3:F÷Â"¡61§ÏQ[Œ† Qpvh;À‚Z¬`m YT| ¦Ðd|Ô¯ÒM@ȵDBP‚2@é<Ì÷Ççƒu$Ð? ¿¤þÀž ìuØÅ?Ö‡öŒ]÷‚V÷o6»hûøÌ u÷íÀQø/€_Ì+wÙ ¬!èîŒ`ô»ƒ-.‡èÁ·pýÞöktµ¥‡BHUø ‡0ë}¾(úp#Üu+ÐýIÂ8ÿÖ ÇÓ„ú¯Þ@k wô}¥ÐžBàÃXa„~p¤êÉ,]h>Çm¢-ËÀšD;œ‚l¾A·`=ìúPÔõÃr8–Lqj n7ˆçáD ?/!òCAÇ Ý*ã ±JÄ6xâ!A´ˆ\0#îýÀmœG|ˆRgŒDXå`J|…Bï×ÌB”B'ÈltrLñBðç AàæÃzæ¯ê‘bHúÆ#dïÏËa¼³a ë_ìûк¸7 Q^5ü! …×p³ü>mÈ÷_º;‹‚O>xCè í`Nts‘'B¾îÅè*ƒdØ‹—¯/j¾«Wþ#×c„(pýF¨¸ ãˆp‡äEF·7=!5¼ŒÖ0,º¼±HîV™nÑçyÁžà|¨cdH>ëXÇþ¡L ˆQÚăxV"vlˆ×&FDðXbA¤‡!šGWè `HˆT&ŠGƒË£¨;qÞÇï˜ÃãIýqñÅB¢wïêâePz4@.üD¾è‹â_¬Ãð6ºÜx O_$T}¾QãÃdiq䊸ï8bFå¸ÃðS 3ïÜ•t§Ùóëy‰.âA¹¸ka´Jo_)Ë÷ý*¤_†€1C. IânT† òìQE7¡dD‘•QE&GR¨³a¸ëŒ°,>"p¾ßZT8ÒêÈ™}äé^4Àô9•1!c£‘œ"°óÙÆ%éõRà“ü‰QJ.ÆþåñŸ•<‘”±ÿ}Eˆ »dt‘eÒžÏX ˜™´‘m1MÆ;Óu¢½{|د¶¸ ©D¡xIbÈϧ!û¤nôˆQ* ÊßH%…ã¡´)Ò+"G°È%Å¢6|‘‘ÒøMÊ0é £¦<‚}³|Î`ãjK\–2&ºÃ*Øk"¬ƒ 2½=˜In@œ„Qª‡P†¡x'áQ\•çÏâÆ&ö’! ”•ò¯õ»9Iža•Œ†Å±+ê>^Ù(}¥‹lŽÔªžÉÙ7e¡‹TŸC#^†h¹ dµÜð±*Lfù9&ÉìÑ$¾Ç‹(1W"ÅD½Ê;Nˉø0äµ\íÁ~¨0¾™ i AòŒ¢@¬‘‘<žÁyH‡Ó„Ãp °0h%…/±ämЙîƒ7øàà3¦qÈffŽ;xð`O8¦zhM¨ƒ@ÌÀ70 ð€= ƒ:€@ðÜpx'øôàü€{ÀÄ&ø €°”A"`& PTà7@àDàìƒO° èì qNÀÒØÜœÀs€°9a:› œÎÀ€Paä´@lw`Àìœà €_p ’Á'qøNÁiÀèU`,€g€<Áæ?0€€ÐMÀr€ðû üƒ²9:¯g@4680àvÞNÒYüÁ/ØçàœÁ©<±€:¸Ô€|<°?ç'2°û`ÌoÀN§ò¼žàhÏð0†`tÐ8g§èðàv!  @€ÍÙ¹€ž’`üMx ú0˜+üƒžg¿€À‚>  e¡@xÏmð €Á€ÿ ƒ#ú7€1€ŸýÀ œ²¹9É蜈NÇip€è$£“@€¹iBg'€@ŒÎÀ)<ÀíüðÀ@ ðDK(úüÀ4p=ÿÁü¼ž3Üáù FÀ9ø¦ Ü€oð à›àøO0üÁX'  ƒD:ž' ä „ð>>Àz@ ÜQPÁðK€äY0 ©ðžß`´ƒ~Àî?ø>°ÎA=°Øä€ðÚÀ,œ€ ÀOƒö 3 „@E À6Už›“œÑ͉ Nçì œÑwT'x§ ŒÑw*€Á}§ìSƒph˜àT„êªAàû@€,:ä(Àú  ÜN>@`Ÿ8l®M à@ Àž  ÄN ðÀ'˜îààOì&Þü L@0âÁ?ÀgóoZ€%ð”@>HY@€þP8§ ˜e ü!z (Lµ9à<ƒ>à¾Áª’“rz‚ðòÀ/˜‘à؃¤:€€äÓ àPo¾æèä«~5øUXc'_=¬}Õ°¿ ’ç8›@m²Íð§Øœ›À§æÍ­Jú&ê €pNÄ©8ãü¬ À¤ÕÊ™þÁ`bssr€ÕiàÀÝœàÀŽÎqz:å(€ÚS‰Ê:!€©slÐÛ©>Ù'àŸÿ€@ Ô¨àì¨xTjoª<Ÿ+?øõó~žƒ”ú’€$ýý  ƒÀù@:ø&àüƒS€ ¼),€ üÏú ¦* ¥à U RÁ<øK xJÐ ÐA%T@{þÍçJvU Þ ¥î~°îÁ3PíàDÓpþÀ'ð—³ Øo*G7@ö4 ‹ÒMojWá€?ড€ý‰Om¹õ³ 8ì œ€ @ÖÁg%àx€€ ØÁ“LÕ @+;7À4½UVnŽNø ; ëè ¬ tÔ¿©à©›u´Y À¦•³`SƒîV6 6A›€ÏêY°ù”§Bx³€ jQ9§A(N D€o:g @ÐvÔ5Þ,¨´t6\J›g¿©@£VÚ €rý³¥¶ˆð\ñ¬å´1ÀÐ ðhÕ@غ–ÔAx@°…µ ƒ N,ðŠ´Ú° }#>Ì è à€ ¸H袎!èx*ÚìÐÀ œ€ jÀ­¸…Í–*X¬m·íu¤-<µ+ÔvÜ ø¬£Ó\O€\Ñh¾Ý· us} üAÀ›—߯ÎÍùX÷-r%£t3á>ÜÍÙ$îçܵëÔ ˜N| îÁ?P¡›x\ú7é) ¹½ŸÊÍ@r@G=ò•äÂSºsá,Íý¸æâÜ—Ë®'<8›<×ç²Q—K7{.€C7è]6zPG§ ¥B7‡îP¨{tÏ&>T÷çÞÓÑiE³îÙì¢Y—‚QÀÚèûvsšÑëÙdk:`»›Ó¼]À6ç ˜»u× Œtð6§à»›“ Ì]NçnÛ5ítëÂSyšCá©=ŧú4åŽÎ~úOGg@¨tÓ¡&TÍëØèØ>7£ŽÎGztg'é…¦7ôÆÎÓ+zÀéM½G·õ¾^Pþèý¼>wvV3+X{§™ˆõ÷ ÜÚ[peêðÝ·tõø_|ˆ¯Âe¸Î×ø„}ñm¨¾›Ó¶.\nê@@8 ±óûÆÙ¿)~ ­÷¿ä÷Œßó AÙoø¿=¶µÆMÜ*ñ-¨¿²ÿ Kî?ˆ›s³þàÿ+fëïîU  à’ÚAKÖ¬­u³6÷ÓY;«iõl³ØÏÚ üiGç¤íÀz¶,L[9­§µ­vÔ‚à5+˜ªUµ¥èW ƒõlp¹µvήY†PnÃ-·ßÖ[DyLP-1.6.0/DyLP/doc/Figures/primalcalls.epsu0000644000076700007670000016231711171477034015465 0ustar %!PS-Adobe-3.0 EPSF-3.0 %%Title: /cs/mitacs1/lou/Bonsai/Doc/Dylp.New/Figures/primalcalls.epsu %%Creator: IslandDraw for lou %%CreationDate: Sat Sep 10 14:59:05 2005 %%Pages: 1 %%BoundingBox: 33 423 414 684 %%DocumentNeededResources: (atend) %%DocumentSuppliedResources: (atend) %%EndComments %%BeginPreview: 477 327 1 654 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000060001 % 001000020060200000003000000000000060200001 % 000000000000000000000000000000000000000000000000000000000000000000000000020001 % 0011000e0020200000001000000000000020200001 % 000000000000000000000000000000000000000000000000000000000000000000000000020000 % 000100020020000000001000000000000020000000 % 0000000000000000000000000000000000000000000000000000000000000000000000003e7703 % 3733db821e2e60000001f3b806feef371e2e61a000 % 000000000000000000000000000000000000000000000000000000000000000000000000622201 % 18911cc23333200000031110092450b9b333224007 % 00000000000000000000000000000000000000000000000000000000000000000000001c423201 % 10910842212120ffffe211900eb64390a12123a007 % 0000000000000000000000000000000000000000000000000000000000000000000003fc421401 % 1091084221212000000210a0019a8c90a121206006 % 000000000000000000000000000000000000000000000000000000000000000000003fc0461401 % 109108c623232000000230a0089b1191a323222006 % 00000000000000000000000000000000000000000000000000000000000000000003fc003b0803 % b9f9cf8f1e3e20000001d8400f090edf1e3e23c005 % 0000000000000000000000000000000000000000000000000000000000000000007f8000000800 % 000008000000200000000040000000100000200005 % 000000000000000000000000000000000000000000000000000000000000000007f800000038fc % 000008000000a000000001c7e00000100000a00004 % 00000000000000000000000000000000000000000000000000000000000000007f800000006000 % 00001c000001c00000000300000000380001c00004 % 000000000000000000000000000000000000000000000000000000000000000ff0000000000000 % 000000000000000000000000000000000000000003 % 00000000000000000000000000000000000000000000000000000000000000ff00000000000000 % 000000000000000000000000000000000000000003 % 0000000000000000000000000000000000000000000000000000000000000ff000000000000000 % 000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000001fe0000000000000000 % 000000000000000000000000000000000000000002 % 00000000000000000000000000000000000000000000000000000000001fe00000000000000000 % 000000000000000000000000000000000000000001 % 0000000000000000000000000000000000000000000000000000000001fe000000000000000000 % 000000000000000000000000000000000000000001 % 000000000000000000000000000000000000000000000000000000003fc0000000000000000000 % 030000400c04000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000003fc00000000000000200000 % 010001c00404000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000003fc000000000000000200000 % 015800400400000000000000000000000000000007 % 000000000000000000000000000000000000000000000000000007f800000000000000007bf771 % e126e043c5cc000000000000000000000000000007 % 00000000000000000000000000000000000000000000000000007f8000000000000000002122fa % 114730466664000000000000000000000000000006 % 0000000000000000000000000000000000000000000000000007f8000000000000003ffc21b280 % 71e210442424000000000000000000000000000006 % 00000000000000000000000000000000000000000000000000ff00000000000007ffffe020d481 % 912210442424000000000000000000000000000005 % 0000000000000000000000000000000000000000000000000ff00000000000fffffc000020d8ca % 313230c46464000000000000000000000000000005 % 000000000000000000000000000000000400003020000000ff000000001fffff80000000384871 % dbbbe1e3c7c4000000000000000000000000000004 % 0000000000000000000000000000000004000010e000001fe0000003fffff00000000000000000 % 000200000004000003000000000010300000000004 % 0000000000000000000000000000000000000010200001fe00007ffffe00000000000000000000 % 000200000014000001000000000030100000000003 % 00000000000000000000000000000373edbb0f1020001fe00fffffc00000000000000000000000 % 000700000038000001000000000010158000000003 % 0000000000000000000000000000039904cc90902003fdfffff800000000000000000000000000 % 00000000000000001f3b80f1e3cf17120000000002 % 0000000000000000000000000000010904888390203fffff000000000000000000000000000000 % 00000000000000003111010b163898940000000002 % 0000000000000000000000000001810904888c90203fff00000000000000000000000000000000 % 000000000000000e2119003a0410109e0000000001 % 0000000000000000000000000001811904889190603ffffff80000000000000000000000000000 % 000000000000001c210a00ca041010920000000005 % 000000000000000000000000000101f38fddcef8f01fff0fffffc0000000000000000000000000 % 0000000000000078230a011b163890930000000005 % 0000000000000000000000000003010000000000001ffff0007ffffe0000000000000000000000 % 00000000000000e01d8400ede3cf39fb8000000005 % 0000000000000000000000000003010000000000001fdf7f800003fffff0000000000000000004 % 38000200602003c000040000000000000000000005 % 0000000000000000000000000003038000000000000ff7e7f80000001fffff8000000000000004 % 40000e0020200700001c7e00000000000000000003 % 0000000000000000000000000006000000000000000ff8f87fc000000000fffffc000000000000 % 4000020020001e0000300000000000000000000005 % 00000000000000000000000000060000000000000007fe1f03fc000000000007ffffe0007773ec % eef7021e2e60380000000000000000000000000005 % 00000000000000000000000000060000000000000007ff07e03fc00000000000003ffffc22f904 % 447982333320f00000000000000000000000000001 % 00000000000000000000000000060000000000000003ffc0f803fe0000000000000001fc348104 % 465082212120e00000000000000000000000000005 % 000000000000000000000000000c0000000000000003ffe03f001fe00000000000000000148104 % 429082212120780000000000000000000000000005 % 000000000000000000000000000c0000000000000001dff807c001fe000000000000000018c904 % 4291862323201c0000000000000000000000000005 % 000000000000000000000000000c0000000000000001edfc00f8001ff00000000000000008738e % e11f0f1e3e200f0000000000000000000000000005 % 000000000000000000000000000c0000000000000001f67e003f0000ff00000000000000000000 % 011000000020038003000000000020000000000007 % 00000000000000000000000000180000000000000000f33f8007c0000ff0000000000000000000 % 0710000000a001e001000000040020000000000005 % 00000000000000000000000000180000000000000000fb9dc001f80000ff800000000000000000 % 0c38000001c0007001000000040000000000000005 % 0000000000000000000000000018000000000000000079cef0003e000007f80000000000000000 % 000000000000003c1f3b8069cf6e6efb8f3fbb0685 % 000000000000000000000000001000000000000000007ce7380007c000007f8000000000000000 % 000000000000000e31110093e473245cd090cc8905 % 000000000000000000000000003000000000000000003c71de0001f8000007fc00000000000000 % 0000000000000006211900ea042126884390888e85 % 000000000000000000000000003000000000000000003e38e700003e0000003fc0000000000000 % 0000000000000000210a001a042122884c90888185 % 000000000000000000000000003000000000000000001f1873c0000fc0000003fc000000000000 % 0000000000000000230a008b24232308d190888885 % 000000000000000000000000002000000000000000001f0c39e00001f00000003fe00000000000 % 00000000000000001d8400f1c73e710f8ef9ddcf01 % 000000000000000000000000006000000000000000001f8e1c7000003e00000001fe0000060000 % 000000000c04000000040000002000080000000002 % 000000000000000000000000006000000000000000000f870f3c00000fc00000001fe000020000 % 0000000004040000001c7e00002000080000000000 % 000000000000000000000000006000000000000000000fc3838e000001f000000001ff00020000 % 0000000004000000003000000070001c0000000007 % 00000000000000000000000000c0000000000000000007e1c1c78000007e000000000ff03e7700 % d7efe373c5cc340000000000000000000000000005 % 00000000000000000000000000c0000000000000000007e0e0e1c000000f8000000000fc622201 % 2246139e6664480000000000000000000000000005 % 00000000000000000000000000c0000000000000000003f06070f0000001f0000000000c423201 % d364710c2424740000000000000000000000000005 % 00000000000000000000000000c0000000000000000003f03038380000007e0000000000421400 % 31a9910c24240c0000000000000000000000000005 % 0000000000000000000000000180000000000000000001f8180e1e0000000f8000000000461401 % 11b2311c6464440000000000000000000000000005 % 0000000000000000000000000180000000000000000001fc1c070f00000003f0000000003b0801 % e091d9f3c7c4780000000000000000000000000004 % 0000000000000000000000000180000000000000000000fc0e0383800000007c00000000000800 % 000001000004000000000000000000000000000005 % 0000000000000000000000000180000000000000000000fe0701c1e00000000f800000000038fc % 000001000014000000000000000000000000000000 % 0000000000000000000000000300000000000000000000fe0380e07000000003f0000000006000 % 000003800038000000000000000000000000000002 % 00000000000000000000000003000000000000000000007b01c0783c000000007c000000000000 % 000000000000000000000000000000000000000000 % 00000000000000000000000003000000000000000000007f80c01c0e000000001f800000000000 % 000000000000000000000000000000000000000005 % 00000000000000000000000002000000000000000000003f80600e078000000003e00000000000 % 000000000000000000000000000000000000000005 % 00000000000000000000000006000000000000000000003fc0700701c0000000007c0000000000 % 000000000000000000000000000000000000000005 % 00000000000000000000000006000000000000000000001fc0380380f0000000001f8000000000 % 000000000000000000000000000000000000000005 % 00000000000000000000000006000000000000000000001f601c01c0780000000003e000060000 % 000008008000000000000000000000000000000003 % 00000000000000000000000004000000000000000000000fe00e00701c0000000000fc00020000 % 000008008800000000000000000000000000000005 % 0000000000000000000000000c000000000000000000000fb00700380f00000000001f00020000 % 000000000800000000000000000000000000000007 % 0000000000000000000000000c000000000000000000000ff803001c03800000000003e03e7703 % 70d719b99e00000000000000000000000000000004 % 0000000000000000000000000c0000000000000000000007d801800e01e00000000000fc622203 % 992f88c48800000000000000000000000000000003 % 000000000000000000000000180000000000000000000007ec00c007007000000000001c423201 % 09d808848800000000000000000000000000000003 % 000000000000000000000000180000000000000000000003ec00e003c03c000000000000421401 % 083808848800000000000000000000000000000003 % 000000000000000000000000180000000000000000000003f6007000e00e000000000000461401 % 191c88848800000000000000000000000000000004 % 000000000000000000000000180000000000000000000001f700380070078000000000003b0801 % f1e71dcfce00000000000000000000000000000003 % 000000000000000000000000300000000000000000000001fb001c003803c00000000000000801 % 000000000000000000000000000000000000000002 % 000000000000000000000000300000000000000000000000f9800e001c00e000000000000038fd % 000000000000000000000000000000000000000003 % 000000000000000000000000300000000000000000000000fd8006000e00780000000000006003 % 800000000000000000000000000000000000000004 % 000000000000000000000000300000000000000000000000fcc0030003801c0000000000000000 % 000000000000000000000000000000000000000004 % 0000000000000000000000006000000000000000000000007ee0038001c00f0000000000000000 % 000000000000000000000000000000000000000003 % 0000000000000000000000006000000000000000000000007e6001c000e0038000000000000000 % 000000000000000000000000000000000000000007 % 0000000000000000000000006000000000000000000000003f7000e0007001e000000000000000 % 000000000000000000000000000000000000000002 % 0000000000000000000000004000000000000000000000003f3000700038007000000000000000 % 000000000000000000000000000000000000000004 % 000000000000000000000000c000000000000000000000001f980038001e003c00000000000000 % 000000000000000000000000000000000000000006 % 000000000000000000000000c000000000000000000000001f9c00180007001e00000000000000 % 000000000000000000000000000000000000000006 % 000000000000000000000000c000000000000000000000000fcc000c0003800700000000000000 % 000000000000000000000000000000000000000006 % 0000000000000000000000008000000000000000000000000fce00060001c003c0000000000000 % 000000000000000000000000000000000000000006 % 00000000000000000000000180000000000000000000000007e600070000e000e0000000000000 % 000000000000000000000000000000000000000006 % 00000000000000000000000180000000000000000000000007f300038000700078000000000000 % 000000000000000000000000000000000000000006 % 00000000000000000000000180000000000000000000000007f30001c0001c001c000000000000 % 000000000000000000000000000000000000000006 % 00000000000000000000000300000000000000000000000003f98000e0000e000f000000000000 % 000000000000000000000000000000000000000006 % 00000000000000000000000300000000000000000000000003f9c0007000070003800000000000 % 000000000000000000000000000000000000000006 % 00000000000000000000000300000000000000000000000001fcc0003000038001e00000000000 % 000000000000000000000000000000000000000006 % 00000000000000000000000300000000000000000000000001fc6000180001c000f00000000000 % 000000000000000000000000000000000000000006 % 00000000000000000000000600000000000000000000000000fe60001c0000f000380000000000 % 000000000000000000000000000000000000000006 % 00000000000000000000000600000000000000000000000000fe30000e000038001e0000000000 % 000000000000000000000000000000000000000006 % 000000000000000000000006000000000000000000000000007f38000700001c00070000000000 % 000000000000000000000000000000000000000006 % 000000000000000000000006000000000000000000000000007b18000380000e0003c000000000 % 000000000000000000000000000000000000000006 % 00000000000000000000000c000000000000000000000000007d8c0001c000070000e000000000 % 000000000000000000000000000000000000000006 % 00000000000000000000000c000000000000000000000000003d8c0000c0000380007800000000 % 000000000000000000000000000000000000000000 % 00000000000000000000000c0000000000000000000000000036c60000600000e0001c00000000 % 000000000000000000000000000000000000000006 % 000000000000000000000008000000000000000000000000001ec7000030000070000f00000000 % 000000000000000000000000000000000000000000 % 000000000000000000000018000000000000000000000000001b63000038000038000780060000 % 0008000031000000000000400000c0000000000001 % 000000000000000000000018000000000000000000000000000f6380001c00001c0001c0020000 % 000800001100000000000040000040000000000001 % 000000000000000000000018000000000000000000000000000db180000e00000e0000f0020000 % 000000001000000000000000000056000000000001 % 0000000000000000000000100000000000000000000000000007b0c000070000078000383e7703 % 73f9bb0f13370000001bbec79c7748000000000001 % 0000000000000000000000300000000000000000000000000006d8e00003800001c0001c622203 % 9908cc90911887ffff1cd04c7e1650000000000001 % 0000000000000000000000300000000000000000000000000007d8600001800000e0001c423201 % 09088883911087ffff085048200878000000000001 % 00000000000000000000003000000000000000000000000000036c700000c00000700038421401 % 0908888c9110800000085048201c48000000000001 % 0000000000000000000000600000000000000000000000000003ec300000e00000380070461401 % 19088891911080000008d04c72264c000000000001 % 0000000000000000000000600000000000000000000000000001b61800007000001c00e03b0801 % f39dddcefbb9c000000fb8e79c77ee000000000001 % 0000000000000000000000600000000000000000000000000001b61800003800000703c0000801 % 000000000000000000080000000000000000000001 % 0000000000000000000000600000000000000000000000000000db0c00001c00000387000038fd % 000000000000000000080000000000000000000001 % 0000000000000000000000c00000000000000000000000000000db8e00000e000001ce00006003 % 8000000000000000001c0000000000000000000001 % 0000000000000000000000c000000000000000000000000000007d86000006000000fc00000000 % 000000000000000000000000000000000000000001 % 0000000000000000000000c000000000000000000000000000006dc30000030000007000000000 % 000000000000000000000000000000000000000001 % 0000000000000000000000c000000000000000000000000000003ec3000001800000fc00000000 % 000000000000000000000000000000000000000001 % 000000000000000000000180000000000000000000000000000036e1800001c00003ce00000000 % 000000000000000000000000000000000000000001 % 00000000000000000000018000000000000000000000000000003f61c00000e000070700000000 % 000000000000000000000000000000000000000000 % 00000000000000000000018000000000000000000000000000001b70c0000070000e0380060000 % 000800003001000000000000000000000000000002 % 00000000000000000000010000000000000000000000000000001bb060000038001c01c0020000 % 000800001001000080000000000000000000000000 % 00000000000000000000030000000000000000000000000000000db86000001c007800e0020000 % 000000001000000080000000000000000000000000 % 00000000000000000000030000000000000000000000000000000dd83000000c00e000383e7703 % 73f9bb0f13737779e0000000000000000000000000 % 000000000000000000000300000000000000000000000000000006cc3800000601c0001c622203 % 9908cc90939922cc80000000000000000000000007 % 000000000000000000000200000000000000000000000000000006cc180000070780000c423201 % 090888839109348480000000000000000000000000 % 000000000000000000000600000000000000000000000000000003661c0000038e00001c421401 % 0908888c9109148480000000000000000000000007 % 000000000000000000000600000000000000000000000000000003660c000001dc000078461401 % 190888919119188c80000000000000000000000000 % 000000000000000000000600000000000000000000000000000003b306000000f80001e03b0801 % f39dddcef9f38878e0000000000000000000000000 % 000000000000000000000c00000000000000000000000000000001b307000000f00003c0000801 % 000000000100000000000000000000000000000000 % 000000000000000000000c000000000000000000000000000000019983000001f0000f000038fd % 000000000100000000000000000000000000000002 % 000000000000000000000c00000000000000000000000000000000d98380000398003c00006003 % 800000000380000000000000000000000000000002 % 000000000000000000000c00000000000000000000000000000000ccc180000f0c007800000000 % 000000000000000000000000000000000000000001 % 0000000000000000000018000000000000000000000000000000006cc0c0001c0e01e000000000 % 000000000000000000000000000000000000000001 % 0000000000000000000018000000000000000000000000000000006660c0003807038000000000 % 000000000000000000000000000000000000000000 % 00000000000000000000180000000000000000000000000000000036606000f0038f0000000000 % 000000000000000000000000000000000000000000 % 00000000000000000000180000000000000000000000000000000033307001c001fc0000000000 % 000000000000000000000000000000000000000007 % 0000000000000000000030000000000000000000000000000000003b3030038000f80000000000 % 000000000000000000000000000000000000000007 % 0000000000000000000030000000000000000000000000000000001998180f0001e00000000000 % 000000000000000000300000000002030000000006 % 0000000000000000000030000000000000000000000000000000001d9c181c0007b00000000000 % 000000000000000000100000000006010000000006 % 0000000000000000000020000000000000000000000000000000000ccc0c38000f380000000000 % 000000000000000000100000000002015800000005 % 0000000000000000000060000000000000000000000000000000000cce0e70003c1c0000000000 % 000000000000000001f3b80f1e78f2e12000000005 % 00000000000000000000600000000000000000000000000000000006e607e000700e0000000000 % 000000000000000003111010b1c58b114000000004 % 0000000000000000000060000000000000000000000000000000000667078001e0070000000000 % 0000000000000000e2119003a0810211e000000004 % 000000000000000000004000000000000000000000000000000000037307000780038000000000 % 0000000000000001c210a00ca08102112000000003 % 00000000000000000000c00000000000000000000000000000000003339f800f00018000000000 % 00000000000000038230a011b1c58a113000000003 % 00000000000000000000c00000000000000000000000000000000001b9b9c03c0000c000000000 % 000000000000000701d8400ede78f73bb800000002 % 00000000000000000000c0000000000000000000000000000000000199f0c0f000006000000000 % 000000000000000e00004000000000000000000002 % 00000000000000000001800000000000000000000000000000000001dde0e1e000007000000000 % 000000000000001c0001cfc0000000000000000001 % 00000000000000000001800000000000000000000000000000000000cfe0678000003800000000 % 000000000000003800030000000000000000000001 % 00000000000000000001800000000000000000000000000000000000cf603e0000001c00000000 % 000000000000007000000000000000000000000000 % 000000000000000000018000000000000000000000000000000000006e303c0000000e00000000 % 00000000000000e000000000000000000000000000 % 000000000000000000030000000000000000000000000000000000007e30f80000000700000000 % 00000000000001c000000000000000000000000007 % 000000000000000000030000000000000000000000000000000000007319fc0000000300000000 % 000000000000038000000000000000000000000007 % 00000000000000000003000000000000000000000000000000000000f31f8c0000000180000000 % 000000000000070000000000000000000000000006 % 00000000000000000003000000000000000000000000000000000003d99e0600000001c0000000 % 0000000000000e0000000000000000000000000006 % 0000000000000000000600000000000000000000000000000000000719bc0600000000e0060000 % 3000000000001c0000600000060600000400000805 % 0000000000000000000600000000000000000000000000000000000e1cf6030000000070020000 % 100000000000380000200000020220000400000805 % 0000000000000000000600000000000000000000000000000000003c0dc6038000000038020000 % 100000000000700000200000020220000000000004 % 000000000000000000040000000000000000000000000000000000700fe301800000001c3e7701 % f109c6e6e3c0e00003e7701e3e3e79e6eceff71804 % 0000000000000000000c0000000000000000000000000000000000e01e6300c00000000c622203 % 131be3131421ffffc62220216262233734448f8803 % 0000000000000000000c0000000000000000000000000000000001c03e3180c00000003c423202 % 110a021210e1ffffc4232007424222121468880803 % 0000000000000000000c000000000000000000000000000000000780f3318060000003f8421402 % 110a02121320e00004214019424222121428880802 % 00000000000000000008000000000000000000000000000000000e03c318c07000001f80461402 % 311b221214607000046140234646223234308c8802 % 00000000000000000018000000000000000000000000000000001c078198e0300000fc003b0801 % d8edc73f3bb0380003b0801dbb3b39e3ee11c70801 % 0000000000000000001800000000000000000000000000000000781e018c60380007e000000800 % 0000000000001c0000008000000000020000000805 % 0000000000000000001800000000000000000000000000000000e03801cc7018007f00000038fc % 0000000000000e0000038fc0000000020000002805 % 0000000000000000003000000000000000000000000000000001c0f000c6300c03f00000006000 % 000000000000070000060000000000070000007005 % 000000000000000000300000000000000000000000000000000783c000e6380e1f800000000000 % 000000000000038000000000000000000000000005 % 000000000000000000300000000000000000000000000000000e078000671806fc000000000000 % 00000000000001c000000000000000000000000003 % 000000000000000000300000000000000000000000000000001c1e0000631c0fe0000000000000 % 00000000000000e000000000000000000000000005 % 0000000000000000006000000000000000000000000000000038780000338c7f00000000000000 % 000000000000007000000000000000000000000005 % 00000000000000000060000000000000000000000000000000f0f00000318ff180000000000000 % 000000000000003800000000000000000000000001 % 00000000000000000060000000000000000000000000000001c3c0000019df81c0000000000000 % 000000000000001c00000000000000000000000005 % 000000000000000000600000000000000000000000000000038700000019ff00c0000000000000 % 000000000000000e00600000600010000040000005 % 000000000000000000c000000000000000000000000000000f1e0000000fe300e0000000000000 % 000000000000000700200000200010000040000005 % 000000000000000000c000000000000000000000000000001c780000007e618060000000000000 % 000000000000000380200000200000000000000005 % 000000000000000000c0000000000000000000000000000038f0000003fe718030000000000000 % 0000000000000001c3e7701e2fb7377fb8c0000007 % 000000000000000000800000000000000000000000000000f3c000003f8630c030000000000000 % 0000000000000000e6222031243992247c40000005 % 000000000000000001800000000000000000000000000001cf000001f80630c018000000000000 % 000000000000000044232020241093444040000005 % 0000000000000000018000000000000000000000000000039e00000fc00318601c000000000000 % 000000000000000004214020241091444040000005 % 0000000000000000018000000000000000000000000000077800007e000318600c000000000000 % 000000000000000004614031241191846440000005 % 00000000000000000100000000000000000000000000001ee00007f000018c3006000000000000 % 000000000000000003b0801e7e1f388e3840000005 % 00000000000000000300000000000000000000000000003bc0003f0000018c3006000000000000 % 000000000000000000008000001000000040000005 % 00000000000000000300000000000000000000000000007f0001f8000000c61803000000000000 % 000000000000000000038fc0001000000140000005 % 0000000000000000030000000000000000000000000001fe000fc0000000c61803800000000000 % 000000000000000000060000003800000380000001 % 0000000000000000060000000000000000000000000003f800fe00000000e30c01800000000000 % 000000000000000000000000000000000000000002 % 0000000000000000060000000000000000000000000007e007e000000000630e01c00000000000 % 000000000000000000000000000000000000000000 % 000000000000000006000000000000000000000000001fc03f0000000000618600c00000000000 % 000000000000000000000000000000000000000007 % 000000000000000006000000000000000000000000003f01f80000000000318700600000000000 % 000000000000000000000000000000000000000005 % 00000000000000000c000000000000000000000000007c1fc0000000000030c300700000000000 % 000000000000000000000000000000000000000005 % 03000000040000180c0000000000000004000030e000f8fc00000000000018c380300000000000 % 000000000000000000000000000000000000000005 % 01000000040000080c00000000000000040000111003e7e0000000000000186180380000000000 % 000000000000000000000000000000000000000005 % 01000000000000080c00000000000000000000111007ff000000000000000c61c0180000000000 % 000000000000000000000000000000000000000005 % 1f3b81b9fcdd87881800000000000373edbb0f11100ff8000000000000000c30c00c0000000000 % 000000000000000000000000000000000000000004 % 311101cc84664848180000000000039904cc9090303f80000000000000000e30e00e0000000000 % 000000000000000000000000000000000000000005 % 21190084844441c81fffffffffff810904888390203c0000000000000000063860060000000000 % 000000000000000000000000000000000000000000 % 210a008484444648180000000000010904888c90403fe000000000000000071870070000000000 % 000000000000000000000000000000000000000002 % 230a008c844448c81c0000000000011904889190881ffe00000000000000031c30030000000000 % 000000000000000000000000000000000000000000 % 1d8400f9ceeee77c0c000000000001f38fddcef9f007ffe0000000000000030c38018000000000 % 000000000000000000000000000000000000000005 % 00040080000000000e00000000000100000000000003f9ff000000000000018e18018000000000 % 0000000000000000000000c000000000080c000005 % 001c7e80000000000600000000000100000000000001ff0ff0000000000001860c00c000000000 % 000000000000000000000040000000001804000005 % 003001c00000000007000000000003800000000000007fc0ff000000000000c70c00e000000000 % 000000000000000000000040000000000805600005 % 000000000000000007000000000000000000000000003ff00ff80000000000c306006000000000 % 0000000000000000000007cee03c79e3cb84800003 % 000000000000000003800000000000000000000000001ffc007f80000000006386003000000000 % 000000000000000000000c444042c7162c45000005 % 0000000000000000038000000000000000000000000007ef0007f8000000006183003000000000 % 000000000000000000018846400e82040847800007 % 000000000000000001c000000000000000000000000003fbc0007fc00000007183001800000000 % 000000000000000000030842803282040844800004 % 000000000000000001c000000000000000000000000001fcf80003fc00000030c1801c00000000 % 0000000000000000000608c28046c7162844c00003 % 000000000000000001e000000000000000000000000000ff3e00003fc0000030c1800c00000000 % 0000000000000000000c0761003b79e3dceee00003 % 000000000000000000e0000000000000000000000000003b8f800003fe00001860c00e00000000 % 000000000000000000180001000000000000000003 % 000000000000000000f0000000000000000000000000001de3e000001fe0001860c00600000000 % 0000000000000000003000073f0000000000000004 % 000000000000000000f0000000000000000000000000000f7878000001fe000c30600300000000 % 00000000000000000060000c000000000000000003 % 000000000000000000780000000000000000000000000003bc1e0000001ff00c30700380000000 % 000000000000000000c00000000000000000000002 % 000000000000000000780000000000000000000000000001cf07c0000000ff0618300180000000 % 000000000000000001800000000000000000000003 % 0000000000000000003c0000000000000000000000000000f3c1f00000000ff6183801c0000000 % 000000000000000003000000000000000000000004 % 0000000000000000003c000000000000000000000000000039e07c00000000ff8c1800c0000000 % 000000000000000006000000000000000000000004 % 0000000000000000003600000000000000000000000000001c781f0000000007fc1c0060000000 % 00000000000000000c000000000000000000000003 % 0000000000000000001e00000000000000000000000000000e1c03c0000000037f8c0070000000 % 000000000000000018000000000000000000000007 % 0000000000000000001b0000000000000000000000000000078f00f00000000187fe0030000000 % 0000200001880000300000c0000180004000010002 % 0000000000000000000f000000000000000000000000000001c3c03e00000001833fc038000000 % 000420000088800060000040000080004000010004 % 0000000000000000000d800000000000000000000000000000e1e00f80000000c307fc18000000 % 0004000000808000c0000040000080000000000006 % 0000000000000000000d800000000000000000000000000000787803e0000000c1833fec6e7ce3 % cdcf6dd87899eee1800007ddc0789fdccefe730006 % 00000000000000000006c000000000000000000000000000001c1e00f8000000618381fc7321f6 % 6e64266484888443ffff8c4880c488e64450f90006 % 00000000000000000006c000000000000000000000000000000e0f001e00000061c1801e212104 % 242424441c888643ffff884c808088424690810006 % 000000000000000000076000000000000000000000000000000783c00780000070c1c000212104 % 242424446488828380000845008088424290810006 % 0000000000000000000360000000000000000000000000000001c0e001f0000030e0c000232194 % 646424448c888281c00008c500c488464310c90006 % 0000000000000000000330000000000000000000000000000000e078007c0000386060003e70e3 % c7c77eee77dce100e00007620079dc7ce138710006 % 00000000000000000001b0000000000000000000000000000000701e001f000018706000200000 % 040000000000010070000002000000400000010006 % 00000000000000000001980000000000000000000000000000003c0f0007c00018303000200000 % 04000000000007003800000e3f0000400000050006 % 00000000000000000001980000000000000000000000000000000e03c000f0000c383000700000 % 0e00000000000c001c000018000000e000000e0006 % 00000000000000000000cc0000000000000000000000000000000700f0003c000c181800000000 % 00000000000000000e000000000000000000000006 % 00000000000000000000cc00000000000000000000000000000003c078000f80061c1800000000 % 000000000000000007000000000000000000000006 % 000000000000000000006600000000000000000000000000000000e01e0003e0060c0c00000000 % 000000000000000003800000000000000000000006 % 00000000000000000000660000000000000000000000000000000070070000f8030c0c00000000 % 000000000000000001c00000000000000000000006 % 0000000000000000000063000000000000000000000000000000003c03c0003e03060600000000 % 000000000000000000e00000000000000000000006 % 0000000000000000000033000000000000000000000000000000000e00f0000783860600000000 % 000000000000000000700000000000000000000006 % 0000000000000000000031800000000000000000000000000000000700380001e1830300000000 % 0000000000000000003800c0000c00000000000000 % 00000000000000000000398000000000000000000000000000000003801e00007d830380000000 % 0000000000000000001c0040000400000000000406 % 0000000000000000000018c000000000000000000000000000000001e00780001fc18180000000 % 0000000000000000000e00400004000c0000000400 % 0000000000000000000018c0000000000000000000000000000000007003c00007c181c0000000 % 0000000000000000000707ddc07c70738dc7884f01 % 000000000000000000000c60000000000000000000000000000000003800f00001f0c0c0000000 % 000000000000000000038c4880c4f88fc62cd8c401 % 000000000000000000000c60000000000000000000000000000000001e003800007cc0e0000000 % 00000000000000000001084c8084808c0428484401 % 000000000000000000000c300000000000000000000000000000000007001e00003f6060000000 % 000000000000000000000845008480740428484401 % 00000000000000000000063000000000000000000000000000000000038007800033e070000000 % 0000000000000000000008c5008cc8864428c8c401 % 0000000000000000000006180000000000000000000000000000000001e001c00038f830060000 % 060001000004000000000762007670fb8e77876701 % 00000000000000000000031800000000000000000000000000000000007000f000183e38020000 % 0200010000040000000000020000008c0000000001 % 00000000000000000000030c000000000000000000000000000000000038003c00181f98020000 % 02000000000000000000000e3f00018c0000000001 % 00000000000000000000030c00000000000000000000000000000000001c001e000c19fc3e7701 % e2fb7377fb8c000000000018000000f00000000001 % 00000000000000000000018600000000000000000000000000000000000f0007800c0c7c622203 % 1243992247c4000000000000000000000000000001 % 0000000000000000000001860000000000000000000000000000000000038001c0060c1e423202 % 024109344404000000000000000000000000000001 % 0000000000000000000001c3000000000000000000000000000000000001c000f0060e04421402 % 024109144404000000000000000000000000000001 % 0000000000000000000000c3000000000000000000000000000000000000f0003c030600461403 % 124119184644000000000000000000000000000001 % 0000000000000000000000c180000000000000000000000000000000000038000e0307003b0801 % e7e1f388e384000000000000000000000000000001 % 0000000000000000000000618000000000000000000000000000000000001c0007838300000800 % 000100000004000000000000000000000000000001 % 000000000000000000000060c000000000000000000000000000000000000f0001e183800038fc % 000100000014000000000000000000000000000001 % 000000000000000000000060c00000000000000000000000000000000000078000f1c180006000 % 000380000038000000000000000000000000000000 % 00000000000000000000003060000000000000000000000000000000000001c0003cc1c0000000 % 000000000000000000000000000000000000000002 % 00000000000000000000003060000000000000000000000000000000000000e0000ec0c0000000 % 000000000000000000000000000000000000000000 % 00000000000000000000001830000000000000000000000000000000000000780007e0e0000000 % 000000000000000000000000000000000000000000 % 000000000000000000000018300000000000000000000000000000000000001c0001e060000000 % 000000000000000000000000000000000000000000 % 000000000000000000000018180000000000000000000000000000000000000e00007060000000 % 000000000000000000000000000000000000000007 % 00000000000000000000000c180000000000000000000000000000000000000780003c30000000 % 000000000000000000000000000000000000000000 % 00000000000000000000000c0c00000000000000000000000000000000000001c0001f30060000 % 300000000000000000000000000000000000000007 % 00000000000000000000000e0c00000000000000000000000000000000000000e0001f98020000 % 100000000000200000000000000000000000000000 % 000000000000000000000006060000000000000000000000000000000000000078001df8020000 % 100060000000200000000000000000000000000000 % 00000000000000000000000606000000000000000000000000000000000000003c000c7c3e7701 % f1c38e371e21780000000000000000000000000000 % 00000000000000000000000303000000000000000000000000000000000000000e000c3c622203 % 13e45f18b363200000000000000000000000000002 % 00000000000000000000000303000000000000000000000000000000000000000700060e423202 % 12045010a121200000000000000000000000000002 % 000000000000000000000003018000000000000000000000000000000000000003c00600421402 % 12039010a121200000000000000000000000000001 % 000000000000000000000001818000000000000000000000000000000000000000e00300461402 % 33241910a323200000000000000000000000000001 % 00000000000000000000000180c0000000000000000000000000000000000000007003003b0801 % d9c7ce39de1db80000000000000000000000000000 % 000000000000000000000000c0c0000000000000000000000000000000000000003c0180000800 % 000460000000000000000000000000000000000000 % 000000000000000000000000c060000000000000000000000000000000000000000e01800038fc % 000c60000000000000000000000000000000000007 % 000000000000000000000000c060000000000000000000000000000000000000000701c0006000 % 000780000000000000000000000000000000000007 % 00000000000000000000000060300000000000000000000000000000000000000003c0c0000000 % 000000000000000000000000000000000000000006 % 00000000000000000000000060300000000000000000000000000000000000000001e0c0000000 % 000000000000000000000000000000000000000006 % 000000000000000000000000701800000000000000000000000000000000000000007060000000 % 000000000000000000000000000000000000000005 % 000000000000000000000000301800000000000000000000000000000000000000003860000000 % 000000000000000000000000000000000000000005 % 000000000000000000000000300c00000000000000000000000000000000000000001e30000000 % 000000000000000000000000000000000000000004 % 000000000000000000000000180c00000000000000000000000000000000000000000730000000 % 000000000000000000000000000000000000000004 % 000000000000000000000000180600300000000002000000000000000000000000000398060000 % 000000400000000000000000000000000000000003 % 0000000000000000000000001806001000000040020000000000000000000000000001f8020000 % 000800400000000000000000000000000000000003 % 0000000000000000000000000c030010000000400000000000000000000000000000007c020000 % 000800000000000000000000000000000000000002 % 0000000000000000000000000c0301f3b8069cf6e6efb8f3fbb06800000000000000003c3e7700 % d39edcddf71e7f760d000000000000000000000002 % 0000000000000000000000000601831110093e473245cd090cc89000000000000000001e622201 % 27c8e648b9a1219912000000000000000000000001 % 00000000000000000000000006018211900ea042126884390888e800000000000000000e423201 % d408424d108721111d000000000000000000000001 % 00000000000000000000000006000210a001a042122884c9088818000000000000000000421400 % 340842451099211103000000000000000000000000 % 00000000000000000000000003000230a008b24232308d19088888000000000000000000461401 % 1648464611a3211111000000000000000000000000 % 000000000000000000000000030001d8400f1c73e710f8ef9ddcf00000000000000000003b0801 % e38e7ce21f1df3bb9e000000000000000000000007 % 000000000000000000000000038000004000000200008000000000000000000000000000000800 % 000040001000000000000000000000000000000007 % 00000000000000000000000001800001c7e00002000080000000000000000000000000000038fc % 000040001000000000000000000000000000000006 % 00000000000000000000000001800003000000070001c000000000000000000000000000006000 % 0000e0003800000000000000000000000000000006 % 00000000000000000000000000c000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000005 % 00000000000000000000000000c000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000005 % 00000000000000000000000000c000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000004 % 000000000000000000000000006000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000004 % 000000000000000000000000006000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000003 % 000000000000000000000000003000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000003 % 000000000000000000000000003000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000002 % 000000000000000000000000003000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000002 % 000000000000000000000000001800000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000001 % 000000000000000000000000001800000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000005 % 000000000000000000000000001c00000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000005 % 000000000000000000000000000c00000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000005 % 000000000000000000000000000c00000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000005 % 000000000000000000000000000600000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000003 % 000000000000000000000000000600000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000005 % 000000000000000000000000000600e0000000000000018000040000000c000000000081800000 % 000000000000000000000000000000000000000005 % 000000000000000000000000000301000000000000000080000400000004000000000180800000 % 000000000000000000000000000000000000000001 % 000000000000000000000000000301000000000000000080000000000004000000000080ac0000 % 000000000000000000000000000000000000000005 % 0000000000000000000000000001839e7cf383509b8e7cb9e0dc7800007ddc07879e3cb8900000 % 000000000000000000000000000000000000000005 % 00000000000000000000000000018133218fc4b19cdf20ce1124c40000c488084c7162c4a00000 % 000000000000000000000000000000000000000005 % 00000000000000000000000000000121210407508850208471d4801ff884c801c8204084f00000 % 000000000000000000000000000000000000000005 % 00000000000000000000000000000121210400d088502085903480000084500648204084900000 % 000000000000000000000000000000000000000007 % 00000000000000000000000000000123218e445188d9208e3114c400008c5008cc716284980000 % 000000000000000000000000000000000000000005 % 0000000000000000000000000000039e70f3878ecf8e70f9d9ee780000762007679e3dcfdc0000 % 000000000000000000000000000000000000000005 % 000000000000000000000000000000000000000008000000000000000000200000000000000000 % 000000000000000000000000000000000000000005 % 000000000000000000000000000000000000000008000000000000000000e3f000000000000000 % 000000000000000000000000000000000000000005 % 00000000000000000000000000000000000000001c000000000000000001800000000000000000 % 000000000000000000000000000000000000000005 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000005 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000005 %%EndPreview save /d_sv_obj exch def userdict /IslandDrawDict 300 dict dup begin put /bdef {bind def} bind def /E {exch} bdef /FF {findfont} bdef /MF {makefont} bdef /RO {rotate} bdef /SC {scale} bdef /SF {setfont} bdef /SG {setgray} bdef /TR {translate} bdef /bp {lj lw rgb} bdef /bpbw {lj lw setgray} bdef /c {curveto} bdef /cl {closepath} bdef /fi {eofill} bdef /g {setgray} bdef /gr {grestore} bdef /gs {gsave} bdef /l {lineto} bdef /lj {setlinejoin} bdef /lw {setlinewidth} bdef /m {moveto} bdef /n {newpath} bdef /nx {/x E def} bdef /r {rmoveto} bdef /rl {rlineto} bdef /rgb {setrgbcolor} bdef /s {show} bdef /sd {setdash} bdef /sp {x 0 rmoveto} bdef /ss {currentpoint pop E m} bdef /st {stroke} bdef %% pattern stuff /BPSIDE 32 def %% pixels per pattern side /PATFREQ 3.0 def %% pattern pixels per mm /dp_mat [PATFREQ 0 0 PATFREQ 0 0] def /dp_pw BPSIDE def %% pattern pixel width /dp_ph BPSIDE def %% pattern pixel height /dp_w dp_pw PATFREQ div def %% pattern mm width /dp_h dp_ph PATFREQ div def %% pattern mm height /savemat matrix def /topmat matrix def /patmat matrix def %% catch nocurrentpoint error for: pathbbox /ncpoint errordict /nocurrentpoint get def errordict begin /nocurrentpoint { dup /pathbbox load eq {pop 0 0 1 1} {ncpoint} ifelse } bdef end /ar { %% sa ea sx sy rot tx ty matrix currentmatrix 8 1 roll TR RO SC n 0 0 1 5 3 roll arc setmatrix } bdef /arn { %% sa ea sx sy rot tx ty TR RO SC matrix currentmatrix 8 1 roll n 0 0 1 5 3 roll arcn setmatrix } bdef /el { %% sx sy rot tx ty matrix currentmatrix 6 1 roll TR RO SC n 0 0 1 0 360 arc setmatrix cl } bdef /image_raster { %% sw sh sd dw dh xs ys TR SC /sd E def /sh E def /sw E def /imagebuf sw sd mul 7 add 8 idiv string def sw sh sd [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop} image } bdef /imagemask_raster { TR SC /sh E def /sw E def /imagebuf sw 7 add 8 idiv string def sw sh false [sw 0 0 sh 0 0] {currentfile imagebuf readhexstring pop} imagemask } bdef /dither_color_raster { % bool sw sh sd dw dh xs ys TR SC /sd E def /sh E def /sw E def sd 8 eq and { /imagebuf 3 string def /grayval 1 string def sw sh sd [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop pop imagebuf 0 get 0.299 mul imagebuf 1 get 0.587 mul add imagebuf 2 get 0.114 mul add cvi grayval exch 0 exch put grayval } image } { /imagebuf sw 3 mul sd mul 7 add 8 idiv string def sh { currentfile imagebuf readhexstring pop pop } repeat } ifelse } bdef /image_color_raster { % bool sw sh sd dw dh xs ys /colorimage where not { dither_color_raster } { pop TR SC /sd E def /sh E def /sw E def pop /imagebuf sw 3 mul sd mul 7 add 8 idiv string def sw sh sd [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop} false 3 colorimage } ifelse } bdef /patpath { /inv E def topmat setmatrix pathbbox %% get lo - hi indecies /hy E dp_h div floor cvi def /hx E dp_w div floor cvi def /ly E dp_h div floor cvi def /lx E dp_w div floor cvi def lx 1 hx { dp_w mul ly 1 hy { dp_h mul E dup 3 1 roll E patmat currentmatrix pop TR dp_pw dp_ph inv dp_mat dp_proc imagemask patmat setmatrix } for pop } for } bdef % setpattern brush of patterns instead of gray /setpattern { /blue E def /green E def /red E def /freq E def /bwidth E def /bpside E def /bstring E def /onbits 0 def /offbits 0 def freq 0 {/y E def /x E def /xindex x 1 add 2 div bpside mul cvi def /yindex y 1 add 2 div bpside mul cvi def bstring yindex bwidth mul xindex 8 idiv add get not 1 7 xindex 8 mod sub bitshift and 0 ne {/onbits onbits 1 add def 1} {/offbits offbits 1 add def 0} ifelse } setscreen {} settransfer systemdict /setcmykcolor known { /fact 1 onbits offbits onbits add div sub def 1 red sub fact mul 1 green sub fact mul 1 blue sub fact mul 0 setcmykcolor } { offbits offbits onbits add div setgray} ifelse } bdef /dmatrix matrix def /dpi 72 0 dmatrix defaultmatrix dtransform dup mul E dup mul add sqrt def /B {gs bp st gr} bdef %% brush: gr lw lj /Bbw {gs bpbw st gr} bdef %% brush: gr lw lj /F {gs rgb eofill gr} bdef %% fill: gr /Fbw {gs setgray eofill gr} bdef %% fill: gr /PB {gs lj lw setpattern st gr} bdef /PF {gs eoclip patpath gr} bdef /BB {gs rgb lj lw strokepath clip patpath gr} bdef /xdef {exch def} bdef /clip_region { /ht xdef /wd xdef /bm xdef /lm xdef newpath lm bm moveto 0 ht rlineto wd 0 rlineto 0 ht neg rlineto closepath clip } bdef %! Island text prolog Version 3.1 %% %%BeginProlog /reencode_small_dict 12 dict def /ReencodeSmall { reencode_small_dict begin /new_codes_and_names exch def /new_font_name exch def /base_font_name exch def /base_font_dict base_font_name findfont def /newfont base_font_dict maxlength dict def base_font_dict { exch dup /FID ne { dup /Encoding eq { exch dup length array copy newfont 3 1 roll put } { exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall newfont /FontName new_font_name put new_codes_and_names aload pop new_codes_and_names length 2 idiv { newfont /Encoding get 3 1 roll put } repeat new_font_name newfont definefont pop end %reencode_small_dict } def /extended_Zapf [ 8#223 /a89 8#224 /a90 8#225 /a93 8#226 /a94 8#227 /a91 8#230 /a92 8#231 /a205 8#232 /a85 8#233 /a206 8#234 /a86 8#235 /a87 8#236 /a88 8#237 /a95 8#240 /a96 ] def /extended_Standard [ 29 /thorn 30 /yacute 31 /divide 128 /Acircumflex 129 /Adieresis 130 /Agrave 131 /Aring 132 /Atilde 133 /Ccedilla 134 /Eacute 135 /Ecircumflex 136 /Edieresis 137 /Egrave 138 /Iacute 139 /Icircumflex 140 /Idieresis 141 /Igrave 142 /Ntilde 143 /Oacute 144 /Ocircumflex 145 /Odieresis 146 /Ograve 147 /Otilde 148 /Scaron 149 /Uacute 150 /Ucircumflex 151 /Udieresis 152 /Ugrave 153 /Ydieresis 154 /Zcaron 155 /aacute 156 /acircumflex 157 /adieresis 158 /agrave 159 /aring 160 /atilde 161 /exclamdown 162 /cent 163 /sterling 164 /fraction 165 /yen 166 /florin 167 /section 168 /currency 169 /quotesingle 170 /quotedblleft 171 /guillemotleft 172 /guilsinglleft 173 /guilsinglright 174 /fi 175 /fl 176 /plusminus 177 /endash 178 /dagger 179 /daggerdbl 180 /periodcentered 181 /twosuperior 182 /paragraph 183 /bullet 184 /quotesinglbase 185 /quotedblbase 186 /quotedblright 187 /guillemotright 188 /ellipsis 189 /perthousand 190 /threesuperior 191 /questiondown 192 /mu 193 /grave 194 /acute 195 /circumflex 196 /tilde 197 /macron 198 /breve 199 /dotaccent 200 /dieresis 201 /onesuperior 202 /ring 203 /cedilla 204 /onequarter 205 /hungarumlaut 206 /ogonek 207 /caron 208 /emdash 209 /ccedilla 210 /copyright 211 /eacute 212 /ecircumflex 213 /edieresis 214 /egrave 215 /iacute 216 /icircumflex 217 /idieresis 218 /igrave 219 /logicalnot 220 /minus 221 /ntilde 222 /oacute 223 /ocircumflex 224 /odieresis 225 /AE 226 /onehalf 227 /ordfeminine 228 /ograve 229 /otilde 230 /registered 231 /scaron 232 /Lslash 233 /Oslash 234 /OE 235 /ordmasculine 236 /trademark 237 /uacute 238 /ucircumflex 239 /udieresis 240 /ugrave 241 /ae 242 /ydieresis 243 /zcaron 244 /Aacute 245 /dotlessi 246 /threequarters 247 /Eth 248 /lslash 249 /oslash 250 /oe 251 /germandbls 252 /multiply 253 /Yacute 254 /Thorn 255 /eth ] def /extended_Symbol [ ] def /extend_font { % stack: fontname newfontname exch dup (ZapfDingbats) eq { cvn exch cvn extended_Zapf ReencodeSmall } { dup (Symbol) eq { cvn exch cvn extended_Symbol ReencodeSmall } { cvn exch cvn extended_Standard ReencodeSmall } ifelse } ifelse } bind def /extend_font_name { % stack: font_name_string dup length 1 add string /extended_font_name exch def extended_font_name 0 (_) putinterval extended_font_name 1 3 -1 roll putinterval extended_font_name } bind def /gf { /f exch def f cvn where { f exch begin cvn load exec setfont end } { f 0 f length 8 sub getinterval dup /localfont exch extend_font_name def localfont extend_font localfont findfont /xsz f f length 4 sub 4 getinterval cvi def /ysz f f length 8 sub 4 getinterval cvi def [ xsz 0 0 ysz neg 0 0 ] makefont dup f cvn exch def setfont } ifelse } bind def /gfns { /f exch def f cvn where { f exch begin cvn load exec setfont end } { f 0 f length 8 sub getinterval cvn findfont /xsz f f length 4 sub 4 getinterval cvi def /ysz f f length 8 sub 4 getinterval cvi def [ xsz 0 0 ysz neg 0 0 ] makefont dup f cvn exch def setfont } ifelse } bind def /ul { % space drop thickness gs currentpoint currentlinewidth currentpoint n m 6 -3 roll lw 0 exch r 0 rl st lw m gr } bind def /nxtab { currentpoint pop 1000.0 mul cvi tab mod tab exch sub 1000.0 div 0 rmoveto } bind def /nx { /x exch def } bind def 0. nx %%EndProlog gsave 2.83465 -2.83465 scale 0 -279.4 translate topmat currentmatrix pop n savemat currentmatrix pop [1 0 0 1 93.628 76.176] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_primalpivot) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 93.628 103.676] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (preoptimality) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 123.628 103.676] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_clrpivrej) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 123.628 108.676] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_degenout) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 123.75 98.676] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_accchk) s savemat setmatrix n 117.5 102.5 m 122.5 97.5 l gsave 0 0 0 0.176 0 B grestore n 117.5 102.5 m 122.5 102.5 l gsave 0 0 0 0.176 0 B grestore n 117.5 102.5 m 122.5 107.5 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 93.628 86.176] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_duenna) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 119.612 86.176] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_addtopivrej) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 119.612 91.176] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_clrpivrej) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 119.734 81.176] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_accchk) s savemat setmatrix n 113.48 85 m 118.48 80 l gsave 0 0 0 0.176 0 B grestore n 113.48 85 m 118.48 85 l gsave 0 0 0 0.176 0 B grestore n 113.48 85 m 118.48 90 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 93.628 71.176] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_primalin) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 121.128 71.176] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (pricexk) s savemat setmatrix n 115 70 m 120 70 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 93.628 111.176] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_clrpivrej) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 93.628 116.176] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_degenout) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 93.628 121.176] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_setpivparms) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 93.628 56.176] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_swapobjs) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 93.628 46.176] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (tweakp1obj) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 93.628 61.176] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_pseinit) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 93.628 41.176] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_initp1obj) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 122.112 41.176] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_swapobjs) s savemat setmatrix n 115.98 39.975 m 120.98 39.975 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 93.628 51.176] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (verifyp1obj) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 118.75 48.676] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_accchk) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 118.75 53.676] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_setpivparms) s savemat setmatrix n 113.75 50 m 117.5 47.5 l gsave 0 0 0 0.176 0 B grestore n 113.75 50 m 117.5 52.5 l gsave 0 0 0 0.176 0 B grestore n 60 95 m 92.5 70 l gsave 0 0 0 0.176 0 B grestore n 60 95 m 92.5 75 l gsave 0 0 0 0.176 0 B grestore n 60 95 m 92.5 85 l gsave 0 0 0 0.176 0 B grestore n 60 95 m 92.5 102.5 l gsave 0 0 0 0.176 0 B grestore n 60 95 m 92.5 110 l gsave 0 0 0 0.176 0 B grestore n 60 95 m 92.5 115 l gsave 0 0 0 0.176 0 B grestore n 60 95 m 92.5 120 l gsave 0 0 0 0.176 0 B grestore n 60 47.5 m 92.5 60 l gsave 0 0 0 0.176 0 B grestore n 60 47.5 m 92.5 40 l gsave 0 0 0 0.176 0 B grestore n 60 47.5 m 92.5 45 l gsave 0 0 0 0.176 0 B grestore n 60 47.5 m 92.5 50 l gsave 0 0 0 0.176 0 B grestore n 60 47.5 m 92.5 55 l gsave 0 0 0 0.176 0 B grestore n 60 47.5 m 92.5 70 l gsave 0 0 0 0.176 0 B grestore n 60 47.5 m 92.5 75 l gsave 0 0 0 0.176 0 B grestore n 60 47.5 m 92.5 85 l gsave 0 0 0 0.176 0 B grestore n 60 47.5 m 92.5 102.5 l gsave 0 0 0 0.176 0 B grestore n 60 47.5 m 92.5 110 l gsave 0 0 0 0.176 0 B grestore n 60 47.5 m 92.5 115 l gsave 0 0 0 0.176 0 B grestore n 60 47.5 m 92.5 120 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 45.4366 96.176] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (primal2) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 45.4366 48.5354] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (primal1) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 77.3726 128.957] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_accchk) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 45.4366 128.957] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (forcesuperbasic) s savemat setmatrix n 73.745 127.76 m 76.245 127.76 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 45.4366 121.176] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_setpivparms) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 12.5769 96.176] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_primal) s savemat setmatrix n 30.984 95 m 43.484 47.5 l gsave 0 0 0 0.176 0 B grestore n 30.984 95 m 43.484 95 l gsave 0 0 0 0.176 0 B grestore n 30.984 95 m 43.484 120 l gsave 0 0 0 0.176 0 B grestore n 30.984 95 m 43.484 127.5 l gsave 0 0 0 0.176 0 B grestore userdict /#copies 1 put grestore %%Trailer %%DocumentNeededResources: font Bookman-Light %%DocumentSuppliedResources: end d_sv_obj restore DyLP-1.6.0/DyLP/doc/Figures/primal1flow.drw0000644000076700007670000010623111171477034015230 0ustar ª» €•3€ ˆÈ sÇH6eb P%Ì™2SÒè)ƒBFŒ.r°q#‡ )XL3›0y˜¤³ðˆœ7uà,lH Š r^Þ™ƒBH!K‚H‘òäJH!rê̱Ù$ •"RŠaà 8X¸D‰" )B*òÆ ˜rPÀÉDf 7\ÔØ8C†\±m»ÚÀ¸VFÝ»aEº„)S•2xX"UÊÔ)T©T­j˜§ë×À7ìÎ!ƒ† 1XÄ\umiѤ%ûQÀã5>xPy„0lÒœq{H'O¥€À­›7¾0@Ð #&6¢PžH¡’䉓 L@Œ–‘¼dìÒÝá4çáFL6éÄn„yôeÔóð bÌœØ=ß¼YÓ&Œ›õ™[e‘FmÆw $—œbœ4Æ"ÔdžøývIL€'¹qF•›WÐßkÄæl  @F_QGn¸F <”ñ>(‡eØãrt¤a¤Ša¤aŽþQ =þd9½!DŽñ†‘räÁˆÑ1D†ÑÆ8’¤XIÈÇlT¶ØR(4d¥a5W^%o8I‡Jg¢@.ܰw’å`ƒ 26Õi[U(fš±€Ã¤›¥fšd£ÝºÖj­½ÛlµÝ–Ûn½ýÜpÇœrÌ9tÔY‡v”†÷UáWÞyé­×Þ{ÝΗœ}ø ¡þ8†€<h ‚ 2è JH¡…ò€‚†z¢#–袯1ÎøÅiôÇJ¾A>©Àe 4 †Nža[r¤ÁB;T)1Ãv8ì^sTrÄAÆDFd~òÈeÌÁPLQ„ÉAº¡e:sY`R’QßgÎñ²•W\ÆÅ ¸Q&GbÙ1Ð Üvs„eŒYæ™i®Ùæ›"Å9g¦2–§cQ­j•Ÿ­Z&¨H„Š(K5œ†C¬9pú·\,Ž+g„÷}¸f)0XL ‘ªØ©í)÷Zu¿Ò[qÍUƒgoÙ€š®‘­•ké,ðú⯴}œl±ÀA…lq±-»ÜxÏÑmu×e·µ<€BIÚ‚Ÿ·îq{¼¸õݧ¯¹ûõ÷_€x`‚ë.|ƒÜׯ„Žqa†NlØá‡LâCÃ(#+ì$ÄPSl1ÆY‡,¢Í"ƒ-vbd+ƒšØä7)Nr¢“(÷6Ë•Žn”±[ãòf–½uE“ª g:0ÊQI&s—Ù\'€æ£Cm•:Ö¬N6­íxà›Ø ‡8Ä:¶˜…»gM‡wÓúÝð€¼)/6Û‚|Ø“<1žh\ÎËOôÒE½vY^Ù“W÷"ô½{‰/_û*_¿Ð¢€±¯Wî3˜“Ò@8ÄàEô“˜“΄6 §€ d’ˆC1®Á ,+’‚M-IFúŸ™Ð$@³m P›gX9U=0+8¼C UÁ•\0ƒs©®HB]vðƒs¡ qÙ)6îq…‘+èJVEPs¢‘0ECÏøˆ§;ÍI§:_!1XP4NÎÚMñvÎÒÝ¥å;ÐÇ;]üÊ‹§¼1~«žgl^¹Î%=u±Ë]׋×öæå=ðá‹|æóWúD´>‰+E+j ƒ„:ÜA€k0$"¹2¨A)óäÅ”4¥ú ajk°dÈ3°eb8!óÐI3pÍkýCÈ"é†N¾æ“$ex¶¦-l»S+ãöÊ?¹*‡x£å¡léN½E„5ˆÕUq•UÂ]¤s¢Ukй:î…É”¡R™ÉTg ªœk pà™Q›¸"b7aóM×-qœ²+§å‰Nä.:ë쵸³ÅkÉó‹ä1ž=Ë.úëyüd㺪÷.ì™A{óz zG„îñ_ ØDc¦4˜!}M"ƒ4†“NñÃMK_ÓÜÐ!\{ƒåHœâlB%%QOiÔT"unKU[çËgBu–z£* fP¹bu;›ÁÁwUÙn»Ý5¯Y‘9µ2Pº6Äœu总8˜AV²IDþîʈÞ–_£Ø'¾n°É)ìawÇÎÅOx c¸È(Ù|^VèšÞfÝØY†–^£µãøôůó¡Ö]]Œ†±$Éï·³UÀg/¦¥•µ¬hµE)GÇ0†: d 45ÁÒÜ`†4È¡ \s)ËÒÐÛ™IJInÙhÀAÑÌ&k…ïå øVY’Å,hé [dRðŠ&,3 î›Þ4+ /lî% ʪæ2«;e5+¡ê”«Ý$K;éÉO‚2”¢å½5Üru»Õª¸nèÒ—°„3®aé%rø”KIeTÒËÖV÷Uv­m‘|ù×i Í›e"îM½ZÍ6ЪÏÁRgI»9/A÷* B¥æÁmfé?ß9 p`ô¨çÅ颺¨ÄÂÞ¢;æÓ•/£7W_,]45ðÈÒ÷KÄm¢îÞ}U"Øû»ŠêxÝù`/<² _¸žÆ‡÷³…ãgå(Ú‹”Äz4ñBQ|Fˆ²L¢*ÎßÖ`Ö5å´ \³ß' ¤r €Ê5e•ñët‡Ë¼nÜÍìó¼Ä@Ü5Àå±õ2VÝ û„»dÜï­ÊKc [¼»æîçJ|áKÝ»\ÕýzÑzîÉE—Ônýæ¤ù‹ˆ4¹Á¼ÛžWn˜¯–»8énà%Þ=ˆÕ{;[p¿Ósð‚¯,÷¹F ÿóžZÜÓxu„qxTb ÕG Õ>A’[ŽTc6‚IöRL†¥wz£4eEee5±LZVjì&³lµçáUduÂv{(HgÏnßç|¶Ç‚›a.h{´K7ˆlͧ‚Ï—ƒ¦“‚Æ6}æÆ­vñ{57¾F{Âv‚›¡^O(BRø‚œÂGg‚§ÁL÷|C·beuȶ…_!†]ñ…åµl"¡L®_ÙMqe_:wÕ_zu~ø6`ëçDü¦,çôo –X{G\dp÷7a÷4x–Ux™å§xHP!f€¦%y èq#R zœç%9ñI86©×rÄuÔçuÖGC×&vÚ'70Må¥~Bonwp—~‚µo‚õ~—wX4}÷X'aË“˳ˆüqˆ€6€ æx¥ywb ¸Zïó’[jcD"I"“ãSjTFB%œ—$g€dÒS(ã0¡'5#U¸2jX‚\¦'ŠÈ\´6Ð¥Š2§„Є]µ”jÀg:X‘^r• T^`ÅÄ4Bd(}¦X„lˆ„—ó†Påm1f7~¤S‹ª‡q—‹ìׇæDX€p¿è`OÙ‚p—ˆú§O˜ÕÇa·xG€¤•qÈq©õG*怸d`Ѝ·«g„Ø†Š¦‘½f$¨f9g>ˆtWˆ•Æ'u¹à¶{{!±ƒS·…4¸{ÊF–aÙtd˜gÇtŠy}«(•í–KñòV‡¤co$‰‹úv’»ø‡x-Ip…h2‰4yŒûw“ʸa‰€Œ÷ŒøxwZ“W*lp”0e+·\Mùrˆ}Øfj"Ø„U)u™–@w…°é•[(2(cÙP¨–µi–k©›·y–l —£â^t)sv¹96ÈC#ô¹Ç—õv‡U’ÆE`T€’FEðÇ`W-/iˆ‹‰ˆ”å˜6‰a‡'™ÌHqVP"v€‘—€÷G#Ä$,€ @$tàcnš6ù¸”,·åCs a—œ+~á‘{I‹å÷v™D&ɇƒ©’…郌1 xŒYžòŒ™žÿ×aìéŒîI‰Ò¨™—H”ã$Jšœ5ˆ£GJ™ʬ÷” ‚cgs¬™sjF º›jö…¶i–3°…Ñ•y¡¤3`–DTz…Oº{Uº¤€k¨iohFh vhÇùz47#˜kášZU]˜â†f¯æ¥6¦b*m¶f¦š„iz]klRGu(˜…–1VÆÄly€i²¦ÑVkeZmgê§ JS•jÜ×Ëù(°ˆ|²dšxú¨dJmP ¤­È„Tɦ+¸•†g¹T†‚¢¨Œª´6ª·ö£ºV©t©,±U}«ßG†ä†Š§Y—ªÙ)rÕUµ’j‹šo%˜vG˜Ý)ˆÀžŠé¡ä™p"ŠžšU¢;‰w™Ñ˜™–8Ÿ)F0úÉŸ&—%r0šªçr—ælš§Jª¸šš!U܆_i›±b¤=ºá*´CÎ,Š®ïœÔ÷!ÏÀ ÒL-ÒØÈÐÔC±Ï~Ë Í~)ÐêGОlТÌ`½Íš+ž: Ίè¶i­ž¤+®>ùž­ºœ¹Ërí­;Ú”xš÷ MùåN6 íNØ´²-MØ‚UÐ]m¹_Ð6Í¡d­Ê; º ·@+·¦;ËvûÖ×¾¼Ô¢}¸#:Çšv}­ÚºØ®=ØY½ÉÆ!Û3]Û5ý7½¹¦Û-Γ ®A;·CKÔµlÔ$}Ÿ- RÛ\£m¬ûJ'¼U1Ï<Ý-`Zm\ÝÙL³ ÝÝŽ]Ö ·Û=¢¾]ÎA}ν¢çZÜ«ÕÞ>@×Í”S«ÜymÌ­¸–޶ سÂÒÔíßÖžØ ¶ÝŠ­ÞüØfÎ’-º”½ÖæÝÖÃ=á««bŽá ߊœŠìᎌ8_!â>7WUWí¬°]×9Û~¨Ý¥ÌݸýÝ}Ö¡™ä ÜB-Ü™mËëÍ äðý»C^¬Èy¬o!þ}$ÞävèµÕýÒ+ŽÍŠmÛXã ý¡\ÞÛ¯ Ô–M·˜-áÝãœÏȽáÄ\ä¥ W9çÜÑÏ%.Øý~ÿ­âS.à{îâbÍй½å4ÞÓ6þå}Ù*j®‰¾ÙHÍèu­áòÍ᤭ 1ðÏ †ýÜÚÌúä™|ç…ÍØÍâ¤l¶}>ÖZ襎֧>Ñæ\чÎêš·f~ܱÚŽNäË­×p¥ß”‚Ò·—ßûÝë¯ ì‚•ç^=à‹¹ Óɾ­ËÞåýÛ©nè«^ÔëlÜJ}íB>ÌÚÞá‘~7Ì÷)Ï<–Ln♞‡ÁŽî´­î|þâÈ>Œàè >è•ÍÖbŽèÓ~Ôì}æ>ë¾íF‡&íTgÉáòîümç(ŽçNìÚÌîž­¾Ê¼]ñ?}ñ9žñÒNæúîÞ_¸iòoëúUB¡Ì¼nÕ¾ŽÕ/캨ç-~å/êï¾Óñ.è;ãÁÎ;ÞêÔN$m0r¸…Iá˜ÁõS#e$;€[Dr»D’d5vI™´II0ôGålަÅÛ¯œÁ ^ÁU²‰UkU»¾¤g±ÆÄìkÏd<•›ÇElÁøÌ™ÈþÞ÷V»¯ ^f`9çïòšžâ0óT_ìaÍÍî.ñ¤Ù¦îåÎþàÐ~ïéïÞÙïµj®Ã³ÚÂsüÃù§V½ZÂF\ƒ"”tCX Eÿïµîæ­fÜ5þŒé¤¯ðJN©?óžå®¯ì°Ïì²OïϮꨫÎp½Zš'"7åy%Çy¢w1¤§÷pÌùkÁZ‚]1ý†ê«+Ä !3NÈ*Åòac…LØÀ)ÉŸÏW*€«+,Àµp¶Žó«>ø¹í+Üó;ÆÓ+wQoûÕt÷é¬^¨k}9 ²Õ$ò7ï\¡;onǹº˜Q¨ü®÷Ý?È÷§$ŸrSJ'Ná&­’ŠN¡2CÌíÁ©ó¦– ¡Ú D-ÁeCô0 =³u0ÀÌ€“Öôœ,}/mê‘ÀªgìöÎ;ÁzáÞ?y×àÆ{cN½UËðÓ5º¸á 4@ÎÃà(t€L´8€1΂Ñ8 xÀ’Ä®á’DY°$¸Ëí.û¼þÑðëÅWMNÆnXé„4h’I†"F¾ˆ 1M<°Rí?«+€w ±I2¸B i“,œK§j%hn-äM¼°Qü¦Cqá熰*¼B³2ß& õ%’Y²¤“ªáè hæŽrq¿1¨úßñs£Nü­@6hñ¼^˜ƒƒè=:èÎV‹Õ¸\c ø13ÈÄà(·á àŒÌ6К»‚ÍQBÉ2Ã5„rÙš6*—’¨c}Þ- j½5ÈõÔZyûzîçÉÁù€ËÚ¡óx9P˜55F6ò6~?D ÒèO\x¨z¿Û³ž 4O,° ò<ŒíðÝúkg—'èy6ûª€Ÿsbø­¦T5ÅÎP1 d+èQ¤%f›ØÿyÄ+Š1Å<æm* +,XKpؤ°¸T„L“A@( nÜT¨'ÿ€d I=Ÿ¢A¸Tä fÆ/\>º˜KÙô^}Ñ,½…i¢XÿŒŠdÄb–—”ò^Yð þº¨ G`Ã+eðFÄ8ã(¢Î³ˆ`ÂõÄÛ·þŠ’ä‡v­Êp 8æ¨ú—#‰Q† °ç3Á’`ÌM¶QzÝ?Ç÷ÂÆØ3R[qåEð5‡£æÛUññùFUˆÇ„”ŒJj‘ÅSkÎ"H‹d-.ǶøáÌÆòM„Q.v/¥G¯aô‹Â“kboqlêñÎì¦ÆÑ Ô±ªatÁAѹ¾”ð¨ÌÚ†—‘ ®¾Æfó&ÞÖûŒ7î"žÃŒè)ÜÇ© ç’“ƒlýÃQCï:57gýÜÉçÀoVáì`?lH—ërÑBÄg =£Ïêz R4Ú>õç ¹@s¼O$ÖÇÎwÌh€GÈ‚¢cµI7r絟”“i2ÀÑĈÇ\x«qåϾAI)P¼O¹ÏÚe8lò ß*RŠßç!y»½°£Söó[-&ÈnHóÀ_“Äy îE‚ÆzÃÞÆcg1(®–½eIü`†\Ml@KLø°ÈB L @ œ1PàÔ™±dÜa„À0Ü…”Zb!(JFÉ…¨U˜”D‚ Ì€)妬WÔj EÇ ñÁhR)¤¥¦\”A¿d¾ _&å«L´’ ÙÊD‰+‘YV°oŠÏLÊq#lCí–¥òV2JÓ†ŒO½¸£2ZKF(¨‰j›R“Ò™@yQ¶³,ÁÒPfÊméÁPì“rX¨£á±hʹL—tb]žÊ‹)A¿œ”· !€€3@$p¾–û@J±âŠˆŽ€ea ˆþ ?Ð¥¶<•êÝÈŠ0))F˜Ó L}Y,Mš &“ˆ‚Y^W¨ärdšJ\Y)(Í£H™”7h’—‰”̔–2—\„O©2Ϙ•“fÎ9§*eÀ¤4šlà†œ7€4k%É䔎²S “I©%ÆÎ„™>3ibMåMœ¦Ê”—cà†²'2Åf£4ÒäÛ´JµÉØæÏd—/¡¼Ž0)ïÀI¡wóTæÍä…—¦(ºÁbŠ@¬@qˆdbP²à8wä¤Ô²Ø ¯€ÌŽH8•Ô²f†@:K§é<¥“]"³…)É*…,©œV#bNO©9o眒Œ]f̬@uF'êü¦Suö „^çã”Áf-ÔÎÛé9ñfÖ| DxJÏÏI3³¦£ä ÍrO2‘•¦ý”Ÿ¦SuPýé?ŧÕšÔmZPóéAm¨át¡T„êPõ);e¥Éô•ÆÓf*KÇ(4…¨Ö¤^S‘JMIj5m¨uŸRÔljR'jAŦ-uœ*€˜êRêI]©0§ÞÔ‚šRUêKÝ©6µš^TwªL¿(G§õ‚*ÕŠzN—ê}¨NõôÔpU™ª9­ª×tª†Ô¨ UjD…¦[Õ«þÓ¡ÚJ‹*3mšH•ŒµÊV×*œz«oµ­¶Õ2CW/B «l®ÂU¼ºVíj]­|5Q½Wùê_µ«•°Â©ÀêWýjbU¬jÕ°6Ö2óX +c=¬€Õ°*ÖÀ:X'ë]Õ¬–•¯zÖ@V3*—ç’Ѥ›t—.Ñ}ºO—é]¤;u‘®Õõ¹X×é¾\)›`=jØ=»h7íª]´»^×®Û}»p7è¶Ý¸KwënØ»vwíŽ]B›TW*D…¨kôïúÝÁ+xû)-¼5ðÞÅ‹x¯8¼+Uñ:ÞÉËx+o¯3•—òÚÓ½;eéi0Ÿ7ô‚ÞÑzE¯é%½£õž^Ó»zUoê]½Ýtõ¶ÞÖëzgïìu½µ·ö’ÑÛ{zs¯ìõ½¨ø²^×»{q/ï%½ÇWôrÞ²{x¹ª5%Ð7úBß‘ê|«©ô•¾ÔשöÔë}³ïR½¦Üwú†Õï«PBøõ¾Jüžßñ›~Ÿoøí©XÕýrßkº|c®b­êwþZÓû›¯ï5½¿ÛwýVSþ+ýïþU¬YÕüêߌ€ 0ö=À„µÿJßžJ€­¯¦¦õ·£Ö\M‹€þÀøÿr`j*J° .Á"˜°öT ‚S°^½¦'ø»`¸š€YðžÁoÇ` _°5µÁ˜àiºƒy°P5¦í´¬FY¾ nûªÓ%°V´>áÛ `uëÓ…ÂŒu ûÖ*,……n<7 ],Ü…ƒî½¯bØ SáûšÓªw-Ã@7°.Ù(ŒW¯ðm]²VX ËÕ9œ†ãðî±}Ø=~a> ‡Ý#lÅÃ…øÖéVB\‡õ°}]²m¸»Êa5J†ñê­Ärõòbâ¶z‰×°{å«kô ‡aPL‰=±|%Åiô bK\Š·0FÂU»Ê[ ,s‰.Ï]£Y×X\ìt™®ÑÝŶëâûÊ‹…®Ö°—7G]`œF•1ͽÅjïÝaŒ^‹qÐÄôÔšÖ!À»17Nº×t{ãn ŽË¯8ÇC WÓs<ŽÕ15Õ­èø#ÝpÌWãq:žÇÚ¸Ç㮫sé1^µÇI{Ô•Ka@A>È9!d…̲CnÈ ù!?än ‘rE¾È¹!gäœ)2BÆÈ y#sä‘ ‘é(I>Éù! dµ ‚@K~ÉÚVÛÞß—ì’kòžÃ÷×&Ûd£{“{ìLÖÉ0¹'sØœL“ƒråÉ>Y±e›“w,QÊMù(ïV¥ ”]rTÊŠu%ëR5úc×hÒe£]¹ïáh\FÃrýÊ^ÙÉŠeNœ–?ìåEË\Y-§bT|–å2åÇ9,Ûå3Xµò+úËT‡®æE±(Ò1aÌ€0Ï™Àü—iá`~̇Y˜$fª3™_‘Ñ…Ì8À0?æÊ,^*³cŽÌ˜Y23fÊ<š_h^g3sæÅœ˜?sh̬™1sæÓœ™1óá-͹4»fÚL˜có_ÖÊB çá,¯p>ÎÃÙï"gä~‰q&Îõ9g2Úœ—srn¨ÖY87g霣svnÎd4; åÌ·svöÎÒ¹:sçnŠËsøåÎ%· jåi;n—lX¦Ï$–Ü&YX;bë³»UËøyÈêç ,Rf±÷ÙÜægû¼Ÿ´€^²S@;è; =ì|ÆËø¾&]gÑÚE,©ëi[´1Ñâ5 Ãb¢º„;¯G­ÀÔHOS!-M‰t4Àê6Há"½¤t“6FúñNå܃ip•ÎÁWNá`8%„©4öÒxG+áA룛¯SmÎUMGU5}¦ÃoU¥ÎnzMÇé6Í}Óôœ^ªày¦Êé:½§¯¯æÓtÚOGU8 ¨ñôVªÍY+óßñ̨€ˆÒ÷·Q7jH Y¡©¤vÔ”š°^êñœ©_ð¦ÞÀ`zH+ÖM ¥Ÿô¢vÔ¨úQWê-]Hu”ÖÊ“x.[bh«Ñè!Äé¶Ïê[«ùòf±½:—ÊaZM—}µoEĬXVgâ2J¬“µ­þÕV+']¦;­‰nµö¹×šæ&Ý­‘.µöÖÖ\wkë‹k4¹×çz\çÜo®µ5×­Åêç²ëuMtau±6£Áú+äë–|¯õu®^ËlUWeeÍ– vÀ&Ëû:a÷k~í¬õ²ØûY7l3ª•a&½Øccl"€8¶ÇvfB „쑽]Jv“J³&»dl‘Ͳ;¶ËöØ;f_ì3+³cöÇþØ,{e ”}²OvÊÖÙ-ûfwìš}±5v̦Î/ÛeçìœÍ³·‹ÏöÙ@;d'm˜m´¹1цB›c¯×¨Ý´QöÓ†Q{®dí -tÓ¬Ù6Ûñ·š>ݳ}¶Ó65Ñr–m§Y·=M×¶ÜžRÕ÷m;Ý»=Ì4ùUÛ{ûnÓmij·åö›NÒu;pî¼=Mµ2{Ü;ró±jH¹+·å®†’;s?îË͹)·æ&£š»swnͺE÷å&Ý™{÷šn˺%÷êfÝ­rwnÕ}ºc÷æ~Ý”»bKÛ•È»ßB˜¿;xë—mëd{wïÞÈ;xï»^·ïNÞÈ»+we罡·ò–Þû™z‡gë=¼±÷…¥ÞÈLx_ïåíaß‚ùæÝâyGhï½GÁ7÷–£?Ö/[_5JVð$Í‚Zzš8…FßjE}«‰ô"`i#°¿kÀ6£z5ŸêUa"Àip‡«b…°:Šû«X8oà ÚžÖ:êƒ-¸màõÛIóo>À 8œš¤œ©ðÝšFó·þ¾ßYЪ®\5*­ìʵ²‹¹%ÿ —ü9`@¼qÖbº0+úÆ^(/öMš ln\^œÙÊ=´Y¼ÜpLj™=mBÆá‘L‡Ëî’xßX:Bœˆ"ŽÄßM~iRLÜ8ñ9CÅ¥øvÁ¤9|ŠÓÑv8-ìâFÊŽî…0ÞÄx™ÉC ‰/qLªÆcÀoãW‹»ñ-.V„I±_ûq!^Æ¥Égâ9àŒ³ñ(nȵò5¥º <ç~òPNÊ0)/åÖô”‡òQ®sñ2*¯¦ª”³òSîÊoî,å9w>‡ZX+c¯)/ßåÀü—Ù_b}y0?æÄ˜s kÌ“¹3GæÐ¼§>ói¾`¥õ'½£o¡3hóžk¤ºyg¸æà›ßÑm¾Í½¹7çáœ]rÎÍÙy:GçãÜœ×\v.MÞy:—çFjÄâs{Ïéy5¡çðÜžãsÛ„Ï×k@ïçø| tE=ª‹p§†«EXU‡j&­‚@Dèoõ¢›ê†¾ƒAµþÒzU£OtÒúªÎÒ­Ú¤t#ÀÐ5µJ׫@¸Dê—Wc:’é0Ïô|m:GÁ½¦ëôŸ~‚{úPwé<½Rût¤ƒº né%=©Ö"¨ºU;½©oÖ«nÕo:M«\½ªcu¢n‚srX—éd½u°.Ö¯zV/ê[½­Wõ·^Ö•º\§êt½›õ»®•™®WFºkÔ¯seÀ®FËõ_×¹èö¼\Ø;Y†ËhT°ŸežF%;ÝÖ[9²;öÉŽØi¸˜6­Ç–[ö3 Ùéf¿ì”]³ûÜ·œÚM»Ï]ì87±¿öÇÞÚ élç쌽²ŸvÒþ®e;Í…í7wVl;Ø;{ew¶À+°QËÚ{dGîÅ=·wKÛ{#¥îÑ=¶vèŽÚ[yf¿îC6¹ãÑ4Z± ô³eКzkÝóm¾4е±þAgoöÞs£.}÷.:Ö¼YfÞË·z·Å÷ݽSØl»céèî¦ïëÝywe­lß|2kRéü+ÀXab´Oˆ½ðs"¿"5Îáqg þé! H<‰µè<Ô~í&å [|†wȆ<ÆCÎj|fˆdÞÁgAtI'üÕ¶ð0ÃûB„¼áq@‡7;!Äÿs_â¹C„DZttÅgx?䲌—ñ6ÞÆWloùðâÏíòá!sf®Ð=³C^¯`>ðyy¼(æq3™èfÞʧùý>ç ¹†wó Îëf.¿æ¿üš÷È yÌçyyŽ›oƒ_²Ow?]m›è¡í¢‡Ð  ÑïØGßc%½‹¥ô,n+z§Ëè^èÎaiìC}Ðýô×ø³Ëb˜K‹«²A–FÖËz#@h½­¯õ³~Ö×ú]Oëû†¯+Kù%ÿú_ïê»i®õ·>Ù{XÏëwý°ö®þÙ÷ Wìs}7mö¶~Ù'{gì‰}°—öÁÞ%Wûqí‘+4ÕöåÜGûnìµ²~Óo¶)è¼ûÀtfüŒÞ¾üÝc ‚ÌVgÐ ö>y_Óyï÷;Áß÷ö>à{kÚïë¿oøûàroM¾¼ï÷¿›Æø…¯¶õýÃ÷øü>àÿnljñ¼Gøxï÷|ïïù=È—øFycS{Xk¾Í¿ù8?ç§[Ïó{¾Ï·ù_øç ý¡¿ó‰þÏ÷ËU5é+ý¥Ïô›þávúP?êK}¥ï·§¾Õ¿úK¿êc}§ß×ÿ†×—&GWšˆý¿áh¿þ×_ºf¿žwÛ´V4zeûN^ÖŽ}±öç>·•±vì#cO›÷Ë~Þ¯ûfÚ²ý°Ÿö_­ÜOû€ìÃZ¨¾W}‚ã=¤CþÉïròãwü‘šòO~$­ù1ÿ¨îücݲ^~ÈŸùG¿åïükNþÊ¿YWé×ü§ÿòßtÐû)ÿëüŒŸ­‡õœ Zõê]Ÿë›µ÷ÃÕðüûy?kë\ÝøWÅzÖë”öýÂ?®žuå?W™ñ¯Ô•Õ÷OÿàWiþò­ÇüèþÉÿ²¦þy•ûÿ½ýkû_áÙŸý—ù¿þ ëü·ÿç_ýWñ¿ÿõªîÞËf”Y—éXu8zXoHÚ)€Ä›^f–RVÜxÙ1€`¨b€ÖåÕZ€J–gÇScZhç†ÕR¥.U¶QÍt·K€¶T-§ÜS, ØÛÁ€µÝWP±‘€ (úRßݸÚRà.eà倨T¸&Y`˜ÖpìöÖl5ËÛ'çd­oä›gMUU RÖˆJoZà8"nÒ”ZSŽ›Å&‘rD-$´FJð7Ôr`¥@ë‰lwàx&î{`hOù±^~oæ[`¾r."Xcñ}màßЊEšA¢ãÙ Q ÞF@ gO‘xÑÔßÐ Ö3ÀÊ ®\A€Â×’™‚'D — Æpàè†gs`ˆ­Dã-Ȧd} æ*qƒ !¸ù‚1€"¨:‚W+ J‚‘ U ‚mFÀ‘ b‚œ ë©q£ X ž‚rT)(Gùe·G7h;1]Þ 7häƒ\`F2™Ñ…žƒµ98ÚNð`7È­Ñ\á <è–ƒë :Ètåƒæ`‡×áŃñ`¹VÞ÷ ‘ÇêƒêàAØúƒTÇ@„·ÇÔÅÒzü`:èsU„ ¡;8ŸQo: Š¾óñ–r€íÛ}¦wô](ÖJxÅ›IØZX÷ ‡F€¡K¨~X7`Ey<ááö„@áO(ö„€Y¶…HaP¨ …E¡N¸RA^ÕR(&…HaSJe^RÚT¨R…Π|¦êXdWÌ5ïÍ{ _YxåÝ{@Xçš…l¡!Ó…ýžÆ×š…1ZHž…xa¦„Á…úM[(^yu!_˜æ…o¡]8ú… @`hÎ…gaL—¢QUdx’e’aeX>\å—exN¡\à”V¥²t_aÆ|ÍT+©Fp¨áixk¡Zƒ—i˜¢†«a|†P‘Q®áih[˜Vk˜ª¡j·ámFg»áxF½†ª!nèS!Tµákø–†Á!qˆ†gÆ¡nx©õ†°!nˆô9U]u„UUÙ¡q¶j]¦Ú`Ü¡xè’‡QUDG¨]_1]y¸ƒ‡,˜{ƒåiíazhr_Žaã X W┎˜ ÀÜju!ˆbUp{0P ‚X n ’’Hà VYEp ˆ¢/Ä :ˆ¹‚u!ˆ£ÁJ|ˆ]A£`vˆv'„"~©ÍŠø7˜M "†È]Ü]‰ƒÈ]d8@ãr<0N$M@LÁÁ”5‚’@Ô.nO  ÍO¢X`$"‰ƒŒ‚ˆY@@$J‰!’8èpÀp\‰Yâ–($Áîò”W¢ðKBðx M"šÐ$˜mâ›(ЉdÃH|q"E0¿ Å M3æ€Á u *\àKB0Žü÷¯D(SZ!óFL™3\ÀQ£"”(A% 6et€xA§ œ0bäˆÁF2cÞØTYbˆœ2a輑#3É6aÜ!"'Ìf–‚`ó¦Q£Hé¤yã†HÒ˜ ®”!bJ8 bЈC :bà!ŒD¡„9SfŽÌD…t•šÆÍÅxdΈÂå8r€¸QQ"oÆÔiSÆ 'eÖ®•R¸«œ1…e¢8+5ÅçУKÓ™R6iV·®ó:6ˆÙtJ“±½²ˆÔ!BI›ž£`N;ef’ù2ÇΗŽj@”Á3 2eÌ(PPgN9dÒŒ¡3Ó)T©T­‘O†ßóü×ÑpÔAÇz/ˆž ì!Fcl=Øž—ž/áxå]èà†/aD„fP˜•i">Èa'îÑFk¤G-’(ÅÊñgå¨Þ S ác„“N£{t¬ˆ#.yÄ‘eÐqFUy0ùRDHGUn<$•$ŠG„l„ÇÆUrœ!†—jŠq›n^å–at‰æcD(šØ)åålÊ•{p$…†—)~øFŠl°áåXjÉå¥rD¸eaJuéžZ‡—‰îœY¾ª™®Z†o4†ê{@)ë?Ññ蟶aoê*°/¸!«w4ê«—nàá x¤¡^vº‡Ä›mªrÈj(²qŠ‘i¹Aq%‡—¤æŠÆw°KF¦d„1ǯ#9Çš{T;·Å¶Ên»ƒeµš†àpBìÒqä˜oÔÈäJ&•œn€0u˜1¤%A„‡3ÈpmÑe°1‚ïeLÇÆÏñSBFHQD „4Òƒ,—`3ξóÌpÔÜF’Ç3Ò·…Ï@ MôH#qôÐ €ÝŵU_ Ç$Oa²ÃH·¬ñ{» 3 ðJ†¯i ´ýöÊrßLwÓwƒ€FiœÆ‚/XýÅ’¯ ‚Ø^háJ;ËôÔy÷ŠF߀WnædÇ·yÜÏÍñÃm(θã›ZFÖ'%ÇËhÓÄ0îYï^m•ί;ï.•@’t”‚¸Éa07Fß{>ÊÕR:$€³hˆ!ÆxpèÆÕ+ŒýRñÍ7ôë–>}„ÑçâúðX`cæG?ýüR@È0 €O|äÛÊÂÀ–2ÄA€{@\À—¸ô‚ç›ß3ÕÞƒÛ€ðèÃ&â­³'<½EšX¡¹®œ,ÕfžÆØ!ØWÃ]å|EÚ˧Þ+^R:)fúw{rx­‰/”•l_¬“ž;œäÐóLjit›YcTÉ@œ{®‚R¸9†e1°¡Ùáê§J3âe«6ÃQâÐo;‰®àpÐz@¬`1Ô˜Ë/ Ë„è0³£ 3â"›xÅÁ)ð²Žd/hô/©ÅpïQËÍÕªer«²îªIáÙa-¢Á‰Ì< Ád9¡_¾³sšæÿ®Í¥2éÍW>ÇÃ͹»Íkz òeª©t¢óðao`Ëê  Q ¤OTØ2VåäwÉÌÒNñœgô«1Øà´&e»;ãjw{…† ¹KÙ¾ó…’ŽÂï=\JcŠÊ<˜ípÞ29mh}š¥1´!kØ/Ö½;¸aÂ/©û(Ãöµã½í¥1¹N®Åc¬=}XkZÂç,öapí tïìl½ë²÷¹g¼%Ëc~¿Î0Ýí¾ü¼§>·4ÎÒ\ýY_÷PyHdXä"ê²Í¨ìhÛOO¦éIá'ñeê6Õ8 ÖÊ.¸}ûâ ‡%ïB(àò±Þ®ëOƒ4nå&[²WÑ&"v¢u¢'Ç%$Hn÷B€Úó&[¡#g03å"“âRx³%ˆ1”˜ ¸ØIså%è#¨4%x‚/ù§‚3Ó&n®“3ˆ,P 3S¡paeŽƒÈ"7¸‚¨ƒØMóIˆ(ip„I>Jˆ_xðK{\×r(FˆJe` dÐ¥V]¸!julцê¡Vb;r¨jÅvè"JÅ,àƒ‡Ö¶±S‡Xg,€hm#±†áÒ­rˆ†‡u´ˆ¬¢ލT‰H¬²O’؈J…(oÀ(Uh„×§!ö1va4ô?ôûdï¡3gˆ±‰Q†­xb{AÜ1#•ò’- UÂ¥ñ‹e0ˆ7Ðå‹YWÁ¨$l@Œúƒ‹Ÿ—,epD5sðc÷n¤1„ÄÕ;ÌòRBŽæ˜`X%b`/ÔØŽåHÃå<òHìx#Øè>óèýhîˆ)"R¢ŽÝ˜YþXŒ3‚0áHWŒ.ÒIÿHÐd&ó<<ƒEr>Y§Oâñ@Xä‘p1‘g€t$Ä%ŒÄ0.Ä, Iky„ â^ В鈓7²DµDÆå“g}„EìÅ^””ÕmÖ¨B©0%r#NðŽ"éö¨•ÆE•ÝøèŽãx…aM\Ñn¶ŽÌH–RQg “H§2õ“[™'ù‹*©Y:Iª›E0¡G¡3:¿YÊ3Š I£F:šñI`£ :Jè™>Z¡J”á¤EZ 4МN@¢&*¦ùJꥭùPŠ£Rê¥ÜùW ¤^ª›OÐ¥rñ›O ¦FJ:Iâ#Ÿ'MZg1U°¦9Z 5°¥U§ʨÍYvZ¦™z¡5КZð§dÁ¨Ü…Z੨mj¨ä™©ŒŠ ƒQj¨MJBúT šD›zJ«[ "Pyð¨6М°a´jšHµ*¼6К—{bñ©ÈÊyP´ª›‘æM´ú›î1c᫚CcPCÈÚ¤qP?R¡Žzè9®åJöf° 1p[zu‚·ó#ð*¯7МöêR:s®ûš®¦ù¯2£Ol°;´“®ÊšéÊz–®ºùíÑÑéú›Êa/£3¯Z/g@Ù6¯M ²"뮡¤è5»“uÁº1kQ 8°¥tpŸØï1#‹ÍÙ(UÁ'#³¦ÙL•’%2Ûšìš{lÐ2ËI»öæ´z¡›Q‹² û82û› ÄòI «3F(§zѤ,›Ÿí1vú𸉄·u,«³m»¥ã *ÛÊž×¶Í)Mm[°®j¤9€¢!£:Á¦ú :¡›·ª¿9#c¨m‹ ãV¯êYÚñ#¹÷²öùJ¡rÚ[J…³-›m}Ñœ Ú¦©¢ Ø¢}Ñš¤;®$´1ËhPŽAB£ Ò¹ºéФëS}ñ›žúy}1¶‘DZۤcàº,jŸ1€žAyµ "<1HQ¸<£½ÍùfiÀ lú Úkšk?©ÚÛše¸ÒËip¦Ú«›ò1¾7º¨Úû›Úºì«3Ñ8ð«½MÊ’$luöÙ3a±n€±¤¹¥¦áR&JšÍ¹@Þ»À¦ø¥æËš3‘’þK²9A€k¹¬‚J¢¤ù›ìãÄ Œ ®8Àú#ü½üy‚T1[š[Š$$ô©¥ÙœL`&÷bŸÒ9O Ä£SšiŠÂ3Àì3P¢!+L̸U3"Ä+¤3Qô;Z‰[>¥Ù¤u ªç9Æ]Êš[ßû¥3‘nL¦©ÇkŸ4КA@¿4Àñ…¡3~̸p›´[±èÇCÊ7¬‰ 2KÌšMú‰–ŇqßÛ¨3!²3"öFÂ5зäw…ŒfŸ–:Y@¿›:Tð.ÃÊÜ™%£³ž$‚™ïùSm0>xšº<$¼¼ ‰E&ä]¹·2!%‡Y•t`– à’ÇÁ™ž¹Ž1—+i—}Ö1`ÎÃåžè±ØLOʈ’èáŒÖè“$9 (ðËÁÜDÞì@àl✎ä|ÌšIÏÂ7sGŽu®ÕeaÐu`ˆ×NŽZGÓtÿÒ-­rm¢á$-"MrÏ-æÈ­¨õ<åÓR¡‹MäŠ(n;öé804`³Ù2€çzÎçƒÀÙ1~~9às~f"£^†;ôFk4p©Å)sé±ó¬˜þç³JÃéG¬é¸ê9PM¥ œ²–aê¨>Š®¡„(l^ÛF@•”né³9ê³I5È®Þé—Jx¬ÅÒDüRD54qå|‘ç"1[å2Wàê¡-P9°ð¾c3ƒŠQ1£ÜLÐ8sîÞ0àÍYÍæû¾YÿÁåÿ"'  (À(@y@ŒøæåÈ)àÍÔ±Ôõ}4.Ä“ð ¿ ÿð´#ñ~Añ¯¯ñÉþò¬h¹º‘Ûsa0Ôåx>eÀ,/ð6p{!ó±³çnEófóQáðO:¯ó=ñŸñ??ô(€?õØ!yõ¶f}ôIåÓ1|êœaŒð®9`œ5›:¡Ô÷U¼ p÷y¡ŸãÄnçȾYóÊì àìŸò1K!íCíÓétß^Ú^ÛSçépä÷50îdÁ<¬œîr±îÝÕîïï-&ï„^Ûö>åj4üîîþÞbùð-@õ0;é¤õ ßõ8ñ/ö½åófÿüBïñ /ò$ï7»#Œ.c?¢òQ¿ÔN^G±#ós`ü\ï^ŸóËÏóÍOöAßþ/$ý(à0á>0q*YW»så0±Ý_¤Šé”áêÙ€¬wjÞÍûzaOý]¼ŸÇ3ÚË~?‚@Ø Åÿ<†À›^7`.`=grÀlpë@ô7ñüÂØk€e/úu×êErøo~Ù›ÂÀ.Ç(Ýozñ¬Êài\qª& Pá‰@ä‡ÓŸ \(Ðý¡=èÁ-æ@ ü7hìõ…1*`Ëó€sáÒ8ž@ðf^<~æ/ù=#Xñ ôS‚ðOþ½L¤ŠÄCkÓ'ÝÏŒ=.øY ßNð‚B ž?åWËà<ƒ@ïý­@õ_€{œ>„?Ò1Ï"u=ð6¾ÈH_(9T•pØ9¾:gìj²Sv”ÏòA»Ì‡ëâ^ç³vå‡w°—ÐwIîÔ¥ÛTµeÏ¡¾r—½ÐÝ\h}]nsÀ¾wçshŸ’(tàCà>}÷úì{mo=´€dUïÞ,{p öÁÏü£~%)“UÁý, ÷;PàâAHIàÎ;‚0¢ÁA¨݇nÈYߤÎ@Dˆä^*¬{ÆÈï;p¨| Àxo6*Vó^­JY2@Φƒ¸ ‹‡Š|¨eòÕQ*Há´«‡§PÉÝCзíìH®»t%ÜÍ«Y¨úÎëûc¹0.ì;^ïļ†{ïÞuÜ—ñŒa”K†RïW…Ãâ÷ G <‡~Ðù©Ã@ˆö°áh .ÄðÐ ¯ º ‡âüùDi©áP´†ƒpÝ 'Þ¢XPêzÙ¥2¬ž|€ãp†Á"8 ÍàUt€ðïoÐ#SänÄ€XƒIÞŽi³é®3P ‘/ô:ZUw]ãCV…Q¾ >×ݬ{|"‚‰øì*âQ(…‰Å]»Ï· ;"¿3F‰±õq!EÍ-Tw)qº»^èk_½†øŽ&CÞw CÛ†z ìàñÄ< Å`D‡BÑýaÅòP@ÍB k@)2Å•ç y‚‚І*-êAßH­¢p„‹ƒ¨ö@À^Ä5°<¼™5ÐýlSÕ‹ŽW9Ar¸Í!óK‡×QGm(Œ°RÐ8л“ï‚ÊÐc°2T:éØÙbUt‹ñ±ã ByÔMÇðŽÚ ;èE{8EBÝ_ t{ÏP‘>¹°5¤·«ºñM/À"5!­sˆÇ®¶EÄeG/_´ÃŒ‘>x>óÓEŸ1 ‘zÜY†PkáIt}MG5þ‡–È\c0”‰ùN÷ÅÚx; ð#x”øÈ©øƒ"û „Ãqúœeò€r´‹MñN¯¹pð¢bO,‡?ñ=G,‰‰£xkA\?»âAìE~t oϪ«ª‡œ äT²:"H6)AÞ¹yg ²0LH¾8÷„Ç_„!añဠ٨ ŸÊ‘•r. )b\è‘>D9›]eÄ|—ñ"îE‰ }M¶óŒ¤Û>Ûèp@\}·%²»•¸‰ä û…¶6ÎDb¸ûž\mü}ÊpOîÄ)‰&©¢š¼’IPG‘Wô†XFx2L¶€@&cžz”ŠÍ²JZGB© ‰£ìÑ ÉB…ÇÅ'Ëãÿ3‹p=ªÅh(.e´D{›‹8äbj’HÜ¢ûMÊG²cGü€à²=¦I¸&ï%ü«“øÑ¥àIf2æÀ¢T„òeàºL9+­\|nkðEÊ]Bä%vû°xiBŽù)#¢è-TJDSé"-âG4ŒcNÅ:¾ìNÊHYw”i/W÷37aä»u¡®Òy»éë”æ®ë™ý ñ¡HOˆNJeå;•/2i†È~¨3i€fØsDSDMÊ6}&â£uGó/:MŘ3]ál*›Q2ŽÊO83¯fÍL•7Ž F¹à÷¼&šES.DP6³Âf¨L›ZóÒÉʶ¹6 §Ù”›)’n²Hš9 ñæâ |9“^Å:ÊÀüÞ©C|7@ÕÁÍÐ9ƒÝá´u¸îr(R§:=g5œT3ÙÕMŠˆ*5Ÿ)d•ÑUÂVè/'“2u²Ð_–ÄÓˆ we쫾ÞÉa¨$mâ¿s’Êð<·Ù#½”ð‘\JKèŽÛ{†°ûu–nþ¾å™T˜Î’aBK@ˆöðǸ˜Ô†zowø æ†<|—G:Fð«¼Ý C|’Ò5> ?ce| ó~6¾—95%ãìÄš6óvjÆX#[a·KV$2Ñ 2[)áß;Œ,qDIž‰0Ïçõl‹ÙÓa.HY>½á› Ú«×É7óCÑg½ ¢5”ÆŒ5¸Þ§” }ÑQ†ºËIª ߦt†*0²:~×?#ý‡ž2eMʸ€Fóž|eTD®Ñ0ZøR£ŽfFF™99ífå´™qFªÂWi# @üRœ³Õ:p+Mb®’º0„"OªÌû˜f ¥X4câC…#K¤å ½Ôd¨Õ G-á0Å‘SOrH6*LåB1U¦ëU)Sßô!…)™’3BP¼ÉK½]Üt lS¦¬èHñD$SN"òð¡S 9ÊiÊ:|âBáHP™G(Õ¦wÆÈ ª;M ¬äœÔtV&:¾ÙH‰§®|}’”5ɺQjU5Ž_ß@@:ÐåB\å€=P^NG“ZW©j¡ŒST[!ŸõŽ6†Å¼¢0U—þÅZ%¶<¥¯;uÞΧ¦Ñ¶"«S¥UíàщM«æͧ0rUòS›êOmäâÔ^À.Y1Òê#)=žEõ%ˤÚ<3)S…žo2LO))X $]Ž¢t¬½RªJISW¥ Å5PjÔäJgé´¥ð3¦âÃ×Z25]e ™Â´V/M(èö—&\£æu€>McŠ^»kãã®Ö4•VÙÙGigÖÜ|ûTV‹ Ú;I_ wÁ¨zPÛ:TYâ]¨Gõö9ÔÞQ5éDÕ^Ãõ¢~UŠ\íêaE¥l ¹ŽTèš0¥ja}‹‡bÖR˜àRsé=Lþu^y×òªbŸx%Mäu×TÚNgl(yN|ÆÐvÚb(Hì±QÎMÓZ_·©>U­ú•#Òdú4ýŸ›­¶¶¢ÆÛ+¬Q…‰Hõ’ÎÆû[Yh3¬žö¸ZI [.AÞQ#ê5ÃV:Wf…5¬eˆØyY÷©vM­4µ×°VÞù¿H„u²µ  U„Š[}¥n5¡Z6…ö>d\)j²Z–ÑU†NW2»=Q@c˜³0A•®Ñ2éU«˜—B”8އ¨1ªhv•¬vÏ¿ÎØØ¡Nm¬N¼ñ©S!µ2Û)­m|þOØáÚ+Lý¬Œ¯B6rY|úGQ¬7Ý{šÓkrNj:@èL-£3.0ÛÏy:)ÒœŸ$r0^Îiû:E¥°¥¯ÄÖ2j¾¸æô‚šå¶ÝQ†”•‚à4u²Îh¢ÎŽA@?d†l·ŸÓP-F{šM[d± uj§®Q_GM3`Nuæ4ѱÈÉ×lÑæ¼;•ɶ̀»ø–]³å·ÃÖߊ[\÷1IæÞ#|7€ê}J€ˆ¹Ÿß ¹U¯Ý愳J']ð¸9äŠ\wêmc§ä+²¨5Ô‰×!ɨ®è ë¶çºÛ‚oY®Í½¶Ë´œúº.ú9i.Æ··vâÙŒ¨g9#!½$kÓCž>ÚŠ+§,¡%ª†ÖHZÒ‹I¹,£Ý¤“á…‚YOëfÇ,œ­´g–8¸ñ¹î8-‡õ¡`uª‚Ø8‹?Ní‰Mµ qÕ&>`§ls,¸¡DA[Í@šo·u¸Ö×½XÒG5|mŽ5¦–·ñ*ºnûton¸•º³þZHØ7ï æE¼|opFÛÓûx[îÃű vV‹øD¯áݼRs¾zÞ¨{_%h’察ñœþ±XeS߀õºA2¡†]†:v‡%ƒU¡ö6‚„çU#-(´oíÅÝ4kD­Ýªy÷Ã&ÈJ{ii)Å¥‘õïâW$Û*÷,NÍ{¬ ÜT®ëH‘o$-´VöÐ6Tç[v¡o—¨iÒvØðûf÷.ÜÍr·ÿ=Uoyw])v»íé®ñ¡»Î™ß­ë7Ïê†~Êg+ȼò¯•2ÐÒ_ƒ IU"þÅÉË*Xþ»eýïÙ¨nUã] Ç/Ú ´C¯n“ÑW-*› ³mÔFQâØ›UÝ !5]`ù©uùÂÚ¼¬þum¦¬â})¦Áñµæ:Pœûo7î[wTãÙzÊPšn(±¸~ñf’†ëz#/½™º6sîºL÷^ç°ÖÂ÷”÷ÚLá›!I®é]ÃÔVzí;5|‡!o¹¶°–çÌsªˆC #¾ÃwE~ÞûÚ„ÏåõRÕYªÔtî=w„7Þâ‘pm3ï­Í™™÷”AÓL,i$¶šöÕfºMù¶7;CjÁ#Šw cJÔÒÊÀf6º.—§VáKŒN-±&D§ÿ3eÙâ^Üø^ñiíÂŘçþܦ«rƒî4®&:Áã‡ë¸@¢4Æ·¨î?ÀÎ-<‰÷ð…DVijQUgÕñ¯Û™ÕöÿE‹ŽIÝ5f£®X÷Jb=Œ7#á`$ºwa/è;]<øb@.}ƒx»áœº!»è>ôu‹Çd‘%2î·”sãÚ=ýÉ4_éåœÃõÍh+Qï(×Ö /ÓÊ[@_Ö ÉœWÃb#û).à[œÝEÍyÅŽÍ©NVó*+dyÜ1j• ŒTãåÏzŠ?ð4ýÉ Y:c.¬‘30ÕÝÀî·úbƒË6¯ ´öëXLIU°°L’ýwÑÚFà§Ce°F€ÈÊ/Äe!ÌQ‰cžD¿vÕZeÜYuiäÕõˆJGÎ+X[fX¶¿&ìæ_±›eÉn VËÈò^Èê;€á²&É š„.+W0wë¬j½³3õ*oF¿|Sm$ÓÕ ”îÏM½Ã\<År•%ËÖ,óÖ´|,›j[¦Ì38çÅeÌ\ƒµ'Ú»Ë/5/«_ßÛ~­niæv‘’Ö”HÃ<‚mò=Á"6ïÖD Q]ðZ^_üZf¹œ™íåyÀÙÄb`â\Ssk½$š—[Õ¬CYóA}Ί6_Ùéì˜mm®ÙÙúÒËÝ<—½s]y/f½Lžûò =Î1$j)5ŒîFbsËðy,GçùŒhësu†Ì¶y‡®]ãñøswŽ¥›9<§ßñH‹3i>ÏQß…+L× yäƒFÌBr’Jç Í‚í³D•¾·Ù“êgßè¡{s¨ÏKØ/†f¾Œ•Ís¾ 5Ë&eçžKpŒÎ­Œy£åÇ|Ÿ7iŽ&®•Y7_æþ ¢«ë Ñ™DçW} QtŸMÎNµL†&}[ãó„Ö¿ÍwJÛèèðòs–îÐ[úC‹U/MtpÐùD—ç}¤õf@$Ã&±j±i*+Bå3œnÌ5úBWéäa§s3žæÎ>ú;sæ ­E÷òj5Ò85Êe]˜‹/-캭9B¿æ7¥Ï2 •Ô7ºN»å6 öz´fæÓšSËTOý{ÿògt¦‡š6èöü¢SõýuÓ)˜>Gê¥ú‚oc¥~ËZSßê”ê§Å³ü,ÐEšP‡j*¬SW¸#ÖQU¿çc-¡“5–Ó°šNcçY „kužÎÔÿyS{f y­µÞ¯¾ÚËE§¤ïB¸sÑáºþëÄ\®Ë²²F×Ìú: ¼+-aÙ®»–Öþ9Dëj|ˆ­Gs™.Ô eÒuåÖt±×{U›ëý‹°}k³–Õ¸Z_jÞ<­ï*˜ÔbšýꋪŸS°~V¥zQ»æFͪ™/¤.ÙfWa?kZÍ›YvÄÆÕòZ@Ók!Í«É4¾FпúÙP  ±žÎVÕ<{dÇéW°#óÐn×E›Kïé”ú²—v§®Ø4_sN3æ)Û—HØÆWÊì'½|¬«Vª&[a?3Æ®öÛwõ(€9ÁÂJJ˜ ¸|6`¢J)-ÚS«ØaÈI*tú_,ƒ—hqGÓà–bµ‚\4܇{^3Jõk R,¥|š2×–0„¨jè8ÎÃô£{‰y+>_œXDê„OÌà±¼]Ȱ—˜¶ÍÝ= Çk3–Éϸ*£mŒSm6g Æ*gl'­|³Ï–Ò\;o{í¾Í¡¶ÑîÒd{bOV2Z»™.6€¹[#Üwì7ã1)V›Ï´¯ï8úº1²UÞö:[Ól­"Ñw&Û§Z`ƒlºm½íöl¦Ò±ZºPî-]Ã*uM©7†T†ýƒývãξð/QªÒ?&ý¤vþ´G;¥aS+º1&é^›µjÓ­;†ˆ@—ò>d§ØSΦÅ9F+5T ±C¢p—)_÷¨ýŽÅxsygen×QfN¸ÚäZdìs½ƒvd^†ÈŠKZî¸áß^ ç¬ÄŽhùy9ÿ§ýôŸ¸¶—.Æ8ŠÃhC bÜŒƒq ø’q=EÞTYv qP]HÛí>lu¡€Uijö'ÙMÜ:?ñÌ v?xáwÕ(¢%q\€º‹hK” {¨ÊNŸØÿ¹abȨ'Pt¿x•(€4ä˜^oæ½E柶ܮ&+ x§S9玳Œ•48VñMobG¦¯°™öX7šf¸ë¾È7vß×Å©I8 ¸-ßµ2 –Ø…øŒrߌe¡DÐu;u5nìHØæÏ€.ÄkÞÍCÓHhæÔü “>t΃ìT.ÇA<[ì§m¦cåŸË€*£z–â„ÄC¶ŸÑ€o;ñ¦º¸¤øõ¥â|2‹þ7œÊdtÔÜ |ßÕ$Á\ ¢4¢8‰¢Ç%º¸ÁöÀ›¼®¸C¨ÅÃt½Ó3›žjÌZª ŸóÊýœ€;êV}Àçôÿ•¾ä6em[ÈkµÞâL{Žkk×è#aé›*Äôê=Ó¯÷Ý~¾?ôýü®oy¥-Û£óqîE!/Æ#/]ޙӝ^,ݹÅm˜(>®þ½ú-¶áŸõóãq»6½8šÂ½¾8ÚMÇ»DámÐ=É×–™#[ÒçÆKr5qãr]™ËâVË4óaá{aÓeÎac û)šp¸45SÅ7Ù¡ifwµ²»n\An]b¿ßr\ž§m¨ígm¤<âÓ»Ml€¾µº oª*Ânè®w5ù L¦¡¤Ãl&Ìb¹"Euz!}—º¦‹¬|7`ÿ‹ª»ÇúCt›^s¯Oæ¨Í”©ˆ}]rw®©N¹ó€Þa]ûþÝjÝ9ZöÚýÝËb#FæPW±sSuªŠ÷¦t*º˜ ÷¾S¿·ró»INëï;ÔÍÚ_®N½¦~‡ï»W¾k>Û+Úiœf…¿®VßÁß÷þàçp3­–]˜Kö8Ìncƒ|³ØrÎÒŽà÷±‚ŸºDzž+ÙKÂàm€ÛâšzCg­ý³yTߤ¤ªCôC.Ñë¯ÀkAÓ®ÙNÛ½ÿö¿«£–Š’án¶wµPßß­p *$Ê­ŸùÖ Ø$X¶+qÚ^ãmû§ÔSGWõžgºIêªykåD‡™IµƒÆòιËh Сú¤vÖa~;oÀ}X±º ÙXÅ_,q…X¸#UK}ÆÿñÚnç8ÕÄÒ–Ú–“ùŒfýôïèû‚ôßÉÅw{xÅ茀êg*ÈWB­D T!“mVh¸Qº5¨2Àæ€k€ †a{( Z}`½ià ¾8[Op½L¨fŽ;xðPO¤®hM¨ƒ`H@5×Þ„ í@¸ö×~P¶½¸äÞÜûrïíÏ= Àݳûàîá}½÷Øû|¿ï<˜÷çô{ï˜÷èÀ <|ð ÐÛ>á¼}_âS|‹ñ@ÂW °í €·ø€|@” (ŠàäC|oÿñC>à}À°mpò3¾Êù€¨€R TAÏ÷ø?Ÿå“ƒ=`ø€2ù)å € °PŸæ„.¾Ï_ù  €0Ž~Í'@€P‚¸ø3?Ôüð ˜ï |¸õ€øÊ D‚*ø€×Gú ßìƒÐæÁ7øûàðküŠßõQ¾ÖŸø”ŸïkýòCþÄ÷ÿëÛ|p@f?韃# l€>øà@óËý¤_Þhe` Ù_ó@ðÇÀl>$¿ÈùÀô@°í;þäçøqÿùWþè¿õ3¿óWø ßáû|°ð¾å§÷ë^Ý£û~ÿî ~ºo÷áßÛ“oÏB¼_ÿà¼xïI?9hø þyàíÀ?`÷ùŸA°ÿy{ÀÀîú_<þ!€ à`hü{AÈò9€pÀ( AÀ^€ÁÁWêööçýÍ| Pb~ПH&}ÀØ0!Ÿæ÷ª€IŸ {€É§ù¥€% ÔçìÿÀÿY~@`h T*@9@d}7`ò rÀðúqY_¸ò <`X}?à ÈN# ¸r}6à ø}ûÀñ X~QàÏ'èÞAø‚|ûÀ5ðüüÀ9ðyï É÷,~ ?$〠 šÀ8@”a€!HöÀ°þà#ø lÀ=°„ÿ€=h‚ˆ A´€É‡8‚8Ðü¡€ð`ò `€A@Œaà ¸ b@ð¨œð¢Hà øÿ€dø€ üî/ïu X2óhX@&° (©€*@ô,°í÷€8@7 `2pô_.°Ðð Ì=X–€€Àð@ÜŽ @ÀƒÿÀ üÜP@ X0/¯ X’+€À À! °b _0@ð pñá0ðü¼®€8è‡Ü„ €È7ö@Mxñ5|ÿðõà?,èÞî |¡à”M¡A0Àƒ3`LX60À 4(ª@ €Èaap€'áPT€ÐœÎÐè³€ ðj!à‚0L…õ`å€%0x0@ú)€-8§À(À\|ø€XüÀ?P ýäÇ À ßÔ €ò€< †¦á¶V~ð`ƒ¾ ž¡Õùñå`ièð†!0.pÀÐ<¼@/€ ´|@>†½¡·ç2¶ À´…€à ÄVcYhÄ„Ðá ¨¢D@ l¬@7À|¶@]8™!ÀЇ۞#hÔlÀ @0@EX^|`…`}XlŸ€ `Ì)!ËWÞÀàS¡†ø<ÿÀ` „ˆ‡9"Ùgb;`.@Æ,RbA(ž|¢x¸íQƒ<°þý@ð0…dá@ :|ebPê€YH´èx~„0"Ÿxþ¢+È'Þ|Þ^0(ŠžàâðŽ MxþŒâ'ø(FŠ-ßx¦ ঘþŠÛ§Ø'âˆÞž¨¸(†Š"ª8*b‰¥bªØ*®Š â«x*ÊŠ~¢ª8+¢"ØâƒÁýñ+ ˆ%òŠ,Ÿsˆr€š"à‰&Ÿ`ʃ6Ÿ‘ˆ,âˆË¢Èò‘|€ ƒáG(‚„Ž`À,‡øÀÀ<y¼wÄ Ÿ?€:‚Õ"˧b*À*  èdéð"ßÌG)*‹ãb€ ÜëÀ?Ð,À/ þb¸8. 3€-èZ}€È0îŠÌ¢±h1¾‹Šá¸Œ…ÇŸ”¸1âˆâ¢µ„€H£Ap1‚‹@ÉÈò=½@ø‚ ) ´Œý"ÉÈ,z2@(À T–`=ðŒ/ã¿(3@?0 ø}*è." #ÙÇ,Ò‚ža,82‹cè2rŒÄ┈è‰[#¨6‚~ @8|^cÏ3. ß<`¼@Û˜4:ŒÖâqH ï€Æø5ö†p#é7 ˜ÿÀx7vŒy#î‚T#Ž6ún#¨X<Œ 0TŽãÛ8.®,_äþ@æ*. À9ð t=@à|Ø@æ¨42‹@À <—@%à HQ€ëˆ7ÎŒgÀ;püÛ@?0øºãq8.J‡V£ÝX5>ŽÊ£ãØ5‚€nã¿6ƒÀHòA‡ãôx†|Kañ¸4rßÀ꨸âÀà ˆŽ»#°¤^àd%À'À xÌâð pŸÀ`Œn€>P<žào¨5þ\£9Ž“£µ8Ì|ô£µØõ‰|èÞØ×@Ê‹ùÀ: ¼?@%¢1#³„•@ ˆ°À* 2¯£lí€-°xýÀ>pBFŽŽ`Øñé„3döøÀÿU‰ÀåqxLs€ —‡cr‰[n•%À p€¿elIø:@*З)ãi 3j— %û@„—`6ð ̶zé#Ú–@0x†N¥ÅÇUF—­¤Z `—Ucéíy†?@kèðUŽàazùF*˜ÿ¥AÐ`zÊ_Ù·Nƒ› …¨^‚Š ¦{’…fÙ§ö€ÚG‚ûe2bv‚ !Y„—€ð 0þÀ€Lô0ÐbŽ/æÉG†å,¾€$€ ¨à€   °˜êå¿øY’|@EH™ €>À0ÖÀ”‚jâ‡y®•áØ‡@Š#éWö킳dåøcrŒ¥`õí€ê£P9€b”9f*†À ¬òã P9î ß€!øfÒ•Šá_`tK€ZIL|€Š(`ò-šëe0ØJâ@ð ôºÀð[þ@ðH}€° ðn€„™Lþ6á?ð ¢e’øZÎ*_%  ª+@ Èšd08 ”@€à> @fxM6ýÀðüß=kršÿ"­9lÿp(ˆ€³Yöa5ä˜Èi&–¿a98dB˜±áyˆî¹™b¦XÙõ!}™2Á |ûe @|b$‰$º—$&}IÐgÀ.|Ë@Ã×o 0@ÀY‚—}éxV@ \ aú›@ŸbƒÀ7`a¶†ÓaÙ·E¾ó@6  4ë±YFD€) 'ò‰À¡o~“Áàð Üœ¥eÊØ.^–G"Ä$‚!xˆâ–¡eE˜Xœ`Ò¹I^àÅ ™Ng%i8çÔé ?`T„'éâdáP“`%˜uÞ‘`¤Ì€èÞ€~€P ž‚€YøtŠ!8lšW9Ö„á½ùw²|ß,~$ÀCÌ—@b’…e§Øx•€ @P9`Φ`ðažZ'ãIúV ?àÜþ@•X¨…€ žp'@ù9â#È8ô30pe<Àâ©{~|¢œ¨À)° x‚¦òYñÍ€Í'5Xx.ÿÀ= |Õgê¹|.¡Égzc"…Ub€XŸ¯eÙò‰ò c †Þ^ pw"’ dÅ\|À0 ¬`Œ9î~@&X9*Ÿ¥¡ 0ïÀ* r•€<°€â)~6 `Ày@ÞÉø»d2Ðw€çí)R¶¡2@ Ì'¨_éHΡåÙ„À9`l£ÀÛH:‡€ƒÉ|‡•£@vŠŸì0Ðßx„æžI(Ä7'6–ü§Èîß0mþTh#É@²{À˜y²|ì1à*ŸI¨*~–€ ¨¡¹'ú¼¡Gb;ÐðÑ¡Ÿ8‡Š¡j ʇZ¡Vâªÿ¥¡e ˆ¢!š‡¢ áÊò±¡ÿ¥#Šv}à€$ ‰V¢ˆ(»‡‰‚„ƒè!ʉ €Ígd ¬€7`(z‡’¢úŸˆ|„£¨ Šn}¬è ˜¶€ç·iA@åØŠ~¢,_¸x~!(€ˆæà.:‹¾–ž÷ùd¶@1ŠŠ¾¢¿¨A­€ 8£®h/ŠŒn}¿@=Ð ÈØè"ªF£òâp†£ÇèÄ‹"¢¾( :›0 0Æh*º@0è9F¨@B(‹Ö‹ 2zóaï@>0¤Ü& °‹~€@;ªÄT@pDŸ@5 (¤Ï¨²ØŽ¼‘x ,~›?€‘f£ŠßÖ§‹Âƒ@Ù× æÿ€àZ€ €*z'v‚(Ä ^Ÿ×xžŸP?ä H“..cÈ—8ii˜d†¶¨ÚWD‚~ MŠ (‡™aÇG,îŸ0@ò1¥ ÐúÀ€ à–€@€ôü@3€0f¥ßà_Æ!0ö¥% øO€€ ¥ ½¨ LO \j9ú—wÀ3ð @9‰—ºÿÀùx eZŠ ìü@;0l¥Ièí­@àdŽ©:*”:|À ȃ,Dp“΀þå Ð |_?Pš®¢"MzCr¦°éT[ʆ®)nꀲ !‡i“"¥Û^ih“â¦Q©Ã@Æ%"P¸¦Ÿgjfº‚e_føl’Íé/°Ð€1ð <ü€aªƒT©É—-î›0@A¸U:¡*% š~ +P Àæi0ÜÆÀ€ <ÑX„@wè*»À&ÉËÀÐ ð¦ç) ¤…€?€¬)О²|€¥‰T™äq¸aB¨Á`?p ý=°làÀ†šwÎyÀÄ 5)oj&²|•£‹Ê(¢À* æ„ÌŸàÚ¤Ÿ·çn¨@ž“ôÝ&<¨ì~AÀxuR§8iÊüéŸxçÜy=™  ,é1М¥0P¤ª•Š!¸o?ÀþIpVž¿å°ûåX€(à —0À€œF¨‰@‡p ‹0paƘ _kø¤>žÀ,P`lê?€œÒš €5 ¨É@PH À মŸpêqè08€b¸[Â>À£$íÀ/`ŒÀ=à€ñ(Þél À‘@(ŸUøšz{Na Jdèð\ÖÄþyñ)¡"Ÿaj¤¿êÀ°¦€ ¼»% pú)t ²š“2«h#`lÀ&œ  À/ ìãÀ$ ˜ö^`Ç—@Ò ½¹¡j‰báÊ”L@4”bÀ"ЮV|ªÉ À.¸¡2¡æ ªòÍûÀ`_ö[Àp`î©Áà0 lÀ#à ¸A c†‚%Ù—æ§ŠáP ¤Ÿ@à t¬dßÚ…Ö¨ÚŸÊW±B~ü@'à8‚0À<àî¦1ë_)²2«:+Kê’îªÛ*D *ž©Ù6Û’~=¥Bj%ƒ€ZXö%†°¬{ aʇZ-rËt2®À©/K%†³ð¬òY²!àH;P¦†§8[%΀ÜìwË`R7+ÙG™^³ _6›Ö2–ܬšJo|¢°ˆð‹Â¥ÞŠyò‰ºäÖÇßÚ·d!&À'Š€§*  ³‚„ _O ¸!`¹—à.¸lmˆÊ>²ìÞ~{È:|íÄÇßú‹®† ƒˆb#Yÿ‰¸@Jêünê¿(ìßÀ.*â~©@ •£‹P ÀÈߦ¤¶@·™ã©,),àãV€ ®€‹äz€!î»J"†C.ÙÇü@ÀG8ã `4“»"¿ X¹übŠ;ÐþûlˆJ(´^€€¹àpÑÚ°@Ž[z´Õ@&ðå*¹ß°Ò¾|€œËòÉ´}€=°æš¤ÁÀ’‚·á “K覌íkb$¹ŸÙgB5¤£ é–¹=âχ€2‰!Øábº;àð øÖa'Øé^ºPé¸(Å@zÈé.¹.ð™êrÁã&À ˜º°. àÐ&câ°av‚D&pšèƺ@¯ 4º‡l:pÀ¶¬A î 4`d¡‰!øç­Vš#ßn¹Θ€8ðF}à7Àx}À?àp»Þ.0D‚fÀ"𠬀Pí¦»À'° øÍÀ? ¼šóîqiƒâ´Þ.£«v»® ²ëí¼†î?€è~{ Áÿ)*]߰탱¥Å l{t`Å;—Ž•×dó7z{¡Æ»Ä¤A€õ&€=p«–¼t'p„žã.ØñžÀ`Ðñz{8¯·‡õɼ@"  €¼øðº¼$@ ‡/.9š£oÎ{àÀï)òÒ’1Ë;&žoßÀòî‚'€|²¼ï àqF€pŠ€7G@Uð7È3t À.‹È²HÇðç8›[ŸAГèžÄ3Æ©¤ÕZŠ¡>ˆKáëòBgïTP\soÝ+ßÔ™!Wln €ím¾Ý··í{æÀ—þ«"é[þÉ{âßé;îõ{ú^Á×úž{Â"éKð|ýÞ·8ûqÙß÷'ý@È÷°¤þÄ—ðõ¾Üð ܭïïkü"¿æäï»Y ¿Í¯ñ ý¿Î¯¿Çü®€=ß’…³ö«ýº—Ž`ÂçýƷ᯷‡d¿ÛoÊ7þ¾©ZßúÕ"}îoùëþr¿â¯;šýùׯýÛ.B¿k`Nºÿ¿úïãšÿú¿°ú»‹0Œ×¿ 0óK ê¾Õ_è‡ôá¾Þßö~¨/ú7þ™äŸè[úÂíßû×ÿÍ@ýwܼèÿýˆ(ÿ€`Û8)n€ºb ì ‹) C 8Ê3~‹I ÷Yâ"ç HüŠ­ŒeÀi‡|Hð¨›ædL#¢%à üNÁ)pÌ_ÁOð#sÁTðœ‡ÁÜ_=ÀXúbà`?€˜g¼ãmð/ËXÎ|jðœÒ†s°Â÷£Á½"Ã'¤–Áv0/z(»lp!:Âà!\¢À.¨Tº—½l4¸í©ÏïÛjó­ XŠðÀðZdfÂÿåà(v–°0€ÂàÀD[ ƒ„l(9ˆ ¿£°¿X²‹è÷ ÄÂh,@ ûÀ#€ ƒ„³pKê Íå* õðP ¿¹ð.l,ä00lñ=™p-Ì@Ãiej<ò­‰`ÃŒf×G ãÒï‘X™0H˜ý!«dEx¤ÃÀ:,qf‰g<,›ÃÁ `ß¡"çÄù€ÂÌðË'–á@(¼áà¸Ä§AŒ7®ü0>,ªŠ|Kâù³© ñ<|£6­—h›•góW'ž†É¬šhƒ¨Üßœx ‰‚kë¸ò•ã|ë^Ö¯…â­j?Š116Ko{€â¡XÊÄàÀNìí}„–"¤XèêÄ,q¡ë(ÅXíL|$î²@±Rë)ŠSñ­h*ÖŠ´â‘xkÅ®"®ø)VÅX±WLÛŠaq®˜,‹À÷ 8‡Â¢”9.‚ƒk1áš,~–&\ìöÀ’ã[œ´:‡@°#Hs„0 3þÅpñ‚[lZ‹…ñÉ„ €À °{‡ãbÌò5ÆÞdÌ1JÆeìðYÆ8"f¬?ƶ¥gìsÆ0£h\+ÆÌâgLÿ‹¦ñfŒ3Æ£19.z‚Žë¾(ç@m¼0rŒ!¦#¬O˜³qnßîÆ½ao\èþÆv$fü|¿À@ýV*Ç̱s|3‹Ëñ*wÆÔqtgÇÖñkÌòUÇ áuŒ%BÇÝqṙÇÞ17ÇÛ±ø¬ÁÀÀjL RÇð±|ÌòÑÇw¨}¬×ÇíñwÌ›ÇîñãÇ ¡~L ÇÇéñ0ÆU#f¬ 3– roè /Èý1ð ?€òxÌ,^Èø@† *NÈr‚L!»˜³ñãÙ.ž‘Ʊ·ç(ú(r‰¼"·Èy£‰ü¸ÂÈB¯ŒÌ"Ç1ò‹Ìs¦ <¤¹#§‘ ?°FΠ˜d Y$ÉyäIY*Éi%“Œ‚ú‘Ir¡ËH.ž‹d”üHZÉ“¤•|IþÈJ%E™2r”¼1Lù¿ îm¼LÆ”dr†LÌŠÉi2Ž|&ÉÞŸ‡L¾R“p²Ã''×°v`\&“Ètr›lG†˜y²ŸV‹ÀAìïÙÇ„²¡,,ê…®¢Œ('•Ž2—)•òfù(Wʇ²¤l)Û–Ÿå† üúÄñ`+˜$Ë>k<,ç‘qⲌU¢©ž µVz{Lí>À’¢†š¥d™GÉÿ€¯(f–ÚïxëH0rØñ:¿êr2)³Ë,©»[ÂË”és¬\¶Ë¶à½|èæË ò¾\/÷Ë ß¿¼.óËï²ÁœL:žLç&œÚ˳ 0㈠s…Ér® o¿|˜Á9)é_2˜¦±:lÌްǼ`žœæXI2wÌaòT9b’´*3ÇŒ„•A&ËíÚ„+óÌœ`*—B&·3—Ì;ó#Û²~˃@μ-£©ˆ&œÍ2óÑü2Jó0`4W]ßp¿¸lªö»UŽU3(œ5ÓšÀ@XÙ5Óš_óÖÌ1ŽÍ=§Ö6SÍ6¡6 fÀ1¯Í½aÕì6S°qóÜlj¶‹ h¤Ø6É9jÞ 6ïÍkß,on•2fMˆj¿µ°–È7×ÍÁàâÇÏŽ•x«0ì8Î3°ø5|•Ÿâ\97΄óáŠ#> _ºù9džs¢è 3>Ž"LƒŠ…§³É:·µÔàël5~¿îbKÊüý‹³³æªð:‡&Ðð½~΢ ʶRƒð¼I­z¤îl<ËÁɳXÈ1ªpñ<†âÁ`BÌðe¶Õ3óÇ€ÀöìtÏÏ3Y2ij÷,~⤑%&>{¡š'dÙðÁ¯_ƒ;†.ŸÀ>Ç·õó“Œ?;û³{I<ÉçúÌþÐÀ@öò–lª°¬@ЀCøÀÞð]öMÐ4}ñaÐ9é÷¼UrРëêí¢pKÚ >ij#x?—†@žºøÑª¤_ ]>ÛÎÿîWC·¤Žà÷Ìý ¡ß¡ }?³{ß5Ø6ð)ülˆAt| úM¡>è Dc³±¡Ëú„’Ot|›,RÑAí^†Å_hÍ^Ñ3(ê‡úÏr(*pÚ¡h6:‰î¡j´mFw¢it ¬ˆ¦€s4ýF3¢w´L‰Z¢ß&îÑ™èT)ˆâу´6*Ÿ¢j´)ê&ÒdŸç—ðº—1¡=:8ÒÀt|;JÒ™4$ÍŽ6Ò…n%I¿¢“t(­I3Ò¥t¶|JûÀµìù»ƒk­=Šý¾Ò±ô+:KÇ·µ´6zK»—¹t@ºKÃÒÙhCjþ~´4IÚJÓ¸´1=L»-éKZÿµØ/;Ðð…8)ã)º  ðHSÓ"Åë_Ó o6ýHÓ:!Ù÷MßÊá´Ã7NW|åtòŒC£ÓM«6]I³ÓÞô;*ÇÓÛ4=mNÛÓß2è§ýêÓîô£(¸v‚ÿôGi'¶‹5PPÓš‘¥3©· uÅGkJÓïiDmPo’M+9iZÔ u:MöõÏ õAQ·­ _HQƒ¯ õ?ùi–5Ð?_|RðJ}R;­/5 S[|,uSùú›6õ,S_Ä}«Âë öÔ _>°RÄ[¥ÒLTF5N½<;‚†¤JíT¿Ó@ö—ÔUóSí ZÕuVMUsÕí¢>]U·¤¶àXÍT[ÔåôX]ͪÒßAý¸ŠÕ ß}òÝ ‰«TVg”') 7óÄau7½U+ÑÌ.Êý¢ÕÁ Yà&ºD*\mE3ÕÍôkzWÇ·1gÏêVÃ, v:Š”uÔŠh–Ð aeÍþqÖ™uìÚ†‚Ö«¬Û*Z»Ðwhi-‹²¡$4fýÉ걚µ êZ{{ÆÀ°£€‹ë£›Zóª¶õ* [|ÇìôÖ !nmñqM8\gÂñ²÷JMß¡5amÍ\S¦Þk\ƒ¼?Àtµ~Ž×õf­]Ç®©æuMúuÃÍõ XýžyM]«¯•#0¶ª×oëýj毽"-Ü®JƒŽbº.6Ö^+ά ë×öµhÍVþ×£e€Ý_3ß&ÑIúØbt‚=ƒ¼@7<´ö×0€ƒM…"š6ÍZ[Ø‘¢C(aß×A0°"wØ TM'×#6„Í𭵟¡LybØ+ö!²Ð/¶Cc'º36^]„²îýêÒØ;6(‹ß²|zuL©c÷Ьl]d+Ä´¦?ì²@/kxº–‡çT eG•ãúšÇ ³Å±1KÖŠ…%1›ÊÌVŽÎ,<Í:‚˳5 EÅô-ŽÈ’N³¯ß4¸ÌÉqbj/Üï› G6ÙðíãZgKÌ`°ü@˜ŽëÍÊ&*|v6uvêÙ¤Ÿ¡ì¦>‰v ­#2Ú€„}BGÚ®{=hº–6÷‡iÇ ùë¦Í¦ZÚ¤ h;|[í·S2ÓÀ3ði—ÔdóÀj¿˜v…{ñut`ú4|´ö©½Ôž|¸¶Á÷ìÚ@¯Ý\s΀@°­kóÚµ6²­lÿà ß'0'Û”©­lûÁÂv:,SÛ€m·}è|ÞÞ ¹"Ú¾¶zÞ’}! 8˜\­˜$§·dßz;h×ïíšÝ·¾ !»n+¼æ °èÌ⤨¾Ý†¬‡õ¿pû·ûvÈú-Ü ý ÜæàÂ=…Ê¢wÂmìÃÍ6&Ø9i ŠöÕ®Hú¥†7÷« û×'Š;r{Ã÷Ér‡¹+wÉ ‚Ü3nÌ´Ü47ksãÜo5ž‹”ÚâaÎ]2ÚÍóã:ó͸Dw¡}tó·I÷ÿrߤ¢vÑ-£¸M·Ñçb|Q·Ò½è&¼ˆ.Ö g;Ý€¶Û@ƒÍ®¢éê€c÷VYvǺ´Øý|ËÀ€§k”¹h÷Û 6ËÝm·È·ÚÝj7¤ ËÖÝp÷Ú­ëò™½âÞ wËÝ@¯»“ÂÝ@È{ùó7ðý>Þ /úëï!¼j1æíxkÞº0ç xÞ/`ðï¡ë2¼zïã*ôæ¼÷ñÐkñù½¤Æ\¼Þ^Æ›ôÒ’eŸÆ |¼¶È» 1¯B[î¨Í;õn{;oÒkü¼A¯Ì;|ç£GoÓ $ @Àô*ßG õÞ¼/Càò† °²â¢ŒêkÙèˆ<Ë× ¾×åâË~¾DyLP-1.6.0/DyLP/doc/Figures/factorcalls.drw0000644000076700007670000004412711171477034015275 0ustar ª» €A#€ ˆÈ sÇH6eb P%Ì™2SÒè)ƒBFŒ.r°q#‡ )XL3›0y˜¤³ðˆœ7uà,¤RK!rêÌAƒ¢I*E¤!† ,\¢DŒ!mÜpQƒEŒ3\HµaõhQ¯F‘ÆëÕoĨñÁƒÊ( ì„a“挶R’ABÄܺwy`t ‚N1l¡HyûD •$Oœab¬  J² ‹¹$bnÄÔaƒÛ1@ˆ&]Æ4¦ ÆÌa‹BÈ›7kÚ„q“"¶¶mÊIS§ï0›A`Æ,BÌÉ1kDÄf#‡v'G˜$™‚¤÷I7gê8,Ã6íZdò|1f 7rÎÒ©Ig9e´ùRÆ  „ÄÐläA—á¤O>%Qaá€CRåÁ”SP‰Åi¸A‡Jö¡pÃ`,ä0UU7„eU 2P•!CaÐÁ“‚;õôSPC}ƒ„.ÕÔSñ†‡0ÉR 0!Óˆ^5u¢€JЍâU-Ö•€x`‚9ÕØ ŽÅ£Rþøâ†~¸’ˆ$RI )6É¢‹XÆ8c— Þø ŽcVx!" IdF"%“bÉ0”KN9§•gÚYž6:˜c„’ùç‹‚¾Gè‘"êh•Œ²Ùä YXjS8dDWXy”ƒ WŠD“M“.X)˜:öX&†!1™ 6•* 7t…”ŠS’…”Yh©Å–[pÉE—]l1Q„}ý…­`GafØgŠ1æd’QfYgplnfp|Úh¥–Újõ¾†™l´Ù†›n¼ùœpÄ7{É-BsÏE7]u< p]vÛuÂwáWž´è©7Gkp¤aaÈÑÆòÑg~úñç€Xh`‡\êú垘úºiÌi‚ÈRœb= g›0*à­7Qzó¥^ijfHWeà 4XEìG9Ì l¯Í.[ÖYæMûV\Þ¦-·~]Ø`â–ØbP4öXd“UæÂeðºK˜glÍËšk¨©FoklÁÆoÄþæ¶[o<\qÇ%¬ÜÂεçðÔY‡vÜy·[Æm|^z_Œ1×pÈ‘†nl ÌÃ|6­œß~ýý ­ôå꥞L#å4°+JMµÕcÅp¬Îö:–×Ï‚-m[c[ X¶Ûv«6[læ6åÆ}.ÝêÞÍ®ÞìÊ‹/á<~¾k†Ï†ømŠÜ8Á=n0Â<(Ì\åÐI‡9ÄÛ\Å<ñ„.Z£SéØ02ˆ§u)‹Ý}fç2Û-w4Ê“¥Âä;?=-xZÞUlàã!yÊK´Â½j•zh{!¸3®·™kné²Þ4“¿wñ 4ë³—àþV¸}¹¯6ðã~C?‚Aî`ÈÉßäö×0ÿe.bãœÅ0f@ò @¤[àÆ †’E°>lYí`†;\epW8kšµVEÅ;ÞÖ˜Õ$:o--$Ûõxp6ëMo†m#Ü䆮º­+o=Ü[¼úÄôÝkpì3b¿’¸85Ñ~‘“¢Âf9+0‹¼Øçº(:0ª‡ exˆ`B‡3ÊN/»Œd¤; ò*g¿”:U$P%I&Mñ j,…eU0K ˜iE¥VÒÍz ÇÞõÉGÀPỊ̈֔Pó*D“æ9­)Ì,Í AÜ\¿ù«vrÈC>»2Ï9ƒ)E“*ë\TÌ´ Ï7Ê“O™š£=Ç¢r.³™4ð§:›ÉÎ!-ž¼ã Î>XGÀV3 ¡ ÷˜¼åõj…Ï£– YÈ´2{5äÞ"¿—ÃGò3ð2&…XÉömò_œ_ý JýQ®ŠÓÅ:§Êjì‹û>Ö¡4Ôòu*K#íryA7*-£½ f†:úQ«Ì 'äZQˆR@ªTzßj© aº½î1|:_$ËGÉZrˆùòéû€*?&õ‰ø3*)û—T, ©\|jØ¢ ªºÁª¶ÔjÙ¨€‹¬*+Ôš¢•²²H¤z4)ÅâÇ/®f«žK¿EWEÞ°‘áÛa»öšÓ¾ñ¯=Õä`ã·DÇŠ’£b)À¥nq•’åX©2;àG ™eÙV-¨!™m £DèFÉ&|’óŸ8¨¬Øixdê­¦@»KКí.¼ÀTè™î©¦†¢7¾,"Ú{ ßkÖ‰—ŸÅ¯˜ NaóS†Bæ×»¨PIxÀ°B|'›vÁãuðשœ,ê`†/°[Ö¶ž½7Ëg^ß·ß!ëGKhärDO¶ŠÚÊì•ÆÕᑦ¡´o‹W›îöÚ:Õö%;ÝíOÕ°á.ªÈMmÊ3§2²)—®zÌ€Ÿ2ÔúÖX• viÞÕ¤ñ;Žþö1ÔvQ Ïª„g úZ•Ýèè5<†WzÄïZS*ßÔâQÏòÔ¹›#ZÝã`ù¸GÞõs«ìk;œ/K‡³»vh\ûž9 Þ~ÿúƒÃq1#ü'ªä *&r‘Œ—ézØ ”ô 6}úA•ø˜­?4ìŸ4{Œ¿½ÏÄñ¾o÷œC­ÀH¹;Vb wÖ*¼ïÍf)Òi q(ÞÒÖF¼oØW½ã_µÖGÉu梲Ð=` lÝÌa ­nó›ã<çÒ”aæ£×FnÇ|½ã|f•Nws@·h ÇwJæwÎxI—HÞWiÕVq’”x·xæ×x?õmB•uÈ%J“CyîgréöTóWapùçf›'gcÀ2ó€\¥!’’{pwzáô`¿%,Ò*6 ñz×$c¨¢DX"·‡ƒæg;¸{¨çƒÆ„2 „Kø#G|X‘CØsÉw%AB ð1­±BÂð±RpbPÓd9t—1!!!ãÑ1†jh$ ІoxU±,wˆd0"À‡kø‡nX;Â3°€4, vÒ `ˆ‰(d臀XAfVH!Av‡—˜‰tЉ©×‡l؈X1!4 52 ´R‰ÎQe˜X¬˜†‹ŠË²Ët‡¹Xˆ¨ˆ ‹Na5aŠ7p‡u&n`jxñ¦+W¿ø‰¯ø†XQ—ÁŠò•x-h@™±y ºØ®ÈˆàXtXÔw2p‡$ƒ peçðŒÌH‡Ëd)r‡êq º¡:Ëø†¯bVÑX‰ýøùL±b‡Èr‡þXýyP¤ñwБò‡â‡,r‘x8»˜’+Ù’Ê葊"ŽQ$I dà’¡hÅbU‰Aɰä/1”;ù’=IŒUQwŸs“*yDÙˆS9‰’çXé˜sÑCÒ•X‰R,.v‡sp–i•EIâX‹™wxh«H—^i—!˜µhŽÍQuÁ/"a€Ñóa†,¡ŽiIÃØRÁ*8`Uó’ÃØ“!Á¤Yš¦yš¥ù’XAUSŽ/R™Bó*H¡™7À™ž)¡8‘±È9š¨œ¦©šl’bÁ–¯ù˜²‰™EÁ¶‰›ŸY”qhUcŽÂyºé•Ó)“Š’œ–¹œ´éœ›Éc¹)•qHˆØyæÙb9@}—Þ›³)ây›ä°8Š/¶2@‰éœRilÕ”,П—žów j•o¨Gz‹ÿ‰š Ùœ¢) °y Ã˜  –*"\¡À9¡©¹› 5!¿‰¡Ê9ŸÍÉ¡ è¡/¡Á6¢$ú¡SI@©¢ßÉ¢b!Ú 1¢BJ£$ºžÍ)L žê£/ ¤¡(£ÇC¤ªšúéžý‰M ±œÔ˜OA0cii€%ã'‘‰ X‰\ NѦnú¦p§r:§tZ§;rEЦkê5€1€nÚO;¨NQmz…0`¨NÑŸ‰ê¦…©¨EÓz80©‰j¨{Z4Ec©.æ¨N1žÚ¨mú#y:ª~šoЧƒj§nš©¬úªuÚ‰]ú¥a:¦eºgz¦Ô'® «¾ú«Àª§l¬ÄZ¬uÚ«Æš¬ÉЬÊ«!1«`*¦d*f tºª¦ `Úº­ÜÚ­Þú­à®â:®Þº¦äz®èš®êª­æº®îú®ëÚ®ðꮲê¥Ñj«ÔŠ«Öš¦¼š­7`ÿ°óº­+°K°›°7 ¯óZ° {°Úê°ÿú­ K® ±«°‹®‹° ±õJ«Òz«’«üj®û­) ®+Û­-ë­Û±û±,«± ³6+®/»­kº³Üê³9{³*›³Cë°2;³[´Iû­!{¯ÓZ­hjت TKµ[µU{µX« G«®[« Z»µàÚµ*ûµa‹µêz´_+´ðÚ´µú´úµ»º¦AP·v[·Ó”·y{·wk~{1À·v«·z+¸u ¸[†kJ¸{k¸‰ ¸‹ë¸Ó´¸ˆ‹¸“K¹t ¹—k™ë¸–¹Š ¹”»¸Û¹Kº k¸¨[n;²ùZ²û*µý:¹vy»5@‹‹»¸k»¹û»ºk¸¼û»¦«À ¼»{¼v黼›¼Ã˼À»¹‚;¼Ë ¹Ôë¼Ç ½·[¼Ô;º‚«¼¹‹½¸ûºø µ×Z»¬+º»;‰ì;‰“‹ºëÛ¾îk¸kÚºñ+¿ï¹÷Û¾¡Û¹ÒË·ò˾ù{¹û+ÀéÛ¹ÜÀÁû½ð+¼ L¾p+»r‹­ÑTÁMáL—‘Á‹ª©|Á<¨€Â…Ú¨5‰$,ª",Â|ÁkªÁÌÁ¼ÂœÂ«ZÂ$lÃ6 Â:,à Ã{ê‘úÁ¬¢Ã€zÂ%ŒÃ(LÄBM@|0œÁõ»Ä4\ÄHlÂH¬Ä8Á$‹&K»k:3ÆbÆd<Æe|Æc,ÆiŒÆgÌÆk¬ÆlüÅlìÆnüÆtLÇolÇv¼¦xŒÆz<ÇœÆÜÆoÌÇyÜÇf<Èb¬Å±Ëų;·ÃtC É”ŒAvÉ–¼Ä?§®·Îã/>äy äAŽãþãßjä.^â3Þ­KÎäÞªâÔl¹[]Àó+¸\Íå Ì·†ÝÔ`®åO]欻Õìl·BmæNæ^¾åô«mžægîÀŒå^¬nNæ†kĉÚçL½»€^¼_þçU,èWAèH¬è1°æu èa~·‡>½…nço>ç’îèŒ~ÂzÉ‹+§pη¢Žçø«éq:êw[êÓ«À¡§u.¸¬À®þç©>ç³Nê¹Þêy.à"[¾üLÍh­ÀrzÖY-ÔǾÕ^=ÕÆÎÉÌžìϧÈÕBMÚÕ®ÔÊíO]ì,§cÞÕÒþíÜîÔŸ®Úߺ¸C°îì¾îV ®êÞîìþîñïò>ôî­ö.ïùÞ­Å{ïî^Õðn¸ïŸîðkmÔ/¸oÕçÞ¯7=ñ0@ñ_ñOñ¿ñßñŸñïñæúñOò&òò*ñ#ñ'ÿò*¿ò2ÿñ{:ó6_ññt AÀó>ßÍÝŒà>ßóD/é’ŽàE_ôSmôH,ôIÿóLOÂH?ôPÄKßô”KõEôF<õOÏõVo¼Yÿô=öRO¹:?Óp:ÅrjÕsÊö½Îëpº§p¿öUýöJ÷«ÞöDLÚnÏ÷4¬÷v‹÷?÷ ð÷qZ÷oº¸iùøŽO,’_©8€ï“O,ŽŸù_Úo‘‰Jù—ú•Êùš¯ ïøS-úÄbù¢_ú›ïú)ú²?ú°ûªOù_|û¶Oúÿù³ù¼Ÿù¶?û¬?ù={ú€ û¾ûÀûi/EýÒ?íýÖ/ýA{ý×ÿßÓ?ýÛýÖ¿¦ÿ­ýØ/±äýÜþßþÿ½¦ç/ÙþBþà¿þà?þò²6ûþô¯ý›öò †á3ÖÊÊ ;gK¬…½³˜÷ €!Ìjª«wÂàž¼ pG\@£§Êà3€HlŠÀhgí˜UËv@-­5®ÖÂÆü:$PÛ™Àª†š³ `0°Û¹Àö•š·“_ ¯¨ÕÀ 6ZÚcqÜ n+%¨­˜ ˆpÙªÉ9)˜ä¨à4ArW0¾9Á-8å’`\‚š+ †8g\€cЊÀ52ׯÖÖsƒí ¢798ÞÖ–ø‹ƒ_ë æA<¸µô`loÙíÎÁ=8a$„‡Ð¼m¸Dˆµü`#loG0ÃÁ¿Ih„t\”^BÂe®2a%Ü„zËÂ?P˜äDaãú‚Mr‰Â'ˆ Y¡‡…P Ö€UèÓÞ«ƒS¡.Ñá:\(¼.à"m¹ÐˆÝÂÅ× Ý.|S±nÓC7ÕélØ0d†šNÒ:ÁW·ºYÚ³j^ f5mÕ¸¡R³j-°Vµl8·a9‡G­Ù¾sø Ù!Pó†ïÐþ4pèÓСQ#‡é0«ÙÂeئža?ä‡NÁDTÇ §aA”{ÄÐ &D„تø@äyQ BD… ¡Ú«ˆ ñRÄ6•ö`¨úˆ$‚D"€H¢IôSB ¤Ä•ú‰Kl‰/ñ%®D•HK¢M4‰1'~Ä/¦sâI<‰4q& –H]bL$ŠB±&þÄ’Ø?¢H̉âï&ÚÄ ‹bQ<Šý$)¦D©ˆŸâºkŠ0`)’Äú¥­¢Q4‹0@+þ)±8Ÿy‹Æ¦¿q+®iÌÚW,PÔETq¿]Ü‹}Ñ[ýź×›`Üj{1.Š-¿ˆã×:Zƒ.ÆìœVKmýÊhÆÍÈ;£ È 14ŠÆÑ8+<£iÔŒ¤15†ÆÓ¸¦N£jT§Ñ5¾FÒMãq›£±6zFܘu#gT·‘6úÆÍÈEcGž‡d@Ï‹‘âé."QgbKH©ÈÌ¢+„*Bb‘ñS7M’U<@•$Aê;|OIÞ€ˆšä“ìyQ’-Ù%*i%‡Ð•Ô’3€àtÉuŒ˜,mf’L¶DPµ$Ë䞊‘mÒI:÷BÅ•¤“ý©NÚ£0¾äžU~²OÊB %ÆS”ˆ´09 '·ä£AO^!¤ä%õd?“™Ò¤=p%Öj%ÃûV¶2Wâ §+m%­ì•bíWµ è+q%°ìwÜêXK !,¥Q€­l—É0¼-«¥´leQìZz0j©-­¥·¼–ÙòƒqËoI.»e·„Œå’\^Ã?Å.ýT£|—ý)¨ÅËwÙ.륟º—j^ÎKx /ñ¥¿´—ŽÎéËF90ûÀü—÷²`N¢‚‰0¦‹)˜-Œ_̆‰0¦Äl”`^LyÉ/ëWÆô—“aÌHˆ «)œ&UζB(˜2Oæ,4™+SV¹éäÆ áj™1³d.¹XXq&¼rÿvHH†à|&á‚rE hÂLÇ…4YæÒ<šPNiîLÊÕ4eæ’£™z«jêÌ ‡à´æÍ|šzËýEM«É5©&”#™_sj2Í Pئ۔šetµÍ¹É6¦Ú<šn“nÂ͇ôèæÜÜ›6kæ-¿ù6É&ß,]„3iNgœ5®oæM¶™ö¼ZÛ»{qÊr&>Ì §Ôáå _ôÜfNÌ{µ9Õ=igQ#mõÓ~ÎÏíy;#˜\ëip†@óHf²+ /Æ ±&@+ Žh þ)(Ú؞ʀîFÐí¨@+h-atïÒÇ Z@Ù^Ú›E(”jô€ =uXDyŠ%OÉÐÒöñŸŸ¼¡‰ÊCå?ô‡ê²Ùʰ" MH”äõÉ%júäÏQ@P4…¦Ðhò/3 {¡=1†Â€š".ž Ý•`Ô3íÐ1º0ƒ(}OD™±)#šD“hÇc¢Lô‰>ÑŽøF-‚ewôŽz<Û2%&ò뢯~åQ<ŠGôh E~}T_þQ%:He@ +¤xd"Ò‹¹1i…¤Zm¶¼ÇG))Ãt~ýó2b7:踚¤ãjÝÌ”V1T èÂ]ÔX¥[-•nµSKK©šcS°ô©ÉÒ§FKu©-å¥UÌ•v*$¦JW³…Z¯âÉ#°L›© Ï4šBSgêL¡©5}¦l)›.“dú$·©6%{0À\QSf*MËé8]¦×ÔšjÓošL×é6§ä”šš«tMÏi9U§Þô¶Ó|Ê–à©=¥§ë,[ýÓ{êNûé>u§i﬜•Z4„*BM´‰>G¼¨Pm‘-š>‘hÙ&jÁ•Ce¨ŽT/NQcÀDõ‹U£bT‹ºQ#jGýVÕ¢ÆÔ!d®–èIŒ)õ¢æÔ–Ú'«c¸š©¦h¤ZÔ’êC*E]M*u§rTæ®öáâzªP5ªJÕ©:稪U½ªXªÆº¬ÊU»jUõªYµñ­­±JV˪Y=«vP ÕµÊVÛ*Y-Œn5®ÊÕ² Wç*Z­œM2¯^!ªv…új“ÔdzU¯bµÀz…¾a•tÎúÕ¾ Xk“¬ŽÕ°:Ökwøë{êe–²VÉXù*aÕe˜•°jV¿ªÏBéÄŒ‚³r °Z[kÑd­°uµ"½Ö[_+m•­a0¶ÖVU¨[q+躭¬Õ¶êÖÙÚ[Së,ì­³tW•‰ ‘+q½­,Ó¹*×Þ*\i+ÚÌš“³m"=ÕE¸²kÝ,]Ü5l*ǹ]¿âÌ®å•ouMïj\?WwMœéµoQMï ÝkႯàUp9Uõš_ùëê2¯ÿÕ¿v×9_W•¯ÁXË "ƒ-\áõq=X +`!¬E,°xëÀXÇuóÞÚó°‰ÄO ;ûžõl¡…/ĦØ»bKl‹u ø‘>ëbiì‡}±Ñ‘´EGkcÝTG„UïÓWYXwb©çø,VCöU-Ë"f¬’,«ŠÉê}þX Kb•âcU:öÊ+-¬B(޲UvËšXeÅe‘ÌåQ›¡YìH+•XŒÍj6>®Ç6»fßì Š³kvŠÑY9›cÅ`·â³sö ¦A¡9ìöœG©”‡6ÈF¹he@h’5àÑ*Šgª)-üëyÚ ÓÈÒ¶iÿ—d¦–¬ÌGQûb*eÏ3µá´²È&Y —I@U‘UÁ?2kÇ0³µ?T[5I]kpnZ¯åy&Øæ©D›hm£uVÒ&¸ÿ˜­дš¶@þ+i jg@µ%µ&u>¢ZTËjw„ hµ±ÖÕæ€=5kÓ¢بÿªR¦Ûeê'Ùmz±¶ËÞ¦Ê<5oa@ã3øö6yµ|›oÁ(}¦k2à" ¯&pî¿£·)áâÛp¨ÔømÂõ·þYHÜ€Kp'®Ä=¸~Rá*\uèpĽ¡—âfµ‚{q?®Eê¸ûVãU†qCîÀ¹.ãf1Ó:4±•’t B(Cbe„4!‰)±€¨3oø>lbárÀBàbÉGÅ M3æ€ÁU6 *\ YBTü÷¯D(SZ!óFL™3\ÀQ£"”(A% 6et€xA§ œ0`ЈqƒŒ4dƼ±©²Ä9eÂÐy#Gf’9l¸!CDN˜; Ì0ÁæM¢G“ÒIóÆ ¥1APASÄ”2p@€ˆ1W†Ž8tаBFÎE¡„9SfŽÌE…xšÆÍÅxÓ b†  hÔ˜¢† E‰¼S§M7tœ”)C†µ”Â^åŒ),Ú©)B.}šÎ”:pà°IãvÙ´AئsšLî•E¦jõsÂØ)3“Ì—9v¾tT¢ ž1h@´6£@A9eäI3†Î̧Q§V½J„¾ý9©çŸzÀàÑGt´÷‚ë%°‡‘¡^fôa`…²÷Bš‡ž†b¨À F!¡j…‰ëØ„Š{´Æ–EŒ&¾ ÅÊñhñèáCH8ÇaÀdä‰SÐ.îh`Œ/Lq„’eÐq†Uy<ùRHH‡Un@Uä•=Ї„lÇVrœ!†˜nŠqœrb5å—a„ɦ‡cHHšÛ-%ælÚ|p(…†˜,†ø‹l°!æ\z æ¦rHøeaK!µé¢f·˜î1œ]¾Áª¾Z†o4Æêž{Lië@Ñ1é '¶!ao$*+±/¸!!¬wD*¬˜nà!á xÔ¡˜¡î!²ÊrÛª¶*ÊlbtŠ®P]É!&ª½¢ñÆï’Ñ)aÌ1l‰ÎñæÙŽôm²±¾ ï¡H¡G®¨)øF\E€ÐÆ»t(yæ8>¹’‚J1'‡ ÌAGfx(FIâ 2t˜ÀÆp¤GlÌ¡`|Óá1ÈsUƉPA…REe"¹ sÇñóÌ5ß,‡ÄmœH_ØhßA]ôÑ#Ô5ÑFƒvZ5{žôÒÇ/¡ C^à=ð‰+oƒ…Êîaaq Û\æÒ–/~L@Ì@3ø(àIÍ9Qº‚e§tÈò@àíî}¨±a¶0C!eJ-RÁÜ2‚L‚t©Ae\ø†Žp !ë’?Ȭ:k%,Ü “¢Âµð… ˆaiD!>ˆ54^¶pX5‚€‡LÌ”ÍFÇ$.чlÁy&E5R‘_'¢™„²ØE2†2¤at62’/=lbÉdF4&àˆu¤£eFòÄ(¶ñL7dñ”æ VY|iB?¥g"VÈ<Ø,×I%‘4Xjk=½LOÜ0ÔK¬ “= xA)S1,d~²PêÇè‘  PÒ°9‘éÎ1iKÀ\2 maœt‰¾Ò‰6,²SÜY&aœi&…–æñfcÎà08dPž?@m4‡5 2_ûŸ.ƒÈˬó˜Åü¥‰’ PzBÖT`6A°Ín‚œ1'9ÍÐ$ø€àœX‘à:ÏæÀw¦&5e3Ÿ‰.Ζå'ÿ)S‚®a”=š°âóv1å ªœš\@€ÅÂ…¯‰]§/e©žZÞ2—»B/-Q‡ ³C=&}‰êq* \”)S‹rFŸ èZ•;4i‚pågHå‚N©š*MK —=¨u©.…iEizϛ浟ý<¬\[Ï‘ÌÏl.Ar 1jJ6¦Ì´(]. ÔÖœf5úYÊö¤uA b@Õ^ÓBc°C` &»æQD‚-ÏyÒ³ ùõ¶I‡Íàde À –°3q-:9c[_Ú6£Ø|#GU²œ†“¯éqçq¤OÐΓ±6ͧw!Y !bi.G9X³€2  EmâQS™Ð¦è Píë+c9K«‚—|Qu'Ó¼-)Î’4T9ä·]Hõœ{X6«[•h=½*â°‚ÕÃÐekhŸ9ÝÎæÑºÔÄèmµÛÑî~S¯rê€O X:®Ôlíläx{S^×ÖŸ8½q?•›•’r‡3 ¨|7ØAû’€JñžB•é†Í‰5KÃí¦4ÅîIÊ€ÖÚØe»‚(n·*ȓˠ¡…qÃZz¸k†®l%·» ©³•çÉi.+~ž Ãù6àY=z>tŸ¬hÝ2𠄆´¡ùœèFZ:¤˜ž ¬õÜ¥j+ªý¬£EÝÂç0Ò©æ^Ü Ä™Hþ°4ó'…½Þ0Å Íuåf¹¶ô4ÆÂÆÚí*'$(4_?åñ”âÉ2›ZCÚû,бÍ ²G‹]r]ÝÄ ‡÷¤çRû˜Í£J‚Ýt=Ñ”Äý±-‹ uàNWGuš¿)\e´ëIt‡CÏZ#â‹á±_~AY(D›˜/Å-Λu${xÁ£1žé&qÎV¶è¢Ñ×r×M çŽmmr‘§üÀlyË^®pŸ¹ØÓžhîÝ<Üüà{KmQ>óИ»-¿ìóÄ=ºX“é­Ù¡ÄÞ`¡9ÔA ª86h©Xh$°ÊuÈ'î›±½â9Ï.0cÁk]Ê ·ÆÛ÷Xu§r}å;¥%!¥ß{ÐДÎ$•9pPcÅ%sÚ°>û8´KchCÖ°`¬áywpÄ_@RöÑåínß;ÜQ?cîzì!í!kBöõ&³Ï¶£=<Ïj_zûàÞ@øæÎëmïûà ×SÊüæÜÜ ß=ïÏç;ë[îú.ÑõŸôõ ˜ÈÀHFbéj»½AË.î} …šŸ žzŸ&íU-€²í¬ãbÛ–Ï!rhò^ „T(."Ã[FBHäfn2ñ%\qr"B 'þ—'~b\¸1¨/85sÂjp"4r6ƒ.åq)/•G_2…ƒ)lpè€{àžDW!ˆ‚8(„„‚*øPÐ-h3q’€žDo<#Ìh3e0ÃÒâ=3xeB ƒ.‚=˜Þ„1p!)”„9Ä%È,xL{\ÛÂ,Œ’XƒRL¥kõ8 ð…&²Vw`!pÈk% S‡l8l‡1"Ðâ={hj}h  .±2ˆK5nH.‘ˆ¦&sHGŽ+K¡ˆrÁˆö+üT‰˜…o)XX†pàm* €fFæapàCoÀOV=£†!+‘e€ n°x'¢{BÑßa#™ò•WÂ>Xò§1Œe0ƘG†%Œ\WÅØ$l€Œø³‹úÓ,epùÕsðf÷n¦a„ÃÅ;ÐòU‚ŽêÈbˆ%b/ØéhÂÕ<öˆð¨#ÜÈ>÷‰òÈ,2UâŽáØ™™Œ6‚0᲌ôc"yt0öaXõ8@F2Îó3X$@qñ!åÃuûT „E#y9B`ÒHÓBÐÒµGyT\¦2ÙŽ=©#KdkAÉ C)xÚG”Å^ä”ö¥=Ú¨GÙ0(¢#N0')Žúè•Å…•á8Ž…aŽS‘…¡G]ánöŽÐXŽç¸kY“Ù2•YiyÑ1Œ/yY?‰G ”ô^ñõŽaÉ{Ù!ØÖ‘XÖHŒs0 IEXÒŠÍÁ_ aõ´ €# 2À/8£Yš2@©™ÇGš¦©D±9­iš|›4›2`M±‰´ 39 ¹9t‘š~ÃÙ2©‰ÎYš3€šaà6œ°©šÙ9œ¶©š7œ»©š 1œÀiœÓùš#›Ù‰6™‰ÌÑtÞ1D2#dN  Y3!,L!zÄ)ra@Ì¡ÊÙÜä3 Ÿ1A0g²Q}f ªŸ/°Ä=s1ðŸA(Û‘ Z¡7¢ÐcÁ­¢¨9³1™ ›E  ò3j›Eà ¤Ñ:>º›E0ñQi ¡3œEà¡6:˜ñI@£º¡œå¤: ¡0á£>qBŠ¡Eš ;qJê¥Ðé'𢴅šO¥6:3ñUÊ£Wꥶù[J¤ºm¦´œOP¦kÚ¤SÀ$B"z´5¥U ¦ ZëYoÚ£‰ºœUP§š¨ÐYzº3‘’Ú¥1P°©‚Z‰úˆÚ©ãÙ¨qک繩zZÅy©S:Bû” 6°žJñRfjË)"QAyóB¨6³´ŠšIõ*À6› c!ªÊj›yp´º›“öM´ œðQd¬MŠCc@CÊ:¥qPCB¤Ž zëY®çJ÷fÐ <±œgP#h;C"¯ô*~3q¯/Õ3éʯ늚[3ûĺ3;ëʬi°®¶Ùg뺛ÂñmÐï±®ÀÙù2:<Ѥør„y<1¥!;²ð*Jx±žð¥;\7¬Ã ŠËIwŠÀdA²8‘b€ò73‹šÎ”)]2³°é®Ì!°gÀ9³¶©´¬qoO‹»)µ)»°3³Ày°0, Ä°xѤ4“„“ŠSÚ²üùf— ²¹Ÿhpx^ײ;ë¶ËY®¤Ò­zn Óä¶k9°j£9`›¨*¡„»›~ê¶Ài#c0¨nÛ¤äVƒ»YÝ1$ ³ù ‘s¡vú¹ËY…‘³. y~#ê¨Ù¢#£~›¦[®#ä1Ÿk›lá#TQÁ Ÿ»›±hº?åÀª¢çdKyû¹S:°û¢ùë)pZÛ 20[3‘‡;½Ð)gið p*¡Û‹š¬!º“º½°¹‹‚û3Ûk›i€¨Û»›ô1¾;ê¨Û œÛ4¤ë‹Ñ¦Û;¥] LÂS—Ÿ~1ëkšË‰¸ ¿¦9 ô½¦‰š£¿Vj¾¯iÁ¬ªÀ¶¸¦› +hÐ$ìašÀ©>ÔÀ¨ÀM‹ï«ÀS:$œŸÿ‰†E³d Ã˹$#$ª§ L &ú¢ÃhŠÄ£sš°ù%<¶©>E¶¢ÃŽk­a#rP¼G:u@¿L Æ‹;>§9¥uÂê Æü¥© ¿4y Æ4€šz€¼ùɦJ¿š±¹/Q=“ÇŽ·«a»ùG‹yŒ¤|óšMZ3Q‘įyÃLœŸŠjÁð[ö62÷v2à Œ~fèh”ŒšY@¿ž:kÑŸ”l›]2:îÙ#š)Ÿ_0yÐá“G¢Ë2ËÞÑXTBÝ k UB—_yÌó¨3©ž šýá÷Xq)“P™[ #†Ø,\ñÙÞñÌõäŒ-ÙÒ¨C™’‚¶ŒËMTÍ tÍvÍí¸Í¾Ì™ëœËB´ãÓxΞ&ÏÍCÏð¹™óYŸø"ùüŒ×XÎ?4•ÙP @•Ä!ïÙÍ©–L%Ì"CÌÆ,tù9¥*ɧa“éÁrÙõX/PÏ¿ìÑ^Y&ÂÒÌ#_PÍÅU=ñá[Ì<дœ˜ÜAœÑJ9˜c;\2 Ô=¼sõdX¤×{FLõ´Íwð`(™Tm Þ2ÛÜ– 43P4% ™„E•ÅÕv™˜1|ó£ÓˆrW*y"]qÀgÝŽ¾<Ó^#w­ÂH¹×U¢Í ¹d0ØØ2zÀÕõÔÖ™A{`GqÔsG4×#¸ÔØõôØ%‘o]{”Ý%rí[@—6[ð†ŒN¶ÚœÈÚhc#8Ò#}ÕñÜÕ1bÖ:òAýÐMíwÕi²†S ÓýÏ6¤PYOb˜?`}Ûb-\ræIgíÔiÍÕ#áÙéÖ’ [¤mÙ¦½Íˆ­Ø¶ÄÙlýÙéAÃ7ÚGí1áýiš½ÚÇ Ù¡=ÙÞÝÞIÙðÍ©]Þ¬½Ù'ÉOÛ7’# SÛÈmÜØÑ%ƒíÐUöÛ¼cþå/Êd $q!,ôñy€¬.ÈFñÃkÒó+§ Î0›(1 À ” @Ø)ÕÕ'0/fX5áXR-DvâÕk ƒâE½9‘43gi=¾u? favb8|D^ZÇM”ˆˆK±aâÔ;ž-X„-¸ML$BÑ&RZÎ3>Ð1¾¨_ÀèÚ¿.€3°JÔ2ðæqnJ$Ä05t~9à”Á~j2 av;ŽäFo2mnèC–Cˆþ0'EH´â7`Zs±¡.`7`h#壔 ès1S¾91 9‘ê?7ÒzÎT54Ñä}ç¨>©nä1–Ùì¡-°šã§âêd3( ³É-Àó80à9ÁìÕ Õ åaSëÒîBvòâ(@yÎÊÕ|µ3f}Jã27 D9PéJT5ìzéu®D¢Äæ*AÓÎ|1BàáZ*?cîJD½ê®âí>[ïÎ^;ÑÎÚ¥eït”ï£"2LÑïõï jéì>oéñŽðôŽY ïúN*•_ëŽQ_ñð~ðmžðô.[›Þð!ñHAò¯òÿïÕéçnðÔ‹.¸s1ž|±ñ-ßñ ó ÿðüNòáNm‡Nîµ’žIçô4ÀC0=q^Ëê”A[YÊ]§žêªn[¬~À®NG°žäŸ帮ßA·ë¯îcÂNìk`ìÈ>;ËžêÎ[ìQíˆ_ë ¨Ù¾íóÆM?ÛsðíØ±èÔFf~dî)_ðìþïË®ñ,?ï ó÷¿ï#Ï3–oS¯~ìeõ¬M³UZ6ç£ô43öŸ®½5 êf_êsêj¿êÒê¬÷²>÷µn÷#qäyß{ìÊá÷€Ÿìt0øÍžÏ~øÔþý²ø_TMb> VR”õöùäõ«/â¾öèqû“>û™nû´uêöÎûcÿÉÀOê‡&í©½çcÚ^“x{ÏïDÈ=ZW÷nÄ{iÃå»Ñ÷Ìß“ Çûi?í×ý¢ø›váïÚ1>mGþØÀ è/dT¾í îÒÌp,Pê5:˜-^ßÕÃx—Žöá?eEúø¨óe¢=â·ö àñs{ÉO.?ˆñàÏÑuÒîñ½êg¯ŸàcvÐðyÀ‘øB ØÛî€A¯{$ÒßûcÁÚäh`Õ»ÄþÕ¾²·½z Nê}doÔ=*'‹Û;‚0 Æ:°Ãü`‘{€§ yL? H‹ |Ê >h×A Àã¯5†çÁ Ì` \ã. ‚ êõç`$Y` ƒzºp Wž¼ûJôÉ<§—úl])„$Jb$(° [¡Á{…°Þ1=Ó7óžÞ(„·pè%@UhZ|!Ò}/ïãCZXóŽa2¤-Ë6C“÷ 9Þ蓆§OäUCE÷ ៣£z60öåÀLg ‡ž °ƒž®ÿý¾ ¸M !ÁW§ !´u‡ð î·(øü¦à°«‚PJBî§+!fñ‚ØŽ’øÐ\‚'\ƒ ªAF× ¤£™D¶Ã ¥ÿ6ô}ÿ¯¿ˆ àžƒ{ýpÖѽ&¡_\„s :B7¯ ácˆ”ð>ÄKøÇŸÂanÀ"ª@õWm29ĈæÐ ¦ÃúG½Øá)|‡ûïÊÔ(üú`Ì#.êÂA(›Ÿ´‰ŠP R¿ƒ¸{b$ü‰0 :Äj'þH £1à 5p[à9†§øÂªA ]€eà†Ï~ÃaižÄc†‚‘Fdh!‰ë†Io1–¾Æh m]`Œ¶°2Žº€—ƒ¡ÇcŒÅ°Þ<·Q¼Þ¿Û ™eåÆê4A0Œ…à05ŽC¦ØúvÇTÄz¿O÷q= §«rÀĨÁ/ÞÖ_b$‹…&J9ý$ èX‹Ö/!úÄí¢P¤‹˜°iacƒŒäÌP€}ñò…¨úÊao¬Zàˆx¦«…ë8A=Ø—£ñÓ‡BÇèü¨ãMT‹Œ-^@ž ³ßBìŽA‘ Eñ§@ÔÀ{øH©H¥ÇŒøŸ"G”qþÉGŒ‚¹—‚ŠGJ?ÎCþ¨Yâ û&È™§#Z4ÖÑ fG©á¢\üŽŠVÈ ù* ©ØM±ýµG¨øß :Üt"'€€ô6C P‘\±EÀ‰ü䤑òFê=™á‚t‹ÒGzG É&‰"¶Ã7fÀ‘ )2z†(H ²GÉA¤ü‹têzaEΠ“ À’ô°?ºÈ|#¤Œü’f±&溘#±#Bä‘Û1 FHK8­]Q$§™ä ¹Ïàz,w|’õÍÀ (ëŸ)tËnJ¢È€(Yä\”F@:DZ) ¡œ”Õ'êÄ3Ù 7à$ô~m²SÖÅmWé@†œ|¥²êITIä2Ý” x©ü>¾ ôJ#nDÔð19n‰-mݶˆ˜¦YØôPßn|Mò7âÀ%+e‹rª•ÉñVnIFÙ%å“gXÈ‚h)Ûb±|?2Y‚Ç¢(¿yl 09äÉS¹ûdüC‡ñ1P^ÆB)~ð¥äƒþ‘_ÆÈçØ+¥ãÝK„8RXšI+ø¹cÂä” Û5Lò8¹ÄžŒ–PqZ’<E9ƒÐK…;¯öMIWè £!¸t—ñ3Ü?t 4C‚Ð$réR1ÍͨÆ{ˆÉèŒëEg&ÈX —ía%P«ðRâƒnØQ½A5°†â0bÃl0 Y)íH4y6yjø Áa8°M·™˜™–ûáa<ØÇØš@*À e ¨@ öÀ tÈù€ €` :x“|€Gà ’;ôap|° €rP¨À/ðàP@ Œü r2@üAî<œàøo<ØC x<™'€ 0à@?àÌ@€À?@žÀ<ðVÁ;àxrÂÎäin@ïà@p ? ÿ|ùÀü‚?Àà=€Ÿ 8€à<@ œO ’gò` y6€@À Ñ Rè"t|ƒGàÁ=€²Sð_?9¨åd¼ ô‚<‡g1ˆÔ |PaðC9À#°ßÀy|€=ûÀ> És‚ȉœg(Ÿçs€À>çù<à„ƒð ÈÁ?€ôŒ€\0ÄÁ*ðJÀ9zFÀ&èo@Pƒ`Îg`€@ æâ<Ÿ_¼ƒÐ ©¤A@Ò&)å<Ÿé3Êö((à„*LéxìƒA@¾8ˆ£°Ó¸TPÁ2PЗðà=¶@ÜRWÊœÁ8`tâÒÐÁëÜ àu€°A}€6à{D'(¥ €yšÐhJÀ÷l¥ à<€àðŸ xpàHÀ8Õüw` |ÁøË´…B€ðì>àìƒ ð€A˜œèƒ‹Š 800 € © ý ˜RT*ø@0N°Q7(ب‡ô,€f° AM57õ”€pþAà?šnÔ`¸¡”lTÀ gTªw€ ÐM±ªU5`£ €A¡ªAÐ8 €ÌI9-§HÝ `£`ðŠj.X€ÀrÂUœ: N@ð ¸U®J9«iõ Ž€¨ö[Ð Á…Ô°¢ÏÀ àøÀ”àX)§eÕª’:€êYÁV=TÖðVEçs(0 :M(ø-t‘fÖóÙh§ €r’ÓÉ €ø©½•ô/ðØ(.? yÞlàV!kî|>àøP zÀøK@”‚9p\Mi¡u`8žk8öàøTóÚD*ø¨ÀÄO8  €[%´tÖÛª?=@€í¬àƒ¯‚ݧ ÖÁ&OððÀt®&ÏÐ8Áä `ªXÏJZ Àx?Àüw~j00ô”€a° @<¨*5ÃÆXpÀ@04¯„`ICèå<0Àð³"hòü¢¸€Á ðd&²T–rfÀ`È¢À|O³*À(©§4œƒ‘ bsläÄœÿà|€0 ~ÀX±BL€0š9§((K ÜX7»V ™už¼× ›T)èDpžXV³J9gú̬ hU°A5èåü• hÕBJ9éùï“ œVHjjaçà&£‚àb)ÿüòÀ„†S°Q?¨5ÿ¦*‚:P€åôµ–ÓLÚ :Á90¶=ô×b¢úîÀ?²”XN€,+¦ýOöÀƒŠ´ê°œà YªúZÑmˆ³˜Û¦¨óDŸZ5¸Ô€_ ä̬àÚÆÏ{9_m䄜7|x00*Hý wÞÙa kO¨÷Ý Ûw.ÀMÓÄ2[*p >å| €Ú¾kà>èx À²rЩ'67…nS¶:Bæ!dΞt€ºàrú\Êt{.Ñ¥œ€ ݦútÙjÐ}‘S!Xƒ`8AH¡I7Þr]Y"ú\º5T¥[tÙjغ¶•é3.ÀÙ-º§4 pJÑ®ð`ô]¼kŒAàl—éºÝu ÂñŒŸÎ ì€Æ{w €9ä4ì^  ªȩ«ð7èƒÍ˜xÑ€Y$jȨs!5~vh`N@ 5³·öB€ÐK¬V`½®73È–Úêð:n€ýùìÁû„Ì×ùîÑèû>ï§Aøïà}ªƒŠ}ß'8à¾ÙŒÛë~¿/ù}Ÿçàƒþ€ðkÔoùý +ÖûÂß÷«B?è¨ò× |ƒð[>èþ}Ÿôàƒ~‚òËj°÷eµ¿xßÝZjÿ€¾¯*Ú/ꀽo.T†>`p+©A÷à}ƒ¬I)çHÀ"8{Úz‹‚9(®·?àƒüb°~ÁÀ»`ͪbe0 ïàÈÚ‚g0Èÿ ”nÓy°€ B`Â÷õ†BappC×ÁûïÓ ƒÏª…G)°Â'4 _á÷iSéíøH8 ¯Ô JÓ0^ÃôÖ á1¼R¥*ådsX _UÇ«U k~¥· ¿á V)§@uÃdø¬Ò[00‡·0l½¾ôâD|[éí0hÄ£”°RÓΚA&n¡‘•SÖI¬Y9넵¬Ÿ8´RÎÑúd=ª~Ÿ°3µ~ƒx@.jjý´ØŒR΀‹ÿ. àÐbXl]Y«0öÅšµ|€\œŒ—q-FŸö c°z`Ÿ¬‚°–Ã[“Š`+,>ŸvµvX$|oGì‹]­'ökVÛŠ‡:Ö±O¶Ç’ã![dãqKÝÆ”ÓÉjY\ðŽóq–ý¢WV³NÙ*Ë úñý²¥Öôã2{fYí9XÈp–ÕŽ‚y¬gù,ìÄ4ôãB ]Á½…ý¸Ò>Zƒ€ B²£½´ PdNtA)¨làOàVpøÄ¨µÔ‚0újM)fµœ×’bdK9‰("޶èv eƒ d@ >ÊÙÝ>å°…Á-å·Obt«n7hUîÞRUÈIoí­A Z•ìÛ~Û‡3+¸rX/Rà– ®¨Àsù†€…{†å2 иó._b¿,ó»ÅË£r²VÄü(@ÌÀ1#æ ™ý2°¹©4wK‹vÑ'Ï]º@·Ô&ÞÌytóñh–»_t4GÝ©{šmkÙ½»rȪÝÓìváng¦»v7î²U@vù®ÔÅ» €ÞÁ+w8¼´™!pÝÜ l¯ì¥½ÍDyLP-1.6.0/DyLP/doc/Figures/primal1flow.epsu0000644000076700007670000056220511171477034015417 0ustar %!PS-Adobe-3.0 EPSF-3.0 %%Title: /cs/mitacs1/lou/Bonsai/Doc/Dylp.New/Figures/primal1flow.epsu %%Creator: IslandDraw for lou %%CreationDate: Wed Sep 14 11:02:30 2005 %%Pages: 1 %%BoundingBox: 31 61 589 750 %%DocumentNeededResources: (atend) %%DocumentSuppliedResources: (atend) %%EndComments %%BeginPreview: 699 862 1 2586 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000013 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000001c % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000013 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000e % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000006 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000d % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000017 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000001d % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000006 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 0000000000000000000c % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 00000000000000000017 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 00000000000000000005 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 00000000000000000010 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 0000000000000000001b % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 00000000000000000006 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 00000000000000000011 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 0000000000000000001c % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 00000000000000000007 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 00000000000000000012 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 0000000000000000001d % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 00000000000000000008 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 00000000000000000013 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 0000000000000000001e % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 00000000000000000009 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000ff0000000000000000000000000000000000 % 00000000000000000014 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000ff0000000000000000000000000000000000 % 0000000000000000001f % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000fe0000000000000000000000000000000000 % 0000000000000000000a % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000fe0000000000000000000000000000000000 % 00000000000000000015 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000007e0000000000000000000000000000000000 % 00000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000007c0000000000000000000000000000000000 % 0000000000000000000b % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000007c0000000000000000000000000000000000 % 00000000000000000016 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000003c0000000000000000000000000000000000 % 00000000000000000001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000380000000000000000000000000000000000 % 0000000000000000000c % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000380000000000000000000000000000000000 % 0000000000000000000d % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000180000000000000000000000000000000000 % 00000000000000000018 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000ffffffffffffffffffffffffffffffffffffff0000000000000000 % 00000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000800000000000000000000000000000000000030000000000000000 % 0000000000000000000e % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000800000000000000000000000000000000000030000000000000000 % 00000000000000000019 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000800000000000000000000000000000000000030000000000000000 % 00000000000000000004 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000800000000000000000000000000000000000030000000000000000 % 0000000000000000000f % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000800000000000000000000000000000000000030000000000000000 % 0000000000000000001a % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000800000000000000000000000000000000000030000000000000000 % 00000000000000000005 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000800000000430001001000010060220000000030000000000000000 % 00000000000000000010 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000800000000810001001100070020220000000030000000000000000 % 0000000000000000001b % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000800000001010000000100010020010000000030000000000000000 % 00000000000000000006 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000008000000011f77033733db811e2e610000000030000000000000000 % 00000000000000000011 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000080000000131220118911cc13333210000000030000000000000000 % 0000000000000000001c % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000800000001213201109108412121210000000030000000000000000 % 00000000000000000007 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000800000001211401109108412121210000000030000000000000000 % 00000000000000000012 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000800000001231401109108c32323210000000030000000000000000 % 0000000000000000001d % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000008000000011d8803b9f9cf879e3e210000000030000000000000000 % 00000000000000000008 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000800000001000800000008000000210000000030000000000000000 % 00000000000000000013 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000008000000008038fc000008000000a20000000030000000000000000 % 0000000000000000001e % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000080000000000600000001c000001c00000000030000000000000000 % 00000000000000000009 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000800000000000000000000000000000000000030000000000000000 % 00000000000000000014 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000800000000000000000000000000000000000030000000000000000 % 0000000000000000001f % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000800000000000000000000000000000000000030000000000000000 % 0000000000000000000a % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000008000800000066000000c0400404018800000030000000000000000 % 00000000000000000015 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000800080002002200000040400444008800000030000000000000000 % 00000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000800000002002200000040000040008000000030000000000000000 % 0000000000000000000b % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000008001b706f9e2203cdc7c0cdccfc78986b800030000000000000000 % 00000000000000000016 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000800098892212204262c40462444848897c00030000000000000000 % 00000000000000000001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000008000908ea072200e428404424441c88ec000030000000000000000 % 0000000000000000000c % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000080009081a19220324284044244464881c000030000000000000000 % 00000000000000000017 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000080009088a2322046428c04424448c888e400030000000000000000 % 00000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000008001f9cf39df703be7760ee7e7e77dcf3800030000000000000000 % 0000000000000000000c % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000800000000000000000000000000000000000030000000000000000 % 00000000000000000016 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000800000000000000000000000000000000000030000000000000000 % 0000000000000000001f % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000800000000000000000000000000000000000030000000000000000 % 00000000000000000016 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000800000000000000000000000000000000000030000000000000000 % 0000000000000000001f % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000800000000000000000000000000000000000030000000000000000 % 00000000000000000008 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000080000000400000007000c040000200000000030000000000000000 % 00000000000000000016 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000080000000c000000020004040004200000000030000000000000000 % 00000000000000000016 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000800000004000000020004000004000000000030000000000000000 % 00000000000000000011 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000800000dc5c7835c0203c5cce1ef677e00000030000000000000000 % 00000000000000000011 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000800000e662844be02066665f314223f00000030000000000000000 % 00000000000000000011 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000080000042421c760020424250204235000000030000000000000000 % 00000000000000000011 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000008000004242640e0020424250204215000000030000000000000000 % 00000000000000000011 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000080000046428c472070464659314219900000030000000000000000 % 00000000000000000011 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000008000007ce77679c0703c7c4e1e7708e00000030000000000000000 % 00000000000000000011 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000800000400000000000000040000000000000030000000000000000 % 00000000000000000011 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000800000400000000000000140000000000000030000000000000000 % 00000000000000000011 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000800000e00000000000000380000000000000030000000000000000 % 00000000000000000011 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000800000000000000000000000000000000000030000000000000000 % 00000000000000000011 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000800000000000000000000000000000000000030000000000000000 % 00000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000800000000000000000000000000000000000030000000000000000 % 00000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000800000000000000000000000000000000000030000000000000000 % 00000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000800000000000000000000000000000000000030000000000000000 % 00000000000000000013 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000ffffffffffffffffffffffffffffffffffffff0000000000000000 % 00000000000000000007 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000ffffffffffffffffffffffffffffffffffffff0000000000000000 % 0000000000000000001a % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 00000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 00000000000000000013 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 0000000000000000001c % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 00000000000000000013 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 0000000000000000000e % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 00000000000000000006 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 0000000000000000000d % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 00000000000000000017 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 0000000000000000001d % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 00000000000000000006 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 00000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 00000000000000000001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000c0100600000000000000000000000000000000 % 0000000000000000000c % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000f8103e00000000000000000000000000000000 % 00000000000000000017 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000ff11fe00000000000000000000000000000000 % 00000000000000000005 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000fffffe00000000000000000000000000000000 % 00000000000000000010 % 0000000000000000000000000000000000000000000000000000007fffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffff001b % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 0000000000000000000000000000000000000000ffd7fe00000000000000000000000000000000 % 00000000000000010006 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 0000000000000000000000000000000000000000fe10fe00000000000000000000000000000000 % 00000000000000010011 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 0000000000000000000000000000000000000000f0101e00000000000000000000000000000000 % 0000000000000001001c % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 000000000000000000000000000000000000000080100200000000000000000000000000000000 % 00000000000000010007 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 00000000000000010012 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 0000000000000001001d % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 000000000000000000000000000000000000000000ff0000000000000000000000000000000000 % 00000000000000010008 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 000000000000000000000000000000000000000000fe0000000000000000000000000000000000 % 00000000000000010013 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 000000000000000000000000000000000000000000fe0000000000000000000000000000000000 % 0000000000000001001e % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 000000000000000000000000000000000000000000fe0000000000000000000000000000000000 % 00000000000000010009 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 0000000000000000000000000000000000000000007c0000000000000000000000000000000000 % 00000000000000010014 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 0000000000000000000000000000000000000000007c0000000000000000000000000000000000 % 0000000000000001001f % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 0000000000000000000000000000000000000000007c0000000000000000000000000000000000 % 0000000000000001000a % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 0000000000000000000000000000000000000000003c0000000000000000000000000000000000 % 00000000000000010015 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 000000000000000000000000000000000000000000380000000000000000000000000000000000 % 00000000000000010000 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 000000000000000000000000000000000000000000380000000000000000000000000000000000 % 0000000000000001000b % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 000000000000000000000000ffffffffffffffffffffffffffffffffffffff0000000000000000 % 00000000000000010016 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 000000000000000000000000ffffffffffffffffffffffffffffffffffffff0000000000000000 % 00000000000000010001 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 000000000000000000000000800000000000000000000000000000000000030000000000000000 % 0000000000000001000c % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 000000000000000000000000800000000000000000000000000000000000030000000000000000 % 0000000000000001000d % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 000000000000000000000000800000000000000000000000000000000000030000000000000000 % 00000000000000010018 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 000000000000000000000000800000000000000000000000000000000000030000000000000000 % 00000000000000010003 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 000000000000000000000000800000000218000000200000c80080000000030000000000000000 % 0000000000000001000e % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 000000000000000000000000800000000408000000200000480080000000030000000000000000 % 00000000000000010019 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 000000000000000000000000800000000808000000000000400040000000030000000000000000 % 00000000000000010004 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 0000000000000000000000008000000008f9dc0ddf66ec7859b840000000030000000000000000 % 0000000000000001000f % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 000000000000000000000000800000000988880e6823328448c440000000030000000000000000 % 0000000000000001001a % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 000000000000000000000000800000000908c8042822221c488440000000030000000000000000 % 00000000000000010005 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 000000000000000000000000800000000908500428222264488440000000030000000000000000 % 00000000000000010010 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 00000000000000000000000080000000091850046822228c488440000000030000000000000000 % 0000000000000001001b % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 0000000000000000000000008000000008ec2007dc777776fdce40000000030000000000000000 % 00000000000000010006 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 000000000000000000000000800000000800200400000000000040000000030000000000000000 % 00000000000000010011 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 000000000000000000000000800000000400e7e400000000000080000000030000000000000000 % 0000000000000001001c % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 000000000000000000000000800000000001800e00000000000000000000030000000000000000 % 00000000000000010007 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 000000000000000000000000800000000000000000000000000000000000030000000000000000 % 00000000000000010012 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 000000000000000000000000800000000000000000000000000000000000030000000000000000 % 0000000000000001001d % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 000000000000000000000000800000000000000000000000000000000000030000000000000000 % 00000000000000010008 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 00000000000000000000000080003000000000000008000000000200c180030000000000000000 % 00000000000000010013 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 000000000000000000000000800010001000001000080000000002004080030000000000000000 % 0000000000000001001e % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 00000000000000000000000080001000100000100000000c000000004080030000000000000000 % 00000000000000010009 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 00000000000000000000000081ae1387bc0e373ce7db70707779f6785c8e030000000000000000 % 00000000000000010014 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 000000000000000000000000825f17cc501f1891f209888822848284669f030000000000000000 % 0000000000000001001f % 000000000000000000000000000000000000000000000000000000636000000000000000000000 % 00000000000000000000000083b014081010109102090888341c821c4290030000000000000000 % 0000000000000001000a % 000000000000000000000000000000000000000000000000000000612000000007ffffffffffff % ffffffffffffffffc0000000807014081010109102090870146482644290030000000000000000 % 00000000000000010015 % 000000000000000000000000000000000000000000000000000000614000000007ffffffffffff % ffffffffffffffffc00000008239164c5019109192090880188c828c4699030000000000000000 % 00000000000000010000 % 00000000000000000000000000000000000000000000000000000060c000000006000000000000 % 00000000000000004000000083ce3b879c0e39dce71f9cf80877c7767dce030000000000000000 % 0000000000000001000b % 000000000000000000000000000000000000000000000000000000608000000006000000000000 % 00000000000000004000000080000000000000000000008c000000000000030000000000000000 % 00000000000000010016 % 000000000000000000000000000000000000000000000000000000608000000006000000000000 % 00000000000000004000000080000000000000000000018c000000000000030000000000000000 % 00000000000000010001 % 000000000000000000000000000000000000000000000000000000630000000006000000000000 % 0000000000000000400000008000000000000000000000f0000000000000030000000000000000 % 0000000000000001000c % 0000000000000000000000000000000000000000000000000000006000000000061180000c0003 % 7b9e0101f000000840000000800000000000000000000000000000000000030000000000000000 % 00000000000000010017 % 000000000000000000000000000000000000000000000000000000600000000006208000040001 % 331a23008800008840000000800000000000000000000000000000000000030000000000000000 % 00000000000000010002 % 000000000000000000000000000000000000000000000000000000600000000006408000040001 % 310821008800008440000000800000000000000000000000000000000000030000000000000000 % 0000000000000001000c % 0000000000000000000000000000000000000000000000000000006000000000064f9dc07c71e1 % 11967970890b71e440000000ffffffffffffffffffffffffffffffffffffff0000000000000000 % 00000000000000010016 % 000000000000000000000000000000000000000000000003fffffffffffffc0006588880c4fa11 % 1a922188f319888440000000000000000001c00000000000030000000000000000000000000000 % 0000000000000001001f % 0000000000000000000000000000000000000000000000070000000000000e0006508c80848071 % 1ad221088109088440000000000000000003800000000000038000000000000000000000000000 % 00000000000000010016 % 00000000000000000000000000000000000000000000000e000000000000060006508500848191 % 0ae22108810908844000000000000000000700000000100001c000000000000000000000000000 % 0000000000000001001f % 00000000000000000000000000000000000000000000001c0000000000000300065185008cca31 % 0c622108c11908844000000000000000000600002000100000e000000000000000000000000000 % 00000000000000010008 % 000000000000000000000000000000000000000000000018000371c7ee000180064ec2007671db % 84473b9dc0ef9ce44000000000000000000c000020000000186000000000000000000000000000 % 00000000000000010016 % 00000000000000000000000000000000000000000000003000018be2440001c006400200000000 % 00000000000000044000000000000000001c1c6e79cfb6e0e03000000000000000000000000000 % 00000000000000010016 % 00000000000000000000000000000000000000000000007000010a03640000e006200e3f000000 % 0000000000000008400000000000000000383e3123e41311103800000000000000000000000000 % 00000000000000010011 % 0000000000000000000000000000000000000000000000e000010a01a800006006001800000000 % 000000000000000040000000000000000070202122041211101c00000000000000000000000000 % 00000000000000010011 % 0000000000000000000000000000000000000000000001c000010b21b000003006000000000000 % 000000000000000040000000000000000060202122041210e00e00000000000000000000000000 % 00000000000000010011 % 00000000000000000000000000000000000000000000018000039dc09000001806000000000000 % 0000000000000000400000000000000000c0322123241211000600000000000000000000000000 % 00000000000000010011 % 000000000000000000000000000000000000000000000300000000000000001c06000000000000 % 0000000003000000400000000000000001c01c73b9ce3f39f00300000000000000000000000000 % 00000000000000010011 % 000000000000000000000000000000000000000000000700000000000000000e06000108000000 % 201000000100000040000000000000000380000000000001180380000000000000000000000000 % 00000000000000010011 % 000000000000000000000000000000000000000000000e00000000000000000606000108000000 % 2010000001000000400000000000000007000000000000031801c0000000000000000000000000 % 00000000000000010011 % 00000000000000000000000000000000000000006c001c0000000000000000030600f3dee37637 % 783cf03ee11e770040000000000000000600000000000001e000e0000000000000000000000000 % 00000000000000010011 % 000000000000000000000000000000000000000032001800000018818000000186010909f19939 % a0119811f121160040000000000000000c00000000000000000060000000000000000000000000 % 00000000000000010011 % 0000000000000000000000000000000000000000220030000000088080100001c6003909011110 % a01108110107080040000000000000001c00000000000000000030000000000000000000000000 % 00000000000000010011 % 0000000000000000000000000000000000000000220070000000080080100000e600c909011110 % a011081101191c0040000000000000003800000000000000000038000000000000000000000000 % 00000000000000010011 % 00000000000000000000000000000000000000007700e03c79b8f98f9e3dc1a076011909911111 % a0111811912326004000000000000000700000000100606000001c000000000000000000000000 % 00000000000000010000 % 00000000000000000000000000000000000000000001c06284c58898a113e2403600edcee3bb9f % 381cf038e39df7004078000000000000600000000100202000000e000000000000000000000000 % 00000000000000010000 % 0000000000000000000000000000000000000000000180401c850890871203a01e000000000010 % 000000000000000043f8000000000000c000000000002020000006000000000000000000000000 % 00000000000000010000 % 00000000000000000000000000000000000000000003004064850890991200601e000000000010 % 00000000000000005ff8000000000001c0001dde7f1e2e23800003000000000000000000000000 % 00000000000000010013 % 000000000000000000000007ffffffffffffffffffff00628c851891a31322200e000000000038 % 00000000000000007fffffffffffffff800008a121213327c00003800000000000000000000000 % 00000000000000010007 % 000000000000000000000007fffffffffffffffffffe003c77ceedcedd9dc3c006000000000000 % 00000000000000007fffffffffffffff80000d0721072124000003800000000000000000000000 % 0000000000000001001a % 00000000000000000000000600000000000000000007000000000000000000000e000008000000 % 003000004000000047f8000000000001c000051921192124000007000000000000000000000000 % 00000000000000010000 % 00000000000000000000000600000000000000000003800000000000000000001e000008000200 % 001000084000000040f8000000000000e00006232123232640000e000000000000000000000000 % 00000000000000010013 % 00000000000000000000000600000000000000000001800000000000000000003e000000000200 % 001000080000000040180000000000007000021df39dbe7380000c000000000000000000000000 % 0000000000000001001c % 00000000000000000000000600000000000000000000c000000000000000000036000dd9dde781 % a711c3dec79b800040000000000000003000000000000000000018000000000000000000000000 % 00000000000000010013 % 00000000000000000000000600000000000000000000e000000000000000000066000e688b3202 % 4f93e6284ccc400040000000000001b01800000000000000000038000000000000000000000000 % 0000000000000001000e % 00000000000000000000000600000000000000000000700000002600c1800e00e6000428d21203 % a81204084848400040000000000000c81c00000000000000000070000000000000000000000000 % 00000000000000010006 % 0000000000000000000000060000000000000000000038000000220040803101c6000428521200 % 681204084848400040000000000000880e000000000000000000e0000000000000000000000000 % 0000000000000001000d % 000000000000000000000006000000000000000000001800000002004080210386000468623202 % 2c93262848c84000400000000000008807000000000000000000c0000000000000000000000000 % 00000000000000010017 % 000000000000000000000006000000000000000000000c079dde62785c8e0103060007dc21e383 % c739c3cee79ce00040000000000001dc0300000c0000000c380180000000000000000000000000 % 0000000000000001001d % 000000000000000000000006000000000000000000000e0848a12284669f020606000400000000 % 000000000000000040000000000000000180000400020004c40380000000000000000000000000 % 00000000000000010006 % 000000000000000000000006000000000000000000000701cd07221c4290040e06000400000000 % 0000000000000000400000000000000001c0000400020004840700000000000000000000000000 % 00000000000000010003 % 000000000000000000000006000000000000000000000386451922644290041c06000e00000000 % 0000000000000000400000000000000000e069c470f79c7c040e00000000000000000000000000 % 00000000000000010001 % 000000000000000000000006000000000000000000000188c623228c46990c3806000000000000 % 00000000000000004000000000000000007093e4f98a3ec4080c00000000000000000000000000 % 0000000000000001000c % 0000000000000000000000060000000000000000000000c7621df7767dce0c3006000000000000 % 000000000000000040000000000000000030ea0481022084101800000000000000000000000000 % 00000000000000010017 % 0000000000000000000000060000000000000000000000e0000000000000006006000000000000 % 0000000000000000400000000000000000181a0481022084103800000000000000000000000000 % 00000000000000010005 % 00000000000000000000000600000000000000000000007000000000000000e006000000000000 % 00000800000000004000000000000000001c8b24c98a328c307000000000000000000000000000 % 00000000000000010010 % 00000000000000000000000600000000000000000000003800000000000001c006000000000000 % 00000800000000004000000000000000000ef1ce70f39c7630e000000000000000000000000000 % 0000000000000001001b % 000000000000000000000006000000000000000000000018000000000000038006000006e78fbc % dd871ee3e68000004000000000000000000700000000000000c000000000000000000000000000 % 00000000000000010006 % 00000000000000000000000600000000000000000000000c000000000000030006000007384442 % 664f89f10900000040000000000000000003000000000000018000000000000000000000000000 % 00000000000000010011 % 00000000000000000000000600000000000000000000000e00000000000006000600000211c40e % 444809010e80000040000000000000000001800000000000038000000000000000000000000000 % 0000000000000001001c % 0000000000000000000000060000000000000000000000070000000000000e0006000002164432 % 444809010180000040000000000000000001ffffffffffffff0000000000000000000000000000 % 00000000000000010007 % 000000000000000000000006000000000000000000000003fffffffffffffc000600000238c446 % 444c89910880000040000000000000000000fffffffffffffe0000000000000000000000000000 % 00000000000000010012 % 000000000000000000000006000000000000000000000000000000000000000006000003e76e3b % eee70ee38f00000040000000000000000000000000100000000000000000000000000000000000 % 0000000000000001001d % 000000000000000000000006000000000000000000000000000000000000000006000002000000 % 000000000000000040000000000000000000000000100000000000000000000000000000000000 % 00000000000000010008 % 000000000000000000000006000000000000000000000000000000000000000006000002000000 % 000000000000000040000000000000000000000000100000000000000000000000000000000000 % 00000000000000010013 % 000000000000000000000006000000000000000000000000000000000000000006000007000000 % 000000000000000040000000000000000000000000100000000000000000000000000000000000 % 0000000000000001001e % 000000000000000000000006000000000000000000000000000000000000000006000000000000 % 00000000000000004000000000000000000000006c100000000000000000000000000000000000 % 00000000000000010009 % 000000000000000000000006000000000000000000000000000000000000000006000000000000 % 000000000000000040000000000000000000000024100000000000000000000000000000000000 % 00000000000000010014 % 000000000000000000000006000000000000000000000000000000000000000006000000000000 % 000000000000000040000000000000000000000028100000000000000000000000000000000000 % 0000000000000001001f % 000000000000000000000006000000000000000000000000000000000000000007ffffffffffff % ffffffffffffffffc0000000000000000000000018100000000000000000000000000000000000 % 0000000000000001000a % 000000000000000000000006000000000000000000000000000000000000000007ffffffffffff % ffffffffffffffffc0000000000000000000000010100000000000000000000000000000000000 % 00000000000000010015 % 000000000000000000000006000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000010100000000000000000000000000000000000 % 00000000000000010000 % 000000000000000000000006000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000060100000000000000000000000000000000000 % 0000000000000001000b % 000000000000000000000006000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 00000000000000010016 % 000000000000000000000006000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 00000000000000010001 % 000000000000000000000006000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 0000000000000001000c % 000000000000000000000006000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 0000000000000001000d % 000000000000000000000006000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 00000000000000010018 % 000000000000000000000006000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 00000000000000010003 % 000000000000000000000006000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 0000000000000001000e % 000000000000000000000006000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 00000000000000010019 % 000000000000000000000006000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 00000000000000010004 % 000000000000000000000006000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 0000000000000001000f % 000000000000000000000006000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 0000000000000001001a % 000000000000000000000006000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 00000000000000010005 % 000000000000000000000006000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 00000000000000010010 % 000000000000000000000006000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 0000000000000001001b % 000000000000000000000006000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 00000000000000010006 % 000000000000000000000006000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 00000000000000010011 % 000000000000000000000006000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 0000000000000001001c % 000000000000000000000006000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 00000000000000010007 % 000000000000000000000006000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 00000000000000010012 % 000000000000000000000006000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 0000000000000001001d % 000000000000000000000006000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000100000000000000000000000000000000000 % 00000000000000010008 % 000000000000000000000006000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000ff0000000000000000000000000000000000 % 00000000000000010013 % 000000000000000000000006000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000ff0000000000000000000000000000000000 % 0000000000000001001e % 00000000000000000000000600000000007fffffffffffffffffffffffffffffffffffffffc000 % 000000000000000000000000000000000000000000fe0000000000000000000000000000000000 % 00000000000000010009 % 000000000000000000000006000000000060000000000000000000000000000000000000004000 % 000000000000000000000000000000000000000000fe0000000000000000000000000000000000 % 00000000000000010014 % 000000000000000000000006000000000060000000000000000000000000000000000000004000 % 0000000000000000000000000000000000000000007e0000000000000000000000000000000000 % 0000000000000001001f % 000000000000000000000006000000000060000000000000000000000000000000000000004000 % 0000000000000000000000000000000000000000007c0000000000000000000000000000000000 % 0000000000000001000a % 000000000000000000000006000000000060000000000000000000000000000000000000004000 % 0000000000000000000000000000000000000000007c0000000000000000000000000000000000 % 00000000000000010015 % 00000000000000000000000600000000006000000008c000000100000600200000800000004018 % 0000000000000000000000000000000000000000003c0000000000000000000000000000000000 % 00000000000000010000 % 0000000000000000000000060000000000600000001040000001000002002000108000000040f8 % 000000000000000000000000000000000000000000380000000000000000000000000000000000 % 0000000000000001000b % 0000000000000000000000060000000000600000002040000000000002000000104000000047f8 % 000000000000000000000000000000000000000000380000000000000000000000000000000000 % 00000000000000010016 % 00000000000000000000000600000000006000000027cee06e7f3761e26e6eef3c400000007fff % fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000 % 00000000000000010001 % 0000000000000000000000060000000000600000002c4440732119921273245990400000007fff % fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000 % 0000000000000001000c % 000000000000000000000006000000000060000000284640212111107221269090400000004ff8 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010017 % 0000000000000000000000060000000000600000002842802121111192212290904000000041f8 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010002 % 00000000000000000000000600000000006000000028c280232111123223231190400000004038 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001000c % 0000000000000000000000060000000000600000002761003e73bbb9df3e710f1c400000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010016 % 000000000000000000000006000000000060000000200100200000000020000000400000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001001f % 00000000000000000000000600000000006000000010071fa00000000020000000800000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010016 % 000000000000000000000006000000000060000000000c00700000000070000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001001f % 000000000000000000000006000000000060000000000000000000000000000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010008 % 000000000000000000000006000000000060000000000000000000000000000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010016 % 000000000000000000000006000000000060000030000018000008000000000200c0c000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010016 % 000000000000000000000006000000000060000010001008000008000000000200404000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010011 % 000000000000000000000006000000000060000010001008000000000c00000000404000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010011 % 00000000000000000000000600000000006001ae1387bc08e3c779b8703bf8fe3c5c4710004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010011 % 000000000000000000000006000000000060025f17cc5009f42228c48811844242664f90004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010011 % 00000000000000000000000600000000006003b01408100900e34884881a1c420e424800004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010011 % 00000000000000000000000600000000006000701408100903214884700a644232424800004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010011 % 0000000000000000000000060000000000600239164c500994618884800c8c4246464c90004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010011 % 00000000000000000000000600000000006003ce3b879c1ce3b09dcef80476e73b7ce710004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010011 % 000000000000000000000006000000000060000000000000000000008c00000000000010004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010011 % 000000000000000000000006000000000060000000000000000000018c00000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010011 % 00000000000000000000000600000000006000000000000000000000f000000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010011 % 000000000000000000000006000000000060000000000000000000000000000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010000 % 000000000000000000000006000000000060000000000000000000000000000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010000 % 000000000000000000000006000000000060000000000000000000000000000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010000 % 000000000000000000000006000000000060000000000001000000c00001000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010013 % 000000000000000000000006000000000060000000000001000040400001000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010007 % 000000000000000000000006000000000060000000000000000040400000000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001001a % 0000000000000000000000060000000000600000000001bb3bbcf05c786b0d4000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010000 % 0000000000000000000000060000000000600000000001cd116640668491124000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010013 % 0000000000000000000000060000000000600000000000851a4240421ce91d0000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001001c % 0000000000000000000000060000000000600000000000850a4240426419030000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010013 % 00000000000000000000000600000000006000000000008d0c4640468c89114000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001000e % 0000000000000000000000060000000000600000000000fb843c707c76f39e4000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010006 % 000000000000000000000006000000000060000000000080000000000000004000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001000d % 000000000000000000000006000000000060000000000080000000000000000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010017 % 0000000000000000000000060000000000600000000001c0000000000000000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001001d % 000000000000000000000006000000000060000000000000000000000000000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010006 % 000000000000000000000006000000000060000000000000000000000000000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010003 % 000000000000000000000006000000000060000000180000000000401818000007c7c7f0004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010001 % 000000000000000000000006000000000060000000080100000000400808000002284230004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001000c % 000000000000000000000006000000000060000000080100000000000808000002282208004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010017 % 0000000000000000000000060000000000600109b8f9e3dc077f1fc78b88e1a0022e0240004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010005 % 0000000000000000000000060000000000600319cd8a113e023088484cc9f24003c3c3c0004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010010 % 00000000000000000000000600000000006001088508712003438841c84903a002002240004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001001b % 000000000000000000000006000000000060010885099120014c88464849006002082208004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010006 % 00000000000000000000000600000000006001188d1a313201918848c8c99224030c4210004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010011 % 00000000000000000000000600000000006000ecf8edd9dc008edce76f9ce3c4070f87f0004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001001c % 000000000000000000000006000000000060000080000000000000000000000400000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010007 % 000000000000000000000006000000000060000080000000000000000000000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010012 % 0000000000000000000000060000000000600001c0000000000000000000000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001001d % 000000000000000000000006000000000060000000000000000000000000000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010008 % 000000000000000000000006000000000060000000000000000000000000000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010013 % 000000000000000000000006000000000060000000000000000000000000000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001001e % 000000000000000000000006000000000060000000000000000006000000300000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010009 % 000000000000000000000006000000000060000000000000000002000000100000010000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010014 % 000000000000000000000006000000000060000000000000000002000000100000010000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001001f % 0000000000000000000000060000000000600371e7dbb0d007dc3e213c71f01e786bc6a0004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001000a % 000000000000000000000006000000000060018b320cc920023e626362fb1031cc910920004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010015 % 000000000000000000000006000000000060010a120889d0022042214082102084e90e80004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010000 % 000000000000000000000006000000000060010a12088830022042214082102084190180004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001000b % 000000000000000000000006000000000060010a320889120232462362ca30318c8908a0004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010016 % 000000000000000000000006000000000060039de71ddde2071c3b1dbc71d81e78f1cf20004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010001 % 000000000000000000000006000000000060000000000002000000000000000000000020004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001000c % 000000000000000000000006000000000060000000000000000000000000000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001000d % 000000000000000000000006000000000060000000000000000000000000000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010018 % 000000000000000000000006000000000060000000000000000000000000000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010003 % 000000000000000000000006000000000060000000000000000000000000000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001000e % 000000000000000000000006000000000060000000180000000000000000000010000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010019 % 000000000000000000000006000000000060000000080004000000100000100010000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010004 % 000000000000000000000006000000000060000000080004000000100000100000001800004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001000f % 0000000000000000000000060000000000600000d708e3cf0dc39dfc0e6e3dc7f370e000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001001a % 00000000000000000000000600000000006000012f89f6240627c5901f3113e211891000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010005 % 0000000000000000000000060000000000600001d8090404042402101021120211091000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010010 % 00000000000000000000000600000000006000003809040404240710102112021108e000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001001b % 00000000000000000000000600000000006000011c899624042649901921132211090000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010006 % 0000000000000000000000060000000000600001e71ce3c70e739ddc0e739dc73b9df000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010011 % 000000000000000000000006000000000060000000000000000000000000000000011800004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001001c % 000000000000000000000006000000000060000000000000000000000000000000031800004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010007 % 00000000000000000000000600000000006000000000000000000000000000000001e000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010012 % 000000000000000000000006000000000060000000000000000000000000000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001001d % 000000000000000000000006000000000060000000000000000000000000000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010008 % 000000000000000000000006000000000060000000000000000000000000000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010013 % 00000000000000000000000600000000006000000000000000000200c180000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001001e % 000000000000000000000006000000000060000000000000000002004080000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010009 % 000000000000000000000006000000000060000000000000000000004080000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010014 % 0000000000000000000000060000000000600000000000007779f6785c8e000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001001f % 00000000000000000000000600000000006000000000000022848284669f000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001000a % 000000000000000000000006000000000060000000000000341c821c4290000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010015 % 000000000000000000000006000000000060000000000000146482644290000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010000 % 000000000000000000000006000000000060000000000000188c828c4699000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001000b % 0000000000000000000000060000000000600000000000000877c7767dce000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010016 % 000000000000000000000006000000000060000000000000000000000000000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010001 % 000000000000000000000006000000000060000000000000000000000000000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001000c % 000000000000000000000006000000000060000000000000000000000000000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010017 % 000000000000000000000006000000000060000000000000000000000000000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010002 % 000000000000000000000006000000000060000000000000000000000000000000000000004000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001000c % 00000000000000000000000600000000007fffffffffffffffffffffffffffffffffffffffc000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010016 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001001f % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010016 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001001f % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010008 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010016 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010016 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010011 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010011 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010011 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010011 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010011 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010011 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010011 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010011 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010011 % 000000000000000000000006000000000000000000000000000003fc0000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010011 % 000000000000000000000006000000000000000000000000000003fc0000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010011 % 000000000000000000000006000000000000000000000000000003f80000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010000 % 000000000000000000000006000000000000000000000000000001f80000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010000 % 000000000000000000000006000000000000000000000000000001f80000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010000 % 000000000000000000000006000000000000000000000000000001f00000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010013 % 000000000000000000000006000000000000000000000000000000f00000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010007 % 000000000000000000000006000000000000000000000000000000f00000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001001a % 000000000000000000000006000000000000000000000000000000e00000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010000 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010013 % 0000000000000000000000060000000007fffffffffffffffffffffffffffffffffffffffffe00 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001001c % 0000000000000000000000060000000007fffffffffffffffffffffffffffffffffffffffffe00 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010013 % 000000000000000000000006000000000600000000000000000000000000000000000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001000e % 000000000000000000000006000000000600000000000000000000000000000000000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010006 % 000000000000000000000006000000000600000000000000000000000000000000000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001000d % 000000000000000000000006000000000600000000000000000000000000000000000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010017 % 000000000000000000000006000000000600000000000000000000000000000000000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001001d % 000000000000000000000006000000000600000000000000000000000000000000000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010006 % 00000000000000000000000600000000060000000000010c000060000000000800000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010003 % 000000000000000000000006000000000600000000000204000020000000000800000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010001 % 000000000000000000000006000000000600000000000404000020000000000400000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001000c % 00000000000000000000000600000000060000000000047cee03e4239b8dc78400000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010017 % 0000000000000000000000060000000006000000000004c444062c67cc46284400000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010005 % 00000000000000000000000600000000060000000000048464042424084421c400000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010010 % 000000000000000000000006000000000600000000000484280424240844264400000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001001b % 00000000000000000000000600000000060000000000048c28046466484428c400000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010006 % 0000000000000000000000060000000006000000000004761003b3b39cee776400000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010011 % 000000000000000000000006000000000600000000000400100000000000000400000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001001c % 00000000000000000000000600000000060000000000020073f000000000000800000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010007 % 000000000000000000000006000000000600000000000000c00000000000000000000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010012 % 000000000000000000000006000000000600000000000000000000000000000000000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001001d % 000000000000000000000006000000000600000000000000000000000000000000000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010008 % 000000000000000000000006000000000600000000000000000000000000000000000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010013 % 000000000000000000000006000000000600000000000000100000000010000000000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001001e % 000000000000000000000006000000000600000000001001100000000010010000000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010009 % 000000000000000000000006000000000600000000001001000000000000010000000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010014 % 00000000000000000000000600000000066ef9ceee6e3de3f3bb81bb0f3373ce6e1e6e3c700600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001001f % 00000000000000000000000600000000067343e45f3112111117c0cc9091891f31213162f80600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001000a % 00000000000000000000000600000000062142069021107111a400888391091021072140800600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010015 % 00000000000000000000000600000000062142029021119110a400888c91091021192140800600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010000 % 00000000000000000000000600000000062343231921123110c640889191091921232162c90600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001000b % 00000000000000000000000600000000063ee1c10e739dd9f84381ddcefb9dce739df3bc710600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010016 % 000000000000000000000006000000000620000000000000000000000000000000000000010600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010001 % 000000000000000000000006000000000620000000000000000000000000000000000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001000c % 000000000000000000000006000000000670000000000000000000000000000000000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001000d % 000000000000000000000006000000000600000000000000000000000000000000000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010018 % 000000000000000000000006000000000600000000000000000000000000000000000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010003 % 000000000000000000000006000000000600000000000000000000000000000000000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001000e % 000000000000000000000006000000000600000000000000000000000000000000000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010019 % 000000000000000000000006000000000600000000000000000000000000000000000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010004 % 00000000000000000000000600000000060000000000e3ff3cf87ce3c79df8ff70000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001000f % 00000000000000000000000600000000060000000001f108664021f62cc8fc4220000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001001a % 00000000000000000000000600000000060000000001010842402104084d404320000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010005 % 000000000000000000000006000000000600000000010108424021040845404140000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010010 % 0000000000000000000000060000000006000000000191084640219628c6644140000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001001b % 00000000000000000000000600000000060000000000e39c3ce070e3c78238e080000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010006 % 000000000000000000000006000000000600000000000000000000000000000080000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010011 % 000000000000000000000006000000000600000000000000000000000000000380000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001001c % 000000000000000000000006000000000600000000000000000000000000000600000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010007 % 000000000000000000000006000000000600000000000000000000000000000000000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010012 % 000000000000000000000006000000000600000000000000000000000000000000000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001001d % 000000000000000000000006000000000600000000000000000000000000000000000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010008 % 000000000000000000000006000000000600000000000000000000000000000000000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010013 % 000000000000000000000006000000000600000000000000000000000000000000000000000600 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001001e % 0000000000000000000000060000000007fffffffffffffffffffffffffffffffffffffffffe00 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010009 % 000000000000000000000006000000000000000000000e00000000000000000700000000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010014 % 000000000000000000000006000000000000000000001c00000000000000000380000000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001001f % 0000000000000000000000060000000000000000000038000000000000000001c0000000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001000a % 0000000000000000000000060000000000000000000070000000000000000000e0000000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010015 % 00000000000000000000000600000000000000000000e000000000000000000070000000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010000 % 00000000000000000000000600000000000000000001c000000000000000000038000000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001000b % 00000000000000000000000600000000000000000003800000000000000000001c000000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010016 % 00000000000000000000000600000000000000000007000000000000000030300e000000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010001 % 0000000000000000000000060000000000000000000e0000000000000000101007000000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001000c % 0000000000000000000000060000000000000000001c0000000000000000101003800000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010017 % 0000000000000000000000060000000000000000003909b9f38f1e77e3ef1711c1c00000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010002 % 0000000000000000000000060000000000000000007318c487d8b323f1109993e0e00000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001000c % 000000000000000000000006000000000000000000e10884841021350103909200700000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010016 % 000000000000000000000006000000000000000001c1088484102115010c909200380000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001001f % 0000000000000000000000060000000000000000038118848658a31991119193201c0000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 00000000000000010016 % 00000000000000000000000600000000000000000700edcfc38f1e08e38edf39c00e0000000000 % 000000000000000000000000000000000000000000000000000000000000000018000000000000 % 0000000000000001001f % 00000000000000000000000600000000fffffffffe000000000000000000000000070000000000 % 00000ffffffffffffffffffffffffffffffffffffffffffc000000000000000018000000000000 % 00000000000000010008 % 00000000000000000000000600000000fffffffffe000000000000000000000000070000000000 % 00000ffffffffffffffffffffffffffffffffffffffffffc000000000000000018000000000000 % 00000000000000010016 % 00000000000000000000000600000000c0000000070000000000000000000000000e0000000000 % 00000c000000000000000000000000000000000000000004000000000000000018000000000000 % 00000000000000010016 % 00000000000000000000000600000000c0000000038000000000000000000000001c0000000000 % 00000c000000000000000000000000000000000000000004000000000000000018000000000000 % 00000000000000010011 % 00000000000000000000000600000000c000000001c00000000000000000000000380000000000 % 00000c000000000000000000000000000000000000000004000000000000000018000000000000 % 00000000000000010011 % 00000000000000000000000600000000c0000006c0e00000000000000000000000700000000000 % 00000c000000000000000000000000000000000000000004000000000000000018000000000000 % 00000000000000010011 % 00000000000000000000000600000000c0000002407000000000000001c0000000e00000000000 % 00000c000000000000000000000000000000000000000004000000000000000018000000000000 % 00000000000000010011 % 00000000000000000000000600000000c000000280380000000000000620000001c00000000000 % 00000c00000000000400000030000400c044000000000004000000000000000018000000000000 % 00000000000000010011 % 00000000000000000000000600000000c0000001801c0000000000000420000003800000000000 % 00000c00000000000900000010001c004044000000000004000000000000000018000000000000 % 00000000000000010011 % 00000000000000000000000600000000c0000001000e000000e3ff3cf820000007000000000000 % 00000c000000000011000000158004004002000000000004000000000000000018000000000000 % 00000000000000010011 % 00000000000000000000000600000000c00000010007000001f10866404000000e000000000000 % 00000c000000000013ff770f1237043c5cc2000000000004000000000000000018000000000000 % 00000000000000010011 % 00000000000000000000000600000000c00000060003800001010842408000001c000000000000 % 00000c000000000011122f90943984666642000000000004000000000000000018000000000000 % 00000000000000010011 % 00000000000000000000000600000000c00000000001c000010108424080000038000000000000 % 00000c0000000000111b28039e1084424242000000000004000000000000000018000000000000 % 00000000000000010011 % 00000000000000000000000600000000c00000000000e000019108464180000070000000000000 % 00000c0000000000110d480c921084424242000000000004000000000000000018000000000000 % 00000000000000010011 % 00000000000000000000000600000000c00000000000700000e39c3ce1800000e0000000000000 % 00000c0000000000110d8c9193118c464642000000000004000000000000000018000000000000 % 00000000000000010000 % 00000000000000000000000600000000c0000000000038000000000000000001c0000000000000 % 00000c000000000011c4870efb9f1e3c7c42000000000004000000000000000018000000000000 % 00000000000000010000 % 00000000000000000000000600000007f800000000001c00000000000000000380000000000000 % 00000c000000000010000000001000000042000000000004000000000000000018000000000000 % 00000000000000010000 % 00000000000000000000000600000007f800000000000e00000000000000000700000000000000 % 00000c000000000008000000001000000144000000000004000000000000000018000000000000 % 00000000000000010013 % 00000000000000000000000600000003f8000000000007fffffffffffffffffe00000000000000 % 00000c000000000000000000003800000380000000000004000000000000000018000000000000 % 00000000000000010007 % 00000000000000000000000600000003f800000000000ffffffffffffffffffe00000000000000 % 00000c000000000000000000000000000000000000000004000000000000000018000000000000 % 0000000000000001001a % 00000000000000000000000600000003f000000000001c00000000000000000300000000000000 % 00000c000003100000000604000010000000200003000004000000000000000018000000000000 % 00000000000000010000 % 00000000000000000000000600000001f000000000003800000000000000000180000000000000 % 00000c000001100002000204000210000000600001000004000000000000000018000000000000 % 00000000000000010013 % 00000000000000000000000600000001f0000000000070000000000000000000c0000000000000 % 00000c000001000002000200000200000000200001580004000000000000000018000000000000 % 0000000000000001001c % 00000000000000000000000600000001e00000000000e000000000000000000060000000000000 % 00000c000f1f3108d781e2ec70f7b3bf000f2e3879200004000000000000000018000000000000 % 00000000000000010013 % 00000000000000000000000600000000e00000000001c000000000000000000030000000000000 % 00000c0010b1131922033334f98a111f8018b17cc5400004000000000000000018000000000000 % 0000000000000001000e % 00000000000000000000000600000000e000000000038000000000000000000018000000000000 % 00000c0003a11109d2021214810211a80010214081e00004000000000000000018000000000000 % 00000000000000010006 % 00000000000000000000000600000000c00000000007000000000000000000000c000000000000 % 00000c000ca1110832021214810210a80010214081200004000000000000000018000000000000 % 0000000000000001000d % 0000000000000000000000060000000040000000000e0000000000000000000006000000000000 % 00000c0011a3111912023234c98a10cc8818a164c5300004000000000000000018000000000000 % 00000000000000010017 % 0000000000000000000000060000000000000000001c0000000000000000000003000000000000 % 00000c000edd90ede381e3e470f3b847080f73b87bb80004000000000000000018000000000000 % 0000000000000001001d % 000000000000000000000006000000000000000000380000000000000000000001800000000000 % 00000c000000100000000004000000000800000000000004000000000000000018000000000000 % 00000000000000010006 % 000000000000000000000006000000000000000000700000000000000000000000c00000000000 % 00000c000000500000000014000000000000000000000004000000000000000018000000000000 % 00000000000000010003 % 000000000000000000000006000000000000000000e000000c0000000180061c00600000000000 % 00000c000000e00000000038000000000000000000000004000000000000000018000000000000 % 00000000000000010001 % 000000000000000000000006000000000000000001c00000040000000080026200300000000000 % 00200c000000000000000000000000000000000000000004000000000000000018000000000000 % 0000000000000001000c % 000000000000000000000006000000000000000003800000040000000080024200180000000000 % 003c0c000000000000000000000000000000000000000004000000000000000018000000000000 % 00000000000000010017 % 00000000000000000000000600000000000000000700085b85cf109b8f8e3e02000c0000000000 % 003f8c00000000080000300e000013016200000070000004000000000000000018000000000000 % 00000000000000010005 % 00000000000000000000000600000000000000000e0018cc4679b18c589f620400060000000000 % 003ffc000000000800001010000011012220000080000004000000000000000018000000000000 % 00000000000000010010 % 00000000000000000000000600000000000000000c00084844309088509042080003ffffffffff % fffffc000000000000001010000001002020000080000004000000000000000018000000000000 % 0000000000000001001b % 00000000000000000000000600000020000000000e000848443090885090420800060000000000 % 003ffc00000373f9bb0f1039c7837173267bb879c0000004000000000000000018000000000000 % 00000000000000010006 % 0000000000000000000000060000002000000000070008c84471918851994618000c0000000000 % 003f8c0000039908cc909013e8449199222110cc80000004000000000000000018000000000000 % 00000000000000010011 % 0000000000000000000000060007ce7909fdc0000380077ce7cf0edceece3b1800180000000000 % 003c0c00000109088883901201c751092221908480000004000000000000000018000000000000 % 0000000000000001001c % 00000000000000000000000600021f231886200001c00000000000000000000000300000000000 % 00200c0000010908888c90120640d1092220a08480000004000000000000000018000000000000 % 00000000000000010007 % 000000000000000000000006000210210884200000e00000000000000000000000606c00000000 % 00000c00000119088891901328c451192220a08c80000004000000000000000018000000000000 % 00000000000000010012 % 000000000000000000000006000210210884200000700000000000000000000000c03200000000 % 00000c000001f39dddcef839c767b9f3f7384079c0000004000000000000000018000000000000 % 0000000000000001001d % 000000000000000000000006000219211884200000380000000000000000000001802200000000 % 00000c000001000000000000000000000000400000000004000000000000000018000000000000 % 00000000000000010008 % 00000000000000000000000600070e38edce7000001c0000000000000000000003002200000000 % 00000c000001000000000000000000000001c00000000004000000000000000018000000000000 % 00000000000000010013 % 0000000000000000000000060000000000000000000e0000000000000000000006007700000000 % 00000c000003800000000000000000000003000000000004000000000000000018000000000000 % 0000000000000001001e % 00000000000000000000000600000000000000000007000000000000000000000c000000000000 % 00000c000000000000000000000000000000000000000004000000000000000018000000000000 % 00000000000000010009 % 000000000000000000000006000000000000000000038000000000000000000018000000000000 % 00000c0000000004018180000400001810000040000000040000000000000000186c0000000000 % 00000000000000010014 % 00000000000000000000000600000000000000000001c000000000000000000030000000000000 % 00000c000000000400808000040000081000084000000004000000000000000018240000000000 % 0000000000000001001f % 00000000000000000000000600000000000000000000e000000000000000000060000000000000 % 00000c000000000000808000000000080000080000000004000000000000000018280000000000 % 0000000000000001000a % 0000000000000000000000060000000000000000000070000000000000000000c0000000000000 % 00000c000077f1fc78b88e1a0db8078bb1c3decefc000004000000000000000018180000000000 % 00000000000000010015 % 000000000000000000000006000000000000000000003800000000000000000180000000000000 % 00000c000023088484cc9f2404c40cccd3e628447e000004000000000000000018100000000000 % 00000000000000010000 % 000000000000000000000006000000000000000000001c00000000000000000300000000000000 % 00000c00003438841c84903a0484084852040846a0000004000000000000000018100000000000 % 0000000000000001000b % 00000000000000000000000600001cfbef3e000000000ffffffffffffffffffe00000000000000 % 00000c000014c884648490060484084852040842a0000004000000000000000018600000000000 % 00000000000000010016 % 00000000000000000000000600003e4119900000000007fffffffffffffffffc00000000000000 % 00000c00001918848c8c9922048408c8d326284332000004000000000000000018000000000000 % 00000000000000010001 % 000000000000000000000006000020411090000000000000000000600000000000000000000000 % 00000c000008edce76f9ce3c0fce078f91c3cee11c000004000000000000000018000000000000 % 0000000000000001000c % 000000000000000000000006000020411090000000000000000000600000000000000000000000 % 00000c000000000000000000000000001000000000000004000000000000000018000000000000 % 0000000000000001000d % 000000000000000000000006000032411190000000000000000000600000000000000000000000 % 00000c000000000000000000000000005000000000000004000000000000000018000000000000 % 00000000000000010018 % 00000000000000000000000600001ce38f38000000000000000000600000000000000000000000 % 00000c00000000000000000000000000e0000000000000040000000000ffffffffffffff000000 % 00000000000000010003 % 000000000000000000000006000000000000000000000000000000636000000000000000000000 % 00000c0000000000000000000000000000000000000000040000000000c0000000000003800000 % 0000000000000001000e % 000000000000000000000006000000000000000000000000000000612000000000000000000000 % 00000c000000000000000000000000000000000000000004000000000180000000000001c00000 % 00000000000000010019 % 000000000000000000000006000000000000000000000000000000614000000000000000000000 % 00000c000000000000000000000000000000000000000004000000000380000000080000c00000 % 00000000000000010004 % 00000000000000000000000600000000000000000000000000000060c000000000000000000000 % 00000ffffffffffffffffffffffffffffffffffffffffffc000000000700001000080000600000 % 0000000000000001000f % 000000000000000000000006000000000000000000000000000000608000000000000000000000 % 00000ffffffffffffffffffffffffffffffffffffffffffc000000000e0000100000000c700000 % 0000000000000001001a % 000000000000000000000006000000000000000000000000000000608000000000000000000000 % 000000000000000380000000000000000000700000000000000000000c0e373ce7db7070380000 % 00000000000000010005 % 000000000000000000000006000000000000000000000000000000630000000000000000000000 % 00000000000000070000000000000000000038000000000000000000181f1891f20988881c0000 % 00000000000000010010 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 000000000000000e000000000000000000001c00000000000000000038101091020908880c0000 % 0000000000000001001b % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 000000000000001c000000000000000000000e0000000000000000007010109102090870060000 % 00000000000000010006 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 00000000000000380000000000000000000007000000000000000000e019109192090880070000 % 00000000000000010011 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 000000000000007000200000c000000c0000c3800000000000000000c00e39dce71f9cf8038000 % 0000000000000001001c % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 00000000000000e00020000040000004000041c00000000000000001800000000000008c01c000 % 00000000000000010007 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 00000000000001c00000000040000004000040e00000000000000003800000000000018c00c000 % 00000000000000010012 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 000000000000038dcfe6ec3c4079f07c42784070000000000000000700000000000000f0006000 % 0000000000000001001d % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 000000000000070e6423324240cc80c4c6844038000000000000000e0000000000000000007000 % 00000000000000010008 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 0000000000000e042422220e40848084421c401c000000000000000c0000000080303000003800 % 00000000000000010013 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 0000000000001c0424222232408480844264400e00000000000000180000000080101000001c00 % 0000000000000001001e % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 000000000000380464222246408c808c468c400700000000000000380000000000101000000c00 % 00000000000000010009 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 0000000000007007ce77773be079c0763b76e0038000000000070070000eef3f8f1711c0000600 % 0000000000000f010014 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 000000000000e004000000000000000000000001c00000000007e0e000045090909993e0000700 % 0000000000000fe1001f % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 000000000001c004000000000000000000000000e00000000007fcc00006839083909200000380 % 0000000000000ffd000a % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 000000000001800e0000000000000000000000007fffffffffffff8000028c908c9092000001ff % ffffffffffffffff0015 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 000000000001c0000000000000000000000000007fffffffffffffc000031190919193200001ff % ffffffffffffffff0000 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 000000000000e000000000000000000000000000e00000000007f8e000010ef9cedf39c0000300 % 0000000000000ff1000b % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 0000000000007000000000000000000000000001c00000000007c0600000000000000000000700 % 0000000000000f810016 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 00000000000038000001c000026060070000000380000000000600300000000000000000000e00 % 0000000000000c010001 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 0000000000001c0000020000022020188000000706c00000000000380000000000000000001c1b % 0000000000000001000c % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 0000000000000e0000020000002020108000000e032000000000001c000000000000000000180c % 80000000000000010017 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 0000000000000700000738786e2e23808000001c022000000000000e0000000000000000003008 % 80000000000000010002 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 000000000000038000027c84923327c1000000380220000000000006000006000000061c007008 % 8000000000000001000c % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 00000000000001c00002401cea212402000000700770000000000003000002000100026200e01d % c0000000000000010016 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 00000000000000e0000240641a212402000000e00000000000000003800002000100024201c000 % 0000000000000001001f % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 00000000000000700002648c8a232646000001c00000000000000001c034e2387bce3e02018000 % 00000000000000010016 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 000000000000003800073876f73e7386000003800000000000000000e049f27cc51f6204030000 % 0000000000000001001f % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 000000000000001c00000000000000000000070000000000000000006075024081104208070000 % 00000000000000010008 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 000000000000000e000000000000000000000e000000000000000000300d0240811042080e0000 % 00000000000000010016 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 0000000000000007000000000000000000001c00000000000000000038459264c51946181c0000 % 00000000000000010016 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 000000000000000380000000000000000000380000000000000000001c78e73879ce3b18180000 % 00000000000000010011 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 0000000000000001c0000000000000000000700000000000000000000e00000000000000300000 % 00000000000000010011 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 0000000000000000ffffffffffffffffffffe00000000000000000000600000000000000700000 % 00000000000000010011 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 00000000000000000000000000c000000000000000000000000000000300000000000000e00000 % 00000000000000010011 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 00000000000000000000000000c000000000000000000000000000000380000000000001c00000 % 00000000000000010011 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 00000000000000000000000000c0000000000000000000000000000001c0000000000001800000 % 00000000000000010011 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 00000000000000000000000000c0000000000000000000000000000000ffffffffffffff000000 % 00000000000000010011 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 00000000000000000000000000c06c00000000000000000000000000007fffffffffffff000000 % 00000000000000010011 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 00000000000000000000000000c024000000000000000000000000000000000000000000000000 % 00000000000000010011 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 00000000000000000000000000c028000000000000000000000000000000000000000000000000 % 00000000000000010011 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 00000000000000000000000000c018000000000000000000000000000000000000000000000000 % 00000000000000010011 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 00000000000000000000000000c010000000000000000000000000000000000000000000000000 % 00000000000000010000 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 00000000000000000000000000c010000000000000000000000000000000000000000000000000 % 00000000000000010000 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 00000000000000000000000000c060000000000000000000000000000000000000000000000000 % 00000000000000010000 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 00000000000000000000000000c000000000000000000000000000000000000000000000000000 % 00000000000000010013 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 00000000000000000000000000c000000000000000000000000000000000000000000000000000 % 00000000000000010007 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 00000000000000000000000300c000000000000000000000000000000000000000000000000000 % 0000000000000001001a % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 000000000000000000000003e0c000000000000000000000000000000000000000000000000000 % 00000000000000010000 % 000000000000000000000006000000000000000000000000000000600000000000000000000000 % 000000000000000000000003fcc000000000000000000000000000000000000000000000000000 % 00000000000000010013 % 000000000000000000000007ffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffc000000000000000000000000000000000000000000000000000 % 0000000000000001001c % 000000000000000000000007ffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffc000000000000000000000000000000000000000000000000000 % 00000000000000010013 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 000000000000000000000003fec000000000000000000000000000000000000000000000000000 % 0000000000000001000e % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 000000000000000000000003f0c000000000000000000000000000000000000000000000000000 % 00000000000000010006 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 00000000000000000000000380c000000000000000000000000000000000000000000000000000 % 0000000000000001000d % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 00000000000000000000000000c000000000000000000000000000000000000000000000000000 % 00000000000000010017 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 00000000000000000000000000c000000000000000000000000000000000000000000000000000 % 0000000000000001001d % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 00000000000000000000000000c000000000000000000000000000000000000000000000000000 % 00000000000000010006 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 00000000000000000000000000c000000000000000000000000000000000000000000000000000 % 00000000000000010003 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 00000000000000000000000000c000000000000000000000000000000000000000000000000000 % 00000000000000010001 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 00000000000000000000000000c000000000000000000000000000000000000000000000000000 % 0000000000000001000c % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 00000000000000000000000000c000000000000000000000000000000000000000000000000000 % 00000000000000010017 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 00000000000000000000000000c000000000000000000000000000000000000000000000000000 % 00000000000000010005 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 00000000000000000000000000c000000000000000000000000000000000000000000000000000 % 00000000000000010010 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 00000000000000000000000000c000000000000000000000000000000000000000000000000000 % 0000000000000001001b % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 00000000000000000000000000c000000000000000000000000000000000000000000000000000 % 00000000000000010006 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 00000000000000000000000000c000000000000000000000000000000000000000000000000000 % 00000000000000010011 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 00000000000000000000000007f800000000000000000000000000000000000000000000000000 % 0000000000000001001c % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 00000000000000000000000007f800000000000000000000000000000000000000000000000000 % 00000000000000010007 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 00000000000000000000000003f800000000000000000000000000000000000000000000000000 % 00000000000000010012 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 00000000000000000000000003f000000000000000000000000000000000000000000000000000 % 0000000000000001001d % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 00000000000000000000000003f000000000000000000000000000000000000000000000000000 % 00000000000000010008 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 00000000000000000000000001f000000000000000000000000000000000000000000000000000 % 00000000000000010013 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 00000000000000000000000001e000000000000000000000000000000000000000000000000000 % 0000000000000001001e % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 00000000000000000000000001e000000000000000000000000000000000000000000000000000 % 00000000000000010009 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 00000000000000000000000000e000000000000000000000000000000000000000000000000000 % 00000000000000010014 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 00000000000000000000000000c000000000000000000000000000000000000000000000000000 % 0000000000000001001f % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 0000ffffffffffffffffffffffffffffffffffffffffffc0000000000000000000000000000000 % 0000000000000001000a % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 0000ffffffffffffffffffffffffffffffffffffffffffc0000000000000000000000000000000 % 00000000000000010015 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 0000800000000000000000000000000000000000000000c0000000000000000000000000000000 % 00000000000000010000 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 0000800000000000000000000000000000000000000000c0000000000000000000000000000000 % 0000000000000001000b % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 0000800000000000000000000000000000000000000000c0000000000000000000000000000000 % 00000000000000010016 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 0000800000000000000000000000000000000000000000c0000000000000000000000000000000 % 00000000000000010001 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 0000800000000000000000000000000000000000000000c0000000000000000000000000000000 % 0000000000000001000c % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 0000800000000000000000000000000000000000000000c0000000000000000000000000000000 % 0000000000000001000d % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 00008000000000002000021c0000803011000000000000c0000000000000000000000000000000 % 00000000000000010018 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 0000800000000000400002200003801011000000000000c0000000000000000000000000000000 % 00000000000000010003 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 0000800000000000800000200000801000800000000000c0000000000000000000000000000000 % 0000000000000001000e % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 00008000000000009df8fe777dc08f1730800000000000c0000000000000000000000000000000 % 00000000000000010019 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 000080000000000088fc42222e60999990800000000000c0000000000000000000000000000000 % 00000000000000010004 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 00008000000000008d4042232420909090800000000000c0000000000000000000000000000000 % 0000000000000001000f % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 0000800000000000854042214420909090800000000000c0000000000000000000000000000000 % 0000000000000001001a % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 0000800000000000866442214461919190800000000000c0000000000000000000000000000000 % 00000000000000010005 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 00008000000000008238e77087c3cf1f10800000000000c0000000000000000000000000000000 % 00000000000000010010 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 0000800000000000800000008400000010800000000000c0000000000000000000000000000000 % 0000000000000001001b % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 0000800000000000400000038400000051000000000000c0000000000000000000000000000000 % 00000000000000010006 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 0000800000000000000000060e000000e0000000000000c0000000000000000000000000000000 % 00000000000000010011 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 0000800000000000000000000000000000000000000000c0000000000000000000000000000000 % 0000000000000001001c % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 0000800000000000000000000000000000000000000000c0000000000000000000000000000000 % 00000000000000010007 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 0000800001000018000004000018070000180b10000000c0000000000000000000000000000000 % 00000000000000010012 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 0000800003000008000004000008080000080911000000c0000000000000000000000000000000 % 0000000000000001001d % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 000080000100000ac00000000008080000080101000000c0000000000000000000000000000000 % 00000000000000010008 % 000000000000000000000000000000000000000000000000000003fc0000000000000000000000 % 00008000f171c3c901b9fcdd87881ce3c34b9933ddc000c0000000000000000000000000000000 % 00000000000000010013 % 000000000000000000000000000000000000000000000000000003fc0000000000000000000000 % 00008001898be62a01cc8466484809f4248cc911088000c0000000000000000000000000000000 % 0000000000000001001e % 000000000000000000000000000000000000000000000000000003f80000000000000000000000 % 00008001010a040f0084844441c80900e74849110c8000c0000000000000000000000000000000 % 00000000000000010009 % 000000000000000000000000000000000000000000000000000001f80000000000000000000000 % 00008001010a0409008484444648090320c84911050000c0000000000000000000000000000000 % 00000000000000010014 % 000000000000000000000000000000000000000000000000000001f80000000000000000000000 % 00008001890b2629808c844448c809946448c911050000c0000000000000000000000000000000 % 0000000000000001001f % 000000000000000000000000000000000000000000000000000001f00000000000000000000000 % 00008000f39dc3ddc0f9ceeee77c1ce3b78f9fb9c20000c0000000000000000000000000000000 % 0000000000000001000a % 000000000000000000000000000000000000000000000000000000f00000000000000000000000 % 0000800000000000008000000000000000000000020000c0000001ffffffffffffffffffffffff % fffffffffc0000010015 % 000000000000000000000000000000000000000000000000000000f00000000000000000000000 % 00008000000000000080000000000000000000000e0000c0000001ffffffffffffffffffffffff % fffffffffc0000010000 % 000000000000000000000000000000000000000000000000000000e00000000000000000000000 % 000080000000000001c000000000000000000000180000c0000001800000000000000000000000 % 000000000c000001000b % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 0000800000000000000000000000000000000000000000c0000001800000000000000000000000 % 000000000c0000010016 % 000000000000000000000000000000000003fffffffffffffffffffffffffffffffffffffc0000 % 0000800000000000000000000000000000000000000000c0000001800000000000000000000000 % 000000000c0000010001 % 000000000000000000000000000000000003fffffffffffffffffffffffffffffffffffffc0000 % 0000800000000000000000000000000000000000000000c000000180000010c00020020000400c % 048000000c000001000c % 0000000000000000000000000000000000020000000000000000000000000000000000000c0000 % 000080000000000070033000000200c0c0000000000000c000000180000020400020022001c004 % 048000000c0000010017 % 0000000000000000000000000000000000020000000000000000000000000000000000000c0000 % 0000800000000000800110000002004040000000000000c0000001800000404000000020004004 % 004000000c0000010002 % 0000000000000000000000000000000000020000000000000000000000000000000000000c0000 % 0000800000000000800110000000004040000000000000c000000180000047cee066e67ee043c5 % cc4000000c000001000c % 0000000000000000000000000000000000020000000080000000004000018800100000000c0000 % 0000800000000079c0f1103bf8fe3c5c470d0000000000c00000018000004c4440231227304666 % 644000000c0000010016 % 0000000000000000000000000000000000020000000100000000084000008900100000000c0000 % 00008000000000cc81091011844242664f920000000000c0000001800000484640221222104424 % 244000000c000001001f % 0000000000000000000000000000000000020000000200000000080000008100080000000c0000 % 00008000000000848039101a1c420e42481d0000000000c0000001800000484280221222104424 % 244000000c0000010016 % 000000000000000000000000000000000002000000026e7dc3cddecdd8789bddc80000000c0000 % 000080000000008480c9100a6442324248030000000000c000000180000048c28022122230c464 % 644000000c000001001f % 000000000000000000000000000000000002000000027323e66e684664848908880000000c0000 % 000080000000008c8119100c8c4246464c910000000000c0000001800000476100773f3be1e3c7 % c44000000c0000010008 % 00000000000000000000000000000000000200000002212204242844441c890c880000000c0000 % 0000800000000079c0efb80476e73b7ce71e0000000000c0000001800000400100000002000000 % 044000000c0000010016 % 0000000000000000000000000000000000020000000221220424284444648905080000000c0000 % 0000800000000000000000000000000000000000000000c000000180000020071f800002000000 % 148000000c0000010016 % 00000000000000000000000000000000000200000002232324646844448c8905080000000c0000 % 0000800000000000000000000000000000000000000000c0000001800000000c00000007000000 % 380000000c0000010011 % 000000000000000000000000000000000002000000023e71c3c7ceeeee77ddc2080000000c0000 % 0000800000000000000000000000000000000000000000c0000001800000000000000000000000 % 000000000c0000010011 % 0000000000000000000000000000000000020000000220000004000000000002080000000c0000 % 0000800000000000000000000000000000000000000000c0000001800000000000000000000000 % 000000000c0000010011 % 000000000000000000000000000000000002000000012000000400000000000e100000000c0000 % 0000800000000000000000000000000000000000000000c0000001800080080401880000030100 % 000400000c0000010011 % 000000000000000000000000000000000002000000007000000e000000000018000000000c0000 % 0000800000000000000000000000000000000000000000c0000001800080088400880000010100 % 008400000c0000010011 % 0000000000000000000000000000000000020000000000000000000000000000000000000c0000 % 0000800000000000000000000000000000000000000000c0000001800000008000800000010000 % 008000000c0000010011 % 0000000000000000000000000000000000020000000000000000000000000000000000000c0000 % 0000ffffffffffffffffffffffffffffffffffffffffffc00000019f399b99ec7898d380f1731c % 79edddc00c0000010011 % 0000000000000000000000000000000000020000000000000000000000000000000000000c0000 % 0000ffffffffffffffffffffffffffffffffffffffffffc0000001887c8c4884848927c199993e % c4848be00c0000010011 % 0000000000000000000000000000000000020000380000000180000200000100001800000c0000 % 000000000000000001c0000000000001c00000000000000000000188408848841c89d401090920 % 8084d2000c0000010011 % 0000000000000000000000000000000000020000400010000080000200000300000800000c0000 % 00000000000000000380000000000000e000000000000000000001884088488464883401090920 % 808452000c0000010011 % 0000000000000000000000000000000000020000400010000080000000000100000ac0000c0000 % 00000000000000000700000000000000700000000000000000000188648848848c891641191932 % c48463240c0000010011 % 0000000000000000000000000000000000020000e787bcf3e0b8f0d61a00f171c78900000c0000 % 00000000000000000e0000000000000038000000000000000000019c39dcfcee77dde380f1f11c % 78ee21c40c0000010000 % 0000000000000000000000000000000000020000484c519900cd09222401898bec4a00000c0000 % 00000000000000001c006020000100001c00000000000000000001800000000000000000000100 % 000000040c0000010000 % 000000000000000000000000000000000002000041c81109008439d23a01010a080f00000c0000 % 000000000000000038002020002100000e00000000000000000001800000000000000000000500 % 000000000c0000010000 % 0000000000000000000000000000000000020000464811090084c8320601010a080900000c0000 % 000000000000000070002000002000000700000000000000000001800000000000000000000e00 % 000000000c0000010013 % 000000000000000000000000000000000002000048cc5119008d19122281890b2c4980000c0000 % 0000000000000000e01e2e670f7b3bf00380000000000000000001800000000000000000000000 % 000000000c0000010007 % 0000000000000000000000000000000000020000e7679cf380f8ede73c80f39dc79dc0000c0000 % 0000000000000001c033332f98a111f801c0000000000000000001800000000000000000000000 % 000000000c000001001a % 0000000000000000000000000000000000020000000000000000000000800000000000000c0000 % 00000000000000038021212810211a8000e0000000000000000001800000000000000000000000 % 000000000c0000010000 % 0000000000000000000000000000000000020000000000000000000000000000000000000c0000 % 00000000000000070021212810210a800070000000000000000001800000004008000000001000 % 000000000c0000010013 % 0000000000000000000000000000000000020000000000000000000000000000000000000c0000 % 000000000000000e0023232c98a10cc80038000000000000000001800000084018080000001000 % 080000000c000001001c % 0000000000000000000000000000000000020000000000000000000000000000000000000c0000 % 000000000000001c001e3e270f3b8470001c000000000000000001800000080068080000000000 % 080000000c0000010013 % 0000000000000000000000000000000000020000000000000000000000000000000000000c0700 % 00000000000000380000002000000000000e0000000000000007018000001ec38b9e73703733bf % 9e0000000c000f01000e % 0000000000000000000000000000000000020000000000000000001800000003c00000000c3f00 % 0000000000000070000000a00000000000070000000000000007e180000008444c48f98839911c % c80000000c000fe10006 % 0000000000000000000000000000000000020000000000000000002400000004400000000dff00 % 00000000000000e0000001c00000000000038000000000000007fd8000000844484881081091a8 % 480000000c000ffd000d % 0000000000000000000000000000000000020000000000000000002400000004000000000fffff % ffffffffffffffc000000000000000000001ffffffffffffffffff8000000843884881081090a8 % 480000000fffffff0017 % 0000000000000000000000000000000000020001e3cf10be78f3b819c1e3cdcecfeec0000fff00 % 00000000000000e000000000000000000001c000000000000007ff80000008440848c9081190c8 % c80000000c000fff001d % 00000000000000000000000000000000000200021638b1908589102883166624443320000c7f00 % 0000000000000070000000000000000000038000000000000007f18000000ee7dcee739c1f3847 % 8e0000000c000ff10006 % 0000000000000000000000000000000000020000741010901d01904482042424442220000c0f00 % 000000000000003800000000000000e00007000000000000000781800000000460000000100000 % 000000000c000f810003 % 0000000000000000000000000000000000020001941010906500a04302042424442220000c0100 % 000000000000001c0000000000002310000e000000000000000401800000000c60000000100000 % 000000000c000c010001 % 0000000000000000000000000000000000020002363891908d88a06383146424442220000c0000 % 0000000000006c0e0000000000002210001c1b0000000000000001800000000780000000380000 % 000000000c000001000c % 0000000000000000000000000000000000020001dbcf0ef876f0403cc1e3ce7eee7770000c0000 % 000000000000240700079e7df70f781000380c8000000000000001800000000000000000000000 % 000000000c0000010017 % 0000000000000000000000000000000000020000000000000000400000000000000000000c0000 % 0000000000002803800c73208f98a0200070088000000000000001800000000000000000000000 % 000000000c0000010005 % 0000000000000000000000000000000000020000000000000001c00000000000000000000c0000 % 0000000000001801c00821208810204000e0088000000000000001800180000200000000000000 % 000000000c0000010010 % 0000000000000000000000000000000000020000000000000003000000000000000000000c0000 % 0000000000001000e00821208810204001c01dc000000000000001800080004200000000000000 % 001000000c000001001b % 0000000000000000000000000000000000020000000000000000000000000000000000000c0000 % 0000000000001000700c63208c98a0c00380000000000000000001800080004000000000000000 % 001000000c0000010006 % 0000000000000000000000000000000000020000000000000000000000000000000000000c0000 % 000000000000600038079e71c70f38c007000000000000000000018d388e1ef63cdc0dc79f78dd % 8e3ce7c68c0000010011 % 0000000000000000000000000000000000020000000000000000000000000000000000000c0000 % 00000000000000001c000000000000000e00000000000000000001927c9f314266620e68488466 % 5f11f2090c000001001c % 0000000000000000000000000000000000020000007000009809900000000000000000000c0000 % 00000000000000000e000000000000001c000000000000000000019d4090204242420421c81c44 % 5011020e8c0000010007 % 0000000000000000000000000000000000020000008000008808910000040040000000000c0000 % 000000000000000007000000000000003800000000000000000001834090204242420426486444 % 501102018c0000010012 % 0000000000000000000000000000000000020000008000000800810000040040000000000c0000 % 000000000000000003800000000000007000000000000000000001916499314246420468c88c44 % 591192088c000001001d % 000000000000000000000000000000000002000001ce1e1b8b98b3ddc0df3cf211a000000c0000 % 000000000000000001c0000000000000e0000000000000000000019e39ce1e773ce707c77c76ee % ee1ce70f0c0000010008 % 0000000000000000000000000000000000020000009f21248cc8910881244246324000000c0000 % 000000000000000000e0000000000001c000000000000000000001800000000000000400000000 % 000000000c0000010013 % 00000000000000000000000000000000000200000090073a8848910c81d40e4213a000000c0000 % 0000000000000000007fffffffffffff8000000000000000000001800000000000000400000000 % 000000000c000001001e % 0000000000000000000000000000000000020000009019068848910500343242106000000c0000 % 000000000000000000000000000000000000000000000000000001800000000000000e00000000 % 000000000c0000010009 % 00000000000000000000000000000000000200000099232288c8910501144642322000000c0000 % 000000000000000000000000000000000000000000000000000001800000000000000000000000 % 000000000c0000010014 % 000000000000000000000000000000000002000001ce1dbdcf9df9c201e73b71dbc000000c0000 % 000000000000000000000000000000000000000000000000000001800000000000000000000000 % 000000000c000001001f % 0000000000000000000000000000000000020000000000000000000200000000000000000c0000 % 000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffff % fffffffffc000001000a % 0000000000000000000000000000000000020000000000000000000e00000000000000000c0000 % 000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffff % fffffffffc0000010015 % 0000000000000000000000000000000000020000000000000000001800000000000000000c0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000010000 % 0000000000000000000000000000000000020000000000000000000000000000000000000c0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000001000b % 000000000000000000000000000000000003fffffffffffffffffffffffffffffffffffffc0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000010016 % 000000000000000000000000000000000003fffffffffffffffffffffffffffffffffffffc0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000010001 % 0000000000000000000000000000000000000000000000060000000000000e0000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000001000c % 00000000000000000000000000000000000000000000000c000000000000070000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000001000d % 000000000000000000000000000000000000000000000018000000000000038000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000010018 % 00000000000000000000000000000000000000000000003000000000000001c000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000010003 % 00000000000000000000000000000000000000000000006000000800003000e000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000001000e % 0000000000000000000000000000000000000000000000c0000008000010007000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000010019 % 000000000000000000000000000000000000000000000180000000000010003800000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000010004 % 0000000000000000000000000000000000000000000003000377d9bb1e10001c00000000000000 % 000000000000000000003ffffffffffffffffffffffffffffe0000000000000000000000000000 % 0000000000000001000f % 000000000000000000000000000000000000000000000600039a08cca110000e00000000000000 % 000000000000000000003ffffffffffffffffffffffffffffe0000000000000000000000000000 % 0000000000000001001a % 000000000000000000000000000000000000000000000c00010a08888710000700000000000000 % 000000000000000000003000000000000000000000000000060000000000000000000000000000 % 00000000000000010005 % 000000000000000000000000000000000000000000001800010a08889910000380000000000000 % 000000000000000000003000000000000000000000000000060000000000000000000000000000 % 00000000000000010010 % 000000000000000000000000000000000000000000003000011a0888a3100001c0000000000000 % 000000000000000000003000000000000000000000000000060000000000000000000000000000 % 0000000000000001001b % 00000000000000000000000000000000000000000000600001f71dddddb80000e0000000000000 % 000000000000000000003000000000000000000000000000060000000000000000000000000000 % 00000000000000010006 % 00000000000000000000000000000000000000000000c000010000000000000070000000000000 % 000000000000000000e03000000000000000000000000000060000000000000000000000000000 % 00000000000000010011 % 000000000000000000000000000000000000000000018000010000000000000038000000000000 % 000000000000000000fc3000000000000000000000000000060000000000000000000000000000 % 0000000000000001001c % 00000000000000000000000000000000000000000003000003800000000000001c000000000000 % 000000000000000000ffb000000000000000010000000380060000000000000000000000000000 % 00000000000000010007 % 00000000000000000000000000000000000000000006000000000000000000000fffffffffffff % fffffffffffffffffffff000000000000000030000000100060000000000000000000000000000 % 00000000000000010012 % 00000000000000000000000000000000000000000007000000000000000000000fffffffffffff % fffffffffffffffffffff000000000000000010000000100060000000000000000000000000000 % 0000000000000001001d % 00000000000000000000000000000000000000000003800000000000000000001c000000000000 % 000000000000000000ff3003e73761e77e037171e1a70100060000000000000000000000000000 % 00000000000000010008 % 00000000000000000000000000000000000000000001c000700000981801c00038000000000000 % 000000000000000000f830010f9993323f03998a124f8100060000000000000000000000000000 % 00000000000000010013 % 00000000000000000000000000000000000000000000e000800000880806200070000000000000 % 000000000000000000c03001081112135001090873a80100060000000000000000000000000000 % 0000000000000001001e % 0000000000000000000000000000000000000000000070008000000808042000e0d80000000000 % 000000000000000000003001081112115001090990680100060000000000000000000000000000 % 00000000000000010009 % 000000000000000000000000000000000000000000003801ce1e1b8b88e02001c0480000000000 % 0000000000000000000030010c9112319901190a322c8380060000000000000000000000000000 % 00000000000000010014 % 000000000000000000000000000000000000000000001c009f21248cc9f0400380500000000000 % 000000000000000000003003873bb9e08e01f39ddbc70380060000000000000100000000000000 % 0000000000000001001f % 000000000000000000000000000000000000000000000e0090073a884900800700300000000000 % 000000000000000000003000000000000001000000000000060000000000000100000000000000 % 0000000000000001000a % 000000000000000000000000000000000000000000000700901906884900800e00200000000000 % 0000000000000000000030000000000000010000000000000600000000003e73c85f6e00000000 % 00000000000000010015 % 00000000000000000000000000000000000000000000038099232288c991801c00200000000000 % 00000000000000000000300000000000000380000000000006000000000010f918c83100000000 % 00000000000000010000 % 0000000000000000000000000000000000000000000001c1ce1dbdcf9ce1803800c00000000000 % 000000000000000000003000000000000000000000000000060000000000108108482100000000 % 0000000000000001000b % 0000000000000000000000000000000000000000000000e0000000000000007000000000000000 % 000000000000000000003000000000000000000000000000060000000000108108482100000000 % 00000000000000010016 % 00000000000000000000000000000000000000000000007000000000000000e000000000000000 % 00000000000000000000300602000008000000000000000006000000000010c908c82100000000 % 00000000000000010001 % 00000000000000000000000000000000000000000000003800000000000001c000000000000000 % 0000000000000000000030020200010800000000000000000600000000003871c77c7380000000 % 0000000000000001000c % 00000000000000000000000000000000000000000000001c000000000000038000000000000000 % 00000000000000000000300200000100000000000000000006000003c000000000000000000000 % 00000000000000010017 % 00000000000000000000000000000000000000000000000e000000000000070000000000000000 % 0000000000000000000031e2e638f3dbbb881b9f39b8f3e706000003f800000000000000000000 % 00000000000000010002 % 0000000000000000000000000000000000000000000000070000000000000e0000000000000000 % 000000000000000000003333327d890917c81cc87dcd090f86000003ff00000000000000000000 % 0000000000000001000c % 000000000000000000000000000000000000000000000003fffffffffffffc0000000000000000 % 00000000000000000000321212410109a40008484084390807ffffffffc0000000000000000000 % 00000000000000010016 % 0000000000000000000000000000000000000000000000070000000000000e0000000000000000 % 00000000000000000000321212410108a40008484084c90806000003ff80000000000000000000 % 0000000000000001001f % 00000000000000000000000000000000000000000000000e000000000000070000000000000000 % 00000000000000000000323232658908c64808c8648d190c86000003fc00000000000000000000 % 00000000000000010016 % 00000000000000000000000000000000000000000000001c000000000000038000000000000000 % 0000000000000000000031e3e238f1dc43880f9c38f8ef8706000003e0000e0000130300000000 % 0000000000000001001f % 00000000000000000000000000000000000000000000003800000000000001c000000000000000 % 000000000000000000003000020000000008080000800000060000030000100000110100000000 % 00000000000000010008 % 00000000000000000000000000000000000000000000007000000000000000e000000000000000 % 0000000000000000000030000a0000000000080000800000060000000000100000010100000000 % 00000000000000010016 % 0000000000000000000000000000000000000000000000e00000c0001800007000000000000000 % 0000000000000000000030001c00000000001c0001c0000006000000000039c3c371711c000000 % 00000000000000010016 % 0000000000000000000000000000000000000000000001c0000040000800003800000000000000 % 00000000000000000000300000000000000000000000000006000000000013e42491993e000000 % 00000000000000010011 % 000000000000000000000000000000000000000000000380000040000800001c00000000000000 % 0000000000000000000030000000000000000000000000000600000000001200e7510920000000 % 00000000000000010011 % 0000000000000000000000000000000000000000000007000007c4278800000e00000000000000 % 000000000000000000003000000000000000000000000000060000000000120320d10920000000 % 00000000000000010011 % 000000000000000000000000000000000000000000000e00000c4c684800000700000000000000 % 000000000000000000003000000e000001000000039c0000060000000000132464511932000000 % 00000000000000010011 % 000000000000000000000000000000000000000000001c0000084421c800000380000000000000 % 00000000000000000000300000100000030000000108000006000000000039c3b7b9f39c000000 % 00000000000000010011 % 0000000000000000000000000000000000000000000038000008442648000001c0000000000000 % 000000000000000000003000001000000100000001080000060000000000000000000000000000 % 00000000000000010011 % 0000000000000000000000000000000000000000000070000008c468c8000000e0000000000000 % 0000000000000000000030000039e7c37171e1a701080000060000000000000000000000000000 % 00000000000000010011 % 00000000000000000000000000000000000000000000e000000763b77c00000070000000000000 % 00000000000000000000300000133203998a124f81080000060000000000000000000000000000 % 00000000000000010011 % 00000000000000000000000000000000000000000001c000000000000000000038000000000000 % 00000000000000000000300000121201090873a801080000060000000000000000000000000000 % 00000000000000010011 % 00000000000000000000000000000000000000000003800000000000000000001c000000000000 % 000000000000000000003000001212010909906801080000060000000000000000000000000000 % 00000000000000010011 % 00000000000000000000000000000000000000000007000000000000000000000e000000000000 % 00000000000000000000300000123201190a322c839c0000060000000000000000000000000000 % 00000000000000010011 % 0000000000000000000000000001fffffffffffffffe0000000000000000000007ffffffffffe0 % 0000000000000000000030000039e701f39ddbc7039c0000060000000000000000000000000000 % 00000000000000010000 % 00000000000000000000000000010000000000000007000000000000000000000c000000000020 % 000000000000000000003000000000010000000000000000060000000000000000000000000000 % 00000000000000010000 % 000000000000000000000000000100000000000000038000700000981801c00018000000000020 % 000000000000000000003000000000010000000000000000060000000000000000000000000000 % 00000000000000010000 % 00000000000000000000000000010000000000000001c000800000880806200030000000000020 % 000000000000000000003000000000038000000000000000060000000000000000000000000000 % 00000000000000010013 % 00000000000000000000000000010000000000000360e000800000080804200060d80000000020 % 000000000000000000003000000000000000000000000000060000000000000000000000000000 % 00000000000000010007 % 000000000000000000000000000100000000000001207001ce1e1b8b88e02000c0640000000020 % 000000000000000000003000000000000000000000000000060000000000000000000000000000 % 0000000000000001001a % 0000000000000000000000000001000000000000014038009f21248cc9f0400180440000000020 % 000000000000000000003000000000000000000000000000060000000000000000000000000000 % 00000000000000010000 % 000000000000000000000000000ff0000000000000c01c0090073a8849008003004400000003fe % 000000000000000000003000000000000000000000000000060000000000000000000000000000 % 00000000000000010013 % 000000000000000000000000000fe0000000000000800e00901906884900800600ee00000001fc % 000000000000000000003ffffffffffffffffffffffffffffe0000000000000000000000000000 % 0000000000000001001c % 000000000000000000000000000fe000000000000080070099232288c991800c000000000001fc % 000000000000000000003ffffffffffffffffffffffffffffe0000000000000000000000000000 % 00000000000000010013 % 000000000000000000000000000fe0000000000003000381ce1dbdcf9ce18018000000000001fc % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000001000e % 0000000000000000000000000007c00000000000000001c00000000000000030000000000000f8 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000010006 % 0000000000000000000000000007c00000000000000000e00000000000000060000000000000f8 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000001000d % 0000000000000000000000000007c000000000000000007000000000000000c0000000000000f8 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000010017 % 000000000000000000000000000380000000000000000038000000000000018000000000000070 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000001001d % 00000000000000000000000000038000000000000000001c000000000000030000000000000070 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000010006 % 00000000000000000000000000038000000000000000000e000000000000060000000000000070 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000010003 % 000000000000000000000fffffffffffffe0000000000007fffffffffffffc0000001fffffffff % ffffffc00000000000000001fffffffffffffffe00000000000000000000000000000000000000 % 00000000000000010001 % 000000000000000000001ffffffffffffff0000000000003fffffffffffff80000003fffffffff % ffffffe00000000000000003ffffffffffffffff00000000000000000000000000000000000000 % 0000000000000001000c % 000000000000000000003800000000000038000000000000000000000000000000007000000000 % 000000700000000000000007000000000000000380000000000000000000000000000000000000 % 00000000000000010017 % 00000000000000000000700000000000001c00000000000000000000000000000000e000000000 % 00000038000000000000000e0000000000000001c0000000000000000000000000000000000000 % 00000000000000010005 % 00000000000000000000e00000000000000e00000000000000000000000000000001c000000000 % 0000001c000000000000001c0000000000000000e0000000000000000000000000000000000000 % 00000000000000010010 % 00000000000000000001c000000000000007000000000000000000000000000000038000000000 % 0000000e0000000000000038000000000000000070000000000000000000000000000000000000 % 0000000000000001001b % 000000000000000000039000e00001303003800000000000000000000000000000070000c00000 % 001800670000000000000070000000000000000038000000000000000000000000000000000000 % 00000000000000010006 % 000000000000000000071001000001101001c000000000000000000000000000000e0000400000 % 0008002380000000000000e000000000000000001c000000000000000000000100000000000000 % 00000000000000010011 % 0000000000000000000e0001000000101000e000000000000000000000000000001c0000400000 % 00080021c0000000000001c000000000000000000e000000000000000000000100000000000000 % 0000000000000001001c % 0000000000000000001c33739c3c371711c07000000000000000000000000000003885b85cf109 % b8f8e3e0e0000000000003800000000000000000070000000000000000003e73c85f6e00000000 % 00000000000000010007 % 0000000000000000003811893e42491993e0380000000000000000000000000000718cc4679b18 % c589f620700000000000070000000000000000000380000000000000000010f918c83100000000 % 00000000000000010012 % 000000000000000000701109200e751092001c0000000000000000000000000000e08484430908 % 850904203800000000000e00000000000000000001c00000000000000000108108482100000000 % 0000000000000001001d % 000000000000000000e0110920320d1092000e0000000000000000000000000001c08484430908 % 850904201c00000000001c00000000000000000000e00000000000000000108108482100000000 % 00000000000000010008 % 000000000000000001c01109324645119320070000000000000000000000000003808c84471918 % 851994600e0000000000380000000000000000000070000000000000000010c908c82100000000 % 00000000000000010013 % 000000000000000003803b9f9c3b7b9f39c00380000000000000000000000000070077ce7cf0ed % ceece3b0070000000000700000000000000e0000003800000000000000003871c77c7380000000 % 0000000000000001001e % 00000000000000000700000000000000000001c00000000000000000000000000e000000000000 % 00000000038000001e00e0000000000002310000001c000000000003c000000000000000000000 % 00000000000000010009 % 00000000000000000e00000000000000000000e00000000000000000000000001c000000000000 % 0000000001c000001fc1c0000000000002210000000e000000000003f800000000000000000000 % 00000000000000010014 % 00000000000000001c000000000000000000007000000000000000000000000038000000000000 % 0000000000e000001ffb80000006e216e78100000007000000000003ff00000000000000000000 % 0000000000000001001f % 00000001fffffffff8000000000000000000003800000000000000003ffffffff0000000000000 % 00000000007fffffffff000000073633120200000003ffffffffffffffc0000000000000000000 % 0000000000000001000a % 00000001fffffffff8000000000000000000003800000000000000003ffffffff0000000000000 % 00000000007fffffffff800000021212120400000003ffffffffffffffc0000000000000000000 % 00000000000000010015 % 00000001800000000c000000000000000000007000000000000000003000000038000000000000 % 0000000000e000001ff1c00000021212120400000007000000000003fe00000000000000000000 % 00000000000000010000 % 0000000180000000060000000000000018e000e00000000000000000300000001c000000000000 % 00061c0001c000001f80e00000023232120c0000000e000000000003f000000000000000000000 % 0000000000000001000b % 000000018000000003000000000008000b1001c00000000000000000300000000e000000000001 % 00026200038000001c0070000003e1df3b8c0000001c0000000000038000000000080000000000 % 00000000000000010016 % 000000018000001b01800000000008000a10038000000000000000003000003607000000000001 % 000242000706c00000003800000200000000000000386c00000000000000000000080000000000 % 00000000000000010001 % 000000018000000900c038efb9c3de70f81007000000000000000000300000120380073bee387b % ce3e02000e03200000001c000002000000000000007024000000000000003710b71e0000000000 % 0000000000000001000c % 000000018000000a00607c2dcfe628f988200e0000000000000000003000001401c00f8b737cc5 % 1f6204001c02200000000e00000700000000000000e0280000000000000039b198880000000000 % 0000000000000001000d % 0000000180000006003040108604088108401c0000000000000000003000000c00e00804214081 % 104208003802200000000700000000000000000001c01800000000000000109090880000000000 % 00000000000000010018 % 00000001800000040018403886040881084038000000000000000000300000080070080e214081 % 104208007007700000000380000000000000000003801000000000000000109090880000000000 % 00000000000000010003 % 0000000180000004000c644c8f2628c918c0700000000000000000003000000800380c932364c5 % 19461800e0000000000001c0000000000000000007001000000000000000119190880000000000 % 0000000000000001000e % 0000000180000018000638eef9c3ce70ecc0e000000000000000000030000030001c073bbe3879 % ce3b1801c0000000000000e000000000000000000e0060000000000000001f0ef9ce0000000000 % 00000000000000010019 % 000000018000000000030000800000000001c000000000000000000030000000000e0000200000 % 00000003800000000000007000000000000000001c000000000000000000100000000000000000 % 00000000000000010004 % 000000018000000000018000800000000003800000000000000000003000000000070000200000 % 000000070000000000000038000000000000000038000000000000000000100000000000000000 % 0000000000000001000f % 00000001800000000000c001c00000000007000000000000000000003000000000038000700000 % 0000000e000000000000001c000000000000000070000000000000000000380000000000000000 % 0000000000000001001a % 00000001800000000000600000000000000e00000000000000000000300000000001c000000000 % 0000001c000000000000000e0000000000000000e0000000000000000000000000000000000000 % 00000000000000010005 % 0000000ff00000000000300000000000001c00000000000000000001fe0000000000e000000000 % 0000003800000000000000070000000000000001c0000000000000000000000000000000000000 % 00000000000000010010 % 0000000ff00000000000180000000000003800000000000000000001fe00000000007000000000 % 000000700000000000000003800000000000000380000000000000000000000000000000000000 % 0000000000000001001b % 0000000fe000000000000ffffffffffffff000000000000000000001fc00000000003fffffffff % ffffffe00000000000000001ffffffffffffffff00000000000000000000000000000000000000 % 00000000000000010006 % 00000007e00000000000000000010000000000000000000000000001fc00000000000000000000 % 000000000000000000000000000000010000000000000000000000000000000000000000000000 % 00000000000000010011 % 00000007e00000000000000000010000000000000000000000000000fc00000000000000000000 % 000000000000000000000000000000010000000000000000000000000000000000000000000000 % 0000000000000001001c % 00000007c00000000000000000010000000000000000000000000000f800000000000000000000 % 000000000000000000000000000000010000000000000000000000000000000000000000000000 % 00000000000000010007 % 00000003c00000000000000000010000000000000000000000000000f800000000000000000000 % 000000000000000000000000000000011b00000000000000000000000000000000000000000000 % 00000000000000010012 % 00000003c00000000000000000011b000000000000000000000000007800000000000000000000 % 000000000000000000000000000000010c80000000000000000000000000000000000000000000 % 0000000000000001001d % 00000003800000000000000000010c800000000000000000000000007000000000000000000000 % 000000000000000000000000000000010880000000000000000000000000000000000000000000 % 00000000000000010008 % 000000018000000000000000000108800000000000000000000000007000000000000000000000 % 000000000000000000000000000000010880000000000000000000000000000000000000000000 % 00000000000000010013 % 000000018000000000000000000108800000000000000000000000003000000000000000000000 % 000000000000000000000000000000011dc0000000000000000000000000000000000000000000 % 0000000000000001001e % 00000001000000000000000000011dc00000000000000000000000002000000000000000000000 % 000000000000000000000000000000010000000000000000000000000000000000000000000000 % 00000000000000010009 % 000000000000000000000000000100000000000000000000000000000000000000000000000000 % 000000000000000000000000000000010000000000000000000000000000000000000000000000 % 00000000000000010014 % 000000000000000000000000000100000000000000000000000000000000000000000000000000 % 000000000000000000000000000000010000000000000000000000000000000000000000000000 % 0000000000000001001f % 000000000000000000000000000100000000000000000000000000000000000000000000000000 % 000000000000000000000000000000010000000000000000000000000000000000000000000000 % 0000000000000001000a % 000000000000000000000000000100000000000000000000000000000000000000000000000000 % 000000000000000000000000000000010000000000000000000000000000000000000000000000 % 00000000000000010015 % 000000000000000000000000000100000000000000000000000000000000000000000000000000 % 000000000000000000000000000000010000000000000000000000000000000000000000000000 % 00000000000000010000 % 000000000000000000000000000100000000000000000000000000000000000000000000000000 % 000000000000000000000000000000010000000000000000000000000000000000000000000000 % 0000000000000001000b % 000000400000000000000000000100000000000000000000000000080000000000000000000000 % 000000000000000000000000000000010000000000000000000000000000000000000000000000 % 00000000000000010016 % 000000400000000000000000000100000000000000000000000000080000000000000000000000 % 000000000000000000000000000000010000000000000000000000000000000000000000000000 % 00000000000000010001 % 000fb8f217db8000000000000001000000000000000000000001f71e84fee00000000000000000 % 000000000000000000000000000000010000000000000000000000000000000000000000000000 % 0000000000000001000c % 00047c46320c40000000000000010000000000000000000000008f898c43100000000000000000 % 000000000000000000000000000000010000000000000000000000000000000000000000000000 % 00000000000000010017 % 000440421208400000000000000100000000000000000000000088088442100000000000000000 % 000000000000000000000000000000010000000000000000000000000000000000000000000000 % 00000000000000010002 % 000440421208400000000000000100000000000000000000000088088442100000000000000000 % 000000000000000000000000000000010000000000000000000000000000000000000000000000 % 0000000000000001000c % 00046442320840000000000000010000000000000000000000008c888c42100000000000000000 % 000000000000000000000000000000010000000000000000000000000000000000000000000000 % 00000000000000010016 % 000e3871df1ce000000000000001000000000000000000000001c70e76e7380000000000000000 % 000000000000000000000000000000010000000000000000000000000000000000000000000000 % 0000000000000001001f % 000000000000000000000000000100000000000000000000000000000000000000000000000000 % 000000000000000000000000000000010000000000000000000000000000000000000000000000 % 00000000000000010016 % 000000000000000000000000000100000000000000000000000000000000000000000000000000 % 000000000000000000000000000000010000000000000000000000000000000000000000000000 % 0000000000000001001f % 000000000000000000000000000100000000000000000000000000000000000000000000000000 % 000000000000000000000000000000010000000000000000000000000000000000000000000000 % 00000000000000010008 % 000000000000000000000000000100000000000000000000000000000000000000000000000000 % 000000000000000000000000000000010000000000000000000000000000000000000000000000 % 00000000000000010016 % 000000000000000000000000000100000000000000000000000000000000000000000000000000 % 000000000000000000000000000000010000000000000000000000000000000000000000000000 % 00000000000000010016 % 1000e00000b03000000000000001000000000000000000000000c0000000180030000000000000 % 000000000000000000000000000000010000000000000000000000000000000000000000000000 % 00000000000000010011 % 100100000090100000000000000100000000000000000000000040000000080010000000000000 % 000000000000000000000000000000010000000000000000000000000000000000000000000000 % 00000000000000010011 % 000100000010100000000000000100000000000000000000000040000000080010000000000000 % 000000000000000000000000000000010000000000000000000000000000000000000000000000 % 00000000000000010011 % 33739c3c359711c00000000000010000000000000000000084dc5c7885b8f8e1f0000000000000 % 000000000000000000000000000000010000000000000000000000000000000000000000000000 % 00000000000000010011 % 11893e42489993e0000000000001000000000000000000018c6266cd8cc589f310000000000000 % 000000000000000000000000000000010000000000000000000000000000000000000000000000 % 00000000000000010011 % 1109200e7490920000000000000100000000000000000000844242848485090210000000000000 % 000000000000000000000000000000010000000000000000000000000000000000000000000000 % 00000000000000010011 % 110920320c90920000000000000100000000000000000000844242848485090210000000000000 % 000000000000000000000000000000010000000000000007ffffffffffffffffffffffffffffff % fffff000000000010011 % 1109324644919320000000000001000000000000000000008c42468c8c85199230000000000000 % 000000000000000000000000000000010000000000000007ffffffffffffffffffffffffffffff % fffff000000000010011 % 3b9f9c3b79df39c00000000000010000000000000000000076e77c7877ceece1d8000000000000 % 000000000000000000000000000000010000000000000004000000000000000000000000000000 % 00003000000000010011 % 000000000000000000000000000100000000000000000000000000000000000000000000000000 % 000000000000000000000000000000010000000000000004000000000000000000000000000000 % 00003000000000010011 % 000000000000000000000000000100000000000000000000000000000000000000000000000000 % 000000000000000000000000000000010000000000000004000000000000000000000000000000 % 00003000000000010011 % 000000000000000000000000000100000000000000000000000000000000000000000000000000 % 000000000000000000000000000000010000000000000004000000000000000000000000000000 % 00003000000000010000 % 000000000000000000000000000100000000000000000000000000000000000000000000000000 % 000000000000000000000000000000010000000000000004000000001002000000000400000000 % 00003000000000010000 % 000000000000000000000000000100000000000000000000000000000000000000000000000000 % 0000000000000000000000000000001fe000000000000004000000021006020000000400020000 % 00003000000000010000 % 000000000000000000000000000100000000000000000000000000000000000000000000000000 % 0000000000000000000000000000001fe00000000000000400000002001a020000000000020000 % 00003000000000010013 % 000000000000000000000000000100000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000fe00000000000000400000007b0e2e79cdc0dccefe78000 % 00003000000000010007 % 000000000000000000000000000100000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000fe000000000000004000000021113123e620e6447320000 % 0000300000000001001a % 000000000000000000000000000100000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000fc00000000000000400000002111212204204246a120000 % 00003000000000010000 % 000000000000000000000000000100000000000000000000000000000000000000000000000000 % 00000000000000000000000000000007c0000000000000040000000210e212204204242a120000 % 00003000000000010013 % 000000000000000000000000000100000000000000000000000000000000000000000000000000 % 00000000000000000000000000000007c000000000000004000000021102123242046432320000 % 0000300000000001001c % 000000000000000000000000000100000000000000000000000000000000000000000000000000 % 00000000000000000000000000000007800000000000000400000003b9f73b9ce707ce11e38000 % 00003000000000010013 % 000000000000000000000000000100000000000000000000000000000000000000000000000000 % 000000000000000000000000000000038000000000003c04000000000118000000040000000000 % 0000300000000001000e % 000000000000000000000000000100000000000000000000000000000000000000000000000000 % 000000000000000000000000000000038000000000003f84000000000318000000040000000000 % 00003000000000010006 % 000000000000000000000000000100000000000000000000000000000000000000000000000000 % 000000000000000000000000000000030000000000003ff40000000001e00000000e0000000000 % 0000300000000001000d % 0000000000000000000000000001ffffffffffffffffffffffffffffffffffffffffffffffffff % fffffffffffffffffffffffffffffffffffffffffffffffc000000000000000000000000000000 % 00003fffffffffff0017 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000003ffc000000000000000000000000000000 % 0000300000000000001d % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000003fc4000000000000000000000000000000 % 00003000000000000006 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000003e04000060000080000000000000000000 % 00003000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000003004000020001080000000000000000400 % 00003000000000000001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000004000020001000000000000000000400 % 0000300000000000000c % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000004034e2387bd8f370371e7de37638f39 % f1a03000000000000017 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000004049f27cc509998839a12211997c47c % 82403000000000000005 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000004075024081090908108720711140440 % 83a03000000000000010 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000400d024081090908109921911140440 % 8060300000000000001b % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000040459264c509190811a322311164464 % 82203000000000000006 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000004078e73879dcf39c1f1df1dbbbb8739 % c3c03000000000000011 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000004000000000000000100000000000000 % 0000300000000000001c % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000004000000000000000100000000000000 % 00003000000000000007 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000004000000000000000380000000000000 % 00003000000000000012 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000004000000000000000000000000000000 % 0000300000000000001d % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000004000000000000000000000000000000 % 00003000000000000008 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000004000000000000000000000000000000 % 00003000000000000013 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000007ffffffffffffffffffffffffffffff % fffff00000000000001e %%EndPreview save /d_sv_obj exch def userdict /IslandDrawDict 300 dict dup begin put /bdef {bind def} bind def /E {exch} bdef /FF {findfont} bdef /MF {makefont} bdef /RO {rotate} bdef /SC {scale} bdef /SF {setfont} bdef /SG {setgray} bdef /TR {translate} bdef /bp {lj lw rgb} bdef /bpbw {lj lw setgray} bdef /c {curveto} bdef /cl {closepath} bdef /fi {eofill} bdef /g {setgray} bdef /gr {grestore} bdef /gs {gsave} bdef /l {lineto} bdef /lj {setlinejoin} bdef /lw {setlinewidth} bdef /m {moveto} bdef /n {newpath} bdef /nx {/x E def} bdef /r {rmoveto} bdef /rl {rlineto} bdef /rgb {setrgbcolor} bdef /s {show} bdef /sd {setdash} bdef /sp {x 0 rmoveto} bdef /ss {currentpoint pop E m} bdef /st {stroke} bdef %% pattern stuff /BPSIDE 32 def %% pixels per pattern side /PATFREQ 3.0 def %% pattern pixels per mm /dp_mat [PATFREQ 0 0 PATFREQ 0 0] def /dp_pw BPSIDE def %% pattern pixel width /dp_ph BPSIDE def %% pattern pixel height /dp_w dp_pw PATFREQ div def %% pattern mm width /dp_h dp_ph PATFREQ div def %% pattern mm height /savemat matrix def /topmat matrix def /patmat matrix def %% catch nocurrentpoint error for: pathbbox /ncpoint errordict /nocurrentpoint get def errordict begin /nocurrentpoint { dup /pathbbox load eq {pop 0 0 1 1} {ncpoint} ifelse } bdef end /ar { %% sa ea sx sy rot tx ty matrix currentmatrix 8 1 roll TR RO SC n 0 0 1 5 3 roll arc setmatrix } bdef /arn { %% sa ea sx sy rot tx ty TR RO SC matrix currentmatrix 8 1 roll n 0 0 1 5 3 roll arcn setmatrix } bdef /el { %% sx sy rot tx ty matrix currentmatrix 6 1 roll TR RO SC n 0 0 1 0 360 arc setmatrix cl } bdef /image_raster { %% sw sh sd dw dh xs ys TR SC /sd E def /sh E def /sw E def /imagebuf sw sd mul 7 add 8 idiv string def sw sh sd [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop} image } bdef /imagemask_raster { TR SC /sh E def /sw E def /imagebuf sw 7 add 8 idiv string def sw sh false [sw 0 0 sh 0 0] {currentfile imagebuf readhexstring pop} imagemask } bdef /dither_color_raster { % bool sw sh sd dw dh xs ys TR SC /sd E def /sh E def /sw E def sd 8 eq and { /imagebuf 3 string def /grayval 1 string def sw sh sd [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop pop imagebuf 0 get 0.299 mul imagebuf 1 get 0.587 mul add imagebuf 2 get 0.114 mul add cvi grayval exch 0 exch put grayval } image } { /imagebuf sw 3 mul sd mul 7 add 8 idiv string def sh { currentfile imagebuf readhexstring pop pop } repeat } ifelse } bdef /image_color_raster { % bool sw sh sd dw dh xs ys /colorimage where not { dither_color_raster } { pop TR SC /sd E def /sh E def /sw E def pop /imagebuf sw 3 mul sd mul 7 add 8 idiv string def sw sh sd [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop} false 3 colorimage } ifelse } bdef /patpath { /inv E def topmat setmatrix pathbbox %% get lo - hi indecies /hy E dp_h div floor cvi def /hx E dp_w div floor cvi def /ly E dp_h div floor cvi def /lx E dp_w div floor cvi def lx 1 hx { dp_w mul ly 1 hy { dp_h mul E dup 3 1 roll E patmat currentmatrix pop TR dp_pw dp_ph inv dp_mat dp_proc imagemask patmat setmatrix } for pop } for } bdef % setpattern brush of patterns instead of gray /setpattern { /blue E def /green E def /red E def /freq E def /bwidth E def /bpside E def /bstring E def /onbits 0 def /offbits 0 def freq 0 {/y E def /x E def /xindex x 1 add 2 div bpside mul cvi def /yindex y 1 add 2 div bpside mul cvi def bstring yindex bwidth mul xindex 8 idiv add get not 1 7 xindex 8 mod sub bitshift and 0 ne {/onbits onbits 1 add def 1} {/offbits offbits 1 add def 0} ifelse } setscreen {} settransfer systemdict /setcmykcolor known { /fact 1 onbits offbits onbits add div sub def 1 red sub fact mul 1 green sub fact mul 1 blue sub fact mul 0 setcmykcolor } { offbits offbits onbits add div setgray} ifelse } bdef /dmatrix matrix def /dpi 72 0 dmatrix defaultmatrix dtransform dup mul E dup mul add sqrt def /B {gs bp st gr} bdef %% brush: gr lw lj /Bbw {gs bpbw st gr} bdef %% brush: gr lw lj /F {gs rgb eofill gr} bdef %% fill: gr /Fbw {gs setgray eofill gr} bdef %% fill: gr /PB {gs lj lw setpattern st gr} bdef /PF {gs eoclip patpath gr} bdef /BB {gs rgb lj lw strokepath clip patpath gr} bdef /xdef {exch def} bdef /clip_region { /ht xdef /wd xdef /bm xdef /lm xdef newpath lm bm moveto 0 ht rlineto wd 0 rlineto 0 ht neg rlineto closepath clip } bdef %! Island text prolog Version 3.1 %% %%BeginProlog /reencode_small_dict 12 dict def /ReencodeSmall { reencode_small_dict begin /new_codes_and_names exch def /new_font_name exch def /base_font_name exch def /base_font_dict base_font_name findfont def /newfont base_font_dict maxlength dict def base_font_dict { exch dup /FID ne { dup /Encoding eq { exch dup length array copy newfont 3 1 roll put } { exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall newfont /FontName new_font_name put new_codes_and_names aload pop new_codes_and_names length 2 idiv { newfont /Encoding get 3 1 roll put } repeat new_font_name newfont definefont pop end %reencode_small_dict } def /extended_Zapf [ 8#223 /a89 8#224 /a90 8#225 /a93 8#226 /a94 8#227 /a91 8#230 /a92 8#231 /a205 8#232 /a85 8#233 /a206 8#234 /a86 8#235 /a87 8#236 /a88 8#237 /a95 8#240 /a96 ] def /extended_Standard [ 29 /thorn 30 /yacute 31 /divide 128 /Acircumflex 129 /Adieresis 130 /Agrave 131 /Aring 132 /Atilde 133 /Ccedilla 134 /Eacute 135 /Ecircumflex 136 /Edieresis 137 /Egrave 138 /Iacute 139 /Icircumflex 140 /Idieresis 141 /Igrave 142 /Ntilde 143 /Oacute 144 /Ocircumflex 145 /Odieresis 146 /Ograve 147 /Otilde 148 /Scaron 149 /Uacute 150 /Ucircumflex 151 /Udieresis 152 /Ugrave 153 /Ydieresis 154 /Zcaron 155 /aacute 156 /acircumflex 157 /adieresis 158 /agrave 159 /aring 160 /atilde 161 /exclamdown 162 /cent 163 /sterling 164 /fraction 165 /yen 166 /florin 167 /section 168 /currency 169 /quotesingle 170 /quotedblleft 171 /guillemotleft 172 /guilsinglleft 173 /guilsinglright 174 /fi 175 /fl 176 /plusminus 177 /endash 178 /dagger 179 /daggerdbl 180 /periodcentered 181 /twosuperior 182 /paragraph 183 /bullet 184 /quotesinglbase 185 /quotedblbase 186 /quotedblright 187 /guillemotright 188 /ellipsis 189 /perthousand 190 /threesuperior 191 /questiondown 192 /mu 193 /grave 194 /acute 195 /circumflex 196 /tilde 197 /macron 198 /breve 199 /dotaccent 200 /dieresis 201 /onesuperior 202 /ring 203 /cedilla 204 /onequarter 205 /hungarumlaut 206 /ogonek 207 /caron 208 /emdash 209 /ccedilla 210 /copyright 211 /eacute 212 /ecircumflex 213 /edieresis 214 /egrave 215 /iacute 216 /icircumflex 217 /idieresis 218 /igrave 219 /logicalnot 220 /minus 221 /ntilde 222 /oacute 223 /ocircumflex 224 /odieresis 225 /AE 226 /onehalf 227 /ordfeminine 228 /ograve 229 /otilde 230 /registered 231 /scaron 232 /Lslash 233 /Oslash 234 /OE 235 /ordmasculine 236 /trademark 237 /uacute 238 /ucircumflex 239 /udieresis 240 /ugrave 241 /ae 242 /ydieresis 243 /zcaron 244 /Aacute 245 /dotlessi 246 /threequarters 247 /Eth 248 /lslash 249 /oslash 250 /oe 251 /germandbls 252 /multiply 253 /Yacute 254 /Thorn 255 /eth ] def /extended_Symbol [ ] def /extend_font { % stack: fontname newfontname exch dup (ZapfDingbats) eq { cvn exch cvn extended_Zapf ReencodeSmall } { dup (Symbol) eq { cvn exch cvn extended_Symbol ReencodeSmall } { cvn exch cvn extended_Standard ReencodeSmall } ifelse } ifelse } bind def /extend_font_name { % stack: font_name_string dup length 1 add string /extended_font_name exch def extended_font_name 0 (_) putinterval extended_font_name 1 3 -1 roll putinterval extended_font_name } bind def /gf { /f exch def f cvn where { f exch begin cvn load exec setfont end } { f 0 f length 8 sub getinterval dup /localfont exch extend_font_name def localfont extend_font localfont findfont /xsz f f length 4 sub 4 getinterval cvi def /ysz f f length 8 sub 4 getinterval cvi def [ xsz 0 0 ysz neg 0 0 ] makefont dup f cvn exch def setfont } ifelse } bind def /gfns { /f exch def f cvn where { f exch begin cvn load exec setfont end } { f 0 f length 8 sub getinterval cvn findfont /xsz f f length 4 sub 4 getinterval cvi def /ysz f f length 8 sub 4 getinterval cvi def [ xsz 0 0 ysz neg 0 0 ] makefont dup f cvn exch def setfont } ifelse } bind def /ul { % space drop thickness gs currentpoint currentlinewidth currentpoint n m 6 -3 roll lw 0 exch r 0 rl st lw m gr } bind def /nxtab { currentpoint pop 1000.0 mul cvi tab mod tab exch sub 1000.0 div 0 rmoveto } bind def /nx { /x exch def } bind def 0. nx %%EndProlog gsave 2.83465 -2.83465 scale 0 -279.4 translate topmat currentmatrix pop n 147.5 232.5 m 165 232.5 l n 165 232.5 m 161.97 233.51 l 161.97 231.49 l cl 0 0 0 F n 147.5 232.5 m 161.97 232.5 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 72.5 124.61] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -598 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(dy_duenna\)) s -1292 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (preventative maintenance,) s -678 231 m 463 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (error recovery) s savemat setmatrix n 48.75 120 m 96.25 120 l 96.25 135 l 48.75 135 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 72.5 86.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -782 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(dy_primalpivot\)) s -1100 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (select leaving variable;) s -556 231 m 463 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (pivot basis;) s -1074 463 m 695 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (update variables, PSE) s -1082 695 m 927 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (norms, reduced costs;) s -954 927 m 1159 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (select next entering) s -386 1159 m 1391 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (variable) s savemat setmatrix n 50 82.5 m 95 82.5 l 95 112.5 l 50 112.5 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 147.5 54.146] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -640 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(dy_primalin\)) s -1128 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (select entering variable) s savemat setmatrix n 126.25 50 m 168.75 50 l 168.75 60 l 126.25 60 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 147.5 29.617] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -662 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(dy_initp1obj\)) s -970 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (install and initialise) s -812 231 m 463 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (phase I objective) s savemat setmatrix n 126.25 25 m 168.75 25 l 168.75 40 l 126.25 40 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 128.75 144.237] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -620 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(tweakp1obj\)) s -1112 0 m 215 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (adjust objective, check) s -938 215 m 431 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (primal feasibility of) s -1022 431 m 647 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (variables in objective) s savemat setmatrix n 105 140 m 152.5 140 l 152.5 157.5 l 105 157.5 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 127.5 184.617] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -596 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(verifyp1obj\)) s -1104 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (check primal feasbility) s -708 231 m 463 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (of all variables) s savemat setmatrix n 103.75 180 m 151.25 180 l 151.25 195 l 103.75 195 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 72.5 193.838] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -708 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(preoptimality\)) s -914 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (factor basis, check) s -956 231 m 463 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (accuracy & confirm) s -806 463 m 695 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (feasibility status) s savemat setmatrix n 51.25 190 m 93.75 190 l 93.75 207.5 l 51.25 207.5 l 51.25 190 l cl gsave 0 0 0 0.176 0 B grestore n 147.5 25 m 146.49 21.972 l 148.51 21.972 l cl 0 0 0 F n 147.5 17.5 m 147.5 21.972 l gsave 0 0 0 0.176 0 B grestore n 147.5 50 m 146.49 46.972 l 148.51 46.972 l cl 0 0 0 F n 147.5 40 m 147.5 46.972 l gsave 0 0 0 0.176 0 B grestore n 147.5 85 m 146.49 81.972 l 148.51 81.972 l cl 0 0 0 F n 147.5 72.5 m 147.5 81.972 l gsave 0 0 0 0.176 0 B grestore n 72.5 120 m 71.491 116.97 l 73.509 116.97 l cl 0 0 0 F n 72.5 112.5 m 72.5 116.97 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 72.5 139.946] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -688 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (unrecoverable) s -294 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (error?) s savemat setmatrix n 72.5 135 m 62.5 135 l 57.5 140 l 62.5 145 l 82.5 145 l 87.5 140 l 82.5 135 l 72.5 135 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 172.645 159.458] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -402 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (entering) s -386 0 m 215 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (variable) s -444 215 m 431 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (selected?) s savemat setmatrix n 172.5 156.25 m 165 156.25 l 160 162.5 l 165 168.75 l 180 168.75 l 185 162.5 l 180 156.25 l 172.5 156.25 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 128.421 161.976] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -700 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (primal or dual) s -422 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (feasible?) s savemat setmatrix n 127.5 157.5 m 117.5 157.5 l 112.5 162.5 l 117.5 167.5 l 140 167.5 l 145 162.5 l 140 157.5 l 127.5 157.5 l cl gsave 0 0 0 0.176 0 B grestore n 127.5 195 m 120 195 l 115 200 l 120 205 l 135 205 l 140 200 l 135 195 l 127.5 195 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 127.5 199.146] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -424 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (objective) s -392 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (correct?) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 178.75 192.588] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -662 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(dy_initp1obj\)) s -1000 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (reinitialise objective,) s -614 231 m 463 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (tighten pivot) s -1014 463 m 695 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (selection parameters) s savemat setmatrix n 160 188.75 m 197.5 188.75 l 197.5 206.25 l 160 206.25 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 72.5 211.646] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -318 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (primal) s -422 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (feasible?) s savemat setmatrix n 72.5 207.5 m 65 207.5 l 60 212.5 l 65 217.5 l 80 217.5 l 85 212.5 l 80 207.5 l 72.5 207.5 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 72.5 221.646] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -218 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dual) s -422 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (feasible?) s savemat setmatrix n 72.5 217.5 m 65 217.5 l 60 222.5 l 65 227.5 l 80 227.5 l 85 222.5 l 80 217.5 l 72.5 217.5 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 167.5 216.656] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (return) s 0 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (feasible) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 42.5 231.646] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -464 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (infeasible) s -480 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (expected?) s savemat setmatrix n 42.5 227.5 m 35 227.5 l 30 232.5 l 35 237.5 l 50 237.5 l 55 232.5 l 50 227.5 l 42.5 227.5 l cl gsave 0 0 0 0.176 0 B grestore n 72.5 190 m 71.491 186.97 l 73.509 186.97 l cl 0 0 0 F n 72.5 155 m 72.5 186.97 l gsave 0 0 0 0.176 0 B grestore n 105 150 m 101.97 151.01 l 101.97 148.99 l cl 0 0 0 F n 87.5 150 m 101.97 150 l gsave 0 0 0 0.176 0 B grestore n 128.75 180 m 127.74 176.97 l 129.76 176.97 l cl 0 0 0 F n 128.75 167.5 m 128.75 176.97 l gsave 0 0 0 0.176 0 B grestore n 93.75 200 m 96.778 198.99 l 96.778 201.01 l cl 0 0 0 F n 115 200 m 96.778 200 l gsave 0 0 0 0.176 0 B grestore n 160 200 m 156.97 201.01 l 156.97 198.99 l cl 0 0 0 F n 140 200 m 156.97 200 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 47.5 152.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -312 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (return) s -240 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (error) s savemat setmatrix n 42.5 227.5 m 41.491 224.47 l 43.509 224.47 l cl 0 0 0 F n 60 222.5 m 42.5 222.5 l 42.5 224.47 l gsave 0 0 0 0.176 0 B grestore n 97.5 227.5 m 96.491 224.47 l 98.509 224.47 l cl 0 0 0 F n 85 222.5 m 97.5 222.5 l 97.5 224.47 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 20 244.146] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -312 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (return) s -464 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (infeasible) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 75 244.146] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -312 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (return) s -562 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (unbounded) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 172.5 251.646] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -614 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (tighten pivot) s -1014 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (selection parameters) s savemat setmatrix n 152.5 247.5 m 192.5 247.5 l 192.5 257.5 l 152.5 257.5 l cl gsave 0 0 0 0.176 0 B grestore n 75 240 m 73.991 236.97 l 76.009 236.97 l cl 0 0 0 F n 83.75 232.5 m 75 232.5 l 75 236.97 l gsave 0 0 0 0.176 0 B grestore n 20 240 m 18.991 236.97 l 21.009 236.97 l cl 0 0 0 F n 30 232.5 m 20 232.5 l 20 236.97 l gsave 0 0 0 0.176 0 B grestore n 152.5 252.5 m 149.47 253.51 l 149.47 251.49 l cl 0 0 0 F n 42.5 237.5 m 42.5 252.5 l 149.47 252.5 l gsave 0 0 0 0.176 0 B grestore n 147.5 45 m 150.53 43.991 l 150.53 46.009 l cl 0 0 0 F n 192.5 252.5 m 205 252.5 l 205 45 l 150.53 45 l gsave 0 0 0 0.176 0 B grestore n 205 200 m 201.97 201.01 l 201.97 198.99 l cl 0 0 0 F n 197.5 200 m 201.97 200 l gsave 0 0 0 0.176 0 B grestore n 205 162.5 m 201.97 163.51 l 201.97 161.49 l cl 0 0 0 F n 185 162.5 m 201.97 162.5 l gsave 0 0 0 0.176 0 B grestore n 95 85 m 98.028 83.991 l 98.028 86.009 l cl 0 0 0 F n 172.5 156.25 m 172.5 85 l 98.028 85 l gsave 0 0 0 0.176 0 B grestore n 47.5 147.5 m 46.491 144.47 l 48.509 144.47 l cl 0 0 0 F n 57.5 140 m 47.5 140 l 47.5 144.47 l gsave 0 0 0 0.176 0 B grestore n 128.75 172.5 m 125.72 173.51 l 125.72 171.49 l cl 0 0 0 F n 60 66.25 m 37.5 66.25 l 37.5 172.5 l 125.72 172.5 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 146.074 75.472] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -86 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (y) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 134.617 69.181] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -105 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (n) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 56.919 142.67] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -86 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (y) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 73.73 157.81] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (y) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 88.251 152.686] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (n) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 29.419 235.17] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -86 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (y) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 83.169 235.17] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -86 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (y) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 59.419 225.17] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -86 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (y) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 43.73 240.31] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (n) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 85.751 225.186] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (n) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 112.001 235.186] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (n) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 145.751 165.186] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (n) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 140.751 202.686] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (n) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 114.419 202.67] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -86 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (y) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 131.23 170.31] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (y) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 185.751 165.186] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (n) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 173.872 154.463] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (y) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 138.75 214.617] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -738 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (remove phase I) s -862 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (objective; prepare) s -554 231 m 463 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (for phase II) s savemat setmatrix n 122.5 210 m 155 210 l 155 225 l 122.5 225 l cl gsave 0 0 0 0.176 0 B grestore n 122.5 212.5 m 119.47 213.51 l 119.47 211.49 l cl 0 0 0 F n 85 212.5 m 119.47 212.5 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 85.751 215.186] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (y) s savemat setmatrix n 160 162.5 m 156.97 163.51 l 156.97 161.49 l cl 0 0 0 F n 145 162.5 m 156.97 162.5 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 147.5 63.367] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -402 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (entering) s -386 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (variable) s -444 231 m 463 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (selected?) s savemat setmatrix n 147.5 60 m 140 60 l 135 66.25 l 140 72.5 l 155 72.5 l 160 66.25 l 155 60 l 147.5 60 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 72.5 151.201] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -616 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (unbounded?) s savemat setmatrix n 72.5 145 m 62.5 145 l 57.5 150 l 62.5 155 l 82.5 155 l 87.5 150 l 82.5 145 l 72.5 145 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 101.25 61.737] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -892 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(dy_dealWithPunt\)) s -778 0 m 215 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (attempt to relax) s -698 215 m 431 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (pivot selection) s -554 431 m 647 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (parameters) s savemat setmatrix n 85 57.5 m 117.5 57.5 l 117.5 75 l 85 75 l cl gsave 0 0 0 0.176 0 B grestore n 72.5 60.204 m 65 60.204 l 60 66.454 l 65 72.704 l 80 72.704 l 85 66.454 l 80 60.204 l 72.5 60.204 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 72.742 62.9992] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -196 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (new) s -530 0 m 215 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (candidates) s -484 215 m 431 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (available?) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 58.57 65.472] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -105 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (n) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 73.876 58.541] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (y) s savemat setmatrix n 117.5 66.25 m 120.53 65.241 l 120.53 67.259 l cl 0 0 0 F n 135 66.25 m 120.53 66.25 l gsave 0 0 0 0.176 0 B grestore n 147.5 45 m 144.47 46.009 l 144.47 43.991 l cl 0 0 0 F n 72.5 60 m 72.5 45 l 144.47 45 l gsave 0 0 0 0.176 0 B grestore n 135 227.5 m 126.25 227.5 l 121.25 232.5 l 126.25 237.5 l 143.75 237.5 l 148.75 232.5 l 143.75 227.5 l 135 227.5 l cl 1 1 1 F gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 135 233.701] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -288 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (punt?) s savemat setmatrix n 165 217.5 m 161.97 218.51 l 161.97 216.49 l cl 0 0 0 F n 155 217.5 m 161.97 217.5 l gsave 0 0 0 0.176 0 B grestore n 121.25 232.5 m 118.22 233.51 l 118.22 231.49 l cl 0 0 0 F n 111.25 232.5 m 118.22 232.5 l gsave 0 0 0 0.176 0 B grestore n 135 252.5 m 133.99 249.47 l 136.01 249.47 l cl 0 0 0 F n 135 237.5 m 135 249.47 l gsave 0 0 0 0.176 0 B grestore n 97.5 227.5 m 88.75 227.5 l 83.75 232.5 l 88.75 237.5 l 106.25 237.5 l 111.25 232.5 l 106.25 227.5 l 97.5 227.5 l cl 1 1 1 F gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 97.5 231.646] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -562 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (unbounded) s -480 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (expected?) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 136.154 240.045] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (n) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 149.016 235.17] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (y) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 167.5 231.656] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (return) s 0 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (punt) s savemat setmatrix userdict /#copies 1 put grestore %%Trailer %%DocumentNeededResources: font Bookman-Light %%DocumentSuppliedResources: end d_sv_obj restore DyLP-1.6.0/DyLP/doc/Figures/primalpivcalls.drw0000644000076700007670000004403511171477034016020 0ustar ª» €ì"€ ˆÈ sÇH6eb P%Ì™2SÒè)ƒBFŒ.r°q#‡ )XL3›0y˜¤³ðˆœ7uà,¤RK!rêÌAƒ¢I*E¤!† ,\¢DŒ!k`DZc†‹0b°ˆq´hW£H¹"ËÂoĨñÁƒÊ( ì„a“挶R’ABÄܺwyL…‚N1l¡HyûD •$Oœa‚« Â%Ù‚Å 17bê°AH‡m‹ B.SšGScæ°E!äÍ›5m¸IÛ Û6eȤ©Ó¦wÍ !æä˜5"`³‘3»ˆ“#L’LAÂû¤›3u–aÈÜsÖ°M»V™<_àÈI“› œ4vÞÐ9K§&9tÈQFm|Q†dø @H ¸“L Ðdm9íÔÓOA åRJåÁ”SP±pƒU1Äpƒˆ8\•ÕV_µ–‹eÅ[nÁ%]v±ÅDFôõWŽ‚E˜až)ƘcIF™eœi&$%yšh¤™†šjUºFXl³Õv[n»õö[pÃ7†Çñ \r 0çtÒQÇ Öa§w xžx䙇žzh©¥ |ôÍaôÇŸ H *È „7UÈ“O@ EY~øTH#ºPâ‰2ØàÂeZ‰µáªª’eV kµõV\?¶c~áØ`…–ØbP4öXd“Uvj“j>%[S®ÖÚi©QÉy[Ê6§—¸éÆÛ™c GœqÈ­éfÏE7ÆtÕ]—ÝvÝé¶çC}žFzë ê|f¨Û¢65:`&¸ H”R¨Ó¥jºj§M}*"‰&²`CŠX¥ #Y­võꌲÚX«Ž<ú¨+[¼ùë‘Ã*iìePÂá¤S-K‰å´<@;sk¯qy­mÙ†É-Àyk&šá²9n¹q¦k'»yº¼®ù9/ 3Þû…úºÁïþ ©À“úg°…˜f¸iW ƒ*Ä'Ö@ñŠÕUÜ1ÂJã¬72® ³É<,’Ä.ylË/s&³´Ï^É8µ°YKÏ`nëÐd~{fšk.×¹pž+'êÞÙîwOµ¼ôÚm5e<äLûñÐ_¿]?°¤‹ÓÁfª!§yØpˆ¡ŽÊBU*Z,÷ó,B¿± Ó:2·Š¬·ßCú8°Â&Y,“ˆ' ó²ŸÝle´ÎB®óä_j+&æBƒ«&›ž¿i.ºsÖ¹.žzJ]¼þT¯ö¼ç °“]´f;Få`‘X„|g©à™maÅóòØö°æEoUƒÑôbU#ëm/{¹Ú^ɼ'¸ðneÈÚL̘¥¾š9®}ZŠ\—('¿Ÿ­Löë\›>‡4Ñ)í§{—êÊÃ:ªÙë€÷ÉOínÇ5GAl½›ÐïÈ–°á¡-ƒÇ[›¨"f«Tìƒd ¡ôdD½æ H(ìÛ ‹>©Œ|™1Ÿâhø8²/K9“¶*7¿jŽh÷CÇ?Ò- €NãÓê躆 d Ã¢( 5lÍ_º‹ ƒ“™PxeSñ–Æ*¦BaD·ÞÍc׋ãõæx²Á¥l|‡Ë£ Ñ׬,Ù¬Üaü|v9Csø¢þ’Ö¿Ò1-€’d"%«F¨6´A4tHí>ùÀ¯ñn‚Z¬`*½È!0ªm+0Àˆ "Ëc9„s!Iˆ·¾éR…O\ íL– SYá#‰Ãdîl™–ë7W´ün£óŸéš†ºlJ­uU›Ãtc„7È óiÃê@‡!è† s §Í)Á‚maÂ;[;Yù΋Ðà#8ÐH=eI75®Ê–Õ{£­B–B ñò{(Ÿá ê2=Î0}}d( «¥ÌžE”~E¤ÆÈŒZ’…š6§VÀA½¤ úˆnÊüèG¦^ÛBžÜÔ‚ª< pw:LCxƒ4Y9 ) `‚Lr¢Wb$4ˆƒ$û!Òಙ… ƒøêWuvQ§ƒ-,O›ØÅÂıå,fMEY¡Ne³2¹WjË‚ÏE´£|I)ÑY)Tžƒ« QÃ\0ÏáÀŒp»X>×h·¤ú“©r ( ëøË©Æ¡‹[è ·ªÃ‡zµ™{fE¥yQj:‰UâÙê:B¡&kÀk(±Hܱáô‚«4Þ;“±çz°¨Ó=ê>oiB8bw—Ú¥cT_ˆÇª3¡XïiæPø×‡é b4ÉŠÑ#n›jý¨Û‡9”áP‰*ƒ~¯xNÒú°ìLmÚX«XÆÂV$œÍq Ô·( ì[ä#‹V$¤„MM›Sä Øa>Ñ ¬RÌzµ\°usù`€þm»¾c0- ^…s¼æªy âúQ4‘F[d‰«ùÈ$ p’ôåfJç2Îân¦z [:[e°èذ!ÊGf@-¿ížiL°«ÄìÆëò Âg–°/¥ Ãò]8¼oÞ0Îäìa:73Äw«žÝ«ÑkF2ÅMl«Æ@ý !p(ƒfLSE—‹,awéIWš[>°t_D]ŽušÌŸ6s÷DíB5S5qW-&Í´çò¶º‡¯¶³XGAò™=$49Mw¿÷Ä·–w®+ Ÿ1 a Qä·(Ebã¿®µË†4ƒZëãÇy²¦ÂÁ³9bd$ç€+B×r“ŸÌD•–ÑV¶j¯"Äöøµ>ìd‘þì,ýçIz×—^õšS9êÏ9ÁEÂs¬Çvë.H:´¿®õ°Ç½ë7(:piîôß|C§úÎ¯ÞØ¬s+]‘ÁmÁ^ƒ¼×`ydmßm~\G«]ðl'üëÞx#C¾è`Gußg¾õ›ç¬ðgúº‹^b¸/ûäÏÎûË;ßêÐ7¼L¦O{™\ßÇozò¹Ÿcï·üÀg¼ã‡äëÇ>÷Ûß}û›ÿþ¶»^þžG}Äg}d!€ø·~ú‡sü÷Nðçv({å‡×ç[ŸbzO‡lh×{ý§yâ{óg€Å×^WzU—Xl`RSÀ a‚&µRpbPR±9 3"pnƒw‚Ž¥/ƒ—ñxc¡ƒB3 ?Ø‚Bƒ!ps·4, v N¤IÈ„™„.…20„3€cˆ:˜…o@^hu`ø„1h†„E3°¥¢ƒÍQeZÈoÈ‚A8„>‡†ñ¤‡lÀ‡KØ„ƒ… C…1†7 ƒc`Rn`'x–‰X؆NHˆføx—áeŠ÷Wˆ#h@P²yÀ‰|ø‰q(г·5*³§ƒp0}xr ²ŠŽ6X„[:èL~á‘óážÈˆaƒ°´3 80‰Wèba¾XÀ(rÈ#b‹Wi:øyP£ñwŒH„3¨x¡‹¼ÈŽî˜‰ò82HŠQ騆dðãhehçuɰã/qâHˆöxƒçˆŠ"`RîÒ‡íøŽñX‘b8ƒå2 :¨Š¬8sWn€Y&Y†˜¥ƒ,É. “bøYxhƒ&’:xh0 t “DÈ“2€”—¡‡ePÑÈ AV¬Ñ)È 0•vQ•1,Ð6pM1X6@"Aˆ^i!ÁlÙ–nù–m9ŽfXŒ0`–§XuZ tÐ…ø•a9–8P–g …ÕH‡,k —Šé–r)“¶2‰—T¹—]Y~)–i'˜ Y˜E‹ù™l¹™¤H’Š'™[I™} –˜I–f)š–‰Š ¹˜®GwƒšÅ yÉ•>§ª ˜š)ŠdØ[Zq’V›Š™3p"øH*ÉišzÉ—^Y·waEˆ7àeÙ)"6˜ÆÉ˜hi™j‰›“ –)·W× …ÛÙžÝùp9Ž…œˆIž§iža–éY’ƒƒîÉÞ ŸýÑ™‡•›¨úIü9Žÿ™ Ÿ®y„öùœ•™ŸÓ©žú ï) q œu8œIy€ý!n ‚A Riu…a äuS¨"À à:º£<Ú£>ú£@¤B*p7P:Š£Ná61€;z†פNA;*L*¥:š”u9¥—a¥NaYz¥Ç¥ÄX—VФcŠ¥`ŠYSêC°¦_ê c¤:º¤´É£Eú¤Cº£fš§|*¤^¸¢cТ/£3jƒ4j£{Ú§Šº¨Œz¤9Ú¨©Bš¨’Z©•J©–ê§!¨‚š0*£KA£‡z…8j¦zª¨šªªºª¬Úª®úªªZª°:«´Z«¶j²z«ºº«¶š«¼z«Ê¢.ê©„ª†ê“¤ªFpËÚ¬Ìú«¦Ê¬ÒÚ¬ÐzªÓ*­¾Ê«×J­Õê¬ÞºªÙúªÛú¬Ý:®½ª¬«j®Ý¬:¬ŸZ¨5š¬Þ:­é:¯®ª®ªŠ¯õz­á­öÚªúŠª›ªkª8Z°Öú¯ùª°ûú­ »­ýê¯ÛÚ°ôºªìÚ©ïj¬ñz£ 0K®¿ú±ÓY®"{k«% ²ÚZ²¬z²éʲ՚²çʪ2[­ë®Åê!¢Š¬>û³>+B+´@ ´·x´ºU´?;´C«´>«[H[N8Ê´Dë´Q›´XkµRë´P µS˵5€£aûµ·¶\;µf{hkµS[µkÛ¶L«¶Y[7;¨ ª³ÇºÉ¶Ÿõ·5@S ¸€ë·{¸‚ë´„{¸o«ˆ‹¸ƒû¸Ÿe¸„¹‹K¹ˆK¶Š+¹]«´œ›¸J»¸“‹µ¢Û¸¢Û¹Eû¹–û¸wK¬y‹;Ë·=ëµu;¸Ux»UX¶Yk»¸›»N‹£k‹º@Û»·«»_Ë»½K·f«¹¡K¼ ›ºq«¸Î«¼QkºÓ‹µÑÛ¼ÄÛº«·‹¤M¾Yqä;¦gz¦â+¾Lº¾x*¥îK¦Yú¾OʾLš¾Y£å[¾çK¾ö;–óÛ¾ñ ¿ïk¥ôû¤ý›¿cФì¥ö[ÀLÀî;À_êÀYQÁá»À]º¿ÀkÁLÁ,Àü¿ë˽9 »{‹¨ˆ5C Â,¼Â.ÌÂ-Ã/ìÂ3,Ã1lÃ5LÃ6Œ£9¼e=œÃ?lÃ8ŒÃA\Ã8:Ä@ŒÄ7\Ä-ÌÄ/ŒÃGœÄNìÃJìÂ$üº±‹ÂCp[ÜÅ7ð\`L†gØ¿@Ú¿aÆ^ìÅ<²ÆFÀ#iÌÅ&«g,Æ,¾?jÆbŒÆp¬ÆmÜÇn¼Çp<ÇϾu\Æu,È* È[ÌÆlüÆ[ŒÈ…˜:§‡œÇbìÈEêÇ}|Åð:ª‹Áªë´¬º¿c*ÁRêÀdŒÁU[º¢¼ª¤¼¥ŒÊ… ʢ˼E;ÊlÊ",p©LÊ¡¬´ûÊ|Ê"LÆœ¬±žl¦ãË ÍüÌ ÍÌÍÔ<ÍÖìÌÕŒÍ× Í²Ê#¦êÍmü¬E€>jªCpªç¼ÍÙ,ÍÚÜÎì<1ʼÎò¬ÎôìÎóŒÍß|ªà<ÎßÇ?jÎèlõüÎÔ|ÌÞ›Ì p’ ­ÐÎKƒõÐуÕÐ ½Ð%rÑÑ%RÑ £ -Ñ ýÐÍÑ¡Ñ&½Ñ$ÝÐ8Ò!=Ò}Ò'MÒIé¼!½Ò íÒ Ó&mÐ&ü½  Ó@ÔB=ÔA ¼D}ÔHÔmÔJÝÔN­ÓLýÔDÍÓYœ¬æzÕöú£X½ÕöÊÕÛÕYí£\=Ö`MÖ_½­Z]ÖjMÖlí­“ mÝÖT}ÂòšF`×x}×z×yÝ×{­×í×}-Ø Ø‚]ª‚MØ„]ØŠ­Ø…ÍØŒ£Žíר•ý×—=Ø…-Ù=Ù{íÙy=×>]³ªJ¦}Ú¦M³0[Ú¨}Úª-²ÛÚ®ý²"˪²Ú´ý±-·ýÚº½ª·M¾í±¶}ÛKÚ©ܬ*Ú-¶Å-Û¬êÜÀÝÛ«*¶±Mݪ*ݬ ÝÕ͵»­ÜÝmµÏÝÚÑíÝÓ-Û«ÝÉÝ©ÊÜ<[µæ­ªE0ßô=ßå-Þ«*ú½ßú}ßL±õ]ßþ=´¬Êßü=àB»ÛNß.nàýÞL˪ >ßéß© ᮪î-»¶ ´'¼¸«¶&-âÅû»?]âÒK¼$®Ñ&î»J{Òþ³ ÝâýâÏ â*Ì Pã^»ãEÛÐŽÂ6ŽÑS;ÌE~уûÁâN‹ä?îâŠËäQ¾Ô p䦜ä%²ä¬å1иPã@>¼<ä}ûä>ŠãGžæ+ž¼(þ£jŽæ=çJû£3î³>^çl®½n®çsŽây^´pÞæ¸k柜ÒÎ{Ç&-Ó ­è-Óè>ÓˆN¼ŽžÑŒî¼oMéÝ蓾è•Þ»vžâê¸{émè;µCÐê®Þê!ͪ¬þê®ëàzåNKëµÒ²žëº>¶®ªûëÀÎë«:ëº쩊ì´nÓÝëJKì!­êÊ }íÖžíØ¾íÙ®íÞÎíàþíÚîá^ªâîçžîäþíëÞîÙnîÜ®îòÞîî^ï⎤öžïÖîÔ0àï?Ì/¶ÿ^ð¯Ë¦,¶ð-ðLð _ðÁ oðÿÁ ÿð\kñïðñ[ñ?ñ ßVËñ/òu)¶Ô¤Ü£!Íò»¼ç‚î£HÚò<úò?jó;ºæ>êÀoó=óîç./ô<êì ó,ó@Kí_üôÙ(tRïÐ ìT/õPõpõO_—SÿõW/¥YŸcÿÅ ö8`õ__öLZö^öh/ö\OösÿÅpïÐ<Œöl¿õYÿöq?õ|Ïõl÷iö[÷m_÷~OøTøOOíBP‘?ùCqÛ’ù“ßÕ˜ùÁMù”o®žù8Ü›ŸùãZú’ßù¨ú¨Ü8ŠúB ù¡/ªú¬ú¤?û¥zú³_û›o®ÔÞˬË,üçKüÅ\ÈøKÊÈ¿ôÆ_¾Í?¿ÏŸÀ=Ë1?ý°,Á²l¿¹Œñr|ý³ÌüÖO¿ÁêNÓ ÍéýÑéoÒøkê·Òê¿Ðì/ÑóßÑ=Žþöoþë¯ÿ}ÿÄIÓɱöWêÎñšv›JXá­NöÞ†CUê >ÀS) ׺pø-»M@SU9àÄU0¦ªhH  ¼€èJŠ@ ¸O•Ó+YÁ-eÅ@xÛd` ,Y£ïЬ¸uàÇâ?иu,(Ûl`$‚­Í&AÈÛŽ`t‚AP¶Q;çûª 'ÐjYA+˜ÿ›²Ú‚W° -0ûÄ`‚#ƒ$oÂI¸1xÛ`ü€TÐ †AØàj,°ßÉ9…å ÏãƒS®Ë½9¦÷³ÂÜÌzAŽÊ==…ëê\–Ûƒ;/°? yœ!Zƒ.t•¹Ø® 2k€!M¦…B’6 9Z)¬h5-¡‘B& Yá*”h­’4¤ÑbaD³…µðÞB]ÑÞŸ)t…¿Pr4=¸u%4†C§æ¡ÏÊ„‡.× ÂówÎ"BL˜ ¡!ÐzkÇVC°òÚ”9„­ªÃ6Ep@;|‡8 yH…º‡ghËàÃ{8û!=t‡ñ®ÃuÈÃ"; ˆ±ÖÃ}˜óá>ô‡þ! Äsh)¢:}1BDyÈqCtˆqfD"`Ñ¡E<ˆð°¯ØõáG„!qI¥DwXþ4Ú–¹‰7¹¡ª“†q¢Nlu´) 4.f혔‚lSfïûH¸&¥‚€ƒŒ'þNBRH™4.$•B?’C^£çr†@¤‘p EšHÔ¦ä‰DRÒEÊW!e¤Û`HÒëtÈ™†@ˆümêGÆ€)$³3’ÄèA¶H€¿dR“œ’P²FêÈI#­$eч$RKvENˆ±JXUãX¬Š¥éɈ–'÷¤ŸÜm~òO®ª@¹'û¤D£……rPJ–f(%¢,rQF´àÉ*¥ýbUd,SZÊMÙ6˜¦_˜’SŠÊO¹)=% •¤2UŽÊU™W¥ªl ’NÅÃx8!keR"N·²VÊÊ]9+ee®Ì•¶ÒVöÊaÉ+%Yû•Y&¥bI,g¥²¬BʲY2KÌ¢,ñW°\–Ò²Y>Ëk9!³e±ä–¸2X/o9,·e´,–Ski8,Õ¥†3ƒRG­Kxiße»Ô‚. ¾GÈ´æå½ì—öÒja@€ áH`ºÄ—“kU¸" ¶ü¥ÕZ˜ÖM8L¦1ÝeÂ|˜®aæËH13¦Å4pb«b"L‰E&Á$™sÁÌ“ÉßBf(/3fjÌ‹9·`¦Í|™sb­›y3g&ʬ™1ÓfúLþ¦/…Ï”™³e¦­£É0“æ~‹˜L3 ͧ¹4ƒæË¤v2-ç´•5{ÞÖôQîQ¹¼¯Ù£ºæØ”h\“¤: Ç£ÌæÍ#›mSmzÍC)6ã&GÓšhÓGaM¹y6“Øä›o3o–ÍYX7wÛÔRwsnúÍÁ™8{Ô£|`Œ³¢áÍÅi7%§âì……óJNà 7wÔÊÃ`—ó¡qMR69!Z`?¯s‚)V:EçèdŽs ζI:Cç`9µ3pF´·:m'ääQ+û <Ƙ“e§+žK ü¥/&þ´ßj,žŒy¿ð—¿Tô[_ÈÓx®?é©<9X÷`5ïy^Æèù)µ³Cè“ÒŒ1bé ˜”²ˆÖÉHÉO¸&î¾Ø¼Ÿ‰ýÉ?'äÿó‚/öIÆ^â ”~‚»-É@À–ä”:Ý€ô™>³±4Sî³$ÆO0?±·³Ÿ8–¥ýIB¡e ¨‚€Ö1$e@égõ ß®6ÐAWÞµ8åÐîØž¹¼–ˆ†n;àµCu(>:¢¡‡"¾ú+ƒè¹C¢HAÑ$Z?—(·—Nô†NÑ"jà·ó¡W4Z–½óùÁNÚ0;iºÌŒš24êýÔ(c£Ì08À‚â5iiÔ¤ÝQ–G5Ú0‹j­f´=šÑúÉ32‘*ÒDJŒ@#}¤‹4’BÒG*“*i<1yò’ZÒˆçïJU"ý¤Št’:ÒH JEégѤ—”“¢ÒMzHAé'-U¦””†ÒQJIW)&µ¥2I•ÊRFJK©'•¥¦Ô’²Òˆ'L/)µ›fH‡¢dŠLOúq t2bJfZ*JE2õ:ègž@SÍȪ˜©2•G,™:ÓDÊ@¥éªº¦ÕtžPÓlÚ@¹éªò¦ãžVÓRUN3ã4KìtZÓm [•<]¦â´šBÓ Ái 4ŠúTâÓ}º%íér£“8 ‹ÑµÙ5µ*ªE½¨5£¢8ÊQ;ªGµ¨×ð£ŠÔ‘ºQIêG})+¥ªÔ•ÊR[*t©05¦ÊT•úgªM½©-µ¦âÔ˜Š5‰ŒO¥RJ U"É~êO¥hF•J¥²¤J&óߪBµ¨BU"ƒT§êRª*MŽMUTqȶjU5ªWÕ¨Õ¤JÈÒSiÄk«ÆÃB¶2›–o5®6L¸JWߪ‹«uu®âU»Šëj^U—~•¯º­½ Wõª_½«µhJÂ*Xçc5¬x±îÕœX¥fÚz¬€•°¶U£i5a¦ÂÛZn‹i~VÏU2;«eu[ hòÌÑšº¦iU¬ÂkiUÍÕš¶RëÎ4­Sn5-ÑZ[•1l­¨•´Wà:·lëÕâq¬ÕhõVâÚ´Œ«TЭBë&WÙ:\•ku¥®Å¹.Wëš]™«ÐZŒFÏp†×›7^ÛgyÕQ>/sš×¥—óΫÎ#¯ìõè}¿øZôè+z=¯ëõ½öÖ8ã~Õ¯z¢zƒÖÕálT6H¥ÎÙ ©ì¢zœ–ÊÁXÖ_û”ƒ]y¿ZX KóÔk~e_•ê½6ªði_•ˆE°"¬Âò©K¬ëb€n¾úFÕ8ÊbãŒÍ“»¬7ÚXéÊvìmı>VÇþ¯;cì ,²ª1˜ùØÑøPY§Š¨0…Y'+9ecIœWV"S¶¬âq¤òÌÆ>gªÈ,|„kg–YyHDú\Š@it³™ÅJú;9 Vš ‰D†$Æ“"ölŸ}Ö Ðš#`%™Õÿ4UDÑV¶hÿAu´FªÊVÙ,›e_—õ²2³Ä>Mk̬™%‰Ì Ô²Ù0já,A-t–ÎæYsg“Ÿõ³H ÐÂD#Ð\í =´?2‘þÈFÛhƒÀ£õµFÊ陈a+–d±%¶!4ÙÞÏJÃl'(u"iζÙ6Re›lÅ’µ¶¾0§][kKm—m´u¶2íÛ2[ü‰?·í° ›Ç–Û’Û*mÁ-´m·ÓvÝšÛbKÒÒ­‰XiëÖ‘ŠÛgËÑöm¼¥¶Á5fX÷‰<ñ¼Œ*¾þÆ‚;p¥ŸÀí°í•à~Fƒ+>M£¢²²‘ánXòçb»WOChi¬Í“‘[J.É=¹&7å’\s5êÚÊ}¹*7æ¢\–+ÖìÕYóV07çÊܘKs{T[‹‹;Wç ÝA»­Žé5M¦5éÊÐhZᎮ7UºPwK.LoêMéiÔUº Óé"Ý¥ËuÛX…£º[WéZ]šuÁ.2½ºKwêj]´+v@Ù]»]7íV8 Û£º•ÝueöîêÝSõÏnÝÞåU}—V¹¬¿;'¬|±Ÿ0Æ‚>9û„›ã…šŒµ;øx/# g6Wb2^È[y#o›¼›·ó ·ËË϶Õ}œò’^‰å­(o꽑wñ‚AÑ W/软×ó”ú±Ö%é«p)Ë÷Z>àË…¯l[˜ÁWÃýÞ—|!\<¾ÄWdßÖ†|KÖôEm¯/úö^å;|UfÕQ Ðè 4¥3°ŠæÀB@là<eà Яú5 &â=)÷»~g@Uh¿éwýΠ$è¯QÀ ò—þŠ·Õ/WÈ,š¥ÿæ_®¬ÐüÍ¿EfTàŠðÈâ.2D%)`õK"Êãæ2TªêÔ7þ CÀ:<†&P2ÅxC¾( ‚H‚8qæ×((¯PšDB žÁYh¤æ@D@(/˜Aüà/0Ü@€_@“œà#œ„EBN@r`|År‚ÀxCî!|J„ƒõÅa "À ¿!2Ü(ÂÀþa˜"œ¡ß’Å M3æ€A6 *\@EBü÷¯D(SZ!óFL™3\ÀQ£"”(A% 6et€xA§ œ0dÔ¨ãŒ4dƼ±©²Ä9eÂÐy#Gf’9l¸!CDN˜; Ì0ÁæM¢G“ÒIóÆ ¥1ALQª¶ 1FÆ ¡C1b€F¢Pœ)3GfŒ¢B¼NMãæLb<2qèÝ)D » nȸQ”È›1uÚ”qCÇI™2dPK!ìUÎÂ2Q š¢óçУéL©›4ªY×q „l:£ÉÔ^Ydê¡¢IÏQ0'Œ23É|™cçKG5 ÊàƒDj3 Ô™SF™4cèÌ|ujÕ«DàËŸÑ×¼~ó¼àÑŒGt¤÷‚ç%°‡Œ‘a^fô!`„¢÷BŠGž… R¨À Fá jEˆçØ„‰{´Æ–E‹"¾ ÅÊñhá¨áC88ÇaÀ$äˆSÀÈ*Þ(`‹/Lq„‘eÐq†Uy,ùR8H‡Un@ä”9Їƒl€ÇVrœ!†—jŠq›nbõä–at‰¦†c8š×-åålÚ{p(…†—(vøŠl°áåXjÉå¥r8¸%aK!uéžVw—‰îñ›Y¾ª™®Z†o0†ê{<)ë@ÑñèŸ#¶á`oê*°/¸á «w4ê«—nàáà x”¡—î!±Æb›ª²ŠlœbdJ®P]Éá%©¹¢ñÆë’‘)aÌñkˆαæÕŽ´m±­®Ëî H‘G­¤øÆ[E€Ðƺt9æ4.¹’J!'‡ ÌAGfh(FIÁá •5x1iàQsØÆthÌñ@•1"APa„EDBH#©\Í6ØòË1Ã1smŒH_È(ß<û ´Ð#”õÏAƒÐuJM5wŽŽ6_oퟀ ^3áP×Ý+yó-yy•‡ýæn;›tçˆ+Îøˆ¦–aµÃJÉÑrÙ4-<»Õ¶WK¥³»×~{‹E%€$äàÆmrLÇÁŒÉמrdÅ” $à,bˆñ#º1ô OÏÔ{ñÍ´<Á¹‘/ß`òµh¾{ÿ ÈXøÌ;テ $@F€/Ø^÷¾Ç•7„ABeˆCÿöp°·t .péÃÅç> & f`šÎ–”œ…![ ¸Xu†ŽUkyäC‡jÑ!ýãÝíØGV ôQ¥@&ìH-CèÇ8™¡©ð ;üà:–%*ÀKTÖBx´&Å„Ká AÐB.‡Rðá€CáU‹†51#p¨²Aˆb‹cgpÄ$ºæfM4ã‘õ2Q‹(<" ]ÃØh<¤ rˆDºõð‡D‚#ã8ŒD‰LLã˜føF/¥AFƒù‚U<Ö?ŠPO噃„È€2”1ËÃtÐC"ÍD•Ö:Ï-ËÓ6 Ý+½DO^ðIÁ”A 똞$Ô†:Ðí 8 „p”4`Îc¶kLÙ0TvLB[èfGb¯q’mŠh¤vŠ9dšA…Iq¥x°É˜3( dç‘¥OÍa ¢¬—ÆøGË0Úòå æ/s)¢aêÓÊÌL4É0MTóš›Ôf‹¸éM3$‰= 'VXα-0i€‰EAyÌd"倈ƒeFíÙÀ|²ÔŸkØ#¾¤æÄÉá èbJ@IY=uŠGó#ZN\²Ò<¯Œå,k9„[JH¡åe†ÌþᇠŒæTØ?£“¥¥#=5ÚP³ò)vH×jÏUœM§8IZ“&à¨e5*"‡ã7”Aýé(ŠT½a©xMå*[UȲ/ȯ>ëæSì,/A~|¯ÚT$ u¿3cn`XªZ•¡ïÌ*ˆ¹ºUÿu&å•®uqI]hb—šÛ¥«w™*àî5Ž%Û9Û¼ñ¦thui4ü¼h@Ûyз5tC' A4H«¹'6êã°’ZÏ&ºÓ)µÿ]êìµ-@tlc#IÒ?0k’ÇÎ;¤‰ ZkɵòlåaŒzMµÙIÎGKìg½rš=à±ÅËz 5{­'ÏšØBZ©¶Å2©:‰Aë)Ϥ޶±˜1†”Á¸ß »,u{cUꀬ~j4#~R®Êg3 %ù¶Ó眥ăŒ³ü‚²@ˆ1+š/²‡G|›þëHöðEë’ZϵÖ\­jé»)³¦€ ž3ëz›ÃÌÉ A”ZMÇu_¾Ñ(¼»2ŸŠxd7_Y3‡±Ê±kÙ×Z/ÐDºÐoè°7HhuÃ… Ž ÊG* «jÍq‡»$ff‡xÍm«ËXpZ“2ƒÅÕ]ñ³¯}•¾„ÁÛŸLßø>éHHÁ÷,ô¤1Ie¬67e‰œ6 O>ÍÒÚ‡5äkXÞܰÀ™x4}zI;Úë®vÑOt•*ǺÖ7ÚFÔt,ëY Cú¨+ÚÀß öŸ—í4oì¨>ö³w¦Øjý¤ÉW>¿Ëí|Üç¾|»›»1ÎÒ[ó9_öD9Gd8ä!©4µÜj&ŽÙWãyÂàLMöÎ<†/S¶£æ¿Q÷Õo¡.vç9$ˆx/B©VÎ]ݪëOômá&[ÂXÑ&#"v²u¢'Ä%$nöB€Õó&\¡##g3ä“’Rt³%x1”˜ ¸˜Ioå%è#x4%x‚/ú§‚1Ó&Èmƒ³1ý'‚È3eð¿ñβ=0ˆ,Bpƒ+Ø:hØD1ná(ˆt„4£„@h_x K{à[ׂ,ˆ’TƒR Ð\fÅ8 Ð…"bVw !nˆf%mІ-bVlp‡s¨FÅ,Û㇂eT{( wÈ-­"ˆƒ8l.Œ‘ˆƒhTqGŽÈ*K¡ˆ‚ňòÁ*öT‰x…oÀ(V8†pp}èa @`ÇEâ!p Co`OVÐ8ƒ†!q+e@ n°x#b{B‘Û!#•ò)—>T²£1Œe0ÆH7Í%ŒVWŘ$l€Œõ³‹÷“,ep–sð`÷n¢A„Á…;ÌòQ‚Žêˆ`H%bP/Øé(À•<öˆðh#ܘ>÷ÈIòÈ(2QâŽáØ™™Œ2‚0ÑF—Œ-‘I)ÍUd%£<:3Eÿó">VWOá¡@S$’oq‘g`tÄ%ˆ´0)Ä, kuD7ÃÅ^ “íÈ“6bD²¶CA)A|g}4Eê¥^LY}û”mÚ¨F™0$b#N0&)Žúè•Ã…•á8Ž„aŽS‘„M]‘nöŽÐXŽç¸kI“FW5”_Ù+9Œ.iY>éF‚ Bé^bA–`)t¹—GyØ–‘XÖHŒs0¹GTÒŠÉ_ aï´ €# 2@G/8¥yš20[«™0ðš¨Y390¶)‹4›4ЛÐ4›‡aš©9³)¶9z±š|ñƉ2¹‰Ðyš3 šaÀ6°œ²ÉšÛ¸¹š§µœ¿Éš8°œÃ©›Õ›È©›ÛI6›‰È!tÚ1@2N Y3á+LÁyü1y {¢3̙֔3 ˜ñAÐf®w& ÊŸúíAi01 Ê'×± ê %¢•á cÁ©!¢ª9¯ñ•"*›E@ È!¢áY m0¡àÓ¡¿YŠ8á30œE¢:Ó¡8ôI`£K:›å¤;*¡0ñ£4€œI0¤Ê¡4МI ¤ J'ê)º¢s¡šO¥c*›OP¥=z¥cžOÀ¥E:¦¿ùb:Ãùgº¤4ФS€$>Âys1¥UÀ¦1PÈYpê£ Ê3Qvº¡‘z¢U°§5 šYP©Z²©„Z‘ža ¨5Pž*§‹šžž©M*V¢‹:¥TO jI¹ù§¹ÚœŽ÷.†j'ú¤‘«ªIT«Œ1`²éo²7¤Ú¬á™£‘«¿éhÙ”«ÃÉñAÃÚ¤440Ô¬Suð#Ú0± >1誮d o0a ÒÍyu‚²ó#õz¯ß÷úšR8îÿꮪ9°0SOl`;‹°Ïšîžw殿éëÑŒ±î:œÉQ/ ÓMJ/g0ÕÖSJ²&;¯o8€œNc;Vg¬ƒ *ýy¡ÈíA'‹'Ú(VÁ'{s³ª‰L•’%7+›ñŠ{l‘7žM‹ò&µ.û›U˲û:.;œ IJI{³Mú2Gx§.;¥1ëŸëv J›ý‰‡u1ë³qÛœè *àÊ›·'ÚLq›°³º¤9Рq£1Ṫº¸¿É«‹;œ22…·Múme@«š•?"{4»Ÿýá8ÀA¤–ÊÍY„Á³2[m|q¢%ʪù¢ (£|!›ª‹®¤1¢žhPñA¡"º¿‹ª›S|1œ£Êy|q¶Ž²¢;¥c@»1ºŸq1Byе "y1I‘¸:¾'Êfi¡qJ¡à«š¨Qº]н²¹‹…‹½á™l ¾¿ éË£ ¾ÃYMz§àÛ¤ŠS¿à;¥]A HÂN‡šÈ©±nÀ±¨Ùœ¤‘R+Šš'j@仟©9ŸÑ¿Vʾ± ¯z›3EàÁÇË*h$èšÃy>$ÁèÁM‹l¡?‚Áåë¡f¸¡5Kû9¢GòA¤šš'Êfb/E¬¦M :©é¦+œšáy>þ²RÄ‘k©!#r ¼G:u¿3Фuà¸à“šSZ'œ¥d,¦±ÙœaP¾d* o¬šzмûI²ùKáÉ/A8ÓÇ‘K·§¡»öG‹}Œ¤x›M 3Qáı9¥¡XÉR̨ \¾’*°í!#S!oÓ¡[~d˜hû¹©3‘ù ª3Aî²1«žY:ð™#œIŸ_0yÐÞC7¤™Ë²ËÚÑSBÜ%{k Q²˜YIt©2i )šùÑ÷q)ð’z©g†à \ó™ÚqÍïäŒ,™Ò¨B‰’‚¾ ÌHÔÍ ôÍvÎí8ÎÆì™óÌ>tëÓøÎ·¥ÏÉÃÏòÙ™õyŸôâýŒ×ØÎ;4•PfÑ}"ŸåÜ‘j™†Êì1ÌìÌŠ9Û1S ’\15Y'g[2öý|Ì%Íõ("3íÑ‹9(ðÝ<\ÑÓÆ•ÓaÉzAG-”@‰ AM(IBÍ ÍËE]_#gðNÍõïtÓïôNã| ¦—[ÝŽöÃ1ãÜ–ä2Kô$ )™O™qôNvY8ô{ðÓÔ¼ ¥ˆhŸÃG †Æ¬Ó^Ù"]ÑÀmÕ4}¬…í× ³d%#Kz×rÍÒF7[¿7[wMB-W<—#²4Ù]½ÒIׯ§uš%xíÙ‘&"[Іs0ÙÚ&iOD62B# ©Ò^ÏýXg"ÂÖ6òD ДT=¸sÕe’†#2ÖþèK½Í1`¡býÛâfíÛh \l–ImÜoýN#QÙ¥]v­ÚœíÔt3ÎŽ ÙÔÛ”MÚ- ˜ {©=éן­!´=ÚsmÞö­[è­1úÝÚèñÚ’=Nßœ¨à¸=#5’0¼}ÐÖÝ"Â}¬í”‚ÜT"|ý¥/²‡dà#oá+ð‘y†¬+ˆFîƒk¹±+§,Ž0›è0 °H ñ“  8`XmþB7³ƒQS€:UÕ-@¢uáÕcCãë}!.·gK^uD¬ea u`ø{RNZE£rþ‚ˆK1mÂá9- r\mæH®¤¥<àÃSዌhåë804`¸Ù2Àç~èÓÀØ1‚~9ೕ~fr£[6;‰¤FoÙ1zNéâUC–þX[ “´–>Á d#â_:áèpáÇaŽ91 }1ëÖ¥ÒG¬R54±å{Ñç²³Nå;gàé‘Ô~<[#q‡ä3(#Ê-À®C91ë|Ý|Õpþë`Þ5¿Þ €dzc;ÆÈ2vð#Ý<±Óey´Iàs3™Î•ïëõé u·Ø³u8à¥.§^dzʬ>p¼]±>ë´N]¶Žè ®ëWnD#Ážì·ßé‘ë8ÆìξÐ.í[í}qíÙŽÝ~Yý‘òàŽ¯XLóô‚ëNó.ÐïX‰éסéNn~·£^ø>I7°ï70[¾‰Y0`ê9™êß[ïê¶ð ñtóðI’èq$ñ¼Nñ¿þåžñÄç[ßñÆññ!?í$Oò'¿í+Ïíß.';.îän¯dRóíþlïÞ;;Ÿ÷òQïç'ô .G™aô³eÿðïô?[ÿêp!ë _ërëZŸì#2ñ¾Þ`oõ™V6dŸìfßìÿòRíjíl¯[(÷oß-?î_ é‡÷7ŸIN$ï=Oï›ôÕ"øù^ø±Åï–‘øK/ðM_ð«îøR¯ð’ßð‡õ¸¾õ™ßõ›oñSîùú6¾ìg_úi?òªoò¬ïöÞþúþ"÷á.û©1˃ ¶¿û8¿÷-Ó÷·øAïéƒ/ŸG?êïø->åõ˜_ÂS9Toò9¼Êñr]õÓ:^ó]¼*§iÐ÷SvÃã¿Ó'òÇÚ#Ú.å‰À¸§uÖ¹k£1Ä?Ù¡÷|Ÿý“.ŽÓÙ;àGô ŸðS|ÉOÕÀVwaÝóë ð-X¾ˆ÷{]ÅvÙ‚>ŽçýH߳〩ÏÚõ…¶7ÑŸ QtOoXu×1l Ìy|O÷±À¿×ûtþ ~Eoøý?@ê`|zQ¯F¾ªçù¤ßåsE0b?0§‰Ì€ßï ºÔ'þ¤ ¶+Uðü¥¿˜¥É–±&HA ¬@wçÅ ÏË5î- =—ýßlùsJé¡:!_„~Wf="¸ë àõC‚|pØUÀWöš Úƒ‚…°äMADèúád„/j 2¯@&a Ì}”HçÞË{ x` Äš¨ó,áZÄ„3ð Ö@58[袴‹ND½ùâ7ăñÆrèÏ!H „êp$¶CCHãaJ†ì7̼20Á`ý»‰Fo :Üt‡p¢Ž¥Å(zE/ËRŒ#e*¢Å¨ ñßïÓŒœÐ^§ÒbIbD¼‹¢1/V½½8ý¢æSäPìÍBÂh 7àaÌ…«ï$úÂÛèÍ]’ †½‘þÅ;µHÙb&t‹ÁO³¸?÷ÿÎX…/"†GçG£Ÿ7¼ƒ\Ï¢Ç$ÈãG ‰±‘~Àw¸çcc wc€Å™˜•"M´ŽÍ0@6:9[¶c]Làññ‰Gè -b_ĈçqRHõhE_{‰²$ÖFÆûTâ{p?bD¶‡‰ Odü›ÿ HÙëä5„‘¡QF2ÈñXË#Ž´~2òÈÖè#Ñ¡a”R1š?yÈ&c¹#kÝ1I›r@5Ä4šl†äXcž„&(#9vE¤ØIËslŠOTLÇ›è'óäÐŽ6ÎNò9G(¹âQÔsIÑ9ŠEè˜(Ï"RØy9 QJHYï$¥¼‚òR~Eg(7%¢4‹Qqç½+`ãjªÄM—!U.ÇLÙ*ÇbtT”Ÿ’cØÊä˜+‰cf @KWJV[\%Yì”±RXÞJË@*ef˜–ƒSÊfé+¡å¢´ Ó²XÚ¸w¥”¥¶d–‡òYÂÊo9,qeµ|W6[ªJæˆ.å¯ô”i±]RK>i-‰•¹\•`‘[rÊu,Á%±|—#A_fK€9Næ«”ŽS_ŠË;ô®Ä夗3]ÞËhi0Ý%¿|WWñbòJ‡©.!f¾ —óQþKŒÙ05¦·ü”ë¡=$£0¶—› c‰`ꌢ@¬Â©6+Á3ð¨Ü`PCp˜­á5ë‘0Î$;´ C“4ì†ÞðŽfÒ,ÔŒÃm‡îðà ¾LM  4ƒP”70Và@Ð¦Ú @¨´‰Àøàpu@7í¦0Àò@ðMê&Èà ìƒÀ€!ä»Á ý@‚@<ˆœ“€ÅI8è»ÈÐié$á  T0°:@€€(¸ûÔÎÛi €î,Àð9mgè4žÅ³â €î¬žÒÓy„뉲'õÄþ"ƒå @À?€Í“x*  9€`P€š' ˜œ  €_@´.àì‚w°àÁ<@›ø)à Ì@$ø‚ 0e` @ÀV†€@ð ^Á>ÈÀ`Ð=àÁꜜ ‚ÌYÀ`œ° vfPƒ0®'Èž3 ƒë‰²§ä4ÆàzrªDg`º38ð@ä$œE4QÝ9€à‰F€(:0€î,@ÜopTgää¢0à‹€B *+µs‹ŠNHç°ö`˜Q(*: @¡ 4O98Ó3Š2`€Hmgm€ ‘V(š"i"5À„?PD€ Ф´“~R´ÙIÙ@攢€À¬ÍºJÀ`Ad@Âç0à -à>Y( +PD9°›¿àP‚}à BÈŸàø`r7°›» ü‚tÐ ü7 ¦€@ÎÚ è3 ?܃J`ˆ€*ÐaÀð?¨€5È< \N9,´|àÒé;¸Ÿà¬ƒgÐîAÝ » |‚oð t3°‹ón‚ƒ0žèè¤Us`ÀiHÀ“º8Qj ,Us€A`I1èâ À€ÒªDy(¢ÓÀzS0Ø© OƒðÁÚsƒpE  |€÷yEÙÚl? üƒIð ÜÀ Áøà ¼* ` (€J V%8«ÿàob‚xPܪp9 ôƒ?Ð Ì@SÈÀ¼ƒ>²'`à¡:Õ  à`pòÔÀˆªè|ÏÀ³€0*+ €ª¡ ,Np`pŸJõŠâÐÕz¸ÁÀ›k5àǺZ€;z5œ(0[jq*Ö<€Š«ÙÀ©^ÖÌŠ6[jà0µºŠT~°RI©è´8À¤Ñ° N9ŠúÁ!pŸ€4NàΨqíà àƒ# @¿¨¯|øpð7Ó%¨Ì€¾ÚWàÀ@@÷àl‚o `(¢àÀpYÉ'°„´`‚FJH?#h¤ ŠzgÐH1@à 0Q@UÑ@%` ¸O"UñÀx-±@¿¾s08a@5­õoRyøæ‘5ØàÁž ܪ€pXt¸(ФQ4˜F Âì,h¤x`r €Yp^¹ìä$Ñ08AÀ›ÍúõÜ‚ÁÞ,ø›U@ N>àg¬˜ssrÀaAT¡Ó4R:g™  ‘r€ÉY*©AÀ­þÉizuŸxURˆÿ¼ÀdÏû X ® œL=©5 ƒþƒOà V-Dx®­3ѶNMŠ;™-ãt¶ rp=Á䜜 @ÚW K hž  n&€að ®x¨ÞÀÀ‚æ Äm0àÒÀ€?VAø¶Aˆ[ˆº~ÀkßÀðƒæ ê&J­µá•¾ƒ@Î& —ÎÆi7‚ÍŒ³q‹ Þ㔥—qŠNƹqC®è€q¾P“KqçhŸÁON”ª,=ÅS€8®A@ T\‘Kq€Ì%>·ã€ ÐsEîî@ìNŸk|AØS×éc8ÀйE7À\À>k­3;`ì"ÝZk»)·ÖFU Tr;VaoÀ‡˜ñäp”«½ Šg7€á(Upx/°»TÁ*`…Y$jÇXˆqt…:°Ž €•€}ðBïÂÅ ¢—ôšÞ¾éJU/>8½V@ôÒƒÒ T)ê5Ç`ö€Ú9Yé!н¼—p¢Ðð{i¯íý¡Rôßã‹;'xúÀøNOÜ™Dô•¾Ú³Ö&Ñð¢ïîµ½ÔzÐ}±/ñ àx_|ðDÏoú´WmjÏ€üݽò÷üÖßû«N ­­¹ö7þ"PÑ Žÿ•¿34„€CÀU)  XcP:0þÀ:”‡úÐÐDE'(¿ß×¾JQ$TApð%¤STt||¹¨àú†`>@5¢2øGQ:ê|Y°ö£=Øûê`ÑiHƒ°ùU¤Œô’H*I)iM¤˜”rRÍ™@>(½ø y‚SP…ÑAéµ/–/ À°æÃdØ €c:†¿ð‹…œÇ ¿ØzÒpF µ —á;LR­0ê÷ ·Ô”Ú]mªæ¨ÙÕ €™ZSyjNõ¬=õ§ÞƒÀe1(<ÀÂOÔ \âЛ‰71ûE›žø‰Z[L ŠI±û Å¥˜kWîû \é½Z8£’Vpà‡aqjͨ­Ôâ,¼ŠkëØÅì6£úÖp ^1/6ÄXVmc‹í&tÀx_WZÌŒµ«¸®…x ƒ×€°° }±å•{cû*Ü«8½qôÅâ×CÐÑ19°Ç ãƒt¬9ì9žÇáÂjN {é±±ýX›XûbWìèŧ×ÅjÎ{W/°± ¹»ÞÓëc5'=Ù Y™ Žë­¯/Ê6ä×K޳ìHɇ˜ œä.kDǬA(³"uŒdŠŒBeòG(4`d„lì¬èÔÉYt¢P6à‘y2 ´¢S%ßdjf²A€´¢Ó8åZ‹Bg@4~«(t\åM+:3À2ÆÂÍsÔŠÎð•U1 eÅ,û_JÒ²-6®(ÉãkÛGw1]®Áv'·Nçë:K/? z9ùÖ¿ ˜‡ï!Ìà/f⋘ùA=0á÷6æÇì>Yé1˜ÌùVôbfPp ÂØÌ$@3ûeÊ q è!|®Ý‘k¢më´¸ãѯÛ8=î¥Í¬¹Óf”«rqóÚݹM—5€wtqsÑ=ºI÷ ,ÝàLq €ˆºY—53zpu£3ŵž]×83Ëx€â­µ×;CDyLP-1.6.0/DyLP/doc/Figures/Makefile.in0000644000076700007670000002617311171477034014330 0ustar # Makefile.in generated by automake 1.9.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2009 Lou Hafer # All Rights Reserved. # This file is distributed under the Common Public License. # Author: Lou Hafer SFU 2009.04.15 srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = doc/Figures DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ac_c_add_to_includes.m4 \ $(top_srcdir)/m4/ac_c_get_sunpro_libs.m4 \ $(top_srcdir)/m4/ac_dylp_equiv_for_cpp_bool.m4 \ $(top_srcdir)/m4/ac_dylp_find_fp_funcs.m4 \ $(top_srcdir)/m4/ac_dylp_fix_cppflags.m4 \ $(top_srcdir)/m4/ac_dylp_options.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/inc/config_dylp.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADDLIBS = @ADDLIBS@ ADD_CFLAGS = @ADD_CFLAGS@ ADD_CXXFLAGS = @ADD_CXXFLAGS@ ALWAYS_FALSE_FALSE = @ALWAYS_FALSE_FALSE@ ALWAYS_FALSE_TRUE = @ALWAYS_FALSE_TRUE@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AUX_DIR = @AUX_DIR@ AWK = @AWK@ BUILDTOOLSDIR = @BUILDTOOLSDIR@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CDEFS = @CDEFS@ CFLAGS = @CFLAGS@ COINUTILSDOCDIR = @COINUTILSDOCDIR@ COINUTILSOBJDIR = @COINUTILSOBJDIR@ COINUTILSSRCDIR = @COINUTILSSRCDIR@ COIN_HAS_COINUTILS_FALSE = @COIN_HAS_COINUTILS_FALSE@ COIN_HAS_COINUTILS_TRUE = @COIN_HAS_COINUTILS_TRUE@ COIN_HAS_DYLP_FALSE = @COIN_HAS_DYLP_FALSE@ COIN_HAS_DYLP_TRUE = @COIN_HAS_DYLP_TRUE@ COIN_HAS_OSI_FALSE = @COIN_HAS_OSI_FALSE@ COIN_HAS_OSI_TRUE = @COIN_HAS_OSI_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEFS = @CXXDEFS@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DBG_CFLAGS = @DBG_CFLAGS@ DBG_CXXFLAGS = @DBG_CXXFLAGS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DYLPDOCDIR = @DYLPDOCDIR@ DYLPOBJDIR = @DYLPOBJDIR@ DYLPSRCDIR = @DYLPSRCDIR@ DYLP_ERRMSGDIR = @DYLP_ERRMSGDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FADDLIBS = @FADDLIBS@ FFLAGS = @FFLAGS@ HAVE_EXTERNALS_FALSE = @HAVE_EXTERNALS_FALSE@ HAVE_EXTERNALS_TRUE = @HAVE_EXTERNALS_TRUE@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBEXT = @LIBEXT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLM4 = @LIBTOOLM4@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_LDFLAGS = @LT_LDFLAGS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ MPICC = @MPICC@ MPICXX = @MPICXX@ OBJEXT = @OBJEXT@ OPT_CFLAGS = @OPT_CFLAGS@ OPT_CXXFLAGS = @OPT_CXXFLAGS@ OSIDOCDIR = @OSIDOCDIR@ OSIOBJDIR = @OSIOBJDIR@ OSISRCDIR = @OSISRCDIR@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ RPATH_FLAGS = @RPATH_FLAGS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ VPATH_DISTCLEANFILES = @VPATH_DISTCLEANFILES@ abs_bin_dir = @abs_bin_dir@ abs_include_dir = @abs_include_dir@ abs_lib_dir = @abs_lib_dir@ abs_source_dir = @abs_source_dir@ ac_c_preproc_warn_flag = @ac_c_preproc_warn_flag@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ ac_cxx_preproc_warn_flag = @ac_cxx_preproc_warn_flag@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ have_autoconf = @have_autoconf@ have_automake = @have_automake@ have_svn = @have_svn@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sol_cc_compiler = @sol_cc_compiler@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ AUTOMAKE_OPTIONS = foreign # Make sure the source for the figures is distributed. EXTRA_DIST = $(dylpdoc_FIGURES) dylpdoc_FIGURES = conmgmtcalls.drw \ conmgmtcalls.epsu \ dual2flow.drw \ dual2flow.epsu \ dualcalls.drw \ dualcalls.epsu \ dualerrorflow.drw \ dualerrorflow.epsu \ dualpivcalls.drw \ dualpivcalls.epsu \ dylpnormalflow.drw \ dylpnormalflow.epsu \ epsupatch.sed \ factorcalls.drw \ factorcalls.epsu \ primal1flow.drw \ primal1flow.epsu \ primal2flow.drw \ primal2flow.epsu \ primalcalls.drw \ primalcalls.epsu \ primalerrorflow.drw \ primalerrorflow.epsu \ primalpivcalls.drw \ primalpivcalls.epsu \ startupflow.drw \ startupflow.epsu \ varmgmtcalls.drw \ varmgmtcalls.epsu all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/Figures/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign doc/Figures/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-libtool dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-exec install-exec-am \ install-info install-info-am install-man install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: DyLP-1.6.0/DyLP/doc/Figures/primal2flow.drw0000644000076700007670000007171211171477034015236 0ustar ª» €Ì-€ ˆÈ sÇH6eb P%Ì™2SÒè)ƒBFŒ.r°q#‡ )XL3›0y˜¤³ðˆœ7uà,„ò†M6iÜP "çå9(„²$ˆ)O®„"§Î4(š$¡RDJ",`¸€ —(QÄ€#EH†orÒQ9‡e Za°ˆ‘£Ü3n¸¨1·îÖ¹y÷n$»Õ¬H—0e* RK¦N¡J¥jkܯóˆ%kx¬^¾1ðº˜aãÆÜ¿—/Ç@ý×oĨñÁƒÊ( ì„ÁyÆ í!EœP±;MoÚva€ F m(H¡<‘B%É'A˜€X DIÚq•—tÎØ:lÒ¡Ý"ˆóéˬç1Ę9´ƒ¾y³¦M7)Øgmm”AFu´!`à œr"ˆqÒkˆ`räÜL$1žäÆu8Tm±Í¦ däñu”á†a¤ÀCoÀáƒpÈQ†22GG@‚àŸZ2þ7F,ܘãŽeôô† ø8Æ@Ê‘Çkt4FG[>†ÑÆ2’±ãYIÈGMšAöTTSUuUV[u…YXc•uMj±Å3¸phcý…w„ª6¢sÉ ƒ`€ š£{™ub1-ĘcA5õædrZöXšåÙ Ÿ±pƒ ‚­&Wj†²&—k°ÉF›m¸éÆ›o<'\UÄíŠÜVÊ1Gt·MWÝuÙmçBwßñžwpgzê±ç|ÙÒ§Ü}ù ±_ÿ8Æ€<x`‚ 6ø NXá…ò€Â†~â$šˆ¢­+¶øEiøÇD¾A‡8ê¨Àe 4 †9‘[r¤ÑB;8é0Âv(ü^srÃ;ÆDF]nÜñÇeÌÁPLQ„È;º1e6Wi`K’aßmͱò“G\ÆÄ èäAF™1Ï è6³„epé%˜eˆI¦f*€¦šlvœ”Í—¤n¦§H|º±ÖJ(àÀª |Ýðè¤8Hªêß>è\0®÷³ %^©a `ªØ¦y*Yœ•Ñ)Wܦ†ä™`4ÐàB 4ØpÚ«²ž®9 ´¦xëm ÛkpÃwÉ-×ÜsÑ)kvÚq'žŽÒK­µÜʧí{Ø*ï­}øÙ+.þ( "¨à¹ Jëà÷ñ†A¡…c`¨¡zbÅü–øÐ¿*²è"ÁçÄ0ÓKLqÕ(³Ç\óšcÀ&¶2I$iZ“MÔö)̹­N^ágö”»ù)o{ã T#ÃiƒdA .³8¾‰0.–:ÌK2µ/1ðrmÕæ2#·S¥ê"¬šÁ ¼âªÕ©&u­³Um`§+ãðÊWµ“]îŒÅ»dQçw͵Àc¼ñÐæZñ™O{˜—EÚÔ\ÒWõÌ….ui¯]Þ{WøÆG¯ó¥O_ì‘ûNT«øõ¨aCªòp?‡™A|t˜ÒÉR´1 áikÀšøÆP‡Œ! 0ÁÑÜ`†4È¡ X3CØR&†ƒ¤aÞ’Sø%:„iL4Ý`7Á0Tšƒ ;'’!¼Án0‘ƒXD™”45øÛYz)– î"Âä¥LÞÂÜ…ÊÄ ãæò̤-6Á‰NPÀŸE(D1 R”ÂW² –o‹à,'H· Þ­-›IÕ Tƒ*С‚ÙÌÉN¤ô“  ¥(GIÊR,wÎÌ¥óN¥b'Zú„·ÏñÅ„sèà×Î|n³›oè'8:ή T… BkHA†ÂS¢c‰h=eM&FS.4'H8C<±¥1]au ¾ÆuCÌ•íŽH;` uXdÑݱz÷DfotãbR­Xžäiq[͛ϣ§ê•ëzéÊ»¸ç.ðIH|ó*_½î…¾|­ODýzŸ·d@#¡l ðk™¬„¥(Ñ kQz‰~@J¢’ld+_XPšÊÒ¦sS€-qÙÈ]*€˜8Mæee’ƒÎ@³ÄÌADSƒarö†4í2ÙªÔV*šoígL+ւ泃œä`Ê)™:P†#¥åçn€ˆ0P¤1ÍNS·ÜYýTˆ¸ŠST)kº¸3y€,é4xΪO´¦EU,vk‹Võâ·¸:=rYï\Ø[×öþXV•ju£[÷%G͵®þ™^ë%»YmDXÓ‚µü=­Kd ,º4@S†í°eÛÓb}ÃXª²›l +Ø®ô„…1ñeF˜âÍ¢À/r©Ai›§¿@ôµ.]XpãÒÂ.‘1ãh|‘ ßS·+œ\L :SàJpn(½èH§ÓÔýuÎ%pP¥{;$U‰ÚÝw™º,ðJq¼U¬ÖÓËôfU½Ð —¿ ß°Êﲯ¼Èg>{áK}ü+]Ç£Ž,“›L×$LáRžrl^%ZÉäßz8¸ q.-‹Ù;š9&Ì]ªY–h˜šv¡±¨ç‚Pc¶Èwiu‹1 äQ§¶°¦æ‘/•ä™,Ö éAAÜæ†QþSœ-g¥;|Ð'‡ø–#Öe‰C}øš³Í´ö¬9¨ÃÑåÖ.ÎAáríÚfp0å~ £¾½msO“.G åÛäÕ9ÛsžÎÁ”e¬:žö»5ÏÍ–‹Øåê^÷vKsw}çTgA‹xäUsUßÜf¬vñy`ìª{Éß3’5fÝsýÜV@ÇQÐyU@̲°x€Ãƒ Äè¯Y¸€ˆ5›†'ÍM~~óØ%'‡Ñ)Ò{×Ú›– µ[«Úx¶*˜¹•4TŠýópÝ£ dvÑ×YMWVé´Ž(GpŒÙ j쥅ܼ‡Òš&Ê® ×ã6wuw¢À£Kp¢þʺGÍnR·»ðïFñYQ-ÞT%n^ç¹ùâ[•³Wß[F±Î·{y†×}ÓÚg¶¾ñ­íó/¡}D‡Fº°R’CaoŽáÄ®}ÙDw;IY€ƒÃ…U6(Ý¿±¼{ÖüuB•—æÁ+œÌP|êÃ¥:<äQüñÝŠ|'Ïq;{œ¾ ×3Zù¼Ö?îsL9éMµ•‹¡åd0ÐêJ^¿´…½…}Û1 eYË.SÖýݯ¼:½ŸË~—DØ•pKåDevx˧xÍ·fÏgqÑ·^’·q`eFc…}™·Fœ×}%÷}¡'W„6$g€]â @2 Ó`N31ipK%È1b"Q2ëwa–X ”6lçXövS7ïä6päöCx«V„Q(w„D¨„×Ô7…•l9(CŃgáu]øc²EvËw€á‡9F‰¤“jjHˆÞdˆnˆu¯Ôv‹8{’…t_M¸õPM—ŠsA–Øi¨5[j·dW¨u²'\0À*4¦cáL½Ç—áxRG€Tpp¼B€Mä]¨|‰qÎwqÐç<Ò§qc4–‡gߣ}øÕyÞzýåÃ8g[2a6Ç~9w¯W‹±'‡!¡o{Áo5€4ðYÁ+¼GŒ|gŒÈ¨ŒÌˆTÅr|˜|7iVç倨Ó'uF—W_š'rùErŸháG6`W–règn0ƒ8iðW9ò8F[.Ð%F:ZÊeeþØ¿WŒ²ÃE`ËxÎ8f Ùpgq É€Ö‘Z%‘ÚHg•wgw›Ç}úeràç_1’6`„V’ಎfX5¨J+IoX8*ZX²•AzQýØSÿ¸“);ǘŒAY|Y€Ð¨GÉ|Ç£”ÉEg¹ÙSù¹}#çyûurù•é–(ÙzfY7/I)d1“å6 7sÙ{IDç“@Y‚×—ÏÈpf†xS¤€ƒ9qKi˜‰˜OIyW˜ç˜h•9™YiŽ*–øq’ìXaœŠ4Esá‹’2“ó4:¦¹99Œv©š=ù“{9€aæ—²‰€ ¹xéxL g×^Š•×œjT•‘9Ž)zçx™Ë™™e ´Ø™.¹–sQÝ6¢Îdw8I—:©ew‰]¬9žWž±ixÒX›ÔH˜ì©›Mɛ𠕿y‘Ù÷˜á¨I™ú™œüébÙŽ4Ø~ò ÒédúÂ7Ø© ÛÙ ¨ùÁ'¡âéšCYxѸš”¸Y˜l–!ê›Öœ9œ÷¹äˆrö-ú¢Î£ï8£ñ×’Óù’\!(š‰£1“>šw@ €´1¡Dj¡Dù—FI›h¦žzUêžì5gPj‘ÞXŸ)ŽVšŸÈ¹#ÊéÌ9–¬÷ŸuúÔs؆Wg…‡F·P„7§æL;v74(ª­b³¦—j£ V¢CtAMqy“¼'Œ¡à‰]yIB)§F ˜vŠ”xº¤Ú¤Nù¤Õ¨)¨¹‘’‰•8hû©Žþ)£g™ˆöv£@6(3Iª¥Ye³Úµ Tz;pº«ÆgžФwº€Âª§Ä ¢~z¬ŒiÂiŸÌŠŸ*z¨Zj’Óú¥‘ÓkÕ ‡ªÊˆªrC8ÞêCàšeâz«÷wqz®z¤i›åÅf×ø¡ï¯Ü(•ôª¬'z•XŽÐª"0²ˆ†2І5×¥)™XPHibªˆ;HŠŽÈi2Aª aªÑDj¬VnÖkàFL> oív†}QnÚ&´G»c1`ªO¸†…H©Uh­Y¸ªGÇ…uMAËjC+ùh(gH[a{Kû„l¢Mû4©@Wµ{i™êƒ´´^k(ž†´(u¶Šª5z­X›{ñªO«§É¦¶¤·“«ÚŒ¼Š|uš€Ú®Ëó®K};ŸSj¯„š¢ÇY²ˆº¥ý 4ÚX;{Ú¦­¬—=ú­ê‡ë¦õº}G]k®°é½éZ±‘;¾·§×§–뻘«¾š‹¢ÄK²â'äG¿9’G»Àf³’šQUwˆo8³pK ¥¨µvø´B(j4f,Áí&QP¬';7uSkÀClÁ l³¦øˆ9ÖµoñŠËäÄa,ˆ»°Dì¼7 uÄewtEšÔËÁuéÁ7|;½Z§â¬ìŠÂ˧Ÿ#¨Á²Åé¬4ü_"é•Ã?WC¿ öWôë`Cs<\Åhi‹£HKGL‡Ó†Y|¨nC[4à´1Ê—ÈAb,¥l(:$)4Æ„Üm>öŦ¼Ê[ÉAzxMg¤{Á³‡R2 ‹6°þf¸ ‹¸ÚK|܋ǎ;›·¬~Üž+È"¥$J•ƒ*ÈŒ¥„v%v“1‚5&8$#Ò²Žæ¥*éÃV»uXÛÉ›öÉËäi”RË¡uCõL[¢Õ*h§ÏžÕt¡ñÏ’XLb‡Ë¶Õ(iˆdï×ËÌ›–·ÈN6À(5°ú¦¦¬û£t,|'´K UI*ÍKͼÛÂè›ÍõºÍ"{¥™RvW)'?/6lpŸ„P°r £HtÐ%mHBsx@Î C1”<$·DÎ.X ]"2؜鬼g£@m‚Àî¬Àr‹7­,ÐûL4P° £`-Ö…øÇ]Ích  ¡Ð,ÄÎXÍ5ËÉ7+Ï(ÀŠ,†´Å7F†x Mµ&BºXíb~-7Ö´evŠý(ŒMk-d¥|ØÄäØ(Æ×œÉ±·Éì„[Rf\P—¤]¸œÌ°kÇMxÏ|x{,˜Û€*\ÒyÒ„ Ž¸Ò†JG.½È)§w€5cðò2]2ФA3èL–í··Ü·jŒµ¯\¦a¥aÌÌuÚØ«Ìo:¤«t ÍéÙÇ#=ÛækÒƒœ¬…œÛ‡<²Þ­à‚¼.«™ÐÍÙJÝ‚«¢Ö†Sʦ=ǨýÁ± Þ³ËÚEIÞ!mÞ²M¹,\Ûëý±íMœÍ ß-Í•0¥‰Ê¥Smߘ\ÀTxÀiœÕ\ŒÄ¦¶cBÆ7´¥³„=d=8ÀuÅ!žÅÒM✼Õð¤×—ÁŠSŒ8ò¤‰.ÅB¾Ü¼6~S¤5{­°Ö˰ÝÚ}àâý½êÊÇâ{ÞnÍ:¯À‹Ûޝ›rp ÓÍݨÔ*×#N×Ô Ï$[G^„4–F˜n‰=_+rž„é¶Ö‘n,f„wަsnM›hÅl;ã øË[l×]¼µ9öçvŲéT,u?llˆn©5®æ™z³I\çpè¹êQ<êN¸ÙíÌé7jê|ÑÈüä®ÚRŽ®Í ž›Yž˜×Œ¬îåUʹś¥ñ;¿L3ævsÉ`ÝŠ®–Xû­úª6Iš²Êä=à©—wÜÑy¬àáÛ¸^¾ðªÞØ|Û&êÞÎÒ+ú¹Ò*ÕÎí¯CîÐÔyZºÑÞ­þ Öž­Þ´n»å}å î• áãÎ޾ξÀžÈ–ɯìnæïølö+S  aK¿RpbPùØÆ3"€0nP!XS‚ñ_0À¯"ò>B3 'ñ ñ^Á¤Ø"€15!BC4t6ó±C€q;$ò@¯E_ŠG¿òxáû¸Ã,ò#¹±‚P_ó)ó+ÿ*v®õl#3öº$öŸ'­¨2"%òkö{Qòg_QoñaôxÁ··#$ò¼!‚Þ±´õ|¯ö*ßöÁDø3L"»Q p>"#}òkø‰cçº&ò€qP"þÑ?oô¿òú7Áß"1aù›ï?õmÊ7t"¯ùe # s÷¹ßú9ßñ¾ß(ÀÏ#ùÅü•üŸ¿òÍo.ü5AôŽÏöñ´ÕÉŸÅýl~{õÞÏú׿ü‚ßòj]j"0%ü‚ùÆŸÕÿýHßü¹ŒÐ†oˆoì†6pK¬ßããxw¡ƒÌÒ1û`ÔØÀ9 »ÓDÞ8$0Â?º"ø$ \ÐzeÀ84¾³ ‚0"ò¡KL<– N`oHìµ€Ò0ºBî Hìù¾Àz ü@Ђ?¼ðñÜá‹,.P'ô´˜XÀ ¼5Po„5ð÷ú¼‚ì ‚X0Ár DKpkÉ…'oàd~¤#+ðÀ,ÈÏ àëxo!툄$Å ¤tÍ î¿Ž÷òØ tƒ}¡ÄÀ…9è`¼ w æÁ)ø”ž«ÂzÍfÁ ˜œßF{gÁv ;¸•@•ßè௿‰B°%!:0B0¸ É^'U!áÀ•7 U)4…X ê¥'û2!+d‚KÈÆB¥ƒôjáª(…¸°B‹Ö¾à <„Mð~BY MÇ(D†É¾<_ø [a4, °CkH±!.‚ŽPÒ•¨µå× s` ¤4Òà4„ñ<èÇYø‡1 ÄH ¢A<ˆ\áØÉB ÀJìή'âù‡Ä­Dº¢1"þÙˆcá"’'‡[»ˆ Ñ$rDŒ¨äJ"¹‘,”Ä<±ÿáÓ‚7Q!RD„S"Oü‰±èÁCyHí!> úÐîðC›¢S|ŠÑ'BÅ©H ¢T¬ŠX+^ŬCÂPœ‡õðö¤h\ö¡è‡F -ªÅµÈÛ¢[|‹p1.ÊŶˆç¢]¼‹x1/º¨û¢_Ì‹|ñ/êE¡Á¢Q‹š!)Î…¥hn@c|ŒŽQ0¦EÇH£dT‹•‘2Æ¿˜-ãe„Œ Ñ-nF¹Ø#ãg,€Q¼EÔø #Q ‹G11–E¥xU#kl‹·Ñ-æÆµ¸Ùbi“4šFÝ(Wcq„‹½1-öÃäˆ#ntŽÄ±3FGЃ£t|Ž×±-ºFÃ(óál\ŒµÑŠÇáÈÇ#¨:æñTǼ˜É£_loq=êÆôˆÍcj\ôñ2nÇ¢ØÉâ£ý0È) ó‘4’@N´yb@‚ò@>HÙ d ˜A FH9!-dƒÄ2aÈ Y!Adˆ ’DN4¹!G¤‡¼2DbH ©"dŒl‘²FÖ€ýc^ûŽ%¦6‚ÈÊfØ †$’DrHÉÊv$—d‘œ‘ ÀI2É ‰$Ÿd‡¬’4 IVI%‰$QäƒÄ’0òAJI#I%Ç$—\’PLžÉ)ù%Ç$<ŒÞñ?‚G/™ uä‘ x2t€Èy'󤞜ýÐNRI?ù'Å$Ÿ”„ÒEªH:I e¡L/ÒF~IG©(-dš¤”)ÒCöI?ù&û£l”“A²!Ž…Q©äà‚©4‰*Q%’JRÙjZåNÜ °ò$jÄXI]e«Y•J®žÊS™*M%®¬µòUÎJY+/¢­¤ˆ¿rWšÄ†¨,û®<–­fXÂÊbÙ¡¥’»–£²YŽÄ^(±åµ´–Ò’XË`Ù*;elü‘ r)°.Û%»|—î^ÊKwÙ.éå¼”—÷Ò^ÖË{Ùõ¥ñ—ú`ÞË|™/¦½ì‡3`&L|i0áeÃŒ—úa*̇ù/f»4—>R1†JÉr†@Çü˜€"dîyò+ ⯙"ÓcªÌù“Z¦øI+seöC”92½%©$ˆ'sd¦Ì¹2]¦ËŒ™ SgŽLQi3M¦Í¤™€hzLŸù2€Ò$.BPͰmâÑŒšì’g²Ì¦é21fœ4‹º²W¶<,‰!ߢØüˆÔZ–Lm©!Éæ„4›Ú’ZnµY4µå˜¤Œr@ÂM±)7É%WX›bónBɽ©,û&ÝÄ•^Ó?‚M¦XšÈBãÌEÑòqJÎÈI9g儜–3sbÎÍ99-g]üIit¾ÌÈXžÉ@L‹C@-¦NÍÙ99çål“3%ÂÎ×I;Ygít–3tªEÑY:C§zdŠuªN#`;‹§ëLœŸrqNÀåIWeWxžÐ3zvG™Z˜§£ Ø3{jÏÐ`=E?¤žÒ3|>OêÙ=-Âö<ŸÜ³{RÏ™)>Ã'ùìžè}–Oð>Ù§ô|ŸÖ3~žOä‰.§þüŸ4€ P(¨= T{ÐÊ@¨þ\ t€òO¹Q£-Žñ‚jÐâ¸A—#Å qƒŠÐ:B=hgÌ $4…ŽÐJg@d¡,t‚IƘŒ@ ½¡64‡ÞPÊCuhõ¡=”‡Q úCƒ(Z ¢CtˆÑ$šD‰è]¢ý°‰öÐ'ŠD©¨µ¢B”ˆFQ'*EuhÅ¡24]†Çü؉€=£f?ÚG·ˆFѨÕ±žÑ7*ߢM£óqÒÅ€pGé¨'´£}4ŽG@*G«#|d£T;zÅÂÈÏ%­!²Ò6ú#é$u£n1’ÆÑDÊ-)"•£•4DÆG> J3©(ý¤”Ô”nÈKzF«£'-£œt-†ÑÅùJÙb¸¥¸ô–†ÒUê…€/ý¥¾t—FÈê˜Ks©0=o˜Ócj Gi1Å¥Ì4%SeLUi„|‹Ïô–ºÒSÚ©i5U¤,à+6ÒŒ9C…dŽ<Ÿ›2OŽHtŠ(ý$”DŸéO®ÓíO%DŸyS@RÏyª=ëi–<§ôP*€} Pûi;Í“³@*~š=1d¸ü§žRÉpùNÙéƒ|¨ {IŠZP³g> µ£jÔ‰J-3jh€’!5¢ZÔÙ7êœ\¨’ úS‡:gª@•©UžÆÔššSíé€$ˆ• ^Tž:)åNˆ—Ò¨U¤ÚSi€KݘóÓQâÌóU åTÝžåó{JÕ(?ÕçVˆ]Õz®O Ã*ó¤žWU{VU? T€Y]žh•«îÏEúá¤âT¨oC½ÊW÷ªøÌ«²¯öÕ¿*aꃬ|•°¶E½ŠX‡€be‹P²±:Öð Xkc}¬k‘±"Vû=+k‚”¬âó©2F@ßé;}«ï<¹¾·üßî»W·/ Ⱦ²7P¢_òK}é/ @¿O þÞÚí©Cúoÿ=¤m}ú_ÿ €Ù"°Àÿ—Œàó‰€uH^‹¸G\=º€ùo~Àj1#`ƒ[o+°ölÀyAËRºÊi9í‡Å,«à\ÌH› ~Á0˜´±àœ‚c° vÁ4Ïà|ƒi0 æÁ6ØÏà( „a°fÁEØa|ƒ‰p ^ÂL8 »àÕ«6]•&E`dá-¼Cü¦µ¼ÂWX ‹á-ì…½p ÃXx ‹akù…I‡vUj˜ ³áM‹†ñ¦àÂ\xË:Œð°.ÃUø §a?kõ0EäÃqøCËë‰À@´nö¶$*9u«‰@> ˆr8H‘xЭ°Ä5@¾þÃ#äéÄÈÈ–·!E$ ‘ªx£â›ë7¤C¼¦Ÿø@^DT ‰Á­ˆæ6-‚♘Èc(Ž’‘WbI¬äÜ#ñˆj×oOv¹b›kq©† è¾áÖ@êŸEoŒ_DöQÑ!¯—.@DâÙ1Ik«™Æ0ÑÆ*€w¼{ãñ ׸åÔmN-ÑýãÏbŽrê·_…œ2Dö½ ù´Vä±iue?¾ÈáX#c‚GB7踓d#ÐaßbûüÉÕ-塌F)QÊ>ù(·Ï¤,=ýîRÊJ³ªÅ¨ì”™rTζ$xœòÛ—Z2»rÑ|‹^9,Oͱ<º¥X `™,«å³¼–-¬[ýÊn‘-Ëå¶Ì–«ã\žËj÷&BDˆ˜Zú2]q~¹/ëåÁ¼—õò_Ìù/æÅL˜©æ@=Ì2 fÆL™Ÿ–dnž—¹2WæÄœZt%gnÌšù2‡ŽÌ š3gÌ’9PjfÂ,šOse¹:×›ÒÜ¢+›{®/ÞýЛ ]œ;oc35ͺùæâb{"u3p®Í¸¹÷f”‹œ‡3[„ÍÌù7‡ÈlZ"©qžÎÙtÜ^ç I­ss>ݹ8{Sá ž³³x–ÎÜÙ<ûfe:nÃóz¦‘”:Cç¹#d÷9?#$~þÏùY;g©Ÿõ3fÏ2²@ãç LÉ3Ðÿ™AÿR쪠«óyFÐɹBïç Ÿ4„.¶|"ØðIE4„%Ñ1«’Õø`¢‰î¯(Z ¾h­Û¢7b÷ÑÒ³DßèÝ”WôHÜÑ0:GC㬼oïêKÑ6F»h Ma•´¶žÖI{D뉣£§Ž¦ÒÑ)_iæY¥1lŠfÒIºGoéåÙ¥Ÿ'A\½Ú’G[é-6ËtW(ˆÍ2J iݦմ—fÓÊ2KÏc)½-ó´6Ó%ºN7i1§S¥›Ž–qõ–Z´9,1žŸ‚ØU]Z›É,Wí§%µuR£áI=k¹¥?µµ2R“M-ˆ9µ·¤µÅ’ÀÒáHMª¯°µì°û(VÏ€}¤äó~ –¤û¡…È«Ql%. 9XKÁ"@ˆ5±N-C@$ëd-*muÉ4¿¾ú™HëÚš«µHÈ![û )3«»5­nÌ)q»ß] zõ3Q­Àº(«ëÜc¬‹õh^ÖÊz:kJí¡õ´žÖ®ÕZ[km­­Wo¾¶;¶¨›€ýZylkÎÌ>ֵʀ °¶º)ØXö`'f,{®[ëÀغòb[ˆ=c%6d¦ØÔÚa_O‡í[Y«ÁæÌ®¹ÆÂêp‰>*úì›-[n¾lóêVϧË>Ÿ0ÛfËlœÍ²ÏgCÜÙÛ3goÏ›´{öЖ›4{ míI´µ'ÒU¯¤U©Mµ °ÚXûjWíª}µ»¶Õ!`»åAml,¶Ã6}uËS;msí¬µ·vÚöÚ];l›m¨-·ÅöÙVÛj-Âí¶·¥öÞöÇuûl×ír·Ý¶ßfÛv¸o¿mÄ=¸ÇvÙ~ÜvQ, GQ$wl(×úZsa°,¹‡Ù0;Ÿ¢D´Ì=†ß¢å¦Ü2a Ô¹cÀæŽË[tƒnÏ=ºrév‹§Ûsçnˆ‚«õëÀ±ûsïÚmÄ0\ÜÝqou{îÖ½…S·rÎÀÃ{vËnÒ…á¢ãÅØ;{kïíͽj÷þÞà;|gï*¾Ë·ùöÞç[|3âöȾ۷û~ßð›ÇïùM¿ëwûžÀö;ëï÷¿÷÷üÑÅ%€wðÙA xq™š\€“ÏÞAÖ&ÇZU×ðŽÀ'xqYàÜ[ð±úÀáÑ´àÓÖO‚pˆX78gàDsUvp žÀKæ|FB!†ÝŒrg¸  ØU†Çpë|Ãmø¸íá;¼8ñ Ý"uø çáF<‡qŒ8—‘N‰÷p%®Ãµó§â7\ŠËðž44v½‘þ¹Bq1Io½¸ŒãRŒŸq2Î?t†Œ’kRzè=ÆåxWÐ?#H5Ž#äõ¶ãþY‹HA&¹„¨u\AÆqEÞÇ 9‡dãÃtë2ò@Éy%äŽ|?H&^È'¹%Ïä;’HÛÕä©PË0„Õ°•SXUÎ`m¥ƒeå«üXžrYžÊi9†å—›òZ,gy°Ô¯»<–÷ò!Ni‘&å/µ)Öh¨¸Ì ¢œ^ÓU±™;E-¥¹2¯Ÿ>Ú)JóÕ«Ìuy7·å<˜WØo>Ì«¢ªçÌÜ›kó›Íɹ«<Ó¢ÜSöO…jˆ ±Ù¬ç€Ø'ûÍB ˆ)â=ïçzXŸãs~î*ÿ9>‡– —áê¨Ðº[ì°A$GôàˆSKE—E ¸Ô€ŒÎ7¬6îõ胤¦E‘þ‰QEIwŒçxjŠ"à†Yº«ÉÞØAºåââˆiºC,Öf£[›A„xº3qš?=Y§Åâ2Ô ñ4êÍÕu'õ…8Ñ'úE¿èV£stIêªmU7$¤;bǸÕUú ðê.Ýu»a˜ÎzeºM·é-§§õÐyúý5Í1‚d¹.µr]¯=_½ååõ  ÔùúBdÄÎ$°CÁò)Ø»ºÖV[Ê(vWT>ûbGìê JöÀŽx™ga—ì‡ý°»¢Í®Ø;gßì]!OöÉ®¢/»3ÉìÁú³wöîéØA;jço¦°vg23C»jgì¬ý¶‡v0ië°;?Ä¢zcêH Ì}¹«äÃÂ=Tûv=ÍË{pÿí|9R7E‚ÜÑpr/—ñÜ‹QýÊB#šwßJàý»‹÷ðNÞ¿;jl«Ý½¼«÷ñÎÞÉûy¡ÅÑ„‚ÆöNß×»zï‘…¢`û^ßûûO—´Ùœnw`¹-wë>ðúZsgSÐÍ༃OÈÔ¹ÀŠÞýàÁkø—™M%ü¢xð^__x¿á7|„Çð%ÄßáOâ+|‚—Ï~+oL‚øk¼[l«6>Ç«E_Xuü_äñwQ>úxžãôÆŒ³AèOÌä—<ÓHÞå.ù)ÏäŸË·y&hß¼—¯Œl>Ì?ùõmusͦíÑÏ›Y@¯q€ —£Ô9Ð{Ó?ÿL=5ݸm4ѧÇCé }Ÿ_ôwÅ7úIé}6¥yÃDŸ\‚¾ÄB@làÔ!rP½ªWPÇP$¸úUÁBž¬Oõ«>˜ä€Vëç].âõªÞUóœÖ$6A MnŠò›- ç8ͤö€ÀœW± :Ë&Aw¦&­è<ëé@ÅÙò£û¤ ?+:Ð5_Ts‰âäðt-Å «Ì–ºÅ¤‰OˆÐì,eižZÞ2— í%[ŽÙP®BÔ˜àô¥e ‚¨A‚\*E™9Ót §àTëžò`‡$]0Ÿ ÕP–zNuú¥è”ê:Ó ‚îu©Œ^üÞS¶>ó(5Å'\)ÈOÂ.õŸ3IýÈæä £¦e+Ïgq³0pA p™iÞ횣Åì3S†Zðd.®-«Fi‡4€`®u½Û‡Ê3’á(A¿ÝRp ÛÁËV”€4¬ZeKÏsº5·¾ÌmF7ÚÑ·zsŸ!åkyÚ©ØÒ0–º4½çM¿ËÏöZè(PK t9 ˜¨kE¥Q‰ªJ„6u@o€j_§jžYZ¸œè~ÿ‰·¡bçy *$|z垢 ñ¨ý¥Yt KAÂf¢[µVWEüU‡Ò³Ã‡Í¯E«{•ëR“œ¡­¦n¹›:ïê3®Qõk9Ï©Râ’‰ýßb_ O™>Öž6ÅkNÖ\¬”;n]ðs`¡†ð§ÃKÊ÷šLÆhN¢ P n÷$+z¯Q ŒÖÅ6Ë´ q¾PÆœ\¾ 0|›ÕÊSc3pE+cè-8ïL-=K.sXùsöíÛ¾€ y6Ïžíç/ZÐŽfC¡%}è>+š·Ö«¦/ˆ†hI±‘»ŠkG iRÃаœôª»÷6¹u’B¼[xæPYzŽD±.¥ÀkÊÍ2måñr±­v;ÊõhŠ­—O»G¼¤€Ò̈…²"‡Ñ¢xÛKÁ²†ºˆ¥ÎN r`Oy$¥´¹ÉŒ1«t Ø=× =ÉÜã2ƒØPìxÕS¤1ñLŽbG›á(q8ƒòÖ+…§)gç1ñDÅ d‰'“,’ùI™!ã23š^NÖ‘ìá‘æø¦CšL<È™ZÔâ5÷‚è‡ë,Æ g2óðr_pæ)«±Í#ž[Fëœâpå¹TÄ3 †—'·._º9Zã™o¼bf¢~ž©‹-s¨ƒ.$4|p>fÅãªx}rŒ»Dfn׸Ìw ÌtPZù¼C¦÷¹Sˆ˜0¸»•í;ß'é(߃…ž$¦¨Ì„Ý'.‘ÓöÍ¢XCò°†ý‚` Ï»ƒ$8’¶ˆq‡;ßß>o7è}æ5ûØC:ɵtLìNn_nO‹xœáÞôóÙý€øÙç>ø/†¯Ÿ¤yÎﺤÏ;륯ñÔÏÑzÒßq ‰ Žt$•ªæÛ¤ÌhâGO¨Êà™§ñdâöÔ ( ÜÖ.¹ùâ !ïB@*“\AbHè¦n2¡%[ql²!BP'H'yB?êâ'˜nö²€Ùã&[¡#g 3ä’òRw£%x1“‚¸#Jse‚-h€È‚(ø‚/(ƒ2Ã& Jø†3Ø%P ‚2S ñpÑ,߃ƒø%?8ƒ%(„ØMóòHNX3Q¨‚Ç‚À´ÆU!Çr(i`5GQ dQX  VŽd¨!julQ‡é¡Vb;z‡3Á~Ø"Kµ,߈Ù&ˆ;ÜÂ*ˆˆX#1‡àÂŽ˜mK…‡x4‰«¢¸T‘8«²OšX‰^ø‹Ò…jÞ§!õ‘vÈó|ôûdî‘3o‡±ˆQâPP‹g°!½ç±2B)_`yqtB%«AÈXS°Œw3@ÇøÉ8ØØŒúŒüƒ,epvsðfõn£±„ãÁg#²,_%ìèŽØq†hR/eP6r£ñÈ;bÀþXàØ>ÙI‰("QÂ;Ë2‘ ÙöèŒ2‚0Ñ çŒ-r‘ ™ó1@gx@FP2γ3[d@pÁ!æÃ7A °E' y gB[òH Ci#O„kC„ ó‘A69A™0·VGÇu” À}"T“íEY$•‚ÄmIbGKyyF`#N€+iŽöØŽi” @Õ˜Žëh–„QV\!o¦–ÜHê(„¤¡“å‘2E•]9ÍŒ7¶YMIIO©m _a‘–å8’n9–é ”8‘––XÛØßhy‚D%âK§Zp@O[ 802 nõa€9 š¬)s›9 |«ÙšN„›3@›­9¸IÀ)™›‡±›ý1a2œ3D°É¡œ)›8P¬9¯|aÐy›± žÊÙ›±yÐ)œ±‰ÐyœÍ©¶9¸ žfš²˜kñSð#RaB夞5½²£·œ(¡ Ù±M:£1 –ñA@g®!~&  îAi01` A°'ס J¡ß…¢×bÁ碯9¯”(z›E€  ²3#Ú›E`¡¸‘¡ä3¢ÂYz9#¢3pœE`¢>:š<ª # Z/BŠ¡0Q¤4 ŸI¤ *¢4 I¥J×é/£rñšOP¥>J·ù[ÚDš¦½ùbº¤i*œO€¦rqœOЦs:¡S€$=2zr¥U §ZòYwš§œ!UЧ!©×Y‚Z¯™š*¢5p›Z ¨d©æ ©œ¡ž•Ú¥‘ꞣ©*Uq¢œ¥&¤OÚIÌi¨½*•÷.Œj×ù¥Ñ«¯™TªRŒwq›‡ b‘ªwÑ›y@½*œ•æM½zœí!cq¬ºCcpCw¥qP>¢zò¹®íJb@)è¡ 1°3qu€‚¶ã#0aúj~ýú¯1£OøJ°ñúšþúR9ó®º3;ñ*­i¯½égñ*œ¾ÁmÀì¯Ç™õ":û:¡ôrƒÑmûŠ¥)»²öjG1€ò 5ºÃʪ1k¡8 tp¦Èî1,‹×É(U±'~ó¯éLøª¯8p›ôŠ{lp‘<Û›S»÷е3+œ[³ë8<{œ‹¯Ã"J;³ 3Nè§3‹¥6; ìaVš›Šˆv6K´w+ëú)ãÊ¢w·×9Mwë°·ê£9 ž ʸ½ùªª ¬:qœ22‹z·Šne€«Ÿ•>‚ 9  þ9À¡¤›ÊÒI„!´7Ûm|q+ʯY£(ˆ£|q›®»®&¤1¦Û›hPaB¢ bºÂi‹®ëS|qœ¨:z|Ѷ•W²¦‹¥c€»7  1 ŸAy0¶ "<1Hñ¸Ü{s–Ч°J¾¯¹©;¦Ü{›À¸¸ÜÛ›i©ä+œñÁ¾Cú¾û:Úô¡~J¾Ê8øK¾XÊ‚$l€u­)Ÿë!ÛšÒY/£­y „¾­ùš À\ª¡­É»³Ê›3»œ3áºh$éњǹ> TÁ” úÂhÚšXê#¼3®)Ÿm¢:{V®)GbB©êš×Éeb/Ê3ñQ,:®Y§-<½¹>±2Å•[ç!#rà¼M:uÀ¿RªÆ’K>®‰¥uÂ_ªÆ=\¦Ì)Äj:y@ǯ©Ñ  tºÂüK½É/A9#È•«·¨á»ý—‹‚ì¤{c›3P!ŶùÃW  ’úÂB\Ò¹²2"÷:2P‡Ë~kižªü[ª3Aî²1žÜ›X":õ9"¡‰ŸÚ1yÐâs7©¹ËBÒËx9‘[„Bo… k Q™]é– p“ÆQš§©QÒ‘áAídc\6Î÷9š_€Íô41y׸•ŠÙ’‚À,ÌBäÍ4ÎæÜ<å,¢y¿ÌÃlD¨ÑÎÖˆñÌ[û\ýŒÌ­ŸüI/ïAÐÔX—ï?Îã0 0 ᔌRÖC à/wS€85 øSX-$Ðò#cG^Bf02NYÝÛ"sF‡äÃDåÆe|OžZF³M™ØˆJ¡m¢áóH-[4-;Lþwé‘ZÎC>Ì!ÃxaÅ8‚Ö!Ä.€3@6àD- y¾ç}Þ1Œ#ñç7.0ðW& *f·Ir4—qѤªµþ15Fºè E¹.™!³RªZ@äé ¾0nG4F–Ï8:áDšnéNë¨>¢7pé¦ê'^;=X©µ¯“1BpâJ *;ƒ3wéåÕ~»CY[DšÔ½¹^ë#êœtfæ#_©¼èqA§]®91 }qî8×ÒK S454c'¡EëçåE—ßé¡-P9`#;é$3(SÊ-ÀŒã80À}ÁðÞ¬Õ=nîœå\î/qòâ(À(@yÐŒýæíÈ)àÍÓÁÔžu~4žÄ#ð¿ð³³ðçîð¿Õæ_ñoñc§(@‹Ÿ?I±MØ!#DÝŽæS,@òún7`*;|îVsÀòæòQqð O2ßð}ñð6Oñ7/ñ%ÈóøSOAqrJ_;dH¢D>£ç.pÖþï(Zî©L#!êx_ë­yév$÷tÿŒ€îDvt(½~翾ê¶uÃÅî)³ÉÞ1Ënm’þöííUê0Píšaªµíd±<ž îrQÇ5VîçŽî¹¥î…XîNåò.ñ[nï/VàùÞMò¿òÆÑò/Ÿõ[¿õ^ñ`Ÿü:ñÏñ}£;ËØ2và#"¯ôLýäx;*?õÁ_õÃó oü5ü_öþ1ö(Ð0Ñ>0a7VWºï0±Ö_’± õ6 õT_ðWó /üÑ<ˆ‡ó  Ø»xGúºÝøª¨OÜ!Ö×úþÝ‹}IÂÐe¿ Aû䞸}¾´á;õÐl@ûwxDn@:Ø} ‚"ç¡¿æ×ñhÑ2QÕ^¿ ·_ÿ³zÔ Š?l÷ ú#ƒí#~ ­oòY  ¼mÏÙÁ½9’ é›Ý‹P“pðÕ1™Õß' |ý𠦺Ä÷ ]ã{|¤ðS˜Be‡Sá’Ó‡›ÏÂ:X¨ë$¶“RµÐô}»¹úÆ]\0w­/Ý ˆu' íÞ»‹wÆÞA¹døÚ4„¾“WþŽÆ¼î—·`´†_PjC¨ñ|Þ ËÈ%äpåBöÃ@DöÄ:Xüà×k‡C±­°B” $sf X¿ 8ž}ÛrpúD;ó`6<€}t CL€Or(b[X?š5( ì°€ð~¿ŸØƒâ[‚Z)ä ñlH3ûsàÚkSßž«Ãý3>*Xk*»„‘‡ ;K­“W¨3šÆ¸ð9a òu 0Ø9¾Qhì$"uãÔîÒÕ1MD -œäÓ,™&¡(#¢Ô¥ŒÃ§êK«ÃŸïÒ-'Þú‚£rDužpgÄÆ‡H%²su¹ñnFÞèA‹\tÃBGRWÑãr\ˆ ð9rD'‚¬¡z}瑤Çì¸øÐ w$vµqòÝÆù¨÷†z,•09òºÈ»—‚Duˆ/>‚Çè¨ Çã}Ôu½Q8bGØèE!€ôŽÑòUÄùùÜ´Óˆ$”èú~áJŒ}펻½+áL”rËpéလøû¤":\‹Uñ^Å=˜1ñ: gÏ=BëçYæB9ä iq*VÃÂè±"\ÄxøãHÆ|hE #èQã€:]‡2.¡sb“ ÏެÉZ§¦@ã¾Òuu2F¨Íˆëìä™l“z’BVºÍÈ ‡d|òÈïH'#‰T…“Žr¾i{ße ÙÎEÞÂ\¨ú¼/L‰¯ïFCÙ§#aâ¼ó‘\H†šÝ÷¥|_4Œ<0®Ã% ù ˜Lƒa bƧH¾#O<’TñF/‰1^=„ ÖNÍ…^Iãhƒ2’ƒ‘-rIvÈ$¿ä„ep-ˆIˆ ¡Û ô}2Øý¢ ôˆy8Ž„ú¨'±$»¼u|á2ôC™…%¢ŠTˆ‡ÂP*¾í˜(#¢€¬|ÝrÅñH &å+T‘ûŠÌÂyE"Œ w’ÜÑÈLg# ކ/‘GžJd¨*φ¾‹NDòUþÊh™$¯!­ÔƒèÏ.£dÙšx峄•éPVZEòW-‹%Ï! nËé0+#¸4“º5’Ëcˆåäi ”°ŽfÝ:,9³Hc„‚uƒ^žF§)(G#„|û²CÎÆY $ÂÄ[°£ß‰F¼%'CÂà³ur2 :†·4û!Û$ˆ}/.Ø@z™Éæ…¬uv3_–º Òêø#¿ÜšŠDÈ€Y"Ÿ¤D‘žïL6.Û"4åé‹‘ó$öBš ÙÆ,†³ÞÑDÝÇ %ƒ«Ü‰XXnÉYI3k%ú#^âƒx´d©4ËáË™±RZ’ÎZÙ$É€òA[ŽIÊø-]F¸ìˆÒArºp§èôã­[DZQ¡Ç«ÙYÝ邏Á³jþÆåiGü¦Ö„ˆ‹2DÊXgœìã¦;u¡ñ8Šº¡$slž @>îI]×=eŠ"ŸísCfMD 8ý%£‘ŽR`bÄÙùŸ¤“pHÊÇ9!¦Iü”5ònTΖh 3fí;†š³c"¡ž"蜃HRXvÉš)QÀQøƒJ>Ô÷:C'ÉÔ ÔÒt’@ü±;½¥><…ƒP®Â‚‰8çÈÚÌÎar;‡É)èĤœ¢ÒrºDÌiû"è½[•Ì0:}Î,):Õá̤ÖÒƒb‰áàê²r™Qffж˜BQ& DŠaurËê3}g£dvq†¶ÂþÙ41” :´ô½Èº ¨J´˜£2G:ÐÉ1¨Çl†N^Pµ,¹èÉèO,ÌŽ€£é€ Ì V’„fQØ3eçŠQV+ºaBð‘ÆˆŒctD^CHFÛœlómš.SÚ½n¯"_¤±JÿØ/³ç€ÌN˜ÎBʽÏRê> õ,}¡ÓùRãy>%$ÇÈfoºO\Š6UÞ,ž¼ÎzÒOì)8+ŸŠdzÞ³{©·bÊ#¡—©TÕ8ã@K1uŽà±5>£¸©éÔ)6m—á”›ÆI†¨¯gwìšÖ4O†;÷)ÊÝo wåîÔÉ,gÙ Ë”†<§D}þ½ZGë ¤\à“ u þÏ€Mgiù«¥Õôy†;ÐǦñ” Æñ›ªGšàèðD¨xD>Êg!Wê 0€¤nÔK(Miiý´¥3†NjÁ?)eyœ }®ñЇYëèä¼£„.^Îù@ebªô£tW R&J2ïB_°ªÃ’ƒÚJž§öBiþ,£ûpBJÍ×S_áâ´÷Ïþ-:”1@æ…œ>ô¨†J<*D(… ?ªÚD¦æ,(U9¡“V“Y:½h¬¢^•L’R±šF ævoH–º/ÕY>ßP¥£3R®V̤ZWgSå£F4÷Év'2M(`µªƒ5«ªÐ>ØUy&íaU§ŽUy8û'2µ-Pn²HmçV7%\5ª½©²DR¹G3g^­HTßIUøW+é`M­tµb¼ÖJ^ë =£Ø8Vƒ¹×çUÕ­. 2ÄQ[ø8 (p•›u¸êÑ»êTqŸ2L®¤ujɘ‡Z±jt5¬±ºVQ Va¨(Ý©‘UºWêúƒmÁŒ—õ·fÖà:W9+õ¬¦²ˆ×÷ê1ãksE’õµ“¨VüÊóôku寰տæO[V»+¨š{·†/4¾¶ºCߪy]°èUÑ[*5¦„}ªÈµÂúUhyZ«}í¢ˆ”Rמb±ë£l¬dµ¶BÖÊ l°C°½µ¼U›@]¥±Åõƺך˜ï,,u®–°BQ›‰†¬u-“øj×$KCÙèz¼·Æa»`_¬§´£ V½.Õ‹Wq,…E^V‹RÅ0»aƒìam¡£Ô2rŒp&•æÔp|œ®ÔAZªšžj)§qaÒòº‰NéÑ4Œ6hFÂP{dõ´¨¡ð¦fT#+C·k ]œeªÓ…Z¦Wg§ìÕ¬2öÊWöŠ*·,çT®¯H ZâGhï«¡®ˆ¶¿²Z«d¦Š%°™–EBÙë[í¬ÄĵVÖÁîÚÏj\ý,—U–’bX«am;D–È^×4›]ã‡å®„ÔÆ…¨µ0k­Œ¼µ 6½^Ì!Êmµìæ ’nfíØaëD•da=¶<Ï€$ –é*Í¡¸-¤Óòž[ˆ3#LØ™ö«YÍÐh¡!jl£vdÐͬQ ëì&3µ›xk䦯Z§4툼¹©N_6ÄizOmcå³rÓîX^:oM­ðˆÁ´çTøØikËuŸ8WåÚ‘¤«)mM½¨ªŸjTð3ä?ýZC—A&Ϧ»i›cBuu)—RG]‡K‰c£õ¹O7ÕRS©»lg«ál³šÄ.:0ow«½œ”bæZm»^ûmŸõµw¹ Û‡KlÉ­˜Å¤dÖÌ‚ØuËX×,m…»f5µ@Û™%mÇ+U°ø6Æf[=Ëoùl{ý·ðuà^újx íÄ=´‰•w2^ÙŠdïc=˜ú1h:žÀ[©­”½·×6ßî]ÎkWýîç• {U‰Š^Óê\Q¨Äu‡$ðƒRÑú'‚-T¼°wv"Þª(fô[¸âÏ9½üwùßè•™wÌvЊ›£RL¶÷GeZ~4¤° "uDQÔLBJuž¸1^î+ö;÷¯üœ¹6uíÚ\«fÝ­«íŸI÷Þݸª{7ï¾í½ž·×‚Þ?*|§ê—Ý¢÷àž^Œ§|C¨8ä$!Óá_ ,}c=Šßý®[ÉŪ6§ÜéÓÅApºM‘£¹3§D÷ëâF¥yJyÖHhÁ4G´+ð¿J3BqÔå~¡ødÂà³ùžÔœRÁ£ÈŸšNÓ>£yJ„ÿcàd»ìöÈ:Þ·ûzM, ³”JaÚ€}µ€Ïk•] Û6÷Ñ;A[åðÅ Ñ÷’šà­ŠäáwѕΗY^à<~§/>–0û2f õJ(z˜XvPMª;S¯ E³š‘}²Ó}ºNWã@åžóT.0ÔdêJa] Žš½Êï…b_¡â¦ÌR§­ØÇÜ.ŒQÁpã5Àl¶ §Èª)…ùœåu±¶6÷j^8Üwåphý³{UM…LùÚDÁïáÝÃèÛÙ·~“,÷˜ëœ¤#˜?cİ©>Á¸êóâ49' Ÿ›ä“ñSNþIB ¡î$CeÇëSûIö Çñ%Ì—´8êà¶ÛzÉ0¼"kx5вOW¦j@¦²z×+ÕÎkcÿÎéRH\ˆ¡1QÜxï<$‰+ T ñ¢Lñ&6=^‰%1EÞÆZýÉ ›0CÞ@= xÀúY@§‡%16~Ä%K׸M &WõO–9K ò§IÎɦùöA¤åIs‘ F³†Œ¾å:y…[*m,œÊ1ÕÉÛ º»P]TæÊYù|æc#|?Wª¤ª¬¸e/8‘³Ü•íH¼ôˆ†l.¸eúx†Ã²¨cõ‘*{åµìe™©clÙ.›åÔÒ–g1ª-Â5÷óã1ÌS›íFl“7`}ÆÏ¢€£l Æ’³ã=Û¯^Ý}”K"ÏWgœ”k' Xõo9]I_™OriŽ¢Hb1œ@ÂÀ:—eM¦oŽx"#es«”1žu/‚ã3»XY/c°š$×€ÌT™^Ÿ;È™÷ ÏØ8Ü™%0ðí²¢¹k½b d7p‡}ÊÅù¿ºÝÆ ysH`-}1 2ƒl™‰*îÍÌÃx:ãê<‡‘1v¶ÀWáqçãkš¯Æ]·ò].ÓpºÃÔªm©4Kµè\—Êp0§ÕÁj’/¯Æ©‘ U™eÐÿ·žÒ\®¹ d î¨Ë38]â(Sc0Ͻ¿éÓÕ f¹RðH ÑCø0{aû"oñÀÌÅÿxE^ºïTYél{ƬÑ9!of†ÜT­ógf†jC_×Ì›M3‚( Ãyñbâ†zJ+)õñ†êÉåKo]TîÒ¯øJëÉ/¥QèS¥øXF×âmU1?õˆ§ŽGë…Wü m— fžÆ”5Ši‡ §3uÊÐè1shÅLÖf+Õt×.tñhJËDŸ^XÔ]}*T-í‚)µÔÄthWMëcBm£÷§cN‘X²WBga,uí|.ÒõùÛ~Ì ŠŸ¿¯%­ÈÜýu`ûçö]Ò»¹;÷æø‘Á³¢ íG×Ð4`ÜàúAØ;À‚gf€A@×ÔÄ€»•ûÏâºû ü.ðz9L‡z[‡Sí°Äu70Ûà½Ç÷©à BmoÚ»\@‚ýÞÁân{—€Ý üáTÛxøÞà÷Ï&ð‡Û™£í ¿¸ÃöØðs[¾[ø0ÆáfÏìü½Ã€òÎ>ñ"^ÅG€ÿâ9üÛÖÙåÀøãñvŽßñ‚àoã7‘ñ<ÞÈ×x$äaÀ‘Gñ×[ŒWn°­ãmüè¦âTÈÃoк€ ·ßèô%åá7îŽM;Ì‚×}ßÉ|Œ/àà„ƒo zÀ9€cþgŸx°ÅÍ|ëÎ`@¼Ø|–ÇÜ}^uãî ¾Á+èæÏ·y=oå±7xú\›ÏðI_åÓw¢ÞSÜtz&¿ÐëÃ}äùN_æ}넚7m4Ïéµ¼«÷õàœ‚}Ð |@&@µÑ_oÖ”!˜WàL‚j‚=©wõwÀ<ƒ|pÁ?ØÀ~Ô·zPO´v8ëþÝÙoû+/êÝ<'÷«ÞÖs{° À¶¸ó‘;v»mg^ÖÓ}¥ß?àdÔßý¹ÇÞÀLƒ 𠨹½öp|€&° þž?øã¾kËîŽÞµº¿òFüâoùÖz8#èáßÕ³o1ˆ8ø äðà ø güû­íáýðf0Àx+€J†ÊwÞ=àð‚ðÞ=p)¿æÿû ¿u¸©/÷”á£ûŸoº}Øä+}ŒïíÅ< ÀáTŸuÏ?€ ø€:؉àà°OX@)À1`KààÛor€¼ƒmÐvA¶7÷×ûéøÜMõC=Ä·ù\>‰ë¨Ïêm>înì4œës¶?Î+8¼ ܃ËÍö€! T (að ÿ¿gÝà Ø‚mÀ öÀ=`Ú…Ÿ,~@Êc?–üðÛðÇ~«.õ>î_ßV?„àû£~Ä—÷a{ÄOPüÿ¿gß&\䃀š¿ºÝÑÿô_`ý+½îßú¹?ãƒÿõݹM‡OþÍßmôÿû{<û7þêÇ·ÿõŸþ“¼ü‡ÿöÿg×ÿ Ïö¿…ïÿdŸäáþ_‡×Õ€=ØþmnÀÇŒ ^Hµ=€ AðéÝnBëés²›Õ‡ÿ {à'0\î€ÉǾA€ AP Ô@@T}Úžhæe€œÀ °tŒœèü€Á Õ%q0`øQP¾é€×ßApÆ€`¸.€LœA ès€˜wB Qל÷€ðüÉÀ2@ €«Û`(ò-P¨¨/` ž™÷È{À>0 Ôþ@0× Lày—ûaå @BsO ñ'®oF`TI !¨NI  Äývù€> Þ)‚@$(Ä % P \€"¸Âo €—õåÛ€àâ±o’y‡Öy@ýfœo¬à1gºõpßG¹špÕ)u¸ Í§ þ¼ AÐɽîgãÝqWÝ+ȹépÀ+Wx8@0Èã1r€UwÖýr¯Ÿ7ÀÓÅMÛ7 H@ØÖæ-vPÝ!|â`çü/”sÀÀ9‡ ‚€8ˆÍ€À³)ƒy]qwÊ݃趉ƒ0@Ð wÕ Ð`gÖ&à@IxšpXœ/ÐøÀK¨hu ðÈa„a›1pÈ}„&€ÞqªÉÐü¼ d€Ù û6ütÛÞ7p€+Pì Ìl€À^wP…G¡ùæ uÀ' áÀ!ÇØ9v†A膃æÛ@ â¼Ü!7xv 58¶1ƒgÝl·Ê±og@k÷Úù…aØfÎInÐà ðèv—¶õÞ‰×Ãrað–¶Ínçœf·΃ˠbè 2aå†Ò…Uh(Þ¹‚§a>»EpÔ…†IœU‡€HÝKhh»=ð ÐÏ ^ƒæ› P ,.€ À `Ãá_h¾÷€-P üßÐ&†³›fwP†³ÛâG*už!Øx‡U!G·çäáKxÜum3œ à Ž‡¡áðÄýï2„ï!y¾‰ƒç›0Ìp€x¨>nâà#÷¼ €' "qta3˜Öivða7¶m†õ ìfÕðÀ€HÀm†yG^u"ƒèþy‡à€†¼­$¢‰äM)¢ˆx·±ˆè¡‹·ÉˆžˆX¶ár€j· ¾oMÛ8˜x]›Øö08ÄT<`ÉÔ(P$²mL. 8}À6ðÀOâÌ% ^ç³ým^¢A&o>[ã&vu‰[ØV&ÚpwÀ6d‰j¢ÎF¿B@)`"n†:x¸‰pb¶%~eüfÆApiÛãg@0ùýp3[¡ØºßÀ; ø‹"êæ(²o¬@Päf@¥XÆ]ŠÀ7`ô€<à)o—âY÷Ä À©È¶m†£¶ÁŠTœ¬è'boúœ°4J|@ìx(ݶE†tmˆ¨ù(¹ít=  µ Àà0ºæØö5Î À;  ¬;^䆯ýˆ­à”×µ}÷@?p^qŸ[Ö÷ åÛåÈ¿y‡Àù\nòsÇHmHIÊ€ÀAîm$ûfÅqqÀ©Ã]nF¨ zœÏ†â±xá`2ä ‰=juï€È|ÞçÆ;rt9$°ø E0é}ä<°ß-~À ˜Œ3\CX#"yP䀠 ^‘(^¹º>€7 Œ=\—FÒpÌãô8è¸@0 ôpc¢E>4pAúC€3ˆ<‘])g˽ˆvwD ’¿]:¶™‰k¤]è8ÀùH6m&ÜY¾1‘Ib_Ô¡šdÝ(æ!@'¹Ø=s€58bÀ* ¼ÀÐ×y‡€‹g i€ I 0Úp€>Ð=šoÀøß0"y6\`؉ Ùá†Ø]»èlýÀ›ˆÝÂáÂ(}@¢Âç îˆ$#—¸&~‘!‡äÝ~â$@µý/‡æä)P“cg2@p < À0Pµà$Ð.n¿9à:2ÏÜ0€,+€ ÿd@Ù.–U€à:&cp0Û€30”se4ÙµeŸÀ0Db”¦ÛO7Ó)†À€DYµ‘ Ý;i ^u-åÂ8ð\XSZŒ]NéMþ@P'4r&Üç4*€ÀÓÁ“‹ß/¸*€ ÀÔøBqüÛ…xTºxb75êsH€Éùío›a,Yµim €R©Ïùdß;à„m€:`!&qT>çXÀÀ°•nemè×Á“Cà7` ¼6^ D?]Îmúœ7»s›!‡$„Ë€7œo,^S¹¿ÝqÀp ‰AÒé© pP€ 0'^–M P  l]¦<½`Åyý›0Ü5sfi|ì€7|}ŒÀTÉx‡€7à àäÀ:à/Æ€Ô†D‚€!@VâÞ#,4€Ð`¢Üæ\Ó]TÈü€Ž€?ð Øêð „¹e×öIž‹§5§Ç™p€Áç Vˆ¿à7’°ðr¦Û̶UZ–¢#ûvd«À'€ hmQ¥uWµ1w€9Ñ5€ðA óãÔø qE%×6a~yÀ/Ð,˜æsGô•8!×f³Ál$à³uo]Ûo÷ L[Î6œŒ©PcƘ#À´Ál2Ûg³ñlMÓvÅIm€pälH¦   ™~’9 ƒÍ¥u÷bÚlƒ¥*†AÀ̶¿m™WK¶áp`&[iÖum G/ç[™™fâ‘K\Àgt¼€3—æ5“s¦4 y²ÛÙx@€fsf\`Ô‚f&p ¢¹Äu¡€=¦™s¦;l“¦1|uFXfš1À9·Í™þ@°ˆš²›`<€¨I/z’&p¯rsT~C| 3<rจ ‹p €Uçß@ €lvP ˜oÝÀÃwHhh„2¡Bà(s.¡C(«‡*¡GèZðœeÚæ~[èÕI„nnahÚ–¡&\j ¡†àº¾±¡j(öÈ…¦¡gè:†®¡v¨*øýȧ3¨‡Ên|(Õæ‡&{hšF¢€¨! ¢‚è!Zé1¢ü›#*õU}<'ׇ•èЉRšh&z‡²ožè%Š6‚›¨%JŠŽ¢Þ€}îo—è*ú‰ª¢mç+ꊶ¢±(-ÊŠ’¢³(.Z‹&L߀qÖ—P`/ú‹|j¨0ú@£¼(à‹£Á¨2:Œ6£Ë(0z‡£Òè*¹•žd àÇz¨ì¶ú›w¨6Šv£×è×FŽrnãh8ꦣ—èí÷‰–*ýGƒêóèûç‚Ê£D(>z¶ ,(=šŠ‰6(@…€é8*€Ÿè€&¤ç:ny¦`ÊYÔý éBª† ©Cچ΅EhF:‘Þ¡iØ&‘J¢{›A¨º…¤ÀHºƒþ«èiAFy,iÛé’z1)/‡Ö¤3é$zŵ¤^(GÊò¤/ib’5— ¥h\Qêé]o!érâ=Qj”"~BœSеE¥IéTúï5¥O)VÊNj¥LiUÚ•Ré$Ê•²“¥ëðßYú~†p#ÜZz”bœoé—²¥Â H}gÛ‰—‡WÝ!0ÂAAáé—–‡¸ëI˜ŒçaZ²™Šiùv Ü¥ˆ)™†m“©cꆺ†±áeªQÆ¥ø@Iê0Àe:¨¥¡éK˜(F¦€9 –î!!` <çZz Ÿ9!` Цm§?`•V•€)À›f}@Êé ~zÌ 0œîÅ© ªµ¦Àpš|Æi‡œ†mÀpŠ|ÕéfÊ ¼)Nø”ª¦¹ç`Ô¢8¡jº>ƒÁö™žòx“!æH~š£â-»y†u\kÈÈñ¦ ]GÞUˆß!Òw(mžBŸjʉ –‡ Ÿ‚j}:‡Àà Ò†oÀ„ú> )0P5:‡Þ·{bˆby(Ãy¨ugˆú Ú\ ¢n¨‰¡ðÄ©¨ð@ˆº6mçŒ*£ˆf‰º¢Šˆ˜¥÷ð$sw£Ö§œá[ "‡è!^ˆ!âÓÙãa’Ég‡¤ÞmP*< ¥ÒˆUê•ê¤R©Md7¤œ?eJN€™áùçÛ©*g™ê¶ùˆÞ˜š¦Úˆf]7é¦òjj׆$&Ÿg*™ŠºE‰À”Xµ¡©têž:f¶©€jfø%œ‡*ê¶& ”Ü£¢:¸Ño#œ¡ú¨2ª™áÝö°™!žØÂeª2ç¥Ú¨~Šj‰·#j‹‰ß ªZŠ¡j’8ªÂ‹¥ê© ª¶ªª*ªÊô]œXÛª:+Æo´ªx*«¹*>`«ÞгjCê«îª½ê¯š¶«µ*±*¬«ñÛ°¬îªÎj² ª2}ÑjòɬR« )Ašç‰­Jk)µ:§í)×*·âr!㸠­3dØvÌ©ëÝzª«Ùi®ØÝåàˆk¶Á+ )Dîž…«c*‘ * yÃE¨%žæŠÃ-¡É§çʹ&‰š+óºò¥ëèŠj®¤œ„‹2’vd y³*’…$ɹт¥$iHºm•äyI6‘äÇÙ4†t«H©ð¡©CdñŠL’¥Èk—’švÆëмVmÊ+ŠÓI¯ThȹU¯:Üõ:½†pÜ«@ɼf¯Q)š ì’`\ |(¾ Óý#qäªÞêòzÅůýýêRÞ¯ìdþz®¯ðkÿ:¿þ¯ök+¿ê¯,þ:¿Rn@8°SZ¯éë?ÀÌ1t*ª»¿°ÌœO¹aÒ§,ÉxS’¥2PIL¤FåSYº%•³«—òo&, 'UB˜+,ˆ‡`•ó%û¶Uưaå*‚yü[ ëV²™cjÚÌõ¡wÜgÕ9r@ªÃ±ÿ€U‡Œ©ké/`œ2±VÝ)çwJ±‚(Kµ¹Y,£Jµéq@ Ç¿i±a Æv±ƒi×¶›Š±º¤¸{ Ànš”†tq@ûŠÒ¢p¬û!Á‡Åòowìî¹S£T95þ±m,‰º4{f×aJ˜n¬ËÈF¨fŠi²¤ewb’°f$Ë¿Im>/ˆµ•m¡,šŠ²Œ!ÖÆ!–²£lÒ&Ê®®®¬)‹Ê>ƒ­lùHm#\Ù†Ëþº,£Ê!î²½ì·F™Œj0ûü²Å,ºÉ*žqˆ¦Ǿi™ifÐe*†ƒ¦b(fd&¥Yh>r`& °f¶™”¦ì¶g:šÁ € šÕ¬Ä:³š}¦3»h6š}æwÀ€¤I/š™7.pifšø,0Ði¦³‰&Cà|A XCH @›Ò&µimÓ&DyLP-1.6.0/DyLP/doc/Figures/startupflow.drw0000644000076700007670000005666111171477034015400 0ustar ª» €(€ ˆÈ sÇH6eb P%Ì™2SÒè)ƒBFŒ.r°q#‡ )XL3›0y˜¤³ðˆœ7uà,¤RK!rêÌAƒ¢I*E¤!† 8p°p‰E 0R„¼1ÃŽ6X̰ábFŒ,b-:Ö(Œ°eÇúQÀã5>xPy„0lÒœqWJ’#H¨€À«—/ŒPAÐ #&.)tŸH¡’䉓 L@ˆ•Dɸf;—lÌØ:lÒ‰Û"ˆÓ©Ë¬æĘ9qQyófM›0nRØ6·M2iê´4ˆÎEˆ99fÛlää.âä“$S?éæL‡eâÆ¸â÷œ5qÝÂU0æ 2,@Ü #§ [:5Ñ1r”F_”á>(’4Ù¤[N;õôSPC‘…”RLåáTR…W6 V FáƒFbe–†h¹¨[òÅ5W]wåµW\La„`„íxØQ-FÚc‘MVÙe™m& é¤™†šj¬¹–´Ù†ºñæpÂAÆ!§sÎA‚tÔY‡v`rçxâ@žyè©Çž{ðµõVƒûõ—oÐñ_€x`‚ 6ø K0Éa€êÄ“O@ E”YI-5‡OERR.ÜPCX]”U‹0¾ë‹k —\tÙ¤aCp×é`:†X‘Œ9’Qffš¹ÀÙ”Q&6Z\VÆ6[k¯])›zÝ–Ûn½ýÜpÅ—Ürf6ǃ›ÑMFuבÝvÝ}ÞxÀñùP|ƒ*P BaÌQe¼¥sØgGrü°¨Mˆ ‚ :(RrÀaŸ‡8ija§‚Êᨚ*o¤á* ˆ2¸°êEc倨‰c•:g5ß,ÃÍ0˼ÑÍ7Ü 4Ϧ>áMnz¡§†ÚaÉ!Ö  0€•CU2РԬiöYµÖˆ+Ž»òè#ÁÆ5¬bÅò€$²J.Û¤³OFûd•[n˶}ÏV›·`‚;æ¸f–«&ºf¨Ëî›îÂ;'½wÞ«g¾çíËÃzíh ª(BL ÄV¬4¦WÈ)†Ÿ%5É¥†˜ƒX5Ø@ [;ëuŒ±æ6 ez¶®móÐãÀæ¶”F›¤²L6ûìgëJ9mig™­µq þe˜á’I.šæ®™n›ÏAg¼óÖY/žø–—yz›ÿé9¿óêéŒ:Ý£(&)‘,-S®{ZÈd7²¦Ô.$_Á ”Ò»®}mx²^ñnu#ä9OykkžÞ=¹+YKb–“ •=iQ‰ZÝû›–´%8/}KLâ*Ó™Òt.6­«}ízßääW¹<íé~~êÜ{ø× úÜçaàÄ"e1P*&3a]Ó>»¨5T ÖÆ²Ø wÀ{QeD6¯ƒ9ú`¯œð«´ )1%œ íf½¼µpo0¤¡÷bø‡æKúçÃÇÁé]r’P`'{s}²UƒÌP 2€ @‹QÙqf°‘! ‹ñ ê0:Ô¡@s€bÄHÅaLclàØ_5‘‰Êa¦3wZÍdbS$W´Ô½ÉÅ^2pœT ‰9Çr˜1iÞØÜ©ÉãÉ“W¾ Š…=|žPŸ*Ä ý¹½jq p-èø —ÃóñP}c_! ¿IV’~—³_&A§²4Ð! „˜žÞ0¼t´‰opC£ÂpSÏäa@ehÃc€‚946/åI,¥˜º*à–/e*/(Nš“!Ãĩ˨’ªUÝ@V0àÊÏXpÛœåÖY«ÂѪ¢*÷(Gµ¢6•ªE­6œ³f9_”;3¢q«k„ÑmO;ÒS¬v¼ç‘ÎJ½´^Jüg Á'PBvk®ˆDÜÓÇ8ÇÑ}|"%çg¹#¶_19%€@`°ÃFv›c†g eˆ%M§ÒÒVµ¹„iSY]r†¶7-¦NoV Â€Ä&¾™ †ªb£~8©Yìæ.Ý/F•gÌY‰>’Û¬¶s«ÛõªwÃ*…±>f^ ïv^½©—{…+{åzÃòÉW¡xµ¯C#Éøí·ˆE¢&p9 v:žÄè»{»a³(WD‡O–!uˆ0D;á”¢Ž€vi†UKc/Bµ¦ &fNip³‹­ÑÐ<ËqÅf£­ŠÑ:¶trBžA/¹Ãt„!,!R€ÌBBhpÚµ&SÀ"K˜ÈgQd2Õ³PóA»FA¯µââqÚÓ ~ƒ¨ImjT«šÕ3võLi÷ÚY¯ÌÖ¸I°‡mÍ›×Ô-öÉP‰ìPZ¥>uªŸ°j´Z¦O…õ‡­]ëWf[×2cQ¯©í|¿ˆšî·°ÿ­éŸ67³ÕýlwGÞ­¥v¬éí\oûE+æ7¾NU³$ÆÜdšs =méV ·bI§aäwrmÉûn‘Ã[Öñ*™üD/[_eöJ™ ï­2BíJßFÞ÷¡]ö+/)XÍ.¤r0Ãú³YÑ•T' `…mKAëräÒŽ·Ä [Ïàf9°4ŽÑ®ö‹ j?»o žÍJÅXä {ÄM.U”[WíÌ.­\.ä˜ÙÈw$–ÍéV^&ûqçõù §ôCZ9¡‹\h^Ú>¤÷U¢€õ¯Óûu©S½`óßÕ³Ná?ײ¥¸üzÞ!Þá'Z¶,!*ïÔÔ³¤½§'ž»Ðtÿº#u¹w×ðs_=vÎÀï*Ç.;µKx8™ŽàµgÍ¥Çø%÷q­Úã¹[ýös¿QÙòCWä]ë«WüBÔËí/&G?ŸÒO]³¨‡ì}V?Ú­¿þ´^§|$'v|gSŠæ21@3¾Ç{˜¶€=Õ€aw=¥€h| An—lˆnͶníönNµwö gonc1i߯qèm‡ §lç–nÎÆnÐv´gcˆV‚·v‚,È;'p(R3A¸qCØ‚›ƒ8ƒØp Èa:Xm´Vq7l½¶‚_ñ"W(pYX3¸T‚µWS6À4°5'bXxÁ#6T}Ý•<ËÃ6$^Ü·Gû¤Vý~‘÷V“Ç%â#tu¥~EÇPŽÄeŸGDX•D€ÂDôadЮÇRÊew!'€z7†Á4l1Ð5Îb,²NnØNAf}†‡}3§}H¶xxh^LJëå‡e~•wPƒ8_ŒdˆG‡ˆúL׈cVmБµzƒÑJi`†5gs ›…QÒ¢´XapJhfF ”µ2–  `ºbfŒs° PX‡•XžSPƒ± ›Eïp`fc 2gp°Œ‰bgjPÊYù¡`›u®$b€JiY-°³`ÀqXõnà`c”HK–ˆa²Sb…±†2!–S5À{H2T)ù‰@ÕmÏÄ€âv– Ç gƒ‡ƒ!yhRxm&X…¸pç‰H³iZƒHƒxƒ³×“òfleg’C)4G("Î䉟xMT™KJi“2¸p5øa…>9’U‰€Ï'|3Ó–bÓ•«Â•.v|˜†<‰–S©’Ö*×EŠ+wŠq(G‡Gs­x‡håxàçB}H~h‹†„‹‰¤‹š§eç‹¥ˆ¡7Õ/œTžJÝ8Jà(`a J9ÑJ¯a¹R¦å‘š˜ƒiIv%‰€O‘3¦o8#6ºIM"ò"¿ö‚5É”L˜“f™—56›$8…A¹q:ãkEl œ÷ax•zÙ|x5Uµ1s£xÓ7x]…Š„©Šˆg‡&tsyØdéÕV1T~5dPt5™XÆ~œ·Wï§t`ƈbæ8fÙg³äšU„2`)JbÙ”M¨“O˜œ{y{"½)+w4ªvá•Ô\Ø ¡ÚI¡qT€Ùrå9˜óT˜¬¨xˆÙxß·‡Œ9‹ŽY‹³q~’ye™—eíçy¿¸taö_óJ¯ä­iau·M× ’ÙY€ i8`FÒ´r‚7#' sçYOu¸}ëÙ}8ç…£€Ôs´è^‘YŸ8º~F·eB”™_¶ˆ¢‡?OÑ5Jô9ýRfg†ñH/0u›U’Å•µfËÈ‘grFgv†gzÆg(U F {©u– Z€šS6ƒ›&wbia¡©aQiBs©”fGœdù”;ù¡ÌG©8«D)(¢Ǭ†I8œKxªN(©«j¬²Æœ=(”Tõ¬(¸©½º:2†œÙzcÃÖh%ú†UêA)Šž†É¢[úŠŠ ¦O6~×ò˜5z‹fŠyhÊ‹jš_l Œ?J 2 &U¤\'L z‘ ZœÂšªÄz®ˆF’È» ª«²«7°•²Ò±¡*+8P ›aù ûZ‹{NѬ+"²sù±u™‰([rÆê‰“&¥ãI¥fcžïŠ¥#¤¥ùä¢9çdðeúÊ-e_þZˆ›wˆk >êŸ@jJyà’càiÐ&Q û¥Z­ÁŠª7K€ÚЬ§{3°¬2Á©oë•É5kl0uS  a·S·RpbPËÄ*2°Y"Ðn`Ëy··¦¸œ±*.‚¸B3 Û· ¸a"Í„« Á"ÀŒ Vg—«¹Çjœ¹1_ó|»ˆkºª¡ºÛê¸~ë¹_¡4+iˆ;yf y»›û¸®ë"†[«p’g™›¼»¸¥‚«!o‹¸õ!n`w{ ólg¸Ë·ÊË»gg¸Yñ3QAº:‚uöy ¾ä+½K½%64Xu2€¸p€žtäå˺çK½0P¸“·…¸hxv ü!J¬»÷‹4ð*3 W¸sš šl¿®»À;¸‡¸!¬ eÊVÁ­ë¹?³*5¬’7à¿ÜÂ/ü½2|À‚kÃQ*,‰?<½_sFÄVÄ÷¡ /AG|Á7¼ÀXƒ¸S—/žäÂ0|Sìº7<"b³’ˆû¾ñ‹Æ8«kÁ`Œ"*ù5êÁhY_LÌ慻9€¸w€Bu,¹wÜ56ÌÃ[zQšû AVP² yË ðÈ{ÉÁ¼-PiO‘º#Ë[CS«,Pʦ|ʨlÊü »Ã¾fÉI’mg±É7ÐÉ8ðÉœÁªœÊœʫìÆì›†± É´œÉ¢ŒËºÌËm,ĻӾÃ\Í LÃÆ?“Ì—¼Ì¶Ìμ!Ќ͔KÄÖ\ÍT<¸+‚UœÜ<˵,6àÌÉâ¼;« »,@ìÜ5!qÎÂLÅo‹Ã³›Ã"˘üÍ#R4+Æ×¸XÁ[YýìϨ|ÁÌ[Ãï|ÐÌ›ÐEc%ÒÐ:Ñ"=Ñ­Ê®ë˽k\-íÍ]iÍÐüÐ4-¼%]ÑѼJÄ­Ìñ,ʽÐ=Ó" Ñ$}Óé\αÖÒ?=ª1=Ô®[ÓF}Ó§|Ͼ»Ï !œÓè"ž•ii€üA2¡ºX%\ PÑÖnýÖp×r=×t]×HqEÐÖk 5 "#ÛÖχnØXÓÖäÊnÝ5ˆmØœQØPa‹ýØHáØ ìÊ…½×•­Ø† šØP1žÙœ yÝÖJ¼"oׂm×nÙ¬ýÚu­º^a=ÖeÝgǤëÚ°ÝÛ¾ýÛzÍÖÀ=ÜÄ]×¼]ÜÈÜÇܱ³ ÖbMÖ †Û…‹Ö»­FÝÚ½ÝÜÝÝÞýÝàÞâÝÝk=Þæ}ÞèÞÙ]ÞêÝÞî­ÞìýÞí-Û_]ÛÒmÖÕ­ÛjÝ7`ýýßò­Ýà.àþ}à7ßò=à^àÙÍàýíÝ >ÞîàŽà ~Þnà îàôMÛÑ}Û’ÛaqÝNàÝ]áà­â)~âá á~áþÝ,ÎÝ5Þâ3ÎÝk}ã6îâÞÍãÛ ä.Þß1.ãþã>îÝݶ=Ý#žß%¾ß =åàT®Ð~åESäé­åU¾àZþÝ\þãa^à^žÞE~æ¾äö-â(@âi½ÖA0çt>çËtçw^çun5|~1 çtŽçxèsîç}^„k-èyNè‡îç‰ÎèË”è†nè‘.érîè•n5—Îè”þèˆî蒞苾é.êžNè¦^lâNþæPç éŒVë5@‰në¶Në·Þë¸NèºÞ뤮¾îë¹^ìŒÆëº~ìÁ®ì¾žé€ìÉîèÒÎìÅîìµ>ìÒꀎì·ní¶ÞêMŽßÄåЮ竞ë4°îìþëÝnêêÞîë>ìéìò>ïšþèñ.éç^ç÷Žïï®ïö~ïý~èÚð‘ï/ïâ~ßÔ]î²>ÚOQñœqñ•Ù™]ñ/Ø#ûñP5"oÙˆ=òò_ñkñ¯ñŸò£ ò _ò%?ò&/ó‚ óŸèò0°×,ŸÀ:ò3oó$OôBŸó¿ó?Ïó2°ÖAóMôëNó… õïæp~ÝC0[ßõ\ÿõ^öbïõ]Oöc/ögoöeök­ö3öiïön÷j/÷l¯t?övoöyOö{öj¿Öqß÷_Oø]õ¯žõû=7ÀøŽ8»’ùI?Úr­ó‘Ÿù’ÿøï#žo>ÂùŸà  ùš_ù¥ט?ù›?úú°ú®?ú¦/ù{ô—Ÿôµù¢ÏøŸÿù½ù¬Où:¿Ü¦­ûÃÏõ³ïû±ûˆOîÖ½ß??¹ÕNèßÍôTØPôÓßóÄ^ý€~ýÝ/õG¯"•ßýÞNÿNçâÏóä¿ýçÏóé?ìíÿóï/ôAÿüý˜míÿPæ–ÿG`€0"À(àôìÍGd7 ú"\¸-q-» í¶ ô€0Àþ'` ü€&À ¨Ý(àœ€¤O®i@hT` 4úïÉI¼ë¶’z` x^#)Á!Hqô>0)Á%Èìk Á)(à´M0 :Á+פ‚Vð jA-x»FÀ£‚^p †A$8³`„u;p¿µÁ9Hë ¤ƒNïêÁ=È™`샀0¶Á?(ïàT|;nÈ)B'×*œ#\„È)€GÈã%Œ„˜ð&ÂJ×.¡'Ì„ P6ÂP a¬3q9À¤ÂU¨ [á*d…°Ð¶BY aa-¤…³°–·Zx o!.ì…½þÂ_¸Ö‚a,†¼ÊBeh qa1†ÆÐFCVh ãàŽ+sÝhÃm¨ i6änÜzÃ+WäÂá6‡Tî»™ÃnH殜˜ ëN9uÛa:ôn뤹o¸Ýòáw«†üØI:zh¿›¤«1DL‡Ýða=ìn1!ŠCï%<,ˆq :DŒ5b6\‡E®"~DŽÈÝ¢~[t‘»•ÈWâBdtßMÈÄ™(_¢ +r-±%ÚD<iâL܉wîæD–—IOô‰B ("Dï6WbHL‰Û )ÖD%çÜꛫƒ~'qÖ©º,¸ïڥ㊠Ï+:B¸»"»ûŠMÐ, ºûˆ‹ ~Ôsm?ÒÇîfïã€änR>¦AÿèÝä|œ‚ç±¼Á€H!'¤…¬ÒB^È ™!;$‡¼ÒCJȹ!?$‰<‘ ÒDªÈ 9"K$Š|‘FÊH ¹×f¤ŒôrÖÁ€ÊÈ# £<ˆ;2HöHò'õbì‘QÐG= y$ƒ$‘¤zFRH:Éì—$—¤¤“’CRI–¼(Ù$Ÿ$ÑC‰ŒKNI/éÊbŽœkPO®QA4yô^£m|k{-MƵ5©&Ûäm|“o ê]G:9'íä[CpMNµIÙ$Îs“z.GB¾EyŒ £ô^ct–βÂaËh¹Öòaµœ–î[2Ëk).µ¥¸Ì‡kM\&Åp¹-…¹Ü–ær[zËvYÞØå·|—Õ²ÂåHîçþ²Ÿœä—öÏ_â¿Ê·òú%Ñû—ñ/`Ì óº_•¤y³aLˆÉ0;Þø£’¥¯MLwÿd޾̎HP NAñ¨ÏàÈl‹  :Þ;*H2C¦É,‚-Ó6Ç•y2»cɤ™0dúÀ.Xúj&uìŽ æH‘È݈æv3šÚ if·ƒøabFtšjM¨¨ÝÀ¤ SŠXói^M­‰çšæÖŒš_³$VE7îö_Vôrùm®CµiÙf8ôrÝrmj¹´97åæ•£›w$NºÙ6ùæÛô›ÜÐmN-7ûfÞ4œT.͘§JÓDÇé8#'ÓÄn”óqZNI—9“âæ„‰ÓjòD®yç:§ä¤šK“q>ÎÕ 9¢R4‘3GJ·6¥Þìlk¹.1®FD©m§lätŽüÝN¨@=£ožoQwâIܹ}çò„ ¹“èåH*X©ç´žO{"A4˜2¯ç¬žßÓ{Að9>¯ ¡‚䓦Oô)>Õgû‚+ï} Áõ9?¯ ìüwòxæO݈<+cÿ¼ŽÃsGâÏ?9@ig n4Pè¹@(   4€žIÐFAaÀz´ ´°A;¨Š1„ŠÐ¬ABŸÏÛ+¡$T„†ÐÊA[hÍ ´íÁP êB[è U¡B…šPŠBq( õ /´‚RP!ŠA»e Ý 7ô†êЬÁCy¨¡G”ƒÎP JDi(•áñ‰.ÑÚDaÀUbW”|Ì&øöÊhUsÝM šQ3ŠF¹›|kôíµÑí¦FãèÛâ‡Ú­ŽÆÑkè½›]£s4fA;zGÉaCL£ƒÔŽÒì–#Ë#}¤´ å€IJI+©%Í‘4“:ÒKÊI)©&]kš´“vRMJEé%%¥™´šRKŠJ#é*e¥­ô‘vRUzJcé&}¥”ôLn?}ÆK)T˜¿4˜Â®òwôzi/¦È4˜S=©/M¦È4M¦IgªÏ ©2•¦øš¦Kk:L±)È£¦_A˜^Óeêñ(”9å¥â™zArúMÏ©9å¦yÍêM&ñt`@ürÙĵ“)g3Šýp™¼µ;÷åîœcs4Õe‚Ûš ‹p‚k Ô ¸P݉atªâ JºŠŠçôÙ“ý-L^ÔÑÉQoT˜¨UϹµÑ™O— es4ø´,:¸–Pµ𧜠Ÿf7¹6=^ äz—rGÂŒÊhRs€4A¸Î‚f²ËPÄY¿k‚œÐõ¸"TD l|rdýTÐùÖéV…;X# ÕS*ûb4J•©®˜¦ U7Xä{>TÕXU¸ÃUµjÖmAu«î5“*Ve@eLªfµ¯‘´Ú5ÔªÕÈC ªNUÐ&WcÀU­«òíAÖèWOLXÅ¢gµ¬FÕ¦ªTÛê¬T5¼UºšUkŽün_0µAÔªZ[ë;l­®Õ»ÁVÕÊZ‹àù¤­²u¶~ÁÚ [okRà­º•îKÔG\aÞw zȵ¸*×§àô–ëh;®Î5¹JWçÚ\«®ØuºjWï]·«w…Óó´ù5 Õ5Ê«41¯æU¼ª×ñê×Ы4Ywîu‚¬×ùª"¢`|¯úŒ½ÒW%†_ß+zÕ¯ö´ùWÿºòlר¯¶¿Æ×` ìyu°NÁ®Wk`ìâdtR±uJÍ£É9¥â缉 Ã~X<'bQçéİRQtEÒ¹LJì†Mš)^Î×éaMì…t.VÐ5Å"09k,£Û±—3Çâ9 c}âA$²()ªØe‚dq¬Õ±M±ÇÊX†ØdI쓲MñÆZÙ)ûcƒ@ð²`VÊÙQ÷eˬ— ²WöΙY3+fi¢‘\³g¶ÈÒÄ%[àì—m³3ñÍ‚Ù2‹geâå´³A ÏjXA·g÷lŽ,ƒjr Ê5D;'m\cŽÂ-P:Z¸Æh%m\´W<òÉ·Vióä¤å´™¶ÑÚÖH jŸ`¢½´qíІZK[(íªõ´¨–ÒšORëÖ6mb{µµöÓÞZS×|ë_“µ¼–ÕALla-¼Ž6×ÆÚ·v&»Ÿ¨mµ”–çZhmYÞžÔµ›mé=Ûa»h¥í ì™ËÖ³i[a+çš³%·IÙz[tûk™í‘Ûµ2VRØÿŠ*M¤Óc»kïºÝ¸;,!ßÜõ¯}÷*˜È·ûvWá…»(7ðþÝòxÇ.†<¼mWï¶È )w¬ƒ ¨2ãf?-Hµ ùã¼RÏóbLÐKõD/Ñ#½6ÏôÒ¼7ÊÖBoü¼Y°ó¾ÞÍ{¥YT‚°· ÊÞ&(;Ť¿7ø_`ˆ¯ñ¾È÷ø_Á|OŒ˜$ªÎ·ù6ÉÊXÞ€¯õ ¾Ê·ø"ßë›}ÑjóEÓ7úŠßð»}oyë¾åwøjßå+~Á¯˜ü¾Î—ü^_î»~‹oõ-¿Ýþºß&©Á뻽Šfó/z¯¼°W)ÀA7è Óã:€eÀᤙ<` ›L¿ÛvI+Fð` |îö£ x‡`Lƒ©ÞÀ+æàòæ‘)fe"“àì‚O0æÀ*˜'àL›Þ!u£#á<ÀÛýLtH8 +á%Ì„ïb~ÂP8 'aÊ(…«°vÂWX +J/Ç…»°þÂ`nîÍ0L†Ë°Ãg8 «a2ÌG×p>´0#O)8Aê0Ì@}rXÁ<,_ÏÆ¢t˜ãa;\‡÷0!6 óóÌ?ÜÎtß!6ƒ÷î#b‹©ˆÏà#¾}Ž˜â<œÿþoÙ´§YÑH¢›Q-‰-Ũ݈âT\Š''+VÅ ñ·bÎ)‹W1)6Å¥³º[\Šé,/†Åžî»b^l‹SqÕÅÁøcV¬eÕl¡½³£ÕZ;k$¥q×T€¶w;2ûŒµ±ž;²ÏXÑ ÄT·=5ŽÆåXdžãËÙé¦q7FljÒ×S8Ûñ ³Æ.ßc}œä8&´øxÒdn÷áñž‹ÅÙ÷ãƒLŽ rC®stV! d~¼Lt©Ÿ¬µ9Ofd»‘Û3­“‡$Ÿ¼>’IòHþ¶‚Ò$ϼ@Ù‘9rIÆÈ8ï:S•¼ÚR­<ÆzòV&oÛr‹Ül­q£µÛþ6ŸüÛ|mr#ʾ{e¡ìYÀsƒ·Xñ/&å– ÛR2k“ÉV¸eeà6q_²V¦Ê½í#÷ä–ÜS½)9½~fÙ›¢Ö£·NÓò„ônì”®e·Ü–OZŽËÒt.ãe¶üƒ·Û^ÎËTÑ)[ÅOL³b‰H¬‡9èSi²˜e@€u2ß:™“beÌn—Y¡ÂÍÜߤêï|EÀœ†f}–X+ciö~0CŸ¦f¾VÌI5'I±DÄæõ`k“¹Ù fäæP„OLoEX«qõ­ÖÕ/°L‡XÖ¹:mµ±þÕÍOjKbõ±ÖË:svK_«“µ‘p½ÚY[ë`á²µ¯N—ÖšW3kj¬ß¾rÖ[6E/—®¡åº&œ!V*ªë¡È®åµ»¦×Z.ÃÎp¸cë5Rœ×9Ñ_ûDtÉ©ñ5º¶×æ0T•p‘®";ðkÔ($Àî®a ‚b[l£°lÚÄ®ØûìÌ€Œ ²B‰Ùc"Ac_ìÛâ±Uv‹èk$Ûb_³BªÐ5;f$ –²AvÌÈ`(ûc[ìïDÆz¶Å® ë¡V í7'3&ȇ©nÀ°Œ@O’@(b à.–ÈÀ@Ìh4$Ér±w‹QØf"k{í°Ð Y hí¡¶¿ÀÐZpà Ôš··ç¶HÈ AÌ/YÞ¶x¸+_ „/à§&ËM1܈ûA4n@µ2¾€â¦pI*(Å M3æ€ÁH *\`KBÐ>ü÷¯D(SZ!óFL™3\ÀQ£"”(A% 6et€xA§ œ0dÔ¨ãŒ4dƼ±©²Ä9eÂÐy#Gf’9l¸!CDN˜; Ì0ÁæM¢G“ÒIóÆ ¥1ALQª¶ 1FÂÈ¡ 3d€F¢Pœ)3GfŒ¢B¼NMãæLb<2}îµQ•oà¸Q”È›1uÚ”qCÇI™2dPK!ìUÎÂ2Q š¢óçУéL©›4ªY×q „l:£ÉÔ^Ydê¡¢IÏQ0'Œ23É|™cçKG5 ÊàƒDj3 Ô™SF™4cèÌ|ujÕ«DàËŸÑ×¼~ó¼àÑŒGt¤÷‚ç%°‡Œ‘a^fô!`„¢÷BŠGž… R¨À Fá jEˆçØ„‰{´Æ–E‹"¾ ÅÊñhá¨áC88ÇaÀ$äˆSÀÈ*Þ(`‹/Lq„‘eÐq†Uy,ùR8H‡Un@ä”9Їƒl€ÇVrœ!†—jŠq›nbõä–at‰¦†c8š×-åålÚ{p(…†—(vøŠl°áåXjÉå¥r8¸%aK!uéžVw—‰îñ›Y¾ª™®Z†o0†ê{<)ë@ÑñèŸ#¶á`oê*°/¸á «w4ê«—nàáà x”¡—î!±Æb›ª²ŠlœbdJ®P]Éá%©¹¢ñÆë’‘)aÌñkˆαæÕŽ´m±­®Ëî H‘G­¤øÆ[E€Ðƺt9æ4.¹’J!'‡ ÌAGfh(FIÁa^&p1iàQsØÆthÌñ@•1"APa„EDBH#5¸rÆíq̲Ë0Ë,‡ÃmŒH_È(ß<û ´ÐrõÏAƒ WJM5wŽ>­US $à,bˆñ#º1Fô SÏÔ{ñÍÄ<Á¹‘/ß`òµh¾{ÿ ÈXøÍ?テ $@F€/Ø^÷¾Ç•7„ABeˆCÿöp°·t-péÃÅç> & fx{°¤äŒ( ÙÁŪž0t¬ZsÈ|$:T‹yè_ïpÇ>Ò̰Z8€Ë ßP)€ ;RËúDZ‚ 23ØaA8†Žeé†D•µ¾„I9aÇTÈB¸Ð‹1ô¡€ø!ÊpxÕªaMЂBÐG•"¢ØæA$*‘ `âÍžˆÆ(âkD/sµ˜Â¶ð…1LÀ A ÆEÚ@‡pÄãƒH$9q$3°ÁH˜èÄ5މ†lð#•Ò £Á|Á*k G¨§òÌABdÀ ʃ‡˜åa: ø!‘fòJk‡—åi…x‰a¢'/ ¥`Ê uLOjCðxƒ<’AB9J0ç±Û5¦l ˜C+;&¡-ˆsŽ#±:ÉVE5R ;ÊL3Ͱ¤ÌR<ÝdÌ ÆSg^ú§Œæ°†SÖKcüËåwùu“˜¾2ÿ9Ïg‚ šÄ&´ÉÍO~³E᧒Ę+]SçØèÎ4Àd£¥d¦3‘rÀÃÕÒ£ûl ?c:Ð5ˆ2GïñU{¾€.¦4•OR«ø6ïñТêìe,ÍCK[âR—CॄÚÐ`f¢Æì_/s˜ÀR‘ÐHXÅë’_Ü%1{{Æ}~ͯÆÀ‚Óš”>>oÃî°& ð^åüÚ÷IGBJÀ÷`¡'I*sÈ ÄzKä´}òih–ÆÐ†<¬áÁ Xóîà† ¿`¤éƒ Üãî÷¹¯¾»à ûØAúFÔtLìNNßvM«ø›áõòÙ½€øÙç>ø2†¯ŸÄyÏ?ø¹Ö;ߥÿ÷×Ó8öYš«?ñ»A/‘a‘‹¤ÒÔz{½-ü Ã4=é;ó<¾L׋šÿ´ÝZ¿e»4žCä â½@¥" oá1¾¥.2Hè¦n2±%\m2"B`'X'z‚\B‚€éf/ ø4oÂj0"0r1C.á1).…G[rC)l° ({ ‚4W%È‚¨‚oÂ.øP€13mÒ€„o7cÈ!3eð¿ñβ=7ˆ,Bàƒ2H‚AØÝD1ná(ŒÔ„4…)ˆ,xðK{ \ׂ,ˆ’TƒR ]jµ8 0†"¢Vw !tˆj%ž“‡  VlЇ-¢T̲=hXJˆâ9ÜÒ*‡ˆˆ#!‡àÂŽˆˆJu‡s4‰¬²hX‘(¬²OšX‰]øŒÂ…iâ¦!ô‘v^$òpôûdí3n‡±ˆQâPP‹g0"½'©±2R)_€yp!sÿA%«1ÈXS°Œx]Çøue ŒIÂÍX?Àx?ÉRwÐ_©1_v_àa JX\¹Ã,_%íøŽØa†T"õÒö莢A\ʳýX6ŽéÃìa¤q‰"S%óhŽ©þxÎ(#xátÎØ"Ét€ò]ú@FP2Ë£3Uô?o±!âóuú TE'ùyNB\ÂH £BÌ"‘·vG‚ f“ò”624”kE)TxݧUô^ï•ܧ_×ó  ” C"6âø¸’çøcy\]iŽèHë8IyÔòÆbôXêÈŽ —9étzÁQTI– “È8“š5”‘ô”6_õEf^?B‰ÉbÉa‰%°É8ØH’QD%²˜¨ñZp@O[ 802 Iôa€9€šª)·åš9 |©¹š•a›3 ›«ùH¶I¾)Õd›‡‘›ü1a2à›3A®Éœzáš80ª9­|aÎY›¯éȹ›¯ÉÈ œ¯‰ÎYœË‰´9¶édã™x€J§S$SBå¤5¾Â¥—œ&  ðœÙ±M9£1 9ôA@g®~&úŸúíAi01@ AÀ'×á  *¡‘e¢ÕcÁ©a¢­9¯ñ•&Z›E` ¢3!º›E@¡ Ñ >! œEÀ¡H3 :ÅY$Ê£3¡I £¢ŸõI¤ DJð™Hê¡ JЙOê 4PNТ/j[­ùTÊ£4P›O ¥BÊ¥hº›O¦JЦÀùgj[Åùl*§:Hâ#¥g[WZqê 5ŸU`§C ©ÐY|ú¡ZU¨5КY© Zµ©‰ZJž5€ž”Ч¬Êž¢ ©*VQ¢¬z¥ ¤OªIÊY¨½ —÷.‹jÕù¤Ñ«­‰T«RŒ1`µyp:¨­»™£Ñ«ÀIiÞÔ«ÅÉñAÇ¡541­Wuð#Ú0á ’ñìê®d°o0a ÒÐyup‚³ó#ùº¯å7þêR8¯+¯­y°0£Olp;°#¯Óšòº›~&¯ÀéëÑŒ±òZœÉQ/¡ÓJ/g0“×Wв*{¯¡8Ÿôu;_§¬ƒŠÐIw`мÑd±²8Pb|²7;ÛšÍT)Y²³µY¯È‘°gÀ¹³»)µ¨±oW+³À©µ0+±‹³³Åé°0A,Ÿ4±2¡/Ó„}*³WZ³ºiç ·  h xaW³Ck·ÐÉ® B®Azv[Òd· {«<šày ‹»›¯Š¡1À ¬“[œ22Šj·Šne€«ž•?b 8ëŸýÑ8À‘¤šÊÐY„´6;y|Q)Ê­9£'h£|Q›®Ë® ¤1¦»›hPB¡bºÀi‹®ëS|Qœ§Zz|Á¶—G²¦{¥c€»5êŸq1By ¶ "µ5Iá¸Ü[s–z§J¾­‰©+¦Ü[›À¨¸Ü»›ið¨ä œðÁ¾AZ©ä[œÚÔ¡}J¾š8øK¾WÚ‚$l`uþÉ3á±n²« ¤áR/ºšÕi@軚­ù¼¥ïK›3!“¼º:1A°k¿™Â¬‚I‚«Yœç“AL‰¡¶¸Àú#¬3¬ Ÿlø¡9Kþy¢GB¨ÊšÕÉfb/Kü¦S:¬I§0Œ)첲ĕk©!#rà¼L:uÀ¿QªÆ‘ >¬y¥u0«ï©ÆgJ›ÐDœ¦3‘t|3¡ÑëŸsêÂüK»É/A8CÈ•›·§á»ü—‹„ܤxC› 3QAÅ´y¥¦¸ÉX©)LÄò¾¢ÇÈ ƒjä>¿–»Âp ðâŠD9Ù(µÖ“ç/Ù%5 èܧ!Ñ$cg^Cf07_qÑ"1t—Æä^§Äacg†Æ7å¨U4Û”‰¸Û!ÏM%ÑbÒ)gÝžæ"‚ZË>Ì1Ãè_Å(‚ÖAÄ.€3@”áf2ÐçèMüR#ÑÄ™.p[ïg&*f´ÓHlD—³ç“~^6T铵dD7›ñH™äÏ9d#⣱Üèp1§bŽ91 }Që¸Ó‡Ž]54Áå{áç´µ^å7×ßè¡-€¾:ž“N1ƒ‰A1¨ÜL8‹ÑÚÙ>Î^­a.Áþí+$'  (€.dÀuBm0ÎÓ!;dÆGŸ>7ƒélAéó_žÎÛT[6àšäF‘Úç“›êe<­~[¶å¥ˆ6ëµnëÛ…ë¬ësÄëX¡D3`Nì2–àÞ^ñ>öìѾÓ^í°ƒíš„ò0Àíè!î.ì$hîwÀîêî.tàîÔaïòmóÞ•—~™þäì‡;ïµïF„8à7P“K[­jð«>¾5àê ëpAëë’ë¼mñ¾ŽñÁ¾ñÌÞñÆž ÁðÌòÆ1ò%oítµÎ+ï[-îvß1Hýˆóg¿ë{¡ s òFòRAín÷}!÷,ïíwîxOîæ>"ìý!öV~ÛÇøÎ¾ö…ßö'Ÿí*ßø/ßâž÷6Ÿù:ßIPTü³süBlŽùi<f]«º-Ò³ÐPýXÝõSxÙ¼8¼‡7öðˆ÷CtOü}=ò§ñ†]´meã㥽õíÚßá3y×þm;ºçøèßãwcGæ±;ügüvçk>OóÉ|×~–¿ƒ Ï)µ@(8ý`”zØáIÀí×"ÞÖ›x]OްWþ<àù ê¯c>iwŸ Ô$òïÖ?Éwîxˆrè9¯ê¿>Âÿ‚°átoÁè5?†Wê(ƒ 8‚ ïÕ)Á17³ž@Pp×IÁ_—ñ„•û€¯ØÛòH Ûë‚'Oî)¾0è+¡¿ ƒ";  A‰ÎàthKÏ÷å8ÖAûã‚nñE¸×(!ä{…0°Ü¡z$nLˆÃ0ÐÀþg“ŸÏkayôE04^WPÄ0M¾PÒ”aëC-Nvˆ@tB[n€(~ŸÂc0â÷óxaŒÛtùΑ»UŸžOŠzy°êi? ø/ øsƒ vÀCx‹G  wkjÁShøR! |{’ñ±Àù ó^jЬ ø=Õ’CÒ)܇%ªÂk[á@ƒ0 ÂúÒw¢ÿÙ…ñÎrŒ¥W …¡ƒò %±õÅ…Êà !Il‰¡æ>±û6Kï›#ØPømØÿx Ñ €?ðnÝðb|€zÐêõAîgŸà÷‹‚½n r@Cæê¡ˆ@v6`(6Bˆøýa⫈s¯ÛÄÍùb ` .aý†’BÙüÞf¸-QðmÁ~8"+ ‹uÏ’ÅKhU]7 Òc‹¤’v‡ïaN|Äs:·2ÝE¼‹®p/JƼÇPÀ¡Ó'\ €ÄÍ'/JH ‰’!jÄ…×Â$Ãé#•á:¹ÄϘŸ!5µÜÄßü@ÅNlƒþï †C 8GB«xæPÕY¿©÷ ¬c‚íÐ)bÀð aس‚Åý™½Pg~rœ#4^q.>‹(1bY”…¼b‡…a­Ê„ß»2 ä=DSéâ?T|“ð"êÅ1haÑR€ dâ5ÌÍØ ÷ßE© 5ÀŠF” —áI¬ ÈÊ@’Äé£áž›†¼ÏâÄÚ¨ ‘OTƒ>QùñÆæè²]£ƒwðÇ$¨‘£Ö„OQ6GyH9Þi+{È..t/}È»b]„±;ÎÇŒhëÊíàr/%5T«m¢ÈÕyDaq±6FHø·#^l°>ÊÂʘ†rC=\#3òÇ5Øó8" }¢5•¾Ö§£ík}_ÒLH™y›l”´1?ŸG$jJzž‚t–FW°Tßü,{’ôÉÛ!A€ “#¡…¾DÉè¥^x26VÃkH!ç$Ǹ[2L"='-C£”Ö}|È'%¡¬‰‡òRŽ„–¸(=e©<†3±P¾IJ)'o#\•g*;NY°`j™ ÇpWæ€^ùïð!‰‰¡Uú<†Ç*³Ì•¡DXöJhé uŸ›œ”²VZHUyQÂߦì”6àß KS*ûÂg —¼ÒTBCeÉ-$<¼[èr\ÂÊ6¹û°eœÔ‰Û²ºÁÜã Ô!¢LFÇ) qLŠëžÈŽ3àŠœŠæ/:†@€à¢uäŠØñF‚ÅÈ8ó^ÍŠ?~/MUGϱ—dvl’ñQGFI) mžG¼yhPrÉÎÇ1¸Ø°4‰îf¶¾ ¨%‹ Ô’MFÊk9A@N´ùRffH}÷/!Èݘvð(Lu¸ÙáÂäz*rüˆIö¤#²‹R³ÙaL‰ø7¦|\™ßÑÜ}L¦@?á§…$S.òCÇh$Ç|yoæm‹—¹%yÍü0WÈÊ 3áJvÔ’$Í5 )­e½,šG³BrC¥‰üú¥Iiš@°κ¨)" &‰L˜~°û)Çwèõ¤âÖ„Ž]sb‚Í­X#3fÙ„ŒgS2JIµÙ@fat#1ŽM÷øa§Ê”,ÓÜ¡;¾3óŸßÄ£¶NÁ™§§´-L¯g>OV…8gµ¤‰DNÍJi+ïVáŒß²@¢è(a¹–ŒëU"ËB™*oe “Þ“|ÊX))!'÷Ì—¢ì{:K<)>Ógù %VUU&1D¡L/+bÕ<4=jO• _•ctHb5@©líw”¢†ti.C߬S´PuŽP×,Ÿ¦~Ý™LïÒÃAûh;*€5¨^U¤ÚWêIgáaS ]…ô¡Æ,‡Ší­ª´#aÒžWõJj5íª-}v·~ÔÒê[aèÓÔ” U¢¦Kˆ*@ª¼¤­õ•[2ϧÙiM%W嵡ö·Øk9¹¨Á”2–­Ç *:%,錇uîX{XÄXg”íS–˜Y2ØGaæ»3žV4¨Î,]l{ß«=ŸŸÅÞBZú*i}^‡Ô³a²C–¬ªñnë{šÖðÕ>ÛÞmah‹U“U•Ô\óYp·*e¸÷RÔN[±J\¯­Æ»NÙ6¶Una¥ë·­®GTÇ‚@{X´|,‡£(óÖYGJò@‚ƒ”øñ`bÿ&1dR&Qµˆ„!XêŒå1ºEuhÀW`‰lûíHD"55é%] Ûú®M°_u=´gôFÀ÷ª3:-Õ¢@¬B‘™<+Á3©Ü`PCp |ÃA?ª´„!fÝžmX»¤a7ô†4KVÜ%…¡ÜU&íÀ¼ƒ_U4&T€A€¨€ÉK€8§TÞÊ+€<›×ò:€ yÀ<€Ê+y[ïä5½÷ôž^doì…½´×öæ^Ü[{y¯îí½³—è^< {q@ñÕ½0àôÖ`EÀaìƒð?Ë×0ƒ°}€ô5àú._€¶¯ˆ¾\ßÂ/ö ï}€A€¸ßåÛÆÀ=áxßð>A>¸p`ÿÂß``î Þ7HÀX$p¿ö8€0~Á?``·ƒNð ÞA¾¾ØûöË ÀØà°‚ <ƒW0x€ð pF€ù‚_ ø÷½Á@dà0` æ/ØÁ Oá æÁ?€b €~€*Øû„á÷ Æ2` ¨á'Àú@Ч@Gáå æÀ-øA@xßà îÀ/øß ¿_€Я÷Â’8ûr€}1ñξ€ûvâ'àÁ$v¾ÿú^â0ðA¼wù¾âXŒzañì…²ßbY…oñïýŸWøâ^<‚õ½8àDàð 2ÎÀ`” 0{a€2`|àé øÁ æÆþ ' €äØdà€ÀúEæõàƒÕ1ø€àÐ^ @¼°A€/l#@ øÏ@ìN0QÀ?FÅ}d@ À°$€|àü0HŒ@ ¬æ;…=pßà0äÀ n€&à (d‰,Žp ``þt<ƒk2ê=ààúîätì“ÀèÔ—'“dƒ@œp(A™ùBàrÜ“² €W”cp} 0øÂ {l.øê ðr°‚½òÀÜ@ð²< ®Ø] °e©ÜÂ@ ¸H€,?‚° ÞÁ7èÄ -ƒ€ ºÁ7`ö8ý’ãxœz7@=.Êñx(WeÉl2³R¶ÇÜØpœ…²5¾½¦YïÞÔŒš Âi^Í®Y5÷^Ö › €¾`@‚Ó+”À= ¾ð€7ß œOoåÍÍ»Ù÷cÝ+Œ‘ññŽÆW fꎥ3i–Κy)¯ãy|™¥³WóWhgæ[ ÎÁhÞ˜ƒ œ @3Èæ@¬‚°ž½ó18÷€<ƒ{` Øó=ó—çìlÛó<ÞÉUÙ@…dzç`ü'Ðú³}Î@”ƒY`¡Ûó1øàôƒw`ü36ÑŸEeëL3°/VÎ/:Fß^½{ƒ/s~ÎÎ:Ÿ^Õ<ôõʘGûèô¤ ‚ÐHÕ|¤“t‘FW˜þ€@¤—4€ÒO9`•´2†ÒàDƒ`A•þÒ T<À2@8ÓÌW €oðæ Ó^ÚH#i8my÷tžîÓNÚJCiÔ ±@ÎÓPú <‚tp|ÀÀˆZÌ‚/À¤àT R»Š° äÀ; š{ßî Tñ`Ò~úI_aû ¢t¤¶¼€Ø_8=¨ø¹ P£iË»ªAÐÕWú €sð~5­^Õak@ͧ›t³NÕVÚûi%M£ïŒ¾Ö5[[ëÝKŽ< ¾àÀ “co¹ÈâÚ kszAXÁN‚= Ê5û¥ðõ"€{€¤À˜ð€À òu@Þý:èh °O7È×Wú\×ëû›®#6»F×ÝØ ø€sÍÎ5>¨ØÛ tlƒ*68×8à\Ó²U6Ë6)Û €'L}qðô¥¾ÓW¬ßÐL}köÌŽÀÿØ €ót0èÙ2Û cã my‰¶ÑFÚ _iƒ0«§²VVÂàú€/ Žö=QûñRí|9qÖö¾ ÚkS_ ‚ßÁ?X¿ÿ8Ði'L´½¯†¾j{‡`, *¡Fб`8޺Ā ]i³mpþ,&ÛÏਬz?Á? ‰ûk € ®o¨Úìøú€º=|pÞÆÂJ»j m§Í}‘v`/mÍ\ê6B9o'€ Aú­Ú×÷€€`»#@šÎÜk;·ƒgð ò?ÖŸ`äxP·À5ø_äíÅ- >Uû(ƒSÀ @AÝ®9À¤ä­·/è¹j7p ~õ&ÔG{ôí´Q7ÐÖÌCõ>í¯í¿g7OàE»uðŸmÀW·Wà5;S„鬳8õå\]Kìs *öº¦½܃opб-6'áãz„cì~±;x GýzD@°§]ø¸Žáø¸†Wlo ®0çׄ^ €‡ÑÚºò¢Þj­Ä€ÆMÀ3H?àtîûÆ@Ê@4ƒP<@%X<€$íÇQ¯-н `OðÎ5xãX8Œcò2~É9ê|0ðü³Í8Õfä°[ wáBý…í¯"îä¨"ƒI0 x@xéà€1}Q9HÉ€ÈX ~X»¼ƒ˜¬ŸÁ/Ø|  ô‚ð€,ã]ü”csS.­¯tÖÊ «`Ô ®y#È!€K€rÀõEæ œ€0 Ò'˜ï |ƒ€ NˆçräƒÂAè|@D€ÎËQ/*÷øàüƒ_0 èô>˜¾¢_sÿM{÷ôFçä:8lqY\Εy¸¾Š8Ø_@ÔuCépü`ƒ;p 8ÁxŸ ü8àÏã¹ ˆ*`p °ÊH*`ègŽï_pîAØ­ ´‚_à4úGå2tq…£ôG×äž<“gs‡€ÔŽÂöwV«_EޤÍzú A àŽÙº>wàÈ¢Á<˜Ïܼƒ `ÎÅ€0¨XŠ ìb ¤À(‡`˜ó10Ço?Àÿ`ü‚?° zÁ;ÈÝ @_P…™ïW·ëb½kcò+žÅ‘x¶¦½J<0q#}‹c{µ>½ç:؃T r»jз\o@Ûƒ»åµ¿  \€YÍ…°p|(w9þÀÊîíÇÝH÷r z#€Îj_cµƒ};Õ6îà”êŸ Êµ½Vï¸y´wìžÞ×{n&îô½ Çwü~®O5êeÇåÚ€|ð,~Àƒìƒ'¶Ë›Á³ë–t ŽWŸp ?µ@: À_®9<ËÀžÏs@{%<ç0à]ºAÀr@0?âcµVNçH€<µ¿À?Èèú€ÅËø¼"@=÷? ð_€À²ÒÖÉK~Æ×ëÏÔA'˜·Å„gy $º/Øö)Ûƒ ïÊÏY~ÃeEͨE€?ðÜ ÎOl?©+u¸Ë@dù"ŒÀ nZ,oêm°öÀ;ØY~heAÐŽ ‚C†ð"žÉkåIàÎÁ3èÐÓóøC¯•UA1`  "/G@ Èc^+çtOÿp«ZškS€Qïãç°QÃ> ܃;àzÖó%¾Â§! &Á,ÀÜÈ~ÆWø-`îøœ€×Ëù©Íµ“ðöö^Ìkø_à|‚_ðØõþvã®îÏ{ºëþÝÇ{óŽzÙ=¼w÷ô¸Ë{|Oµw;ô½í®}[ |`üÄ >ÌÆÑ_9»^É›‚e|×^¾¸dûË!>óýâ` N ü³XW  œ‚j`@€ÇÏßàœƒzð:>v¦Áÿxù.|…f5•Ûæ€jÛß›ÿß‚§¿c{Vçf zA Úç—çÏjª­£4°!è «E1؆Ãëäª8A¨D?­Sm¨¿õ…¾€*é¨O €GlƒmVÐÝá¾B˜Õ€€M¬ôÿvˆU ƒm^”µÓ×É€€Dîôã~Àá8€WôÜŽ€UØð!f<9\ÀEr@qŒA'ÎÕµAp®àô›ª]® @7€áhe×û€ì§üTÁ*`Ð/ú-miÁ]¡€°ãhPâ?ƒïdè‹ü•?0`þÃÙùCü“òô¯þËÿøGë¯ý©¿ô½®à‹mMð±us6ÄWG«ÿj¬| ÂÔ,ß ÿ«ïüÿõ_þ„ÿçÿèÿÁ1ÿ­cÀ!0¢^Àûÿ­cÀÀ•l1˜t4€õ?°Žž×·Ž @H>àü÷„€Á@R$ °‰)a—Øö‰1_¡X×6Š @)vŠ=_+æŠÙb—,ÆÒ^> -–z ½ùÇ{]cØ?À_H E°¢M ˆŒEO Œ `N`5Fâÿ@à„cHÚ:aƒ€;®keàh¤Àv°n ˆšmà¨rfF™v®ý¿ÙòWÉ¿X„q{  øüý@ H‚…à"H‚†à#˜F‚ˆà8Ö™c’ %XŽc+Zhöµhm6›Åf­™m&› g¦`)øš‚©`mv›!€ÉYoÖg¡àp6 g°`ùœ» Âg>gØu ‚‚)Ø7À¶HZ1x ‚É A` ‚kÍ ð "ƒØÙ4È VƒË`4h jƒÙ vö œ{åZ ö gá A0*xå pÂéà:Ø‚ƒØYŠ®hÃ`(è¢ãßk7ð-güà÷ ªBÚV¤Ik¡•¦Æ >P®)caB¸¢^——ChF„ñßCØV„!Bˆ2„aõev„ a´ÖŠQg¡÷u ú%áH ¦„'!KHŠ„-!LHíiþIø*cDœQÆáÐNx…;aOhyý„A¡•–…ñŸPx…>¡N˜…DáSˆª-kÎÚŸÖ£„ùà>˜cÝÚ·¼H™‚GŽ-a!? ”MlÀ B€3^Y(”}Ü`Š¥…káXèF~qá\¨gvá÷æ…Á^(d¡_ˆ²bza]HÞ…\ˆ†Š¡˜•p!Û.è±lÛ¹’c'Ìæ²•p¡ør†-[ÒFÀIp8[·³]p®ì–³ydÒW·‚!…Õõõºmª!0Šj´á1x¾†ºaÎ6î„¶¡k˜î†ÃaüWâ†:[p(:…µá'džÂ!tè‡Í!rh.‡À¡vøðlŸ\l˜µµw] õ¾nâ!?@Ú_ß!kN_^àzhº‡è!|¨xìáy¤‡òa{؇ü!~8þ‡ïax–‡þ¡òWÀ©nMÛǾ-ˆL7ÀEp7·ˆ,Ü ·Âip-œ×!¾p*œ Ç!jˆ"¢dˆÂ©k1Ü §Ã½p8 w"þ`^a¸¦ýÉiAÜWÄqY¡m—ÄE_€Dq Ÿ?Tq% ×mra\R·¹eõ@üGŽ5iKâÐ$V_äØ%N‰ø Ö¯…`Rbü§%Z^\"–ø%^‰^¢'÷ºáàÚ †¤‰õ8 &~rhb(”Átlbšh&‚qbTÖÍÕ‰mà›È'º‰a€ksâ7(ú`_6(:a†¢(.Š¢ˆ¦Í)ŠŽb£È(Êl‡â¤((VŠ˜¢¤HÖQŠ—"¥ˆ(6Š>)ZŠaÝ0(*x…¢A *go"ð**x±â¬ˆîíi¶b­¸*ÞŠ®â®¨+Š"Xgʼnü’–#Rm³åµ¾{þÞ»‡Á‘c"Ý—Û=‹§œ´HµQ‹µˆza‹Ñ"õ5-:ŠÙ¢·x-‚‹Ýâ¾.Òwð{çÞýdö|·.ÖwûÝ»¨ß!€ü]ôÅx=^cHàx?Xx ’xÞXvƒÿ"»¶µ]i£r˜/^ì€Âèƒ1Œ£A1F‡cÃH1JŒë@x}=ŒãÙÆ1jŒ cǸ1’s@Ãè1’Œ&ãȸ •Œ ã ¶2rgÛoF}¹Œ\Ìx}ÉŒ=ÞË2âŒ4#p·3Np=£Í¸¤c…Ç3SÛÑxÂŒ™ÒHîñ‹°˜ïÙ{óžxÇïµ{õž¹¨ïMZ#Õx5êv¼Ý²(6š7Úú$ž»Ã74–ƒ¿Ûøf`m£t7ÂoãÚ(7Öq£ëÕ‚eŸB°ÜYb„ZÎ÷ß…}€Ïw…õ}B•¦ô}H_اöe}j_Õ÷À_Ÿã(ô‘}wÕvö¥}[_”öànŸÝ'÷}Ù :þm2°÷YŽ Í·Çiu‹a˜ú¡^ƒóõúÅ~³ßíhûADyLP-1.6.0/DyLP/doc/Figures/primalerrorflow.drw0000644000076700007670000007277711171477034016242 0ustar ª» €)-€ ˆÈ sÇH6eb P%Ì™2SÒè)ƒBFŒ.r°q#‡ )XL3›0y˜¤³ðˆœ7uà,¤RK!rêÌAƒ¢I*E¤!† 8p°p‰E 0R„|Š‹2\Ô`ãhQ¯F­vµ–…<ÞˆQフ'P@Ø Ã&Í7m‡qT ºvñò¨ 0bÚB‘÷‰*Iž8 ÂDW…K¶ ›NbnÄÔaƒNÛ1@ˆ&]Æ4§ ÆÌi‹BÈ›7kÚ„q“"¶™¶mÊIS§ï0›A.,BÌÉ1kDÄf#‡öÞ#L’LAÒû¤›3u–i«–­8rÒèfãÌ8>ÌQo²&Z:5éÌ¡#§L˜6_”áñ…¤€K0ɤM6Õ–ÓN=ýÔP_!¥Sy8•T\ápƒV\qâX–HbYg¥µV[oÅ5W]wåµW_Á(a†!¦cP8™d”Yæf hÆgEzÖVh£•vZj«9ùZa²ÑfnºñæpÂgÜf w¤rd6÷\tÓUÇ ×e·]w»'y+ž—Þz ¼!d„Çž{ðÉGBxÜ—ß~ýýà€ŠÄàMòäS_†•ÔReøTTSy8" nu"X^jUŠå±—\€Åȃ^|Uc`máxØg‹5öXd“UvYg›ÕÙgL²æjª5ÙZ[°U¹æ•¹íÖ˜\WÜqÉ-‚™a@'ÝÔYçvÚq‚wr>D§yÝÒ‘Æ\ø`F“í½ßo¸hi¸AG‘yìWF†Ú„¨ H 6DOAÈñÒsÔÄK!cW„„“N’J(Q–^˜©†œŠ4D¾tÀ$ V)À„L1x*j YÕ`àÌNÙbÎRø¨ƒ GH)ÉG]Š!ÊÆpCU,ølª‰¤žŠVªn­ú"­¯Î(k«7 ›#®<úÈk¿&,TIå²< û¶kÍÎöìmÑjI-ÁYûe˜Ù–é\·h‚«&›ãºi.ºá©«¢yó’Vo sŒ_?¬/ºpÃa<ŒBÄW,ÄÅoüDÇ,| á¤"m!¦MmÊ¡+ûë2Ì"ñ\sY9Tµ3Í8@ýзízÈGW¨ôɶOeÔÁ—Z5Õdy…êŠY»¶Œ±úõý`bߺ£®?ö*$‘F"Y’ÛÊ eüÌRiwmxg9ío|wy-˜bÒsç­4‰‹\o:Wœ7žÇÅ'e˜ƒæ¦(…5Š!¡ƒ˜ÄÞ@1‹aLcóX¤Œ;癬v2PîZV‡—ÅÌw7žðzG3äŒ+0@žÐòC´×‰¬RI;¡¦RÈ•”eSÖËž¹r½í±¥{¬²øh4>[鈹êÑ®€ä«!ëHb{ß’æö¤d«~±¹´ô·¥þù [cÒ· h¸*Nßaàºâã†7LsdÃÅÃå‘pd&¤ÝSv‘PáБS;b¯Æ½E‘k°¢¢ÉÇ6óa±l[T_ÚÚF%†Œq›ß§”F+åOZmì›—à(Àm°páZS›Ê…Çt50U‘L&tk -ìVˆ©€1 ¡ ÐIÁ•0AÞA1YˆÃ4X:¦.„­!ìY2E2M…,ÛÝ e‚ƒ#^ä(ÃCA;K%á%¯âü¡ìž‡Â”ÍS,9Ñõ$¹D'ªÊ{›Ìä×6iE²¡ïl]d|ÀÈ61ž’~©4£”êæJ,Áro²üàâ(¸3}+—ˆCàâ8'* ]ï ]˜9—ô !s`&  iò?d5?GÈrœ@œÝÒ¢"HTTMb‰ Å­¹J¡âchù®˜E³qq}_tŸ)‹%%¹a”£wó¨ÞøÒ¿L4©u™8^*0-&Lá5S@ŧ¦i¸iu ø¨›£¦ç.¨¼|6¯œK%b ‰©–… S¥ä-iUÁ`uV®jèù´˜>´yQmÖ1jÖU¢jÝ_µf ÀÀÅ•p'=Ü.ȸ¼Ö =ê¡ 3çÓ†ú꧇êb‰AÑ‘Žƒ¦CW'¢!uŸB<§ÊÒÙBÞÉL&1,¨´OŽèœÚ¡Q[BÈBˆæ½f/kYíiö —¼ª×²Ê5Ñ~ò¡_åDÅ ¿U¶v£öëhÞdëFÚŽ´–sÄ¥nëÊ[–:˜n(æÙ9 2·±ÖÕg"#ËÈÏi]â|íëÀªŽï³UܪCI Q°¢–À«5°*ÜÊ´.8–þs«mm)×:ÒU¥½Ô£Kû˜a’¨ ÂgˆDs2•*ô\ñ§FUξx¿  ['¹ ÊÒF4¬¥,pYw ·×®ñ£l 2-áJdÜÎ5¥w¼«/÷h§àþÉ^‚*.¡œ<Ô nstìàé>¨:ÖUÄîíçíV¨N:Å¢¯Î,ƒ§” ½A+*¤¦ÜÞ*“¸ižKª™¨âúZ­Å^N(˜c<æ{U”§%eEÇŠÊ·9Á>f#Hå\[’Þ–Ž(ÝíJñzá:exÃÈ ªb= :ç&:ºŒ磩¬Ô÷¦ wÜu!§Et3 ’5K¨£¼^R“ÓÔÞæÐ?¹2-c/³°ÖÚ—ÃæZÉx´·6­DצڋêX£¿î1l<ì7·̭íÚÛf³k îâ+3ñ¥/þðË_9õ«P`‡4¼á$ø!Ãa“;mkŠº‡Ì+u·%’/Ý®¾7ŠîëbYó›Ö…ñdWC)p4ïZÍpó5Ý€½paÇÙá¦s„%~ää6?ÕÐÝÞöî²¾}®Éþþû¿4p®œæ¯áKWø›×:[‘¾UŽ¿³²“ì[ó<ûëÔ~ù¶e¾wíÎû"Æ‹ªX&™o„brÖZ­5À‰~æ7ÞàG¥›_Iù[~ÈS×<…—½g—šAOc(ŸüÄL3øg>b8Hèл¼¹bW´t]ݼ“>»L·îº»Nyþž–>=ÎÓ+’C?WûÙ¦n8ÝÔÒ‡ŸÒä·ôÛGäwôý'û§3÷ÔnÞ‡vö_Gt7I9'x®§_?{AGf†k—ZmãxIÇf‘ç,Mg•'dÆVgÈ6aH¦gJLdàSø±qù²/ý¢ÖeîwmdÇ}ów€õ~D$~,$nÿ€\qr§Gd3ëb>ˆ]V¦€¥’ ¨z¬†oXk¯7†'{ˆpµ§kGVyh‚“Ç`m5g˜WdÉ6|œgqñÑ'[h]7hÑ–Xv}Ns„ŒDn\as9x<§…Xx¡uxCgf6&†ˆ{e¨{L—†@u—WRvfdxFq†uƒ|ÊG‡(ÎÐ'}Ôwƒ†–AˆÖM‹öMò7z…߆Dè;‚ñO8I H^ˆw~øƒ¶Ø43ЀÓSˆxˆƒ·…Š(fhk´÷ˆŒwt(?fÈJhÈ{jHlQ׆›ø†)xu|A”‡Th&eO8bñ6»ˆ„)V"†ØzùåY°×…Ó8{Ž(`‰d¨”(yÞx‰–‰Ç&aWaÌŠñ±W2%ƒ75r€Fr&‡r±rÒ¶‡PÖ‡‡dŒ§&Ž„UØj«WPÎúÈ…‹è…Xc©5eTÝ[ù{%|œ¸y*Øysè‚7‘"Çq4r¬È\9‹Û§mgG’ñ¸]ã—‹4#ˆ˜‘„ÿ÷‹ br7Œ07’PX’Mõ•2’öØŒøØYS´Pü86þH“‹7Ùkx†jt —À—yA ‡C)‡ @ŠÃ5(ö¡ŽÊzØ÷Šc‹e×}ÅX–U)„•Ö•»È„ç6"9–aç˜ð'‹fG”IsV9„mÇNG€ñ„ Ø™Âø™ï‡m¢)™d ¦i™ùו˜Æ¬™~Æ›(›:™ qnˆ‚óùõéGŠÙr!鎓¹ŸÚe„¼øŸ×Ãe-™oÉ_*— úui“¼ÆZyÉÊpî9¡RŸê‰êRèxŸÕIš ÊTRSwÌ ¯6 .™¢ýÆI:“Šwž·× J§— æt#Ȇšx‚ I|+èlùR@ÊnÄx›‘†RÓ›ˆ¤fq¢nÙ50), ¥htcˆ—Û¸{z£$H¡ã¸£Y|¦c*’úy¦ÚÕiÁI¢[ÆzJŠ¢p*žN:§å¥v*xú W*‚¾×§9Z¡]‡©L&¦ ’Œå¡f o¦ÉÈ™ŒªsZIú’’ê_tZt¶‡é™“ëi{š¥÷©ªƒ9ªŸwªO–ªø¡ˆÊT¹4«÷ø¨o cH©¨«x—2š§ì¬ª¥ Iu¨_jÀ…'z²|uH9ˆy\ˆµŽ`¤ïø¬D­iI­li­ái r*t•Z§»z§ßª©ÁÆ©k8¬âÈ¥UÇ£‚Z'/‘SŠ÷2ƒWƒ#0£¬ìHœP£y¯¬Šº‰•( ¯äOúw±i¯ÎZ²¦5(Yz…ß鯄°ãù¤Ë­×h°‡°!Ø{ Ž[Ê‹®D©;\–30™ã±õÚ˜³¹ƒR)¤øz‹lW~Òi¡n–V=`‹iM¨ª‡*³Lõ4^¶Gг³ºYµÊ¤@§­‰G°Ý£Cû«;i£ÂŠ´å*|åHŸ>Acú”•³hC„ËY~óæ¶QaiÁ¸`ù²dšŸ¦¶D„De›z* ·IJ«K©<;©»­a´˜z°|[£X:® ›´æ*”æ¸d:¯‹É‡h»¹i¢'™–6[¢ŽJºŠ­q™ºw ´v©·¹÷º›j´à¨&¨´çê¥MK¤SpPþòÃu¤á‘z¸¬ ²‰+²¶™¶¿{];¶P3YäE¹eÑ‹·ƒ¸¡™=³íë¸ïÛ•Páò»iÿ7o¹nøK›ú‹œ×©]'ËœVì‹‚xÀ÷ëŠWkœYK²ý˵W Á8"ÌiáeÏÉ~™ËÀËHóV¹¢+«£+·¥‹¼+ª¼`hÍ‹têéZáê·² ¸Õ[»‚y»À¤½N0L"‡oð0e°'Mür@¾ôʘ Œµ‹«µœëÁ¨Y~Š*À3Ô•.\Âë†M b¨¾›€)3À, ¢Vh¢à¹³*°¸¼«›ÃÙè«< ¬>|´Ô ”ò ±é‘/¨qI‰± r:%01 ýrR¼»Ú¬«ÚÁòª[qzm\¼2|¼ûXÃs|à :¥™ ½ +½˜ø— º´ØK˜ëú®ñq‡‰©»ʬeʾhÌ!j|Â/\­Æ{­,ÇÔè¢RÊ«T:£zºÇÓ‹ÊŪʢÊgÛW€¦”‹ÈI\r''S*w¸\œŠ;²ü{ËèôÁå§Æbli¹¬nb©Â[[ÉŽT»ܯ½ü¯qܳv Ê/Ê £œÇ}»|¬Ì{½Í¼dV¨½«w€È!ÛÉl˦¼¼É¾§ôlà zÏ¢ìºú » ›Ìð™Ê}¬ÚdTKÅÛ²µ¹¿“ Χy™þƒ^…~çJî7Ðãõ´4å!êDTéS¾âþêMõçëe ëw@ëxÞß–{EAàgprdì¥n.>=nX­ŽìòÉNê8Žë¾ãŒ®'q¢|±þåÊ~íþÍ‹b‘–nnp^$tÑùî¶^î. .s°îíní+^w>àN“~Ï:îÞàú.A^vQn AV­óÍ ñw1ñÁä-ðvO‘6@"ãLžê!Á(Ÿò*¿ò)_ꮺç0 òõômŸat€¼c!?ò—žé:Îé,_ô,ïò鯿bÑæRóŸó,°ó=ÿóË~ëò^ìFŸõ(_õ–;îõt;Nó_QïñBõâþàX¯õFÏõEÔç˜ÑSM/ñbÏ;}.õg/ò.¯ã4÷òlô×wMµqötóL΋HÈ€äôü}k.ù ä_ô¥^ò6‡ø_÷‹ÿvHh~ù(@ù¦où—¿ò¥Žéô¦œ>÷¯ødÏø¡ÿø¥~ú•ø©¿õi¿WOó‰?öØø¢38Žû’¯û»ïöû6/ûÃ_û£û“_ýÊŸú{¯}ïã qÁbÏå*±£3cii€a 1MÑáÞç"À `7@ÿö_ÿFÿú¿ÿüßÿù_ÿÐþù¿Hïßý“0ê¿ d€°ÿ!@øÿ þ£€^@8ûŸÄ€ðÄògþПúcÂýñ»‡? ÿsò?è-`œ0æÀ¸c`äòâ@ȉ 4‚CÐÞÀ$Øk ä"ž¿ô·þN† ä ,P4¾-¸Aàþã‚Ï ¾@0x– ¤dð ÎÀ4èÿÌ`dƒjðÿÁA8ÿÆ Œƒú/ –¿)x­ €{Y0ÂA(mŽ!4„„Ö€‹Àa"„‡ð>BAØá$ ò/"ÂI¸;!#¼„šÐæ\ÂJØ Aa(” ÆS¨ G¡',…œ0^ÂL¨ Ya$t…¤P–@*ˆQÀ„¨ÖaXhÀ%$†Ä"Ãbx ‹¡3¬;³P<ÃgØ —¡2œ†Æp.Ch( ±a0|„Û°\CdX §á8¤†“Pþ…Ãs8 Ë!1Ô…|° ¶¿?¸ãŸÀ…¯ð~¸}øáRá+\…ÚîÃh¨ Åa@ˆÙðþCGx">l„ß0"Ä~È kaCä‡>Bu8ýa%Ô‡š@y˜é!´‡0à)¨Ä”ˆ’rˆKt‰-1l­Ä‡jb;‰y8¶}¸œˆm¢Oœ‰)QþÅÄ—8ebJ<Ší$)ÖDž¨u"Oô‰J(â ˜èåUDIR*.E§Ø™"TPŠQñ(ªÄ¢Š¢üËŠ`q+2E®ØÓ"‰¼Ð>»“(ÿ†À °‹xñ.êż¸ûb^Ä‹Ñ/öEÁ£`¬‹‚‘0ÆÂ¨cadŒŒQþ9F¿ceü‹—q0FÉø'#_ÌŒx.öÁy8!î¸C5ªFÐâZ#k‹°*ÈFÙ(Y£ml©17ªÆ"`x£o4ºQ7Ê¿ÛxaãJœ³±6ºFܨuãoüÁq5.GÖh³"r¤Æ‘82Çèø{#plŽÒQ;Ç ¨®#vœ‰Ú‘5FÇÔØy£h$‰¾Ð$šF²ˆ ™á$€WÑ%²EØæ³"YÌ„ÛðâG²¸µ"ðù±>Ò€ˆHd~,ýq<ÒÇ™ë`ÿ˘BBŬø{á/Ì‚PÁÜD"G¤‰,‘(Hy"YdŠ\‘0²EÆÈ Èó_ìø¯Äó˜ÿ†€þó‘/RF É $­¢‹<’1’H"É!¹$ƒ¤Ô7RGÚÈ2Xy$pü‘F@I&É%Ù!å" ´‡û*L¼‰˜ʤ™<“Ia"N+1™–:›|“p²?±IÀ"š¼“eRMÎI‹'û¤œd“jr8âÉ;©'礟ô“{RMâIA‰& %›<”}²K’Æ/y!¥¥¼”˜2SZÊJ©);¥§ü”o’S‚ÊQI*¥¨,•™RR–ÄÒ˜? «ÌæTäÀWI+g¥ý ‚¶ÆÊZÉ+s¥¯¬¸RWšÇ^I,¥±–Uò:Ëb©*ã#«´‡F DËi)-«%µ´–Ø’ZNKm™-±e·ä–Û²["Ànù-¿%¸,—å\žËs)ÿÒe¶\—ä^jKyé-Áe»T—îòZÒËiÙ,?¤=$ƒ]PÿI0f œƒû¯`̃ Ý P˜“arÁ1 ¦œ˜m0 TL‰¹)æÆ¼˜ÓÿUL"à0¦Ç„˜°_ÊÇ, kÀÉT˜°e¾Ì…éÿZ¦Ã™13Î̈Y3ufÆÄ™=SîL‹Ùÿd¦È¬˜Óhö? ÙÿTæ³Ì„>³ÿ©I5§fΚþOhÍ­©5¯f$t˜U³jzÍC8¹&×›†pÊ¿°I5ѦÍ)›f³kÍH8ÙæÔLšQ“ÿÅM¹Ù4CÂ܃#ÑC®L{8 û$Htˆ“ÐONŒX!çEˆ‰Óp>NŠøý$ƒ„j²pÆÉÅ 9+§ä܈ sFÎÍ99i€Ó¤”÷ptÂÉKèb"tœàÐ+ÄÏ™[§æ\ÚPvªÎP™:¡íÜnòêNÏI:Açï$ž¸3v²ÅÓY/§ Œ•œ“rÖNó=]'!4’×±z²NêY:·çutžA@túNî ;â$„žR|NÏìY:™']T‰r"ÆJD9'Õäüì“{²N Äû'ã'BäŸpÒ Dì‰é' ”ŸæÑ€ŠIûiO¥› ü€¾I÷ià%4ƒbP•þÔŸŽL}ªO? Aí§òodÔª*>¨Õ :Ô‘¹6ª¨¢T‰zPªEmС P? /ECQC¦Åñx<¤WŒ@Q(ºT¶8JQ*UT©6Ѧ¶ÄBÊkª„œ©=uCþÔ”ê‡ã)Õ©úñ¥BÅ“Š?ë'™¼“ 4L*J¨Ú'…¢Sµ“Tµ^Uˆ'£ê¾ÒŸü°«6ÕŠUѤWMKRˆU­JV¹êä¥J“ÿÅÕý7Wõ_]Í6ÓBÊÕ¼IWùª]õ«x°¨‰5‹¦`½«F±æU·é2ç&Ùô¼`ŽLÉZ1)+Ä´¬ `&ÔÊJ'kgå¬`г†V¤©?ëe5­™µL̺ZÉàf=­£¶rÁ‘ WuæE½­F@(ÖPˆ[qënÕ„°·æÖß …ëE%®dÓ¸VºéX ¡qM¬‡Õ¶æÖéª[O¡^í«šð¹"V^ê=‘#ëÜÝu6 O¶ ?ií¯ç•Â^e#ø<ž©T¼æNòš^uéõ,èU–ÊWåÉy)žÜ“ÿuNX69`Å䢄ŸöNX›`Ñä‚u°sÒ––É{&)¬™´°¶ÁžI«J`l‡…°l’»ÖWï:b÷k|•í*”Wõ:Í+!t±-–Å>ÏÚ;O¬Š-±(ÇÞXýšc§Œ]£?6VòR0ˆ¬‘Å GÖȰd›ì1ÊJYGeëÍ °²UHÙ(Ëe™¬—m²I¶Èºfa€“u²\vË ,ke±,–U³]öÌ2Ù2‹dŬ‘M¨_Ö˦Ù4Ëfœ›¥²pÊæY0kgÅl¡U²ƒœÅ@Ûg¯lŸ ´5CΦ'¯¬¥µ´&ÓÿùÉK{i3mÿ³œ €ÓbZ„©ÿ6­¨;¤6ÿ™ZQS­XµœÖÓò?XÛi]ëu-µ}òÔ¢Ú;Yý¦ œ^²y*@l‹­±=¶6 (ÛeËl›m@¶Ð¶Ø:Ûi»l£­ü‹¶Ô–ÚF[l›mí¶…¶í²Û6Ûo‹lÅí¸%·Æ–Ú†[o‹n¥­¹]¶C¶?ö½y+ïŠÀ °·ø¶ÅyÒ´Hoéí½ý·øvßBųØoë-Àý·šT“ܾwpnÂÝ wm6\}ûp•âÂuUùÖá ܤ(ï:î¼Í¸ÿÖ¨VÜšxq'n0‘uišÇÉR4a[r|› Óæ GC¸ ¡ËM‰õaÚ¨)#!þ‹„° õM"  a@(|-3] +t ký+ºF—¹.]›ãr….Ë ¬2·ç¦MIu_îÕµ«™ð:ÂÜ„ysicÀÌ’æÑ¿jÅ,yAE; ®iC¦Uº1†D6$#Ÿ—n¦G ¨»{×Ñbп{ ³$j¢í„íY`jT/¨€mpWÈÝ5Zwg^ÝÉ»{׆ðÝ¿Ëãrk¬7ƒ×^P±x¯€+²n׈ÞE«8w#ï$¥¼v—ïb^ƒ—ya„WðYÑ oéU½m˜QÉkt!¯¢…ŸwöÖÞ¼Ëy—ïàõ¼Žöðò^#ÀKà ¼¾9Ôÿaßí‹Ô¦Zå¾××ú‚ßA)~Ѥ„ ¿ÚwüÒÐý§~Ïo÷M¿êMžT–JâÌŠø·þêß§p÷ïQ¼¿þ7ÿ `ÿÛí¯¦ Àx+`à0°>ŠþµfHà9­*°ÁC«¸Oà | ;pÍÈÀØ[`L‚9p P‡ xMŠ`ƒg‚KpNÁc»à,ï`°P\Á}o»`üád0 .Á8‹à³¨ƒ90Â3¸¶f×½‰\+Ž®ÀUìÍêZX÷ꎛMØæLáåšs­pq}ÂU»~a,l]ëÞ®¾pÆÅI)l[æ…v³¸a0 ãp^}ÚÐóV:|õð6›\Øúá1l6[æ >„xøk*€Cì„Ép¶›J˜sMCŠ@%¾ÄsØßBK̉+ñæÃ‚øwâL\ˆea'æÄ¤˜kb›sŠ1ñÖÄ’°ËáW\Š£°,©xkÚQYÌK÷ä&½“±Ò“R`lóg²Ì¤Äø: cUšŒ‘ã2®¥ßMã9ù‹¥q1¦ÆÃØüãÙøŒg£+E޽3ck¬ŒÅ12&ÇÎ8ÂnãVÚŒ¹±9öÆíX6vc÷Ïä4f“ÕØ_c|œ7ì:.‹ï˜£ãÙ8dÉb?¾¥Å8?æc„œc"+ýŠñ¸,*äƒ\&;©A¥ß˜Oäq¬2U¤ÈIá!cH\‘aÀEªR©‚Eëq%KÎÁGÕ8ZE©’sêÂuÉ×§E³ˆ_k2ǽÉõó%ÿޕВ[§U”·/'³dMÊKyœSž˯¹÷6QÏŒƒ‘ph¾Ì§¹4“æ-šDis ¶Íõ4 ïÂѸ*Qgô“­ÓOç>™œûdt l?*g¯ˆœ¥³s¦ÎUµ'sÅéÌ«3SäÎ<Ñ;sEè,ï°sœlÎq’»"Ò!*è²{nÏ4ÀÄçùüžë3}žÏé&?Ýõ,w÷³~–¤ xþµçížï³|®ÏÚ@_^ýœn4ƒÞÏAÓe¨ %4|>ÐøÙ?Cèõü ôz¶ÐC#@ Cô‚ÖÐZC§^:\•f¶!-ºE§%2—c@¾½¿1úÇý8Œlˆ ËwÆè}–‡ôŒnÏqùFkÚí£y´ŽþÑs9Hû?#­£©´ A€Iúßâè—פ™ôŽŽÒö–Ziç¢tÆ·gyK÷èí¥¡tïÕÒ)S8ÇCÁù4kì%¼Óx:Oëé=ÝBí4ŸþÓ€:P÷iAM¨ õŸŸ†:OGV€É¨µ£~ÔZ³–ÖHM©+µ¥–Ô—:SkjJÝj7µ¥îÅ®)TË€`J&Gµ©vM,UT‹j=©ªGµlÕÇWQžjSªgµkbÕ¶úUÛê´ «ã^v´Õc!ë)!aµ¬nÕÕñW·j\­ª9¤œ¶lø}ÚÑÓA­ƒ.®Ö:[ŸŽi­­­µîÖÛÚº‚koÍ[Ç5·®Ö×›kYˆ®­õ*®í:\·Âxý­Ûõ¹ÖÖwx]Ïkp]¯»u$îâØ·ÂXØ e±%ØŠøl…hŠö,Ø ;;lLI!v"ÜÅ{a_l8<±óª-ŒÅ[NB±o!–„'{–l” :5¶"Ù+[eol‹ý²£ðÇ–Ù5ÛdÇlQ˜²yvˆÙ3[gíCoi©76Ú™iE¥ÝJî?ö¤¸”içÒWºR12Ó^ÚU;igíYºµ›vZÉP›kûD!û¬×pq¶$ßĴͶ-Ä@fÛ"9#·mµ=·áv=fÈu›nçí…\&ÁvÞ–ÛPaÈîí©½·v×¶ÛQûpnÂ]¸éqØnÜ^{lCn­mývÝfܲQíŽÜ‡‹7÷¾µ¾Z‘/Üνq?·ö-ÝíDt×DÒí¹Ý"ènÝ¡ûÖæ?Ômºû& ø›Ã>úËkKdÉî%1OïiU\S (ÞõD>GYå}Q×hþsÞSVïú7ªg]fE ãfヌ{×h÷Ю x‡o¨p¼HùÖ²FÀï\Ô]ÿpoûnÏ¢~ëmtéw°ÑjûÜ»¿cÀðÞÁ{moäí2ûÞE5àFzCï齩7k¼Þ÷V{wÜïý½Ç÷ø6ºEÀ|gp«¸¾Ñ7ûŽN8Êoù]èw Ï’÷ûä¦p“\¶‰³³DÃ9¬˜œá6\ˆw_ ÎÃ÷äÿá„™0qžgŒ‘8Wâòù‰¯:'Îăx÷VœŠÊ)>¿xgâ\\‹›ñ·ØÂu÷à$¸/ypkÅ‹»¸!îK¶Ü”Ûâ å:¾’n¬ŒÛs|Ëñ>Çó¶ên't|ÛDÁ­,eúæEüGKòHNÉ'¹%‡äðkAG~É;y%ÿä—<“Ë,  '?å ü“‹òFÞ+¯m*Gå°<„C@Í£]t¾å’ùÕÆáZ>¤q¹/ï½qxHi,ýËqù.æ¶<—+óÞh7‘y‹þåÄ\2s^¾Ì—y0§æÅ\™¯M»IÍŸy5¿åq˜‘#G?èÞ±;ÚJƒÐú=§®Ó5¡t~žÐ½ãB‡è¡#t‡þÏ1úD×çk³¢×HƒêÑ5º@é‹ Na…j7æJç§-ÝÖ¾tˆ‡]úÞdélÓ¦ÇÍת0k:œé==¦«ô›NZ}úP›8=lVß7¨ÿÞù€mðäž:þ'àšº•¼‰ðxXïÁZëØêï<|õ‹*0¡ìÒÌç³ÛJæ?´Îÿ|¤ÔÔ"yÿÝH¹îÿnä;’ý/5ò¿ìÝ{Ñî… pPÝý'yaŽ<„õoÇÙh‰Ø©/=¶ï3"¡½¥÷ßS—•PTlõ¦¾Ù{$TàX}ÿiõü7½zgÇD€¬ç?±>TûÃ4ëüh&L‘éÿÜú^‡ëzu®CɺÎÛߺooë]¯SuAHÚë `/†„}všÛ# !þ Ì]œrä¨oO®lD½¿ã(&v—Ëìˆ,fˆy~GÀm mš%“‚›l'O}A*Í UpßWÂ÷â*dðŒHÌ£B4 tšô^wé;Zíï,¸¾ç÷ú.àñ;ÎÈïêпøýþáð»}ðÈwÿÎã²w›LKíý¼ÙHÞ-x‡ -:@çß1–¡ÂSØî×ÝįíêŽ{à¾*!Ã\…wà\ÅPH€ ܘD DŽßñFÁiX>¯ãy¼‰p"áÇóx¬àï’|‘7 1dÈ+ù±Pp€/ò]¡ïõ'¿ã»‚äqD~Çg…NÃêÂ|EøÉöÊ‹yàš ™Ÿ.Ài0%籂•7ÞkúT I’@(}a Ô¸A—ÈÀ%g>Ì _O¾Â× „ÞÐ'ú4à(‚ÈE@ЈHÿæ€pà ´ pé3}Ë AÌ//H½x5.N „/ ÍK¯¾ÆÕúC¾€¬§õžHÅ M3æ€AYe *\ZB & f€Y{À$å( ÚÁŬ#ž0tÌZsÈ~4:X‹yè_ïˆÇ¾ÒÌÐZ8€à,‚0€G (Rÿ8öÀÉèe+|A8†Žié†L—µŽ„I9aÇTÈB¸Ð‹1ì¡~ø„ A†Ã³V k’Fäp2;dÃÉFG#-‰K| Ξ˜Æ(æ‹D0{µ˜Â$¶ð…1LÀ A°ÆEÚ@‡JdƒÉhÆ9‘Ž3°ÁH˜èD6’‰†rüRf4˜/XÅcîä÷dž9Lˆ X!ƒyð ³,ÒL\y-ôìÒð^t„Ùª¸ÆJeG™ƒi¦V˜Yއ›Œ‰K-ω’”³³×Li/ñ—cÔå0©¡]ó›É¨<Ÿ ‚j’áš Èæ6?éM“•YQR{@PN¬œÓÏžíç/ZÐŽfC¡%}è>+z·>¦¦!H胖ÓXamh!MjB7{3ª³L!Ž‘$IÿÎìÉ!?o‘-Fè®'Ë´™‡1v¶Õh7¹5±Ÿ:åiö‚§”NšùÔº^h[œm¦ôtDWÔÒêæ&9°Ç<”ÚÜÆdÆTéžkìÄ´uY l¨Cv´:P‘&ÅHÉ*DÍ€”8¤øNŸ;8r¦°:X 32Ë!:ÈÌh^}¥ÌPñ‹“àdÉ^ianÚ£Èăœ­e­ÉXs/ˆ^ós]F™yX9ƒ!øò”}Wæ:›±ÍQñðæ|*ãÞ~5c•#‡ýîË3Ë<eo2™qºj ^¬ Í¡bÀÅÑ€Áù˜•Ž­ÚõÈ)î™±Ýâ<×­/c`Ajm¼ãðÞ].w¯Â îVÖï}¡„$¤ü{‚™¤2‡ Ê¡)DeÐ7Ÿaji mÈà ‚50ïnÀð žœ¾É¼Ýízo;¼Ý€÷—÷ëa÷(SÓ1°‡4}×-­áqf{ÒÏ'÷Êwv`ûßk»†æ5açbøîª‡>ÜOÏÝWj³“såg~7ø%2,r‘>mYESf4ðW( Óô¤ïòV¦Æ3ejþÐukݰë¾|qƒ‚\D"!˜j@ ã1 À%C2Håvn2Á%\nÒwòv²'ÇU€s€÷’€P'\¡$#g 3å"”ÂR’D€€2H•ÂØ¸ˆ}]"‚)8€ër‚“‚+øPà.(3n²€4n^4ø%Pà2S ’¥ÛS„É"<ø‚!øƒÈMSO˜(iЄ[Æt&˜exàK{\Ø’,\h5HQ eÐ¥Vc8"ju2‡é¡VbÐrè"jÅ|ˆ‡ €TͲ=ƒxj\Á‡{5³‡xj#‡á®òˆ†e‡t4‰­âˆˆHGqØ*q¡‰•ˆT‰òò(ŒÄ„ß–õqvÉó;ôqaî‘3m‡±ˆQâPP‹g@"»'ªÁ3b)_@yrásR%¬AÈXS°Œ’]ÇøÉ8ØØŒõŒ÷£,epþ¥sðfõn£‘„Äõ;ÍòRÂŽî˜fX%b`/e@7b£1\Ê£ü襎é³íatÙ‘"S!%òXŽ©ýXÎ8#xÁtÎè"É9Еd%³<;SEÿÓ0">ܘOâ¡@Ud’ ÑgÀt ƒB*Ô,ykx$IÆb5@y#w„kH9i)£QR)–ù’È(“™%”qt bôe_óH–aÉ•ñS!”(‘“¥ˆXÛØßHyQT%ã‘H·Zp0O[ 802 Hôa€9€šª)·åš•!›«©¶9¸)d›4Л™a›‡‘š¬9¶ÙÆ9“áš|ñË™2®‰Щš3КaÀ6€›3P›¯¹Ë©›¯yÜù›¯‰Ü9œaÕI›È¹žÛi6ž)‹Ê‘_0A2 DN ÀY3ñ+Lzý1y¡‘ ÀœÚ¡M:£1 9ôA@g¯!~6êŸ îAi@10 Ú'Øá  *¡îe¢ÒcÁªa¢­9°–&Z›E`  ²3!ª›E@¡¡Ñ >!ú›EÀ¡H‘3 :ÃY$Ê£=A:Š !êY/@j¡0A¤4€œI€¤ ¢4МIð¤JÒé-ú¢¶ÕšO0¥1õÅܸ¬“ŠÍIw`нádѲ8 Žb}Ò7=ÛšÍİüеi¯É!±gÀÙ³ºIµ©oYK³¿Éµ2K±°C³Ã ± [,ŸT±=¡0Ä|J³Vz³Êfå •ñŸh`x_w³E‹·ÍÙ®¡R®zx+Ò„·k«<º¾z «›®Š¡:ñ›„Š·Ã9#c¨x¡åV·ÚYÚ$ª³ýéIš©|ÑœeAC‹³ÇÒ™¢|Ñš3J‚6ʵùºí Bsºº‰uÐ $Q‘ §û›¶øº<ÅÃiª¡Çn;y&{ºV:¹[£ýÈÙ“y@¶ "µ5I¹Ý+s–j§J¾­™ª¦Ý[›Àȸݫ›ià¨äû›ñÁ¾AJ©ä;œÙÔ¡|J¾º8øK¾VÚ’$lPuýÉ3²n ²«Ùœ¥¬;³šÒi@軚­ ¬¥ïK›3“̺y1AP̼­‚J’«9œç“AL‰¡¶¸À $ÜŸ"º†º³gŚ͉$ tª¬)Lp&÷BÄn*ŠÚs ì©›ç£S¡1+Dl¹V¡3"Ïˤ3Qü¥/P“ >¬i¥u «î™ÆfJ›ÍŒ¦JÇ<1z ½ý)§.Ì¿4 ›ñ„‘3ƒl¹{‹¿«¹8ÈMª7´¡1SL›VjŠš|ÅšÂ\Íɲ32øFy¸é×…ÖŸž:YÀ¿£:Tð.˺©% #Ÿ:ò™õ¹Smà=’tš¾¼!À|—YE"^º2!%m ˜7Ò– `“Ç1𥩱—3ù—Æ1fXÎÚª!š¤9OÓ“ªqZi”Ò0(0ÌŬDâœ@älæè¼Ìë|ŸÄlÌ?„ðlØHÏ ÐþœÎÁ|ŸùY/ïqÐÔH—òÌCO¹}þ¤WéG2Ÿê,’Õ<`ÍÓümÉ5¥-ÉzÉt|çuáõmŸŽù8"7½9#_ ÎÆ%=î‘\=MÒa9HÔLI” bÔ…¢$ÙLŸ¡©Ô£ÒSñ;g0OÐ5zÉg^5Oè|¶’YÖ"ŽƒÎp‰@/ÓDP"‘–)AU4O#1O8Ét9D|ð#Õ¿UÏ$ÒL×ñ(ÐX.BØ5¬”ˆ-% ÀØl ‘I]-s i­×1m·E|·õ×¥qÔv5t:bKš=OœÝ‘æÑ×¶ÚZØ¥i#²r˜Ù?†Ú*d63R#ùÒdýÐ;s}#äÑ­Õ¯¤#]m&nH"óTÜi]Ögý—ÓöÓÖýÖÃ5gD×[m×i×0ÍÚnT{a'ÚØè\Ù—MK©Ö{íÙê °=£=Õ’dÚ¢Ûª}Þ{™Þ =€±½ßîMÛéaÛòÛ¸ Š?æÛ4b# #Ü»õÏ9"Çͬ}eÌý;ÚeÒŽçñ# ó+ñáy‹¬/¸FîãkºÁ+ §.ž0óÁ1|øH 1” Ù&¥Ö÷/’$€85 øáU"-AvåEdcãUé½}!B'hKΈg•Wn†Ä'å§e4×÷/Ýâ*ò…![äÖREÕ¢Ö¾"!="§µ<àÓS1ŒÿUŒxì8Лáf2Àç~®LÜR#Ñ2p9à·µxf:fÕÖHm$—£ç´CéŸd-T¹“qIÞ«œZf#⣰Ìèr!§`ž91 }ë3öÒ…Ôt454a¡E3^Nå5§àê4{ë€%3(sÊ-À¯C0À}!íâÜÕ ðå_ëšå!¨(@‹ÊÄâL q4|¨ÄƒìʾÌîìí±Ní˜ؾíÙÎísÒã(36±¥ã^˜^meÖG83ðó¡é¾ÓéŸ^Gr¡Z¨õŒ7@êŒTÈ“ê·e[]Šh¯ë²~]´Á¶Žî$rå¼®í¿ŽîÚåßÃN¯ć#1ì^`î.Íþìò>í}Qíö®í÷~ïÝþífW[ñ?Jðå~îQ³ *óÇÑîïŽóÒžó<í>õúvÞîï¿1/;dÆG›Ž–—Ž™n^6Téñåé?6fñÞ;ñ5Pêêy¡êßêrë?ëRë?†ë&ßç(ëÀ¾ò®-p/ìOOóQïSOïÖþóXÿ/ûîíÖªMh‘Ó$î£øªu[èÎô“áôÉù6ï“óT_ïVï–ŸõünêÜÒ³E’÷õomÿðrÿŒ®S¶ŒîYµµè43‹8€Zn¯ŒÎü4.G4F@öo¯µ5üQÓ³ÁŸüÓÏ,.;×þc§Õ¯J/,ž¤¢²3oö“ŽöêG< ßöt¡?÷êã[xÕq<¾÷ñ´KÈS#ïûåº]GøüCÊ«r¡&=(>iÕøbÞÌ[v«OêÍ»ûf_¾Ã|Z˜Ï‡ôf@Pzé®é]ÀšçnžäÛ€0 êy@|·B2_¿³%É¡ üÞ'ÿæCÁ{ƒfq¿hñŠßÑbtodÊÕ²æGhË#é,ŒŽ|‘¿DqþHö ‚5‹=}?šPeXt9Àg‘¿ x½Ÿ÷ò~ÅÏ„„€D à´Ò 3k3¸€0;õ£‚fð Ò…‘ SaœVraÊe’1hþÌ`ú3wi°ý…Š6HöÀÞüsrõÓÑAü§¡:éïîe<ø  yOä¾CÈ{]0œråMÀÕ$ ×%d.°õeÂØ9!гÌ#†½hØ {ŸÂ³ÓÔ]¸äž̆púÁëû8 @âðå‘ÃDh`°‹€Ã®? @Ç—ú*a<Ä„0PÚCmôˆÀpEéÑCJŸºC}P/¾@G7¡ìã„A ÌíE T(¶Åô-½•èVV`䓇!±ÞÄ¥k_âk€ ¤}HðÄÞí {5ëA?pž_gq{äËäêç³`ò ‹cq Z¿£ ³âªú~Y-R?2¸3Œ!mA†#A º?fÿDá?”† ƒí]’¬HùŸ©Cˆp!º:oØ a|ˆðä9@F!“j‰KovDxx ]åëyL±ÚÀÍWW’ƒJŒR.Q¾Ã£i¢H ÷0Ö¶ ë`( }NMj E>DÝáfdžQ‚Æ(C N„1@*REh]F?ì0.ímºª$Þƒ …ñ Ú½„Øõ^C,€ƒ0"Àq¸)báC‡•‘ÿ”;Ìó|cL´„Ð5*EâùiD §‘= E˜¨úàãL|}6‘>’D8÷¾! HfÝuÇU¡{ì18ÖÄáH룷;Ž2@9†>gÈùa_<{ÐpÆ:A"÷ã Úñÿ%FïÈýD±˜÷°¥C4€ò1NÄI)_K|NífÊ$é—$½œ2T–#~é!%Ü eÅÏ7¿UgÄ"õ{PÏ”1M§é0s¡öKtYf¨ð·©æ,†èoO&Ã5øþå©Ô "RU⿬ØV¦6ìŽ.<Ö3[ #qe·<•ñaDÙwf¼ì™óò3ÖËOy/wâX(eéÕÎ`ìàåo”—òGÎmßâ‘·‘Üñ„ ñ›ƒÔ”œÑ\ N ù$ùNä-J- I8$©\–¦²Y¢Í’¹*AÀâ” ÊmrÇ–Ù iåC¤›RÞÍÉø-õ¦e,v¿’\†Îÿ8:G"¨\— Ü¹ËÆ©'àŒœž2]BÉ|)%['•ì—d¯WÙ–­(¬¢`f°-î-Ê,I¸O@“U“-†ÏðǤŠà˜LŸr}ò¹Œ‰'í"Ì‹}²lŠÌè ©cíŸ]Jw.ÊÞ™-ç¶´›‘qRZDã©1eòÀ±SKœˆ‡æ”„ŽÊÒ_ÆÎ‘é,^@txYqq*ÐkÉ@_fx|‘Á2–C¼i3¡z¤uÒoZÏ9,Ñ% ׃Ä½è©øV¢~tœéäí”VM³ ÆÏ5y%Ã_¯Ú’øÓí‘Iþ 6¯ŸØ dSŽºÎ¿h@ ¥¯3X/QZK¸ÙBå¦c$ÓFÖPuØh@ ?™QyfÐ:8µ'¿S ÷Ñ4âÆÅ‰JSàé㙦Ÿtƒ“TP>ËjÅç)ͤՒerC†Ø"è­Œ”¡´f¦Cœ‰ÀthÂq—6Q8D‹ä»¬ž÷”yæSÒ *£¤×û ¢0„šMÙ)M(¡uX“û©PX¹Iy';õ0†ÊÌ\ICçéÞ,¥9ô‚âR%ú3gá ¢ŠMÑRÊ©ç-ý›¹´¤ÂÆÒéížh΢.á'"Ô}hE&÷äSišÒ;¨üž&„‚~DU™V?3z5 ©Ö¼ŽpÏÕ6Z·)¤!s„дi2!Hˆ2…›a…rÒ‹Ú@3*ðܨñt‚Þ̺ªÆ%…œ”‰GOˆ wjU,šá”dŽÓ‡j#*]x•šT*ƽ‡Q_èY¥Ô[æÍµjû¦H…©$µyÎTPKç,eœ©ñ¥îÐÈ:PM*åì¥fârN‡ü¸=gQ„¬øtBêÓ¹jO'Y€t©u < >(%…–}5øÑ.tºߦE]Œ…un>PxšX;ª”€¥ô”ÚÓ`™Z%§+õv°”\!NʼnY$@e®UµÔÂi9­0µ«²§BU½0ÀìçƒjšC•|]S£5'ƒzUª¸P~A¿ ½Ì+}µ-JµZU>‰UÁ©?§UmBTݺšx+bd¡dÕ… ×w*<‹+ñ\¬64\ÖÓǺY›köä¥ÐU¥úS—ªJá*+Ý®Ÿ_þ»ƒê=ikѯra,ÚWôŠüv‚R…šHU'¬Wh 1çkø#¦I3ü¹Xlª1«ª#å¦ÞT€ºS¨b·bYä,nÏÅÞN0ÚaÀ#‘±Œn2È‘øJHÝ%yG³´ØkšC²©Õ“@6ŽfU…©(fÜ,)Ê.YÔ4ñnÀJL±PµÐXµ1 )–mšaðÖ°§Í"e{l]ܯcs/fÕ¼Ufíç9Í çsÏ¢09 `ŠxÒrʪÉh1¹ŸÂœç”^½‘x0½ìŸý±WUÐúWèx[É)!³a•¢ ÖYYV ëpm°3ôÁŽRœù j)G ¨>S²ÚË*ß@0%…yµ„D¾z2Á$÷3”bõ·ÖV»`ë&qµ¢Ô£^JvHaqmà쬓µpæCðú:Eh°{UÀ:<ñ‰lU­o]§À•Ù~Rné`£íqvmu¹–Ëìê\1, ø„¿¶T~Û†:lÅ­$¦ã3Ù¢Ûe«`×-…¶òôÝ*>_™JßêõŒ««µ8ò»ciYKlB­­ZµÔÛSþ$¦aL§çv°~ÇohV_­ 5²VÚöÊWm±k®Å¶»ÖX¾®| ;÷mÅ­Å–ûÓÛ[wçÀ¹ŽR£"V„«V#,re¸íÑáÆT];9e.²ä¶ Õ¶Ø~ÛUY%‘~Wä¶Ó’Ë`O.Í,º¤Ô‚6Ü‘ja7è> ¢êb\›ËUkg‘Ý hÊÀÆÊ±šn n̺(×Ý‚Käêòäíò|¹ÚÕ³=è o F?m—FÒ–v؇ûa¯ 4¨ûRíâÕÿªWlÕ¥ ëš[Ÿ«uƒ«Á}¶y7áîÝaÇøüî*Õ¥ 6èUVÏg)Þèã°J—³ÞlËk»+îS‘'Ò\úvYÅä´¦Ô½v'¥Q ð,X ¾NÚ‹y#Þ 3´ºuøòXý jù«¨]¨$ÜZÞÚ©0w+Ï=°t—àzÒ»Ën‰î®¤ á’š^‹z/%íRgfÖÅ»tanÓ}¼8pvì@ÉÛSµ`y݊燺×U…Zn £m‚Òj/àW>&i™*ÇÈ[ä‹ä5Z/ø^à Uý´`6Ô‚ÌQ(+/Õ­7€¼ªÌÍ»@ìøºå7ô‚]Z [î¼¼õöìò;|ËPUÀó¬B/ù^ù(W€eRÒ2j5¯èHˆÀßÏÍîQ9I¾€0#Õ¦Õ7Ðn`ì»Ui'5ôM8ë²Z»‹‚® >¿Œµ‚RÛ±‹Zéí…•ÁÞnÛZ\žúûØ®¾$uÔùØï;w•-ÐÕ–]wfJP0lt3¢“]¿Œ·ýÒÞ’xSb»Daó7ö–]¹*q/ä·+^tà =ÖÄ9Tƒ<­Ö ›]Ö %ƒ„¥­®3êV”‘`(“p Ã “A“ˆÅ,Gt°Ì ìSg6à"LD]t'г”ÏÊð„¿l¶ ³ý+òB3{ZÙdp±Ý‰üeÙ†©hÿØ,–¯çÐvšÙWG o‹‹Ut)ÃÓrÌch}§°xo7i:áZL[ÈÌšRKÁg\eQ¦4^±›Å³\cßt·ñ#í¦bÖ ö«‘pi»• s#¿àpå2ÃìŠæx©Òbƒi‹Íkö’„Oªdê›»ñ7¥Â×ßzÕšTµpÜ$¹®6sÔ”«pAÂvÁ÷ÚÎÞ˜kM"JTœÎö’]M̈ƒ¦NF<8¦Š¿ç‰½Ám2.:/H¯øl6æU‹îhi†ç—< ;¦´ÿRÔ L© ?©2kêÅøkà‹,u=0`ÔÈF$øiÜIAr³¡zX±ÎÚzqý]É÷7VVêjk‘¨ËUÉ1˜ƒÖ_:Zg) 뜽QÓäˆk“Q€÷(^ð¡1ôdÛSÝp¸½¼(#âù²l‚Íòç…µ_¸x†áp™#ݲìÍËXè…» ›ˆg2 >ÃzYÄêËÝ‹‘§îW¾¼&ÒÐáŠús·nHv¶˜ùëòaRÚ–Qòé•©,Y.KWüxYëòu}Áx5‡fÛû]5g”ÌŸÓ4'çMš]kêL«s*Ö`R›kÖÔ`UÇëàYƒEþŒ)¤ò,æÎie* •ß±^Ê 6§ç±x”)²V¶ÈBÖ1o_üW?ß3µì¹%¸îžàÚ‚u³fîÃPþ’áL|š©sÐL»kø®6fÊ+l_ó}ϳyÕ~ä K ½°†°¤éÞÚ»Œ=4MíµO7B‡×ßן+ÊV4Œî‘`RLþºšDÏ8c²gæ{ÈFñ÷³Ñ9=wÁúÜH+²æÊ×5WÒKÒ*‹,eЖ™üzè=| y3ò\ÐÖ¶D×ä =I³uÕ¬Yâ¦ÞÇË=Iìl½¸E³EïÜï£ß,l‹bPŽØèË _ ÐÑË—ÎrŒcž •Ïi(l¤!éõíÊzI;Ä"Ó&wáÖ¬Ò\†ô–.¨½¢1°fD­}?ðÖ q8CCê ‡q³×¥Ò šž:®Lˆ7õs}Ä¥AãFê%“Kõt>Õ…ó¤µÞí¬o)t«¶ÐÔpãMfŒ`¡4‡žÔ#Yï¢_äº9=ó"&Ì'ºtõÄt5‰u#©fÐÇ\ƒÊò0gÖÀªNÒ^YQŸÌQ×e5çÔQº ƒÞ½–a^؈À9kiu]8q²{˜Ä,÷KÓßϬœƒæü`ÍìÁ=8£0zR g)*à]aÂãY Ÿ!Hé†Ó„Ãp °¡0d¥dmoƒÈ. ¼Á7“²C6;sÜÁ;€zr‘@h@ ` ´AF€z` @? €v`> ¨ƒ;àÀAxÿ Pm`µ±v¨OÀƒP*A`à°~€>áôƒ>0¶@< Û €lw`@ÒïÀ €¸m xÚ@pµ ÛP[n €ð p?àÜÀÁ>€Ú`n ¹@=ÀŸ›øU €8Ýàü`P¹€ævßãs€° ü 8à€(m€.7`Ú·íVÞ`|Þ}´å88 p0øÛJw@”78ø@|ÀÐwPÞ ¼z€”wø@í°¶Í·÷†Úø{P_ž¶ø^[€€ÒmøÁ¿ßdÛwØ ÀPÞ@€¾60˜G›i#€?°¶C¸A@xƒððœ·æF|n€·0 àá¬m00wÛ øƒ§Ýz8^j_íPÃ+w8Ý Av÷Ó.À@q„8ôÆà  <ƒ|p’·òãA„Çp¨ðÁã²àð€UxÀÓ> …‹ð>wƒî6Ð þÁ;Ê·pò À!¯ã‰<ð𹀇Óûdrï}€ãF_ûi€Œ¸ò&"œXn÷m  Üd„rWº‘Ùítàè°Þð@•³r+þÊ™À5xî ˜Pª ¨ÞÌpfº—@ ˜^@š3Ðp6/ßÊ{•Ã|p´›ù7xÞ@šc€À €!Ü øv®È 0 Ÿpë=¦7<ÀÞÈœn¨ ÀÀ;€–x¦78ÝÀ˜î£ÝбٖåÔÛz3€Êmê¡öàcz|YµóÖðsP¹9À‹/¸`Ì›r-øyˆÏæ@ð0м)ÿù çgóÊ;ý†ÇFd+ ø9¨ùß¾¿Cý£mÊÿÀ5ÀüTnðíkyGóZ`n0P¹ À·ÇåÍ‹²ýÉãþg§Þå`n·ySn޶ä ï#€ȳ×_ésœ¬-p<÷\¨ƒUNý?`÷ ,Ä¡6¯_åMþ ƒÓ=À ¨ø¨ ðž xã?²?mÞëÉö ¾dõ°ÌF6Üõ#nûoÁ7Àªÿ,ù×ŸÊ ðêãÀ p€RïÕ“v`Ú `þ€.xãŽÜóƒDpÁåöp¾€œÕŸÐÁ3€L[ `@üÀ˜Êà¨~>À XdWê„]PáPÿ ÿ@;à$þÀ7ë-[áwÐù@:`æ}à @TmÒg`]×»Íß@ð€uµW¹a‰ÔÕ!w¦@àoî: Âý@ÀÕ@-wHo€àm»`½™\TטÛ ¼qÞ Æq €õ†`qðÏ) ÷üÀéFlx“€ØÁ%ÿ]€GðÿÀÜÿ@0pµ "œ ˆýÝ-P €ƒþ)›€< Œÿ€( Ìx`ˆfìp @‡÷á{À7àÌž€70 H{cŸêò ¸Þh{ P¹a„›ÒÆÏÕwÇm‡½!(€¿µp£à×fþ!{µ ËÁ³àÑÆÏ}çž½G½ao': ô‚d?çƒQ\.XP¼à÷¹Í|Ö›4Ö ƒJ[ÐtÒàóf•Ûz'ß]ƒ@ü vªŸÀtjŸàVµÅ@@e—Õ À и‘ƒüÜ#¨´£A×ÉÀ6Ð’ƒ¢ÞäV ªrÀWGÛMz6þ6Õåf 0WØm‘€ÄÇ~n¸[*pì¡ÒÖ¶å¡;H¶ánßÀ5 Þ}n€ÞÆÂÑvLº‡ã-vÛ7Þ wê]KØð‘mÐ8È‚n7¡ÀéMoÁœŽ·žxÅF*mècÞ†½e Àöx>m_ìFpÿÀ'àÈì#ý8ÜÅnõà<  øüc÷è?tÂÜ6` òäô†Ä|’aÂ8?Îmm])>ºvl!OÀÐ@‚n¯]`Õ ‚€$Böud›/@ ì(äspˆ¿m>C–ŽåO÷Úas€)÷ü{À)AöùáÿÔ=ÀœâÆ?êmI$ ¤‚G¤Ý7àrˆãDGEÎz.'0âs[äühàrQÜ ñÙoLÛùÂesgdæ¨Fr…wÙ˜FŠoUÛæh6¾x‘¢ð&Ë™}À](CrŠzd—Íù‘¥£Ö¦Öup²0Ñç7@½=tF£¨w+îp²ÜÔØðe°õæÑÉ?@IºpL$ð ðÔ›Kç<‚n²Þ¦ÍQg# Ë…qÜ çx4ꃮd ‡Ï©wz£Ò¶~€÷,tyãÑFú]…€÷ô’ÀE8 “JYØÉ=+Læ’ŠbñÖÂ9À€ÓtöI¶<ð·ÐÉ‘ß$ðl“²¤õ§NfŽ'V7Â!{gcPà©~@@`¹’À§Ç-ê/@9€à“ªž(œU€`DbÀ?À-~·À+€ ë$ÔQJzP0è)mð£Ñxqÿ€4ðÊÝùãþx´Ýƒ À ¼rä©Qfpž€€ ¼r€é0™cp·øAmÈ¡ý–SmH\À `nf#×´w¬äxHà­]åWT‚nC¥ÇJn”kÛ¦÷T¦x\{܃8£UyÂ}ZeP÷É™rs.9RRom^ ǰ²$HGøoLfn±ÝæL“ÀÔž%=@/V–ÀPU›*ð@u€ÔЀh (<€;лmï;prÿ>pÁM”Ëâ?@oMce™ºÀç–È€ä›÷÷ù–Ð @J›ð<¹À<°xm¢› =–K€*`¶mú@9PÄ…DÝì p—LÀyI¶µïy ìDñ¦¬—É Ò65!‰´n†ž6 ¤¡'È‚#\¹,â…i¹I†3£ÒöÈ&  ðŒ€p>˜#æÚ÷`r˜è„Yµµ˜,f…ùbŽp#f‹Ycʘd›÷¶Ê¦Ž Åõ˜7d(ø˜ÀÀéÙ.&Ùv¸-™…›÷vENn ܆Âùs„!·%zÀð 0¶ Xf Ð”@'@|™Xæ øn׆fÆq¾Ò(¢oÀˆ©ct[Õ†ÂÙÿ@qH:{æP4‡æžéÔÔáaècŠ˜ÆbÕÆdþr@ ÅAštœp´iqýø}”¦7i®r& `OBmµ\¦9imL¤äfXA€ Dm9Þp×júÙ覨š€2p¶ušCÔÆj‚|½&À  –¶fáÖjJ€Ô)“f  À²y´µšâ@ Hšš½fÄš\«©;· òi@2ÉmŽš€Ù7è¯ÈVsX}C| 3@rจ ‹p N›×(ªŽ+@Ó6¸vªõÖ €—À @¾§A p¶›TU€ä›û&~C[ˆp]A|n€DлÑ8pÁ}œ!§ÓHrVr›ÜÉ)rVm*çߦrŽœUȉrn˜ÛP”œé!`sþÓÛÀpg]Íysöœ?ç,—XîœD'Р±nÒiøœJgÎétvqEçYÂðÏùtV‘ÞÕ™u&F§Òvuîÿ€pµÁoò[çñ}odçpµpgÀµsy[Û‰@pÝæÅy’[gԩȱÇä>µy$œ ×w†Ü÷¦ü_›Ãur Ôi¹nhÞâ øŸÛÐÃýp-œGuúÝoÀaž€æ©¸AqGÛÕ&yÖ¡§ 8z oãWØ q«ç­'z^ž°gÌq'žÇ깞úÞÑ&È n†œ—ÉUže§WçÙUr—>p|ŠžA÷ü@(—É)oùEÛMŸÜ; ÌµrtgöÙÐY…?g0Xu:'/'~’šÜ'—ÌÅvb¢"·~ @ûÙÇmsá§öIÚŸ@:ÇÊÉxž¦= bܧ€Ü’ú µ   ús ÂBœutܪÂÀzµ)“‚wâAmîâå©ía (Û9ÀádgZÑžÚþe›™Ó¥ è úÕAuP› ús–mc\j§Ó5tNX'B¾ <¨;Iƒ‚u-:„þœGeÞvÖ¡%£A0< üŠÜÉu èuR(j…¶cÜ馅€ÀúÜo‹åè Ÿ@z$Zof(ŠÙivÁ_ÂÀ¹¡‘Z~òµ]—Ú}~–§Ú5–¡{hŠÜv^] Ü w\qwÜ%¢w¨Î™‚*xÒ]‡Ò‚¨$r¦wà]+èz¶¡š¨ðljfßIw†âv((ú¤ så8¨jš¢¢Œж¢v#¸Wwp`ß´¹Šn¢ŠƒxÆ¢ºè$Šá9„k,š‹~¢ ^>w2þ¢Çh*ŠNn“3*ã-ž|ÙØtë\ ÷ 6Ù&äýE'7 ãÝœuÜ\8ôpà(w Œ£§¨9ŠŽ–ŸÁ€˜§Öqâ xž¡À€œ7âõh›—Ž6~@¹B–ähü¶è™|€»(@–cç)zQp†Þð (¤%òùÕI•saI‘‚ ¢çEÊéi¤)Gêz~u%è’.¤"i°x’¤³ÞIZ‘qÀJêà ¤a’¶žá€LJ“ò Ù Å)„«\ “N{dŸç“¢€…Ýôy!g·Çî-¥G©B;.¥–'8à”þ‚Qia7ÅU¥üÜSÚ“ž¡( —¿ýzLi%Çìa¥`©y7–R¥!çYÄE¥biÃW–‚ù p÷¬¤( 7—Ö¥OgZ‡Bm7§YÊòuq~©W˜¶¥ƒ©…t¦WÜè9½Ñ|ÒŸ]Z˜N›éåiÑ1}’ébJ™¦ KÜÒôõ¥šéW™v¦cÖGUn}¢)g:½‰}Ã]Ùç;N›¿¤cª'‚nìÜ4GÛ}u‘hlzyŽ˜Bßmz<‚¢º)<À›î}¸)pJv>{å+j½ýdgçGø¿éÓ›"§ÁérÚœ®mÑ(ÔD§É) ŠìU§Oçuú½Ñ‚Ûinzœ~§ÊixÊx£´àûÙR§éiwœpÁßð÷ž¢§Ü]Çœn£ÜjêÕÕœçéÈŸÓôxt§/a Êdr* š püÀÕYtö êM B¨hZ¡>¨ô[†J¡6jÕ¦ z¨ªˆŠ¡Þ¡%êHx¢¶¡À]»r¢y!èL x¨-*>ÀÉ£'ÄÙ¨@0½-°oe±š·±€ê2i©±J¬º·>±¸(YG³&žTìôfG Ž_›åÉÔm{}›[)Æt¶c›Ÿ²uê©åÆË•og¬Õ*ŸoìÇvpÖ)ÐÙ¸™±k칟º±H¬Ûdžpy, ˜öŽ—ãë¼ñ¤êèŲ‹ìÙÈ’c Ž7—q$‰îužU)&;A’ߪÚÉrw“lýh³†œžlÿ(EÖy:k*[Ê—,)ë@Æ|¢,ÔÊÈβŠ$zyº²¸,ÒšŠæ«²,y´mŽ¿,/+ÌBmuèÄêÉÎ6ݲ¡À,YX:³rã*WÌrwÓìkWçÍ×, ER³d2ÙÍV‘<‰Ì…‘Ô[éüՑ謩FVr_Û;G®‘Á»Ð}pÿ@mGÚ³Ôj>‹¿Õ‘ülWèÏRo_ÛÊšÁBm÷ìÏYÛár<€AÂ2“mm§H m&—д–$ýw¿>´m?[Û‰pLdEËL.žö¤* µm´mšjÊÁ’beG»xžŒ¨,yºõ®Lä/)Å^qij£—Læ•8mïMÒ¢oeO»f“è¤Kö®á$j6δۨ9‰NšÖô& ­£Të."§T¬gÕz§X,„¨Õ¦r\mûÕÚ¤Xíè:Ö ¤e-.zÖ^µÈ^V[S¢µm­Y{´Y‰\lŠ’Æ² è×FvÞµ£l^Ûòµ¨ìXù×’¥}íU©×†¤x­a;ض²‚­]KضpewÇ• éä¹T¦@'bÙ*¦–­,É­ú¥š-ñ‡Ùv¶”íh«ÔÚo$¥¢7U8#ýv¨šÜçÚjq°-SYµÍ¶i%èVV¾~¯-j º­•ågù6X¾°]pÔÆtw%P;Üþ•]_¼2·@`yÙ–Ñ[h‹¹]{‹%èÖX®y›Ì ¼ž´Og‰½‚·]œxûÝ€y›Éñsé-òJÞ¶·ã-z«ÞÊ©€;ð¬·@;pßV–ú-~Ûßò·û-xûß ¸n‡9àÖ‚®ÀÏý£a\’y42¸¦œ á&™fº6¸#æ‚û€b¸ì„Ëaj¸n„K¶Á˜3¦ˆ;ؘŠKâæ˜n+yâñ˜U‘)d™Ff‘™ââ˜Àá6éý<* °Éí¸=®ÓäÛk¹¹Ogs&¹@çËäZnNn§ä*mF. ð·±x»¨—¸a¹}+²h2®À€—Ëåfªb.˜»åš¹À˜ëÃy¹¦)×\žÅf°©)vš€¥YššÀ¦‰ºñšŸ¦)gjŠšG[©Él›µ&°©jÒÀ®‰m~š¿æ k ›@œ{è’ɦ´ÙkÒ,´iéNšrеÉç2 °*@дéAPœ§ÂÉê:œDyLP-1.6.0/DyLP/doc/Figures/dualpivcalls.epsu0000644000076700007670000023023311171477034015636 0ustar %!PS-Adobe-3.0 EPSF-3.0 %%Title: /cs/mitacs1/lou/Bonsai/Doc/Dylp.New/Figures/dualpivcalls.epsu %%Creator: IslandDraw for lou %%CreationDate: Thu Sep 15 14:17:38 2005 %%Pages: 1 %%BoundingBox: 63 282 492 620 %%DocumentNeededResources: (atend) %%DocumentSuppliedResources: (atend) %%EndComments %%BeginPreview: 537 423 1 846 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000054 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000005d % 00000000000000000000000000000000000000000000000000000000000000018000c000000000 % 0000000000000000000000000000000000000000000000000000000065 % 000000000000000000000000000000000000000000000000000000000000000080004040000000 % 000000000000000000000000000000000000000000000000000000006e % 000000000000000000000000000000000000000000000000000000000000000080004040000000 % 0000000000000000000000000000000000000000000000000000000076 % 000000000000000000000000000000000000000000000000000000000000000f9dc05cff9e6e00 % 000000000000000000000000000000000000000000000000000000007f % 000000000000000000000000000000000000000000000000000000000000001888806644213100 % 0000000000000000000000000000000000000000000000000000000007 % 000000000000000000000000000000000000000000000000000000000000e0108c804244072100 % 0000000000000000000000000000000000000000000000000000000010 % 000000000000000000000000000000000000000000000000000000000003e01085004244192100 % 0000000000000000000000000000000000000000000000000000000018 % 00000000000000000000000000000000000000000000000000000000000f801185004644232100 % 0000000000000000000000000000000000000000000000000000000021 % 00000000000000000000000000000000000000000000000000000000003e000ec2007c7e1df380 % 0000000000000000000000000000000000000000000000000000000029 % 0000000000000000000000000000000000000018000300100000000000f8000002000000000000 % 0000000000000000000000000000000000000000000000000000000032 % 0000000000000000000000000000000000000008000100100000000003e000000e3f0000000000 % 000000000000000000000000000000000000000000000000000000003a % 000000000000000000000000000000000000000800010000000000000f80000018000000000000 % 0000000000000000000000000000000000000000000000000000000043 % 00000000000000000000000000000000000000f884f13733bf9e7ee03e00000000000000000000 % 000000000000000000000000000000000000000000000000000000004b % 00000000000000000000000000000000000001898d09399114332440f800000000000000000000 % 0000000000000000000000000000000000000000000000000000000054 % 000000000000000000000000000000000006010884391091a4213640f000000000000000000000 % 000000000000000000000000000000000000000000000000000000005c % 000000000000000000000000000000000006010884c91090a4211a807c00000000000000000000 % 0000000000000000000000000000000000000000000000000000000065 % 00000000000000000000000000000000000601188d191190c4231b001f00000000000000000000 % 000000000000000000000000000000000000000000000000000000006d % 00000000000000000000000000000000000600ec76ef9f384e1e090007c0000000000000000000 % 0000000000000000000000000000000000000000000000000000000076 % 00000000000000000000000000000000000c0000000010000000000001f0000000000000000180 % 00000c000000000000000000000000000000000000000000000000007e % 00000000000000000000000000000000000c00000000100000000000007c000000000000000080 % 1000040000000000000000000000000000000000000000000000000007 % 00000000000000000000000000000000000c00000000380000000000001f000000000000000080 % 100004000000000000000000000000000000000000000000000000004c % 000000000000000000000000000000000008000000000000000000000007c00f1e6e1bdcd00f8f % 3de3c40000000000000000000000000000000000000000000000000055 % 000000000000000000000000000000000018000000000000000000000001e018b3312489201899 % 9316640000000000000000000000000000000000000000000000000055 % 000000000000000000000000000000000018000000000000000000000000601021213ac9d01090 % 9204240000000000000000000000000000000000000000000000000055 % 000000000000000000000000000000000018000000000000000000000000001021210650301090 % 920424000000000000000000000000000000000000000000000000006a % 0000000000000000000000000000000000300000000000000000000000000018a3212251101191 % 9314640000000000000000000000000000000000000000000000000055 % 000000000000000000000000000000000030000000000000000000000000000f1e73bc21e00ecf % 1de3ce0000000000000000000000000000000000000000000000000055 % 000000000000000000000000000000000030000000000000000000000000000000000020000000 % 0000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000300000000000000000000000000000000000e007e000 % 0000000000000000000000000000000000000000000000000000000011 % 000000000000000000000000000000000060000000000000000000000000000000000180000000 % 0000000000000000000000000000000000000000000000000000000055 % 000000000000000000000000000000000060000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 000000000000000000000000000000000060000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000011 % 000000000000000000000000000000000040000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000005c % 0000000000000000000000000000000000c0000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 0000000000000000000000000000000000c0000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000c0000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000d % 000000000000000000000000000000000180000000000000000000000000000000000000000000 % 000000000000000000000000000c0000c0000006000000000000000055 % 000000000000000000000000000000000180000000000000000000000000000000000000000000 % 0000000000000000000000000004000040000002000000000000000055 % 000000000000000000000000000000000180000000000000000000000000000000000000000000 % 0000000000000000000000000004000040000002000000000000000055 % 000000000000000000000000000000000180000000000000000000000000000000000000000000 % 000000000000000000000000007c42784f1e6e3e00f376370000000063 % 000000000000000000000000000000000300000000000000000000000000000000000000000000 % 00000000000000000000000180c4c68458a13162018999398000000055 % 000000000000000000000000000000000300000000000000000000000000000000000000000000 % 0000000000000000000000078084421c50072142010111108000000011 % 000000000000000000000000000000000300000000000000000000000000000000000000000000 % 00000000000000000000001e0084426450192142010111108000000000 % 000000000000000000000000000000000200000000000000000000000000000000000000000000 % 000000000000000000000078008c468c58a32146018911118000000055 % 000000000000000000000000000000000600000000000000000000000000000000000000000000 % 0000000000000000000001e000763b76ef1df3bb00f3bb9f0000000055 % 00000000000000000000000000000000060000000000000000000000000000000000000fc000fc % 000067000e800003000007800000000000000000000000100000000055 % 000000000000000000000000000000000600000000000000000000000000000000000004600046 % 000022001180000100001e0000000000000000007e0000100000000055 % 000000000000000000000000000000000c00000000000000000000000000000000000004100043 % 0000220020800001000078000000000000000000000000380000000032 % 000000000000000000000000000000000c000000000000000000000000000000d3cf1b848f3e41 % 211e226e204f371f0d01e0000000000000000000000000000000000037 % 000000000000000000000000000000000c00000000000000000000000000060126308c47999041 % 63212231201098b1120380000000000000000000000000000000000037 % 000000000000000000000000000000000c000000000000000000000000000601d4038844909041 % 21072221200390a11d03c0000000000000000000000000000000000055 % 0000000000000000000000000000000018000000000000000000000000000c00340c8844109043 % 21192221204c90a10300f0000000000000000000000000000000000033 % 0000000000000000000000000000000018000000000000000000000000000c011631884e119042 % 23232721109190a311003c000000000000000000000000000000000055 % 0000000000000000000000000000000018000000000000000000000000000c01e3cedcee0f38fc % 1d9df7738f0ef9dd9e000f00000000000000003e000001f10000000055 % 000000000000000000000000000000001000000000000000000000000000180000000000000000 % 0000000000000000000003c0000000000002004200000089000080005b % 000000000000000000000000000000003000000000000000000000000000180000000000000000 % 0000000000000000000000f00000000000020041000000880000800000 % 000000000000000000000000000000003000000000000000000000000000300000000000000000 % 00000000000000000000003c0373ef3761e79c7078dc708b3bf9e00055 % 000000000000000000000000000000003000000000000000000000000000300000000000000000 % 00000000000000000000000f0399199993323e1e8462f8f111cc800046 % 000000000000000000000000000000006000000000000000000000000000300000000000000000 % 00000000000000000000000381091091121220011c4280811a84800055 % 000000000000000000000000000000006000000000000000000000000000600000000000000000 % 0000000000000000000000000109109112122041644280810a84800055 % 000000000000000000000000000000006000000000000000000000000000600000000000000000 % 00000000000000000000000001191191123232628c42c8c10c8c800055 % 000000000000000000000000000000006000000000000000000000000000c00000000000000000 % 00000000000000000000000001f38f3bb9e39c7c76e771c38478e0000f % 00000000000000000000000000000000c000000000000000000000000000c000001800007b9e02 % 0000003800e0000000000000010000000000000000000000000000002c % 00000000000000000000000000000000c000000000000000000000000000c00000080004331a26 % 000002100100000000000000010000000000000000000000000000002b % 00000000000000000000000000000000c000000000000000000000000001800000080004310822 % 000002100100000000000000038000000000000000000000000000002b % 0000000000000000000000000000000080000000000000000000000000018000d388e1ef11967a % e1e217937380000000000000000000000000000000000000000000002a % 000000000000000000000000000000018000000000000000000000000003000127c9f3141a9223 % 133632118900000000000000000000000000000000000000000000002c % 0000000000000000000000000000000180000000000000000000000000030601d40902041ad222 % 121212110900000000000000000000000000000000000000000000002b % 0000000000000000000000000000000180000000000000000000000000030e00340902040ae222 % 121212110900000000000000000000000000000000000000000000002b % 0000000000000000000000000000000300000000000000000000000000060c01164993140c6222 % 123232390900000000000000000000000000000000000000000000002a % 0000000000000000000000000000000300000000000000000000000000061801e39ce1e704473f % 39e1dbbb9f800000000000000000000000000000000000000000000028 % 00000000000000000000000000000003000000000000000000000000000c380000000000000000 % 000000000000000000000000000000000000000000000000000000002b % 00000000000000000000000000000003000000000000000000000000000c300000000000000000 % 000000000000000000000000000000000000000000000000000000002b % 00000000000000000000000000000006000000000000000000000000000c600000000000000000 % 000000000000000000000000000000000000000000000000000000002a % 000000000000000000000000000000060000000000000000000000000018e00000000000000000 % 000000000000000000000000000000000000000000000000000000002c % 000000000000000000000000000000060000000000000000000000000018c00000000000000000 % 000000000000000000000000000000000000000000000000000000002b % 000000000000000000000000000000040000000000000000000000000031800000000000000000 % 000000000000000000000000000000000000000000000000000000002b % 0000000000000000000000000000000c0000000000000000000000000033800000000000000000 % 0000000000000000000000000000000000000000000000000000000056 % 0000000000000000000000000000000c0000000000000000000000000033000000000000000000 % 0000000000000000000000000000000000000000000000000000000056 % 0000000000000000000000000000000c0000000000000000000000000066000000000000000000 % 0000000000000000000000000000000000000000000000000000000056 % 00000000000000000000000000000018000000000000000000000000006e0000001800007b9e02 % 03800e00000000000c01c0073a40000000000000000180003800000056 % 0000000000000000000000000000001800000000000000000000000000cc000000080004331a26 % 01001000000000000400800846c0000000000000000080004400000056 % 0000000000000000000000000000001800000000000000000000000000d8000000080004310822 % 0100100000000000040080088240000006000000000080004400000056 % 0000000000000000000000000000001800000000000000000000000000f80000d388e1ef11967a % e1373800000000f3c4789b9c815c3cdc38e00000000f9dc0eff9e6e056 % 0000000000000000000000000000003000000000000000000000000001b0060127c9f3141a9223 % 11189003ffff818c24c48c488062426245f03ffff81888804442131056 % 0000000000000000000000000000003000000000000000000000000001e01e01d40902041ad222 % 11109003ffff8100e480884880420e4245003ffff8108c804440721056 % 0000000000000000000000000000003000000000000000000000000003e07c00340902040ae222 % 1110900000000103248088488142324239000000001085004441921056 % 0000000000000000000000000000002000000000000000000000000003c1f001164993140c6222 % 139090000000018c64c5c8484242464241900000001185004442321056 % 000000000000000000000000000000600000001800030000030088000387c001e39ce1e704473f % 3bb9f800000000f3be79dcfc3ce73be77ce00000000ec200e7e1df3856 % 00000000000000000000000000000060000000080001000001108800079f000000000000000000 % 0000000000000000000000000000000046000000000002000000000056 % 00000000000000000000000000000060000000080001000001100000077c000000000000000000 % 00000000000000000000000000000000c600000000000e7e0000000010 % 000000000000000000000000000000c0000000f884f13761093d9b700ff0000000000000000000 % 0000000000000000000000000000000078000000000018000000000056 % 000000000000000000000000000000c0000001898d091993191089880fc0000000000000000000 % 0000000000000000000000000000000000000000000000000000000040 % 000000000000000000000000000000c00002010884391111091089080f00000000000000000000 % 000000000000000000000000000000000000000000000000000000007f % 000000000000000000000000000000c00006010884c91111091089080f00000000000000000000 % 0000000000000000000000000000000000000000000000000000000011 % 00000000000000000000000000000180000601188d191111191089080fc0000000000000000000 % 0000000000000000000000000000000000000000000000000000000011 % 00000000000000000000000000000180000c00ec76efbbb8ef9ddf9c0ff0000000000000000000 % 0000000000000000000000000000000000000000000000000000000011 % 00000000000000000000000000000180000c00000000000000000000077c000000000000000000 % 0000000000000000000000000000000000000000000000000000000011 % 00000000000000000000000000000100001800000000000000000000079f000030000700000000 % 0000000000000000000000000000000000000000000000000000000011 % 000000000000000000000000000003000018000000000000000000000387c00010000880000000 % 0000000000000000000000000000000000000000000000000000000011 % 0000000000000000000000000000030000380000000000000000000003c1f00010000880000000 % 0000000000000000000000000000000000000000000000000000000011 % 0000000000000000000000000000030000300000000000000000000003e07c01f3b81defbc6e00 % 0000000000000000000000000000000000000000000000000000000011 % 0000000000000000000000000000060000700000000000000000000001e01e0311100884423100 % 0000000000000000000000000000000000000000000000000000000011 % 0000000000000000000000000000060000600000000000000000000001b00602119008840e2100 % 0000000000000000000000000000000000000000000000000000000011 % 0000000000000000000000000000060000600000000000000000000000f8000210a00884322100 % 0000000000000000000000000000000000000000000000000000000011 % 0000000000000000000000000000060000c00000000000000000000000d8000230a00884462100 % 0000000000000000000000000000000000000000000000000000000011 % 00000000000000000000000000000c0000c00000000000000000000000cc0001d8401cee3b7380 % 0000000000000000000000000000000000000000000000000000000003 % 00000000000000000000000000000c00018000000000000000000000006e000000400000000000 % 0000000000000000000000000000000000000000000000000000000040 % 00000000000000000000000000000c000180000000000000000000000066000001c7e000000000 % 0000000000000000000000000000000000000000000000000000000011 % 000000000000000000000000000008000300000000000000000000000033000003000000000000 % 0000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000018000300000000000000000000000033800000000000000000 % 0000000000000000000000000000000000000000000000000000000024 % 000000000000000000000000000018000600000000000000000000000031800000000000000000 % 0000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000018000600000000000000000000000018c00000000000000000 % 0000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000030000e00000000000000000000000018e00000000000000000 % 0000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000030000c0000000000000000000000000c600000000000000000 % 000000000000000000000000000000000000000000000000000000002c % 000000000000000000000000000030001c0000000000000000000000000c300030000000018000 % 0000080000300000000000000000000000000000000000000000000064 % 00000000000000000000000000003000180000000000000000000000000c380010000000008010 % 0000080000100000000000000000000000000000000000000000000070 % 000000000000000000000000000060001800000000000000000000000006180010000000008010 % 0000000000100000000000000000000000000000000000000000000030 % 0000000000000000000000000000600030000000000000000000000000060c01f3b8084dcf8f3c % e377d9bb1e11a000000000000000000000000000000000000000000054 % 0000000000000000000000000000600030000000000000000000000000030e03111018ce789091 % f39a08cca112400000000000000000000000000000000000000000005d % 000000000000000000000000000040006000000000000000000000000003060211900844308391 % 010a08888713a000000000000000000000000000000000000000000065 % 0000000000000000000000000000c0006000000000000000000000000003000210a00844308c91 % 010a08889910600000000000000000000000000000000000000000006e % 0000000000000000000000000000c000c000000000000000000000000001800230a008c4719191 % 911a0888a3122000000000000000000000000000000000000000000076 % 0000000000000000000000000000c000c0000000000000000000000000018001d8400767cecedc % e1f71dddddbbc00000000000000000000000000000000000000000007f % 000000000000000000000000000180018000000000000000000000000000c00000400004000000 % 0100000000000000000000000000000000000000000000000000000007 % 000000000000000000000000000180018000000000000000000000000000c00001c7e004000000 % 0100000000000000000000000000000000000000000000000000000010 % 000000000000000000000000000180038000000000000000000000000000c0000300000e000000 % 0380000000000000000000000000000000000000000000000000000018 % 000000000000000000000000000180030000000000000000000000000000600000000000000000 % 0000000000000000000000000000000000000000000000000000000021 % 000000000000000000000000000300070000000000000000000000000000600000000000000000 % 0000000000000000000000000000000000000000000000000000000029 % 000000000000000000000000000300060000000000000000000000000000300000000000000000 % 0000000000000000000000000000000000000000000000000000000032 % 000000000000000000000000000300060000000000000000000000000000300000000000000000 % 000000000000000000000000000000000000000000000000000000003a % 0000000000000000000000000002000c0000000000000000000000000000300000000000000000 % 0000000000000000000000000000000000000000000000000000000043 % 0000000000000000000000000006000c0000000000000000000000000000180000000000000000 % 000000000000000000000000000000000000000000000000000000004b % 000000000000000000000000000600180000000000000000000000000000180030000000001e00 % 001f80000cf88000000000000000000000000000000000000000000054 % 0000000000000000000000000006001800000000000000000000000000000c0010000000002200 % 0008c0000444800040000000000000000000000000000000000000005c % 000000000000000000000000000c003000000000000000000000000000000c0010000000002000 % 0008600004440000400000000000000000000000000000000000000065 % 000000000000000000000000000c003000000000000000000000000000000c01f3b80f1e6e767f % 7608242784459dfcf0000000000000000000000000000000000000006d % 000000000000000000000000000c006000000000000000000000000000000603111018b3312221 % 99082c68447888e6400000000000000000000000000000000000000076 % 000000000000000000000000000c00600000000000000000000000000000060211901021212221 % 11082421c4408d4240000000000000000000000000000000000000007e % 000000000000000000000000001800e00000000000000000000000000000000210a01021212221 % 1108642644408542400000000000000000000000000000000000000007 % 000000000000000000000000001800c00000000000000000000000000000000230a018a3212221 % 11084468c460864640000000000000000000000000000000000000004c % 000000000000000000000000001801c000000000000000000000000000000001d8400f1e73f773 % bb9f83b76ee1c23c700000000000000000000000000000000000000055 % 000000000000000000000000001001800000000000000000000000000000000000400000000000 % 0000000000000000000000000000000000000000000000000000000055 % 000000000000000000000000003001800000000000000000000000000000000001c7e000000000 % 0000000000000000000000000000000000000000000000000000000055 % 000000000000000000000000003003000000000000000000000000000000000003000000000000 % 000000000000000000000000000000000000000000000000000000006a % 000000000000000000000000003003000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 000000000000000000000000006006000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 000000000000000000000000006006000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000600c000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000011 % 00000000000000000000000000600c000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 00000000000000000000000000c018000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 00000000000000000000000000c018000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000011 % 00000000000000000000000000c038000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000005c % 000000000000000000000000008030000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 000000000000000000000000018070000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000018060000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000d % 000000000000000000000000018060000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 0000000000000000000000000300c0000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 0000000000000000000000000300c0000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 000000000000000000000000030180000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000063 % 00000000000000000000000003018000000000000000000000000000c0000040c0008000000000 % 0000000000000000000000000000000000000000000000000000000055 % 00000000000000000000000006030000000000000000000000000000400000c040008000000000 % 0000000000000000000000000000000000000000000000000000000011 % 000000000000000000000000060300000000000000000000000000004000004056000000000000 % 0000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000006060000000000000000000000000007cee03c5c48dd9dc0000000 % 0000000000000000000000000000000000000000000000000000000055 % 0000000000000000000000000406000000000000000000000000180c4440626250e68880000000 % 0000000000000000000000000000000000000000000000000000000055 % 0000000000000000000000000c0e00000000000000000000000018084640404278428d00000000 % 0000000000000000000000000000000000000000000000000000000055 % 0000000000000000000000000c0c00000000000000000000000030084280404248428500000000 % 0000000000000000000000000000000000000000000000000000000055 % 0000000000000000000000000c1c0000000000000000000000007008c28062424c468600000000 % 0000000000000000000000000000000000000000000000000000000032 % 0000000000000000000000001818000000000000000000000000600761003ce7ee7dc200000000 % 0000000000000000000000000000000000000000000000000000000037 % 0000000000000000000000001818000000000000000000000000c0000100000000400000000000 % 0000000000000000000000000000000000000000000000000000000037 % 0000000000000000000000001830000000000000000000000001c000071f800000400000000000 % 0000000000000000000000000000000000000000000000000000000055 % 000000000000000000000000183000000000000000000000000180000c00000000e00000000000 % 0000000000000000000000000000000000000000000000000000000033 % 000000000000000000000000306000000000000000000000000300000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 000000000000000000000000306000000000000000000000000700000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 00000000000000000000000030c000000000000000000000000600000000000000000000000000 % 000000000000000000000000000000000000000000000000000000005b % 00000000000000000000000020c000000000000000000000000c00000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000618000000000000000000000001c00000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 00000000000000000000000061800000000000000000000000180000c0c4006000200000000000 % 0000000000000000000000000000000000000000000000000000000046 % 000000000000000000000000638000000000000000000000003000004044002004600000000000 % 0000000000000000000000000000000000000000000000000000000055 % 000000000000000000000000c30000000000000000000000007000004040002004200000000000 % 0000000000000000000000000000000000000000000000000000000055 % 000000000000000000000000c7000000000000000000000000600007c7ccfbe3cf2e77dce3e000 % 0000000000000000000000000000000000000000000000000000000055 % 000000000000000000000000c6000000000000000000000000c0000c4c444626643122e7f10000 % 000000000000000000000000000000000000000000000000000000000f % 000000000000000000000000c6000000000000000000000001c038084844442424213243010000 % 000000000000000000000000000000000000000000000000000000002c % 0000000000000000000000018c00000000000000000000000180f8084844442424211443010000 % 000000000000000000000000000000000000000000000000000000002b % 0000000000000000000000018c00000000000000000000000303e008c8c4446464211447910000 % 000000000000000000000000000000000000000000000000000000002b % 000000000000000000000001980000000000001800031000070f8007676ee3b3c773887ce38000 % 000000000000000000000000000000000000000000000000000000002a % 000000000000000000000001180000000000000800011000063e00000000000000000840000000 % 000000000000000000000000000000000000000000000000000000002c % 0000000000000000000000033000000000000008000100000cf800000000000000003840000000 % 000000000000000000000000000000000000000000000000000000002b % 00000000000000000000000330000000000000f884f133701fe0000000000000000060e0000000 % 000000000000000000000000000000000000000000000000000000002b % 00000000000000000000000360000000000001898d0911881f8000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000002a % 0000000000000000000000066000000000000108843911083e0000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000028 % 000000000000000000000006e0000000001e010884c91108380000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000002b % 000000000000000000000006c000000000fc01188d1911083e0000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000002b % 000000000000000000000007c000000007e000ec76efbb9c1f8000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000002a % 00000000000000000000000d800000003f000000000000001de000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000002c % 00000000000000000000000d80000001f8000000000000000e78000600c0004000000000000000 % 000000000000000000000000000000000000000000000000000000002b % 00000000000000000000000f0000000fc000000000000000061e0002004008c000000000000000 % 000000000000000000000000000000000000000000000000000000002b % 00000000000000000000000b0000007e0000000000000000070780020040084000000000000000 % 0000000000000000000000000000000000000000000000000000000056 % 00000000000000000000001e000003f000000000000000000381e002e7c79e5cefb8e7c0000000 % 0000000000000000000000000000000000000000000000000000000056 % 00000000000000000000001e00001f800000000000000000018078033c4cc86245cdf200000000 % 0000000000000000000000000000000000000000000000000000000056 % 00000000000000000000001c0000fc00000000000000000001c018021848484264850200000000 % 0000000000000000000000000000000000000000000000000000000056 % 00000000000000000000003c0007e000000000000000000000e000021848484228850200000000 % 0000000000000000000000000000000000000000000000000000000056 % 000000000000000000000038003f000000000000000000000060000238c8c842288d9200000000 % 0000000000000000000000000000000000000000000000000000000056 % 00000000000000000000003801f80000000000000000000000700003e7678ee710f8e700000000 % 0000000000000000000000000000000000000000000000000000000056 % 0300001800030010000000380fc000000000000000000000003800000000000010800000000000 % 0000000000000000000000000000000000000000000000000000000056 % 0100000800010010000800707e0000000000000000000000001800000000000070800000000000 % 0000000000000000000000000000000000000000000000000000000056 % 010000080001000000080073f00000000000000000000000001c000000000000c1c00000000000 % 0000000000000000000000000000000000000000000000000000000056 % 1f3b80f884f13733bf9e007f800000000000000000000000000e00000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000056 % 311101898d0939911cc8007c000000000000000000000000000600000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000056 % 2119010884391091a8480070000000000000000000000000000700000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000056 % 210a010884c91090a8480078000000000000000000000000000380000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000010 % 230a01188d191190c8c8007e000000000000000000000000000180000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000056 % 1d8400ec76ef9f38478e007f0000000000000000000000000001c0000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000040 % 00040000000010000000003fc000000000000000000000000000e00060000000007800007e0000 % 31f200000000000000000000000000000000000000000000000000007f % 001c7e00000010000000003fe00000000000000000000000000060002000000000880000230000 % 108a000080000000000000000000000000000000000000000000000011 % 00300000000038000000003ff80000000000000000000000000070002000000000800000218000 % 1088000080000000000000000000000000000000000000000000000011 % 00000000000000000000003ffc000000000000000000000000003803eee03c79b9d9fdd820908f % 108e7779e0000000000000000000000000000000000000000000000011 % 00000000000000000000001fef000000000000000000000000001806244062ccc488866420b190 % 90f222cc80000000000000000000000000000000000000000000000011 % 00000000000000000000001ff78000000000000000000000000018042640408484888444209083 % 9082348480000000000000000000000000000000000000000000000011 % 00000000000000000000001ff9e00000000000000000000000000004228040848488844421908c % 9082148480000000000000000000000000000000000000000000000011 % 00000000000000000000000ffcf000000000000000000000000000046280628c84888444211191 % 90c2188c80000000000000000000000000000000000000000000000011 % 00000000000000000000000ffe3c0000000000000000000000000003b1003c79cfddceee7e0ece % f9c70878e0000000000000000000000000000000000000000000000011 % 00000000000000000000000fff1e00000000000000000000000000000100000000000000000000 % 0000000000000000000000000000000000000000000000000000000011 % 00000000000000000000000ffb878000000000000000000000000000071f800000000000000000 % 0000000000000000000000000000000000000000000000000000000011 % 000000000000000000000007fdc3c0000000000000000000000000000c00000000000000000000 % 0000000000000000000000000000000000000000000000000000000011 % 000000000000000000000007fee0f0000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000011 % 000000000000000000000007ff7078000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000003 % 000000000000000000000003fb381e000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000040 % 000000000000000000000003ff9c0f000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000011 % 000000000000000000000003ffce03c00000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000 % 000000000000000000000003fee701e00000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000024 % 000000000000000000000001ff6380780000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000 % 000000000000000000000001ff71c03c0000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000 % 000000000000000000000001ffb8e00f0000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000bfdc70078000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000002c % 000000000000000000000000ffcc3801e000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000064 % 000000000000000000000000df6e1c00f000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000070 % 000000000000000000000000dfe70e003c00000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000030 % 0000000000000000000000007fb387001e00000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000054 % 0000000000000000000000006ff983800780001800038000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000005d % 0000000000000000000000006fd9c1c003c0000800044000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000065 % 0000000000000000000000002fece0e000f0000800044000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000006e % 00000000000000000000000037ec7070007800f9dc0eff9e6e0000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000076 % 00000000000000000000000037f63038001e018888044421310000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000007f % 00000000000000000000000033b7381c000e0108c8044407210000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000007 % 0000000000000000000000001bfb1c0e0000010850044419210000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000010 % 0000000000000000000000001bd98e070000011850044423210000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000018 % 00000000000000000000000019fd8603800000ec200e7e1df38000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000021 % 00000000000000000000000009ecc701c000000020000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000029 % 0000000000000000000000000dbee380e0000000e7e00000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000032 % 0000000000000000000000000cf661c07000000180000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000003a % 0000000000000000000000000cf730c03800000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000043 % 000000000000000000000000067b30e01c00000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000004b % 000000000000000000000000067b98700e00000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000054 % 000000000000000000000000066d9c380700000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000005c % 000000000000000000000000023dcc180380000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000065 % 0000000000000000000000000336c61c01c0000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000006d % 0000000000000000000000000336e60e00e0001800030300000001000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000076 % 000000000000000000000000031e63070070000800010100000001000000000000000000000000 % 000000000000000000000000000000000000000000000000000000007e % 000000000000000000000000019b73830038000800010100060000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000007 % 000000000000000000000000018f3183801c00f884f11f1c38e373370000000000000000000000 % 000000000000000000000000000000000000000000000000000000004c % 000000000000000000000000018db8c1c00e01898d09313e45f189188000000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 000000000000000000000000008d98c0e006010884392120450109108000000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 00000000000000000000000000c6dc606000010884c92120390109108000000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 00000000000000000000000000c6cc70700001188d192332419109108000000000000000000000 % 000000000000000000000000000000000000000000000000000000006a % 00000000000000000000000000c6ce30380000ec76ef9d9c7ce39fb9c000000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 000000000000000000000000006366181c00000000000000460000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 000000000000000000000000006367180c00000000000000c60000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000061b30c0e00000000000000780000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000011 % 0000000000000000000000000021b38e0700000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 000000000000000000000000003199860380000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 0000000000000000000000000030d9c30180000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000011 % 0000000000000000000000000030d8c301c0000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000005c % 0000000000000000000000000018cce180e0000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 00000000000000000000000000186c61c070000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000186670c03000180000c000181800000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000d % 000000000000000000000000000836306038000800004000080800000000001000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 000000000000000000000000000c3338601c000800004000080800300000001000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 000000000000000000000000000c3318300e00f9dc07c84788f8e1c7370f10bc00000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 000000000000000000000000000c1b1c38060188880c58c84989f22f9899b19000000000000000 % 0000000000000000000000000000000000000000000000000000000063 % 0000000000000000000000000006198c18060108c8084841c90902281090909000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 0000000000000000000000000006198e0c00010850084846490901c81090909000000000000000 % 0000000000000000000000000000000000000000000000000000000011 % 00000000000000000000000000060cc60c0001185008c8c8c919920c9091919000000000000000 % 0000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000020cc7060000ec200767677cece3e739cf0edc00000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 000000000000000000000000000306630700000020000000000002300000000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 0000000000000000000000000003066383000000e7e00000000006300000000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 000000000000000000000000000306618180000180000000000003c00000000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 00000000000000000000000000018331c180000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000032 % 00000000000000000000000000018330c0c0000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000037 % 00000000000000000000000000018318e0e0000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000037 % 000000000000000000000000000081986060000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 0000000000000000000000000000c18c7030000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000033 % 0000000000000000000000000000c0cc3030000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 0000000000000000000000000000c0cc3818001800000181800001000004000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 000000000000000000000000000060c6181c000800000080900001000004000000000000000000 % 000000000000000000000000000000000000000000000000000000005b % 000000000000000000000000000060661c0c000800000080900000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000060630c0600f9dc078f8fbcf3733bf9cc000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 000000000000000000000000000020630e06018888085898919b991143e4000000000000000000 % 0000000000000000000000000000000000000000000000000000000046 % 0000000000000000000000000000303186000108c801d0909109091a4204000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 0000000000000000000000000000303187000108500650909109090a4204000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 00000000000000000000000000003019830001185008d1919119190c4324000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 00000000000000000000000000001818c38000ec20076ecedcf1f384e1c4000000000000000000 % 000000000000000000000000000000000000000000000000000000000f % 00000000000000000000000000001818c180000020000000000100000004000000000000000000 % 000000000000000000000000000000000000000000000000000000002c % 0000000000000000000000000000180c61c00000e7e00000000100000014000000000000000000 % 000000000000000000000000000000000000000000000000000000002b % 0000000000000000000000000000080c60c0000180000000000380000038000000000000000000 % 000000000000000000000000000000000000000000000000000000002b % 00000000000000000000000000000c0c30e0000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000002a % 00000000000000000000000000000c063060000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000002c % 00000000000000000000000000000c063070000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000002b % 000000000000000000000000000006031830000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000002b % 000000000000000000000000000006031838000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000002a % 000000000000000000000000000006030c18001800038000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000028 % 000000000000000000000000000002018c1c000800040002000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000002b % 00000000000000000000000000000301860c000800040002000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000002b % 00000000000000000000000000000301860e00f9dc0e78f79e7c00000000000000000000000000 % 000000000000000000000000000000000000000000000000000000002a % 00000000000000000000000000000300c60601888804858a332000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000002c % 00000000000000000000000000000180c3060108c8041d02212000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000002b % 000000000000000000000000000001806300010850046502212000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000002b % 000000000000000000000000000001806180011850048d8a232000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000056 % 00000000000000000000000000000080618000ec200e76f39e7000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000056 % 000000000000000000000000000000c030c0000020000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000056 % 000000000000000000000000000000c030c00000e7e00000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000056 % 000000000000000000000000000000c030c0000180000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000056 % 000000000000000000000000000000601860000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000056 % 000000000000000000000000000000601860000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000056 % 000000000000000000000000000000600c30000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000056 % 000000000000000000000000000000200c30000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000056 % 000000000000000000000000000000300c18000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000056 % 000000000000000000000000000000300618000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000056 % 000000000000000000000000000000300618001800000800000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000056 % 00000000000000000000000000000018060c000800000800020000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000056 % 00000000000000000000000000000018030c000800000000020000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000010 % 00000000000000000000000000000018030600f9dc0dd9dde78000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000056 % 0000000000000000000000000000000801860188880e688b320000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000040 % 0000000000000000000000000000000c01820108c80428d2120000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000007f % 0000000000000000000000000000000c0180010850042852120000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000011 % 0000000000000000000000000000000c00c0011850046862320000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000011 % 0000000000000000000000000000000600c000ec2007dc21e38000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000011 % 0000000000000000000000000000000600c0000020040000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000011 % 0000000000000000000000000000000600600000e7e40000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000011 % 0000000000000000000000000000000200600001800e0000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000011 % 000000000000000000000000000000030030000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000011 % 000000000000000000000000000000030030000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000011 % 000000000000000000000000000000030030000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000011 % 000000000000000000000000000000018018000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000011 % 000000000000000000000000000000018018000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000011 % 000000000000000000000000000000018018000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000011 % 00000000000000000000000000000000800c001800030000030000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000003 % 00000000000000000000000000000000c00c000800010000010020000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000040 % 00000000000000000000000000000000c006000800010000010020000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000011 % 00000000000000000000000000000000c00600f884f1109b9f1e79c00000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000600601898d09319cf12123e00000000000000000000000 % 0000000000000000000000000000000000000000000000000000000024 % 000000000000000000000000000000006002010884391088610722000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000006000010884c91088611922000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000200001188d191188e32323200000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000300000ec76ef8ecf9d9db9c00000000000000000000000 % 000000000000000000000000000000000000000000000000000000002c % 000000000000000000000000000000003000000000000008000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000064 % 000000000000000000000000000000003000000000000008000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000070 % 00000000000000000000000000000000180000000000001c000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000030 % 000000000000000000000000000000001800000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000054 % 000000000000000000000000000000001800000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000005d % 000000000000000000000000000000000800000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000065 % 000000000000000000000000000000000c00000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000006e % 000000000000000000000000000000000c00000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000076 % 000000000000000000000000000000000c00000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000007f % 000000000000000000000000000000000600000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000007 % 000000000000000000000000000000000600000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000010 % 000000000000000000000000000000000600000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000018 % 000000000000000000000000000000000200000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000021 % 000000000000000000000000000000000300000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000029 % 000000000000000000000000000000000300000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000032 % 000000000000000000000000000000000300000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000003a % 000000000000000000000000000000000180000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000043 % 000000000000000000000000000000000180000000000000000000000000003000030000800001 % 800000000000000000000000000000000000000000000000000000004b % 000000000000000000000000000000000180000000000000000000000000001000010000800000 % 8000000000000000000000000000000000000000000000000000000054 % 000000000000000000000000000000000080000000000000000000000000001000010000000000 % ac0000000000000000000000000000000000000000000000000000005c % 0000000000000000000000000000000000c000000000000000000000000001f108f1377d8f38ee % 9000000000000000000000000000000000000000000000000000000065 % 0000000000000000000000000000000000c00000000000000000000000000313190939a098fc2c % a00000000000000000000000000000000000000000000000000000006d % 0000000000000000000000000000000000c000000000000000000000000e0211083910a0904010 % f000000000000000000000000000000000000000000000000000000076 % 00000000000000000000000000000000006000000000000000000000001c021108c910a0904038 % 900000000000000000000000000000000000000000000000000000007e % 0000000000000000000000000000000000600000000000000000000000380231191911a098e44c % 9800000000000000000000000000000000000000000000000000000007 % 00000000000000000000000000000000006000000000000000000000007001d8ecef9f71cf38ef % dc0000000000000000000000000000000000000000000000000000004c % 0000000000000000000000000000000000200000000000000000000000e0000000001000000000 % 0000000000000000000000000000000000000000000000000000000055 % 0000000000000000000000000000000000300000000000000000000001c0000000001000000000 % 0000000000000000000000000000000000000000000000000000000055 % 000000000000000000000000000000000030000000000000000000000380000000003800000000 % 0000000000000000000000000000000000000000000000000000000055 % 000000000000000000000000000000000030000000000000000000000700000000000000000000 % 000000000000000000000000000000000000000000000000000000006a % 000000000000000000000000000000000018000000000000000000000e00000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 000000000000000000000000000000000018000000000000000000001c00000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 000000000000000000000000000000000018000000000000000000003800000000000000000000 % 0000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000008000000000000000000007000000000000000000000 % 0000000000000000000000000000000000000000000000000000000011 % 00000000000000000000000000000000000c00000000000000000000e000000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 00000000000000000000000000000000000c001800000000c0000001c000003000180000000000 % 0000000000000000000000000000000000000000000000000000000055 % 00000000000000000000000000000000000c000800000000400800038000001000080800000000 % 0000000000000000000000000000000000000000000000000000000011 % 000000000000000000000000000000000006000800000000400800070000001000080800000000 % 000000000000000000000000000000000000000000000000000000005c % 00000000000000000000000000000000000600f86b842dc7c79e700e000001f3b80b9efbcdc000 % 0000000000000000000000000000000000000000000000000000000055 % 000000000000000000000000000000000006018897cc6e6c4848f80fffff8311100cc844262000 % 0000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000020108ec04242841c8800fffff021190084840e42000 % 000000000000000000000000000000000000000000000000000000000d % 00000000000000000000000000000000000001081c0424284648800e00000210a0084843242000 % 0000000000000000000000000000000000000000000000000000000055 % 00000000000000000000000000000000000001188e446468c8c8c80700000230a008c844642000 % 0000000000000000000000000000000000000000000000000000000055 % 00000000000000000000000000000000000000ecf383b7c7676e7003800001d8400f8ee3be7000 % 0000000000000000000000000000000000000000000000000000000055 % 00000000000000000000000000000000000000000000040000000001c000000040000000000000 % 0000000000000000000000000000000000000000000000000000000063 % 00000000000000000000000000000000000000000000040000000000e0000001c7e00000000000 % 0000000000000000000000000000000000000000000000000000000055 % 000000000000000000000000000000000000000000000e00000000007000000300000000000000 % 0000000000000000000000000000000000000000000000000000000011 % 000000000000000000000000000000000000000000000000000000003800000000000000000000 % 0000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000001c00000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 000000000000000000000000000000000000000000000000000000000e00000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 000000000000000000000000000000000000000000000000000000000700000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 000000000000000000000000000000000000000000000000000000000380000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 0000000000000000000000000000000000000000000000000000000001c0000000000000000000 % 0000000000000000000000000000000000000000000000000000000032 % 0000000000000000000000000000000000000000000000000000000000e0003000018000400400 % 0000000000000000000000000000000000000000000000000000000037 % 000000000000000000000000000000000000000000000000000000000070001000008000400440 % 0000000000000000000000000000000000000000000000000000000037 % 000000000000000000000000000000000000000000000000000000000038001000008000000040 % 0000000000000000000000000000000000000000000000000000000055 % 00000000000000000000000000000000000000000000000000000000001c01f3b80f86b8cdccf0 % 0000000000000000000000000000000000000000000000000000000033 % 00000000000000000000000000000000000000000000000000000000000e03111018897c462440 % 0000000000000000000000000000000000000000000000000000000055 % 000000000000000000000000000000000000000000000000000000000004021190108ec0442440 % 0000000000000000000000000000000000000000000000000000000055 % 0000000000000000000000000000000000000000000000000000000000000210a01081c0442440 % 000000000000000000000000000000000000000000000000000000005b % 0000000000000000000000000000000000000000000000000000000000000230a01188e4442440 % 0000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001d8400ecf38ee7e70 % 0000000000000000000000000000000000000000000000000000000055 % 000000000000000000000000000000000000000000000000000000000000000040000000000000 % 0000000000000000000000000000000000000000000000000000000046 % 0000000000000000000000000000000000000000000000000000000000000001c7e00000000000 % 0000000000000000000000000000000000000000000000000000000055 % 000000000000000000000000000000000000000000000000000000000000000300000000000000 % 0000000000000000000000000000000000000000000000000000000055 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000055 %%EndPreview save /d_sv_obj exch def userdict /IslandDrawDict 300 dict dup begin put /bdef {bind def} bind def /E {exch} bdef /FF {findfont} bdef /MF {makefont} bdef /RO {rotate} bdef /SC {scale} bdef /SF {setfont} bdef /SG {setgray} bdef /TR {translate} bdef /bp {lj lw rgb} bdef /bpbw {lj lw setgray} bdef /c {curveto} bdef /cl {closepath} bdef /fi {eofill} bdef /g {setgray} bdef /gr {grestore} bdef /gs {gsave} bdef /l {lineto} bdef /lj {setlinejoin} bdef /lw {setlinewidth} bdef /m {moveto} bdef /n {newpath} bdef /nx {/x E def} bdef /r {rmoveto} bdef /rl {rlineto} bdef /rgb {setrgbcolor} bdef /s {show} bdef /sd {setdash} bdef /sp {x 0 rmoveto} bdef /ss {currentpoint pop E m} bdef /st {stroke} bdef %% pattern stuff /BPSIDE 32 def %% pixels per pattern side /PATFREQ 3.0 def %% pattern pixels per mm /dp_mat [PATFREQ 0 0 PATFREQ 0 0] def /dp_pw BPSIDE def %% pattern pixel width /dp_ph BPSIDE def %% pattern pixel height /dp_w dp_pw PATFREQ div def %% pattern mm width /dp_h dp_ph PATFREQ div def %% pattern mm height /savemat matrix def /topmat matrix def /patmat matrix def %% catch nocurrentpoint error for: pathbbox /ncpoint errordict /nocurrentpoint get def errordict begin /nocurrentpoint { dup /pathbbox load eq {pop 0 0 1 1} {ncpoint} ifelse } bdef end /ar { %% sa ea sx sy rot tx ty matrix currentmatrix 8 1 roll TR RO SC n 0 0 1 5 3 roll arc setmatrix } bdef /arn { %% sa ea sx sy rot tx ty TR RO SC matrix currentmatrix 8 1 roll n 0 0 1 5 3 roll arcn setmatrix } bdef /el { %% sx sy rot tx ty matrix currentmatrix 6 1 roll TR RO SC n 0 0 1 0 360 arc setmatrix cl } bdef /image_raster { %% sw sh sd dw dh xs ys TR SC /sd E def /sh E def /sw E def /imagebuf sw sd mul 7 add 8 idiv string def sw sh sd [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop} image } bdef /imagemask_raster { TR SC /sh E def /sw E def /imagebuf sw 7 add 8 idiv string def sw sh false [sw 0 0 sh 0 0] {currentfile imagebuf readhexstring pop} imagemask } bdef /dither_color_raster { % bool sw sh sd dw dh xs ys TR SC /sd E def /sh E def /sw E def sd 8 eq and { /imagebuf 3 string def /grayval 1 string def sw sh sd [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop pop imagebuf 0 get 0.299 mul imagebuf 1 get 0.587 mul add imagebuf 2 get 0.114 mul add cvi grayval exch 0 exch put grayval } image } { /imagebuf sw 3 mul sd mul 7 add 8 idiv string def sh { currentfile imagebuf readhexstring pop pop } repeat } ifelse } bdef /image_color_raster { % bool sw sh sd dw dh xs ys /colorimage where not { dither_color_raster } { pop TR SC /sd E def /sh E def /sw E def pop /imagebuf sw 3 mul sd mul 7 add 8 idiv string def sw sh sd [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop} false 3 colorimage } ifelse } bdef /patpath { /inv E def topmat setmatrix pathbbox %% get lo - hi indecies /hy E dp_h div floor cvi def /hx E dp_w div floor cvi def /ly E dp_h div floor cvi def /lx E dp_w div floor cvi def lx 1 hx { dp_w mul ly 1 hy { dp_h mul E dup 3 1 roll E patmat currentmatrix pop TR dp_pw dp_ph inv dp_mat dp_proc imagemask patmat setmatrix } for pop } for } bdef % setpattern brush of patterns instead of gray /setpattern { /blue E def /green E def /red E def /freq E def /bwidth E def /bpside E def /bstring E def /onbits 0 def /offbits 0 def freq 0 {/y E def /x E def /xindex x 1 add 2 div bpside mul cvi def /yindex y 1 add 2 div bpside mul cvi def bstring yindex bwidth mul xindex 8 idiv add get not 1 7 xindex 8 mod sub bitshift and 0 ne {/onbits onbits 1 add def 1} {/offbits offbits 1 add def 0} ifelse } setscreen {} settransfer systemdict /setcmykcolor known { /fact 1 onbits offbits onbits add div sub def 1 red sub fact mul 1 green sub fact mul 1 blue sub fact mul 0 setcmykcolor } { offbits offbits onbits add div setgray} ifelse } bdef /dmatrix matrix def /dpi 72 0 dmatrix defaultmatrix dtransform dup mul E dup mul add sqrt def /B {gs bp st gr} bdef %% brush: gr lw lj /Bbw {gs bpbw st gr} bdef %% brush: gr lw lj /F {gs rgb eofill gr} bdef %% fill: gr /Fbw {gs setgray eofill gr} bdef %% fill: gr /PB {gs lj lw setpattern st gr} bdef /PF {gs eoclip patpath gr} bdef /BB {gs rgb lj lw strokepath clip patpath gr} bdef /xdef {exch def} bdef /clip_region { /ht xdef /wd xdef /bm xdef /lm xdef newpath lm bm moveto 0 ht rlineto wd 0 rlineto 0 ht neg rlineto closepath clip } bdef %! Island text prolog Version 3.1 %% %%BeginProlog /reencode_small_dict 12 dict def /ReencodeSmall { reencode_small_dict begin /new_codes_and_names exch def /new_font_name exch def /base_font_name exch def /base_font_dict base_font_name findfont def /newfont base_font_dict maxlength dict def base_font_dict { exch dup /FID ne { dup /Encoding eq { exch dup length array copy newfont 3 1 roll put } { exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall newfont /FontName new_font_name put new_codes_and_names aload pop new_codes_and_names length 2 idiv { newfont /Encoding get 3 1 roll put } repeat new_font_name newfont definefont pop end %reencode_small_dict } def /extended_Zapf [ 8#223 /a89 8#224 /a90 8#225 /a93 8#226 /a94 8#227 /a91 8#230 /a92 8#231 /a205 8#232 /a85 8#233 /a206 8#234 /a86 8#235 /a87 8#236 /a88 8#237 /a95 8#240 /a96 ] def /extended_Standard [ 29 /thorn 30 /yacute 31 /divide 128 /Acircumflex 129 /Adieresis 130 /Agrave 131 /Aring 132 /Atilde 133 /Ccedilla 134 /Eacute 135 /Ecircumflex 136 /Edieresis 137 /Egrave 138 /Iacute 139 /Icircumflex 140 /Idieresis 141 /Igrave 142 /Ntilde 143 /Oacute 144 /Ocircumflex 145 /Odieresis 146 /Ograve 147 /Otilde 148 /Scaron 149 /Uacute 150 /Ucircumflex 151 /Udieresis 152 /Ugrave 153 /Ydieresis 154 /Zcaron 155 /aacute 156 /acircumflex 157 /adieresis 158 /agrave 159 /aring 160 /atilde 161 /exclamdown 162 /cent 163 /sterling 164 /fraction 165 /yen 166 /florin 167 /section 168 /currency 169 /quotesingle 170 /quotedblleft 171 /guillemotleft 172 /guilsinglleft 173 /guilsinglright 174 /fi 175 /fl 176 /plusminus 177 /endash 178 /dagger 179 /daggerdbl 180 /periodcentered 181 /twosuperior 182 /paragraph 183 /bullet 184 /quotesinglbase 185 /quotedblbase 186 /quotedblright 187 /guillemotright 188 /ellipsis 189 /perthousand 190 /threesuperior 191 /questiondown 192 /mu 193 /grave 194 /acute 195 /circumflex 196 /tilde 197 /macron 198 /breve 199 /dotaccent 200 /dieresis 201 /onesuperior 202 /ring 203 /cedilla 204 /onequarter 205 /hungarumlaut 206 /ogonek 207 /caron 208 /emdash 209 /ccedilla 210 /copyright 211 /eacute 212 /ecircumflex 213 /edieresis 214 /egrave 215 /iacute 216 /icircumflex 217 /idieresis 218 /igrave 219 /logicalnot 220 /minus 221 /ntilde 222 /oacute 223 /ocircumflex 224 /odieresis 225 /AE 226 /onehalf 227 /ordfeminine 228 /ograve 229 /otilde 230 /registered 231 /scaron 232 /Lslash 233 /Oslash 234 /OE 235 /ordmasculine 236 /trademark 237 /uacute 238 /ucircumflex 239 /udieresis 240 /ugrave 241 /ae 242 /ydieresis 243 /zcaron 244 /Aacute 245 /dotlessi 246 /threequarters 247 /Eth 248 /lslash 249 /oslash 250 /oe 251 /germandbls 252 /multiply 253 /Yacute 254 /Thorn 255 /eth ] def /extended_Symbol [ ] def /extend_font { % stack: fontname newfontname exch dup (ZapfDingbats) eq { cvn exch cvn extended_Zapf ReencodeSmall } { dup (Symbol) eq { cvn exch cvn extended_Symbol ReencodeSmall } { cvn exch cvn extended_Standard ReencodeSmall } ifelse } ifelse } bind def /extend_font_name { % stack: font_name_string dup length 1 add string /extended_font_name exch def extended_font_name 0 (_) putinterval extended_font_name 1 3 -1 roll putinterval extended_font_name } bind def /gf { /f exch def f cvn where { f exch begin cvn load exec setfont end } { f 0 f length 8 sub getinterval dup /localfont exch extend_font_name def localfont extend_font localfont findfont /xsz f f length 4 sub 4 getinterval cvi def /ysz f f length 8 sub 4 getinterval cvi def [ xsz 0 0 ysz neg 0 0 ] makefont dup f cvn exch def setfont } ifelse } bind def /gfns { /f exch def f cvn where { f exch begin cvn load exec setfont end } { f 0 f length 8 sub getinterval cvn findfont /xsz f f length 4 sub 4 getinterval cvi def /ysz f f length 8 sub 4 getinterval cvi def [ xsz 0 0 ysz neg 0 0 ] makefont dup f cvn exch def setfont } ifelse } bind def /ul { % space drop thickness gs currentpoint currentlinewidth currentpoint n m 6 -3 roll lw 0 exch r 0 rl st lw m gr } bind def /nxtab { currentpoint pop 1000.0 mul cvi tab mod tab exch sub 1000.0 div 0 rmoveto } bind def /nx { /x exch def } bind def 0. nx %%EndProlog gsave 2.83465 -2.83465 scale 0 -279.4 translate topmat currentmatrix pop n savemat currentmatrix pop [1 0 0 1 45 121.201] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -1244 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_dualpivot) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 76.077 115.919] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -628 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dualin) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 84.624 113.701] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (ddirdothyper) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 84.737 118.701] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (bdothyper) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 84.624 108.701] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_chkpiv) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 84.737 123.701] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_confirmDualPivot) s savemat setmatrix n 82.237 107.5 m 77.237 115 l gsave 0 0 0 0.176 0 B grestore n 82.237 112.5 m 77.237 115 l gsave 0 0 0 0.176 0 B grestore n 82.237 117.5 m 77.237 115 l gsave 0 0 0 0.176 0 B grestore n 82.237 122.5 m 77.237 115 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 85.249 88.419] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -1148 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dualmultiin) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 94.262 76.201] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (scanForDualInCands) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 94.262 81.201] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (selectWithoutInf) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 94.262 86.201] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (selectWithInf) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 94.262 96.201] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_updateprimals) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 94.262 101.201] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_confirmDualPivot) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 139.262 78.701] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (promoteSanePivot) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 125.915 86.201] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (calcInfChange) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 94.262 91.201] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_ftran) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 158.697 86.201] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_ftran) s savemat setmatrix n 118.91 85 m 123.91 85 l gsave 0 0 0 0.176 0 B grestore n 151.76 85 m 156.76 85 l gsave 0 0 0 0.176 0 B grestore n 91.762 75 m 86.762 87.5 l gsave 0 0 0 0.176 0 B grestore n 91.762 80 m 86.762 87.5 l gsave 0 0 0 0.176 0 B grestore n 91.762 85 m 86.762 87.5 l gsave 0 0 0 0.176 0 B grestore n 91.762 90 m 86.762 87.5 l gsave 0 0 0 0.176 0 B grestore n 91.762 95 m 86.762 87.5 l gsave 0 0 0 0.176 0 B grestore n 91.762 100 m 86.762 87.5 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 152.5 73.7722] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -714 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dualcand_cmp) s savemat setmatrix n 132.5 75 m 137.5 72.5 l gsave 0 0 0 0.176 0 B grestore n 132.5 75 m 137.5 77.5 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 84.05 66.201] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -1080 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dualpivrow) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 93.297 68.701] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (consys_dotcol) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 93.297 63.701] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_btran) s savemat setmatrix n 90.797 62.5 m 85.797 65 l gsave 0 0 0 0.176 0 B grestore n 85.797 65 m 90.797 67.5 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 82.851 173.701] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -1012 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dseupdate) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 91.947 173.701] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_btran) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 91.947 178.701] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_dseinit) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 91.947 168.701] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dualpricexk) s savemat setmatrix n 89.447 167.5 m 84.447 172.5 l gsave 0 0 0 0.176 0 B grestore n 84.447 172.5 m 90.291 172.35 l gsave 0 0 0 0.176 0 B grestore n 84.447 172.5 m 89.447 177.5 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 65 146.201] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_addtopivrej) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 65 136.201] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dualdegenin) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 65 161.201] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dualupdate) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 65 151.201] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_factor) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 65 141.201] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_dualdegenout) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 65 131.201] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_ftran) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 65 156.201] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_pivot) s savemat setmatrix n 62.5 65 m 47.5 120 l gsave 0 0 0 0.176 0 B grestore n 47.5 120 m 62.5 172.5 l gsave 0 0 0 0.176 0 B grestore n 47.5 120 m 62.5 87.5 l gsave 0 0 0 0.176 0 B grestore n 47.5 120 m 62.5 115 l gsave 0 0 0 0.176 0 B grestore n 47.5 120 m 62.5 130 l gsave 0 0 0 0.176 0 B grestore n 47.5 120 m 62.5 135 l gsave 0 0 0 0.176 0 B grestore n 47.5 120 m 62.5 140 l gsave 0 0 0 0.176 0 B grestore n 47.5 120 m 62.5 145 l gsave 0 0 0 0.176 0 B grestore n 47.5 120 m 62.5 150 l gsave 0 0 0 0.176 0 B grestore n 47.5 120 m 62.5 155 l gsave 0 0 0 0.176 0 B grestore n 47.5 120 m 62.5 160 l gsave 0 0 0 0.176 0 B grestore userdict /#copies 1 put grestore %%Trailer %%DocumentNeededResources: font Bookman-Light %%DocumentSuppliedResources: end d_sv_obj restore DyLP-1.6.0/DyLP/doc/Figures/dualcalls.drw0000644000076700007670000004370211171477034014742 0ustar ª» €ï"€ ˆÈ sÇH6eb P%Ì™2SÒè)ƒBFŒ.r°q#‡ )XL3›0y˜¤³ðˆœ7uà,¤RK!rêÌAƒ¢I*E¤!† ,\¢DŒ!gÜpQƒEÓ.nÀˆaõhQ¯F‘ÆëÕoĨñÁƒÊ( ì„a“挶CŠ8*Äܺwy`t ‚N1l¡HyûD •$Oœab¬  J² ‹¹$bnÄÔaƒÛ1@ˆ&]Æ4¦ ÆÌa‹BÈ›7kÚ„q“"¶¶mÊIS§ï0›A`Æ,BÌÉ1kDÄf#‡¶Þ#L’LAÒû¤›3u–a›v­2y¾ Ïæ,štæÐ‘S&L›/eÜñ¡ ¤š6Õ–ÓN=ýÔP_!¥TL9 6„eU –mÕRJ8†eU[nÁ%]vá¥_~‘Ø`˜ö™bŒ9™d”U˜›ÕŸ…6Zi§¥¶¯a&m¶á¦o¾'qÆar<,§Í=ÝtÕñ€ÂuÙm×Ýnà‰GžZü¡÷ÅsQž{ðÉGŸ}øéÇŸÞ4 O>ñ… „ 6øTH6ÐU 8°ƒ .\ÆÕ† F ©„f¡…f[oÅõW‰<äµWP)Æ‹…–ØbP4öXd“UÖèŽ9æ[>²æjªýØ[°ée’¹íÖ›”NWÜqÉY™eÐI7uÖ9vÜà]™ižšs´GvÀ†m̧MrÖw_~ûõ'RžêħBè@ 65( 7º• VÁ€•V’Å¡X³Pé‡˜Š¸i`ž¢øð¨:–ú"ªªÎتšUYñ¬  ¹+¸ŠìZ¯³ýz[°LËCpÆF9e²W.Û,—ÑN+¦µd†—­¥Û²'ùñͧníúçL2ý_¼öy ½^ªïƒ9Jå€U 6\©† /|iˆšªÈEAE¨œ’êâ©1®J£«—ÝëŽ=šd®¶òjdʵ­¼ä°¿½üä±RRi%sÎ1»å³]~)m˜Õ^ëóx¯Ù‚ns¬¡mšé­7×·v¼AÑéÒÉîï>“¼úIµ‚ø еÖ\[5ÆaOš°ðH™½VÃi‹ÊÛnýbÅsócª2²Zã«z{,+´úM²ºž<8’† Û¤â1#[å•ké,´^‚Ií˜ßmΫ砋4é_tKêâ"—¹xðtÍuvr—Ó4»¨ÑëOUËÝÕB’µôî8 JðF¶ƒ)ÌCgËÔˆ”Ǽ·ML0Ð3•ô0V½»q GÚã[÷Â÷7|J2ŸË`%õ=K‘»år†9úa‹s1À_B7ºó¤‡r¨£XwÀu%Pi/‰ÉLd·§ÚM-RVsPH(„Ø QWÑ Ø2äâ}pÈ!§¤„# Á„jC!a¢7½ŒYo°ŠáúFÃïŽH7TY[–82nfëSV'?Ëé,s=3Sç>·Dý}ȉê©C~Ü*ÎÉŠI‹»(µzQ‚b´Š d`AEelk^Ù@x<´É10%tÅö¨Â>¶pcØëg9ÃÀÒ†ãS$ËW¬6Žfí“Üû*'¿iN“Iä$÷Jfa hXƒ)ö:«ó²Ý+—2AYÒrkûÚ=ØÁHD"ˆBŽ¥Fv <òJj¨ K±òÔ{Gaê±Eeê_¸7f:´Æà³ª~±ªÃFúׇ^Õè6‰èÑošU¤ 6O’Ë R:¤A7t¡CÜŠJ™¾ÓÊtŽ Ç(Œàà3eŸÝØOJñ SñQ Ýâ*Ú…É„*CiLÕHç76„£´Ž-ÊckzÀÝÄ$H?à´–® qÃYMahã¿;¼ô5#Y³In:Èö4Aíí/˜N. ”ÙyEUÒÝ¡•õºïÜîèÂ[–"¦wyÂ`“pØû&æ{ýÐù.»™Í>ä'ãŠnÓ>0 Üé²N¼ÛG~"uVÚR·®Õ ¤2v{‹åÑÎZ$ÃE­— ‹Ø» ¼ñ6™™ËuÊfìòÈØ§+©óöÊ¢Õ°îü“uÁný¸g?yb¿Û/ï+hß©Øq;e¹VyÎ!‡A–ƒKw.k]µ³Í{¼ÕÞ÷²ÿýëz§-ß7ËöÎäw=Êâ¯ÞWÇÛò(À†^K3瀖U¹ÁTjÐy·Ã:ñ£yãO{ú/¿ž*k.ó—UßFÖÓ>·†Ÿ:ÜEouÝcÝôÅ-;ñÅb|×Ã^Q°¯}òßžîÜÏýù¼þd§]ÚûþúMÉ>òw{ûÐ+¾ùß/}øï.ò§¿õçþNâ}ö#ÞýÞWOò×e¨gÕ—U3Àë÷y €ð'€u'~2Q’ÂWv V|êWxþz7€±4€÷eH}Ù÷e60{åט]¾#8ô‡'Ø‚_fmÔmæfÏç`r0­±~„ !g Q øz!0!!ßâÑÑxF¨H¨„—Q…ôA3 Vøƒ……IXŠÇ30•, voP ð…bøƒdx„gØah´€18…q8‡­q‡¥w…YÈ€È4k³dQè¢rX†X„yh†Jˆ!Oh~Y"Ja8†e˜ˆúbzö‡7…n"n`ve ªÁ¢t‰s˜‰¤øXO6µöoH"h@™±y0‹µ(Šz¨„0µö(5 Q(.g@ùa‹ˆx†é׉V¡Qøsaá¡Jæe€¸x†fä;c–ŠoØ-a@Öèè8ŠÚˆkÁ„ŒèŽ"Pe e@opõ˜ŒKXµ–€sQ9¯xš˜qE…g0‡d@‘‰hhdU±†É‘ùñ‰Œ¹ÜH¾(dH&)i*ù‘ú˜Db1KQŒÂ8sÑå‘{h²„F•…@ÉBI7¹‡ ¶³ÔÌ%w€õAD©…Q)]y‘XuqŽœ%a€Ñï!„,¡hijIœØ+èSáE"‘ˆœ¸!Á~ù—€˜Y‘ ÈŒ–|õ–æHïáeHA—7`—…’—ê<‹xk})˜š ˜„i”½hÈYŠ—ŽÉ)™x¹’úhxé‹›ù𔩅«™“µ&šiɘrY¦Y—ï7™ªÉ… ›¯ù›V‘\á(¶ —¸ée\qš½™š¹˜(4pœ^™™Â˜+)²t¨˜œ‹Ù˜œ˜D²w!±‰76éÉ/xšY‘{É„ÞIšá¹‚²Wž…•ˆë¹ŸíéžØ™ˆë¨€‰‚™þ1šËYŸã‰ŸçÉŸìiþyž,ÉšY · žº)ž÷©“ ªžê þIœ]H¡Êi¡baŸä©¡É éé¡îI˜‹8R ë÷¬¨òA0cii€ã’;k¨†lø†\ N‘¤Jº¤LÚ¤Nú¤P¥ŠwE¤Gê5€ˆ¢¤ ¨x\ê.™¤2 zaê^ùaJ:Kh*¦MQ¦¯¥xnz4¦Wú¦g*¦[§N1i ¦Jª/Uš¤ˆB[KJ¥^*¥JZ§ˆº¨Qz‡9º£=ú£AºC:¤\!ŠÊ¨šº©œj¥HÚ© ªQš©¢Zª¥Jª¦Ú¨!ñ¨<ê£@*B 0–j¤ `¶z«¸š«ºº«¼Ú«¾ú«ºz¤À:¬ÄZ¬Æj«Âz¬Êº¬Çš¬Ìª¬Žª£­*©°J©²Z¤˜Z«7`ÛÚ­Ïz«Þê­ß ®ÜZ®7à¬Ï®å:®¶ª®Ûº«è ¬îÊ®íj®ëJ¬ñJ®ê樄 ©®:© R©Ø*¬óº«Ë«›« ««îš¯õº¯k¯ïʰë« {«Gz±¸ª±;±[±«®û°ö²%»«ý:­¯«Dj´:ž0ë±Ì³ãÉ®4+{#k¬7+³Ëº³¼š³{³6+´Å:²>;®)©+k­-{©GPµPË„TKµR+µ5pZ›µWµU[µ] µ[»µaGúµV¶Y»¶Z[¶hË„e;¶kë¶oû´j+·1@·h·l;·jû¶e{¶x«·_Ë·r›´ÿZ­{­.›­n b[4P¶‘¹+¹˜;¹a[¹˜¸ ¹™K¹  b—[¹¢Ë¹¥›¹vÛµœKºjÛº§ º© ¹žÛº50»’»‘‹¸Ôʲ³ê¸a‹··»¹sZ¼s궃K¼Æ{¼a{¤ÂK¹Ë˼]Û·m«¼Ëk¸}»ºW½Ò{µÔ˵Ök¼ØK¶Í«Ü«¹Ó›¼¬Ë½¼»´‹Û´´ºòÛûwök¦vúZô;¿^ªzþë§.ÀŒ¦aú¿ÿ»¿ô{¤÷{¿ùk¿,¿|¨,À¼¦¬z\¿ù{¥ ¬¿üëSý+Á<§#ìüÁÿÒÀø»À΋Â'\Â$<Á&Â8о‹Û¸G:3ÀÃ>ÜÃ@üÃA<Ä?ìÃELÄCŒÄGlÄH¼ÃH¬ÄJ¼ÄP ÅK,ÅR|¤TLÄVüÄ[\Ä]œÄKŒÅUœÅBüÅ>lʋÌë´}uCàÆpŒ€8ÇrŒÂúÒ¤,Çz<ÇoÜÇpÜ6€lmãÇ~|¤{¼Çvü¤yLÇ| Ç~ÈLÈqÌÈr|¥¬È|È,É,ÈF Éo¬ÉuœÁ¨*¨™LÉ=ìÈìɌƾ;° ÐÁ[»aË«*,§%|Á—,Ë0p¶´Üµ¶ÌË2ì’ºŒÂ¼<º’«½RÌ*<Ì4¬x»¬ÂÈŒ¾W;²· ÃϬ¥(ìÊLû»uzFNÎ#¦zãÎä,Îè|ÎêlÎì\ÎîœÎí|FÉÚ6¶JÏ‚ü®E Mj«Cp«ýÏëüÎ ÏýÍ}ÐЭÐgTÏ·jÏù\Ïçú©LÊÏþl ÐãÌÍïëͱáþà_;² Þà^µNá¾áTÝÎà ΄îáBPâ彫#¾àþߺŠâ޲«*­J{ÃjM«q»Óн;þÒ=~½åËÓA.¾ÁËãá[¼?Ö PäJ~ä@žäÝ+µD^¾ç»ä-íäszà:ÜäPîÒe ÃXÎÒ”[ž[å]+æ_žå›kækÎÒʵjÞµh¾½nNçHÞµW:ÌcN!e.Ã\ÎÆaÞ¤ZNÍR뤅.å†.ç„ÎèƒÎ¤qµW¶‹¾¾>né®çæË½‘¾¤…è´ŠÔÜë¤GÓçkê;íÓ3]êx¼ê¨îêLzê1}¾„Më*ê¯þÒ¤½NjÖ-ÝëË«ê/-êÙÊ«e;ʾìÊnÓȶÌÎìί^޵ѾìÓ®«É~íCí¹ê¹ÜÞí5ýìÖÎíÞŽ«Û~íKmÒä~µánÓÆ.¬0€Ñô>ïö^ïønï÷¾ïùÞïü~ïþîïòðûþïðoð Ÿï_ðÿðüñoïW:ñïïñÞä0ßñÎìÌäÝñ?òØ<ÌäMò$?Ó%_Á!ò¿ò|ò"ÿò2¬ò2Üò3Ïñ?Â2ïò;_óŸû¶9Oó0OÞÿ¤/̤6ôϼéWûëHšôKºôN*õJúéSOÄMõMjõIŠõJêõN±î%ÍôìôR›ñ´ö·†[óönÝ÷[Ãöl_Øm¿ö÷tÏ÷n÷vo÷m?Ó~¿5sï÷‚A€Ÿ÷{ß÷Ž¿økŸø…÷;<ù’ù·Öø“O÷˜/{yßöŽ/÷“Ÿ±Ÿ¯ø‰¯ù¡ÿöŸñBP­ÿúCÑÜ®?û¯ß±´OûÛ û°?¯º?ûGºÝ·_ûîü®ŸûÄÏûÄ¿ÝGJü)>ü½/ÆßûÈßûÀÿü+±Ìý·?¯ÍìÌ/ìýù þ4|É Ü̹Üôâ¿äoÀëÿ¦6_ÁáoÌè/ÃÅüÀÂ\†¬þôÿýéoÀÝÖÕ:îeÓp]HKj&§)°X½  Ìu°¦@™Öé |€0ž´ (Ò€šp€¼Ž./xWãüUïêfÆåªw«X ­rF€¼½8çßh ~³+P⪳¥[`|?0AèÞnà×Rqá­ª,—زÕÎÚnO°¹EAä6‡ÛÎú}RðfAA-˜iÖô‚Í-·A*ÈÉà´‚e 7ü¦cÖtƒÍ-㥷G€€ä­ÖA<ØÞì ¤ƒ|méA?à <âª<ø áÜo‡ª¸C(á­Êx`Ï)„9>§é˜ÔŸ«`ŠíÉ9N˜æD!¥»sO¯IM:7Â2áÆks2Ì*:R˜ =!,¬`Ϧù4]˜ÓxaLó…*ͦ-À_XÓva1ì…Çž4V÷“a0t†! FChÒ„áGS†&Í.܆ ;!¨ó†W~=q¨ Ë×¥«…ß°ÚBu˜Ña¢ªvîp²Ãp8åa<,‡œî:SÈñšÔÑãS(;HùÀ1!j)!¢Cq͉a€Clˆ!jÄ„X âëˆq#jDŒx…@E”ˆ‘"–ÄŒ¨9b@ˆ/‘ þ>‘xI"I<‰#%BÄ•Èi"B‰1&†Ä–ˆœOĉ'òDDA‰@|i1*FÅ£¥«xšT”ŠT1W)@p§¢w»UV±+J…¯h«ÂbWƒÙ­*î4±8¡Û®2‹Wñ A­¸ÅbVÄUÏèŽÈû¢ È€10 ÆÁ¸(ü¢aÔ‹„11ÆÃx¤£bTŒ‡Ñ1>F ãi›Œƒ±2úE̘5#_TŒ—‘2zƽÈãÑÓeÓ)5V–"0X£kDÙ왩FÕØk£kŒÌyÍÆÕhkã ;a»q:õÆÛøË_p\~Ã6ÇÿÐk$ޏ±U–队cmÜËÑK5ÇäX¥.˜ÚÛmMªð,ɵ¤.Š»UD€ -)ªå±¨V™2&ÎV¥ÇÀ“Ô×zW_Ë%ÁÇ7« x[7€¼‘·þèác"ÜVh KA#@ ÃÔ~œXþÑ>†8ôȄܔy”Yôñs1©øøÝÜ”Sˆ< £ùC%xãÒXŽËV' £õ0¼·ñp€ àxä1kô¢É%ƒÀ /H$Ñ–F4¦’¢²£-Z £¹±y§zT$ŸÂ ûÏH6—\$Œäx2Ò˜y#mÀ˜Ò‘Yc,9b€’…íHIÁ§X¤‘¼Rä±I¾È%i@­Á‘TÒ+Uɬ•ºä–\@ñKzÉ0i&s¢˜´wk2MÅX&%Û䜬‘;òPþÈ;É'õ¤Èx¼J¨IJv·«&¥¥ÄÑíRNÊH©)…§TjÍPS~ÊNyÒF¥¥${$ÍT’J’ÖýÙ%{`¼êUºÊY)+[˜¬Ü_±’VêÊ[9+m%ÿÊ•¼2XîÊa9²„¥±”_¹pPi)-å&›¥WiϲY*Ëi¹,•e´Œ–ÎÒYVËmI-cÀL»–n\z¥nÉ-—¥¸œSâ²\’ËÊ".X¶—ê²\žËwé&ãe·¤—Ð2[:/{¹-çeºì–rðmɸ;ø¡Œ+„UëH L„IµfÁüZ3.H#Xµ¦%‚ÅIÂ1f ˜ÓÑ·Wò ÇD[$“Z̯•2æÉd™-Îd¢8‰YµZfȤp#3fºLÙÞlfÇä™(³ÅÌŸ)2ßVG3i™Y4÷–ÒLš*óeÖL¤I5&ÓÄ™€ëi"Í«9áh&ÕÒšVsg6ÍÂ6¹¦„#‚`siŠM¬é4«&ÒÌx>­êÕ4'7»ÞÜlRÌPnž4º™Óô¦Iã›1 êq½%U7•ÞÝdR…sêÕ4–8ÃÞá\Rp³oÚͽ‰7%§á¤œˆ3§m½Ç™¦,§âÄœ„Ós¾ÃÁÙ9çäü›•Ót^N“Æ8Eg’"Iêèñ²ÓYöð¦ ó›µÓv²0Šö9Q'â¼´“¤=©Ù)éB¥ï$œÀsuæÎßÙÁ‚g^aœÉ³w.O%uôÞ.³Æ‘:²KT§=§ÓüC`¬þÉ¿ì9‘Z÷ÜRgÏzî¹ÿ'ƒ£ùÜß“å¿ v¥Pc÷|ŸÚó„e¼FÄ?g@#Ú Ür†1G !ª”-lÿƒ|Éz—Š p ÔM0A'¨%  —L'. ­ÀAh¿ó’ ÔxIŽ@BÉS¿ðŸ(ôvË:Á\RL, 0à€j…|§@1¥ -ô¢Ë JAý`WJƒ"Ð:Cù] ¡%´„½jšèNq¢NÔßI>ù.K_æëwÎ Š>Q>E¨¥¢×ÒŠQ|ÇE¹¨+£AŠ~Qz‰/ŨÁC£[T‹6¼z7EÙhºL|û³„ñ4ÆÓœÙf}Tÿ)€?:© #¤ÌV°­ÈGwšÝiô¥=Ò—ÀK›¤.-’º4L8ôŒ€ ð¤ ô“Ò#0JKi(=¥¦´”Z Uú‡Œl¥¬Ôåq`Zu™ì­¢Õ­ VÓêX5«–,®zÕ¹ŠU/ÙÐ[B ÖÁš«a ¬'o°ÖªXk{;¬‹U`BVǺ·«`e¬5±NV¯É„,+e-\ž³*VÍÚXUædU›•u²ŠVÃúW¿¦Û ›{ëoµÍ§yòdë…Si³¶N¯¬ùZu«÷2š¯Õl½Øº[gkÕô­X ¸jM"H¸ÀVÙ\a«×Âe[ÁVuM[ÓÕºr:äêµ kvÅ®¿•¸†×ÛÚ\Ákr¯ç•º~W¸U¾¸ëÔò®ãµjƦ§ôèk׳¯a¿f=¶õôk~={õÀÞW;:ýëë4°bïÀXÂ[l°!ÌI=F;9U…}R›t‚ª «©Pe^1U–Â.NÞ¹a9gì$‘‰ë¤²±M•`5U‹…zf/Šª˨ê§u±7–Åj=Û©Zl.ŒŽÙÑ–eÇå)Ÿv²ónW!Y"[)—l/û€ÏLÈ:Ù Vd‡ll´fVö7ŽÔ’šbQ`—‹]ÌÆ"ðad™u“EÀEÖ€4[kHiCt³)ŽãÙ*9Ë [ÝV=ғʱ"0ùìtê’Ð>YIf -–*9à?"Z‹h"DŠƒ7ÛªKFÚOú%)-™™­`Ú·O9m•³böÌšÙ2»üÔ,›-oÓ)Å¥Z#@gé,™ÝV¯VÏbÚég÷ét´‚ÖÐZE›h×l¸R–ÑBÚO"?™¥µ´š6ÓnÚ Ði™m•R{ 2ÚF&Ÿ&m¥­ e ¤´_h[@žrڶݶØÖ†F¦qm‡¡J«¶ãöÚ^[nËnµ­Oû¶ì6Ü~IrKn™!º‘êv¶Ûvûn÷m¿··æÞR[z " ™¼õ·Ü¶ßÂ[€Ûý‚#Žm¡çSǺ¿ãÈc¡pŒ¸·}vO a™#Æ¥°ä“:vX( qw£Äí_–I6xÃr“ˆËm¹0÷åÊÜ–;¯ Þʹ87æê\™[s›Ô¼êköjç Ýœ‹s{®ÊltM Ý¥Kt‡­ºò¦ítœêÓ©{DÏi‹‹ºô”êj]/I2é)=U¨[—ê’L¬+u«®Ùd-Îë–]ª vèØU»¿#ìVÝ®Kvå.ÛÅ­WîžÝ³K2Sî’¢W€7WA½ÀKxEdE£v…wY9)c´ïwTW”0ÈÉ+y;=ã}0ÅIÞÍ;y-ïÏU‘—òv^VæÉäZè引—ôF4È›yÀゥ·“™ÞÖ‹zG/$üƒ°öJÞå§zI–·:½¢×òöTš50_‹ÛYÅWöß›¥0eœñqÈ×ù*_è{³"&ôm$3ú¢¸ç›á´¯‡S~x—ú_é‹Üú.gQ æè ˆ¥3ŒæÀB@làæãà¯ü5 ²=)û;Ë ¨¿ñwþ>#²Ã‚VпüwCd),ÇÂtŠ ˜)d…Bi ž©Àá/b` DÿÅ Òüìßü5Æg©n Ä "FhE€/LCTÒPà‚$È!7à~B­ù µI$Ôà‡æ@pAd"0ƒýÃî¤|”‚—p 9!È9ðþ vOÀ‘ „°&þŠœi°|á0ìÜžh°Xœï€pRÅ M3æ€Á6 *\ GBVü÷¯D(SZ!óFL™3\ÀQ£"”(A% 6et€xA§ œ0bäˆÁF2cÞØTYbˆœ2a輑#3É6aÜ!"'Ìf–‚`ó¦Q£Hé¤yã†HÒ˜ ®”!bJ8 bЈ+CGŒ:dÌ•F ¢Pœ)3Gf ¢BºJMãæLb<2qÔAã.e¾ jÜÀA”È›1uÚ”qCÇI™µk¥î*g a™(ÎJMÑùsèÑt¦Ô‡MšÔ«ë´~ "6Ñdh¯,"uˆPѤç(˜ÆN™™d¾Ì±ó¥£eðŒA‚L3 Ô™SF™4cèÌt U*U«DàËŸÑ·¼þò»àÑŒGt¤÷‚晑Àb0ÆVƒ}(ayç)ðB†7^… fø‚Faˆ4,Þ´nX5‚`‡Hì!Š8¶:"q23Xb[s³(ªqŠÆzÙƒ°ÈÅ.ñ…1œar62Ò^R¼‡Pdº!saM€Rà`;'I±{Œ2 ´,¦Y®€ ˆó­„Ê0†ßÜòh`¡ÛªFž›+Zá­o?Šçií9r˜Ã  ±'èo¾€ z.Ÿýç3º·Žfƒ¡%h?/º‘˜þ¨¦'ˆhIwÅJ…ÜUZ+ZH“š…§à¤YÍ=·(q”$IˆæO9zŒTqBy=¹X¢<Œ±±«f»Éñ艥WO¹7¼¤xò̆…oöä ZW(+Ü®˜'9W81Èa=ä‰TÒä3ƤR P÷\5ä$rk¬Ëb`C®ÃÕNæÄ/8ÊVm†£ÄàtÂá€3ó˜Áb`r˜_@–Ñ!fE&ÅAfqŒ³àeÉ^i_Jëáܓ֜§5-$be7FSïƒÛFô˜yX¹‚'øòDËD”¤}d”ïå^Oy_Û÷mKÑ ”3"5âö˜’åØa‰\[IŽæHé( IÕÄðbò8討þè–7Ùt(³QRÉ•—ÇÆ“š”rd R”òg9–y—b ‘ ‰ bÈaˆ%Ç8Ö(’€4%±ˆkñZp0O[ 802 yôa€9€šª©39€|©¹š“áš90²¹šÄ›4ð›2@M¼y¹Éµ™2ð›3€D®É‘œ(㚒ᜭ|aÎ9ÖÉɹ›¯yΜ¯ÉÉiœ¶9ªI#Á›ÜY6ž‰Ç‘tÙ1>""DN ÐY3Á+K1zÊIraǡωÚ”3 2°C/uÖ¡ñgáÑ þ¡ïÑ„‘Òzb š Y%ZA l`%ÚšCàï1)aP¢ÞYŠ :¢»Y m`¡ã¢ÁYz8ó¡3`œE0¢;:š9z  úY/?Z¡01¤î9GÚ¡ZóᤠJÕé,ê¢rÑšO0¥;JÞùY¤[Z¦»ù_š¤eœO@¦raœO¦o ¡Sp$<2zra¥UঠZïYs*¤ U§Ú¨ÕY~Z­™–ú¡5àZ`¨dѨâɨ1Pæ©ušªêù© ¡‚Q$šªV*BùÔ ›T›‚ª«Ðé!PQy6P®AºÚšH•*Ã6àW bQªÎº›y0ºœ•ÖMºjœìcA¬zCc0CÎj¥qP=Ò¡ zï™®ëJùf wgP&X;=b¯øJ~3±¯-…3í °ïÚš 3ùĹ#;ï ­ið®»ùg±mÀëñ®Æ‰ô:w¡órƒÁmwa¥%{²ô:G1€ïù4¹ÓuÇš1kÑ 8tp¤¸í1(‹Õ¹(U¡'}ƒ³­ÉL“r%8ëòz{l@‘8»›O»ùFµ/œWÛ²Û88kœ ÂJû²ú2L¨§/k¥2  ëqv z›ÿ‰ˆ÷u2 ´s éê)áÊ¢7·ÕMs«°´º£9ਚ»ÉªªÁÙ«:aœ12‡:·jneP«ž…=R 5ÛŸýñ8¿¤—ÊÐI„á³3Ëm|Q(Ê­)£&X£|᪛®"”1¢»›hP!B¡"ºÁY‹ªÛS|aœ¤:z|‘¶•²¢k¥c@»4ÚŸ1ðžAyðµ "<1Ha :¾ÕIgi@¡tz¡àÛškQº`Š½Þ©†‡‹½»™Œ ¾Á é ¤’ ¾Æ™Mª§à ¡‹S¿àk¥\A GÂU·šï¹±nб« ¤ÑR.ºšÕ™@äÛŸ¬9ŸÑ¿Zʾ´Iq°ª›3EàÁÇ«*h€$豚Ʃ>$Á‘èÁZ‹œ¡=‚Áå; GA Hu³¬ F"B¥ÊšÕÉdR/ý9lÚġÚqºÂ¬¹›ê#P +O¹Ua1"Ê»¤3Qù ¥eì¸ãÚVZ'Ü¥/PdªÐåk¦3‘oÜšzмý §)œ¿4°›ñ„3¹v{º»¸øÇLª7z¡0N¬VJŠ–<ÅŽ Âå[úÚ1"ù&2Pƒ«~¨iýÉ©3‘ùª3Aí¢1­¼›W:ò)"ŸiŸ_0yÐác7§¹ËAÒËÙ‘WDBàU k Pâ˜~y— P“Å1𥙡—2)•¼µ1eÎÅUŸæ‘ØY[€D˜´¤©0ðeåC_§ìèq§až91 }QëA·ÒGìR$54a÷ D3_^å5wàé80#ñ:è3(3Ê-À‹Ó80À}íÞŒÕpNë›Õ`Þ/pÂã(@y°ŒfÌÞ,´Sf~Jãs3™nm•ïïõéŽD»Ê³Žº©NÊÓÊ®.]zc³^ë¶Ž[¸ŽèÎëXìÞ>ìË.c®}ìŽ IËþcÎík íÔ.;×^ëÚþ[èîßî5Þ>‚ PîçÞÀA!j°îÓ1ïòaf$ïÖ¡éO¾~ºã^øŽIÏê70² 6ÀY9ñï«þ½50ð°žhðo7 $‰^Gïë ñý!ñVnì Ð7P¬X¯ñÅÁñ_ítòÙÞÛ^òÞnò&¯ò,¯WÂ2v@´m02ßîÖfó𾕘žóô¾éêvdQ4 Š2ÙkêIÏ“K/ðsAð±´Žð· ¹~õË®!ßç_ëÄNñ`/è0[öÍ~öÖñQ1íjÏölÿöÝîqŸòã¾ò„$2Ð÷4m7?øµSø;lž®øÂ^ôO°Yô!¡ªJð­~ùOoð›Ÿð2VõºŽõ¢¯õ\/ì¦?õBg6pÎú³ñ¯Ÿö íµOò·ò¸ßtoîèŽ$xß#ÀOø5ÿîÀ#ø~O>Ô;ö“øòóstÏD<0ýX]Ó³~OÌE=Χð<ÃÛußïב¾®7þ¾ÞÐAç/ãµ¾g·þbßdzvîoäq;¹—ûèßî«{õF›è=¾Ç1fÿ~ç?hø\øy‹/q!ÀϲR ¤|Ôᄎ(ë²_¨€èz¿^§ƒ©£rä¯â…À7Ñž œ})ÐíÁ?8ÿÄ]Øá}-Ïaá½£ój`ÄÿOê<`Óé~ ò› ©Gþ¸èkpëm@ñ‡= ùSj0`ì¡¿9 þ¢Ýl"O ®À(ÿÌ ¹³d4°£ý·á`Ë€Áoö¼äg,z8À"A3ßÔ~TÏZ½†—ÃßsŽðxì:³G-¡}˜°íÁÛG;a yöt‡5@ ÝÝáC…7P">VˆI\¡ó#uÑ諸$X ¡ž,„º°û…>*¨­ ×+v0= Ã.Xá \{apŽANxòžá¬{ÖdÌh6X ÿžÿ;…rÐøÑA{W»ájz…Ù+J¿Y! -<‡/ îB È}á;D}ñp 2»ôçúŒ!2D™PnÂ2Øë_”k0VÄþw 7Oht9`‡ä€àf@ ø,¯Ã¶¸€œHê&Ù +ŽvlA”w0+I} aåÂPäƒF’EpIO<Šs$Ï‘( Â%áH€Š¢c,ª¬"QÌ^YñÆÝÄ®{"$ ‹J‘,n–¦XGТT\‹Ø°jÃ{w‘Hz“=G-ß¼ˆ„0#º8GŸ;ì€ððf/æ4 +!쳇`0%2C~8÷ á¹ë}\AÌDSïˆßÄ >°¤Fº@4Ù9z0@û%–ƈg|ÔÐ ?ÀÛâÑ _’A.‚¯Ú‚DÂ#^ÔsKq/šÅ§=`Lˆ<ðøÕAÙØ ïBO¤ŸÅA-À?è1Ÿo”z’ñóñBâxaf<J­³8Å‘H Kbs¼‡´OÂ=é¨ûþá,RBp@,$#—V#wDˆ®Q!ÂÆù—Ÿƒjz«׌ÇÜÈ«ßcüpû¥ÃC˜õª`é3 Ñü)ÇÉÙJT†£‘Bº@êxÕÐhè tÀCÄÖøcC\|êèiÃè¬D‚n¬|.Ò?b¿ß(#5¢p¬‘íðFÙ!D"1ô‚ 1¾¿•è §ã'G Ûd…|“DE D™¨oà‡l*$(Æ¶ØøFåVŒ…£r.ŽÊó8já‹g±=ªÅ£ øxª„$ªR+ÒF>‡+õ¯DŠbQgèÅW¹ý¢{¤•UñV¶ÅFg*weªäŠ«2)¢ÇaY[Š¥¬œŠ‚oõÕÅÉð:˜Ó¨»ó/ÒÊõÐ˜Ñ ÛËÎL³ô3uQ UÁÈp›•à€n0 ¨ ¨†9À\CaÈM:ÇÚà5Iƒnà ¾8Má`6eB5ëpÚ;xz’.ÓCh@„À ÎAPóÀ {p8'   Bpœ€ø€*'Hô€PAЈÀs‚NÑi8€!°ï xN: €p€0;C'`õ@qúNài€ïÄÁOƒ€<§ï„ÉS<Ïä¹: ž¡³€ "§AèžÀ€Ï™=@€>€€v€ >À! Z(O)°ÖÁ4 x:€0J@"ðfüƒdp ª€ ñS€CÀÁØØ@y^Ð~p €Áž`8ܹ  ðÅ3x€@<€P¡ yºP =-§ e5ôsÞÐëiCÙ'ÔS…f ª8ƒgˆñ|æƒ*>g8Ÿ €Ù<€ö“ ìwJ¨ò žÀ ê ªÀðœTy2ƒÖiA÷A+•³„)*:±À,QÊü … €€ põ”£ `Àƒ?ðtÁàÀCú9i,ˆ-à”>0ÀÅ¢ˆt@‚và >A?À`tQñ 9@TŽ"0p¬' 0àTNÐ=((ˆ¥”ÐpÁ.}Á@8ð‰äh䦔Ð0$À0¨ªà—À* LÓà†À<Øð@y¢P0*gðà „ €Ê œ©X§í”}vaj8€½§¸Ôsîω¼hX§ ÀsúÏ)N-ç€ç“ÈÑ€>ÁPœ…p9#À:M¤Ü`‚>úJq0P”}ƒî‰@`ü€ `•@pppC Óp¾Á?¸` L^ð úÁ?äààŠà (6¨ãà©f VA 8€nêøü |€ êºA<åtØ‚nÐÀªà© r0`p' =À pö À65 Õ ÀÏ ¼è@¨Õs€ʹN @dež^4àSÏÉ*' …œ`à£nVƒà*çà¥@€îY¸©7õ¢¥Uydúzã¬Î”Ÿ€`Z€©€ €[ƒé0mpT|:€ Ðz< ®rt„vªYÙ'`Ý¥‚u_k0u²Àw®Rëéd—ç35¡NVz c1À…U«ÀwY3 9€œ¾ÀX€b/¨î|ž0vŒ) xž•³p€A°Ö9x¶Ì3Ú0>/ìñ ÃÜ"Vq H(¶%r"°G@è<À~þƒ?0 ò?}·¤ó(‚V®0p² q¶NGÐ~Á5Nv$Î nçmæN?êJÑ';Uèó–Ú‹;GÀeŸÝS»v\‹»B9.a-st|Š\ö¹À)Å5—:‚°>{éïÄ¥¤ D€íÚqg¨&}’ܘÛJY®A0àð\£[hAТãâRX6@Ôí¹€Q»r…î/`ñv@Øm¥vQ®øäaWÞŽ@Uèð!f8˜è . W[O$àÒn  XŸ€ð^@w§BU¸ ·Hä¢Ñø²Hàë¸'øú@ÂuŠ8 轤×óž^0z-§ê ½¬÷£†Îºz[/ùdŸ ö®Sùr/ìµ½¼—è^á‰X“§«•¡Ç7zNOçÉ>aÀ°6Ì^0ð|£ïô­¾@úªTì‹f/0à¾ÁsðëG'(ö=áW„žßô+|¡/P0T†¾PÜ›Cµ,ûÄ¡AôþòPêGèÈÿ@ÍöP0Dÿo†¥4ü"Q,€¿¨u¢ ›[pE#0¥ÀÀ+OgúÞêØ7`‚°åäÀø@ÃÂ'ûøAôu¦? €l~À>ø0XÓ`Ђ5,:p¦o@³` ~°AxB¸a#üjÁ©•]¡=XâºÖoN‡éˆÂç`´¾ÓxÊ>@VZxŸSð…C/ú|D¸¬„‚j9Íðn…Ñ× ?8œ}å0FvXÃÞ Þyâp†éð9½Ñ˜^÷{ ëv§0 ƒƒÊzYˆÂá`´€Îz£p:Ðıµ÷Fáz0…a«;•©D¸8Óg{áÁ0 £x·bÏ‹ ˜ÅJXꌋy0~¼X»WƒÀ[Uð}åÀ­Øwd¬añÁ0Þ­°—ìÑ?àTÀ8x°Ó¸“ƒ ›5,8à°Ý|c›\?o5Æ*ôÅâ^j¬aÙ Õ±ÃÔ°cq,d‰ìÖÇãØ7Ô€æq8¿QÖÇÞ+À¾é`ËJì믙]¿àŒOì;Žðçu¿ã¬^do~½)EîÈ€ûºU;L©o5>¾“ŸæØy¬|'­õ¡ÀëÚa*|«18¶Ã4÷Údd rñ1´5½;9Ûeo|<=§O·Ø6_ 4ìì%€);åuœ‚áçX*'å•ÿU¸¦·*ÃR…–½2,mªW,€qç'@¡E×â>Q‹Ûu€Æí¦A×ãÎÑ+uI®víº€ÀíöÞ¼ÜJuîÒµ¸ üܼ‘B%É'A˜€Ð*ˆ’j½Z.i˜‡1uØ ¤£¶E  E—!Í£)ˆ1sÔ¢òæÍš6aܤxmFm›2dÒÔiÃ;Lf–-‹sr̯ÙÈ‘÷“$Sì>éæL‡eÔžM«Žœ4¸Ùð(óŽsЛ¬Y–NM:sèÈ)¦Í—2nñ^H ÐdÓl9íÔÓOA ÅRJåÁ”SP±Pƒ T±`†YuåáWŽUÖxj±å\rÑe^zñ•â_YFXgˆ)ƘcIFÙfîñ ÙeptöYh£•vZjE¶fl²ÑfnºñæpÂ7†ÆùˆÜ–Ë5÷\tÓñ€Bu×e·]nÞ'Zï…1iÀeßzí½×y…!4î)€1¤Pß}ùí×ß(’7%È“Oz9(V„>Ò…J•!XvÊ©Xd™ÅæZm½Õ—Š<Ü•WP.ú¥VŒƒvXbP,ÖØc‘MæBe@fvB"¹š‘¨9¬’¯Å&¦“·å¶Û•S7\qÇ%B—n~9†tÔ9avÚÀ]š­IÁç{(¤á†üÅÇ\‚ò`ŸM…òç€*@ £êô(ƒB5é@6e) 1ÜÀ!ÃMmõiˆ#*‰¤žxê_ª¶¸ñ«¿ÆJ#­¶â˜ë޽ú2gj ©k¦û²Z®1¹lmÍF -¿Ik%–ÕrÉ\¶Ðmæ˜Þ–î¸ß•+ê¹é®ëgŸÁ põÞ‹Ÿ~ú"Úï¿÷¬ ¤ ¼¥ W o¸iˆbU,âÓ%–Š¢«©²ÈêÇ€…<ã¬6Þš£®¼b¦²`,{&,ÌGËZÍÊΆ3”ÏöÆ3•Ó^™¥µÊ í\ÑÜŠI&¸gv×txt+à&œr–!õo¸Qhîâ'5 bX\wYÊõ¡ü*Z`Ø8 ¼`¤fCˆp¥j³i` Ã-qˆj¢©/®¸ê^|Ãú75Öz#®:îÊ£¯ˆÙòâIJ¬Í’?鬔—ûL­–Öbû9˜Ý~k¦¸h:¹Úô¦8…aNìéìd§Ú¹Áv d—Òð†“Ø‡ ½Ã×ïö•(-ŠxŽ:^Ù:…6 …dm‹AÄ@ŠQoDÖ³ß:¶·ìõM0ß _ÉÈG¸óXës\û„ø¾È1‹rôëY•îǹkyN[¡Cšÿ–@5¥Î D’ÚòŸ2´áƒÒ ¡8øµ¨xc#˜¤Î¶¼´ÐyY™AܤÇÂNU/-ÃÞhÈ=zOVà#Ùø‡2Ãý(q.KRÌܹ&Mn~;Sb怆?¡y tGÝÿ˜fE©®€­EóºØÍ®v—á¢}ÚÆ­Ñk†<¶Ñ„,ÐTVn0Çú2z¿¼cÝ4fC>¶ UYàLV¾ÂõèêSIÄFÞL~:³œ$¶¹-uî’ü]ÒH@Óu’M ÃwÔAøÈ!xhe¾€×A°1„d+˜-—âFˆa…a8èe§ *âñzwC•1»ç7@êp'3_Ê ¬i6nfEt$6+­%j.hß$Z8¥¨´Ò‘ už\X'Ü) y*ÞÚù'dЕ] ž‡wOãåsÊã'.UøOÈzr#èV„™Ç„rLo}Ä[2'>ÁEÔ™è¢41JMŒZ3~9ãhý¡`‚„+õúJÚ³Q>ì>6Ôü3Þ/•j1Æ6u†e(*H«6Ó‡ "W/êÙ%ñ‘Ùìè$»™¿'b2µääd[ÑIþ¼•¥}šë¼æÀÛœÖÓŒÀMc-&TÂ×°08nbåÆT„Bw{‘Ùt)»CBJÔ™­èveÖÝdi4¬I-½iZ‘¢VœS4©S‡.'¨‹¦íSzn:O2Æ„ÁÝ/û[!x„8@1„c(V,ÌÆ \Ìèúq²TmðU±aí*’»Çú,xÅºÍ —÷´QÔ$͹^ò¨´uR“¯žn§Î¸ Fwî:‹÷ê[üŠ–#ä/q¦K†9E¹ÅsAéöÜ"#Xº2¢î2yXÈg6y«O¦p”½{a$FRídH÷÷a’¦—­(Eç—a+×0ài¾·ƒB^íå»ÞÞ—§ù…³>å̼¨÷¨zva0Kä=YªHä ŒÕI‰f$£¯‰áGÛ/Òf5ïHµ,âszù½qméOùÀÚJ‚ÄZ}éYFT¿Y„«žñœkŒT޼m¹±n.ŸkýØ?yÁI†èu1›>`sÊ6X-Úc—•Ãg=/ˆU«ÞLCÍÄ·K1zâ²fSwÛ¯1޳¸[ËãÖ ÈA.° ýì±wšÁò¾,„ëíä{+:ß&6¿ÅKZIw˜ÒYVë–Y›ºön¾ï™vi»m÷Æú•xPÇ})±TFÀè®ãž‡¼q[»×ðÖue ý`C“Ñ&vÊ÷Z–[Ù’ŽyˆW;b·¾ç.õ4LAMS@5ܾÝnx9¼äs˜M†°„ H!1WÉ,Á Tà@°4&ÐbG˜ÈHQdrƒ^ü(š< l –ÿÖ*’;Ýíþ¼ëï~¼àÿ*cñDÉâèxÈ‹Dó9°¼W2/“Èq+œÇ|…rÀÑß=ïBØ{ßÿþ„À³`ð?MÞëK¸0̾ñux|ä5_ç†÷(¨s¾?|Ñ£ îÇ?ýòUÿ|Ö }úƒþõk¿}™`ª*£ øïŸK^$æ‡~¥‡|Ê—zÍ·zn®wxÔ'ŒG·×{pÄù÷yȘcúW~Åw~¤gzɇzÌç|Ð'\^‰'{˜}¶'yø0ã‡yˆB›äz(€ X€#ˆ€A§€({Ö·‚Ú7ƒ¨Bßg„)k–‚ƒsçé‚ëw€í—€…Ç€ñ§xDØ‚šw)´Bàn“`ÈO¨ƒ(‚ìW‚­„7„´Ç‚õÇÞ|X†9 6p‡fh|¨~H‚î„X˜‚pˆ}Eè‚t=º„‡bш}…(…胪v…°÷†ó'‡Xg*´{øj»‰hˆ=X…?ˆ‰ ¨…q˜ˆÜw\3„Šè‰4pƒ˜ƒ˜†S(ˆV(}…(„›èŠ2á‰uø¡¸)6`‹Äw†¹hŠk8ˆª˜…*ØŠ\HyÇUà|_Qyè„~¸ƒjH…lø~¿¨‰[8‡¹·)Ø8ƒ+Ä0Üøy¤ØŒ”xŠãHˆ™ØO‡Šxy_‘þwü¸0àñ…<øŒ½ø nˆÁXLÑ0›’‡2¨ˆ…U•1ŠÞ(‰à¸‹–Hx¾x¸”œH‘i‘1ð$YTFÕ·ÈŒ޼˜Š¹ŠÓˆˆy’Ç•\ÆH‘µ(1:ùËøºX‰¨x‰3)")ŒLñ{Hqtúg„E`,”9”ôGiˆ 9‡M=2À”àWg_ гxÊ€òx∕ YŽ yŽHFw©yL¸t¹“v =±X—ÃøO}©—™!=Ù„-)”θ– y‚n’[—zˆ’{ |™‘¥8)“m ’Õ÷˜Š8†%‹¯¸)8p–XѨ•pI‘{HšdÙ…ù?9ƒ±É–€iš.9‰j“F¹™4™”7y„3p‡J¸)…鈓œÉ›0Ù‘ÑœH陚wåfœûxS qšÉjý$†ˆTöBëÖtíÖqP÷qñf]"guZµYŒsr4£o ^c5^¥pË&sÍÖeìâv=ÇW¿õmÑéC¥"žI÷cKEkæùTO‡L¹öPìYhYõk%ŸZ?õIeöoWvi5v×Z5õvÜöb=Õ÷ Iƒ² æ Äätè)¡QG¡–e¡¾†HîÓY‹¶ušaþF^`s#Jp˜f¢€ò¢†¢>7 ¨X4é{§ y¦t Zž5zž5”ž"³ž;Zuê£%Ÿ¥r]wŸ-—lX–¤—ÆeÇ.x¥êfS:\˜‚qé&d1Ô¥z£’•£Õ5¦½–]X§¡ÕDŸSF¤de¤“†VèµVrʤ mF•—Ù›Ði‚G±Ž¹šÕ‰Tù”Šx—MQ™xÊ–º0¼$1w¦¥¿4£\êXƒú¥8ªžR§dó6rïù£ø6ŸBú¨Æ©ù©l•Ældçlÿ9jZÓbwêmyúª2ã”1š¥ ªnL'¨ÚC¨ Æ«:Ju‰zhð9D^娩øérú¹¬üÙ¬þé'Jjbw*šj©§ßùŽîˆtÜj«ßŠ«áª«…J®‡j®LvuéÊ@Šrj¬ý†¬ðª¬b§¤—š:'ª©§Æ¿i­'T[Qššq4j°y¡ ¦½r<ª¨±Ä:±íz¬ïê¦"Z©3WvètWÐZjúºShù’Y”ýʘœé€ÔÈ•G˜œÇ™­iŠƒ_1µ@Y´Îy´ÕªÙ™¤Ú{æVÈŽS¶$™BX;| ›´^»´'4«å§´ ¨õ U»ê²åÊk ¬gº¡ßu³›³‡±pj©4çI(bvº©m[ oK“S뎈%£äY°N•· vC »kKFo€;a‚ÛhkZeÈv¸oʳý9§Sóò¸ t!;¹Òè‚ Iõ§®++®žË· ë·¢‹¡‹ª®f³ÅV¸mªº;;pqº¸?ë¸ûp´ë¶ ·by—;°™¨*+IpH@;U/[¡dÚ£š%¬h*e„ëu©¢HʺôŠ:b¸1k`¢î/a0²k½+Z»Ù[¥+Yü·»uÛ»*»P'¼ û«îi¼3;¬iÊuö‰º z¤” ½Šë³äT#±[½ûJ  zÀÒx„鸭@Æ»)»¹¿‹°ã*ÁSG¼ÀjÁî[ºjºÁ*©/÷Á–ÂÎê'n;ô‚Â?WÀØ+ª°šBµÉÀÝj·Eà ¦94¼¡»ÃfJºZ¬ñ˦_7©WÄ={Ä(àepœÂ]ËÂ)ž[QUŒ²·ŠÅ·¶·[<ÁíY¦í¸a¬¼+GÆóëÁg̬%ʱlìÆL,¥®j»şKÅ ¾z̲7ÜÇ9ÜÅüÅÁ6ȃ»¼òÛÁf¼Ÿ$º¤Œ¬ÄoÜÄü*¹r{¾gªt[ÅœÉÀ‹¾}ëÉ€loŒº®bLʆlÊCœÈóºÈŒ›ÄlÜʼ˜’,ËŠ»0,k‹•Ç–ËÊÅÜËмAJȧÄɺº œÆõºÆmÌÌ­ê̱Lq³,1•<ž³fÍgÃÁËɾúÇìëËÞ,±£\È,Äñš±Ñ+ÂìÒÈêL­‘ÜÎßÙŽ1`µw,Ãôl£ö¬ËÚ¬Ï2Ûâlº@\¤ãü¼hܺ&ªÌKŒ¯8•¢®¬ÂmøµjSœ†¥1ÜÀ3|ÍÍ~³èªÑÀ Îm±:[¿å,Ò«¼Ì¼Î,ÊÐCÕŽFUË—|·¾›Å|,h¼ÍûÜÍ‹Áð+ÌýÑ@Ò÷;Òé\Ô ÍÎP|­ÐS¹–ü½NýÀ{ܲø ³ë›Ñ‚¼ÓÿÎ}±äìÕÈü³-Ö‘»ÂeϘ;ÏšKÓzëÖRÏ8í°:¼uÝÓ†K¿D¬ÈªœÌ¬ì×× ËMq#•Ó\«j}ň}¾6=ÕÓs Ùí¡wýÓ•}Ì—Í×amÒÒ ¹› Ø,„'+ч]ω½É‹ ×çêØ«ýÍ‘íÚ>í¼]mÙ‹ÙDmÛl6»NÌÙ»½½›‚­ç潆ɥ h8ÌØq­Ú`L×­í®ÍKÙÆœÊÑÍ×™MÝÇ ÝÙ½-—¿-Óí¥Ã}ÏÅ­¾Ç=º¡ŒÞ?ÌܓȨ¬±Ò;Â}-ßC ”‹Ço S° á¾RpbPÞÇ0þ(3"îòZ(á§Þá•QaAâûA3 )žá,Îááz¶©ck, ¸5 0ã6®‚*®á:þ•‡ç{M98@âC¾G>„Ižãî{‡G3°2`$ÎuPomT~ã+Þâ¶×”6æl0æ5ŽæJžåNÁ06¶ÅIâ°#ï"áwPr€o^UŽái®ã³,6°Gâ)‚tpk‚>æ…^A8®æ^Èè1À0Bâpd~û —~åš>¹KÆ(Uqð¸ql|ê™®ã4°è¾§RAâsÀ @êe`êrŽåLq]~TUq$.ìyP¢Qz¶~è.þáÊÎ0ê¢íÒîçÕ>çn’0ÞìDánìÑäÉØãæÎíå/îÅ®æÙþâVÑêŽ&díÓ~énïžÚnSAþè‘>qѱðK~qÚÞäkãë ßðõ¾äµèå>Þ$~hÀtàð.žñ2@ò•æe0„>|AVà«aÎ ðòtó,Ð{؆g>fì:¯ì!ÁFôHŸôGoì¾§c•ácGU}6ÏÆt`k¾ó=¿€@/jžë åWôJ?öHÏôõž.õ0_õ9_X>[¯îؾ6E!ödOöto‘TÃ7õ8õ<÷ZôãwŸ÷Š¿÷ Þé•(ølo{>øq?÷šö4àø%÷ŠŸôê^œÚ~x~¿öV¯óbXyCðÆ~‹û柯÷j>ôÞwú7?ùª¿‡•gœÇõ:.ûÄOûµ¯ôÆîõZö‘úmµ¬ü‘§æÅ?ûžüÂí&écj¿û©ïö«ÿû®Oý±_þ×üŒãÍïýÏÏ0¾ßúÁÿúåoýØú™¿åœfh|®ùq~s` ¤4Òð4Ë[õ8†一07JÀh* ¼€0VÀÈ% ü€ pN@K ì€Ðª@è3 TPR@Yà T/0Ú@\€°@»³ ìt"€î@ ¸?`Ä€OPÊÀe` ´‚L :A-ˆ`¬‚,0 †Á-8Á ¤‚f0JÁ2ˆ} $€As `}xðòÀ ˜Yßd‚}ð Á?!!„‚†P˜ál„8ðÂ>è- €pp&@:èãì`ø„ ðzŸQ8 Ca(¬!¢BS I!)d…ŸPªBX +,…°êÂTH o¡÷¡…²PöB_è{a0ŒÃðÃ]( s¡/¤…¶ð&CW¸ ƒá% ‚qJ#Ø “ è…µ(Ö@ Å¡8‡ã0’CXhÓ!4TêP–ÃxX‹Ð¡9œ‡íЪÃbÈéa ЇáÆC€8ßa;¬‡¹ð Dqx 3¡܆œzÃjÈ Ë! ¸ˆq²BfÈ ÙaFĈïðþCø5¢)䈫$~DЍ ù!+,‰ÑrD‹XYb3d…&šÄS( UbFlˆBð!¢n( h Hñ(–Ä™âR´G1*ú<×C KXñ*fŬX»bRDŠð)6E±¿bW (Vq+jÅ«ÈåÒY¤Šfñ$9E¦hÉb\|‹i±-®Eµˆ¥¢T$‹N,:À»ˆ»¢^ÄŠjÑ-F´³á&\€HÐ0+#e¼Œ–3jFËX9ãfÔŒŸÑ3vÆÏ(?ch ¢ñ4žFјS£\›±5šFÙÈi#h¯‘5ÂÆÌh+ccÔ„s2ÚÁ!pˆ£q¼8Ê)Çäè“¢SxŽÏ1.&Çé¨ãq,F;jG#`‹£ TÔ‘:6Ǩ¡£t\ŽÕÑ;^Çìȱcw$ŽáQ9Å»X£csŒÉñ=Þ€í¸õ#~”#qÑ(ÖG§pã£~äìñ7 E¢`ô‡;~À¹¸#^¼‹€Ñ*DX8!£…\Œ®CRHt]¢)ì#òCžE)!ä;D‘bQE.Æ»¨ µáPŒˆ Ò)Ø«¸#u$ü‘>2H€9$d‘’D2II%ù±ct’Ù‘^2 +à°€WI.É-©%µ¤€T’]òHŠI09&¹d™|’JNÉ'ù$ °’XÒ„I2©$käc¬ƒÞШèI=© Ÿü“€ÒðèÄ=¹'Uˆ¡<”ˆR…J=™ab |”~rP.J‹(+¥¢œ”:ÑBJH))¥¥´”“²ä9ÊG©)e§$”Ÿ²RÚÉàˆ'cª|•°2VÊÊWé*g¥­¼•¸òPÖÊ\É+{å§Ü•¾RV®Jˆ(½á<–VÐM"Ëei™¥l–Ér@2Ëi -©å³dʲZjKjÉ-Ï È–Ý’ZËY,I`0ç2]¢Ëu™.Õ¥»d—ë^¾Kw9/åe¼œ—æR^ÖËzi/÷å¾´—ý²_:Àù.æ¼$˜ðÒ`êK{90&Âl— S]ŽKi¡´€D cjÌŒé!áܘ³cöÁEh@¦Æ™yðšLŽ9 S¦" +eâA•3[æÌÔ€+“L‹I3M朘8ÒúÂÐ3AæšE3djÀ¡I2sæÑô…Iód.M¨ù2æÔ¼…Q“ef@¤‰3W&ÉäšÐjf@ Y.á!ÕÌ€E mªÍ´ù4±¦p3nÂͶé IæÚ\›t“~@¹)7óæ(ü€ðnªM¿é}ö&ßœ›WÓ~@Á™6¿æÙÄ€‡qŽÍð1aP´‘s"ÂBKIWâæ¬”3#†DÐéAâçL”¡Ót²BKi"C¡N†¤ó%ÂD؉:aa£¬‰§Q¦Î‹H6[å7̇’Æ«H;u';ž£³v²Âá!caì4…²xêÊß¹<£ô4”åyOìi;¿¥õÜž*${ªÅÞÙ ['(t“»³yôY:cb÷dŸ²w.Ï™>…ç€4ŸŸðuÂBø =gçþ¤ŸÝSÎÏú˜>ÉgQt˜&ºIP™@Kâ­”¡òv~Äš(C¥N¤ ˆÒ‚ÂDY袼 ÒƒJZ¥¡Ô 4„ªJÊù/ç,Ÿ’0ÒÂ!@Ck( …”p†ÚЊC_¦Ý¡C ‡ÊPXDoè£Ì¡Ý³ˆÑ#ªè¢ЉÚÐR(‘(+T¢Ò€6H9ÉEߤí¢`ô‹:…0JFÅh£gԌ¨FËh}£iÂÑ9*'Ùh¥£x”ŒÆÑ<ªFâý£f´ŒjQOÖ§!ežˆthÒEzH-dbš‡ôæDDªi$]¤Žô0BRFŠI‡ç$­¤¾“6RJÚ7é%ͤjцÒKº>Qi)õ…ƒÔºÉ¾8 !å,‘V‘€þÏú-q©›´¥¿ô-ÐZq)-À´– S]JL‘é2-TPÞÒg ia,õ‚R!›"ǃ¸©7í¦Ú4œ†Sä¸MÁé7ý¦äT›¦ÓtšÍ©;E§ãÔð¬ÓlzNß)8§•'žÖÓv Oçi<-§õ´ŸªS}jO÷錧ÿ´ *T|zM€(5¢…• Q+jDm–Õ¢æL‰*Qw G­¨0gfÔ‹jG*Dݨ&Õ£šÔœ8?ªÀ¨.¥~T•úQEªKU‚2Ф ™šQw`Ce‘sQFF Z!‡'.½‹a1EUaJT™¢PE‹Mµ2|R½èKÇãªRªjñ¨ŽGéIÁ#SݪX•ªžÅŸ AèG„”"tOöÉGÉ:è•2­òI¸ (åªQ‘ ­–Õ·Zõj5«1šþI»**ûê£l¨`&Ö ¸X-`c­€L3†*ÖÇÉX)«cµ¬³Uê6·¦f}¬F´FVÂI4§ÞÔ€ ÕbæLÕº2Y«Ét­ Ób†ÔÖWkm¥­}жæV¯yoëkõ­±¸nLØ:\álý­»¹æÁœ‰X¡æK}®F@ˆV_]¡ët½…$°ºF×ëê µëKå®zÓ»rVÅiZG¡w ­ŸÕ¹F×õ*]‰¡d­¬·ð¼‚Ö†j?™©)džõµ<ŠO½øùg(į»T¿Oµ˜_¡#þl¥‡±À>Çýš¬Sè¯ß³™.Ø«*¤ •vRfØE¹a %¤ ‹öQbXbåˆ5±“R°úÉ (YìŸt±+¶ÄJËaIlE±‹’¾Øjºc'¬„}°=ÈâÄo9Lïk‘ý¯Gö|&ÙOè&¬U²öÉFY(+`‡ì“e²Kv}Ȇ †@—ý²4Ì~Y"€Ȭ™Å1@¤Ù5+`€y³nÎÂY5Kg×l™½³fVÌzÙ! õ, 8³g–ͲY7Kh߬œ%´u¶ÎâY<ëgÃìžý²!uÑ’YAKg m¡=´r$ÑÚY@[fí£}´œ–ÌFMÛf1-¦…¤¹„Z²š(g€«}µ®–gj@K ka­¬Í€mµÖ¾Ú[‹i­®-NÓúZ]ëƒm¶µ–×^@dkkë{¶•ò×[JˆZY¨åtŒ¬†Ú€mËm»­·µ9 ÜŠÛqKnsÀ·=·Ü¶Üª[q‹n º]·ëݾ[x[nåí¹˜ô–ÜÚÛo›oõí¾í¶ëßÖÛ›nû­¸å²Guó)ܵQf@Ã}¸P®/‚È…»p®Å}¸÷,FŠËp/®Åõ¥¾”ãn>‹qA“äF\“[E®ï¸%7ãBU‘ s-®¦”¹TÑåªÜ"€SkØÆekºÅèX8?¦÷)£ðŽÂ¡{þf$ÞG•>GWH]¡\jºzêºBt ­ÓÐô…Z—n¾QÈY#à-t n3ìŽCI g )„ާõézŸ¡{½¬¶°>ÝIw äÅ”“[ÖÚbCàH,}§/•“”1À” cÖçÚÍlãâÃ.°•Ü»8Éè¡q9å }hhVNÇ7P¯—EŽ7×ô¹Äxe€ã]Ÿ7êÕ"Êky7ÄåÕ¼3 tÞ.;b€½æô–^7ëe¯¥ŒFqí¶ÞV {#ï好%¯ö¢ÂÐ{u¯«å½¤×÷_ã‹x/rô¢®—DR%oó•¾”÷rÞdÄ{Aïõ½¿×÷6Ô¸)ë/ ¤¿ö7ÿNð˜í/þí¿›òÿÎXþ €0®¢ð“_|°>¬‚×!bΠé ï¢ðk`«Ê›Â`ìÀ~1ƒà L‚Að6‹"¸«àÌ‚Iæ ^Á¹È`4Ë6jpÉ3*6¸ÏàŒf{0r¹Á98ß`L„yp ȉ@ø'a\„›ðÂq s^#ì„¡° ‹P˜ Sa)……°®ÂR˜ Æ/̃¹°vÂÍ5¾FNðj^×pzÅ®Õ wÖɪ†'ö>‘SŒ×¸K‡»«&¯žµóÍÑZ^ñðæÃ0 ûa;ì gšyxh:âȉ1ã„ćxNbê9÷°&¾Äœ˜ßÂM,ˆåfd%Å‹x[bÁ©ˆIa%ÅA ÄâYŒ‰E15”Ÿ8SâLì}rq.®ÅªXúb]Šù¦'îųøcSü ‡ñ#^Æqó'cZ á&$uÆ 5TþÒGé&µq-åÆ2‚Ùb Žë£7&DzOÊ&Ë€ÿ¤:^”Û8‡ãuüå1…Žç™–ãò˜é1:–¦ó×c€lŽSì8ÖÇò¸ äìŽ2¡dÇÉ´<æcè‘ñ±?FÈø?äÜë#—ŒÙOvã ²9¦÷ø9Väç’C²á™¥-š¶c‘ŽI²KÎ¥'Y,Þä”m2C¦É9»Ðl{@90Wͪ'wm(e¶)—²R®ªò[e±:#E®uÊ›*ƒÕ§hŸjˆ´ÊM™ãje³8•±¢QL¸Xù*‹å·ØP¹œ[ž\î ¿ÅOûey®]†<÷Œâ€ßË—q@ 90Ó€! ³a¾ÂàÑsàSËKs€i£¾72ßË*³Ã¸où-;á› "é²—½ËwY/÷åß+˜óa>ÌNتEÆü˜3•Ì’Ù2[f.ûš-‚m>I·ù6—Q|šc ðƧmt0æfÜ|’гEØÍñÔ Ká ™‡3bvÎÚ7Œòfåì…sm6ÎÄy8ÛQ1:}órf¨BÛ^j!-%ó´”å¹RžçJi!Mè'JŒèyxšgøÌžås¥ìʇ1>«ÅùœŸëó~VωÑ=¯ ûœ(×s¢¤¯¢ôMÊ#° ´ :BChí !´…~Ð'CÛ íx7´†f¥kôRh-¡Kôˆ^ÐÚBkè Wô†Ñ$šB“À¡Ot‰VÑúE·è}q`´¦Ñ4€þèí¢{ôŽvÑ uøܼ!”´’6*b2Ofˆ›ô—ûrK[m ™/îtÒL1ƒi(½ #3•žµVzKgé+Í¥¥´—Ö€cúJÇé AÍ´Å­ÒMOM§i,í¦.œÓ_iI“i).bÆÓZKïé6í{ïôÏ Ï„—\úNZH©+µ¥¾Ô˜šRØLÍ©;µ§þ„›úS‹êQ=dIµ¨N­3U«êUͪ[µlí­®:VËêYýªiµ­¾Õ±ºØâêYsŒ¯æ¼}’ó ëcUõ¯”Æz oÕd½€ƒu².ÖÃZX#ëhf—5µÎ”à‘Z?¾û¨­§µ±ÆÌÚYGëùÈ­“µ·Ö4R/H |Œÿaòy×A ½Æ×xM¯“$…×ï×kzY÷u¾¦®þ:Ük­¯ñµÀ~†[›Íym°6¾.ØûÚa×kJ°%ö¿fØûºkâi,‹!©3ÆÛcoD÷ꌶ2üØ·8d?C”M Kv»ž†¯Ð‹ì“؈9¶É®›Ô“fƒl_<³C¡ŽÙ'hSC– …ö+ìž=»®l£]´uöÐfÚQ7gŸÂ¥í´6Ô‰Wû&mQHµ§ö-D¸ÔT%‡mŠ<¶ii0]Œ<Ùl+S¹¶ ãÙvÛ2¹ª¾íÂØ¶éöܦŠu›*¦mµM¶Ùvàe•sð®ë²9Korá>Ü*y#î´½’÷O~ÉŽ»p«XȹKrG®Ü{cnË ”ù±ºžÀ„sËíÍÝ·á¶ãÞÛ£›t;…Ô­ºC4ßVݬ»uÓƒ,»Ë6 °°8×äNH–+séï[äÌ8wwçn¼è»yw@Þ…Qxo ·/%™Î›yONÀÝBų¤Ö¶]<õ^"pe÷fE ÇÔ€ð}Ttš5ß/u}V@õ]2LûŽ€œw0èäX”rýÞ|½w}æïc¸wÿF»E ï<ôR9OoÜæ ˜cx ß6‚B]H)8çé½<|oïݽ§ø&ßDsó½TnØ7ûæÞ…Ïoù¿ïw¡VÊû{ÿïÿmƒx ÏF±€£Z#À¥#`ïõá ú÷ñÒÁ¸œœà<‰ßîÏýB(Ü{â 7{J(þÄ÷²çËW!‹cf‡1)·¸‡ÐWÜŠSñ(NcQåGŽ£y/ñ-*½¸Oã¿÷ŒKqB9ÏxÇânü*´ñ5ÆÓ¸•QœŠkJ8Îǹø¢Ì㘎〟*rE÷[t¹›-Sܽ· $wäU+³ã»mɱ²Â¨Ü’|)cnäs=y$«Lœ(çHi¹-% —~åb(–ÃòY.Ëk9,ßì¸[Òò]nË{9-Ç嬜^KÈË‹¹/ïåÀ¼>vKw{̹3Gà,0Igé%M¨«9lžÒŒsšƒikÎÍ}¯#Ó`ºNwsk95¿æè<;2Np~έ¹8‡Íåœ+éq~Í¿¹9§çî\Äó{žÎë9ãä²U² ôÈŽºA×€nrÿôJ˜Ði É\èm0•g'nÏ+(™ý¢#H'éQÙëz½è £oôè-zFéí‘=BK“Ò5zJ_“,ð¼†Ô“îÒäJ÷è/µ¥£tþØÑµ«N¿èó¥ÇÀ˜ŽÓiúNo¨ºæa‘Ê8-æR§¨MÝÙ>u“éˆzädê‚ÓªÎã 2«z œê]=ª+õ«Î[½úX?œXýnÎ_FhúK7ç"; èfÛz@·Š7pUÉïÍ* 3í^oè9@Ì€—Š1Õlؼè°¡?] x%ѦLÛJFv %»JÇ€ÄÖoß x¬SxC`î^@×û ¥dÛ¼H]žöµ+foÓð­»ï4`öz[·íVrŒ^@¼¾lÒ^~}ÙzoÂ^û`ÿ˜†j͉3;eì’U²§ÉçîØ«»fgìzp³ÓõOXA»h·€¤=˜ö¤k%C!?ä ÏÒX#.Ï}ŽÅ¹H÷Í’|'ÌN!×9%½º¥‚œ4<†2 ¼õ ­ps`TÂ\®~óIÐ{q€?*yyè*ú#£B<ä}ð8øÂ—¼“dcl „‡ð~óAøœˆáA|¨ðqÂGx_ò;_$à»ìE\@ìý%ëw7ë¥ò}¿HM½ÝøžKÝ{ydïNÁÆewQ®@Ê;.ï($ÀîäñZ‚Ê[y£Ð0hß”¯òW>8‘ å¯ü…ÈYÌ^âåË NO Xý˜n À/Ðxbý¬¯r9!È9ðb‡¥wO Ê¡ „ðtÎly Ç>Ùgï@èÀXö, Å M3æ€Á%e *\ MBfrü÷¯D(SZ!óFL™3\ÀQ£"”(A% 6et€xA§ œ0bä 1Œ4dƼ±©²Ä9eÂÐy#Gf’9l¸!CDN˜; Ì0ÁæM¢G“ÒIóÆ ¥1A‘“D:g@è”[C‡N®¼! *Cü·„5¬kr‘K8¾÷M0i0ÓtÆ$å( ÚÁŬ#ž0tÌZsÈ~4:X‹yð_ï¬Õ>ÒÌ•‰Á ß`)„ <A‘üÇ1ê°CÛaA8†Žii† ø—µ„I9aÇTÈB¸Ð‹1ô¡€ø!A†Ãó] k’FkåP‰l ¢ØæxÄ$þh‰®¹ÙÛÅd½ìAVÔb wØÂÆ07\ã mÁ;Úí‡AbŠHÇ9ÎÀ#a¢ÙH&5ÆñKi˜‘`¾`¹#Ü“yæ0!2`… æÁCÌò@ü°H3aåµÐ“Kó´—/˜V~9¢¼ ”)ƒ@Ö±=M¨ u°[f8¡Ê% ™ó[S¶³c«œÐ¾ Á{Íd«â+•d f™fXaR`9m.&.¼ ;9˜¬}Îhk ¥½4Ö?[Ž—Áô¥†r9ÌnS”Êdæ7§I†j‚àšÙì$7]äMUfEIíÁ8±RNóŒëLL. Qxʉ“¥FñÉ0}BôŸkèc¾¤æ’ÄÉá ébŠ@Mi=µŠGû› ÎŽµò•±œe-o9„\Nˆ˜ñLè.+ÄЭ¦Ç›U ¤BúϨM¦Kgб™v­}ʃ”A{n´˜Fý¦9u9Òs6õ¤ 8êY ‚”®tŸ.E LëéV. ƒ5*b™9’ø‰Í2ÈAjÍȲT­ÌÔ¡eaà‚à 3д5=;ÙxJf´.ˆA hÀYÕV´°vhK\çj·™T<ä1‚à×%Þö‚’…¨ÿ.¸‡Á¦õÅ [SëÔÚjf¬·µ&êں͸p4¯æQgœ—v~ºñT,=eÚÝǺ÷BHqšR–{Q ÂŒŸ;}n€ÊC¡–’ HЖª×pžª %hé¿•-½›O³Ã<>¿rÕ5T€¹ƒuà`©jU¯öÒÄÁl(/EØ™´–©Ófu©KQ‹b”»÷|+S÷*NrÎÑœcxÉKó¾X½1µ+Má€ÜÞ7‰Þ'}3¸AVéYÜ+è1Ý9¬úOw´ƒ·7ÀïMëb–í Z€¸¶H¨ cpH-_€þ’jæÙ®º²•1äÖ¡h°Ö#‡¹¬ðÙz~n G_À;ŸÏ…Þó€ýçE³AÐ&´ž[EóÒ tA ›i¬¤Ö³µ ›«=È™çÔÚû¥€ØªCG’ÄdædaÇû¼²Ø ¸žÜ+ÏfžÅØ!ØT£Ýä~ÔDÚ+§Ú žR69fR_H+rð,‹¯Í+èŠZâ\áÄ ö˜‡R«ÛXÌcJ‚Ýq]¸ã¶1-‹ uÈVgªÑ )Wu¨ß t‡ÎRãÕ‹AÉ 7fY"D‡˜«/ ”(nñn\¬#Ùà  LLsÔ˜xx³µ¬¥Cjê¥ÐkZxv¨›èn3*_p]ž2lHá9³nÍOþp·â|*ãÞ~eÝ”#ÝÝ®Ë-[a\ë03NO Ô‹5¡9ÔA ª828²Î±U¸ùÄ]³µW|ç·åe .H-süÝ!»{ËãÎUÐÊ÷¥/”„ïáBP"“Tæ Ál{“–ÉiCúæL-¡ yXÃA°æÝÁ œ‰ >º½íygû»Ýpw—o×ë`çh­QÓ±¯T}ÔmáofûÑã^Æ:¼w¾kvßχº0À5”.Ÿù/7ôvW}ôß~zì¶Òç|â”ÿßooˆ 7¼a•¦Ö–H¦hâ¯P¢ÉIâå­LŒgJÔþ' êʺaÔuùâ ¹ˆDB`*?×V À%CHäfn2Á%\n€w"€v²'Äu€“€÷²€Ö'\¡$#g3å"”¢Rvc€€H•Âø¸!¸IqE‚+X€ë’‚³‚-øP€03nÒ€›$nC€(˜_P‚1SŸñ ƒebƒ_">ƒ#„¨MSÜSXNH3]x„U‚¼´¾…-É’(i@5HQ e!d €V“`.‚Vw0!d8"h%m@‡z8lЇy˜FÕ,܇¤Æ}ȇµ0Kˆ¤6s.‹á*HXw8G”Ø*˜ˆs4‡­›h‰F•(oÐ(Q¨†e1!õavÉówôqaî3o†±‡QâPP‹g@"»'©Á3b)_0y“ñêS%«1ÈXS°ŒvÓ\ÇøÉ8ØØŒöŒø£,epü•sðdõn¢±„Áõ;ÍòRÂŽî˜gX%b`/ûUí(À¥<úÈôx#à¨>ûØIö)2R"å‘ ÙéŒ3‚0ÁLçŒ.R‘ I9Í•d%³<:SEÔ02>ܘc ¤Ud’ ³‘gÀt Ô%…Å0*Ô,Ikpt òa4æ”7’DµÆCv3\FÉ}t”ŽåX$•}„mJGJ©0%r#Np*iŽþ(–Ã¥óX鸎ÿ8cÕî&biɃ¡ŽSÑn‰“L'u”]IyÎŒ9fYBikP9Añ%hYŽ!‰—c‘èQ‰)bÊ‘ˆ%°Ýø“×GU2ÉtÛ¡añ´ €# 2ÀV/8§™š2@[­™ɇšª‰Dµ9±©šŒT›4Л2µi¸Ù39 ½9:Ôš{áÇ)­‰Ò™š3Àša°6М´éšÝyœºéš7М¿éš8Мĩœ×9›#Q›ÝI6)‹Ê_0A2 $N Y3ñ+LzÈ9r¤— :ãœÚM9£1@3q桱gãÁ þùáH3Ô}‚ Š Ú]#JA0l#ÊšCðða)a0¢´Yš#ª›E¡ Ñ>ú›Eî1iС3@œE¢:ã¡•ñIp£M:›¥<:¡0¤4ðžI@¤z¤ JÏ™L¦Ôé*Ê¢³ÅšO ¥aJ›Op¥>š¥aª›Oà¥FÚ¡4ð›OP¦³EœO¦MJO:Iò# 7[UZn5ðžU §?Ê 5ðœU€§J©ÔY~Z¬™˜ ¦ŽJ›Zp¨eA©ãÙ¨5pž’J§Žºž¡Ú¡¦•œZ¥ tO ŠIÉ)¨¹úœ’/‰3ñ¤‘«¬IT¬RŒ1`´9p¤7§Ú¬º™£‘«¿)iÛ”«ÄÙòAÃú¤541Ô¬Uu$FÊ0Á ›1誮dpo0a 7ðœgP&8;@R¯÷j~üƯ0sO–R!ËšûªR8îlÁ8û¬i஺¹gîú›¾Ám°ìá®Ä©ö:øú¤õr‚‘møZ¥%{²óG1à3á4lÁƪ1¨Á 8ðœtp§ÈîA(‹Ôé(VÑ'}ƒ³¬¹L{¯8@›ñš {lP‘8«›O‹÷Fµ/û›WÛ² ;/Kœ {°ÅÒI‹³Oú2N˜©/[¥2  ìAV j›ÿ‰…çu2 ´sûœè*àÊŸ7·Ô Ms«°V!¢:ñ £:¡›­Z¡:ñ›¼ªÄ9#c€¨sû¤äVˆ«YÚ$¤W³ý飡y:ºÏYƒá³3›m{A&º¬ £&8£{A›ª‹® ¤1£«›hPŒB¡ 2º¿i‹ª›S{Aœ¦ z{‘¶’²£[¥c@»2ÚŸ1ðžByðµ "²5I±¸:¾Ô gi ¡sZ¡àËš¨aº™ ¾´ Œ‡[¾Žêbn ¾¿éÛ£“ ¾ÄyME¿/ëbe ¾UÚ’$lPuªùžë«šÏI*Å¢ªID¾ý¹š3ñý‹¥ì;›«¬›AP|¼­‚J’ªIœè£A\‰ü¤¶X¿\¥@rÁå; mx¤6[V«ùœHB§ºšÔÉgr/ý™3ñM:« §*¼šº‰>ÿ³òÄ’k©1#r ¼I:u¿=aÆ>«Y¥u`ÂîiÆ,¦ÉY¾4@yÇyñzмýI´ùKºÉ/18óÇ’k·§¡»ý—‹¬¤z3›O 3QáijÉÃSÜŸúÁå[©üæ32÷F2PƒË~kØhœü©ù{3Aï²1œ¬›Z:ò©#žYŸÛ1yÐßc7¦™Ë²Ëw‘U$BmEzk RÒ–y#m©6y¢IšúÁûXq)  ¤NvÀ1gègâLŸ ù×OÓ“©q[i”,) (àËÀÌCÝ<“à\ÎÊCÎÀõ™©ÑË¿Ì@tìlØϸ¥ÏæÁÏÆüÏ÷™ŸõòMtéÎ=t•öÕ}]e!’!óéÏ Íæ1ÌìÌÙ–Ü1S Ð’\19i{×unõ mŸe ù8"5½7#_ÐÍÃ%=îa\;Òb©ClÕMÙCCME­$ÔlÎÝÓ:åÑ:rñÔ\/O9OñÄÏw0aGéÕñx?ÃÏp™@.ÓDP‘•9AUO#Ozi•{¨%D](tÕ’$Ò ×ñØÐH ."Ø/¼”†-%  Øl‘IŽ]-s Y‘Ùw ´¥×´?}Í[ö;´„Ù`ÝÒ‰×ÄÇÙ{=Pí×v3t#² vÙ~UÚ*D63R#) aÎHY6o}#Q¤XÙÑSñ;Zm&pØÕÃÍKÁÍ1c]¤e=ÜhÐänãg›×Ë-×™]רýÒ8´Ú ýÚ¢ÍÏ“]Ù²dÚšíÒL×Ù¶÷Ù|­Þt%Û‚Û§½Ùy]ß­Úù]i³]Û˜ A¸Š~ÅÛ4b# ÃÒÓÝ#RÜǺѧܭ¤#26ÒŽòçñ# ó+ñÑyˆ¬1¸Fï³kDö•¸tæ¡(ž0óÁ1}ÈH 1”MRÃmÿb7#„QÀW½ÜU"-AvC¶?2î^ÙË"!tväXV åg¨×MNZEãsÿÒ-®òaBä:"-B6ÖòÕ`!bž¤µ<áÓS1ŒýUŒ!xåë80{ŠD- x®ç6€DG¼R#Ñç7.@[Šg&Q£`6mŠÔF…–cç´éd-޵:dD8t¥ÅÙ ^d#ã3_§œèrÈ[ž91 |ëÖÅÒƒîÓs54`GD3Yþä4Gàé¡ QÀ#ч#11ƒˆA1£ÜLð:t{ÁÕÞÍZ­ZÞ5°~Yþ1‚ €´ˆLlÐÍÔ7ÀHÇ®ªìÇÑìkðìѱÔë×^€lÞíÛîíÿ2' î8cYjîÕaéÓ&f|t3?˜N<›Þé•„Ê¡¥Uêe<œ¬ê³µ¥…öê±.ëÔEë lëÇN"RÎëÝþëÇ.cú­è^ëžìËïò.íõní|íùîû¾ïà.ß:WÉAð-À0_;ì®CîÎìïRí6_í7¯óÚ®ïVÿíþîsźs@ô/K[EŒô{ÊVKOóO?ïsóSïUÏóWßï`î\€P\/;a¶G™Né|é¼–¾Æ0"ñ¾n~ŽD§Uñ=yêß[Ïêë?ëRë~…ë'Ÿç)ëÀÎòÂîòý¡îH/óïÞô5OïRïÙÞóq¿BYDðNPDÊ´µîcöªŸöQoï9ïö°÷X?÷(P÷‹¡Aö’÷Vy¿÷ Om _éØqéƒoC’þð~¥Cøºør‘½ùO[ßêraù /c"¯$$_;&¯ëzáùþ¡òPîiÃ0`úÈÞ13ÿûnê±>á¨^ñãvÇïßÑ>Û‡û:±‹ çéõ¾ÿçì€ßÄyøÅ>Ÿ7ûêðúÀëŸE?øæÂû{ ïú ¾Wø§ë~«üQT¶'`ê«€O0øa@X`¸3uÚ$ H¯ç[€îKzdϘ½&¸ú֞̀TÐø!@¹§ëT ŒaR‡HýP õ›+°×l?Ã÷=ÝlÖiüÙ@ɇ9žTþ!äe¾‘·ù„àüëurÁÞ¿â¡cžÿû‚NPÚAHõ ¿“}È ½2°#`ò‚L ªÂ(È 5 +ä€È *ž5HôŒìCeïæÂTÙžëÛy{ðþ¼º—[xZ ‚°à©@è÷nà›~ Ïwp?GxÇBlA'5ÕQÂUg }μ|š°ah>ÂùäÊ«¢0Øá?—׬è!D…uŽA_ ¡4ѤܵA*Åÿà ïÓ…Íð¶Â‚hg_ 1%màH¿mX½a D„ /ûµqÈ_y„æ°?HBu8ùÚ¡«Ã„Gð¾¿z8A¡ýÓ‡¤°¼+Sø™¡l{y"šA 7faVHˆDï´ì> Øîè \…1(¾BƒxËB”[#nDØ[Æ7äˆáPÓ•DØø¾B‡¦n¶Dô÷ןÜ„î¯溚øùœÜlyÄ|½þ×¢3œ‚Ðp*VDä@”ÑKR ¢½0xb`<€°P<ß0¶b߉áã#b?¸] Iô~øÊú„•ùÖbåã1.Á’7?a]Ôr£0 &©½ø—¡_”ˆQ0EY¨Û 1ä}M >EèßžPäƒZïVu½ÁöšÖ1älrP.Æ]øñàcŒ}ÓÐîÉ€lHO G<„›Qf:÷Ò+‰luzᔑÆòÇÙ"LÄ|òÒCOx‹ ]Œ#‚ØÍÆ%ˆúlãp¬ŽQ7"G¢˜‡žoLcÀQé9EÆ‹#d¤Š(`ë¥åÈÏÝëzŽÉ°/þGÜ(!cv$ÛQï‘Àéç½¢fL„„¯3>xCÝër|i‘%VB÷ˆácÇA°5ÖÇPxq¢l¼´±?NÇˆØ ;$vœ}¼Ñ@ž»À¤t€Ô‘C^GWøó„¡U †²2Œ=d5$ƒ$ŽÏÐ8 ÈÈH÷"$Yht¨;’Ènh"Á#ŠÔ~ãqšG(ÑâÅ“‘íñ4ò@9sd糉ùPôíCbG–|’ñ'†É9`jH’´0KvÁàè¿$€ÌröIH i›ÌŒn2$rÆ89!D"Ë FÞÉÒ8#õ$ ¨¦,š^ïhbÈ.)>$â“ÙñîñNOY5A€®:•ðâõFÂ$]@’Ú,qDÆ–œe@ã 0.Ž@‘`(ÝÁ u,jP< ÉVV• …™!ŽÔ95C/ ¾2}BÀÄm(Q¡38†‡ º*j4(€çt& †6(PG[LKl¹œq$Qh;¿RC9F@9ÔBºðU]ø¢²cŒÎÐØ’îæHƒ)4ÑOêr‰8€ŠJ’^Ý• qà€Ò6K!u‡†ŠÑ"ZFù(a’ð/d>ÒH Gíœ='t‰*ÑP¡G)Äc|à/jTªDWH5ƒ¶XqÄS1ÒÍrè,¡Ÿ”†šRðg~B*奯‘š¸8ZDI˵££4"J‡Q©/ S¯®PºR[*L×Ti¹:ÁT’ÊP2ÊLË!é¥ÔL…ºZŠ„éÕÅ4”"S<ÊD»)øË^át¶DÓÍ’½ i S!”ÕSHzO')7u¢ÞøQø×LC¡=…¡ç4—Ñ::îè-¥õž2‚*¦Xéd8¨.‹'\Ó‹ÊOµ©B­¤U¶ÄÓ€Ú 0ê0õ¤éô˜6ÔdÚNè %ÏQ½ÒðçñtˆËj£¶4.RÏF·)©§¦TœŠ„j'%¢~Ř2TàPIé2u¢tË G)H;ª X¤ …â,*zF=¨ m¥=õ£2SL*UŸéÖ²ªèñ¨¢Ó¤ªNW*;…¨rn…LªÊU3ƒ"¥Z´ªvÕª:H=*%«ŒoªnÕŽ2ÕªBUª¢ô­>UK:J_m¥²¥®ÂлšUßd «•cpÍì•IÑcdí¨†5¥.Õ¦ªL÷(×¼œ€ô«z¿ŠÚU)Vm¤«Î¤úÓŸJ鏿 §§Õ¤&TÑšXêbåš.“ªV¹`L*e…­ÍJ¶úÔ9RI‹'nõ¬Å´žT¤:GU*Se©pUWá+ÁJñä ù»’ж%n¨³ò«ÿT3xVpBý\!õ~éÎHU„JLÙªu%­-U¨nW³ºÿªhyuÊeÑÒÂHð%¤-˜5½žQsÈ^¥è€ GÔ„V†Ðj_G+v]¬ñ“Ú=SBI!«fÉ©±tÒÓ[T,måL'¤RbIì=Ý­¶·:Õ=Ú"Qe&dPÍÊ¢F.é*[°ª÷Ë——fÖðçYé– fÈJW[]-¬b¥±H6=®ØÏ*MˆÅ±>V/è„+;[™+3²æË¬‚Ù-[b§ëZm²2¶´vS³³¤(kÍ /«¦jÑ7[^wªVí²ºÔ‰§:IQêË Í®SßJc1ƒ‹°#•äÔçµQ3ª¢-ªÜÉ¢šX/ëD‘“ü¤¨63\Ú@ Jïë…5­ë·¾Vz $E[I¤Ãud™ZôzbC!ªDN€=®&@{šÖë"…§ÖÌÖ¶z]ŸlmE¨õ4 ×7+Lëf!¶¬–Òr¶‘¾ÂéDm¶0t¢ÞÖÉŠ§m"¶öÔœÖWAëV -¥›¨/5jP‘à ¢k_#ã–ÚUZY'mž]¶tŦÛr þ8-·ó´¾V³zVë”I3-·¬ª9a²ú[¹àùxªM¯/õeáÖ«pé+J±ƒvÆ2Ó²Êf×Nðu0ËeÑ-k[kCÇe²ÖÉz[¨êë‚íYíª³…Š\—¥Wá¬F5¸xV-¸Ó”(XC*¬(÷æ‚Ü{+r%.Š5‹{6œzQu;¾* ºªAeYw+s9xÅœÏéæ ëp©kÈM³ùµZŠÄ¸"¡®Š„élÚO±Y.a%ó”•ÏmÞE˜ÉÔœc] ´3@ÖË>h÷ðÆÔ†s}þN©5_?ô ó“ü‰Ë±ûËîò<—Í“&ºFþ=ýg {§S€Æ]L0énÔÜ TÓw†Jà99³æð4 ×›ϰYx;§ÙE¼hwÚÇÆ‹qå% ’nÓ_ÂMŠ;ë.’š#R}vP­;*=o×5IÊ2ÉÑKxÓŸáE™¨W†Nµ‹óß…|»CròɧY{A$æíŠÔn]Yß´Å$Ä7’]Ó{x˦óT½µ2m¶Þüy¡/¯”¾ÊBÖ= zw»£ÞÕ fQÃ:Û[›ts‚¤íOü7‡àÚF{p[íÓÍ^ò6‡Âz«kykÄU³{wûRÎß›øÞU“ ¿.Ñø’_äk~ïŽd—ŽW¶ß¶9;ǧܭ¼eòòÖ_©yyoð‹Ÿ×û‚?ù‰iäΟéý‚àõËÝ. ® `’€ò͈Yw¯/äŒÀ½WxRà“xCÍb®Á&3žÞ<+¡§úÅ‹mw)òE |)§/묽*xjb_öy5;¯î¾'q/àÀ«‘çøUžøsžßåËx¯0Û}¾?Xòš`ÊK}é®õ]ÁºWóÔf%Xs€nVF7Žbr›C®*޹ •¤š\’Jqaè"&º„8ÔÙÛ…Šuáªly§•øÈÎSâšiµ¨‡Ú¨Íª3]Juç*Ž…„iõ›Cguew.'~ÀYWû&a¼„½_ýa·~ŠßÒ ‡qðʤ‹uxí®Mýyáîö·“î:K#|]°æÅhØŠ®×Å…ï§.¿rØ·ÌþɃõ£ÞÂzØ‚ áÄ™?àT Æ»W¿à÷éé–Óij“‚—dc \Œc¥òEÆ«×/ãfÕŒ£ï3Ž¿83ù5K8@àq –ÇטW’J|J»ñÆŸþ8ÓာŒIáfð‡Öógªã:„' X~Ia8äêgá¤ïÍÆ“üUä`Ž«0ó½•ù¯?€d¼Ì@‰²X.“dúYfú™ò.–È~wÚ^`м9/2N6Æ;Y1Óe¶«šóõËÐx2Çf¿Ü&3÷å̺ÊKe±k“Çæ.Íi73æ>ç˜ÝïqÂ$™óårÄœ³¯mžÇjÙûéæ'Ì›Ýð[þÍù g—Y޹ó].ÁÈ!źW™ÅðÞ¼|7ŸDÎÚ¸ óhöœ:yÏeúŒ…‹³wÉàÙ5GcجºÊ3漚sæàkc§³0ÍÖ'hql…}²ëíÊèø+Gè°<¡òržÍ™3Ÿçˆœž…ê3Ð!:''^Ó¬Q³Ë³ËÆBwaýL„ûsîUʵ¹c6åÍ ¿ïgþšÚ÷ã¸,Ÿ?0ƒ¾ÃÝÙ+ åœ2&Ï0z #aôÜw#ˆ®bÏPº&ƒèã œô|&Ç EeÈœŸ%³—¦Ì:LÿgçÙ.»d³l”­²e6ÌNÙ$Ûd·lœý²wvÍÖÙ4;gÏì˜ ´c¶Ú<í›]³—¶ÏÚLj?mÍ ;ˆÚ'[\mŸ]Röø"`kÓì®-€ b[c“í þAÚNÙ]`uÀ´»Óž¼m@¶ {{€@0pฃ>0?HÙ€PŽí³7‚ŠÝª€ðÀ îG¹i¶å¾ßà‚þ€èàˆî+pt@éÖØ–[°‚w|@ÇŽØ;HU  nwÊÜàüàà.|dû{ Œ·@Þ™; `ð¼ ÐÜÀXo|`>€>Ù„nŸM¾Èå{}Ólø*6ýà 0mø ì.ÙüÀ ðýí³Ïwýæÿ›ðð€<`Ú|Àƒ.¸>xàd`@ÁË7Ù@€`7çà)›`Âñ7ÞnÙ@„»pRvP €?ðÂEv ' ÔpÐ|ðžÀg —ŸìÌ5÷áö^À àh@ÐúÀ|Í ¹Ÿ]ûk¿#Þ±É7{àøoàÇÀW= †—ì«-Àÿáí t@Ð(ðçÊ|,t¼Ý¿ÛvÅ>Ü €ÿ€ÈíùáþÛà| €0úçQ¼ž Ö8éàïrí AG_é€ð‚@ü¸Æ^àH ¥—li.fÁ*PôŒŸòŸ²±€óVé_œìƒ)î·ÀRŸé!«t-Éù@ø¨à”›¤½ÊS6ˆè@¬“uV^x2Pë=bŸï’ Ì €OÙr®ëð0×0OÙ5ØødÙ ÃïðÑ…g—ìÀ¸t Ú »+¿¦ýdwöÂ>J@%@­´³VÛC¶@í- °öŽ=ÚÀ€éí à·ÇõÉ^Ù1@'ß™](vå¾×»ÆžîŒÝ°Óõë~²©»¿d{oGîÝëï w¬~Þ»A8Ø=®›wðîÞËy|¯îõ¾w÷ìÞ×w‚\c?î`Ê÷;a×î À¿»õÇ]T€ßç”+÷œ-¸À$@Aóñ°޹l'ë^ ƒ°ÈëÈnEpÂî^€ ‚&çä` hsÁâA6À´ó/àøèÿØñ™-Â{|ÊbÀ ò™=Øá8’§@ÀŽs0ÌEúXìF~üøo ä;vO€"À@Í­9Û¦Øà`°çì/æÿ<8çéüœùŠ­æ½¼Aûžçó}nå±|ž?Ü€;®Ã§Ùy^@„¡¿óð[(õ“ýRv¢ßèÀèGÿ·#}U‡ë‰¾ t‚z 8=€ÝàÆPðÕúOô÷àø}`êQ½ @@ œõ´þêE÷ãß:ÜzTï ”A?€mý­x’-ìï<ªß; ˆp á“v³ÿÛpü|ƒv üø„7×þÔv ``€·'ë…þÐ{~çÕ=º¿ó:<±xwï¹»oOÙôþoÇ{Åþð}½ì'[ ¤lòý€ÿÆó[³+ö$0ðƒy. „öðMîA¶A@î _ïà À þà úŠÿÚ‘;hø @|=p˜ÁÈÝ»Ýä£üY`±ý@>ù û¸+ö“¯ñm<8øƒü{K÷€ïïõ½½wE!tí¤ÿ¿£üÑO|éËnôÓ»#?ùý¦A4ðàà×;}«²‘€?‡À|äƒ<Âþ¿×ï!û$ý´ÿúÁ/b_‡Ã} ð@¾wúöýdgüH¸ÀÁß÷‚?eGzNByoúˆ?dó|ømÀ3  {ˆû¿}è'ø¨€róÎùOöPüá{Ø2²GÀæû8ò¾Où7Ùg€ô} P=xíÛñl¯û¸èýá{X‹ „¿ß¯÷@ 0*10 €çÿýÎþ@èî߀¸ƒàÏó×<¤á¡ü’ÇýwßéÑ?Pÿ|Ÿýöíü»ó7ÿ»† Ú)@óÏø›À{ŸÓÇdnÀ€ATv€Ðü•á› ×ü9{@ðÔ}(Û% ¬Ÿ€.ðòl`.° @|Ø^øè*@ÔV@!ðÅ*›h X(›¸×äí€:ð½Ÿ@ð ô 2·À-@n~@¡'Éÿ8ŸÑð…l 'Ê{’ŸüùeZàÑ×÷1{…Þh´…OŸµGN÷ŸøaA›¸B€ìÞ¨Øõ}ÛŸXô­ ߸f|u Ù—ªl€ÄùÀη¥l ŸÈ÷ö͇ Àò¹|‹`âÇ·¥l6ß;0†oy 0ÈÍ¿8@²á'›ÿ§ ¦lLÀ|‚‡ž€G ^*x²=–ÞJ7ìà@ãÀ €ð•~!Ûp¼•o ÜÖgøù¾€; öÍu€Gü‚À úÀ PT^€ØÇ)õ[àÇe|þ]ã–çÝq¿@?Àˆ}yð,ó@5àÇ]À]ç·À'˜ç9ª@7¨ƒ'°ÜuÉ àþmíß߯à=oÀ0 y€@w]pðŠ€8êx-Øwè¥ ¡A ¨«€2`ä÷Àgл ¡³e„@0 ¬¿ž%`7}@*p”„‡€ÜïÀgðÉ@IÇå‚@@àÓ¡~û8ƒ3áã–T| @<ÐðçÀ3ð$„j[a·â}ƒ[Åg¬ë€&ð|Š}²±þžPñ5ïÀ/°¸]€>`ÒlŸGà…Ï/øïÈ© _ˆµÅ&aȶ þléÞÉF8•Ý Nm ÈVŠN  Ð<†Gß·'–eˆ’{1 И”a;(º5—]ÈVä • èô‰†)›8À &Àâ«á]'Ø/ md k(Hlø†{œox dÃÝÔ¦´õ†w çÜ ‡g Èþ{ÒaØðtm `¸×Åz[¿—~Y_Å6ètwåilu 8 ]0×-† €wH¶ @p V‡ìáJ7Ðç`$G*v0GÎ@*Ð ”„a~xÏýoÀ7 ä}Gzø2mé!~X!ˆ<.¨ Bˆh`€¸Ò ƒÅ 5²"†¨ FƒÓ`5xç r@ ˜ˆ"8(’ƒ)[`H&âßÇ"–/"…¸"Öˆ{€4`"Ò†&  ‰n`„h⇴a‚Ø$*‰„ᄨ*pRbvH%Êá•N‡Xâ”"‰Ú!”V‰c ™hš‰MÛ—˜%ª‰S¢ º9‰››$ˆùÞœ%>p\A`'vˆ)žøüz—Ÿ¨²µt`À€„rþ’(ð@;À´um¤]5 Ž"×väÝ ÀÞv¾}q‡²}ð€¦XØùm€ ÐâepÀ pèÀ©H³o@  ¬( (*À>° ´x~àÁ¥„w¸-n½ç³ÕpI×¹}nà€±H³!‹¾›ë»ñÎbyXÎIp¿[ÿV-6|Í`7h'†lîa0èM€¨_ý†üz À€‡°Û¢¨¹=ohH. "]ð 8nÛ€÷ p@\HßÙuy¹'ÓÑ‹ ÛÀ$pž×..À¿(#FgÀ5p°[Pøm>»[3ð½]vvÝ3 0jl# ‡É\€´tã÷–¹A•Ýá–ŒP8„Eá @àžÝPð¿€.§²!·ßF Ò€/°ã L€:Ð PBcÍxû©„Gã<ð à ë¶ØýÀ>5®t·NHú9ƒ¡8ð¿ýýš‡Ñýo}W²ñod#`6h£Ú Æp/@9€„wå\{x7T€; rþ]Ìu#À\‡ÑIrOˆ r· 7g€âHÖÁqÀ'À<„…]Ðdî@‡Ñål>^2  <žÝp T•ÜhHØMv!Ç ÿ@;àxvÀ?° ð¢cÊf €]Ȥª ÀøÀ9ð¡?@<Þ À4° < \À,p,Ý÷7 ÆŠÿÀ;àTÌÀ·dúDðî @9P>vö\bÈî¡ÀúèÜu$@ñ!£@H% @ ?ÞuB sš›dHîí÷Üÿh8¨@&p |î €tD0?S/` ä^ ðRpANÀ? |€7°¾%[¬?\ógÂyo\ó·>Öx6¤APçµØ_ù¸î¥‹…]憼w×üõu’HDF$€DvÀ 0øŒ™/v€2@ ,‘Zk(DZ‘%›$gØôÉ*‘Oä¹1fä]EÎý]YD²†YäGæL$k8F–‘w$<àCz‘%™à~dYEö‘T$a'HVppÀ ©HÞ‘`€#©Ãá¤$iP’vž¤ xâlÀ}èŒœÆÆØ’q"m—4‚ä)JÒvV#ÐJ>’˜ßFüu;$Ýenù¡ùø³Aw À' à’dt—˜Â@×öˆpÀ_7H€€ ,~€<ð×½v]@ |o@Á‡ÈÁn Àð Ô÷à·1À9ð€œðÅìÀævȼc*I¤¾€+  Ðs&P ¸ZÀ;I€*pu²ãJwìtï€Û‡˜@+Tp¥P8å6p°ˆ\×FðéäÀN‘Ëdý,tä[Ú(ÐýpÜ=W²ýo~ÀJ‰Õ%ncB©F†€°1™€P”¾cHÔ”pÜÐ<ž€g •P9 À`Ì]ÞKYØ©„æ€ àÙM?@ 8•yž”Ç@UiS"ÿÀ=Tv+° P`%ÈÖM¦•ßä¨h$…Ýp¬õ$IÖqlj¤Ç7HÞaÎVA~› Y>f|&KwG.‘Œ%ȶ$eùÈó™p @6PYX(§¹ý Àf t–Ë$ °t¢¥€="xŠ¥APtƒ%d [Jr~°D"³e ‘–en9,»*°D¾e K¤à[.x2PH¯å™*ÊmÏetÉCÏ%n™X"n½åv –Ä¥wIÊe&)l’x¢uiSŽ’;cz [ÎŽ«$ž¨]Z•“],)_–dxY²–°eḗ™¤ä`Ò—™ãæx_¦’Zžéø ˜ô%íh;â‰åå~I^â—®%E÷'†rø@¾—TŠÉœeY)^ä#gY)Je@ù¨Œ˜Y@èöaö‹%‡9,– ›Â6ZfxÝx(º1ÀYØ)õ º‰p6¦Å÷Ñùs;¦è¢d~t¢Û€×€AÀx@ewוlR&-D+Bp×qÀ@P™B¦èe¾ƒŸA ¾ šùe"€@@ކð 4lsfšÉ`@fnCfŽyeŠqð`I·<™]&<ˆÜrˆ&’ êp8)ðŠ,7G€UÐ7Ä1t À.€‹ÈºÇàçÀ AO à  À¾uЀApTv¬)kB“&U``Ÿf¨ÉÙĤfW`âyn Ș ›Ã¦l6l…ÆÆüIlhц´ýlÓ¦Ôf%V›=Ûµ™%b›6Û”Èmmd·é´e‡ã¦Ñ6mÆm?À>þõ…“`ì¦n¾ì&ºùnñ&Ý8oÖ›îæºù(Ú›ú¦¥˜o›L[{ضœ>›ÀÙošnt£=€(Êo¸[ÂI±ùÀ»É8r gì¦p§ÄIq2ƒ?ÀÅ™q6ggq>œ'ÈÉ´qqgɹ<†œ('É©qžœüæû7Èyo*çÄ sþ›\a+‡Ôœ!gûö¾ÅoûúÜoù[ÐÙ¿%p:Ü÷+pH§xçÀ- £wYJ¶l’aÉ<‡é÷\üÀðÁyV'ÅöhÌcFçÂÁlUgWÊU•[ç2Àñph§§vjn:\Ûi0–sJ\ÜIXŠ@Øv:Üãö¼›ì¢Þùð~'óxÒ„%Ṧˆgÿ¦xêpjÜà¹v>žrgäÙv.ÿ›å©¹Å†€\€—oö%›@çyžà"$÷륛Ëd˜ÈíÿÀ݉²}r¡\ ж‘ž¯çá{p"!¶²©›ŸÜVWîžÍ_ÀÒ‘š¿gì‰.¶oçì È¥oʧðë9Ÿ!ô|u„àôÉ{>Ÿ‡âõ©KfŸÄç#§sFŸØgÿ¦}ŸÕg÷¹|‚§XЉŸÖ#¢ˆÈ5t]õë…råçP¨ö'E°Õ繘²‘t& nâŸßg9€r1]z€þŸÓgèF³phþ΋¨ÿiÆž(SW& ðÚüÍvhû‚b‹X^Îfa2(¨'‰à¥}wÝ)º Ö] )ƒŽ ü]}ÇÎvþœçÉðo5§ýÙÉw€ „JœöZ„¾›?hĆ„òx ÜÊ5¡…ÝJã¡F¨Ú<Úå P¡A¨…f¡Uè*†ŒdhzïxÖXÞµwܱۘw5%0'‡¾¡uè{wß}w|ãÞgD"x:\0„Ÿh_ˆ¢²g!j ¢„(ûLjʞ¹ä!~6y„ úý]‰(ïI‰Jž"h˜‰â F'ê{b¢ˆ(ïYäýo7hùyæa—±á&šŠ& «¨ûyå¹¢–¨G´yðÀ°Òy± ºL’oTâ-*æé¢hÞ`÷ë ¿(`øëÅ¢ƒÜ,Ú‹"£=Ÿ–¸Œ^ ˆÞ{w{£J èFVz£ /f£ 5jŒZ£É¨4ªŠ sh7 b£?b8ŠŽ*wÇè5º¶£5 ’£=_¸÷ëÕ£ïè™(ž£(躧Šn§?þà¨{ˆ(¤~áú$º¡ä!DúnÞ!ÿÆŸ Z¤ÓgFj…:iì鑚¡T êçŽb¤Zèòhÿy~'éHª’–}&éEê’Ö“`HŠ’–¡/iÈFû‰n‡b7“ÚPŸt€º™¾Á‡A)<@”¥øÀØ7ÞÁ¤á¡?P”RlMé÷”J~gßRJ•~{ŸÜ'”j¥G©ÞÇ üÛp(†¥z¨$X–ž¥üRj’š¥[[ú¾¥l©ÓÇ<®¤ti\j—Rla'p ä¥Öã^z¸Í!YúÞÕ¥ÜÕÙ—&€©\º<ò¥s'cÚnŒzib ™2Àˆ7‘>¦ƒ)fª™>‰W'00wþ¥Qbûçˆ%`»Ñ¡œdJ²5ï¦?𸱦€kjÀ¦ˆâlÊ}¦·ilª›f¦In ȦmZ˜¾¦¾iqʧ½inªœÖ¦ÁirJ›Ú¦`lú¿±p –8—–¦ðajJЉà›˜Σ]âxª‚§a"˜Š§t`•Øž–§_×6pº¥“à|j•ªw0i}Ê~…`~*Ÿî§biÀCÆŸÃéãfŸ¦¥Tà€Š™§*&(ø)¨ÎiƒÊRêõyœ…]sÈ‚®ž'WØ æeã€<*‡šþýzˆ*7ЍÀ€jÑùªÌY¾©¨nŸ`CšogŒê¡¦¨!êƒz×á¨›ŽŠ¢Ò¨,ê4Cj²aF*’:£*© a“º<&©+êÉ–4©wgìv(ʨ0Üz¤f©†â‰z²¡X*å¹¥r…]jùö¥š©bj²)œ`ê™*¢¢…½$_G|j©m*]8îÑrªx“†©\ê^Ȳ›´!¡ªzƒ!åÖýa¦ÿ¥a8ü-ª—'x@ªŸ§¤J©ž‚¢¢:wž1äTªñɆê¦êä½wêæ§zRm¢j†Jªþ¢ * x©Žªå\©ŠX‰d`§*«’›µê]ç©Îªe¢Ñg«²ª½ªÓ÷«~ª\â–¸$š‡´ê¿‚Þaz¸¬®‡"²ê!Vt¡='(þu±(Eš²a«íg‚È­V«Þ*û ®B‰ß*v®R«æ*¹J7v¨çªŽÚ®v¨¿eš“Òl±a¦4)½º®Š©…¾jÿM«öj¿J’꫱¼z¯¬â?*°Î«Åj¼ê¯®‰í¨¼š¯«pbzÊ$&‰™*Æz±Z¬`âyš±r¬kyJ±¢§ëÆú~¬'«É*ž«kÉÚ±º‰ÖêÆšPÖo{¢…¨'&ˆqÛpuâ5«‰˜³î¬"~˜³îŸÃ©ÏúÞa¦êÛ¾YÎ!­ gÊ6× Ÿ\ÓJ0šŸ¦Ôú´ÆzÃ©Õ ~f­¿"Õʵº©P«? µz­bk×¶J­ĦR+t'Á­­ ©*ë½wi#øÖó @ò9œÂnêæ1Z·r“ô[ú†.ª‹…gßJ·®Nkx/® ۾ȷέå\Ý$®þÜÁ˜Â5ƒì@íI¹RŒ)[Aðd®vkÉØ.z® ëä:(’®šë xû}g)ù¢Špã2ªn—h3ˆµ¯kñÙ‹>³kíú`­²ŸÝØò®ZŸïÊ2« êE·»Ÿ—èÙXªþ¥–gãæ:Ê®hB9z&€Ñë¸8‚Ìk*y½6ž±§öÚ‹þ·ç÷f½²ž¤gö:½.lå«Uù½ª¯_7J¾––“ªóÚz‚¯Òküúëͯ-]Àدé+áùëɯ[êõX¾a¦à@Ü&¿–¯Ö£÷ ° ìþÊÀ†lÙHLv“Ï)¾Ø "°l(G›j°¬«C¦lìÚ‰¢r°#,ûÁž°"¬/YÂjn,¬ÜØÁf°W0„¾°˜ê9Øá°ÿ›KÂÜáuéÃþl«ç¼·ýElúwÄ’W$ιÄÒ’adÌ ±1$ë)£F±NlYÅΛŒkËDn±ü*éÅj`ì+ÆZ±S¬{ס±èbkùÅ®±\¬wù\’±pl[Áͱe¬‡:XαLìuÙH¦°:œ ù¿M¥Ü;I¾’±*†iÈ^’ˆ,!‹,²Ÿd#ûn>²¦$a‡Jº¯Ž,${ÉZ¯€Â)7¶“},'ëÉŽ”¾dÎÖ¾}ï&)›Kî£D«*Â=Ýç(·ÊÍãïËÆž²¬èFËN©Á ðÊÆ²Ml°ËŽƒ:ä/‹Ë³Ã쯧³@. ²Ýžþ ±*³Ì¬3kÆ¥ÓlùÊÆz¸çÿÆ£¬÷ë2+ ŸÝlùö¢^¨¤ç= Ζ³Í E ³  : Ϻ¯@*80Ïʳ·§ëéÍZtöl>ëWv£ó¬õZÏÞ³½h@»Ï¢y-@ëÏ ´üì<[Xvl$Û<Û÷y³,(ó[.–Aå{Z´nld©ÑâoÞåm™Ñ†° ­kYv GÒr´räŒI{ª´mHkb:°1­IëZÒ´mÂÊ$›zÃz‚œen©Ñò´A­N‹À’lú¥»Óµ@„©Ôµ¦Q[6ö´BíRK²Í—ƒå;Z¾—«j!k$µƒì$û×9µa­"Õb²bíYËɦµ[­÷šÉµî«KÉ`­;Örµ8ç_§^Ú¯ïŸ^‹×¢±VË×í_;oÞµÞ+`;avl¤uyaö|?fJغ–Žbì&Ù¶•md›þa¶tãeK^f¶’m×Ún¶”mgKÚB—£íû׵ɘ'ß —çñ˜ á±ñ˜8¦Ž¹d>¦\ùg¦™Dæ’yd&™»í;¸e&šOf`ˆ™»íyf¶j&›IÜÞu9€gæ™]`ܙԭAx}frË(ÀG×l–] Àjê¯f¬ ÄÑš¶æz DyLP-1.6.0/DyLP/doc/Figures/varmgmtcalls.epsu0000644000076700007670000016202611171477034015653 0ustar %!PS-Adobe-3.0 EPSF-3.0 %%Title: /cs/mitacs1/lou/Bonsai/Doc/Dylp.New/Figures/varmgmt.epsu %%Creator: IslandDraw for lou %%CreationDate: Sat Sep 17 11:35:24 2005 %%Pages: 1 %%BoundingBox: 84 438 434 727 %%DocumentNeededResources: (atend) %%DocumentSuppliedResources: (atend) %%EndComments %%BeginPreview: 438 361 1 722 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000001 % 0000000000000000000000000000000000000000c0000000000001810000000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000000040000000000000810000000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000000040000000000000800000000000000000000000 % 00000000000000000000000000000000 % 0000000000000000000000000000000000000007ddc035fbbcdc78bb0d00000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000000c4880489142e6cccd1200000000000000000000 % 00000000000000000000000000000000 % 00000000000000000000000000000000000001884c8074d90e4284851d00000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000030845000c6a324284850300000000000000000000 % 00000000000000000000000000000001 % 0000000000000000000000000000000000000308c500446c46468c8d1100000000000000000000 % 00000000000000000000000000000001 % 0000000000000000000000000000000000000607620078243b7c78f91e00000000000000000000 % 00000000000000000000000000000000 % 0000000000000000000000000000000000000e0002000000004000010000000000000000000000 % 00000000000000000000000000000002 % 0000000000000000000000000000000000000c000e3f0000004000050000000000000000000000 % 00000000000000000000000000000002 % 00000000000000000000000000000000000018001800000000e0000e0000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000180000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000300000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000700000000000000000000000000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000600000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000c00000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000c00000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 00000000000000000000000000000000000180000000007c0200079c000f801810000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000003800000000022020003080010880838010000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000003000000000022000003080010480828010000000000 % 00000000000000000000000000000002 % 00000000000000000000000000000000000600035e3cdc22fe6ec111e7dc1ef8287bc000000000 % 00000000000000000000000000000002 % 0000000000000000000000000000000000060004b142623c42332192120789884cc50000000000 % 00000000000000000000000000000002 % 00000000000000000000000000000000000c0387600e4220422220a0720049087c810000000000 % 00000000000000000000000000000002 % 00000000000000000000000000000000001c0700e0324220422220e19210490846810000000000 % 00000000000000000000000000000002 % 0000000000000000000000000000000000180e0471464230422220c23218891882c50000000000 % 00000000000000000000000000000002 % 0000000000000000000000000000000000301c079e3be770e7777041df1f0eedc779c000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000030380000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000060700000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 0000000000000000000000000000000000e0e00000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 0000000000000000000000000000000000c1c00000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000183800000000000000000000000000000000000000000 % 00000000000000000000000000000003 % 000000000000000000000000000000000187000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 00000000000000000000000000000000030e000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 00000000000000000000000000000000071c000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000638000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000c700000c00000001c77e3e0080002000081c100000000 % 001800000001c77e3e01000020001002 % 000000000000000000000000000000000ce00000400000010e2231100800070001808100200000 % 000800000010e2231101000070003002 % 0000000000000000000000000000000019c00000400000010a2211100000050000808000200000 % 000800000010a2211100000050001002 % 000000000000000000000000000000003b800007ddc0787bcb223117db76051f78b8830d780000 % 00f9dc078f3cb223117f376053e79702 % 000000000000000000000000000000003700030c488084c509a3e1e209990988c4c48112207fff % f188880858909a3e1e211990990c5882 % 000000000000000000000000000000006e001f084c801c8109a2110209110f888084811d207fff % f108c801d0109a2110211110f9081082 % 000000000000000000000000000000007c00fc084500648108e21102091108c880848503200000 % 0108500650108e21102111108d081080 % 00000000000000000000000000000000f807e008c5008cc50862118209111048c4848d11200000 % 01185008d890862118211111050c5082 % 00000000000000000000000000000001f03f000762007679dc67e3871fbbb8fc79cffb9e380000 % 00ec20076f1dc67e3873bbbb8f87b9c2 % 0000000600000000200000079c000001e1f8000002000000000000000000000000000000000000 % 00002000000000000000000000000002 % 00000002000000042000100308000003cfc000000e3f0000000000000000000000000000000000 % 0000e3f0000000000000000000000002 % 00000002000000040000100308000003fe00000018000000000000000000000000000000000000 % 00018000000000000000000000000002 % 0000003e7701e3cf6eef3ce111e7c687f000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 0000006222021624245091f1921209078000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000423200740426839100a0720e87c000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 0000004214019404228c9100e1920187f800000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000461402362423119190c2320883bf00000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 0000003b0801dbc7710edce041df0f03c7e00000c00000000008180000000030000e0000000000 % 00000000000000000000000000000002 % 00000000080000000000000000000001e0fc000040000000001808000000001000100004000000 % 00000000000000000000000000000002 % 0000000038fc00000000000000000000f01f80004000000000080ac00000001000100004000000 % 00000000000000000000000000000002 % 00000000600000000000000000000000f803f007ddc07879e3cb8900000001f77039e1ef3cf800 % 00000000000000000000000000000002 % 000000000000000000000000000000007c007e0c488084c7162c4a000000031220121314664000 % 00000000000000000000000000000002 % 000000000000000000000000000000007e000f084c801c8204084f01ffffc21320107204424000 % 00000000000000000000000000000002 % 00000000000000000000000000000000370001084500648204084901ffffc21140119204424000 % 00000000000000000000000000000002 % 000000000000000000000000000000001b800008c5008cc7162849800000023140123314464000 % 00000000000000000000000000000002 % 0000000000000000000000000000000019c0000762007679e3dcfdc0000001d88039d9e73ce000 % 00000000000000000000000000000002 % 000000000000000000000000000000000ce0000002000000000000000000000080000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000e7000000e3f000000000000000000038fc00000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000638000018000000000000000000000600000000000000 % 00000000000000000000000000000000 % 00000000000000000000000000000000031c000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 00000000000000000000000000000000030e000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000187000000000000000000000000000000000000000000 % 00000000000000000000000000000000 % 0000000000000000000000000000000001c3800000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 0000000000000000000000000000000000c1c00000000000000000000000000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000060e00000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 0000000000000000000000000000000000607000c0003800000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000030380040004400000000000000000000000000000000 % 00000000000000000000000000000002 % 0000000000000000000000000000000000381c0040004400000000000000000000000000000000 % 00000000000000000000000000000002 % 0000000000000000000000000000000000180e07ddc0ef7cf37000000000000000000000000000 % 00000000000000000000000000000003 % 00000000000000000000000000000000000c070c48804421098800000000000000000000000000 % 00000000000000000000000000000003 % 00000000000000000000000000000000000c03884c804420390800000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000006000845004420c90800000000000000000000000000 % 00000000000000000000000000000002 % 0000000000000000000000000000000000070008c5004421190800000000000000000000000000 % 00000000000000000000000000000002 % 00000000000000000000000000000000000300076200e770ef9c00000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000001800002000000000000000000000000000000000000 % 00000000000000000000000000000001 % 00000000000000000000000000000000000180000e3f0000000000000000000000000000000000 % 00000000000000000000000000000001 % 000000000000000000000000000000000000c00018000000000000000000000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000e00000000000000000000000000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000600000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000300000000000000000000000000000000000000000 % 00000000000000000000000000000001 % 000000000000000000000000000000000000300000000000000000000000000000000000000000 % 00000000000000000000000000000001 % 000000000000000000000000000000000000180000000000000000000000000000000000000000 % 00000000000000000000000000000000 % 0000000000000000000000000000000000001c0000000000000000000000000000000000000000 % 00000000000000000000000000000003 % 0000000000000000000000000000000000000c00c0004004000040180800000000000000000000 % 00000000000000000000000000000002 % 0000000000000000000000000000000000000600400040044001c0080800000000000000000000 % 00000000000000000000000000000001 % 000000000000000000000000000000000000060040000000400040080000000000000000000000 % 00000000000000000000000000000000 % 0000000000000000000000000000000000000307ddc0cdccf6e0478b9800000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000038c4880462447304cccc800000000000000000000 % 00000000000000000000000000000002 % 00000000000000000000000000000000000001884c804424421048484800000000000000000000 % 00000000000000000000000000000001 % 000000000000000000000000000000000000000845004424421048484800000000000000000000 % 00000000000000000000000000000001 % 0000000000000000000000000000000000000008c50044244230c8c8c800000000000000000000 % 00000000000000000000000000000000 % 00000000000000000000000000000000000000076200ee7e73e1e78f8800000000000000000000 % 00000000000000000000000000000003 % 000000000000000000000000000000000000000002000000020000000800000000000000000000 % 00000000000000000000000000000002 % 00000000000000000000000000000000000000000e3f0000020000002800000000000000000000 % 00000000000000000000000000000001 % 000000000000000000000000000000000000000018000000070000007000000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000001 % 0000000000000000000000000000000000000000c000c000000000000000000000000000000000 % 00000000000000000000000000000001 % 000000000000000000000000000000000000000040004040000000000000000000000000000000 % 00000000000000000000000000000003 % 000000000000000000000000000000000000000040004040000000000000000000000000000000 % 00000000000000000000000000000001 % 0000000000000000000000000000000000000007ddc05cf7de3700000000000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000000c48806642211880000000000000000000000000 % 00000000000000000000000000000000 % 00000000000000000000000000000000000001884c804242071080000000000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000030845004242191080000000000000000000000000 % 00000000000000000000000000000003 % 0000000000000000000000000000000000000308c5004642231080000000000000000000000000 % 00000000000000000000000000000003 % 000000000000000000000000000000000000030762007c771db9c0000000000000000000000000 % 00000000000000000000000000000003 % 000000000000000000000000000000000000060002000000000000000000000000000000000000 % 00000000000000000000000000000003 % 00000000000000000000000000000000000006000e3f0000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000060018000000000000000000000000000000000000 % 00000000000000000000000000000000 % 0000000000000000000000000000000000000c0000000000000000000000000000000000000000 % 00000000000000000000000000000001 % 0000000000000000000000000000000000000c0000000000000000000000000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000180000000000000000000000000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000180000000000000000000000000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000180000000000000000000000000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000300000000000000000000000000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000300000000000000000000000000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000300000000000000000000000000000000000000000 % 00000000000000000000000000000001 % 000000000000000000000000000000000000600000000000000000000000000000000000000000 % 00000000000000000000000000000001 % 000000000000000000000000000000000000600000000000000000000000000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000c00000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000c00000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000c00000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000001800000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000001800000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000001800000000040000000000000018000000038efc3e0 % 10000400010000000000000000000000 % 0000000000000000000000000000000000030004000001c000000000000000800000021c446110 % 10000e00030000000000000000000002 % 000000000000000000000000000000000003000400000040000000000000008000000214442110 % 00000a00010000000000000000000002 % 000000000000000000000000000000000006000fefb8e047779f000000000f9dc078f79644611f % b3760a3ef17000000000000000000002 % 000000000000000000000000000000000006010445cdf04228480ffffffe188880858a1347c1e4 % 11991311898800000000000000000000 % 00000000000000000000000000000000000603846485004341c80ffffffe108c801d0213442104 % 11111f11010800000000000000000002 % 00000000000000000000000000000000000c030428850041464800000000108500650211c42104 % 11111191010800000000000000000002 % 00000000000000000000000000000000000c0704288d90c188c8000000001185008d8a10c42184 % 11112091890800000000000000000002 % 00000000000000000000000000000000000c060710f8e1e0877c000000000ec20076f3b8cfc38e % 3bbbf1f8f39c00000000000000000002 % 0000000000000000000000000000000000180c0010800000000000000000000200000000000000 % 00000000000000000000000000000002 % 0000000000000000000000000000000000181c0070800000000000000000000e7e000000000000 % 00000000000000000000000000000002 % 0000000000000000000000000000000000301800c1c00000000000000000001800000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000030380000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000030300000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000060600000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000060e00000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000060c00000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 0000000000000000000000000000000000c1c00000000000000000000000000000000000000000 % 00000000000000000000000000000003 % 0000000000000000000000000000000000c1800000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000183000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000187000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000186000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 00000000000000000000000000000000030e000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 00000000000000000000000000000000030c000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000318000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000638000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 0000000000000000000000000000000006300000000001c0000060000000000000001800000003 % 8efc3e01000040001000000000000002 % 000000000000000000000000000000000c70000400000220000020000000000000000800000021 % c44611010000e0003000000000000002 % 000000000000000000000000000000000c60000400000220000020000000000000000800000021 % 444211000000a0001000000000000000 % 000000000000000000000000000000000cc0000fefb8e2238efe2000000000000000f9dc078f79 % 644611fb3760a3ef1700000000000002 % 0000000000000000000000000000000019c0000445cdf067c461200000000000000188880858a1 % 347c1e41199131189880000000000002 % 0000000000000000000000000000000019800384648500440687200000000000007108c801d021 % 344210411111f1101080000000000002 % 000000000000000000000000000000001b80070428850084029920000000000000e10850065021 % 1c421041111119101080000000000002 % 0000000000000000000000000000000033001e04288d9116432320000000000003c1185008d8a1 % 0c421841111209189080000000000002 % 000000000000000000000000000000003600380710f8e3e3811df000000000000700ec20076f3b % 8cfc38e3bbbf1f8f39c0000000000002 % 000000000000000000000000000000006e00f0001080000000000000000000001e000020000000 % 00000000000000000000000000000002 % 000000000000000000000000000000006c01c000708000000000000000000000380000e7e00000 % 00000000000000000000000000000002 % 000000000000000000000000000000007c078000c1c000000000000000000000f0000180000000 % 00000000000000000000000000000002 % 00000000000000000000000000000000d80e0000000000000000000000000001c0000000000000 % 00000000000000000000000000000002 % 00000000000000000000000000000000f03c000000000000000000000000000780000000000000 % 00000000000000000000000000000002 % 00000000000000000000000000000000f070000000000000000000000000000e00000000000000 % 00000000000000000000000000000002 % 00000000000000000000000000000001e1e0000000000000000000000000003c00000000000000 % 00000000000000000000000000000002 % 00000000000000000000000000000001e380000000000000000000000000007000000000000000 % 00000000000000000000000000000002 % 00000000000000000000000000000003cf0000000000000000000000000001e000000000000000 % 00000000000000000000000000000002 % 000000060000300006000c0c000000039c000000000001c000004000000003800000180000c000 % 18008000000000000000000000000002 % 00000002000010000200040400000003f8000004000002200008400020000f0000000800004000 % 08008000400000000000000000000002 % 00000002000010000200040400000007e0000004000002200008000020001c0000000800004000 % 08000000400000000000000000000002 % 0000003e7701f211e23c7c7cefe7c687c000000fefb8e223c79eddde79c078000000f9dc07c847 % 89b9bbbcf00000000000000000000002 % 00000062220316321242c4c4461209070000000445cdf0642c4848a123e0e000000188880c58c8 % 49cc9166400000000000000000000002 % 0000004232021210720e848468720e87ffffff0464850040e8084d072200ffffffe108c8084841 % c8849a42400000000000000000000002 % 000000421402121192328484299201860000000428850083280845192200f00000010850084846 % 48848a42400000000000000000000000 % 000000461402323232468c8c3232088700000004288d91146c484623232038000001185008c8c8 % c88c8c46400000000000000000000002 % 0000003b0801d9d9df3b767611df0f038000000710f8e3e3b78ee21db9c01e000000ec20076767 % 7cf9c43c700000000000000000000002 % 00000000080000000000000000000003c000000010800000000000000000070000000020000000 % 00800000000000000000000000000000 % 0000000039f800000000000000000003c00000007080000000000000000003c0000000e7e00000 % 00800000000000000000000000000002 % 00000000600000000000000000000001e0000000c1c0000000000000000000e000000180000000 % 01c00000000000000000000000000000 % 00000000000000000000000000000001f000000000000000000000000000007800000000000000 % 00000000000000000000000000000002 % 00000000000000000000000000000000f800000000000000000000000000001c00000000000000 % 00000000000000000000000000000002 % 00000000000000000000000000000000d800000000000000000000000000000f00000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000006c00000000000000000000000000000380000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000006e000000000000000000000000000001e0000000000000 % 00000000000000000000000000000003 % 000000000000000000000000000000007700000000000000000000000000000070000000000000 % 00000000000000000000000000000003 % 00000000000000000000000000000000330000000000000000000000000000003c00180000c000 % 00000000000000000000000000000002 % 00000000000000000000000000000000318000000000000000000000000000000e000800004000 % 00000000000000000000000000000002 % 0000000000000000000000000000000019c0000000000000000000000000000007800800004000 % 00000000000000000000000000000002 % 0000000000000000000000000000000018e0000000000000000000000000000001c0f9dc07c847 % 371b8f00000000000000000000000002 % 000000000000000000000000000000000c60000000000000000000000000000000f188880c58cf % 988c5080000000000000000000000001 % 000000000000000000000000000000000c300000000000000000000000000000002108c8084848 % 10884380000000000000000000000001 % 000000000000000000000000000000000e38000000000000000000000000000000010850084848 % 10884c80000000000000000000000000 % 00000000000000000000000000000000061c00000000000000000000000000000001185008c8cc % 90885180000000000000000000000000 % 00000000000000000000000000000000060c00000000000000000000000000000000ec20076767 % 39dceec0000000000000000000000002 % 000000000000000000000000000000000306000000000000000000000000000000000020000000 % 00000000000000000000000000000001 % 0000000000000000000000000000000003070000000000000000000000000000000000e7e00000 % 00000000000000000000000000000001 % 000000000000000000000000000000000183800000000000000000000000000000000180000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000181800000000000000000000000000000000000000000 % 00000000000000000000000000000003 % 0000000000000000000000000000000001c0c00000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 0000000000000000000000000000000000c0e00000000000000000000000000000000000000000 % 00000000000000000000000000000001 % 0000000000000000000000000000000000c0700000000000000000000000000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000060300000000000000000000000000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000060180000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 0000000000000000000000000000000000301c0000000000000000000000000000000000000000 % 00000000000000000000000000000001 % 0000000000000000000000000000000000300e0000000000000000000000000000000000000000 % 00000000000000000000000000000001 % 000000000000000000000000000000000038060000000000000000000000000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000018030000000000000000000000000000000000000000 % 00000000000000000000000000000003 % 00000000000000000000000000000000001803ff00000000000000000000000000000000000000 % 00000000000000000000000000000002 % 00000000000000000000000000000000000c01fffff80000000000000000000000000000000000 % 00000000000000000000000000000001 % 00000000000000000000000000000000000c00000fffffc0000000000000000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000006000000007ffffe0000000000000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000006000000000003fffff0000000000000000000001c00 % 00060000000000000000000000000002 % 000000000000000000000000000000000007000000000000001fffff8000000000008000002200 % 00020000000000000000000000000001 % 000000000000000000000000000000000003000000000000000000fffffc000000008000002200 % 00020000000000000000000000000001 % 0000000000000000000000000000000000030000000000000000000007ffffe00001eef71c0671 % dfc20000000000000000000000000000 % 0000000000000000000000000000000000018000000000000000000000003fffff008479be0cf8 % 8c220000000000000000000000000003 % 0000000000000000000000000000000000018000000000000000000000000001fff08650a00280 % d0e20000000000000000000000000002 % 000000000000000000000000000000000000c00000000000000000000000000000e08290a02280 % 53220000000000000000000000000000 % 000000000000000000000000000000000000c00000000000000000000000000003c08291b222c8 % 64620000000000000000000000000000 % 000000000000000000000000000000000000e0000000000000000000000000000700e11f1c1c70 % 23b70000000000000000000000000003 % 00000000000000000000000000000000000060000000000000000000000000001e000110000000 % 00000000000000000000000000000003 % 000000000000000000000000000000000000600000000000000000000000000038000710000000 % 00000000000000000000000000000001 % 0000000000000000000000000000000000003000000000000000000000000000f0000c38000000 % 00000000000000000000000000000001 % 0000000000000000000000000000000000003000000000000000000000000001c0000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000180000000000000000000000000780000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000180000000000000000000000000e00000000000000 % 00000000000000000000000000000002 % 0000000000000000000000000000000000001c0000000000000000000000003c00000000000000 % 00000000000000000000000000000001 % 0000000000000000000000000000000000000c0000000000000000000000007000000000000000 % 00000000000000000000000000000003 % 0000000000000000000000000000000000000c000000000000000000000001e000000000000000 % 00000000000000000000000000000001 % 0000000000000000000000000000000000000600000001c000004000000003800000180000c000 % 18000000000000000000000000000001 % 0000000000000000000000000000000000000604000002200008400020000f0000000800004000 % 08000100000000000000000000000002 % 0000000000000000000000000000000000000304000002200008000020001c0000000800004000 % 08000100000000000000000000000002 % 000000000000000000000000000000000000030fefb8e063c79eddde79c078000000f9dc07c847 % 88f10bc0000000000000000000000000 % 000000000000000000000000000000000000038445cdf0c42c4848a123e0e000000188880c58c8 % 499b1900000000000000000000000002 % 000000000000000000000000000000000000018464850020e8084d072200ffffffe108c8084841 % c9090900000000000000000000000001 % 000000000000000000000000000000000000000428850223280845192200f00000010850084846 % 49090900000000000000000000000001 % 0000000000000000000000000000000000000004288d92246c484623232038000001185008c8c8 % c9191900000000000000000000000001 % 000000000000000000000000000000000000000710f8e1c3b78ee21db9c01e000000ec20076767 % 7cf0edc0000000000000000000000001 % 000000000000000000000000000000000000000010800000000000000000070000000020000000 % 00000000000000000000000000000000 % 00000000000000000000000000000000000000007080000000000000000003c0000000e7e00000 % 00000000000000000000000000000000 % 0000000000000000000000000000000000000000c1c0000000000000000000e000000180000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000007800000000000000 % 00000000000000000000000000000001 % 000000000000000000000000000000000000000000000000000000000000001c00000000000000 % 00000000000000000000000000000001 % 000000000000000000000000000000000000000000000000000000000000000f00000000000000 % 00000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000380000000000000 % 00000000000000000000000000000001 % 0000000000000000000000000000000000000000000000000000000000000001e0000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000070000000000000 % 00000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000003c001800000003 % 8efc3e01000040001000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000e000800000021 % c44611010000e0003000000000000003 % 000000000000000000000000000000000000000000000000000000000000000007800800000021 % 444211000000a0001000000000000003 % 000000000000000000000000000000000000000000000000000000000000000001c0f9dc078f79 % 644611fb3760a3ef1700000000000003 % 000000000000000000000000000000000000000000000000000000000000000000f188880858a1 % 347c1e41199131189880000000000003 % 0000000000000000000000000000000000000000000000000000000000000000002108c801d021 % 344210411111f1101080000000000002 % 000000000000000000000000000000000000000000000000000000000000000000010850065021 % 1c421041111119101080000000000000 % 00000000000000000000000000000000000000000000000000000000000000000001185008d8a1 % 0c421841111209189080000000000001 % 00000000000000000000000000000000000000000000000000000000000000000000ec20076f3b % 8cfc38e3bbbf1f8f39c0000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000020000000 % 00000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000000000e7e00000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000180000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 00000000000000000000000000000000000000000000f802000f38000f8019f800000000000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000000000004402000610001090088c00000200000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000000000004400000610001050088600000200000000 % 00000000000000000000000000000002 % 00000000000000000000000000000000000006bc79b845f6dd8223cf9c3cf88270f1e780000000 % 00000000000000000000000000000002 % 000000000000000000000000000000000000096284c478826643242407918882f90b1200000000 % 00000000000000000000000000000002 % 00000000000000000000000000000000001f0ec01c844082444140e400510882803a0200000000 % 00000000000000000000000000000002 % 0000000000000000000000000000000000fc01c0648440824441c3241051088680ca0200000000 % 00000000000000000000000000000000 % 0000000000000000000000000000000007e008e28c8460824441846418911884c91b1200000000 % 00000000000000000000000000000002 % 000000000000000000000000000000003f000f3c77cee1c7eee083be1f1cedf870ede380000000 % 00000000000000000000000000000002 % 03000018000000400000079c00000001f800000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 0100000800000840002003080000000fc000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 0100000800000800002003080000007e0000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 1f3b80f8e3c3decefe79c113c7cd03f00000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 31110189f42628446123e19422120f800000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 2119010900e40846872200a0e21d0f000000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 210a010903240842992200e3220307e00000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 230a011994662843232320c4621100fc0000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 1d8400ece3b3cee11db9c043b71e001f8000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 % 00040000000000000000000000000003f000018000000e3bf1f0080001000080e0800000000018 % 0000c00000071df8f804000080004002 % 001c7e000000000000000000000000007e00008000008711188808000380018040802000000008 % 000040000043888c44040001c000c002 % 003000000000000000000000000000000fc0008000008511088800000280008040002000000008 % 00004000004288844400000140004002 % 0000000000000000000000000000000001f80f8e3c79e591188bf9bb029f3cb84186f8000000f9 % dc07c71e3cf2c88c45fcdd814f9e5c02 % 00000000000000000000000000000000003f189f42c484d1f0f108cc84c862c44089207ffff188 % 880c4fa1624268f87884664264316202 % 00000000000000000000000000000000000710900e8084d10881088887c84084408ea07ffff108 % c80848074042688440844443e4204202 % 00000000000000000000000000000000000010903280847108810888846840844281a000000108 % 50084819404238844084444234204202 % 000000000000000000000000000000000000119946c4843108c10888882862844688a000000118 % 5008cca3624218846084444414314202 % 0000000000000000000000000000000000000ece3b78ee33f1c39ddddc7c3dcefdcf38000000ec % 2007671dbc7719f8e1ceeeee3e1ee702 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 20000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % e3f00000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000001 % 80000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000002 %%EndPreview save /d_sv_obj exch def userdict /IslandDrawDict 300 dict dup begin put /bdef {bind def} bind def /E {exch} bdef /FF {findfont} bdef /MF {makefont} bdef /RO {rotate} bdef /SC {scale} bdef /SF {setfont} bdef /SG {setgray} bdef /TR {translate} bdef /bp {lj lw rgb} bdef /bpbw {lj lw setgray} bdef /c {curveto} bdef /cl {closepath} bdef /fi {eofill} bdef /g {setgray} bdef /gr {grestore} bdef /gs {gsave} bdef /l {lineto} bdef /lj {setlinejoin} bdef /lw {setlinewidth} bdef /m {moveto} bdef /n {newpath} bdef /nx {/x E def} bdef /r {rmoveto} bdef /rl {rlineto} bdef /rgb {setrgbcolor} bdef /s {show} bdef /sd {setdash} bdef /sp {x 0 rmoveto} bdef /ss {currentpoint pop E m} bdef /st {stroke} bdef %% pattern stuff /BPSIDE 32 def %% pixels per pattern side /PATFREQ 3.0 def %% pattern pixels per mm /dp_mat [PATFREQ 0 0 PATFREQ 0 0] def /dp_pw BPSIDE def %% pattern pixel width /dp_ph BPSIDE def %% pattern pixel height /dp_w dp_pw PATFREQ div def %% pattern mm width /dp_h dp_ph PATFREQ div def %% pattern mm height /savemat matrix def /topmat matrix def /patmat matrix def %% catch nocurrentpoint error for: pathbbox /ncpoint errordict /nocurrentpoint get def errordict begin /nocurrentpoint { dup /pathbbox load eq {pop 0 0 1 1} {ncpoint} ifelse } bdef end /ar { %% sa ea sx sy rot tx ty matrix currentmatrix 8 1 roll TR RO SC n 0 0 1 5 3 roll arc setmatrix } bdef /arn { %% sa ea sx sy rot tx ty TR RO SC matrix currentmatrix 8 1 roll n 0 0 1 5 3 roll arcn setmatrix } bdef /el { %% sx sy rot tx ty matrix currentmatrix 6 1 roll TR RO SC n 0 0 1 0 360 arc setmatrix cl } bdef /image_raster { %% sw sh sd dw dh xs ys TR SC /sd E def /sh E def /sw E def /imagebuf sw sd mul 7 add 8 idiv string def sw sh sd [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop} image } bdef /imagemask_raster { TR SC /sh E def /sw E def /imagebuf sw 7 add 8 idiv string def sw sh false [sw 0 0 sh 0 0] {currentfile imagebuf readhexstring pop} imagemask } bdef /dither_color_raster { % bool sw sh sd dw dh xs ys TR SC /sd E def /sh E def /sw E def sd 8 eq and { /imagebuf 3 string def /grayval 1 string def sw sh sd [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop pop imagebuf 0 get 0.299 mul imagebuf 1 get 0.587 mul add imagebuf 2 get 0.114 mul add cvi grayval exch 0 exch put grayval } image } { /imagebuf sw 3 mul sd mul 7 add 8 idiv string def sh { currentfile imagebuf readhexstring pop pop } repeat } ifelse } bdef /image_color_raster { % bool sw sh sd dw dh xs ys /colorimage where not { dither_color_raster } { pop TR SC /sd E def /sh E def /sw E def pop /imagebuf sw 3 mul sd mul 7 add 8 idiv string def sw sh sd [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop} false 3 colorimage } ifelse } bdef /patpath { /inv E def topmat setmatrix pathbbox %% get lo - hi indecies /hy E dp_h div floor cvi def /hx E dp_w div floor cvi def /ly E dp_h div floor cvi def /lx E dp_w div floor cvi def lx 1 hx { dp_w mul ly 1 hy { dp_h mul E dup 3 1 roll E patmat currentmatrix pop TR dp_pw dp_ph inv dp_mat dp_proc imagemask patmat setmatrix } for pop } for } bdef % setpattern brush of patterns instead of gray /setpattern { /blue E def /green E def /red E def /freq E def /bwidth E def /bpside E def /bstring E def /onbits 0 def /offbits 0 def freq 0 {/y E def /x E def /xindex x 1 add 2 div bpside mul cvi def /yindex y 1 add 2 div bpside mul cvi def bstring yindex bwidth mul xindex 8 idiv add get not 1 7 xindex 8 mod sub bitshift and 0 ne {/onbits onbits 1 add def 1} {/offbits offbits 1 add def 0} ifelse } setscreen {} settransfer systemdict /setcmykcolor known { /fact 1 onbits offbits onbits add div sub def 1 red sub fact mul 1 green sub fact mul 1 blue sub fact mul 0 setcmykcolor } { offbits offbits onbits add div setgray} ifelse } bdef /dmatrix matrix def /dpi 72 0 dmatrix defaultmatrix dtransform dup mul E dup mul add sqrt def /B {gs bp st gr} bdef %% brush: gr lw lj /Bbw {gs bpbw st gr} bdef %% brush: gr lw lj /F {gs rgb eofill gr} bdef %% fill: gr /Fbw {gs setgray eofill gr} bdef %% fill: gr /PB {gs lj lw setpattern st gr} bdef /PF {gs eoclip patpath gr} bdef /BB {gs rgb lj lw strokepath clip patpath gr} bdef /xdef {exch def} bdef /clip_region { /ht xdef /wd xdef /bm xdef /lm xdef newpath lm bm moveto 0 ht rlineto wd 0 rlineto 0 ht neg rlineto closepath clip } bdef %! Island text prolog Version 3.1 %% %%BeginProlog /reencode_small_dict 12 dict def /ReencodeSmall { reencode_small_dict begin /new_codes_and_names exch def /new_font_name exch def /base_font_name exch def /base_font_dict base_font_name findfont def /newfont base_font_dict maxlength dict def base_font_dict { exch dup /FID ne { dup /Encoding eq { exch dup length array copy newfont 3 1 roll put } { exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall newfont /FontName new_font_name put new_codes_and_names aload pop new_codes_and_names length 2 idiv { newfont /Encoding get 3 1 roll put } repeat new_font_name newfont definefont pop end %reencode_small_dict } def /extended_Zapf [ 8#223 /a89 8#224 /a90 8#225 /a93 8#226 /a94 8#227 /a91 8#230 /a92 8#231 /a205 8#232 /a85 8#233 /a206 8#234 /a86 8#235 /a87 8#236 /a88 8#237 /a95 8#240 /a96 ] def /extended_Standard [ 29 /thorn 30 /yacute 31 /divide 128 /Acircumflex 129 /Adieresis 130 /Agrave 131 /Aring 132 /Atilde 133 /Ccedilla 134 /Eacute 135 /Ecircumflex 136 /Edieresis 137 /Egrave 138 /Iacute 139 /Icircumflex 140 /Idieresis 141 /Igrave 142 /Ntilde 143 /Oacute 144 /Ocircumflex 145 /Odieresis 146 /Ograve 147 /Otilde 148 /Scaron 149 /Uacute 150 /Ucircumflex 151 /Udieresis 152 /Ugrave 153 /Ydieresis 154 /Zcaron 155 /aacute 156 /acircumflex 157 /adieresis 158 /agrave 159 /aring 160 /atilde 161 /exclamdown 162 /cent 163 /sterling 164 /fraction 165 /yen 166 /florin 167 /section 168 /currency 169 /quotesingle 170 /quotedblleft 171 /guillemotleft 172 /guilsinglleft 173 /guilsinglright 174 /fi 175 /fl 176 /plusminus 177 /endash 178 /dagger 179 /daggerdbl 180 /periodcentered 181 /twosuperior 182 /paragraph 183 /bullet 184 /quotesinglbase 185 /quotedblbase 186 /quotedblright 187 /guillemotright 188 /ellipsis 189 /perthousand 190 /threesuperior 191 /questiondown 192 /mu 193 /grave 194 /acute 195 /circumflex 196 /tilde 197 /macron 198 /breve 199 /dotaccent 200 /dieresis 201 /onesuperior 202 /ring 203 /cedilla 204 /onequarter 205 /hungarumlaut 206 /ogonek 207 /caron 208 /emdash 209 /ccedilla 210 /copyright 211 /eacute 212 /ecircumflex 213 /edieresis 214 /egrave 215 /iacute 216 /icircumflex 217 /idieresis 218 /igrave 219 /logicalnot 220 /minus 221 /ntilde 222 /oacute 223 /ocircumflex 224 /odieresis 225 /AE 226 /onehalf 227 /ordfeminine 228 /ograve 229 /otilde 230 /registered 231 /scaron 232 /Lslash 233 /Oslash 234 /OE 235 /ordmasculine 236 /trademark 237 /uacute 238 /ucircumflex 239 /udieresis 240 /ugrave 241 /ae 242 /ydieresis 243 /zcaron 244 /Aacute 245 /dotlessi 246 /threequarters 247 /Eth 248 /lslash 249 /oslash 250 /oe 251 /germandbls 252 /multiply 253 /Yacute 254 /Thorn 255 /eth ] def /extended_Symbol [ ] def /extend_font { % stack: fontname newfontname exch dup (ZapfDingbats) eq { cvn exch cvn extended_Zapf ReencodeSmall } { dup (Symbol) eq { cvn exch cvn extended_Symbol ReencodeSmall } { cvn exch cvn extended_Standard ReencodeSmall } ifelse } ifelse } bind def /extend_font_name { % stack: font_name_string dup length 1 add string /extended_font_name exch def extended_font_name 0 (_) putinterval extended_font_name 1 3 -1 roll putinterval extended_font_name } bind def /gf { /f exch def f cvn where { f exch begin cvn load exec setfont end } { f 0 f length 8 sub getinterval dup /localfont exch extend_font_name def localfont extend_font localfont findfont /xsz f f length 4 sub 4 getinterval cvi def /ysz f f length 8 sub 4 getinterval cvi def [ xsz 0 0 ysz neg 0 0 ] makefont dup f cvn exch def setfont } ifelse } bind def /gfns { /f exch def f cvn where { f exch begin cvn load exec setfont end } { f 0 f length 8 sub getinterval cvn findfont /xsz f f length 4 sub 4 getinterval cvi def /ysz f f length 8 sub 4 getinterval cvi def [ xsz 0 0 ysz neg 0 0 ] makefont dup f cvn exch def setfont } ifelse } bind def /ul { % space drop thickness gs currentpoint currentlinewidth currentpoint n m 6 -3 roll lw 0 exch r 0 rl st lw m gr } bind def /nxtab { currentpoint pop 1000.0 mul cvi tab mod tab exch sub 1000.0 div 0 rmoveto } bind def /nx { /x exch def } bind def 0. nx %%EndProlog gsave 2.83465 -2.83465 scale 0 -279.4 translate topmat currentmatrix pop n savemat currentmatrix pop [1 0 0 1 64.0522 38.7012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -1536 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_activateVars) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 73.73 46.2012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_ftran) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 73.73 31.2012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (scanPrimVarStdAct) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 73.73 26.2012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_swapobjs) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 73.73 51.2012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_initp1obj) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 112.606 36.2012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -2204 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_actNBPrimArchList) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 119.925 36.2012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_actNBPrimArch) s savemat setmatrix n 113.55 35 m 118.55 35 l gsave 0 0 0 0.1764 0 B grestore n savemat currentmatrix pop [1 0 0 1 91.6511 41.2012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -1016 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_accchk) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 99.1111 41.2012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_factor) s savemat setmatrix n 92.74 40 m 97.74 40 l gsave 0 0 0 0.1764 0 B grestore n 65 37.5 m 72.5 25 l gsave 0 0 0 0.1764 0 B grestore n 65 37.5 m 72.5 30 l gsave 0 0 0 0.1764 0 B grestore n 65 37.5 m 72.5 35 l gsave 0 0 0 0.1764 0 B grestore n 65 37.5 m 72.5 40 l gsave 0 0 0 0.1764 0 B grestore n 65 37.5 m 72.5 45 l gsave 0 0 0 0.1764 0 B grestore n 65 37.5 m 72.5 50 l gsave 0 0 0 0.1764 0 B grestore n savemat currentmatrix pop [1 0 0 1 73.73 63.7012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_btran) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 73.73 78.7012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (type2eval) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 106.197 106.201] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_actNBPrimArch) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 106.197 96.2012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (type3eval) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 96.5194 101.201] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -1292 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (type3activate) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 106.197 101.201] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_dualout) s savemat setmatrix n 97.467 100 m 104.97 95 l gsave 0 0 0 0.1764 0 B grestore n 97.467 100 m 104.97 100 l gsave 0 0 0 0.1764 0 B grestore n 97.467 100 m 104.97 105 l gsave 0 0 0 0.1764 0 B grestore n savemat currentmatrix pop [1 0 0 1 96.5194 83.7012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -1292 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (type2activate) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 106.197 83.7012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_dualpivot) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 106.197 88.7012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_duenna) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 106.197 78.7012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_actNBPrimArch) s savemat setmatrix n 97.467 82.5 m 104.97 77.5 l gsave 0 0 0 0.1764 0 B grestore n 97.467 82.5 m 104.97 82.5 l gsave 0 0 0 0.1764 0 B grestore n 97.467 82.5 m 104.97 87.5 l gsave 0 0 0 0.1764 0 B grestore n savemat currentmatrix pop [1 0 0 1 88.6172 71.2012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -844 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (type1var) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 98.295 71.2012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_actNBPrimArch) s savemat setmatrix n 89.565 70 m 97.065 70 l gsave 0 0 0 0.1764 0 B grestore n savemat currentmatrix pop [1 0 0 1 64.0522 83.7012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -1544 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_dualaddvars) s savemat setmatrix n 65 82.5 m 72.5 62.5 l gsave 0 0 0 0.1764 0 B grestore n 65 82.5 m 72.5 70 l gsave 0 0 0 0.1764 0 B grestore n 65 82.5 m 72.5 77.5 l gsave 0 0 0 0.1764 0 B grestore n 65 82.5 m 72.5 82.5 l gsave 0 0 0 0.1764 0 B grestore n 65 82.5 m 72.5 100 l gsave 0 0 0 0.1764 0 B grestore n 65 82.5 m 72.5 92.5 l 105 95 l gsave 0 0 0 0.1764 0 B grestore n savemat currentmatrix pop [1 0 0 1 61.5522 121.201] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -1764 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_deactivateVars) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 71.23 118.701] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (scanPrimVarStdDeact) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 108.272 123.701] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -2100 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (deactNBPrimArchList) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 115.311 123.701] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_deactNBPrimArch) s savemat setmatrix n 109.08 122.5 m 114.08 122.5 l gsave 0 0 0 0.1764 0 B grestore n 62.5 120 m 70 117.5 l gsave 0 0 0 0.1764 0 B grestore n 62.5 120 m 70 122.5 l gsave 0 0 0 0.1764 0 B grestore userdict /#copies 1 put grestore %%Trailer %%DocumentNeededResources: font Bookman-Light %%DocumentSuppliedResources: end d_sv_obj restore DyLP-1.6.0/DyLP/doc/Figures/primalpivcalls.epsu0000644000076700007670000013151011171477034016173 0ustar %!PS-Adobe-3.0 EPSF-3.0 %%Title: /cs/mitacs1/lou/Bonsai/Doc/Dylp.New/Figures/primpivcalls.epsu %%Creator: IslandDraw for lou %%CreationDate: Sat Sep 10 14:28:31 2005 %%Pages: 1 %%BoundingBox: 81 552 528 727 %%DocumentNeededResources: (atend) %%DocumentSuppliedResources: (atend) %%EndComments %%BeginPreview: 559 219 1 438 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000000000000000060001c00000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000020002200000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000020002200000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 0000000000000000000000000000000000000003eee077be79b800000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 00000000000000000000000000000000000000062440221084c400000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 0000000000000000000000000000000000006004264022101c8400000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000600422802210648400000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000000000000c004628022108c8400000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000000000000c003b10073b877ce00000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000001800001000000000000000000000300000206000200 % 00000000000000000000000000000000000000000000000000000000000001 % 0000000000000000000000000000000000018000071f8000000000000000000100000602000200 % 00000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000300000c000000000000000000000100000202b00000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000003000000000000000000000000001f7701e2e246e6ee % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000006000000000000000000000000003122031312873244 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000006000000000000000000000000c02132020213c21268 % 00000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000e000000000000000000000001c02114020212421228 % 00000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000c000000000000000000000003802314031212623230 % 00000000000000000000000000000000000000000000000000000000000001 % 00000000000000000000000000000000000c000000000000000000000007001d8801e73f73e710 % 00000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000001800000000000000000000000e000008000000020000 % 00000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000001800000000000000000000001c000038fc0000020000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000030000000000000000000000038000060000000070000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000030000000000000000000000070000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000600000000000000000000000e0000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000600000000000000000000001c0000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 0000000000000000000000000000000000c0000000000000000000000380000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000c0000000000000000000000700000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000001c0000000100000600000000e00000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000180000000100000200004001c00000006200300010000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000180000000000000200004003800000002200100230000 % 00000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000003000006efb3763c27884f007000000002000100210000 % 00000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000003000007341199422cd8c400e00000373e67df1e7973be % e39f0000000000000000000000000000000000000000000000000000000001 % 00000000000000000000000000000000060040021411110e28484401ffffc039e2223133218917 % 37c80000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000060060021411113228484401ffffc010c2222121210992 % 14080000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000c00c0023411114628c8c401c0000010c22221212108a2 % 14080000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000c01c003ee3bbbbb77876700e0000011c62223232108a2 % 36480000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000001801800200000000000000007000001f3b771d9e3b9c43 % e39c0000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000001803000200000000000000003800001000000000000042 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000003807000700000000000000001c000010000000000001c2 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000000003006000000000000000000000e00003800000000000307 % 00000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000300e000000000000000000000700000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000600c000000000000000000000380000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000060180000000000000000000001c0000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000c0380000000000000000000000e0000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000c030000000000000000000000070000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000018060000000000000000000000038000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000180e000000000000000000000001c00000c000400000000 % 00000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000300c000000000000000000000000e000004008c00000000 % 00000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000301c0000000000000000000000007000004008400000000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000070180000000000000000000000003801e7c79e5cefb9c7c % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000060300000000000000000000000001c031c4cc86245cfe20 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000060700000000000000000000000000c02084848426486020 % 00000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000c0600000000000000000000000000002084848422886020 % 00000000000000000000000000000000000000000000000000000000000001 % 0000000000000000000000000000000c0c0000000000000000000000000000318c8c842288f220 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000181c00000000000000000000000000001e7678ee710f9c70 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000000181800000000000000000000000000000000000001080000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000303800000000000000000000000000000000000007080000 % 00000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000030300000000000000000000000000000000000000c1c0000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000606000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000060e000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000e0c000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000c18000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000000c38000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000001830000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000001870000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000003060000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 0000000000000000000000000000030c0000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 0000000000000000000000000000061c0000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000006180000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000c300000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 00000000000000000000000000000c700000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 00000000000000000000000000001c600000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000018e000000000001000000003010000000000000000000007e0 % 003e010000f00000e800006000000000000000000000007c000003e2000001 % 000000000000000000000000000018c00000000000100000000121000020000000000000000230 % 00110100010800411800002000000000000000000004008400000112000101 % 000000000000000000000000000031800000000000000000000120000020000000000000000208 % 00110000020800420800002000000000000000000004008200000110000101 % 0000000000000000000000000000338000000006efb3766ec2117b1e21780000000035e3cdc247 % 9f11fb37620484f205e6e3e1a000000006e7de6ec3cf38e0f1b8e11677f3c0 % 000000000000000000000000000063000000000734119933263121336320000000004b142623cc % c81e411992058c4202131622400000000732333326647c3d08c5f1e2239901 % 000000000000000000000000000066000000e0021411112222112121212007ffff007600e42248 % 481041111204844200721423a03ffff8021221222424400238850102350901 % 0000000000000000000000000000ce000003c0021411112222112121212007ffff000e03242208 % 48104111120c844205921420600000000212212224244082c8850102150901 % 0000000000000000000000000000cc000007800234111122223121232320000000004714642708 % c818411111088c410a3214622000000002322322246464c518859182191900 % 00000000000000000000000000019c00001e0003ee3bbbf771dbbb9e1db80000000079e3be7707 % 9c38e3bbb8f07670f1df3bb3c000000003e71e7773c738f8edcee38708f1c1 % 000000000000000000000000000198000078000200000000000000000000000000000000000000 % 00000000000000000000000000000000020000000000000000000000000001 % 0000000000000000000000000003b00000f0000200000000000000000000000000000000000000 % 00000000000000000000000000000000020000000000000000000000000001 % 0000000000000000000000000003700003c0000700000000000000000000000000000000000000 % 00000000000000000000000000000000070000000000000000000000000001 % 000000000000000000000000000360000f00000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 0000000000000000000000000006c0001e00000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 0000000000000000000000000007c0007800000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000d8001e000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000f8003c000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000001b000f0000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000001e003c0000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000003e00780000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000003c01e00000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000007807800000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000780f000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000703c000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000f0f0000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000e1e0000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000001c780000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 03000000040000180100000001de00000000000060000600000002000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 01000000040000080100004003bc00000000000020000200000002000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 01000000000000080000004003f000000000000020000200060000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 1f3b81b9fcdd8789bb3bbcf007c0000000000003eee03e3839c6e66e0000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 311101cc84664849cd11664007ffffffffffe0062440627c47e312310000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 21190084844441c8851a424007ffffffffffe00426404240460212210000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 210a008484444648850a424007f0000000000004228042403a0212210000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 230a008c844448c88d0c464003fe00000000000462804664432212210000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 1d8400f9ceeee77cfb843c7003ff800000000003b1003b387dc73f738000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 00040080000000008000000001fbf0000000000001000000460000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 001c7e80000000008000000001fc7c0000000000071f8000c60000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 003001c000000001c000000001fe1f80000000000c000000780000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000ff83e00000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000fdc0fc0000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000007ee01f0000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000007f7007e000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000007fbc00f800000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000003f8e003f00000060000600000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000003ec70007c0000020000200000000000200000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000001fe38001f8000020000200060000000200000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000001ff1e0003e0003eee03e3839c6e3c42780000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000fb870000fc0062440627c47e3166c6200000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000fdc380001e00426404240460214242200000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000fcc1c00004004228042403a0214242200000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000007e60f0000000462804664432214646200000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 0000000000000000000000000007f70380000003b1003b387dc73bc3b380000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000003f381c000000001000000460000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000003d9c0e0000000071f8000c60000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000003fce0780000000c000000780000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000001ec601c00000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000001fe300e00000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000f6380700000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 0000000000000000000000000000fb1c03c0000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000007b8e00e0000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000007d870070000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000006cc300380000600000060c0000040000100000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000003ee1801e000020000002044000040000100000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000003661c007000020000002044000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000001f70e0038003eee03c3e7cf3cdcddfee300000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 00000000000000000000000000001b307001c00624404262c4466e64891f100000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000001f983800e00426400e4284442424d110100000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000d9c1800000422803242844424245110100000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000dcc0c000004628046468c4464646119100000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000006c60e000003b1003b3b7673c7ce238e100000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000006e70700000001000000000004000000100000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000036303800000071f8000000004000000500000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 0000000000000000000000000000037381c000000c00000000000e000000e00000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000033180c0000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000001b8c060000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000198e070000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000dc6038000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000cc301c000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000ee380e000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000000661806000060006000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000671c03000020002020000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000330c03800020002020000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000338601c003eee02e7bef1b80000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000198700e00624403321108c40000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000019c300600426402121038840000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000018c1800004228021210c8840000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000ce1c0000462802321118840000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000c60c00003b1003e3b8edce0000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000670e0000001000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000630600000071f8000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000007383000000c000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000031838000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000031c18000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000000018c0c000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000018e0e000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 00000000000000000000000000000000c606000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000c707000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000c303000060000020000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000006381800020000020001000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000006181c00020000000001000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000031c0c003eee06e677f3c00000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000030c0600624407322399000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 0000000000000000000000000000000038e0400426402123509000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000000001860000422802121509000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000000001870000462802321919000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000000000c300003b1003e708f1c00000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000000000c38000001002000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 0000000000000000000000000000000006180000071fa000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 00000000000000000000000000000000061c00000c007000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000060c000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 00000000000000000000000000000000030e000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000000000306000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000000000187000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000000000183000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 0000000000000000000000000000000001c3800000100000600000600000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 0000000000000000000000000000000000c1800000100000200000200400000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000c1c00000000000200000200400000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000000000060c006efb3763c2426e3e78f70000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000000000060e007341199422c67362844f8000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 00000000000000000000000000000000003060021411110e24221421c480000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000030000214111132242214264480000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 00000000000000000000000000000000003000023411114624623468c4c8000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 0000000000000000000000000000000000180003ee3bbbbb73b3e3b76770000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000000000018000200000000000200000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 00000000000000000000000000000000000c000200000000000200000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 00000000000000000000000000000000000c000700000000000700000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 00000000000000000000000000000000000e000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000006000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000000000006000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000000000003000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000000000003000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000000000001800000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000000000001800000000000030000000000000000080000180000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000000000001800000000000010020000000000000080000080000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000c000000000000100200000000000000000000ac000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000c006e34e21371f3c7b800000000373f8f1cee90000 % 00000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000006007349f6339b14227c00000000399098be2ca0000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000600217502110a10e24001ffffc01090902010f0000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000210d02110a13224000000000109090203890000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000000000000000234592311a34626400000000119098b24c98000 % 00000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000003e78e1d9f1dbb3b8000000001f39cf1cefdc000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000200000010000000000000000100000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000000000000000200000010000000000000000100000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000700000038000000000000000380000000000000 % 00000000000000000000000000000000000000000000000000000000000001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 %%EndPreview save /d_sv_obj exch def userdict /IslandDrawDict 300 dict dup begin put /bdef {bind def} bind def /E {exch} bdef /FF {findfont} bdef /MF {makefont} bdef /RO {rotate} bdef /SC {scale} bdef /SF {setfont} bdef /SG {setgray} bdef /TR {translate} bdef /bp {lj lw rgb} bdef /bpbw {lj lw setgray} bdef /c {curveto} bdef /cl {closepath} bdef /fi {eofill} bdef /g {setgray} bdef /gr {grestore} bdef /gs {gsave} bdef /l {lineto} bdef /lj {setlinejoin} bdef /lw {setlinewidth} bdef /m {moveto} bdef /n {newpath} bdef /nx {/x E def} bdef /r {rmoveto} bdef /rl {rlineto} bdef /rgb {setrgbcolor} bdef /s {show} bdef /sd {setdash} bdef /sp {x 0 rmoveto} bdef /ss {currentpoint pop E m} bdef /st {stroke} bdef %% pattern stuff /BPSIDE 32 def %% pixels per pattern side /PATFREQ 3.0 def %% pattern pixels per mm /dp_mat [PATFREQ 0 0 PATFREQ 0 0] def /dp_pw BPSIDE def %% pattern pixel width /dp_ph BPSIDE def %% pattern pixel height /dp_w dp_pw PATFREQ div def %% pattern mm width /dp_h dp_ph PATFREQ div def %% pattern mm height /savemat matrix def /topmat matrix def /patmat matrix def %% catch nocurrentpoint error for: pathbbox /ncpoint errordict /nocurrentpoint get def errordict begin /nocurrentpoint { dup /pathbbox load eq {pop 0 0 1 1} {ncpoint} ifelse } bdef end /ar { %% sa ea sx sy rot tx ty matrix currentmatrix 8 1 roll TR RO SC n 0 0 1 5 3 roll arc setmatrix } bdef /arn { %% sa ea sx sy rot tx ty TR RO SC matrix currentmatrix 8 1 roll n 0 0 1 5 3 roll arcn setmatrix } bdef /el { %% sx sy rot tx ty matrix currentmatrix 6 1 roll TR RO SC n 0 0 1 0 360 arc setmatrix cl } bdef /image_raster { %% sw sh sd dw dh xs ys TR SC /sd E def /sh E def /sw E def /imagebuf sw sd mul 7 add 8 idiv string def sw sh sd [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop} image } bdef /imagemask_raster { TR SC /sh E def /sw E def /imagebuf sw 7 add 8 idiv string def sw sh false [sw 0 0 sh 0 0] {currentfile imagebuf readhexstring pop} imagemask } bdef /dither_color_raster { % bool sw sh sd dw dh xs ys TR SC /sd E def /sh E def /sw E def sd 8 eq and { /imagebuf 3 string def /grayval 1 string def sw sh sd [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop pop imagebuf 0 get 0.299 mul imagebuf 1 get 0.587 mul add imagebuf 2 get 0.114 mul add cvi grayval exch 0 exch put grayval } image } { /imagebuf sw 3 mul sd mul 7 add 8 idiv string def sh { currentfile imagebuf readhexstring pop pop } repeat } ifelse } bdef /image_color_raster { % bool sw sh sd dw dh xs ys /colorimage where not { dither_color_raster } { pop TR SC /sd E def /sh E def /sw E def pop /imagebuf sw 3 mul sd mul 7 add 8 idiv string def sw sh sd [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop} false 3 colorimage } ifelse } bdef /patpath { /inv E def topmat setmatrix pathbbox %% get lo - hi indecies /hy E dp_h div floor cvi def /hx E dp_w div floor cvi def /ly E dp_h div floor cvi def /lx E dp_w div floor cvi def lx 1 hx { dp_w mul ly 1 hy { dp_h mul E dup 3 1 roll E patmat currentmatrix pop TR dp_pw dp_ph inv dp_mat dp_proc imagemask patmat setmatrix } for pop } for } bdef % setpattern brush of patterns instead of gray /setpattern { /blue E def /green E def /red E def /freq E def /bwidth E def /bpside E def /bstring E def /onbits 0 def /offbits 0 def freq 0 {/y E def /x E def /xindex x 1 add 2 div bpside mul cvi def /yindex y 1 add 2 div bpside mul cvi def bstring yindex bwidth mul xindex 8 idiv add get not 1 7 xindex 8 mod sub bitshift and 0 ne {/onbits onbits 1 add def 1} {/offbits offbits 1 add def 0} ifelse } setscreen {} settransfer systemdict /setcmykcolor known { /fact 1 onbits offbits onbits add div sub def 1 red sub fact mul 1 green sub fact mul 1 blue sub fact mul 0 setcmykcolor } { offbits offbits onbits add div setgray} ifelse } bdef /dmatrix matrix def /dpi 72 0 dmatrix defaultmatrix dtransform dup mul E dup mul add sqrt def /B {gs bp st gr} bdef %% brush: gr lw lj /Bbw {gs bpbw st gr} bdef %% brush: gr lw lj /F {gs rgb eofill gr} bdef %% fill: gr /Fbw {gs setgray eofill gr} bdef %% fill: gr /PB {gs lj lw setpattern st gr} bdef /PF {gs eoclip patpath gr} bdef /BB {gs rgb lj lw strokepath clip patpath gr} bdef /xdef {exch def} bdef /clip_region { /ht xdef /wd xdef /bm xdef /lm xdef newpath lm bm moveto 0 ht rlineto wd 0 rlineto 0 ht neg rlineto closepath clip } bdef %! Island text prolog Version 3.1 %% %%BeginProlog /reencode_small_dict 12 dict def /ReencodeSmall { reencode_small_dict begin /new_codes_and_names exch def /new_font_name exch def /base_font_name exch def /base_font_dict base_font_name findfont def /newfont base_font_dict maxlength dict def base_font_dict { exch dup /FID ne { dup /Encoding eq { exch dup length array copy newfont 3 1 roll put } { exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall newfont /FontName new_font_name put new_codes_and_names aload pop new_codes_and_names length 2 idiv { newfont /Encoding get 3 1 roll put } repeat new_font_name newfont definefont pop end %reencode_small_dict } def /extended_Zapf [ 8#223 /a89 8#224 /a90 8#225 /a93 8#226 /a94 8#227 /a91 8#230 /a92 8#231 /a205 8#232 /a85 8#233 /a206 8#234 /a86 8#235 /a87 8#236 /a88 8#237 /a95 8#240 /a96 ] def /extended_Standard [ 29 /thorn 30 /yacute 31 /divide 128 /Acircumflex 129 /Adieresis 130 /Agrave 131 /Aring 132 /Atilde 133 /Ccedilla 134 /Eacute 135 /Ecircumflex 136 /Edieresis 137 /Egrave 138 /Iacute 139 /Icircumflex 140 /Idieresis 141 /Igrave 142 /Ntilde 143 /Oacute 144 /Ocircumflex 145 /Odieresis 146 /Ograve 147 /Otilde 148 /Scaron 149 /Uacute 150 /Ucircumflex 151 /Udieresis 152 /Ugrave 153 /Ydieresis 154 /Zcaron 155 /aacute 156 /acircumflex 157 /adieresis 158 /agrave 159 /aring 160 /atilde 161 /exclamdown 162 /cent 163 /sterling 164 /fraction 165 /yen 166 /florin 167 /section 168 /currency 169 /quotesingle 170 /quotedblleft 171 /guillemotleft 172 /guilsinglleft 173 /guilsinglright 174 /fi 175 /fl 176 /plusminus 177 /endash 178 /dagger 179 /daggerdbl 180 /periodcentered 181 /twosuperior 182 /paragraph 183 /bullet 184 /quotesinglbase 185 /quotedblbase 186 /quotedblright 187 /guillemotright 188 /ellipsis 189 /perthousand 190 /threesuperior 191 /questiondown 192 /mu 193 /grave 194 /acute 195 /circumflex 196 /tilde 197 /macron 198 /breve 199 /dotaccent 200 /dieresis 201 /onesuperior 202 /ring 203 /cedilla 204 /onequarter 205 /hungarumlaut 206 /ogonek 207 /caron 208 /emdash 209 /ccedilla 210 /copyright 211 /eacute 212 /ecircumflex 213 /edieresis 214 /egrave 215 /iacute 216 /icircumflex 217 /idieresis 218 /igrave 219 /logicalnot 220 /minus 221 /ntilde 222 /oacute 223 /ocircumflex 224 /odieresis 225 /AE 226 /onehalf 227 /ordfeminine 228 /ograve 229 /otilde 230 /registered 231 /scaron 232 /Lslash 233 /Oslash 234 /OE 235 /ordmasculine 236 /trademark 237 /uacute 238 /ucircumflex 239 /udieresis 240 /ugrave 241 /ae 242 /ydieresis 243 /zcaron 244 /Aacute 245 /dotlessi 246 /threequarters 247 /Eth 248 /lslash 249 /oslash 250 /oe 251 /germandbls 252 /multiply 253 /Yacute 254 /Thorn 255 /eth ] def /extended_Symbol [ ] def /extend_font { % stack: fontname newfontname exch dup (ZapfDingbats) eq { cvn exch cvn extended_Zapf ReencodeSmall } { dup (Symbol) eq { cvn exch cvn extended_Symbol ReencodeSmall } { cvn exch cvn extended_Standard ReencodeSmall } ifelse } ifelse } bind def /extend_font_name { % stack: font_name_string dup length 1 add string /extended_font_name exch def extended_font_name 0 (_) putinterval extended_font_name 1 3 -1 roll putinterval extended_font_name } bind def /gf { /f exch def f cvn where { f exch begin cvn load exec setfont end } { f 0 f length 8 sub getinterval dup /localfont exch extend_font_name def localfont extend_font localfont findfont /xsz f f length 4 sub 4 getinterval cvi def /ysz f f length 8 sub 4 getinterval cvi def [ xsz 0 0 ysz neg 0 0 ] makefont dup f cvn exch def setfont } ifelse } bind def /gfns { /f exch def f cvn where { f exch begin cvn load exec setfont end } { f 0 f length 8 sub getinterval cvn findfont /xsz f f length 4 sub 4 getinterval cvi def /ysz f f length 8 sub 4 getinterval cvi def [ xsz 0 0 ysz neg 0 0 ] makefont dup f cvn exch def setfont } ifelse } bind def /ul { % space drop thickness gs currentpoint currentlinewidth currentpoint n m 6 -3 roll lw 0 exch r 0 rl st lw m gr } bind def /nxtab { currentpoint pop 1000.0 mul cvi tab mod tab exch sub 1000.0 div 0 rmoveto } bind def /nx { /x exch def } bind def 0. nx %%EndProlog gsave 2.83465 -2.83465 scale 0 -279.4 translate topmat currentmatrix pop n savemat currentmatrix pop [1 0 0 1 55 53.7012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -1444 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_primalpivot) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 73.1174 78.7012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (primalupdate) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 73.1174 26.2012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_ftran) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 73.1174 68.7012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_btran) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 73.1174 58.7012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_degenout) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 73.1174 53.7012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_degenin) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 73.1174 73.7012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_pivot) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 73.1174 63.7012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_addtopivrej) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 73.1174 46.2012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (primmultiout) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 105.617 46.2012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (scanForPrimOutCands) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 154.489 46.2012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (promoteSanePivot) s savemat setmatrix n 98.117 45.141 m 103.12 45.141 l gsave 0 0 0 0.176 0 B grestore n 146.99 45 m 151.99 45 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 100.617 83.7012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (pricexk) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 73.1174 83.7012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (pseupdate) s savemat setmatrix n 93.117 82.5 m 98.117 82.5 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 73.1174 33.5601] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (primalout) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 99.3474 38.7012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (cdothyper) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 99.3474 33.7012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (pdirdothyper) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 99.3474 28.7012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_chkpiv) s savemat setmatrix n 96.847 27.5 m 91.847 32.5 l gsave 0 0 0 0.176 0 B grestore n 91.847 32.5 m 96.847 32.5 l gsave 0 0 0 0.176 0 B grestore n 91.847 32.5 m 96.847 37.5 l gsave 0 0 0 0.176 0 B grestore n 70 25 m 57.5 52.5 l gsave 0 0 0 0.176 0 B grestore n 57.5 52.5 m 70 82.5 l gsave 0 0 0 0.176 0 B grestore n 57.5 52.5 m 70 77.5 l gsave 0 0 0 0.176 0 B grestore n 57.5 52.5 m 70 72.5 l gsave 0 0 0 0.176 0 B grestore n 57.5 52.5 m 70 67.5 l gsave 0 0 0 0.176 0 B grestore n 57.5 52.5 m 70 62.5 l gsave 0 0 0 0.176 0 B grestore n 57.5 52.5 m 70 57.5 l gsave 0 0 0 0.176 0 B grestore n 57.5 52.5 m 70 52.5 l gsave 0 0 0 0.176 0 B grestore n 57.5 52.5 m 70 45 l gsave 0 0 0 0.176 0 B grestore n 57.5 52.5 m 70 32.5 l gsave 0 0 0 0.176 0 B grestore userdict /#copies 1 put grestore %%Trailer %%DocumentNeededResources: font Bookman-Light %%DocumentSuppliedResources: end d_sv_obj restore DyLP-1.6.0/DyLP/doc/Figures/primalcalls.drw0000644000076700007670000005436311171477034015306 0ustar ª» €~'€ ˆÈ sÇH6eb P%Ì™2SÒè)ƒBFŒ.r°q#‡ )XL3›0y˜¤³ðˆœ7uà´|s!•2xX ‘SgM’P)"¥0\À`á%Š0`¤™c† 2p°¸aÃE ®,b(E:6éR±KͲð£€Ç1j|ð ò ;aؤ9ãF.“"F¨€È»·/ŒQAÐ #F.)uŸH¡’䉓 L@ˆ•DI¹f;—lÌØ:lÒ‘Û"ˆÓ©Ë¬æĘ9rQyófM›0nRØ6#·M2iê´4ˆÎEˆ99fÛlää.âä“$S?éæL‡e侫€Lž/pä¤ùÍN;oè´¥ƒ“Î:r”F_”á>(’.Á$“7å¤O>%QF‘µTSy<ÕT,TuUVaÁ`• `¡¥áŠ*ªÅ–[pÉE—]xéÅ—_€ F؇)ÕÙb¤=Ùd•]–Ùf¢ÁšžÁAši¨©Æšk°II[g·å¶[o¿7\qÇ%·Üf4ÇtÏ uÖa§(pçxâ@žyè©£ñ•ñtÌGyì×ßXà .¡NþÔPE¥‡JR 2œH"T'¦XÖ¨g‘ºV[ëÉX×];öW`ƒÙhb?2ædPHF™e˜iægM.™ØhrAÛl­½¥lrÕ–%œ[úœpd‚‰œrÌ9‡æšaTwÝÙm×ÝwážéÉž{_€+‡}v¨†¡9!* "¨ HNØ“¤Vº"¦PiV§#jW‰š–©-Žõbªs­Zca8ÂÚª\´*f+BæJ$¯Gþš¤°I>Y%³<$»òlÎâ-oÒzY-Æ];f™Ú¦É­·nŠ;g¹vž{^º0®ûe<äLúñÀ_½Þ»¨¾Žöço…“bhéX¸)Â7Ô"Ã(Ú–©jE¼ÔÄ1VLãÆ<¼ª£¬3 ä­Cîj¤¯À~v&“Ä–öò”ÊÛ,–2ëFs—Ô‡s˜Ø’i&šÑM×m›î Mnw^Ò ²Ûíc ±½þU­h¾ŠÔ`M ½ÁFz¹AÑNÿZHi†fá UØמ†t¨ôßS_¹`6T28pôfçpƒó Ö~{î»Gê»× ÏÔ@œ=oŸüJÌ_ÿ< ÔO/=ôØ/ˆþöÇwß{×?<ù™:_ú§<–Ä yï‹§÷M%{³{P¿xǵ€l4U<¥tå+js‹L·¸ÈUx«[Žb…±%fo Õ®ŠÔ+$kpÃrR±×2*- fŒÓÒã¦õ¥Éé,[gJSæØô­pÁINŸ3WyD§®Ò-­rCXg¯×1j_ ¢‰µFA€ýîkÊ ØÂØ€S,ð W¶¢¶‘Uq› [h7ò¨c0 Ù I¸“á0e;ü!âx3!r‰ˆ7Ë™˜ˆ95ih{â¸è$Et.UíyOÈ@:üé>òâ¢ëðõŬI¨Œßë¢A6ºŽ9 ×ö°^òrE%TÕÜRØGºòc‚Ùßl(¸Ð4IeŠìaâ¬ÔÈ™=Òf’“dåx–Äm]’sNŒÓ&‰º<‘.”íʼR)µC­òj±ƒ½Ç¿ ¦‘–k< Gn0ÄQ—tT‹}Ì^ŒGÅLá1ƒ$CeÖÐd7tfáŒe%—E³šŽ»fä¬5IËõl‰›kâ›Ä94ÐÍœ 4êR·ºvR-Q¬Äšìĸûá.[3#øü7>|}ê+ ó¬Bøˆa#ÊzT³ºËi,í)>â 0¨ì; QǤp©\EªRžzӨ²žh¬ª:Àõ-O« «WcVæÀ©\Pm2ÏýY=-ßE„­Ü !dÛXDXP=ÔU+4¦ÞÙP¿=4pJ:ä3©8i22ˆÖ¬ÙFØQnVògà)9Y´)¢tO슠r§J˜ÂŒ¤ç_¶VqJ—$:ìëË&t,ÝÚÂ…òMd–-fQ¶YÃEÓ¢Åh´ WDmîìrJ´$ƒ¦É’v’Šç”ípÒÒ©µÎ¶°cCèð“³î–§V]ÐÞ€<˜ÈKQdrÀ¤ÞÀ©"ðS83–õüêkÏÈ[Ÿ‚ˆ°Ÿ:àp)ÐÅÞ‘t]nd:Y†ö†Ò5¤DuhÝÎb—š Í¨h»K¹ï~T¼!%/I£ØZOVîZgæåÒ÷Z-¾®„”_)|©Þn0alü`@!öaŠ)—˜#nn‰Ÿ;ÈeB´™„c1EYöb–iwˆØäè6ÁëÍñfrǬ-'ÒRº´¦jµ=r+#üJÝ2y–‚5†f‘ ‹Ð¸.B®0÷ˆÐ,ÿqË1<1!™™ÙCÓÅ>ÌnŒ· ÉlÖ˜’áE­H=ç“ζlà‡0È¡ sȳ±¦WšÊ³ÏKÞ) øä² R&n=LPE‡Ë#ñ )+i/OW³åa™h›Æq:ͤ]óE­ãÕ’ÓÔŸDõæp‡0Àa=±.rcÏÜæZ–÷ ô…9È›ÃT.6ˆ¯ÌGGÏ ÒÉŒn!#æKW4Ó0®¶#gÉO{´›>ûæ¨ËËc9‡›=t¸ƒ€Ö‡¬GÖìÆ­„u ïÀò:Dô~£¡[*}[Ùb"N¶–—mbè¢xà`ΡÁÉŒp3oÍ£õ.¨Ûœã7{Û¤®=µÒà£êã¥!jî]÷mkí ¾âzºŽ÷É]oÄâÛ—Œ56¿-óGÓœËM1ÁuÎÙƒOÓç -w~ćŸVâÝ'Ò}|Nv9ÿ¸ºß‰d>+ë%ϯü(ƒ®¯¼¸Ä>î¾aŽì»Í¼V5ïòeU\ð¶óüíÔ~–Œçî麛6Ôx7ºÞÏûÚ¥“ÛÜèùÔE2ßúú9ëjµ°~ùkÊ:ü7À .pF¸:X¯ >ƒs@|ã—-¯3­ú­Or{š¼–\¯×ùDO~˜ý.û¿Ïi›OúË•î|‹ÝþÙ¸¾Ój¶1ÄAŠÉpõJOÊ 3ä!ðp!{…7}R…V&o›BW.P6õ†6SvU–G”~–gv˜‡vGiÔm×Õs¡gm@Gc¦Çfçfö·z=†^tö§ÃR¸gh_¦uµôU h65*ÂÖa-'y/~dWãwå§yj—sˆ´~Ÿ×~¢wmAçp§Gtõ§Z(hq?Æ.ªx÷Ñj¯–nQGx0X{x_J‘{(ûÕ_¾` F`1` X&`nè>õæ@çô5†3h†'§iØ{¿×†Cuƒ¿6‡Á‡@¿F=ye?zh{ïFUÿ£{hÈ{þņtˆ6 9€É'9?¦)ޏ‡2ˆ{“x†€h‰k|2±‰cщcEˆ¡(=eó`¥‰ˆ'‰×·F«¨†ƒ˜‰°¸²(´?bEŠ´÷ˆ|ˆŠ½Xé‹…9–Kñ“ˆ©@1”j‰“w¬(–#9™e й˜îÖ‘xr5ù3p!roÜ׃Þ÷ƒŒYâ—7äp7§Ð&fÒæ‹ã~N(‚¥E‚ô—Z¤ömIwq "[ô!/(S1¨™§YK©I«Ù€Î3ÏÃr_w*ß7›#„¶I„¸y~Ïfiž‡,¾y%À‚t7œÛ–z'h^)ØzË)ôÏO{þ8kt׳š3p0 Ó‰¬ùšÝÙX„~4„“yi‡séÇvJ¨ž ÷›M螥Ÿó‡cSxœ{§‚âÖ‚ª³Ÿ"wuF  S×É)Z Êa÷ž:žй‰~È›˜¡ì¹¡%œÚö¡Ü¦zôi…çdo ë51Ábsc€¢öc;e¥?¦9˜` TÄ>ü´€5y0×S6jÿr¦œ’¦À¦‘¥¹¢MF‰.š …¶K Z£²y£*T›.Dž•Õ£ç©~c†¡L‚EúžGzw&H…K nW˜j«¶…®kZ}´3§RÉ¢¾E=Úš7l°)1b× ´)žº£E8¡º‰žºHõs‹Ú¡Šz*¢ø§œèÄœy‘©ÚÓ¥vé˜I{m%T3ÌgWIeqåO”¹¥På¥tZ†ÉVXµ<É:|ÌJ’[Õ­?ÅÒ ¦xÙ™"¹­ËZŽ©`ÎÊT³˜™ùŸäÊ™üÃ=¬¼oø¸0àO€[<-¬;tÀ]+Ã4¬²6,\ÛºM »; ÄXìÃB|ÀG,¹H|ÂK ÃHáćÅ6pÃÖÛ»áOƘÅn,Å=«ÆÍ ¸Ù“Ä/ÜÄ3\ÆÂsÆplÀ«½oìÆøÛ¼¹±1PÇ`ÌÄgAÆ5ÌÇB,´]µ0ÈXŒ¿/ÊA˶ bÇaÜÄ1€"j›ØÇ(¦,µ”\É\›Ã ‹È.ÜÉ1üÉz¢`\{Ê[Ê©üÃÊKÅŒš,œ¬Èc,Ë¡üɶŒ²¸ÌW¼Ë<<ÈØËÆ®¬ÄÄ| LËÈLÊˬËÎüÌiüÇ_üÊÕ¾³\ËÚ¼¦èÜÌÎüÈN¹ü üÈràBs0iPxàjIJ,Б+\ QqÐÐ ½Ð ÝÐýÐ*{EpÐ5€t…Ðɪ²4€ÐYQÄ ýÑ}Ðü+Ò& %œaT ]Ä%]Ñð?+=Ó.ûÒ008]Ó3ÑMWm”ÐÍÑÐ2]ÔHýÐ9kÏø¬ÏüìÏNгGÔV}ÕXMÑÕ\ÝÕ]Õ^Öa Öb­Ô!ÁÔù¼Ïý,ÿÜxSMÐ `r=×t]×v}×x×z½×v]Ð|ý׀؂-×~=؆}؃]؈mØK}ÏiýÔlÕnݲT×7`—Ù‹=ך­Ù›ÍÙ˜Ú7 Ø‹ÝÙ¡ýÙrmÚ—}פÍתک-Ú§ Ø­ Ú¦ÚÝÔj Õ"Õ” ײíÙvýÚyMÜÃÜz­ÚµÛ·×Æ]×Ï}ÜÍ]×ÝÐÜwmÝt­ÝÈ}ÙËÍÜ²ÝØ}×¹ýØkÝÖýÛÕ=ËìÚìÝÞŸýÞ³üÝ‚-ßêÞö×ôÝùßýMÛqÍßòÛgíØN}Þ’ÞaQÙAÐàÞà áþà®}~1@á.á®á Žá^Íáîá!Žá#nâ ;â â+Îâ½â/®}1nâ.žâ"Žâ,>â%^ãÎã8îá@^å}༾½àp½â5ùä5@#åPîäQ~åRîáT~å>®XŽåSþå5iåTæ[NæX>ãZ.æ;®álžå¾åcŽârÞårÞæþæfþåG¾Û‘ÝÛ“Íäj®áE>å/{è/Kã)n舞è^Ð…®åîènäŒÞè9^ãƒNá“Néyné’>é™âvÞéŠþâ—Žè}ÙèýÖ °œ2ÓœÁ´Në±ë8ÀÑ»¾ë"MÒ0ýë(Ýë¼.ëÆë]ë·~뵞ëÆNìÄ.ì$ ìÀ^ìÄîì³®ìœQÑÚ?ØníDMíÁ.îà¾ëØÞí¶Žî~ìÏîÒ>îÂ^î«Žà€®à]ÐC0ù¾ïúÞïüîïÏïû.ððOð_ðø^ððßð ðÿðñ?ñ ñ¯ñð/ñÿï¿ïóžäK~ï€xC ò,Bûò.Ïî±ÎÐØîò6ÿò+Ÿó,¿ÚEp` -×C0×»ïú¬ÿúÀÿûÂ2=ü¾¿úÈüʯú³?×´û³?Ú[­ÐºÏûF°üƯúšŸà®®üý2ÐéE%<ä_þæoTþ|@ìßþîÏxê/-þç_ÿä/þñoï¿ÿð¯þâ/ôö¯þá¿øÇÿø_þ£õž¿¨þ àþÛ~õ®û9À H+ ¤€îjÀ ÈÝ_ì€ 0:À(/ t{ö®²½¶ˆÜ |Ý-z75› ”8°æ@#PÝZàBÓ@pêÀ±×@„ ¼l'ðäU6#˜ l‚Pð FÁ)ø`¤‚S ^A+ˆýÔ‚Zp ‚A0¸Å ,hd šÁ/¸«`Ì‚[ –Á4(ß L‚oOþ·ºFú ìƒÎmÒµ?ø¡|ûn„ÐÂ÷†×! pŒµG¸á›]s„D βFè¿›}[m—’·§ÛX÷ã|,®pÂDˆ×Rá*$„­PƸPÈ ïš+¼k˜0š8ý6 k¡]»…´ÚB÷ ÿàw†|PÚ5<˜á2¤kE JÃh¨ 9^Ø0bÃj(á¾Û4œ†Ü0Â]Cm˜ ÃaÃâ…ßPšCUx×Èa9†»ð®¥Ãhx ‰a;t‡B¯1Ãîçâö_ª;týðýýCO÷àH`ûˆpŽÂñ?„= `ˆDΆ:Lâ£Sâ¯!ĉ¨êH¡y3yy°ÉUD÷7â,ŸFdSîÝu¹…èáLâH܈qN%¾Dö—øœK$t1&Š»“x@ºÜMTˆ9‘Ó½»}ÈùJâBƒˆŽ¡!E G—âƒSŠ ¶Ä…V\FœŠ Í)ÚÄ£x¯bRäŠq®ÓEAçýâŸø£yûïv:´øþòßü[‹ ÍšE¸¨Ðä¢ÿëtDÐ.‚¿³Óâ\œt Í ²?µûâû‹(¯¸!À#c´ŠÑÃ9FÇ%ábœŒ±þEF ‡3ãùÛŒLuÆÊh×.#f$uÍ4NFhþ@ãƒëŒCÀþ!Æ%®Ÿm¬¸ñ6êFܘ{ãnü¾17Gàèׂ#p4ŽÈq8úFåÈqcqÜÉ1:2ÇæHƒcE«ŽØ±6ÇÙØä`@ðŽà‘ð¾T¿£y´|–/žÇó8ÿУ¸#ë1<ºÇ_§Ë£|wíñ=²8ûxÅ£´«ñÑ?âG/·ããwô‘ÅqG"XîšýkhŽ*~E…VÑ"äB{ÒÝeE¬¨ÐÄRC&4£"õUT ²CŠH„6â$ f0òë1£B#cãŒ,*_/GÂÈ#Y£‘7Hº4™#‰$ŒœB²¨ØH!i$¿$’?2HJÉ'#›d’¤‘øîJZI*™#£ä•¼‘\˜YI)‰–䌬n=ÒI6I/I&™J˜¼.R9I'‚#œ“x’Nv·<™'1a¬“¯íOâÉ‚† ù¤žTm†rNúÉD(%&,h‰2"JA)¥ l”‚²PRJ¿6) ¥¥ä“¯ÍE¾n×øÜݨ¼u¥Ú}»dg÷Re±+zУU¾;Çw*•]~v²VÞ½Y‰ù Ÿ¬¹ÒW’J^ íD¥_¼‹“ÎþéÅï‡ÏÿKv±Ñ)Ëc¹;Ý´l‹ñï-&Ëú·,%X³4ÝòáEÉ-©%³´–õÏE>ù¶.åZ»4ï2ÖÃxø ía½¤—uí]–8{™/ù%]‹—þ’]ÊÂuH0G! @kH®í)A¸ö 1aÃt„3FLBø %Ä´oc^Lù–19f'¤Sb†LŠ92ÿàÄ4™öÍbŠL¹2ß&T—Ä0ÊL# ¦‰›™3Ófr8¿†3i¦Î”p=3þLq4÷%¾ü—,.hÂË€é.c&Í|š5s`ÂC§4ߥ‹$‘#²%â=¬É"µœLœ|Ó/k&Å­É!»¦Nv\S«•D²9!ŦP܉eó ùD¶Iá$äÛv.Òþå?½ÿø¦úó›àÏþAË¿Yÿöfá웇“pž?·H.'âtœŠÓüNÈ8`YŒœåorJÎøw5ãfTH›ŸÓszGÑéÁbÝ4OunÅ Ù6ÚC$°³uÊÍØífêd§S¡¹ÈœÆ;uc켓àáI<1šˆÇ3yšˆå™¬f@ódž0 y"Ïé9<«'ñž¾ßaOP<‹çô”žBz6Ïçù<Á'õìžÃs{þNßÉ; ¥õ¬žßó{ŠOA>—§ù<žïóz²Oß¹?ƒgþ$~ ~*Ïúé<ççý¤+è“Ë÷ç<hý„xÿ9P AïÚ³Tô ¹&A3èjÚ r­ƒfÐõ6à,èþó ´„Ú5:A+æ,¬k,”‚‚P#à"m€ ½¡84‡Ú€ÀC{¨ý¡9@‡ Ñ D‹h¢mˆQ#:D•è¢MTˆ¢Á'úC£¨¥¢UÔŠâP#:E¡¨%¢X´‡îNZI\–¥E`¤Ñ5*´¤Þ+£pÔŒªÑ9ºFݨµƒtq޲Q6!#d•£{TÚQUùGi¤¤£s´‚»Bú†éDS¤„ôŒº,G:„Þ åhŒ‘ÖQÇç"Aá\# MFýš&ëÎá lX -ÂyÒ·Ò.‚8”kD aí˃ÆáV‡ûh®TÂXÊá䞉+©ÅñR WF#œÑ¼l&΢YÃ]JL£B.¥M•ÒÒW KOkXž^–8…fJ!)•uÙT®1´¼ ¾ã‘ÞÈ€ïå`@ GLÊå´ À²<ˆ_mÄ:e…ÊÛF»~*¯6î:sªÓ¾ž%%¨ ä£uÊN¿ã;§rhÐÓ¬PXðé;->./YõS#ðOHA¨&B§¡S‚ZÑÚéB]§EÌ¡ÂÓ‹&¾æ)ËÒ§ö´ ÊOuGõ£âFç©S¯J5©4žªÔzÚR%j>%ªu¦2ŸPo* õˆ só‘E¼«jk¼kV5«â^¨U­*Uíªð«ž?Ö˜UÅ*XýŒX¬’UògVÏjù•°2®:»*Wëê·»«0`ÝáÕXGW÷ª]ý«xU¯²»¾ X «_õ«ßí°Vc—7FÃhð4²†¿w6Y#«c½¬Õ±VÖÊ*Y%kfý¬˜5Ì¿Í OIkø ­ õ±šÖ—eZS+juY¦5ÙuÖÓêZSëj­ð´¶†VÜJY;+¤Ó­Ÿõ¶¶ÖÐ 3o&>š FÍ£)0M\AS®Èµ@W¦¹4«;4šËô^RÍãJ]Sátu®/iZWrh5¡ªŸ“ª(Ï»rW7‹€zu‡©°½ÊKð]9œ|MšëÕ¾ÎÃ÷J±«„»¯ãUÆ×ýŠ_á«,°ÛÕÀ²×yX\,yeqE DØ ø«€íqvÂÎ×úú_%¬‡°6ªÇ +aC,6ô¯ŽÄ‚Øû`qœŠ5±Ëug*[aYì…u±VºÈüç ëCã±ÒÇ.4ÆÙcÏßEÖüYõ§’²H6ÈY(Ëd¥¬ù#‚@¶C YÝi^Maä|Y6¡¥Heµì”UhDÖÊ–¿% þ’욥²möDŽY“VfÅì–Mha¡ ΰIf«¬™}²\ö`¸óz ÉbåS³äïÇÚ=7›h­¶ûwö¥u;F+<ZÜ“³‘Ö¤-ZD[ií²û³åËnZPÛh-Â$´_ÖÐêÊÁG,y$…£ðÕf4)ö ãkµ½NÖ–Vÿ'kƒ¥³SwÍUæÚBkÿ¨¯ew·–ÚUHÌGlÍb¯w.Ò:IÛ~ö@kTx£ÛsM´mÛ@‚ã×ã¨àÖ†4Jnáéçöܾ:kûíh·=0ðÖ8âÔykp*G¸·´ìLÛi+ë@«LöýSÛÂn{`vã·Ýª÷ŒÛ…ËZÓ-ºå ¡VV4woãío¤·ôßâÛÝyq-‚Ç] ¿åãG+)\gkšô‘¿Ò}\»rËÈ=¹%w³žÜ‚ëCnÈMv6×"¼\#s=ëšì¸9·åZ„çØI.nå­37Ú¾;þgùøácºxÏé¾;Á¨˜¢îþ{ºû¯é^Ý¥»ÿ*šÕ}X÷ýi]°ËuÅ.Þ£º7MÜA]iÇÿ®&¬2ÀÄݹkh@ݽ»v—îÒ]»Ëwë®ú»rïí²ÓÀ x d^kzWîâÝÅ›xãnß廀·ð¾ÝÈx ¯âÕ»~íñÞÝÆ»x!/á­¼“÷óÊ!ËËy5¯!E¼—Wñš^Ê;zC/åu‘3à -¬{c/ÿ õ¶Þ²ÑZ{£VÔ’½, +¼‘ÜKGñZí½òƒÊÞÛwçíîµ ½Wø_ß;|qjñ½kÇ—ùf_ßëלïå½CLúFßßK|Óh^Û¾´wùúÞÜÖhò¿Á÷÷Žßêk¾¯>ì²ôòÃÇû¯ÿý¿¸ËàL€ pÿ­Š8+`¼€ p'ý„8Kà L]h¾À8G`ª;°žÀø_à«NKpV Y!«SXi‚M0þkÁYïÁ`Š‚a0 VÁ)øãàÇ÷kgðÿC‘;â"½ ¬ƒ[° ÞÁ5O=«G„Óß Î|ø$6CÛâ„@°ÂXØ»^á-l…Õ#æÂZø waYÈ…ÁpÒ,Ãcljá+†Ë°FÃTXº¢á«†ÑpþÂoX oØ9œ‡Íð͜à ¶Ã’Xõ(ä8\ŽÕ°=®wÃ{ˆé°!VÄîÅ&b7aq¾q†X9JÌ^ñ|ÅÄN?b ×99ñ(Îs“obU|Š "\Å.ÇbX¼ádq-¯ øÄ™â‰[\/Æs®˜ïb]ÌŠ%Ü]‘ÍBfH©"™q‰äuëYiÜ !$5¶¤Î¸¿Jmí–ñ6³àŽA*cpœÚîLjs«¥ã†iÏlW[ÇVm­vZ¯ѱåkëø£cjlÕÆqQÇüx—㬶lòUóÇïøŽòÙ¬†9…¤v´îAdHJUÃ1м¤5ðMd7Z‘726.v#—»Ž,’õåÛÈ}ôþ ÚR˜fÍiÈl¦‚Rx:“e@P§5à&®º‹üŽr (ïÒ"J/Û>•».¯˜Q¥\FgêwtʇW‚R©lÑŠÀ]ÉÉw%n"­üº^W>·rM†åtýȲwl¿gy¢m¢™º–c@M®É'ëdUXFóa]6BY(å¡l”]RV£KÙŒBe¨L•©²Ü³Ê‡9T4­=À¹l32Ç]Ž:™‘Ê (Ë—9-kæNú:óaÉžÙ3#Üp[wõ­i®Hùï4ŸfÒŒp‹kî̃ü…f×<šGsEºÍ¦95ãæÛÌš9êk~ÍŒs6…Ú nwsnŽª™7g`&œAóoþ B¯7gÔŒœ§soÆ¢²öãE*k2³}µ ò;Fê#im²ÞxÐ:A+´ ˜D!ôƒ¾Ð]Ù´Á^à+{Ù¯‡Æ¸ºwrèãû¡K4Nm¯Ç÷øv_ý¡ÛëˆîÐ :Fû¼y˜¢aô‡^Ñ×E×èØË¢A4Š~Ñ=úFÏX½£e´Œn¯õ¡Á¶%]ך,“~Ò×/÷IB(}Øš`ÛoTº“"7¥™ »ô.U{`:ré/í¥·ô3mÏj>M/]¦Á´ì ”j:²é/m¦átÏ$”dšN»ið¦ÙÆôœ®Ó[:Nçi/ )÷´˜Ôs:šé,ß”k¡œ‡ŸÐQßIH2é+>|Ôé0R_êI©í›rU™„°½jjwˆ©¿á¨&‡rHwêF½©!’Î*Aw\v×XH€ Üc­D®ÞÕI„øj]Í«µÓ ÖÀÚyÈ€€¬yõAe àW?¥pÑšµX(£‡L$Hk±À`V´&ÖÑã€Ä®o½«£‡½aÖÚ\»uÚ¿Òõ®¶ _!+Ik«à¸†Ö‚¨nàéÜj0¸ehE€RL¤…¹ÒøÈaf])þr«“à" tL$샭°ÓÀt " ½ &ö¸Ñ"pà ˜±76Òâ AÌ/À_H¶xHë\ „vÁ°DP.f/·åÅÍF,¨< %‡WÅ M3æ€ADC *\ÀT† þûW"”)-‚y#¦L‹.`€(rÑÈÇ J” ’†›2:@¼ ÓÎ 2jÔˆqF2cÞÔLYbˆœ2a輑3É6aÜ!"'Ìf–‚`ó¦Q£Hé¤yã†HR˜ ¦$M[ˆ"cÐÐQ] dÀ€Qƒ(”0gỂƒ¨®RÓ¸9sOÌ3@Й†\6pÐ Jä͘:mʸ¡ã¤L2§¥î*gŒà˜(ÎJMÁÙ3hÑt¦Ô‡MšÔ«ë´~ "6Ñdh«,"uˆÐУç(˜ÆN™d¾Ì±ó…£eðŒAµ êÌ)#‡Lš1td:…*•ªU"ïãÏØ[>ùÝ tt†b ÀQè½ †y ì!†bd”W†}¡„ç½PDƒáWá‚*ð‚F4h„Yö¡y"6Qâm„±Æ„dѱbˆ/HñDƒr¼AÇY7f8Å Î1F/)â/®GGŠ6Èâ SQdtœQUJ¾@… ÒQ•O)%ŽbÀÑ ß±q•gˆÑešbܱf›W9©e\ž™á ~&‡uJu9rµI¡Ñ剾q"ltyÆ•Yni© j)˜RGY:G§ÔY×%¢{øæ–oœª¦ª–¡ÆŠjçNÆzÇOt8꧈m4ØÆ„¶úë n4¸êŒöÚ¥x4ø#aØ%§{È1l±×¢*G¬… §˜ŽWrt9*®h¼q‡ºd`JFsø b†s¨¹µ"iK,«ê®+èQ£ÁAëh¾áV ´¡.EŠùÆŒJªT`RÇÉásÐQ‡ qQDl8ƒ &`1iàQsÈÞÅtd¼ñ?•!"APa„EDH"1¸2Æìm̲Ë0Ë,GÃmˆH_Äß<û ´Ð"‰”õÏAƒÐuJM5vŠ<É ]Í6ØòË ìJF¯f ¨ÍvÊGל´ÜLƒ€Fiœ‚/Lý…Ž£ Â×[÷gào7wmÔÍ+yó9y”‡íÞånÃ=8ç†#®8㥖auÃIÉÑrÙ3)<»Õ¶S;e³»×~;‹D%p$ãà†mrL‡ÁŠÅÇ^OgÅT 4‹†b¼‡ˆnŒ=ÂÓ/å|2-?0nãÇX|,–ßž*>óηߠ à Úãž÷¶ò†0D¨ qàß æ–®½å-}P`øÚÁ¤Á /[”„…[ °uÀŽQkyAâCjÑ!üãÝíÖ7R ì¥@ð%è(-Cà߯Ô`h*|Ã?8ŽaɆ<Ö“µ‡¾m„H1!ÇR¸B´Ð‹0ä¡|ø ÆPxÔ¢!MÐQ‡l¢ØæXÄ#FŽ `âÍžˆÆ(ÞKD/kµˆÂ$²Ð…0L€ A ÆEÚ ‡JdƒÉhÆ ‘Žsœ DÂD'®QL3Œc—Ò£À|¡*c E˜'òÌ!Bd¸ ȃ‡˜åA: èádòÊj™‡—äiÛ„xyaž'/ %`Ê †q,OjC$yƒ<’!B8üI.×1Û-¦l ˜C+9¡-ˆsŽ"©:ÉVE5Nê:Ê L3Í B¤Ì2<ÝṪ ÆSg£,¥ì赆SÒ+cûËåwùu“˜¾ 2ÿ9Ïg‚ šÄ&´ÉMP~“Eá§´˜ó*TçØèÎ4¼d£­èQ x¸ZztŸ ô§@c4‡5øqJîé{¾p®¥4•OR«ø¶î)Ñ¢êìe,ËCK[âR—Càe„ÚÐ`b¢Æä_/qˆÀR`„*ü¢ë¨As ËÀÂbU«¥gWC Ö¯vx°21ït=+IëNó¢¶Õ.G»ëͼƪ6é_ç¨R±±ó°Í#¯KáÉVzÎôž6­1?“‹’^'2 þg|/˜Áúþ€IÑ^B“é†Ë…5JÃìœÅì5J€Ñ²f¹‚N·*Ã~ƒË !…m£y¸k®h·º©©•çÇY+~~ Áù6à¹tŸÿ«èÜ2𠄆´¡ùœhFZ¤˜~ ¢å\+ÕqWQ-h-ê–º‘V5öڠȼ1’#៙? dç-òÄ Õuädy6ò(ƦÚì"×£&þ“§>ÅðÖBæ>šZÃXY hO\!ëý4DWÄ’æ'9¨‡<’RÆb¦˜Též«ˆœ4nmY l¨Ãu¸ê)ÑøGÙ*£Íp”8ü»NŸ;8p†š#X ýò Èò :ĬhÜ8È*~qp¼¬"Ùà ýËi9{ÓŠ3µ¨UÄŒæåÐibøuj»h"3*7ð]Ž2îÆ ÅÒÚ‡5(kXÞÜ áŒ}EŒ;Üû.wÕǘ»`;HßxŽ…½Éè«-i³ÛŸ>>ºP¾¯{ÜÿÅ0е“6ßy3WÂyß{ôýîz—ÃKsõç|5Ø%2,r‘@eÙEQV4ðO( ÓüdïÊãx2Y/jýPmií–Úº|q‚ˆ÷!*@nÑ1»•.~2Håvn1¡%[ql""BP'ÿG'yR\Ab€æV/ ø4n²j "/r13.à!).%IZR3)l{‚ž4W#¨‚ˆ‚o£‚,øPà/3l²€žTo7CÇ3eà¾áÍ¢=5x,BÀƒ0(‚?¸Ý41mÑ(Œ´„4ã„'x,xðK{ð[Ör,‡’TsB à\jµ8 †!¢Vw!rxj%s‡  Vl°‡,¢TË¢=}hXJõ‡Ò9ÛÂ*…hˆ"‡ß¢ŒhˆJU‡s‰«¢hX«²O˜8‰[ø‹¢…gßvóv^ñ:ôûdì3l…¡†QâP0‹g "¼¨¡1B)_pyoÑsþ1%ª!ÆXSŒ’ä\Åèue€ŒHÂËH?¾h?ÈRw€_¨1_€v_àaH(\¸³,_%ëØŽ×A†S"ô²ôÈŽ¡\É“û85òè£ëA£Qÿx"R%ñHމüXÌ#xð‹ÑtÌÈ"©t`ñá\øø?F@2Ê£3Uä?n¡!áãuú TE%éyM÷A[ÂH “BË‘¶–D;D\¦4 ?Y#HtkCy EIxÜg”‘µ^•õe=ݨI‰0#R#N`)YŽý–Ä¥•ähŽ‚‘ŽRÁ‚‘G\ñn&ÓˆŽêèmy“M‡2%•[‰yÌaŒ1‰YA‰GDAî_ò8–ÿØ—"‰ÙaÈA‰%Ç8Ö(’Q4%°ˆ§ñZp@O[ 802@28¤iš2€/9|¥yšG›90­yš„››Q›2PM¸Yµ¹©™2°›3PD±©}Qœ(›8𜦠©©6 œ°©šÙYœ·©š7 œ½©š8 œÂ)›Ôùš"›ÙI6š‰Ç‘tÙ1?"TN °Y2Ñ+KAzÆ9raðǡˉÛ”3 2€C/sÖ Ñgá‘ úÙ îÁ‚‘Òÿ{b Z  Zc!A l€!/0®á”! ›E ¢3z›Eð ŸÑú=Ú›Ep¡G3:ÂYŠ£3À I`£Ê¡õIÀ£ú@Jë™Dš¡jò±¤ :2á(ª¢rÁ¢O¥8J°ùVê£X:¦·ù]j¤cÚ›O ¦r!œOp¦mÊ Sp$=Bzr1¥UÀ¦ ZëYqú£‹ÊœUp§º¨ÑY|Z,š”º¡5›Z@¨d±¨ß©¨1Pãù¨szªçÙ©‹Ê €Q zªSúAú” ›”š€Š«ÌÙ!Payîb¨6®1¸Ê¢H¥*Ã6› b1ªÌz›y ¸Ú›“æM¸*œëc!¬ JCcCÌ:¥qP>’¡‹ñ Ú2q®éJøöf€ <ÁœgP%(;>B¯özÑ™¯.…3ëê¯íÊ¢ 3úĶó:íê¬iЮ·ÙgíÚ›½¡m êѮ‰ô:<Á ór!y<1¥#[²òG1€ëù^¶ãuÅš1§‘ 8Àœtp¤¸ì1&‹ÑÉ(U±'{c³,ÚL”‚%6 ›ðz{l@‘6{›M{ø&µ-Û›U»² »86+œ ûÃJÛ² ú2Kˆ§-;¥0ËŸêv :›û‰‰v0ë³qËœçú)ߺ£·Ñ)Mq‹°²Š£9°j¸·©ª9Л»ê¸Â#cP¨qË åV³ÊYØá#:³ùÉóEZ©zÁœd!<³’§ÑI¢zÁ¢/Z‚2ª°™ºçúAº·‰u°Pq ¡Û›´˜º>¥Â)ª¤§gkyºS:³£ù 2p]‹ 20[2‰{½Ñ)gi¡r:¡ßË¢§Aº^z½°é‹…{½·™Šú½½ùçÛ£ú½Â©MЧßË ‰3¿ß;¥\1 GÂU—Ÿz!ë{šÌ9.¥¢§4¾§É¢ž±¿Wª¾¯)0À¦›2EàÀÆ»*h€$çqšÂi>Á’èÀ J‹\¡>rÁ:C멆J³dŸ"j$4ª”LP&õbÄjêÄ CoºÂ”q›æÃSŸ+F ¹U1"É‹¤2Q÷Û¤e̸ßCSZ®ªže,¦¯ÉœaðÃd:roL,ªÌ›ŸnšÂ÷K·¹.!8ãÇK·¦‘»úw‹~œ¤xóš 3Pñį9¥¤XÉS̨$üÃ;!%#RoÒ‘›~hèhù©©2‘÷û©2Aí¢1«|›X:î‰#›)Ÿ_0yÐÝ#I£™Ë²ËÙ‘UBÝ kPb—aùÌö¨5YŸšø±úhq) “R‰[C†à\ñ‰ÙqÍô/‰ÕØE¹’‚¾ ÌJÔÍôÍvÎð8ÎÆÜ™óÌ>dëLÖøÎž¦ÏÉÃÏðÉ™óYŸóÒ-ÚØÎ;T•ÛP `•~t!ïYÎ É–m¨ÌÃÌÎ\v©7¥,¹¢“äÑrÙY/ÐÏÇlÒ`‰!BÓ Í"_ÐÍÄ=ìq\:­˜×QD‘ÑL)IA=C$ԼмlÔ-¸sôä\¦{6Lô4Îwà`*‰\ á¸1ãü–ä2Mä$™TEô$ô„—äCÅ÷>B=(vÅ’" üÖðhÌ; –,Ø0¬”„ % €Øl‘IŒ=-s d]×-ÝtxQ|x¡×NÍ×’Ts8rK–MO˜½‘wm{b×ÙX²×½%te³qXÙèd`´ý‰µM612#¹Ò_ÏeÍ"n]#”Ñ]Õ€—!XM&m("ô„Ó¦}Ð †¡RùÜðX?h Üj\ræIomÕqMÖtÍÒ¨­]yÝÚŸýÚãÙ“]K¥MÖv-ª-ßž1êýi£MÛÑßx}{¬-émW¢}²íÞµMÚ)¹O¤Û2B#ãÛÒ ÝÓ%ŒmÑU†Ü¸óbý•/zdÐ#nÑ+ïz†¬0¨FíÓk¸¡+ §(~0žØ0˜Ñfw„kRe-yýÒbñ±Q£€>%Ðò#b'^AV00Yp±!t‹Fä]WÄ`bG†Å·ä¦U4Ût‰‹¨Øö V-äÔRE&Ý_ÎÑ!bZÊó=Ë!Á˜_ÂÕñÃ.€3@6pD- u~çyÎ1 |"±ç7.€íW&f³ÓHl—3ç>^5ôè cREDD ›.0¬8t6 [ N6A>I±Ê‡þnªå—!±°t+Ä/å@Q3TžvþêoëMNsø} `ë<3(p#Ê-À‰³88ëzÝŒÕÃÎëYÞ5¼.‚ €dz³`HÂ2và#Ý,±3f|Jßs3’¾Ž®î‘µ™ŽIœîé½60êtÂNìédìȾÊÎì¯óì{íÓ~מYüòÚŽ²˜„p ÉØyPîÓÑîñQmꮕ‘n“~äêw;ë%ïµ]D Šï zï®ï¥~<¨ŽÏêoñê/ëBë‚>G Ÿë ÏëXþë/6àèAñcñÿ…ñQ±ìÍNÏñ_í#oíÙ' °íÝNT +îG¡.îÔ–î½Cóvï¾~;?ïqÑŒ@ïF0€Co¤NFŸÿ¾êÏôÿb$Qñ"²ð»ÎWñYì[/õÅ^Ÿñc_ö¿[ ¯öiÏ%ÿö¨Ës uóžEìnóîNé9O-ßó‚ï7pD9`øùŽøû¾øþŽôŽÏ]Oðœ/I“_ëRùTŸùÏäÏÛÄÃõsàõÉöïìÑnö¨öؾúýÂönïíŸ;k0û¸óxß24?[7pZ½ÎçG5 ªÿ›~ÿG$ŽÈ9å@°Ox$"A˜¸"*tÆÆ°ø.ø?þwš" NÀ0v »ÚfZàQ€ž¢c,øx‚œ€ÊÿÁ¸Lœ,€™Å&Àø)F Þ£}}Oç]:ž§éê]Ðáî&>~wôT]Àc~?¼§‡ðlõ;UOó=<'çù6 Ä }Çî둾7þNµ y`pí‰õ·Œô`Gðo È¿Ýw㟊«tð®÷iºÙbèl€‚j#Aè)¾SÇø”ßÜrͯé-ÁÔ§®ƒ‚Ö¯×a?*(ñ>߬x¢O ‚¿Ò×÷ÂÙ ƒèO…¨?nÇþ®I˜Ù&s/ ¢;6xûÔàÜ}ñð=:Øéî`puBðøñÁäg•^ Œ|Ð R¾„÷u]ÃS„YŽ– +(ã aü~n@ìqAhg Ë&<éo rB¸'䞬…wÖÏq¿;×F`¡$‚}°>>ç—ý¢_åk½0 ^¿`ñ†!÷ó~`/†?²W ¥3T}ÐPJ÷×þÐÀûã/Ï Ê¼¼÷9Ô¡Ã!Ó ÎÃG ¢HÈ€sŽ@P÷i < õÏ!VÄ6²ÿTËzˆ$±@; Gœ!°†D0#"ÿ;‰#QnaDÈE ÚÀRxó|¥s <Þ ¾‹b_Ñ›…ﶺ$Øu¡ô³|‡ÐZ½)X·è3†£o.ÃŽ× ¿ @yѰíMCY¤LT6\ƒ¶oEÜðk¾¡ïSP°0èÝ€¦8‘_T´…TÑéÂ]è³¢<†X/´UÁ{ ‘¡2ÌКÅLHò6![t xà š;Ú·é_C<"îªs((‘à®v"Kì‰2(zD™HsΫ‹Hnº¥8[ø¢,ìwq:?Áè£!Ä|¿pó C¯ø»^ċ‘FÆKx+ã@ôv‡¢‚Âkˆ÷^íë#­‘ïé>؈é|Ÿt#ÌÊ'öE¨è#;äPÆD(»bˆ †,JB}H —ã?¤ŒbP-º>_$ºx‹×qæeÇSÈ“bàûŽÍÈ6>EÜXu£ ”|VñN=D¹bçk„ð †Eú8Éßd ˆÎQ?z;z³M„V˜²3®;¹èb´‹=p)¢*ñx‹`Òs¸ð? Æ«×c…\„îqâ}Eãx ‘ã>4}e1õáGÖ· ßž8MÞEVGÎ8ÿV¤u솩Ð;.E’ÌN9 ¢fLˆ¦PEþɹýŒœ™†o_jª›Y#¯%˜Ü™²r[úÌŒYý~¤Ðì˜Br\âCLù+G¦º¬“ÓDÚ/¡æ(Œ‹³$hÍ+ `³%úÄŽˆ0AbCÔ›G„“‰F˜8ý_àD3(Ö@ÉDBØ›Îÿ•F˜gj”œ‘æªË)ãþ˜œ“'ÀÁ …"å˜Ót‘ˆø8Wçç\ v–Nx`ê<¶3râÎ×i9c§ Ä^µ°Îƒé:EgñÜðT©Ä9"èd•sÓÏøÀ’çF´žÃÓyJØ9dgöôž|Nñù7ñ_ùô}ºDõÙÊßX6ƒ&ÇÔzR>:Æi?äÛ,™j‘-&#Ð2±£Â$ S6bQ=f‰ÍÔTŸ g~I©¸ôx¦Ž›²ŒÞÊ3ºÙäÚ4—™]Ëg(ã(¸c1 Ž È;ê,¯fà»÷IÉ€G¢  ß异ÔkÒ[¨Åæ­•Štcf?4ú1&Õ”Jó2M‚H½ÜŸ&eˆœ”Šê@+ŠIö¨mF¦´ Ò®ù*¿f! £‡ô•öH‰gi#U›n’¶Í\JIKžõp v‹= ¤÷ðK=ãEÑ›‚¬Ý?Ž5@fI§ j>’ÚB“èËt‘UTf>cÚGd͙Δ•VEŒ™H)¤µ¦•Ò‘fSy.½`ºì¦MrDŠ›ùANd9µ’8P˜zCbøÔiu…‹VËD9HÍ#4u‡dÓ .R„*.w%¹™õ—ºQˆú¿][¼¨4o?øKÍ =á¡{ˆxÒS$*E‡†i~xtFŸZ“jµ¡õ´¨êT¤ÚS;Så©£qz†Ð:BƒèƘªÀü ààÐëwþ€ _ò€ è˜ú5ð `ÀªUÄV€ ¨V(@8XýúÁ„íè dX aë~?ð8-(P@Ãâðj Â0àð3ðòA6€¶Á" €À€`"xXp`À 0ð€†=àˆ`ðþÀ?€3v´V€ª¬†- @ȃ#ðüÁ=p­$‚ ªì> 4}ðÎÁ?o–ÐX` ¤*°³®5`ƒpüŽ@@Z0"A;°üÑêWÕZÀŸýÿ Å Àn@¾ÞYÝš`À?ðUv"`ðþÁ<°Ç@îÚ ZÀØç0Z€*A*hL@× Z@ðxàô×züÁ,°N@Ù®Ö ›d@œ¶`€0Á]µÜþƒA:ì%‚R«ZÑ­ºxÅjX0àÁ?xòàà€UK¦møðà€î¬ ± TW ðÁ¶Àðƒ ì“]¶º54wp ôèºˆ× ùŠb 8°«P_~€8ð¯u× h_ÝÊ€àà7ú@P_ý€ø ý®ZöëZ€³€À¿Öר*_ €ýÀèßKÀÀàÀ~ Ã8ý ]ƒðk]ëÀ^ùª[ßí0À€ Lïl¯ÀÙÎÝ ¼ZMð€ Þ‚ƒÉ«_9°¸³ àÈÖXp€Cjï´ `æÚà;68p™ X«ô-BXÊáÀÄ,0~ ËŽ€yðîÀ50QصNav[‡«%Pª@¬‚ Ø@à €€É  €Ï²pöÁ+h­W¸ÞÙ0‡ÙëÀÎwÚ²WùÊ€†%wø^Ûˆqƒ]´38 c ‹ú à€€Ú«ak°AØÄ–p0ÿ€¾†á €¨ÃÀdá0¼y Ã0@ÃÚb00®ðNîpà@Œkñ¾×àa>ë ØÀ2æÀÍ8t' 8€óÕ¯€@Ãr`¶k1Ap€¿ÞGì0Áˆ™Ø³×Gü˜Ø€€b0 aÀ`ÀœÙ +m ýø˜8ÀÎì( @ƒ~,f8°g–ˆ€$À $r?ó  ‡ÛX@¨J@‡ãDû Ê-ý%€ì7àeYðJ†·ÿ€öŽ_6 ˜¶ÓÂÞd+_ÁË8(ÇÖ;øÁÖ…xüêWEauë=¶€—'å™Û`!@’…€@ׯÅS™wåðœ, ²µ@j@PÄ +;€°h±°ø¹ ãƒàöÁ?Š˜ÁÀú"xº–`Ä‚+ð ôÈ• |Elºr¸Œð9àº03ÈàØmÐ @gîÊçÀƒ€°Å³€ð'8ó#Î`©[‚g®"&ø?€1€ö/ýMË•Ãð®øÝÊÑÙµv`púu`0Õ À#¾±G8\€¤ËŠØ»V›û°zƳ`0ß_À|10Áñ"0àp¨+TXÿl‚ãìl€@ãYÔün/€Ï¸``À)hÆ€ðŽÛy«ˆ5´Šý´Ø px1 0Á>àÆiÀ¢³AxÑ*6W° Àá%2ÏŠ^&›g«³AHŒàGßW"›Zu+‘ü¶¶Cà_ÀȲ’`Ü-|Àl¥àJ/P ô€—ýŠ@Í«_mÀ08¼ 4€~ð´tî³QzµZ€0p“[+ÄÀt]'–gî?`¾`ðéGLI­‹v¸y,pŸ @„%“À3h<ûÄ+x…@Àk,°Ô%›Ú|pÐr&Ð  {à üª6Àá>| ƒ±Ž`àåæëp-ø€àè›+_±p¸àÌ0€s¦Ê¾YÅöaû̵¦ÀØùœY?ðryíx†´±µÆ‚E Å5ˆ;àè×_` ¨ @–AP³DøŒæ» üÁ;Ø¿€üs ž@­õ×'Ö:G€‚k6øU T/ *3PUüä{Ÿ‹0'à  Ú‹ýø9†À ؈ a'òb~°`Ðt)p>77Ê*epðˆçÀ f`úÖÞkl@Á#ÆøÖ åâÌáÁ#fpÀ Œk†¡Á#>àl-äm“æÀx 9‚Lt@ HGŒ~ó0y˜àþÀ>й€³¦ À`¢d‚p`"¦ ¶à_@hçQÖ›|N–ç9( "4ôu¾ºAÐ*– 3m6@FŸç @€Ó+ÏK¹Büü7_uv@JèàUÁ¢l{þÎ@½çô Yµ#PöÆ{ˆΡº`‹ä.Ú|ŽP€n  ¹K½©€§®Ó§BU¸ Eý¨KÙâd¹B`Ç Ð€Í;síA•õ;zŸõ´nÖáëŽ>m­„?׿ë~ u}Óªuøš_ÝëþÀ:ÛúšκjìV¿vøªZý+¼…¾‹Ý¨ÖRü ³ÓU솽˜€Êþ.;]?ë”ݲƒÛâ:e/ì±°‡öÎÎÖA»í8®ßYû `»n•í–³_ö€Û!ìà³ ÌâvV»Z]-¬ ƒáÎkñì¯ ¶Œv±óƒi»j™­n}¶Ñ–<óö³^ÝEy·³±»û`<»nÛmkÝîðÕÞºÖ?›oñA)þ™6½KÙik®Âe¸€ýââYËql~o¾ôåºÜ… †{Êų>è„Ò.Þ!-}_ºM—ù>€È^oO1}Ϻ[÷…SøB~áÍ.(l;³¯Ú«‹gßnÜíï…½¹‡ßÅŒwõ.ßõ»7š¾ ^ÝìŸeì‹<ÆãYÆëx™l0¸ñþ€º£VúŽy5o<òB¾ò:÷Ò{z.’§¼°×¹Ë^ÚËdŸüªòyö÷Þmýjå¥/}W¾a€ùÚøÌ¾â•vÀÖ—ËŸõ$?~›r÷ý¾9žY“_ó+W<ý îþÊ_ƒð’íoÀ¿X(÷ßÿ€=ÿ]­8/`}0ŽÀ ¸;`œ›Ipv­8à0\Opöv¶þ¬s`à‚ap¼ õàÑâY vpHõCXÅa$ :¬—²¾ 0‚U=$Îõe¸×sà8¬b qn·^ûÉKŒsA\¯Ä\ǃg?_-q¡øàX÷@ŒŠ €'ű Ûo{ÜíU1+ÎÏÚ¶r`ZLn±p»:ÝËãfÜî‰1¯÷êþF?âgì{ãý¸×÷Ú™w€l_[7jÝ÷æÄ‚ïhY0?v­íøå¬ê>¨Ç÷ø9ÿÚŠŸ²ص†™#dݪ2ÈWõ6{Tä‹|ò£òGÉ#dž|>ÿ›[r xÎ ¾ÇWšŸhs²œÏÍ:_)e~P”9ð0ÌBŸ);å$•±sUWÄ€TO•í÷W€ê«e8Û–Á«Ö×­ö{//Ú^Ÿ˜íwc~Ì ®¿f×ú™CsPûµ×~ÇæÙŒêÿA¶¶ÔÁy8€¯œá,.XÎÍ9À¤ß|¥3u¶ÎàþìL¶swFüg`ñ›çúËdáÁ}æÃ‹_>úlŸW­Ô]ó§@ã-¡ÓkÐý²<è½jÀâwÛ·CèÖÿúM0ж+šöÛZm hôáåÂe»Gÿ~Þ¤‡ÙžÒþø0]Š»óYWþnºùgZ.Ìq÷4â?Ó¿³E}ý³?ÇÔ—ûÛ}Ô_ß=uÕž?Ó¦êUݪ_õª½êWëj^Ýê}õª=ýô+{¬Z‘µ²^µÇ@þ_9kК´F­e}ãžufmk›9€*bîÚŠU®ùÈ^ÆkóÚ! õpÖÙÅ7°›=0þq€.XÅ\lp_W© '[Êl€ñÖ#†³él¡Þ`m®•ц´ÉžÓæZAmx€ÔÆU`UÛÕ–µmm‚_¦Åym®Ø&¶-k ¨g¤mpÖÚÖ¶ÝJ AP·%Zw[ ${ƒ›nU¸y@²¹éV“ÛÐ P{@è†ÜqìÛ=À¾nºUìöÙÁWXî¦[ín½Û†G¼1eÇÛ â‘gЛôv¾Yo±€¨_uoçø– ‚\ùv¾¥oó›'ÀoÍ€"ȾÕoÅ Ðh‚ýÛùoõX!È¿pú8@ âxûW§_Mp )ampúh‚@ §_9Å›ˆg¸p'V/ˆãÉp42ÀÃÆÀ@ðµ ¢ˆÊ`•U4ƒŸÜ ß58Û…×à3  êW1À/@ðß`\ƒÁ¾~)Zè`9ˆ´ƒg¦•ÈÅy À$W>r“œpÉ?à€³ÝÐVYá‰5þƒÊ–oç„´ÝB¨aQv¡fwâ€!Aø¼U„!¥¥ |Ó­s‰VY¶Í‰sB÷Ðs&¡B—Εt±Õ;Ǿ™„ ]@÷zs À`Ð¥„3CGÐ=tÝLh$èÀE÷Ñ­s€%ÐÑ …ÞÜà Œt8!C€g1uNTNuDyLP-1.6.0/DyLP/doc/Figures/primal2flow.epsu0000644000076700007670000042131311171477034015412 0ustar %!PS-Adobe-3.0 EPSF-3.0 %%Title: /cs/mitacs1/lou/Bonsai/Doc/Dylp.New/Figures/primal2flow.epsu %%Creator: IslandDraw for lou %%CreationDate: Wed Sep 14 11:16:10 2005 %%Pages: 1 %%BoundingBox: 56 168 567 715 %%DocumentNeededResources: (atend) %%DocumentSuppliedResources: (atend) %%EndComments %%BeginPreview: 639 685 1 2055 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0001 % 000000000000000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0001 % 000000000000000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0001 % 000000000000000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000c03 % 01c000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000f83 % 0fc000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000ff3 % 7fc000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 00000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80000000000000 % 0000 % 00000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000ff3 % 7fc000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000f83 % 0fc000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000c03 % 01c000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000000000000000000000001f % e00000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000000000000000000000001f % e00000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000000000000000000000001f % c00000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000000000000000000000000f % c00000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000000000000000000000000f % c00000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000000000000000000000000f % 800000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000007 % 800000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000007 % 800000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000007 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000001fffffffffffffffffff % ffffffffffffffffffe00000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000001fffffffffffffffffff % ffffffffffffffffffe00000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000004300000004 % 000018800800000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000008100000004 % 000008800800000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000010100000000 % 000008000400000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000011f3b81b9fc % dd8789b70400000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000001000000001311101cc84 % 664848988400000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000012119008484 % 4441c8908400000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000001000000001210a008484 % 444648908400000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000001000000001230a008c84 % 4448c8908400000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000011d8400f9ce % eee77df9c400000000600000000000000000000000000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000010000000010004008000 % 000000000400000000600000000000000000000000000000000000000000000180000000000000 % 0001 % 00000000000c00000000000000000000000000000000000000000000001000000000801c7e8000 % 000000000800000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000001000000000003001c000 % 000000000000000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000000000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000000000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000010000600000000000001 % 000000000040181800600000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000200010000020001 % 000000000040080800600000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000200010000020000 % 000180000000080800600000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000001035c238f3c1c6e79cfb % 370e077f3ec78b89c0600000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c0000000000000000000000000000000000000000000000104be27d8903e3123e41 % 1891023090484ccbe0600000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010760241010202122041 % 109103439041c84a00600000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c3600000000000000000000000000000000000000000000100e0241010202122041 % 108e014c9046484a00600000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c12000000007ffffffffffffffffffffffffffff800000010472265890322123241 % 109001919048c8cb20600000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c14000000007ffffffffffffffffffffffffffff80000001079c738f1c1c73b9ce3 % b9df008ef8e76f9dc0600000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c0c0000000040000000000000000000000000000800000010000000000000000000 % 001180000000000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c080000000040000000000000000000000000000800000010000000000000000000 % 003180000000000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c080000000040000000000000000000000000000800000010000000000000000000 % 001e00000000000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c300000000040000000000000000000000000000800000010000000000000000000 % 000000000000000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000040000000000000000000000000000800000010000000000000000000 % 000000000000000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000042180001800067b9e0203e0000008800000010000000000000000000 % 000000000000000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c00000000004408000080002331a46011000010880000001fffffffffffffffffff % ffffffffffffffffffe00000000000000000000000000000000000000000000180000000000000 % 0001 % 00003fffffffffffff80004808000080002310842011000010480000001fffffffffffffffffff % ffffffffffffffffffe00000000000000000000000000000000000000000000180000000000000 % 0001 % 00007fffffffffffffc00048fbb80f8e1e21196f2e1121373c4800000000000000000038000000 % 000000700000000000000000000000000000000000000000000000000000000180000000000000 % 0001 % 0000e0000000000000c000498910189f2121a924311e6318904800000000000000000070000000 % 000000380000000000000000000000000000000000000000000000000000000180000000000000 % 0001 % 0001c0000000000000600049099010900721ad24211021109048000000000000000000e0000000 % 010000180000000000000000000000000000000000000000000000000000000180000000000000 % 0001 % 000380006e1cfdc00070004908a010901920ae24211021109048000000000000000000c0000200 % 0100000c0000000000000000000000000000000000000000000000000000000180000000000000 % 0001 % 00030000313e48800038004918a011992320c62421182310904800000000000000000180000200 % 0000018e0000000000000000000000000000000000000000000000000000000180000000000000 % 0001 % 0006000021206c80001c0048ec400ece1df0447773b81db9dc4800000000000000000381c6e79c % fb370e070000000000000000000000000000000000000000000000000000000180000000000000 % 0001 % 000e000021203500000c0048004000000000000000000000004800000000000000000703e3123e % 411891038000000000000000000000000000000000000000000000000000000180000000000000 % 0001 % 001c0000213236000006004401c7e0000000000000000000008800000000000000000e02021220 % 411091018000000000000000000000000000000000000000000000000000000180000000000000 % 0001 % 00380000739c120000070040030000000000000000000000000800000000000000000c02021220 % 41108e00c000000000000000000000000000000000000000000000000000000180000000000000 % 0001 % 003000000000000000038040000000000000000000000000000800000000000000001803221232 % 41109000e000000000000000000000000000000000000000000000000000000180000000000000 % 0001 % 00600000000000000001c040000000000000000000006000000800000000000000003801c73b9c % e3b9df007000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00e00000000000000000c040002100000002020000002000000800000000000000007000000000 % 000011803800000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 01c00000000000000000604000210000000202000000200000080000000000000000e000000000 % 000031801800000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 0380000000000000000070401e7bce6ec6e7879e07ce23cee0080000000000003600c000000000 % 00001e000c00000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 03000000031030000000384021211f3327320233021f2422c00800000000000019018000000000 % 000000000e00000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 060000000110100200001c400721102222120221021020e1000800000000000011038000000008 % 030600000700000000000000000000000000000000000000000000000000000180000000000000 % 0001 % 0e0000000100100200000c40192110222212022102102323800800000000000011070000000008 % 010200000380000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 1c078f371f31f1e79c340640232119222232022302192464c0080300000000003b8e0000000000 % 010200000180000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 380c5098b11312123e4807401db9ce7773e3839e070e73bee0081f0000000000000c0001dde7d9 % e172380000c0000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 30080390a1121072207403c00000000002000000000000000008ff0000000000001800008a120a % 119a7c0000e0000000000000000000000000000000000000000000000000000180000000000000 % 0001 % 60080c90a1121192200c01c0000000000200000000000000000ffffffffffffffff80000d07208 % 710a40000070000000000000000000000000000000000000000000000000000180000000000000 % 0001 % e00c5190a3123232324400c0000000000700000000000000000ffffffffffffffff00000519209 % 910a40000030000000000000000000000000000000000000000000000000000180000000000000 % 0001 % e0078ef9ddb9d9db9c7800c0000000000000000000000000000bff00000000000038000062320a % 311a64000070000000000000000000000000000000000000000000000000000180000000000000 % 0001 % 6000000000000000000001c000000000000000000000000000087f0000000000001c000021df1d % d9f7380000e0000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 3000000000000000000003c000008000000003000008000000080f0000000000000c0000000000 % 0000000001c0000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 380000000000000000000740000080004000010001080000000800000000000000060000000000 % 000000000180000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 1c0000000000000000000640000000004000010001000000000800000000000000070000000000 % 000000000300000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 0e00000004c0181801c00c4001b9bbbcf01ae1387bd8f370000800000000000000038000000000 % 000000000700000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 060000000440080806201c4001cc91664025f17cc509998800080000000000000001c000000000 % 000000000e00000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 03000000004008080420384000849a42403b01408109090800080000000000000000c000006000 % 000063801c00000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 0380f1dfcc478b88e020704000848a424007014081090908000800000000000000006000002000 % 20002c401800000000000000000000000000000000000000000000000000000180000000000000 % 0001 % 01c1088c24484cc9f0406040008c8c4640239164c5091908000800000000000000007000002000 % 200028403000000000000000000000000000000000000000000000000000000180000000000000 % 0001 % 00e038d0e441c8490080c04000f9c43c703ce3b879dcf39c0008000000000000000038035c270f % 79c3e0407000000000000000000000000000000000000000000000000000000180000000000000 % 0001 % 0060c853244648490081c040008000000000000000000000000800000000000000001c04be2f98 % a3e62080e000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 003118646448c8c991838040008000000000000000000000000800000000000000000c07602810 % 22042101c000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 0038ec23bee76f9ce187004001c000000000000000000000000800000000000000000600e02810 % 220421018000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 001c00000000000000060040000000000000000000000000000800000000000000000704722c98 % a32463030000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 000e000000000000000c00400000000000000000000000000008000000000000000003879c770f % 39c3b3070000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 0006000000000000001c00400000000000000001000000000008000000000000000001c0000000 % 0000000e0000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 0003000000000000003800400000000000000001000000000008000000000000000000c0000000 % 0000001c0000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 0003800000000000007000400000dc79f78dd8e3ce7c6800000800000000000000000060000000 % 000000180000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 0001c00000000000006000400000e684884665f11f209000000800000000000000000070000000 % 000000300000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 0000e0000000000000c000400000421c81c445011020e800000800000000000000000038000000 % 000000700000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00007fffffffffffffc0004000004264864445011020180000080000000000000000001fffffff % ffffffe00000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00003fffffffffffff8000400000468c88c4459119208800000800000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c00000000004000007c77c76eeee1ce70f000000800000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000040000040000000000000000000000800000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c0000000000400000400000000000000000000008000000000000000000000006c3 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c0000000000400000e0000000000000000000000800000000000000000000000243 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000cd80000000040000000000000000000000000000800000000000000000000000283 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c640000000040000000000000000000000000000800000000000000000000000183 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c440000000040000000000000000000000000000800000000000000000000000103 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c44000000007ffffffffffffffffffffffffffff800000000000000000000000103 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000cee000000007ffffffffffffffffffffffffffff800000000000000000000000603 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 00c000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 07c000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 3fc000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % fffffffffffffffffffffffffffffffffffffffe00000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % fffffffffffffffffffffffffffffffffffffffe00000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 7fc000000000000000000000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 0fc000000000000000000000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 01c000000000000000000000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000000000000000000000001f % e00000000000000000000000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000000000000000000000001f % e00000000000000000000000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000000000000000000000001f % c00000000000000000000000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000000000000000000000000f % c00000000000000000000000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000000000000000000000000f % c00000000000000000000000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000000000000000000000000f % 800000000000000000000000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000007 % 800000000000000000000000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000007 % 800000000000000000000000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000007 % 000000000000000000000000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000001fffffffffffffffffff % ffffffffffffffffffe00000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000001fffffffffffffffffff % ffffffffffffffffffe00000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000010000000460000000800 % 003001000004000000600000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000010000000820000000800 % 001001000084000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000001020000000000 % 001000000082000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c0000000000000000000000000000000000000000000000100000013e770373f9bb % 0f13737779e2000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c0000000000000000000000000000000000000000000000100000016222039908cc % 90939922cc82000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000001423201090888 % 839109348482000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000001421401090888 % 8c9109148482000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000001461401190888 % 919119188c82000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c0000000000000000000000000000000000000000000000100000013b0801f39ddd % cef9f38878e2000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000001000801000000 % 000100000002000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c0000000000000000000000000000000000000000000000100000008038fd000000 % 000100000004000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000006003800000 % 000380000000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c0000000000000000000000000000000000000000000000100001800000c0000040 % 000000001006060000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000080008040000040 % 000000001002020000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000080008040000000 % 006000000002020000600000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c0000000000000000000000000000000000000000000000100d709c3de0471e3bcd % c381dfc7f1e2e23880600000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c00000000000000000000000000000000000000000000001012f8be62804fa11146 % 24408c221213327c80600000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c0000000000000000000000000000000000000000000000101d80a0408048071a44 % 2440d0e21072124000600000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c0000000000000000000000000000000000000000000000100380a0408048190a44 % 238053221192124000600000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c00000000000000000000000000000000000000000000001011c8b262804ca30c44 % 240064621232326480600000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c0000000000000000000000000000000000000000000000101e71dc3ce0e71d84ee % 77c023b739dbe73880600000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 046000000000000080600000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 0c6000000000000000600000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 078000000000000000600000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000008000006 % 000008000000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000008000202 % 000008000000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000000000202 % 000000000000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000dd9dde782 % e3c3586a0000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000e688b3203 % 342488920000000000600000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000010000000000428d21202 % 10e748e80000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000428521202 % 1320c8180000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000468623202 % 3464488a0000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c0000000000000000000000000000000000000000000000100000000007dc21e383 % e3b79cf20000000000600000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000010000000000400000000 % 000000020000000000600000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000010000000000400000000 % 000000000000000000600000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000010000000000e00000000 % 000000000000000000600000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000c00000000002 % 00c0c000003e3e3f80600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000400800000002 % 004040000011421180600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000400800000000 % 004040000011411040600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010084dc7cf1ee03bf8fe % 3c5c470d0011701200600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000001018ce6c5089f0118442 % 42664f92001e1e1e00600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c0000000000000000000000000000000000000000000000100844284389001a1c42 % 0e42481d0010011200600000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c0000000000000000000000000000000000000000000000100844284c89000a6442 % 324248030010411040600000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c00000000000000000000000000000000000000000000001008c468d189900c8c42 % 46464c912018621080600000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c0000000000000000000000000000000000000000000000100767c76ecee00476e7 % 3b7ce71e20387c3f80600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000400000000000000 % 000000002000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000400000000000000 % 000000000000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000e00000000000000 % 000000000000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000000000030 % 000001800000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000000000010 % 000000800000080000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000000000010 % 000000800000080000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c0000000000000000000000000000000000000000000000101b8f3edd86803ee1f1 % 09e38f80f3c35e3500600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c0000000000000000000000000000000000000000000000100c599066490011f313 % 1b17d8818e64884900600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010085090444e80110211 % 0a0410810427487400600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010085090444180110211 % 0a0410810420c80c00600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010085190444890119231 % 1b1651818c64484500600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c0000000000000000000000000000000000000000000000101cef38eeef1038e1d8 % ede38ec0f3c78e7900600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000010000000 % 000000000000000100600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000c00000000000 % 000000000080000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000400020000000 % 800000800080000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000400020000000 % 80000080000000c000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c0000000000000000000000000000000000000000000000100006b8471e786e1cef % e07371ee3f9b870000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000001000097c4fb120313e2c % 80f9889f108c488000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000ec0482020212010 % 808108901088488000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c0000000000000000000000000000000000000000000000100001c0482020212038 % 808108901088470000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c0000000000000000000000000000000000000000000000100008e44cb12021324c % 80c908991088480000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000f38e71e38739cee % e0739cee39dcef8000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 00000000000008c000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 00000000000018c000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 0000000000000f0000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000000000010 % 060c00000000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000000000010 % 020400000000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 020400000000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000003bbcfb3 % c2e470000000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000001142414 % 2334f8000000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000001a0e410 % e21480000000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000000a32413 % 221480000000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000000c46414 % 6234c8000000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000001000000000000043be3b % b3ee70000000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000001fffffffffffffffffff % ffffffffffffffffffe00000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000001fffffffffffffffffff % ffffffffffffffffffe00000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000000000000000000000001f % e00000000000000000000000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000000000000000000000001f % e00000000000000000000000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c00000000000000000000000000000000000000000000000000000000000000001f % c00000000000000000000000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c00000000000000000000000000000000000000000000000000000000000000000f % c00000000000000000000000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c00000000000000000000000000000000000000000000000000000000000000000f % c00000000000000000000000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c00000000000000000000000000000000000000000000000000000000000000000f % 800000000000000000000000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000000000000000000000007 % 800000000000000000000000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000000000000000000000007 % 800000000000000000000000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000000000000000000000007 % 000000000000000000000000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000003fffffffffffffffffffff % fffffffffffffffffffff000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000003fffffffffffffffffffff % fffffffffffffffffffff000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000003000000000000000000000 % 000000000000000000003000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000003000000000000860000300 % 000000004000000000003000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000003000000000001020000100 % 000000004000000000003000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000003000000000002020000100 % 000000002000000000003000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c0000000000000000000000000000000000000000000030000000000023e7701f21 % 1cdc6e3c2000000000003000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000003000000000002622203163 % 3e6231422000000000003000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000003000000000002423202121 % 2042210e2000000000003000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000003000000000002421402121 % 204221322000000000003000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000003000000000002461402323 % 324221462000000000003000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c0000000000000000000000000000000000000000000030000000000023b0801d9d % 9ce773bb2000000000003000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000003000000000002000800000 % 000000002000000000003000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c0000000000000000000000000000000000000000000030000000000010039f8000 % 000000004000000000003000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000003000000000000006000000 % 000000000000000000003000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000003000000000000000000000 % 000000000000000000003000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000003000000000000000000000 % 000000000000000000003000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000003000000000000000000000 % 000000000000000000003000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000003000000000000000800000 % 000080000000000000003000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000003000000000008008800000 % 000080080000000000003000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000003000000000008008000000 % 000000080000000000003000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000003377ce777371ef1f9ddc0d % d8799b9e7370f371e3803000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000339a1f22f988908888be06 % 64848c48f989098b17c03000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000310a1034810883888d2004 % 441c88488108390a04003000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c00000000000000000000000000000000000000000000310a101481088c88852004 % 446488488108c90a04003000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c00000000000000000000000000000000000000000000311a1918c9089188863204 % 448c8848c909190b16483000000000000000000200000000000000000000000180000000000000 % 0001 % 00000000000c0000000000000000000000000000000000000000000031f70e08739ceecfc21c0e % ee77dcee739cef9de3883000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000003100000000000000000000 % 000000000000000000083000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000003100000000000000000000 % 000000000000000000003000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000003380000000000000000000 % 000000000000000000003000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000003000000000000000000000 % 000000000000000000003000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000003000000000000000000000 % 000000000000000000003000000000000000000236000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000003000000000000000000000 % 000000000000000000003000000000000000000212000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000003000000000000000000000 % 000000000000000000003000000000000000000214000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000003000000000000000000000 % 00000000000000000000300000000000000000020c000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000003000000000071ff9e7c3e7 % 1e3cefc7fb80000000003000000000000000000208000000000000000000000180000000000000 % 0000 % 00000000000c0000000000000000000000000000000000000000000030000000000f884332010f % b16647e21100000000003000000000000000000208000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000003000000000080842120108 % 20426a021900000000003000000000000000000230000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000003000000000080842120108 % 20422a020a00000000003000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c0000000000000000000000000000000000000000000030000000000c884232010c % b14633220a00000000003000000000000000000200000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000003000000000071ce1e70387 % 1e3c11c70400000000003000000000001fffffffffffffc0000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000003000000000000000000000 % 0000000004000000000030000000000030000000000000e0000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000003000000000000000000000 % 000000001c00000000003000000000007000000000000070000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000003000000000000000000000 % 00000000300000000000300000000000e000000002000038000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000003fffffffffffffffffffff % fffffffffffffffffffff00000000001c000040002000018000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000003fffffffffffffffffffff % fffffffffffffffffffff00000000001800004000000030c000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000006000000000 % 0000000038000000000000000000000301cdcf38fe6e1c0e000000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000000000000000c000000000 % 000000001c000000000000000000000703e6247c42312207000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000018000000000 % 000000000e000000000000000000000e0204244042212203800000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000030000000000 % 0000000007000000000000000000001c0204244042211c01800000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000060000000001 % 000000000380000000000000000000180324246442212000c00000000000000180000000000000 % 0000 % 00000000000c0000000000000000000000000000000000000000000000000000000c0000000021 % 0000000001c00000000000000000003001ce7738e773be00e00000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000180000000020 % 0000000000e0000000000000000000700000000000002300700000000000000180000000000000 % 0000 % 00000000000c0000000000000000000000000000000000000000000000000000003000079e6e7b % 37108e000070000000000000000000e00000000000006300380000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000000000000060000c733121 % 18b19f000038000000000000000001c00000000000003c00180000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000c00008212121 % 10909000001c0000000000000000018000000000000000000c0000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000001800008212121 % 10909000000e0000000000000000030000000000000000000e0000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000000000000300000c632121 % 109199000007000000000000000007000000001006060000070000000000000180000000000000 % 0000 % 00000000000c0000000000000000000000000000000000000000000000000000060000079e73bb % b9cece00000380000000000000000e000000001002020000038000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000000000000c000000000000 % 000000000001c0000000000001c01c000000000002020000018000000000070180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000018000000000000 % 000000000000e0000000000001f8180001dfcfb1e2e2700000c00000000007e180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000030000000000000 % 00000000000070000000000001ff3000008c24121332f80000e00000000007fd80000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000060000000000000 % 0000000000003ffffffffffffffff00000d0e41072128000007fffffffffffff80000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000070000000000000 % 0000000000003ffffffffffffffff0000053241192128000007fffffffffffff80000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000038000000080000 % 20000700000070000000000001fe3800006464123232c80000e00000000007f980000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000000000001c000000080004 % 200018800000e0000000000001f01c000023be39dbe7700001c00000000007c180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000000000000e000000000004 % 000030800001c0000000000001800c000000000000000000038000000000060180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000000000000700001b9bbbcf % 6dc1c08000038360000000000000060000000000000000000306c0000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000000000000380001cc91664 % 262221000007012000000000000007000000000000000000060320000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000001c0000849a424 % 24222200000e0140000000000000038000000000000000000e0220000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000e0000848a424 % 2421c200001c00c000000000000001c00000c0000000c3801c0220000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000700008c8c464 % 242206000038008000000000000000c00000400020004c40380770000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000000000000038000f9c43c7 % 7e73e6000070008000000000000000600000400020004840300000000000000180000000000000 % 0001 % 00000000000c0000000000000000000000000000000000000000000000000000001c0008000000 % 0002300000e003000000000000000070069c471e79c7c040600000000000000180000000000000 % 0001 % 00000000000c0000000000000000000000000000000000000000000000000000000e0008000000 % 0006300001c000000000000000000038093e4fb123ec4080e00000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000000000000007001c000000 % 0003c00003800000000000000000001c0ea0482022084101c00000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000038000000000 % 0000000007000000000000000000000c01a0482022084103800000000000000180000000000000 % 0001 % 00000000000c00000000000000000000000000000000000000000000000000000001c000000000 % 000000000e000000000000000000000608b24cb12328c303000000000000000180000000000000 % 0001 % 00000000000c00000000000000000000000000000000000000000000000000000000e000000000 % 000000001c00000000000000000000070f1ce71e39c76306000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000007000000000 % 00000000380000000000000000000003800000000000000e000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000003fffffffff % fffffffff00000000000000000000001c00000000000001c000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000007000000000 % 00000000380000000000000000000000c000000000000038000000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000000000000000e000000000 % 000000001c00000000000000000000006000000000000030000000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000000000000001c000000000 % 000000000e00000000000000000000007000000000000060000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000038000000000 % 000000000700000000000000000000003fffffffffffffe0000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000070000000000 % 000000000380000000000000000000001fffffffffffffc0000000000000000180000000000000 % 0000 % 00000000000c0000000000000000000000000000000000000000000000000000000e0000000000 % 0000000001c0000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c0000000000000000000000000000000000000000000000000000001c0000000000 % 0000000000e0000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000380000000000 % 000000000070000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000700000000000 % 000001818038000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000e00000000000 % 00000080801c000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000001c00000000000 % 00000080800e000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000003884dcf9c78f3 % bf1f78b88e07000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000000000000718c6243ec599 % 1f8884cc9f03800000000000000000000000000000000000000000000000000180000000000000 % 0001 % 00000000000c00000000000000000000000000000000000000000000000000000e084424208109 % a8081c849001c00000000000000000000000000000000000000000000000000180000000000000 % 0001 % 00000000000c00000000000000000000000000000000000000000000000000001c084424208108 % a80864849000e00000000000000000000000000000000000000000000000000180000000000000 % 0001 % 00000000000c00000000000000000000000000000000000000000000000000003808c42432c518 % cc888c8c9900700000000000000000000000000000000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000000000070076e7e1c78f0 % 471c76f9ce003ffffffffffffffffff00000000000000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000000000060000000000000 % 0000000000003ffffffffffffffffff00000000000000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000000000030000000000000 % 000000000000700000000000000000300000000000000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000000000018000000000000 % 000000000000e00000000000000000300000000000000000000000000000000180000000000000 % 0001 % 00000000000c00000000000000000000000000000000000000000000000000000c000000000000 % 000000000001c00000000000000000300000000000000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000000000006000000000000 % 00000000000386c000000000000000300000000000000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000000000003000000000000 % 000e00000007024000000000000000300000000000000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000000000001800000000000 % 00310000000e028000000000000000300000000000000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000000000000c00000000000 % 00210000001c018000000000000000300000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000600000071ff9 % e7c100000038010000000000000000300000000000000000000000000000000180000000000000 % 0000 % 00000000000c0000000000000000000000000000000000000000000000000000003000000f8843 % 320200000070010000000000000000300000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000180000080842 % 1204000000e0060000000000000000300000000000000000000000000000000180000000000000 % 0000 % 00000000000c0000000000000000000000000000000000000000000000000000000c0000080842 % 1204000001c0000000000000000000300000000000000000000000000000000180000000000000 % 0000 % 00000000000c0000000000000000000000000000000000000000000000000000000600000c8842 % 320c00000380000000000000000000300000000000000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000000000000030000071ce1 % e70c00000700000000000000000000300000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000018000000000 % 000000000e00000000000000000000300000000000000000000000000000000180000000000000 % 0000 % 00000000000c00000000000000000000000000000000000000000000000000000000c000000000 % 000000001c00000000000000000000300000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000006000000000 % 000000003800000000000000000001fe0000000000000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000000000000003fffffffff % fffffffff000000000000000000001fe0000000000000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000000000000001fffffffff % ffffffffe000000000000000000001fc0000000000000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000fc0000000000000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000fc0000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000f80000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 1b0000000000000000000000000000780000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 0c8000000000000000000000000000780000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 088000000000000000000000000000700000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 088000000000000000000000000000300000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 1dc000000000000000000000000000300000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0001 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000f03 % 000000000000000000000000000008000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000fe3 % 000000000000000000000000000008000000000000000000000000000000000180000000000000 % 0000 % 00000000000c000000000000000000000000000000000000000000000000000000000000000fff % 00000000000000000000000001f71e42fb70000000000000000000000000000180000000000000 % 0000 % 00000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % 000000000000000000000000008f88c64188000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000fff % 000000000000000000000000008808424108000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000fe3 % 000000000000000000000000008808424108000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000f03 % 000000000000000000000000008c88464108000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000803 % 00000000000000000000000001c70e3be39c000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000000000000000000000000000000000000000000000000000000000000000000001f % e00000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000000000000000000000000000000000000000000000000000000000000000000001f % e00000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000000000000000000000000000000000000000000000000000000000000000000001f % e00000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000f % c00000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000f % c00000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000f % c00000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000007 % 800000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000007 % 800000000000000000000000000e3ff3cf80000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000007 % 000000000000000000000000001f10866400000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000001010842400000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000001010842400000000000000000000000000000180000000000000 % 0000 % 00000000000000000000000000000000000000000000000000000000001fffffffffffffffffff % ffffffffffffffffffe00000001910846400000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000e39c3ce00000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000010000000040000000002 % 00000c400080000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000010000000080000000042 % 000004480080000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000010000000100000000040 % 000004080040000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 0000000000000000000000000000000000000000000000000000000000100000001373ee1e6ef6 % 6ec3c4deee40000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000000000000000000000000000000000000000000000000001000000013991f337342 % 332424484440000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000010000000110910212142 % 2220e4486440000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000010000000110910212142 % 222324482840000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000010000000111919232342 % 222464482840000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000000000000000000000000000000000000000000000000001000000011f38e1e3e77 % 7773beee1040000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000010000000110000002000 % 000000001040000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000010000000090000002000 % 000000007080000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000010000000038000007000 % 00000000c000000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 0000000000000000000000000000000000000000000000000000000000100001c00000000c0000 % 100000080000c00000600000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000010000200008000040000 % 100000180000400000600000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000010000200008000040000 % 000000080000560000600000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000000000000000000000000000000000000000000000000001000073c3de79f05c786 % b0d0078b8e3c480000600000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000010000242628cc8066849 % 11200c4c5f62500000600000000000000000000000000000000000000000000180000000000000 % 0001 % 00000000000000000000000000000000000000000000000000000000001000020e4088480421ce % 91d008085040780000600000000000000000000000000000000000000000000180000000000000 % 0001 % 000000000000000000000000000000000000000000000000000000000010000232408848042641 % 903008085040480000600000000000000000000000000000000000000000000180000000000000 % 0000 % 0000000000000000000000000000000000000000000000000000000000100002466288c80468c8 % 91140c4859624c0000600000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000000000000000000000000000000000000000000000000001000073b3ce79c07c76f % 39e4079cee3cee0000600000000000000000000000000000000000000000000180000000000000 % 0001 % 000000000000000000000000000000000000000000000000000000000010000000000000000000 % 000400000000000000600000000000000000000000000000000000000000000180000000000000 % 0001 % 000000000000000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000010000000000000000000 % c00000001e00000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000010000000000000000001 % 200000002200000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000010000000000000000001 % 200000002000000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000010000f1e7885f3c79dc0 % ce0f1e6e767f760000600000000000000000000000000000000000000000000180000000000000 % 0000 % 0000000000000000000000000000000000000000000000000000000000100010b1c58c842c4881 % 4418b3312221990000600000000000000000000000000000000000000000000180000000000000 % 0000 % 0000000000000000000000000000000000000000000000000000000000100003a0808480e80c82 % 241021212221110000600000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000010000ca0808483280502 % 181021212221110000600000000000000000000000000000000000000000000180000000000000 % 0000 % 0000000000000000000000000000000000000000000000000000000000100011b1c48c846c4503 % 1c18a3212221110000600000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000010000ede7877c3b78201 % e60f1e73f773bb8000600000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000010000000000000000200 % 000000000000000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000010000000000000000e00 % 000000000000000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000010000000000000001800 % 000000000000000000600000000000000000000000000000000000000000000180000000000000 % 0001 % 000000000000000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000000000000000000000000000180000000000000 % 0001 % 000000000000000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000000000000000000000000000180000000000000 % 0001 % 000000000000000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000000000000000000000000000180000000000000 % 0001 % 000000000000000000000000000000000000000000000000000000000010000003800004c04c80 % 000000000000000000600000000000000000000000000000000000000000000180000000000000 % 0001 % 000000000000000000000000000000000000000000000000000000000010000004000004404488 % 000020020000000000600000000000000000000000000000000000000000000180000000000000 % 0001 % 000000000000000000000000000000000000000000000000000000000010000004000000400408 % 000020020000000000600000000000000000000000000000000000000000000180000000000000 % 0001 % 00000000000000000000000000000000000000000000000000000000001000000e70f0dc5cc59e % ee06f9e7908d000000600000000000000000000000000000000000000000000180000000000000 % 0001 % 000000000000000000000000000000000000000000000000000000000010000004f90924664488 % 440922123192000000600000000000000000000000000000000000000000000180000000000000 % 0001 % 0000000000000000000000000000000000000000000000000000000000100000048039d4424488 % 640ea072109d000000600000000000000000000000000000000000000000000180000000000000 % 0001 % 00000000000000000000000000000000000000000000000000000000001000000480c834424488 % 2801a1921083000000600000000000000000000000000000000000000000000180000000000000 % 0001 % 000000000000000000000000000000000000000000000000000000000010000004c91914464488 % 2808a2321191000000600000000000000000000000000000000000000000000180000000000000 % 0001 % 00000000000000000000000000000000000000000000000000000000001000000e70edee7cefce % 100f39db8ede000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000010000000000000000000 % 100000000000000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000010000000000000000000 % 700000000000000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000010000000000000000000 % c00000000000000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000010000000000000000000 % 000000000000000000600000000000000200000000000000000000000000000180000000000000 % 0001 % 00000000000000000000000000000000000000000000000000000000001fffffffffffffffffff % ffffffffffffffffffe00000000000000200000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000038000000 % 0000007000000000000000000000007dc7a13fb800000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000070000000 % 00000038000000000000000000000023e26310c400000000000000000000000180000000000000 % 0000 % 0000000000000000000000000000000000000000000000000000000000000000000000e0000000 % 0000001c0000000000000000000000220221108400000000000000000000000180000000000000 % 0001 % 0000000000000000000000000000000000000000000000000000000000000000000001c0000000 % 0000000e0000000000000000000000220221108400000000000000000000000180000000000000 % 0001 % 000000000000000000000000000000000000000000000000000000000000000000000380000000 % 000000070000000000000000000000232223108400000000000000000000000180000000000000 % 0001 % 000000000000000000000000000000000000000000000000000000000000000000000700000040 % 00018003800000000000000000000071c39db9ce00000000000000000000000180000000000000 % 0001 % 000000000000000000000000000000000000000000000000000000000000000000000e00000040 % 00008001c000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000001c00000000 % 00008000e000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 0000000000000000000000000000000000000000000000000000000000000000000038001bbecd % d8f080007000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 0000000000000000000000000000000000000000000000000000000000000000000070001cd046 % 650880003800000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000000000000000000000000000000000000000000000000000000000000e000085044 % 443880001c00000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000000000000000000000000000000000000000000000000000000000001c000085044 % 44c880000e00000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000000000000000000000000000000000000000000000000000000000003800008d044 % 451880000700000000000000001800000000080000600000000000000000000180000000000000 % 0000 % 0000000000000000000000000000000000000000000000000000000000000000000700000fb8ee % eeedc0000380000000000700000800020000080000200000000000000000000180000000000000 % 0001 % 0000000000000000000000000000000000000000000000000000000000000000000e0000080000 % 0000000001c00000000007e0000800020000000000200000000000000000000180000000000000 % 0001 % 0000000000000000000000000000000000000000000000000000000000000000001c0000080000 % 0000000000e00000000007fc0008f0d786e7db761e200000000000000000000180000000000000 % 0001 % 000000000000000000000000000000000000000000000000000ffffffffffffffff800001c0000 % 00000000007fffffffffffff800999220732099921200000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000ffffffffffffffff00000000000 % 00000000007fffffffffffff800909d20212091107200000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000800000000000000180000000000 % 0000000000e00000000007fc000908320212091119200000000000000000000180000000000000 % 0000 % 0000000000000000000000000000000000000000000000000008000000000000000c0003800004 % c0c00e0001c00000000007e0000919120232091123200000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000800000000000000060004000004 % 404031000380000000000700001cf1e383e71fbb9df00000000000000000000180000000000000 % 0000 % 00000000000000000000000000000000000000000000000000080000000000001b030004000000 % 404021000706c00000000000000000000200000000000000000000000000000180000000000000 % 0000 % 00000000000000000000000000000000000000000000000000080000000000000901800e70f0dc % 5c4701000e03200000000000000000000200000000000000000000000000000180000000000000 % 0000 % 00000000000000000000000000000000000000000000000000080000000000000a00c004f90924 % 664f82001c02200000000000000000000700000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000007f800000000000060060048039d4 % 424804003802200000000000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000007f0000000000000400300480c834 % 424804007007700000000000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000007f00000000000004001804c91914 % 464c8c00e0000000000000000000700000980b1000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000007f00000000000018000c0e70edee % 7ce70c01c000000000000000000080000088091100000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000003e00000000000000000600000000 % 000000038000000000000000000080000008010100000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000003e00000000000000000300000000 % 0000000700000000000000000001ce3c1b8b9933ddc00000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000003e00000000000000000180000000 % 0000000e000000000000000000009f42248cc91108800000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000001c000000000000000000c0000000 % 0000001c00000000000000000000900e3a8849110c800000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000001c00000000000000000060000000 % 000000380000000000000000000090320688491105000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000001c00000000000000000030000000 % 000000700000000000000000000099462288c91105000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000007fffffffffffff0000000000001fffffff % ffffffe000000000000000000001ce3b3dcf9fb9c2000000000000000000000180000000000000 % 0000 % 00000000000000000000000000000000000000000000ffffffffffffff8000000000000fffffff % ffffffc00000000000000000000000000000000002000000000000000000000180000000000000 % 0000 % 00000000000000000000000000000000000000000001c0000000000001c0000000000000000000 % 00000000000000000000000000000000000000000e000000000000000000000180000000000000 % 0000 % 0000000000000000000000000000000000000000000380000000000000e0000000000000000000 % 000000000000000000000000000000000000000018000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000070000000000000070000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 0000000000000000000000000000000000000000000e0000000000000038000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 0000000000000000000000000000000000000000001c000030000300001c000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000000000000000000000000000000000038000010000100000e000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000700000100001000007000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000e00001f108f1000003800000000000000000 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000001c00003131909000001c00000000000000000 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000003800002110839000000e00000000000000000 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 0000000000000000000000000000000000000000070000021108c9000000700000000000000000 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000000000000000000000000000000000e000002311919000000380000000000000000 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000000000000000000000000000000001c000001d8ecef8000001c0000000000000000 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 0000000000000000000000000000000000000000380000000000000000000e0000000000000000 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000070000000000000000000070000000000000000 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 0000000000000000000000000000000000000000e0000000000000000000038000000000000000 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 0000000000000000000000000000000fffffffffc000000000000000000001ffffffffffffffff % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 0000000000000000000000000000000c00000000e0000000000000000000038000000000000003 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 0000000000000000000000000000000c0000000070000e00001306003800070000000000000003 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 0000000000000000000000000000000c000000003800100000110200c4000e0000000000000003 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 0000000000000000000000000000000c000000d81c0010000001020084001c0000000000000003 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 0000000000000000000000000000000c000000480e0039c786b172380400381b00000000000003 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 0000000000000000000000000000000c00000050070013e849119a7c0800700c80000000000003 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 0000000000000000000000000000007f8000003003801201ce910a401000e0088000000000001f % e00000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 0000000000000000000000000000007f8000002001c0120641910a401001c0088000000000001f % e00000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 0000000000000000000000000000007f0000002000e01328c8911a643003801dc000000000001f % c00000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 0000000000000000000000000000003f000000c0007039c76f39f738300700000000000000000f % c00000000000000000000000000000000000000000000000000000000000000180000000000000 % 0001 % 0000000000000000000000000000003f000000000038000000000000000e00000000000000000f % c00000000000000000000000000000000000000000000000000000000000000180000000000000 % 0001 % 0000000000000000000000000000003e00000000001c000000000000001c00000000000000000f % 800000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 0000000000000000000000000000001e00000000000e0000000000000038000000000000000007 % 800000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 0000000000000000000000000000001e0000000000070000000000000070000000000000000007 % 800000000000000000000000000000000000000000000000000000000000000180000000000000 % 0001 % 0000000000000000000000000000001c00000000000380000000000000e0000000000000000007 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0001 % 0000000000000000000000000000000c000000000001c0000000000001c0000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 0000000000000000000000000000000c000000000000ffffffffffffff800000000001ffffffff % fffffffe0000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000080000000000007fffffffffffff000000000003ffffffff % ffffffff0000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000700000000 % 000000038000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000e00000000 % 00000001c000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000001c00000000 % 00000000e000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000003800000000 % 000000007000000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 0000000000000000000000000000000000000000000000000000000000000000000070000c0000 % 0000c0033800000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000000000000000000000000000000000000000000000000000000000000e000040000 % 000040011c00000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000000000000000000000000000000000000000000000000000000000001c000040000 % 000040010e00000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000000000000000000000000000000000000000000000000000000000003884dc5c788 % 5b87ce1f0700000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 0000000000000000000000000000020000000000000000000000000000000000000718c6266cd8 % cc4c5f310380000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 0000000000000000000000000000020000000000000000000000000000000000000e0844242848 % 4848502101c0000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000007dc790bedc0000000000000000000000000000001c0844242848 % 4848502100e0000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 0000000000000000000000000023e23190620000000000000000000000000000003808c42468c8 % c848d9230070000000000000000000000000000000000000000000000000000180000000000000 % 0000 % 00000000000000000000000000220210904200000000000000000000000000000070076e77c787 % 7ce76e1d8038000000000000000000000000000000000000000000000000000180000000000000 % 0001 % 000000000000000000000000002202109042000000000000000000000000000000e00000000000 % 00000000001c000000000000000000000000000000000000000000000000000180000000000000 % 0001 % 000000000000000000000000002322119042000000000000000000000000000001c00000000000 % 00000000000e000000000000000000000000000000000000000000000000000180000000000000 % 0001 % 0000000000000000000000000071c38ef8e7000000000000000000000000000003800000000000 % 000000000007000000000000000000000000000000000000000000000000000180000000000000 % 0001 % 0000000000000000000000000000000000000000000000000000000003ffffffff000000000000 % 000000000003ffffffffffffffc000000000000000000000000000000000000180000000000000 % 0001 % 0000000000000000000000000000000000000000000000000000000003ffffffff000000000000 % 000000000003ffffffffffffffc000000000000000000000000000000000000180000000000000 % 0001 % 000000000000000000000000000000000000000000000000000000000300000003800000000000 % 00000000000700000000000000c000000000000000000000000000000000000180000000000000 % 0001 % 000000000000000000000000000000000000000000000000000000000300000001c00000000000 % 000030e0000e00000000000000c000000000000000000000000000000000000180000000000000 % 0001 % 000000000000000000000000000000000000000000000000000000000300000000e00000000000 % 08001310001c00000000000000c000000000000000000000000000000000000180000000000000 % 0001 % 000000000000000000000000000000000000000000000000000000000300000360700000000000 % 08001210003836000000000000c000000000000000000000000000000000000180000000000000 % 0001 % 000000000000000000000000000000200000c00000000000000000000300000120380071df71c7 % 9ee1f010007019000000000000c000000000000000000000000000000000000180000000000000 % 0001 % 0000000000000000000000000000042000004000000000000000000003000001401c00f85b9bec % 49f3102000e011000000000007f800000000000000000000000000000000000180000000000000 % 0001 % 0000000000000000000000000000040000004000000000000000000003000000c00e0080210a08 % 0902104001c011000000000007f800000000000000000000000000000000000180000000000000 % 0000 % 00000000000000000000000003cdcf66ec78400000000000000000000300000080070080710a08 % 0902104003803b800000000007f800000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000066e642332844000000000000000000003000000800380c8991b2c % 499230c0070000000000000003f800000000000000000000000000000000000180000000000000 % 0000 % 00000000000000000000000004242422221c40000000000000000000030000030001c071ddf1c7 % 8ee1d8c00e0000000000000003f000000000000000000000000000000000000180000000000000 % 0000 % 00000000000000000000000004242422226440000000000000000000030000000000e000010000 % 000000001c0000000000000003f000000000000000000000000000000000000180000000000000 % 0000 % 00000000000000000000000004646422228c400000000000000000000300000000007000010000 % 00000000380000000000000001f000000000000000000000000000000000000180000000000000 % 0001 % 00000000000000000000000003c7c7777776e00000000000000000000300000000003800038000 % 00000000700000000000000001e000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000400000000000000000000000000000300000000001c00000000 % 00000000e00000000000000001e000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000400000000000000000000000000001fe0000000000e00000000 % 00000001c00000000000000000e000000000000000000000000000000000000180000000000000 % 0000 % 000000000000000000000000000e00000000000000000000000000001fe0000000000700000000 % 00000003800000000000000000c000000000000000000000000000000000000180000000000000 % 0001 % 000000000000000000000000000000000000000000000000000000001fe00000000003ffffffff % ffffffff000000000007fffffffffffff8000000000000ffffffffffffffffffffffffffffffff % ffff % 000000000000000000000000000000000000000000000000000000000fe0000000000000000000 % 0000000000000000000e0000000000001c000000000000c0000000000000000000000000000000 % 0003 % 000000000000000000000000000000000000000000000000000000000fc0000000000000000000 % 0000000000000000001c0000000000000e000000000000c0000000000000000000000000000000 % 0003 % 000000000000000000000000000000000000000000000000000000000fc0000000000000000000 % 0000000000000000003800000000000007000000000000c0000000000000000000000000000000 % 0002 % 0000000000000000000000000000000000000000000000000000000007c0000000000000000000 % 0000000000000000007000000000000003800000000000c0000000000000000000000000000000 % 0002 % 000000000000000000000000000000000000000000000000000000000780000000000000000000 % 000000000000000000e000000000000001c00000000000c0000000000000000000000000000000 % 0002 % 000000000000000000000000000000000000000000000000000000000780000000000000000000 % 000000000000000001c000000000000000e00000000000c0000000010040000000004000000000 % 0002 % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000038000000000000000700000000000c00000002100c0400000004000200000 % 0002 % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000070000000000000000380000000000c0000000200340400000000000200000 % 0002 % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000e00000000000000001c0000000000c00000007b1c5cf38dc0dcddde780000 % 0002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000001c00000000000000000e0000000000c000000021226247c620e648b3200000 % 0003 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000380000000000000000070000000000c0000000212242440420424d21200000 % 0003 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000700000000000000000038000000000c0000000211c42440420424521200000 % 0003 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000e0000000000003800001c000000000c0000000212042464420464623200000 % 0002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000001c000000000008c400000e000000200c00000003bbee7738e707ce21e380000 % 0002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000038000000000008840000070000003c0c0000000002300000000400000000000 % 0002 % 000000000000000000000000000000000000000000000000000000008000000000000000000000 % 0000000000000007000001b909b9e040000038000003f8c0000000006300000000400000000000 % 0002 % 000000000000000000000000000000000000000000000000000000008000000000000000000000 % 000000000000000e000001cf18c4808000001c000003ffc0000000003c00000000e00000000000 % 0002 % 00000000000000000000000000000000000000000000000000001f39e42fb70000000000000000 % 0000007ffffffffc000000850884810000000fffffffffc0000000000000000000000000000000 % 0002 % 0000000000000000000000000000000000000000000000000000087c8c64188000000000000000 % 0000004000000006000000850884810000001c000003ffc0000000000000000000000000000000 % 0002 % 000000000000000000000000000000000000000000000000000008408424108000000000000000 % 00000040000000030000008d18848300000038000003f8c0000600001000000000000000000000 % 0002 % 000000000000000000000000000000000000000000000000000008408424108000000000000000 % 0000004000000001800000f8edcee300000070000003c0c0000200011000000000000000008000 % 0002 % 000000000000000000000000000000000000000000000000000008648464108000000000000000 % 00000040000006c0c0000080000000000000e0d8000000c0000200010000000000000000008000 % 0002 % 00000000000000000000000000000000000000000000000000001c38e3be39c000000000000000 % 000000400000024060000080000000000001c064000000c035c238f3f1e6e06e3cf9e6ec39e71f % 3402 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000004000000280300001c00000000000038044000000c04be27d8913331073424213327c8f88 % 4802 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000007fc00000180180000000000000000070044000000c076024101121210210e407222408808 % 7402 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000003f8000001000c00000000000000000e00ee000000c00e0241011212102132419222408808 % 0c02 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000003f8000001000600000000000000001c0000000000c0472265891232102346423222648c88 % 4402 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000003f800000600030000000000000000380000000000c079c738f1f9e7383e3be1df7738e71c % 7802 % 00000000000000000000000000000000000000000000000000000c00000000c003000000000000 % 000001f000000000018000000000000000700000000000c0000000000000002000000000000000 % 0002 % 000000000000000000000000000000000000000000000000000004000000004001000000000000 % 000001f00000000000c000000000000000e00000000000c0000000000000002000000000000000 % 0002 % 000000000000000000000000000000000000000000000000000004000000004001000000000000 % 000001f000000000006000000000000001c00000000000c0000000000000007000000000000000 % 0002 % 000000000000000000000000000000000000000000000000042dc5c7884dc7c71f000000000000 % 000000e000000000003000000000000003800000000000c0000000000000000000000000000000 % 0002 % 0000000000000000000000000000000000000000000000000c66266cd8c62c4fb1000000000000 % 000000e000000000001800000000000007000000000000c0000000000000000000000000000000 % 0002 % 000000000000000000000000000000000000000000000000042424284844284821000000000000 % 000000e000000000000c0000000000000e000000000000c0000000000000000000000000000000 % 0002 % 000000000000000000000000000000000000000000000000042424284844284821000000000000 % 00000040000000000007fffffffffffffc000000000000ffffffffffffffffffffffffffffffff % fffe % 00000000000000000000000000000000000000000000000004642468c8c428cca3000000000000 % 00000040000000000003fffffffffffff8000000000000ffffffffffffffffffffffffffffffff % fffe % 00000000000000000000000000000000000000000000000003be77c7876e77671d800000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000020000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000020000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 07ce7909fdc0000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 021f23188620000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 021021088420000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 021021088420000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 021921188420000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 070e38edce70000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000800000000000000000000000000000000000000000000000000000000000000000000 % 0001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000800000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0037109b9e00000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0039b18c4800000000000000000000000000000000000000000000000000000000000000000000 % 0001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 001090884800000000000000000000000000000000000000000000000000000000000000000000 % 0001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 001090884800000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 001191884800000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 001f0edcee00000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 001000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 001000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 003800000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000 %%EndPreview save /d_sv_obj exch def userdict /IslandDrawDict 300 dict dup begin put /bdef {bind def} bind def /E {exch} bdef /FF {findfont} bdef /MF {makefont} bdef /RO {rotate} bdef /SC {scale} bdef /SF {setfont} bdef /SG {setgray} bdef /TR {translate} bdef /bp {lj lw rgb} bdef /bpbw {lj lw setgray} bdef /c {curveto} bdef /cl {closepath} bdef /fi {eofill} bdef /g {setgray} bdef /gr {grestore} bdef /gs {gsave} bdef /l {lineto} bdef /lj {setlinejoin} bdef /lw {setlinewidth} bdef /m {moveto} bdef /n {newpath} bdef /nx {/x E def} bdef /r {rmoveto} bdef /rl {rlineto} bdef /rgb {setrgbcolor} bdef /s {show} bdef /sd {setdash} bdef /sp {x 0 rmoveto} bdef /ss {currentpoint pop E m} bdef /st {stroke} bdef %% pattern stuff /BPSIDE 32 def %% pixels per pattern side /PATFREQ 3.0 def %% pattern pixels per mm /dp_mat [PATFREQ 0 0 PATFREQ 0 0] def /dp_pw BPSIDE def %% pattern pixel width /dp_ph BPSIDE def %% pattern pixel height /dp_w dp_pw PATFREQ div def %% pattern mm width /dp_h dp_ph PATFREQ div def %% pattern mm height /savemat matrix def /topmat matrix def /patmat matrix def %% catch nocurrentpoint error for: pathbbox /ncpoint errordict /nocurrentpoint get def errordict begin /nocurrentpoint { dup /pathbbox load eq {pop 0 0 1 1} {ncpoint} ifelse } bdef end /ar { %% sa ea sx sy rot tx ty matrix currentmatrix 8 1 roll TR RO SC n 0 0 1 5 3 roll arc setmatrix } bdef /arn { %% sa ea sx sy rot tx ty TR RO SC matrix currentmatrix 8 1 roll n 0 0 1 5 3 roll arcn setmatrix } bdef /el { %% sx sy rot tx ty matrix currentmatrix 6 1 roll TR RO SC n 0 0 1 0 360 arc setmatrix cl } bdef /image_raster { %% sw sh sd dw dh xs ys TR SC /sd E def /sh E def /sw E def /imagebuf sw sd mul 7 add 8 idiv string def sw sh sd [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop} image } bdef /imagemask_raster { TR SC /sh E def /sw E def /imagebuf sw 7 add 8 idiv string def sw sh false [sw 0 0 sh 0 0] {currentfile imagebuf readhexstring pop} imagemask } bdef /dither_color_raster { % bool sw sh sd dw dh xs ys TR SC /sd E def /sh E def /sw E def sd 8 eq and { /imagebuf 3 string def /grayval 1 string def sw sh sd [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop pop imagebuf 0 get 0.299 mul imagebuf 1 get 0.587 mul add imagebuf 2 get 0.114 mul add cvi grayval exch 0 exch put grayval } image } { /imagebuf sw 3 mul sd mul 7 add 8 idiv string def sh { currentfile imagebuf readhexstring pop pop } repeat } ifelse } bdef /image_color_raster { % bool sw sh sd dw dh xs ys /colorimage where not { dither_color_raster } { pop TR SC /sd E def /sh E def /sw E def pop /imagebuf sw 3 mul sd mul 7 add 8 idiv string def sw sh sd [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop} false 3 colorimage } ifelse } bdef /patpath { /inv E def topmat setmatrix pathbbox %% get lo - hi indecies /hy E dp_h div floor cvi def /hx E dp_w div floor cvi def /ly E dp_h div floor cvi def /lx E dp_w div floor cvi def lx 1 hx { dp_w mul ly 1 hy { dp_h mul E dup 3 1 roll E patmat currentmatrix pop TR dp_pw dp_ph inv dp_mat dp_proc imagemask patmat setmatrix } for pop } for } bdef % setpattern brush of patterns instead of gray /setpattern { /blue E def /green E def /red E def /freq E def /bwidth E def /bpside E def /bstring E def /onbits 0 def /offbits 0 def freq 0 {/y E def /x E def /xindex x 1 add 2 div bpside mul cvi def /yindex y 1 add 2 div bpside mul cvi def bstring yindex bwidth mul xindex 8 idiv add get not 1 7 xindex 8 mod sub bitshift and 0 ne {/onbits onbits 1 add def 1} {/offbits offbits 1 add def 0} ifelse } setscreen {} settransfer systemdict /setcmykcolor known { /fact 1 onbits offbits onbits add div sub def 1 red sub fact mul 1 green sub fact mul 1 blue sub fact mul 0 setcmykcolor } { offbits offbits onbits add div setgray} ifelse } bdef /dmatrix matrix def /dpi 72 0 dmatrix defaultmatrix dtransform dup mul E dup mul add sqrt def /B {gs bp st gr} bdef %% brush: gr lw lj /Bbw {gs bpbw st gr} bdef %% brush: gr lw lj /F {gs rgb eofill gr} bdef %% fill: gr /Fbw {gs setgray eofill gr} bdef %% fill: gr /PB {gs lj lw setpattern st gr} bdef /PF {gs eoclip patpath gr} bdef /BB {gs rgb lj lw strokepath clip patpath gr} bdef /xdef {exch def} bdef /clip_region { /ht xdef /wd xdef /bm xdef /lm xdef newpath lm bm moveto 0 ht rlineto wd 0 rlineto 0 ht neg rlineto closepath clip } bdef %! Island text prolog Version 3.1 %% %%BeginProlog /reencode_small_dict 12 dict def /ReencodeSmall { reencode_small_dict begin /new_codes_and_names exch def /new_font_name exch def /base_font_name exch def /base_font_dict base_font_name findfont def /newfont base_font_dict maxlength dict def base_font_dict { exch dup /FID ne { dup /Encoding eq { exch dup length array copy newfont 3 1 roll put } { exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall newfont /FontName new_font_name put new_codes_and_names aload pop new_codes_and_names length 2 idiv { newfont /Encoding get 3 1 roll put } repeat new_font_name newfont definefont pop end %reencode_small_dict } def /extended_Zapf [ 8#223 /a89 8#224 /a90 8#225 /a93 8#226 /a94 8#227 /a91 8#230 /a92 8#231 /a205 8#232 /a85 8#233 /a206 8#234 /a86 8#235 /a87 8#236 /a88 8#237 /a95 8#240 /a96 ] def /extended_Standard [ 29 /thorn 30 /yacute 31 /divide 128 /Acircumflex 129 /Adieresis 130 /Agrave 131 /Aring 132 /Atilde 133 /Ccedilla 134 /Eacute 135 /Ecircumflex 136 /Edieresis 137 /Egrave 138 /Iacute 139 /Icircumflex 140 /Idieresis 141 /Igrave 142 /Ntilde 143 /Oacute 144 /Ocircumflex 145 /Odieresis 146 /Ograve 147 /Otilde 148 /Scaron 149 /Uacute 150 /Ucircumflex 151 /Udieresis 152 /Ugrave 153 /Ydieresis 154 /Zcaron 155 /aacute 156 /acircumflex 157 /adieresis 158 /agrave 159 /aring 160 /atilde 161 /exclamdown 162 /cent 163 /sterling 164 /fraction 165 /yen 166 /florin 167 /section 168 /currency 169 /quotesingle 170 /quotedblleft 171 /guillemotleft 172 /guilsinglleft 173 /guilsinglright 174 /fi 175 /fl 176 /plusminus 177 /endash 178 /dagger 179 /daggerdbl 180 /periodcentered 181 /twosuperior 182 /paragraph 183 /bullet 184 /quotesinglbase 185 /quotedblbase 186 /quotedblright 187 /guillemotright 188 /ellipsis 189 /perthousand 190 /threesuperior 191 /questiondown 192 /mu 193 /grave 194 /acute 195 /circumflex 196 /tilde 197 /macron 198 /breve 199 /dotaccent 200 /dieresis 201 /onesuperior 202 /ring 203 /cedilla 204 /onequarter 205 /hungarumlaut 206 /ogonek 207 /caron 208 /emdash 209 /ccedilla 210 /copyright 211 /eacute 212 /ecircumflex 213 /edieresis 214 /egrave 215 /iacute 216 /icircumflex 217 /idieresis 218 /igrave 219 /logicalnot 220 /minus 221 /ntilde 222 /oacute 223 /ocircumflex 224 /odieresis 225 /AE 226 /onehalf 227 /ordfeminine 228 /ograve 229 /otilde 230 /registered 231 /scaron 232 /Lslash 233 /Oslash 234 /OE 235 /ordmasculine 236 /trademark 237 /uacute 238 /ucircumflex 239 /udieresis 240 /ugrave 241 /ae 242 /ydieresis 243 /zcaron 244 /Aacute 245 /dotlessi 246 /threequarters 247 /Eth 248 /lslash 249 /oslash 250 /oe 251 /germandbls 252 /multiply 253 /Yacute 254 /Thorn 255 /eth ] def /extended_Symbol [ ] def /extend_font { % stack: fontname newfontname exch dup (ZapfDingbats) eq { cvn exch cvn extended_Zapf ReencodeSmall } { dup (Symbol) eq { cvn exch cvn extended_Symbol ReencodeSmall } { cvn exch cvn extended_Standard ReencodeSmall } ifelse } ifelse } bind def /extend_font_name { % stack: font_name_string dup length 1 add string /extended_font_name exch def extended_font_name 0 (_) putinterval extended_font_name 1 3 -1 roll putinterval extended_font_name } bind def /gf { /f exch def f cvn where { f exch begin cvn load exec setfont end } { f 0 f length 8 sub getinterval dup /localfont exch extend_font_name def localfont extend_font localfont findfont /xsz f f length 4 sub 4 getinterval cvi def /ysz f f length 8 sub 4 getinterval cvi def [ xsz 0 0 ysz neg 0 0 ] makefont dup f cvn exch def setfont } ifelse } bind def /gfns { /f exch def f cvn where { f exch begin cvn load exec setfont end } { f 0 f length 8 sub getinterval cvn findfont /xsz f f length 4 sub 4 getinterval cvi def /ysz f f length 8 sub 4 getinterval cvi def [ xsz 0 0 ysz neg 0 0 ] makefont dup f cvn exch def setfont } ifelse } bind def /ul { % space drop thickness gs currentpoint currentlinewidth currentpoint n m 6 -3 roll lw 0 exch r 0 rl st lw m gr } bind def /nxtab { currentpoint pop 1000.0 mul cvi tab mod tab exch sub 1000.0 div 0 rmoveto } bind def /nx { /x exch def } bind def 0. nx %%EndProlog gsave 2.83465 -2.83465 scale 0 -279.4 translate topmat currentmatrix pop n 137.5 200 m 136.49 196.97 l 138.51 196.97 l cl 0 0 0 F n 120 195 m 137.5 195 l 137.5 196.97 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 107.5 113.367] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -598 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(dy_duenna\)) s -1292 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (preventative maintenance,) s -678 231 m 463 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (error recovery) s savemat setmatrix n 83.75 110 m 131.25 110 l 131.25 122.5 l 83.75 122.5 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 107.5 76.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -782 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(dy_primalpivot\)) s -1100 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (select leaving variable;) s -556 231 m 463 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (pivot basis;) s -1074 463 m 695 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (update variables, PSE) s -1082 695 m 927 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (norms, reduced costs;) s -954 927 m 1159 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (select next entering) s -386 1159 m 1391 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (variable) s savemat setmatrix n 86.25 72.5 m 128.75 72.5 l 128.75 102.5 l 86.25 102.5 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 107.5 44.146] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -640 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(dy_primalin\)) s -1128 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (select entering variable) s savemat setmatrix n 86.25 40 m 128.75 40 l 128.75 50 l 86.25 50 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 107.5 156.338] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -708 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(preoptimality\)) s -914 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (factor basis, check) s -956 231 m 463 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (accuracy & confirm) s -806 463 m 695 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (feasibility status) s savemat setmatrix n 86.25 152.5 m 128.75 152.5 l 128.75 170 l 86.25 170 l 86.25 152.5 l cl gsave 0 0 0 0.176 0 B grestore n 107.5 40 m 106.49 36.972 l 108.51 36.972 l cl 0 0 0 F n 107.5 30 m 107.5 36.972 l gsave 0 0 0 0.176 0 B grestore n 107.5 72.5 m 106.49 69.472 l 108.51 69.472 l cl 0 0 0 F n 107.5 62.5 m 107.5 69.472 l gsave 0 0 0 0.176 0 B grestore n 107.5 110 m 106.49 106.97 l 108.51 106.97 l cl 0 0 0 F n 107.5 102.5 m 107.5 106.97 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 107.5 137.6] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -688 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (unrecoverable) s -294 0 m 215 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (error?) s savemat setmatrix n 107.5 132.5 m 97.5 132.5 l 92.5 137.5 l 97.5 142.5 l 117.5 142.5 l 122.5 137.5 l 117.5 132.5 l 107.5 132.5 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 107.782 53.367] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -402 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (entering) s -386 0 m 215 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (variable) s -444 215 m 431 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (selected?) s savemat setmatrix n 107.5 50 m 100 50 l 95 56.25 l 100 62.5 l 115 62.5 l 120 56.25 l 115 50 l 107.5 50 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 107.5 174.146] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -318 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (primal) s -422 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (feasible?) s savemat setmatrix n 107.5 170 m 100 170 l 95 175 l 100 180 l 115 180 l 120 175 l 115 170 l 107.5 170 l cl gsave 0 0 0 0.176 0 B grestore n 107.5 190 m 98.75 190 l 93.75 195 l 98.75 200 l 116.25 200 l 121.25 195 l 116.25 190 l 107.5 190 l cl 1 1 1 F gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 107.5 194.156] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -562 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (unbounded) s -480 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (expected?) s savemat setmatrix n 107.5 152.5 m 106.49 149.47 l 108.51 149.47 l cl 0 0 0 F n 107.5 142.5 m 107.5 149.47 l gsave 0 0 0 0.176 0 B grestore n 140 127.5 m 136.97 128.51 l 136.97 126.49 l cl 0 0 0 F n 122.5 127.5 m 136.97 127.5 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 142.5 148.882] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -312 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (return) s -240 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (error) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 85 206.646] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -312 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (return) s -562 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (unbounded) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 180 204.146] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -614 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (tighten pivot) s -1014 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (selection parameters) s savemat setmatrix n 160 200 m 200 200 l 200 210 l 160 210 l cl gsave 0 0 0 0.176 0 B grestore n 85 202.5 m 83.991 199.47 l 86.009 199.47 l cl 0 0 0 F n 93.75 195 m 85 195 l 85 199.47 l gsave 0 0 0 0.176 0 B grestore n 107.5 67.5 m 110.53 66.491 l 110.53 68.509 l cl 0 0 0 F n 152.5 121.25 m 152.5 67.5 l 110.53 67.5 l gsave 0 0 0 0.176 0 B grestore n 142.5 145 m 141.49 141.97 l 143.51 141.97 l cl 0 0 0 F n 122.5 137.5 m 142.5 137.5 l 142.5 141.97 l gsave 0 0 0 0.176 0 B grestore n 107.5 147.5 m 104.47 148.51 l 104.47 146.49 l cl 0 0 0 F n 32.5 62.5 m 32.5 147.5 l 104.47 147.5 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 106.496 65.17] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -86 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (y) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 94.5556 55.4322] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -105 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (n) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 122.881 140.207] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (y) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 93.169 197.67] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -86 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (y) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 122.001 197.686] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (n) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 165.751 130.186] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (n) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 153.73 120.172] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (y) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 123.251 130.186] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (y) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 108.73 145.31] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (n) s savemat setmatrix n 77.5 180 m 76.491 176.97 l 78.509 176.97 l cl 0 0 0 F n 95 175 m 77.5 175 l 77.5 176.97 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 94.419 177.67] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -86 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (y) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 120.751 177.686] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (n) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 77.5 184.146] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -218 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dual) s -422 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (feasible?) s savemat setmatrix n 77.5 180 m 70 180 l 65 185 l 70 190 l 85 190 l 90 185 l 85 180 l 77.5 180 l cl gsave 0 0 0 0.176 0 B grestore n 55 190 m 53.991 186.97 l 56.009 186.97 l cl 0 0 0 F n 65 185 m 55 185 l 55 186.97 l gsave 0 0 0 0.176 0 B grestore n 107.5 190 m 106.49 186.97 l 108.51 186.97 l cl 0 0 0 F n 90 185 m 107.5 185 l 107.5 186.97 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 64.419 187.67] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -86 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (y) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 90.751 187.686] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (n) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 147.5 172.117] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -312 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (return) s -526 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (lost primal) s -468 231 m 463 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (feasibility) s savemat setmatrix n 135 175 m 131.97 176.01 l 131.97 173.99 l cl 0 0 0 F n 120 175 m 131.97 175 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 55 195] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -312 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (return) s -368 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (optimal) s savemat setmatrix n 107.5 35 m 110.53 33.991 l 110.53 36.009 l cl 0 0 0 F n 180 200 m 180 35 l 110.53 35 l gsave 0 0 0 0.176 0 B grestore n 180 127.5 m 176.97 128.51 l 176.97 126.49 l cl 0 0 0 F n 165 127.5 m 176.97 127.5 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 152.782 124.617] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -402 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (entering) s -386 0 m 215 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (variable) s -444 215 m 431 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (selected?) s savemat setmatrix n 152.5 121.25 m 145 121.25 l 140 127.5 l 145 133.75 l 160 133.75 l 165 127.5 l 160 121.25 l 152.5 121.25 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 107.5 126.466] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -428 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (continue) s -442 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (pivoting?) s savemat setmatrix n 107.5 122.5 m 97.5 122.5 l 92.5 127.5 l 97.5 132.5 l 117.5 132.5 l 122.5 127.5 l 117.5 122.5 l 107.5 122.5 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 61.25 51.9415] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -892 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(dy_dealWithPunt\)) s -778 0 m 215 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (attempt to relax) s -698 215 m 431 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (pivot selection) s -554 431 m 647 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (parameters) s savemat setmatrix n 45 47.704 m 77.5 47.704 l 77.5 65.204 l 45 65.204 l cl gsave 0 0 0 0.176 0 B grestore n 32.5 50.204 m 25 50.204 l 20 56.454 l 25 62.704 l 40 62.704 l 45 56.454 l 40 50.204 l 32.5 50.204 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 32.742 52.9995] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -196 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (new) s -530 0 m 215 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (candidates) s -484 215 m 431 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (available?) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 33.57 65.6765] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (n) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 33.876 48.7455] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (y) s savemat setmatrix n 77.5 56.25 m 80.528 55.241 l 80.528 57.259 l cl 0 0 0 F n 95 56.25 m 80.528 56.25 l gsave 0 0 0 0.176 0 B grestore n 107.5 35 m 104.47 36.009 l 104.47 33.991 l cl 0 0 0 F n 32.5 50 m 32.5 35 l 104.47 35 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 137.5 206.201] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -288 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (punt?) s savemat setmatrix n 137.5 200 m 130 200 l 125 205 l 130 210 l 145 210 l 150 205 l 145 200 l 137.5 200 l cl gsave 0 0 0 0.176 0 B grestore n 160 205 m 156.97 206.01 l 156.97 203.99 l cl 0 0 0 F n 150 205 m 156.97 205 l gsave 0 0 0 0.176 0 B grestore n 115 210 m 113.99 206.97 l 116.01 206.97 l cl 0 0 0 F n 125 205 m 115 205 l 115 206.97 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 115 215] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -312 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (return) s -234 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (punt) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 124.419 207.67] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -86 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (y) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 150.751 207.686] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (n) s savemat setmatrix userdict /#copies 1 put grestore %%Trailer %%DocumentNeededResources: font Bookman-Light %%DocumentSuppliedResources: end d_sv_obj restore DyLP-1.6.0/DyLP/doc/Figures/conmgmtcalls.epsu0000644000076700007670000011472711171477034015647 0ustar %!PS-Adobe-3.0 EPSF-3.0 %%Title: /cs/mitacs1/lou/Bonsai/Doc/Dylp.New/Figures/conmgmt.epsu %%Creator: IslandDraw for lou %%CreationDate: Sat Sep 17 10:49:58 2005 %%Pages: 1 %%BoundingBox: 58 615 500 755 %%DocumentNeededResources: (atend) %%DocumentSuppliedResources: (atend) %%EndComments %%BeginPreview: 553 176 1 352 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000a % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000018 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000013 % 000000000000000000000000000000000000000000000003e0080007400007c00c100000000000 % 0000000000000000000000000000000000000000000000000000000000000f % 00000000000000000000000000000000000000000000000110080008c000084804380100000000 % 0000000000000000000000000000000000000000000000000000000000000a % 000000000000000000000000000000000000000000000001100000104000082804280100000000 % 00000000000000000000000000000000000000000000000000000000000006 % 00000000000000000000000000000000000000001af1e6e117db76102f370e1e7c287bc0000000 % 0000000000000000000000000000000000000000000000000000000000005c % 0000000000000000000000000000000000000004258a1311e2099910199883c8c44cc500000000 % 0000000000000000000000000000000000000000000000000000000000005c % 000000000000000000000000000000000000000c3b0072110209111010908028847c8100000000 % 0000000000000000000000000000000000000000000000000000000000005c % 000000000000000000000000000000000000001807019211020911103090882884468100000000 % 0000000000000000000000000000000000000000000000000000000000005c % 0000000000000000000000000000000000000030238a32118209110851908c488c82c500000000 % 0000000000000000000000000000000000000000000000000000000000003a % 00000000000000000000000000000000000000603cf1df3b871fbb878f39cf8e77c779c0000000 % 0000000000000000000000000000000000000000000000000000000000003a % 00000000000000000000000000000000000000c000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000001e % 000000000000000000000000000000000000018000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000001e % 000000000000000000000000000000000000030000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000001e % 000000000000000000000000000000000000060000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000001e % 0000000000000000000000000000000000000c0000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000005c % 000000000000000000000000000000000000180000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000005c % 000000000000000000000000000000000000300000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000005c % 000000000000000000000000000000000000600000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000003a % 000000000000000000000000000000000000c00000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000005c % 00000000000000000000000000000000000180000600000000400000079c000000000000000000 % 0000000000000000000000000000000000000000000000000000000000001e % 000000000000000000000000000000000003000002000000084000100308000000000000000000 % 0000000000000000000000000000000000000000000000000000000000001e % 000000000000000000000000000000000006000002000000080000100308000000000000000000 % 0000000000000000000000000000000000000000000000000000000000001e % 00000000000000000000000000000000000c00003e7701e3decefe3dc111e7cd00000000000000 % 0000000000000000000000000000000000000000000000000000000000001e % 000000000000000000000000000000000018001c6222021628446113e192121200000000000000 % 0000000000000000000000000000000000000000000000000000000000005c % 00000000000000000000000000000000003000fc423200740846871200a0721d00000000000000 % 0000000000000000000000000000000000000000000000000000000000005c % 00000000000000000000000000000000006007e0421401940842991200e1920300000000000000 % 0000000000000000000000000000000000000000000000000000000000001e % 0000000000000000000000000000000000c03f00461402362843231320c2321100000000000000 % 0000000000000000000000000000000000000000000000000000000000003a % 00000000c0000000080000001d0000000181f8003b0801dbcee11d9dc041df1e00000000000000 % 0000000000000000000000000000000000000000000000000000000000005c % 00000000400000010800040023000000030fc00000080000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000005c % 00000000400000010000040041000000067e00000039f800000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000005c % 00000007ddc0787bd9dfcf3840bcdc340ff0000000600000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000005c % 0000000c488084c5088c247c406662481f80000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000005c % 000000084c801c8108d0e440404242743c00000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000005c % 00000008450064810853244040c2420c3f00000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000005c % 00000008c5008cc508646464214642441fe0000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000001e % 0000000762007679dc23b7381e3ce7780efc000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000008 % 00000000020000000000000000000000071f800006000000000040600000000300007000000000 % 0000000000000000000000000000000000000000000000000000000000001e % 000000000e3f000000000000000000000383f000020000000000c0200000000100008000200000 % 00000000000000000000000000000000000000000000000000000000000044 % 0000000018000000000000000000000001c07e00020000000000402b0000000100008000200000 % 0000000000000000000000000000000000000000000000000000000000006c % 0000000000000000000000000000000000e00fc03e7701e3cf1e5c240000001f3b81cf1e79e7c0 % 0000000000000000000000000000000000000000000000000000000000001e % 00000000000000000000000000000000007001f86222021638b1622800000031110090b1233200 % 0000000000000000000000000000000000000000000000000000000000005c % 000000000000000000000000000000000038003c423200741020423c0ffffe21190083a0221200 % 0000000000000000000000000000000000000000000000000000000000005c % 00000000000000000000000000000000001c000c4214019410204224000000210a008ca0221200 % 0000000000000000000000000000000000000000000000000000000000005c % 00000000000000000000000000000000000e00184614023638b14226000000230a0091b1223200 % 0000000000000000000000000000000000000000000000000000000000001e % 00000000000000000000000000000000000700183b0801dbcf1ee7770000001d8401cede39e700 % 0000000000000000000000000000000000000000000000000000000000001e % 000000000000000000000000000000000003803000080000000000000000000004000000000000 % 0000000000000000000000000000000000000000000000000000000000005b % 000000000000000000000000000000000001c0300039f80000000000000000001c7e0000000000 % 0000000000000000000000000000000000000000000000000000000000003a % 000000000000000000000000000000000000e06000600000000000000000000030000000000000 % 0000000000000000000000000000000000000000000000000000000000003a % 000000000000000000000000000000000000706000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000022 % 00000000000000000000000000000000000038c000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000005c % 0000000000000000000000000000000000001cc000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000005c % 0000000000000000000000000000000000000f8000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000003f % 000000000000000000000000000000000000078000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000001e % 000000000000000000000000000000000000038000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000003a % 00000000000000000000000000000000000003c006000000007e700000f8040003a0000e080000 % 000000c000000007e700001f0080003a000000000006000300000c00000056 % 00000000000000000000000000000000000006e002000000082320000044040004600004080100 % 0000004000000082320000088080004600000000000200010000040000003a % 000000000000000000000000000000000000067002000000082120000644000008200004000100 % 0000004000000082120000c88000008200000000000200010000040000001e % 0000000000000000000000000000000000000c383e7701e3de23203c3847ecdd8813cdc4186bc0 % 000007cee03c79e232078708bf9bb08179b80000003e77011e3c7c79e6e008 % 0000000000000000000000000000000000000c1c62220216283e20664479046648066624089107 % ffff0c444042c483e20cc88f108cc880ccc41ffff86222013342c4c733105c % 000000000000000000000000000000000000180c4232007408212042444104444804242408e907 % ffff0846400e8082120848881088888084841ffff8423201210e848212105c % 000000000000000000000000000000000000181c42140194082121423841044448142424281900 % 0000084280328082121847081088888184840000004214012132848212107f % 000000000000000000000000000000000000303846140236282123464061044444246424688900 % 000008c28046c4821238c80c108888428c8400000046140123468cc632100f % 00000000000000000000000000000000000030303b0801dbce7e7e3c7ce38eeee3c3ce7fdcf1c0 % 00000761003b78e7e7e78f9c39dddc3c79ce0000003b08039e3b7679e7380f % 000000000000000000000000000000000000606000080000000000004600000000000000000000 % 0000000100000000000008c00000000000000000000008000000000000000f % 00000000000000000000000000000000000060e00039f80000000000c600000000000000000000 % 000000071f800000000018c00000000000000000000038fc0000000000000f % 000000000000000000000000000000000000c1c000600000000000007800000000000000000000 % 0000000c0000000000000f000000000000000000000060000000000000000f % 000000000000000000000000000000000000c18000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000f % 000000000000000000000000000000000001830000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000e % 000000000000000000000000000000000001870000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000f % 0000000000000000000000000000000000030e0000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000f % 0000000000000000000000000000000000030c0000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000f % 000000000000000000000000000000000006180000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000f % 000000000000000000000000000000000006380000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000f % 00000000000000000000000000000000000c700000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000f % 00000000000000000000000000000000000c600000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000e % 000000000000000000000000000000000018c00000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000f % 000000000000000000000000000000000019c00000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000f % 000000000000000000000000000000000033800000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000f % 000000000000000000000000000000000033000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000e % 000000000000000000000000000000000066000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000f % 00000000000000000000000000000000006e000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000f % 0000000000000000000000000000000000dc000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000007f % 0000000000000000000000000000000000d8000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000f % 0000000000000000000000000000000001b0000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000013 % 0000000000000000000000000000000001f0000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000f % 0000000000000000000000000000000003e0000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000e % 0000000000000000000000000000000003c0000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000f % 000000000000000000000000000000000780000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000f % 000000000000000000000000000000000780000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000f % 030000000010000001f8000c1d0000000f00000000000003e008000740000fc000c08000000000 % 060000e000000000000000000000000000000000000000000000000000000f % 0100000002100008008c0004230000000e0000000000000110080008c00004600041c008000000 % 0200011000000000000000000000000000000000000000000000000000000f % 010000000200000800840004410000001c00000000000001100000104000042000414008000000 % 0200011000000000000000000000000000000000000000000000000000000f % 1f3b80f1e7b7779e708cdc7c40bcdc341c0000001af1e6e117db76102f37046dc7c1479e000000 % 3e7703bdf78dc000000000000000000000000000000000000000000000005e % 3111010b12122848f8f862c44066624838000000258a1311e2099910199887c62c426c48000000 % 6222011088462000000000000000000000000000000000000000000000005e % 2119003a021341c880844284404242743ffffffc3b00721102091110109084242843e8081ffffc % 4232011081c42000000000000000000000000000000000000000000000005e % 210a00ca021146488084428440c2420c3ffffffc070192110209111030908424284238081ffffc % 4214011086442000000000000000000000000000000000000000000000005e % 230a011b121188c8c884428c2146424400000000238a3211820911085190842428c41c48000000 % 4614011088c42000000000000000000000000000000000000000000000005e % 1d8400ede3b8876e71f8e7761e3ce778000000003cf1df3b871fbb878f39cfce776e3f8e000000 % 3b08039dc76e7000000000000000000000000000000000000000000000003f % 000400000000000000000000000000000000000000000000000000000000000000000000000000 % 00080000000000000000000000000000000000000000000000000000000000 % 001c7e000000000000000000000000000000000000000000000000000000000000000000000000 % 0038fc00000000000000000000000000000000000000000000000000000056 % 003000000000000000000000000000000000000000000000000000000000000000000000000000 % 00600000000000000000000000000000000000000000000000000000000021 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000043 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000003b % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000003f % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000056 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000a % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000018 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000013 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000f % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000a % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000006 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000001e % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000001e % 000000000000000000000000000000000000000000000003e0080007400007c00cfc0000000000 % 0000000000000000000000000000000000000000000000000000000000001e % 00000000000000000000000000000000000000000000000110080008c000084804460000010000 % 0000000000000000000000000000000000000000000000000000000000001e % 000000000000000000000000000000000000000000000001100000104000082804430000010000 % 0000000000000000000000000000000000000000000000000000000000005c % 00000000000000000000000000000000000000001af1e6e117db76102f370e1e7c413878f3c000 % 0000000000000000000000000000000000000000000000000000000000005c % 000000000000000000000000000000000000000c258a1311e2099910199883c8c4417c85890000 % 0000000000000000000000000000000000000000000000000000000000005c % 000000000000000000000000000000000000001c3b00721102091110109080288441401d010000 % 0000000000000000000000000000000000000000000000000000000000003a % 000000000000000000000000000000000000007807019211020911103090882884434065010000 % 0000000000000000000000000000000000000000000000000000000000005c % 00000000000000000000000000000000000000f0238a32118209110851908c488c42648d890000 % 0000000000000000000000000000000000000000000000000000000000001e % 00000000000000000000000000000000000003c03cf1df3b871fbb878f39cf8e76fc3876f1c000 % 0000000000000000000000000000000000000000000000000000000000001e % 000000000000000000000000000000000000078000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000001e % 0000000000000000000000000000000000001e0000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000001e % 0000000000000000000000000000000000003c0000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000005c % 000000000000000000000000000000000000f00000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000005c % 000000000000000000000000000000000001e00000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000001e % 000000000000000000000000000000000007800000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000003a % 00000000000000000000000000000000000f000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000005c % 00000000000000000000000000000000003c000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000005c % 000000000000000000000000000000000078000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000005c % 0000600003000000080000001d00000001e00000060000001f9c00007c020000e8000700000000 % 00030000180000007e700001f0080003a0000000000000000000000000005c % 0000200001000001080004002300000003c000000200000208c800002202000118000200080000 % 0001000008000008232000008808000460000000000000000000000000005c % 000020000100000100000400410000000f00000002000002084800032200000208000200080000 % 00010000080000082120000c8800000820000000000000000000000000005c % 0003e7701f1c787bd9dfcf3840bcdc341e0000003e38f1e788c81e1c22fe6ec205e6e201be0000 % 001f3b80f8e3c79e232078708bf9bb08179b8000000000000000000000005c % 00062220313e84c5088c247c406662483ffffffc627d0b120f8833223c42332203331202480fff % fc31110189f42c483e20cc88f108cc880ccc4000000000000000000000001e % 0004232021201c8108d0e440404242743ffffffc42403a02084821222042222202121203a80fff % fc2119010900e8082120848881088888084840000000000000000000000008 % 00042140212064810853244040c2420c1e0000004240ca020848611c2042222206121210680000 % 00210a0109032808212184708108888818484000000000000000000000001e % 0004614023328cc508646464214642440780000046651b120848e320304222210a321232280000 % 00230a0119946c4821238c80c108888428c840000000000000000000000044 % 0003b0801d9c7679dc23b7381e3ce77803c000003b38ede39f9f9e3e70e77770f1e73fe3ce0000 % 001d8400ece3b78e7e7e78f9c39dddc3c79ce000000000000000000000006c % 0000008000000000000000000000000000f0000000000000000000230000000000000000000000 % 00000400000000000000008c0000000000000000000000000000000000001e % 0000038fc000000000000000000000000078000000000000000000630000000000000000000000 % 00001c7e000000000000018c0000000000000000000000000000000000005c % 00000600000000000000000000000000001e0000000000000000003c0000000000000000000000 % 0000300000000000000000f00000000000000000000000000000000000005c % 00000000000000000000000000000000000f000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000005c % 000000000000000000000000000000000003c00000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000001e % 000000000000000000000000000000000001e00000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000001e % 000000000000000000000000000000000000780000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000005b % 0000000000000000000000000000000000003c0000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000003a % 0000000000000000000000000000000000000f00060000e0000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000003a % 000000000000000000000000000000000000078002000100008000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000022 % 00000000000000000000000000000000000001e002000100008000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000005c % 00000000000000000000000000000000000000f03e77039e3de79f000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000005c % 000000000000000000000000000000000000003c62220121628cc8000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000003f % 000000000000000000000000000000000000001c42320107408848000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000001e % 000000000000000000000000000000000000000042140119408848000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000003a % 0000000000000000000000000000000000000000461401236288c8000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000056 % 00000000000000000000000000000000000000003b08039dbce79c000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000003a % 000000000000000000000000000000000000000000080000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000001e % 00000000000000000000000000000000000000000039f800000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000008 % 000000000000000000000000000000000000000000600000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000007f %%EndPreview save /d_sv_obj exch def userdict /IslandDrawDict 300 dict dup begin put /bdef {bind def} bind def /E {exch} bdef /FF {findfont} bdef /MF {makefont} bdef /RO {rotate} bdef /SC {scale} bdef /SF {setfont} bdef /SG {setgray} bdef /TR {translate} bdef /bp {lj lw rgb} bdef /bpbw {lj lw setgray} bdef /c {curveto} bdef /cl {closepath} bdef /fi {eofill} bdef /g {setgray} bdef /gr {grestore} bdef /gs {gsave} bdef /l {lineto} bdef /lj {setlinejoin} bdef /lw {setlinewidth} bdef /m {moveto} bdef /n {newpath} bdef /nx {/x E def} bdef /r {rmoveto} bdef /rl {rlineto} bdef /rgb {setrgbcolor} bdef /s {show} bdef /sd {setdash} bdef /sp {x 0 rmoveto} bdef /ss {currentpoint pop E m} bdef /st {stroke} bdef %% pattern stuff /BPSIDE 32 def %% pixels per pattern side /PATFREQ 3.0 def %% pattern pixels per mm /dp_mat [PATFREQ 0 0 PATFREQ 0 0] def /dp_pw BPSIDE def %% pattern pixel width /dp_ph BPSIDE def %% pattern pixel height /dp_w dp_pw PATFREQ div def %% pattern mm width /dp_h dp_ph PATFREQ div def %% pattern mm height /savemat matrix def /topmat matrix def /patmat matrix def %% catch nocurrentpoint error for: pathbbox /ncpoint errordict /nocurrentpoint get def errordict begin /nocurrentpoint { dup /pathbbox load eq {pop 0 0 1 1} {ncpoint} ifelse } bdef end /ar { %% sa ea sx sy rot tx ty matrix currentmatrix 8 1 roll TR RO SC n 0 0 1 5 3 roll arc setmatrix } bdef /arn { %% sa ea sx sy rot tx ty TR RO SC matrix currentmatrix 8 1 roll n 0 0 1 5 3 roll arcn setmatrix } bdef /el { %% sx sy rot tx ty matrix currentmatrix 6 1 roll TR RO SC n 0 0 1 0 360 arc setmatrix cl } bdef /image_raster { %% sw sh sd dw dh xs ys TR SC /sd E def /sh E def /sw E def /imagebuf sw sd mul 7 add 8 idiv string def sw sh sd [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop} image } bdef /imagemask_raster { TR SC /sh E def /sw E def /imagebuf sw 7 add 8 idiv string def sw sh false [sw 0 0 sh 0 0] {currentfile imagebuf readhexstring pop} imagemask } bdef /dither_color_raster { % bool sw sh sd dw dh xs ys TR SC /sd E def /sh E def /sw E def sd 8 eq and { /imagebuf 3 string def /grayval 1 string def sw sh sd [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop pop imagebuf 0 get 0.299 mul imagebuf 1 get 0.587 mul add imagebuf 2 get 0.114 mul add cvi grayval exch 0 exch put grayval } image } { /imagebuf sw 3 mul sd mul 7 add 8 idiv string def sh { currentfile imagebuf readhexstring pop pop } repeat } ifelse } bdef /image_color_raster { % bool sw sh sd dw dh xs ys /colorimage where not { dither_color_raster } { pop TR SC /sd E def /sh E def /sw E def pop /imagebuf sw 3 mul sd mul 7 add 8 idiv string def sw sh sd [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop} false 3 colorimage } ifelse } bdef /patpath { /inv E def topmat setmatrix pathbbox %% get lo - hi indecies /hy E dp_h div floor cvi def /hx E dp_w div floor cvi def /ly E dp_h div floor cvi def /lx E dp_w div floor cvi def lx 1 hx { dp_w mul ly 1 hy { dp_h mul E dup 3 1 roll E patmat currentmatrix pop TR dp_pw dp_ph inv dp_mat dp_proc imagemask patmat setmatrix } for pop } for } bdef % setpattern brush of patterns instead of gray /setpattern { /blue E def /green E def /red E def /freq E def /bwidth E def /bpside E def /bstring E def /onbits 0 def /offbits 0 def freq 0 {/y E def /x E def /xindex x 1 add 2 div bpside mul cvi def /yindex y 1 add 2 div bpside mul cvi def bstring yindex bwidth mul xindex 8 idiv add get not 1 7 xindex 8 mod sub bitshift and 0 ne {/onbits onbits 1 add def 1} {/offbits offbits 1 add def 0} ifelse } setscreen {} settransfer systemdict /setcmykcolor known { /fact 1 onbits offbits onbits add div sub def 1 red sub fact mul 1 green sub fact mul 1 blue sub fact mul 0 setcmykcolor } { offbits offbits onbits add div setgray} ifelse } bdef /dmatrix matrix def /dpi 72 0 dmatrix defaultmatrix dtransform dup mul E dup mul add sqrt def /B {gs bp st gr} bdef %% brush: gr lw lj /Bbw {gs bpbw st gr} bdef %% brush: gr lw lj /F {gs rgb eofill gr} bdef %% fill: gr /Fbw {gs setgray eofill gr} bdef %% fill: gr /PB {gs lj lw setpattern st gr} bdef /PF {gs eoclip patpath gr} bdef /BB {gs rgb lj lw strokepath clip patpath gr} bdef /xdef {exch def} bdef /clip_region { /ht xdef /wd xdef /bm xdef /lm xdef newpath lm bm moveto 0 ht rlineto wd 0 rlineto 0 ht neg rlineto closepath clip } bdef %! Island text prolog Version 3.1 %% %%BeginProlog /reencode_small_dict 12 dict def /ReencodeSmall { reencode_small_dict begin /new_codes_and_names exch def /new_font_name exch def /base_font_name exch def /base_font_dict base_font_name findfont def /newfont base_font_dict maxlength dict def base_font_dict { exch dup /FID ne { dup /Encoding eq { exch dup length array copy newfont 3 1 roll put } { exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall newfont /FontName new_font_name put new_codes_and_names aload pop new_codes_and_names length 2 idiv { newfont /Encoding get 3 1 roll put } repeat new_font_name newfont definefont pop end %reencode_small_dict } def /extended_Zapf [ 8#223 /a89 8#224 /a90 8#225 /a93 8#226 /a94 8#227 /a91 8#230 /a92 8#231 /a205 8#232 /a85 8#233 /a206 8#234 /a86 8#235 /a87 8#236 /a88 8#237 /a95 8#240 /a96 ] def /extended_Standard [ 29 /thorn 30 /yacute 31 /divide 128 /Acircumflex 129 /Adieresis 130 /Agrave 131 /Aring 132 /Atilde 133 /Ccedilla 134 /Eacute 135 /Ecircumflex 136 /Edieresis 137 /Egrave 138 /Iacute 139 /Icircumflex 140 /Idieresis 141 /Igrave 142 /Ntilde 143 /Oacute 144 /Ocircumflex 145 /Odieresis 146 /Ograve 147 /Otilde 148 /Scaron 149 /Uacute 150 /Ucircumflex 151 /Udieresis 152 /Ugrave 153 /Ydieresis 154 /Zcaron 155 /aacute 156 /acircumflex 157 /adieresis 158 /agrave 159 /aring 160 /atilde 161 /exclamdown 162 /cent 163 /sterling 164 /fraction 165 /yen 166 /florin 167 /section 168 /currency 169 /quotesingle 170 /quotedblleft 171 /guillemotleft 172 /guilsinglleft 173 /guilsinglright 174 /fi 175 /fl 176 /plusminus 177 /endash 178 /dagger 179 /daggerdbl 180 /periodcentered 181 /twosuperior 182 /paragraph 183 /bullet 184 /quotesinglbase 185 /quotedblbase 186 /quotedblright 187 /guillemotright 188 /ellipsis 189 /perthousand 190 /threesuperior 191 /questiondown 192 /mu 193 /grave 194 /acute 195 /circumflex 196 /tilde 197 /macron 198 /breve 199 /dotaccent 200 /dieresis 201 /onesuperior 202 /ring 203 /cedilla 204 /onequarter 205 /hungarumlaut 206 /ogonek 207 /caron 208 /emdash 209 /ccedilla 210 /copyright 211 /eacute 212 /ecircumflex 213 /edieresis 214 /egrave 215 /iacute 216 /icircumflex 217 /idieresis 218 /igrave 219 /logicalnot 220 /minus 221 /ntilde 222 /oacute 223 /ocircumflex 224 /odieresis 225 /AE 226 /onehalf 227 /ordfeminine 228 /ograve 229 /otilde 230 /registered 231 /scaron 232 /Lslash 233 /Oslash 234 /OE 235 /ordmasculine 236 /trademark 237 /uacute 238 /ucircumflex 239 /udieresis 240 /ugrave 241 /ae 242 /ydieresis 243 /zcaron 244 /Aacute 245 /dotlessi 246 /threequarters 247 /Eth 248 /lslash 249 /oslash 250 /oe 251 /germandbls 252 /multiply 253 /Yacute 254 /Thorn 255 /eth ] def /extended_Symbol [ ] def /extend_font { % stack: fontname newfontname exch dup (ZapfDingbats) eq { cvn exch cvn extended_Zapf ReencodeSmall } { dup (Symbol) eq { cvn exch cvn extended_Symbol ReencodeSmall } { cvn exch cvn extended_Standard ReencodeSmall } ifelse } ifelse } bind def /extend_font_name { % stack: font_name_string dup length 1 add string /extended_font_name exch def extended_font_name 0 (_) putinterval extended_font_name 1 3 -1 roll putinterval extended_font_name } bind def /gf { /f exch def f cvn where { f exch begin cvn load exec setfont end } { f 0 f length 8 sub getinterval dup /localfont exch extend_font_name def localfont extend_font localfont findfont /xsz f f length 4 sub 4 getinterval cvi def /ysz f f length 8 sub 4 getinterval cvi def [ xsz 0 0 ysz neg 0 0 ] makefont dup f cvn exch def setfont } ifelse } bind def /gfns { /f exch def f cvn where { f exch begin cvn load exec setfont end } { f 0 f length 8 sub getinterval cvn findfont /xsz f f length 4 sub 4 getinterval cvi def /ysz f f length 8 sub 4 getinterval cvi def [ xsz 0 0 ysz neg 0 0 ] makefont dup f cvn exch def setfont } ifelse } bind def /ul { % space drop thickness gs currentpoint currentlinewidth currentpoint n m 6 -3 roll lw 0 exch r 0 rl st lw m gr } bind def /nxtab { currentpoint pop 1000.0 mul cvi tab mod tab exch sub 1000.0 div 0 rmoveto } bind def /nx { /x exch def } bind def 0. nx %%EndProlog gsave 2.83465 -2.83465 scale 0 -279.4 translate topmat currentmatrix pop n savemat currentmatrix pop [1 0 0 1 42.5 23.7012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -792 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_activateCons) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 79.7178 21.2012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -768 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_activateVars) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 66.1711 16.2012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (scanPrimConStdAct) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 107.234 31.2012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -2328 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_actBLogPrimConList) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 131.912 31.2012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -984 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_actBLogPrimCon) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 156.59 31.2012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_loadcon) s savemat setmatrix n 150.22 30 m 155.22 30 l gsave 0 0 0 0.1764 0 B grestore n 108.04 30 m 113.04 30 l gsave 0 0 0 0.1764 0 B grestore n savemat currentmatrix pop [1 0 0 1 84.0922 26.2012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -1016 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_accchk) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 91.4111 26.2012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_factor) s savemat setmatrix n 85.181 25 m 90.181 25 l gsave 0 0 0 0.1764 0 B grestore n 65 15 m 57.5 22.5 l gsave 0 0 0 0.1764 0 B grestore n 57.5 22.5 m 65 30 l gsave 0 0 0 0.1764 0 B grestore n 57.5 22.5 m 65 25 l gsave 0 0 0 0.1764 0 B grestore n 57.5 22.5 m 65 20 l gsave 0 0 0 0.1764 0 B grestore n savemat currentmatrix pop [1 0 0 1 56.47 41.2012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -1988 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_activateBndCons) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 84.0569 41.2012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -1014 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (scanPrimConBndAct) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 109.158 41.2012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_ftran) s savemat setmatrix n 102.93 40 m 107.93 40 l gsave 0 0 0 0.1764 0 B grestore n 57.5 40 m 65 40 l gsave 0 0 0 0.1764 0 B grestore n 57.5 40 m 65 30 l gsave 0 0 0 0.1764 0 B grestore n 57.5 40 m 65 25 l gsave 0 0 0 0.1764 0 B grestore n savemat currentmatrix pop [1 0 0 1 56.47 56.2012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -1812 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_deactivateCons) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 66.1711 51.2012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (scanPrimConStdDeact) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 104.342 56.2012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -2164 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (deactBLogPrimConLst) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 111.661 56.2012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_deactBLogPrimCon) s savemat setmatrix n 105.29 55 m 110.29 55 l gsave 0 0 0 0.1764 0 B grestore n savemat currentmatrix pop [1 0 0 1 74.0381 61.2012] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -446 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_factor) s savemat setmatrix n 65 50 m 57.5 55 l gsave 0 0 0 0.1764 0 B grestore n 57.5 55 m 65 55 l gsave 0 0 0 0.1764 0 B grestore n 57.5 55 m 65 60 l gsave 0 0 0 0.1764 0 B grestore userdict /#copies 1 put grestore %%Trailer %%DocumentNeededResources: font Bookman-Light %%DocumentSuppliedResources: end d_sv_obj restore DyLP-1.6.0/DyLP/doc/Figures/dual2flow.epsu0000644000076700007670000041600511171477034015055 0ustar %!PS-Adobe-3.0 EPSF-3.0 %%Title: /cs/mitacs1/lou/Bonsai/Doc/Dylp.New/Figures/dual2flow.epsu %%Creator: IslandDraw for lou %%CreationDate: Wed Sep 14 10:39:51 2005 %%Pages: 1 %%BoundingBox: 42 124 511 715 %%DocumentNeededResources: (atend) %%DocumentSuppliedResources: (atend) %%EndComments %%BeginPreview: 588 740 1 1480 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000d % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000e % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000d % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000e % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000d % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000e % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000d % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000e % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000d % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000e % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000d % 000000000000000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000e % 000000000000000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000d % 000000000000000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000e % 000000000000000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000d % 000000000000000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000e % 000000000000000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000d % 000000000000000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000e % 000000000000000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000d % 000000000000000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000e % 000000000000000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000d % 000000000000000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000e % 000000000000000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000d % 000000000000000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000e % 000000000000000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000000d % 000000000000000000000000000000000000000000000000000000000000000000000000000e03 % 00c000000000000000000000000000000000000000000000000000000000000000000e % 000000000000000000000000000000000000000000000000000000000000000000000000000fc3 % 07c000000000000000000000000000000000000000000000000000000000000000000d % 000000000000000000000000000000000000000000000000000000000000000000000000000ffb % 3fc000000000000000000000000000000000000000000000000000000000000000000e % 000000000007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00d % 000000000007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00e % 000000000004000000000000000000000000000000000000000000000000000000000000000ffb % 3fc000000000000000000000000000000000000000000000000000000000000000c00d % 000000000004000000000000000000000000000000000000000000000000000000000000000fc3 % 07c000000000000000000000000000000000000000000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000000000000000000000000e03 % 00c000000000000000000000000000000000000000000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000c002 % 00000000000400000000000000000000000000000000000000000000000000000000000000001f % e00000000000000000000000000000000000000000000000000000000000000000c000 % 00000000000400000000000000000000000000000000000000000000000000000000000000001f % e00000000000000000000000000000000000000000000000000000000000000000c002 % 00000000000400000000000000000000000000000000000000000000000000000000000000000f % e00000000000000000000000000000000000000000000000000000000000000000c000 % 00000000000400000000000000000000000000000000000000000000000000000000000000000f % c00000000000000000000000000000000000000000000000000000000000000000c002 % 00000000000400000000000000000000000000000000000000000000000000000000000000000f % c00000000000000000000000000000000000000000000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000000000000007 % c00000000000000000000000000000000000000000000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000000000000000000000007 % 800000000000000000000000000000000000000000000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000000000000007 % 800000000000000000000000000000000000000000000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 800000000000000000000000000000000000000000000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000c002 % 00000000000400000000000000000000000000000000000000000000001fffffffffffffffffff % ffffffffffffffffffe00000000000000000000000000000000000000000000000c000 % 00000000000400000000000000000000000000000000000000000000001fffffffffffffffffff % ffffffffffffffffffe00000000000000000000000000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000000000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000000000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000000000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000000000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000018000000000860000600 % 006000002000000000200000000000000000000000000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000018000000001020000200 % 002000042000000000200000000000000000000000000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000018000000002020000200 % 002000041000000000200000000000000000000000000000000000000000000000c000 % 0000000000040000000000000000000000000000000000000000000000180000000023eee03e21 % 1e23c42f1000000000200000000000000000000000000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000018000000002624406263 % 21266c641000000000200000000000000000000000000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000018000000002426404221 % 072424241000000000200000000000000000000000000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000018000000002422804221 % 192424241000000000200000000000000000000000000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000018000000002462804623 % 232464641000000000200000000000000000000000000000000000000000000000c002 % 0000000000040000000000000000000000000000000000000000000000180000000023b1003b1d % 9df3c3b71000000000200000000000000000000000000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000018000000002001000000 % 000000001000000000200000000000000000000000000000000000000000000000c002 % 0000000000040000000000000000000000000000000000000000000000180000000010071f8000 % 000000002000000000200000000000000000000000000000000000000000000000c000 % 00000000000400000000000000000000000000000000000000000000001800000000000c000000 % 000000000000000000200000000000000000000000000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000000000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000000000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000018000060000030000010 % 000000000401818000200000000000000000000000000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000018000020001010000010 % 000000000400808000200000000000000000000000000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000018000020001010000000 % 001800000000808000200000000000000000000000000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000018035c238f3c11c3cef3 % 70e07779fc78b88e00200000000000000000000000000000000000000000000000c002 % 00000000000400000000000000000000000000000000000000000000001804be27d89013e42451 % 891022848484cc9f00200000000000000000000000000000000000000000000000c000 % 00000000000436000000000000000000000000000000000000000000001807602410101200e691 % 0910341c841c849000200000000000000000000000000000000000000000000000c002 % 00000000000412000000007ffffffffffffffffffffffffffffc0000001800e024101012032291 % 08e014648464849000200000000000000000000000000000000000000000000000c000 % 00000000000414000000007ffffffffffffffffffffffffffffc00000018047226589013246311 % 0900188c848c8c9900200000000000000000000000000000000000000000000000c002 % 0000000000040c0000000060000000000000000000000000000c00000018079c738f1c39c3b13b % 9df00877ce76f9ce00200000000000000000000000000000000000000000000000c000 % 000000000004080000000060000000000000000000000000000c00000018000000000000000000 % 011800000000000000200000000000000000000000000000000000000000000000c002 % 000000000004080000000060000000000000000000000000000c00000018000000000000000000 % 031800000000000000200000000000000000000000000000000000000000000000c000 % 000000000004300000000060000000000000000000000000000c00000018000000000000000000 % 01e000000000000000200000000000000000000000000000000000000000000000c00a % 000000000004000000000060000000000000000000000000000c00000018000000000000000000 % 000000000000000000200000000000000000000000000000000000000000000000c000 % 000000000004000000000062180000c00067b9e0201f0000008c00000018000000000000000000 % 000000000000000000200000000000000000000000000000000000000000000000c00a % 00000000000400000000006408000040002331a260088000108c00000018000000000000000000 % 000000000000000000200000000000000000000000000000000000000000000000c00a % 00003fffffffffffff800068080000400023108220088000104c0000001fffffffffffffffffff % ffffffffffffffffffe00000000000000000000000000000000000000000000000c00a % 00007fffffffffffffc00068f9dc07ce1e211967ae08a1373c4c0000001fffffffffffffffffff % ffffffffffffffffffe00000000000000000000000000000000000000000000000c000 % 0000e0000000000000c0006988880c5f2121a922310f6318904c00000000000000000038000000 % 000000300000000000000000000000000000000000000000000000000000000000c00a % 0000c000000000000060006908c808500721ad2221082110904c00000000000000000070000000 % 000000380000000000000000000000000000000000000000000000000000000000c00a % 000180000000000000700069085008501920ae2221082110904c00000000000000000060600000 % 2000001c0000000000000000000000000000000000000000000000000000000000c00f % 00038000371cfdc000380069185008d92320c622210c2310904c000000000000000000c0200000 % 2000000e0000000000000000000000000000000000000000000000000000000000c00e % 0007000018be4880001c0068ec20076e1df04473f39c1db9dc4c000000000000000001c0200000 % 000030060000000000000000000000000000000000000000000000000000000000c00e % 000e000010a06c80000c0068002000000000000000000000004c0000000000000000038023879d % e6e1c0030000000000000000000000000000000000000000000000000000000000c00e % 000c000010a035000006006400e7e0000000000000000000008c0000000000000000070027c848 % a31220038000000000000000000000000000000000000000000000000000000000c00e % 0018000010b2360000070060018000000000000000000000000c000000000000000006002401cd % 22122001c000000000000000000000000000000000000000000000000000000000c00e % 0038000039dc120000038060000000000000000000000000000c00000000000000000c00240645 % 2211c000e000000000000000000000000000000000000000000000000000000000c00e % 00700000000000000001c060000000000000000000006000000c00000000000000001c002648c6 % 221200006000000000000000000000000000000000000000000000000000000000c00e % 00e00000000000000000c060002100000002010000002000000c00000000000000003800738762 % 773be0003000000000000000000000000000000000000000000000000000000000c00e % 00c000000000000000006060002100000002010000002000000c0000000000006c007000000000 % 000230003800000000000000000000000000000000000000000000000000000000c00e % 0180000000000000000070601e7bce6ec6e783de07ce23cee00c00000000000032006000000000 % 000630001c00000000000000000000000000000000000000000000000000000000c00e % 03800000019030000000386021211f3327320133021f2422c00c0000000000002200c000000000 % 0003c0000e00000000000000000000000000000000000000000000000000000000c000 % 070000000090100200001c600721102222120121021020e1000c0000000000002201c000000000 % 000000000600000000000000000000000000000000000000000000000000000000c000 % 0e0000000080100200000c60192110222212012102102323800c00000000000077038000000010 % 060600000300000000000000000000000000000000000000000000000000000000c000 % 0c03cf370fb1f1e79c340660232119222232012302192464c00c00000000000000070000000010 % 020200000380000000000000000000000000000000000000000000000000000000c008 % 18063098989312123e4807601db9ce7773e381de070e73bee00c03000000000000060000000000 % 0202000001c0000000000000000000000000000000000000000000000000000000c000 % 3804039090921072207403e0000000000200000000000000000c1f0000000000000c0001dfcfb1 % e2e2700000e0000000000000000000000000000000000000000000000000000000c000 % 70040c9090921192200c01e0000000000200000000000000000cff0000000000001c00008c2412 % 1332f8000060000000000000000000000000000000000000000000000000000000c000 % e006319091923232324400e0000000000700000000000000000ffffffffffffffff80000d0e410 % 721280000030000000000000000000000000000000000000000000000000000000c001 % e003cef9cef9d9db9c7800e0000000000000000000000000000ffffffffffffffff00000532411 % 921280000030000000000000000000000000000000000000000000000000000000c00c % 6000000000000000000001e0000000000000000000000000000dff000000000000180000646412 % 3232c8000070000000000000000000000000000000000000000000000000000000c000 % 3000000000000000000001e0000080000000030000080000000c3f0000000000001c000023be39 % dbe7700000e0000000000000000000000000000000000000000000000000000000c000 % 380000000000000000000360000080004000010000880000000c0f0000000000000e0000000000 % 0000000000c0000000000000000000000000000000000000000000000000000000c00d % 1c0000000000000000000760000000004000010000800000000c00000000000000070000000000 % 000000000180000000000000000000000000000000000000000000000000000000c00e % 0e0000000000000000000e6001b99dfcf01ae11c79f8f370000c00000000000000030000000000 % 000000000380000000000000000000000000000000000000000000000000000000c00d % 0600000002c0181801c01c6001cc88e64025f13ec4899988000c00000000000000018000000000 % 000000000700000000000000000000000000000000000000000000000000000000c00e % 03000000024008080620186000848d42403b012080890908000c0000000000000001c000000000 % 000000000e00000000000000000000000000000000000000000000000000000000c00d % 038000000040080804203060008485424007012080890908000c0000000000000000e00000c000 % 0000c3800c00000000000000000000000000000000000000000000000000000000c00e % 01c079dfc6478b88e0207060008c864640239132c4891908000c00000000000000007000004000 % 20004c401800000000000000000000000000000000000000000000000000000000c00d % 00e0848c22484cc9f040e06000f9c23c703ce39c78fcf39c000c00000000000000003000004000 % 200048403800000000000000000000000000000000000000000000000000000000c00e % 00601cd0e241c8490081c060008000000000000000000000000c00000000000000001806b8471e % 7b87c0407000000000000000000000000000000000000000000000000000000000c00d % 003064532246484900818060008000000000000000000000000c00000000000000001c097c4fb1 % 27cc4080e000000000000000000000000000000000000000000000000000000000c00e % 00388c646248c8c99183006001c000000000000000000000000c00000000000000000e0ec04820 % 24084100c000000000000000000000000000000000000000000000000000000000c00d % 001c7623b7e76f9ce1870060000000000000000000000000000c00000000000000000701c04820 % 240841018000000000000000000000000000000000000000000000000000000000c00e % 000e000000000000000e0060000000000000000000000000000c00000000000000000308e44cb1 % 2648c3038000000000000000000000000000000000000000000000000000000000c00d % 0006000000000000001c0060000000000000000100000000000c0000000000000000018f38e71e % 3b8763070000000000000000000000000000000000000000000000000000000000c00e % 000300000000000000180060000000000000000100000000000c000000000000000001c0000000 % 0000000e0000000000000000000000000000000000000000000000000000000000c00d % 0003800000000000003000600000dc79f3cdd873ce7c6800000c000000000000000000e0000000 % 0000000c0000000000000000000000000000000000000000000000000000000000c00e % 0001c00000000000007000600000e684842664f91f209000000c00000000000000000070000000 % 000000180000000000000000000000000000000000000000000000000000000000c00d % 0000e0000000000000e000600000421c80e444811020e800000c00000000000000000030000000 % 000000380000000000000000000000000000000000000000000000000000000000c00e % 000060000000000001c00060000042648324448110201800000c00000000000000000018000000 % 000000700000000000000000000000000000000000000000000000000000000000c00d % 00003fffffffffffff8000600000468c846444c919208800000c0000000000000000001fffffff % ffffffe00000000000000000000000000000000000000000000000000000000000c00e % 00000000000400000000006000007c77c3beee71ce70f000000c00000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000c00d % 000000000004000000000060000040000000000000000000000c00000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000c00e % 000000000004000000000060000040000000000000000000000c00000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000c00d % 0000000000040000000000600000e0000000000000000000000c00000000000000000000000003 % 0d8000000000000000000000000000000000000000000000000000000000000000c00e % 0000000000046c0000000060000000000000000000000000000c00000000000000000000000003 % 048000000000000000000000000000000000000000000000000000000000000000c00d % 000000000004320000000060000000000000000000000000000c00000000000000000000000003 % 050000000000000000000000000000000000000000000000000000000000000000c00e % 000000000004220000000060000000000000000000000000000c00000000000000000000000003 % 030000000000000000000000000000000000000000000000000000000000000000c00d % 000000000004220000000060000000000000000000000000000c00000000000000000000000003 % 020000000000000000000000000000000000000000000000000000000000000000c00e % 00000000000477000000007ffffffffffffffffffffffffffffc00000000000000000000000003 % 020000000000000000000000000000000000000000000000000000000000000000c00d % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 0c0000000000000000000000000000000000000000000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000c00d % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 00c000000000000000000000000000000000000000000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 07c000000000000000000000000000000000000000000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 3fc000000000000000000000000000000000000000000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % fffffffffffffffffffffffffffffffffffffffe00000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % fffffffffffffffffffffffffffffffffffffffe00000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 7fc000000000000000000000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 0fc000000000000000000000000000000000000200000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 01c000000000000000000000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000000c002 % 00000000000400000000000000000000000000000000000000000000000000000000000000001f % e00000000000000000000000000000000000000200000000000000000000000000c000 % 00000000000400000000000000000000000000000000000000000000000000000000000000001f % e00000000000000000000000000000000000000200000000000000000000000000c002 % 00000000000400000000000000000000000000000000000000000000000000000000000000000f % e00000000000000000000000000000000000000200000000000000000000000000c000 % 00000000000400000000000000000000000000000000000000000000000000000000000000000f % c00000000000000000000000000000000000000200000000000000000000000000c002 % 00000000000400000000000000000000000000000000000000000000000000000000000000000f % c00000000000000000000000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000000000000007 % c00000000000000000000000000000000000000200000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000000000000000000000007 % 800000000000000000000000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000000000000007 % 800000000000000000000000000000000000000200000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 800000000000000000000000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000000c002 % 00000000000400000000000000000000000000000000000000000000001fffffffffffffffffff % ffffffffffffffffffe00000000000000000000200000000000000000000000000c000 % 00000000000400000000000000000000000000000000000000000000001fffffffffffffffffff % ffffffffffffffffffe00000000000000000000200000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000200000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000200000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000018000000010c00006000 % 0c0040000100000000200000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000018000000020400002000 % 040040002100000000200000000000000000000200000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000018000000040400002000 % 040000002080000000200000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000018000000047cee03e423 % c4dcddde7880000000200000000000000000000200000000000000000000000000c002 % 00000000000400000000000000000000000000000000000000000000001800000004c444062c64 % 24e648b32080000000200000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000018000000048464042420 % e4424d212080000000200000000000000000000200000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000018000000048428042423 % 244245212080000000200000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000018000000048c28046464 % 644646232080000000200000000000000000000200000000000000000000000000c002 % 00000000000400000000000000000000000000000000000000000000001800000004761003b3b3 % be7ce21e3880000000200000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000018000000040010000000 % 004000000080000000200000000000000000000200000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000018000000020073f00000 % 004000000100000000200000000000000000000200000000000000000000000000c000 % 0000000000040000000000000000000000000000000000000000000000180000000000c0000000 % 00e000000000000000200000000000000000000200000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000200000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000018001800000000000004 % 000000000100606000200000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000018000800040000080004 % 000000000100202000200000000000000000000200000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000018000800040000080000 % 000600000000202000200000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000018d388e3cf039b9e71fc % dc381dfc7f1e2e2388200000000000000000000200000000000000000000000000c00a % 00000000000400000000000000000000000000000000000000000000001927c9f62407cc48f884 % 624408c221213327c8200000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000019d40904040408488084 % 42440d0e2107212400200000000000000000000200000000000000000000000000c00a % 000000000004000000000000000000000000000000000000000000000018340904040408488084 % 423805322119212400200000000000000000000200000000000000000000000000c00a % 00000000000400000000000000000000000000000000000000000000001916499624064848c884 % 424006462123232648200000000000000000000200000000000000000000000000c00a % 000000000004000000000000000000000000000000000000000000000019e39ce3c7039cee71ce % e77c023b739dbe7388200000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 004600000000000008200000000000000000000200000000000000000000000000c00a % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 00c600000000000000200000000000000000000200000000000000000000000000c00a % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 007800000000000000200000000000000000000200000000000000000000000000c00f % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000200000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000200000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000200000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000000018000000000004000003 % 000008000000000000200000000000000000000200000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000000018000000000004000201 % 000008000000000000200000000000000000000200000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000000018000000000000000201 % 000000000000000000200000000000000000000200000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000000018000000000dcddde781 % 73c1b86a0000000000200000000000000000000200000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000000018000000000e648b3201 % 9c2248920000000000200000000000000000000200000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000000018000000000424d21201 % 08e3a8e80000000000200000000000000000000200000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000000018000000000424521201 % 0b2068180000000000200000000000000000000200000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000000018000000000464623201 % 1c62288a0000000000200000000000000000000200000000000000000000000000c000 % 0000000000040000000000000000000000000000000000000000000000180000000007ce21e381 % f3b3dcf20000000000200000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000018000000000400000000 % 000000020000000000200000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000018000000000400000000 % 000000000000000000200000000000000000000200000000000000000000000000c008 % 000000000004000000000000000000000000000000000000000000000018000000000e00000000 % 000000000000000000200000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000018000001800000000004 % 01818000007e0f9fc0200000000000000000000200000000000000000000000000c001 % 000000000004000000000000000000000000000000000000000000000018000000801000000004 % 0080800000231088c0200000000000000000000200000000000000000000000000c00c % 000000000004000000000000000000000000000000000000000000000018000000801000000000 % 008080000021904820200000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000018109b8f9e3dc077f1fc % 78b88e1a00209c0900200000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000018319cd8a113e0230884 % 84cc9f240020878f00200000000000000000000200000000000000000000000000c00d % 000000000004000000000000000000000000000000000000000000000018108850871200343884 % 1c84903a0020804900200000000000000000000200000000000000000000000000c00e % 00000000000400000000000000000000000000000000000000000000001810885099120014c884 % 648490060021904820200000000000000000000200000000000000000000000000c00d % 0000000000040000000000000000000000000000000000000000000000181188d1a31320191884 % 8c8c99224021188840200000000000000000000200000000000000000000000000c00e % 0000000000040000000000000000000000000000000000000000000000180ecf8edd9dc008edce % 76f9ce3c407e1f1fc0200000000000000000000200000000000000000000000000c00d % 000000000004000000000000000000000000000000000000000000000018000800000000000000 % 000000004000000000200000000000000000000200000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000000018000800000000000000 % 000000000000000000200000000000000000000200000000000000000000000000c00d % 000000000004000000000000000000000000000000000000000000000018001c00000000000000 % 000000000000000000200000000000000000000200000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000200000000000000000000000000c00d % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000200000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000200000000000000000000000000c00d % 000000000004000000000000000000000000000000000000000000000018000000000000000030 % 000001800000000000200000000000000000000200000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000000018000000000000000010 % 000000800000080000200000000000000000000200000000000000000000000000c00d % 000000000004000000000000000000000000000000000000000000000018000000000000000010 % 000000800000080000200000000000000000000200000000000000000000000000c00e % 0000000000040000000000000000000000000000000000000000000000181b8f3edd83403e71f1 % 09e38f80f1e1be3500200000000000000000000200000000000000000000000000c00d % 0000000000040000000000000000000000000000000000000000000000180c599066448010fb13 % 1b17d8818b32484900200000000000000000000200000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000000018085090444740108211 % 0a0410810213a87400200000000000000000000200000000000000000000000000c00d % 0000000000040000000000000000000000000000000000000000000000180850904440c0108211 % 0a0410810210680c00200000000000000000000200000000000000000000000000c00e % 00000000000400000000000000000000000000000000000000000000001808519044445010ca31 % 1b1651818a32284500200000000000000000000200000000000000000000000000c00d % 0000000000040000000000000000000000000000000000000000000000181cef38eee7903871d8 % ede38ec0f1e3ce7900200000000000000000000200000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000000018000000000010000000 % 000000000000000100200000000000000000000200000000000000000000000000c00d % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000200000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000200000000000000000000000000c00d % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000200000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000200000000000000000000000000c00d % 0000000000040000000000000000000000000000000000000000000000180000000c0000000000 % 000c00000400000000200000000000000000000200000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000000018000000040002000000 % 080400000400000000200000000000000000000200000000000000000000000000c00d % 000000000004000000000000000000000000000000000000000000000018000000040002000000 % 080400000000060000200000000000000000000200000000000000000000000000c00e % 00000000000400000000000000000000000000000000000000000000001800006b8471e786e1ce % fe0471e77cdc380000200000000000000000000200000000000000000000000000c00d % 000000000004000000000000000000000000000000000000000000000018000097c4fb120313e2 % c804fa122462440000200000000000000000000200000000000000000000000000c00e % 0000000000040000000000000000000000000000000000000000000000180000ec048202021201 % 080480734442440000200000000000000000000200000000000000000000000000c00d % 00000000000400000000000000000000000000000000000000000000001800001c048202021203 % 880481914442380000200000000000000000000200000000000000000000000000c00e % 00000000000400000000000000000000000000000000000000000000001800008e44cb12021324 % c804ca318442400000200000000000000000000200000000000000000000000000c000 % 0000000000040000000000000000000000000000000000000000000000180000f38e71e38739ce % ee0e71d88ee77c0000200000000000000000000200000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 000000000000460000200000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 000000000000c60000200000000000000000000200000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 000000000000780000200000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000200000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000200000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000018000000000000000010 % 060600000000000000200000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000018000000000000000010 % 020200000000000000200000000000000000000200000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 020200000000000000200000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000018000000000001dfcfb1 % e2e270000000000000200000000000000000000200000000000000000000000000c002 % 0000000000040000000000000000000000000000000000000000000000180000000000008c2412 % 1332f8000000000000200000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000018000000000000d0e410 % 721280000000000000200000000000000000000200000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000018000000000000532411 % 921280000000000000200000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000018000000000000646412 % 3232c8000000000000200000000000000000000200000000000000000000000000c002 % 00000000000400000000000000000000000000000000000000000000001800000000000023be39 % dbe770000000000000200000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000200000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000200000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000200000000000000000000000000c000 % 00000000000400000000000000000000000000000000000000000000001fffffffffffffffffff % ffffffffffffffffffe00000000000000000000200000000000000000000000000c002 % 00000000000400000000000000000000000000000000000000000000001fffffffffffffffffff % ffffffffffffffffffe00000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000000c002 % 00000000000400000000000000000000000000000000000000000000000000000000000000001f % e00000000000000000000000000000000000000200000000000000000000000000c000 % 00000000000400000000000000000000000000000000000000000000000000000000000000001f % e00000000000000000000000000000000000000200000000000000000000000000c002 % 00000000000400000000000000000000000000000000000000000000000000000000000000000f % e00000000000000000000000000000000000000200000000000000000000000000c000 % 00000000000400000000000000000000000000000000000000000000000000000000000000000f % c00000000000000000000000000000000000000200000000000000000000000000c002 % 00000000000400000000000000000000000000000000000000000000000000000000000000000f % c00000000000000000000000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000000000000007 % c00000000000000000000000000000000000000200000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000000000000000000000007 % 800000000000000000000000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000000000000007 % 800000000000000000000000000000000000000200000000000000000000000000c00a % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 800000000000000000000000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000200000000000000000000000000c00a % 000000000004000000000000000000000000000000000000000000003fffffffffffffffffffff % fffffffffffffffffffff000000000000000000200000000000000000000000000c00a % 000000000004000000000000000000000000000000000000000000003fffffffffffffffffffff % fffffffffffffffffffff000000000000000000200000000000000000000000000c00a % 000000000004000000000000000000000000000000000000000000003000000000000000000000 % 000000000000000000001000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000003000000000000000000000 % 000000000000000000001000000000000000000200000000000000000000000000c00a % 000000000004000000000000000000000000000000000000000000003000000000000860000300 % 000000004000000000001000000000000000000200000000000000000000000000c00a % 000000000004000000000000000000000000000000000000000000003000000000001020000100 % 000000004000000000001000000000000000000200000000000000000000000000c00f % 000000000004000000000000000000000000000000000000000000003000000000002020000100 % 000000002000000000001000000000000000000200000000000000000000000000c00e % 0000000000040000000000000000000000000000000000000000000030000000000023e7701f10 % 9c6e6e3c2000000000001000000000000000000200000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000003000000000002622203131 % be3131422000000000001000000000000000000200000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000003000000000002423202110 % a021210e2000000000001000000000000000000200000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000003000000000002421402110 % a02121322000000000001000000000000000000200000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000003000000000002461402311 % b22121462000000000001000000000000000000200000000000000000000000000c00e % 0000000000040000000000000000000000000000000000000000000030000000000023b0801d8e % dc73f3bb2000000000001000000000000000000200000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000003000000000002000800000 % 000000002000000000001000000000000000000200000000000000000000000000c00e % 0000000000040000000000000000000000000000000000000000000030000000000010038fc000 % 000000004000000000001000000000000000000200000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000003000000000000006000000 % 000000000000000000001000000000000000000200000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000003000000000000000000000 % 000000000000000000001000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000003000000000000000000000 % 000000000000000000001000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000003000000000000000400000 % 000080000000000000001000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000003000000000008008400000 % 000080080000000000001000000000000000000200000000000000000000000000c008 % 000000000004000000000000000000000000000000000000000000003000000000008008000000 % 000000080000000000001000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000003373ee3bf1b9e79edddc0d % d8799b9e71b8f371e3801000000000000000000200000000000000000000000000c000 % 0000000000040000000000000000000000000000000000000000000033991f11f8c4884848be06 % 64848c48f8c5098b17c01000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000003109101a808481c84d2004 % 441c88488084390a04001000000000000000000200000000000000000000000000c001 % 000000000004000000000000000000000000000000000000000000003109100a80848648452004 % 446488488084c90a04001000000000000000000200000000000000000000000000c00c % 000000000004000000000000000000000000000000000000000000003119190cc88488c8463204 % 448c8848c885190b16481000000000000000000200000000000000000000000000c000 % 0000000000040000000000000000000000000000000000000000000031f38e0471cee76ee21c0e % ee77dcee71ceef9de3881000000000000000000200000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000003100000000000000000000 % 000000000000000000081000000000000000000200000000000000000000000000c00d % 000000000004000000000000000000000000000000000000000000003100000000000000000000 % 000000000000000000001000000000000000000200000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000003380000000000000000000 % 000000000000000000001000000000000000000200000000000000000000000000c00d % 000000000004000000000000000000000000000000000000000000003000000000000000000000 % 000000000000000000001000000000000000000236000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000003000000000000000000000 % 000000000000000000001000000000000000000212000000000000000000000000c00d % 000000000004000000000000000000000000000000000000000000003000000000000000000000 % 000000000000000000001000000000000000000214000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000003000000000000000000000 % 00000000000000000000100000000000000000020c000000000000000000000000c00d % 000000000004000000000000000000000000000000000000000000003000000000071ff9e7c3e7 % 1e3cefc7fb80000000001000000000000000000208000000000000000000000000c00e % 0000000000040000000000000000000000000000000000000000000030000000000f884332010f % b16647e21100000000001000000000000000000208000000000000000000000000c00d % 000000000004000000000000000000000000000000000000000000003000000000080842120108 % 20426a021900000000001000000000000000000230000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000003000000000080842120108 % 20422a020a00000000001000000000000000000200000000000000000000000000c00d % 0000000000040000000000000000000000000000000000000000000030000000000c884232010c % b14633220a00000000001000000000000000000200000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000003000000000071ce1e70387 % 1e3c11c70400000000001000000000000000000200000000000000000000000000c00d % 000000000004000000000000000000000000000000000000000000003000000000000000000000 % 000000000400000000001000000000001fffffffffffffc0000000000000000000c00e % 000000000004000000000000000000000000000000000000000000003000000000000000000000 % 000000001c00000000001000000000003800000000000060000000000000000000c00d % 000000000004000000000000000000000000000000000000000000003000000000000000000000 % 000000003000000000001000000000007000000000000070000000000000000000c00e % 000000000004000000000000000000000000000000000000000000003000000000000000000000 % 00000000000000000000100000000000e060000020000038000000000000000000c00d % 000000000004000000000000000000000000000000000000000000003fffffffffffffffffffff % fffffffffffffffffffff00000000000c02000002000001c000000000000000000c00e % 000000000004000000000000000000000000000000000000000000003fffffffffffffffffffff % fffffffffffffffffffff00000000001802000000000300c000000000000000000c00d % 000000000004000000000000000000000000000000000000000000000000000000007000000000 % 0000000018000000000000000000000380238f3be6e1c006000000000000000000c00e % 00000000000400000000000000000000000000000000000000000000000000000000e000000000 % 000000000c00000000000000000000070027d09123122007000000000000000000c00d % 00000000000400000000000000000000000000000000000000000000000000000001c000000000 % 0000000006000000000000000000000e0024039a22122003800000000000000000c00e % 000000000004000000000000000000000000000000000000000000000000000000038000000000 % 0000000003000000000000000000000c00240c8a2211c001c00000000000000000c00d % 000000000004000000000000000000000000000000000000000000000000000000070000000001 % 000000000180000000000000000000180026518c22120000c00000000000000000c00e % 0000000000040000000000000000000000000000000000000000000000000000000e0000000011 % 0000000000c00000000000000000003800738ec4773be000600000000000000000c00d % 0000000000040000000000000000000000000000000000000000000000000000001c0000000010 % 000000000060000000000000000000700000000000023000700000000000000000c00e % 0000000000040000000000000000000000000000000000000000000000000000003800079e6e3f % 37108e000030000000000000000000e00000000000063000380000000000000000c00d % 00000000000400000000000000000000000000000000000000000000000000000070000c733111 % 18b19f000018000000000000000000c0000000000003c0001c0000000000000000c00e % 000000000004000000000000000000000000000000000000000000000000000000e00008212111 % 10909000000c0000000000000000018000000000000000000c0000000000000000c00d % 000000000004000000000000000000000000000000000000000000000000000001c00008212111 % 109090000006000000000000000003800000000000000000060000000000000000c00e % 00000000000400000000000000000000000000000000000000000000000000000380000c632111 % 10919900000300000000000000000700000000200c0c0000070000000000000000c00d % 0000000000040000000000000000000000000000000000000000000000000000070000079e739f % b9cece00000180000000000000000e000000002004040000038000000000000000c00e % 00000000000400000000000000000000000000000000000000000000000000000e000000000000 % 000000000000c0000000000001e00c00000000000404000001c000000000000380c000 % 00000000000400000000000000000000000000000000000000000000000000001c000000000000 % 00000000000060000000000001fc180003bbcfe3c5c4700000c0000000000003f0c002 % 000000000004000000000000000000000000000000000000000000000000000038000000000000 % 00000000000030000000000001ffb800011424242664f8000060000000000003fec000 % 000000000004000000000000000000000000000000000000000000000000000070000000000000 % 0000000000001ffffffffffffffff00001a0e420e4248000007fffffffffffffffc002 % 000000000004000000000000000000000000000000000000000000000000000070000000000000 % 0000000000003ffffffffffffffff00000a3242324248000007fffffffffffffffc000 % 000000000004000000000000000000000000000000000000000000000000000038000000000000 % 00000000000070000000000001fe380000c464246464c80000e0000000000003fcc002 % 00000000000400000000000000000000000000000000000000000000000000001c000000080000 % 200003800000e0000000000001f01c000043be73b7ce700001c0000000000003e0c000 % 00000000000400000000000000000000000000000000000000000000000000000e000000080004 % 20000c400001c0000000000001800e000000000000000000018000000000000300c002 % 000000000004000000000000000000000000000000000000000000000000000007000000000004 % 0000384000038360000000000000060000000000000000000306c0000000000000c000 % 00000000000400000000000000000000000000000000000000000000000000000380001b99dfcf % 66e1c0400007012000000000000003000000000000000000070320000000000000c002 % 000000000004000000000000000000000000000000000000000000000000000001c0001cc88e64 % 23122080000e0140000000000000038000000000000000000e0220000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000e0000848d424 % 22122100001c00c000000000000001c000018000000187001c0220000000000000c002 % 000000000004000000000000000000000000000000000000000000000000000000700008485424 % 2211c1000038008000000000000000e00000800040009880180770000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000380008c86464 % 221203000070008000000000000000600000800040009080300000000000000000c002 % 0000000000040000000000000000000000000000000000000000000000000000001c000f9c23c7 % 773be30000e0030000000000000000300d388e1ef38f8080700000000000000000c000 % 0000000000040000000000000000000000000000000000000000000000000000000e0008000000 % 0002300001c000000000000000000038127c9f3147d88100e00000000000000000c002 % 000000000004000000000000000000000000000000000000000000000000000000070008000000 % 0006300003800000000000000000001c1d40902044108201c00000000000000000c000 % 00000000000400000000000000000000000000000000000000000000000000000003801c000000 % 0003c00007000000000000000000000e0340902044108201800000000000000000c002 % 00000000000400000000000000000000000000000000000000000000000000000001c000000000 % 000000000e00000000000000000000061164993146518603000000000000000000c000 % 00000000000400000000000000000000000000000000000000000000000000000000e000000000 % 000000001c00000000000000000000031e39ce1e738ec607000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000000000000007000000000 % 00000000380000000000000000000003800000000000000e000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000003fffffffff % fffffffff00000000000000000000001c00000000000001c000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000000000000007000000000 % 00000000380000000000000000000000e000000000000018000000000000000000c000 % 00000000000400000000000000000000000000000000000000000000000000000000e000000000 % 000000001c00000000000000000000006000000000000030000000000000000000c002 % 00000000000400000000000000000000000000000000000000000000000000000001c000000000 % 000000000e00000000000000000000003000000000000070000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000038000000000 % 000000000700000000000000000000003fffffffffffffe0000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000000000000070000000000 % 000000000380000000000000000000001fffffffffffffc0000000000000000000c000 % 0000000000040000000000000000000000000000000000000000000000000000000e0000000000 % 0000000001c0000000000000000000000000000000000000000000000000000000c002 % 0000000000040000000000000000000000000000000000000000000000000000001c0000000000 % 0000000000e0000000000000000000000000000000000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000380000000000 % 000000c18070000000000000000000000000000000000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000000000000700000000000 % 000000408038000000000000000000000000000000000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000e00000000000 % 00000040801c000000000000000000000000000000000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000000000001c42dcf9c78f3 % bf1f785c8e0e000000000000000000000000000000000000000000000000000000c000 % 0000000000040000000000000000000000000000000000000000000000000000038c66243ec599 % 1f8884669f07000000000000000000000000000000000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000000000007042424208109 % a8081c429003800000000000000000000000000000000000000000000000000000c000 % 00000000000400000000000000000000000000000000000000000000000000000e042424208108 % a80864429001c00000000000000000000000000000000000000000000000000000c002 % 00000000000400000000000000000000000000000000000000000000000000001c04642432c518 % cc888c469900e00000000000000000000000000000000000000000000000000000c000 % 00000000000400000000000000000000000000000000000000000000000000003803be7e1c78f0 % 471c767dce00700000000000000000000000000000000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000000000070000000000000 % 0000000000003fffffffffffffffe0000000000000000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000070000000000000 % 0000000000001fffffffffffffffe0000000000000000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000000000038000000000000 % 000000000000300000000000000020000000000000000000000000000000000000c000 % 00000000000400000000000000000000000000000000000000000000000000001c000000000000 % 000000000000600000000000000020000000000000000000000000000000000000c002 % 00000000000400000000000000000000000000000000000000000000000000000e000000000000 % 000000000000c00000000000000020000000000000000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000007000000000000 % 000e0000000186c000000000000020000000000000000000000000000000000000c002 % 000000000004000000000000000000000000000000000000000000000000000003800000000000 % 003100000003024000000000000020000000000000000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000001c00000000000 % 002100000006028000000000000020000000000000000000000000000000000000c00a % 000000000004000000000000000000000000000000000000000000000000000000e00000071ff9 % e7c10000000c0180000000000003fc000000000000000000000000000000000000c000 % 0000000000040000000000000000000000000000000000000000000000000000007000000f8843 % 3202000000180100000000000001fc000000000000000000000000000000000000c00a % 000000000004000000000000000000000000000000000000000000000000000000380000080842 % 1204000000300100000000000001fc000000000000000000000000000000000000c00a % 0000000000040000000000000000000000000000000000000000000000000000001c0000080842 % 1204000000600600000000000001f8000000000000000000000000000000000000c00a % 0000000000040000000000000000000000000000000000000000000000000000000e00000c8842 % 320c000000c00000000000000000f8000000000000000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000070000071ce1 % e70c000001800000000000000000f8000000000000000000000000000000000000c00a % 000000000004000000000000000000000000000000000000000000000000000000038000000000 % 0000000003000000000000000000f0000000000000000000000000000000000000c00a % 00000000000400000000000000000000000000000000000000000000000000000001c000000000 % 000000000600000000000000000070000000000000000000000000000000000000c00f % 00000000000400000000000000000000000000000000000000000000000000000000e000000000 % 000000000c00000000000000000070000000000000000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000000000000000007000000000 % 000000001800000000000000000060000000000000000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000000000000000003fffffffff % fffffffff000000000000000000020000000000000000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000000000000000001fffffffff % ffffffffe000000000000000000000000000000000000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 1b0000000000000000000000001000000000000000000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 0c8000000000000000000000001000000000000000000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 088000000000000000000003ee3c85f6e000000000000000000000000000000000c00e % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 0880000000000000000000011f118c831000000000000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 1dc000000000000000000001101084821000000000000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000001101084821000000000000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 00000000000000000000000119108c821000000000000000000000000000000000c008 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 0000000000000000000000038e1c77c73800000000000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000c000 % 000000000004000000000000000000000000000000000000000000000000000000000000000f03 % 000000000000000000000000000000000000000000000000000000000000000000c001 % 000000000004000000000000000000000000000000000000000000000000000000000000000fe3 % 000000000000000000000000000000000000000000000000000000000000000000c00c % 000000000004000000000000000000000000000000000000000000000000000000000000000fff % 000000000000000000000000000000000000000000000000000000000000000000c000 % 000000000007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % 000000000000000000000000000000000000000000000000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000000000000000000000fff % 000000000000000000000000000000000000000000000000000000000000000000c00d % 000000000000000000000000000000000000000000000000000000000000000000000000000ff3 % 000000000000000000000000000000000000000000000000000000000000000000c00e % 000000000000000000000000000000000000000000000000000000000000000000000000000f83 % 000000000000000000000000000000000000000000000000000000000000000000c00d % 000000000000000000000000000000000000000000000000000000000000000000000000000c03 % 0000000000000000000000001c7fe79f0000000000000000000000000000000000c00e % 000000000000000000000000000000000000000000000000000000000000000000000000000003 % 0000000000000000000000003e210cc80000000000000000000000000000000000c00d % 000000000000000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000202108480000000000000000000000000000000000c00e % 00000000000000000000000000000000000000000000000000000000000000000000000000001f % e00000000000000000000000202108480000000000000000000000000000000000c00d % 00000000000000000000000000000000000000000000000000000000000000000000000000001f % e00000000000000000000000322108c80000000000000000000000000000000000c00e % 00000000000000000000000000000000000000000000000000000000000000000000000000000f % e000000000000000000000001c73879c0000000000000000000000000000000000c00d % 00000000000000000000000000000000000000000000000000000000000000000000000000000f % c00000000000000000000000000000000000000000000000000000000000000000c00e % 00000000000000000000000000000000000000000000000000000000000000000000000000000f % c00000000000000000000000000000000000000000000000000000000000000000c00d % 000000000000000000000000000000000000000000000000000000000000000000000000000007 % c00000000000000000000000000000000000000000000000000000000000000000c00e % 000000000000000000000000000000000000000000000000000000000000000000000000000007 % 800000000000000000000000000000000000000000000000000000000000000000c00d % 000000000000000000000000000000000000000000000000000000000000000000000000000007 % 800000000000000000000000000000000000000000000000000000000000000000c00e % 000000000000000000000000000000000000000000000000000000000000000000000000000003 % 800000000000000000000000000000000000000000000000000000000000000000c00d % 000000000000000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000c00e % 000000000000000000000000000000000000000000000000000000000000000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000c00d % 00000000000000000000000000000000000000000000000000000000001fffffffffffffffffff % ffffffffffffffffffe00000000000000000000000000000000000000000000000c00e % 000000000000000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000000000000000000000000000000c00d % 000000000000000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000000000000000000000000000000c00e % 000000000000000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000000000000000000000000000000c00d % 000000000000000000000000000000000000000000000000000000000018000000040000000002 % 00000c400080000000200000000000000000000000000000000000000000000000c00e % 000000000000000000000000000000000000000000000000000000000018000000080000000022 % 000004440080000000200000000000000000000000000000000000000000000000c00d % 000000000000000000000000000000000000000000000000000000000018000000100000000020 % 000004040040000000200000000000000000000000000000000000000000000000c00e % 0000000000000000000000000000000000000000000000000000000000180000001373ee1e6e7e % 6ec3c4cfee40000000200000000000000000000000000000000000000000000000c00d % 00000000000000000000000000000000000000000000000000000000001800000013991f337322 % 332424444440000000200000000000000000000000000000000000000000000000c00e % 000000000000000000000000000000000000000000000000000000000018000000110910212122 % 2220e4446440000000200000000000000000000000000000000000000000000000c00d % 000000000000000000000000000000000000000000000000000000000018000000110910212122 % 222324442840000000200000000000000000000000000000000000000000000000c00e % 000000000000000000000000000000000000000000000000000000000018000000111919232322 % 222464442840000000200000000000000000000000000000000000000000000000c00d % 00000000000000000000000000000000000000000000000000000000001800000011f38e1e3e3f % 7773bee71040000000200000000000000000000000000000000000000000000000c00e % 000000000000000000000000000000000000000000000000000000000018000000110000002000 % 000000001040000000200000000000000000000000000000000000000000000000c00d % 000000000000000000000000000000000000000000000000000000000018000000090000002000 % 000000007080000000200000000000000000000000000000000000000000000000c00e % 000000000000000000000000000000000000000000000000000000000018000000038000007000 % 00000000c000000000200000000000000000000000000000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000000000000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000000000000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000000000000000000000000000000c002 % 0000000000000000000000000000000000000000000000000000000000180000e0000000060000 % 100000080000c00000200000000000000000000000000000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000018000100008000020000 % 100000180000400000200000000000000000000000000000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000018000100008000020000 % 000000080000560000200000000000000000000000000000000000000000000000c000 % 00000000000000000000000000000000000000000000000000000000001800039e3de79f02e783 % 70d0078b8e1e480000200000000000000000000000000000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000018000121628cc8033844 % 91200c4c5f31500000200000000000000000000000000000000000000000000000c000 % 0000000000000000000000000000000000000000000000000000000000180001074088480211c7 % 51d008085020780000200000000000000000000000000000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000018000119408848021640 % d03008085020480000200000000000000000000000000000000000000000000000c000 % 0000000000000000000000000000000000000000000000000000000000180001236288c80238c4 % 51140c4859314c0000200000000000000000000000000000000000000000000000c002 % 00000000000000000000000000000000000000000000000000000000001800039dbce79c03e767 % b9e4079cee1eee0000200000000000000000000000000000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000018000000000000000000 % 000400000000000000200000000000000000000000000000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000000000000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000000000000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000000000000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000000000000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000018000000000000000000 % 600000001e00000000200000000000000000000000000000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000018000000000000000000 % 900000002200000000200000000000000000000000000000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000018000000000000000000 % 900000002000000000200000000000000000000000000000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000018000f1e3c84fbc79dc0 % 67079e6e767dbb0000200000000000000000000000000000000000000000000000c002 % 0000000000000000000000000000000000000000000000000000000000180010b1638c442c4880 % a20c73312220cc8000200000000000000000000000000000000000000000000000c000 % 0000000000000000000000000000000000000000000000000000000000180003a0408440e80c81 % 120821212220888000200000000000000000000000000000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000018000ca0408443280501 % 0c0821212220888000200000000000000000000000000000000000000000000000c000 % 0000000000000000000000000000000000000000000000000000000000180011b1628c446c4501 % 8e0c63212220888000200000000000000000000000000000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000018000ede3c76e3b78200 % f3079e73f771ddc000200000000000000000000000000000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000018000000000000000200 % 000000000000000000200000000000000000000000000000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000018000000000000000e00 % 000000000000000000200000000000000000000000000000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000018000000000000001800 % 000000000000000000200000000000000000000000000000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000000000000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000000000000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000000000000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000018000003800002c04c40 % 000000000000000000200000000000000000000000000000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000018000004000002404448 % 000020020000000000200000000000000000000000000000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000018000004000000400408 % 000020020000000000200000000000000000000000000000000000000000000000c002 % 00000000000000000000000000000000000000000000000000000000001800000e70f0d65cc4de % ee06f9e79086800000200000000000000000000000000000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000018000004f90922664448 % 440922123189000000200000000000000000000000000000000000000000000000c002 % 0000000000000000000000000000000000000000000000000000000000180000048039d2424448 % 640ea072108e800000200000000000000000000000000000000000000000000000c000 % 00000000000000000000000000000000000000000000000000000000001800000480c832424448 % 2801a1921081800000200000000000000000000000000000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000018000004c91912464448 % 2808a2321188800000200000000000000000000000000000000000000000000000c000 % 00000000000000000000000000000000000000000000000000000000001800000e70ede77ceeee % 100f39db8ecf000000200000000000000000000000000000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000018000000000000000000 % 100000000000000000200000000000000000000000000000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000018000000000000000000 % 700000000000000000200000000000000000000000000000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000018000000000000000000 % c00000000000000000200000000000000000000000000000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000000000000000000000000000000000000000c00a % 000000000000000000000000000000000000000000000000000000000018000000000000000000 % 000000000000000000200000000000040000000000000000000000000000000000c000 % 00000000000000000000000000000000000000000000000000000000001fffffffffffffffffff % ffffffffffffffffffe00000000000040000000000000000000000000000000000c00a % 000000000000000000000000000000000000000000000000000000000000000000000038000000 % 0000007000000000000000000000f9cf217db80000000000000000000000000000c00a % 000000000000000000000000000000000000000000000000000000000000000000000070000000 % 000000380000000000000000000043e46320c40000000000000000000000000000c00a % 0000000000000000000000000000000000000000000000000000000000000000000000e0000000 % 0000001c0000000000000000000042042120840000000000000000000000000000c000 % 0000000000000000000000000000000000000000000000000000000000000000000001c0000000 % 0000000e0000000000000000000042042120840000000000000000000000000000c00a % 000000000000000000000000000000000000000000000000000000000000000000000380000000 % 000000070000000000000000000043242320840000000000000000000000000000c00a % 000000000000000000000000000000000000000000000000000000000000000000000700000600 % 0060000380000000000000000000e1c71df1ce0000000000000000000000000000c00f % 000000000000000000000000000000000000000000000000000000000000000000000e00000200 % 00200001c000000000000000000000000000000000000000000000000000000000c00e % 000000000000000000000000000000000000000000000000000000000000000000001c00000200 % 00200000e000000000000000000000000000000000000000000000000000000000c00e % 000000000000000000000000000000000000000000000000000000000000000000003800003e21 % 3c2000007000000000000000000000000000000000000000000000000000000000c00e % 000000000000000000000000000000000000000000000000000000000000000000007000006263 % 422000003800000000000000000000000000000000000000000000000000000000c00e % 00000000000000000000000000000000000000000000000000000000000000000000e000004221 % 0e2000001c00000000000000000000000000000000000000000000000000000000c00e % 00000000000000000000000000000000000000000000000000000000000000000001c000004221 % 322000000e00000000000000000000000000000000000000000000000000000000c00e % 000000000000000000000000000000000000000000000000000000000000000000038000004623 % 462000000700000000000000006000000180003000000000000000000000000000c00e % 000000000000000000000000000000000000000000000000000000000000000000070000003b1d % bb7000000380000000000700002000100080001000000000000000000000000000c00e % 0000000000000000000000000000000000000000000000000000000000000000000e0000000000 % 0000000001c00000000007e0002000100080001000000000000000000000000000c00e % 0000000000000000000000000000000000000000000000000000000000000000001c0000000000 % 0000000000e00000000007fc0023c37c0f884f1000000000000000000000000000c00e % 000000000000000000000000000000000000000000000000000ffffffffffffffff80000000000 % 00000000007fffffffffffff802664901898d09000000000000000000000000000c000 % 000000000000000000000000000000000000000000000000000ffffffffffffffff80000000000 % 00000000003fffffffffffff802427501088439000000000000000000000000000c000 % 000000000000000000000000000000000000000000000000000c000000000000001c0000000000 % 0000000000600000000007fc002420d010884c9000000000000000000000000000c000 % 000000000000000000000000000000000000000000000000000c000000000000000e0003800002 % c0c00e0000c00000000007e0002464501188d19000000000000000000000000000c008 % 000000000000000000000000000000000000000000000000000c00000000000000070004000002 % 4040310001800000000007000073c79c0ec76ef800000000000000000000000000c000 % 000000000000000000000000000000000000000000000000000c0000000000001b038004000000 % 404021000303600000000000000000000000000000000000000000000000000000c000 % 000000000000000000000000000000000000000000000000000c0000000000000901c00e70f0d6 % 5c4701000601900000000000000000000000000000000000000000000000000000c000 % 000000000000000000000000000000000000000000000000000c0000000000000a00e004f90922 % 664f82000c01100000000000000000000000000000000000000000000000000000c001 % 000000000000000000000000000000000000000000000000007f800000000000060070048039d2 % 424804001801100000000000000000000000000000000000000000000000000000c00c % 000000000000000000000000000000000000000000000000007f8000000000000400380480c832 % 424804003003b80000000000000000000000000000000000000000000000000000c000 % 000000000000000000000000000000000000000000000000007f00000000000004001c04c91912 % 464c8c00600000000000000000e00000b013100000000000000000000000000000c000 % 000000000000000000000000000000000000000000000000003f00000000000018000e0e70ede7 % 7ce70c00c000000000000000010000009011120000000000000000000000000000c00d % 000000000000000000000000000000000000000000000000003f00000000000000000700000000 % 000000018000000000000000010000001001020000000000000000000000000000c00e % 000000000000000000000000000000000000000000000000003e00000000000000000380000000 % 000000030000000000000000039c3c35973137bb80000000000000000000000000c00d % 000000000000000000000000000000000000000000000000001e000000000000000001c0000000 % 000000060000000000000000013e42489991121100000000000000000000000000c00e % 000000000000000000000000000000000000000000000000001e000000000000000000e0000000 % 0000000c000000000000000001200e749091121900000000000000000000000000c00d % 000000000000000000000000000000000000000000000000001c00000000000000000070000000 % 0000001800000000000000000120320c9091120a00000000000000000000000000c00e % 000000000000000000000000000000000000000000000000000c00000000000000000038000000 % 000000300000000000000000013246449191120a00000000000000000000000000c00d % 000000000000000000000000000000000000000000007fffffffffffff8000000000001fffffff % ffffffe00000000000000000039c3b79df3bbb8400000000000000000000000000c00e % 00000000000000000000000000000000000000000000ffffffffffffffc000000000000fffffff % ffffffc00000000000000000000000000000000400000000000000000000000000c00d % 00000000000000000000000000000000000000000001c0000000000000e0000000000000000000 % 000000000000000000000000000000000000001c00000000000000000000000000c00e % 000000000000000000000000000000000000000000038000000000000070000000000000000000 % 000000000000000000000000000000000000003000000000000000000000000000c00d % 000000000000000000000000000000000000000000070000000000000038000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000c00e % 0000000000000000000000000000000000000000000e000000000000001c000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000c00d % 0000000000000000000000000000000000000000001c000001000006000e000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000c00e % 000000000000000000000000000000000000000000380000010000020007000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000c00d % 000000000000000000000000000000000000000000700000000000020003800000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000c00e % 000000000000000000000000000000000000000000e0006efb3763c20001c00000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000c00d % 000000000000000000000000000000000000000001c00073411994220000e00000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000c00e % 000000000000000000000000000000000000000003800021411110e20000700000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000c00d % 000000000000000000000000000000000000000007000021411113220000380000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000c00e % 00000000000000000000000000000000000000000e0000234111146200001c0000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000c00d % 00000000000000000000000000000000000000001c00003ee3bbbbb700000e0000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000c00e % 000000000000000000000000000000000000000038000020000000000000070000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000c00d % 000000000000000000000000000000000000000070000020000000000000038000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000c00e % 0000000000000000000000000000000000000000e000007000000000000001c000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000c00d % 0000000000000000000000000000000fffffffffc000000000000000000000ffffffffffffffff % 000000000000000000000000000000000000000000000000000000000000000000c00e % 0000000000000000000000000000000c00000000e000000000000000000001c000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000c00d % 0000000000000000000000000000000c0000000070000e00001303003800038000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000c00e % 0000000000000000000000000000000c000000003800100000110100c400070000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000c00d % 0000000000000000000000000000000c0000006c1c0010000001010084000e0000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000c00e % 0000000000000000000000000000000c000000240e0039c3c371711c04001c1b00000000000003 % 000000000000000000000000000000000000000000000000000000000000000000c00d % 0000000000000000000000000000000c00000028070013e42491993e0800380c80000000000003 % 000000000000000000000000000000000000000000000000000000000000000000c00e % 0000000000000000000000000000007f8000001803801200e7510920100070088000000000001f % e00000000000000000000000000000000000000000000000000000000000000000c000 % 0000000000000000000000000000007f8000001001c0120320d109201000e0088000000000001f % e00000000000000000000000000000000000000000000000000000000000000000c002 % 0000000000000000000000000000003f8000001000e01324645119323001c01dc000000000000f % e00000000000000000000000000000000000000000000000000000000000000000c000 % 0000000000000000000000000000003f00000060007039c3b7b9f39c300380000000000000000f % c00000000000000000000000000000000000000000000000000000000000000000c002 % 0000000000000000000000000000003f000000000038000000000000000700000000000000000f % c00000000000000000000000000000000000000000000000000000000000000000c000 % 0000000000000000000000000000001f00000000001c000000000000000e000000000000000007 % c00000000000000000000000000000000000000000000000000000000000000000c002 % 0000000000000000000000000000001e00000000000e000000000000001c000000000000000007 % 800000000000000000000000000000000000000000000000000000000000000000c000 % 0000000000000000000000000000001e0000000000070000000000000038000000000000000007 % 800000000000000000000000000000000000000000000000000000000000000000c002 % 0000000000000000000000000000000e0000000000038000000000000070000000000000000003 % 800000000000000000000000000000000000000000000000000000000000000000c000 % 0000000000000000000000000000000c000000000001c0000000000000e0000000000000000003 % 000000000000000000000000000000000000000000000000000000000000000000c002 % 0000000000000000000000000000000c000000000000ffffffffffffffc00000000001ffffffff % fffffffe0000000000000000000000000000000000000000000000000000000000c000 % 000000000000000000000000000000040000000000007fffffffffffff800000000003ffffffff % ffffffff0000000000000000000000000000000000000000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000000000000000700000000 % 000000038000000000000000000000000000000000000000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000000000000000e00000000 % 00000001c000000000000000000000000000000000000000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000000000000001c00000000 % 00000000e000000000000000000000000000000000000000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000000000000003800000000 % 000000007000000000000000000000000000000000000000000000000000000000c002 % 0000000000000000000000000000000000000000000000000000000000000000000070000c0000 % 0000c0033800000000000000000000000000000000000000000000000000000000c000 % 00000000000000000000000000000000000000000000000000000000000000000000e000040000 % 000040011c00000000000000000000000000000000000000000000000000000000c002 % 00000000000000000000000000000000000000000000000000000000000000000001c000040000 % 000040010e00000000000000000000000000000000000000000000000000000000c000 % 00000000000000000000000000000000000000000000000000000000000000000003842dc5c788 % 4dc7c71f0700000000000000000000000000000000000000000000000000000000c002 % 000000000000000000000000000002000000000000000000000000000000000000070c66266cd8 % c62c4fb10380000000000000000000000000000000000000000000000000000000c000 % 0000000000000000000000000000020000000000000000000000000000000000000e0424242848 % 4428482101c0000000000000000000000000000000000000000000000000000000c002 % 000000000000000000000000007ce790bedc0000000000000000000000000000001c0424242848 % 4428482100e0000000000000000000000000000000000000000000000000000000c000 % 0000000000000000000000000021f23190620000000000000000000000000000003804642468c8 % c428cca30070000000000000000000000000000000000000000000000000000000c002 % 0000000000000000000000000021021090420000000000000000000000000000007003be77c787 % 6e77671d8038000000000000000000000000000000000000000000000000000000c000 % 000000000000000000000000002102109042000000000000000000000000000000e00000000000 % 00000000001c000000000000000000000000000000000000000000000000000000c002 % 000000000000000000000000002192119042000000000000000000000000000001c00000000000 % 00000000000e000000000000000000000000000000000000000000000000000000c000 % 0000000000000000000000000070e38ef8e7000000000000000000000000000003800000000000 % 000000000007000000000000000000000000000000000000000000000000000000c002 % 0000000000000000000000000000000000000000000000000000000001ffffffff000000000000 % 000000000003ffffffffffffffc000000000000000000000000000000000000000c000 % 0000000000000000000000000000000000000000000000000000000001ffffffff000000000000 % 000000000003ffffffffffffffc000000000000000000000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000100000001800000000000 % 000000000007000000000000004000000000000000000000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000100000000c00000000000 % 000030e0000e000000000000004000000000000000000000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000100000000600000000000 % 08001310001c000000000000004000000000000000000000000000000000000000c000 % 0000000000000000000000000000000000000000000000000000000001000001b0300000000000 % 080012100038360000000000004000000000000000000000000000000000000000c002 % 000000000000000000000000000000200000c00000000000000000000100000090180039df71c7 % 9e71f0100070190000000000004000000000000000000000000000000000000000c000 % 0000000000000000000000000000042000004000000000000000000001000000a00c007c5b9bec % 48fb102000e011000000000007fc00000000000000000000000000000000000000c002 % 000000000000000000000000000004000000400000000000000000000100000060060040210a08 % 0882104001c011000000000007fc00000000000000000000000000000000000000c000 % 00000000000000000000000001e6ef66ec3c400000000000000000000100000040030040710a08 % 0882104003803b800000000003f800000000000000000000000000000000000000c002 % 000000000000000000000000033734233242400000000000000000000100000040018064991b2c % 48ca30c0070000000000000003f800000000000000000000000000000000000000c000 % 00000000000000000000000002121422220e40000000000000000000010000018000c039ddf1c7 % 8e71d8c00e0000000000000003f800000000000000000000000000000000000000c002 % 000000000000000000000000021214222232400000000000000000000100000000006000010000 % 000000001c0000000000000001f000000000000000000000000000000000000000c000 % 000000000000000000000000023234222246400000000000000000000100000000003000010000 % 00000000380000000000000001f000000000000000000000000000000000000000c002 % 00000000000000000000000001e3e777773be00000000000000000000100000000001800038000 % 00000000700000000000000001f000000000000000000000000000000000000000c000 % 000000000000000000000000000200000000000000000000000000000100000000000c00000000 % 00000000e00000000000000000e000000000000000000000000000000000000000c002 % 000000000000000000000000000200000000000000000000000000001ff0000000000600000000 % 00000001c00000000000000000e000000000000000000000000000000000000000c000 % 000000000000000000000000000700000000000000000000000000001fe0000000000300000000 % 00000003800000000000000000e000000000000000000000000000000000000000c00a % 000000000000000000000000000000000000000000000000000000000fe00000000001ffffffff % ffffffff000000000003fffffffffffff800000000000000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000fe0000000000000000000 % 000000000000000000070000000000001c00000000000000000000000000000000c00a % 000000000000000000000000000000000000000000000000000000000fc0000000000000000000 % 0000000000000000000e0000000000000e00000000000000000000000000000000c00a % 0000000000000000000000000000000000000000000000000000000007c0000000000000000000 % 0000000000000000001c0000000000000700000000000000000000000000000000c00a % 0000000000000000000000000000000000000000000000000000000007c0000000000000000000 % 000000000000000000380000000000000380000000000000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000780000000000000000000 % 0000000000000000007000000000000001c0000000000000000000000000000000c00a % 000000000000000000000000000000000000000000000000000000000380000000000000000000 % 000000000000000000e000000000000000e0000000000000000000000000000000c00a % 000000000000000000000000000000000000000000000000000000000380000000000000000000 % 000000000000000001c00000000000000070000000000000000000008000000000c00f % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 000000000000000003800000000000000038000000000000000000008000000000c00e % 000000000000000000000000000000000000000000000000000000000100000000000000000000 % 00000000000000000700000000000000001c00000000000000001f39e427f70000c00e % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000e00000000000000000e0000000000000000087c8c62188000c00e % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000001c000000000000000007000000000000000008408422108000c00e % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000038000000000000000003800000000000000008408422108000c00e % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000070000000000003800001c00000000000000008648462108000c00e % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000e000000000008c400000e0000000000080001c38e3b739c000c00e % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000001c0000000000088400000700000000000f00000000000000000c00e % 000000000000000000000000000000000000000000000000000000008000000000000000000000 % 0000000000000003800001b885b9e0400000380000000000fe0000000000000000c00e % 000000000000000000000000000000000000000000000000000000008000000000000000000000 % 0000000000000007000001cd8cc4808000001c0000000000ffc000000000000000c00e % 00000000000000000000000000000000000000000000000000001f39e427f70000000000000000 % 000000000000000e000000848484810000000fffffffffffffe000000000000000c000 % 0000000000000000000000000000000000000000000000000000087c8c62188000000000000000 % 0000000000000007000000848484810000001c0000000000ffc000000000000000c000 % 000000000000000000000000000000000000000000000000000008408422108000000000000000 % 00000000000000038000008c8c8483000000380000000000fe0000000000000000c000 % 000000000000000000000000000000000000000000000000000008408422108000000000000000 % 0000000000000001c00000f877cee3000000700000000000f00000000004000000c008 % 000000000000000000000000000000000000000000000000000008648462108000000000000000 % 0000000000000000e0000080000000000000e0d800000000000000000004000000c000 % 00000000000000000000000000000000000000000000000000001c38e3b739c000000000000000 % 000000000000000070000080000000000001c0480000000000001b884dcf000000c000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000380001c000000000000380500000000000001cd8c624000000c000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000001c000000000000000007003000000000000008484424000000c001 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000e00000000000000000e002000000000000008484424000000c00c % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000700000000000000001c002000000000000008c8c424000000c000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000380000000000000003800c00000000000000f876e77000000c000 % 000000000000000000000000000000000000000000000000000000460000620000000000000000 % 000000000000000001c00000000000000070000000000000000008000000000000c00d % 000000000000000000000000000000000000000000000000000000820000220000000000000000 % 000000000000000000e000000000000000e0000000000000000008000000000000c00e % 000000000000000000000000000000000000000000000000000001020000210000000000000000 % 0000000000000000007000000000000001c000000000000000001c000000000000c00d % 0000000000000000000000000000000000000000000000000000013e211e210000000000000000 % 000000000000000000380000000000000380000000000000000000000000000000c00e % 000000000000000000000000000000000000000000000000000001626321210000000000000000 % 0000000000000000001c0000000000000700000000000000000000000000000000c00d % 000000000000000000000000000000000000000000000000000001422107210000000000000000 % 0000000000000000000e0000000000000e00000000000000000000000000000000c00e % 000000000000000000000000000000000000000000000000000001422119210000000000000000 % 00000000000000000007fffffffffffffc00000000000000000000000000000000c00d % 000000000000000000000000000000000000000000000000000001462323210000000000000000 % 00000000000000000003fffffffffffff800000000000000000000000000000000c00e % 0000000000000000000000000000000000000000000000000000013b1d9df10000000000000000 % 000000000000000000000000004000000000000000000000000000000000000000c00d % 000000000000000000000000000000000000000000000000000001000000010000000000000000 % 000000000000000000000000004000000000000000000000000000000000000000c00e % 000000000000000000000000000000000000000000000000000000800000020000000000000000 % 000000000000000000000000004000000000000000000000000000000000000000c00d % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000004000000000000000000000000000000000000000c00e % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000046c0000000000000000000000000000000000000c00d % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000004320000000000000000000000000000000000000c00e % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000004220000000000000000000000000000000000000c00d % 00000000000000000000000000000000000000000000000000000600000000c003000000000000 % 000000000000000000000000004220000000000000000000000000000000000000c00e % 000000000000000000000000000000000000000000000000000002000000004001000000000000 % 000000000000000000000000004770000000000000000000000000000000000000c00d % 000000000000000000000000000000000000000000000000000002000000004001000000000000 % 000000000000000000000000004000000000000000000000000000000000000000c00e % 000000000000000000000000000000000000000000000000042dc2e7884dc7c71f000000000000 % 000000000000000000000000004000000000000000000000000000000000000000c00d % 0000000000000000000000000000000000000000000000000c66233cd8c62c4fb1000000000000 % 000000000000000000000000004000000000000000000000000000000000000000c00e % 000000000000000000000000000000000000000000000000042422184844284821000000000000 % 000000000000000000000000004000000000000000000000000000000000000000c00d % 000000000000000000000000000000000000000000000000042422184844284821000000000000 % 000000000000000000000000004000000000000000000000000000000000000000c00e % 00000000000000000000000000000000000000000000000004642238c8c428cca3000000000000 % 00000000000000000000000007fc00000000000000000000000000000000000000c00d % 00000000000000000000000000000000000000000000000003be73e7876e77671d800000000000 % 00000000000000000000000007fc00000000000000000000000000000000000000c00e % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000003f800000000000000000000000000000000000000c00d % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000003f800000000000000000000000000000000000000c00e % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000003f800000000000000000000000000000000000000c00d % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000001f000000000000000000000000000000000000000c00e % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000001f000000000000000000000000000000000000000c00d % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000001f000000000000000000000000000000000000000c00e % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000e000000000000000000000000000000000000000c00d % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000e000000000000000000000000000000000000000c00e % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000e000000000000000000000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000003fffffffffffffffffffffffffffffffffff8000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000002000000000000000000000000000000000008000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000002000000000000000000000000000000000008000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000002000000000000000000000000000000000008000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000002000000000000000000000000000000000008000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000002000000000000000000000000000000000008000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000002000000000801000000000200000000000008000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000002000000008803010000000200008000000008000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000200000000800d010000000000008000000008000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000200000001f87173ce6e03767779e000000008000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000002000000008889891f31039a22cc8000000008000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000002000000008889091021010a34848000000008000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000002000000008871091021010a14848000000008000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000002000000008881091921011a188c8000000008000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000200000000fcfb9dce7381f70878e000000008000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000200000000008c000000010000000000000008000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000200000000018c000000010000000000000008000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000020000000000f0000000038000000000000008000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000002000000000000000000000000000000000008000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000002000000000000000000000000000000000008000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000002000018000040000000000000000000000008000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000002000008000840000000000000000200000008000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000002000008000800000000000000000200000008000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000200d709c3dec79b81b8f3e79bb0e79cf8d008000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000002012f8be6284ccc41cd09084cc9f23e412008000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000201d80a0408484840843901c889022041d008000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000200380a040848484084c90648890220403008000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000002011c8b262848c8408d1908c8899232411008000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000201e71dc3cee79ce0f8ef877ddce39ce1e008000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000002000000000000000080000000000000000008000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000002000000000000000080000000000000000008000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000020000000000000001c0000000000000000008000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000002000000000000000000000000000000000008000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000002000000000000000000000000000000000008000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000002000000000000000000000000000000000008000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000003fffffffffffffffffffffffffffffffffff8000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000003fffffffffffffffffffffffffffffffffff8000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000004000000000000000000000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000004000000000000000000000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000004000000000000000000000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000004000000000000000000000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000004000000000000000000000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000004000000000000000000000000000000000000000c002 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000004000000000000000000000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000004000000000000000000000000000000000000000c00a % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000004000000000000000000000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000004000000000000000000000000000000000000000c00a % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000004000000000000000000000000000000000000000c00a % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000004000000000000000000000000000000000000000c00a % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000004000000000000000000000000000000000000000c000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000004000000000000000000000000000000000000000c00a % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000004000000000000000000000000000000000000000c00a % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000004000000000000000000000000000000000000000c00f % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000007fffffffffffffffffffffffffffffffffffffffc00e % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000007fffffffffffffffffffffffffffffffffffffffc00e % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000e % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000e % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000e % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000e % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000e % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000e % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000e % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000e % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000000000 %%EndPreview save /d_sv_obj exch def userdict /IslandDrawDict 300 dict dup begin put /bdef {bind def} bind def /E {exch} bdef /FF {findfont} bdef /MF {makefont} bdef /RO {rotate} bdef /SC {scale} bdef /SF {setfont} bdef /SG {setgray} bdef /TR {translate} bdef /bp {lj lw rgb} bdef /bpbw {lj lw setgray} bdef /c {curveto} bdef /cl {closepath} bdef /fi {eofill} bdef /g {setgray} bdef /gr {grestore} bdef /gs {gsave} bdef /l {lineto} bdef /lj {setlinejoin} bdef /lw {setlinewidth} bdef /m {moveto} bdef /n {newpath} bdef /nx {/x E def} bdef /r {rmoveto} bdef /rl {rlineto} bdef /rgb {setrgbcolor} bdef /s {show} bdef /sd {setdash} bdef /sp {x 0 rmoveto} bdef /ss {currentpoint pop E m} bdef /st {stroke} bdef %% pattern stuff /BPSIDE 32 def %% pixels per pattern side /PATFREQ 3.0 def %% pattern pixels per mm /dp_mat [PATFREQ 0 0 PATFREQ 0 0] def /dp_pw BPSIDE def %% pattern pixel width /dp_ph BPSIDE def %% pattern pixel height /dp_w dp_pw PATFREQ div def %% pattern mm width /dp_h dp_ph PATFREQ div def %% pattern mm height /savemat matrix def /topmat matrix def /patmat matrix def %% catch nocurrentpoint error for: pathbbox /ncpoint errordict /nocurrentpoint get def errordict begin /nocurrentpoint { dup /pathbbox load eq {pop 0 0 1 1} {ncpoint} ifelse } bdef end /ar { %% sa ea sx sy rot tx ty matrix currentmatrix 8 1 roll TR RO SC n 0 0 1 5 3 roll arc setmatrix } bdef /arn { %% sa ea sx sy rot tx ty TR RO SC matrix currentmatrix 8 1 roll n 0 0 1 5 3 roll arcn setmatrix } bdef /el { %% sx sy rot tx ty matrix currentmatrix 6 1 roll TR RO SC n 0 0 1 0 360 arc setmatrix cl } bdef /image_raster { %% sw sh sd dw dh xs ys TR SC /sd E def /sh E def /sw E def /imagebuf sw sd mul 7 add 8 idiv string def sw sh sd [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop} image } bdef /imagemask_raster { TR SC /sh E def /sw E def /imagebuf sw 7 add 8 idiv string def sw sh false [sw 0 0 sh 0 0] {currentfile imagebuf readhexstring pop} imagemask } bdef /dither_color_raster { % bool sw sh sd dw dh xs ys TR SC /sd E def /sh E def /sw E def sd 8 eq and { /imagebuf 3 string def /grayval 1 string def sw sh sd [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop pop imagebuf 0 get 0.299 mul imagebuf 1 get 0.587 mul add imagebuf 2 get 0.114 mul add cvi grayval exch 0 exch put grayval } image } { /imagebuf sw 3 mul sd mul 7 add 8 idiv string def sh { currentfile imagebuf readhexstring pop pop } repeat } ifelse } bdef /image_color_raster { % bool sw sh sd dw dh xs ys /colorimage where not { dither_color_raster } { pop TR SC /sd E def /sh E def /sw E def pop /imagebuf sw 3 mul sd mul 7 add 8 idiv string def sw sh sd [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop} false 3 colorimage } ifelse } bdef /patpath { /inv E def topmat setmatrix pathbbox %% get lo - hi indecies /hy E dp_h div floor cvi def /hx E dp_w div floor cvi def /ly E dp_h div floor cvi def /lx E dp_w div floor cvi def lx 1 hx { dp_w mul ly 1 hy { dp_h mul E dup 3 1 roll E patmat currentmatrix pop TR dp_pw dp_ph inv dp_mat dp_proc imagemask patmat setmatrix } for pop } for } bdef % setpattern brush of patterns instead of gray /setpattern { /blue E def /green E def /red E def /freq E def /bwidth E def /bpside E def /bstring E def /onbits 0 def /offbits 0 def freq 0 {/y E def /x E def /xindex x 1 add 2 div bpside mul cvi def /yindex y 1 add 2 div bpside mul cvi def bstring yindex bwidth mul xindex 8 idiv add get not 1 7 xindex 8 mod sub bitshift and 0 ne {/onbits onbits 1 add def 1} {/offbits offbits 1 add def 0} ifelse } setscreen {} settransfer systemdict /setcmykcolor known { /fact 1 onbits offbits onbits add div sub def 1 red sub fact mul 1 green sub fact mul 1 blue sub fact mul 0 setcmykcolor } { offbits offbits onbits add div setgray} ifelse } bdef /dmatrix matrix def /dpi 72 0 dmatrix defaultmatrix dtransform dup mul E dup mul add sqrt def /B {gs bp st gr} bdef %% brush: gr lw lj /Bbw {gs bpbw st gr} bdef %% brush: gr lw lj /F {gs rgb eofill gr} bdef %% fill: gr /Fbw {gs setgray eofill gr} bdef %% fill: gr /PB {gs lj lw setpattern st gr} bdef /PF {gs eoclip patpath gr} bdef /BB {gs rgb lj lw strokepath clip patpath gr} bdef /xdef {exch def} bdef /clip_region { /ht xdef /wd xdef /bm xdef /lm xdef newpath lm bm moveto 0 ht rlineto wd 0 rlineto 0 ht neg rlineto closepath clip } bdef %! Island text prolog Version 3.1 %% %%BeginProlog /reencode_small_dict 12 dict def /ReencodeSmall { reencode_small_dict begin /new_codes_and_names exch def /new_font_name exch def /base_font_name exch def /base_font_dict base_font_name findfont def /newfont base_font_dict maxlength dict def base_font_dict { exch dup /FID ne { dup /Encoding eq { exch dup length array copy newfont 3 1 roll put } { exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall newfont /FontName new_font_name put new_codes_and_names aload pop new_codes_and_names length 2 idiv { newfont /Encoding get 3 1 roll put } repeat new_font_name newfont definefont pop end %reencode_small_dict } def /extended_Zapf [ 8#223 /a89 8#224 /a90 8#225 /a93 8#226 /a94 8#227 /a91 8#230 /a92 8#231 /a205 8#232 /a85 8#233 /a206 8#234 /a86 8#235 /a87 8#236 /a88 8#237 /a95 8#240 /a96 ] def /extended_Standard [ 29 /thorn 30 /yacute 31 /divide 128 /Acircumflex 129 /Adieresis 130 /Agrave 131 /Aring 132 /Atilde 133 /Ccedilla 134 /Eacute 135 /Ecircumflex 136 /Edieresis 137 /Egrave 138 /Iacute 139 /Icircumflex 140 /Idieresis 141 /Igrave 142 /Ntilde 143 /Oacute 144 /Ocircumflex 145 /Odieresis 146 /Ograve 147 /Otilde 148 /Scaron 149 /Uacute 150 /Ucircumflex 151 /Udieresis 152 /Ugrave 153 /Ydieresis 154 /Zcaron 155 /aacute 156 /acircumflex 157 /adieresis 158 /agrave 159 /aring 160 /atilde 161 /exclamdown 162 /cent 163 /sterling 164 /fraction 165 /yen 166 /florin 167 /section 168 /currency 169 /quotesingle 170 /quotedblleft 171 /guillemotleft 172 /guilsinglleft 173 /guilsinglright 174 /fi 175 /fl 176 /plusminus 177 /endash 178 /dagger 179 /daggerdbl 180 /periodcentered 181 /twosuperior 182 /paragraph 183 /bullet 184 /quotesinglbase 185 /quotedblbase 186 /quotedblright 187 /guillemotright 188 /ellipsis 189 /perthousand 190 /threesuperior 191 /questiondown 192 /mu 193 /grave 194 /acute 195 /circumflex 196 /tilde 197 /macron 198 /breve 199 /dotaccent 200 /dieresis 201 /onesuperior 202 /ring 203 /cedilla 204 /onequarter 205 /hungarumlaut 206 /ogonek 207 /caron 208 /emdash 209 /ccedilla 210 /copyright 211 /eacute 212 /ecircumflex 213 /edieresis 214 /egrave 215 /iacute 216 /icircumflex 217 /idieresis 218 /igrave 219 /logicalnot 220 /minus 221 /ntilde 222 /oacute 223 /ocircumflex 224 /odieresis 225 /AE 226 /onehalf 227 /ordfeminine 228 /ograve 229 /otilde 230 /registered 231 /scaron 232 /Lslash 233 /Oslash 234 /OE 235 /ordmasculine 236 /trademark 237 /uacute 238 /ucircumflex 239 /udieresis 240 /ugrave 241 /ae 242 /ydieresis 243 /zcaron 244 /Aacute 245 /dotlessi 246 /threequarters 247 /Eth 248 /lslash 249 /oslash 250 /oe 251 /germandbls 252 /multiply 253 /Yacute 254 /Thorn 255 /eth ] def /extended_Symbol [ ] def /extend_font { % stack: fontname newfontname exch dup (ZapfDingbats) eq { cvn exch cvn extended_Zapf ReencodeSmall } { dup (Symbol) eq { cvn exch cvn extended_Symbol ReencodeSmall } { cvn exch cvn extended_Standard ReencodeSmall } ifelse } ifelse } bind def /extend_font_name { % stack: font_name_string dup length 1 add string /extended_font_name exch def extended_font_name 0 (_) putinterval extended_font_name 1 3 -1 roll putinterval extended_font_name } bind def /gf { /f exch def f cvn where { f exch begin cvn load exec setfont end } { f 0 f length 8 sub getinterval dup /localfont exch extend_font_name def localfont extend_font localfont findfont /xsz f f length 4 sub 4 getinterval cvi def /ysz f f length 8 sub 4 getinterval cvi def [ xsz 0 0 ysz neg 0 0 ] makefont dup f cvn exch def setfont } ifelse } bind def /gfns { /f exch def f cvn where { f exch begin cvn load exec setfont end } { f 0 f length 8 sub getinterval cvn findfont /xsz f f length 4 sub 4 getinterval cvi def /ysz f f length 8 sub 4 getinterval cvi def [ xsz 0 0 ysz neg 0 0 ] makefont dup f cvn exch def setfont } ifelse } bind def /ul { % space drop thickness gs currentpoint currentlinewidth currentpoint n m 6 -3 roll lw 0 exch r 0 rl st lw m gr } bind def /nxtab { currentpoint pop 1000.0 mul cvi tab mod tab exch sub 1000.0 div 0 rmoveto } bind def /nx { /x exch def } bind def 0. nx %%EndProlog gsave 2.83465 -2.83465 scale 0 -279.4 translate topmat currentmatrix pop n savemat currentmatrix pop [1 0 0 1 102.5 113.642] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -598 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(dy_duenna\)) s -1292 0 m 215 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (preventative maintenance,) s -678 215 m 431 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (error recovery) s savemat setmatrix n 78.75 110 m 126.25 110 l 126.25 122.5 l 78.75 122.5 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 102.5 76.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -682 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(dy_dualpivot\)) s -1160 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (select entering variable;) s -556 231 m 463 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (pivot basis;) s -1092 463 m 695 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (update variables, DSE) s -1082 695 m 927 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (norms, reduced costs;) s -894 927 m 1159 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (select next leaving) s -386 1159 m 1391 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (variable) s savemat setmatrix n 81.25 72.5 m 123.75 72.5 l 123.75 102.5 l 81.25 102.5 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 102.5 44.146] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -606 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(dy_dualout\)) s -1068 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (select leaving variable) s savemat setmatrix n 81.25 40 m 123.75 40 l 123.75 50 l 81.25 50 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 102.5 156.338] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -708 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(preoptimality\)) s -914 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (factor basis, check) s -956 231 m 463 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (accuracy & confirm) s -806 463 m 695 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (feasibility status) s savemat setmatrix n 81.25 152.5 m 123.75 152.5 l 123.75 170 l 81.25 170 l 81.25 152.5 l cl gsave 0 0 0 0.176 0 B grestore n 102.5 40 m 101.49 36.972 l 103.51 36.972 l cl 0 0 0 F n 102.5 30 m 102.5 36.972 l gsave 0 0 0 0.176 0 B grestore n 102.5 72.5 m 101.49 69.472 l 103.51 69.472 l cl 0 0 0 F n 102.5 62.5 m 102.5 69.472 l gsave 0 0 0 0.176 0 B grestore n 102.5 110 m 101.49 106.97 l 103.51 106.97 l cl 0 0 0 F n 102.5 102.5 m 102.5 106.97 l gsave 0 0 0 0.176 0 B grestore n 102.5 132.5 m 92.5 132.5 l 87.5 137.5 l 92.5 142.5 l 112.5 142.5 l 117.5 137.5 l 112.5 132.5 l 102.5 132.5 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 102.5 137.432] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -688 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (unrecoverable) s -294 0 m 215 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (error?) s savemat setmatrix n 102.5 122.5 m 92.5 122.5 l 87.5 127.5 l 92.5 132.5 l 112.5 132.5 l 117.5 127.5 l 112.5 122.5 l 102.5 122.5 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 102.5 126.646] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -428 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (continue) s -442 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (pivoting?) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 147.5 124.617] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -342 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (leaving) s -386 0 m 215 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (variable) s -444 215 m 431 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (selected?) s savemat setmatrix n 147.5 121.25 m 140 121.25 l 135 127.5 l 140 133.75 l 155 133.75 l 160 127.5 l 155 121.25 l 147.5 121.25 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 102.5 174.146] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -218 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dual) s -422 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (feasible?) s savemat setmatrix n 102.5 170 m 95 170 l 90 175 l 95 180 l 110 180 l 115 175 l 110 170 l 102.5 170 l cl gsave 0 0 0 0.176 0 B grestore n 132.5 200 m 125 200 l 120 205 l 125 210 l 140 210 l 145 205 l 140 200 l 132.5 200 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 132.5 206.176] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -288 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (punt?) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 102.5 194.146] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -562 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (unbounded) s -480 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (expected?) s savemat setmatrix n 102.5 190 m 93.75 190 l 88.75 195 l 93.75 200 l 111.25 200 l 116.25 195 l 111.25 190 l 102.5 190 l cl gsave 0 0 0 0.176 0 B grestore n 102.5 152.5 m 101.49 149.47 l 103.51 149.47 l cl 0 0 0 F n 102.5 142.5 m 102.5 149.47 l gsave 0 0 0 0.176 0 B grestore n 135 127.5 m 131.97 128.51 l 131.97 126.49 l cl 0 0 0 F n 117.5 127.5 m 131.97 127.5 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 134.859 146.089] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -312 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (return) s -240 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (error) s savemat setmatrix n 132.5 200 m 131.49 196.97 l 133.51 196.97 l cl 0 0 0 F n 116.25 195 m 132.5 195 l 132.5 196.97 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 80 206.646] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -312 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (return) s -278 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(dual\)) s -562 231 m 463 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (unbounded) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 132.5 221.646] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -614 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (tighten pivot) s -1014 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (selection parameters) s savemat setmatrix n 112.5 217.5 m 152.5 217.5 l 152.5 227.5 l 112.5 227.5 l cl gsave 0 0 0 0.176 0 B grestore n 80 202.5 m 78.991 199.47 l 81.009 199.47 l cl 0 0 0 F n 88.75 195 m 80 195 l 80 199.47 l gsave 0 0 0 0.176 0 B grestore n 132.5 217.5 m 131.49 214.47 l 133.51 214.47 l cl 0 0 0 F n 132.5 210 m 132.5 214.47 l gsave 0 0 0 0.176 0 B grestore n 102.5 67.5 m 105.53 66.491 l 105.53 68.509 l cl 0 0 0 F n 147.5 121.25 m 147.5 67.5 l 105.53 67.5 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 103.996 65.0089] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (y) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 89.2333 55.0278] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -105 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (n) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 119.419 140.17] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -86 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (y) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 88.169 197.67] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -86 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (y) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 133.73 212.81] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (n) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 117.001 197.686] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (n) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 145.751 207.686] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (y) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 160.751 130.186] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (n) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 148.73 119.746] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (y) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 118.251 130.186] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (y) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 103.73 145.31] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (n) s savemat setmatrix n 72.5 180 m 71.491 176.97 l 73.509 176.97 l cl 0 0 0 F n 90 175 m 72.5 175 l 72.5 176.97 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 89.419 177.67] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -86 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (y) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 115.751 177.686] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (n) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 72.5 184.146] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -318 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (primal) s -422 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (feasible?) s savemat setmatrix n 72.5 180 m 65 180 l 60 185 l 65 190 l 80 190 l 85 185 l 80 180 l 72.5 180 l cl gsave 0 0 0 0.176 0 B grestore n 50 190 m 48.991 186.97 l 51.009 186.97 l cl 0 0 0 F n 60 185 m 50 185 l 50 186.97 l gsave 0 0 0 0.176 0 B grestore n 102.5 190 m 101.49 186.97 l 103.51 186.97 l cl 0 0 0 F n 85 185 m 102.5 185 l 102.5 186.97 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 59.419 187.67] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -86 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (y) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 85.751 187.686] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (n) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 140 172.117] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -312 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (return) s -426 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (lost dual) s -468 231 m 463 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (feasibility) s savemat setmatrix n 130 175 m 126.97 176.01 l 126.97 173.99 l cl 0 0 0 F n 115 175 m 126.97 175 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 50 195] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -312 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (return) s -368 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (optimal) s savemat setmatrix n 102.5 35 m 105.53 33.991 l 105.53 36.009 l cl 0 0 0 F n 132.5 227.5 m 132.5 232.5 l 177.5 232.5 l 177.5 35 l 105.53 35 l gsave 0 0 0 0.176 0 B grestore n 177.5 127.5 m 174.47 128.51 l 174.47 126.49 l cl 0 0 0 F n 160 127.5 m 174.47 127.5 l gsave 0 0 0 0.176 0 B grestore n 135 142.5 m 133.99 139.47 l 136.01 139.47 l cl 0 0 0 F n 117.5 137.5 m 135 137.5 l 135 139.47 l gsave 0 0 0 0.176 0 B grestore n 160 205 m 156.97 206.01 l 156.97 203.99 l cl 0 0 0 F n 145 205 m 156.97 205 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 162.5 204.156] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (return) s 0 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (punt) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 102.5 53.367] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -342 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (leaving) s -386 0 m 215 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (variable) s -444 215 m 431 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (selected?) s savemat setmatrix n 102.5 50 m 95 50 l 90 56.25 l 95 62.5 l 110 62.5 l 115 56.25 l 110 50 l 102.5 50 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 56.25 51.7375] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -892 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(dy_dealWithPunt\)) s -778 0 m 215 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (attempt to relax) s -698 215 m 431 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (pivot selection) s -554 431 m 647 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (parameters) s savemat setmatrix n 40 47.5 m 72.5 47.5 l 72.5 65 l 40 65 l cl gsave 0 0 0 0.176 0 B grestore n 27.5 50 m 20 50 l 15 56.25 l 20 62.5 l 35 62.5 l 40 56.25 l 35 50 l 27.5 50 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 27.7422 52.7954] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -196 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (new) s -530 0 m 215 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (candidates) s -484 215 m 431 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (available?) s savemat setmatrix n 72.5 56.25 m 75.528 55.241 l 75.528 57.259 l cl 0 0 0 F n 90 56.25 m 75.528 56.25 l gsave 0 0 0 0.176 0 B grestore n 102.5 35 m 99.472 36.009 l 99.472 33.991 l cl 0 0 0 F n 27.5 50 m 27.5 35 l 99.472 35 l gsave 0 0 0 0.176 0 B grestore n 102.5 147.5 m 99.472 148.51 l 99.472 146.49 l cl 0 0 0 F n 27.5 62.5 m 27.5 147.5 l 99.472 147.5 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 28.57 65.4722] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (n) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 28.8757 48.5411] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (y) s savemat setmatrix userdict /#copies 1 put grestore %%Trailer %%DocumentNeededResources: font Bookman-Light %%DocumentSuppliedResources: end d_sv_obj restore DyLP-1.6.0/DyLP/doc/Figures/Makefile.am0000644000076700007670000000170311171477034014307 0ustar # Copyright (C) 2009 Lou Hafer # All Rights Reserved. # This file is distributed under the Common Public License. ## $Id$ # Author: Lou Hafer SFU 2009.04.15 AUTOMAKE_OPTIONS = foreign # Make sure the source for the figures is distributed. EXTRA_DIST = $(dylpdoc_FIGURES) dylpdoc_FIGURES = conmgmtcalls.drw \ conmgmtcalls.epsu \ dual2flow.drw \ dual2flow.epsu \ dualcalls.drw \ dualcalls.epsu \ dualerrorflow.drw \ dualerrorflow.epsu \ dualpivcalls.drw \ dualpivcalls.epsu \ dylpnormalflow.drw \ dylpnormalflow.epsu \ epsupatch.sed \ factorcalls.drw \ factorcalls.epsu \ primal1flow.drw \ primal1flow.epsu \ primal2flow.drw \ primal2flow.epsu \ primalcalls.drw \ primalcalls.epsu \ primalerrorflow.drw \ primalerrorflow.epsu \ primalpivcalls.drw \ primalpivcalls.epsu \ startupflow.drw \ startupflow.epsu \ varmgmtcalls.drw \ varmgmtcalls.epsu DyLP-1.6.0/DyLP/doc/Figures/startupflow.epsu0000644000076700007670000027770111171477034015560 0ustar %!PS-Adobe-3.0 EPSF-3.0 %%Title: /cs/mitacs1/lou/Bonsai/Doc/Dylp.New/Figures/startup.epsu %%Creator: IslandDraw for lou %%CreationDate: Sat Sep 10 09:05:11 2005 %%Pages: 1 %%BoundingBox: 70 265 435 787 %%DocumentNeededResources: (atend) %%DocumentSuppliedResources: (atend) %%EndComments %%BeginPreview: 457 653 1 1306 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000073 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000076 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000003f % 000000000000000000000000000000000000000000000000000000008000400000000000000000 % 00000000000000000000000000000000000068 % 000000000000000000000000000000000000000000000000000000008000400000000000000000 % 00000000000000000000000000000000000066 % 00000000000000000000000000000000000000000000000000000035ef1ff00000000000000000 % 00000000000000000000000000000000000068 % 000000000000000000000000000000000000000000000000000000489088400000000000000000 % 00000000000000000000000000000000000006 % 000000000000000000000000000000000000000000000000000000748388400000000000000000 % 00000000000000000000000000000000000079 % 0000000000000000000000000000000000000000000000000000000c8c88400000000000000000 % 00000000000000000000000000000000000078 % 000000000000000000000000000000000000000000000000000000449188400000000000000000 % 00000000000000000000000000000000000079 % 00000000000000000000000000000000000000000000000000000078eedc700000000000000000 % 00000000000000000000000000000000000078 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000079 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000078 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000079 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000073 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000075 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000073 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000075 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000073 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000075 % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000073 % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000075 % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000073 % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000006d % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000062 % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000001fe0000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000001fe0000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000001fc0000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000fc0000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000fc0000000000000000000 % 00000000000000000000000000000000000067 % 000000000000000000000000000000000000000000000000000000000f80000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000780000000000000000000 % 0000000000000000000000000000000000005d % 000000000000000000000000000000000000000000000000000000000780000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000700000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000fffffffffff80000000000007ff % ffffffffffffffffffffffff8000000000005c % 000000000000000000000000000000000000000000000000001fffffffffffc0000000000007ff % ffffffffffffffffffffffff8000000000005c % 000000000000000000000000000000000000000000000000003000000000006000000000000600 % 00000000000000000000000180000000000014 % 000000000000000000000000000000000000000000000000006000000000003000000000000600 % 0000000000000000000000018000000000005c % 00000000000000000000000000000000000000000000000000c000000000001800000000000600 % 00000000000000000000000180000000000006 % 000000000000000000000000000000000000000000000000018000000000000c00000000000600 % 0000000000000000000000018000000000001f % 000000000000000000000000000000000000000000000000030000600000000600000000000600 % 0380000000000080000600018000000000005c % 000000000000000000000000000000000000000000000000060000200000000300000000000600 % 0400000000080080000200018000000000005c % 0000000000000000000000000000000000000000000000000c0000200000000180000000000600 % 0400000000080000000200018000000000005c % 0000000000000000000000000000000000000000000000001807dc270f0d3800c0000000000600 % 0ef9c701f71ef1b70e3e00018000000000005c % 00000000000000000000000000000000000000000000000030023e2f90927c0060000000000600 % 0443ef808f8908989f6200018000000000001e % 00000000000000000000000000000000000000000000000060022028039d400030000000000600 % 0442080088083890904200018000000000005f % 000000000000000000000000000000000000000000000000c00220280c83400018000000000600 % 044208008808c8909042000180000000000000 % 0000000000000000000000000000000000000000000000018002322c919164000c000000000600 % 04432c808c8918909946000180000000000001 % 00000000000000000000000000000000000000000000000300071c770ede380006000000000600 % 0ee1c701c70eedf9ce3b00018000000000005c % 0000000000000000000000000000000000000000000000060000000000000000030000001c0600 % 0000000000000000000000018000000000005c % 00000000000000000000000000000000000000000000000c0000000000000000018000001f8600 % 0000000000000000000000018000000000005c % 000000000000000000000000000000000000000000000018000000000000000000c000001ff600 % 0000000000000000000000018000000000005c % 0000000000000000000000000000000000000000000000300000000000000000007ffffffffe00 % 000000000000000000000001ffffffe0000000 % 000000000000000000000000000000000000000000000038000000000000000000fffffffffe00 % 000000000000000000000001ffffffe0000064 % 00000000000000000000000000000000000000000000001c000000000000000001c000001fe600 % 00000000000000000000000180000020000000 % 00000000000000000000000000000000000000000000000e0000003000003800038000001f0601 % 8000000000000000000000018000002000005c % 000000000000000000000000000000000000000000000007000000100000c40007000000180600 % 8010000020000010000000018000002000003f % 00000000000000000000000000000000000000000000000380000010000084000e000000000600 % 8010000020000010000000018000002000005c % 000000000000000000000000000000000000000000000001c001af13bf1f04001c0d800000060f % 8f3cf00d7fc84f3c85f386818000002000005c % 000000000000000000000000000000000000000000000000e00259911f88080038048000000618 % 909108122218d8918c87c9018000002000005c % 0000000000000000000000000000000000000000000000007003b091a808100070050000000610 % 8390381d2208501084840e818000002000005c % 00000000000000000000000000000000000000000000000038007090a8081000e0030000000610 % 8c90c80322085010848401818000002000005c % 0000000000000000000000000000000000000000000000001c023190cc883001c0020000000611 % 919118112208d8908c86488180000020000058 % 0000000000000000000000000000000000000000000000000e03cf38471c30038002000000060e % cedcec1e3f076f1c77c38f018000002000007f % 0000000000000000000000000000000000000000000000000700000000000007000c0000000600 % 0000000000000000000000018000002000000f % 000000000000000000000000000000000000000000000000038000000000000e00000000000600 % 0000000000000000000000018000002000000f % 00000000000000000000000000000000000000000000000001c000000000001c00000000000600 % 0000000000000000000000018000002000000f % 00000000000000000000000000000000000000000000000000e000000000003800000000000600 % 0000000000000000000000018000002000000e % 000000000000000000000000000000000000000000000000007000000000007000000000000600 % 000000000000000000000001800001fe00000f % 00000000000000000000000000000000000000000000000000380000000000e000000000000600 % 000000000000000000000001800001fe00000f % 000000000000000000000000000000000000000000000000001fffffffffffc0000000000007ff % ffffffffffffffffffffffff800001fc000000 % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 000000000000000000000000000001fc00000f % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 000000000000000000000000000000fc00000f % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 000000000000000000000000000000f800000f % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 000000000000000000000000000000f800000f % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000007800007f % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000007000000e % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000007000000f % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000003000003a % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000002000003a % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000001fe0000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000001fe0000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000001fc0000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000fc0000000000000000000 % 0000000000000000000000000000080000003a % 000000000000000000000000000000000000000000000000000000000fc0000000000000000000 % 0000000000000000000000000000080000003a % 000000000000000000000000000000000000000000000000000000000f80000000000000000000 % 00000000000000000000000001f71e84fee03a % 000000000000000000000000000000000000000000000000000000000780000000000000000000 % 000000000000000000000000008f898c431000 % 000000000000000000000000000000000000000000000000000000000780000000000000000000 % 0000000000000000000000000088088442103a % 000000000000000000000000000000000000000000000000000000000700000000000000000000 % 00000000000000000000000000880884421000 % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 000000000000000000000000008c888c42103a % fffffffffffffffffffffffffff000000000000000007ffffffffffffffffffffffffff8000000 % 00000000000000000000000001c70e76e73818 % fffffffffffffffffffffffffff000000000000000007ffffffffffffffffffffffffff8000000 % 0000000000000000000000000000000000001e % 800000000000000000000000003000000000000000006000000000000000000000000018000000 % 0000000000000000000000000000000000001e % 800000000000000000000000003000000000000000006000000000000000000000000018000000 % 0000000000000000000000000000000000001e % 800000000000000000000000003000000000000000006000000000000000000000000018000000 % 0000000000000000000000000000000000001e % 800000000000000000000000003000000000000000006000000000000000000000000018000000 % 0000000000000000000000000000000000001e % 8000700000000000200000c0003000003000000000006000000c00000000080000000018000000 % 0000000000000000000000000000000000001e % 8000800000000200200000400030000010c0000000006000000401000000080000000018000000 % 0000000000000000000000000000000000001e % 800080000000020000000040003000001040000000006000000401000000000000000018000000 % 0000000000000000000000000000000000001e % 8001df70e07ce79e66e387c0003000e393c036ddefb06000007c73ce7dbb1b70e0000018000000 % 0000000000000000000000000000000000001e % 800088f9f021f2212317cc40003001145440126284c8600000c4f91f20cc8989f0000018000000 % 0000000000000000000000000000000000001e % 800088810021020722140840003001045440169e84886000008481102088890900000018000000 % 0000000000000000000000000000000000001e % 8000888100210219221408400030011c54401fa284886000008481102088890900000018000000 % 0000000000000000000000000000000000001e % 800088c990219223221648c0003000e3bbe8091fcfdc6000008cc9192088890990000018000000 % 0000000000000000000000000000000000001e % 8001dc70e070e39df73b8760003000000008000000006000007671ce71dddf9ce0000018000000 % 0000000000000000000000000000000000001e % 80000000000000000000000000301c000000000000006000000000000000000000000018000000 % 0000000000000000000000000000000000001e % 8000000000000000000000000030fc000000000000006000000000000000000000000018000000 % 0000000000000000000000000000000000001e % 8000000000000000000000000037fc000000000000006000000000000000000000000018000000 % 00000000000000000000000000000000000008 % 800000000000000000000000003fffffffffffffffffe000000000000000000000000018000000 % 00000000000000000000000000000000000000 % 800000000000000000000000003fffffffffffffffffe000000000000000000000000018000000 % 0000000000000000000000000000000000005a % 8000000000000000000000000033fc000000000000006000000000000000000000000018000000 % 00000000000000000000000000000000000000 % 80300000000000000000000000307c0000000000000060000000000000e0000000000018000000 % 00000000000000000000000000000000000000 % 80100200000800000200000000300c000000000000006000100000000100020001000018000000 % 00000000000000000000000000000000000000 % 801002000008000002000000003000000000000000006000100000000100020001000018000000 % 00000000000000000000000000000000000000 % 81f1e79e01bef909e7a13ee0d030000000000000000060003fbee380f380d79e7fc00018000000 % 00000000000000000000000000000000000000 % 831212210248431b126311f1203000000000000000006000111737c19901222121000018000000 % 00000000000000000000000000000000000000 % 8210720703a8410a02211101d03000000000000000006000119214010901d20721000018000000 % 00000000000000000000000000000000000069 % 821192190068410a0221110030300000000000000000600010a214010900321921000018000000 % 00000000000000000000000000000000000064 % 823232230228411b1223119110300000000000000000600010a236411901122321000018000000 % 00000000000000000000000000000000000073 % 81d9db9d83cee0ede39db8e1e030000000000000000060001c43e380f381e39df1c00018000000 % 00000000000000000000000000000000000076 % 800000000000000000000000003000000000000000006000004200000000000000000018000000 % 0000000000000000000000000000000000003f % 80000000000000000000000000300000000000000000600001c200000000000000000018000000 % 00000000000000000000000000000000000068 % 800000000000000000000000003000000000000000006000030700000000000000000018000000 % 00000000000000000000000000000000000066 % 800000000000000000000000003000000000000000006000000000000000000000000018000000 % 00000000000000000000000000000000000068 % 800000000000000000000000003000000000000000006000000000000000000000000018000000 % 00000000000000000000000000000000000006 % 800000000000000000000000003000000000000000006000000000000000000000000018000000 % 00000000000000000000000000000000000079 % fffffffffffffffffffffffffff000000000000000007ffffffffffffffffffffffffff8000000 % 00000000000000000000000000000000000078 % 000000000000060000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000079 % 000000000000060000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000078 % 000000000000060000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000079 % 000000000000060000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000078 % 000000000000060000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000079 % 000000000000060000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000073 % 000000000000060000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000075 % 000000000000060000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000073 % 000000000000060000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000075 % 000000000000060000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000073 % 000000000000060000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000075 % 000000000000060000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000073 % 000000000000060000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000075 % 0000000000000600000000000000000000000000000000000000000c0300000000000000000000 % 00000000000000000000000000000000000073 % 0000000000000600000000000000000000000000000000000000000f8300000000000000000000 % 0000000000000000000000000000000000006d % 0000000000000600000000000000000000000000000000000000000ff300000000000000000000 % 0000000000000000000000000000000000005c % 00000000000007ffffffffffffffffffffffffffffffffffffffffffff00000000000000000000 % 0000000000000000000000000000000000005c % 00000000000007ffffffffffffffffffffffffffffffffffffffffffff00000000000000000000 % 0000000000000000000000000000000000005c % 0000000000000000000000000000000000000000000000000000000ffb00000000000000000000 % 0000000000000000000000000000000000005c % 0000000000000000000000000000000000000000000000000000000fc300000000000000000000 % 0000000000000000000000000000000000005c % 0000000000000000000000000000000000000000000000000000000e0300000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000062 % 000000000000000000000000000000000000000000000000000000001fe0000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000001fe0000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000001fc0000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000fc0000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000fc0000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000f80000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000780000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000780000000000000000000 % 00000000000000000000000000000000000067 % 000000000000000000000000000000000000000000000000000000000700000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005d % 000000000000000000000000000000000000000000007ffffffffffffffffffffffffff8000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000007ffffffffffffffffffffffffff8000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000006000000000000000000000000018000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000006000000000000000000000000018000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000006000000000000000000000000018000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000006000000000000000000000000018000000 % 00000000000000000000000000000000000014 % 000000000000000000000000000000000000000000006000000600000000000800000018000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000006000000200400000010800000018000000 % 00000000000000000000000000000000000006 % 000000000000000000000000000000000000000000006000000200400000010000000018000000 % 0000000000000000000000000000000000001f % 0000000000000000000000000000000000000000000060216e3e3cf380f373d9e6e0d018000000 % 0000000000000000000000000000000000005c % 00000000000000000000000000000000000000000000606373624247c19b990b33112018000000 % 0000000000000000000000000000000000005c % 00000000000000000000000000000000000000000000602121420e440109090a1211d018000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000006021214232440109090a12103018000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000006023234646464119190a32111018000000 % 0000000000000000000000000000000000001e % 00000000000000000000000000000000000000000000601dbe3b3b7380f1f1dde739e018000000 % 0000000000000000000000000000000000005f % 000000000000000000000000000000000000000000006000200000000001000000000018000000 % 00000000000000000000000000000000000000 % 000000000000000000000000000000000000000000006000200000000001000000000018000000 % 00000000000000000000000000000000000001 % 000000000000000000000000000000000000000000006000700000000003800000000018000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000006000000000000000000000000018000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000006000000000000000000000000018000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000006000000000000000000000000018000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000006000000600006000000000000018000000 % 00000000000000000000000000000000000000 % 000000000000000000000000000000000000000000006000000202002000000000000018000000 % 00000000000000000000000000000000000064 % 000000000000000000000000000000000000000000006000000202002000000000000018000000 % 00000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000601e6e3e079e271f78dc79c1a018000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000006021316202332f888462c7e24018000000 % 0000000000000000000000000000000000003f % 0000000000000000000000000000000000000000000060072142022128081c428203a018000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000006019214202212808644282006018000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000006023214602232c888c42c7222018000000 % 0000000000000000000000000000000000005c % 00000000000000000000000000000000000000000000601df3bb039e771c76e779c3c018000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000006000000000000000000000000018000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000006000000000000000000000000018000000 % 00000000000000000000000000000000000058 % 000000000000000000000000000000000000000000006000000000000000000000000018000000 % 0000000000000000000000000000000000007f % 000000000000000000000000000000000000000000006000000000000000000000000018000000 % 0000000000000000000000000000000000000f % 000000000000000000000000000000000000000000006000000000000000000000000018000000 % 0000000000000000000000000000000000000f % 000000000000000000000000000000000000000000006000000000000000000000000018000000 % 0000000000000000000000000000000000000f % 000000000000000000000000000000000000000000007ffffffffffffffffffffffffff8000000 % 0000000000000000000000000000000000000e % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000000f % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000000f % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000000f % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000000f % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000000f % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000000f % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000007f % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000000e % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000000f % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000001fe0000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000001fe0000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000001fc0000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000fc0000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000fc0000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000f80000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000780000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000780000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000700000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000000 % 00000000000000000000000000000000000000000007ffffffffffffffffffffffffffff800000 % 0000000000000000000000000000000000003a % 00000000000000000000000000000000000000000007ffffffffffffffffffffffffffff800000 % 00000000000000000000000000000000000000 % 000000000000000000000000000000000000000000040000000000000000000000000000800000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000040000000000000000000000000000800000 % 00000000000000000000000000000000000018 % 000000000000000000000000000000000000000000040000000000000000000000000000800000 % 0000000000000000000000000000000000001e % 000000000000000000000000000000000000000000040000000000000000000000000000800000 % 0000000000000000000000000000000000001e % 000000000000000000000000000000000000000000040000000000000000000000000000800000 % 0000000000000000000000000000000000001e % 000000000000000000000000000000000000000000040000000000000000000000000000800000 % 0000000000000000000000000000000000001e % 0000000000000000000000000000000000000000000400040040200c40000c0000060000800000 % 0000000000000000000000000000000000001e % 000000000000000000000000000000000000000000040004004420044000040000020000800000 % 0000000000000000000000000000000000001e % 000000000000000000000000000000000000000000040000000400040000040000020000800000 % 0000000000000000000000000000000000001e % 00000000000000000000000000000000000000000004000cdccf63c4c69c0478f1e20000800000 % 0000000000000000000000000000000000001e % 00000000000000000000000000000000000000000004000462442424493e04cd8a120000800000 % 0000000000000000000000000000000000001e % 000000000000000000000000000000000000000000040004424420e44ea0048500720000800000 % 0000000000000000000000000000000000001e % 0000000000000000000000000000000000000000000400044244232441a0048501920000800000 % 0000000000000000000000000000000000001e % 0000000000000000000000000000000000000000000400044244246448b2048d8a320000800000 % 0000000000000000000000000000000000001e % 00000000000000000000000000000000000000000004000ee7e773beef1c0e78f1df0000800000 % 0000000000000000000000000000000000001e % 000000000000000000000000000000000000000000040000000000000000000000000000800000 % 0000000000000000000000000000000000001e % 000000000000000000000000000000000000000000040000000000000000000000000000800000 % 0000000000000000000000000000000000001e % 000000000000000000000000000000000000000000040000000000000000000000000000800000 % 0000000000000000000000000000000000001e % 000000000000000000000000000000000000000000040000000000000000000000000000800000 % 00000000000000000000000000000000000008 % 000000000000000000000000000000000000000000040000000000000000000000000000800000 % 00000000000000000000000000000000000000 % 000000000000000000000000000000000000000000040000000000010000000000000000800000 % 0000000000000000000000000000000000005a % 000000000000000000000000000000000000000000040000000400010010000001000000800000 % 00000000000000000000000000000000000000 % 000000000000000000000000000000000000000000040000000400000010000001000000800000 % 00000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000479e6e0df7de36e3c0d7737ce6ec0800000 % 00000000000000000000000000000000000000 % 00000000000000000000000000000000000000000004c7331124221131101222491f3320800000 % 00000000000000000000000000000000000000 % 00000000000000000000000000000000000000000004821211d4207121101d3275102220800000 % 00000000000000000000000000000000000000 % 00000000000000000000000000000000000000000004821210342191211003140d102220800000 % 00000000000000000000000000000000000000 % 00000000000000000000000000000000000000000004c632111422312110111445192220800000 % 00000000000000000000000000000000000069 % 0000000000000000000000000000000000000000000479e739e771dbf39c1e0879ce7770800000 % 00000000000000000000000000000000000064 % 000000000000000000000000000000000000000000040000000000000000000800000000800000 % 00000000000000000000000000000000000073 % 000000000000000000000000000000000000000000040000000000000000003800000000800000 % 00000000000000000000000000000000000076 % 000000000000000000000000000000000000000000040000000000000000006000000000800000 % 0000000000000000000000000000000000003f % 000000000000000000000000000000000000000000040000000000000000000000000000800000 % 00000000000000000000000000000000000068 % 000000000000000000000000000000000000000000040000000000000000000000000000800000 % 00000000000000000000000000000000000066 % 000000000000000000000000000000000000000000040000000000000000000000000000800000 % 00000000000000000000000000000000000068 % 000000000000000000000000000000000000000000040000000080000620000400000000800000 % 00000000000000000000000000000000000006 % 000000000000000000000000000000000000000000040000000100000220000400000000800000 % 00000000000000000000000000000000000079 % 000000000000000000000000000000000000000000040000000200000200003200000000800000 % 00000000000000000000000000000000000078 % 00000000000000000000000000000000000000000004000000021a79e266e1c200000000800000 % 00000000000000000000000000000000000079 % 000000000000000000000000000000000000000000040000000224c61223122200000000800000 % 00000000000000000000000000000000000078 % 00000000000000000000000000000000000000000004000000023a807222122200000000800000 % 00000000000000000000000000000000000079 % 00000000000000000000000000000000000000000004000000020681922211c200000000800000 % 00000000000000000000000000000000000078 % 000000000000000000000000000000000000000000040000000222c63222120200000000800000 % 00000000000000000000000000000000000079 % 00000000000000000000000000000000000000000004000000023c79df773be200000000800000 % 00000000000000000000000000000000000073 % 000000000000000000000000000000000000000000040000000200000000023200000000800000 % 00000000000000000000000000000000000075 % 000000000000000000000000000000000000000000040000000100000000063400000000800000 % 00000000000000000000000000000000000073 % 00000000000000000000000000000000000000000004000000000000000003c000000000800000 % 00000000000000000000000000000000000075 % 000000000000000000000000000000000000000000040000000000000000000000000000800000 % 00000000000000000000000000000000000073 % 000000000000000000000000000000000000000000040000000000000000000000000000800000 % 00000000000000000000000000000000000075 % 000000000000000000000000000000000000000000040000000000000000000000000000800000 % 00000000000000000000000000000000000073 % 000000000000000000000000000000000000000000040000000000000000000000000000800000 % 00000000000000000000000000000000000075 % 00000000000000000000000000000000000000000007ffffffffffffffffffffffffffff800000 % 00000000000000000000000000000000000073 % 00000000000000000000000000000000000000000007ffffffffffffffffffffffffffff800000 % 0000000000000000000000000000000000006d % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000062 % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005c % 0000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff % fffffffffffffff80000000000000000000067 % 0000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff % fffffffffffffff8000000000000000000005c % 0000000000000000000000c0000000000000000000000000000000000300000000000000000000 % 0000000000000008000000000000000000005d % 0000000000000000000000c0000000000000000000000000000000000300000000000000000000 % 0000000000000008000000000000000000005c % 0000000000000000000000c0000000000000000000000000000000000300000000000000000000 % 0000000000000008000c00000000000000005c % 0000000000000000000000c3000800000000000000000000000000000300000000000000000000 % 0000000000000008000430000000000000005c % 0000000000000000000000c1001000000000000000000000000000000300000000000000000000 % 0000000000000008000410000000000000005c % 0000000000000000000000c167380000000000000000000000000000030db73fec000000000000 % 00000000000000081ce4f0000000000000005c % 0000000000000000000000c1989000000000000000000000000000000304989132000000000000 % 00000000000000082315100000000000000014 % 0000000000000000000000c1189000000000000000000000000000000305a79122000000000000 % 0000000000000008211510000000000000005c % 0000000000000000000000c1189000000000000000000000000000000307e89122000000000000 % 00000000000000082315100000000000000006 % 0000000000000000000000c3bf1c0000000000000000000000000000030247fbf7000000000000 % 00000000000000081ceef8000000000000001f % 0000000000000000000000c0000000000000000000000000000000000300000000000000000000 % 0000000000000008000000000000000000005c % 0000000000000000000000c0000000000000000000000000000000000300000000000000000000 % 0000000000000008000000000000000000005c % 0000000000000000000000c0000000000000000000000000000000000300000000000000000000 % 0000000000000008000000000000000000005c % 0000000000000000000000c0000000000000000000000000000000000300000000000000000000 % 0000000000000008000000000000000000005c % 0000000000000000000007f8000000000000000000000000000000001fe0000000000000000000 % 000000000000007f800000000000000000001e % 0000000000000000000007f8000000000000000000000000000000001fe0000000000000000000 % 000000000000007f800000000000000000005f % 0000000000000000000007f8000000000000000000000000000000001fe0000000000000000000 % 000000000000007f0000000000000000000000 % 0000000000000000000003f0000000000000000000000000000000000fc0000000000000000000 % 000000000000007f0000000000000000000001 % 0000000000000000000003f0000000000000000000000000000000000fc0000000000000000000 % 000000000000003f000000000000000000005c % 0000000000000000000003f0000000000000000000000000000000000fc0000000000000000000 % 000000000000003e000000000000000000005c % 0000000000000000000001e0000000000000000000000000000000000780000000000000000000 % 000000000000003e000000000000000000005c % 0000000000000000000001e0000000000000000000000000000000000780000000000000000000 % 000000000000001e000000000000000000005c % 0000000000000000000001e0000000000000000000000000000000000780000000000000000000 % 000000000000001c0000000000000000000000 % 0000000000000000000000c0000000000000000000000000000000000300000000000000000000 % 000000000000001c0000000000000000000064 % 0000000000000000000000c0000000000000000000000000000000000300000000000000000000 % 000000000000000c0000000000000000000000 % 000000001ffffffffffffffffffffffffffe000000007ffffffffffffffffffffffffff8000000 % 01ffffffffffffffffffffffffffe00000005c % 000000001800000000000000000000000002000000006000000000000000000000000018000000 % 0100000000000000000000000000600000003f % 000000001800000000000000000000000002000000006000000000000000000000000018000000 % 0100000000000000000000000000600000005c % 000000001800000000000000000000000002000000006000000000000000000000000018000000 % 0100000000000000000000000000600000005c % 000000001800000000000000000000000002000000006000000000000000000000000018000000 % 0100000000000000000000000000600000005c % 000000001800000000000000000000000002000000006000000000000000000000000018000000 % 0100000000000000000000000000600000005c % 000000001800000000000380000000000002000000006000000000000e00000000000018000000 % 0100000000000038000000000000600000005c % 000000001800000000000400000000000002000000006000000000001000000000000018000000 % 01000000000000400000000000006000000058 % 000000001800000000000400000000000002000000006000000000001000000000000018000000 % 0100000000000040000000000000600000007f % 00000000180000006e71fe79f6ec00000002000000006000000371c7f9e7dbb000000018000000 % 010000000dc73ee79fdd80000000600000000f % 000000001800000073f884cc83320000000200000000600000039be213320cc800000018000000 % 010000000e6f904cc86640000000600000000f % 00000000180000002180848482220000000200000000600000010a021212088800000018000000 % 0100000004281048484440000000600000000f % 00000000180000002180848482220000000200000000600000010a021212088800000018000000 % 0100000004281048484440000000600000000e % 000000001800000023c8848c82220000000200000000600000011b221232088800000018000000 % 01000000046c9048c84440000000600000000f % 00000000180000003e71ce79c777000000020000000060000001f1c739e71ddc00000018000000 % 0100000007c738e79ceee0000000600000000f % 000000001800000020000000000000000002000000006000000100000000000000000018000000 % 01000000040000000000000000006000000000 % 000000001800000020000000000000000002000000006000000100000000000000000018000000 % 0100000004000000000000000000600000000f % 000000001800000070000000000000000002000000006000000380000000000000000018000000 % 010000000e000000000000000000600000000f % 000000001800000000000000000000000002000000006000000000000000000000000018000000 % 0100000000000000000000000000600000000f % 000000001800000000000000000000000002000000006000000000000000000000000018000000 % 0100000000000000000000000000600000000f % 000000001800000100000000000000000002000000006000000000000000000000000018000000 % 0100000000060600000000000000600000007f % 000000001800000300010002000100000002000000006000000000000000100008000018000000 % 0100000000020200080004000000600000000e % 000000001800000100010002000100000002000000006000000000000000100008000018000000 % 0100000000020200080004000000600000000f % 000000001800000170f3c0d79e7fc000000200000000600007eef3fbb006bde3fe000018000000 % 01000000f1e23e035e79ff000000600000003a % 0000000018000001899901222121000000020000000060000245090cc809121108000018000000 % 010000018b326204888484000000600000003a % 0000000018000001090901d207210000000200000000600003643908880e907108000018000000 % 0100000102124207481c84000000600000003a % 00000000180000010909003219210000000200000000600001a8c9088801919108000018000000 % 0100000102124200c86484000000600000003a % 00000000180000010919011223210000000200000000600001b119088808923108000018000000 % 010000018a324604488c84000000600000003a % 00000000180000039cf1c1e39df1c00000020000000060000090ef9ddc0f1ddb8e000018000000 % 01000000f1e73b078e77c7000000600000003a % 000000001800000000000000000000000002000000006000000000000000000000000018000000 % 0100000000000000000000000000600000003a % 000000001800000000000000000000000002000000006000000000000000000000000018000000 % 0100000000000000000000000000600000003a % 000000001800000000000000000000000002000000006000000000000000000000000018000000 % 0100000000000000000000000000600000003a % 000000001800000000000000000000000002000000006000000000000000000000000018000000 % 0100000000000000000000000000600000003a % 000000001800000000000000000000000002000000006000000000000000000000000018000000 % 0100000000000000000000000000600000003a % 000000001800000000000000000000000002000000006000000000000000000000000018000000 % 0100000000000000000000000000600000003a % 000000001ffffffffffffffffffffffffffe000000007ffffffffffffffffffffffffff8000000 % 01ffffffffffffffffffffffffffe00000003a % 000000001ffffffffffffffffffffffffffe000000007ffffffffffffffffffffffffff8000000 % 01ffffffffffffffffffffffffffe00000003a % 0000000000000000000000c0000000000000000000000000000000000300000000000000000000 % 00000000000000080000000000000000000000 % 0000000000000000000000c0000000000000000000000000000000000300000000000000000000 % 0000000000000008000000000000000000003a % 0000000000000000000000c0000000000000000000000000000000000300000000000000000000 % 00000000000000080000000000000000000000 % 0000000000000000000000c0000000000000000000000000000000000300000000000000000000 % 0000000000000008000000000000000000003a % 0000000000000000000000c0000000000000000000000000000000000300000000000000000000 % 00000000000000080000000000000000000018 % 0000000000000000000000c0000000000000000000000000000000000300000000000000000000 % 0000000000000008000000000000000000001e % 0000000000000000000000c0000000000000000000000000000000000300000000000000000000 % 0000000000000008000000000000000000001e % 0000000000000000000000c0000000000000000000000000000000000300000000000000000000 % 0000000000000008000000000000000000001e % 0000000000000000000000c0000000000000000000000000000000000300000000000000000000 % 0000000000000008000000000000000000001e % 0000000000000000000000c0000000000000000000000000000000000300000000000000000000 % 0000000000000008000000000000000000001e % 0000000000000000000000c0000000000000000000000000000000000300000000000000000000 % 0000000000000008000000000000000000001e % 0000000000000000000000c0000000000000000000000000000000000300000000000000000000 % 0000000000000008000000000000000000001e % 0000000000000000000000c0000000000000000000000000000000000300000000000000000000 % 0000000000000008000000000000000000001e % 0000000000000000000000c00000000000000000000000000000000f0303c00000000000000000 % 0000000000000008000000000000000000001e % 0000000000000000000000c00000000000000000000000000000000fe31fc00000000000000000 % 0000000000000008000000000000000000001e % 0000000000000000000000c00000000000000000000000000000000fffffc00000000000000000 % 0000000000000008000000000000000000001e % 0000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff % fffffffffffffff8000000000000000000001e % 0000000000000000000000000000000000000000000000000000000fffffc00000000000000000 % 0000000000000000000000000000000000001e % 0000000000000000000000000000000000000000000000000000000fe31fc00000000000000000 % 0000000000000000000000000000000000001e % 0000000000000000000000000000000000000000000000000000000f0303c00000000000000000 % 0000000000000000000000000000000000001e % 000000000000000000000000000000000000000000000000000000080300400000000000000000 % 0000000000000000000000000000000000001e % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000008 % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005a % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000069 % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000064 % 000000000000000000000000000000000000000000000000000000001fe0000000000000000000 % 00000000000000000000000000000000000073 % 000000000000000000000000000000000000000000000000000000001fe0000000000000000000 % 00000000000000000000000000000000000076 % 000000000000000000000000000000000000000000000000000000001fc0000000000000000000 % 0000000000000000000000000000000000003f % 000000000000000000000000000000000000000000000000000000000fc0000000000000000000 % 00000000000000000000000000000000000068 % 000000000000000000000000000000000000000000000000000000000fc0000000000000000000 % 00000000000000000000000000000000000066 % 000000000000000000000000000000000000000000000000000000000f80000000000000000000 % 00000000000000000000000000000000000068 % 000000000000000000000000000000000000000000000000000000000780000000000000000000 % 00000000000000000000000000000000000006 % 000000000000000000000000000000000000000000000000000000000780000000000000000000 % 00000000000000000000000000000000000079 % 000000000000000000000000000000000000000000000000000000000700000000000000000000 % 00000000000000000000000000000000000078 % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000079 % 00000000000000000000000000001fffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffe00000000000000000000000000078 % 00000000000000000000000000001fffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffe00000000000000000000000000079 % 000000000000000000000000000018000000000000000000000000000000000000000000000000 % 00000000600000000000000000000000000078 % 000000000000000000000000000018000000000000000000000000000000000000000000000000 % 00000000600000000000000000000000000079 % 000000000000000000000000000018000000000000000000000000000000000000000000000000 % 00000000600000000000000000000000000073 % 000000000000000000000000000018000000000000000000000000000000000000000000000000 % 00000000600000000000000000000000000075 % 000000000000000000000000000018000000000000000000000000000000000000000000000000 % 00000000600000000000000000000000000073 % 000000000000000000000000000018000000000000000000000000000000000000400808000000 % 00000000600000000000000000000000000075 % 000000000000000000000000000018000000000000000000000000040002000004400908000000 % 00000000600000000000000000000000000073 % 000000000000000000000000000018000000000000000000000000040002000004000100000000 % 00000000600000000000000000000000000075 % 0000000000000000000000000000180000000003cf3763761e6e01af78ff81e3cfcefbd8e1a400 % 00000000600000000000000000000000000073 % 000000000000000000000000000018000000000639999199333102448442021624444909f24400 % 00000000600000000000000000000000000075 % 000000000000000000000000000018000000000410911111212103a41c4200740446890903a000 % 00000000600000000000000000000000000073 % 000000000000000000000000000018000000000410911111212100646442019404428909006000 % 0000000060000000000000000000000000006d % 000000000000000000000000000018000000000631911111232102248c42023624430909922400 % 0000000060000000000000000000000000005c % 0000000000000000000000000000180000000003cf3bbbbb9e7383c776e381dbc7e11ddce3c400 % 0000000060000000000000000000000000005c % 000000000000000000000000000018000000000000000000000000000000000000000000000000 % 0000000060000000000000000000000000005c % 000000000000000000000000000018000000000000000000000000000000000000000000000000 % 0000000060000000000000000000000000005c % 000000000000000000000000000018000000000000000000000000000000000000000000000000 % 0000000060000000000000000000000000005c % 000000000000000000000000000018000000000000000000000000000000000000000000000000 % 0000000060000000000000000000000000005c % 000000000000000000000000000018000000000000000000000000000000000000000000000000 % 0000000060000000000000000000000000005c % 00000000000000000000000000001800000c000000000800006000018030300000000000000100 % 0000000060000000000000000000000000005c % 000000000000000000000000000018000004010000000800002000008010100000000004000100 % 10000000600000000000000000000000000062 % 000000000000000000000000000018000004010000000000002000008010100000000004000000 % 1000000060000000000000000000000000005c % 00000000000000000000000000001800007c73ce7dbb1b70e023c78f8f1711c078f370df7cf337 % 3c68000060000000000000000000000000005c % 0000000000000000000000000000180000c4f91f20cc8989f0266858909993e0c5998924210918 % 9090000060000000000000000000000000005c % 000000000000000000000000000018000084811020888909002421d083909200810909d4203910 % 90e8000060000000000000000000000000005c % 000000000000000000000000000018000084811020888909002426508c9092008109083420c910 % 9018000060000000000000000000000000005c % 00000000000000000000000000001800008cc91920888909902468d191919320c5190914211910 % 9088000060000000000000000000000000005c % 00000000000000000000000000001800007671ce71dddf9ce073c76ecedf39c078f39de770efb9 % dcf0000060000000000000000000000000005c % 000000000000000000000000000018000000000000000000000000000000000000000000000000 % 00000000600000000000000000000000000067 % 000000000000000000000000000018000000000000000000000000000000000000000000000000 % 0000000060000000000000000000000000005c % 000000000000000000000000000018000000000000000000000000000000000000000000000000 % 0000000060000000000000000000000000005d % 000000000000000000000000000018000000000000000000000000000000000000000000000000 % 0000000060000000000000000000000000005c % 000000000000000000000000000018000000000000000000000000000000000000000000000000 % 0000000060000000000000000000000000005c % 000000000000000000000000000018000000000000000000000000000000000000000000000000 % 0000000060000000000000000000000000005c % 0000000000000000000000000000180000000180000010060600000200201006200003e1f3f800 % 0003000060000000000000000000000000005c % 000000000000000000000000000018000000008000001002020000020022100220000112111800 % 0001000060000000000000000000000000005c % 000000000000000000000000000018000000008000000002020000000002000200000112090400 % 00010000600000000000000000000000000014 % 000000000000000000000000000018000f1b8f81dfcfb1e2e2706a066e67b1e2634e011381201e % 371f000060000000000000000000000000005c % 00000000000000000000000000001800108c58808c24121332f8920231221212249f01e0f1e021 % 18b10000600000000000000000000000000006 % 0000000000000000000000000000180003885080d0e410721280e8022122107227500100092007 % 10a1000060000000000000000000000000001f % 000000000000000000000000000018000c88508053241192128018022122119220d00102090419 % 10a1000060000000000000000000000000005c % 00000000000000000000000000001800118851806464123232c88a022122123224590183110823 % 10a3000060000000000000000000000000005c % 000000000000000000000000000018000edceec023be39dbe770f20773f3b9df778e0383e3f81d % b9dd800060000000000000000000000000005c % 000000000000000000000000000018000000000000000000000002000000000000000000000000 % 0000000060000000000000000000000000005c % 000000000000000000000000000018000000000000000000000000000000000000000000000000 % 0000000060000000000000000000000000001e % 000000000000000000000000000018000000000000000000000000000000000000000000000000 % 0000000060000000000000000000000000005f % 000000000000000000000000000018000000000000000000000000000000000000000000000000 % 00000000600000000000000000000000000000 % 000000000000000000000000000018000000000000000000000000000000000000000000000000 % 00000000600000000000000000000000000001 % 000000000000000000000000000018000fc1f3f800008010000000040000000010000040000000 % 0003000060000000000000000000000000005c % 000000000000000000000000000018000462111800008010000000040002000010000840000000 % 0001000060000000000000000000000000005c % 000000000000000000000000000018000432090400000000001800000002000000000800000000 % 0001000060000000000000000000000000005c % 0000000000000000000000000000180004138120373f8f36e0e00dccefe783e731c79ecf37000f % 371f000060000000000000000000000000005c % 000000000000000000000000000018000410f1e03990989311100e644732010f93ec4859988010 % 98b10000600000000000000000000000000000 % 000000000000000000000000000018000410092010909012111004246a12010812080850908003 % 90a10000600000000000000000000000000064 % 00000000000000000000000000001800043209041090901210e004242a1201081208085090800c % 90a10000600000000000000000000000000000 % 000000000000000000000000000018000423110811909892110404643232010c932c4851908811 % 90a3000060000000000000000000000000005c % 000000000000000000000000000018000fc3e3f81f39cf3f39f407ce11e3838711c78eef39c80e % f9dd800060000000000000000000000000003f % 000000000000000000000000000018000000000010000000011c04000000000010000000000800 % 0000000060000000000000000000000000005c % 000000000000000000000000000018000000000010000000031804000000000050000000000000 % 0000000060000000000000000000000000005c % 00000000000000000000000000001800000000003800000001e00e0000000000e0000000000000 % 0000000060000000000000000000000000005c % 000000000000000000000000000018000000000000000000000000000000000000000000000000 % 0000000060000000000000000000000000005c % 000000000000000000000000000018000000000000000000000000000000000000000000000000 % 0000000060000000000000000000000000005c % 000000000000000000000000000018000000000000000000000000000000000000000000000000 % 00000000600000000000000000000000000058 % 000000000000000000000000000018000000000030000100000300000003000000106000000000 % 0000000060000000000000000000000000007f % 000000000000000000000000000018000000800010002100000100000001000002102000000000 % 0000000060000000000000000000000000000f % 000000000000000000000000000018000000800010002000000100000001000002002000600000 % 0000000060000000000000000000000000000f % 0000000000000000000000000000181b8e3fe42f971e7b3cdc0173c1ae1f03c6e7b3e3839c6e38 % fbc79dc060000000000000000000000000000f % 0000000000000000000000000000181cdf108c6419a1216662019c225f310423121627c47e317c % 442c488060000000000000000000000000000e % 000000000000000000000000000018085010842410872142423d08e3b02100e212142404602140 % 40e80c8060000000000000000000000000000f % 00000000000000000000000000001808501084241099214242010b207021032212142403a02140 % 4328050060000000000000000000000000000f % 00000000000000000000000000001808d910846411a3214642011c623923046212146644322164 % 446c4500600000000000000000000000000000 % 0000000000000000000000000000180f8e38e3be1f1dbbbce701f3b3ce1d83b73bbbb387dc73b8 % e3b7820060000000000000000000000000000f % 000000000000000000000000000018080000000000000000000000000000000000000004600000 % 0000020060000000000000000000000000000f % 00000000000000000000000000001808000000000000000000000000000000000000000c600000 % 00000e0060000000000000000000000000000f % 0000000000000000000000000000181c0000000000000000000000000000000000000007800000 % 0000180060000000000000000000000000000f % 000000000000000000000000000018000000000000000000000000000000000000000000000000 % 0000000060000000000000000000000000007f % 000000000000000000000000000018000000000000000000000000000000000000000000000000 % 0000000060000000000000000000000000000e % 000000000000000000000000000018000000000000000000000000000000000000000000000000 % 0000000060000000000000000000000000000f % 00000000000000000000000000001fffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffe0000000000000000000000000003a % 00000000000000000000000000001fffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffe0000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000003ffffffffffffffffffffffffffffffffffffffffff % ff000000000000000000000000000000000018 % 000000000000000000000000000000000002000000000000000000000000000000000000000000 % 0100000000000000000000000000000000001e % 000000000000000000000000000000000002000000000000000000000000000000000000000000 % 0100000000000000000000000000000000001e % 000000000000000000000000000000000002000000000000000000000000000000000000000000 % 0100000000000000000000000000000000001e % 000000000000000000000000000000000002000300000000000000000000000000000000000000 % 0100000000000000000000000000000000001e % 00000000000000000000000000000000000200010c000000000000000000000000000000000000 % 0100000000030004000000000000000000001e % 000000000000000000000000000000000002000104000000000000000000000000000000000000 % 0100000000010008000000000000000000001e % 0000000000000000000000000000000000020e713c000000000000000000000000000000000000 % 0106df3df601639c000000000000000000001e % 000000000000000000000000000000000002118944000000000000000000000000000000000000 % 0102489099019448000000000000000000001e % 000000000000000000000000000000000002108944000000000000000000000000000000000000 % 0102d79091011448000000000000000000001e % 000000000000000000000000000000000002118944000000000000000000000000000000000000 % 0103f89091011448000000000000000000001e % 0000000000000000000000000000000000020e73be000000000000000000000000000000000000 % 010127f9fbc3bb8e000000000000000000001e % 000000000000000000000000000000000002000000000000000000000000000000000000000000 % 0100000000400000000000000000000000001e % 000000000000000000000000000000000002000000000000000000000000000000000000000000 % 0100000000000000000000000000000000001e % 000000000000000000000000000000000002000000000000000000000000000000000000000000 % 0100000000000000000000000000000000001e % 000000000000000000000000000000000002000000000000000000000000000000000000000000 % 0100000000000000000000000000000000001e % 00000000000000000000000000000000003fc00000000000000000000000000000000000000000 % 1ff0000000000000000000000000000000001e % 00000000000000000000000000000000003fc00000000000000000000000000000000000000000 % 0fe00000000000000000000000000000000008 % 00000000000000000000000000000000001fc00000000000000000000000000000000000000000 % 0fe00000000000000000000000000000000000 % 00000000000000000000000000000000001fc00000000000000000000000000000000000000000 % 0fe0000000000000000000000000000000005a % 00000000000000000000000000000000001f800000000000000000000000000000000000000000 % 07c00000000000000000000000000000000000 % 00000000000000000000000000000000000f800000000000000000000000000000000000000000 % 07c00000000000000000000000000000000000 % 00000000000000000000000000000000000f800000000000000000000000000000000000000000 % 07c00000000000000000000000000000000000 % 00000000000000000000000000000000000f000000000000000000000000000000000000000000 % 03800000000000000000000000000000000000 % 000000000000000000000000000000000007000000000000000000000000000000000000000000 % 03800000000000000000000000000000000000 % 000000000000000000000000000000000007000000000000000000000000000000000000000000 % 03800000000000000000000000000000000000 % 000000000000000001fffffffffffffffffffffffffffffffffffc00000000ffffffffffffffff % fffffffffffffffffffe000000000000000069 % 000000000000000001fffffffffffffffffffffffffffffffffffc00000000ffffffffffffffff % fffffffffffffffffffe000000000000000064 % 00000000000000000100000000000000000000000000000000000c000000008000000000000000 % 00000000000000000002000000000000000073 % 00000000000000000100000000000000000000000000000000000c000000008000000000000000 % 00000000000000000002000000000000000076 % 00000000000000000100000000000000000000000000000000000c000000008000000000000000 % 0000000000000000000200000000000000003f % 00000000000000000100000000000000000000000000000000000c000000008000000000100606 % 00000001800000000002000000000000000068 % 00000000000000000100000000000000000000000000000000000c000000008000000000100202 % 0000000080c000000002000000000000000066 % 00000000000000000100000000000000000000000000000000000c000000008000000000000202 % 00000000808000000002000000000000000068 % 00000000000000000100000000000000000000000000000000000c00000000800001dde7f1e2e2 % 380f1b8f809e7c000002000000000000000006 % 00000000000000000100000000000000000000000000000000000c000000008000008a12121332 % 7c108c58813320000002000000000000000079 % 00000000000000000100000000000000000000000000000000000c00000000800000d072107212 % 40038850812120000002000000000000000078 % 00000000000000000100000010060600018000000400001000000c000000008000005192119212 % 400c8850822120000002000000000000000079 % 00000000000000000100000010020200008000008400021000000c000000008000006232123232 % 64118851822320000002000000000000000078 % 00000000000000000100000000020200008000008000020000000c0000000080000021df39dbe7 % 380edceec41e70000002000000000000000079 % 00000000000000000101dfcfb1e2e2700f8e3c79eddde7b1e6e00c000000008000000000000000 % 00000000040000000002000000000000000078 % 000000000000000001008c24121332f8189f42c4848a121333100c000000008000000000000000 % 000000000c0000000002000000000000000079 % 00000000000000000100d0e41072128010900e8084d0721212100c000000008000000000000000 % 00000000000000000002000000000000000073 % 00000000000000000100532411921280109032808451921212100c000000008000000000000000 % 00000000000000000002000000000000000075 % 000000000000000001006464123232c8119946c48462321232100c000000008000000000000100 % 00000002000008000002000000000000000073 % 0000000000000000010023be39dbe7700ece3b78ee21dbb9e7380c000000008000000004000100 % 10000042000108000002000000000000000075 % 00000000000000000100000000000000000000000000000000000c000000008000000004000000 % 10000040000100000002000000000000000073 % 00000000000000000100000000000000000000000000000000000c000000008079e6e0df7de36e % 3c1e1ef677f3d8f37002000000000000000075 % 00000000000000000100000000000000000000000000000000000c0000000080c7331124221131 % 10213142230909998802000000000000000073 % 00000000000000000100000000000000000000000000000000000c0000000080821211d4207121 % 10072042343909090802000000000000000075 % 00000000000000000100000000000000000000000000000000000c000000008082121034219121 % 1019204214c909090802000000000000000073 % 00000000000000000100000008188000000000000000008000000c0000000080c6321114223121 % 1023314219190919080200000000000000006d % 00000000000000000100000010088000200000000000088000000c000000008079e739e771dbf3 % 9c1d9e7708eddcf39c0200000000000000005c % 00000000000000000100000020080000200000000000084000000c000000008000000000000000 % 0000000000000000000200000000000000005c % 00000000000000000100000027899c6e783ee1f211c35e4000000c000000008000000000000000 % 0000000000000000000200000000000000005c % 0000000000000000010000002c48be312011f31633e4884000000c000000008000000000000000 % 0000000000000000000200000000000000005c % 0000000000000000010000002808a021201102121207484000000c000000008000000000000000 % 0000000000000000000200000000000000005c % 0000000000000000010000002808a021201102121200c84000000c000000008000000000000000 % 0000000000000000000200000000000000005c % 0000000000000000010000002c48b221201192323324484000000c00000000800000040c400000 % 0000000000004000000200000000000000005c % 000000000000000001000000279ddc73b838e1d1d9c78e4000000c000000008000000804400010 % 0000000000044000000200000000000000005c % 00000000000000000100000020000000000000100000004000000c000000008000001004000010 % 00000000000420000002000000000000000062 % 00000000000000000100000010000000000000100000008000000c0000000080000013c4ce373c % 1f70f908e1af2000000200000000000000005c % 00000000000000000100000000000000000000380000000000000c0000000080000016245f1890 % 08f98b19f2442000000200000000000000005c % 00000000000000000100000000000000000000000000000000000c000000008000001404501090 % 0881090903a42000000200000000000000005c % 00000000000000000100000000000000000000000000000000000c000000008000001404501090 % 0881090900642000000200000000000000005c % 00000000000000000100000000000000000000000000000000000c000000008000001624591090 % 08c9191992242000000200000000000000005c % 00000000000000000100000000000000000000000000000000000c0000000080000013ceee39dc % 1c70e8ece3c72000000200000000000000005c % 00000000000000000100000000000000000000000000000000000c000000008000001000000000 % 0000080000002000000200000000000000005c % 00000000000000000100000000000000000000000000000000000c000000008000000800000000 % 00000800000040000002000000000000000067 % 00000000000000000100000000000000000000000000000000000c000000008000000000000000 % 00001c0000000000000200000000000000005c % 00000000000000000100000000000000000000000000000000000c000000008000000000000000 % 0000000000000000000200000000000000005d % 000000000000000001fffffffffffffffffffffffffffffffffffc00000000ffffffffffffffff % fffffffffffffffffffe00000000000000005c % 000000000000000000000000000000000002000000000000000000000000000000000000000000 % 0100000000000000000000000000000000005c % 000000000000000000000000000000000002000000000000000000000000000000000000000000 % 0100000000000000000000000000000000005c % 000000000000000000000000000000000002000000000000000000000000000000000000000000 % 0100000000000000000000000000000000005c % 000000000000000000000000000000000002000000000000000000000000000000000000000000 % 0100000000000000000000000000000000005c % 000000000000000000000000000000000002000000000000000000000000000000000000000000 % 01000000000000000000000000000000000014 % 000000000000000000000000000000000002000000000000000000000000000000000000000000 % 0100000000000000000000000000000000005c % 000000000000000000000000000000000002000000000000000000000000000000000000000000 % 01000000000000000000000000000000000006 % 000000000000000000000000000000000002000000000000000000000000000000000000000000 % 0100000000000000000000000000000000001f % 000000000000000000000000000000000002000000000000000000000000000000000000000000 % 0100000000000000000000000000000000005c % 000000000000000000000000000000000002000000000000000000000000000000000000000000 % 0100000000000000000000000000000000005c % 000000000000000000000000000000000002000000000000000000000000000000000000000000 % 0100000000000000000000000000000000005c % 000000000000000000000000000000000002000000000000000000000000000000000000000000 % 0100000000000000000000000000000000005c % 000000000000000000000000000000000002000000000000000000000000000000000000000000 % 0100000000000000000000000000000000001e % 000000000000000000000000000000000002000000000000000000000000000000000000000000 % 0100000000000000000000000000000000005f % 000000000000000000000000000000000002000000000000000000000000000000000000000000 % 01000000000000000000000000000000000000 % 000000000000000000000000000000000002000000000000000000000000000000000000000000 % 01000000000000000000000000000000000001 % 000000000000000000000000000000000003ffffffffffffffffffffffffffffffffffffffffff % ff00000000000000000000000000000000005c % 000000000000000000000000000000000003ffffffffffffffffffffffffffffffffffffffffff % ff00000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000064 % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000003f % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000005c % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 00000000000000000000000000000000000058 % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000007f % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000000f % 000000000000000000000000000000000000000000000000000000001fe0000000000000000000 % 0000000000000000000000000000000000000f % 000000000000000000000000000000000000000000000000000000001fe0000000000000000000 % 0000000000000000000000000000000000000f % 000000000000000000000000000000000000000000000000000000001fc0000000000000000000 % 0000000000000000000000000000000000000e % 000000000000000000000000000000000000000000000000000000000fc0000000000000000000 % 0000000000000000000000000000000000000f % 000000000000000000000000000000000000000000000000000000000fc0000000000000000000 % 0000000000000000000000000000000000000f % 000000000000000000000000000000000000000000000000000000000f80000000000000000000 % 00000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000780000000000000000000 % 0000000000000000000000000000000000000f % 000000000000000000000000000000000000000000000000000000000780000000000000000000 % 0000000000000000000000000000000000000f % 000000000000000000000000000000000000000000000000000000000700000000000000000000 % 0000000000000000000000000000000000000f % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000000f % 000000000000000000000000000000000000000000000000000000000300000000000000000000 % 0000000000000000000000000000000000007f % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000e % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000f % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000180000000020000200000600000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000080000000020000200000200000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000080000000000000000000200000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000f9dee1e6ec67806e6ec6e271dc0000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000001888b1213322c4092332732f8580000000 % 0000000000000000000000000000000000003a % 00000000000000000000000000000000000000000000108ca1072222800ea22221280200000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000001085211922228001a22221280700000000 % 0000000000000000000000000000000000003a % 00000000000000000000000000000000000000000000118521232222c408a222232c8980000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000ec2739df777780f77773e771dc0000000 % 00000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000002000000000000000020000000000000 % 0000000000000000000000000000000000003a % 00000000000000000000000000000000000000000000000e000000000000000020000000000000 % 00000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000018000000000000000070000000000000 % 0000000000000000000000000000000000003a % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000018 %%EndPreview save /d_sv_obj exch def userdict /IslandDrawDict 300 dict dup begin put /bdef {bind def} bind def /E {exch} bdef /FF {findfont} bdef /MF {makefont} bdef /RO {rotate} bdef /SC {scale} bdef /SF {setfont} bdef /SG {setgray} bdef /TR {translate} bdef /bp {lj lw rgb} bdef /bpbw {lj lw setgray} bdef /c {curveto} bdef /cl {closepath} bdef /fi {eofill} bdef /g {setgray} bdef /gr {grestore} bdef /gs {gsave} bdef /l {lineto} bdef /lj {setlinejoin} bdef /lw {setlinewidth} bdef /m {moveto} bdef /n {newpath} bdef /nx {/x E def} bdef /r {rmoveto} bdef /rl {rlineto} bdef /rgb {setrgbcolor} bdef /s {show} bdef /sd {setdash} bdef /sp {x 0 rmoveto} bdef /ss {currentpoint pop E m} bdef /st {stroke} bdef %% pattern stuff /BPSIDE 32 def %% pixels per pattern side /PATFREQ 3.0 def %% pattern pixels per mm /dp_mat [PATFREQ 0 0 PATFREQ 0 0] def /dp_pw BPSIDE def %% pattern pixel width /dp_ph BPSIDE def %% pattern pixel height /dp_w dp_pw PATFREQ div def %% pattern mm width /dp_h dp_ph PATFREQ div def %% pattern mm height /savemat matrix def /topmat matrix def /patmat matrix def %% catch nocurrentpoint error for: pathbbox /ncpoint errordict /nocurrentpoint get def errordict begin /nocurrentpoint { dup /pathbbox load eq {pop 0 0 1 1} {ncpoint} ifelse } bdef end /ar { %% sa ea sx sy rot tx ty matrix currentmatrix 8 1 roll TR RO SC n 0 0 1 5 3 roll arc setmatrix } bdef /arn { %% sa ea sx sy rot tx ty TR RO SC matrix currentmatrix 8 1 roll n 0 0 1 5 3 roll arcn setmatrix } bdef /el { %% sx sy rot tx ty matrix currentmatrix 6 1 roll TR RO SC n 0 0 1 0 360 arc setmatrix cl } bdef /image_raster { %% sw sh sd dw dh xs ys TR SC /sd E def /sh E def /sw E def /imagebuf sw sd mul 7 add 8 idiv string def sw sh sd [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop} image } bdef /imagemask_raster { TR SC /sh E def /sw E def /imagebuf sw 7 add 8 idiv string def sw sh false [sw 0 0 sh 0 0] {currentfile imagebuf readhexstring pop} imagemask } bdef /dither_color_raster { % bool sw sh sd dw dh xs ys TR SC /sd E def /sh E def /sw E def sd 8 eq and { /imagebuf 3 string def /grayval 1 string def sw sh sd [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop pop imagebuf 0 get 0.299 mul imagebuf 1 get 0.587 mul add imagebuf 2 get 0.114 mul add cvi grayval exch 0 exch put grayval } image } { /imagebuf sw 3 mul sd mul 7 add 8 idiv string def sh { currentfile imagebuf readhexstring pop pop } repeat } ifelse } bdef /image_color_raster { % bool sw sh sd dw dh xs ys /colorimage where not { dither_color_raster } { pop TR SC /sd E def /sh E def /sw E def pop /imagebuf sw 3 mul sd mul 7 add 8 idiv string def sw sh sd [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop} false 3 colorimage } ifelse } bdef /patpath { /inv E def topmat setmatrix pathbbox %% get lo - hi indecies /hy E dp_h div floor cvi def /hx E dp_w div floor cvi def /ly E dp_h div floor cvi def /lx E dp_w div floor cvi def lx 1 hx { dp_w mul ly 1 hy { dp_h mul E dup 3 1 roll E patmat currentmatrix pop TR dp_pw dp_ph inv dp_mat dp_proc imagemask patmat setmatrix } for pop } for } bdef % setpattern brush of patterns instead of gray /setpattern { /blue E def /green E def /red E def /freq E def /bwidth E def /bpside E def /bstring E def /onbits 0 def /offbits 0 def freq 0 {/y E def /x E def /xindex x 1 add 2 div bpside mul cvi def /yindex y 1 add 2 div bpside mul cvi def bstring yindex bwidth mul xindex 8 idiv add get not 1 7 xindex 8 mod sub bitshift and 0 ne {/onbits onbits 1 add def 1} {/offbits offbits 1 add def 0} ifelse } setscreen {} settransfer systemdict /setcmykcolor known { /fact 1 onbits offbits onbits add div sub def 1 red sub fact mul 1 green sub fact mul 1 blue sub fact mul 0 setcmykcolor } { offbits offbits onbits add div setgray} ifelse } bdef /dmatrix matrix def /dpi 72 0 dmatrix defaultmatrix dtransform dup mul E dup mul add sqrt def /B {gs bp st gr} bdef %% brush: gr lw lj /Bbw {gs bpbw st gr} bdef %% brush: gr lw lj /F {gs rgb eofill gr} bdef %% fill: gr /Fbw {gs setgray eofill gr} bdef %% fill: gr /PB {gs lj lw setpattern st gr} bdef /PF {gs eoclip patpath gr} bdef /BB {gs rgb lj lw strokepath clip patpath gr} bdef /xdef {exch def} bdef /clip_region { /ht xdef /wd xdef /bm xdef /lm xdef newpath lm bm moveto 0 ht rlineto wd 0 rlineto 0 ht neg rlineto closepath clip } bdef %! Island text prolog Version 3.1 %% %%BeginProlog /reencode_small_dict 12 dict def /ReencodeSmall { reencode_small_dict begin /new_codes_and_names exch def /new_font_name exch def /base_font_name exch def /base_font_dict base_font_name findfont def /newfont base_font_dict maxlength dict def base_font_dict { exch dup /FID ne { dup /Encoding eq { exch dup length array copy newfont 3 1 roll put } { exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall newfont /FontName new_font_name put new_codes_and_names aload pop new_codes_and_names length 2 idiv { newfont /Encoding get 3 1 roll put } repeat new_font_name newfont definefont pop end %reencode_small_dict } def /extended_Zapf [ 8#223 /a89 8#224 /a90 8#225 /a93 8#226 /a94 8#227 /a91 8#230 /a92 8#231 /a205 8#232 /a85 8#233 /a206 8#234 /a86 8#235 /a87 8#236 /a88 8#237 /a95 8#240 /a96 ] def /extended_Standard [ 29 /thorn 30 /yacute 31 /divide 128 /Acircumflex 129 /Adieresis 130 /Agrave 131 /Aring 132 /Atilde 133 /Ccedilla 134 /Eacute 135 /Ecircumflex 136 /Edieresis 137 /Egrave 138 /Iacute 139 /Icircumflex 140 /Idieresis 141 /Igrave 142 /Ntilde 143 /Oacute 144 /Ocircumflex 145 /Odieresis 146 /Ograve 147 /Otilde 148 /Scaron 149 /Uacute 150 /Ucircumflex 151 /Udieresis 152 /Ugrave 153 /Ydieresis 154 /Zcaron 155 /aacute 156 /acircumflex 157 /adieresis 158 /agrave 159 /aring 160 /atilde 161 /exclamdown 162 /cent 163 /sterling 164 /fraction 165 /yen 166 /florin 167 /section 168 /currency 169 /quotesingle 170 /quotedblleft 171 /guillemotleft 172 /guilsinglleft 173 /guilsinglright 174 /fi 175 /fl 176 /plusminus 177 /endash 178 /dagger 179 /daggerdbl 180 /periodcentered 181 /twosuperior 182 /paragraph 183 /bullet 184 /quotesinglbase 185 /quotedblbase 186 /quotedblright 187 /guillemotright 188 /ellipsis 189 /perthousand 190 /threesuperior 191 /questiondown 192 /mu 193 /grave 194 /acute 195 /circumflex 196 /tilde 197 /macron 198 /breve 199 /dotaccent 200 /dieresis 201 /onesuperior 202 /ring 203 /cedilla 204 /onequarter 205 /hungarumlaut 206 /ogonek 207 /caron 208 /emdash 209 /ccedilla 210 /copyright 211 /eacute 212 /ecircumflex 213 /edieresis 214 /egrave 215 /iacute 216 /icircumflex 217 /idieresis 218 /igrave 219 /logicalnot 220 /minus 221 /ntilde 222 /oacute 223 /ocircumflex 224 /odieresis 225 /AE 226 /onehalf 227 /ordfeminine 228 /ograve 229 /otilde 230 /registered 231 /scaron 232 /Lslash 233 /Oslash 234 /OE 235 /ordmasculine 236 /trademark 237 /uacute 238 /ucircumflex 239 /udieresis 240 /ugrave 241 /ae 242 /ydieresis 243 /zcaron 244 /Aacute 245 /dotlessi 246 /threequarters 247 /Eth 248 /lslash 249 /oslash 250 /oe 251 /germandbls 252 /multiply 253 /Yacute 254 /Thorn 255 /eth ] def /extended_Symbol [ ] def /extend_font { % stack: fontname newfontname exch dup (ZapfDingbats) eq { cvn exch cvn extended_Zapf ReencodeSmall } { dup (Symbol) eq { cvn exch cvn extended_Symbol ReencodeSmall } { cvn exch cvn extended_Standard ReencodeSmall } ifelse } ifelse } bind def /extend_font_name { % stack: font_name_string dup length 1 add string /extended_font_name exch def extended_font_name 0 (_) putinterval extended_font_name 1 3 -1 roll putinterval extended_font_name } bind def /gf { /f exch def f cvn where { f exch begin cvn load exec setfont end } { f 0 f length 8 sub getinterval dup /localfont exch extend_font_name def localfont extend_font localfont findfont /xsz f f length 4 sub 4 getinterval cvi def /ysz f f length 8 sub 4 getinterval cvi def [ xsz 0 0 ysz neg 0 0 ] makefont dup f cvn exch def setfont } ifelse } bind def /gfns { /f exch def f cvn where { f exch begin cvn load exec setfont end } { f 0 f length 8 sub getinterval cvn findfont /xsz f f length 4 sub 4 getinterval cvi def /ysz f f length 8 sub 4 getinterval cvi def [ xsz 0 0 ysz neg 0 0 ] makefont dup f cvn exch def setfont } ifelse } bind def /ul { % space drop thickness gs currentpoint currentlinewidth currentpoint n m 6 -3 roll lw 0 exch r 0 rl st lw m gr } bind def /nxtab { currentpoint pop 1000.0 mul cvi tab mod tab exch sub 1000.0 div 0 rmoveto } bind def /nx { /x exch def } bind def 0. nx %%EndProlog gsave 2.83465 -2.83465 scale 0 -279.4 translate topmat currentmatrix pop n savemat currentmatrix pop [1 0 0 1 73.876 36.313] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -860 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (cold, warm) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 116.608 150.819] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (warm, hot) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 88.75 19.156] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -340 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (release) s -340 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (solver?) s savemat setmatrix n 82.5 15 m 95 15 l 100 20 l 95 25 l 82.5 25 l 77.5 20 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 51.403 93.248] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (hot) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 91.564 93.248] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (warm) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 131.528 93.248] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (cold) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 40 36.656] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -614 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (free retained) s -756 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (data structures) s savemat setmatrix n 25 32.5 m 55 32.5 l 55 42.5 l 25 42.5 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 90 36.656] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -490 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (determine) s -588 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (type of start) s savemat setmatrix n 75 32.5 m 105 32.5 l 105 42.5 l 75 42.5 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 90 74.61] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -674 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (initialise local) s -874 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (constraint system) s -402 231 m 463 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(scaling\)) s savemat setmatrix n 73.75 70 m 106.25 70 l 106.25 85 l 73.75 85 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 90 56.656] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -732 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (update options) s -718 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (and tolerances) s savemat setmatrix n 75 52.5 m 105 52.5 l 105 62.5 l 75 62.5 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 65 160.406] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -1010 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (variable deactivation) s -724 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(client request\)) s savemat setmatrix n 45 155 m 85 155 l 85 167.5 l 45 167.5 l cl gsave 0 0 0 0.176 0 B grestore n 90 32.5 m 88.991 29.472 l 91.009 29.472 l cl 0 0 0 F n 90 25 m 90 29.472 l gsave 0 0 0 0.176 0 B grestore n 90 52.5 m 88.991 49.472 l 91.009 49.472 l cl 0 0 0 F n 90 42.5 m 90 49.472 l gsave 0 0 0 0.176 0 B grestore n 90 47.5 m 86.972 48.509 l 86.972 46.491 l cl 0 0 0 F n 40 42.5 m 40 47.5 l 86.972 47.5 l gsave 0 0 0 0.176 0 B grestore n 90 70 m 88.991 66.972 l 91.009 66.972 l cl 0 0 0 F n 90 62.5 m 90 66.972 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 50 101.656] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -384 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (perform) s -422 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (hot start) s savemat setmatrix n 35 97.5 m 65 97.5 l 65 107.5 l 35 107.5 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 90 101.656] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -384 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (perform) s -536 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (warm start) s savemat setmatrix n 75 97.5 m 105 97.5 l 105 107.5 l 75 107.5 l cl gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 130 101.656] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -384 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (perform) s -462 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (cold start) s savemat setmatrix n 115 97.5 m 145 97.5 l 145 107.5 l 115 107.5 l cl gsave 0 0 0 0.176 0 B grestore n 90 97.5 m 88.991 94.472 l 91.009 94.472 l cl 0 0 0 F n 90 85 m 90 94.472 l gsave 0 0 0 0.176 0 B grestore n 50 97.5 m 48.991 94.472 l 51.009 94.472 l cl 0 0 0 F n 90 90 m 50 90 l 50 94.472 l gsave 0 0 0 0.176 0 B grestore n 130 97.5 m 128.99 94.472 l 131.01 94.472 l cl 0 0 0 F n 90 90 m 130 90 l 130 94.472 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 66.493 150.766] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (cold) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 90 124.269] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -1176 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (common start activities:) s -1514 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (determine loadable constraints) s -1586 231 m 463 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (and variables; initialise PSE and) s -1592 463 m 695 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (DSE pricing, pivot rejection, and) s -1714 695 m 927 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (perturbation-based antidegeneracy) s savemat setmatrix n 57.5 120 m 122.5 120 l 122.5 142.5 l 57.5 142.5 l cl gsave 0 0 0 0.176 0 B grestore n 90 120 m 88.991 116.97 l 91.009 116.97 l cl 0 0 0 F n 90 107.5 m 90 116.97 l gsave 0 0 0 0.176 0 B grestore n 90 112.5 m 86.972 113.51 l 86.972 111.49 l cl 0 0 0 F n 50 107.5 m 50 112.5 l 86.972 112.5 l gsave 0 0 0 0.176 0 B grestore n 90 112.5 m 93.028 111.49 l 93.028 113.51 l cl 0 0 0 F n 130 107.5 m 130 112.5 l 93.028 112.5 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 125 19.156] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -614 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (free retained) s -756 0 m 231 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (data structures) s savemat setmatrix n 110 15 m 140 15 l 140 25 l 110 25 l cl gsave 0 0 0 0.176 0 B grestore n 110 20 m 106.97 21.009 l 106.97 18.991 l cl 0 0 0 F n 100 20 m 106.97 20 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 101.474 22.879] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -43 0 m 0 ss (Bookman-Light01600160) gf 0.00 0.00 0.00 rgb (y) s savemat setmatrix n 147.5 27.5 m 146.49 24.472 l 148.51 24.472 l cl 0 0 0 F n 140 20 m 147.5 20 l 147.5 24.472 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 147.5 32.5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -312 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (return) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 115 158.642] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -764 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (variable and/or) s -1010 0 m 215 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (constraint activation) s -724 215 m 431 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (\(client request\)) s savemat setmatrix n 95 155 m 135 155 l 135 167.5 l 95 167.5 l cl gsave 0 0 0 0.176 0 B grestore n 65 155 m 63.991 151.97 l 66.009 151.97 l cl 0 0 0 F n 90 142.5 m 90 147.5 l 65 147.5 l 65 151.97 l gsave 0 0 0 0.176 0 B grestore n 115 155 m 113.99 151.97 l 116.01 151.97 l cl 0 0 0 F n 90 147.5 m 115 147.5 l 115 151.97 l gsave 0 0 0 0.176 0 B grestore n 90 15 m 88.991 11.972 l 91.009 11.972 l cl 0 0 0 F n 90 7.5 m 90 11.972 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 90 5] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -230 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (start) s savemat setmatrix n 90 180 m 88.991 176.97 l 91.009 176.97 l cl 0 0 0 F n 65 167.5 m 65 172.5 l 90 172.5 l 90 176.97 l gsave 0 0 0 0.176 0 B grestore n 115 167.5 m 115 172.5 l 90 172.5 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 90 185] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -824 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dynamic simplex) s savemat setmatrix n 55 37.5 m 58.028 36.491 l 58.028 38.509 l cl 0 0 0 F n 75 37.5 m 58.028 37.5 l gsave 0 0 0 0.176 0 B grestore userdict /#copies 1 put grestore %%Trailer %%DocumentNeededResources: font Bookman-Light %%DocumentSuppliedResources: end d_sv_obj restore DyLP-1.6.0/DyLP/doc/Figures/dualcalls.epsu0000644000076700007670000010732211171477034015121 0ustar %!PS-Adobe-3.0 EPSF-3.0 %%Title: /cs/mitacs1/lou/Bonsai/Doc/Dylp.New/Figures/dualcalls.epsu %%Creator: IslandDraw for lou %%CreationDate: Wed Sep 14 12:17:35 2005 %%Pages: 1 %%BoundingBox: 85 417 420 578 %%DocumentNeededResources: (atend) %%DocumentSuppliedResources: (atend) %%EndComments %%BeginPreview: 420 202 1 404 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000c00000c0002000008000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000040000040002000008000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000040000040000000000000 % 0000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000007cee03c5f6e6eff718000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000c44406248732448f88000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000060846404048212688808000 % 0000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000c0842804048212288808000 % 0000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000c08c2806248232308c88000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000180761003cfc3e711c708000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000180001000000200000008000 % 0000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000003000071f8000200000028000 % 0000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000030000c000000700000070000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000c00000000000000000000000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000c00000000000000000000000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000000001800000000000000000000000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000000001800000000000000000000000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000000003000000000000000000000000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000000003000000000000000000000000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000000006000000000000000000000000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000000006000000000000000000000000 % 0000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000c000000000000000000000000 % 0000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000c000000000000000000000000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000000018000000000000000000000000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000000018000000000000000000000000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000000030000000000000000000000000 % 0000060000600010000030000000 % 0000000000000000000000000000000000000000000000000000300000c0000600006000000000 % 0000020000200010000010000000 % 000000000000000000000000000000000000000000000000000060000040000200002000040000 % 0000020000200000000015800000 % 000000000000000000000000000000000000000000000000000060000040000200002000040000 % 00003e211e26efb1e71dd2000000 % 0000000000000000000000000000000000000000000000000000c00007cee03e213c27884f0000 % 00006263212734131f8594000000 % 0000000000000000000000000000000000000000000000000000c0040c44406263422cd8c4007f % fff042210722141208021e000000 % 0000000000000000000000000000000000000000000000000001800e08464042210e284844007f % fff0422119221412080712000000 % 0000000000000000000000000000000000000000000000000001800c0842804221322848440000 % 00004623232234131c8993000000 % 0000000000000000000000000000000000000000000000000003001808c28046234628c8c40000 % 00003b1d9df3ee39e71dfb800000 % 000000000000000000000000000000000000000000000000000300380761003b1dbb7787670000 % 0000000000020000000000000000 % 000000000000000000000000000000000000000000000000000600700001000000000000000000 % 0000000000020000000000000000 % 0000000000000000000000000000000000000000000000000006006000071f8000000000000000 % 0000000000070000000000000000 % 000000000000000000000000000000000000000000000000000c00c0000c000000000000000000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000000c01c00000000000000000000000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000001801800000000000000000000000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000001803000000000000000000000000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000003007000000000000000000000000 % 0000000000000000000000000000 % 00000000000000000000000000000000000000000000000000300e000000000000000000000000 % 0000000000000000000000000000 % 00000000000000000000000000000000000000000000000000600c000000000000000000000000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000006018000000000000000000000000 % 0000000000000000000000000000 % 00000000000000000000000000000000000000000000000000c038000000000000000000000000 % 0000000000000000000000000000 % 00000000000000000000000000000000000000000000000000c030000000000000000000000000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000018060000000000000000000000000 % 0000000000000000000000000000 % 0000000000000000000000000000000000000000000000000180e0000000000000000000000000 % 0000000000000000000000000000 % 0000000000000000000000000000000000000000000000000301c0000000000000000000000000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000030180000000000000000000000000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000060300000000000000000000000000 % 0000000000000000000000000000 % 0000000000000000000000000000000000000000000000000607000000c0000600006004000000 % 0000000000000000000000000000 % 0000000000000000000000000000000000000000000000000c0600000040000200002004000200 % 0000000000000000000000000000 % 0000000000000000000000000000000000000000000000000c0c00000040000200002000000200 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000181c000007cee03e213c2dccefe780 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000183800000c44406263422e64473200 % 0000000000000000000000000000 % 0000000000000000000000000000000000000000000000003030000c08464042210e24246a1200 % 0000000000000000000000000000 % 0000000000000000000000000000000000000000000000003060001c08428042213224242a1200 % 0000000000000000000000000000 % 00000000000000000000000000000000000000000000000060e0003808c2804623462464323200 % 0000000000000000000000000000 % 00000000000000000000000000000000000000000000000060c000700761003b1dbb77ce11e380 % 0000000000000000000000000000 % 000000000000000000018000000000200000000000000000c18001e00001000000000400000000 % 0000000000000000000000000000 % 000000000000000000008000000200200000000000000000c380038000071f8000000400000000 % 0000000000000000000000000000 % 00000000000000000000800000020000000000000000000187000700000c000000000e00000000 % 0000000000000000000000000000 % 0000000000000000000f9dc035c7b7677dcf1fdd8340000186000e000000000000000000000000 % 0000000000000000000000000000 % 0000000000000000001888804be239a22e708866448000030c003c000000000000000000000000 % 0000000000000000000000000000 % 000000000000000003108c80760210a344238844474000031c0070000000000000000000000000 % 000000000000000000000000000f % 0000000000000000071085000e0210a1442c884440c000061800e0000000000000000000000000 % 0000000000000000000000000000 % 000000000000000006118500472211a184718844444000063001c0000000000000000000000000 % 0000000000000000000000000000 % 00000000000000000c0ec20079c39f7087cedceee780000c700780000000000000000000000000 % 0000000000000000000000000000 % 00000000000000001c00020000001000040000000000000ce00e00000000000000000000000000 % 0000180000000000818000000000 % 000000000000000018000e3f000010000400000000000018c01c00000000000000000000000000 % 0000080000000001808000000000 % 000000000000000030001800000038000e00000000000019803800000000000000000000000000 % 000008000000000080ac00000000 % 00000000000000007000000000000000000000000000003380f000000000000000000000000000 % 0000f9dc078f1e78b89000000000 % 00000000000000006000000000000000000000000000003301c000000000000000000000000000 % 030188880858b1c4c4a000000000 % 0000000000000000c0000000000000000000000000000066038000000000000000000000000000 % 070108c801d0208084f000000000 % 0000000000000001c000000000000000000000000000006e070000000000000000000000000000 % 0e01085006502080849000000000 % 0000000000000001800000000000000000000000000000dc1e0000000000000000000000000000 % 1c01185008d8b1c4849800000000 % 0000000000000003000000000000000000000000000000d8380000000000000000000000000000 % 3800ec20076f1e79cfdc00000000 % 0000000000000007000000000000000000000000000001b0700000000000000000000000000000 % 7000002000000000000000000000 % 0000000000000006000000000000000000000000000001f0e00000000000000000000000000000 % e00000e3f0000000000000000000 % 000000000000000c00000000000000000000000000000363c00000000000000000000000000001 % c000018000000000000000000000 % 000000000000001c000000000000000000000000000003c7000000000000000000000000000003 % 8000000000000000000000000000 % 0000000000000018000000000000000000000000000007ce000000000000000000000000000007 % 0000000000000000000000000000 % 00000000000000300000000000000000000000000000079c00000000000000000000000000000e % 0000000000000000000000000000 % 000000000000007000000000000000000000000000000f7800000000000000000000000000001c % 0000000000000000000000000000 % 000000000000006000000000000000000000000000000ee0000000000000000000000000000038 % 0000000000000000000000000000 % 00000000000000c000000000000000000000000000001fc00000000000c0000600000000000070 % 0000180000018180000100000200 % 03000018000181c000000000000000000003000031c01f800000000000400002000000000000e0 % 0000080000008088000100000200 % 010000080000818000000000000000000001000012203f000000000000400002000000000001c0 % 0000080000008088000000000000 % 010000080000830000000000000000000001000012203c000000000007cee03e2138dcdc780380 % 0000f9dc078f8f9e79bb3bfdc600 % 1f3b80f884f087000000000000000000001f109e12207800000000000c444062637c6262840700 % 0001888808589888cdcd1123e200 % 311101898d0887fffffffffffffffffffc3131a110607ffffffffffc08464042214042421c07ff % ff0108c801d0908884851a220200 % 21190108843887fffffffffffffffffffc21108710407ffffffffffc08428042214042426407ff % ff0108500650908884850a220200 % 210a010884c88700000000000000000000211099108070000000000008c28046236442428c0380 % 0001185008d191888c8d0c232200 % 230a01188d1883000000000000000000002311a311107000000000000761003b1db8e7e77601c0 % 0000ec20076ecece78fb8471c200 % 1d8400ec76edc3800000000000000000001d8eddbbe038000000000000010000000000000000e0 % 0000002000000000008000000200 % 00040000000001c000000000000000000000000000003c000000000000071f8000000000000070 % 000000e3f0000000008000000a00 % 001c7e00000000c000000000000000000000000000001c0000000000000c000000000000000038 % 000001800000000001c000001c00 % 00300000000000e000000000000000000000000000001e0000000000000000000000000000001c % 0000000000000000000000000000 % 000000000000007000000000000000000000000000000f0000000000000000000000000000000e % 0000000000000000000000000000 % 000000000000003000000000000000000000000000000f80000000000000000000000000000007 % 0000000000000000000000000000 % 000000000000003800000000000000000000000000000780000000000000000000000000000003 % 8000000000000000000000000000 % 000000000000001c000000000000000000000000000006c0000000000000000000000000000001 % c000000000000000000000000000 % 000000000000000c000000000000000000000000000003e0000000000000000000000000000000 % e00000000000000000000000000f % 000000000000000e00000000000000000000000000000360000000000000000000000000000000 % 7000180000180004000010000000 % 0000000000000007000000000000000000000000000003b0000000000000000000000000000000 % 3800080000080004000010000000 % 0000000000000003000000000000000000000000000001b8000000000000000000000000000000 % 1c00080000080000000000000000 % 00000000000000038000000000000000000000000000019c000000000000000000000000000000 % 0e00f9dc078bedcddfee3000000f % 0000000000000001c00000000000000000000000000000cc000000000000000000000000000000 % 070188880c490e64891f10000000 % 0000000000000000c00000000000000000000000000000c6000000000000000000000000000000 % 030108c808090424d11010000000 % 0000000000000000e0000000000000000000000000000067000000000000000000000000000000 % 0001085008090424511010000000 % 000000000000000070000000000000000000000000000063000000000000000000000000000000 % 000118500c490464611910000000 % 000000000000000030000000000000000000000000000031800000000000000000000000000000 % 0000ec20079f87ce238e10000000 % 000000000000000038000000000000000000000000000031c00000000000000000000000000000 % 0000002000000400000010000000 % 00000000000000001c030000000600030100000000000018e00000000000000000000000000000 % 000000e3f0000400000050000000 % 00000000000000000c010000000200010100000000000018600000000000000000000000000000 % 0000018000000e000000e000000e % 00000000000000000e01000000020001000000000000001c300000000000000000000000000000 % 0000000000000000000000000003 % 0000000000000000071f3b80f1e23cf1730000000000000c380000000000000000000000000000 % 0000000000000000000000000000 % 0000000000000000033111018a126399990000000000000c180000000000000000000000000000 % 0000000000000000000000000000 % 0000000000000000002119010072410909000000000000060c0000000000000000000000000000 % 0000000000000000000000000000 % 000000000000000000210a010192410909000000000000060e0000000000000000000000000000 % 0000000000000000000000000000 % 000000000000000000230a018a3263191900000000000003070000000000000000000000000000 % 0000000000000000000000000000 % 0000000000000000001d8400f1df3cf1f100000000000003030000000000000000000000000000 % 0000000000000000000000000000 % 000000000000000000000400000000000100000000000001818000000000000000000000000000 % 0000000000000000000000000000 % 000000000000000000001c7e00000000050000000000000181c000000000000000000000000000 % 0000000000000000000000000000 % 000000000000000000003000000000000e00000000000000c0c000000000000000000000000000 % 000000000000000000000000000f % 000000000000000000000000000000000000000000000000c06000000000000000000000000000 % 0000000000000000000000000003 % 000000000000000000000000000000000000000000000000e07000000000000000000000000000 % 000000000000000000000000000f % 000000000000000000000000000000000000000000000000603800000000000000000000000000 % 000000000000000000000000000f % 000000000000000000000000000000000000000000000000601800000000000000000000000000 % 000000000000000000000000000f % 000000000000000000000000000000000000000000000000300c00000000000000000000000000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000300e00000000000000000000000000 % 0000000060000000000206000000 % 000000000000000000000000000000000000000000000000180600000000000000000000000000 % 0000000020000000000602000000 % 000000000000000000000000000000000000000000000000180300000000000000000000000000 % 0000000020000000000202b00000 % 0000000000000000000000000000000000000000000000000c0380000000000000000000000000 % 00000003e7701e3c79e2e2400000 % 0000000000000000000000000000000000000000000000000c01c0000000000000000000000000 % 0000080622202162c71312800000 % 0000000000000000000000000000000000000000000000000600c0000000000000000000000000 % 00001c0423200740820213c0000f % 000000000000000000000000000000000000000000000000060060000000000000000000000000 % 000038042140194082021240000f % 000000000000000000000000000000000000000000000000070070000000000000000000000000 % 0000700461402362c71212600001 % 000000000000000000000000000000000000000000000000030030000000000000000000000000 % 0000e003b0801dbc79e73f700000 % 000000000000000000000000000000000000000000000000030018000000000000000000000000 % 0001c00000800000000000000000 % 00000000000000000000000000000000000000000000000001801c000000000000000000000000 % 00038000038fc000000000000000 % 00000000000000000000000000000000000000000000000001800e000000000000000000000000 % 0007000006000000000000000000 % 00000000000000000000000000000000000000000000000000c006000000000000000000000000 % 000e000000000000000000000000 % 00000000000000000000000000000000000000000000000000c003000000000000000000000000 % 001c000000000000000000000000 % 000000000000000000000000000000000000000000000000006003800000000000000000000000 % 0038000000000000000000000000 % 000000000000000000000000000000000000000000000000006001800000000000000000000000 % 0070000000000000000000000000 % 000000000000000000000000000000000000000000000000003000c00000000000000000000000 % 00e0000000000000000000000000 % 000000000000000000000000000000000000000000000000003000e00000000000040000310000 % 01c00000c0000c00000000000000 % 000000000000000000000000000000000000000000000000003800700000000000840000111000 % 0380000040000400000000000400 % 000000000000000000000000000000000000000000000000001800300000000000800000101000 % 07000000400004000c0000000400 % 000000000000000000000000000000000000000000000000001800180dcf9c79b9edbb0f133ddc % 0e000007ddc07c70738dc7884f00 % 000000000000000000000000000000000000000000000000000c001c0e643ecdcc84cc90911088 % 1c00000c4880c4f88fc62cd8c400 % 000000000000000000000000000000000000000000000000000c000c04242084848488839110c8 % 3ffff8084c8084808c0428484400 % 00000000000000000000000000000000000000000000000000060006042420848484888c911050 % 1ffff80845008480740428484400 % 000000000000000000000000000000000000000000000000000600000464328c8c848891911050 % 0c000008c5008cc8864428c8c400 % 0000000000000000000000000000000000000000000000000003000007ce1c78f8efddcefb9c20 % 0600000762007670fb8e77876700 % 000000000000000000000000000000000000000000000000000300000400000080000000000020 % 03000000020000008c0000000000 % 0000000000000000000000000000000000000000000000000001800004000000800000000000e0 % 018000000e3f00018c0000000000 % 000000000000000000000000000000000000000000000000000180000e000001c0000000000180 % 00c0000018000000f00000000000 % 0000000000000000000000000000000000000000000000000001c0000000000000000000000000 % 0060000000000000000000000000 % 0000000000000000000000000000000000000000000000000000c0000000000000000000000000 % 0030000000000000000000000000 % 0000000000000000000000000000000000000000000000000000c0000000000000000000000000 % 0018000000000000000000000000 % 000000000000000000000000000000000000000000000000000060000000000000000000000000 % 000c000000000000000000000000 % 000000000000000000000000000000000000000000000000000060000000000000000000000000 % 0006000000000000000000000000 % 000000000000000000000000000000000000000000000000000030000000000000000000000000 % 0003000000000000000000000000 % 000000000000000000000000000000000000000000000000000030000000000000000000000000 % 00018000600000c0002000004000 % 000000000000000000000000000000000000000000000000000018000000000000000000000000 % 0000c00020000040002000004000 % 000000000000000000000000000000000000000000000000000018000000000000000000000000 % 0000600020000040000000000000 % 00000000000000000000000000000000000000000000000000000c000000000000000000000000 % 00003003e7701e4fb7677fb8c000 % 00000000000000000000000000000000000000000000000000000c000000000000000000000000 % 000018062220314439a2247c4000 % 00000000000000000000000000000000000000000000000000000e000000000000000000000000 % 00000c042320204410a344404000 % 000000000000000000000000000000000000000000000000000006000000000000000000000000 % 000000042140204410a144404000 % 000000000000000000000000000000000000000000000000000006000000000000000000000000 % 000000046140314411a184644000 % 000000000000000000000000000000000000000000000000000003000000000000000000000000 % 00000003b0801eee1f708e384000 % 000000000000000000000000000000000000000000000000000003000000000000000000000000 % 0000000000800000100000004000 % 000000000000000000000000000000000000000000000000000001800000000000000000000000 % 00000000038fc000100000014000 % 000000000000000000000000000000000000000000000000000001800000000000000000000000 % 0000000006000000380000038000 % 000000000000000000000000000000000000000000000000000000c00000000000000000000000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000c00000000000000000000000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000600000000000000000000000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000700000000000000000000000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000300000000000000000000000 % 0000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000003000c0000000000800000000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000180040000001000800000000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000180040000001000000000000 % 0000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000c07cee01a73db9bbee3cfee % c1a0000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000c0c444024f91cc917342433 % 2240000000000000000000000000 % 000000000000000000000000000000000000000000000000000000060846403a810849a210e422 % 23a0000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000008428006810848a2132422 % 2060000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000008c28022c908c8c2346422 % 2220000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000761003c71cf9c43e3be77 % 73c0000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000001000000080002000000 % 0000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000071f8000080002000000 % 0000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000c0000001c0007000000 % 0000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000 %%EndPreview save /d_sv_obj exch def userdict /IslandDrawDict 300 dict dup begin put /bdef {bind def} bind def /E {exch} bdef /FF {findfont} bdef /MF {makefont} bdef /RO {rotate} bdef /SC {scale} bdef /SF {setfont} bdef /SG {setgray} bdef /TR {translate} bdef /bp {lj lw rgb} bdef /bpbw {lj lw setgray} bdef /c {curveto} bdef /cl {closepath} bdef /fi {eofill} bdef /g {setgray} bdef /gr {grestore} bdef /gs {gsave} bdef /l {lineto} bdef /lj {setlinejoin} bdef /lw {setlinewidth} bdef /m {moveto} bdef /n {newpath} bdef /nx {/x E def} bdef /r {rmoveto} bdef /rl {rlineto} bdef /rgb {setrgbcolor} bdef /s {show} bdef /sd {setdash} bdef /sp {x 0 rmoveto} bdef /ss {currentpoint pop E m} bdef /st {stroke} bdef %% pattern stuff /BPSIDE 32 def %% pixels per pattern side /PATFREQ 3.0 def %% pattern pixels per mm /dp_mat [PATFREQ 0 0 PATFREQ 0 0] def /dp_pw BPSIDE def %% pattern pixel width /dp_ph BPSIDE def %% pattern pixel height /dp_w dp_pw PATFREQ div def %% pattern mm width /dp_h dp_ph PATFREQ div def %% pattern mm height /savemat matrix def /topmat matrix def /patmat matrix def %% catch nocurrentpoint error for: pathbbox /ncpoint errordict /nocurrentpoint get def errordict begin /nocurrentpoint { dup /pathbbox load eq {pop 0 0 1 1} {ncpoint} ifelse } bdef end /ar { %% sa ea sx sy rot tx ty matrix currentmatrix 8 1 roll TR RO SC n 0 0 1 5 3 roll arc setmatrix } bdef /arn { %% sa ea sx sy rot tx ty TR RO SC matrix currentmatrix 8 1 roll n 0 0 1 5 3 roll arcn setmatrix } bdef /el { %% sx sy rot tx ty matrix currentmatrix 6 1 roll TR RO SC n 0 0 1 0 360 arc setmatrix cl } bdef /image_raster { %% sw sh sd dw dh xs ys TR SC /sd E def /sh E def /sw E def /imagebuf sw sd mul 7 add 8 idiv string def sw sh sd [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop} image } bdef /imagemask_raster { TR SC /sh E def /sw E def /imagebuf sw 7 add 8 idiv string def sw sh false [sw 0 0 sh 0 0] {currentfile imagebuf readhexstring pop} imagemask } bdef /dither_color_raster { % bool sw sh sd dw dh xs ys TR SC /sd E def /sh E def /sw E def sd 8 eq and { /imagebuf 3 string def /grayval 1 string def sw sh sd [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop pop imagebuf 0 get 0.299 mul imagebuf 1 get 0.587 mul add imagebuf 2 get 0.114 mul add cvi grayval exch 0 exch put grayval } image } { /imagebuf sw 3 mul sd mul 7 add 8 idiv string def sh { currentfile imagebuf readhexstring pop pop } repeat } ifelse } bdef /image_color_raster { % bool sw sh sd dw dh xs ys /colorimage where not { dither_color_raster } { pop TR SC /sd E def /sh E def /sw E def pop /imagebuf sw 3 mul sd mul 7 add 8 idiv string def sw sh sd [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop} false 3 colorimage } ifelse } bdef /patpath { /inv E def topmat setmatrix pathbbox %% get lo - hi indecies /hy E dp_h div floor cvi def /hx E dp_w div floor cvi def /ly E dp_h div floor cvi def /lx E dp_w div floor cvi def lx 1 hx { dp_w mul ly 1 hy { dp_h mul E dup 3 1 roll E patmat currentmatrix pop TR dp_pw dp_ph inv dp_mat dp_proc imagemask patmat setmatrix } for pop } for } bdef % setpattern brush of patterns instead of gray /setpattern { /blue E def /green E def /red E def /freq E def /bwidth E def /bpside E def /bstring E def /onbits 0 def /offbits 0 def freq 0 {/y E def /x E def /xindex x 1 add 2 div bpside mul cvi def /yindex y 1 add 2 div bpside mul cvi def bstring yindex bwidth mul xindex 8 idiv add get not 1 7 xindex 8 mod sub bitshift and 0 ne {/onbits onbits 1 add def 1} {/offbits offbits 1 add def 0} ifelse } setscreen {} settransfer systemdict /setcmykcolor known { /fact 1 onbits offbits onbits add div sub def 1 red sub fact mul 1 green sub fact mul 1 blue sub fact mul 0 setcmykcolor } { offbits offbits onbits add div setgray} ifelse } bdef /dmatrix matrix def /dpi 72 0 dmatrix defaultmatrix dtransform dup mul E dup mul add sqrt def /B {gs bp st gr} bdef %% brush: gr lw lj /Bbw {gs bpbw st gr} bdef %% brush: gr lw lj /F {gs rgb eofill gr} bdef %% fill: gr /Fbw {gs setgray eofill gr} bdef %% fill: gr /PB {gs lj lw setpattern st gr} bdef /PF {gs eoclip patpath gr} bdef /BB {gs rgb lj lw strokepath clip patpath gr} bdef /xdef {exch def} bdef /clip_region { /ht xdef /wd xdef /bm xdef /lm xdef newpath lm bm moveto 0 ht rlineto wd 0 rlineto 0 ht neg rlineto closepath clip } bdef %! Island text prolog Version 3.1 %% %%BeginProlog /reencode_small_dict 12 dict def /ReencodeSmall { reencode_small_dict begin /new_codes_and_names exch def /new_font_name exch def /base_font_name exch def /base_font_dict base_font_name findfont def /newfont base_font_dict maxlength dict def base_font_dict { exch dup /FID ne { dup /Encoding eq { exch dup length array copy newfont 3 1 roll put } { exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall newfont /FontName new_font_name put new_codes_and_names aload pop new_codes_and_names length 2 idiv { newfont /Encoding get 3 1 roll put } repeat new_font_name newfont definefont pop end %reencode_small_dict } def /extended_Zapf [ 8#223 /a89 8#224 /a90 8#225 /a93 8#226 /a94 8#227 /a91 8#230 /a92 8#231 /a205 8#232 /a85 8#233 /a206 8#234 /a86 8#235 /a87 8#236 /a88 8#237 /a95 8#240 /a96 ] def /extended_Standard [ 29 /thorn 30 /yacute 31 /divide 128 /Acircumflex 129 /Adieresis 130 /Agrave 131 /Aring 132 /Atilde 133 /Ccedilla 134 /Eacute 135 /Ecircumflex 136 /Edieresis 137 /Egrave 138 /Iacute 139 /Icircumflex 140 /Idieresis 141 /Igrave 142 /Ntilde 143 /Oacute 144 /Ocircumflex 145 /Odieresis 146 /Ograve 147 /Otilde 148 /Scaron 149 /Uacute 150 /Ucircumflex 151 /Udieresis 152 /Ugrave 153 /Ydieresis 154 /Zcaron 155 /aacute 156 /acircumflex 157 /adieresis 158 /agrave 159 /aring 160 /atilde 161 /exclamdown 162 /cent 163 /sterling 164 /fraction 165 /yen 166 /florin 167 /section 168 /currency 169 /quotesingle 170 /quotedblleft 171 /guillemotleft 172 /guilsinglleft 173 /guilsinglright 174 /fi 175 /fl 176 /plusminus 177 /endash 178 /dagger 179 /daggerdbl 180 /periodcentered 181 /twosuperior 182 /paragraph 183 /bullet 184 /quotesinglbase 185 /quotedblbase 186 /quotedblright 187 /guillemotright 188 /ellipsis 189 /perthousand 190 /threesuperior 191 /questiondown 192 /mu 193 /grave 194 /acute 195 /circumflex 196 /tilde 197 /macron 198 /breve 199 /dotaccent 200 /dieresis 201 /onesuperior 202 /ring 203 /cedilla 204 /onequarter 205 /hungarumlaut 206 /ogonek 207 /caron 208 /emdash 209 /ccedilla 210 /copyright 211 /eacute 212 /ecircumflex 213 /edieresis 214 /egrave 215 /iacute 216 /icircumflex 217 /idieresis 218 /igrave 219 /logicalnot 220 /minus 221 /ntilde 222 /oacute 223 /ocircumflex 224 /odieresis 225 /AE 226 /onehalf 227 /ordfeminine 228 /ograve 229 /otilde 230 /registered 231 /scaron 232 /Lslash 233 /Oslash 234 /OE 235 /ordmasculine 236 /trademark 237 /uacute 238 /ucircumflex 239 /udieresis 240 /ugrave 241 /ae 242 /ydieresis 243 /zcaron 244 /Aacute 245 /dotlessi 246 /threequarters 247 /Eth 248 /lslash 249 /oslash 250 /oe 251 /germandbls 252 /multiply 253 /Yacute 254 /Thorn 255 /eth ] def /extended_Symbol [ ] def /extend_font { % stack: fontname newfontname exch dup (ZapfDingbats) eq { cvn exch cvn extended_Zapf ReencodeSmall } { dup (Symbol) eq { cvn exch cvn extended_Symbol ReencodeSmall } { cvn exch cvn extended_Standard ReencodeSmall } ifelse } ifelse } bind def /extend_font_name { % stack: font_name_string dup length 1 add string /extended_font_name exch def extended_font_name 0 (_) putinterval extended_font_name 1 3 -1 roll putinterval extended_font_name } bind def /gf { /f exch def f cvn where { f exch begin cvn load exec setfont end } { f 0 f length 8 sub getinterval dup /localfont exch extend_font_name def localfont extend_font localfont findfont /xsz f f length 4 sub 4 getinterval cvi def /ysz f f length 8 sub 4 getinterval cvi def [ xsz 0 0 ysz neg 0 0 ] makefont dup f cvn exch def setfont } ifelse } bind def /gfns { /f exch def f cvn where { f exch begin cvn load exec setfont end } { f 0 f length 8 sub getinterval cvn findfont /xsz f f length 4 sub 4 getinterval cvi def /ysz f f length 8 sub 4 getinterval cvi def [ xsz 0 0 ysz neg 0 0 ] makefont dup f cvn exch def setfont } ifelse } bind def /ul { % space drop thickness gs currentpoint currentlinewidth currentpoint n m 6 -3 roll lw 0 exch r 0 rl st lw m gr } bind def /nxtab { currentpoint pop 1000.0 mul cvi tab mod tab exch sub 1000.0 div 0 rmoveto } bind def /nx { /x exch def } bind def 0. nx %%EndProlog gsave 2.83465 -2.83465 scale 0 -279.4 translate topmat currentmatrix pop n savemat currentmatrix pop [1 0 0 1 37.5 103.701] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -384 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_dual) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 60 111.201] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -506 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_calcobj) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 64.7178 96.201] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -762 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_setpivparms) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 74.0122 103.701] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -280 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dual2) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 94.489 93.56] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_dualpivot) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 94.489 131.06] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_setpivparms) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 94.489 78.56] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_clrpivrej) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 113.468 103.56] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -1076 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_duenna) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 122.48 98.56] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_accchk) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 122.48 103.56] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_addtopivrej) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 122.48 108.56] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_clrpivrej) s savemat setmatrix n 119.98 97.359 m 114.98 102.36 l gsave 0 0 0 0.176 0 B grestore n 114.98 102.36 m 119.98 107.36 l gsave 0 0 0 0.176 0 B grestore n 114.98 102.36 m 119.98 102.36 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 113.75 86.201] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -1092 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_dualout) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 123.045 86.06] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dualpricexk) s savemat setmatrix n 116.11 85 m 121.11 85 l gsave 0 0 0 0.176 0 B grestore n savemat currentmatrix pop [1 0 0 1 117.349 121.06] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def -1296 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (preoptimality) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 125.873 121.06] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_degenout) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 126.361 116.06] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_accchk) s savemat setmatrix n savemat currentmatrix pop [1 0 0 1 126.361 126.06] concat 25.4 1440 div 1.000000 mul dup scale 0 0 m /tab 283.00 1000.0 mul cvi def 0 0 m 0 ss (Bookman-Light02000200) gf 0.00 0.00 0.00 rgb (dy_clrpivrej) s savemat setmatrix n 123.86 114.86 m 118.86 119.86 l gsave 0 0 0 0.176 0 B grestore n 118.86 119.86 m 123.86 124.86 l gsave 0 0 0 0.176 0 B grestore n 118.86 119.86 m 123.86 119.86 l gsave 0 0 0 0.176 0 B grestore n 80 102.5 m 92.5 77.5 l gsave 0 0 0 0.176 0 B grestore n 92.5 85 m 80 102.5 l gsave 0 0 0 0.176 0 B grestore n 80 102.5 m 92.5 92.5 l gsave 0 0 0 0.176 0 B grestore n 80 102.5 m 92.5 102.5 l gsave 0 0 0 0.176 0 B grestore n 80 102.5 m 92.5 120 l gsave 0 0 0 0.176 0 B grestore n 80 102.5 m 92.5 130 l gsave 0 0 0 0.176 0 B grestore n 50 95 m 45 102.5 l gsave 0 0 0 0.176 0 B grestore n 45 102.5 m 67.5 102.5 l gsave 0 0 0 0.176 0 B grestore n 45 102.5 m 50 110 l gsave 0 0 0 0.176 0 B grestore userdict /#copies 1 put grestore %%Trailer %%DocumentNeededResources: font Bookman-Light %%DocumentSuppliedResources: end d_sv_obj restore DyLP-1.6.0/DyLP/doc/Figures/dualerrorflow.drw0000644000076700007670000007145611171477034015674 0ustar ª» €,€ ˆÈ sÇH6eb P%Ì™2SÒè)ƒBFŒ.r°q#‡ )XL3›0y˜¤³ðˆœ7uà´|s!•2xX ‘SgM’P)"¥0\ÀÀƒ…K”(bÀ€‘"d.j°¨‘‹J‘†íúulX? x¼£Æ*O €°†Mš3nÜ)âd¨uïæåq*:aĸ…"%î)T’«¤Ö ¹õ¤k°©v-ÚnɆe·¹}Û¥¸< G®˜dž‹&tëR×n›oÂç¼õŽwï‹èÁWW¢÷í׆I8õ[à[:0CaŒ 3,„ÃKüÅ,Xl¡§Íá¨P™š³È$›Œ²H2í]Å,“í,ä{Μð 7üpÄW̩ϩo(´Ç®C{Éuœœ²Ì¬® 3í2eo3Ιîl:Æ?;ßqë!Z%C«60½tXJ“E+ŒQψõ½þu?aZÿX¬É*³œÅ™±¦l¢¡VÚ¦„-ظ[·‰—œº©\c*ºœÃ7éøÍ]n‚“¼æÕq÷qÃ$÷/JìRá›Ðø˜§1ó±®TéÛŠËL?X¹O~O£ŸŒpµ#üåhÂò‚t¬!)ËHÍB´Ø$³)ÐZWÔÖÛ"¸%pyÉ‚w3—™Ð¥.²é]ñ’½èdB|ÝGO|òS§€A :û¢#  ƒGñ`@þ¢œ -‡)‘hŠg§Ë¨‚v>‚Ì{HëaÓd¿³±-õ#"ÕxuÄ"òÏ0Jd¢×ž8@)PZVl U©Ezk‚_´[˜Ä¸Átu] \ ÇF;¡Pp oäCE9rx`¡ +%°BbNsœ#žç@‡¼Ñ)¯g¨«!ÇnH4éŒzÖã ¼‡;¥ènœ.ó9«!—ÀD&:“áò²¹ÈÕ -z,¸Áú´ƒ¸¬’“è¬.i+ûy’“Wód‰µÄ®9Q€a+à’x¶*©-‹Ì’½H7Yb0ocÜ›š>8ª±p¾¬UžöÔ§Ìͱ˜÷ÃÈ$†4 Q0]”`Ò ›žÁ€œÜ¤˜ CCŠožŠTÝóв–µ*4ø!¬:?LqjºB¨þÚ?†Šò¡`‹¢Ø&ZŲò¢¬Ì(ܺ8· zo<GzÆ n„k,aJñ¤8bJÇDH2ÿ©e¾ðrÁÛÜðŠ÷¹ã‰Žt3¤§RÙÍ}Svד‰>ŸÊ‘¬œs³üL•g—9áuÎx¡K^éZ¾mÞ3‡ ˜fÅiƒ}~¥³58'WàG³uÆpSØLª _ûHÛÆ€w•ªÓP˜I¬F«¿ÒÕB¹À¯A‘€I"ë´ÎÊ@¶µR£l¥à¸f™A½ÍµouÕåàHh¯ªÔ e¸ƒ2‡zXg2²Âu-ôrXN¯׸>”¤¬ªZPMfÕj[¥Útÿ×Ć»SD¥Y½‹V歹‹r/É ÒZ–—%½ëI{y¸÷ެ ó­\3‹Hò5O¿Lh¿BOR¹eîU÷]$v•º ¶n)ÇJ¶²V4[®Ò…_ÉQ·^®æµ%]ÿ†Æõæµ½nTÞ2ꥵã—çðƒrÅ+­bOÛØÔZsµÁm-#¹‰ÏØ^¶z³S™LjûT§æVœ»õo ÀgTyÆùÅs&®ˆüü•ö XE¶¤Ž¥ÆcG7k ôªC|]Sj7•î®’¯äʶu¼+oIÒ*ã¥%ÆS0Ó0L:6r„ $} ÉbüÊÙžû}dÒ+HûVnn¥ówé`ý˜Á£„¨X%Zäí†zm£Þx3Ë'ÓR®RF/•íºKö¶ñ—*43Q/w_Ö"Ø1ÉŒcÀg~øØ“LöŽjigÈÑ~°§« j‹Š:[K6µ†ßúíUO9—&å¥^c8¶ôO93qúWF9JÝõ…Pb£ÉXj>öš‰üõRùº;‡SÏ(˜·Ÿ?kÜì±3ÍÐ\ì4«Z_¿{啵sìðœYÜ ~<¤  {UÝ<žÀMùÏ)‹ÏA#ÝÆïÃ÷€ ªl~3Ûß>ÒtuIÑì|ÂÇ6ÂI½mXvÔÛå éyÍ8nõ¾šÄîÅ|å›k¡ª¸¨Po1 ë t|2:8Àº±‹-i¨í{“ýæê¿¡ ÖN™ŠÖN;FÙ¾Vn¿=Œq÷0«Óqsï5qñ±5­‘ r^:ê.Öf¢ƒ-cãâàŸ÷fürOi¯wRÁÏnèØ¥ áS2)óH>¸9a·;ô÷‡[Mn+Ã:ïg©é¨ñCé‘@-ì®ÑüLÓJµÕ„¬»eo–{sè/—Ù¼AKó§&~´½^?ᩞæ?µŠ7UÈÆuw`_'yap•7dÔ†y—|j·|ÚÖy·jP&wáFw'b‡e¿¤/üÒw-´nöuT‡Æ~…Ç_'âövc‘¶{BÔ{w€À7yÂdd7mfç€h›7Í×dØp"%nXnWvn&_­G~ív‚ûGgýg[€5€“fP3ø{Ò|_Åi ¸ƒvd mÃ|Lvj–jQ6}¤Ç¦Gq÷1kµ–S·6XA5‚!‡sæWr<÷f>‡‚ü2BNy&Æ•N'N3–N÷tO(u‚(… c*a1VHIXÈ{Zh€\ˆi Hy`Xvv|X†?¸Ei¸pp}g„!†„×—e}¥z#XMxîTˆQ¨h!q\ÿU/¨‰ùF€2è‰ Uƒ¡xƒgy 8†Y”dk„«ØmЧjE¨±h}x—eêÁîA‡‹“SfûÑv ¹Èn&(‰¿H{Á(ZüähZ·xT…Œø\‘ÇŒ[#ŠBFŠÆGQÓ¨|gh ‡¦sb®6b‡}o¤}.Å}a@(cö}}ÔŽ%hhð8Y”("ýd\ö¨{ƸuYh`üHƒ]hƒ_:XŠÉ]fø](„kx¢÷pÝxw™e·}w‘wä}9µG'‚†åz½¨ Œ_A_qňcú–Œ+ù‰Îæ’›“Å÷i=ˆŠi…† ùy Ù†£Ww¥—„§7‘qT‘9%Sn@S6U zdið'1 d~ºöwî葱ñ6•Æ%•ÉUŒW¹F´Œ-ÙŒ/™ƒ_yvd¸JF–á¥lˆn¨–pÈ–r¨µh‡«‡‹J9~€7r:‡~'g9\òhYðwˆ2!Œœµ=0g›¡Ehå·fç×fé‡rƒù”±Yˆ³•›¸u[¸)3ý”4˜ˆ¯'x’›…ÙOÿ”œ‰yƒŒY5, ŠÿèŒ (`Y™<@¨Šeù|gÉ™iy„Þø“è_™PHœÕIΉcV©*Ù˜ ö˜á™Ä7p™¤x‚Ú”Ú¢VŠ˜8 £.¨0hUXy£`¦Ã‡ªÑ¨ªj6„j˜¦®¸I«H:¡‰“‰qaF”c–«uú›w ˆyÊ«{êr´Té_€j¢ØÙ_O®œ®I¥æ [|µ‰˜ê4©Ì)•™A¨+j¯³WÞóœ-˜u&¹˜¢Úcˆ¬8(¦Ë:“e:–)¤C¨¦¯Èm šoJ“QzôSr&ûrà—~wf©i¨« œ­é‹Œtùš®ý:"˹g5#©ñ ³vú‡Ê¢Û¨7[t‘äôXü$¢ÐÙ›‡Êšxº«Ek³è¢0`[Kë§'"¾u¡Q+³SK´ígµ³¢^«´‹˜›Äh?›sA›¨õš©÷JˆGk¢i;"û¨’ª·O‰[¶ød.Ó[Âz’@T£Ëæ¥ &ž£“idY“ ‡±9I„ I}vw­m©eo` ï‘z戎üáì(§.˜°G·U‹O9{{Oõ©Ç¨¸¾Gª[©£É bȬ“k¦7­­ÈX­›+¡‹í1ûa`fLwàS¹ ¸¬+¸›º®½¬ K£œØ°ý( ¦š»a(“’û£ëªx¹K­š»–³øKpP$ëakˆaÑ‹©ÓY·")¶å©Áº°[º¸¶û¥ß±Êº»«y夯š±Óš¹o(‹ßøKz2Õ£'y@Gc€e ÷+˜Ó›‚•È;Ø)»(¹½\ê°þXÀϾ‘‹|by™ÛÀèûÀû¾ŸÙ¾*E²,t”²ë‘«»OÒ›¿­»©Ø*)j’ýI»[8ÀK ,¾0̪Õh¾h¼hɦÖj¼¡iPbky` eÐe†º$8°!<ˆ"yt^qØ‹ J¬Ý©ÂÞ+v¬»T|ŠVœž |¾Ò*¼ ŸµŠ­nyqîƦÕÓ}!µ>ê³3ݹnçxNèMÃÎå}þëœþâ©á‘*´.êÚôÖtúÄã•Õ7ÜåžO•MíšÞß{>hÛþæÈîí„ÛtÑ>ãsæžïÓ®îƒÞØð•MA߯Îí¤î_óîöÞßç¾ðéÎï€ìç¡ïÝ>ÖßNïâ®ðùŽîûîðÁž"ï¾èoðà^ï)ÓØ Ïñÿð½ÝÐ>Ù AZ£Û*a ›3cii€é1q×Ó-\ FpGŸôHoLßôNÿôPÏôH?õIõVõJ¯ôEõ\ßôTOõ]ö__õP¿õa/õY¿ôgõc¯öaoöPßökõ{8¯ó<ïó A/åt½õrõoõƒÿô…÷i÷†ŸölÏø‚ïø„ùO_ô‡¿øcÿø—ù™oùY¯øœöˆ¿ùO_÷w¿ó=ÿó|_ÕBÿ÷ î®ïösïô¯î±/ø³ž_ûGûºoø¼õ¹Ïö¿ßûR?üooô¶?ûÄßô¤Ÿó¦¯÷@¯ú~Oô ÖýÖ?hÚ¯ýØýÒýýÝýÛ¿ýãoýáþ5pþAPôåÏýç¯þáÏþï?hìŸþéOÿõ_ôôÿÒ­ÿïïþÉ¿õÿêûsþOüÀxþ` h~xïôí½Ñ÷¾ë£ú)ÖÀþ4 Ä€0rÀóçCàT"PvÀ¨Ÿ@ \%Њ@þGY 6pŽ¿Øã<<ðv¿S |~¨J? Hý ÿë€4 JA8 œ‚Qð:À+ˆûŸüã‚SÐ ª?¸±`ŒVšA*ˆý¶àù+zk ’¿4XÍàÌ{Ipf,Á¡Wô`€Tøƒ~03¬5¡ „€w(Â¥0¢Š#„QJ¨Â!î@„~°èBBH !&¬s•NÂIøa(\„Ÿpf†>¨ ?á)…¥ÆBJh a*서P=WX qÇ(t„³p*ôÂ;(£ŸÞb‚EoÌeÈ —¡3l†Ï06Cf8 ¥a4´†ÕZÃdh ±!6̆ÞÐfCp‹ž8”†ä°¦Ãi¸¯a64‡ãðBÃvÈ ‰!ôK}ÇÆ–0ø¡?Ä- D?HáT8ˆñÄ…û¡Cô‡EÀDĉhâC,z ‘!Ĉ¢Bˆ Ñ>DŠH-â?‰±ºÂŽ˜7"âA‰ËP$BD‰H#¢Iì‡1 ºÄL¨XbKD„9 ÞÄ@i¢=̃PªÂõÏŸÕÃ…ƒ0öBW¸Ý_SOq)JÅSH¡"Sdd°ûeE¯¸-aWÜ„Dð "?¨ç3CY¬„®ð(N@=˜YßT°¾/ÞżÈ÷¢_„z0öEÁø£aŒ‡ÑìED¦·%âÒ+&Â'2½!Ðô(caDŒ˜ñ2^Æ>H;ãaÔŒž13†ÆËÈ›^c„ŒŒ÷õDÉX+£Ÿ14ÊEc¸ú¨ÿº·12…ÝÈ{#Sˆƒ¸7ö“áH‹ãH Žü ®AßÈw#pDŽÁ8JÇãˆã FlŽÌñ9"Çé8¡#—[ŽÌñ:úFí¹£tœø°6îBóÈÛ£{|ìq=ÂÇùHë#q”ö1?êGîˆ÷ã{DJ°.R?¹G ŸO„2A2>Iù¤ô‰ 2B:H Ù ÇÞ”rBjȱÇYb†Ì’.ªG£—Œ@‰<‘&2EžHÉ"UdŠt‘-’EÆHù"cäÖ‹‘3rFÒÈ™#iäŽÜ‘E¯G¶È‰#‰¤‹4’2’FI)$Ud“D‘!2)²¾Ûûš¸’XòJ>ãçô²d–Ü’³/ø/‰%Áäë³zdRK&¿3 üBš4“®M¾É5'£^š$b’JÊI2iõ¢äd}õ¯ìI/iõå ü’Q/PŠÉ;Y(ëß¡,“‰ÒQ¶IF)ßߣT“PÏPÚÉ4)&5%Ô£”PÏO H÷')¡^8•¨òT6JKõ„€«|•®rU–?1™*S¥¬Ü~VVÂÊ[©ý¬^Ñ«•¨’Wš\©+ce¥,VXžÊNY*Ÿ^±4–¡2$Ø=ç‡碔l‚ P:‚A)xÿ´¥4ƒZÐ[ÖÁ.˜-ã¶<ƒão:†E컥¹ü–ä2]ŠËî§Áe¹,Žç’ˆÊé.ñåùû…°_Ç0Ãå»S¢¿yÉ. æ½¼Õï_ÎB9 f,¤˜ýä&LŒ©w ÀÜ—Óo]^¿™/ÙÉ„—aP-žÌq™2¦O,™ÿÒ'ŠLë×.c&K„™.ófªÅš™3;b¾™ÈPxÇ8x »#t$š>Ñh"Çz‰‹¦tškÐiG¨i;dGTšÁi²D¬‰µfGìÑj6ͤy¥eé«–´1d®Å§Çþ†€Û|›n³9Z½¶ 7ߦÜl“t³n» õòfÝä›lS-ê͸Éçæùœ{³pF=¿ 7Åco4œãq6G ©_£å„—3sbÎÍy99§çÔœ ósrÎÐ:·žè §3u’ÎϹ:[çæ4šSuÊÎÖé:k§è샶3wbÎÐI9/ ¿3xÃ`(ƒ'ð<ž 3aJä‰<á`òŒ…Å“y Ïç9 —§ñœž±ÐyBÏúw=‘çðü…ÖSz~Ï쉹§ôžã³zÖ¿ÞIýä+ô…,±9ºÏ^¸2»ßìƒôÓ'ÊÏ™?ufÏ숽Ðj"Äý©?_áË´™ñÓ€²DÇÉç§õ™ç}R¾ÛCAo 4ƒbÐ ªA+¨õ Ô‚rÐÚA1h­ 'ô„ÂÁÊBM(e )”‚’КAchÓy¡4t…’P Cqh e¡6”‡ÒÐÚú^è ¡?t‡‚P ª„@p¢PÔ(¤É'JE¡è‚¬¢UôNFÑ(*÷¶(-zw‹ZѶ'FŸ¨-£]´ŒÞÉ_éE…Àm£gÔ‹¦Q/FÛ(àK{eTÄQ,*÷˜èYÄ…oqîDðFæT܉š°ÆÂüùG£¢!åŠ;±**€@* )!¤¤8À’ºE€‰ ¨&MžÃÐlRËb˜Õ&×ÌàÑ7žRþ¥™£ºšG3•öÆUúÍ`s¤¥Ls ÞÒ§Km©+å¥Õq 2ÐÝHK[©od¢žòé%S§·L›^3ezŠrm2Óf9MYe¦¤¦Î›2=RiM•©65Ïœ~Óh*,å±Ä•Q‰RÉ;¹NÓd;%“ïÔKRI0êNo;µ§õtöÝS}Ê)[>…§ÿTžÔ,O êí£§•Ÿ&Ô×w'‘©£t£Õp(#jD¥¨ûÏèYT‰ŠQßßFu£Y~TnŠ,Ï©öû¨â´›VS‘*Q[êDͨ奆S&j2(œ˜!ZÌQ¨1mªýÄ©ÿó îÔGXShļ©¿°¨BPy1sªPU™@Õ~úÔ† ™hsôŽW:fUä¸UƒcsÔ„Z•9bU±V}ãX5«Ðq˜2…³ÚÙ*ot«»®2°ÊUÉj]E«È‘¦:Õ© Tuê^ýµ§úO©:X±_ý4¬SudÊÌ£JX—jcõ«A•¯V•™X­ßaU¬,‘‰Â€!°Y;«Ûô¬•àÑJZ3©ˆ§5µÂÁZWkkm­©µÊÖÑJ[I+hå¬C ÞVPZK«l­B`µ WÖúZ…+p­½u´îÖÏŠ[;+­­´õ·þÖá:\‹+‰8®§ºÚÖæŠ[¹khÕ®8`bWêJ\É+ À®ˆ'¹?*g€{}¯îUOF½é_á«|…z¯´¾¾×ûúôè«~M\²éùWýJù,Ó°õ•¿:=k_ª4°íõ¿*Xæ'J#à= #ÒhØ Ëa;¬ È 6ÄŠØ›<¬‰Ý°$6ņØ[ôN¬ŠU±'ÖžXcMlœ±#¶ÆzX›cu,‡U±7–ÆúXËcC¬fŠÐ.ÉB•"0˜¬“ lïó*Y%Ûd«¬“²T@•-›dŸì“¥ŸôsÊnY+ke±,W³4àW’Y& f¥,—³^¶ÉšY³ˆfã,“í¤mv¢Ùãbgß§:ý”>ñ*dJJ˜‡e—4Qû¹=íGh/B¯dzD`ÐʃXþ–^ù‹*ŽWFÚò£Þ ”õoÓn?h§ý¸)Ò{SUŠÚ 82­ …¦Ú!¢SH;h­4°¯¸?–hh»¤­mµUò5úD«ú _ã2D¸#$àÉjs@á p³L4é¸Â͈Ζں×Í:°m&}üsâcËY-h'%·2ª([Àl§³EtúIÚRÛÚRm±mdË‘D¸Í`¾-‚,·ãvµrVd»9—adµë}ºÛg[må-—›·Ò-t[|»m?k¿å·ÿ–àÛckA7'»eŠ¿3¼ Mh»p!®´µ·&wßR\n/®`¢V;ÊÜÇõf®ÍžRÜÜ™sw.vì¹¾Q­þÜšës§Ó+ºBèÝÞèG©ÓÅ„VÏJݧKu¥Â.¬º1êbÝ©Ëu±îÕ…ºóuëŠÝ®Kva€˜,»h— ZUÄÃv3iy»\Ž•ÆÝ·Ûvën&½»ˆgîÎ]¸ wñ®ßµ»1êÝ3x¹àý»w·ðFÁ‹xï•â»2@B^h×x¯â¼2 ò^Ì«xw¡æõ»——ñ^‡êQŸeHÝ~Ïò¥ªÔlúþŠ^ê=½'ÕôŽÓú—zIê¬õ¦¥·XÂÞAózaªIå½²wõ2=Ò[þzïûS–E ¢ßò‡|£©ñe¾ÊRùêÞú×|iï³´½Ú¯úæ^](µoñ]¾ÛïWF_ë;}¯²$¾¨üfß Pدû•¾Ü×¶ßùË~¯ú4ô—þÂ_X¹<óoý%¿ºûâ_÷«0ÿ•¿øÿnßÜz€ÿm¿û÷Uöß\˜¨wäŸÌñ@^`ý™}¢w ‘€vÄ ?;0K$Á_Sçšà 1°oÔÀ-˜ÝÕx‚cp ~ÁöÂ"Akù'm£  +!¢à„â¦Á@×`äè‚{# f‹U áL„•0 †Â7¸7‚àBH…Cpž šu)Ê`'ì½bn *naa……°Ãh¸ oÂ(ü…Ûâü¬ÃvïÆ5,†õ0S8šõ“bÒ7›d‡&!Tµp²BE: ‘,!6Äb–‘FR5Ü1š…ÄoVcB­ø ñç™}ÄGóÓO&ÙJñ ˆl•÷zWÎZ`@+~ŪçÊâ~[h@-¾Å4`È]Ì‹#¯Î¼N׺"Èal"Lèä·ÈØð[ŽÀŒõÉ 0Ŧ¸ñâÙP¸Š]±5†Å¤sËb\Œ‹{q/n¼Š¸' ãbLŒOg2NÆÍ¸kÖc\…D”ˆjÇí8tòÐÐ yèéÜ…ðø»ãx,:çñäżö˜ïc¥ ²EÇ/”ëÝ€ü9 ²>ÎǰÓsúãÁ m()˜Ó1aNÇ`˜‘gáFæ¤ZV:jdéÈ‘E²G&ÉY:öÁ“lK²qÉ-9%¿äY6û‰K.Ž0¹8ÒÔî‰9e€ðÉ@ÙСL”‡rPÊC9) e®À”cOf¶N¹)ŸO³kôŽòO.ÊXÙ*ûd¥œ”›²TæÉ^Ù)Oå«|”·W&ÊZ+wå¨,–Á2[æ c9-Ÿå4[•ÉòUžËa.»å°ÌDgÀqyǵÅ/ûeþU[”±2~²QW0S6Êö—1Qm±ÉØÊZ=Á ˜}1e&Ì>#æùª˜sc^ÌÙ0Kæ¨w™si®-[O3WÙÄü_Ïã=«çõ\ž ,{>Ï8ñÈçÌ«3¯}N<ƒt>Ïgਟ3/UìÏ"·>÷çü|Ÿí3.Й4’hë¨s4±s‰º–bA 7ñ‚^ŽZ%Bh} õs\$ΤêÍåù9JtP½Å÷D«èÏA¢Wô‰®¨.šEgÔý¢i/nÑ&E£Þmsô‰À5ÀGËè(¤a´ÆÑ+Úùòh"£´‹F¿ë×ÿ.ÏXþ(°®ÒT:ü:`+=¥q ο]zR_+ ¤`•~ÀaÚûi)=£³4÷CÓ0‚‚è +"Õ¦™6nÚþåi!¨¦àø+Ó{úNÃ?/í§ÅtÔzšPciE§õ ¦—å³P÷éEm¨Ëß‘} SPM- 9u>…k¸ÐDœ@Iõ¨…QØSwjS©Yõ¦vÕ«:®á({ªifÓÒÂ"Å<«ý0ütŸÀZâáÅz†wc°>Öl˜ #k÷)t—5°–Âκ ka$­¥u5Z‹êjý©a5°žÕÛš[Ójq=±·ÖÖªºZgYrݪQõ­ÎÕ;8mÍ<;gw'[¤×y6æ¾ÂiL¯Ÿ"¾Æ²úú_ókFè¯ë5˜ Ø{_?X¦—°v:Ó»zT*€öÑm)v P`ìSO èØÑM(£V‘íF'Ó3ÙcA¦l¤—ygÀOˆE`ËÆlh×mgͦʉcçìT[|ÇÇön´}mR‰¶.fz‰i×—£˜vÈÍ¿j[l‹½±5vÆþ•d JhçF¹¶@Ù(c#=±ý²]vËžÙ¹yËÞ웽³wvŒêÙo;ôÁ }^dFzÝoûä~»·Ó^Ú¯ñi·bÁ Ô©?9Ü‘Î;"nÄ­û­P~Æ»exÇȹ·6Žt˜ûpÓÕò˜¹1wãÆ¹-#tCîÉ-ºC·å¶ÜûpáÅí¹O7è¦Ü’:ÂîgìºûmêNÜБuûŒX»K÷è–ݾ{(n?ŠfÑu-ܳêúOÙ^]ªC!ò6Þp±xëZÍŸ·³vÄS6ZlÜa½—u(ÅÕg3D×é y!7dÒƒÌè›Þ¨ïô;׷ûNßrï~¶>óôÚ·ý~ßø»}ÇoÉø*dÖ»ß<ãïýí!é·h±<€+p¢=öúrcþ˸9‚Ÿãì,8e–àœß"_ÊL™Ss—àÈׂCð NÂ%¢²äà#\‚{ðsÂQ¸_þà|ƒ‹p®Âpwá%¼„#ßlÍ—Ÿçzòû‡ ñ¨w sî_~E|í‰É#>ú 6–Ø]Ô¥¶T"0&«8/Š‹1ŠoT*ÎÅ«8—{®WŠ»Ñ.Þű8Ú{(•Œ{ñšèJ£V|E™Æãøg㨋q;^Å%?ãY¯Ž«q,Îg_ê £Ê’Jò)šÈì"'“ÈW‘?KD,%y±D¨^2’ß¾GžÉ¹!ŸäýT“òbIÉk%Ì~M/‰¨âöZñ{z«5•³F_èöÀ›Ë>àÈïºÞò$ž„À p£Vò´~J*ΰY#¤z”ÑT6½5ìôc3z1‰—F¨×Ÿ^Ìæ·ÂV²N³7j­Óc·Öï1n?¤'Y-+æDŠöå:qy]9Qy3ÍNo•«lÓˆ oy*·ç“q*<=Z¾`³Ö-7{º|Ájl`Îôzù/ï’ÂüéaÊ.i'‘94_ækÓ™›Æ‡®Ì+º5Gæ°ïšÃrë·M‘_7߀ßüú‰ót^±ßÒCç¸VƒïQJ§¯%ó&çʶâƒ8pA$ç”°ÄmÖ€ߦ‚_Öäœ) GܱÊéò;æÂ„7²Åì܈º- j\Îw@BªFr@?)êΪ³Ò¬nx£zUê^ª‹¨ªµzX¿êQªKõ¯Îåš:âÑêJý!,V:Ô7k$„¡¯ñ÷ôÕju{¢N×Å­VeK©PÓá§Lïˆ0½pç •_®˜;Åa($ÀîÊ`$‚²[ö¤àOÒÝd¯ì—f\5‘ Ù/;¢r¤´'áÙK;Ѝ†-µ[v°íúˆl . Ü͵ÏnÙׇuÊì }}À7ÔÎÛ+‚ H<Žâ¶ÏàOþLq_îȰAøõ†à$I  ¿0›vKdà ¼´fÊenbaÖ‰„ïÞÉ;@(@d"ÐÝ!{ÿsÀ „8ðJF|Ÿïõ]$ð„ æÀñÝ <ÅF'ÂKt‰d$ø! ü#«K_ ÁSÛQÅ M3æ€ÁDa *\àTBtdü÷¯D(SZ!óFL™3\ÀQ£"”(A% 6et€xA§ œ0bä 1Œ4dƼ±©²Ä9eÂÐy#Gf’9l¸!CDN˜; Ì0ÁæM¢G“ÒIóÆ ¥1A‘“D:g@è”[CG:fŒ”F¢Pœ)3GfŒ¢B¼NMãæLb<2mÄ{£ˆ1f€¸!cFQ"oÆÔiSÆ 'eÊQ-…°W9cËDvjŠÏ¡G—¦3¥8lÒ°v]¶l´é”&s{e‘©C†’6=GÁœ0vÊÌ$óeŽ/Õ€(ƒg «Í(PPgN9dÒŒ¡3óiÔ©U¯‘O_ïÈøó¡çÁpÔAÇz/ˆ‘^{ˆÁè•aFNX¡z/!yæaè … ¼`„š1¡V¦‰˜^‰M ¸Ga¬aaYt¸Hâ R<¡oЖŽN1„sŒLD–8…ŒîÑÁb޾øÂG YgX•G“/P!„tXåTCV¹£p@Ȇxl`%Çb€É¦w¸ 'VQvÆ—jr8„¢É‘ÝR`ŽÁ¡]¹‡Rh€©â‡o¨È`ž¡%—^f*„]¶R™ÎêuÙ¹èÁ¹±åªª±i«e¨ñcªæ¹G”´Þ‘Zb¶ñÆ¡° û‚ºzÇ£À‚é¾€I‚ùér‹¬¶«ÊA+¢ÊÎ)Ʀæ Õ•`šº+oÜÑ.›’ÆÁŽÈámîqíHÝûj»îŠ”ipÜj‚oÀmíÒd™oØØäJ*¥œn€0u˜Á¡%A„‡3ȰaÑe°1‚ïeLÇÆÏT%BFHQD „ôŸ…,—`3ξóÌpÔÜF%’Ç4Ò·…Ï@ MôH#qôÐ €ÝņU_ Gž$Oar+·¬ñ{» 3 øJ°i ´ývÜJCË´Ý1ƒ€FiœÆ‚/XýEž’¯ ‚Ø^£—†„/M7Sçý+}^ùy˜“çÊ}óç¡/Þøã%¢ZFÖ +ÅÖµV.îYïŽö ЯûËh•€’t˜‚¹Éq0 3Fß{@Ê‘S:$´hˆ!Æx”èÆÕ/Œ=SÒ·lôÓ§Oß`ô½¸>|üX†n˜ÿnòƒ@†Râ#WÞ •!ÜCÂ6¹È¥<Ÿü0˜€4˜ái ÔÜÌæÉ@†ÓrVŸ*c­ b”v¶ƒÚ¢W¾â D0OyΓ ùyɸŒåàf3:@î±rÅçF±¢Ù^õ·›é&m?Òq°hìyæYœéÕµÚÕçdûÉÓó^ö¾BJÔ”R]~PfEevËT>.Õ• *Þ@ÕÁª=YÁ.AÐ˾@©lÉhÞ‡”ç)‚š;ª ¼.¦n ÖelfkF5~õ¬Æ„±2-ZÌÇõ¶Uí®6¿ëÝŽŽœ«3/IÍ)X”¶w|§Ù@À^éíæ½8žïNÿzYé¦ÀzÄ0AûëAuGПC¡éÎ…u€¾Ã]”¨ø=ŽZûlW@ÐŵeBeƒp|ù4¼™W;OÍЕ­·-&íóµ=9ÍqŽÐ ÖÞ¡/ʆ?£'ÐŽÎJ¡%=\J/úÒô¦Ûi“²áZ“Aµ®Ëâ§J+²=m¥-èg&€˜Žµ÷9 Íб’$¹uñ”âØöî0’+~è­+‡Kµ‡1vXöÕpW9 E1¨ ¶RÔ HR–¯Õ(ÞžN»b ieÜ¥á>'9´ç<•òÇfƘW6ñÖkí¶´nŽY l¨ƒvÂ:“P•FÆHëEÍ€¶¼Az–ŒÙ¤³ÕœÕÂb ò™ŸY ÑafGk¥Ìàq›“á¼ã^`éd~Ú¤ÏÄž¯…jñRHeA¦øÎÀ;i˜³|æ¶ Gq.N[Ü»=wf2nÙ<O£¯Ì§BòÙ£Ÿ…Þ‚¼7nN}5=Ý(4‡:ˆ!CGƒé# ÄU·^yÇ]2³¹\èã-f 8X­‘—ß"ûûd ÐXeˆ"ˆÞò*èˆw„‡â”h‰yãv04.oP‰Ž8xè*q‘‰®²•¨(oà(h‡ä§!öÑvbDô@ôqaï¡3u‡±ˆ±?Œ»x%"|B±ÝA#—ò›D Vҥьe0Ј7×ÅŒcG`sÐÒ˜?ÂæSwP`«1_Ðv_àa@Q¸\Ãã,_0%ñ8Úá†V"÷B`ú(¤¡\Îó™8RŽ±©"S1%÷¨Žé¹›G#x!q›÷" ‘tÀôq]þh@F`2ÏÃ3YT@Ó!ç3vCö@ E+é0 yWB^âX óBÎb‘¾¶GAÔ\(–“yE‰#zôkI© K‰xã‡AY4Aø¥VYPç¶$¦ô” c"8âüø’ë8gÙ\ €ÚèŽðH„ÑM]qo™å–á—S!‘sÙ“§2!Å”bé>ÏÑŒCöYGéDB•¤_bÑ–êh’|‰–™šh‘™µ–XàèŒã–()HV‚‹Ë¡_ aú´ €# 1a€9К¯)¾õaÐçš°iº™žá›20IÁI¶ ›Üœ‡á›z!›9 É9“¡›|ñΩ2º‰Øùš3 Ö 60¹9›ãéœÀ9›70Æ9›80˹›Ý‰›#œãy6£‰ÊAuÜ1B2%´N Z3,LÑ?ÏÉr«§ ™aœEð¡H¡3#:ËY'Ê3™A¡IУR:¤õI ¤ FJõ™J¢#JÕ™Q*¡4 N£2Ú[àùVª¦¹ù\J¤^ª¦ÀùcʤjjœO¦½µœOà¦RJ:J$ýÓ[YZs5PŸUp§E*¡˜1UЧ"Š©ÚY‚Zà™œ:¢5›Z°¨e©é©5О–š§’Ÿ¥Š©*V¢’š¥%DRúI²i¨¿Z š/jÚ¦ñ«àÙT­¢Œ1`¹Ép«7«:­À™¥ñ«Æ iõ«ËéóAÉJ¡o464­Yu$!Ú0!¡7PŸî ¯dp0a 7PgP,x;A²¯ýÊ'°2CR—b! žKS:#¯lá8[­i@¯ÀIhôjœÀÑmÀíA¯Ë¹÷B:þJ¡örƒ1nþš¥+Û²ùjJ1à35l1v̺1ª!¡8Ptp­èïA.‹Úù(Vá'ã³àIM Û¯8›÷ª{l ‘> œU«§µ5kœ];³K;5»œÛ°ÆBJë³3Tè§5›¥8k íÑvÊ›ŠWv8k´y[î**æÊ¦—·Ú™My ±¹*¥;!›¢á£:œ±º¡:aœÂªËI#cÀ¨yK¡íVº:ZÛ$«·³Ú ¢~ÊÕY„A´9;n|¡,Êài£,˜£|‘›°ë®%´1© œhPQB£ ’ºÆÉ‹°;T|±œªÚ?|ñ¶šw²©›¥c »8: 1PŸByP¶ "¼5I¹yƒ7^Tö =Í1}–þH"?½Òg9(ðéÜ\ÖóÐUÔjY“¡- •xÃÔ¦áÔKÎÌQ}ÒS1Î1Èh`Êx‚ر¾.€3@6`- }þçî1¬#1è7.à[’w&Qá£iFlGwé1{Ž;—Žl ÃR“¡D—q®uñ$”çÃ_2P.Šæœ"Ñ´^6 Å5UATCapv2àç³.´^åH—àê¡-€¨“4‚8s03(ãÊ-À³C0À}¡íé<Öqì`6Áž‚ €çFâ´$é\Én>Äì àÄíÒ¾Ôní›í´Îí ¨áZªûïänîI¡35´îÖ±éĶf”3 Oîm÷µ¡ÎIÏY¯g#©^¾¬î[½¦™&ë´^ëÞuë‰~X»Žå¿n4#ñåľcÿìNúî “dôÎ`ö.Õ~íú¾í}ÑíþîD¯º­›ƒ Ÿìr ïòþìÈQï÷îóÚþóBÿí_ôC' Pî|Žs°ôµï*ˆ€^W9?í<ïóóVßïX/îYoô\_î\€D \ o;Ü&/Ó–šžœnlpäécñ‡5Õ¤nwáZ_ÌsË­ò°.³^ò¶> ¸®èw´ò½ïÀ®º0Ïì2oìëQÕ¯ú8õ:?õù^õüîíÿ~ûã~÷(À­cï1 oø ßm»Cø3`‡N5žä7ðç’Dè)à à¤.0ZÆ´ÉM¦¤(q~XF@ø4ðø—aÈOêžä[6 Œ0àC¦¤ç(ZAâî¯ËBÀâK:*<ñÀ/ñˆ/ø×¢•Œ/êÏ)Ô€É×ñ,È{u#o󙼃ò–ècv%‚啾—7ìP_nS}ÈÎ|Ù¼f7ï`Ûs=oöí» '÷p_ÝÛzg§Ü¥;6°ôœTüDOoíí<èö°í#¶Oë<ØõP€Î° ^êïEÃxøœ¡bu¶¿Þ" )ßd”‰™¯&.@¼‘ èØ‰²ÐôU@ H€ÝP¼yE±6žÆ€È—¢süŠ*ŽEEvçg£ƒBŽîP9¢Æ¸ç5âs,wa1^Ç!H‡_Çà ¥.3€?ªñ¯êàdÈ 4àÑa?°üâ¢\øs"RfA»x!£\’DºH™"×_Œ„‘Æ6ˆîâË+~ï€ÀM2ƒcTsPM«"ü‹#¡6¿ #KÕ…5 L’Ì™#¼‘‡E¦AÉíŸID†(y¨Äðˆ%Ody,€¥ðÎÄXÇ 1ã7̉¯3òÄY8AcP¼\¤ARD­ø Uãd=ÐYÅàÇÿÎäaL“ý¯2F9ò#£dôxèÑ2ªÂ·5#Ô“ñ‘šCúH"2 È#Š¥1AVÄÛ¨s£ƒ(z¸ŠE™%wl†‰QñGQ‡!ãš’|Öð<ÊÉôX'9%¢Ã“›QzÆ>™úB#²Së0?&ÇUY(›ã«D”ån®…½2 £“´Š¼p?"Eé*…áF4ˆq[Î@+“aI4„//6IB7$‹$–D’¢j·,IIÕ$'Ó$„„OYeÈïg%ç cÔ’t¡Kú¹ç $h™„#¡Æy+õŸwÔ•žPÌÇøI.¥̆Äò2ËϧA%9üŒÍ2(R§h™*år$—sïZCð¡Q “Nï@†KÉa¦¹|>P•ˆE<Ð.+äv\†Ý1WR¼5)ê䥤z“1qXjJ›È蠟|&sYŽJ?Y©ûÁ-3+¾L®3ÍåÀ3†ÍòQ1ã±Yš’2<öJ¹ 0`°Ä”RsŠÌ›x,¯¦èëŒ|rk¦Ìú8Q¥ › ’lþLXéó¡T܇ß2lÚÆj٠ͦîK— 18fÀlWo^Ú“œâ’UJ™y.¡£Þã{~/mƵIøææ¬*˜r-~ÈSU#IdH˜T¤…_ÖκXA¤¤ëܘïÑuÒÎï÷%&Ž„˜òoGšIC8#‰dÁ¤w¡HV‘€/YdØ’i°ÏùË·"{gÀ|Œõ*H²:?ˆ=YÝãb˜í/LæÈˆ©< #ÒÄ•o3%ÆÍ¦ >-åÝü˜•QonJ¾I2ó¤² œ?‘k–ʪ†0 çΤ–±rêÀ³©ŽŠ¦vd›ïÓb*Mù¹Ã#ð¬Yös K95×#+ì›îñoîIù(8/ ³´,ópNÎZ.¨î[7“*ÒÆiI(YhÙt¡1BŽEÕY•!vt›‰nVP^9#a °Ô x“ƒêOªÉ­f…'“YšP•©å­¡ý±…fÄ£W®ð!·|œMïæÍPU‰E}&AÄ–±W©K†8µ:'DT{F1tRN-ª^Güˆ©³:üPÖÙ"3$Ò‚²NvRGGTJª>‘§Ää‘oP“nBŒ9)§\ÑÈ ãžÂaº?‹)U§±0Š–PÕ5`<ÕÐTtZKËia¨>µ¤0PgúSXÚ*ëénÔ}Õ–šE‘z1…è®ä$r`BÍ ZN5ß9ý ý3YÆT­ÙNij}|-TQZ’Q¢::yj”c‘»Øïª@g©AÌ{Ã… 2àZßꌭ絯RЧZ[©Q†\¯î5S.QÚa*༯õ„ÚÔãJC),=ª=U@ÆP·úJ%k‚ý¯HUhJÈ×úaoi`=‘‰ðHÕÁ‰Gä”r-R ŠAIQ ß‘¥FIv½2Ù'X<Óçô¨í“bÊIu"©„òWÔÓM¦YšU³v‹ÊÈ ²îgQY€Ù1¨Ñx\uï2º€-©¦ßÂ$ƒÆ³£ZÒºX~(T½kÚ½±@».D·ËG¥­…¹¸i覬égrK!‘¤ äOòΣ[gÉìËͳ¥°·P>x¾h®Ã“ÝÖŠÙ#«íòlòó¹ZRå¦(>ˆrsïÌåžU¶åŽG½El]®ï¤`ÒæÆÞ‰9uѤˆ·‰–.€¿”±u£&º¯,v݆ÝP9vè-Ô auÂ>ÞÕ +‰ÀpE`ÀâÆ»Y o45¼¼–#¢€ Áaƃô` v‚ØC§tm©ã ÜäW '$éîvK¤m!ògi£% ŸÞ’TÃÿjÏÉÀú\eж¯w}^RÙû]§‰M„Lù?èœ$‰l’nì{9:Ú4g£­,1²D¦`òYn¿Ê˜dŒ¬U°_ä•´”\—Ã'±e„ܤ–í9­„‘‘ÀR×YyY7ólÝ<ͬ×ÏUáEÌ>¥®7– —%CU-[¦²×EÇ6yËÔ®š_ÅÓÅÌj9)Dó‹~õa*~Ìâ·0¯eæš÷N—FVW-PõFØÏy”¥³rî&y ¬ü‹Mo©\ö«%õБã˜Üu;褭É™ÂØ¿ÜêWŽÎ’,ÃJµŠo´‡O%@µsvçül˜*À%¨× *úL|•”#sQÙºc‘À#t f¹tÓ2„ÜCÇõ`†º7×6 ßRç™S”£{~¨yLöáÖ‚ËD³TÍ®nšÙÌàè¼e®Y ØéÖ\ƒ íyž»tYä:ßìžõn:¾ÊÃ9"ÿI³K‘C2žÎ¯í&hR»W/AÖ͵µ5érìjÏñ{ÞËÇ4¸vbM› Ï.a~Òß™ãvãöð6Ï ákÏX¶d›‹¸Ì0aܬÐ0¤vjP Ãa¼†ØP¶ÇÂp¿¸¡O›†Þð‚C ÔÇœ)¹îðÂÃ>ÉÁ   4  ÂÀݨƒ ìAp£$S À¨}à܃Ð^u&³€Wýþ@®VÞàTk0†õÖ  0è ¼ƒ[`ª•µ@ëP”€? Öàüpð­uµµ>T@[Gë7p  µÀµ”ë`­€7ú@Wƒ€ Z(×à\ë|]0×w€\“ê|@¬€ _€ þû0ì@ó Zl‰½ö(¾@ˆ~`à €r ¾µÉ6|À ȃm >ˆÖ |ë 0ÙÀì€0´Á?Èô€aì7ð~À;!„l0‚A=¨ˆ@j €J DÀ(Ú líúÁˆÚ­Zœ?ð®öÂ^Ö ‚¡  øÙÑZ0` Ã6(@¬ÁA;0%,ðÚÁ·~ `ë  Â`Ø øƒj`ÈÜ p²ÀÑ Àôƒw 80@Óݺ€©V àìîlí¬'6  ´ºð­ 0(Þ>yGkSò€ÝM¸·òÖÕ¬Ú íÔ À@¹æç»°êë ®w7øÖ@x³ê0«€Á^ß~ûìý«½à@kðö÷Ï®Þøà€ °­Ww®.|u îf 0Ë6ݹÚg‹lp°Á `ÙùîйÀ¾†Ý(Üg¯ðέ^¸ÃD \>Ãu5(ÜàøƒUЬW7ÃŽÖû€XmˆÍ²€ÃßAÜüƒl`øÀI|äîͲÀК¼pá-±@ßÎ@ewñ¼M¬óõµÞ€ ‰ëê,^PÎfÙ´l£í¬ñ÷r¼œqs°´ñ¸Ö¤@ü½ºyçF‰;Zïî @Üw´ðÀ‘·êHξU€2€û;‰ €žÍä8 øÖày{{€B¹|ðSn€Açžãĺx€oÀ>øýÆÝ ;<ðÁ9±ž¾ 0nÉÛw0G( ˜gñ?ð¾9`æå s€ Š9àö฻\ƒ€`A(·”kÌ?@/?ç]|_§n9®Îø-/;fç`À$¹ßü–€æ=€ðç cÞ¼· €’<†tð²›5 `Ùùœ}?ïÔ-ÑË5È×à|ƒ€xÛvÝ`wstƒpÒa7H÷þ@À–ÆàÁ|ð°À Hç{@€“Æ€ä:½e/ðˆ­ç9Kãz|äôÆIõ=ã=¢î>®ºë¾ÝZ]|sõ{Þ¼ÀóëÀ¤+ër=90øài½©‚Î]®Õ÷%ëlk§.8(æåšyßõþ×k¹(·é°WqFžÔ[õÖâû¸‡=&(×BÛ ðÞØÁy¶†Ö`x‚ƒ‚(×Ý ÐïêÝÙ™9h| «<€ÚË5@Çâ ܵëk³î·Mzë¾è°l®=¼9€o÷Û³üƒ ñS}Ü€pGî°õæþÜ;øÇœ~m@ªz€™p ÞÔáÁÇî,Ý{ü€SpÖ À/˜$®»nªŽÚ[wc7­;XlÀ>¸Øëdç÷VM¶5(~§›ê BH<€œ\`t€˜ܵËñ¶¾¬ÀðÍ»» ­€pV ooï°;géßz€bÀã[õ/8Ç@4ùðÞ<ðÜÿà wbÄûvÝÅ „PæÁó@z€6ÿæ¼/0Àìƒc`±ó<©–ØÇ{Åþ£ßHo™ x2ØÖ< ¤n‰ &}³ž(`[»€Ko´Ý8ᬚÒKRP€¦wéËšp €$þ@@JÇÖ”¾ ƒmv}^Ï× hãðJ ÀÖî}àŒtJÈ{€ä½U{°¬×¨`À¼U  A?P@z#€i¿¬íÁ7Ø  ¼ƒ€Æó€>÷ÜëñÔî¬7û®ÞÄZ¢/p ±1àžÙ,[}ŸÀ 6ÇÖd`ü¦žïåú‡›ào@ >jø@|]ýÄé» °ø¿á³ööçî²@€|†?ð~æ&Ø/¼ô°òñ}Ëù/«ëüe}ñE~êð{üûžó>îúC?ä}_Ë%¶çùJŸà€³ÎôYû÷î>Ÿé‹öKðh¾\¿úD¿£»î X€?À€ýOáï:*Ž`ôkðØ6Þl¿êO}Ô¸À¨½Y·ý°÷[6àÖæa¹³|±O¬ÿWü6_ìäø8/ÜåúZ7üÀíº›u€ã³|íGkå-Æýhì0à|Ò¿¯ÍÁ=hì@õ“þ“ŸÒÇ»êoÖ  °wìáÍ7EwÝÔÀJâzøá¼ßc뮫Aâ^ô”¾omÀ Ãdñ°6#Hâà䃪AÏnÖ€PP ¼ÀðÆYüT@À?¸’O@J¼øÀpÖÁÄZpl†ø÷\ù@<ð à¸øöÁAYµ'¾ÑsÜê—Àn€ê7âwß:ÌÁB±V¾1š£—ºýk~›@Á†ûåuÁÛ>ð ho@?à `mÎHÇÀ€qœ®öÜ>ÀîæÄ}U0¼=ª. ½I\ÇæI\਱äÆ|ÕÀ/ ½=ê€?ÀBcߨ»U?À*àŸ\G³åjÀ€Äf”k Àù À¬š`æj`«Æœo€è‚¹Àª-Ô[ê–«Á‡`"úm KǪA‘ ±Æªa~ «6°j¾[^Ǫ•jž`((¾e‚«æ½m• ` ¦‚ßÛ#(¹‘‚)\®ÆÀ‚à›,È ¶‚¹"hàÔ[J— ²j<€#ø .o©š.à©Ú,¸ &ƒ¬ À wÈ[€ü~’[:@¬‰þÀlÖ P8êÀ·XƒÀàôÛ ä†¬ÍjÌ ¬yÝÏFã]ò?Jnòàw @ÊÛ(‡”|[>¸ \ìÀ¬FAÞ'àl£°¬õ€2à 0„®›° |þ? ±)¡õ÷`ïçºÇ=0Àì@@èºe¯€+À³ZJ7üák*!pøÿ@;ülÛ(€aÇvTûP¹5„€ àF!ìÆ&nÈO\¿À6Њ„ °¬¹ƒ1áðl.kÀ,rÄ!ñ£ ˆc(pÄ5ý ˆ@Þ(É!~ÑZÿ¶4©šп%3@ªÆ¿5y-€Yr À7`4ˆñâ°â\›ÍÐ)†ÆÜäw à@ÿfÖ]Œç\â¥t¬Z3GB"mÁà†°ÑšÉö‡7˜l¹¡ÊèCž‹¶[ Ù² ‘(s(þ‹,Äæˆs1¡i¸ÂIl|x葤‚‡Ø¡ÉvȑڡÏЇ&›Q·½adlgä9Ǫ­‹•Ýí3¢oý"±¶ºs¤üfà1!&‡G(܈¸Gšjê¡gX¤ˆôAH(œŒ¸À-’ç\ø#>’Œd´Ö$’|„ Ü)oZÖX.îjcŸ>ði£°ˆr[)07òˆËî7)~çÀßÈJŠŽD Pì‰ËZ¤XN†‡#ç‡ôŽÑ=ÈŒjNâЦòƒM]å­ „¡ò¶1BWR¨:²Ži#9x;æŽi#õ†<Îx£?@­-‰?¹Â=Ù€@ÉÒÍjÿ@`P&ÿd°Pú“ÂÜðPÞ“ýä=yJ‚Рȸ½‘Ò[ʈQ·8ãG醔Ó[F)¾m”&e?ùF¦j¨^pÇR®”"eëf¸‰”Ñ  \qod?è!J8å&¹¬)•€ÐSø@?Ød‰C%PW:kÖ`´6¬=•ë$пK™8þs:ÐVæƒêÀ*@W²tù >p 8–%ÀR–Ú0X§âð½†6ŸBP½e+ÇÒ!r—±fZXãÈèZ®–¦%æÆÁÀ§ <{ËšBðÄa[àº)À Àl‰ÈakÑZnyò±–À80—‰\G €®fZNpÜ@°h—´%@ýœj¹\²t1@o9ÁMp쀨^R—@ÇÆ¼—±eÀÆÅ²@-ÖVÁß Ì Ñ¸€/"#½´°qãZ"…" ¾uU"p$n…i\˜ú%U``&‚IÛìÔ^WPe‡@m%?`±ùùZ‹ùbÊq€Œ ¤&œ‰c¦m:f ×c†?&9¬ ÊÚöæbáÀ‘¹cE¦;g±…öÀ?Þ%k ã‘ eJ™,[“ieF™á] e>™\&?qܘ‰e:d&=`±)l€Á6ða™7%ÈøH™àÀ›Þí‹Û›šITâoÀ1P±ˆi¦Å†ÞÕߟ šDå÷0Zlp[ž)h*šf>pÄýzf—øý™g¥A@i>š—¦Å&Lš•&¤i±Ù &§Äý™ûÀ¤Y±­n›Û-÷¹iš¤n«[ëöº@¬ù¼ín|@ï¦jþÎ[ñ&¼Io À¯lntøÀ¤—ÒoÁ¦öƽn­ õG¾µlà@ü–¾­oäÛûfmªvئs‡¿éoç\ÿö¿k\S×Ê…›gG&p \wÎ=p>›×ÁÕw\ßM~ÜÇ„pÜß\Þöì›î­un€ 7±œ€ÁÞ5‘ÿÀr§pœ§Ó—VlËÝÉ·¯Qœ §Å q.wOÜÆÉp:œgÄù­}q gÅyª•œË‡ÀQœX\¨«•œÀ·vÈ©–€‹üªá! qÖœm™sJ™ƒ8Èe€ù@Äù°±t»ÛÐ ™\ $6'×t™Ÿd—tbk´œð¼9€€€øx¸ÜÖ.k_§ÎvöcçófÌ™câU)v’o§”Ù¾esGÜÜévjvg3‡@êe§ÝY³wy'ÛIwŽx—ÙÇùm…gÛ©«!žlç)sʇ@ãyx&~‘g€÷Ï•küž¦Ip¦n"æ)ejž ç)±ýŸ' zq™gRÇÚ•kÞ!®™z6z‰_Ò™Ê1Ýé™z®žÛ?0õ=u¿žç)eînîšM'vþžÄZO§{Ÿ'`ÔŸgé Ÿ §»¦ÇAŸ¤šÂ·|¦njã²ÑaŸb]ËæÕÉšL§“8ÖseÝY·Ò¹njÝyDv®£\G×vááéu.ßöÆvçÀþYvna÷Ø-p4£ÅÖZlÿçbwÉ5v¤b½2îŸ(€k7Þ}pêšþi€îŸñ@¹¶Ú­Ÿž@€B ¨m'äåv™Ûj±ÝèoçË© hs‚€Šß_¸ZþõYÝ€còyƒæ ¶[uçÙ šÖjÇÀ¡à0ÞíuæÝi„â t¦jÂx~‡ÈA¡¶'á]rö‚w…"¡÷ç„Çô^´¦fÚn^OÇá±tg¨îæ$æGfúµ£ü¨6JVvúè9Ž¡¹¦Å6 $}ï(ΗtÁCj:¤RfNwõmkYß÷ Tl¥ÚGª¤ÜF*e)Ô·Ý ~…_õ&’þÀ€Ý‡÷¤z_=W½ý)0pU~y_WÏùž.fËçÌ%~ i£÷fú¤$ä—†o2ÛPêËqs ©Ör~IiOú}¤,3ÚI¥~›ê7úYlóVú°e€ '%šƒó@:"q¬èêÇ•š¥*]Xº•6œê9v¶¥iéX Ä¥çYŠÅÕ¥'^:—¢¥»¨]ê—ê¥né ˜ Ÿ„)+j˜ö¥ˆ)]J‹.¦ÎšrwdZšG&Ë™FxÀd ­U¦¸æXŠ™j¦¨Å–Ä]¦’)§ydަžiišh†¦"#i𸦧igj±€[_xdê{`æ6&t‚`^—I:w‘ k·§Š $X ~””àqj Np¤àrÚª5§  ìÖœž‚Ò©rJª‚Ê)v: f§¸ rª Æ‚¢àwZ Š‚ ÿæ ƒ¼à:  rʃ¬2( âÊ[ÅF86ƒõéù( ‚ùé7ö)äf ¨h!Ô(hækª^˜ø1œø‚ªŸ:… ª 93þ™Ü¡ZÙ8J¨ #…Jî† ê„ºfn¨*Qé¡^l ª*¢f¨ªJ˜tލܡð³­¨(êÅ­½¨ÿÀ÷gz¡"!ŒÚÆYl^¨‚ª£7*ˆú£©*jÚ²©jBꆩ<ªG¸)©ڤƃ°¦Å¥"© *®ùg^©Sj’ºj6¢ûçN¨j©¾'˜j±‘yá“ú¥> g*Ò¨¦–©l*€¦æu›*§F†`äé¼h@ü=éY·ä©–èºH´‹€ªï)¨ª¡j&ªÈç úÔª?[€|ê¢:©t!€’Y®-wÂ\¦ª$nªþ@§úb–kÇa¨¨BnçbÁhªÞ˜åZt˜žjåš©j"²tÜ¡b{Zy¶*[§Ý]”­Zz¸½jâЫÚ_|ˆ’”Éê}ÜžG¦# Fkü¡8­ZlÒªÈÈÀ ˆšæ‘Iä… ¢jw­„Àƒ¨HŽ« W§sò­£l©ª«X&‡è®žu‰d¾‡e‚3£žYÏÁ«¨ÄVf.ž\]”)œye&òÙÒm‚c'Áªf"Ÿø§%˜°:š«ú°þ«ûªÄ:°:š +´f–¬c©¥©±N¬+´­é™Ý¢¹g>ŠÉªÜý™kÊj¥®¬‚&ì9²¾¬æÉڪͬc>Éi¾©9ëþéЊdjÏúb­ ©ÐzcN«É'zÅé©ÀþÉôEJ+©Ú´Z©ÐÔJ.­¦¨Ó:¯Y­ü€AØ.N­Y£Ô™´R !¾¶t£áǘޞ®ÛÙZ®Œ\ÛY÷ìŸM(qg´Œ@©A0·œŠ&ù0FwåÚÞÚp.p#éÓU¡+ݺÀ}Œ|¨ÈHhr‡‚kÚp¾­*£vØ2ê­t«3‡ú'áyÉiws¤ÎH­òŒ>c¹4Š­Dã¹Az†I£"¹4 #gª&}~#§÷ä Š&ìºfÚ®¸k22œF§ç–ƒÒt¿ëî*¼>¨Ýçö&°þl·ëƒš ËëÄֻ⑫ð³A¦k^Ug–^¯ë§Z½r¯1«åh±‚¯«é÷*›Ú¬qYúuv¯»£úz¾®yG¥Åº¾†¯ËÚÇŠ|þˆ(?°ÔnÞèýš¿ú§ü+Áé¿ò¨ œGÉÀ °gþJÀrýkû¿šp¹š“yG2plÚÁö¤`ƒ”U¦ï™ÁV°d{±½bkʸf’°¸ÜƤ¨¬g=i»®°$êŠC &l [½É‡`ä£Xp~3¬íJ·Ú>¤iDöäI¬‘´jKD‡ i·¯ªÿ×±1‘ÑšY«*™‚›ÙD* P,{Äf‘[$±êÅ_$in^±/¦àfF«ÆÜë)Ʀ±ÄÉÆ¾‘}¤4«áyGæ‘x,?ÀGÚ‘gÛ²­«çf!IBö±¤®†ÈJˆ,«f²®yɫɂ5+$ ­ý™”ì©I¿vŸÛùöÈbv—ì?àɲ¬¨ÝÇz¢j²6ëI×±Êq¬È*±ž²Ÿ,ð¹ÊV²®ì,‹Ê®yª,†zËò})>ÀÊ’²ïfAªƲºZ;›þ²›¬1ë¬!³«©2Û’Þ­D¥0{Ä‘Îì4ûNJ³õä»fZ³¬‘¹Í±ÚìÅÆÍ2”Þ¬8 Ί°àÀ8ëO–³éì9ËΪ³ál;‹OZ”(%HÙFb•#¥ KS’”Oe>;Gö³Ý[=›Ïª”.¥Hy¾™£òa?{Ð2œ mN)Ì¢ví;›B´>¥D»xâ³ íDûQ•íG ¤zfC«H‚´-V ¤z §×‡Uö,]JkÒ½‘(-#¶´2íÓ·—Þ˜rÜM«ÒÚ´)mNëÒR–4-NÔî´+\J‹Âò´/æQ[Ô&µ@-`ê(µž›QÛÔrœOíT;r¢ŽãÈ Õ¦œ çVËqÂ^­VkÕœa-YËÒu–Ÿeà~>—ÌåØ'Z6u¤¥ÀgZ¨åvg^âz,w×–,ݾv×R—€pù\rp2€\*—xmsI]B—Òå7Ø|v ^²–2à]N¶Ì¥ À—ˆ-tÉdj-§øEf…ya¦¶&DyLP-1.6.0/DyLP/doc/Figures/varmgmtcalls.drw0000644000076700007670000005114111171477034015466 0ustar ª» €š'€ ˆÈ sÇH6eb P%Ì™2SÒè)ƒBFŒ.r°q#‡ )XL3›0y˜¤³ðˆœ7uà´|s!•2xX ‘SgM’P)"¥0\ÀÀƒ…K”(bÀ€‘"¤ JkÈ`1‡‹0b°ˆ¡iÙ¤0Æž-ëG7bÔøàAå v°IsÆÍ\)IŽ ¡B/_¿<0NA'Œ˜¹P¤Ø}"…J’'N‚0AV %ç¢ý\ò17bê°AHgn‹ R¯.Óš‡TcæÌE!äÍ›5m¸IÛÌÜ6eȤ©Ó¦xÑ >!æä˜5"p³‘³»ˆ“#L’LABü¤›3u–™ÃˆàsÖÌ…+W™<_ÂŒ¡“&/2V„!Çný—ÓtÈQFm|Q†dø @H Ü”o<ù”PDeÖRM=•GTSUÅ 3|5 4Øà‚gb‘•Zª5#[nÑ7W]wåµW_s1Q„„dbJ}Ö˜i‘MVÙe™mÖipˆ–$hp˜†šj¬¹›l]ÚöYn»õö[pÃw\rË57†Ïñ ]t PgvÚqÇ Þ'y ˜‡žz칟|oÅ%á}_˜‘ pâD‚ 2è „Rh¡NþÔPE…SN 4¢TT…„¢Š\MãZ7¦%cm%*]váe$bBY؈)¦¤cIe–a¦g/Riåb¥Íµålµ½—´±7¦n{š œpĽ¹¦rÌ9Ýœvê‡çÛu÷]xã•'Ü ú^ñͧ¨sŒ!r¤ÑF€rLAAìé .ØàƒN(Ò¦öä)‡¡~Hªˆ$¦zbŠ(nä"Œ6ÖHã¬4Öª#®=îäE;—°ŒËC“Ç>©¬”Íbù,•Z‚™-Ö ]ÛmdvëÛ·iŠËräº ç¹t¦{]vìêÉç»Ê{^zõÚf(¾ˆêh~sÜôȃ“6l)Ä™N,iÅ~Ú¡¨JmljÇ&®r ®–Lãɰ² ²¢,ë*3½Æ|ØÌW.Y¬“ÉFɬg>Ëye´§íåµÔj‹·¼-f¸Æ=Íf¹oÆ9çtÕ©‹u»{ö / ‚‚½žØ÷ækë¢ø¥áFtÀ} Ç]éØJ¬€K0ÉTáÝ;Y¼!¨ŽâߨšC 2¸` 6p5rX†'Ž2ŽÃ7îãä<&˜äGÒlùÍÆ" å²SêÜh°4lUëK4]ÒRw&p©ÉuQ3—œèD»;ÝNkºëZ æå;{J_õa”~èà!L`AÃР5R»TÄ4…½NmooûTÂ’ñy$2¨úšõªXÕè}iYÜ­xä8úEîWôÓŸÍpæ¿mÎYžƒV–¤%:¢!°tb:]™Tç@§A­Mœ]jwµ<¹ËOñÚà×¼ïlùÙO O؆®ð…rƒÞ EÒ:ü${yÃX÷ú¦ÃS•ˆBCxƒè9  - `‚LÆ—¢Ô€\Q …4•xÅ“ œ(«B!êÕäzBäŸÇ7•j‡dAÈb±¨pHO†uƒ%§´§·Œyï–ŽôX<2>±Ð˜‰Cœ‰)?—AfË V3™ôḬ̀gÓ è¦¦¢]s›cl`ÓZN©ÉŽ‚k´ sǵ8öŽcžÙ§ý¼AöŒ!ݤWÈCÚ°Ÿ‹´%Çx(’HN²’— )øPÒ-£”InÐTA••"q¥õzŠ·YâðŸCÍ¥ŒJÉ:X“¤ìeYf@ÕD7(Ÿƒ¨¬2$ †ìê ýÉH€’’,ëY•*µ¦…­.p+aá*W®\•B\•å^ƒê7\zl¬E*Z «®´õ­qMl(ëj¢»æU²@­eeZZ²jv±†õlbAÛØ§’²xõ)?©ÚFþµ¨™5kR3ÉÙµ~v±¡" V‰ÛÓþ”·9ô+Q1{Tán±E¬b‰ËXÑÖà±¥ÕªMj¸[ZF7¬ÜŠl2öS¡´Êã˜xL^AÔ¡R¤(æþÇ3Îeôs[ Ý5= F*M¤¬cGµ Ún¥èÜ×èõ»vÚq¦øãÜÓ¹E†±|®yÁ ¾\ª÷D^KMV–`2”¾}"~'z¹œY´¿XÔh€9:4ks[!eZ‚!¸`qªÑjæÄ`KÕ9ǰY˜l ”ò‡2È  >ê° ó)^}ê5µç-±Ç¤â¢Lu,è#bûŒèbù.ј1¾ïãò[ã*F£U¢&­ FÍÀ ò7_gÒ§ôÁY{£„åHaBùŽñ$¡ ÖG¢AËø”ÅP ][V|i6ó t¹¾®ÅÃts1[ö8Ï™ÆüÛ¯¥™g°Ï_ü±,h3:(Eò­Á—:9¦ï¬Ï”«<,ëÓ;ñ>9â¾¢×D9pá4"„¾)SuC—LüIt1û£"4/êßZøÖÍõŸÌkoú:‚ gÕÊ9l–¦s¬ã£Í¶ì2Ì`„ýÁk ýa»…¸¼_µ¶˜A]æ3w[ÍïEõBÅ ãVË9аV÷¯(Àwó9ÞÙœ÷®mo’þ:ßGæ7„3èÒuÛQÆ#ÒØÐნM¶šÛ/wZâŸluËÝ©~Ä£FU]+¬d{Ô9`.!‹Îéj uâJìp—JÕE}*SçnÕ3u4?vëÎ…8_¿žtà.}ìR-{Û¥NªÃÀê{‡sÃ;ôñ>œÚ§;kC’íÄš™8h¯©Ý—êøuœ~åŽ(åÐíLYß¹Ý?Û³€qò£Ñ›ået9¾l™'Úß‹6v…‘ó‚ËáþYøÛ$C}Ó"NüjKfˆò’_³07ny8{ÜW3æ¼~mÌ_’ÿW‹ðî±¼M¿òn¦^Áá<)9UúúÛæ³Ç9¤ñ³s½À¡?oøùîvÏh;|Ú^ûð‰Züã3å+î•P_ÍÇjNôqÌ$}u¶n8VrØwrÚWz ÄMd4RàWhúæ`mT~4Çd&p2OìWâatù|rGY¾Å¡vf7bømnØDGâj §€±F}³†g¡·Q]ägÜ·@ÞgD~†&l3·dSê‡ay$i|äG—6ΣS 'tÕ³‘|úׂbåZÖµXNgv'WoµvWw"ŸUZ_¸‚½%]c\LGvO7j8 †~xz¨†pÈu`È‚txYdx‡y—‡i8[}Èvzø†vÕe*ˆxaXˆ&ò6£vÞÆb²Ry+syÈÊ}Ã2}vÆn9fr£‡r]hG8d%lã‡hçÔOxs¶/ySXØ{[¦iäE‰„xmŒç2u'Ò‰§ö‰ÌŠÎw€Ð÷j<(rÕGkA¸cC¸}d-w´¸oäw‹NÈh÷d!Bø1B{DiVˆ‚<%ˆrfuG]bw]8à5ÐK'UfHUè#D`q[Òft^·¹tY±‘€“Çf 8_Ó8Š÷£yHr•@¨gB8`ÞFFX²ør¬W‹hŽÿ†ŽP¸‹ìøíwd@¿è6p#Œ™Ö\ºeŒsˆŒv—°ÕY{Ȉܕ\,`€¨“)|bhˆvˆwØ%”|X”U©¢”]Ç”–v¯Å]±5”ÛEJFyw;™Çv?Ù•i%•D)––v‡™‰‰¥ca'€ÐH€Òh€YŠÖxŠ 8rÚè‘Ü’(’ˆ`ƒ¶zâG޶¨d+){޶ŽÄ“ ² ÷c“¼H9yKi™jɉ/²"ã#ƒ¹| I‘¢i_Õ¸ƒ¦Ùƒ©Ø€×WM­¯xz±›E6›˜dÄVsM–~.)!ýò/”F0CDЛòw“Äi\øJ“ˆ–=©–R¡Œqµ™É—qŸiƒ¡‰ƒˆ‘y¦X3¨È€ÖçnØÔš°H’â©„xh)i›±‡~¹™l‹BŸïˆB–ÖBõ9œõ·…û9YýYwãƒ30> ‘Ênðs õõ2Õ™€×‰?zª™}úÝg¡÷6žKèz*Ù¡éù¡9Ç(d ¢“F¢Œ÷¹…tÉŸvù[…™—¤$±1"Sù¥1€bº™IÙJ“™¥,º¥ÓuˆP‰”¢E>Y”'£‰³ˆq'˜HG˜rz]t*Dvšvby2dº§¬ÔZoÐsC IŽºRpbPž4@´00!!ïçØX“ª•z©ž!D3ò© B3 ¤zS”j©±\±g , vJ Ъ° \¥zªÑc1i!]ñ©½ú«t0¬˜U¬´ÈJ+B¦6ð©ÕA‚x᫬!­’*«¦J«3©Še'$øª±jIåz©¨24 ÌzŸ:7åfÐswPrl@‚âÚ¨äj¬Ö:Wè³ßõ©?‚tk+°í:«ðª™A#Zñ©p eg  2°Ô ¯0°©:`ñ©³qÁ0nP$[°´Ú"ɪ8`¯»: ²"ë5ë®2A¤\<+![yP«ñw0´‹©s•©ä“´‹N µüJµïjµqHñ©gШd¶ÆjMÑB42`¶hû /‘¶¶G‹®Võ©75/û´Q;µw»¶X{>jʰ|á° ¡m IjK«A$+2жgú©sÀ¸Ž;¸»\A¦*›Ÿzh° Ѫ¹¨Ê¹2€ºžÁ­eÀ4[ZAVp´ñS© 0»}Q»q®-uÿ‰W!Æz®G,¼Ê»¼Ì«¼ak­(ûw {Yº;³tðI•¿Ë‰ 2¼a‹³ÖÚ;‹¼Í[¾Ëû¼ß5½c±°R½¼›½,°½Á뽄;WgZ¶æ›¿É‹·™š·äãVíK»×Û»H¿ÀÛ½ Ä¿ªŠ¿úk¾ ¬©b#¥å¾œTb!¿L¼Õz­œºäÛÀÌ‹·lµ™£V¯,ÀØ{®íA–qÕ˜d¬7>1|"Û Âå¶ÆëI'¼»¬ÂPG–a¸a;ÃD\Ã6ÂÆ ¾È:¾ÌÃ)\À+ Ä.¬Á—ZÄ4üÁGLÅbk D½(LÀ²òÃ-,Ä0,ÃfŒÅGüÀ«ÚÄÖûÄaÌÂAü´jÅ1ŒÆ6ü¼ܹ Á§ÿ!n`¢(ý’ii€ò7p{«c±«\ Fp‘<É’l–|ɘœÉšlÉ’ÜÉ“¼É Ê”LÉ,ʦ|Éžìɧ¼Ê©üÉš\Ê«ÌÉ£\ɱ,Ê­LË« Ëš|˵,ÊÃ*Èc@ȆŒÈr È[±Èb!¥ÌË›ÌÌ ìÌ™ Í»<˺ͳlË×ÜÌÙüÌÛœÉ,ÍÖÜÊÚ,ÎÜLÎá<ÊÕ|Ϊ<ÍæœÉ¿<È…|ȉ ‹ŒÌެ,œÏ¸Ü˘¬Ï,ÌÏÍìÏ7ÎÉ]ÐÑ|ЛLж¬ÐÍÉËÐþüЗüÎÁÏÄlÌŒœÌ Ò íI$MÒ"-Ò„“Ò'Ò%]Ò- Ò+­Ò5ÓAðÈ/mÒ1MÓ+mÓ9íI6=Ó3íÓ?ýÑ;-Ô„CÔ9Ô<]Ó;ýÓ6ÓHÍÒO½Ô1=Õ5€ÑÂ,ÏÅLÏÇŒ«÷ìÓË5ÖŸdÓdMÖbýIjMf½ÖjÕ àÖcÝÖgíÔ--×eÓu½\i}ÖFÝÒ{m×'×l­×xÝ×k רsmØu­Õ=Ï#RÏ`­Ì ÀÔHmÖ4°Ùœ]Øw=ÕšÝÙ› ×XÚ¢íÓ ­×¢=ÚWÝÔ}Ò«ÍÚŸÍÓ¦ÝÙ˜MÓŠÛ¨MÛª½Ú=Ì’”ÝÈ–ÆÝmž‘Ü';ÊÜÝvÜKÝ8ÝWÝOµÙÖ]ÝÒ½ÝÏÝmÜÜ˽ÜÍÝÝÆ=ÝæMÝ×mÝéÞÛ}Þäm§àýÈâ-ÞïÝÞèÝØ½ÞSqÞî Ýð=ßóÜ\ßü}ßë­ßOeß8ðÛ\ÍÑölÙC0>á^ánáNá®áŽáÎáÞá â3ðáNâ$nâ Žâ"®*žá,Îá/®á1îá þÈ'>ã®ãÎàíÕ}ÏCpC^ä1ØHyþmÜSÑäMþÞ‘åHnäF>$VnCBåD>Ð åR¾ä¨âäOîß^>å[^åXžæY~æ[^æ‘'ßõ-æcÞÝn.ál>äW~åZ>äuæò-çSåInæZžçiîãÁ=Ü­àª{mÓ àËà ^ß8ýè1é—N鎖.é„ýÚ"Íé’îéíêàMØpmêàêü]߈ÞÕ“ýÕÄýç60Ýè£ë¹>½¾ë¾ÎëÂìÄìÆþëÈ>ìÇŽ°<$–ììX^ÉE€nÉCpÉ×^ìÉ®íʾíËŽëÝîÜ>îËNî¹þì— íÓþì\è0`íØnæ.î»>ë^ÙßM¦úN¦±MLñïðLÑïû¾ïuðð¯ïÜïÿðÿNð o _ñã3ñ©Û ñ/ñ oññÿðÿð_ð _ñöä>à)ÿò0ó2ÿò.?ó6ó8ð5Ÿó<ßó ¿ó>/ó+_ëAnÙ¼|ô×ìîH¿ô×ÌôßÜôIèL?õPOõOßÊJ_õZOõ\Î õ]OõC/ܶ¾èFgŸöh¿öjÏön¯öi÷oïös/÷q?÷¥<÷u_÷v¿÷{o÷}ß÷ü÷oøzoøpøto÷ƒø„ßöŠŸöc¯è÷,Ðû|ÉDùšŸùÏј¼ù›ßùþÌÐFúš/úú ʦÏùú «úù¬ú±ßú³¿É«O¤où´oú <ùeÏ?]½ú <üÅú›<ü¤ŸûÇÿÓÉúËý¯ïüÓŸÓÑÏúšŒü¸¿ú¤Ïýšlýš üEÓÔ¯ÉEþêŸþÏý›,ðÿðßþ/Múë¿þô_Ò ,ÿòŸÿ$ Êìþ©?ÿçIöÿ›×ï¥2˜þ¾ßùËdŽ¿Ì¶Ú#z-ï²]µŠWÛ8[P〽í´Å4 WP: l;iÏz6XñH]Hëw0á©ÀˆðrÛj£O’¿ ˆK`LÃo§Ž³Ili@pŠ´¨×ŠàLx.¤%A!HÕ›liL°¥É7G‰ ~ÛøN"A@7  ¶m~½3Øt›”sep ʹ(`àsqð¤¹;(å Dƒœ Þ:F7ñú» y…0¶Їñž"tˆpáBHÈájûsr.¼I˜ +¡$|„sPhÂ}Ç ÅœÅ„fo“Ù´!À [!+„x lºÂV _Ÿ,œ…C j²[8 ua&ƒk¸ð>¼XÓ‚a.†ª°Ã’'ðˆaK3†Þ3yG ß5¬†ØðN…lÈ µa7ĆßÐb:H&»a9<‡á¢Ãu(ïJ™8d‡ð¦Ãx(åÛ<¼‡Þ°JCË`@?ü‡I0 ?H"¥Cpà ĆõÛ@Tˆñ â·„X#"dˆñ§UDƒØ­E„ˆQ¿™¿œ¶-bHü;ÃobB9÷éÜÄsw nÞA''ßZ" {‰.Ѿ±A=˜ùÛJtr8ñ&êD88âPsÌ0àÁD›H[šJÄg;+*Æ Gq@U¼ŠR1+fÅ4­¢WÄŠU‘+JE±(ÞW<‹X‘,FÅ­Á"ZôŠj‘,±E·hÓ"[d‹]Ñ-ÚE²ߢ^dvPQ-âE¿HãâSE1*F£°ú£cTŒMï1>ÆÜ·#/«ŒŽñ‘å>ÉogLŒ”ñ3^ÆÏ˜û f‘ñ4†FÌ81ãf<Ël–}F!°%#/{Šªn¾Áºíæ$gØæ­¾}·SmbnTnÀQL-¹K‡³›q\ŽÄQ¿}ºã8é.b—Ó‰Ôñ7Çö†=á&Œmo껑'ð,^¾û„«-E›&‘ ,ŠSÁ f7¸V'õàôƒNNO¦7: èèàÄ“þ° ê7BÙOÚÄoŒòZÁ/H"3š‰¼wƒâaE0¸¥·d…ßÒ[0.Ë%¨1]ªËNÅ.•U‰k—ìR]¦ËyI.ëe¹ —ÝrŒ8| Ì¥¹œ—òRÀKwé.áeÀ¤—þ’\òKp™/½¥f´—õ`ÌÙ© fÁ<˜èbÞˆ™/9¦¸Ô˜€Qb®K‹Y1)&Æ4% “tÇ„WâZfËä}›Ìâ¹L— 35™ytq3³ÄÕÌL&3s&[ñ|—¬gæÌo4-™Ðœ™;“Mš9#$Ϭx>ógV´Möm€Õ¼šX3kÚ€Â5»¦×(Z3l^ͯI6¹¦Ø|db³l–M±™6Õæ×d›asð¹M¯ 7µæÜ¤›uk–M¹ù6󿨼›\s[NǃB8ÏT˜‡3qv…˜Xà gáDœ3q2Îö6à§áŒœ³%¶DËyP0§äÔœ©Žs@Ϲ8AçyãœÖJq~ÎÉ9§ê„œuF7ÔI:‹€‚{Š—ºpù>‰)ä˜Ï“ˆ9’†ËHZ‚ g’xó×ä^Z%{iOå"(@åùÒON»ÃoøQÏ’vPHÚH”d$ÑzbÈíé;‘'ñ„³yjHKF=§ùÜg2®É9à‰ùÜg »|òÐ=Å–(ï$ ˆAþpõCß™h@äbkÜ2À-áõ]z‰™ÁV“ë]²B3êä‘{wÓ­vË;5èÿ|*A@€ ž~X@èw tr!%ú@g@ˆ<Êj‚ ú?7híTÝòÞP 'ß|g•ý–ÐÀ@(Ü‚ ,4  *A»å Ô†ZÃ'Eå< 0PŠD{Im¡*ô„.Ñú./è5O”q¼5ðÔ(}£p?¾Ñ5êFç(Ç«£¯U²QÖYÝa64²½ÉFCÙN$å³l”Îâ%A‹—e+Þ–­x”ŽŽ/›ðºlÂ#³ÏÌ"¼G¹Þ¸,Ô²ÎÍê78‹ßÄì™z³^6Ϊ<*{)Y^„ˆýÐÈAKh- 0‡6ÑÚE«híwy´‚§$ÐH ií8\´ƒÖÐ"ÚM{h3-£å´ˆÒVÚ’(j#­¥Å´‚¶”5ÚMëi=íª].”ÖÔ’ÚXû]Nm«%´¯¶”ÝZMÛhKm­µ¥ö)ƨ¥­˜•µZ±H©ÀXÅéH‡­ @J™ÈÙB[9AÙ°E¶ùÕÅÛb«lc³™ÒöÙ[¸5m•mµÝd׶ئÛg›m»í·µ™á6ÚB¯r E!g([·H ßÚ›8Û-¸·â6ÞRÛÃÊz¥M;¸7á*Ü…«®Ã}¸áÒÁˆKq+nõ¸wZ¾Ëq;®Çý¸GÒG‚Ü‘KrKnÓ4¹(7åŽ\¢©rKnSÝC0wr9¼ÉEs÷˜‹¹1—àáÜÉeév.`œ¹;÷æÖ\š«s‡.¨[Ž>·ßm<£ #ÈÓ-º8·ç] ;táœÓݹP·æÊ:>Ûàüì LˆB „ݱk%Ů٠»`÷ìŠÝ²;vÍ®‚T»d÷KÂÝ£ ÕÚnÜý¦s7íÚ]jwÝnÝ…»lWíêݳkPóîßµ»·í‚T’fTbU{iKU¨BµÇ[Ò`䥻Ví®A5žêx5/A½¼:U©A^Î;y=ïHµ©o—òš4Ò›yOšÁl¥ö¶^”{iïì i¡Wõ5Ý+Øl/äå½t°óÊÞßkzaï…kÂ×÷ßâKÒçQ4Šn)>ß&Ç…¢O\«ÔwúB_Þȵoö¾¡°úv_ð‹U½ï~ó¾-ѳÆDëË}k+×½€(2ÂÄÙ:ë/õ ¬ó׳¢VûKùoþ «—ÕÿjVÃ*€0`,Àx²¾_Dš"°øEÀç—üò_õû€!p†À×UCàõ»ËïõíÀÛ÷¼)`P«,¦\t¦SvFºl:Õ¨}s°*x“ÉÎüGgð8äŸ2˜3N¬ƒÓ¯ÓÄd6Xsþ¾le)Úä–.l‰êNº„e@ØC; #Út9…Qc 5WXwJ2-,h#OFœºµèÖ%ÚÉð –ºséNÁSrvèñ|ÄaMd–¨$«¯–låá0ä–wAÀÛúCA|>–h!ŽM¸ @(ü„ƒH~ÄW8 ÿÏÒ7‰#èÃÇ3l†ÕðR@ÃSa§ºaQ,ßâ0 ˜Ãw˜ãá:hgè<}xÛÎ@l;q§&ºÅœãáb\Ì^{q{¥ 6cŒ'Œ…q…íÅœ(ßâ[©ïvq2öžKã`LŒ§±4>Æ3T+c«êŒ54þÅÅxO¼p¬`±ñÎêÆºXk¢‡­15ÇîøÐ~ãG„Oð=Û®ö³þnÎíꀱ«ãT¿ì÷tòãœ[g³Ä¾x»¡Î~\\‘k†ÁÙr2dé¶-¥ÞÖ›d™(#·‡¬‘;2GþÈ™—ä®ç‘K2H>ÉY$[äVvõF™I~É(ù$«d9×õÐfL†É8™·2a;nm·ýÉ#vÙ2Àž|m²Q†¢õÚ^ÛR”›²P€DÙ';å œ”£òQfÊ@ Fåu”rUVÊSù*kÔ¡ –¹rX&°µ"Ë9‹Æ–MÙAnËpYW»×—-š»ëe¤¯.H\"». ƒ—‘KnI"Pú 3a6tÎ.0ƒIÂ̘ 3bæeLM6æÆŒ˜eY+“̆Ù1«¹hwÍÔ¤fÌ̇y3'æÎ,˜QãdÖÌyN1 æÓL˜ h¶Ì£ 3ŸfĬqý8ÝŒ ÐòÝæÆ˜››æn6}U7G@Ü,…óC…}À¹7ÛæáÌ›‹³@ûÍ /*g}7_Z®Ç^7†2²tÉîr~*¸Ìv¢ˆLÖ©ºó\Öu¸L*0+KË”•èÃùs-Ÿ½÷Œ1º „Ù’ygö¹É®ú»dž“A;½É Ý~NsšlÈe21 Eãs¢œ °l LDAš´+i’,OB˳‡¡Ñ(vþ˃Дqg‰2ÙÏúÂçî¼¢­Ý6¤S!=Ÿ,øÜžOq‹&D >[²@Ÿ?ß}ÎdÚïóá¾þ\ ´ÓÐé®Hÿç%½ ûó>cÐ䤱ç‰&¡? …iú|Öa‘VɲÎùTËYOÌ-NÛÙär(w5n:Á±-néþÎùèT¨‚)dh¦PP¦Û‰¦4¶M³ÒÔ†Ç#X¢ûˆß¹á¿DæÕø¸ÓˆŒÇD LS£žWŽRGÝðµ 6Ô›x³êA ©Sן6%–[‰a2µb™0mNÜ»ÉiygX[ÄTˆQãðdq×úè&±vó–a¶Ži1—¡§¬%Æ£ \ÖuÖXH€ ÜKÂH(D²^ÖIAÕ0𬙵*ñT"¡Z'­º²µ²fÖ`aZWkADõ·& %˜ëeMb˜®¢Öߺ|Œž¯—uùhݺ^W°‡â–·^Ö)Bm—jÝI&Wi©ÇcR 0¼ƒehETLi²Ò€Iý$ø*7p¬“B1 A„BTì‹Ý«æ@¨Ad"0±EvÀ¸ØsÀÁ/@IöÊnÙ"' „ñ$ÉÂvO@ZÍ „ððÇ~ƃ%ˆ -­Œ6¥I;?œ„ Ü®ŠÅ M3æ€Á@ *\àIBB"ü÷¯D(SZ!óFL™3\ÀQ£"”(A% 6et€xA§ œ0bÐÀCŒ4dƼ±©²Ä9eÂÐy#Gf’9l¸!CDN˜; Ì0ÁæM¢G“ÒIóÆ ¥1ALQª¶ 1nÀ¡cF 0l€ð £FQ(aΔ™#3FQ!^§¦qs1™8h€ 1Çä’oȸQ”È›1uÚ”qCÇI™2dPKìUΘÁ2Q š¢óçУéL©›4ªY×q „l:£ÉÔ^Ydê¡¢IÏQ0'Œ23É|™cçKG5 ÊàƒDj3 Ô™SF™4cèÌ|ujÕ«DàËŸcäûøæñ‚Gg,uÐ‘Þ bœ—Àb,F†ye˜ÑÇ€RˆÞ E<(y6X¡/aăfH¨i!žGb'îÑFkTX-Žø‚O<(Çt •ã†S ñàc„Ó$N#{t¬ˆã€.¾0ÅG–AÇVåÁä THñ V¹•Tê(²XÉq†_®)Æm¾‰”\†áešŽñ hr\·Ô—c°1hWìÁ¡_¦èá)²ÁÆ—gd¹e—˜Êñ —ƒ-…¦s|ZÝu_*ºÇonhùFªjhÊjj¼±Xªxîå¬wE¤€’ØÆƒm¼aè«Á¾àƃ­Þáè¯_ºÇƒ/àA’†_zº‡Å›­ªrÌzh²rŠ¡i¹Bu%Ç—¥êŠÆw°K†¦d„1°"n8›{X;·ÆºÊn»„"E¶’vàoBìÒq$™oÔÈäJ*…œn€0u˜±¡%AD‡3È aÑe°1ÇíeLÇÆÏT$BFHQD „ä_…,—`3ξóÌpÔÜF$’Ç3Ê·…Ï@ MôH#qôÐ €Ý…†U_ ž$Oa²Ã¶¬q{» 3 ôJƯi ´ýöÊrßLwÓwƒ€Fiœ†‚/Xýž’¯ ‚Ø^›—†„+ý,ÓSçí+}^yy˜“ýçq{>7Ç·¡8ãŽC~jY?¬”/£MùgÍ»µU>üî½»XTIÒAnÜ&‡Át ¼˜|íý(GVLé@Ï¢!†oàA¢cX¯pöLý'Ÿ²ÒS¯¾|‚Éç"ûîé7`ºq~ü¹™ßƒ2èá_ù¸ò†0L¨ q àö°Á.} úæ—Á¤Á Oã“’C¢0h «NxÂà1kÍ! ø‘|è`-:ä€Âë]Ár“CkY&1|ƒ¥@&ðH-C `Ç,Ä-ˆC4á<¦¥*àK&\ÖP¨4&¥…ƒ¡ A@C2ÞˆR0âˆCäYk‡¤é!~E6(±lxlâE×䬊n¼b²bö .‚ñ…Aœa o˜9±&n^€ÈG¼ñˆEº#ñ8ŒDŠT„$™thÇ/¥aF‚ù‚U>ÖžB¦pOå™Ã„È€2”3ËÃtPÄ"ÍD–×:Ï/Ë· ý+ÅDO^pÊÀ”A !óØž&Ô†:àM.œe€²9’1hKÀ`é± maœxɽÒy¶->²RØi¦` i†&Å–âùïÀIÁÊS„ÉúçŒæ°UÚkcäe}ù‚u&ó˜ÁÑ2ÿIOi‚›dÐ&¸É9}.æ áDç:Í $ö€àœX±à:Í&Áw¦&Eå3£‰.—ßi? (P{­AùªšK'‡/¤‹)eåö@ÀÔ-*|B´è:IKóÜ2—»ìå~9¡‡6”˜‚h2 LË@R!ƒ ÈTfÊ´¢3ðæ>AꢴµOy°ƒ’.èQpÖ•©"¥9Ñ©Òò°Ô® Ø[™ —”¢4½çMûªS†- ‹e*dë9’ú•Í2ÈAfÍÌÆÔ™¢gaà‚à@.ÕÄ[6M»Ù½€`µ.ˆNH+ÛŒ6Öi¸m—ôŠ·6<ã)‚è7\%-¶ƒš•);¨XĺµÑDg\c[NÞ^­¾ÝæêäúÑp¶<îõàyÚyFÖ¦ùÌéeç{!¤DM)ÓÝ(eР^7•G-ê*êÔ½!ªínUm \‚@—|A€ÿ™7¢b'z *ä{~Õ£ ©®uKÁÅj•«­çWS,Ö°–غµÕ®wÉ]Œj”£äõ«DKN`¢4;. ÚÙXõ憽µ­)>q:×ËB7+%ÅN\',Ý\èƒ!jñ”¾„2Ó œk–‡ÜAÉŠà{”§…1Ïv-P\p%T†1g—/@ ávµòŒ× ]ÙÊ€Î<[‹Ï“Óç}àí :¸u}ölž>+:+v4¡#͆CW:ÑÎôo!-ÑN_ Óª.c?•ØšvÒ§†au hiWnŠ+%…ˆ·"0Í¢,òôxÉ+ôו«¥Úʳ; ûj¹«Ü¦ØS‚þÚxl9s ËÔ iE¦}±·™¢åuQKŸ;œä°žòPjit›ÙbXé@¼¯$‚Rº9æe1°¡Øñ*¨FÃâ ¥«…6RâPð;®ápÐYjRa1P–âË,K„è0³£©˜RfØxÇéð³Žd/ ´0«…ñeâÎÖ²³iÛñ®IâØáî£Ã¹Ì<ÀüÁ¤¹ÊlñywçuM€Ååëó©ˆg@zû•w_îtnt¼4÷,† D¹P=5V/Ö„æP1`ˆãhø |ÒŠÇVýåwÉÌâÎñ ûV˜1è µ@.r{‹¬ï3¿»1a w,ó7¿PBR¾‡ A‰LR™Á-N]"§ îû¥–ÆÐ†<¬!À XCôîà¿B¾€¤"Ýçþw¹ÛÛ }§ùxÉnöºR5+;”Ä]Õ.>gºG½|z? c‡ö»¾5Ëök(qÞóž®ýr×óÝú°w½ì»É'Nñt¿ì)÷†È G9VÉjÁÕ ÉÉó„Áš¢žy o¦oS­€â.®ßÂ]šÏ!r  ÊóB`*ò#\CbHëÖn2Á%\nB"Bp'h'{Â\ ˆ1 x/¸=pÂj@"1r3S.áA)/…7\²JS)lð$h{`‚¡„W)ƒ (†ƒ2øPP€583n¡´o9£É%83eð¿ñÏ>;è_B „6ˆ‚E‚úT1nñ(…6C…-˜,x L{`\Ø’,‰’WƒR‰¥mõ8 æ"mur†#ÒVb ;|ˆmÅ€ˆ‡ÐSÎò(t¸j\!;ø0³‹¸j#a‡á²®2‰Œ¥‡xt‰­"‰ŒˆGvØ* 剙ÈT‰ò†mˆY @l‡x pÀGoRVÐ:#‡!a+qü³P€‹g@"¿'©±3b)_y10túS%«1ÊXSÐŒx£XÉøË8ÚøŒúC ‹q>ˆèa©1_V_àa N˜\¾Ó,_ %íøŽØ¡†U"öRõx#÷(Èõ<ûØÿHâ üÈI‰)2R2ˆ8‘ éö˜y3‚0ÁR—y.r‘ ™ò¡Xúx@F`2‡¨[d@oÁ!èãåA,9~& yRgB]ÒX CÍ2‘ºVG’ A[¤†Ay#O´kC´\G©†~H9_•S Pߦ$v´” S"7âøxˆw0’î(Ë¥ôxêÈŽg9hÕõVbk郱ŽSñD8:Y*ÃQ5é•ïÓÊX^ž5”•T”ò‘Aö%jyŽöø–d9‘ç‰YbÉÁˆ%Ðߎî#HU"ÈátÚ¡aõ´ €# 2W/8«Ùš2 ±™0P›®éD¹9¼)z‘›4œr‘›†Áš¯9¹)¼9@›>áÊ™23!›ÔÙš3›aà6ðœ¸)›ßY¾)›œQÃ)›8ðœÇ9·Éœîùgšµ˜¨ñS$SaB椡5¿ÂþÃ3‘aȡЙ›³3 –ñA`g®€& úí1i01` Ú'ס J¡s…¢*C¡cÁ©¢°9¯ñ–(Š›E  Â3#ê›E`¡ Ñj>#:œEà¡H¡3":ÇY&꣕1<º #:Z/BŠ¡0a¤4ÀœI ¤ *¢4I¥J-ê/£:›OP¥>J¸ù[J¤]š¦¾ùbʤi:œO€¦:qœOЦs:¡S$?â?:¥U §ZÌYwZ¤‘UЧ!©-Z‚Z°™š*¢5€›Z ¨e©å ©1PéY©yÚªí9ª‘:¡a'ÚªXjB¡žt†ê«Ñù!Qyð¨6Т¯A¾ ›JÅ*Ç6€› — c‘ªÒê›y0¾:œŒ¶O¾zœìd¬ GcpCÒŠ¥qP@¢ŒzÌÙ®ïJþf  qgP+ˆ;@¢¯üª~/ð¯/¥3ñJ°ó ›+3żS;óJ­i0¯¾ hó:œ¾±m°ë1¯Ç™öB:q1¡õr‚nq¥)»²øjG1À35¼ã˺1¨¡8tpªÈíA,‹-ê(VÑ'ó° M–¢%<‹›öŠ {lp‘<ë›S‹þ†µ3;œ[³û8<{œ Å2J;³3Qè§3‹¥6; ë‘Vª›Š‹Gv6K´wí*åʤw·-ZMwë°¸ê£9ž ʸ¾ «90œÁJ¹Ç9#c°¨w;¡ëV¹*ZÙ$ š³Úú¡~êÑYƒ!´7 n>Ñ¢+ê°Y£+ˆ£>›®Û®&´1§ë›hPŒaB¡ rºÃ™‹®ûS>qœ¨ê?>Ѷ˜W²§‹¥c€»7  1ÀœBy0¶ "º5Iñ¸ÜÛ¢u–ЧJ¾°‰À±¤›J¾¸É?‹Ë½¾™J¾Ã ì;¤–J¾ÇÉMª[¿3;“¿ä‹¥]Q IÂ[çšÌù±n²®¤ñR1êš-Ú@èëš°ùÌ¥ï{›3!“<½9Aàk®¹¼­‚J‚®yœíBŒ‰*š‹ Ì¡@ÂÁ<³œ3‡!ª³jõšÑ‰$&”ª¯Ù¢Lp&÷ Û9O@Ťóšu Ãv‘Âî1P 1+Vl¹V‘3"Îë¤3Qý;¥/P’k>¯‰¥u@«ñÙÆhz›ÑE¬¦ŠÇ”1z½J§.Ü¿4à›ñƒ¡3‡l¹z{¾€¼xÈOÊ7·9¡2U|›XªŠž¼Å’šÂE\þÚ32þÆÂ5p¸ð熓  :Yп¥:Tð.C˾©%¤SŸ:"šø©Sm@>x£šÂ¼!Äœ—¹E(äM º2!%’)˜o©'ù(`š¨™ŒÁ—áAîd£†ƒ¶Î÷Iš_ÎõT1™ÙÈ•QÙ’‚ÇœÌBdÎ4™Îîü<íŒ\£™ÆŒÌÊlD§QÏØ¨ùü[]ýÌ­ŸüY/îÁÐÖh—÷K:"-Abvé5lCãóÕ½ý!GGhI‰j5fa`vjˆ|PÎZþÑMÿÒ-®r”ÒáGn-[ÄrÖMæbæèÁZÐc>Ì1ÅøaÇh‚ÖQÄ.€˜aNÔ2°ç}îDN S#è7. ôw& Jf¹óHrD—“ç‘ndqTl–µ@´IÓ*¯¬2•áôg#èƒ_2P‹túåœ"Ñ´î]5]èØaATCY¾|>ëpAëR®sŽ `Õ ª#!;ê43(€³Ê-Àó8=Aë|aÎc­^6ÀÞí14'  (@y°ŽäªWÈa&4æ<·cf€4Jæ“3–Î’®éoÁé@Öu!qqE6Z9!§^ÍCË­®_zi²NëµÎ]·Á¹ŽG»^å>l4#Ñåþ|ýºŽGsàìоÒNíµsíý‘í·õæßþò¨‹‚änîõHïN÷.ÚFïjYé×qéL½s•ü¾IOêqoê>™êãËê’Áð°³ñ¶. ¸dßëì¿ì_ì oñ"OòfòR1íÕN*¯òÚîò¨ îà.ó(àÄnPŒ§Äîr°ŸdP¡tpóñžmó><=øò‘ïô>_EŸGõïq%œKoðMŸð«¾ð¯îðUñË7ñJRñËN"ÿë¨ûõSNjÆòÍn%òkßö,¿íróÿ"î3îãtšßáîƒó?/øB_ï>;øŽé¿¯øÎøGð €Ê‘ðN¯ðQùãõðöxÃù†nñ Ïõ¢¿ñÂný¸­<¨ï1fíiòÖÎnßòÜ.ûŸó´_îç¾.1ð€Ÿó¡dEöÞû‡Oü“nÓ¿7'Ñ ¤ùM>Uõ\]Û~™uI<¬Gñ´Þö3;]oô}¿Ò‡6Ž“ ˮ쩾³ÇúRžú{}pÏÛÅ=`G÷hžµr$ƒw´ àеûùÏÿí¿@Òÿ„ßÿ zpß À ¢[]XuEcà±.ɇê(_”z˜¯ú?ìçùÆôu/ØE9ð÷ñ¸ÙK}ÏŽž¿ÖwûÃÛk+0 Î>³SûÐ]iˆ§„’‡èw Ïëº%$Ô'òÅd‡nÁ­…:;‚çN”ñvqaZá! â–”¨à=èQ xR† ɲÎÏ•¯2¥› ´|°›P?«7PÔuW0z¿-È•‡UË ÊîaˆÀ0hþÜ€Ú3ØÎ ²¿Ø§Ã”è.{¡5@åÝï+|úñÉ¢g A€hÉ-ºˆpÂ%èüœ (œz£Pó]? Øù, ¯Ã€ÝO z¹V8"¼`ƒ«o â•§ aŸû›{ñæ ¦P }ÿs†îH††';rÀ uûp$ÂÛaÓIn¹Šp$0BPñ1˜$”$|ð:Ù¡ZË^„*Ž ÂÏ’A XˆŽÐ!ö¢X"Jœ ‘)¶DŽ¢PlˆD‘&ʼnˆ-b)ˆ,Ñ)Ä„ø¿âTŒ„Ãê»JØïÒ“$ÿ®àUÃOýBa¬‹€Sf¿Ï÷ ± ×Û€ÄÎô½sHþF`-¼…é/€3È UàwÀP ؼÝgøì ჋?pÎÅÅG“_\¹€°Ô1A„Ç 6ŒWÏvCTXU¡8ìx©MìDf×i!Ú³…èí•Áɸ ß! Œ6$jÈÐ¥$ê¡Î|/ê@e8ô`]ì^s;%˜öâÓ»†Q°úÅFq µ_m ‡¤/1vÀñ7òão„ŒÂQ2RFãÿ~¡ Œ0ïÍÀè=ct.ŽØ$>fxóBnñ‡Î;2=Oøûâk”‚ã1ëÑÆÐ—ÓcØSŒ»q¦CàHåcqì…ðð&Ç20˜#è;ï3?I( —¡uÜ$•«µP®¨—–žw„~®1<’ÂÍ'«àÖ‡1^ÈhÕB‹Ê`ŒíÑ7–ÀÈȉ£;‘ÇQDæ¨1¬Õæ@ (:¿ÎH­Ü$Øñ@Ê…î%ëX׬|RGjÃ!£2¢G!ù1×#µÜ—#[šL>É4[à¹{pp?ÎÁB©%ðS•‹rŽ$E?@¥\¸&-öÄYi)Û"¦¼•X“SjÍ£è*ÕeR›M±T–͘bÚ” F‹mvÍW9GÂ&OŒ›d³+šM[ù¦\Ü•4s“DL`â‚ʸerb2Hi1{&Æü™ÊÒMþHÃØ1ï%´,‡- 2xDÞX-Å ‡\‡ëïIžÌ(‰Gd Ð+rÀeÞA˜ 3⤋0†'9;!±¤œïò/úÌm4½!Ç\…ž³hÒI$‰4Õ!“LÚÒý9M7˜e D²SEΦÖBé•,T•yw.EYiç&ª¼•†SWºÈÄÉø>]_pMÁ’ÔIÎß¹3+§ð¼œÄ3sM8é,“gø­ ‘1O‘éE¶H7ß"D\›4)zÏ Z)gÍ”$‘‚žDê7)¥Ü4¡çó!¦Ð­Yˆ %¡/”ƒÆÐ JC¯¢¨Ä¡S‡žMjC{hR<‚4Bõg+Ób=•CT:ÖAsù%Û§¬Ûƒð3EÎÐ.ÁãÅÜ‘ùs^nÌzÙ?qãÿ4vVMp’Îæy:Ÿ' D Le.Ðó5Â¥Þ{ ¼¯ZM)Ê"mçúÄȯLêš™%?¹(Åž~‘ê O6©?'íœf´ †L%Y@•æ‡L —‘ÜÙ=ý¨÷ø £ÙQ¦O™é%y%ì^ºSýD#aÙEÓä]“TБÉ2Êu# •”’¶QúF·¥-wt´zÆÁx %­š´\2ÌÛI‰`«rÐ ˆ¬ÒBÚJyæý£ŒTŒ¾Éãyk)È<št—ZRÕGYç…šúñz†Rà×½ ø!®‰mê‘OßæßÔ ´òRΑ˜£Qôžº¥…’O—(D÷)Mì§>á$n¼xÚDÇfù„¡Qt=´‡ÌóFÀ÷º3$-EÑ¢@¬ÂKi¶aHåÓ€‚Ãh ¯0p…a-×^HÅ ¤a7ô†ß`RQjqàfn;t‡ï`OêfzhM¨ƒ€`90à€ˆ*=@ªJ•<êRÅ |à\ÁÀV5«bÕ °À=¨•„Õ0V32~À ÀƒµŠU ¸€€§*V €WÕ¯Ö¾ €Á`e«ðƒ ìRÍ €¦êÀ‘¬šU!k@œƒ >Á/¨À€³Ï:6À5 J`0ƒL 6ëc¬`ÜnàJÁ?øÞ µÞÖ`þêpe†u¸&@0Xdàç € €`±à X¬€È:xH¿€@@м€€€X­`à €ŠÀ6xÿ`ƒ-püˆv`üƒg0 y…ú ¨ƒK€4A)(OàøK J2P©@‚À>ȯç  {°²>xíàÀ z€/°~`×°]A!€îz°jhŠÕ °TáÁ"È~ tx ]³*“%± ìTÀ z0¨² ¾bÖv°ìÁÈXµ© €K€Rͪ<¸~@øçµÄR€ê*¶ªA8UŒƒp€ˆ@"ÀàƒEà °j …z ¬ƒ*@þ4Õ€ <×h§ÅŠ}~à8ƒ#Ð|ÁsůÀ¼Þ:.x³œÖ Ø€*Kžkt®õÈ2×Û:+ ò€×W ‚mgâ5àƒÀæc…¬`”U) œí±m³üƒ}`mQíd½ñ °ÖÃÊY“+8œÕ¸žÛº šjuå«è6«Â è- «Y•¿î~ `¾%«X  (2Âê«Üv ÁZªxVÀQͪ·”pq @ǽ¸äŠ\ƒrIîÈ­®× x\• r•ê?Æv(Õˆ@ÌŪ ¼s`m.²UX€ È@ÀW}.p«gÀ¾*Œ,·*—³B€ÁJ8+  ºœ VŸ Ô-×õºœlÝr;vë`mº!»Uí´k­]ª  Ûîz@¢ý€Ä:‹l!« À´ƒið ~+!ø\àÌzøîÛu ”B~@Epª@HU @ßµ7˜7ðš*x¯â¸‚{ >/dk–°Ú`m®-®[÷özÝ\K̭ȵȕêæÚå*| Â­í»Æ·ÊÆZ`ø.è®×íBßX[l‰e·»€øjy뫘¾µð€àæ>ÝUØ>0ì4p·±vàÉÛ>À{€Ã®% B,ü%¯x ˜?ð +¨±½Àø žmu…à€,Vìs}»`‚ ÀÁ›}»àœØÀT?ðsåø8Ö¥ÊdI,À" ÄâƒK8ÀÄE@\~-\_š;Gàk›ý@»€ ÐdÕ"¸é ò+&>ààøÞPÂLËî€g ø@/øù  4‚tð`À?à–àä+ÀÀðR…ïà܃|¬)øùàð8@c;À?x6àÄÆÙ9 w°ìͪ6ÉV ‚Áv+¸à¬rŸ+ÁØ^ƒ€t0`Ó>W6`Šq{UÅè`à¶ðÈxùÚ\@—@ížÛç: ­èþà$Ùêšk3 ÐÁG<×ß[b‰o'.±Á÷°{K¬¸º$÷ö‚ã¥úzÀá–/ÕðÞpÌ ¿$ü`‰ ÈÅÐv²î`аTSE˜·Ú½ ÀøË6¸D@‰Ë- öZÀdÐ+ æk`Œ~P‘Ïë†6€³~]죮w¯œx©Z]íª‚IîJF¶6ç`—œW3þ%Â8Àë]%ŒUÀpäÀ ca-Ì…×À2®ºy5”MÀ†Ý0–Ú@û\½j Ú@ Ä…ø/c™kñˆÄÒ˜ä[L¬rƒ- °Ö,‡bXnÀ[¾$7ÜW º¯}¾ávÔâÀ~ݯ»%yÙë€ýÛUü¬ +`Lrk4Þ´'·ä.ÕÈœr'³É½Ì–y©nÜÍ 6nÇ5¶8VÐ(U¬Š<€Ä+àärÀ ”ªg}½ jД@&xH`æBpbØýàPƒO0üÀ`J KÀXªàÀdÕpÐÁ/8Éà|í\]ÀH  ̃ð pA;8·9àøo°ŠÁo%Ï­ÖÀ <ÀЮܵĢbðŠƒÉ+°»@½ÖWrð^Ù+øþÔ×ñš_À' /V<Ÿ‚&P`ýÀí`´~‚Sðv'@0zÀ `‚J0ªÀ8ÖÔ%@ ª@‹XU ã=úÁ8ð ïƒ>À|t/Ú9ë`Î "@< ÄvƒéJb¡ôt¶`º €¥¥Kìt…ÒVºÄ‚0] —¾ÒQúTW…` B ¾niƒ€}#+&Áî¢éí˜p˜&±ñ8´i=í¥ ‚-ÙvéíŠ €Ȫ‹:‚pÉ4šN¬ Øà?]¨@ XÓöØMÓ‚°@µ¢Ž¬Ì ˜×9 ©#+40È"òv¬Â߀3ã9È8àÀ.’½¨cº[»Á«' ¾cm’õ¬¦ V+üê`=rËŒí u7@pôŸÍ<œZÎ hÃõ¸þÖæZÜ–k}®À×ìZܾëtMXo¼×âö Üëv­n+xö€ÇÂí꯶À&ع6<‚€ öpeÇ Ûa[ü"6ÂöÆ?ÀbWð4öÄÎÆÛ—Ø\»<à±ù ×Ú“ÍcýA®å,ôƒ\‹>ÀÉ–Ù$ö ÛröÎÆÑ>»emœhÙÐW«í£´s¶Ñ.¬Ð÷8í£Mgs-øô€i‡ã‹@Ö†ÚÃfm¤½µÀÊÛЗì}®ß,u=²‡€mãè7‹_·ñ1Ûø€nßÞ3€·õ¶7¾}ÛSìÀ=±@ÜnÛÃÕpn}·7a5·ñèkz¹í5忬–;^Öy­¹ý5çÆ×*]wnr½¯ÿ,é¦× ãzf–˺3³d~Ý”™±Væ•‹lÉ5áæºàvÛnÇ»u·Ax¾Û]n´+¼7R€pïq|¼µ.Mîºez?o±û¼Í-×=ñàLVâ}²÷dÅÀ†Û{ðýÄ7@|ÇZŠ­¾s­·Ú¬opÚ·7îÆáÕ÷_s‹E¶Ú>ú \sÖÿ}³÷A®µ1Û€—Ø•]À_vϵ8ÀfóXðÀ¸ÙúÀjŸƒ›Írí<8À/)ÖÁ 0q'X±AÈS|kYü»³¸:»©zq@k&^\ ;cŒÆÿAÜË•{q ²é8þþƹ×ãX {Ï1Ûõâ±v°ã7ÌwÛøWÇÓÙ Ìã,\b9dÎð—rè+'+5ÇhxŽ;d®ùñ¸hrƒ8°wãÓ7Ýràp0Ê£o€s+ØCÎuoÀ,OåáÜòç­ËQ¹IN´»Ï6`õçe›ƒ >ЀËþÝytðéšÐñgý7Û¡+òˆ^ek¸Þ¸ ôS]¨U8ÉíÒS:‰Ÿi/¥Kì–æÔLGé1]¦G:‰ÕÓxš£ÇãP ú´KïÔƒzQciD-Ó•ì.pÔ­ºPG@©ƒz<Ž:@SßôxÌ–õ±NÖÅú©CDyLP-1.6.0/DyLP/doc/Figures/epsupatch.sed0000644000076700007670000000260711171477034014750 0ustar # Patch file for .eps files produced by IslandDraw 2.3 for SunOS, running on # Solaris in compatibility mode. We get garbage at the beginning and at the # end, which has to be stripped. Note that this file must be run with the # -n flag for sed --- it works by not printing the junk lines. # -- lh, 97.3.2 -- # Conveniently enough, this same set of actions does a great job of deleting # the binary header and preview image of an EPSF file with TIFF preview. # -- lh, 98.12.10 -- # For IslandDraw 2.3, the first line(s) are # "<>%!PS-Adobe-2.0 EPSF-2.0" # We want to strip the binary junk, leaving the proper first line. For # IslandDraw 4.10, there won't be any binary junk, but that's ok. 1,/%!PS-Adobe/s/^[^%]*%!PS-Adobe/%!PS-Adobe/p # God only knows what this line is doing in the file, but it's not needed. /userdict \/#copies [0-9][0-9]* put/d # Except for the previous line, we want lines 2 through the final restore. # After the final line ("restore"), there's yet more binary junk. It might be # safe to search for "restore" on a line by itself, but it strikes me as more # robust to look for "%%Trailer" and then print the rest of the lines down # to the final restore. >> Order is important here! << The trick is to use # %%Trailer twice, deleting one of them. You can't delete the line before # printing it, eh? /%%Trailer/,/restore$/p 2,/%%Trailer/{ /%%Trailer/d p } DyLP-1.6.0/DyLP/doc/solutions.tex0000644000076700007670000003504011266200761013425 0ustar \section{Generating Solutions, Rays, and Tableau Vectors} \label{sec:Solutions} The dynamic simplex algorithm implemented by \dylp introduces some unique challenges when generating solution values, rays, and tableau vectors. The client expects an answer that corresponds to the full, unscaled constraint system. In addition to the standard calculations associated with unscaling, \dylp must often synthesize portions of the answer corresponding to inactive constraints or variables, and position the components of the answer to match the original constraint system. This becomes even more interesting when the client is asking for answers in the context of the dual problem. \subsection{Solution Vectors} \label{sec:SolutionVectors} Calculating the values of the unscaled primal variables is the simplest request. We have $\breve{x}^B = \inv{\breve{B}}\breve{b}$. Then $\breve{x}^B = \inv[0]{(S^B)}\inv{B}\inv{R} R b = \inv[0]{(S^B)}\inv{B}b$ and $x^B = S^B \breve{x}^B$. Recall that the column scaling factor for a logical variable will be the inverse of the row scaling factor, as explained in \secref{sec:Scaling}. The unscaled values of the nonbasic primal variables (architectural or logical) can be read directly from the original unscaled $l$ and $u$ vectors. There is one subtle point about the column scaling factor for logicals which is not immediately apparent from the simplified presentation in the previous paragraphs. Logical variables can be basic for the row occupied by their associated constraint~---~the `natural' position. They can also be basic for some other row~---~an `unnatural' position; this is achieved by a column permutation in the basis. The correct column scaling factor, when required, is the one associated with the natural row. This is more apparent when the column permutation matrix $P$ is made explicit: \begin{align*} \breve{B} & = (R B S^B) P \\ \inv{\breve{B}} & = \inv{P}\inv[0]{(S^B)}\inv{B}\inv{R} \end{align*} By definition, inactive architectural variables are nonbasic, so their value is also easily read from the original unscaled $l$ and $u$ vectors. By definition, inactive constraints are loose and the corresponding logical would be basic. Rather than expand the basis inverse, the value of the logical for an inactive constraint $i$ is calculated directly as $a_i x$. Turning to the dual variables, recall first the observation from \secref{sec:Notation} that the dual variables $y = c^B \inv{B}$ calculated by \dylp during primal and dual simplex are in fact the negative of the correct dual variables, a consequence of implementing the relationship \begin{align*} \min cx & & \max \; (-c)x & & \min yb & \\ Ax & \leq b & Ax & \leq b & yA & \geq (-c) \end{align*} by algorithmic design rather than actually negating $c$. When generating dual variable values to return to the client, there is a choice: should the dual variables be returned with a sign convention appropriate for \dylp's $\min cx$ problem, or should they be returned with a sign convention appropriate for the true dual problem? For all routines returning values associated with the dual problem, \dylp allows the client to choose the sign convention. There are two further details to consider: The canonical relationship assumes all constraints are `$\leq$' constraints and all primal constraints are explicit. In reality, the primal problem presented to \dylp typically contains `$\geq$' constraints, and bounds on variables are usually handled by the algorithm rather than stated as explicit constraints. There are a number of possible implementation choices; \dylp chooses the following: \begin{itemize} \item For the duals associated with `$\geq$' constraints, the sign of the dual value returned is always negated to match the `$\geq$' that's actually present in the constraint matrix. This choice is intended to make it easy for the client to use the dual variable values with the coefficient matrix as written. \item For the duals associated with variables that are nonbasic at their upper bound (hence negative in \dylp's $\min$ primal convention), the value is negated if the user chooses the true dual sign convention. This matches the conversion of the implicit upper bound to an explicit `$\leq$' constraint in the dual problem. To extend this point to upper and lower bounds, when the client requests dual variables using the true dual sign convention, \dylp assumes that implicit upper bounds are made explicit as $x_j \leq u_j$ and implicit lower bounds are made explicit as $-x_j \leq -l_j$. \end{itemize} To calculate the values of the unscaled row dual variables $y$, start with $\breve{y} = \breve{c}^B \inv{\breve{B}}$. Then $\breve{y} = c^B S^B \inv[0]{(S^B)} \inv{B} \inv{R} = c^B \inv{B} \inv{R} = y \inv{R}$ and $y = \breve{y} R$. These values must be negated to be correct for the dual problem. By definition, inactive constraints are not tight, hence the value of the associated dual variable is zero. The values of the column dual variables are the primal reduced costs $\overline{c}_j$. Starting from $\breve{\overline{c}}_j$, we have \begin{align*} \breve{\overline{c}}_j & = \breve{c}_j - \breve{c}^B \inv{\breve{B}}\breve{a}_j \\ & = c_j S_j - c^B S^B \inv[0]{(S^B)}\inv{B}\inv{R} R a_j S_j \\ & = (c_j - c^B \inv{B} a_j) S_j \\ & = \overline{c}_j S_j \end{align*} hence $c_j = \breve{\overline{c}}_j\inv{(S_j)}$. For active variables, the value of $\breve{\overline{c}}_j$ is immediately available. For inactive variables, \dylp first calculates $\breve{\overline{c}}_j = \breve{y}\breve{a}_j$. \subsection{Tableau Vectors} \label{sec:TableauVectors} \Dylp implements routines to return four tableau vectors: rows $\beta_i$ and columns $\beta_j$ of the basis inverse \inv{B}, and rows $\overline{a}_i$ and columns $\overline{a}_j$ of the transformed constraint matrix $\inv{B}A$. Given the scaled basis inverse $\inv{\breve{B}} = \inv[0]{(S^B)}\inv{B}\inv{R}$, the unscaled column of the basis inverse corresponding to basic variable $x_j$, basic for row $k$, will be \begin{equation} \label{eqn:unscaledBetaj} \beta_j = S^B \inv{\breve{B}} R e_k = S^B \breve{\beta}_j r_{kk} \end{equation} Because \dylp periodically deactivates loose constraints, it is in general necessary to synthesize the rows of the basis inverse for these inactive constraints. The necessary algebra is shown in \eqnref{Eqn:PrimalBasisInverse} and repeated here for convenience: \begin{equation} \tag{\ref{Eqn:PrimalBasisInverse}} \inv{B} = \begin{bmatrix} \inv[0]{(B^t)} & 0 \\ -B^l\inv[0]{(B^t)} & I^l \end{bmatrix} \end{equation} Let the partition $B^t$ correspond to $B$ in \eqnref{eqn:unscaledBetaj}, $\beta_j$ to a column of $\inv[0]{(B^t)}$, and let the partition $B^l$ be the coefficients of basic variables in the inactive constraints. By definition, the basic variable for an inactive constraint is the logical associated with the constraint. Given the unscaled column $\beta_j$ for the active system from \eqnref{eqn:unscaledBetaj}, \dylp generates the necessary coefficients from $-B^l\inv[0]{(B^t)}$ by calculating $-B^l\beta_j$. For all inactive logical variables (\ie, logical variables for inactive constraints), and active logical variables basic in the natural position, $\beta_j = e_j$; this is detected as a special case. Generating the transformed column $\overline{a}_j = \inv{B}a_j$ follows a similar pattern, with the added complication that the requested column may not be active. Given the scaled transformed column \begin{equation*} \breve{\overline{a}}_j = \inv{\breve{B}}\breve{N}e_j = \inv[0]{(S^B)}\inv{B}\inv{R} R a_j s_{jj} = \inv[0]{(S^B)}\inv{B} a_j s_{jj} \end{equation*} the unscaled column $\overline{a}_j$ will be \begin{equation} \label{eqn:unscaledAbarj} S^B \; \breve{\overline{a}}_j (1/s_{jj}) \end{equation} If there are inactive constraints, the remaining coefficients in the column must be synthesized. Using the same notation as above for basis inverse columns, we have \begin{equation*} \inv{B} a_j = \begin{bmatrix} \inv[0]{(B^t)} & 0 \\[.4ex] -B^l\inv[0]{(B^t)} & I^l \end{bmatrix} \begin{bmatrix} a^t_j \\[.4ex] a^l_j \end{bmatrix} = \begin{bmatrix} \inv[0]{(B^t)} a^t_j \\[.4ex] a^l_j - B^l\inv[0]{(B^t)} a^t_j \end{bmatrix} \end{equation*} Given the unscaled column $\overline{a}_j$ for the active system from \eqnref{eqn:unscaledAbarj}, \dylp generates the necessary coefficients from $a^l_j - B^l\inv[0]{(B^t)} a^t_j$ by calculating $a^l_j - B^l\overline{a}_j$. If the requested column is not active, \dylp first generates the portion of the column $R a_j$ that matches the active constraints, and then proceeds as described in the previous paragraphs. Inactive logical variables will be basic in natural position, hence $\overline{a}_j = e_j$; this is detected as a special case. The user is cautioned that active basic variables are \textit{not} handled as a special case. The work required to generate a row $\beta_i$ of the basis inverse is similar to that required for a column $\beta_j$. Given the scaled basis inverse $\inv{\breve{B}} = \inv[0]{(S^B)}\inv{B}\inv{R}$, the unscaled row of the basis inverse corresponding to basic variable $x_j$, basic for row $i$, will be \begin{equation*} \beta_i = e_i S^B \inv{\breve{B}} R = s_{jj} \breve{\beta}_i R \end{equation*} If the requested row is not active, the basis must be extended as outlined in previous paragraphs. \Dylp creates the partially scaled row vector $e_i B^l S^B$, calculates an intermediate vector $e_i B^l S^B \inv[0]{(\breve{B}^t)}$ and then completes the calculation by postmultiplying by $R$ to remove the row scaling still present in \inv[0]{(\breve{B}^t)}. Regrettably, there's no easy way to calculate $\overline{a}_i$, a row of the transformed matrix $\inv{B}A$. \Dylp implements this operation as $\overline{a}_i = \beta_i A$. The calculation is performed entirely in the original unscaled system. \subsection{Rays} \label{sec:Rays} In several aspects, rays prove to be the most challenging of the three solution components. Careful attention to sign reversals is required for both primal and dual rays, and the virtual nature of the dual problem adds yet another layer to the challenge of generating coefficients for inactive portions of the constraint system. The routines implemented in \dylp will return all rays emanating from the current extreme point up to a limit specified by the client. For a primal ray $r$, it must be the case that $c r < 0$, and $a_i r \leq 0$ for a `$\leq$' constraint, $a_i r \geq 0$ for a `$\geq$' constraint, and $a_i r = 0$ for range constraints and equalities. The task of identifying a ray is easy; indeed, it's a simplified version of the algorithm used to select the leaving variable in a primal pivot, where the only concern is that no basic variable is driven to bound. Getting the sign right requires a bit of thought, however. The relevant mathematics is shown in equations \eqnref{eqn:allPrimalDirs} and \eqnref{eqn:onePrimalDir}; \eqnref{eqn:onePrimalDir} is repeated here for convenience: \begin{equation} \tag{\ref{eqn:onePrimalDir}} -\begin{bmatrix} B^{\,-1}a_j \\ -e_j \end{bmatrix} \Delta_j = -\begin{bmatrix} \overline{a}_j \\ -e_j \end{bmatrix} \Delta_j = \eta_j\Delta_j \end{equation} As can be immediately seen, $r$ is precisely $\eta_j = -\trans{\begin{bmatrix} \overline{a}_j & -e_j \end{bmatrix}}$; the operations required for unscaling have been discussed in \secref{sec:TableauVectors}. In addition to the obvious negation required to produce $\eta_j$, there are two other possible negations to consider. \begin{itemize} \item If the nonbasic variable $x_j$ is actually decreasing from its upper bound $u_j$, the ray must be negated to compensate. \item If the nonbasic variable is a logical $s_i$ associated with a `$\geq$' constraint in the original system, \dylp's input transformations have converted $a_i x \geq b_i \Rightarrow (-a_i)x \leq (-b_i) \Rightarrow (-a_i)x + s_i = (-b_i)$ for $0 \leq s_i \leq \infty$. The inverse converts $(-a_i)x + s_i = (-b_i) \Rightarrow a_i x + s'_i = b_i \Rightarrow a_i x \geq b_i$ for $-\infty \leq s_i' \leq 0$. What appears to be a slack variable increasing from its lower bound is actually a surplus variable decreasing from its upper bound; accordingly, the ray must be negated. \end{itemize} There's no need to synthesize the components of $\eta_j$ that would be associated with inactive constraints. By definition, the basic variable for an inactive constraint is the associated logical. The ray $r$ contains only the components associated with architectural variables. For a dual ray $r$, it must be the case that $rb < 0$ and $rA \geq 0$ for the true dual problem. Unfortunately, as outlined in \secref{sec:SolutionVectors}, the primal~--~dual transform implemented in \dylp does not match the ideal, and this introduces complications. Neither mathematical test is guaranteed to work unless the dual variables associated with tight implicit bound constraints (\ie, nonbasic primal variables) are handled explicitly. As with primal rays, the task of identifying a dual ray is easy, a simplified version of the algorithm used to select the leaving dual variable in a dual pivot. The only concern is that no dual basic variable be driven to bound. Again, it's getting the sign right that requires some thought. As discussed in \secref{sec:Notation}, the vector $\overline{a}_k$ is the proper starting point; the initial negation which would normally be required is built in by $\mathcal{N}\inv[-2]{\mathcal{B}} = -\inv{B}N$. The operations required for unscaling have been discussed in \secref{sec:TableauVectors}. It's necessary to add a coefficient of 1.0 for the nonbasic dual that's driving the ray. There are three other sources of negation to consider: \begin{itemize} \item If the entering dual is apparently decreasing because it's associated with a leaving primal variable that's decreasing to its upper bound (and hence must have a negative reduced cost when it becomes nonbasic), the ray must be negated to compensate. \item If the ray is derived from a `$\geq$' constraint in the original system, the coefficients of the constraint have been negated; this is encoded in the row scaling. However, as noted for primal rays, the logical must really be interpreted as a surplus variable with an upper bound of zero, and if it's basic for this row we have the case described in the previous item. The ray must be negated. \item As explained in \secref{sec:SolutionVectors}, if an individual ray coefficient corresponds to a variable that is nonbasic at its upper bound, the ray coefficient must be negated if the client has requested the true dual sign convention. \end{itemize} DyLP-1.6.0/DyLP/doc/Makefile.am0000644000076700007670000000207211263240452012675 0ustar # Copyright (C) 2009 Lou Hafer # All Rights Reserved. # This file is distributed under the Common Public License. ## $Id$ # Author: Lou Hafer SFU 2009.04.15 AUTOMAKE_OPTIONS = foreign # See the comment for distclean-local in ../Makefile.am CONFIG_CLEAN_FILES = DyLPDocInstalldir = @DYLPDOCDIR@ DyLPDocInstall_DATA = dylp.pdf dylp.ps # Make sure the source files are distributed. BUT NOTE that Coin doesn't handle # distributions this way and it's highly unlikely this will work as you'd # like. EXTRA_DIST = $(dylpdoc_SOURCES) # The TeX source files for the dylp documentation. dylpfigs.tex is actually a # shell to build just the figures. Handy for presentations. dylpdoc_SOURCES = accuracy.tex \ antidegenlite.tex \ conmgmt.tex \ debug.tex \ dual.tex \ dylp.tex \ dylpfigs.tex \ dynamic.tex \ interface.tex \ intro.tex \ lpbasis.tex \ notation.tex \ perturbed.tex \ pricing.tex \ primal.tex \ scaling.tex \ solutions.tex \ startup.tex \ statistics.tex \ updateformulae.tex \ varmgmt.tex DyLP-1.6.0/DyLP/doc/conmgmt.tex0000644000076700007670000001567711171477034013054 0ustar \section{Constraint Management} \label{sec:ConstraintManagement} Constraint management activities can be separated into selection of the initial constraint set, activation of violated or bounding constraints, and deactivation of loose constraints. In general, the goal is to maintain an active constraint system which is a subset of the original constraint system, consisting only of equalities and those inequalities necessary to define an optimal extreme point. \dylp expects that all constraints will be equalities or $\leq$ inequalities. Figure \ref{fig:ConmgmtCalls} shows the call structure for the constraint activation and deactivation routines. \begin{figure}[htbp] \centering \includegraphics{\figures/conmgmtcalls} \caption{Call Graph for Constraint Management Routines}\label{fig:ConmgmtCalls} \end{figure} During construction of the initial constraint system, any variables referenced in a constraint are activated along with the constraint. During subsequent constraint activation phases, variable activation is more selective. The logical variable for the constraint is created and used as the new basic variable. If the next simplex will be primal simplex, activation is restricted to the subset of referenced variables with dual infeasible (favourable) reduced cost. If the next simplex will be dual simplex, activation is restricted to the subset of referenced variables that are dual feasible. When a constraint is deactivated, only the slack variable for the constraint is deactivated. This minimises the work that must be performed to repair the basis. \subsection{Initial Constraint Selection} \label{InitialConSelect} For a warm or hot start, the initial active constraint system is completely determined from the basis supplied by the client. As noted in \secref{sec:Startup}, the client can set parameters which will cause constraint activation to be executed prior to starting simplex iterations. In this specific case, variable activation is not automatic and must be requested independently if desired. For a cold start, where no initial basis is supplied, the initial active constraint system will include all equalities and a client-specified selection of inequalities. See \secref{sec:ColdStart} for a more detailed description. \subsection{Activation of Constraints} \label{ConstraintActivation} \dylp enters the constraint activation phase whenever the system is found to be primal unbounded or optimal for the set of active constraints and all variables (active and inactive). When the system is found to be optimal, \dylp calls \pgmid{dy_activateCons} to search the inactive constraints for violated constraints. When the system is found to be unbounded, \dylp first calls \pgmid{dy_activateBndCons} to search the inactive constraints for feasible constraints which block the direction of recession. If such bounding constraints exist, they are activated and primal phase~II simplex is resumed. Otherwise, \pgmid{dy_activateCons} is called to add any violated constraints and execution will go to primal phase~I or dual simplex as appropriate. Violated constraints are identified using a straightforward scan of the inactive constraints. The routine \pgmid{scanPrimConStdAct} evaluates each constraint at the current value of $x$ and returns a list of violated constraints. The routines \pgmid{dy_activateBLogPrimConList} and \pgmid{dy_activateBLogPrimCon} perform the activations. Following activations, the logical variables for the new constraints are made basic, the basis is refactored, and a new basic solution is calculated. If the call to \pgmid{dy_activateCons} requested activation of referenced variables, \pgmid{dy_activateBLogPrimConList} will collect a set of variable indices for activation. After the basis has been refactored, the set is passed to \pgmid{dy_activateVars} for activation. If dual simplex will be the next simplex executed, only dual-feasible variables are activated. In \dylp, unboundedness is detected by the primal simplex implementation; dual simplex is not called until primal simplex has found an initial optimal solution. When unboundedness is discovered, \dylp calls \pgmid{dy_activateBndCons} to search for bounding constraints which are feasible at the current basic solution. A constraint will block motion in the direction $\eta_j$ if $a_i \cdot \eta_j > 0$ for $x_j$ increasing, or $a_i \cdot \eta_j < 0$ for $x_j$ decreasing. This scan is performed by \pgmid{scanPrimConBndAct}. Once the list of constraints is returned, constraint activation and basis repair proceed as in the case of violated constraints, but referenced variables are not activated. When a constraint is activated, the set of basic variables is augmented with the slack variable for the constraint. Because the slack is basic, the value of the associated dual is zero. The basis will change, but the values of other active primal variables will remain the same. Since the new slack variables are not part of the PSE reference frame, the projected column norms associated with PSE pricing are unchanged. Because the objective coefficients associated with the slack variables are 0, the values of the preexisting dual variables and the reduced costs remain unchanged. \subsection{Deactivation of Constraints} Constraint deactivation is handled by \pgmid{dy_deactivateCons}. \dylp implements three options for constraint deactivation, `normal', `aggressive', and `fanatical'. When normal constraint deactivation is specified, \dylp will only deactivate inequalities which are strictly loose. Eligible inequalities are identified by scanning the basis for slack variables which are strictly within bounds. When aggressive constraint deactivation is specified, \dylp will also deactivate tight inequalities whose associated dual variable is zero. When fanatical constraint deactivation is specified, \dylp will deactivate any constraint (equality or inequality) whose associated dual is zero. The set of constraints to be deactivated is identified by the routine \pgmid{scanPrimConStdDeact}. Once a set of constraints has been identified for deactivation, the routines \pgmid{deactBLogPrimConList} and \pgmid{dy_deactBLogPrimCon} are called to perform the deactivations. The corresponding constraint is deactivated and removed from the active constraint system along with its associated logical variable. The basis is patched, if necessary, by moving the variable which is basic in the position of the deactivated constraint to the basis position which was occupied by the constraint's associated logical. As with activation of constraints, deactivation of constraints changes the basis and \dylp will refactor and recalculate the primal and dual variables. The dual variables do not change, nor do the reduced costs of the remaining variables, since the cost coefficient of a logical variable is zero. In general, the PSE column norms will be changed because the deleted logical variables may be part of the reference frame. \dylp opts to reset the reference frame to deal with this, rather than updating or recalculating the column norms. DyLP-1.6.0/DyLP/doc/TexMF/0000755000076700007670000000000011416017274011627 5ustar DyLP-1.6.0/DyLP/doc/TexMF/README0000644000076700007670000000257111267165330012515 0ustar This TexMF directory tree contains various original and customised files used in the course of building dylp's documentation. Here's what you'll find: * Under bibtex, the bibliography file dylp.bib, and a slightly tweaked version of the plain bibliography style in louplain.bst. * Under fonts, a bevy of .tfm and .vf files. As mentioned in the top-level README, I'm not a fan of Computer Modern and have gone to a fair bit of trouble to avoid using it. For text, this is relatively straightforward. For math, it takes real work. The .tfm and .vf files in this directory are all used in some way to avoid Computer Modern and make the result look decent in Bookman (with a selection of glyphs from other fonts thrown in on the math side). The .tfm files are used while LaTeX is typesetting. The .vf files are used by dvips (and xdvi, if memory serves) to find the underlying glyph shapes. To regenerate these files (and the .fd files in the tex subtree) you should be comfortable with font manipulation and virtual font generation using fontinst. Email me (lou@cs.sfu.ca) and I'll forward the necessary sources and makefiles. * Under tex, there are a number of style files that I use and yet more font files --- .fd files that specify how LaTeX font directives should map to the underlying fonts. Lou Hafer, 091019 DyLP-1.6.0/DyLP/doc/TexMF/Makefile.in0000644000076700007670000003201211267165330013673 0ustar # Makefile.in generated by automake 1.9.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2009 Lou Hafer # All Rights Reserved. # This file is distributed under the Common Public License. # Author: Lou Hafer SFU 2009.04.15 srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = doc/TexMF DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ac_c_add_to_includes.m4 \ $(top_srcdir)/m4/ac_c_get_sunpro_libs.m4 \ $(top_srcdir)/m4/ac_dylp_equiv_for_cpp_bool.m4 \ $(top_srcdir)/m4/ac_dylp_find_fp_funcs.m4 \ $(top_srcdir)/m4/ac_dylp_fix_cppflags.m4 \ $(top_srcdir)/m4/ac_dylp_options.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/inc/config_dylp.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADDLIBS = @ADDLIBS@ ADD_CFLAGS = @ADD_CFLAGS@ ADD_CXXFLAGS = @ADD_CXXFLAGS@ ALWAYS_FALSE_FALSE = @ALWAYS_FALSE_FALSE@ ALWAYS_FALSE_TRUE = @ALWAYS_FALSE_TRUE@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AUX_DIR = @AUX_DIR@ AWK = @AWK@ BUILDTOOLSDIR = @BUILDTOOLSDIR@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CDEFS = @CDEFS@ CFLAGS = @CFLAGS@ COINUTILSDOCDIR = @COINUTILSDOCDIR@ COINUTILSOBJDIR = @COINUTILSOBJDIR@ COINUTILSSRCDIR = @COINUTILSSRCDIR@ COIN_HAS_COINUTILS_FALSE = @COIN_HAS_COINUTILS_FALSE@ COIN_HAS_COINUTILS_TRUE = @COIN_HAS_COINUTILS_TRUE@ COIN_HAS_DYLP_FALSE = @COIN_HAS_DYLP_FALSE@ COIN_HAS_DYLP_TRUE = @COIN_HAS_DYLP_TRUE@ COIN_HAS_OSI_FALSE = @COIN_HAS_OSI_FALSE@ COIN_HAS_OSI_TRUE = @COIN_HAS_OSI_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEFS = @CXXDEFS@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DBG_CFLAGS = @DBG_CFLAGS@ DBG_CXXFLAGS = @DBG_CXXFLAGS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DYLPDOCDIR = @DYLPDOCDIR@ DYLPOBJDIR = @DYLPOBJDIR@ DYLPSRCDIR = @DYLPSRCDIR@ DYLP_ERRMSGDIR = @DYLP_ERRMSGDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FADDLIBS = @FADDLIBS@ FFLAGS = @FFLAGS@ HAVE_EXTERNALS_FALSE = @HAVE_EXTERNALS_FALSE@ HAVE_EXTERNALS_TRUE = @HAVE_EXTERNALS_TRUE@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBEXT = @LIBEXT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLM4 = @LIBTOOLM4@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_LDFLAGS = @LT_LDFLAGS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ MPICC = @MPICC@ MPICXX = @MPICXX@ OBJEXT = @OBJEXT@ OPT_CFLAGS = @OPT_CFLAGS@ OPT_CXXFLAGS = @OPT_CXXFLAGS@ OSIDOCDIR = @OSIDOCDIR@ OSIOBJDIR = @OSIOBJDIR@ OSISRCDIR = @OSISRCDIR@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ RPATH_FLAGS = @RPATH_FLAGS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ VPATH_DISTCLEANFILES = @VPATH_DISTCLEANFILES@ abs_bin_dir = @abs_bin_dir@ abs_include_dir = @abs_include_dir@ abs_lib_dir = @abs_lib_dir@ abs_source_dir = @abs_source_dir@ ac_c_preproc_warn_flag = @ac_c_preproc_warn_flag@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ ac_cxx_preproc_warn_flag = @ac_cxx_preproc_warn_flag@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ have_autoconf = @have_autoconf@ have_automake = @have_automake@ have_svn = @have_svn@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sol_cc_compiler = @sol_cc_compiler@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ AUTOMAKE_OPTIONS = foreign # Make sure all the supporting TeX files get distributed. The only thing in # this subtree that's directly part of the dylp documenation is dylp.bib. All # the rest is supporting definition files for formats and fonts. This won't # change, so there's no sense in putting Makefile.am's in the subdirectories. EXTRA_DIST = $(dylpdoc_BIBTEX) $(dylpdoc_LATEXDEFS) \ $(dylpdoc_FONTTFM) $(dylpdoc_FONTVF) dylpdoc_BIBTEX = bibtex/bst/louplain.bst \ bibtex/bib/dylp.bib dylpdoc_LATEXDEFS = tex/latex/loubookman.sty \ tex/latex/loustandard.sty \ tex/latex/loumath.sty \ tex/latex/codedocn.sty \ tex/latex/psnfss/t1pbk.fd \ tex/latex/psnfss/ot1pbk.fd \ tex/latex/psnfss/omlpbk.fd \ tex/latex/psnfss/omspbk.fd \ tex/latex/psnfss/omxpbk.fd \ tex/latex/psnfss/upbk.fd \ tex/latex/psnfss/t1pag.fd \ tex/latex/psnfss/ot1pag.fd \ tex/latex/psnfss/upag.fd \ tex/latex/psnfss/upsy.fd # You might think these are in your local TeX distribution, but they're either # tweaked or completely custom. dylpdoc_FONTTFM = fonts/tfm/omselabo.tfm \ fonts/tfm/omselabo8t.tfm \ fonts/tfm/omselabu.tfm \ fonts/tfm/omselabu8t.tfm \ fonts/tfm/omselao.tfm \ fonts/tfm/omselao8t.tfm \ fonts/tfm/omselau.tfm \ fonts/tfm/omselau8t.tfm \ fonts/tfm/pbkd7t.tfm \ fonts/tfm/pbkd7y.tfm \ fonts/tfm/pbkd8t.tfm \ fonts/tfm/pbkdi7m.tfm \ fonts/tfm/pbkdi7t.tfm \ fonts/tfm/pbkdi7y.tfm \ fonts/tfm/pbkdi8t.tfm \ fonts/tfm/pbkdo8t.tfm \ fonts/tfm/pbkdu8r.tfm \ fonts/tfm/pbkdu8t.tfm \ fonts/tfm/pbkl7t.tfm \ fonts/tfm/pbkl7v.tfm \ fonts/tfm/pbkl7y.tfm \ fonts/tfm/pbkl8t.tfm \ fonts/tfm/pbkli7m.tfm \ fonts/tfm/pbkli7t.tfm \ fonts/tfm/pbkli7y.tfm \ fonts/tfm/pbkli8t.tfm \ fonts/tfm/pbklo8t.tfm \ fonts/tfm/pbklu8r.tfm \ fonts/tfm/pbklu8t.tfm \ fonts/tfm/psyro.tfm # Virtual font definitions. These are the core of replacing the Computer Modern # fonts with something that looks better --- Bookman is more to my taste. dylpdoc_FONTVF = fonts/vf/pbkd7t.vf \ fonts/vf/pbkd7y.vf \ fonts/vf/pbkd8t.vf \ fonts/vf/pbkdi7m.vf \ fonts/vf/pbkdi7t.vf \ fonts/vf/pbkdi7y.vf \ fonts/vf/pbkdi8t.vf \ fonts/vf/pbkdo8t.vf \ fonts/vf/pbkdu8t.vf \ fonts/vf/pbkl7t.vf \ fonts/vf/pbkl7v.vf \ fonts/vf/pbkl7y.vf \ fonts/vf/pbkl8t.vf \ fonts/vf/pbkli7m.vf \ fonts/vf/pbkli7t.vf \ fonts/vf/pbkli7y.vf \ fonts/vf/pbkli8t.vf \ fonts/vf/pbklo8t.vf \ fonts/vf/pbklu8t.vf all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/TexMF/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign doc/TexMF/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) $(mkdir_p) $(distdir)/bibtex/bib $(distdir)/bibtex/bst $(distdir)/fonts/tfm $(distdir)/fonts/vf $(distdir)/tex/latex $(distdir)/tex/latex/psnfss @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-libtool dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-exec install-exec-am \ install-info install-info-am install-man install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: DyLP-1.6.0/DyLP/doc/TexMF/Makefile.am0000644000076700007670000000527611267165330013676 0ustar # Copyright (C) 2009 Lou Hafer # All Rights Reserved. # This file is distributed under the Common Public License. ## $Id$ # Author: Lou Hafer SFU 2009.04.15 AUTOMAKE_OPTIONS = foreign # Make sure all the supporting TeX files get distributed. The only thing in # this subtree that's directly part of the dylp documenation is dylp.bib. All # the rest is supporting definition files for formats and fonts. This won't # change, so there's no sense in putting Makefile.am's in the subdirectories. EXTRA_DIST = $(dylpdoc_BIBTEX) $(dylpdoc_LATEXDEFS) \ $(dylpdoc_FONTTFM) $(dylpdoc_FONTVF) dylpdoc_BIBTEX = bibtex/bst/louplain.bst \ bibtex/bib/dylp.bib dylpdoc_LATEXDEFS = tex/latex/loubookman.sty \ tex/latex/loustandard.sty \ tex/latex/loumath.sty \ tex/latex/codedocn.sty \ tex/latex/psnfss/t1pbk.fd \ tex/latex/psnfss/ot1pbk.fd \ tex/latex/psnfss/omlpbk.fd \ tex/latex/psnfss/omspbk.fd \ tex/latex/psnfss/omxpbk.fd \ tex/latex/psnfss/upbk.fd \ tex/latex/psnfss/t1pag.fd \ tex/latex/psnfss/ot1pag.fd \ tex/latex/psnfss/upag.fd \ tex/latex/psnfss/upsy.fd # You might think these are in your local TeX distribution, but they're either # tweaked or completely custom. dylpdoc_FONTTFM = fonts/tfm/omselabo.tfm \ fonts/tfm/omselabo8t.tfm \ fonts/tfm/omselabu.tfm \ fonts/tfm/omselabu8t.tfm \ fonts/tfm/omselao.tfm \ fonts/tfm/omselao8t.tfm \ fonts/tfm/omselau.tfm \ fonts/tfm/omselau8t.tfm \ fonts/tfm/pbkd7t.tfm \ fonts/tfm/pbkd7y.tfm \ fonts/tfm/pbkd8t.tfm \ fonts/tfm/pbkdi7m.tfm \ fonts/tfm/pbkdi7t.tfm \ fonts/tfm/pbkdi7y.tfm \ fonts/tfm/pbkdi8t.tfm \ fonts/tfm/pbkdo8t.tfm \ fonts/tfm/pbkdu8r.tfm \ fonts/tfm/pbkdu8t.tfm \ fonts/tfm/pbkl7t.tfm \ fonts/tfm/pbkl7v.tfm \ fonts/tfm/pbkl7y.tfm \ fonts/tfm/pbkl8t.tfm \ fonts/tfm/pbkli7m.tfm \ fonts/tfm/pbkli7t.tfm \ fonts/tfm/pbkli7y.tfm \ fonts/tfm/pbkli8t.tfm \ fonts/tfm/pbklo8t.tfm \ fonts/tfm/pbklu8r.tfm \ fonts/tfm/pbklu8t.tfm \ fonts/tfm/psyro.tfm # Virtual font definitions. These are the core of replacing the Computer Modern # fonts with something that looks better --- Bookman is more to my taste. dylpdoc_FONTVF = fonts/vf/pbkd7t.vf \ fonts/vf/pbkd7y.vf \ fonts/vf/pbkd8t.vf \ fonts/vf/pbkdi7m.vf \ fonts/vf/pbkdi7t.vf \ fonts/vf/pbkdi7y.vf \ fonts/vf/pbkdi8t.vf \ fonts/vf/pbkdo8t.vf \ fonts/vf/pbkdu8t.vf \ fonts/vf/pbkl7t.vf \ fonts/vf/pbkl7v.vf \ fonts/vf/pbkl7y.vf \ fonts/vf/pbkl8t.vf \ fonts/vf/pbkli7m.vf \ fonts/vf/pbkli7t.vf \ fonts/vf/pbkli7y.vf \ fonts/vf/pbkli8t.vf \ fonts/vf/pbklo8t.vf \ fonts/vf/pbklu8t.vf DyLP-1.6.0/DyLP/doc/TexMF/bibtex/0000755000076700007670000000000011414302676013105 5ustar DyLP-1.6.0/DyLP/doc/TexMF/bibtex/bib/0000755000076700007670000000000011414302676013641 5ustar DyLP-1.6.0/DyLP/doc/TexMF/bibtex/bib/dylp.bib0000644000076700007670000000534211171477034015274 0ustar @article{Bix92a, author = "Bixby, R.", title = "Implementing the Simplex Method: The Initial Basis", journal = "ORSA Journal on Computing", volume = "4", number = "3", pages = "267--284", month = "Summer", year = "1992", key = "Bixby" } @misc{COIN, title = "COIN-OR (Common Infrastructure for Operations Research)", howpublished = "\\Available at \texttt{http:{/}/www.coin-or.org}", key = "COIN" } @article{For92, author = "Forrest, J. and Goldfarb, D.", title = "Steepest-edge simplex algorithms for linear programming", journal = "Mathematical Programming", volume = "57", pages = "341--374", year = "1992", key = "Forrest" } @TechReport{Haf98a, author = "Hafer, L.", title = "A Note on the Relationship of Primal and Dual Simplex", number = "SFU-CMPT TR 1998-21", institution = "School of Computing Science, Simon Fraser University", address = "Burnaby, B.C., V5A 1S6", month = dec, year = "1998", key = "Hafer", date = "December 10, 1998", comment = "Previously cited as Haf97b." } @TechReport{Haf98b, author = "Hafer, L.", title = "\textsc{consys}: a dynamic constraint system", number = "SFU-CMPT TR 1998-22", institution = "School of Computing Science, Simon Fraser University", address = "Burnaby, B.C., V5A 1S6", month = dec, year = "1998", key = "Hafer", date = "December 16, 1998", comment = "Previously cited as Haf97a." } @misc{GLPK, author = "Makhorin, A.", title = "GLPK (GNU Linear Programming Kit)", howpublished = "\\Available at \texttt{http:{/}/www.gnu.org/software/glpk/glpk.html}", key = "Makhorin" } @techreport{Mak01, author = "Makhorin, A.", title = "GLPK Linear Programming Kit: Implementation of the Revised Simplex Method", type = "GLPK documentation", institution = "Moscow Aviation Institute", address = "Moscow, Russia", month = feb, year = "2001", key = "Makhorin" } @book{Mar03, author = "Maros, I.", title = "Computational Techniques of the Simplex Method", publisher = "Kluwer Academic Publishers", address = "Norwell, Massachusetts", year = "2003", isbn = "1-4020-7332-1", key = "Maros" } @book{Pad95, author = "Padberg, M.", title = "Linear Optimization and Extensions", series = "Algorithms and Combinatorics", volume = "12", publisher = "Springer-Verlag", address = "New York", year = "1995", isbn = "3-540-58734-9", key = "Padberg" } @article{Rya88, author = "Ryan, D. and Osborne, M.", title = "On the Solution of Highly Degenerate Linear Programmes", journal = "Mathematical Programming", volume = "41", pages = "385--392", year = "1988", key = "Ryan", comment = "This is a accessible description of the antidegeneracy mechanism used in dylp.", } DyLP-1.6.0/DyLP/doc/TexMF/bibtex/bst/0000755000076700007670000000000011414302676013675 5ustar DyLP-1.6.0/DyLP/doc/TexMF/bibtex/bst/louplain.bst0000644000076700007670000004556211171477034016247 0ustar % BibTeX standard bibliography style `plain' % version 0.99a for BibTeX versions 0.99a or later, LaTeX version 2.09. % Copyright (C) 1985, all rights reserved. % Copying of this file is authorized only if either % (1) you make absolutely no changes to your copy, including name, or % (2) if you do make changes, you name it something other than % btxbst.doc, plain.bst, unsrt.bst, alpha.bst, and abbrv.bst. % This restriction helps ensure that all standard styles are identical. % The file btxbst.doc has the documentation for this style. % Modifications by Lou Hafer % * `title' is no longer forced to lower case. ENTRY { address author booktitle chapter edition editor howpublished institution journal key month note number organization pages publisher school series title type volume year } {} { label } INTEGERS { output.state before.all mid.sentence after.sentence after.block } FUNCTION {init.state.consts} { #0 'before.all := #1 'mid.sentence := #2 'after.sentence := #3 'after.block := } STRINGS { s t } FUNCTION {output.nonnull} { 's := output.state mid.sentence = { ", " * write$ } { output.state after.block = { add.period$ write$ newline$ "\newblock " write$ } { output.state before.all = 'write$ { add.period$ " " * write$ } if$ } if$ mid.sentence 'output.state := } if$ s } FUNCTION {output} { duplicate$ empty$ 'pop$ 'output.nonnull if$ } FUNCTION {output.check} { 't := duplicate$ empty$ { pop$ "empty " t * " in " * cite$ * warning$ } 'output.nonnull if$ } FUNCTION {output.bibitem} { newline$ "\bibitem{" write$ cite$ write$ "}" write$ newline$ "" before.all 'output.state := } FUNCTION {fin.entry} { add.period$ write$ newline$ } FUNCTION {new.block} { output.state before.all = 'skip$ { after.block 'output.state := } if$ } FUNCTION {new.sentence} { output.state after.block = 'skip$ { output.state before.all = 'skip$ { after.sentence 'output.state := } if$ } if$ } FUNCTION {not} { { #0 } { #1 } if$ } FUNCTION {and} { 'skip$ { pop$ #0 } if$ } FUNCTION {or} { { pop$ #1 } 'skip$ if$ } FUNCTION {new.block.checka} { empty$ 'skip$ 'new.block if$ } FUNCTION {new.block.checkb} { empty$ swap$ empty$ and 'skip$ 'new.block if$ } FUNCTION {new.sentence.checka} { empty$ 'skip$ 'new.sentence if$ } FUNCTION {new.sentence.checkb} { empty$ swap$ empty$ and 'skip$ 'new.sentence if$ } FUNCTION {field.or.null} { duplicate$ empty$ { pop$ "" } 'skip$ if$ } FUNCTION {emphasize} { duplicate$ empty$ { pop$ "" } { "{\em " swap$ * "}" * } if$ } INTEGERS { nameptr namesleft numnames } FUNCTION {format.names} { 's := #1 'nameptr := s num.names$ 'numnames := numnames 'namesleft := { namesleft #0 > } { s nameptr "{ff~}{vv~}{ll}{, jj}" format.name$ 't := nameptr #1 > { namesleft #1 > { ", " * t * } { numnames #2 > { "," * } 'skip$ if$ t "others" = { " et~al." * } { " and " * t * } if$ } if$ } 't if$ nameptr #1 + 'nameptr := namesleft #1 - 'namesleft := } while$ } FUNCTION {format.authors} { author empty$ { "" } { author format.names } if$ } FUNCTION {format.editors} { editor empty$ { "" } { editor format.names editor num.names$ #1 > { ", editors" * } { ", editor" * } if$ } if$ } FUNCTION {format.title} { title empty$ { "" } { title } if$ } FUNCTION {n.dashify} { 't := "" { t empty$ not } { t #1 #1 substring$ "-" = { t #1 #2 substring$ "--" = not { "--" * t #2 global.max$ substring$ 't := } { { t #1 #1 substring$ "-" = } { "-" * t #2 global.max$ substring$ 't := } while$ } if$ } { t #1 #1 substring$ * t #2 global.max$ substring$ 't := } if$ } while$ } FUNCTION {format.date} { year empty$ { month empty$ { "" } { "there's a month but no year in " cite$ * warning$ month } if$ } { month empty$ 'year { month " " * year * } if$ } if$ } FUNCTION {format.btitle} { title emphasize } FUNCTION {tie.or.space.connect} { duplicate$ text.length$ #3 < { "~" } { " " } if$ swap$ * * } FUNCTION {either.or.check} { empty$ 'pop$ { "can't use both " swap$ * " fields in " * cite$ * warning$ } if$ } FUNCTION {format.bvolume} { volume empty$ { "" } { "volume" volume tie.or.space.connect series empty$ 'skip$ { " of " * series emphasize * } if$ "volume and number" number either.or.check } if$ } FUNCTION {format.number.series} { volume empty$ { number empty$ { series field.or.null } { output.state mid.sentence = { "number" } { "Number" } if$ number tie.or.space.connect series empty$ { "there's a number but no series in " cite$ * warning$ } { " in " * series * } if$ } if$ } { "" } if$ } FUNCTION {format.edition} { edition empty$ { "" } { output.state mid.sentence = { edition "l" change.case$ " edition" * } { edition "t" change.case$ " edition" * } if$ } if$ } INTEGERS { multiresult } FUNCTION {multi.page.check} { 't := #0 'multiresult := { multiresult not t empty$ not and } { t #1 #1 substring$ duplicate$ "-" = swap$ duplicate$ "," = swap$ "+" = or or { #1 'multiresult := } { t #2 global.max$ substring$ 't := } if$ } while$ multiresult } FUNCTION {format.pages} { pages empty$ { "" } { pages multi.page.check { "pages" pages n.dashify tie.or.space.connect } { "page" pages tie.or.space.connect } if$ } if$ } FUNCTION {format.vol.num.pages} { volume field.or.null number empty$ 'skip$ { "(" number * ")" * * volume empty$ { "there's a number but no volume in " cite$ * warning$ } 'skip$ if$ } if$ pages empty$ 'skip$ { duplicate$ empty$ { pop$ format.pages } { ":" * pages n.dashify * } if$ } if$ } FUNCTION {format.chapter.pages} { chapter empty$ 'format.pages { type empty$ { "chapter" } { type "l" change.case$ } if$ chapter tie.or.space.connect pages empty$ 'skip$ { ", " * format.pages * } if$ } if$ } FUNCTION {format.in.ed.booktitle} { booktitle empty$ { "" } { editor empty$ { "In " booktitle emphasize * } { "In " format.editors * ", " * booktitle emphasize * } if$ } if$ } FUNCTION {empty.misc.check} { author empty$ title empty$ howpublished empty$ month empty$ year empty$ note empty$ and and and and and key empty$ not and { "all relevant fields are empty in " cite$ * warning$ } 'skip$ if$ } FUNCTION {format.thesis.type} { type empty$ 'skip$ { pop$ type "t" change.case$ } if$ } FUNCTION {format.tr.number} { type empty$ { "Technical Report" } 'type if$ number empty$ { "t" change.case$ } { number tie.or.space.connect } if$ } FUNCTION {format.article.crossref} { key empty$ { journal empty$ { "need key or journal for " cite$ * " to crossref " * crossref * warning$ "" } { "In {\em " journal * "\/}" * } if$ } { "In " key * } if$ " \cite{" * crossref * "}" * } FUNCTION {format.crossref.editor} { editor #1 "{vv~}{ll}" format.name$ editor num.names$ duplicate$ #2 > { pop$ " et~al." * } { #2 < 'skip$ { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = { " et~al." * } { " and " * editor #2 "{vv~}{ll}" format.name$ * } if$ } if$ } if$ } FUNCTION {format.book.crossref} { volume empty$ { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ "In " } { "Volume" volume tie.or.space.connect " of " * } if$ editor empty$ editor field.or.null author field.or.null = or { key empty$ { series empty$ { "need editor, key, or series for " cite$ * " to crossref " * crossref * warning$ "" * } { "{\em " * series * "\/}" * } if$ } { key * } if$ } { format.crossref.editor * } if$ " \cite{" * crossref * "}" * } FUNCTION {format.incoll.inproc.crossref} { editor empty$ editor field.or.null author field.or.null = or { key empty$ { booktitle empty$ { "need editor, key, or booktitle for " cite$ * " to crossref " * crossref * warning$ "" } { "In {\em " booktitle * "\/}" * } if$ } { "In " key * } if$ } { "In " format.crossref.editor * } if$ " \cite{" * crossref * "}" * } FUNCTION {article} { output.bibitem format.authors "author" output.check new.block format.title "title" output.check new.block crossref missing$ { journal emphasize "journal" output.check format.vol.num.pages output format.date "year" output.check } { format.article.crossref output.nonnull format.pages output } if$ new.block note output fin.entry } FUNCTION {book} { output.bibitem author empty$ { format.editors "author and editor" output.check } { format.authors output.nonnull crossref missing$ { "author and editor" editor either.or.check } 'skip$ if$ } if$ new.block format.btitle "title" output.check crossref missing$ { format.bvolume output new.block format.number.series output new.sentence publisher "publisher" output.check address output } { new.block format.book.crossref output.nonnull } if$ format.edition output format.date "year" output.check new.block note output fin.entry } FUNCTION {booklet} { output.bibitem format.authors output new.block format.title "title" output.check howpublished address new.block.checkb howpublished output address output format.date output new.block note output fin.entry } FUNCTION {inbook} { output.bibitem author empty$ { format.editors "author and editor" output.check } { format.authors output.nonnull crossref missing$ { "author and editor" editor either.or.check } 'skip$ if$ } if$ new.block format.btitle "title" output.check crossref missing$ { format.bvolume output format.chapter.pages "chapter and pages" output.check new.block format.number.series output new.sentence publisher "publisher" output.check address output } { format.chapter.pages "chapter and pages" output.check new.block format.book.crossref output.nonnull } if$ format.edition output format.date "year" output.check new.block note output fin.entry } FUNCTION {incollection} { output.bibitem format.authors "author" output.check new.block format.title "title" output.check new.block crossref missing$ { format.in.ed.booktitle "booktitle" output.check format.bvolume output format.number.series output format.chapter.pages output new.sentence publisher "publisher" output.check address output format.edition output format.date "year" output.check } { format.incoll.inproc.crossref output.nonnull format.chapter.pages output } if$ new.block note output fin.entry } FUNCTION {inproceedings} { output.bibitem format.authors "author" output.check new.block format.title "title" output.check new.block crossref missing$ { format.in.ed.booktitle "booktitle" output.check format.bvolume output format.number.series output format.pages output address empty$ { organization publisher new.sentence.checkb organization output publisher output format.date "year" output.check } { address output.nonnull format.date "year" output.check new.sentence organization output publisher output } if$ } { format.incoll.inproc.crossref output.nonnull format.pages output } if$ new.block note output fin.entry } FUNCTION {conference} { inproceedings } FUNCTION {manual} { output.bibitem author empty$ { organization empty$ 'skip$ { organization output.nonnull address output } if$ } { format.authors output.nonnull } if$ new.block format.btitle "title" output.check author empty$ { organization empty$ { address new.block.checka address output } 'skip$ if$ } { organization address new.block.checkb organization output address output } if$ format.edition output format.date output new.block note output fin.entry } FUNCTION {mastersthesis} { output.bibitem format.authors "author" output.check new.block format.title "title" output.check new.block "Master's thesis" format.thesis.type output.nonnull school "school" output.check address output format.date "year" output.check new.block note output fin.entry } FUNCTION {misc} { output.bibitem format.authors output title howpublished new.block.checkb format.title output howpublished new.block.checka howpublished output format.date output new.block note output fin.entry empty.misc.check } FUNCTION {phdthesis} { output.bibitem format.authors "author" output.check new.block format.btitle "title" output.check new.block "PhD thesis" format.thesis.type output.nonnull school "school" output.check address output format.date "year" output.check new.block note output fin.entry } FUNCTION {proceedings} { output.bibitem editor empty$ { organization output } { format.editors output.nonnull } if$ new.block format.btitle "title" output.check format.bvolume output format.number.series output address empty$ { editor empty$ { publisher new.sentence.checka } { organization publisher new.sentence.checkb organization output } if$ publisher output format.date "year" output.check } { address output.nonnull format.date "year" output.check new.sentence editor empty$ 'skip$ { organization output } if$ publisher output } if$ new.block note output fin.entry } FUNCTION {techreport} { output.bibitem format.authors "author" output.check new.block format.title "title" output.check new.block format.tr.number output.nonnull institution "institution" output.check address output format.date "year" output.check new.block note output fin.entry } FUNCTION {unpublished} { output.bibitem format.authors "author" output.check new.block format.title "title" output.check new.block note "note" output.check format.date output fin.entry } FUNCTION {default.type} { misc } MACRO {jan} {"January"} MACRO {feb} {"February"} MACRO {mar} {"March"} MACRO {apr} {"April"} MACRO {may} {"May"} MACRO {jun} {"June"} MACRO {jul} {"July"} MACRO {aug} {"August"} MACRO {sep} {"September"} MACRO {oct} {"October"} MACRO {nov} {"November"} MACRO {dec} {"December"} MACRO {acmcs} {"ACM Computing Surveys"} MACRO {acta} {"Acta Informatica"} MACRO {cacm} {"Communications of the ACM"} MACRO {ibmjrd} {"IBM Journal of Research and Development"} MACRO {ibmsj} {"IBM Systems Journal"} MACRO {ieeese} {"IEEE Transactions on Software Engineering"} MACRO {ieeetc} {"IEEE Transactions on Computers"} MACRO {ieeetcad} {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"} MACRO {ipl} {"Information Processing Letters"} MACRO {jacm} {"Journal of the ACM"} MACRO {jcss} {"Journal of Computer and System Sciences"} MACRO {scp} {"Science of Computer Programming"} MACRO {sicomp} {"SIAM Journal on Computing"} MACRO {tocs} {"ACM Transactions on Computer Systems"} MACRO {tods} {"ACM Transactions on Database Systems"} MACRO {tog} {"ACM Transactions on Graphics"} MACRO {toms} {"ACM Transactions on Mathematical Software"} MACRO {toois} {"ACM Transactions on Office Information Systems"} MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"} MACRO {tcs} {"Theoretical Computer Science"} READ FUNCTION {sortify} { purify$ "l" change.case$ } INTEGERS { len } FUNCTION {chop.word} { 's := 'len := s #1 len substring$ = { s len #1 + global.max$ substring$ } 's if$ } FUNCTION {sort.format.names} { 's := #1 'nameptr := "" s num.names$ 'numnames := numnames 'namesleft := { namesleft #0 > } { nameptr #1 > { " " * } 'skip$ if$ s nameptr "{vv{ } }{ll{ }}{ ff{ }}{ jj{ }}" format.name$ 't := nameptr numnames = t "others" = and { "et al" * } { t sortify * } if$ nameptr #1 + 'nameptr := namesleft #1 - 'namesleft := } while$ } FUNCTION {sort.format.title} { 't := "A " #2 "An " #3 "The " #4 t chop.word chop.word chop.word sortify #1 global.max$ substring$ } FUNCTION {author.sort} { author empty$ { key empty$ { "to sort, need author or key in " cite$ * warning$ "" } { key sortify } if$ } { author sort.format.names } if$ } FUNCTION {author.editor.sort} { author empty$ { editor empty$ { key empty$ { "to sort, need author, editor, or key in " cite$ * warning$ "" } { key sortify } if$ } { editor sort.format.names } if$ } { author sort.format.names } if$ } FUNCTION {author.organization.sort} { author empty$ { organization empty$ { key empty$ { "to sort, need author, organization, or key in " cite$ * warning$ "" } { key sortify } if$ } { "The " #4 organization chop.word sortify } if$ } { author sort.format.names } if$ } FUNCTION {editor.organization.sort} { editor empty$ { organization empty$ { key empty$ { "to sort, need editor, organization, or key in " cite$ * warning$ "" } { key sortify } if$ } { "The " #4 organization chop.word sortify } if$ } { editor sort.format.names } if$ } FUNCTION {presort} { type$ "book" = type$ "inbook" = or 'author.editor.sort { type$ "proceedings" = 'editor.organization.sort { type$ "manual" = 'author.organization.sort 'author.sort if$ } if$ } if$ " " * year field.or.null sortify * " " * title field.or.null sort.format.title * #1 entry.max$ substring$ 'sort.key$ := } ITERATE {presort} SORT STRINGS { longest.label } INTEGERS { number.label longest.label.width } FUNCTION {initialize.longest.label} { "" 'longest.label := #1 'number.label := #0 'longest.label.width := } FUNCTION {longest.label.pass} { number.label int.to.str$ 'label := number.label #1 + 'number.label := label width$ longest.label.width > { label 'longest.label := label width$ 'longest.label.width := } 'skip$ if$ } EXECUTE {initialize.longest.label} ITERATE {longest.label.pass} FUNCTION {begin.bib} { preamble$ empty$ 'skip$ { preamble$ write$ newline$ } if$ "\begin{thebibliography}{" longest.label * "}" * write$ newline$ } EXECUTE {begin.bib} EXECUTE {init.state.consts} ITERATE {call.type$} FUNCTION {end.bib} { newline$ "\end{thebibliography}" write$ newline$ } EXECUTE {end.bib} DyLP-1.6.0/DyLP/doc/TexMF/tex/0000755000076700007670000000000011414302675012427 5ustar DyLP-1.6.0/DyLP/doc/TexMF/tex/latex/0000755000076700007670000000000011416017274013544 5ustar DyLP-1.6.0/DyLP/doc/TexMF/tex/latex/loubookman.sty0000644000076700007670000000717511171477034016467 0ustar %% %% This is file `loubookman.sty', modified %% from the distribution bookman.sty by Lou Hafer, 96.03.30 %% %% The original source files were: %% %% psfonts.dtx (with options: `bookman') %% %% Copyright (C) 1994 Sebastian Rahtz %% All rights reserved. %% %% This file is part of the PSNFSS2e package. %% ----------------------------------------- %% \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{loubookman}% [96/04/26\space1.0\space Bookman Text & Math PSNFSS2e package] % The basic commands to set up Bookman/AvantGarde/Courier as the default % text fonts. \renewcommand{\encodingdefault}{T1} \renewcommand{\rmdefault}{pbk} \renewcommand{\sfdefault}{pag} \renewcommand{\ttdefault}{pcr} % The math fonts are the pbk fonts as generated by the fontinst package and the % pbkmath.tex file. Replace the basic symbol fonts with the pbk virtual fonts, % then reset the \mathbf, \mathsf, \mathtt, and \mathit fonts to Bookman % Demibold, AvantGarde, Courier, and Bookman Italic (OT1 encoding), % respectively, so we don't default to Computer Modern fonts. We also add the % Postscript Symbol font so we can pick up symbols from it that TeX would % normally build with overstrikes. \DeclareSymbolFont{operators} {OT1}{pbk}{l}{n} \DeclareSymbolFont{letters} {OML}{pbk}{l}{it} \DeclareSymbolFont{boldletters} {OML}{pbk}{db}{it} \DeclareSymbolFont{symbols} {OMS}{pbk}{l}{n} \DeclareSymbolFont{largesymbols}{OMX}{pbk}{l}{n} \DeclareSymbolFont{pisymbols} {U}{psy}{m}{n} \DeclareSymbolFont{slpisymbols} {U}{psy}{m}{sl} \DeclareSymbolFontAlphabet{\mathbi}{boldletters} \SetMathAlphabet{\mathbf}{normal}{OT1}{pbk}{db}{n} \SetMathAlphabet{\mathsf}{normal}{OT1}{pag}{m}{n} \SetMathAlphabet{\mathtt}{normal}{OT1}{pcr}{m}{n} \SetMathAlphabet{\mathit}{normal}{OT1}{pbk}{l}{i} % The same deal, for the bold math version. \SetSymbolFont{operators}{bold}{OT1}{pbk}{db}{n} \SetSymbolFont{letters}{bold}{OML}{pbk}{db}{it} \SetSymbolFont{boldletters}{bold} {OML}{pbk}{db}{it} \SetSymbolFont{symbols}{bold}{OMS}{pbk}{db}{n} \SetSymbolFont{largesymbols}{bold}{OMX}{pbk}{m}{n} \SetMathAlphabet{\mathbf}{bold}{OT1}{pbk}{db}{n} \SetMathAlphabet{\mathsf}{bold}{OT1}{pag}{db}{n} \SetMathAlphabet{\mathtt}{bold}{OT1}{pcr}{b}{n} \SetMathAlphabet{\mathit}{bold}{OT1}{pbk}{db}{i} % Symbols taken from the Postscript Symbol font. % These next few are normally composite. We have to whack LaTeX over % the head to allow us to redefine them with DeclareMathSymbol. (vid. % Sec. 3.6 of the LaTeX2e Font Selection Guide). \let\neq\relax \DeclareMathSymbol{\neq}{\mathrel}{pisymbols}{"B9} \let\notin\relax \DeclareMathSymbol{\notin}{\mathrel}{pisymbols}{"CF} % It turns out that the majority of greek letters are declared as \mathord, % which means they aren't affected by math alphabet changes. So, if I want % a bold beta from \mathbi{\beta}, it has to be redeclared as type \mathalpha. % Also, TeX Math Italic doesn't contain superfluous Greek letters (i.e., the % ones that look like standard alphabetic letters). But the Symbol font does, % and it's nice to have them for consistency. % This section will no doubt grow. %\DeclareMathSymbol{\beta}{\mathalpha}{letters}{"0C} \DeclareMathSymbol{\omicron}{\mathalpha}{slpisymbols}{"6F} \DeclareMathSymbol{\Eta}{\mathalpha}{slpisymbols}{"48} % Some additional Greek. Added as needed. % Reduce the space around math operators. This was in the original that I % cribbed from the fontinst distribution. It reduces the plain TeX definitions % by .5 mu and significantly cuts the adjustability of medmuskip and % thickmuskip. \thinmuskip=2.5mu \medmuskip=3.5mu plus 1mu minus 1mu \thickmuskip=4.5mu plus 1.5mu minus 1mu \endinput %% %% End of file `loubookman.sty'. DyLP-1.6.0/DyLP/doc/TexMF/tex/latex/codedocn.sty0000644000076700007670000002707511171477034016100 0ustar \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{codedocn}% [1996/04/10 v1.0 Lou Hafer Code documentation macros.] \RequirePackage{ifthen} % These macros are intended to make it easier to do documentation of code. % By default, the sans serif typeface is used for for code --- this has much % to do with my dislike of Courier. But it's changeable with this option. % Beware! The AvantGarde sans serif face is just too big to coexist with % the usual fonts. Rather than pick a size here (\small was about right), % I used the scaling capability of DeclareFontShape to scale it by .9. % See the private copy of T1pag.fd. \DeclareOption{rm}% {\renewcommand{\codefamily}{\rmfamily}% \renewcommand{\mathcodefam}[1]{\mathrm{#1}}} \DeclareOption{sf}% {\renewcommand{\codefamily}{\sffamily}% \renewcommand{\mathcodefam}[1]{\mathsf{#1}}} \DeclareOption{tt}% {\renewcommand{\codefamily}{\ttfamily}% \renewcommand{\mathcodefam}[1]{\mathtt{#1}}} \newcommand{\codefamily}{\sffamily} \newcommand{\mathcodefam}[1]{\mathsf{#1}} \ProcessOptions % Fix up the verbatim package so it's using a compatible font. \renewcommand{\verbatim@font}{\normalfont\codefamily} % Boxes and lengthes we can use. \newsavebox{\code@docnbx} \newlength{\code@docnlen} \newsavebox{\code@docnbxA} \newlength{\code@docnlenA} % A pair of macros to handle the common instance of program identifier names % with `_' included as a letter. The trick is to get TeX to execute the catcode % change before it scans the identifier and sees the `_'. The \relax is % critical, otherwise TeX starts to expand \@pgmid to see if it'll add to the % 12 that ends the catcode change. \newcommand{\pgmid}{\begingroup\catcode`\_=12\relax\@pgmid} \newcommand{\@pgmid}[1]{\ifmmode\mathcodefam{#1}\else\codefamily #1\fi\endgroup} % Similar fooling around to get a more complicated reference that can include % (optionally) a file name and/or a subroutine name. \newcommand{\coderef}{\begingroup\catcode`\_=12\relax\@coderef} \newcommand{\@coderef}[2]% {\codefamily% \ifthenelse{\equal{#1}{}}% {#2}% {\ifthenelse{\equal{#2}{}}{#1}{#1:#2}}% \endgroup} % A list environment for subroutine documentation. % The subrdoc environment doesn't do anything in particular; it's just a % precaution. % The subrhdr command takes two parameters, the type and name of the % subroutine, and the parameter list. The parameter list can be broken % into multiple lines with \\, and they will be indented by the length of % the type and name. `()' around the parameters are supplied automatically. % To use, % \begin{subrdoc} % \item % \subrhdr{int *foo}{int parm1, int parm2,\\char *somestring} % \end{subrdoc} % \newenvironment{subrdoc}% {\begin{list}{}{\setlength{\itemsep}{\baselineskip}}} {\end{list}} \newcommand{\subrhdr}{\begingroup\catcode`\_=12\relax\@subrhdr} \newcommand{\@subrhdr}[2] {\settowidth{\code@docnlenA}{\codefamily\bfseries #1 ( }% \sbox{\code@docnbxA}% {\hspace*{\code@docnlenA}% \parbox[t]{\linewidth-\code@docnlenA-\rightmargin-5.0pt}% {\codefamily\bfseries\raggedright\makebox[0pt][r]{#1 ( }#2 )\\[1ex]}}% \setlength{\code@docnlenA}{-\labelwidth-\labelsep}% \hspace{\code@docnlenA}\usebox{\code@docnbxA}\endgroup\par} % A list environment for field names, parameters, etc. The header for an % item is a single name. All we're doing here is recreating a description % environment while making it easy to typeset the header. Usage is as for % subrdoc --- \item\varhdr{...}. NOTE that the \@varhdr macro has >> 2 << % parameters. The net effect is that it gobbles the next non-space character. % This gets around TeX's inclination to insert an inter-word space in the % normal sort of usage, where there's a space or line break after the % obvious parameter, i.e., \item\varhdr{hdr_name} Now the text ... \newenvironment{codedoc}[1][\hspace{5em}]% {\begin{list}{}{\settowidth{\labelwidth}{#1}% \setlength{\labelsep}{1em}% \setlength{\leftmargin}{\labelwidth+\labelsep}}} {\end{list}} \newcommand{\varhdr}{\begingroup\catcode`\_=12\relax\@varhdr} \newcommand{\@varhdr}[2] {\hspace{-\leftmargin}\codefamily\bfseries% \settowidth{\code@docnlenA}{#1}% \ifthenelse{\lengthtest{\code@docnlenA > \labelwidth}}% {\mbox{#1}}% {\makebox[\labelwidth][r]{#1}}% \endgroup\hspace{\labelsep}#2} % And the big version, Varhdr. This one is intended for substructures. The % first parameter will become the item header (typically the name of the % substructure). The 2nd parameter should contain all the fields. The lot % will be typeset much as for subrhdr, indented by the size of the first % parameter. \newcommand{\Varhdr}{\begingroup\catcode`\_=12\relax\@Varhdr} \newcommand{\@Varhdr}[2] {\settowidth{\code@docnlenA}{\codefamily\bfseries #1: }% \sbox{\code@docnbxA}% {\ifthenelse{\lengthtest{\code@docnlenA > \labelwidth}}% {\hspace*{\code@docnlenA}% \parbox[t]{\linewidth-\code@docnlenA-\rightmargin-5.0pt}% {\codefamily\bfseries\raggedright\makebox[0pt][r]{#1: }#2\\[.25ex]}}% {\setlength{\code@docnlenA}{\labelwidth+\labelsep}% \hspace*{\code@docnlenA}% \parbox[t]{\linewidth-\labelwidth-\labelsep-\rightmargin-5.0pt}% {\codefamily\bfseries\raggedright% \makebox[0pt][r]{#1:\hspace{\labelsep}}#2\\[.25ex]}}}% \setlength{\code@docnlenA}{-\labelwidth-\labelsep}% \hspace{\code@docnlenA}\usebox{\code@docnbxA}\endgroup\par} % Macros intended to make it a bit easier to set BNF syntax descriptions. \newcommand{\keywd@font}{\ttfamily\upshape} \newcommand{\term@font}{\codefamily\upshape} \newcommand{\nterm@font}{\codefamily\itshape} \newcommand{\kw}[1]{{\keywd@font#1}} \newcommand{\te}[1]{{\term@font#1}} \newcommand{\nt}[1]{{\nterm@font#1}} \newcommand{\bnflist}[2][]{#2\te{-LIST}\textsuperscript{\kw{#1}}} % An environment for typesetting bnf descriptions. The lhs command is used % only inside this environment, as an alias for \item. \newenvironment{bnf}[1][\quad]% {\begin{list}{}{\renewcommand{\makelabel}[1]{##1 \hfill}% \settowidth{\labelwidth}{#1}% \setlength{\leftmargin}{\labelwidth+\labelsep}% \term@font}} {\end{list}} \newcommand{\lhs}[1]{\item[\nt{#1} \bnfeq ]} % Various special symbols. bnfnull writes the word null in a distinct script. % bnfeq does up `::=' with decent alignment. \newcommand{\bnfnull}{{\fontfamily{pzc}\fontshape{it}\selectfont null}} \newcommand{\bnfeq}{::\raise-1.1pt\hbox{=} } % And now an environment and various commands aimed at psuedocode. Basically % we set up a tabbing environment, in the codefamily font. Comments revert % to textrm. The surrounding list allows us to shrink the margins. \newcommand{\pseudo@indent}{\{ } \newenvironment{pseudocode}[1][\parindent] {\begin{list}{}{\setlength{\leftmargin}{#1}\setlength{\topsep}{0pt}}% \codefamily\bfseries% \renewcommand{\textit}[1]{{\rmfamily\itshape\mdseries ##1}}% \renewcommand{\textrm}[1]{{\rmfamily\upshape\mdseries ##1}}% \item% \begin{tabbing}% \pseudo@indent\=\pseudo@indent\=\pseudo@indent\=\pseudo@indent\=% \pseudo@indent\=\pseudo@indent\= \kill} {\end{tabbing} \end{list}} \newcommand{\pseudocomment}[1]% {\sbox{\code@docnbx}{/* \textrm{#1} */}% \settowidth{\code@docnlen}{\usebox{\code@docnbx}}% \ifthenelse{\lengthtest{\code@docnlen > \linewidth}}% {/*\+\\ \parbox{\linewidth}{\raggedright\textrm{#1}}\-\\ {}*/\\}% {\\[-.25\baselineskip]/* \textrm{#1} */\\[.25\baselineskip]}% } % An environment and commands suitable for assembly language. % The following are generic sizes. We have to % delay setting the comment length until execution so that we get the current % value for \linewidth. % A macro for sizing the environment. The assumption is that some point size % has been established. \newlength{\assem@comindent} \newlength{\assem@datasze} \newlength{\assem@addrsze} \newlength{\assem@blkcomsze} \newlength{\assem@commentsze} \newlength{\assem@operandsze} \newlength{\assem@opcodesze} \newlength{\assem@lblsze} \newboolean{assem@listing} \newcommand{\assem@comchar}{;} \newcommand{\setassemsize}[1][\normalsize]% {#1% \setlength{\assem@lblsze}{10ex}% \setlength{\assem@opcodesze}{6ex}% \setlength{\assem@operandsze}{20ex}% \setlength{\assem@addrsze}{6ex}% \setlength{\assem@datasze}{3ex}% } \setassemsize \newenvironment{assembler}[1][\assem@comchar] {\begin{flushleft}\codefamily% \setboolean{assem@listing}{false}% \setlength{\assem@commentsze}% {\linewidth-\assem@lblsze-\assem@opcodesze-\assem@operandsze-8\tabcolsep}% \setlength{\assem@blkcomsze}{\linewidth-2\tabcolsep}% \begin{tabular}% {p{\assem@lblsze}p{\assem@opcodesze}% p{\assem@operandsze}>{#1 }p{\assem@commentsze}}} {\end{tabular}\end{flushleft}} \newenvironment{assemblerlisting} {\begin{flushleft}\codefamily% \setboolean{assem@listing}{true}% \setlength{\assem@comindent}% {\assem@addrsze+\assem@datasze+4\tabcolsep} \setlength{\assem@commentsze}% {\linewidth-\assem@lblsze-\assem@opcodesze-\assem@operandsze-12\tabcolsep}% \addtolength{\assem@commentsze}{-\assem@addrsze-\assem@datasze}% \setlength{\assem@blkcomsze}{\linewidth-\assem@comindent} \begin{tabular}% {p{\assem@addrsze}p{\assem@datasze}% p{\assem@lblsze}p{\assem@opcodesze}% p{\assem@operandsze}>{\assem@comchar\ }p{\assem@commentsze}}} {\end{tabular}\end{flushleft}} % A block comment macro. The user-level call is \assemblkcom{the comment}. % It will automatically break up the comment into lines, adding the `;' at the % front. The strategy is to suck the entire comment into a box, and see if % it'll fit on one line. If it doesn't, we initialise a box to `; ', then call % break@comment, which will try to add words to the line until the next word % won't fit. Then it dumps the box, reinitialises it, and continues. The string % end@comment is tacked onto the end, and when we see that we're done. Turns % out \multicolumn has problems inside an ifthenelse, for some reason, so I've % fallen back on \makebox, lying about the width. `&' also seems to have % trouble, but only in the \break@comment macro. To all appearances, when I % try to leave two blank columns in listing format with `& &', the % \code@docnbx seems to be emptied (?). Faked it with hspace. \def\break@comment #1 #2 {% \settowidth{\code@docnlen}{\usebox{\code@docnbx}}% \settowidth{\code@docnlenA}{ #1}% \addtolength{\code@docnlenA}{\code@docnlen}% \ifthenelse{\lengthtest{\code@docnlenA > \assem@blkcomsze}}% {\ifthenelse{\boolean{assem@listing}}% {\makebox[\assem@addrsze][l]% {\hspace{\assem@comindent}\usebox{\code@docnbx}} \\}% {\makebox[\assem@lblsze][l]{\usebox{\code@docnbx}} \\}% \sbox{\code@docnbx}{\assem@comchar{}}% \def\bk@nxt{\break@comment #1 }}% {\sbox{\code@docnbx}{\usebox{\code@docnbx} #1}% \ifthenelse{\equal{#2}{end@comment}}% {\ifthenelse{\boolean{assem@listing}}% {\makebox[\assem@addrsze][l]% {\hspace{\assem@comindent}\usebox{\code@docnbx}}}% {\makebox[\assem@lblsze][l]{\usebox{\code@docnbx}}}% \def\bk@nxt ##1 {}}% {\let\bk@nxt\break@comment}} \bk@nxt #2 % } \newcommand{\assemblkcom}[1]% {\sbox{\code@docnbx}{\assem@comchar\ #1}% \settowidth{\code@docnlen}{\usebox{\code@docnbx}}% \ifthenelse{\lengthtest{\code@docnlen > \assem@blkcomsze}}% {\sbox{\code@docnbx}{\assem@comchar{}}\break@comment #1 end@comment}% {\ifthenelse{\boolean{assem@listing}}{& &}{}% \makebox[\assem@lblsze][l]{\assem@comchar\ #1}}% } % This will format the label on a line by itself if it's longer than the % label column. \newcommand{\assemlbl}[1]% {\sbox{\code@docnbx}{#1:}% \settowidth{\code@docnlen}{\usebox{\code@docnbx}}% \ifthenelse{\lengthtest{\code@docnlen > \assem@lblsze}}% {\makebox[\assem@lblsze][l]{#1:}\\% \ifthenelse{\boolean{assem@listing}}{& &}{}}% {#1:}% } DyLP-1.6.0/DyLP/doc/TexMF/tex/latex/loustandard.sty0000644000076700007670000003044611171477034016636 0ustar \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{loustandard}% [1996/04/10 v1.0 Lou Hafer Standard macros, style modifications, etc.] \RequirePackage{calc} \RequirePackage{xspace} \RequirePackage{ifthen} \RequirePackage{array} \RequirePackage{version} % Basic Page Setup % The first thing we do is cancel the horizontal and vertical offsets. \setlength{\hoffset}{-1in} \setlength{\voffset}{-1in} % For one-sided printing, arrange for 1 inch margins on each side. For % two-sided printing, add 1/2 inch to the binding margin (right margin for even % pages, left margin for odd pages). Because of the way LaTeX specifies the % page layout, the easiest way to get this to work is to set evenmargin to % the desired margin, odd margin to margin+bindingmargin, and then set the % linewidth to whatever's left. LaTeX won't make any use of evensidemargin in % onesided mode. \ifthenelse{\boolean{@twoside}} {\setlength{\oddsidemargin}{1.5in} \setlength{\evensidemargin}{1in}} {\setlength{\oddsidemargin}{1in} \setlength{\evensidemargin}{1in}} \setlength{\textwidth}{\paperwidth-\oddsidemargin-\evensidemargin} % For top and bottom margins, arrange for 1.25 inch % margin on top, with the running head set in the margin; 1.25 inch margin at % bottom, with the running foot set in the margin. \setlength{\topmargin}{.75in} \setlength{\headsep}{1.25in-\topmargin-\headheight} \setlength{\footskip}{.75in} \setlength{\textheight}{\paperheight-2.5in} % Get control of the running headers, if the document defines the myheadings % page style. Also install a default footer with the page number. \ifx\ps@myheadings\undefined \else \pagestyle{myheadings} \renewcommand{\@oddhead}{\rightmark} \renewcommand{\@oddfoot}{\hfill \textrm{\thepage} \hfill} \fi % Add a little spread between paragraphs. \addtolength{\parskip}{.5\baselineskip} % Tabular Utility Commands % \pbs preserves the \\ command over raggedleft, centering, or raggedright % in p columns. % \tnl is just a shorthand for \tabularnewline, which the LaTeX people % introduced as an alternate solution to the problem. \newcommand{\pbs}[1]{\let\pbs@temp=\\#1\let\\=\pbs@temp} \newcommand{\tnl}{\tabularnewline} % A command that makes nice double rules for total lines in tables, etc. % The optional parameter specifies the separation (the top rule will be % lifted by this much. \newcommand{\dblrulefill}[1][2pt] {\leavevmode% \cleaders% \hbox{\rule[#1]{2pt}{.4pt}\kern-2pt\rule{2pt}{.4pt}}% \hfill\kern 0pt} % Font and Glyph Utility Commands % Basic commands for convenient access to glyphs in the symbol and dingbats % fonts. Cribbed from the pifont package. \newcommand{\Pifont}[1]% {\fontfamily{#1}\fontencoding{U}\fontseries{m}\fontshape{n}\selectfont} \newcommand{\Pisymbol}[2]{{\Pifont{#1}\char#2}} % This next bit requires a Upxx.fd file around somewhere (replace xx with your % favourite Adobe font), so that we can go in directly with the Adobe encoding. % Might be worth defining the Adobe encoding vector some time. \newcommand{\cent}{\fontencoding{U}\selectfont\char"A2} \newcommand{\bkslsh}{\fontencoding{U}\selectfont\char"5C\relax} % The degree symbol. Use a superscript sans-serif `o'. The ring accent just % doesn't cut it. Usage is \degs{180}, for example. \newcommand{\degs}[1]{#1\raise.8ex\hbox{\scriptsize\textsf o}} % Environments, Commands, etc. % Reference commands, that'll automatically include the appropriate surround. % With \secref, the first (optional) parameter can be used to override the % default \S prefix; an `*' will suppress the prefix entirely. \newcommand{\eqnref}[1]{(\ref{#1})} \newcommand{\secref}[2][]% {\ifthenelse{\equal{#1}{}}% {\S}% {\ifthenelse{\equal{#1}{*}}{}{#1}}% \ref{#2}% } % Redefine footnote formatting to eliminate paragraph indent. It looks silly. \renewcommand{\@makefnmark}{\makebox{\textsuperscript{\@thefnmark}}} \renewcommand{\@makefntext}[1]% {\begin{quotation}[\hspace{2ex}]% \makebox[2ex][r]{\textsuperscript{\@thefnmark}}#1% \end{quotation}% } % A commentary environment, for big blocks of commentary. Puts a neat little % hooked bar at the beginning and end of the commentary block. Because this % isn't really used as an enumerated list environment, nested enumerated lists % look better if the list depth isn't incremented inside the environment. % The fussing at the beginning (\mbox{}\raggedright\newline) makes sure that % there's a line to end, and ends it. \newenvironment{commentary}% {{\mbox{}\raggedright\newline}\vspace{.5\baselineskip}\noindent% \rule[-6pt]{2pt}{8pt}\rule{15em}{2pt}\vspace{-10pt}% \ifnum \@listdepth = 0\relax \vspace{-\topsep} \else \fi% \begin{list}{}% {\setlength{\leftmargin}{2ex}% \setlength{\listparindent}{\parindent}% \setlength{\itemindent}{\parindent}% \global\advance\@listdepth\m@ne}% \item\relax} {\global\advance\@listdepth\@ne% \end{list}\vspace*{-\parskip}% \ifnum \@listdepth = 0\relax \vspace{-\topsep} \else \fi% {\raggedright\noindent% \rule{2pt}{8pt}\rule{15em}{2pt}\\[.4\baselineskip]}} % An `aside' environment, set off with guillemots and typeset in Zapf Chancery. % This depends on the existence of XXpzc.fd, where XX is the current encoding. % I need to fix the scaling properly for Zapf, but for now kludge it with the % unaside command. \newcommand{\aside}[1]% {<< {\fontfamily{pzc}\fontshape{it}\selectfont\large #1} >>} \newcommand{\unaside}[1]{\bgroup\normalsize #1\egroup} % Common latin abbreviations. The \@ prevents addition of end-of-sentence space % after a period by resetting the space factor to 1000. (See Chap.12 of the % TexBook, and ltspaces.dtx for the definition of \@). Not used for \etc and % \etal because they often end sentences. Prabably not necessary for e.g. and % i.e., as they're virtually always followed by a comma in the manuscript. \newcommand{\vid}{\textit{vid}.\@\xspace} \newcommand{\cf}{\textit{cf}.\@\xspace} \newcommand{\ie}{\textit{i\/}.\textit{e}.\@\xspace} \newcommand{\eg}{\textit{e}.\textit{g}.\@\xspace} \newcommand{\etc}{\textit{etc}.\xspace} \newcommand{\etal}{\textit{et al}.\xspace} \newcommand{\vs}{\textit{vs}.\@\xspace} % Unnumbered heading and subheading. \newcommand{\heading}[1]{% \@startsection{heading}% {1}{0pt}{\baselineskip}{\baselineskip}{\centering\bfseries\Large}*% {#1}} % Default for subheading is centered; \subheading[l]{...} does flush left, % \subheading[r]{....} does flushright (and [c] will center). \newcommand{\subheading}[2][c]{% \if#1l% \@startsection{subheading}% {2}{0pt}{\baselineskip}{.25\baselineskip}{\raggedright\bfseries}*% {#2}% \else\if#1c% \@startsection{subheading}% {2}{0pt}{\baselineskip}{.25\baselineskip}{\centering\bfseries}*% {#2}% \else \@startsection{subheading}% {2}{0pt}{\baselineskip}{.25\baselineskip}{\raggedleft\bfseries}*% {#2}% \fi\fi} % Redefine quotation so that it will outdent the initial line by the width % of an opening double quote. Make the `quote' string a parameter, in case % we want to change it some day. \renewenvironment{quotation}[1][``]% {\begin{list}{}% {\listparindent 0pt% \settowidth{\labelwidth}{#1}% \setlength{\itemindent}{-\labelwidth}% \rightmargin \leftmargin% \parsep \z@ \@plus\p@}% \item\relax} {\end{list}} % Redefine description so that it allows convenient adjustment of the % indent. \renewenvironment{description}[1][\quad]% {\begin{list}{}{\renewcommand{\makelabel}[1]{##1 \hfill}% \settowidth{\labelwidth}{#1 }% \setlength{\leftmargin}{\labelwidth+\labelsep}}} {\end{list}} % Make the \itemize environment use dingbats for the labels. \renewcommand{\labelitemi}{\Pisymbol{pzd}{101}} \renewcommand{\labelitemii}{\Pisymbol{pzd}{102}} \renewcommand{\labelitemiii}{\Pisymbol{pzd}{100}} \renewcommand{\labelitemiv}{\Pisymbol{pzd}{83}} % Handy macro, txtfrac{}{\@setfontsize \tiny \@vpt \@vipt % where the three parameters to @setfontsize are , , % , in that order. isn't always given as a % variable. The extractptsize macro could well fail under some variation I % didn't spot. \makeatother \def\extractptsize#1@#2@#3 #4|{\csname@#3\endcsname} \makeatletter \newcommand{\pointsize}[1]{\expandafter\extractptsize\meaning#1|} % This ugly little number compares the present point size to the point size % for the defined sizes and returns an integer code matching the size. It % isn't convenient to do this with numeric comparison because the calc % package chokes on fractional point sizes. \newcounter{currsizecode} \newcommand{\currsize}% {\ifthenelse{\equal{\f@size}{\pointsize{\normalsize}}}% {\setcounter{currsizecode}{4}}% {\ifthenelse{\equal{\f@size}{\pointsize{\large}}}% {\setcounter{currsizecode}{5}}% {\ifthenelse{\equal{\f@size}{\pointsize{\small}}}% {\setcounter{currsizecode}{3}}% {\ifthenelse{\equal{\f@size}{\pointsize{\Large}}}% {\setcounter{currsizecode}{6}}% {\ifthenelse{\equal{\f@size}{\pointsize{\footnotesize}}}% {\setcounter{currsizecode}{2}}% {\ifthenelse{\equal{\f@size}{\pointsize{\LARGE}}}% {\setcounter{currsizecode}{7}}% {\ifthenelse{\equal{\f@size}{\pointsize{\scriptsize}}}% {\setcounter{currsizecode}{1}}% {\ifthenelse{\equal{\f@size}{\pointsize{\huge}}}% {\setcounter{currsizecode}{8}}% {\ifthenelse{\equal{\f@size}{\pointsize{\tiny}}}% {\setcounter{currsizecode}{0}}% {\ifthenelse{\equal{\f@size}{\pointsize{\Huge}}}% {\setcounter{currsizecode}{9}}% {\setcounter{currsizecode}{10}}% }% }% }% }% }% }% }% }% }% } % This guy specifies the appropriate adjustments to font size and baseline % height. \newcommand{\subsupadjust} {\currsize% \ifcase\value{currsizecode}% \def\newsize{\tiny}\def\newheight{.7ex}% 0: \tiny \or% \def\newsize{\tiny}\def\newheight{.7ex}% 1: \scriptsize \or% \def\newsize{\tiny}\def\newheight{.7ex}% 2: \footnotesize \or% \def\newsize{\scriptsize}\def\newheight{.7ex}% 3: \small \or% \def\newsize{\scriptsize}\def\newheight{.7ex}% 4: \normalsize \or% \def\newsize{\footnotesize}\def\newheight{.7ex}% 5: \large \or% \def\newsize{\small}\def\newheight{.7ex}% 6: \Large \or% \def\newsize{\small}\def\newheight{.7ex}% 7: \LARGE \or% \def\newsize{\small}\def\newheight{.7ex}% 8: \huge \or% \def\newsize{\normalsize}\def\newheight{.7ex}% 9: \Huge \else% \def\newsize{\normalsize}\def\newheight{.7ex}% 10: other \fi} % And finally, a pair of macros that actually take text as an argument. \newcommand{\up}[1]% {\subsupadjust\raisebox{\newheight}{\newsize#1}} \newcommand{\dn}[1]% {\subsupadjust\raisebox{-\newheight}{\newsize#1}} DyLP-1.6.0/DyLP/doc/TexMF/tex/latex/loumath.sty0000644000076700007670000001151611263240452015756 0ustar \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{loumath}[1998/09/09 v2.0 Lou Hafer Math macros] \RequirePackage{theorem} \RequirePackage{amssymb} % Retool theorem, definition, etc., to be more to my liking. \theoremheaderfont{\bfseries\scshape} \theorembodyfont{\rmfamily} \newcommand{\thmref}[1]{Theorem~\ref{#1}} \newcommand{\propref}[1]{Proposition~\ref{#1}} \newcommand{\corref}[1]{Corollary~\ref{#1}} % I originally used \labelsep to separate `Proof' from the start of the text. % Unfortunately, this tends to screw up nested list environments, so I changed % to adding the space directly, as part of the label. Because this isn't used % as an enumerated list environment, nested enumerated lists look better if the % list depth isn't incremented. The hack at the end of the proof environment % to print a black square, right-justified & pushed to the next line only % if necessary, comes from p.106 of the TeX Book. \newenvironment{proof} {\begin{list}{\textsc{Proof.\hspace{4ex}}}% {\setlength{\leftmargin}{0pt}% \setlength{\labelwidth}{0pt}% \setlength{\itemindent}{\labelsep}% \setlength{\listparindent}{\parindent}% \global\advance\@listdepth\m@ne}% \item\relax} {\unskip\nobreak\hfil\penalty50\hskip1em\hbox{}\nobreak\hfill$\blacksquare$% \global\advance\@listdepth\@ne% \end{list}} \newenvironment{definition*} {\begin{list}{\textsc{\bfseries Definition.}}% {\setlength{\leftmargin}{0pt}% \setlength{\labelwidth}{0pt}% \setlength{\labelsep}{4ex}% \setlength{\itemindent}{\labelsep}}% \item} {\end{list}} % Redid the norm, abs, floor, and ceil macros so that they'll automatically % choose reasonable delimiters. Not so easy as I thought it'd be. \newlength{\loumath@tmpA} \newlength{\loumath@tmpB} \newsavebox{\loumath@bxA} % All this work is necessary so that we can decide whether to try for simple % characters or the constructed delimiters. The trouble is that the smallest % of the constructed delimiters is just a bit too big for your typical % trivial use --- \norm{x} just doesn't look right with \left\| and \right\| % surrounding it; you need \|x\|. It'd all go relatively easily except that % we have to get the math mode right when we build the inner formula in a % box to measure its height. Once that rears its ugly head, it just keeps % getting worse. The \with@delims macro is probably a bit more general than % it needs to be, but it was interesting to craft it up. \newcommand{\with@delims}[7]% {\sbox{\loumath@bxA}{\ensuremath{#1 #4}}% \settoheight{\loumath@tmpA}{\usebox{\loumath@bxA}}% \settodepth{\loumath@tmpB}{\usebox{\loumath@bxA}}% \addtolength{\loumath@tmpA}{\loumath@tmpB}% \ifthenelse{\lengthtest{\loumath@tmpA > 1.1\baselineskip}}% {\left#2% \usebox{\loumath@bxA}% \right#6_{\kern -.09em \raisebox{-.4ex}{$\scriptscriptstyle #7$}}}% {#3% \usebox{\loumath@bxA}% #5_{\raisebox{-.4ex}{$\scriptscriptstyle #7$}}}} % vector norm, with optional argument to specify type of norm. Also absolute % value, floor, and ceiling. \newcommand{\norm}[2][]% {\mathchoice{\with@delims{\displaystyle}{\|}{\|}{#2}{\|}{\|}{#1}} {\with@delims{\textstyle}{\|}{\|}{#2}{\|}{\|}{#1}} {\with@delims{\scriptstyle}{\|}{\|}{#2}{\|}{\|}{#1}} {\with@delims{\scriptscriptstyle}{\|}{\|}{#2}{\|}{\|}{#1}}} \newcommand{\abs}[1]% {\mathchoice% {\with@delims{\displaystyle}{|}{|}{#1}{|}{|}{}} {\with@delims{\textstyle}{|}{|}{#1}{|}{|}{}} {\with@delims{\scriptstyle}{|}{|}{#1}{|}{|}{}} {\with@delims{\scriptscriptstyle}{|}{|}{#1}{|}{|}{}}} \newcommand{\floor}[1]% {\mathchoice% {\with@delims{\displaystyle}{\lfloor}{\lfloor}{#1}{\rfloor}{\rfloor}{}} {\with@delims{\textstyle}{\lfloor}{\lfloor}{#1}{\rfloor}{\rfloor}{}} {\with@delims{\scriptstyle}{\lfloor}{\lfloor}{#1}{\rfloor}{\rfloor}{}} {\with@delims{\scriptscriptstyle}{\lfloor}{\lfloor}{#1}{\rfloor}{\rfloor}{}}} \newcommand{\ceil}[1]% {\mathchoice% {\with@delims{\displaystyle}{\lceil}{\lceil}{#1}{\rceil}{\rceil}{}} {\with@delims{\textstyle}{\lceil}{\lceil}{#1}{\rceil}{\rceil}{}} {\with@delims{\scriptstyle}{\lceil}{\lceil}{#1}{\rceil}{\rceil}{}} {\with@delims{\scriptscriptstyle}{\lceil}{\lceil}{#1}{\rceil}{\rceil}{}}} % Matrix transpose \newcommand{\trans}[1]{\ensuremath{#1^\top}} % Matrix inverse --- the problem here is picky spacing at the top of the % italic capital that's typically used for a matrix variable. The default % 2mu is about right at the top of an italic `B'. The second bit of spacing % pulls the `1' closer to the `-' in `-1'. \newcommand{\inv}[2][2]{\ensuremath{#2^{\mspace{#1mu}-\mspace{-2mu}1}}} % A general macro for things of the form F(k), where `F' is something in roman % type. There are specific convenience macros for `big-O' complexity and % Fibonacci numbers F(k) \newcommand{\romanFunc}[2]{\ensuremath{\mathrm{#1}(#2)}} \newcommand{\bigO}[1]{\romanFunc{O}{#1}} \newcommand{\fib}[1]{\romanFunc{F}{#1}} DyLP-1.6.0/DyLP/doc/build_dylpdoc.in0000644000076700007670000001014511171477034014014 0ustar #!/bin/csh # usage: build [-c] [-f] [-u N] [-ps] [-pdf] [target] # With no flags, will be handed to make as `make ' # With the -f flag, the first command run is `latex ' # In either case, the log file is scanned to decide what more needs to be done. # You can limit the total number of latex runs with the -u N argument. set knownTargets = (dylp dylpfigs) set dfltTarget = dylp set makecmd = 'make -f makefile.dylpdoc' # Make sure we have a directory for generated .eps files for figures. if ( ! -e Figures) then mkdir Figures endif # Tell TeX where to find its inputs. TEXMFHOME is predefined in TeX Live to # allow a user to point to a local source tree for style files, fonts, etc. # This tree must have the same structure as the distribution tree. # TEXINPUTS is for general input files. See the TeX Live documentation. If your # TeX distribution uses different mechanisms, well, good luck. setenv TEXMFHOME @abs_srcdir@/TexMF setenv TEXINPUTS @abs_srcdir@/: printenv | grep TEX set force = 0 set clean = 0 set ltxlimit = 5 set needLaTeX = 0 set needBibTeX = 0 set buildPDF = 0 set buildPS = 0 while ($#argv >= 1) switch ($1) case *-c*: set clean = 1 breaksw case *-f*: set force = 1 breaksw case *-pdf: set buildPDF = 1 breaksw case *-ps: set buildPS = 1 breaksw case -u: shift set ltxlimit = $1 breaksw case *-h*: echo "usage: build [-c|--clean] [-f|--force] [-u N] [-ps] [-pdf] [target]" echo " known targets: $knownTargets" echo " default target: $dfltTarget" echo " build --clean with no target will clean and exit" echo " build --clean with a target will clean and then build the target" echo " For all options, you can use `-' or `--'." exit default: set tgt = $1 breaksw endsw shift end # Clean out the previous build? if ($clean == 1) then $makecmd clean if ($?tgt == 0) exit endif # Known target? if ($?tgt == 0) then set tgt = $dfltTarget endif set found = 0 foreach knowntgt ($knownTargets) if ($knowntgt == "$tgt") then echo "Building $tgt" set found = 1 break endif end if ($found == 0) then echo "build: Unknown target $tgt" echo "\ttry build --help" exit endif # Check if we need to do anything. if ($needLaTeX == 0) then $makecmd -q $tgt if ( $status == 0) then echo "Make says no need to run LaTeX." else set needLaTeX = 1 echo "Make says run LaTeX." endif endif if ($needBibTeX == 0) then $makecmd -q $tgt.bbl if ( $status == 0) then echo "Make says no need to run BibTeX." else set needBibTeX = 1 echo "Make says run BibTeX." endif endif if ($force == 0) then if ($needLaTeX == 1) then echo "Calling make for $tgt" $makecmd $tgt @ ltxlimit-- endif else echo "Forcing LaTeX for $tgt" latex $tgt @ ltxlimit-- endif if ($ltxlimit == 0) exit # Now check if we need to run BibTex. There are two conditions to check: # 1) The log file contains one or both of the following lines: # No file dylp.bbl. # LaTeX Warning: Citation `----' on page N undefined ... # 2) tgt.bbl already exists, and make -q tgt.bbl indicates work to be done # This section runs LaTex only once --- we'll need to run a second time, but # that'll be swept up in the next block for labels. egrep 'No file [^.]*\.bbl|Citation .* undefined' $tgt.log if ($status == 0) then set needBibTeX = 2 endif if ($needBibTeX > 0) then echo "Running BibTex to generate/update $tgt.bbl." bibtex $tgt echo "Running LaTeX for initial scan of $tgt.bbl" latex $tgt @ ltxlimit-- if ($ltxlimit == 0) exit endif # Do we need to run again to get labels right? egrep 'Rerun' $tgt.log if ($status == 0) then echo "Running LaTex for cross-references" latex $tgt @ ltxlimit-- if ($ltxlimit == 0) exit endif # And did the user ask for more than a DVI file? We can build PostScript or # PDF. if ($buildPS == 1) then echo "Running dvips for PostScript output" dvips -D1200 -o dylp.ps dylp.dvi endif if ($buildPDF == 1) then echo "Running pdflatex for PDF output" make -f makefile.dylpdoc $tgt.pdf endif DyLP-1.6.0/DyLP/doc/lpbasis.tex0000644000076700007670000001770211171477034013034 0ustar \section{The LP Basis} \label{sec:LPBasis} \dylp requires three capabilities from a basis maintenance module: \begin{itemize} \item Factoring of the basis to create the basis inverse. \item Update of the basis inverse for a pivot. \item Premultiplication (`ftran') of a column vector by the basis inverse, and postmultiplication (`btran') of a row vector by the basis inverse. \end{itemize} \dylp uses the basis maintenance module from \glpk to provide these services. Knowledge of the structure and operation of the \glpk subroutines is confined to a set of interface subroutines in the file \coderef{dy_basis.c}{}. The majority of these are straightforward interface functions whose sole purpose is to hide the \glpk structures and to mediate between \glpk and the remainder of the code. \subsection{The \glpk Basis Module Interface} \label{sec:GLPKBasisModule} Very roughly, the \glpk basis maintenance module has a two-layer structure. The top layer (\coderef{glpinv.c}{}) provides the basic services for a generic basis inverse. In turn, the top layer calls on a second layer (\coderef{glpluf.c}{}) to provide a specific implementation of the basis inverse data structures and algorithms. Dynamic Markowitz pivoting with partial threshold pivot selection is used to factor a basis. The routine \pgmid{dy_initbasis} is used to initialise the basis module. The capacity of the basis, algorithm options, and numeric tolerances are set at initialisation (\vid \secref{sec:GLPKBasisInit}). The basis is deleted by the routine \pgmid{dy_freebasis}. Changing the basis capacity is implemented in \dylp by saving options and tolerances for the existing basis, deleting the existing basis, and creating a new basis of the appropriate size. The capacity is checked each time the basis is factored; changes are invisible to clients. The \glpk basis module will resize its own internal data structures whenever it determines that this is required. In the main, \dylp uses the basis module in a standard way for factoring and pivoting. There are some departures from \glpk defaults: \begin{itemize} \item The initial size of the sparse vector working area is tripled. \item The limit on element growth (\pgmid{luf.max_gro}) is reduced from $10^{12}$ to $10^6$. \item The minimum value for elements on the diagonal of the factorisation (\pgmid{luf_basis.upd_tol} is reduced from $10^{-6}$ to $10^{-10}$. \item Instead of a fixed default of $.1$, the pivot stability tolerance is dynamically adjusted in a range between $.01$ and $.95$ based on \dylp's assessment of the numerical stability of the current basis. The number of pivot candidates examined when factoring the basis is also adjusted in the range $4$ to $10$. More candidates are considered as the stability requirement is raised in the hope of finding a numerically stable candidate without compromising sparsity. \end{itemize} The routine \pgmid{dy_setpivparms} is provided to adjust the pivot stability tolerance and pivot candidate limit. Adjustment of the pivot selection parameters is done according to a fixed schedule of tolerance and limit values kept in the static data structure \coderef{dy_basis.c}{pivtols}. The client specifies an integer delta which is used to select a pair of values from the schedule. Pre- and post-multiplication of vectors by the basis inverse are provided by the routines \pgmid{dy_ftran} and \pgmid{dy_btran}, respectively. \subsection{Factoring} \label{sec:BasisFactoring} For factoring the basis, the routine \pgmid{dy_factor} provides significant error recovery functions on top of the basic abilities of \glpk. The call structure is shown in Figure \ref{fig:FactorCallGraph}. \begin{figure}[htb] \centering \includegraphics{\figures/factorcalls} \caption{Call Graph for \protect\pgmid{dy\_factor}} \label{fig:FactorCallGraph} \end{figure} A singular basis can occur because of a simplex pivot attempt or as the result of a change in the coefficients of the basis because the client has fixed variables and then requested a warm or hot start. The factoring routine \pgmid{glp_inv_decomp} detects a singular basis and reports the unpivoted rows and columns, but does not attempt to fix the basis. \pgmid{adjust_basis} uses the information reported by \pgmid{glp_inv_decomp} to attempt to patch the basis, substituting columns associated with slack variables for the set of columns identified as singular. This sequence is repeated until the basis is successfully factored. In the larger context of \dylp, patching the basis is the least of the work. \pgmid{dy_factor} will call \pgmid{adjust_therest} to adjust the \dylp data structures as necessary to reflect the exchange of variables between the basic and nonbasic partitions. Depending on the phase, this can include updating the structures which maintain the basis, recalculating the primal (\pgmid{dy_calcprimals}) and dual (\pgmid{dy_calcduals}) variables, recalculating the reduced costs (\pgmid{dy_calccbar}), resetting the DSE or PSE norms (\pgmid{dy_dseinit} and \pgmid{dy_pseinit}, respectively), clearing the list of variables marked ineligible for pivoting (\pgmid{dy_clrpivrej}), and backing out a perturbed subproblem (\pgmid{dy_degenout}). \pgmid{glp_inv_decomp} will abort an attempt to factor the basis if the current pivot selection parameters give rise to numerical instability (detected as excessive growth in the magnitude of the coefficients of the factored basis). \pgmid{dy_factor} will make repeated tries to factor the basis, tightening the pivot selection parameters before each attempt. It will admit failure only if the numerical instability remains after the pivot selection tolerances have been tightened as much as possible, so that each pivot chosen is the maximum coefficient remaining in the unpivoted portion of the basis. \subsection{Pivoting} \label{sec:BasisPivoting} Pivoting is performed by \pgmid{dy_pivot}, which confirms the numerical stability of the pivot element and calls \pgmid{glp_inv_update} to pivot the basis. To be judged numerically stable, a prospective pivot coefficient $\overline{a}_{ij}$ must exceed the product of the \glpk stability multiplier (\pgmid{luf.piv_tol}), the \dylp pivot selection multiplier (\pgmid{dy_tols.pivot}), and the maximum element in the transformed column $\overline{a}_j = B^{\,-1}a_j$ (primal simplex) or row $\overline{a}_i = \beta_i N$ (dual simplex). Standard defaults in \dylp are $5 \times 10^{-2}$ for the \glpk stability multiplier and $1 \times 10^{-5}$ for the \dylp pivot selection multiplier, so that the pivot coefficient is required to satisfy $\abs{\overline{a}_{ij}} > (5 \times 10^{-7})(\max_k \abs{\overline{a}_{kj}})$ (primal simplex) or $\abs{\overline{a}_{ij}} > (5 \times 10^{-7})(\max_k \abs{\overline{a}_{ik}})$ (dual simplex). The routine \pgmid{dy_chkpiv} is supplied to perform this test, and is used as a qualification test by the routines which select the leaving primal variable in primal simplex and the entering primal variable in dual simplex. The check performed in \pgmid{dy_pivot} should not fail, but is retained as a precaution. If $\overline{a}_{ij}$ is rejected as numerically unstable, the pivot attempt is aborted. In primal simplex, the entering variable $x_j$ will be placed on the rejected pivot list. For dual simplex, the leaving variable $x_i$ is placed on the rejected pivot list. Recovery from pivoting problems and the handling of the rejected pivot list are discussed in \secref{sec:ErrorRecovery}. A pivot can also fail if it results in a singular basis or if the basis representation runs out of space. The implementation of \glpk requires that the basis be reloaded and factored to recover from these errors; this is orchestrated by \pgmid{dy_duenna} and discussed in \secref{sec:ErrorRecovery}. Note that \pgmid{glp_inv_update} expects to be supplied with $L^{-1}a_j$ as a hidden parameter. \glpk provides the capability to control whether a call to \pgmid{glp_inv_ftran} sets this hidden parameter. This capability is exposed to clients as the second parameter to \pgmid{dy_ftran}. DyLP-1.6.0/DyLP/doc/dynamic.tex0000644000076700007670000003100311171477034013011 0ustar \section{Dynamic Simplex} \label{sec:DynamicSimplex} \subsection{Normal Algorithm Flow} \label{sec:NormalDynamicFlow} Figure~\ref{fig:DylpFlow} gives the normal flow of the dynamic simplex algorithm implemented in \dylp. \begin{figure} \centering \includegraphics{\figures/dylpnormalflow} \caption{Dynamic Simplex Algorithm Flow} \label{fig:DylpFlow} \end{figure} The outcomes included in the normal flow of the algorithm are primal optimality, infeasibility, and unboundedness, and dual optimality and unboundedness. Other outcomes (\eg, loss of dual feasibility during dual simplex, or numerical instability) are discussed in \secref{sec:ErrorRecovery}. The implementation of the dynamic simplex algorithm is structured as a finite state machine, with six normal states, primal simplex, dual simplex, deactivate variables, activate variables, deactivate constraints, and activate constraints; two user-supplied states, generate variables and generate constraints; and three error recovery states, force primal feasibility, force dual feasibility, and force full constraint system. State transitions are determined by the previous state, the type of simplex in use, and the outcome of actions in a state. As described in \secref{sec:Startup}, \dylp establishes an initial active constraint system, determines whether the system is primal or dual feasible, and chooses the appropriate simplex as the starting phase. The most common execution pattern is as described in the Introduction: The initial active constraint system is neither primal or dual feasible. Primal simplex is used to solve this system to optimality. A minor loop then activates variables with favourable reduced cost and reoptimises using primal phase~II\@. This loop repeats until no variables can be activated; at this point the solution is optimal for the active constraints, over all variables. The algorithm then attempts to activate violated constraints; if none are found, the solution is optimal for the original problem. After violated constraints are activated, loose constraints are deactivated and dual simplex is used to reoptimise. When an optimal solution is reached, the algorithm attempts to activate variables with favourable reduced cost and return to the `primal phase~II -- activate variables' minor loop. If no variables can be activated, the algorithm attempts to activate violated constraints. If none are found, the solution is optimal for the original problem. If violated constraints are activated, then an attempt is made to activate dual feasible variables and dual simplex is used to reoptimise. There is an obvious asymmetry in the use of primal and dual simplex. When primal simplex reaches an optimal solution, the `primal phase~II -- activate variables' minor loop iterates until no useful variables remain to be activated. Only then does the algorithm activate violated constraints and move to dual simplex. The analogous minor loop for dual simplex would be to add violated constraints (dual variables with favourable reduced costs) and reoptimise with dual simplex until no violated constraints remain. Instead, the algorithm attempts to add variables and return to primal simplex; failing that, it will add both violated constraints and dual feasible variables (satisfied dual constraints). The purpose of this asymmetry is two-fold: It acknowledges that primal infeasibility is much more likely than primal unboundedness when solving LPs in the context of a branch-and-cut algorithm, and it attempts to avoid the large swings in the values of primal variables which often accompany dual unboundedness. Dual simplex moves between primal infeasible basic solutions which can be at a large distance from the primal feasible region and at a large distance from one another in the primal space. This presents a challenge for numerical stability. Because the primal simplex remains within the primal feasible region, primal unboundedness does not present the same difficulty. To avoid cycling by repeatedly deactivating and reactivating the same constraint when the dimension of the optimal face is greater than one, constraint deactivation is skipped unless there has been an improvement in the objective function since the previous constraint deactivation phase. This guarantees that the simplex will not return to a previous extreme point. If primal simplex finds that the active system is infeasible, the algorithm will attempt to activate variables with favourable reduced cost under the phase~I objective function (\vid \secref{sec:PrimalSimplex}) and resume primal phase~I\@. If no variables can be found, the original problem is infeasible. If primal simplex finds that the active system is unbounded, the algorithm first attempts to activate bounding constraints which will not cause the loss of primal feasibility. If such constraints can be found, execution returns to primal phase~II\@. If no such constraints can be found, or primal feasibility is not an issue, all violated constraints are added and execution moves to dual simplex. If no violated constraints can be found, the full constraint system is activated. If primal simplex again returns an indication of unboundedness, the original problem is declared to be unbounded. The effort expended before indicating a problem is unbounded acknowledges that unboundedness is expected to be extremely rare in \dylp's intended application. If dual simplex finds that the active system is dual unbounded (primal infeasible), the algorithm first attempts to activate dual bounding constraints (primal variables) which will not cause the loss of dual feasibility. If such dual constraints can be found, execution returns to dual simplex. If no such dual constraints can be found, the algorithm will attempt to activate variables with favourable reduced cost under the primal phase~I objective function and continue with primal phase~I\@. \subsection{Error Recovery} \label{sec:ErrorRecovery} A substantial amount of \dylp's error recovery capability is hidden within the primal and dual simplex algorithms. It is also possible to use the capabilities present in a dynamic simplex algorithm to attempt error recovery at this level. The dynamic simplex algorithm modifies the constraint system as part of its normal execution. This ability can be harnessed to force a transition from one simplex to another when one simplex runs into trouble. The actions described in this section are fully integrated with the actions described in \secref{sec:NormalDynamicFlow}. They are described separately to avoid reducing Figure~\ref{fig:DylpFlow} to an incomprehensible snarl of state transitions. \noindent \textbf{Primal Simplex} The error recovery actions associated with the primal simplex algorithm are shown in Figure~\ref{fig:DynErrRecPrimal}. \begin{figure} \centering \includegraphics{\figures/primalerrorflow} \caption{Error Recovery Actions for Primal Simplex Error Outcomes} \label{fig:DynErrRecPrimal} \end{figure} There are five conditions of interest, excessive change in the value of primal variables (excessive swing), stalling (stall), inability to perform a pivot (punt), numerical instability (accuracy check), and other errors (other error). Excessive change (`swing') in the value of a primal variable during primal simplex is taken as an indication that the primal problem is verging on unboundedness. Swing is defined as $(\textrm{new value})/(\textrm{old value})$. \dylp's default tolerance for this ratio is $10^{15}$. The action taken is the same as that used for normal detection of unboundedness, with the exception that the algorithm will always return to primal simplex. When primal simplex stalls or is forced to punt, the strategy is to attempt to modify the constraint system so that the simplex algorithm will be able to choose a new pivot and again make progress toward one of the standard outcomes of optimality, infeasibility, or unboundedness. The specific actions vary slightly depending on whether primal feasibility has been achieved. If primal simplex is still in phase~I, the first action is to try to activate variables which have a favourable reduced cost under the phase~I objective. If this succeeds, execution returns to primal simplex. If no variables can be found, the algorithm will attempt to activate violated constraints; if successful, execution returns to primal simplex. If no variables or constraints have been activated, there is no point in returning to primal simplex as the outcome will be unchanged. In this case, the algorithm will attempt to force dual feasibility by deactivating variables whose reduced costs are not dual feasible (\ie, deactivate unsatisfied dual constraints). If this succeeds, the algorithm will deactivate loose constraints (dual variables) to reduce the chance of dual unboundedness and continue with dual simplex. Failing all the above, the ultimate action is to active the full constraint system and attempt to solve it with primal or dual simplex. This can be done only once, to avoid a cycle in which the full system is activated, pared down while forcing primal or dual feasibility, and then reactivated when lesser measures again fail. When a stall or punt occurs in primal phase~II, the first action is again to attempt to activate variables with a favourable reduced cost. However, if no new variables can be found, the algorithm immediately attempts to force dual feasibility. Only if this can be achieved will it proceed to activate violated constraints, deactivate loose constraints, and proceed to dual simplex. Failure to force dual feasibility or to activate any constraints causes forced activation of the full constraint system as described above. Both the primal and dual simplex algorithm incorporate extensive checks and error recovery actions to detect and recover from numerical instability. By the time a simplex gives up and reports that it cannot overcome numerical problems, there is little to be done but force activation of the full constraint system for one last attempt. Other errors indicate algorithmic failures within the simplex algorithms (\eg, failure to acquire resources, or conditions not anticipated by the code) and no attempt is made to recover at the dynamic simplex level. \noindent \textbf{Dual Simplex} The error recovery actions associated with the dual simplex algorithm are shown in Figure~\ref{fig:DynErrRecDual}. \begin{figure} \centering \includegraphics{\figures/dualerrorflow} \caption{Error Recovery Actions for Dual Simplex Error Outcomes} \label{fig:DynErrRecDual} \end{figure} In addition to the five outcomes cited for primal simplex, loss of dual feasibility (lost dual feasibility) can be reported by the dual simplex algorithm. (Loss of primal feasibility is handled internally by the primal simplex, which simply returns to phase~I simplex iterations.) When the dual simplex algorithm loses feasibility, the algorithm will attempt to force dual feasibility by deleting the offending dual constraints (primal variables). If this succeeds, it will attempt to activate feasible dual constraints and return to dual simplex. If dual feasibility cannot be restored, the algorithm attempts to activate variables with favourable reduced costs under the primal phase~I objective and executes primal phase~1\@. Excessive change in the value of primal variables during dual simplex is taken as an indication that the dual algorithm is moving between basic solutions which are far outside the primal feasible region and far from each other. When excessive change in a primal variable is detected, the algorithm attempts to activate primal constraints which will bound this motion. If this is successful, execution of dual simplex resumes. General activation of violated primal constraints is not attempted as it is less likely to bound the primal swing. If no bounding constraints can be found, the algorithm attempts to activate feasible dual constraints and return to dual simplex. If no such constraints can be found, the algorithm attempts to activate variables with favourable reduced costs under the primal phase~I objective and executes primal phase~1\@. When dual simplex reports that it has stalled or cannot execute necessary pivots, the algorithm first attempts to activate violated primal constraints. If such constraints can be activated, execution returns to dual simplex. If no constraints can be found, the algorithm attempts to force primal feasibility by deactivating violated primal constraints. Depending on the result of this action, the algorithm attempts to activate variables with favourable reduced costs under the primal phase~I or phase~II objective and executes primal simplex. Loss of numerical stability and other errors are handled as for primal simplex. DyLP-1.6.0/DyLP/doc/makefile.dylpdoc.in0000644000076700007670000000655211263240452014412 0ustar # Partial makefile for LaTeX documents. Use with build script to scan log # file and detect the need for additional LaTeX runs. SRCDIR = @abs_srcdir@ ISLDIR = @abs_srcdir@/Figures PICSRCDIR = @abs_srcdir@ BIBDIR = $(TEXMFHOME)/bibtex ISLUPICS = Figures/conmgmtcalls.epsu \ Figures/dualpivcalls.epsu \ Figures/dualcalls.epsu \ Figures/dual2flow.epsu \ Figures/dualerrorflow.epsu \ Figures/dylpnormalflow.epsu \ Figures/factorcalls.epsu \ Figures/primal1flow.epsu \ Figures/primal2flow.epsu \ Figures/primalcalls.epsu \ Figures/primalerrorflow.epsu \ Figures/primalpivcalls.epsu \ Figures/startupflow.epsu \ Figures/varmgmtcalls.epsu # dylp.tex is the root file. DYLPSRC = $(SRCDIR)/accuracy.tex \ $(SRCDIR)/antidegenlite.tex \ $(SRCDIR)/conmgmt.tex \ $(SRCDIR)/debug.tex \ $(SRCDIR)/dual.tex \ $(SRCDIR)/dylp.tex \ $(SRCDIR)/dynamic.tex \ $(SRCDIR)/interface.tex \ $(SRCDIR)/intro.tex \ $(SRCDIR)/lpbasis.tex \ $(SRCDIR)/notation.tex \ $(SRCDIR)/perturbed.tex \ $(SRCDIR)/pricing.tex \ $(SRCDIR)/primal.tex \ $(SRCDIR)/scaling.tex \ $(SRCDIR)/solutions.tex \ $(SRCDIR)/startup.tex \ $(SRCDIR)/statistics.tex \ $(SRCDIR)/updateformulae.tex \ $(SRCDIR)/varmgmt.tex DYLPFIGSRC = $(SRCDIR)/dylpfigs.tex BIBSRC = $(BIBDIR)/bib/dylp.bib $(ISLUPICS:.epsu=.eps): Figures/%.eps: $(PICSRCDIR)/Figures/%.epsu \ $(ISLDIR)/epsupatch.sed @echo "munching $< to produce $@" @sed -n -f $(ISLDIR)/epsupatch.sed < $< > $@ $(ISLXPICS:.epsx=.eps): Figures/%.eps: $(PICSRCDIR)/Figures/%.epsx \ $(ISLDIR)/epsupatch.sed $(ISLDIR)/epsxpatch.sed $(ISLDIR)/epsxpatch.ps @echo "munching $< to produce $@" @sed -n -f $(ISLDIR)/epsupatch.sed < $< | \ sed -f $(ISLDIR)/epsxpatch.sed > $@ %.pdf: %.eps @echo "munching $< to produce $@" @epstopdf --outfile=$@ $< dylp: dylp.dvi dylpfigs: dylpfigs.dvi %.dvi: $(SRCDIR)/%.tex @echo "TeXing $< to produce $@ ..." @latex $< @echo "done." # Intended to be used with make -q to determine if *.bbl needs to be rebuilt # due to changes in bib files. dylp.bbl: $(BIBSRC) $(BIBDIR)/bst/louplain.bst bibtex $(basename $@) # The .bbl file (and BIBSRC) are deliberately excluded here, so that we'll # only indicate a need to run LaTeX based on direct source files. The build # script will force LaTeX if it runs BibTeX. dylpabsdir.tex is generated during # configure. dylp.dvi: $(DYLPSRC) dylpabsdir.tex \ $(TEXMFHOME)/tex/latex/loustandard.sty \ $(TEXMFHOME)/tex/latex/loubookman.sty \ $(TEXMFHOME)/tex/latex/loumath.sty \ $(TEXMFHOME)/tex/latex/codedocn.sty \ $(ISLUPICS:.epsu=.eps) # The easy way out. dylp.pdf: dylp.dvi \ $(ISLUPICS:.epsu=.pdf) @echo "TeXing $(<:.dvi=.tex) to produce $@ ..." @pdflatex $(<:.dvi=.tex) @echo "done." dylpfigs.dvi: dylpfigs.tex \ $(TEXMFHOME)/tex/latex/loustandard.sty \ $(TEXMFHOME)/tex/latex/loubookman.sty \ $(ISLUPICS:.epsu=.eps) clean: @rm -f $(ISLUPICS:.epsu=.eps) @rm -f $(ISLXPICS:.epsx=.eps) @rm -f $(ISLUPICS:.epsu=.pdf) @rm -f $(ISLXPICS:.epsx=.pdf) @rm -f $(patsubst $(SRCDIR)/%.tex,%.aux,$(DYLPSRC) $(DYLPFIGSRC)) @rm -f $(patsubst $(SRCDIR)/%.tex,%.dvi,$(DYLPSRC) $(DYLPFIGSRC)) @rm -f $(patsubst $(SRCDIR)/%.tex,%.log,$(DYLPSRC) $(DYLPFIGSRC)) @rm -f $(patsubst %.tex,%.bbl,dylp.tex dylpfigs.tex) @rm -f $(patsubst %.tex,%.blg,dylp.tex dylpfigs.tex) @rm -f $(patsubst %.tex,%.toc,dylp.tex) @rm -f $(patsubst %.tex,%.lof,dylp.tex) @rm -f $(patsubst %.tex,%.lot,dylp.tex) DyLP-1.6.0/DyLP/doc/startup.tex0000644000076700007670000002507511171477034013103 0ustar \section{Startup} \label{sec:Startup} \dylp provides a cold, warm, and hot start capability. For a cold start, \dylp selects a set of constraints and variables to be the initial active constraint system and then crashes a basis. For a warm start, \dylp expects that the caller will supply a basis but assumes that the active constraint system and other data structures need to be built to this specification. For a hot start, \dylp assumes that its internal data structures are valid except for possible modifications to variable bounds, objective coefficients, or right-hand-side coefficients. It will incorporate these modifications and continue with simplex iterations. \dylp will default to attempting a hot start unless specifically requested to perform a warm or cold start. For all three start types, \dylp will evaluate the constraint system for primal and dual feasibility, choosing primal simplex unless the constraint system is dual feasible and primal infeasible. It is not possible to perform efficient and foolproof checks to determine if the client has violated the restrictions imposed for a hot start. At minimum, such a check would require a coefficient by coefficient comparison of the constraint system supplied as a parameter with the copy held by \dylp from the previous call. It is the responsibility of the client to notify \dylp if variable bounds, objective coefficients, or right-hand-side coefficients have been changed. \dylp will scan for changes and update its copy of the constraint system only if the client indicates a change. Section~\ref{sec:DylpInterface} provides detailed information on the options used to control \dylp's startup actions. The startup sequence for \dylp is shown in Figure~\ref{fig:DylpStartupFlow}. \begin{figure} \includegraphics{\figures/startupflow} \caption{\dylp startup sequence} \label{fig:DylpStartupFlow} \end{figure} The first actions are determined by the purpose of the call. The call may be solely to free retained data structures; if so, this is done and the call returns. The next action is to determine the type of start --- hot, warm, or cold --- requested by the client. If a warm or cold start is requested, any state retained from the previous call is useless and all retained data structures are freed. For all three types of start, options and tolerances are updated to reflect the parameters supplied by the client. For a warm or cold start, the constraint system is examined to see if it should be scaled, and the options specified by the client are examined to see if scaling is permitted. If this assessment determines that scaling is advisable and permitted, the constraint system is scaled as described in \secref{sec:Scaling}. The original constraint system is cached and replaced by the scaled copy. In the case of a hot start, the existing scaled copy, if present, is retrieved for use. The original system is not consulted again until the solution is packaged for return to the client. Following scaling, the active constraint system is constructed for a warm or cold start, or modified for a hot start; \S\S\ref{sec:ColdStart}~--~\ref{sec:HotStart} describe the actions in detail. At the completion of this activity, the active constraint system is assessed for primal and dual feasibility and an appropriate simplex phase is chosen. Once the constraint system is constructed, common initialisation actions are performed: Data structures are initialised for PSE and DSE pricing, for the perturbation-based antidegeneracy algorithm, and for the pivot rejection algorithm. To complete the startup sequence, \dylp evaluates the constraint system and client options to determine if it should perform constraint activation or variable activation or deactivation before starting simplex iterations. Variable deactivation is mutually exclusive to constraint and variable activation; the former is considered only during a cold start, the latter only during a warm or hot start. An initial round of variable deactivation is performed during a cold start if the number of active variables exceeds the number specified by the \pgmid{coldvars} option. This activity is intended to reduce the initial size of constraint systems with very large numbers of variables (\eg, set covering formulations). Constraint or variable activation, or both, are performed during a warm or hot start if requested by the client. Constraint activation is performed before variable activation. If initial constraint activation is requested, \dylp will add all violated constraints to the active system. If constraints are added, primal feasibility will be lost, and \dylp will reassess the choice of initial simplex phase. If initial variable activation is requested, the action taken depends on the initial simplex phase. If \dylp will enter primal simplex, variables with favourable primal reduced costs are activated, evaluated under the phase~I or phase~II objective as appropriate. For dual simplex, variables which will tend to bound the dual problem are selected for activation: For each infeasible primal basic variable (nonbasic dual variable with favourable reduced cost), primal variables with optimal reduced costs (feasible dual constraints) which will bound motion in the direction of the incoming dual variable are selected for activation. \subsection{Cold Start} \label{sec:ColdStart} \dylp performs a cold start in two phases. The first phase, implemented in \pgmid{dy_coldstart}, constructs the initial active constraint system. The second phase, implemented in \pgmid{dy_crash}, constructs the initial basis. To construct the initial active constraint system, \pgmid{dy_coldstart} first checks to see if the client has specified that the full constraint system should be used. In this case, the active system will be the entire constraint system and the dynamic simplex algorithm will reduce to a single execution of either primal or dual simplex. If the client specifies that \dylp should work with a partial constraint system, the constraints are first separated into equalities and inequalities. All equalities are included in the initial active system. The remaining inequalities are sorted, using the angle of the constraint normal $a_i$ to the objective function normal $c$ as the figure of merit, \begin{equation*} a_i \angle c = \frac{180}{\pi} \cos^{-1} \frac{a_i \cdot c}{\norm{a_i}\norm{c}} \end{equation*} Consider a minimisation objective and `$\leq$' inequalities. The normals of the inequalities point out of the feasible region, and the normal of the objective function will point into the feasible region at optimality. Hence a constraint whose normal forms an angle near \degs{180} with the normal of the objective should be more likely to be active at optimum. A constraint whose normal forms an angle near \degs{0} is more likely to define a facet on the far side of the polytope. Unfortunately, `more likely' is not certainty, and it's easy to construct simple two-dimensional examples where the normal of one of the constraints active at optimality forms an acute angle with the normal of the objective function. \dylp allows the client to specify one or two angular intervals and a sampling fraction which are used to select inequalities to add to the initial active system. By default, the initial system will be populated with 50\% of the inequalities which form angles in the intervals $[\degs{0},\degs{90})$ and $(\degs{90},\degs{180}]$. (\textit{I.e.}, inequalities whose normals are perpendicular to the objective normal are excluded entirely, and half of all other inequalities will be added to the initial active system.) The inequalities selected will be spread evenly across the specified range(s). \dylp will activate all variables referenced by each constraint. Once the initial constraint system is populated, \pgmid{dy_crash} is called to select an initial basis. \dylp offers three options for the initial basis, called `logical', `slack', and `architectural'. A logical basis is the standard unit basis composed of slack and artificial (logical) variables for the active constraints. A slack basis again uses slack variables for inequalities, but attempts to select architectural variables for equalities, including artificial variables only if necessary. An architectural basis attempts to choose architectural variables for all constraints, selecting slack and artificial variables only when necessary. There are many qualities which are desirable in an initial basis, and they are often in conflict. A logical basis is trivially easily to construct, factor, and invert, and has excellent numerical stability. On the other hand, such a basis is hardly likely to be the optimal basis. When choosing architectural variables, free variables are highly desirable since they will never leave the basis. In addition, \dylp's basis construction algorithm tries to select architectural variables which will form an approximately lower-diagonal matrix and provide numerically stable pivots. Constructing a matrix which is approximately lower-diagonal minimises fill-in when the basis is factored. Several of the ideas implemented in \dylp's initial basis construction algorithms are described by Bixby in~\cite{Bix92a}. Since \dylp makes an effort to populate the constraint system with constraints that should be tight at optimality, an architectural basis is the default. \subsection{Warm Start} \label{sec:WarmStart} The routine \pgmid{dy_warmstart} implements a warm start. The client is expected to supply an initial basis, expressed as a set of active constraints and corresponding basic variables. By default, \dylp will activate all variables referenced by each constraint. As an option, the client can specify an initial set of active variables. \subsection{Hot Start} \label{sec:HotStart} For a hot start, \dylp assumes that all internal data structures are exactly as they were when it last returned to the client. Changes to the constraint system must be confined to the right-hand-side, objective, and variable upper and lower bound vectors, so that the basis factorisation and inverse are not affected. The client is responsible for indicating to \dylp which of these vectors have been changed. The routine \pgmid{dy_hotstart} scans the changed vectors and orchestrates any updates to the corresponding data structures in the active constraint system. Unlike a cold or warm start, the basis is \textit{not} factored prior to resuming pivots. \dylp assumes that the basis was refactored as part of the normal preoptimality sequence prior to the last return to the client and that no intervening pivots have occurred. Any numerical problems arising from the modifications specified by the client will be picked up in the normal course of dynamic simplex execution. DyLP-1.6.0/DyLP/doc/notation.tex0000644000076700007670000001537511263240452013230 0ustar \section{Notation} \label{sec:Notation} \dylp works naturally with the minimisation problem \begin{equation} \begin{split} \min \enspace cx & \\ Ax & \leq b \\ l \leq x & \leq u \end{split} \label{Eqn:BoundedPrimal} \end{equation} Add slack variables $s$ and partition $\begin{bmatrix} A & I \end{bmatrix}$ into basic and nonbasic portions as \begin{equation*} \begin{split} \begin{bmatrix} B & N \end{bmatrix} = \left[ \begin{array}{cc|cc} B^t & 0 & N^t & I^t \\ B^l & I^l & N^l & 0 \end{array} \right] \end{split} \end{equation*} with corresponding partitions \begin{math} \trans{\begin{bmatrix} x^B & s^B & x^N & s^N \end{bmatrix}} \end{math} for $x$, $s$, and \begin{math} \trans{\begin{bmatrix} b^t & b^l\end{bmatrix}} \end{math} for $b$. The objective $c$ is augmented with 0's in the columns corresponding to the slack variables, and partitioned as \begin{math} \begin{bmatrix} c^B & 0 & c^N & 0 \end{bmatrix} \end{math}. The basis inverse will be \begin{equation} \inv{B} = \begin{bmatrix} \inv[0]{(B^t)} & 0 \\ -B^l\inv[0]{(B^t)} & I^l \end{bmatrix} \label{Eqn:PrimalBasisInverse} \end{equation} We then have \begin{equation} \begin{split} \begin{bmatrix} x^B \\ s^B \end{bmatrix} & = \, \inv{B}b - \inv{B} N \begin{bmatrix} x^N \\ s^N \end{bmatrix} \\ % & = \begin{bmatrix} \inv[0]{(B^t)} b^t \\ b^l - B^l\inv[0]{(B^t)} b^t \end{bmatrix} - \begin{bmatrix} \inv[0]{(B^t)} N^t & \inv[0]{(B^t)} \\ N^l - B^l\inv[0]{(B^t)}N^t & -B^l\inv[0]{(B^t)} \end{bmatrix} \begin{bmatrix} x^N \\ s^N \end{bmatrix} \end{split} \label{Eqn:PrimalBasicVars} \end{equation} and \begin{equation} \begin{split} z & = \begin{bmatrix} c^B & 0 \end{bmatrix} \trans{\begin{bmatrix} x^B & s^B \end{bmatrix}} + \begin{bmatrix} c^N & 0 \end{bmatrix} \trans{\begin{bmatrix} x^N & s^N \end{bmatrix}} \\ & = \begin{bmatrix} c^B & 0 \end{bmatrix}\inv{B}b + \left( \begin{bmatrix} c^N & 0 \end{bmatrix} - \begin{bmatrix} c^B & 0 \end{bmatrix} \inv{B} N \right) \trans{\begin{bmatrix} x^N & s^N \end{bmatrix}} \\ & = c^B \inv[0]{(B^t)} b^t + \begin{bmatrix} c^N - c^B \inv[0]{(B^t)} N^t & -c^B\inv[0]{(B^t)} \end{bmatrix} \trans{\begin{bmatrix} x^N & s^N \end{bmatrix}} \end{split} \label{Eqn:PrimalObj} \end{equation} The quantities $\trans{\begin{bmatrix} x^B & s^B \end{bmatrix}} = \overline{b} = \inv{B}b$ are the values of the basic variables, the quantities $y = \begin{bmatrix} c^B & 0 \end{bmatrix}\inv{B}$ are the dual variables, and the quantities $\overline{c} = \left( \begin{bmatrix} c^N & 0 \end{bmatrix} - \begin{bmatrix} c^B & 0 \end{bmatrix} \inv{B} N \right)$ are the reduced costs. A row or column of $\inv{B}N$ (as appropriate to the context) will be denoted $\overline{a}_k$ (the single subscript distinguishes it from an individual element $\overline{a}_{ij}$). A row or column of $\inv{B}$ (as appropriate to the context) will be denoted $\beta_k$. When discussing pivot selection calculations, $\Delta_j$ will be the change in nonbasic variable $x_j$ or $s_j$. The dual problem is formed by first converting \eqref{Eqn:BoundedPrimal} to $\max\: -cx$, giving \begin{equation*} \begin{split} \min \enspace & yb \\ & y A \geq -c \\ & y \geq 0 \end{split} \end{equation*} Add surplus variables $\sigma$ and partition $\trans{\begin{bmatrix}A & -I \end{bmatrix}}$ into basic and nonbasic portions as \begin{equation*} \addtolength{\extrarowheight}{3pt} \begin{bmatrix} \mathcal{B} \\ \mathcal{N} \end{bmatrix} = \left[ \begin{array}{cc} 0 & -I^\mathcal{B} \\ B^t & N^t \\ \hline -I^\mathcal{N} & 0 \\ B^l & N^l \end{array} \right] \end{equation*} with corresponding partitions \begin{math} \begin{bmatrix} \sigma^\mathcal{B} & y^\mathcal{B} & \sigma^\mathcal{N} & y^\mathcal{N} \end{bmatrix} \end{math} for $y$, $\sigma$, and \begin{math} \begin{bmatrix} c^B & c^N \end{bmatrix} \end{math} for $c$. The right-hand side $b$ is augmented with 0's in the rows corresponding to the surplus variables and partitioned as \begin{math} \trans{\begin{bmatrix} 0 & b^t & 0 & b^l \end{bmatrix}} \end{math}. The basis inverse will be \begin{equation*} \inv[-2]{\mathcal{B}} = \begin{bmatrix} \inv[0]{(B^t)} N^t & \inv[0]{(B^t)} \\ -I^\mathcal{B} & 0 \end{bmatrix}. \end{equation*} We then have \begin{equation} \begin{split} \begin{bmatrix} \sigma^\mathcal{B} & y^\mathcal{B} \end{bmatrix} & = (-c)\inv[-2]{\mathcal{B}} - \begin{bmatrix} \sigma^\mathcal{N} & y^\mathcal{N} \end{bmatrix} \mathcal{N}\inv[-2]{\mathcal{B}} \\ & = \begin{bmatrix} c^N - c^B \inv[0]{(B^t)} N^t & -c^B \inv[0]{(B^t)} \end{bmatrix} - \begin{bmatrix} \sigma^\mathcal{N} & y^\mathcal{N} \end{bmatrix} \begin{bmatrix} -\inv[0]{(B^t)} N^t & -\inv[0]{(B^t)} \\ B^l\inv[0]{(B^t)} N^t - N^l & B^l\inv[0]{(B^t)} \end{bmatrix} \label{Eqn:DualBasicVars} \end{split} \end{equation} and \begin{equation} \begin{split} z & = \begin{bmatrix} \sigma^\mathcal{B} & y^\mathcal{B} \end{bmatrix} \trans{\begin{bmatrix} 0 & b^t \end{bmatrix}} + \begin{bmatrix} \sigma^\mathcal{N} & y^\mathcal{N} \end{bmatrix} \trans{\begin{bmatrix} 0 & b^l \end{bmatrix}} \\ & = (-c)\inv[-2]{\mathcal{B}} b^\mathcal{B} + \begin{bmatrix} \sigma^\mathcal{N} & y^\mathcal{N} \end{bmatrix} (b^\mathcal{N} - \mathcal{N}\inv[-2]{\mathcal{B}} b^\mathcal{B}) \\ & = -c^B \inv[0]{(B^t)} b^t + \begin{bmatrix} \sigma^\mathcal{N} & y^\mathcal{N} \end{bmatrix} \begin{bmatrix} \inv[0]{(B^t)} b^t \\ b^l - B^l\inv[0]{(B^t)} b^t \end{bmatrix} \end{split} \label{Eqn:DualObj} \end{equation} When discussing pivot selection calculations, $\delta_j$ will be the change in nonbasic dual variable $y_j$ or $\sigma_j$. There are several points to note about the relationship between primal and dual simplex in the \dylp implementation. First, \dylp does not solve $\max \; -cx$ as a surrogate for $\min \, cx$. It minimises $cx$ directly by algorithmic design. Hence the dual variables $y = c^B \inv{B}$ have the wrong sign for the dual problem, and are calculated solely as a convenience. The dual algorithm actually works with the reduced costs $\overline{c}^N = c^N - c^B \inv{B} N$, which are the correct dual variable values (compare \eqnref{Eqn:PrimalObj} with \eqnref{Eqn:DualBasicVars}). Second, because primal simplex provides $\inv{B} N = - \mathcal{N} \inv[-2]{\mathcal{B}}$ (compare \eqnref{Eqn:PrimalBasicVars} with \eqnref{Eqn:DualBasicVars}), the relevant calculation when determining the leaving dual variable is $\overline{c}_k + \overline{a}_{ik} \delta_i$, rather than $ \overline{c}_k - \overline{a}_{ik} \delta_i$. Throughout the remainder of the report, let $e_k \in R^d$ be a row or column vector of appropriate dimension (as determined by the context), with a 1 in position $k$ and 0's in all other positions. DyLP-1.6.0/DyLP/AUTHORS0000644000076700007670000000032310632415522011142 0ustar Lou Hafer (lou@cs.sfu.ca) is the author of dylp. The basis inverse code in the files glp*.[ch] was written by Andrew Makhorin and comes from the GLPK package. It is used by kind permission of the author. DyLP-1.6.0/DyLP/Makefile.in0000644000076700007670000007000011267165330012142 0ustar # Makefile.in generated by automake 1.9.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2006 International Business Machines and others. # All Rights Reserved. # This file is distributed under the Common Public License. # Author: Andreas Waechter IBM 2006-04-13 # Copyright (C) 2006, 2007 International Business Machines and others. # All Rights Reserved. # This file is distributed under the Common Public License. # Author: Andreas Waechter IBM 2006-04-13 ######################################################################## # Documentation installation # ######################################################################## srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = . am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ # We don't want to compile the test subdirectory, unless the test target is # specified. But we need to list it as subdirectory to make sure that it is # included in the tarball. Similarly, we don't want to attempt to build the # documentation unless specifically requested. @ALWAYS_FALSE@am__append_1 = test doc doc/Figures doc/TexMF DIST_COMMON = README $(am__configure_deps) \ $(srcdir)/../BuildTools/Makemain.inc $(srcdir)/../config.guess \ $(srcdir)/../config.sub $(srcdir)/../install-sh \ $(srcdir)/../ltmain.sh $(srcdir)/../missing \ $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/dylp_addlibs.txt.in $(top_srcdir)/configure \ $(top_srcdir)/examples/Makefile.in \ $(top_srcdir)/inc/config_dylp.h.in AUTHORS NEWS @HAVE_EXTERNALS_TRUE@am__append_2 = Externals @HAVE_EXTERNALS_TRUE@am__append_3 = .Externals-stamp subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ac_c_add_to_includes.m4 \ $(top_srcdir)/m4/ac_c_get_sunpro_libs.m4 \ $(top_srcdir)/m4/ac_dylp_equiv_for_cpp_bool.m4 \ $(top_srcdir)/m4/ac_dylp_find_fp_funcs.m4 \ $(top_srcdir)/m4/ac_dylp_fix_cppflags.m4 \ $(top_srcdir)/m4/ac_dylp_options.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno configure.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/inc/config_dylp.h CONFIG_CLEAN_FILES = examples/Makefile dylp_addlibs.txt SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-exec-recursive install-info-recursive \ install-recursive installcheck-recursive installdirs-recursive \ pdf-recursive ps-recursive uninstall-info-recursive \ uninstall-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = src/DylpStdLib src/Dylp examples test doc doc/Figures \ doc/TexMF DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ { test ! -d $(distdir) \ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -fr $(distdir); }; } DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ ADDLIBS = @ADDLIBS@ ADD_CFLAGS = @ADD_CFLAGS@ ADD_CXXFLAGS = @ADD_CXXFLAGS@ ALWAYS_FALSE_FALSE = @ALWAYS_FALSE_FALSE@ ALWAYS_FALSE_TRUE = @ALWAYS_FALSE_TRUE@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AUX_DIR = @AUX_DIR@ AWK = @AWK@ BUILDTOOLSDIR = @BUILDTOOLSDIR@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CDEFS = @CDEFS@ CFLAGS = @CFLAGS@ COINUTILSDOCDIR = @COINUTILSDOCDIR@ COINUTILSOBJDIR = @COINUTILSOBJDIR@ COINUTILSSRCDIR = @COINUTILSSRCDIR@ COIN_HAS_COINUTILS_FALSE = @COIN_HAS_COINUTILS_FALSE@ COIN_HAS_COINUTILS_TRUE = @COIN_HAS_COINUTILS_TRUE@ COIN_HAS_DYLP_FALSE = @COIN_HAS_DYLP_FALSE@ COIN_HAS_DYLP_TRUE = @COIN_HAS_DYLP_TRUE@ COIN_HAS_OSI_FALSE = @COIN_HAS_OSI_FALSE@ COIN_HAS_OSI_TRUE = @COIN_HAS_OSI_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEFS = @CXXDEFS@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DBG_CFLAGS = @DBG_CFLAGS@ DBG_CXXFLAGS = @DBG_CXXFLAGS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DYLPDOCDIR = @DYLPDOCDIR@ DYLPOBJDIR = @DYLPOBJDIR@ DYLPSRCDIR = @DYLPSRCDIR@ DYLP_ERRMSGDIR = @DYLP_ERRMSGDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FADDLIBS = @FADDLIBS@ FFLAGS = @FFLAGS@ HAVE_EXTERNALS_FALSE = @HAVE_EXTERNALS_FALSE@ HAVE_EXTERNALS_TRUE = @HAVE_EXTERNALS_TRUE@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBEXT = @LIBEXT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLM4 = @LIBTOOLM4@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_LDFLAGS = @LT_LDFLAGS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ MPICC = @MPICC@ MPICXX = @MPICXX@ OBJEXT = @OBJEXT@ OPT_CFLAGS = @OPT_CFLAGS@ OPT_CXXFLAGS = @OPT_CXXFLAGS@ OSIDOCDIR = @OSIDOCDIR@ OSIOBJDIR = @OSIOBJDIR@ OSISRCDIR = @OSISRCDIR@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ RPATH_FLAGS = @RPATH_FLAGS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ VPATH_DISTCLEANFILES = @VPATH_DISTCLEANFILES@ abs_bin_dir = @abs_bin_dir@ abs_include_dir = @abs_include_dir@ abs_lib_dir = @abs_lib_dir@ abs_source_dir = @abs_source_dir@ ac_c_preproc_warn_flag = @ac_c_preproc_warn_flag@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ ac_cxx_preproc_warn_flag = @ac_cxx_preproc_warn_flag@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ have_autoconf = @have_autoconf@ have_automake = @have_automake@ have_svn = @have_svn@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sol_cc_compiler = @sol_cc_compiler@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ AUTOMAKE_OPTIONS = foreign ######################################################################## # Subdirectories # ######################################################################## SUBDIRS = src/DylpStdLib src/Dylp examples $(am__append_1) ######################################################################## # Additional files to be included in tarball # ######################################################################## # Here we need include all files that are not mentioned in other Makefiles EXTRA_DIST = AUTHORS LICENSE README NEWS examples/generic.spc \ examples/greenbeb.spc examples/Makefile.in examples/mpsio.c \ examples/odsi+dylp.cpp examples/osi_dylp.c \ examples/osi+dylp.cpp examples/plain examples/README \ $(am__append_2) ######################################################################## # Installation of the addlibs file # ######################################################################## addlibsfile = dylp_addlibs.txt addlibsdir = $(prefix)/share/doc/coin/$(PACKAGE_NAME)/ ######################################################################## # Maintainer Stuff # ######################################################################## # So aclocal will find the local macros in the m4 directory ACLOCAL_AMFLAGS = -I m4 # Files that are generated and should be cleaned with make distclean DISTCLEANFILES = $(am__append_3) $(VPATH_DISTCLEANFILES) DocFiles = README AUTHORS LICENSE DocInstallDir = $(prefix)/share/doc/coin/$(PACKAGE_NAME) all: all-recursive .SUFFIXES: am--refresh: @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/../BuildTools/Makemain.inc $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \ cd $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) inc/config_dylp.h: inc/stamp-h1 @if test ! -f $@; then \ rm -f inc/stamp-h1; \ $(MAKE) inc/stamp-h1; \ else :; fi inc/stamp-h1: $(top_srcdir)/inc/config_dylp.h.in $(top_builddir)/config.status @rm -f inc/stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status inc/config_dylp.h $(top_srcdir)/inc/config_dylp.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_srcdir) && $(AUTOHEADER) rm -f inc/stamp-h1 touch $@ distclean-hdr: -rm -f inc/config_dylp.h inc/stamp-h1 examples/Makefile: $(top_builddir)/config.status $(top_srcdir)/examples/Makefile.in cd $(top_builddir) && $(SHELL) ./config.status $@ dylp_addlibs.txt: $(top_builddir)/config.status $(srcdir)/dylp_addlibs.txt.in cd $(top_builddir) && $(SHELL) ./config.status $@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(am__remove_distdir) mkdir $(distdir) $(mkdir_p) $(distdir)/. $(distdir)/.. $(distdir)/../BuildTools $(distdir)/doc $(distdir)/examples $(distdir)/inc $(distdir)/m4 @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(mkdir_p) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ distdir) \ || exit 1; \ fi; \ done -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r $(distdir) dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod a+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && cd $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}' distuninstallcheck: @cd $(distuninstallcheck_dir) \ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool clean-local mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr \ distclean-libtool distclean-local distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-exec-am: install-exec-local install-info: install-info-recursive install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic \ maintainer-clean-local mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool \ mostlyclean-local pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-info-am uninstall-local uninstall-info: uninstall-info-recursive .PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \ check-am clean clean-generic clean-libtool clean-local \ clean-recursive ctags ctags-recursive dist dist-all dist-bzip2 \ dist-gzip dist-shar dist-tarZ dist-zip distcheck distclean \ distclean-generic distclean-hdr distclean-libtool \ distclean-local distclean-recursive distclean-tags \ distcleancheck distdir distuninstallcheck dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am \ install-exec-local install-info install-info-am install-man \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ maintainer-clean-local maintainer-clean-recursive mostlyclean \ mostlyclean-generic mostlyclean-libtool mostlyclean-local \ mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am uninstall-info-am uninstall-local ######################################################################## # Extra Targets # ######################################################################## test: all @echo "Building and running dylp unit test." @cd test ; $(MAKE) test @if test -r ../Osi/test/Makefile; then \ echo "Building and running OsiDylp unit test." ; \ cd ../Osi/test; \ $(MAKE) test; \ else \ echo "Osi not present; skipping Osi unit test."; \ fi # Autotools does a good job on code, but it doesn't deal well with LaTeX # documentation. A few rules to help it along. Note that we don't delete # dylp.ps and dylp.pdf until maintainer-clean; these come prebuilt with the # distribution. .PHONY: doc mostlyclean-local clean-local distclean-local \ maintainer-clean-local doc: @echo "Attempting to build dylp typeset documentation." @cd doc ; ./build_dylpdoc --ps --pdf dylp mostlyclean-local: @cd doc ; if test -x build_dylpdoc ; then ./build_dylpdoc --clean || make; fi clean-local: mostlyclean-local # Normally, automake would remove build_dylpdoc, dylpabsdir.tex, and # makefile.dylpdoc as part of distclean, because they're generated during # configuration. But we can't allow that --- distclean-local runs *after* # distclean, and it needs build_dylpdoc and makefile.dylpdoc. Down in # doc/Makefile.am, the variable CONFIG_CLEAN_FILES is cleared to prevent # distclean from removing these files. That means that if ever I generate new # files from configure.ac, they need to be listed here. distclean-local: clean-local @cd doc ; rm -f build_dylpdoc dylpabsdir.tex makefile.dylpdoc @cd doc ; rm -f Makefile Figures/Makefile TexMF/Makefile maintainer-clean-local: distclean-local @cd doc ; rm -f dylp.pdf dylp.ps install-exec-local: install-doc $(install_sh_DATA) $(addlibsfile) $(DESTDIR)$(addlibsdir)/$(addlibsfile) uninstall-local: uninstall-doc rm -f $(DESTDIR)$(addlibsdir)/$(addlibsfile) install-doc: $(DocFiles) test -z "$(DocInstallDir)" || $(mkdir_p) "$(DESTDIR)$(DocInstallDir)" for file in $(DocFiles); do \ if test -f "$$file"; then dir=; else dir="$(srcdir)/"; fi; \ if test -f "$$dir$$file"; then $(INSTALL_DATA) "$$dir$$file" "$(DESTDIR)$(DocInstallDir)/$$file"; fi; \ done uninstall-doc: for file in $(DocFiles); do \ rm -f "$(DESTDIR)$(DocInstallDir)/$$file"; \ done ######################################################################## # Maintainer Stuff # ######################################################################## # Make sure acinclude is using most recent coin.m4 @MAINTAINER_MODE_TRUE@$(srcdir)/acinclude.m4: $(BUILDTOOLSDIR)/coin.m4 @MAINTAINER_MODE_TRUE@ cat $(LIBTOOLM4) $< > $@ # Make sure the autotools scripts are up to date @MAINTAINER_MODE_TRUE@$(AUX_DIR)/install-sh: $(BUILDTOOLSDIR)/install-sh @MAINTAINER_MODE_TRUE@ cp $< $@ @MAINTAINER_MODE_TRUE@$(AUX_DIR)/missing: $(BUILDTOOLSDIR)/missing @MAINTAINER_MODE_TRUE@ cp $< $@ @MAINTAINER_MODE_TRUE@$(AUX_DIR)/config.guess: $(BUILDTOOLSDIR)/config.guess @MAINTAINER_MODE_TRUE@ cp $< $@ @MAINTAINER_MODE_TRUE@$(AUX_DIR)/config.sub: $(BUILDTOOLSDIR)/config.sub @MAINTAINER_MODE_TRUE@ cp $< $@ @MAINTAINER_MODE_TRUE@$(AUX_DIR)/depcomp: $(BUILDTOOLSDIR)/depcomp @MAINTAINER_MODE_TRUE@ cp $< $@ @MAINTAINER_MODE_TRUE@$(AUX_DIR)/ltmain.sh: $(BUILDTOOLSDIR)/ltmain.sh @MAINTAINER_MODE_TRUE@ cp $< $@ # Take care of updating externals (if Externals file exists) @HAVE_EXTERNALS_TRUE@@MAINTAINER_MODE_TRUE@$(top_builddir)/Makefile: .Externals-stamp @HAVE_EXTERNALS_TRUE@@MAINTAINER_MODE_TRUE@.Externals-stamp: $(srcdir)/Externals @HAVE_EXTERNALS_TRUE@@MAINTAINER_MODE_TRUE@ cd $(srcdir); svn propset svn:externals -F Externals . @HAVE_EXTERNALS_TRUE@@MAINTAINER_MODE_TRUE@ touch .Externals-stamp @HAVE_EXTERNALS_TRUE@@MAINTAINER_MODE_TRUE@update-externals: .Externals-stamp @HAVE_EXTERNALS_TRUE@@MAINTAINER_MODE_TRUE@ cd $(srcdir); svn update .PHONY: install-doc uninstall-doc update-externals # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: DyLP-1.6.0/DyLP/dylp_addlibs.txt.in0000644000076700007670000000001210442173473013672 0ustar @ADDLIBS@ DyLP-1.6.0/DyLP/configure0000755000076700007670000314627111414231451012015 0ustar #! /bin/sh # From configure.ac 0.9. # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.59 for DyLP 1.6.0. # # Report bugs to . # # Copyright (C) 2003 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. # # # Copyright 2006 International Business Machines and others. # All Rights Reserved. # This file is part of the open source package Coin which is distributed # under the Common Public License. ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH # Check that we are running under the correct shell. SHELL=${CONFIG_SHELL-/bin/sh} case X$ECHO in X*--fallback-echo) # Remove one level of quotation (which was required for Make). ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','` ;; esac echo=${ECHO-echo} if test "X$1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X$1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then # Yippee, $echo works! : else # Restart under the correct shell. exec $SHELL "$0" --no-reexec ${1+"$@"} fi if test "X$1" = X--fallback-echo; then # used as fallback echo shift cat </dev/null 2>&1 && unset CDPATH if test -z "$ECHO"; then if test "X${echo_test_string+set}" != Xset; then # find a string as large as possible, as long as the shell can cope with it for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... if (echo_test_string=`eval $cmd`) 2>/dev/null && echo_test_string=`eval $cmd` && (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null then break fi done fi if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then : else # The Solaris, AIX, and Digital Unix default echo programs unquote # backslashes. This makes it impossible to quote backslashes using # echo "$something" | sed 's/\\/\\\\/g' # # So, first we look for a working echo in the user's PATH. lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for dir in $PATH /usr/ucb; do IFS="$lt_save_ifs" if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then echo="$dir/echo" break fi done IFS="$lt_save_ifs" if test "X$echo" = Xecho; then # We didn't find a better echo, so look for alternatives. if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # This shell has a builtin print -r that does the trick. echo='print -r' elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && test "X$CONFIG_SHELL" != X/bin/ksh; then # If we have ksh, try running configure again with it. ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} export ORIGINAL_CONFIG_SHELL CONFIG_SHELL=/bin/ksh export CONFIG_SHELL exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} else # Try using printf. echo='printf %s\n' if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # Cool, printf works : elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL export CONFIG_SHELL SHELL="$CONFIG_SHELL" export SHELL echo="$CONFIG_SHELL $0 --fallback-echo" elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then echo="$CONFIG_SHELL $0 --fallback-echo" else # maybe with a smaller string... prev=: for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null then break fi prev="$cmd" done if test "$prev" != 'sed 50q "$0"'; then echo_test_string=`eval $prev` export echo_test_string exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} else # Oops. We lost completely, so just stick with echo. echo=echo fi fi fi fi fi fi # Copy echo and quote the copy suitably for passing to libtool from # the Makefile, instead of quoting the original, which is used later. ECHO=$echo if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" fi tagnames=${tagnames+${tagnames},}CXX tagnames=${tagnames+${tagnames},}F77 # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` exec 6>&1 # # Initializations. # ac_default_prefix=/usr/local ac_config_libobj_dir=. cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Maximum number of lines to put in a shell here document. # This variable seems obsolete. It should probably be removed, and # only ac_max_sed_lines should be used. : ${ac_max_here_lines=38} # Identity of this package. PACKAGE_NAME='DyLP' PACKAGE_TARNAME='dylp' PACKAGE_VERSION='1.6.0' PACKAGE_STRING='DyLP 1.6.0' PACKAGE_BUGREPORT='coin-dylp@list.coin-or.org' ac_unique_file="src/Dylp/dy_vector.h" ac_default_prefix=`pwd` # Factoring default headers for most tests. ac_includes_default="\ #include #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_STAT_H # include #endif #if STDC_HEADERS # include # include #else # if HAVE_STDLIB_H # include # endif #endif #if HAVE_STRING_H # if !STDC_HEADERS && HAVE_MEMORY_H # include # endif # include #endif #if HAVE_STRINGS_H # include #endif #if HAVE_INTTYPES_H # include #else # if HAVE_STDINT_H # include # endif #endif #if HAVE_UNISTD_H # include #endif" ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os ADDLIBS FADDLIBS ALWAYS_FALSE_TRUE ALWAYS_FALSE_FALSE CDEFS ADD_CFLAGS DBG_CFLAGS OPT_CFLAGS sol_cc_compiler CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT MPICC CXXDEFS ADD_CXXFLAGS DBG_CXXFLAGS OPT_CXXFLAGS CXX CXXFLAGS ac_ct_CXX MPICXX EGREP INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT LIBTOOLM4 have_autoconf have_automake have_svn BUILDTOOLSDIR AUX_DIR abs_source_dir abs_lib_dir abs_include_dir abs_bin_dir HAVE_EXTERNALS_TRUE HAVE_EXTERNALS_FALSE host host_cpu host_vendor host_os LN_S ECHO AR ac_ct_AR RANLIB ac_ct_RANLIB CPP CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL ac_c_preproc_warn_flag ac_cxx_preproc_warn_flag RPATH_FLAGS LT_LDFLAGS DYLPSRCDIR DYLPOBJDIR DYLPDOCDIR COIN_HAS_DYLP_TRUE COIN_HAS_DYLP_FALSE COINUTILSSRCDIR COINUTILSOBJDIR COINUTILSDOCDIR COIN_HAS_COINUTILS_TRUE COIN_HAS_COINUTILS_FALSE OSISRCDIR OSIOBJDIR OSIDOCDIR COIN_HAS_OSI_TRUE COIN_HAS_OSI_FALSE DYLP_ERRMSGDIR LIBEXT VPATH_DISTCLEANFILES LIBOBJS LTLIBOBJS' ac_subst_files='' # Initialize some variables set by options. ac_init_help= ac_init_version=false # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datadir='${prefix}/share' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' infodir='${prefix}/info' mandir='${prefix}/man' ac_prev= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval "$ac_prev=\$ac_option" ac_prev= continue fi ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_option in -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad | --data | --dat | --da) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ | --da=*) datadir=$ac_optarg ;; -disable-* | --disable-*) ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` eval "enable_$ac_feature=no" ;; -enable-* | --enable-*) ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "enable_$ac_feature='$ac_optarg'" ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst \ | --locals | --local | --loca | --loc | --lo) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* \ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package| sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "with_$ac_package='$ac_optarg'" ;; -without-* | --without-*) ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/-/_/g'` eval "with_$ac_package=no" ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) { echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` eval "$ac_envvar='$ac_optarg'" export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` { echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi # Be sure to have absolute paths. for ac_var in exec_prefix prefix do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* | NONE | '' ) ;; *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac done # Be sure to have absolute paths. for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ localstatedir libdir includedir oldincludedir infodir mandir do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* ) ;; *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then its parent. ac_confdir=`(dirname "$0") 2>/dev/null || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$0" : 'X\(//\)[^/]' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$0" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` srcdir=$ac_confdir if test ! -r $srcdir/$ac_unique_file; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r $srcdir/$ac_unique_file; then if test "$ac_srcdir_defaulted" = yes; then { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 { (exit 1); exit 1; }; } else { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi fi (cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 { (exit 1); exit 1; }; } srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` ac_env_build_alias_set=${build_alias+set} ac_env_build_alias_value=$build_alias ac_cv_env_build_alias_set=${build_alias+set} ac_cv_env_build_alias_value=$build_alias ac_env_host_alias_set=${host_alias+set} ac_env_host_alias_value=$host_alias ac_cv_env_host_alias_set=${host_alias+set} ac_cv_env_host_alias_value=$host_alias ac_env_target_alias_set=${target_alias+set} ac_env_target_alias_value=$target_alias ac_cv_env_target_alias_set=${target_alias+set} ac_cv_env_target_alias_value=$target_alias ac_env_CDEFS_set=${CDEFS+set} ac_env_CDEFS_value=$CDEFS ac_cv_env_CDEFS_set=${CDEFS+set} ac_cv_env_CDEFS_value=$CDEFS ac_env_ADD_CFLAGS_set=${ADD_CFLAGS+set} ac_env_ADD_CFLAGS_value=$ADD_CFLAGS ac_cv_env_ADD_CFLAGS_set=${ADD_CFLAGS+set} ac_cv_env_ADD_CFLAGS_value=$ADD_CFLAGS ac_env_DBG_CFLAGS_set=${DBG_CFLAGS+set} ac_env_DBG_CFLAGS_value=$DBG_CFLAGS ac_cv_env_DBG_CFLAGS_set=${DBG_CFLAGS+set} ac_cv_env_DBG_CFLAGS_value=$DBG_CFLAGS ac_env_OPT_CFLAGS_set=${OPT_CFLAGS+set} ac_env_OPT_CFLAGS_value=$OPT_CFLAGS ac_cv_env_OPT_CFLAGS_set=${OPT_CFLAGS+set} ac_cv_env_OPT_CFLAGS_value=$OPT_CFLAGS ac_env_CC_set=${CC+set} ac_env_CC_value=$CC ac_cv_env_CC_set=${CC+set} ac_cv_env_CC_value=$CC ac_env_CFLAGS_set=${CFLAGS+set} ac_env_CFLAGS_value=$CFLAGS ac_cv_env_CFLAGS_set=${CFLAGS+set} ac_cv_env_CFLAGS_value=$CFLAGS ac_env_LDFLAGS_set=${LDFLAGS+set} ac_env_LDFLAGS_value=$LDFLAGS ac_cv_env_LDFLAGS_set=${LDFLAGS+set} ac_cv_env_LDFLAGS_value=$LDFLAGS ac_env_CPPFLAGS_set=${CPPFLAGS+set} ac_env_CPPFLAGS_value=$CPPFLAGS ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} ac_cv_env_CPPFLAGS_value=$CPPFLAGS ac_env_MPICC_set=${MPICC+set} ac_env_MPICC_value=$MPICC ac_cv_env_MPICC_set=${MPICC+set} ac_cv_env_MPICC_value=$MPICC ac_env_CXXDEFS_set=${CXXDEFS+set} ac_env_CXXDEFS_value=$CXXDEFS ac_cv_env_CXXDEFS_set=${CXXDEFS+set} ac_cv_env_CXXDEFS_value=$CXXDEFS ac_env_ADD_CXXFLAGS_set=${ADD_CXXFLAGS+set} ac_env_ADD_CXXFLAGS_value=$ADD_CXXFLAGS ac_cv_env_ADD_CXXFLAGS_set=${ADD_CXXFLAGS+set} ac_cv_env_ADD_CXXFLAGS_value=$ADD_CXXFLAGS ac_env_DBG_CXXFLAGS_set=${DBG_CXXFLAGS+set} ac_env_DBG_CXXFLAGS_value=$DBG_CXXFLAGS ac_cv_env_DBG_CXXFLAGS_set=${DBG_CXXFLAGS+set} ac_cv_env_DBG_CXXFLAGS_value=$DBG_CXXFLAGS ac_env_OPT_CXXFLAGS_set=${OPT_CXXFLAGS+set} ac_env_OPT_CXXFLAGS_value=$OPT_CXXFLAGS ac_cv_env_OPT_CXXFLAGS_set=${OPT_CXXFLAGS+set} ac_cv_env_OPT_CXXFLAGS_value=$OPT_CXXFLAGS ac_env_CXX_set=${CXX+set} ac_env_CXX_value=$CXX ac_cv_env_CXX_set=${CXX+set} ac_cv_env_CXX_value=$CXX ac_env_CXXFLAGS_set=${CXXFLAGS+set} ac_env_CXXFLAGS_value=$CXXFLAGS ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set} ac_cv_env_CXXFLAGS_value=$CXXFLAGS ac_env_MPICXX_set=${MPICXX+set} ac_env_MPICXX_value=$MPICXX ac_cv_env_MPICXX_set=${MPICXX+set} ac_cv_env_MPICXX_value=$MPICXX ac_env_CPP_set=${CPP+set} ac_env_CPP_value=$CPP ac_cv_env_CPP_set=${CPP+set} ac_cv_env_CPP_value=$CPP ac_env_CXXCPP_set=${CXXCPP+set} ac_env_CXXCPP_value=$CXXCPP ac_cv_env_CXXCPP_set=${CXXCPP+set} ac_cv_env_CXXCPP_value=$CXXCPP ac_env_F77_set=${F77+set} ac_env_F77_value=$F77 ac_cv_env_F77_set=${F77+set} ac_cv_env_F77_value=$F77 ac_env_FFLAGS_set=${FFLAGS+set} ac_env_FFLAGS_value=$FFLAGS ac_cv_env_FFLAGS_set=${FFLAGS+set} ac_cv_env_FFLAGS_value=$FFLAGS ac_env_DYLP_ERRMSGDIR_set=${DYLP_ERRMSGDIR+set} ac_env_DYLP_ERRMSGDIR_value=$DYLP_ERRMSGDIR ac_cv_env_DYLP_ERRMSGDIR_set=${DYLP_ERRMSGDIR+set} ac_cv_env_DYLP_ERRMSGDIR_value=$DYLP_ERRMSGDIR # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures DyLP 1.6.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] _ACEOF cat <<_ACEOF Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --datadir=DIR read-only architecture-independent data [PREFIX/share] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --infodir=DIR info documentation [PREFIX/info] --mandir=DIR man documentation [PREFIX/man] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of DyLP 1.6.0:";; esac cat <<\_ACEOF Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-debug compile all projects with debug options tests --enable-debug-dylp compile this project (DyLP) with debug options --enable-doscompile Under Cygwin, compile so that executables run under DOS. Set to mingw to use gcc/g++/ld with -mno-cygwin. Set to msvc to use cl/link (or icl/link). Default when mentioned: mingw. Default when not mentioned: disabled. --enable-static[=PKGS] build static libraries [default=no] --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --enable-shared[=PKGS] build shared libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) --enable-dylp-paranoia Enable dylp's paranoid checks (default=no) --enable-dylp-stats Enable dylp's statistics collection features (default=no) --enable-dylp-info Enable dylp's informational printing features (default=yes) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-dylp-verbosity specify the debug verbosity level for project DyLP --with-dylp-checklevel specify the sanity check level for project DyLP --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-pic try to use only PIC/non-PIC objects [default=use both] --with-tags[=TAGS] include additional configurations [automatic] Some influential environment variables: CDEFS Additional -D flags to be used when compiling C code. ADD_CFLAGS Additional C compiler options DBG_CFLAGS Debug C compiler options OPT_CFLAGS Optimize C compiler options CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory MPICC C MPI Compiler CXXDEFS Additional -D flags to be used when compiling C++ code. ADD_CXXFLAGS Additional C++ compiler options DBG_CXXFLAGS Debug C++ compiler options OPT_CXXFLAGS Optimize C++ compiler options CXX C++ compiler command CXXFLAGS C++ compiler flags MPICXX C++ MPI Compiler CPP C preprocessor CXXCPP C++ preprocessor F77 Fortran 77 compiler command FFLAGS Fortran 77 compiler flags DYLP_ERRMSGDIR Directory containing the DyLP error message text file (dy_errmsgs.txt). Should be set to /absolute/path/to/srcdir/DyLP/src/Dylp, using native path syntax (i.e., drive letters and backslashes on Windows). Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. ac_popdir=`pwd` for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d $ac_dir || continue ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac cd $ac_dir # Check for guested configure; otherwise get Cygnus style configure. if test -f $ac_srcdir/configure.gnu; then echo $SHELL $ac_srcdir/configure.gnu --help=recursive elif test -f $ac_srcdir/configure; then echo $SHELL $ac_srcdir/configure --help=recursive elif test -f $ac_srcdir/configure.ac || test -f $ac_srcdir/configure.in; then echo $ac_configure --help else echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi cd $ac_popdir done fi test -n "$ac_init_help" && exit 0 if $ac_init_version; then cat <<\_ACEOF DyLP configure 1.6.0 generated by GNU Autoconf 2.59 Copyright (C) 2003 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Copyright 2006 International Business Machines and others. All Rights Reserved. This file is part of the open source package Coin which is distributed under the Common Public License. _ACEOF exit 0 fi exec 5>config.log cat >&5 <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by DyLP $as_me 1.6.0, which was generated by GNU Autoconf 2.59. Invocation command line was $ $0 $@ _ACEOF { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` hostinfo = `(hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. echo "PATH: $as_dir" done } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_sep= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$ac_configure_args1 '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" # Get rid of the leading space. ac_sep=" " ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Be sure not to use single quotes in there, as some shells, # such as our DU 5.0 friend, will then `close' the trap. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, { (set) 2>&1 | case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in *ac_space=\ *) sed -n \ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" ;; *) sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=$`echo $ac_var` echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------- ## ## Output files. ## ## ------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=$`echo $ac_var` echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo sed "/^$/d" confdefs.h | sort echo fi test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" echo "$as_me: exit $exit_status" } >&5 rm -f core *.core && rm -rf conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -rf conftest* confdefs.h # AIX cpp loses on an empty file, so make sure it contains at least a newline. echo >confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer explicitly selected file to automatically selected ones. if test -z "$CONFIG_SITE"; then if test "x$prefix" != xNONE; then CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" else CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special # files actually), so we avoid doing that. if test -f "$cache_file"; then { echo "$as_me:$LINENO: loading cache $cache_file" >&5 echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . $cache_file;; *) . ./$cache_file;; esac fi else { echo "$as_me:$LINENO: creating cache $cache_file" >&5 echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in `(set) 2>&1 | sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val="\$ac_cv_env_${ac_var}_value" eval ac_new_val="\$ac_env_${ac_var}_value" case $ac_old_set,$ac_new_set in set,) { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # List one file in the package so that the configure script can test # whether the package is actually there # Where should everything be installed by default? Here, we want it # to be installed directly in 'bin', 'lib', 'include' subdirectories # of the directory where configure is run. The default would be # /usr/local. ############################################################################# # Standard build tool stuff # ############################################################################# # Get the system type ac_aux_dir= for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do if test -f $ac_dir/install-sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f $ac_dir/install.sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f $ac_dir/shtool; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} { (exit 1); exit 1; }; } fi ac_config_guess="$SHELL $ac_aux_dir/config.guess" ac_config_sub="$SHELL $ac_aux_dir/config.sub" ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. # Make sure we can run config.sub. $ac_config_sub sun4 >/dev/null 2>&1 || { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5 echo "$as_me: error: cannot run $ac_config_sub" >&2;} { (exit 1); exit 1; }; } echo "$as_me:$LINENO: checking build system type" >&5 echo $ECHO_N "checking build system type... $ECHO_C" >&6 if test "${ac_cv_build+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_build_alias=$build_alias test -z "$ac_cv_build_alias" && ac_cv_build_alias=`$ac_config_guess` test -z "$ac_cv_build_alias" && { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 echo "$as_me: error: cannot guess build type; you must specify one" >&2;} { (exit 1); exit 1; }; } ac_cv_build=`$ac_config_sub $ac_cv_build_alias` || { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5 echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:$LINENO: result: $ac_cv_build" >&5 echo "${ECHO_T}$ac_cv_build" >&6 build=$ac_cv_build build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` # Various handy bits of initialisation. # Initialize the ADDLIBS variable ADDLIBS="-lm $LIBS" # As backup, we make sure we don't loose an FLIBS if it has been set # by the user save_FLIBS="$FLIBS" # Initialize the FADDLIBS variable (which is to be used with a fortran # compiler and will not include FLIBS) FADDLIBS="$LIBS" # A useful makefile conditional that is always false if false; then ALWAYS_FALSE_TRUE= ALWAYS_FALSE_FALSE='#' else ALWAYS_FALSE_TRUE='#' ALWAYS_FALSE_FALSE= fi # We set the following variable so that we know later in AC_COIN_FINALIZE # that we are in a project main directory coin_projectdir=yes # Set the project's version number. Use m4_ifval here to avoid defining # _VERSION when the user has not supplied a parameter. # temporary hack to avoid breaking lapack 1.0.20; # do not propagate to BuildTools trunk! --lh, 100615-- if expr "DyLP" : '.*:.*' >/dev/null 2>&1 ; then coin_libversion="DyLP" else cat >>confdefs.h <<_ACEOF #define DYLP_VERSION "$PACKAGE_VERSION" _ACEOF fi # Check if user wants to produce debugging code echo "$as_me:$LINENO: checking whether we want to compile in debug mode" >&5 echo $ECHO_N "checking whether we want to compile in debug mode... $ECHO_C" >&6 # Check whether --enable-debug or --disable-debug was given. if test "${enable_debug+set}" = set; then enableval="$enable_debug" case "${enableval}" in yes) coin_debug_compile=true if test "${enable_shared+set}" = set; then :; else enable_shared=no fi ;; no) coin_debug_compile=false ;; *) { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-debug" >&5 echo "$as_me: error: bad value ${enableval} for --enable-debug" >&2;} { (exit 1); exit 1; }; } ;; esac else coin_debug_compile=false fi; # Check whether --enable-debug-dylp or --disable-debug-dylp was given. if test "${enable_debug_dylp+set}" = set; then enableval="$enable_debug_dylp" case "${enableval}" in yes) coin_debug_compile=true enable_shared=no ;; no) coin_debug_compile=false ;; *) { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-debug-dylp" >&5 echo "$as_me: error: bad value ${enableval} for --enable-debug-dylp" >&2;} { (exit 1); exit 1; }; } ;; esac else : fi; # m4_ifvaln([DyLP], if test $coin_debug_compile = true; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi # Check whether --with-dylp-verbosity or --without-dylp-verbosity was given. if test "${with_dylp_verbosity+set}" = set; then withval="$with_dylp_verbosity" if test "$withval" = yes; then withval=1 fi coin_dylp_verbosity=$withval else coin_dylp_verbosity=0 fi; cat >>confdefs.h <<_ACEOF #define COIN_DYLP_VERBOSITY $coin_dylp_verbosity _ACEOF # Check whether --with-dylp-checklevel or --without-dylp-checklevel was given. if test "${with_dylp_checklevel+set}" = set; then withval="$with_dylp_checklevel" if test "$withval" = yes; then withval=1 fi coin_dylp_checklevel=$withval else coin_dylp_checklevel=0 fi; cat >>confdefs.h <<_ACEOF #define COIN_DYLP_CHECKLEVEL $coin_dylp_checklevel _ACEOF # We use the following variable to have a string with the upper case # version of the project name COIN_PRJCT=DYLP # m4_ifvaln([DyLP], # Get the name of the C compiler and appropriate compiler options case $build in *-mingw*) if test "${LD+set}" = set; then :; else LD=link fi ;; esac case $enable_doscompile in msvc) if test "x${LD+set}" = xset; then :; else LD=link fi ;; esac # Check whether --enable-doscompile or --disable-doscompile was given. if test "${enable_doscompile+set}" = set; then enableval="$enable_doscompile" if test "$enable_doscompile" != no; then case $build in *-cygwin* | *-mingw*) ;; *) { { echo "$as_me:$LINENO: error: --enable-doscompile option makes sense only under Cygwin or MinGW" >&5 echo "$as_me: error: --enable-doscompile option makes sense only under Cygwin or MinGW" >&2;} { (exit 1); exit 1; }; } ;; esac fi else enable_doscompile=no fi; case "$enable_doscompile" in mingw) case $build in *-mingw*) enable_doscompile=no ;; esac ;; msvc|no) ;; yes) enable_doscompile=mingw ;; *) { { echo "$as_me:$LINENO: error: Invalid value $enable_doscompile for --enable-doscompile. Try configure --help=recursive." >&5 echo "$as_me: error: Invalid value $enable_doscompile for --enable-doscompile. Try configure --help=recursive." >&2;} { (exit 1); exit 1; }; } ;; esac if test "$enable_doscompile" != no ; then { echo "$as_me:$LINENO: DOS compile style is: $enable_doscompile" >&5 echo "$as_me: DOS compile style is: $enable_doscompile" >&6;} fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # For consistency, we set the C compiler to the same value of the C++ # compiler, if the C++ is set, but the C compiler isn't (only for CXX=cl) if test x"$CXX" != x; then case "$CXX" in cl* | */cl* | CL* | */CL* | icl* | */icl* | ICL* | */ICL*) if test x"$CC" = x; then CC="$CXX" { echo "$as_me:$LINENO: WARNING: C++ compiler name provided as $CXX, but CC is unset. Setting CC to $CXX" >&5 echo "$as_me: WARNING: C++ compiler name provided as $CXX, but CC is unset. Setting CC to $CXX" >&2;} fi ;; esac fi coin_has_cc=yes save_cflags="$CFLAGS" # For *-*-solaris*, promote Studio/Workshop cc compiler to front of list. # Depending on the user's PATH, when Studio/Workshop cc is not present we may # find /usr/ucb/cc, which is almost certainly not a good choice for the C # compiler. In this case, put cc after gcc. case $build in *-cygwin* | *-mingw*) if test "$enable_doscompile" = msvc ; then comps="icl cl" else comps="gcc cl" fi ;; *-*-solaris*) # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_sol_cc_compiler+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$sol_cc_compiler"; then ac_cv_prog_sol_cc_compiler="$sol_cc_compiler" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_sol_cc_compiler="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_sol_cc_compiler shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set sol_cc_compiler to just the basename; use the full file name. shift ac_cv_prog_sol_cc_compiler="$as_dir/$ac_word${1+' '}$@" fi fi fi fi sol_cc_compiler=$ac_cv_prog_sol_cc_compiler if test -n "$sol_cc_compiler"; then echo "$as_me:$LINENO: result: $sol_cc_compiler" >&5 echo "${ECHO_T}$sol_cc_compiler" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi if test "$sol_cc_compiler" = "cc" ; then comps="cc xlc gcc pgcc icc" else comps="xlc gcc pgcc icc cc" fi ;; *-linux-*) comps="xlc gcc cc pgcc icc" ;; *) comps="xlc_r xlc cc gcc pgcc icc" ;; esac # We delete the cached value, since the test might not have been # performed with our choice of compilers earlier $as_unset ac_cv_prog_CC || test "${ac_cv_prog_CC+set}" != set || { ac_cv_prog_CC=; export ac_cv_prog_CC; } # AC_MSG_NOTICE([C compiler candidates: $comps]) ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in $comps do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in $comps do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$ac_ct_CC" && break done CC=$ac_ct_CC fi test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } # Provide some information about the compiler. echo "$as_me:$LINENO:" \ "checking for C compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 (eval $ac_compiler --version &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 (eval $ac_compiler -v &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 (eval $ac_compiler -V &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 (eval $ac_link_default) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Find the output, starting from the most likely. This scheme is # not robust to junk in `.', hence go to wildcards (a.*) only as a last # resort. # Be careful to initialize this variable, since it used to be cached. # Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. ac_cv_exeext= # b.out is created by i960 compilers. for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; conftest.$ac_ext ) # This is the source file. ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` # FIXME: I believe we export ac_cv_exeext for Libtool, # but it would be cool to find out if it's true. Does anybody # maintain Libtool? --akim. export ac_cv_exeext break;; * ) break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: C compiler cannot create executables See \`config.log' for more details." >&5 echo "$as_me: error: C compiler cannot create executables See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } fi ac_exeext=$ac_cv_exeext echo "$as_me:$LINENO: result: $ac_file" >&5 echo "${ECHO_T}$ac_file" >&6 # Check the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. echo "$as_me:$LINENO: checking whether the C compiler works" >&5 echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 # FIXME: These cross compiler hacks should be removed for Autoconf 3.0 # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { echo "$as_me:$LINENO: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&5 echo "$as_me: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi fi fi echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 rm -f a.out a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save # Check the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 echo "$as_me:$LINENO: result: $cross_compiling" >&5 echo "${ECHO_T}$cross_compiling" >&6 echo "$as_me:$LINENO: checking for suffix of executables" >&5 echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` export ac_cv_exeext break;; * ) break;; esac done else { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest$ac_cv_exeext echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 echo "${ECHO_T}$ac_cv_exeext" >&6 rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT echo "$as_me:$LINENO: checking for suffix of object files" >&5 echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 if test "${ac_cv_objext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 echo "${ECHO_T}$ac_cv_objext" >&6 OBJEXT=$ac_cv_objext ac_objext=$OBJEXT echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 if test "${ac_cv_c_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 GCC=`test $ac_compiler_gnu = yes && echo yes` ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS CFLAGS="-g" echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_prog_cc_g=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 if test "${ac_cv_prog_cc_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_prog_cc_stdc=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std1 is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std1. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF # Don't try gcc -ansi; that turns off useful extensions and # breaks some systems' header files. # AIX -qlanglvl=ansi # Ultrix and OSF/1 -std1 # HP-UX 10.20 and later -Ae # HP-UX older versions -Aa -D_HPUX_SOURCE # SVR4 -Xc -D__EXTENSIONS__ for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_stdc=$ac_arg break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext done rm -f conftest.$ac_ext conftest.$ac_objext CC=$ac_save_CC fi case "x$ac_cv_prog_cc_stdc" in x|xno) echo "$as_me:$LINENO: result: none needed" >&5 echo "${ECHO_T}none needed" >&6 ;; *) echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 CC="$CC $ac_cv_prog_cc_stdc" ;; esac # Some people use a C++ compiler to compile C. Since we use `exit', # in C++ we need to declare it. In case someone uses the same compiler # for both compiling C and C++ we need to have the C++ compiler decide # the declaration of exit, since it's the most demanding environment. cat >conftest.$ac_ext <<_ACEOF #ifndef __cplusplus choke me #endif _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then for ac_declaration in \ '' \ 'extern "C" void std::exit (int) throw (); using std::exit;' \ 'extern "C" void std::exit (int); using std::exit;' \ 'extern "C" void exit (int) throw ();' \ 'extern "C" void exit (int);' \ 'void exit (int);' do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration #include int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 continue fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done rm -f conftest* if test -n "$ac_declaration"; then echo '#ifdef __cplusplus' >>confdefs.h echo $ac_declaration >>confdefs.h echo '#endif' >>confdefs.h fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -z "$CC" ; then { { echo "$as_me:$LINENO: error: Failed to find a C compiler!" >&5 echo "$as_me: error: Failed to find a C compiler!" >&2;} { (exit 1); exit 1; }; } fi # Autoconf incorrectly concludes that cl recognises -g. It doesn't. case "$CC" in cl* | */cl* | CL* | */CL* ) if test "$ac_cv_prog_cc_g" = yes ; then ac_cv_prog_cc_g=no { echo "$as_me:$LINENO: Overruling autoconf; cl does not recognise -g." >&5 echo "$as_me: Overruling autoconf; cl does not recognise -g." >&6;} fi ;; esac CFLAGS="$save_cflags" # Check if a project specific CFLAGS variable has been set if test x$COIN_PRJCT != x; then eval coin_tmp=\${${COIN_PRJCT}_CFLAGS+set} if test x$coin_tmp = xset; then eval CFLAGS=\${${COIN_PRJCT}_CFLAGS} fi fi if test x"$CFLAGS" = x; then coin_add_cflags= coin_opt_cflags= coin_dbg_cflags= coin_warn_cflags= if test "$GCC" = "yes"; then case "$CC" in icc* | */icc*) ;; *) coin_opt_cflags="-O3 -fomit-frame-pointer" coin_add_cflags="-pipe" coin_dbg_cflags="-g" coin_warn_cflags="-Wimplicit -Wparentheses -Wsequence-point -Wreturn-type -Wcast-qual -Wall -Wno-unknown-pragmas" case $build in *-darwin*) ;; *) coin_warn_cflags="-pedantic-errors $coin_warn_cflags" ;; esac case $enable_doscompile in mingw) CFLAGS="-mno-cygwin" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { int i=0; i++; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then coin_add_cflags="-mno-cygwin $coin_add_cflags" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS= ;; esac esac fi if test -z "$coin_opt_cflags"; then case $build in *-cygwin* | *-mingw*) case "$CC" in cl* | */cl* | CL* | */CL*) coin_opt_cflags='-MT -O2' coin_add_cflags='-nologo -wd4996 -D_CRT_SECURE_NO_DEPRECATE' coin_dbg_cflags='-MTd' ;; icl* | */icl* | ICL* | */ICL*) coin_opt_cflags='-MT -Ox' coin_add_cflags='-nologo -D_CRT_SECURE_NO_DEPRECATE' coin_dbg_cflags='-MTd -debug' ;; esac ;; *-linux-*) case "$CC" in icc* | */icc*) coin_opt_cflags="-O3 -ip -mp1" coin_add_cflags="" coin_dbg_cflags="-g" # Check if -i_dynamic is necessary (for new glibc library) CFLAGS= cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { int i=0; i++; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 coin_add_cflags="-i_dynamic $coin_add_cflags" fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ;; pgcc* | */pgcc*) coin_opt_cflags="-fast" coin_add_cflags="-Kieee -pc 64" coin_dbg_cflags="-g" ;; esac ;; *-ibm-*) case "$CC" in xlc* | */xlc* | mpxlc* | */mpxlc*) coin_opt_cflags="-O -qarch=auto -qcache=auto -qtune=auto -qmaxmem=-1" coin_add_cflags="-bmaxdata:0x80000000 -qsuppress=1500-036 -qsuppress=1500-029" coin_dbg_cflags="-g" ;; esac ;; *-hp-*) coin_opt_cflags="-O" coin_add_cflags="-Ae" coin_dbg_cflags="-g" ;; *-*-solaris*) coin_opt_cflags="-xO4" coin_dbg_cflags="-g" ;; *-sgi-*) coin_opt_cflags="-O -OPT:Olimit=0" coin_dbg_cflags="-g" ;; esac fi if test "$ac_cv_prog_cc_g" = yes && test -z "$coin_dbg_cflags" ; then coin_dbg_cflags="-g" fi if test -z "$coin_opt_cflags"; then # Try if -O option works if nothing else is set CFLAGS="-O" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { int i=0; i++; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then coin_opt_cflags="-O" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi # if PM doesn't want the warning messages, take them out if test x"$coin_skip_warn_cflags" = xyes; then coin_warn_cflags= fi if test x${DBG_CFLAGS+set} != xset; then DBG_CFLAGS="$coin_dbg_cflags $coin_add_cflags $coin_warn_cflags" fi if test x${OPT_CFLAGS+set} != xset; then OPT_CFLAGS="$coin_opt_cflags $coin_add_cflags -DNDEBUG $coin_warn_cflags" fi DBG_CFLAGS="$DBG_CFLAGS $ADD_CFLAGS $CDEFS" OPT_CFLAGS="$OPT_CFLAGS $ADD_CFLAGS $CDEFS" if test "$coin_debug_compile" = "true"; then CFLAGS="$DBG_CFLAGS" else CFLAGS="$OPT_CFLAGS" fi else CFLAGS="$CFLAGS $ADD_CFLAGS $CDEFS" if test x${DBG_CFLAGS+set} != xset; then DBG_CFLAGS="$CFLAGS" fi if test x${OPT_CFLAGS+set} != xset; then OPT_CFLAGS="$CFLAGS" fi fi # If CFLAGS contains -mno-cygwin, CPPFLAGS must also have it. case "$CFLAGS" in *-mno-cygwin*) if test x${CPPFLAGS+set} != xset ; then CPPFLAGS="-mno-cygwin" else case "$CPPFLAGS" in *-mno-cygwin*) ;; *) CPPFLAGS="$CPPFLAGS -mno-cygwin" ;; esac fi ;; esac # Try if CFLAGS works save_CFLAGS="$CFLAGS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { int i=0; i++; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CFLAGS= fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$CFLAGS"; then { echo "$as_me:$LINENO: WARNING: The value CFLAGS=\"$save_CFLAGS\" do not work. I will now just try '-O', but you might want to set CFLAGS manually." >&5 echo "$as_me: WARNING: The value CFLAGS=\"$save_CFLAGS\" do not work. I will now just try '-O', but you might want to set CFLAGS manually." >&2;} CFLAGS='-O' cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { int i=0; i++; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CFLAGS= fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$CFLAGS"; then { echo "$as_me:$LINENO: WARNING: This value for CFLAGS does not work. I will continue with empty CFLAGS, but you might want to set CFLAGS manually." >&5 echo "$as_me: WARNING: This value for CFLAGS does not work. I will continue with empty CFLAGS, but you might want to set CFLAGS manually." >&2;} fi fi { echo "$as_me:$LINENO: C compiler options are: $CFLAGS" >&5 echo "$as_me: C compiler options are: $CFLAGS" >&6;} if test x"$MPICC" = x; then :; else { echo "$as_me:$LINENO: Will use MPI C compiler $MPICC" >&5 echo "$as_me: Will use MPI C compiler $MPICC" >&6;} CC="$MPICC" fi # Correct ADDLIBS initialization if we are using the MS compiler case "$CC" in cl* | */cl* | CL* | */CL* | icl* | */icl* | ICL* | */ICL*) ADDLIBS= case $build in *-mingw*) if test "${LD+set}" = set; then :; else LD=link fi ;; esac case $enable_doscompile in msvc) if test "x${LD+set}" = xset; then :; else LD=link fi ;; esac ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Get the name of the C++ compiler and appropriate compiler options #Let's try if that overcomes configuration problem with VC++ 6.0 ac_ext=cc ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu coin_has_cxx=yes save_cxxflags="$CXXFLAGS" # For *-*-solaris*, promote Studio/Workshop compiler to front of list. case $build in *-cygwin* | *-mingw*) if test "$enable_doscompile" = msvc ; then comps="icl cl" else comps="g++ cl" fi ;; *-*-solaris*) comps="CC xlC_r aCC g++ c++ pgCC icpc gpp cxx cc++ cl FCC KCC RCC" ;; *-darwin*) comps="g++ c++ CC" ;; *) comps="xlC_r aCC CC g++ c++ pgCC icpc gpp cxx cc++ cl FCC KCC RCC" ;; esac # We delete the cached value, since the test might not have been # performed with our choice of compilers earlier $as_unset ac_cv_prog_CXX || test "${ac_cv_prog_CXX+set}" != set || { ac_cv_prog_CXX=; export ac_cv_prog_CXX; } # AC_MSG_NOTICE([C++ compiler candidates: $comps]) ac_ext=cc ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in $CCC $comps do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then echo "$as_me:$LINENO: result: $CXX" >&5 echo "${ECHO_T}$CXX" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in $CCC $comps do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 echo "${ECHO_T}$ac_ct_CXX" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$ac_ct_CXX" && break done test -n "$ac_ct_CXX" || ac_ct_CXX="g++" CXX=$ac_ct_CXX fi # Provide some information about the compiler. echo "$as_me:$LINENO:" \ "checking for C++ compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 (eval $ac_compiler --version &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 (eval $ac_compiler -v &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 (eval $ac_compiler -V &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6 if test "${ac_cv_cxx_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6 GXX=`test $ac_compiler_gnu = yes && echo yes` ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS CXXFLAGS="-g" echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6 if test "${ac_cv_prog_cxx_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cxx_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_prog_cxx_g=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6 if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi for ac_declaration in \ '' \ 'extern "C" void std::exit (int) throw (); using std::exit;' \ 'extern "C" void std::exit (int); using std::exit;' \ 'extern "C" void exit (int) throw ();' \ 'extern "C" void exit (int);' \ 'void exit (int);' do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration #include int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 continue fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done rm -f conftest* if test -n "$ac_declaration"; then echo '#ifdef __cplusplus' >>confdefs.h echo $ac_declaration >>confdefs.h echo '#endif' >>confdefs.h fi ac_ext=cc ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu #AC_PROG_CXX sets CXX to g++ if it cannot find a working C++ compiler #thus, we test here whether $CXX is actually working ac_ext=cc ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu echo "$as_me:$LINENO: checking whether C++ compiler $CXX works" >&5 echo $ECHO_N "checking whether C++ compiler $CXX works... $ECHO_C" >&6; cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { int i=0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 { { echo "$as_me:$LINENO: error: failed to find a C++ compiler or C++ compiler $CXX does not work" >&5 echo "$as_me: error: failed to find a C++ compiler or C++ compiler $CXX does not work" >&2;} { (exit 1); exit 1; }; } fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cc ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu # It seems that we need to cleanup something here for the Windows case "$CXX" in cl* | */cl* | CL* | */CL* | icl* | */icl* | ICL* | */ICL*) sed -e 's/^void exit (int);//' confdefs.h >> confdefs.hh mv confdefs.hh confdefs.h ;; esac # Autoconf incorrectly concludes that cl recognises -g. It doesn't. case "$CXX" in cl* | */cl* | CL* | */CL* ) if test "$ac_cv_prog_cxx_g" = yes ; then ac_cv_prog_cxx_g=no { echo "$as_me:$LINENO: Overruling autoconf; cl does not recognise -g." >&5 echo "$as_me: Overruling autoconf; cl does not recognise -g." >&6;} fi ;; esac CXXFLAGS="$save_cxxflags" # Check if a project specific CXXFLAGS variable has been set if test x$COIN_PRJCT != x; then eval coin_tmp=\${${COIN_PRJCT}_CXXFLAGS+set} if test x$coin_tmp = xset; then eval CXXFLAGS=\${${COIN_PRJCT}_CXXFLAGS} fi fi if test x"$CXXFLAGS" = x; then # ToDo decide whether we want -DNDEBUG for optimization coin_add_cxxflags= coin_opt_cxxflags= coin_dbg_cxxflags= coin_warn_cxxflags= if test "$GXX" = "yes"; then case "$CXX" in icpc* | */icpc*) ;; *) # ToDo decide about unroll-loops coin_opt_cxxflags="-O3 -fomit-frame-pointer" coin_add_cxxflags="-pipe" coin_dbg_cxxflags="-g" coin_warn_cxxflags="-Wimplicit -Wparentheses -Wreturn-type -Wcast-qual -Wall -Wpointer-arith -Wwrite-strings -Wconversion -Wno-unknown-pragmas" case $build in *-darwin*) ;; *) coin_warn_cxxflags="-pedantic-errors $coin_warn_cxxflags" ;; esac case $enable_doscompile in mingw) CXXFLAGS="-mno-cygwin" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { int i=0; i++; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then coin_add_cxxflags="-mno-cygwin $coin_add_cxxflags" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CXXFLAGS= ;; esac esac fi # Note that we do not need to cover GCC in the following tests. if test -z "$coin_opt_cxxflags"; then case $build in *-cygwin* | *-mingw*) case "$CXX" in cl* | */cl* | CL* | */CL*) # The MT and MTd options are mutually exclusive coin_opt_cxxflags='-MT -O2' coin_add_cxxflags='-nologo -EHsc -GR -wd4996 -D_CRT_SECURE_NO_DEPRECATE' coin_dbg_cxxflags='-MTd' ;; icl* | */icl* | ICL* | */ICL*) # The MT and MTd options are mutually exclusive coin_opt_cxxflags='-MT -Ox' coin_add_cxxflags='-nologo -EHsc -GR -D_CRT_SECURE_NO_DEPRECATE' coin_dbg_cxxflags='-MTd -debug' ;; esac ;; *-linux-*) case "$CXX" in icpc* | */icpc*) coin_opt_cxxflags="-O3 -ip -mp1" coin_add_cxxflags="" coin_dbg_cxxflags="-g" # Check if -i_dynamic is necessary (for new glibc library) CXXFLAGS= cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { int i=0; i++; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 coin_add_cxxflags="-i_dynamic $coin_add_cxxflags" fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ;; pgCC* | */pgCC*) coin_opt_cxxflags="-fast" coin_add_cxxflags="-Kieee -pc 64" coin_dbg_cxxflags="-g" ;; esac ;; *-ibm-*) case "$CXX" in xlC* | */xlC* | mpxlC* | */mpxlC*) coin_opt_cxxflags="-O -qarch=auto -qcache=auto -qtune=auto -qmaxmem=-1" coin_add_cxxflags="-bmaxdata:0x80000000 -qrtti=dyna -qsuppress=1500-036 -qsuppress=1500-029 -qsourcetype=c++" coin_dbg_cxxflags="-g" ;; esac ;; *-hp-*) case "$CXX" in aCC* | */aCC* ) coin_opt_cxxflags="-O" coin_add_cxxflags="-AA" coin_dbg_cxxflags="-g" ;; esac ;; *-*-solaris*) coin_opt_cxxflags="-O4" coin_dbg_cxxflags="-g" ;; esac fi # Generic flag settings. If these don't work, add a case above. if test "$ac_cv_prog_cxx_g" = yes && test -z "$coin_dbg_cxxflags" ; then coin_dbg_cxxflags="-g" fi if test -z "$coin_opt_cxxflags"; then # Try if -O option works if nothing else is set CXXFLAGS=-O cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { int i=0; i++; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then coin_opt_cxxflags="-O" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi # if PM doesn't want the warning messages, take them out if test x"$coin_skip_warn_cxxflags" = xyes; then coin_warn_cxxflags= fi # Do final setup of flags based on values determined above. if test x${DBG_CXXFLAGS+set} != xset; then DBG_CXXFLAGS="$coin_dbg_cxxflags $coin_add_cxxflags $coin_warn_cxxflags" fi if test x${OPT_CXXFLAGS+set} != xset; then OPT_CXXFLAGS="$coin_opt_cxxflags $coin_add_cxxflags -DNDEBUG $coin_warn_cxxflags" fi DBG_CXXFLAGS="$DBG_CXXFLAGS $ADD_CXXFLAGS $CXXDEFS" OPT_CXXFLAGS="$OPT_CXXFLAGS $ADD_CXXFLAGS $CXXDEFS" if test "$coin_debug_compile" = "true"; then CXXFLAGS="$DBG_CXXFLAGS" else CXXFLAGS="$OPT_CXXFLAGS" fi # Handle the case where CXXFLAGS was set externally. else CXXFLAGS="$CXXFLAGS $ADD_CXXFLAGS $CXXDEFS" if test x${DBG_CXXFLAGS+set} != xset; then DBG_CXXFLAGS="$CXXFLAGS" fi if test x${OPT_CXXFLAGS+set} != xset; then OPT_CXXFLAGS="$CXXFLAGS" fi fi # If CXXFLAGS contains -mno-cygwin, CPPFLAGS must also have it. case "$CXXFLAGS" in *-mno-cygwin*) if test x${CPPFLAGS+set} != xset ; then CPPFLAGS="-mno-cygwin" else case "$CPPFLAGS" in *-mno-cygwin*) ;; *) CPPFLAGS="$CPPFLAGS -mno-cygwin" ;; esac fi ;; esac # Try if CXXFLAGS works save_CXXFLAGS="$CXXFLAGS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { int i=0; i++; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CXXFLAGS= fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$CXXFLAGS"; then { echo "$as_me:$LINENO: WARNING: The flags CXXFLAGS=\"$save_CXXFLAGS\" do not work. I will now just try '-O', but you might want to set CXXFLAGS manually." >&5 echo "$as_me: WARNING: The flags CXXFLAGS=\"$save_CXXFLAGS\" do not work. I will now just try '-O', but you might want to set CXXFLAGS manually." >&2;} CXXFLAGS='-O' cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { int i=0; i++; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CXXFLAGS= fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$CXXFLAGS"; then { echo "$as_me:$LINENO: WARNING: This value for CXXFLAGS does not work. I will continue with empty CXXFLAGS, but you might want to set CXXFLAGS manually." >&5 echo "$as_me: WARNING: This value for CXXFLAGS does not work. I will continue with empty CXXFLAGS, but you might want to set CXXFLAGS manually." >&2;} fi fi { echo "$as_me:$LINENO: C++ compiler options are: $CXXFLAGS" >&5 echo "$as_me: C++ compiler options are: $CXXFLAGS" >&6;} if test x"$MPICXX" = x; then :; else { echo "$as_me:$LINENO: Will use MPI C++ compiler $MPICXX" >&5 echo "$as_me: Will use MPI C++ compiler $MPICXX" >&6;} CXX="$MPICXX" fi case "$CXX" in cl* | */cl* | CL* | */CL* ) case $build in *-mingw*) if test "${LD+set}" = set; then :; else LD=link fi ;; esac case $enable_doscompile in msvc) if test "x${LD+set}" = xset; then :; else LD=link fi ;; esac ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Initialize automake and libtool { # START # Test if force_shared has been set if test "x" = xforce_shared; then if test x$enable_shared = xno; then { { echo "$as_me:$LINENO: error: Shared libraries are disabled by user, but this is not feasible with the given options" >&5 echo "$as_me: error: Shared libraries are disabled by user, but this is not feasible with the given options" >&2;} { (exit 1); exit 1; }; } fi enable_shared=yes; else # On Cygwin and AIX, building DLLs doesn't work case $build in *-cygwin*) coin_disable_shared=yes platform=Cygwin ;; *-aix*) coin_disable_shared=yes platform=AIX ;; *-mingw*) coin_disable_shared=yes platform="Msys" # case "$CXX" in # cl*) # coin_disable_shared=yes # platform="Msys with cl" # ;; # esac ;; esac fi if test x"$coin_disable_shared" = xyes; then if test x"$enable_shared" = xyes; then { echo "$as_me:$LINENO: WARNING: On $platform, shared objects are not supported. I'm disabling your choice." >&5 echo "$as_me: WARNING: On $platform, shared objects are not supported. I'm disabling your choice." >&2;} fi enable_shared=no fi # By default, we only want the shared objects to be compiled # Check whether --enable-static or --disable-static was given. if test "${enable_static+set}" = set; then enableval="$enable_static" p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=no fi; # Initialize automake echo "$as_me:$LINENO: checking for egrep" >&5 echo $ECHO_N "checking for egrep... $ECHO_C" >&6 if test "${ac_cv_prog_egrep+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if echo a | (grep -E '(a|b)') >/dev/null 2>&1 then ac_cv_prog_egrep='grep -E' else ac_cv_prog_egrep='egrep' fi fi echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 echo "${ECHO_T}$ac_cv_prog_egrep" >&6 EGREP=$ac_cv_prog_egrep am__api_version="1.9" # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi done done ;; esac done fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. We don't cache a # path for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the path is relative. INSTALL=$ac_install_sh fi fi echo "$as_me:$LINENO: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6 # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo "$as_me:$LINENO: checking whether build environment is sane" >&5 echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6 # Just in case sleep 1 echo timestamp > conftest.file # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&5 echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&2;} { (exit 1); exit 1; }; } fi test "$2" = conftest.file ) then # Ok. : else { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! Check your system clock" >&5 echo "$as_me: error: newly created file is older than distributed files! Check your system clock" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 test "$program_prefix" != NONE && program_transform_name="s,^,$program_prefix,;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s,\$,$program_suffix,;$program_transform_name" # Double any \ or $. echo might interpret backslashes. # By default was `s,x,x', remove it if useless. cat <<\_ACEOF >conftest.sed s/[\\$]/&&/g;s/;s,x,x,$// _ACEOF program_transform_name=`echo $program_transform_name | sed -f conftest.sed` rm conftest.sed # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then # We used to keeping the `.' as first argument, in order to # allow $(mkdir_p) to be used without argument. As in # $(mkdir_p) $(somedir) # where $(somedir) is conditionally defined. However this is wrong # for two reasons: # 1. if the package is installed by a user who cannot write `.' # make install will fail, # 2. the above comment should most certainly read # $(mkdir_p) $(DESTDIR)$(somedir) # so it does not work when $(somedir) is undefined and # $(DESTDIR) is not. # To support the latter case, we have to write # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), # so the `.' trick is pointless. mkdir_p='mkdir -p --' else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. for d in ./-p ./--version; do test -d $d && rmdir $d done # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. if test -f "$ac_aux_dir/mkinstalldirs"; then mkdir_p='$(mkinstalldirs)' else mkdir_p='$(install_sh) -d' fi fi for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_AWK+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then echo "$as_me:$LINENO: result: $AWK" >&5 echo "${ECHO_T}$AWK" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$AWK" && break done echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.make <<\_ACEOF all: @echo 'ac_maketemp="$(MAKE)"' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` if test -n "$ac_maketemp"; then eval ac_cv_prog_make_${ac_make}_set=yes else eval ac_cv_prog_make_${ac_make}_set=no fi rm -f conftest.make fi if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 SET_MAKE= else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo done .PHONY: am__doit END # If we don't find an include directive, just comment out the code. echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6 am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # We grep out `Entering directory' and `Leaving directory' # messages which can occur if `w' ends up in MAKEFLAGS. # In particular we don't look at `^make:' because GNU make might # be invoked under some other name (usually "gmake"), in which # case it prints its new name instead of `make'. if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then am__include=include am__quote= _am_result=GNU fi # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then am__include=.include am__quote="\"" _am_result=BSD fi fi echo "$as_me:$LINENO: result: $_am_result" >&5 echo "${ECHO_T}$_am_result" >&6 rm -f confinc confmf # Check whether --enable-dependency-tracking or --disable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then enableval="$enable_dependency_tracking" fi; if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi # AC_MSG_NOTICE([Beginning automake initialisation.]) # Stuff for automake # test to see if srcdir already configured if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} { (exit 1); exit 1; }; } fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='dylp' VERSION='1.6.0' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} install_sh=${install_sh-"$am_aux_dir/install-sh"} # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then echo "$as_me:$LINENO: result: $STRIP" >&5 echo "${ECHO_T}$STRIP" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 echo "${ECHO_T}$ac_ct_STRIP" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi STRIP=$ac_ct_STRIP else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. AMTAR=${AMTAR-"${am_missing_run}tar"} am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' depcc="$CC" am_compiler_list= echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6 CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi depcc="$CXX" am_compiler_list= echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5 echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6 CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5 echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6 # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then enableval="$enable_maintainer_mode" USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi; echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5 echo "${ECHO_T}$USE_MAINTAINER_MODE" >&6 if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE coin_have_externals=no if test "$enable_maintainer_mode" = yes; then # If maintainer mode is chosen, we make sure that the correct versions # of the tools are used, and that we know where libtool.m4 is (to # recreate acinclude.m4) LIBTOOLM4= # Normally, $HOME AUTOTOOLS_DFLT=$HOME echo "$as_me:$LINENO: checking whether we are using the correct autotools" >&5 echo $ECHO_N "checking whether we are using the correct autotools... $ECHO_C" >&6 if test "${ac_cv_use_correct_autotools+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_use_correct_autotools=check fi echo "$as_me:$LINENO: result: $ac_cv_use_correct_autotools" >&5 echo "${ECHO_T}$ac_cv_use_correct_autotools" >&6 if test $ac_cv_use_correct_autotools = check; then ac_cv_use_correct_autotools=yes # Check if we have autoconf # Extract the first word of "autoconf", so it can be a program name with args. set dummy autoconf; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_have_autoconf+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$have_autoconf"; then ac_cv_prog_have_autoconf="$have_autoconf" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_have_autoconf="yes" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_have_autoconf" && ac_cv_prog_have_autoconf="no" fi fi have_autoconf=$ac_cv_prog_have_autoconf if test -n "$have_autoconf"; then echo "$as_me:$LINENO: result: $have_autoconf" >&5 echo "${ECHO_T}$have_autoconf" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi if test $have_autoconf = no; then { { echo "$as_me:$LINENO: error: You specified you want to use maintainer mode, but I cannot find autoconf in your path." >&5 echo "$as_me: error: You specified you want to use maintainer mode, but I cannot find autoconf in your path." >&2;} { (exit 1); exit 1; }; } fi # Check whether autoconf is the correct version correct_version='2.59' grep_version=`echo $correct_version | sed -e 's/\\./\\\\\\./g'` echo "$as_me:$LINENO: checking whether we are using the correct version ($correct_version) of autoconf" >&5 echo $ECHO_N "checking whether we are using the correct version ($correct_version) of autoconf... $ECHO_C" >&6 autoconf --version > confauto.out 2>&1 if $EGREP $grep_version confauto.out >/dev/null 2>&1; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else rm -f confauto.out echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 { { echo "$as_me:$LINENO: error: You don't have the correct version of autoconf as the first one in your path." >&5 echo "$as_me: error: You don't have the correct version of autoconf as the first one in your path." >&2;} { (exit 1); exit 1; }; } fi rm -f confauto.out # Check if the executable autoconf is picked up from the correct location echo "$as_me:$LINENO: checking whether autoconf is coming from the correct location" >&5 echo $ECHO_N "checking whether autoconf is coming from the correct location... $ECHO_C" >&6 autoconf_dir=`which autoconf | sed -e 's=/autoconf=='` autoconf_dir=`cd $autoconf_dir; pwd` if test x$AUTOTOOLS_DIR = x; then want_dir=$AUTOTOOLS_DFLT/bin else want_dir=$AUTOTOOLS_DIR/bin fi if test $autoconf_dir = `cd $want_dir; pwd`; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else rm -f confauto.out echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 { { echo "$as_me:$LINENO: error: The autoconf executable should be picked up from \$AUTOTOOLS_DFLT/bin or \$AUTOTOOLS_DIR/bin." >&5 echo "$as_me: error: The autoconf executable should be picked up from \$AUTOTOOLS_DFLT/bin or \$AUTOTOOLS_DIR/bin." >&2;} { (exit 1); exit 1; }; } fi # Check if we have automake # Extract the first word of "automake", so it can be a program name with args. set dummy automake; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_have_automake+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$have_automake"; then ac_cv_prog_have_automake="$have_automake" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_have_automake="yes" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_have_automake" && ac_cv_prog_have_automake="no" fi fi have_automake=$ac_cv_prog_have_automake if test -n "$have_automake"; then echo "$as_me:$LINENO: result: $have_automake" >&5 echo "${ECHO_T}$have_automake" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi if test $have_automake = no; then { { echo "$as_me:$LINENO: error: You specified you want to use maintainer mode, but I cannot find automake in your path." >&5 echo "$as_me: error: You specified you want to use maintainer mode, but I cannot find automake in your path." >&2;} { (exit 1); exit 1; }; } fi # Check whether automake is the correct version correct_version='1.9.6' grep_version=`echo $correct_version | sed -e 's/\\./\\\\\\./g'` echo "$as_me:$LINENO: checking whether we are using the correct version ($correct_version) of automake" >&5 echo $ECHO_N "checking whether we are using the correct version ($correct_version) of automake... $ECHO_C" >&6 automake --version > confauto.out 2>&1 if $EGREP $grep_version confauto.out >/dev/null 2>&1; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else rm -f confauto.out echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 { { echo "$as_me:$LINENO: error: You don't have the correct version of automake as the first one in your path." >&5 echo "$as_me: error: You don't have the correct version of automake as the first one in your path." >&2;} { (exit 1); exit 1; }; } fi rm -f confauto.out # Check if the executable automake is picked up from the correct location echo "$as_me:$LINENO: checking whether automake is coming from the correct location" >&5 echo $ECHO_N "checking whether automake is coming from the correct location... $ECHO_C" >&6 automake_dir=`which automake | sed -e 's=/automake=='` automake_dir=`cd $automake_dir; pwd` if test x$AUTOTOOLS_DIR = x; then want_dir=$AUTOTOOLS_DFLT/bin else want_dir=$AUTOTOOLS_DIR/bin fi if test $automake_dir = `cd $want_dir; pwd`; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else rm -f confauto.out echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 { { echo "$as_me:$LINENO: error: The automake executable should be picked up from \$AUTOTOOLS_DFLT/bin or \$AUTOTOOLS_DIR/bin." >&5 echo "$as_me: error: The automake executable should be picked up from \$AUTOTOOLS_DFLT/bin or \$AUTOTOOLS_DIR/bin." >&2;} { (exit 1); exit 1; }; } fi # Check if this is the correct version of libtool (with escaped dots) if test x$AUTOTOOLS_DIR = x; then want_dir=$AUTOTOOLS_DFLT/share else want_dir=$AUTOTOOLS_DIR/share fi correct_version='1.5.22' grep_version=`echo $correct_version | sed -e 's/\\./\\\\\\./g'` if test -r $want_dir/libtool/ltmain.sh; then have_ltmain=yes : else have_ltmain=no : fi echo "$as_me:$LINENO: checking whether we are using the correct version ($correct_version) of libtool." >&5 echo $ECHO_N "checking whether we are using the correct version ($correct_version) of libtool.... $ECHO_C" >&6 if test $have_ltmain = yes; then if $EGREP $grep_version $want_dir/libtool/ltmain.sh >/dev/null 2>&1; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 { { echo "$as_me:$LINENO: error: You don't have the correct version of libtool." >&5 echo "$as_me: error: You don't have the correct version of libtool." >&2;} { (exit 1); exit 1; }; } fi else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 { { echo "$as_me:$LINENO: error: I cannot find the ltmain.sh file." >&5 echo "$as_me: error: I cannot find the ltmain.sh file." >&2;} { (exit 1); exit 1; }; } fi fi # Check if we can find the libtool file if test x$AUTOTOOLS_DIR = x; then want_dir=$AUTOTOOLS_DFLT/share else want_dir=$AUTOTOOLS_DIR/share fi if test -r $want_dir/aclocal/libtool.m4; then LIBTOOLM4="$want_dir/aclocal/libtool.m4" : else { { echo "$as_me:$LINENO: error: I cannot find the libtool.m4 file." >&5 echo "$as_me: error: I cannot find the libtool.m4 file." >&2;} { (exit 1); exit 1; }; } : fi # Check if we have an Externals file if test -r $srcdir/Externals; then coin_have_externals=yes fi # Check if subversion is installed and understands https # Extract the first word of "svn", so it can be a program name with args. set dummy svn; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_have_svn+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$have_svn"; then ac_cv_prog_have_svn="$have_svn" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_have_svn="yes" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_have_svn" && ac_cv_prog_have_svn="no" fi fi have_svn=$ac_cv_prog_have_svn if test -n "$have_svn"; then echo "$as_me:$LINENO: result: $have_svn" >&5 echo "${ECHO_T}$have_svn" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi if test x$have_svn = xyes; then echo "$as_me:$LINENO: checking whether svn understands https" >&5 echo $ECHO_N "checking whether svn understands https... $ECHO_C" >&6 if test "${ac_cv_svn_understands_https+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else svn --version > confauto.out 2>&1 if $EGREP https confauto.out >/dev/null 2>&1; then ac_cv_svn_understands_https=yes else ac_cv_svn_understands_https=no have_svn=no ac_cv_prog_have_svn=no fi rm -f confauto.out fi echo "$as_me:$LINENO: result: $ac_cv_svn_understands_https" >&5 echo "${ECHO_T}$ac_cv_svn_understands_https" >&6 fi # Find the location of the BuildTools directory BUILDTOOLSDIR= if test -r $srcdir/BuildTools/coin.m4; then BUILDTOOLSDIR=$srcdir/BuildTools else if test -r $srcdir/../BuildTools/coin.m4; then BUILDTOOLSDIR=$srcdir/../BuildTools else if test -r $srcdir/../../BuildTools/coin.m4; then BUILDTOOLSDIR=$srcdir/../../BuildTools else { { echo "$as_me:$LINENO: error: Cannot find the BuildTools directory" >&5 echo "$as_me: error: Cannot find the BuildTools directory" >&2;} { (exit 1); exit 1; }; } fi fi fi # The following variable is set to the name of the directory where # the autotool scripts are located AUX_DIR=$ac_aux_dir fi # helpful variable for the base directory of this package abs_source_dir=`cd $srcdir; pwd` # Stuff for example Makefiles if test x$prefix = xNONE; then full_prefix=$ac_default_prefix else full_prefix=$prefix fi full_prefix=`cd $full_prefix ; pwd` abs_lib_dir=$full_prefix/lib abs_include_dir=$full_prefix/include abs_bin_dir=$full_prefix/bin if test $coin_have_externals = yes && test x$have_svn = xyes; then HAVE_EXTERNALS_TRUE= HAVE_EXTERNALS_FALSE='#' else HAVE_EXTERNALS_TRUE='#' HAVE_EXTERNALS_FALSE= fi # AC_MSG_NOTICE([End automake initialisation.]) LIBTOOL= if test -r ../libtool; then coin_config_dir=.. LIBTOOL='$(SHELL) $(top_builddir)/../libtool' fi if test "x$LIBTOOL" = x; then if test -r ../../libtool; then coin_config_dir=../.. LIBTOOL='$(SHELL) $(top_builddir)/../../libtool' fi fi if test "x$LIBTOOL" = x; then # AC_MSG_NOTICE([Creating libtool script (calling COIN_PROG_LIBTOOL).]) # Stuff for libtool # Check whether --enable-shared or --disable-shared was given. if test "${enable_shared+set}" = set; then enableval="$enable_shared" p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi; # Check whether --enable-fast-install or --disable-fast-install was given. if test "${enable_fast_install+set}" = set; then enableval="$enable_fast_install" p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi; echo "$as_me:$LINENO: checking host system type" >&5 echo $ECHO_N "checking host system type... $ECHO_C" >&6 if test "${ac_cv_host+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_host_alias=$host_alias test -z "$ac_cv_host_alias" && ac_cv_host_alias=$ac_cv_build_alias ac_cv_host=`$ac_config_sub $ac_cv_host_alias` || { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5 echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:$LINENO: result: $ac_cv_host" >&5 echo "${ECHO_T}$ac_cv_host" >&6 host=$ac_cv_host host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6 if test "${lt_cv_path_SED+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done fi SED=$lt_cv_path_SED echo "$as_me:$LINENO: result: $SED" >&5 echo "${ECHO_T}$SED" >&6 # Check whether --with-gnu-ld or --without-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then withval="$with_gnu_ld" test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi; ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. echo "$as_me:$LINENO: checking for ld used by $CC" >&5 echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then echo "$as_me:$LINENO: checking for GNU ld" >&5 echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 else echo "$as_me:$LINENO: checking for non-GNU ld" >&5 echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 fi if test "${lt_cv_path_LD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 echo "${ECHO_T}$LD" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} { (exit 1); exit 1; }; } echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 if test "${lt_cv_prog_gnu_ld+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 with_gnu_ld=$lt_cv_prog_gnu_ld echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5 echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6 if test "${lt_cv_ld_reload_flag+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_ld_reload_flag='-r' fi echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5 echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6 reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5 echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6 if test "${lt_cv_path_NM+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm fi fi echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5 echo "${ECHO_T}$lt_cv_path_NM" >&6 NM="$lt_cv_path_NM" echo "$as_me:$LINENO: checking whether ln -s works" >&5 echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6 LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:$LINENO: result: no, using $LN_S" >&5 echo "${ECHO_T}no, using $LN_S" >&6 fi echo "$as_me:$LINENO: checking how to recognise dependent libraries" >&5 echo $ECHO_N "checking how to recognise dependent libraries... $ECHO_C" >&6 if test "${lt_cv_deplibs_check_method+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix4* | aix5*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump'. lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | kfreebsd*-gnu | dragonfly*) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix3*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be Linux ELF. linux*) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; nto-qnx*) lt_cv_deplibs_check_method=unknown ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; esac fi echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5 echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6 file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check whether --enable-libtool-lock or --disable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then enableval="$enable_libtool_lock" fi; test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line 5815 "configure"' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6 if test "${lt_cv_cc_needs_belf+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then lt_cv_cc_needs_belf=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 lt_cv_cc_needs_belf=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6 if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; sparc*-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) LD="${LD-ld} -m elf64_sparc" ;; *) LD="${LD-ld} -64" ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test "${ac_cv_prog_CPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi echo "$as_me:$LINENO: result: $CPP" >&5 echo "${ECHO_T}$CPP" >&6 ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&5 echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu echo "$as_me:$LINENO: checking for ANSI C header files" >&5 echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 if test "${ac_cv_header_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_header_stdc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stdc=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 echo "${ECHO_T}$ac_cv_header_stdc" >&6 if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF #define STDC_HEADERS 1 _ACEOF fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_Header=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_Header=no" fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ----------------------------------------- ## ## Report this to coin-dylp@list.coin-or.org ## ## ----------------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then ac_ext=cc ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6 if test -z "$CXXCPP"; then if test "${ac_cv_prog_CXXCPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi echo "$as_me:$LINENO: result: $CXXCPP" >&5 echo "${ECHO_T}$CXXCPP" >&6 ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details." >&5 echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi ac_ext=cc ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$F77"; then ac_cv_prog_F77="$F77" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_F77="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi F77=$ac_cv_prog_F77 if test -n "$F77"; then echo "$as_me:$LINENO: result: $F77" >&5 echo "${ECHO_T}$F77" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$F77" && break done fi if test -z "$F77"; then ac_ct_F77=$F77 for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_F77"; then ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_F77="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_F77=$ac_cv_prog_ac_ct_F77 if test -n "$ac_ct_F77"; then echo "$as_me:$LINENO: result: $ac_ct_F77" >&5 echo "${ECHO_T}$ac_ct_F77" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$ac_ct_F77" && break done F77=$ac_ct_F77 fi # Provide some information about the compiler. echo "$as_me:6949:" \ "checking for Fortran 77 compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 (eval $ac_compiler --version &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 (eval $ac_compiler -v &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 (eval $ac_compiler -V &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } rm -f a.out # If we don't use `.F' as extension, the preprocessor is not run on the # input file. (Note that this only needs to work for GNU compilers.) ac_save_ext=$ac_ext ac_ext=F echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5 echo $ECHO_N "checking whether we are using the GNU Fortran 77 compiler... $ECHO_C" >&6 if test "${ac_cv_f77_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF program main #ifndef __GNUC__ choke me #endif end _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_f77_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_f77_compiler_gnu=$ac_compiler_gnu fi echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_f77_compiler_gnu" >&6 ac_ext=$ac_save_ext ac_test_FFLAGS=${FFLAGS+set} ac_save_FFLAGS=$FFLAGS FFLAGS= echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5 echo $ECHO_N "checking whether $F77 accepts -g... $ECHO_C" >&6 if test "${ac_cv_prog_f77_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else FFLAGS=-g cat >conftest.$ac_ext <<_ACEOF program main end _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_f77_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_f77_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_prog_f77_g=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5 echo "${ECHO_T}$ac_cv_prog_f77_g" >&6 if test "$ac_test_FFLAGS" = set; then FFLAGS=$ac_save_FFLAGS elif test $ac_cv_prog_f77_g = yes; then if test "x$ac_cv_f77_compiler_gnu" = xyes; then FFLAGS="-g -O2" else FFLAGS="-g" fi else if test "x$ac_cv_f77_compiler_gnu" = xyes; then FFLAGS="-O2" else FFLAGS= fi fi G77=`test $ac_compiler_gnu = yes && echo yes` ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! # find the maximum length of command line arguments echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5 echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6 if test "${lt_cv_sys_max_cmd_len+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} while (test "X"`$SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \ = "XX$teststring") >/dev/null 2>&1 && new_result=`expr "X$teststring" : ".*" 2>&1` && lt_cv_sys_max_cmd_len=$new_result && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done teststring= # Add a significant safety factor because C++ compilers can tack on massive # amounts of additional arguments before passing them to the linker. # It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5 echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6 else echo "$as_me:$LINENO: result: none" >&5 echo "${ECHO_T}none" >&6 fi # Check for command to grab the raw symbol name followed by C symbol from nm. echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5 echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6 if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Transform an extracted symbol line into a proper C declaration lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32*) symcode='[ABCDGISTW]' ;; hpux*) # Its linker distinguishes data from code symbols if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" ;; linux*) if test "$host_cpu" = ia64; then symcode='[ABCDGIRSTW]' lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Try without a prefix undercore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Now try to grab the symbols. nlist=conftest.nm if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5 (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if grep ' nm_test_var$' "$nlist" >/dev/null; then if grep ' nm_test_func$' "$nlist" >/dev/null; then cat < conftest.$ac_ext #ifdef __cplusplus extern "C" { #endif EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' cat <> conftest.$ac_ext #if defined (__STDC__) && __STDC__ # define lt_ptr_t void * #else # define lt_ptr_t char * # define const #endif /* The mapping between symbol names and symbols. */ const struct { const char *name; lt_ptr_t address; } lt_preloaded_symbols[] = { EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext cat <<\EOF >> conftest.$ac_ext {0, (lt_ptr_t) 0} }; #ifdef __cplusplus } #endif EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_save_LIBS="$LIBS" lt_save_CFLAGS="$CFLAGS" LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS="$lt_save_LIBS" CFLAGS="$lt_save_CFLAGS" else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -f conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then echo "$as_me:$LINENO: result: failed" >&5 echo "${ECHO_T}failed" >&6 else echo "$as_me:$LINENO: result: ok" >&5 echo "${ECHO_T}ok" >&6 fi echo "$as_me:$LINENO: checking for objdir" >&5 echo $ECHO_N "checking for objdir... $ECHO_C" >&6 if test "${lt_cv_objdir+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5 echo "${ECHO_T}$lt_cv_objdir" >&6 objdir=$lt_cv_objdir case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed='sed -e 1s/^X//' sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' # Constants: rm="rm -f" # Global variables: default_ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a ltmain="$ac_aux_dir/ltmain.sh" ofile="$default_ofile" with_gnu_ld="$lt_cv_prog_gnu_ld" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_AR+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="${ac_tool_prefix}ar" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then echo "$as_me:$LINENO: result: $AR" >&5 echo "${ECHO_T}$AR" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_AR+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="ar" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="false" fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 echo "${ECHO_T}$ac_ct_AR" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi AR=$ac_ct_AR else AR="$ac_cv_prog_AR" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then echo "$as_me:$LINENO: result: $RANLIB" >&5 echo "${ECHO_T}$RANLIB" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 echo "${ECHO_T}$ac_ct_RANLIB" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi RANLIB=$ac_ct_RANLIB else RANLIB="$ac_cv_prog_RANLIB" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then echo "$as_me:$LINENO: result: $STRIP" >&5 echo "${ECHO_T}$STRIP" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 echo "${ECHO_T}$ac_ct_STRIP" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi STRIP=$ac_ct_STRIP else STRIP="$ac_cv_prog_STRIP" fi old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$AR" && AR=ar test -z "$AR_FLAGS" && AR_FLAGS=cru test -z "$AS" && AS=as test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$LD" && LD=ld test -z "$LN_S" && LN_S="ln -s" test -z "$MAGIC_CMD" && MAGIC_CMD=file test -z "$NM" && NM=nm test -z "$SED" && SED=sed test -z "$OBJDUMP" && OBJDUMP=objdump test -z "$RANLIB" && RANLIB=: test -z "$STRIP" && STRIP=: test -z "$ac_objext" && ac_objext=o # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6 if test "${lt_cv_path_MAGIC_CMD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 echo "${ECHO_T}$MAGIC_CMD" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then echo "$as_me:$LINENO: checking for file" >&5 echo $ECHO_N "checking for file... $ECHO_C" >&6 if test "${lt_cv_path_MAGIC_CMD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 echo "${ECHO_T}$MAGIC_CMD" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi else MAGIC_CMD=: fi fi fi ;; esac enable_dlopen=no enable_win32_dll=no # Check whether --enable-libtool-lock or --disable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then enableval="$enable_libtool_lock" fi; test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Check whether --with-pic or --without-pic was given. if test "${with_pic+set}" = set; then withval="$with_pic" pic_mode="$withval" else pic_mode=default fi; test -z "$pic_mode" && pic_mode=default # Use C for the default configuration in the libtool script tagname= lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;\n" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}\n' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $rm conftest* ac_outfile=conftest.$ac_objext printf "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $rm conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then lt_prog_compiler_no_builtin_flag=' -fno-builtin' echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:8016: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:8020: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6 if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; interix3*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; *) lt_prog_compiler_pic='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case $cc_basename in xlc*) lt_prog_compiler_pic='-qnocommon' lt_prog_compiler_wl='-Wl,' ;; esac ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; linux*) case $cc_basename in icc* | ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; pgcc* | pgf77* | pgf90* | pgf95*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; esac ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5 echo "${ECHO_T}$lt_prog_compiler_pic" >&6 # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6 if test "${lt_prog_compiler_pic_works+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:8284: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:8288: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_prog_compiler_pic_works=yes fi fi $rm conftest* fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6 if test x"$lt_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6 if test "${lt_prog_compiler_static_works+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" printf "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_prog_compiler_static_works=yes fi else lt_prog_compiler_static_works=yes fi fi $rm conftest* LDFLAGS="$save_LDFLAGS" fi echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5 echo "${ECHO_T}$lt_prog_compiler_static_works" >&6 if test x"$lt_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_c_o+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_c_o=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:8388: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:8392: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6 hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no echo "$as_me:$LINENO: result: $hard_links" >&5 echo "${ECHO_T}$hard_links" >&6 if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 runpath_var= allow_undefined_flag= enable_shared_with_static_runtimes=no archive_cmds= archive_expsym_cmds= old_archive_From_new_cmds= old_archive_from_expsyms_cmds= export_dynamic_flag_spec= whole_archive_flag_spec= thread_safe_flag_spec= hardcode_libdir_flag_spec= hardcode_libdir_flag_spec_ld= hardcode_libdir_separator= hardcode_direct=no hardcode_minus_L=no hardcode_shlibpath_var=unsupported link_all_deplibs=unknown hardcode_automatic=no module_cmds= module_expsym_cmds= always_export_symbols=no export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms="_GLOBAL_OFFSET_TABLE_" # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. extract_expsyms_cmds= # Just being paranoid about ensuring that cc_basename is set. for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` case $host_os in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>/dev/null` in *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. EOF fi ;; amigaos*) archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can't use # them. ld_shlibs=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; interix3*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; linux*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_addflag= case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; esac archive_cmds='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test $supports_anon_versioning = yes; then archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ $echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. EOF elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_libdir_separator=':' link_all_deplibs=yes if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 hardcode_direct=yes else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # see comment about different semantics on the GNU ld section ld_shlibs=no ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_From_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs' fix_srcfile_path='`cygpath -w "$srcfile"`' enable_shared_with_static_runtimes=yes ;; darwin* | rhapsody*) case $host_os in rhapsody* | darwin1.[012]) allow_undefined_flag='${wl}-undefined ${wl}suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[012]) allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) allow_undefined_flag='${wl}-undefined ${wl}dynamic_lookup' ;; esac fi ;; esac archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported whole_archive_flag_spec='' link_all_deplibs=yes if test "$GCC" = yes ; then output_verbose_link_cmd='echo' archive_cmds='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else case $cc_basename in xlc*) output_verbose_link_cmd='echo' archive_cmds='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) ld_shlibs=no ;; esac fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; freebsd1*) ld_shlibs=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | kfreebsd*-gnu | dragonfly*) archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_libdir_flag_spec_ld='+b $libdir' hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_ld='-rpath $libdir' fi hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: link_all_deplibs=yes ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; openbsd*) hardcode_direct=yes hardcode_shlibpath_var=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_From_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' fi hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z text' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine linker options so we # cannot just pass the convience library names through # without $wl, iff we do not link with $LD. # Luckily, gcc supports the same syntax we need for Sun Studio. # Supported since Solaris 2.6 (maybe 2.5.1?) case $wlarc in '') whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; *) whole_archive_flag_spec='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; esac ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac fi echo "$as_me:$LINENO: result: $ld_shlibs" >&5 echo "${ECHO_T}$ld_shlibs" >&6 test "$ld_shlibs" = no && can_build_shared=no # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 $rm conftest* printf "$lt_simple_compile_test_code" > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } then archive_cmds_need_lc=no else archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5 echo "${ECHO_T}$archive_cmds_need_lc" >&6 ;; esac fi ;; esac echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix4* | aix5*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` else sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' fi sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; kfreebsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[123]*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; freebsd*) # from 4.6 on shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; interix3*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; knetbsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' shlibpath_overrides_runpath=no else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' shlibpath_overrides_runpath=yes case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac echo "$as_me:$LINENO: result: $dynamic_linker" >&5 echo "${ECHO_T}$dynamic_linker" >&6 test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 hardcode_action= if test -n "$hardcode_libdir_flag_spec" || \ test -n "$runpath_var" || \ test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi echo "$as_me:$LINENO: result: $hardcode_action" >&5 echo "${ECHO_T}$hardcode_action" >&6 if test "$hardcode_action" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi striplib= old_striplib= echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi ;; *) echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 ;; esac fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dl_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dl_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 if test $ac_cv_lib_dl_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) echo "$as_me:$LINENO: checking for shl_load" >&5 echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 if test "${ac_cv_func_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define shl_load to an innocuous variant, in case declares shl_load. For example, HP-UX 11i declares gettimeofday. */ #define shl_load innocuous_shl_load /* System header to define __stub macros and hopefully few prototypes, which can conflict with char shl_load (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef shl_load /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char shl_load (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_shl_load) || defined (__stub___shl_load) choke me #else char (*f) () = shl_load; #endif #ifdef __cplusplus } #endif int main () { return f != shl_load; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_shl_load=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_shl_load=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 echo "${ECHO_T}$ac_cv_func_shl_load" >&6 if test $ac_cv_func_shl_load = yes; then lt_cv_dlopen="shl_load" else echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 if test "${ac_cv_lib_dld_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char shl_load (); int main () { shl_load (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dld_shl_load=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dld_shl_load=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 if test $ac_cv_lib_dld_shl_load = yes; then lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" else echo "$as_me:$LINENO: checking for dlopen" >&5 echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 if test "${ac_cv_func_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define dlopen to an innocuous variant, in case declares dlopen. For example, HP-UX 11i declares gettimeofday. */ #define dlopen innocuous_dlopen /* System header to define __stub macros and hopefully few prototypes, which can conflict with char dlopen (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef dlopen /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_dlopen) || defined (__stub___dlopen) choke me #else char (*f) () = dlopen; #endif #ifdef __cplusplus } #endif int main () { return f != dlopen; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 echo "${ECHO_T}$ac_cv_func_dlopen" >&6 if test $ac_cv_func_dlopen = yes; then lt_cv_dlopen="dlopen" else echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dl_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dl_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 if test $ac_cv_lib_dl_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 if test "${ac_cv_lib_svld_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_svld_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_svld_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 if test $ac_cv_lib_svld_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 if test "${ac_cv_lib_dld_dld_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dld_link (); int main () { dld_link (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dld_dld_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dld_dld_link=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 if test $ac_cv_lib_dld_dld_link = yes; then lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 if test "${lt_cv_dlopen_self+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } else puts (dlerror ()); exit (status); } EOF if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 echo "${ECHO_T}$lt_cv_dlopen_self" >&6 if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 if test "${lt_cv_dlopen_self_static+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } else puts (dlerror ()); exit (status); } EOF if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi # Report which library types will actually be built echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 echo "$as_me:$LINENO: result: $can_build_shared" >&5 echo "${ECHO_T}$can_build_shared" >&6 echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6 test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix4* | aix5*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac echo "$as_me:$LINENO: result: $enable_shared" >&5 echo "${ECHO_T}$enable_shared" >&6 echo "$as_me:$LINENO: checking whether to build static libraries" >&5 echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes echo "$as_me:$LINENO: result: $enable_static" >&5 echo "${ECHO_T}$enable_static" >&6 # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler \ CC \ LD \ lt_prog_compiler_wl \ lt_prog_compiler_pic \ lt_prog_compiler_static \ lt_prog_compiler_no_builtin_flag \ export_dynamic_flag_spec \ thread_safe_flag_spec \ whole_archive_flag_spec \ enable_shared_with_static_runtimes \ old_archive_cmds \ old_archive_from_new_cmds \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ archive_cmds \ archive_expsym_cmds \ postinstall_cmds \ postuninstall_cmds \ old_archive_from_expsyms_cmds \ allow_undefined_flag \ no_undefined_flag \ export_symbols_cmds \ hardcode_libdir_flag_spec \ hardcode_libdir_flag_spec_ld \ hardcode_libdir_separator \ hardcode_automatic \ module_cmds \ module_expsym_cmds \ lt_cv_prog_compiler_c_o \ exclude_expsyms \ include_expsyms; do case $var in old_archive_cmds | \ old_archive_from_new_cmds | \ archive_cmds | \ archive_expsym_cmds | \ module_cmds | \ module_expsym_cmds | \ old_archive_from_expsyms_cmds | \ export_symbols_cmds | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="${ofile}T" trap "$rm \"$cfgfile\"; exit 1" 1 2 15 $rm -f "$cfgfile" { echo "$as_me:$LINENO: creating $ofile" >&5 echo "$as_me: creating $ofile" >&6;} cat <<__EOF__ >> "$cfgfile" #! $SHELL # `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # # This file is part of GNU Libtool: # Originally by Gordon Matzigkeit , 1996 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="$SED -e 1s/^X//" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # The names of the tagged configurations supported by this script. available_tags= # ### BEGIN LIBTOOL CONFIG # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # LTCC compiler flags. LTCFLAGS=$lt_LTCFLAGS # A language-specific compiler. CC=$lt_compiler # Is the compiler the GNU C compiler? with_gcc=$GCC # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Must we lock files when doing compilation? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path="$fix_srcfile_path" # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # ### END LIBTOOL CONFIG __EOF__ case $host_os in aix3*) cat <<\EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi EOF ;; esac # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || \ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" # Check whether --with-tags or --without-tags was given. if test "${with_tags+set}" = set; then withval="$with_tags" tagnames="$withval" fi; if test -f "$ltmain" && test -n "$tagnames"; then if test ! -f "${ofile}"; then { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not exist" >&5 echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;} fi if test -z "$LTCC"; then eval "`$SHELL ${ofile} --config | grep '^LTCC='`" if test -z "$LTCC"; then { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not look like a libtool script" >&5 echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;} else { echo "$as_me:$LINENO: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5 echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;} fi fi if test -z "$LTCFLAGS"; then eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`" fi # Extract list of available tagged configurations in $ofile. # Note that this assumes the entire list is on one line. available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for tagname in $tagnames; do IFS="$lt_save_ifs" # Check whether tagname contains only valid characters case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in "") ;; *) { { echo "$as_me:$LINENO: error: invalid tag name: $tagname" >&5 echo "$as_me: error: invalid tag name: $tagname" >&2;} { (exit 1); exit 1; }; } ;; esac if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null then { { echo "$as_me:$LINENO: error: tag name \"$tagname\" already exists" >&5 echo "$as_me: error: tag name \"$tagname\" already exists" >&2;} { (exit 1); exit 1; }; } fi # Update the list of available tags. if test -n "$tagname"; then echo appending configuration tag \"$tagname\" to $ofile case $tagname in CXX) if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then ac_ext=cc ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_flag_spec_ld_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;\n" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $rm conftest* ac_outfile=conftest.$ac_objext printf "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $rm conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} compiler=$CC compiler_CXX=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` # We don't want -fno-exception wen compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld or --without-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then withval="$with_gnu_ld" test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi; ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. echo "$as_me:$LINENO: checking for ld used by $CC" >&5 echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then echo "$as_me:$LINENO: checking for GNU ld" >&5 echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 else echo "$as_me:$LINENO: checking for non-GNU ld" >&5 echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 fi if test "${lt_cv_path_LD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 echo "${ECHO_T}$LD" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} { (exit 1); exit 1; }; } echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 if test "${lt_cv_prog_gnu_ld+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ grep 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes if test "$GXX" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 hardcode_direct_CXX=yes else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols_CXX=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_CXX='-berok' # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' ${wl}-bernotok' allow_undefined_flag_CXX=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' archive_cmds_need_lc_CXX=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_CXX=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_CXX=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; darwin* | rhapsody*) case $host_os in rhapsody* | darwin1.[012]) allow_undefined_flag_CXX='${wl}-undefined ${wl}suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[012]) allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) allow_undefined_flag_CXX='${wl}-undefined ${wl}dynamic_lookup' ;; esac fi ;; esac archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported whole_archive_flag_spec_CXX='' link_all_deplibs_CXX=yes if test "$GXX" = yes ; then lt_int_apple_cc_single_mod=no output_verbose_link_cmd='echo' if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then lt_int_apple_cc_single_mod=yes fi if test "X$lt_int_apple_cc_single_mod" = Xyes ; then archive_cmds_CXX='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' else archive_cmds_CXX='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' fi module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds if test "X$lt_int_apple_cc_single_mod" = Xyes ; then archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' fi module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else case $cc_basename in xlc*) output_verbose_link_cmd='echo' archive_cmds_CXX='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) ld_shlibs_CXX=no ;; esac fi ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd[12]*) # C++ shared libraries reported to be fairly broken before switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | kfreebsd*-gnu | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; gnu*) ;; hpux9*) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='${wl}-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) archive_cmds_CXX='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes; then archive_cmds_CXX='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: case $host_cpu in hppa*64*|ia64*) hardcode_libdir_flag_spec_ld_CXX='+b $libdir' ;; *) export_dynamic_flag_spec_CXX='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; *) hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; interix3*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: ;; linux*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' hardcode_libdir_flag_spec_CXX='${wl}--rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc*) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC*) # Portland Group C++ compiler archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; openbsd2*) # C++ shared libraries are fairly broken ld_shlibs_CXX=no ;; openbsd*) hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='${wl}-E' whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd='echo' ;; osf3*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~ $rm $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC*) # Sun C++ 4.2, 5.x and Centerline C++ archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The C++ compiler is used as linker so we must use $wl # flag to pass the commands to the underlying system # linker. We must also pass each convience library through # to the system linker between allextract/defaultextract. # The C++ compiler will combine linker options so we # cannot just pass the convience library names through # without $wl. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; esac link_all_deplibs_CXX=yes output_verbose_link_cmd='echo' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then no_undefined_flag_CXX=' ${wl}-z ${wl}defs' if $CC --version | grep -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" fi hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_CXX='${wl}-z,text' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. # So that behaviour is only enabled if SCOABSPATH is set to a # non-empty value in the environment. Most likely only useful for # creating official distributions of packages. # This is a hack until libtool officially supports absolute path # names for shared libraries. no_undefined_flag_CXX='${wl}-z,text' allow_undefined_flag_CXX='${wl}-z,nodefs' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes export_dynamic_flag_spec_CXX='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 echo "${ECHO_T}$ld_shlibs_CXX" >&6 test "$ld_shlibs_CXX" = no && can_build_shared=no GCC_CXX="$GXX" LD_CXX="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... cat > conftest.$ac_ext <&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no # The `*' in the case matches for architectures that use `case' in # $output_verbose_cmd can trigger glob expansion during the loop # eval without this substitution. output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"` for p in `eval $output_verbose_link_cmd`; do case $p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" \ || test $p = "-R"; then prev=$p continue else prev= fi if test "$pre_test_object_deps_done" = no; then case $p in -L* | -R*) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX="${prev}${p}" else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX="${prev}${p}" else postdeps_CXX="${postdeps_CXX} ${prev}${p}" fi fi ;; *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$predep_objects_CXX"; then predep_objects_CXX="$p" else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX="$p" else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $rm -f confest.$objext # PORTME: override above test on systems where it is broken case $host_os in interix3*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. predep_objects_CXX= postdep_objects_CXX= postdeps_CXX= ;; solaris*) case $cc_basename in CC*) # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. postdeps_CXX='-lCstd -lCrun' ;; esac ;; esac case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | os2* | pw32*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; interix3*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix4* | aix5*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_AC_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case $cc_basename in xlc*) lt_prog_compiler_pic_CXX='-qnocommon' lt_prog_compiler_wl_CXX='-Wl,' ;; esac ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | kfreebsd*-gnu | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux*) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; icpc* | ecpc*) # Intel C++ lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC*) # Portland Group C++ compiler. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_CXX" >&6 # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... $ECHO_C" >&6 if test "${lt_prog_compiler_pic_works_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:13177: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:13181: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_prog_compiler_pic_works_CXX=yes fi fi $rm conftest* fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_CXX" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_works_CXX" >&6 if test x"$lt_prog_compiler_pic_works_CXX" = xyes; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6 if test "${lt_prog_compiler_static_works_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_static_works_CXX=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" printf "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_prog_compiler_static_works_CXX=yes fi else lt_prog_compiler_static_works_CXX=yes fi fi $rm conftest* LDFLAGS="$save_LDFLAGS" fi echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_CXX" >&5 echo "${ECHO_T}$lt_prog_compiler_static_works_CXX" >&6 if test x"$lt_prog_compiler_static_works_CXX" = xyes; then : else lt_prog_compiler_static_CXX= fi echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_c_o_CXX=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:13281: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:13285: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6 hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no echo "$as_me:$LINENO: result: $hard_links" >&5 echo "${ECHO_T}$hard_links" >&6 if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' case $host_os in aix4* | aix5*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX="$ltdll_cmds" ;; cygwin* | mingw*) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([^ ]*\) [^ ]*/\1 DATA/;/^I /d;/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 echo "${ECHO_T}$ld_shlibs_CXX" >&6 test "$ld_shlibs_CXX" = no && can_build_shared=no # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 $rm conftest* printf "$lt_simple_compile_test_code" > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { (eval echo "$as_me:$LINENO: \"$archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 (eval $archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } then archive_cmds_need_lc_CXX=no else archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5 echo "${ECHO_T}$archive_cmds_need_lc_CXX" >&6 ;; esac fi ;; esac echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix4* | aix5*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` else sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' fi sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; kfreebsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[123]*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; freebsd*) # from 4.6 on shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; interix3*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; knetbsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' shlibpath_overrides_runpath=no else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' shlibpath_overrides_runpath=yes case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac echo "$as_me:$LINENO: result: $dynamic_linker" >&5 echo "${ECHO_T}$dynamic_linker" >&6 test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || \ test -n "$runpath_var_CXX" || \ test "X$hardcode_automatic_CXX" = "Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct_CXX" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, CXX)" != no && test "$hardcode_minus_L_CXX" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5 echo "${ECHO_T}$hardcode_action_CXX" >&6 if test "$hardcode_action_CXX" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler_CXX \ CC_CXX \ LD_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_static_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ export_dynamic_flag_spec_CXX \ thread_safe_flag_spec_CXX \ whole_archive_flag_spec_CXX \ enable_shared_with_static_runtimes_CXX \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ postinstall_cmds_CXX \ postuninstall_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ export_symbols_cmds_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_flag_spec_ld_CXX \ hardcode_libdir_separator_CXX \ hardcode_automatic_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ lt_cv_prog_compiler_c_o_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX; do case $var in old_archive_cmds_CXX | \ old_archive_from_new_cmds_CXX | \ archive_cmds_CXX | \ archive_expsym_cmds_CXX | \ module_cmds_CXX | \ module_expsym_cmds_CXX | \ old_archive_from_expsyms_cmds_CXX | \ export_symbols_cmds_CXX | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="$ofile" cat <<__EOF__ >> "$cfgfile" # ### BEGIN LIBTOOL TAG CONFIG: $tagname # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # LTCC compiler flags. LTCFLAGS=$lt_LTCFLAGS # A language-specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU C compiler? with_gcc=$GCC_CXX # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD_CXX # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Must we lock files when doing compilation? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds_CXX old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects_CXX # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects_CXX # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps_CXX # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic_CXX # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path="$fix_srcfile_path_CXX" # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # ### END LIBTOOL TAG CONFIG: $tagname __EOF__ else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC=$lt_save_CC LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ldcxx=$with_gnu_ld with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld else tagname="" fi ;; F77) if test -n "$F77" && test "X$F77" != "Xno"; then ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu archive_cmds_need_lc_F77=no allow_undefined_flag_F77= always_export_symbols_F77=no archive_expsym_cmds_F77= export_dynamic_flag_spec_F77= hardcode_direct_F77=no hardcode_libdir_flag_spec_F77= hardcode_libdir_flag_spec_ld_F77= hardcode_libdir_separator_F77= hardcode_minus_L_F77=no hardcode_automatic_F77=no module_cmds_F77= module_expsym_cmds_F77= link_all_deplibs_F77=unknown old_archive_cmds_F77=$old_archive_cmds no_undefined_flag_F77= whole_archive_flag_spec_F77= enable_shared_with_static_runtimes_F77=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o objext_F77=$objext # Code to be used in simple compile tests lt_simple_compile_test_code=" subroutine t\n return\n end\n" # Code to be used in simple link tests lt_simple_link_test_code=" program t\n end\n" # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $rm conftest* ac_outfile=conftest.$ac_objext printf "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $rm conftest* # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${F77-"f77"} compiler=$CC compiler_F77=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 echo "$as_me:$LINENO: result: $can_build_shared" >&5 echo "${ECHO_T}$can_build_shared" >&6 echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6 test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix4* | aix5*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac echo "$as_me:$LINENO: result: $enable_shared" >&5 echo "${ECHO_T}$enable_shared" >&6 echo "$as_me:$LINENO: checking whether to build static libraries" >&5 echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes echo "$as_me:$LINENO: result: $enable_static" >&5 echo "${ECHO_T}$enable_static" >&6 GCC_F77="$G77" LD_F77="$LD" lt_prog_compiler_wl_F77= lt_prog_compiler_pic_F77= lt_prog_compiler_static_F77= echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 if test "$GCC" = yes; then lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_static_F77='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_F77='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4' ;; beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_F77='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_F77='-fno-common' ;; interix3*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared_F77=no enable_shared=no ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_F77=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_F77='-fPIC' ;; esac ;; *) lt_prog_compiler_pic_F77='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl_F77='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_F77='-Bstatic' else lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp' fi ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case $cc_basename in xlc*) lt_prog_compiler_pic_F77='-qnocommon' lt_prog_compiler_wl_F77='-Wl,' ;; esac ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_F77='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl_F77='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_F77='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static_F77='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl_F77='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static_F77='-non_shared' ;; newsos6) lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; linux*) case $cc_basename in icc* | ecc*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-static' ;; pgcc* | pgf77* | pgf90* | pgf95*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-fpic' lt_prog_compiler_static_F77='-Bstatic' ;; ccc*) lt_prog_compiler_wl_F77='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static_F77='-non_shared' ;; esac ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl_F77='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static_F77='-non_shared' ;; solaris*) lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' case $cc_basename in f77* | f90* | f95*) lt_prog_compiler_wl_F77='-Qoption ld ';; *) lt_prog_compiler_wl_F77='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl_F77='-Qoption ld ' lt_prog_compiler_pic_F77='-PIC' lt_prog_compiler_static_F77='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic_F77='-Kconform_pic' lt_prog_compiler_static_F77='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; unicos*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_can_build_shared_F77=no ;; uts4*) lt_prog_compiler_pic_F77='-pic' lt_prog_compiler_static_F77='-Bstatic' ;; *) lt_prog_compiler_can_build_shared_F77=no ;; esac fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_F77" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_F77" >&6 # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_F77"; then echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... $ECHO_C" >&6 if test "${lt_prog_compiler_pic_works_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_pic_works_F77=no ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_F77" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:14851: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:14855: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_prog_compiler_pic_works_F77=yes fi fi $rm conftest* fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_F77" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_works_F77" >&6 if test x"$lt_prog_compiler_pic_works_F77" = xyes; then case $lt_prog_compiler_pic_F77 in "" | " "*) ;; *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;; esac else lt_prog_compiler_pic_F77= lt_prog_compiler_can_build_shared_F77=no fi fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_F77= ;; *) lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77" ;; esac # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_F77 eval lt_tmp_static_flag=\"$lt_prog_compiler_static_F77\" echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6 if test "${lt_prog_compiler_static_works_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_static_works_F77=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" printf "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_prog_compiler_static_works_F77=yes fi else lt_prog_compiler_static_works_F77=yes fi fi $rm conftest* LDFLAGS="$save_LDFLAGS" fi echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_F77" >&5 echo "${ECHO_T}$lt_prog_compiler_static_works_F77" >&6 if test x"$lt_prog_compiler_static_works_F77" = xyes; then : else lt_prog_compiler_static_F77= fi echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_c_o_F77=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:14955: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:14959: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_F77=yes fi fi chmod u+w . 2>&5 $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_F77" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_c_o_F77" >&6 hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no echo "$as_me:$LINENO: result: $hard_links" >&5 echo "${ECHO_T}$hard_links" >&6 if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 runpath_var= allow_undefined_flag_F77= enable_shared_with_static_runtimes_F77=no archive_cmds_F77= archive_expsym_cmds_F77= old_archive_From_new_cmds_F77= old_archive_from_expsyms_cmds_F77= export_dynamic_flag_spec_F77= whole_archive_flag_spec_F77= thread_safe_flag_spec_F77= hardcode_libdir_flag_spec_F77= hardcode_libdir_flag_spec_ld_F77= hardcode_libdir_separator_F77= hardcode_direct_F77=no hardcode_minus_L_F77=no hardcode_shlibpath_var_F77=unsupported link_all_deplibs_F77=unknown hardcode_automatic_F77=no module_cmds_F77= module_expsym_cmds_F77= always_export_symbols_F77=no export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms_F77= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms_F77="_GLOBAL_OFFSET_TABLE_" # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. extract_expsyms_cmds= # Just being paranoid about ensuring that cc_basename is set. for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` case $host_os in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs_F77=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_F77='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_F77='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_F77= fi supports_anon_versioning=no case `$LD -v 2>/dev/null` in *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs_F77=no cat <&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. EOF fi ;; amigaos*) archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can't use # them. ld_shlibs_F77=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_F77=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_F77=no fi ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_F77='-L$libdir' allow_undefined_flag_F77=unsupported always_export_symbols_F77=no enable_shared_with_static_runtimes_F77=yes export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_F77=no fi ;; interix3*) hardcode_direct_F77=no hardcode_shlibpath_var_F77=no hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' export_dynamic_flag_spec_F77='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_F77='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; linux*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_addflag= case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; esac archive_cmds_F77='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test $supports_anon_versioning = yes; then archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ $echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi else ld_shlibs_F77=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs_F77=no cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. EOF elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_F77=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs_F77=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' else ld_shlibs_F77=no fi ;; esac ;; sunos4*) archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_F77=no fi ;; esac if test "$ld_shlibs_F77" = no; then runpath_var= hardcode_libdir_flag_spec_F77= export_dynamic_flag_spec_F77= whole_archive_flag_spec_F77= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag_F77=unsupported always_export_symbols_F77=yes archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L_F77=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct_F77=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_F77='' hardcode_direct_F77=yes hardcode_libdir_separator_F77=':' link_all_deplibs_F77=yes if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 hardcode_direct_F77=yes else # We have old collect2 hardcode_direct_F77=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_F77=yes hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_libdir_separator_F77= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols_F77=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_F77='-berok' # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF program main end _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_f77_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_F77="-z nodefs" archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF program main end _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_f77_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_F77=' ${wl}-bernotok' allow_undefined_flag_F77=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_F77='$convenience' archive_cmds_need_lc_F77=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes # see comment about different semantics on the GNU ld section ld_shlibs_F77=no ;; bsdi[45]*) export_dynamic_flag_spec_F77=-rdynamic ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_F77=' ' allow_undefined_flag_F77=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_From_new_cmds_F77='true' # FIXME: Should let the user specify the lib program. old_archive_cmds_F77='lib /OUT:$oldlib$oldobjs$old_deplibs' fix_srcfile_path_F77='`cygpath -w "$srcfile"`' enable_shared_with_static_runtimes_F77=yes ;; darwin* | rhapsody*) case $host_os in rhapsody* | darwin1.[012]) allow_undefined_flag_F77='${wl}-undefined ${wl}suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[012]) allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) allow_undefined_flag_F77='${wl}-undefined ${wl}dynamic_lookup' ;; esac fi ;; esac archive_cmds_need_lc_F77=no hardcode_direct_F77=no hardcode_automatic_F77=yes hardcode_shlibpath_var_F77=unsupported whole_archive_flag_spec_F77='' link_all_deplibs_F77=yes if test "$GCC" = yes ; then output_verbose_link_cmd='echo' archive_cmds_F77='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else case $cc_basename in xlc*) output_verbose_link_cmd='echo' archive_cmds_F77='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) ld_shlibs_F77=no ;; esac fi ;; dgux*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_shlibpath_var_F77=no ;; freebsd1*) ld_shlibs_F77=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes hardcode_minus_L_F77=yes hardcode_shlibpath_var_F77=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | kfreebsd*-gnu | dragonfly*) archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds_F77='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds_F77='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' hardcode_libdir_separator_F77=: hardcode_direct_F77=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes export_dynamic_flag_spec_F77='${wl}-E' ;; hpux10*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' hardcode_libdir_separator_F77=: hardcode_direct_F77=yes export_dynamic_flag_spec_F77='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes fi ;; hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' hardcode_libdir_separator_F77=: case $host_cpu in hppa*64*|ia64*) hardcode_libdir_flag_spec_ld_F77='+b $libdir' hardcode_direct_F77=no hardcode_shlibpath_var_F77=no ;; *) hardcode_direct_F77=yes export_dynamic_flag_spec_F77='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_ld_F77='-rpath $libdir' fi hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_F77=: link_all_deplibs_F77=yes ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; newsos6) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_F77=: hardcode_shlibpath_var_F77=no ;; openbsd*) hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' export_dynamic_flag_spec_F77='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-R$libdir' ;; *) archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' ;; esac fi ;; os2*) hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes allow_undefined_flag_F77=unsupported archive_cmds_F77='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_From_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag_F77=' -expect_unresolved \*' archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' fi hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_F77=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' else allow_undefined_flag_F77=' -expect_unresolved \*' archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec_F77='-rpath $libdir' fi hardcode_libdir_separator_F77=: ;; solaris*) no_undefined_flag_F77=' -z text' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else wlarc='' archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' fi hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_shlibpath_var_F77=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine linker options so we # cannot just pass the convience library names through # without $wl, iff we do not link with $LD. # Luckily, gcc supports the same syntax we need for Sun Studio. # Supported since Solaris 2.6 (maybe 2.5.1?) case $wlarc in '') whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' ;; *) whole_archive_flag_spec_F77='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; esac ;; esac link_all_deplibs_F77=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_direct_F77=yes hardcode_minus_L_F77=yes hardcode_shlibpath_var_F77=no ;; sysv4) case $host_vendor in sni) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds_F77='$CC -r -o $output$reload_objs' hardcode_direct_F77=no ;; motorola) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var_F77=no ;; sysv4.3*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_F77=no export_dynamic_flag_spec_F77='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_F77=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs_F77=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*) no_undefined_flag_F77='${wl}-z,text' archive_cmds_need_lc_F77=no hardcode_shlibpath_var_F77=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds_F77='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_F77='${wl}-z,text' allow_undefined_flag_F77='${wl}-z,nodefs' archive_cmds_need_lc_F77=no hardcode_shlibpath_var_F77=no hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator_F77=':' link_all_deplibs_F77=yes export_dynamic_flag_spec_F77='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds_F77='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_shlibpath_var_F77=no ;; *) ld_shlibs_F77=no ;; esac fi echo "$as_me:$LINENO: result: $ld_shlibs_F77" >&5 echo "${ECHO_T}$ld_shlibs_F77" >&6 test "$ld_shlibs_F77" = no && can_build_shared=no # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_F77" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_F77=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_F77 in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 $rm conftest* printf "$lt_simple_compile_test_code" > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_F77 pic_flag=$lt_prog_compiler_pic_F77 compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_F77 allow_undefined_flag_F77= if { (eval echo "$as_me:$LINENO: \"$archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 (eval $archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } then archive_cmds_need_lc_F77=no else archive_cmds_need_lc_F77=yes fi allow_undefined_flag_F77=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* echo "$as_me:$LINENO: result: $archive_cmds_need_lc_F77" >&5 echo "${ECHO_T}$archive_cmds_need_lc_F77" >&6 ;; esac fi ;; esac echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix4* | aix5*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` else sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' fi sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; kfreebsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[123]*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; freebsd*) # from 4.6 on shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; interix3*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; knetbsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' shlibpath_overrides_runpath=no else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' shlibpath_overrides_runpath=yes case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac echo "$as_me:$LINENO: result: $dynamic_linker" >&5 echo "${ECHO_T}$dynamic_linker" >&6 test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 hardcode_action_F77= if test -n "$hardcode_libdir_flag_spec_F77" || \ test -n "$runpath_var_F77" || \ test "X$hardcode_automatic_F77" = "Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct_F77" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, F77)" != no && test "$hardcode_minus_L_F77" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_F77=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_F77=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_F77=unsupported fi echo "$as_me:$LINENO: result: $hardcode_action_F77" >&5 echo "${ECHO_T}$hardcode_action_F77" >&6 if test "$hardcode_action_F77" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler_F77 \ CC_F77 \ LD_F77 \ lt_prog_compiler_wl_F77 \ lt_prog_compiler_pic_F77 \ lt_prog_compiler_static_F77 \ lt_prog_compiler_no_builtin_flag_F77 \ export_dynamic_flag_spec_F77 \ thread_safe_flag_spec_F77 \ whole_archive_flag_spec_F77 \ enable_shared_with_static_runtimes_F77 \ old_archive_cmds_F77 \ old_archive_from_new_cmds_F77 \ predep_objects_F77 \ postdep_objects_F77 \ predeps_F77 \ postdeps_F77 \ compiler_lib_search_path_F77 \ archive_cmds_F77 \ archive_expsym_cmds_F77 \ postinstall_cmds_F77 \ postuninstall_cmds_F77 \ old_archive_from_expsyms_cmds_F77 \ allow_undefined_flag_F77 \ no_undefined_flag_F77 \ export_symbols_cmds_F77 \ hardcode_libdir_flag_spec_F77 \ hardcode_libdir_flag_spec_ld_F77 \ hardcode_libdir_separator_F77 \ hardcode_automatic_F77 \ module_cmds_F77 \ module_expsym_cmds_F77 \ lt_cv_prog_compiler_c_o_F77 \ exclude_expsyms_F77 \ include_expsyms_F77; do case $var in old_archive_cmds_F77 | \ old_archive_from_new_cmds_F77 | \ archive_cmds_F77 | \ archive_expsym_cmds_F77 | \ module_cmds_F77 | \ module_expsym_cmds_F77 | \ old_archive_from_expsyms_cmds_F77 | \ export_symbols_cmds_F77 | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="$ofile" cat <<__EOF__ >> "$cfgfile" # ### BEGIN LIBTOOL TAG CONFIG: $tagname # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_F77 # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77 # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # LTCC compiler flags. LTCFLAGS=$lt_LTCFLAGS # A language-specific compiler. CC=$lt_compiler_F77 # Is the compiler the GNU C compiler? with_gcc=$GCC_F77 # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD_F77 # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_F77 # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_F77 pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77 # Must we lock files when doing compilation? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_F77 # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77 # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77 # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77 # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec_F77 # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds_F77 old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77 # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77 # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds_F77 archive_expsym_cmds=$lt_archive_expsym_cmds_F77 postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds_F77 module_expsym_cmds=$lt_module_expsym_cmds_F77 # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects_F77 # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects_F77 # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps_F77 # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps_F77 # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_F77 # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_F77 # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_F77 # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_F77 # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77 # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_F77 # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77 # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct_F77 # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L_F77 # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_F77 # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic_F77 # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_F77 # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path="$fix_srcfile_path_F77" # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols_F77 # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_F77 # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_F77 # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_F77 # ### END LIBTOOL TAG CONFIG: $tagname __EOF__ else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" else tagname="" fi ;; GCJ) if test -n "$GCJ" && test "X$GCJ" != "Xno"; then # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o objext_GCJ=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}\n" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[] argv) {}; }\n' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $rm conftest* ac_outfile=conftest.$ac_objext printf "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $rm conftest* # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${GCJ-"gcj"} compiler=$CC compiler_GCJ=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` # GCJ did not exist at the time GCC didn't implicitly link libc in. archive_cmds_need_lc_GCJ=no old_archive_cmds_GCJ=$old_archive_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... lt_prog_compiler_no_builtin_flag_GCJ= if test "$GCC" = yes; then lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin' echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:17162: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:17166: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6 if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl_GCJ= lt_prog_compiler_pic_GCJ= lt_prog_compiler_static_GCJ= echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 if test "$GCC" = yes; then lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_static_GCJ='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_GCJ='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_GCJ='-m68020 -resident32 -malways-restore-a4' ;; beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_GCJ='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_GCJ='-fno-common' ;; interix3*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared_GCJ=no enable_shared=no ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_GCJ=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_GCJ='-fPIC' ;; esac ;; *) lt_prog_compiler_pic_GCJ='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl_GCJ='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_GCJ='-Bstatic' else lt_prog_compiler_static_GCJ='-bnso -bI:/lib/syscalls.exp' fi ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case $cc_basename in xlc*) lt_prog_compiler_pic_GCJ='-qnocommon' lt_prog_compiler_wl_GCJ='-Wl,' ;; esac ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_GCJ='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl_GCJ='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_GCJ='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static_GCJ='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl_GCJ='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static_GCJ='-non_shared' ;; newsos6) lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' ;; linux*) case $cc_basename in icc* | ecc*) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-static' ;; pgcc* | pgf77* | pgf90* | pgf95*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_pic_GCJ='-fpic' lt_prog_compiler_static_GCJ='-Bstatic' ;; ccc*) lt_prog_compiler_wl_GCJ='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static_GCJ='-non_shared' ;; esac ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl_GCJ='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static_GCJ='-non_shared' ;; solaris*) lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' case $cc_basename in f77* | f90* | f95*) lt_prog_compiler_wl_GCJ='-Qoption ld ';; *) lt_prog_compiler_wl_GCJ='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl_GCJ='-Qoption ld ' lt_prog_compiler_pic_GCJ='-PIC' lt_prog_compiler_static_GCJ='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic_GCJ='-Kconform_pic' lt_prog_compiler_static_GCJ='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' ;; unicos*) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_can_build_shared_GCJ=no ;; uts4*) lt_prog_compiler_pic_GCJ='-pic' lt_prog_compiler_static_GCJ='-Bstatic' ;; *) lt_prog_compiler_can_build_shared_GCJ=no ;; esac fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_GCJ" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_GCJ" >&6 # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_GCJ"; then echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5 echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... $ECHO_C" >&6 if test "${lt_prog_compiler_pic_works_GCJ+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_pic_works_GCJ=no ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_GCJ" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:17430: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:17434: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_prog_compiler_pic_works_GCJ=yes fi fi $rm conftest* fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_GCJ" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_works_GCJ" >&6 if test x"$lt_prog_compiler_pic_works_GCJ" = xyes; then case $lt_prog_compiler_pic_GCJ in "" | " "*) ;; *) lt_prog_compiler_pic_GCJ=" $lt_prog_compiler_pic_GCJ" ;; esac else lt_prog_compiler_pic_GCJ= lt_prog_compiler_can_build_shared_GCJ=no fi fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_GCJ= ;; *) lt_prog_compiler_pic_GCJ="$lt_prog_compiler_pic_GCJ" ;; esac # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_GCJ eval lt_tmp_static_flag=\"$lt_prog_compiler_static_GCJ\" echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6 if test "${lt_prog_compiler_static_works_GCJ+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_static_works_GCJ=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" printf "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_prog_compiler_static_works_GCJ=yes fi else lt_prog_compiler_static_works_GCJ=yes fi fi $rm conftest* LDFLAGS="$save_LDFLAGS" fi echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_GCJ" >&5 echo "${ECHO_T}$lt_prog_compiler_static_works_GCJ" >&6 if test x"$lt_prog_compiler_static_works_GCJ" = xyes; then : else lt_prog_compiler_static_GCJ= fi echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_c_o_GCJ=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:17534: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:17538: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_GCJ=yes fi fi chmod u+w . 2>&5 $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_GCJ" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_c_o_GCJ" >&6 hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no echo "$as_me:$LINENO: result: $hard_links" >&5 echo "${ECHO_T}$hard_links" >&6 if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 runpath_var= allow_undefined_flag_GCJ= enable_shared_with_static_runtimes_GCJ=no archive_cmds_GCJ= archive_expsym_cmds_GCJ= old_archive_From_new_cmds_GCJ= old_archive_from_expsyms_cmds_GCJ= export_dynamic_flag_spec_GCJ= whole_archive_flag_spec_GCJ= thread_safe_flag_spec_GCJ= hardcode_libdir_flag_spec_GCJ= hardcode_libdir_flag_spec_ld_GCJ= hardcode_libdir_separator_GCJ= hardcode_direct_GCJ=no hardcode_minus_L_GCJ=no hardcode_shlibpath_var_GCJ=unsupported link_all_deplibs_GCJ=unknown hardcode_automatic_GCJ=no module_cmds_GCJ= module_expsym_cmds_GCJ= always_export_symbols_GCJ=no export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms_GCJ= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms_GCJ="_GLOBAL_OFFSET_TABLE_" # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. extract_expsyms_cmds= # Just being paranoid about ensuring that cc_basename is set. for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` case $host_os in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs_GCJ=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_GCJ='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_GCJ='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_GCJ= fi supports_anon_versioning=no case `$LD -v 2>/dev/null` in *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs_GCJ=no cat <&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. EOF fi ;; amigaos*) archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_minus_L_GCJ=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can't use # them. ld_shlibs_GCJ=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_GCJ=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_GCJ='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_GCJ=no fi ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, GCJ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_GCJ='-L$libdir' allow_undefined_flag_GCJ=unsupported always_export_symbols_GCJ=no enable_shared_with_static_runtimes_GCJ=yes export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_GCJ='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_GCJ=no fi ;; interix3*) hardcode_direct_GCJ=no hardcode_shlibpath_var_GCJ=no hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' export_dynamic_flag_spec_GCJ='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_GCJ='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_GCJ='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; linux*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_addflag= case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; esac archive_cmds_GCJ='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test $supports_anon_versioning = yes; then archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ $echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi else ld_shlibs_GCJ=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_GCJ='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs_GCJ=no cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. EOF elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_GCJ=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs_GCJ=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' else ld_shlibs_GCJ=no fi ;; esac ;; sunos4*) archive_cmds_GCJ='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_GCJ=no fi ;; esac if test "$ld_shlibs_GCJ" = no; then runpath_var= hardcode_libdir_flag_spec_GCJ= export_dynamic_flag_spec_GCJ= whole_archive_flag_spec_GCJ= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag_GCJ=unsupported always_export_symbols_GCJ=yes archive_expsym_cmds_GCJ='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L_GCJ=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct_GCJ=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then export_symbols_cmds_GCJ='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_GCJ='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_GCJ='' hardcode_direct_GCJ=yes hardcode_libdir_separator_GCJ=':' link_all_deplibs_GCJ=yes if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 hardcode_direct_GCJ=yes else # We have old collect2 hardcode_direct_GCJ=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_GCJ=yes hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_libdir_separator_GCJ= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols_GCJ=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_GCJ='-berok' # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_GCJ='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_GCJ="-z nodefs" archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_GCJ=' ${wl}-bernotok' allow_undefined_flag_GCJ=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_GCJ='$convenience' archive_cmds_need_lc_GCJ=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_minus_L_GCJ=yes # see comment about different semantics on the GNU ld section ld_shlibs_GCJ=no ;; bsdi[45]*) export_dynamic_flag_spec_GCJ=-rdynamic ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_GCJ=' ' allow_undefined_flag_GCJ=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_GCJ='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_From_new_cmds_GCJ='true' # FIXME: Should let the user specify the lib program. old_archive_cmds_GCJ='lib /OUT:$oldlib$oldobjs$old_deplibs' fix_srcfile_path_GCJ='`cygpath -w "$srcfile"`' enable_shared_with_static_runtimes_GCJ=yes ;; darwin* | rhapsody*) case $host_os in rhapsody* | darwin1.[012]) allow_undefined_flag_GCJ='${wl}-undefined ${wl}suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[012]) allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) allow_undefined_flag_GCJ='${wl}-undefined ${wl}dynamic_lookup' ;; esac fi ;; esac archive_cmds_need_lc_GCJ=no hardcode_direct_GCJ=no hardcode_automatic_GCJ=yes hardcode_shlibpath_var_GCJ=unsupported whole_archive_flag_spec_GCJ='' link_all_deplibs_GCJ=yes if test "$GCC" = yes ; then output_verbose_link_cmd='echo' archive_cmds_GCJ='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else case $cc_basename in xlc*) output_verbose_link_cmd='echo' archive_cmds_GCJ='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) ld_shlibs_GCJ=no ;; esac fi ;; dgux*) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_shlibpath_var_GCJ=no ;; freebsd1*) ld_shlibs_GCJ=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec_GCJ='-R$libdir' hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=yes hardcode_minus_L_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | kfreebsd*-gnu | dragonfly*) archive_cmds_GCJ='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_GCJ='-R$libdir' hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds_GCJ='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds_GCJ='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' hardcode_libdir_separator_GCJ=: hardcode_direct_GCJ=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_GCJ=yes export_dynamic_flag_spec_GCJ='${wl}-E' ;; hpux10*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_GCJ='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' hardcode_libdir_separator_GCJ=: hardcode_direct_GCJ=yes export_dynamic_flag_spec_GCJ='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_GCJ=yes fi ;; hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' hardcode_libdir_separator_GCJ=: case $host_cpu in hppa*64*|ia64*) hardcode_libdir_flag_spec_ld_GCJ='+b $libdir' hardcode_direct_GCJ=no hardcode_shlibpath_var_GCJ=no ;; *) hardcode_direct_GCJ=yes export_dynamic_flag_spec_GCJ='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_GCJ=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_GCJ='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_ld_GCJ='-rpath $libdir' fi hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_GCJ=: link_all_deplibs_GCJ=yes ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds_GCJ='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec_GCJ='-R$libdir' hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; newsos6) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=yes hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_GCJ=: hardcode_shlibpath_var_GCJ=no ;; openbsd*) hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' export_dynamic_flag_spec_GCJ='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_GCJ='-R$libdir' ;; *) archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' ;; esac fi ;; os2*) hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_minus_L_GCJ=yes allow_undefined_flag_GCJ=unsupported archive_cmds_GCJ='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_From_new_cmds_GCJ='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag_GCJ=' -expect_unresolved \*' archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' fi hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_GCJ=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' else allow_undefined_flag_GCJ=' -expect_unresolved \*' archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_GCJ='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec_GCJ='-rpath $libdir' fi hardcode_libdir_separator_GCJ=: ;; solaris*) no_undefined_flag_GCJ=' -z text' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else wlarc='' archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' fi hardcode_libdir_flag_spec_GCJ='-R$libdir' hardcode_shlibpath_var_GCJ=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine linker options so we # cannot just pass the convience library names through # without $wl, iff we do not link with $LD. # Luckily, gcc supports the same syntax we need for Sun Studio. # Supported since Solaris 2.6 (maybe 2.5.1?) case $wlarc in '') whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract' ;; *) whole_archive_flag_spec_GCJ='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; esac ;; esac link_all_deplibs_GCJ=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds_GCJ='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_GCJ='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_direct_GCJ=yes hardcode_minus_L_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; sysv4) case $host_vendor in sni) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds_GCJ='$CC -r -o $output$reload_objs' hardcode_direct_GCJ=no ;; motorola) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var_GCJ=no ;; sysv4.3*) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_GCJ=no export_dynamic_flag_spec_GCJ='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_GCJ=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs_GCJ=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*) no_undefined_flag_GCJ='${wl}-z,text' archive_cmds_need_lc_GCJ=no hardcode_shlibpath_var_GCJ=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds_GCJ='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_GCJ='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_GCJ='${wl}-z,text' allow_undefined_flag_GCJ='${wl}-z,nodefs' archive_cmds_need_lc_GCJ=no hardcode_shlibpath_var_GCJ=no hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator_GCJ=':' link_all_deplibs_GCJ=yes export_dynamic_flag_spec_GCJ='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds_GCJ='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_GCJ='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_shlibpath_var_GCJ=no ;; *) ld_shlibs_GCJ=no ;; esac fi echo "$as_me:$LINENO: result: $ld_shlibs_GCJ" >&5 echo "${ECHO_T}$ld_shlibs_GCJ" >&6 test "$ld_shlibs_GCJ" = no && can_build_shared=no # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_GCJ" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_GCJ=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_GCJ in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 $rm conftest* printf "$lt_simple_compile_test_code" > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_GCJ pic_flag=$lt_prog_compiler_pic_GCJ compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_GCJ allow_undefined_flag_GCJ= if { (eval echo "$as_me:$LINENO: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 (eval $archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } then archive_cmds_need_lc_GCJ=no else archive_cmds_need_lc_GCJ=yes fi allow_undefined_flag_GCJ=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* echo "$as_me:$LINENO: result: $archive_cmds_need_lc_GCJ" >&5 echo "${ECHO_T}$archive_cmds_need_lc_GCJ" >&6 ;; esac fi ;; esac echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix4* | aix5*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` else sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' fi sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; kfreebsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[123]*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; freebsd*) # from 4.6 on shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; interix3*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; knetbsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' shlibpath_overrides_runpath=no else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' shlibpath_overrides_runpath=yes case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac echo "$as_me:$LINENO: result: $dynamic_linker" >&5 echo "${ECHO_T}$dynamic_linker" >&6 test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 hardcode_action_GCJ= if test -n "$hardcode_libdir_flag_spec_GCJ" || \ test -n "$runpath_var_GCJ" || \ test "X$hardcode_automatic_GCJ" = "Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct_GCJ" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no && test "$hardcode_minus_L_GCJ" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_GCJ=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_GCJ=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_GCJ=unsupported fi echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5 echo "${ECHO_T}$hardcode_action_GCJ" >&6 if test "$hardcode_action_GCJ" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler_GCJ \ CC_GCJ \ LD_GCJ \ lt_prog_compiler_wl_GCJ \ lt_prog_compiler_pic_GCJ \ lt_prog_compiler_static_GCJ \ lt_prog_compiler_no_builtin_flag_GCJ \ export_dynamic_flag_spec_GCJ \ thread_safe_flag_spec_GCJ \ whole_archive_flag_spec_GCJ \ enable_shared_with_static_runtimes_GCJ \ old_archive_cmds_GCJ \ old_archive_from_new_cmds_GCJ \ predep_objects_GCJ \ postdep_objects_GCJ \ predeps_GCJ \ postdeps_GCJ \ compiler_lib_search_path_GCJ \ archive_cmds_GCJ \ archive_expsym_cmds_GCJ \ postinstall_cmds_GCJ \ postuninstall_cmds_GCJ \ old_archive_from_expsyms_cmds_GCJ \ allow_undefined_flag_GCJ \ no_undefined_flag_GCJ \ export_symbols_cmds_GCJ \ hardcode_libdir_flag_spec_GCJ \ hardcode_libdir_flag_spec_ld_GCJ \ hardcode_libdir_separator_GCJ \ hardcode_automatic_GCJ \ module_cmds_GCJ \ module_expsym_cmds_GCJ \ lt_cv_prog_compiler_c_o_GCJ \ exclude_expsyms_GCJ \ include_expsyms_GCJ; do case $var in old_archive_cmds_GCJ | \ old_archive_from_new_cmds_GCJ | \ archive_cmds_GCJ | \ archive_expsym_cmds_GCJ | \ module_cmds_GCJ | \ module_expsym_cmds_GCJ | \ old_archive_from_expsyms_cmds_GCJ | \ export_symbols_cmds_GCJ | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="$ofile" cat <<__EOF__ >> "$cfgfile" # ### BEGIN LIBTOOL TAG CONFIG: $tagname # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_GCJ # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_GCJ # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # LTCC compiler flags. LTCFLAGS=$lt_LTCFLAGS # A language-specific compiler. CC=$lt_compiler_GCJ # Is the compiler the GNU C compiler? with_gcc=$GCC_GCJ # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD_GCJ # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_GCJ # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_GCJ pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_GCJ # Must we lock files when doing compilation? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_GCJ # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_GCJ # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_GCJ # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_GCJ # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec_GCJ # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds_GCJ old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_GCJ # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_GCJ # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds_GCJ archive_expsym_cmds=$lt_archive_expsym_cmds_GCJ postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds_GCJ module_expsym_cmds=$lt_module_expsym_cmds_GCJ # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects_GCJ # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects_GCJ # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps_GCJ # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps_GCJ # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_GCJ # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_GCJ # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_GCJ # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_GCJ # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_GCJ # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_GCJ # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_GCJ # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct_GCJ # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L_GCJ # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_GCJ # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic_GCJ # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_GCJ # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path="$fix_srcfile_path_GCJ" # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols_GCJ # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_GCJ # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_GCJ # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_GCJ # ### END LIBTOOL TAG CONFIG: $tagname __EOF__ else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" else tagname="" fi ;; RC) # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o objext_RC=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $rm conftest* ac_outfile=conftest.$ac_objext printf "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $rm conftest* # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${RC-"windres"} compiler=$CC compiler_RC=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` lt_cv_prog_compiler_c_o_RC=yes # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler_RC \ CC_RC \ LD_RC \ lt_prog_compiler_wl_RC \ lt_prog_compiler_pic_RC \ lt_prog_compiler_static_RC \ lt_prog_compiler_no_builtin_flag_RC \ export_dynamic_flag_spec_RC \ thread_safe_flag_spec_RC \ whole_archive_flag_spec_RC \ enable_shared_with_static_runtimes_RC \ old_archive_cmds_RC \ old_archive_from_new_cmds_RC \ predep_objects_RC \ postdep_objects_RC \ predeps_RC \ postdeps_RC \ compiler_lib_search_path_RC \ archive_cmds_RC \ archive_expsym_cmds_RC \ postinstall_cmds_RC \ postuninstall_cmds_RC \ old_archive_from_expsyms_cmds_RC \ allow_undefined_flag_RC \ no_undefined_flag_RC \ export_symbols_cmds_RC \ hardcode_libdir_flag_spec_RC \ hardcode_libdir_flag_spec_ld_RC \ hardcode_libdir_separator_RC \ hardcode_automatic_RC \ module_cmds_RC \ module_expsym_cmds_RC \ lt_cv_prog_compiler_c_o_RC \ exclude_expsyms_RC \ include_expsyms_RC; do case $var in old_archive_cmds_RC | \ old_archive_from_new_cmds_RC | \ archive_cmds_RC | \ archive_expsym_cmds_RC | \ module_cmds_RC | \ module_expsym_cmds_RC | \ old_archive_from_expsyms_cmds_RC | \ export_symbols_cmds_RC | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="$ofile" cat <<__EOF__ >> "$cfgfile" # ### BEGIN LIBTOOL TAG CONFIG: $tagname # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_RC # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # LTCC compiler flags. LTCFLAGS=$lt_LTCFLAGS # A language-specific compiler. CC=$lt_compiler_RC # Is the compiler the GNU C compiler? with_gcc=$GCC_RC # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD_RC # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_RC # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_RC pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC # Must we lock files when doing compilation? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_RC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec_RC # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds_RC old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds_RC archive_expsym_cmds=$lt_archive_expsym_cmds_RC postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds_RC module_expsym_cmds=$lt_module_expsym_cmds_RC # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects_RC # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects_RC # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps_RC # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps_RC # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_RC # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_RC # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_RC # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_RC # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_RC # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_RC # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct_RC # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L_RC # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_RC # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic_RC # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_RC # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path="$fix_srcfile_path_RC" # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols_RC # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_RC # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_RC # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_RC # ### END LIBTOOL TAG CONFIG: $tagname __EOF__ else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" ;; *) { { echo "$as_me:$LINENO: error: Unsupported tag name: $tagname" >&5 echo "$as_me: error: Unsupported tag name: $tagname" >&2;} { (exit 1); exit 1; }; } ;; esac # Append the new tag name to the list of available tags. if test -n "$tagname" ; then available_tags="$available_tags $tagname" fi fi done IFS="$lt_save_ifs" # Now substitute the updated list of available tags. if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then mv "${ofile}T" "$ofile" chmod +x "$ofile" else rm -f "${ofile}T" { { echo "$as_me:$LINENO: error: unable to update list of available tagged configurations." >&5 echo "$as_me: error: unable to update list of available tagged configurations." >&2;} { (exit 1); exit 1; }; } fi fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' # Prevent multiple expansion # No longer needed now that CPPFLAGS is correctly set -- lh, 061214 -- # AC_REQUIRE([AC_COIN_DLFCN_H]) # NEW: If libtool exists in the directory higher up, we use that one # instead of creating a new one # It turns out that the code for AC_PROG_LIBTOOL is somehow AC_REQUIRED # out in front of this macro body. You'll notice that LIBTOOL is already # defined here. We'll have to count on this macro not being called if libtool # already exists, or at least move the libtool fixes outside the conditional. # AC_MSG_NOTICE([Entering coin_prog_libtool, LIBTOOL = "$LIBTOOL".]) # This test is therefore removed. -- lh, 061214 -- # if test "x$LIBTOOL" = x; then # AC_MSG_NOTICE([Calling PROG_LIBTOOL.]) # AC_MSG_NOTICE([Finished PROG_LIBTOOL.]) { echo "$as_me:$LINENO: Build is \"$build\"." >&5 echo "$as_me: Build is \"$build\"." >&6;} mydos2unix='| dos2unix' case $build in *-mingw*) CYGPATH_W=echo mydos2unix= ;; esac case $build in # Here we need to check if -m32 is specified. If so, we need to correct # sys_lib_search_path_spec *x86_64-*) if test "$GCC" = yes && (echo $CXXFLAGS $CFLAGS $FFLAGS | $EGREP 'm32' >& /dev/null); then { echo "$as_me:$LINENO: Applying patches to libtool for 32bit compilation" >&5 echo "$as_me: Applying patches to libtool for 32bit compilation" >&6;} sed -e 's|sys_lib_search_path_spec=".*"|sys_lib_search_path_spec="/lib /usr/lib"|' libtool > conftest.bla mv conftest.bla libtool chmod 755 libtool fi ;; *-solaris*) if test "$GCC" = yes && \ (echo $CXXFLAGS $CFLAGS $FFLAGS | $EGREP 'm64' >/dev/null 2>&1) ; then hdwisa=`isainfo | sed -e 's/\([^ ]*\) .*$/\1/'` if `$EGREP 'sys_lib_search_path_spec=' libtool | $EGREP -v $hdwisa >/dev/null 2>&1` ; then { echo "$as_me:$LINENO: Applying patches to libtool for 64-bit GCC compilation" >&5 echo "$as_me: Applying patches to libtool for 64-bit GCC compilation" >&6;} fixlibtmp=`$CC -m64 -print-search-dirs | $EGREP '^libraries:'` fixlibtmp=`echo $fixlibtmp | sed -e 's/libraries: =//' -e 's/:/ /g'` if `echo "$fixlibtmp" | $EGREP -v $hdwisa >/dev/null 2>&1` ; then # AC_MSG_NOTICE(Compensating for broken gcc) for lib in $fixlibtmp ; do if test -d "${lib}${hdwisa}" ; then syslibpath64="$syslibpath64 ${lib}${hdwisa}/" fi done syslibpath64="${syslibpath64} ${fixlibtmp}" else syslibpath64="$fixlibtmp" fi sed -e 's|sys_lib_search_path_spec=".*"|sys_lib_search_path_spec="'"$syslibpath64"'"|' libtool > conftest.bla mv conftest.bla libtool chmod 755 libtool fi # AC_MSG_NOTICE(Result is ) # $EGREP 'sys_lib_search_path_spec=' libtool fi ;; # Cygwin. Ah, cygwin. Too big and ugly to inline; see the macro. *-cygwin* | *-mingw*) case "$CXX" in cl* | */cl* | CL* | */CL* | icl* | */icl* | ICL* | */ICL*) { echo "$as_me:$LINENO: Applying patches to libtool for cl compiler" >&5 echo "$as_me: Applying patches to libtool for cl compiler" >&6;} sed -e 's|fix_srcfile_path=\"`cygpath -w \"\$srcfile\"`\"|fix_srcfile_path=\"\\\`'"$CYGPATH_W"' \\\"\\$srcfile\\\"\\\`\"|' \ -e 's|fix_srcfile_path=\"\"|fix_srcfile_path=\"\\\`'"$CYGPATH_W"' \\\"\\$srcfile\\\"\\\`\"|' \ -e 's%compile_deplibs=\"\$dir/\$old_library \$compile_deplibs\"%compile_deplibs="'\`"$CYGPATH_W"' \$dir/\$old_library | sed -e '"'"'sY\\\\\\\\Y/Yg'"'"\`' \$compile_deplibs\"'% \ -e 's%compile_deplibs=\"\$dir/\$linklib \$compile_deplibs\"%compile_deplibs="'\`"$CYGPATH_W"' \$dir/\$linklib | sed -e '"'"'sY\\\\\\\\Y/Yg'"'"\`' \$compile_deplibs\"'% \ -e 's%lib /OUT:%lib -OUT:%' \ -e "s%cygpath -w%$CYGPATH_W%" \ -e 's%$AR x \\$f_ex_an_ar_oldlib%bla=\\`lib -nologo -list \\$f_ex_an_ar_oldlib | xargs echo '"$mydos2unix"'\\`; echo \\$bla; for i in \\$bla; do lib -nologo -extract:\\$i \\$f_ex_an_ar_oldlib; done%' \ -e 's/$AR t/lib -nologo -list/' \ -e 's%f_ex_an_ar_oldlib="\($?*1*\)"%f_ex_an_ar_oldlib='\`"$CYGPATH_W"' \1`%' \ -e 's%^archive_cmds=.*%archive_cmds="\\$CC -o \\$lib \\$libobjs \\$compiler_flags \\\\\\`echo \\\\\\"\\$deplibs\\\\\\" | \\$SED -e '"\'"'s/ -lc\\$//'"\'"'\\\\\\` -link -dll~linknames="%' \ -e 's%old_archive_cmds="lib -OUT:\\$oldlib\\$oldobjs\\$old_deplibs"%old_archive_cmds="if test -r \\$oldlib; then bla=\\"\\$oldlib\\"; else bla=; fi; lib -OUT:\\$oldlib \\\\\\$bla\\$oldobjs\\$old_deplibs"%' \ libtool > conftest.bla mv conftest.bla libtool chmod 755 libtool ;; *) { echo "$as_me:$LINENO: Applying patches to libtool for GNU compiler" >&5 echo "$as_me: Applying patches to libtool for GNU compiler" >&6;} sed -e 's|fix_srcfile_path=\"`cygpath -w \"\$srcfile\"`\"|fix_srcfile_path=\"\\\`'"$CYGPATH_W"' \\\"\\$srcfile\\\"\\\`\"|' \ -e 's|"lib /OUT:\\$oldlib\\$oldobjs\\$old_deplibs"|"\\$AR \\$AR_FLAGS \\$oldlib\\$oldobjs\\$old_deplibs~\\$RANLIB \\$oldlib"|' \ -e 's|libext="lib"|libext="a"|' \ libtool > conftest.bla mv conftest.bla libtool chmod 755 libtool ;; esac ;; *-darwin*) { echo "$as_me:$LINENO: Applying patches to libtool for Darwin" >&5 echo "$as_me: Applying patches to libtool for Darwin" >&6;} sed -e 's/verstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"/verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"/' \ -e 's/ -dynamiclib / -dynamiclib -single_module /g' \ libtool > conftest.bla mv conftest.bla libtool chmod 755 libtool ;; esac # This fi matches the commented `if test "x$LIBTOOL" = x;' up at the head of # the macro. -- lh, 061214 -- # fi # AC_MSG_NOTICE([End libtool initialisation.]) # AC_MSG_NOTICE([Finished COIN_PROG_LIBTOOL.]) # set RPATH_FLAGS to the compiler link flags required to hardcode location # of the shared objects RPATH_FLAGS= if test $enable_shared = yes; then case $build in *-linux-*) if test "$GXX" = "yes"; then RPATH_FLAGS= for dir in $abs_lib_dir; do RPATH_FLAGS="$RPATH_FLAGS -Wl,--rpath -Wl,$dir" done fi ;; *-darwin*) RPATH_FLAGS=nothing ;; *-ibm-*) case "$CXX" in xlC* | */xlC* | mpxlC* | */mpxlC*) RPATH_FLAGS=nothing ;; esac ;; *-hp-*) RPATH_FLAGS=nothing ;; *-mingw32) RPATH_FLAGS=nothing ;; *-*-solaris*) RPATH_FLAGS= for dir in $abs_lib_dir; do RPATH_FLAGS="$RPATH_FLAGS -R$dir" done esac if test "$RPATH_FLAGS" = ""; then { echo "$as_me:$LINENO: WARNING: Could not automatically determine how to tell the linker about automatic inclusion of the path for shared libraries. The test examples might not work if you link against shared objects. You will need to set the LD_LIBRARY_PATH, DYLP_LIBRARY_PATH, or LIBDIR variable manually." >&5 echo "$as_me: WARNING: Could not automatically determine how to tell the linker about automatic inclusion of the path for shared libraries. The test examples might not work if you link against shared objects. You will need to set the LD_LIBRARY_PATH, DYLP_LIBRARY_PATH, or LIBDIR variable manually." >&2;} fi if test "$RPATH_FLAGS" = "nothing"; then RPATH_FLAGS= fi fi else { echo "$as_me:$LINENO: Using libtool script in directory $coin_config_dir" >&5 echo "$as_me: Using libtool script in directory $coin_config_dir" >&6;} # get all missing information from the config.log file # output variables and defines as_save_IFS=$IFS IFS=' ' for oneline in `cat $coin_config_dir/config.status`; do case "$oneline" in # First some automake conditionals s,@am__fastdep* | s,@AR@* | s,@CPP@* | s,@CPPFLAGS@* | s,@CXXCPP@* | \ s,@RANLIB@* | s,@STRIP@* | s,@ac_ct_AR@* | s,@ac_ct_RANLIB@* | \ s,@ac_ct_STRIP@* | s,@host* | s,@LN_S@* | s,@RPATH_FLAGS@* | \ s,@ac_c_preproc_warn_flag@* | s,@ac_cxx_preproc_warn_flag@* ) command=`echo $oneline | sed -e 's/^s,@//' -e 's/@,/="/' -e 's/,;t t/"/'` # echo "$command" eval "$command" ;; s,@DEFS@* ) command=`echo $oneline | sed -e 's/^s,@DEFS@,/defsline="/' -e 's/,;t t/"/'` # echo "$command" eval "$command" ;; esac done IFS=$as_save_IFS # And some defines (assuming here that the packages base dir # doesn't have a config.h file for word in $defsline; do # echo word $word case $word in -DHAVE_[A-Z_]*_H=1 | -DSTDC_HEADERS=1 ) i=`echo $word | sed -e 's/-D/#define /' -e 's/=/ /'` # echo dd $i echo $i >>confdefs.h ;; esac done fi # AC_MSG_NOTICE([End of INIT_AUTO_TOOLS.]) # ToDo # For now, don't use the -no-undefined flag, since the Makefiles are # not yet set up that way. But we need to fix this, when we want # to comile DLLs under Windows. LT_LDFLAGS= #END } ############################################################################# # COIN components # ############################################################################# echo "$as_me:$LINENO: checking for COIN project DyLP" >&5 echo $ECHO_N "checking for COIN project DyLP... $ECHO_C" >&6 # First check, if the sub-project is actually available (ToDo: allow # other locations) coin_has_dylp=unavailable if test x"$COIN_SKIP_PROJECTS" != x; then for dir in $COIN_SKIP_PROJECTS; do if test $dir = DyLP; then coin_has_dylp=skipping fi done fi if test $coin_has_dylp != skipping; then if test $PACKAGE_TARNAME = dylp; then coin_has_dylp=. else if test -d $srcdir/../DyLP; then coin_has_dylp=../DyLP fi fi fi if test $coin_has_dylp != unavailable && test $coin_has_dylp != skipping; then # Set the #define if the component is available cat >>confdefs.h <<\_ACEOF #define COIN_HAS_DYLP 1 _ACEOF # Set the variables for source and object code location DYLPSRCDIR=`cd $srcdir/$coin_has_dylp; pwd` DYLPOBJDIR=`pwd`/$coin_has_dylp DYLPDOCDIR=$abs_lib_dir/../share/doc/coin/DyLP fi # Define the Makefile conditional if test $coin_has_dylp != unavailable && test $coin_has_dylp != skipping; then COIN_HAS_DYLP_TRUE= COIN_HAS_DYLP_FALSE='#' else COIN_HAS_DYLP_TRUE='#' COIN_HAS_DYLP_FALSE= fi echo "$as_me:$LINENO: result: $coin_has_dylp" >&5 echo "${ECHO_T}$coin_has_dylp" >&6 echo "$as_me:$LINENO: checking for COIN project CoinUtils" >&5 echo $ECHO_N "checking for COIN project CoinUtils... $ECHO_C" >&6 # First check, if the sub-project is actually available (ToDo: allow # other locations) coin_has_coinutils=unavailable if test x"$COIN_SKIP_PROJECTS" != x; then for dir in $COIN_SKIP_PROJECTS; do if test $dir = CoinUtils; then coin_has_coinutils=skipping fi done fi if test $coin_has_coinutils != skipping; then if test $PACKAGE_TARNAME = coinutils; then coin_has_coinutils=. else if test -d $srcdir/../CoinUtils; then coin_has_coinutils=../CoinUtils fi fi fi if test $coin_has_coinutils != unavailable && test $coin_has_coinutils != skipping; then # Set the #define if the component is available cat >>confdefs.h <<\_ACEOF #define COIN_HAS_COINUTILS 1 _ACEOF # Set the variables for source and object code location COINUTILSSRCDIR=`cd $srcdir/$coin_has_coinutils; pwd` COINUTILSOBJDIR=`pwd`/$coin_has_coinutils COINUTILSDOCDIR=$abs_lib_dir/../share/doc/coin/CoinUtils fi # Define the Makefile conditional if test $coin_has_coinutils != unavailable && test $coin_has_coinutils != skipping; then COIN_HAS_COINUTILS_TRUE= COIN_HAS_COINUTILS_FALSE='#' else COIN_HAS_COINUTILS_TRUE='#' COIN_HAS_COINUTILS_FALSE= fi echo "$as_me:$LINENO: result: $coin_has_coinutils" >&5 echo "${ECHO_T}$coin_has_coinutils" >&6 echo "$as_me:$LINENO: checking for COIN project Osi" >&5 echo $ECHO_N "checking for COIN project Osi... $ECHO_C" >&6 # First check, if the sub-project is actually available (ToDo: allow # other locations) coin_has_osi=unavailable if test x"$COIN_SKIP_PROJECTS" != x; then for dir in $COIN_SKIP_PROJECTS; do if test $dir = Osi; then coin_has_osi=skipping fi done fi if test $coin_has_osi != skipping; then if test $PACKAGE_TARNAME = osi; then coin_has_osi=. else if test -d $srcdir/../Osi; then coin_has_osi=../Osi fi fi fi if test $coin_has_osi != unavailable && test $coin_has_osi != skipping; then # Set the #define if the component is available cat >>confdefs.h <<\_ACEOF #define COIN_HAS_OSI 1 _ACEOF # Set the variables for source and object code location OSISRCDIR=`cd $srcdir/$coin_has_osi; pwd` OSIOBJDIR=`pwd`/$coin_has_osi OSIDOCDIR=$abs_lib_dir/../share/doc/coin/Osi fi # Define the Makefile conditional if test $coin_has_osi != unavailable && test $coin_has_osi != skipping; then COIN_HAS_OSI_TRUE= COIN_HAS_OSI_FALSE='#' else COIN_HAS_OSI_TRUE='#' COIN_HAS_OSI_FALSE= fi echo "$as_me:$LINENO: result: $coin_has_osi" >&5 echo "${ECHO_T}$coin_has_osi" >&6 ############################################################################# # Doing project specific tests # ############################################################################# # Tweak compilation flags. # Transfer flags from CFLAGS/CXXFLAGS to CPPFLAGS. case "$CXXFLAGS $CFLAGS" in *-mno-cygwin*) CXXFLAGS=`echo $CXXFLAGS | sed -e 's/-mno-cygwin//g'` CFLAGS=`echo $CFLAGS | sed -e 's/-mno-cygwin//g'` CPPFLAGS="-mno-cygwin $CPPFLAGS" LDFLAGS="-mno-cygwin $LDFLAGS" ;; esac # Add flags. Strip the option first, then add once, to avoid repetition. case "$CXX" in cl* | */cl*) CXXFLAGS=`echo $CXXFLAGS | sed -e 's/-wd4996//g'` CXXFLAGS="$CXXFLAGS -wd4996" ;; esac case "$CC" in cl* | */cl*) CFLAGS=`echo $CFLAGS | sed -e 's/-wd4996//g'` CFLAGS="$CFLAGS -wd4996" ;; esac # Darwin will refuse to compile its own standard headers if pedantic-errors is # requested. case "$build" in *-darwin*) CXXFLAGS=`echo $CXXFLAGS | sed -e 's/--*pedantic-errors//g'` CFLAGS=`echo $CFLAGS | sed -e 's/--*pedantic-errors//g'` ;; esac # DyLP's command parser (bnfrdr) makes heavy use of type-punning. We cannot # allow GCC to enforce strict-aliasing. And we can't simply test to see if it's # present; specifying -O2, -O3, or -Os also enables it. As above, strip # anything already present and insert one -fno-strict-aliasing. if test x"$ac_cv_c_compiler_gnu" = xyes ; then CFLAGS=`echo $CFLAGS | sed -e 's/--*fn*o*-*strict-aliasing//g'` CFLAGS="$CFLAGS -fno-strict-aliasing" fi if test x"$ac_cv_cxx_compiler_gnu" = xyes ; then CXXFLAGS=`echo $CXXFLAGS | sed -e 's/--*fn*o*-*strict-aliasing//g'` CXXFLAGS="$CXXFLAGS -fno-strict-aliasing" fi # Determine the C type that corresponds to the C++ bool type in size { echo "$as_me:$LINENO: Determining C type equivalent for C++ bool." >&5 echo "$as_me: Determining C type equivalent for C++ bool." >&6;} # Autoconf 2.59 has issues with the MSVC cl compiler which are fixed in 2.61. # Until we upgrade, just force sizeof(bool) to 1. case $CXX in cl* | */cl*) ac_cv_sizeof_cpp_bool="1 " ;; *) ac_ext=cc ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (bool))) >= 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_lo=0 ac_mid=0 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (bool))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr $ac_mid + 1` if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid + 1` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (bool))) < 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=-1 ac_mid=-1 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (bool))) >= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_lo=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_hi=`expr '(' $ac_mid ')' - 1` if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo= ac_hi= fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (bool))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=$ac_mid else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr '(' $ac_mid ')' + 1` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in ?*) ac_cv_sizeof_cpp_bool=$ac_lo;; '') { { echo "$as_me:$LINENO: error: cannot compute sizeof (bool) for C++ See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (bool) for C++ See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } ;; esac else if test "$cross_compiling" = yes; then { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling See \`config.log' for more details." >&5 echo "$as_me: error: cannot run test program while cross compiling See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default long longval () { return (long) (sizeof (bool)); } unsigned long ulongval () { return (long) (sizeof (bool)); } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) exit (1); if (((long) (sizeof (bool))) < 0) { long i = longval (); if (i != ((long) (sizeof (bool)))) exit (1); fprintf (f, "%ld\n", i); } else { unsigned long i = ulongval (); if (i != ((long) (sizeof (bool)))) exit (1); fprintf (f, "%lu\n", i); } exit (ferror (f) || fclose (f) != 0); ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_sizeof_cpp_bool=`cat conftest.val` else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) { { echo "$as_me:$LINENO: error: cannot compute sizeof (bool) for C++ See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (bool) for C++ See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi rm -f conftest.val ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ;; esac # Force a particular value to test the code below. # ac_cv_sizeof_cpp_bool=8 { echo "$as_me:$LINENO: C++ bool is $ac_cv_sizeof_cpp_bool bytes." >&5 echo "$as_me: C++ bool is $ac_cv_sizeof_cpp_bool bytes." >&6;} ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu dylp_booltype="no" if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (char))) >= 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_lo=0 ac_mid=0 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (char))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr $ac_mid + 1` if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid + 1` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (char))) < 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=-1 ac_mid=-1 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (char))) >= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_lo=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_hi=`expr '(' $ac_mid ')' - 1` if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo= ac_hi= fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (char))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=$ac_mid else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr '(' $ac_mid ')' + 1` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in ?*) ac_cv_sizeof_c_bool=$ac_lo;; '') { { echo "$as_me:$LINENO: error: cannot compute sizeof (char) for C See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (char) for C See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } ;; esac else if test "$cross_compiling" = yes; then { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling See \`config.log' for more details." >&5 echo "$as_me: error: cannot run test program while cross compiling See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default long longval () { return (long) (sizeof (char)); } unsigned long ulongval () { return (long) (sizeof (char)); } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) exit (1); if (((long) (sizeof (char))) < 0) { long i = longval (); if (i != ((long) (sizeof (char)))) exit (1); fprintf (f, "%ld\n", i); } else { unsigned long i = ulongval (); if (i != ((long) (sizeof (char)))) exit (1); fprintf (f, "%lu\n", i); } exit (ferror (f) || fclose (f) != 0); ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_sizeof_c_bool=`cat conftest.val` else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) { { echo "$as_me:$LINENO: error: cannot compute sizeof (char) for C See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (char) for C See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi rm -f conftest.val if test $ac_cv_sizeof_cpp_bool = $ac_cv_sizeof_c_bool; then dylp_booltype="char" fi if test $dylp_booltype = "no"; then if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (int))) >= 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_lo=0 ac_mid=0 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr $ac_mid + 1` if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid + 1` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (int))) < 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=-1 ac_mid=-1 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (int))) >= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_lo=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_hi=`expr '(' $ac_mid ')' - 1` if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo= ac_hi= fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=$ac_mid else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr '(' $ac_mid ')' + 1` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in ?*) ac_cv_sizeof_c_bool=$ac_lo;; '') { { echo "$as_me:$LINENO: error: cannot compute sizeof (int) for C See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (int) for C See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } ;; esac else if test "$cross_compiling" = yes; then { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling See \`config.log' for more details." >&5 echo "$as_me: error: cannot run test program while cross compiling See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default long longval () { return (long) (sizeof (int)); } unsigned long ulongval () { return (long) (sizeof (int)); } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) exit (1); if (((long) (sizeof (int))) < 0) { long i = longval (); if (i != ((long) (sizeof (int)))) exit (1); fprintf (f, "%ld\n", i); } else { unsigned long i = ulongval (); if (i != ((long) (sizeof (int)))) exit (1); fprintf (f, "%lu\n", i); } exit (ferror (f) || fclose (f) != 0); ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_sizeof_c_bool=`cat conftest.val` else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) { { echo "$as_me:$LINENO: error: cannot compute sizeof (int) for C See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (int) for C See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi rm -f conftest.val if test $ac_cv_sizeof_cpp_bool = $ac_cv_sizeof_c_bool; then dylp_booltype="int" fi fi if test $dylp_booltype = "no"; then if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (short int))) >= 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_lo=0 ac_mid=0 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (short int))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr $ac_mid + 1` if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid + 1` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (short int))) < 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=-1 ac_mid=-1 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (short int))) >= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_lo=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_hi=`expr '(' $ac_mid ')' - 1` if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo= ac_hi= fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (short int))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=$ac_mid else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr '(' $ac_mid ')' + 1` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in ?*) ac_cv_sizeof_c_bool=$ac_lo;; '') { { echo "$as_me:$LINENO: error: cannot compute sizeof (short int) for C See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (short int) for C See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } ;; esac else if test "$cross_compiling" = yes; then { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling See \`config.log' for more details." >&5 echo "$as_me: error: cannot run test program while cross compiling See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default long longval () { return (long) (sizeof (short int)); } unsigned long ulongval () { return (long) (sizeof (short int)); } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) exit (1); if (((long) (sizeof (short int))) < 0) { long i = longval (); if (i != ((long) (sizeof (short int)))) exit (1); fprintf (f, "%ld\n", i); } else { unsigned long i = ulongval (); if (i != ((long) (sizeof (short int)))) exit (1); fprintf (f, "%lu\n", i); } exit (ferror (f) || fclose (f) != 0); ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_sizeof_c_bool=`cat conftest.val` else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) { { echo "$as_me:$LINENO: error: cannot compute sizeof (short int) for C See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (short int) for C See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi rm -f conftest.val if test $ac_cv_sizeof_cpp_bool = $ac_cv_sizeof_c_bool; then dylp_booltype="short int" fi fi if test $dylp_booltype = "no"; then if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (long int))) >= 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_lo=0 ac_mid=0 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (long int))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr $ac_mid + 1` if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid + 1` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (long int))) < 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=-1 ac_mid=-1 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (long int))) >= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_lo=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_hi=`expr '(' $ac_mid ')' - 1` if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo= ac_hi= fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (long int))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=$ac_mid else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr '(' $ac_mid ')' + 1` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in ?*) ac_cv_sizeof_c_bool=$ac_lo;; '') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long int) for C See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (long int) for C See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } ;; esac else if test "$cross_compiling" = yes; then { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling See \`config.log' for more details." >&5 echo "$as_me: error: cannot run test program while cross compiling See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default long longval () { return (long) (sizeof (long int)); } unsigned long ulongval () { return (long) (sizeof (long int)); } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) exit (1); if (((long) (sizeof (long int))) < 0) { long i = longval (); if (i != ((long) (sizeof (long int)))) exit (1); fprintf (f, "%ld\n", i); } else { unsigned long i = ulongval (); if (i != ((long) (sizeof (long int)))) exit (1); fprintf (f, "%lu\n", i); } exit (ferror (f) || fclose (f) != 0); ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_sizeof_c_bool=`cat conftest.val` else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) { { echo "$as_me:$LINENO: error: cannot compute sizeof (long int) for C See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (long int) for C See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi rm -f conftest.val if test $ac_cv_sizeof_cpp_bool = $ac_cv_sizeof_c_bool; then dylp_booltype="long int" fi fi if test $dylp_booltype = "no"; then dylp_booltype="char" { echo "$as_me:$LINENO: WARNING: Cannot determine C type to match C++ bool. Defaulting to char. Dylp will compile, but will certainly crash when executed." >&5 echo "$as_me: WARNING: Cannot determine C type to match C++ bool. Defaulting to char. Dylp will compile, but will certainly crash when executed." >&2;} fi cat >>confdefs.h <<_ACEOF #define BOOL $dylp_booltype _ACEOF ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { echo "$as_me:$LINENO: C $dylp_booltype will be used as bool by dylp." >&5 echo "$as_me: C $dylp_booltype will be used as bool by dylp." >&6;} ######################################################################## # The floating point functions we'll be looking for seem to live in one of # the following headers: math.h, ieeefp.h, float.h, and sunmath.h. Check # for presence. We'll use the results to limit the work below. The coin # macro COIN_PROJECTDIR_INIT should deal with presence/absence of -lm # (for libmath) in ADDLIBS. Don't overrule it here. if test "${ac_cv_header_math_h+set}" = set; then echo "$as_me:$LINENO: checking for math.h" >&5 echo $ECHO_N "checking for math.h... $ECHO_C" >&6 if test "${ac_cv_header_math_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: $ac_cv_header_math_h" >&5 echo "${ECHO_T}$ac_cv_header_math_h" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking math.h usability" >&5 echo $ECHO_N "checking math.h usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking math.h presence" >&5 echo $ECHO_N "checking math.h presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: math.h: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: math.h: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: math.h: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: math.h: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: math.h: present but cannot be compiled" >&5 echo "$as_me: WARNING: math.h: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: math.h: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: math.h: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: math.h: see the Autoconf documentation" >&5 echo "$as_me: WARNING: math.h: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: math.h: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: math.h: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: math.h: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: math.h: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: math.h: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: math.h: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ----------------------------------------- ## ## Report this to coin-dylp@list.coin-or.org ## ## ----------------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for math.h" >&5 echo $ECHO_N "checking for math.h... $ECHO_C" >&6 if test "${ac_cv_header_math_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_header_math_h=$ac_header_preproc fi echo "$as_me:$LINENO: result: $ac_cv_header_math_h" >&5 echo "${ECHO_T}$ac_cv_header_math_h" >&6 fi if test $ac_cv_header_math_h = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_MATH_H 1 _ACEOF fp_header_list="math.h" ac_includes_default="\ $ac_includes_default #include " else { echo "$as_me:$LINENO: WARNING: It appears that math.h is missing." >&5 echo "$as_me: WARNING: It appears that math.h is missing." >&2;} { echo "$as_me:$LINENO: WARNING: There is no hope of building dylp on this system." >&5 echo "$as_me: WARNING: There is no hope of building dylp on this system." >&2;} fi if test "${ac_cv_header_ieeefp_h+set}" = set; then echo "$as_me:$LINENO: checking for ieeefp.h" >&5 echo $ECHO_N "checking for ieeefp.h... $ECHO_C" >&6 if test "${ac_cv_header_ieeefp_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: $ac_cv_header_ieeefp_h" >&5 echo "${ECHO_T}$ac_cv_header_ieeefp_h" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking ieeefp.h usability" >&5 echo $ECHO_N "checking ieeefp.h usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking ieeefp.h presence" >&5 echo $ECHO_N "checking ieeefp.h presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: ieeefp.h: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: ieeefp.h: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: ieeefp.h: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: ieeefp.h: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: ieeefp.h: present but cannot be compiled" >&5 echo "$as_me: WARNING: ieeefp.h: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: ieeefp.h: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: ieeefp.h: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: ieeefp.h: see the Autoconf documentation" >&5 echo "$as_me: WARNING: ieeefp.h: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: ieeefp.h: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: ieeefp.h: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: ieeefp.h: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: ieeefp.h: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: ieeefp.h: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: ieeefp.h: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ----------------------------------------- ## ## Report this to coin-dylp@list.coin-or.org ## ## ----------------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for ieeefp.h" >&5 echo $ECHO_N "checking for ieeefp.h... $ECHO_C" >&6 if test "${ac_cv_header_ieeefp_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_header_ieeefp_h=$ac_header_preproc fi echo "$as_me:$LINENO: result: $ac_cv_header_ieeefp_h" >&5 echo "${ECHO_T}$ac_cv_header_ieeefp_h" >&6 fi if test $ac_cv_header_ieeefp_h = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_IEEEFP_H 1 _ACEOF fp_header_list="ieeefp.h $fp_header_list" ac_includes_default="\ $ac_includes_default #include " fi if test "${ac_cv_header_float_h+set}" = set; then echo "$as_me:$LINENO: checking for float.h" >&5 echo $ECHO_N "checking for float.h... $ECHO_C" >&6 if test "${ac_cv_header_float_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: $ac_cv_header_float_h" >&5 echo "${ECHO_T}$ac_cv_header_float_h" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking float.h usability" >&5 echo $ECHO_N "checking float.h usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking float.h presence" >&5 echo $ECHO_N "checking float.h presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: float.h: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: float.h: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: float.h: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: float.h: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: float.h: present but cannot be compiled" >&5 echo "$as_me: WARNING: float.h: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: float.h: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: float.h: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: float.h: see the Autoconf documentation" >&5 echo "$as_me: WARNING: float.h: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: float.h: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: float.h: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: float.h: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: float.h: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: float.h: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: float.h: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ----------------------------------------- ## ## Report this to coin-dylp@list.coin-or.org ## ## ----------------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for float.h" >&5 echo $ECHO_N "checking for float.h... $ECHO_C" >&6 if test "${ac_cv_header_float_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_header_float_h=$ac_header_preproc fi echo "$as_me:$LINENO: result: $ac_cv_header_float_h" >&5 echo "${ECHO_T}$ac_cv_header_float_h" >&6 fi if test $ac_cv_header_float_h = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_FLOAT_H 1 _ACEOF fp_header_list="float.h $fp_header_list" ac_includes_default="\ $ac_includes_default #include " fi if test "${ac_cv_header_sunmath_h+set}" = set; then echo "$as_me:$LINENO: checking for sunmath.h" >&5 echo $ECHO_N "checking for sunmath.h... $ECHO_C" >&6 if test "${ac_cv_header_sunmath_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: $ac_cv_header_sunmath_h" >&5 echo "${ECHO_T}$ac_cv_header_sunmath_h" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking sunmath.h usability" >&5 echo $ECHO_N "checking sunmath.h usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking sunmath.h presence" >&5 echo $ECHO_N "checking sunmath.h presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: sunmath.h: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: sunmath.h: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: sunmath.h: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: sunmath.h: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: sunmath.h: present but cannot be compiled" >&5 echo "$as_me: WARNING: sunmath.h: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: sunmath.h: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: sunmath.h: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: sunmath.h: see the Autoconf documentation" >&5 echo "$as_me: WARNING: sunmath.h: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: sunmath.h: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: sunmath.h: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: sunmath.h: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: sunmath.h: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: sunmath.h: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: sunmath.h: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ----------------------------------------- ## ## Report this to coin-dylp@list.coin-or.org ## ## ----------------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for sunmath.h" >&5 echo $ECHO_N "checking for sunmath.h... $ECHO_C" >&6 if test "${ac_cv_header_sunmath_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_header_sunmath_h=$ac_header_preproc fi echo "$as_me:$LINENO: result: $ac_cv_header_sunmath_h" >&5 echo "${ECHO_T}$ac_cv_header_sunmath_h" >&6 fi if test $ac_cv_header_sunmath_h = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_SUNMATH_H 1 _ACEOF fp_header_list="sunmath.h $fp_header_list" ac_includes_default="\ $ac_includes_default #include " { echo "$as_me:$LINENO: Determining Sun Studio library directories ... " >&5 echo "$as_me: Determining Sun Studio library directories ... " >&6;} cat /dev/null > dylp_ac_studiodirs.c # The autoconf convention seems to be to put output in a file. Avoids problems # stuffing too-long strings into variables, I suppose. $CC -xdryrun $CFLAGS $CPPFLAGS dylp_ac_studiodirs.c 2> dylp_ac_studiodirs.c # Now find the -YP option. Remember that autoconf does not take kindly to [] in # macros, so we need to use quadrigraphs. SUNSTUDIO_LIBDIRS=`cat dylp_ac_studiodirs.c | \ sed -n -e 's/.*-Y[^,]*,\([^ "]*\).*/-L\1/p' | \ sed -n -e 's/:/ -L/gp'` rm -f dylp_ac_studiodirs.c { echo "$as_me:$LINENO: \"$SUNSTUDIO_LIBDIRS\"" >&5 echo "$as_me: \"$SUNSTUDIO_LIBDIRS\"" >&6;} LIBS="$SUNSTUDIO_LIBDIRS -lsunmath $LIBS" ADDLIBS="-lsunmath $ADDLIBS" fi { echo "$as_me:$LINENO: Found floating point header files $fp_header_list." >&5 echo "$as_me: Found floating point header files $fp_header_list." >&6;} # AC_MSG_NOTICE([includes are now:]) # AC_MSG_NOTICE([$ac_includes_default]) # Now determine the names in this environment for isfinite() and isnan(). The # most common variants are finite() and isnan(). We check for others. After # these macros finish, DYLP_ISFINITE has the name for isfinite(), and # DYLP_ISNAN has the name for isnan(). { echo "$as_me:$LINENO: Checking for proper name for isfinite()." >&5 echo "$as_me: Checking for proper name for isfinite()." >&6;} ac_name_of_isfinite="unavailable" echo "$as_me:$LINENO: checking for finite" >&5 echo $ECHO_N "checking for finite... $ECHO_C" >&6 if test "${ac_cv_func_finite+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define finite to an innocuous variant, in case declares finite. For example, HP-UX 11i declares gettimeofday. */ #define finite innocuous_finite /* System header to define __stub macros and hopefully few prototypes, which can conflict with char finite (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef finite /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char finite (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_finite) || defined (__stub___finite) choke me #else char (*f) () = finite; #endif #ifdef __cplusplus } #endif int main () { return f != finite; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_finite=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_finite=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_finite" >&5 echo "${ECHO_T}$ac_cv_func_finite" >&6 if test $ac_cv_func_finite = yes; then ac_name_of_isfinite=finite fi if test "$ac_name_of_isfinite" = "unavailable"; then echo "$as_me:$LINENO: checking for _finite" >&5 echo $ECHO_N "checking for _finite... $ECHO_C" >&6 if test "${ac_cv_func__finite+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define _finite to an innocuous variant, in case declares _finite. For example, HP-UX 11i declares gettimeofday. */ #define _finite innocuous__finite /* System header to define __stub macros and hopefully few prototypes, which can conflict with char _finite (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef _finite /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char _finite (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub__finite) || defined (__stub____finite) choke me #else char (*f) () = _finite; #endif #ifdef __cplusplus } #endif int main () { return f != _finite; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func__finite=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func__finite=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func__finite" >&5 echo "${ECHO_T}$ac_cv_func__finite" >&6 if test $ac_cv_func__finite = yes; then ac_name_of_isfinite=_finite fi fi if test "$ac_name_of_isfinite" = "unavailable"; then echo "$as_me:$LINENO: checking for isfinite" >&5 echo $ECHO_N "checking for isfinite... $ECHO_C" >&6 if test "${ac_cv_func_isfinite+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define isfinite to an innocuous variant, in case declares isfinite. For example, HP-UX 11i declares gettimeofday. */ #define isfinite innocuous_isfinite /* System header to define __stub macros and hopefully few prototypes, which can conflict with char isfinite (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef isfinite /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char isfinite (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_isfinite) || defined (__stub___isfinite) choke me #else char (*f) () = isfinite; #endif #ifdef __cplusplus } #endif int main () { return f != isfinite; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_isfinite=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_isfinite=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_isfinite" >&5 echo "${ECHO_T}$ac_cv_func_isfinite" >&6 if test $ac_cv_func_isfinite = yes; then ac_name_of_isfinite=isfinite fi fi if test "$ac_name_of_isfinite" = "unavailable"; then { echo "$as_me:$LINENO: WARNING: Cannot find a C function to check if an IEEE floating point value is finite. There is no hope of building dylp on this system." >&5 echo "$as_me: WARNING: Cannot find a C function to check if an IEEE floating point value is finite. There is no hope of building dylp on this system." >&2;} fi cat >>confdefs.h <<_ACEOF #define DYLP_ISFINITE $ac_name_of_isfinite _ACEOF { echo "$as_me:$LINENO: Using $ac_name_of_isfinite as isfinite()." >&5 echo "$as_me: Using $ac_name_of_isfinite as isfinite()." >&6;} { echo "$as_me:$LINENO: Checking for proper name for isnan()." >&5 echo "$as_me: Checking for proper name for isnan()." >&6;} ac_name_of_isnan="unavailable" echo "$as_me:$LINENO: checking for isnan" >&5 echo $ECHO_N "checking for isnan... $ECHO_C" >&6 if test "${ac_cv_func_isnan+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define isnan to an innocuous variant, in case declares isnan. For example, HP-UX 11i declares gettimeofday. */ #define isnan innocuous_isnan /* System header to define __stub macros and hopefully few prototypes, which can conflict with char isnan (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef isnan /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char isnan (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_isnan) || defined (__stub___isnan) choke me #else char (*f) () = isnan; #endif #ifdef __cplusplus } #endif int main () { return f != isnan; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_isnan=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_isnan=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_isnan" >&5 echo "${ECHO_T}$ac_cv_func_isnan" >&6 if test $ac_cv_func_isnan = yes; then ac_name_of_isnan=isnan fi if test "$ac_name_of_isnan" = "unavailable"; then echo "$as_me:$LINENO: checking for _isnan" >&5 echo $ECHO_N "checking for _isnan... $ECHO_C" >&6 if test "${ac_cv_func__isnan+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define _isnan to an innocuous variant, in case declares _isnan. For example, HP-UX 11i declares gettimeofday. */ #define _isnan innocuous__isnan /* System header to define __stub macros and hopefully few prototypes, which can conflict with char _isnan (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef _isnan /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char _isnan (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub__isnan) || defined (__stub____isnan) choke me #else char (*f) () = _isnan; #endif #ifdef __cplusplus } #endif int main () { return f != _isnan; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func__isnan=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func__isnan=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func__isnan" >&5 echo "${ECHO_T}$ac_cv_func__isnan" >&6 if test $ac_cv_func__isnan = yes; then ac_name_of_isnan=_isnan fi fi if test "$ac_name_of_isnan" = "unavailable"; then { echo "$as_me:$LINENO: WARNING: Cannot find a C function to check if an IEEE floating point value is NaN. There is no hope of building dylp on this system." >&5 echo "$as_me: WARNING: Cannot find a C function to check if an IEEE floating point value is NaN. There is no hope of building dylp on this system." >&2;} fi cat >>confdefs.h <<_ACEOF #define DYLP_ISNAN $ac_name_of_isnan _ACEOF { echo "$as_me:$LINENO: Using $ac_name_of_isnan as isnan()." >&5 echo "$as_me: Using $ac_name_of_isnan as isnan()." >&6;} # Check for the presence of a quiet_nan function. To my knowledge, this will # exist only if sunmath is present, but hey, who knows what lurks out there. echo "$as_me:$LINENO: checking for quiet_nan" >&5 echo $ECHO_N "checking for quiet_nan... $ECHO_C" >&6 if test "${ac_cv_func_quiet_nan+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define quiet_nan to an innocuous variant, in case declares quiet_nan. For example, HP-UX 11i declares gettimeofday. */ #define quiet_nan innocuous_quiet_nan /* System header to define __stub macros and hopefully few prototypes, which can conflict with char quiet_nan (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef quiet_nan /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char quiet_nan (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_quiet_nan) || defined (__stub___quiet_nan) choke me #else char (*f) () = quiet_nan; #endif #ifdef __cplusplus } #endif int main () { return f != quiet_nan; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_quiet_nan=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_quiet_nan=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_quiet_nan" >&5 echo "${ECHO_T}$ac_cv_func_quiet_nan" >&6 if test $ac_cv_func_quiet_nan = yes; then cat >>confdefs.h <<\_ACEOF #define DYLP_HAS_QUIET_NAN 1 _ACEOF fi # And determine whether we're big-endian or little-endian. This is necessary to # define the correct patterns for IEEE infinity and quiet_nan, in the event # that we can't get them any other way. This will define WORDS_BIGENDIAN if # we're on a big-endian machine, and do nothing otherwise. echo "$as_me:$LINENO: checking whether byte ordering is bigendian" >&5 echo $ECHO_N "checking whether byte ordering is bigendian... $ECHO_C" >&6 if test "${ac_cv_c_bigendian+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # See if sys/param.h defines the BYTE_ORDER macro. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include int main () { #if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN bogus endian macros #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then # It does; now see whether it defined to BIG_ENDIAN or not. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_c_bigendian=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_c_bigendian=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # It does not; compile a test program. if test "$cross_compiling" = yes; then # try to guess the endianness by grepping values into an object file ac_cv_c_bigendian=unknown cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; void _ascii () { char *s = (char *) ascii_mm; s = (char *) ascii_ii; } short ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; void _ebcdic () { char *s = (char *) ebcdic_mm; s = (char *) ebcdic_ii; } int main () { _ascii (); _ebcdic (); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then if grep BIGenDianSyS conftest.$ac_objext >/dev/null ; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long l; char c[sizeof (long)]; } u; u.l = 1; exit (u.c[sizeof (long) - 1] == 1); } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_c_bigendian=no else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_c_bigendian=yes fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_c_bigendian" >&5 echo "${ECHO_T}$ac_cv_c_bigendian" >&6 case $ac_cv_c_bigendian in yes) cat >>confdefs.h <<\_ACEOF #define WORDS_BIGENDIAN 1 _ACEOF ;; no) ;; *) { { echo "$as_me:$LINENO: error: unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" >&5 echo "$as_me: error: unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" >&2;} { (exit 1); exit 1; }; } ;; esac # Finally, dylp needs to know where its error message text file is located. # This is made horribly complicated by Windows, which uses drive letters and # backslash in the native path format, and by the variation between faked unix # environments on Windows. Cygwin isn't too bad --- it provides cygpath to # translate a unix path into native Windows format. Mingw/Msys can't be # bothered, so we need to work harder. # Keep in mind the sed expressions are interpreted by the shell and then by # sed; the backslashes are halved each time. In the end we're left with # s,/,\\,g or s,\,\\,g as the actual substitutions. This gets us a double # backslash in DYLP_ERRMSGDIR, which the various compilers can strip down to # one. Sheesh. if test x"$DYLP_ERRMSGDIR" = x; then case $build in *-mingw*|*-msys*) DYLP_ERRMSGDIR="`(cd "$abs_source_dir";pwd -W)`/src/Dylp/" DYLP_ERRMSGDIR=`echo $DYLP_ERRMSGDIR | sed -e 's,/,\\\\\\\\,g'` ;; *-cygwin*) DYLP_ERRMSGDIR="`$CYGPATH_W $abs_source_dir/src/Dylp/`" DYLP_ERRMSGDIR=`echo $DYLP_ERRMSGDIR | sed -e 's,\\\\,\\\\\\\\,g'` ;; *) DYLP_ERRMSGDIR="$abs_source_dir/src/Dylp/" ;; esac fi cat >>confdefs.h <<_ACEOF #define DYLP_ERRMSGDIR "$DYLP_ERRMSGDIR" _ACEOF ############################################################################## # Dylp configuration options # ############################################################################## # Check whether --enable-dylp-paranoia or --disable-dylp-paranoia was given. if test "${enable_dylp_paranoia+set}" = set; then enableval="$enable_dylp_paranoia" dylp_paranoia=$enableval else dylp_paranoia=no fi; if test "$dylp_paranoia" = "yes"; then cat >>confdefs.h <<\_ACEOF #define DYLP_PARANOIA 1 _ACEOF { echo "$as_me:$LINENO: Dylp paranoid checks enabled." >&5 echo "$as_me: Dylp paranoid checks enabled." >&6;} else { echo "$as_me:$LINENO: Dylp paranoid checks disabled." >&5 echo "$as_me: Dylp paranoid checks disabled." >&6;} fi # Check whether --enable-dylp-stats or --disable-dylp-stats was given. if test "${enable_dylp_stats+set}" = set; then enableval="$enable_dylp_stats" dylp_stats=$enableval else dylp_stats=no fi; if test "$dylp_stats" = "yes"; then cat >>confdefs.h <<\_ACEOF #define DYLP_STATISTICS 1 _ACEOF { echo "$as_me:$LINENO: Dylp statistics collection enabled." >&5 echo "$as_me: Dylp statistics collection enabled." >&6;} else { echo "$as_me:$LINENO: Dylp statistics collection disabled." >&5 echo "$as_me: Dylp statistics collection disabled." >&6;} fi # Check whether --enable-dylp-info or --disable-dylp-info was given. if test "${enable_dylp_info+set}" = set; then enableval="$enable_dylp_info" dylp_info=$enableval else dylp_info=yes fi; if test "$dylp_info" = "no"; then cat >>confdefs.h <<\_ACEOF #define DYLP_NDEBUG 1 _ACEOF { echo "$as_me:$LINENO: Dylp informational printing disabled." >&5 echo "$as_me: Dylp informational printing disabled." >&6;} else { echo "$as_me:$LINENO: Dylp informational printing enabled." >&5 echo "$as_me: Dylp informational printing enabled." >&6;} fi ############################################################################## # VPATH links for example input files # ############################################################################## # In case this is a VPATH configuration we need to make sure that the # input files for the examples are available in the VPATH directory. echo "$as_me:$LINENO: checking whether this is a VPATH configuration" >&5 echo $ECHO_N "checking whether this is a VPATH configuration... $ECHO_C" >&6 if test `cd $srcdir; pwd` != `pwd`; then coin_vpath_config=yes; else coin_vpath_config=no; fi echo "$as_me:$LINENO: result: $coin_vpath_config" >&5 echo "${ECHO_T}$coin_vpath_config" >&6 if test $coin_vpath_config = yes; then coin_vpath_link_files="$coin_vpath_link_files examples/plain" fi ############################################################################## # Finishing up by writing all the output # ############################################################################## # Here list all the files that configure should create (except for the # configuration header file). First the usual stuff: DyLP's top-level Makefile, # the code Makefiles (src/*/Makefile), and the test Makefile. ac_config_files="$ac_config_files Makefile examples/Makefile src/DylpStdLib/Makefile src/Dylp/Makefile test/Makefile dylp_addlibs.txt" # And all the stuff that goes into building the documentation. See the note in # Makefile.am with respect to CONFIG_CLEAN_FILES and the distclean and # distclean-local targets. ac_config_files="$ac_config_files doc/Makefile doc/dylpabsdir.tex doc/makefile.dylpdoc doc/Figures/Makefile doc/TexMF/Makefile" ac_config_files="$ac_config_files doc/build_dylpdoc" # Here put the location and name of the configuration header file ac_config_headers="$ac_config_headers inc/config_dylp.h" # Finally, we let configure write all the output... echo "$as_me:$LINENO: checking which command should be used to link input files" >&5 echo $ECHO_N "checking which command should be used to link input files... $ECHO_C" >&6 coin_link_input_cmd="$LN_S" if test "$enable_doscompile" = mingw; then coin_link_input_cmd=cp fi case "$CC" in cl* | */cl* | CL* | */CL* | icl* | */icl* | ICL* | */ICL*) coin_link_input_cmd=cp ;; esac echo "$as_me:$LINENO: result: $coin_link_input_cmd" >&5 echo "${ECHO_T}$coin_link_input_cmd" >&6 if test x$coin_skip_ac_output != xyes; then FADDLIBS="$ADDLIBS" if test x"$coin_need_flibs" = xyes; then ADDLIBS="$ADDLIBS $FLIBS" fi # library extension case "$CC" in cl* | */cl* | CL* | */CL* | icl* | */icl* | ICL* | */ICL*) LIBEXT=lib ;; *) LIBEXT=a ;; esac # Define VPATH_DISTCLEANFILES to be everything that needs to be # cleaned for distclean in a vpath configuration VPATH_DISTCLEANFILES="$coin_vpath_link_files" # Take out subdirectories if their configuration concluded that they # don't need to be compiled if test x"$coin_ac_skip_subdirs" != x; then new_subdirs= for i in $subdirs; do skipme=no for j in $coin_ac_skip_subdirs; do if test $i = $j; then skipme=yes; fi done if test $skipme = no; then new_subdirs="$new_subdirs $i" fi done subdirs="$new_subdirs" fi cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, don't put newlines in cache variables' values. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. { (set) 2>&1 | case `(ac_space=' '; set | grep ac_space) 2>&1` in *ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } | sed ' t clear : clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ : end' >>confcache if diff $cache_file confcache >/dev/null 2>&1; then :; else if test -w $cache_file; then test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" cat confcache >$cache_file else echo "not updating unwritable cache $cache_file" fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/; s/:*\${srcdir}:*/:/; s/:*@srcdir@:*/:/; s/^\([^=]*=[ ]*\):*/\1/; s/:*$//; s/^[^=]*=[ ]*$//; }' fi DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_i=`echo "$ac_i" | sed 's/\$U\././;s/\.o$//;s/\.obj$//'` # 2. Add them. ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -z "${ALWAYS_FALSE_TRUE}" && test -z "${ALWAYS_FALSE_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"ALWAYS_FALSE\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"ALWAYS_FALSE\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${HAVE_EXTERNALS_TRUE}" && test -z "${HAVE_EXTERNALS_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"HAVE_EXTERNALS\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"HAVE_EXTERNALS\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${COIN_HAS_DYLP_TRUE}" && test -z "${COIN_HAS_DYLP_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"COIN_HAS_DYLP\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"COIN_HAS_DYLP\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${COIN_HAS_COINUTILS_TRUE}" && test -z "${COIN_HAS_COINUTILS_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"COIN_HAS_COINUTILS\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"COIN_HAS_COINUTILS\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${COIN_HAS_OSI_TRUE}" && test -z "${COIN_HAS_OSI_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"COIN_HAS_OSI\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"COIN_HAS_OSI\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH exec 6>&1 # Open the log real soon, to keep \$[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. Logging --version etc. is OK. exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX } >&5 cat >&5 <<_CSEOF This file was extended by DyLP $as_me 1.6.0, which was generated by GNU Autoconf 2.59. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ _CSEOF echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 echo >&5 _ACEOF # Files that config.status was made for. if test -n "$ac_config_files"; then echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS fi if test -n "$ac_config_headers"; then echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS fi if test -n "$ac_config_links"; then echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS fi if test -n "$ac_config_commands"; then echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS fi cat >>$CONFIG_STATUS <<\_ACEOF ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ DyLP config.status 1.6.0 configured by $0, generated by GNU Autoconf 2.59, with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2003 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." srcdir=$srcdir INSTALL="$INSTALL" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If no file are specified by the user, then we need to provide default # value. By we need to know if files were specified by the user. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "x$1" : 'x\([^=]*\)='` ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` ac_shift=: ;; -*) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; *) # This is not an option, so the user has probably given explicit # arguments. ac_option=$1 ac_need_defaults=false;; esac case $ac_option in # Handling of the options. _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --vers* | -V ) echo "$ac_cs_version"; exit 0 ;; --he | --h) # Conflict between --help and --header { { echo "$as_me:$LINENO: error: ambiguous option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: ambiguous option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; };; --help | --hel | -h ) echo "$ac_cs_usage"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift CONFIG_FILES="$CONFIG_FILES $ac_optarg" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" ac_need_defaults=false;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; } ;; *) ac_config_targets="$ac_config_targets $1" ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF if \$ac_cs_recheck; then echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # # INIT-COMMANDS section. # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF for ac_config_target in $ac_config_targets do case "$ac_config_target" in # Handling of arguments. "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; "examples/Makefile" ) CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;; "src/DylpStdLib/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/DylpStdLib/Makefile" ;; "src/Dylp/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/Dylp/Makefile" ;; "test/Makefile" ) CONFIG_FILES="$CONFIG_FILES test/Makefile" ;; "dylp_addlibs.txt" ) CONFIG_FILES="$CONFIG_FILES dylp_addlibs.txt" ;; "doc/Makefile" ) CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; "doc/dylpabsdir.tex" ) CONFIG_FILES="$CONFIG_FILES doc/dylpabsdir.tex" ;; "doc/makefile.dylpdoc" ) CONFIG_FILES="$CONFIG_FILES doc/makefile.dylpdoc" ;; "doc/Figures/Makefile" ) CONFIG_FILES="$CONFIG_FILES doc/Figures/Makefile" ;; "doc/TexMF/Makefile" ) CONFIG_FILES="$CONFIG_FILES doc/TexMF/Makefile" ;; "doc/build_dylpdoc" ) CONFIG_FILES="$CONFIG_FILES doc/build_dylpdoc" ;; "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "inc/config_dylp.h" ) CONFIG_HEADERS="$CONFIG_HEADERS inc/config_dylp.h" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason to put it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Create a temporary directory, and hook for its removal unless debugging. $debug || { trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./confstat$$-$RANDOM (umask 077 && mkdir $tmp) } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # # CONFIG_FILES section. # # No need to generate the scripts if there are no CONFIG_FILES. # This happens for instance when ./config.status config.h if test -n "\$CONFIG_FILES"; then # Protect against being on the right side of a sed subst in config.status. sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF s,@SHELL@,$SHELL,;t t s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t s,@exec_prefix@,$exec_prefix,;t t s,@prefix@,$prefix,;t t s,@program_transform_name@,$program_transform_name,;t t s,@bindir@,$bindir,;t t s,@sbindir@,$sbindir,;t t s,@libexecdir@,$libexecdir,;t t s,@datadir@,$datadir,;t t s,@sysconfdir@,$sysconfdir,;t t s,@sharedstatedir@,$sharedstatedir,;t t s,@localstatedir@,$localstatedir,;t t s,@libdir@,$libdir,;t t s,@includedir@,$includedir,;t t s,@oldincludedir@,$oldincludedir,;t t s,@infodir@,$infodir,;t t s,@mandir@,$mandir,;t t s,@build_alias@,$build_alias,;t t s,@host_alias@,$host_alias,;t t s,@target_alias@,$target_alias,;t t s,@DEFS@,$DEFS,;t t s,@ECHO_C@,$ECHO_C,;t t s,@ECHO_N@,$ECHO_N,;t t s,@ECHO_T@,$ECHO_T,;t t s,@LIBS@,$LIBS,;t t s,@build@,$build,;t t s,@build_cpu@,$build_cpu,;t t s,@build_vendor@,$build_vendor,;t t s,@build_os@,$build_os,;t t s,@ADDLIBS@,$ADDLIBS,;t t s,@FADDLIBS@,$FADDLIBS,;t t s,@ALWAYS_FALSE_TRUE@,$ALWAYS_FALSE_TRUE,;t t s,@ALWAYS_FALSE_FALSE@,$ALWAYS_FALSE_FALSE,;t t s,@CDEFS@,$CDEFS,;t t s,@ADD_CFLAGS@,$ADD_CFLAGS,;t t s,@DBG_CFLAGS@,$DBG_CFLAGS,;t t s,@OPT_CFLAGS@,$OPT_CFLAGS,;t t s,@sol_cc_compiler@,$sol_cc_compiler,;t t s,@CC@,$CC,;t t s,@CFLAGS@,$CFLAGS,;t t s,@LDFLAGS@,$LDFLAGS,;t t s,@CPPFLAGS@,$CPPFLAGS,;t t s,@ac_ct_CC@,$ac_ct_CC,;t t s,@EXEEXT@,$EXEEXT,;t t s,@OBJEXT@,$OBJEXT,;t t s,@MPICC@,$MPICC,;t t s,@CXXDEFS@,$CXXDEFS,;t t s,@ADD_CXXFLAGS@,$ADD_CXXFLAGS,;t t s,@DBG_CXXFLAGS@,$DBG_CXXFLAGS,;t t s,@OPT_CXXFLAGS@,$OPT_CXXFLAGS,;t t s,@CXX@,$CXX,;t t s,@CXXFLAGS@,$CXXFLAGS,;t t s,@ac_ct_CXX@,$ac_ct_CXX,;t t s,@MPICXX@,$MPICXX,;t t s,@EGREP@,$EGREP,;t t s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t s,@INSTALL_DATA@,$INSTALL_DATA,;t t s,@CYGPATH_W@,$CYGPATH_W,;t t s,@PACKAGE@,$PACKAGE,;t t s,@VERSION@,$VERSION,;t t s,@ACLOCAL@,$ACLOCAL,;t t s,@AUTOCONF@,$AUTOCONF,;t t s,@AUTOMAKE@,$AUTOMAKE,;t t s,@AUTOHEADER@,$AUTOHEADER,;t t s,@MAKEINFO@,$MAKEINFO,;t t s,@install_sh@,$install_sh,;t t s,@STRIP@,$STRIP,;t t s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t s,@mkdir_p@,$mkdir_p,;t t s,@AWK@,$AWK,;t t s,@SET_MAKE@,$SET_MAKE,;t t s,@am__leading_dot@,$am__leading_dot,;t t s,@AMTAR@,$AMTAR,;t t s,@am__tar@,$am__tar,;t t s,@am__untar@,$am__untar,;t t s,@DEPDIR@,$DEPDIR,;t t s,@am__include@,$am__include,;t t s,@am__quote@,$am__quote,;t t s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t s,@CCDEPMODE@,$CCDEPMODE,;t t s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t s,@CXXDEPMODE@,$CXXDEPMODE,;t t s,@am__fastdepCXX_TRUE@,$am__fastdepCXX_TRUE,;t t s,@am__fastdepCXX_FALSE@,$am__fastdepCXX_FALSE,;t t s,@MAINTAINER_MODE_TRUE@,$MAINTAINER_MODE_TRUE,;t t s,@MAINTAINER_MODE_FALSE@,$MAINTAINER_MODE_FALSE,;t t s,@MAINT@,$MAINT,;t t s,@LIBTOOLM4@,$LIBTOOLM4,;t t s,@have_autoconf@,$have_autoconf,;t t s,@have_automake@,$have_automake,;t t s,@have_svn@,$have_svn,;t t s,@BUILDTOOLSDIR@,$BUILDTOOLSDIR,;t t s,@AUX_DIR@,$AUX_DIR,;t t s,@abs_source_dir@,$abs_source_dir,;t t s,@abs_lib_dir@,$abs_lib_dir,;t t s,@abs_include_dir@,$abs_include_dir,;t t s,@abs_bin_dir@,$abs_bin_dir,;t t s,@HAVE_EXTERNALS_TRUE@,$HAVE_EXTERNALS_TRUE,;t t s,@HAVE_EXTERNALS_FALSE@,$HAVE_EXTERNALS_FALSE,;t t s,@host@,$host,;t t s,@host_cpu@,$host_cpu,;t t s,@host_vendor@,$host_vendor,;t t s,@host_os@,$host_os,;t t s,@LN_S@,$LN_S,;t t s,@ECHO@,$ECHO,;t t s,@AR@,$AR,;t t s,@ac_ct_AR@,$ac_ct_AR,;t t s,@RANLIB@,$RANLIB,;t t s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t s,@CPP@,$CPP,;t t s,@CXXCPP@,$CXXCPP,;t t s,@F77@,$F77,;t t s,@FFLAGS@,$FFLAGS,;t t s,@ac_ct_F77@,$ac_ct_F77,;t t s,@LIBTOOL@,$LIBTOOL,;t t s,@ac_c_preproc_warn_flag@,$ac_c_preproc_warn_flag,;t t s,@ac_cxx_preproc_warn_flag@,$ac_cxx_preproc_warn_flag,;t t s,@RPATH_FLAGS@,$RPATH_FLAGS,;t t s,@LT_LDFLAGS@,$LT_LDFLAGS,;t t s,@DYLPSRCDIR@,$DYLPSRCDIR,;t t s,@DYLPOBJDIR@,$DYLPOBJDIR,;t t s,@DYLPDOCDIR@,$DYLPDOCDIR,;t t s,@COIN_HAS_DYLP_TRUE@,$COIN_HAS_DYLP_TRUE,;t t s,@COIN_HAS_DYLP_FALSE@,$COIN_HAS_DYLP_FALSE,;t t s,@COINUTILSSRCDIR@,$COINUTILSSRCDIR,;t t s,@COINUTILSOBJDIR@,$COINUTILSOBJDIR,;t t s,@COINUTILSDOCDIR@,$COINUTILSDOCDIR,;t t s,@COIN_HAS_COINUTILS_TRUE@,$COIN_HAS_COINUTILS_TRUE,;t t s,@COIN_HAS_COINUTILS_FALSE@,$COIN_HAS_COINUTILS_FALSE,;t t s,@OSISRCDIR@,$OSISRCDIR,;t t s,@OSIOBJDIR@,$OSIOBJDIR,;t t s,@OSIDOCDIR@,$OSIDOCDIR,;t t s,@COIN_HAS_OSI_TRUE@,$COIN_HAS_OSI_TRUE,;t t s,@COIN_HAS_OSI_FALSE@,$COIN_HAS_OSI_FALSE,;t t s,@DYLP_ERRMSGDIR@,$DYLP_ERRMSGDIR,;t t s,@LIBEXT@,$LIBEXT,;t t s,@VPATH_DISTCLEANFILES@,$VPATH_DISTCLEANFILES,;t t s,@LIBOBJS@,$LIBOBJS,;t t s,@LTLIBOBJS@,$LTLIBOBJS,;t t CEOF _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # Split the substitutions into bite-sized pieces for seds with # small command number limits, like on Digital OSF/1 and HP-UX. ac_max_sed_lines=48 ac_sed_frag=1 # Number of current file. ac_beg=1 # First line for current file. ac_end=$ac_max_sed_lines # Line after last line for current file. ac_more_lines=: ac_sed_cmds= while $ac_more_lines; do if test $ac_beg -gt 1; then sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag else sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag fi if test ! -s $tmp/subs.frag; then ac_more_lines=false else # The purpose of the label and of the branching condition is to # speed up the sed processing (if there are no `@' at all, there # is no need to browse any of the substitutions). # These are the two extra sed commands mentioned above. (echo ':t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed if test -z "$ac_sed_cmds"; then ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" else ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" fi ac_sed_frag=`expr $ac_sed_frag + 1` ac_beg=$ac_end ac_end=`expr $ac_end + $ac_max_sed_lines` fi done if test -z "$ac_sed_cmds"; then ac_sed_cmds=cat fi fi # test -n "$CONFIG_FILES" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin cat >$tmp/stdin ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. ac_dir=`(dirname "$ac_file") 2>/dev/null || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_builddir$INSTALL ;; esac if test x"$ac_file" != x-; then { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} rm -f "$ac_file" fi # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ if test x"$ac_file" = x-; then configure_input= else configure_input="$ac_file. " fi configure_input=$configure_input"Generated from `echo $ac_file_in | sed 's,.*/,,'` by configure." # First look for the input files in the build tree, otherwise in the # src tree. ac_file_inputs=`IFS=: for f in $ac_file_in; do case $f in -) echo $tmp/stdin ;; [\\/$]*) # Absolute (can't be DOS-style, as IFS=:) test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } echo "$f";; *) # Relative if test -f "$f"; then # Build tree echo "$f" elif test -f "$srcdir/$f"; then # Source tree echo "$srcdir/$f" else # /dev/null tree { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } fi;; esac done` || { (exit 1); exit 1; } _ACEOF cat >>$CONFIG_STATUS <<_ACEOF sed "$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s,@configure_input@,$configure_input,;t t s,@srcdir@,$ac_srcdir,;t t s,@abs_srcdir@,$ac_abs_srcdir,;t t s,@top_srcdir@,$ac_top_srcdir,;t t s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t s,@builddir@,$ac_builddir,;t t s,@abs_builddir@,$ac_abs_builddir,;t t s,@top_builddir@,$ac_top_builddir,;t t s,@abs_top_builddir@,$ac_abs_top_builddir,;t t s,@INSTALL@,$ac_INSTALL,;t t " $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out rm -f $tmp/stdin if test x"$ac_file" != x-; then mv $tmp/out $ac_file else cat $tmp/out rm -f $tmp/out fi # Run the commands associated with the file. case $ac_file in doc/build_dylpdoc ) chmod +x doc/build_dylpdoc ;; esac done _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # # CONFIG_HEADER section. # # These sed commands are passed to sed as "A NAME B NAME C VALUE D", where # NAME is the cpp macro being defined and VALUE is the value it is being given. # # ac_d sets the value in "#define NAME VALUE" lines. ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' ac_dB='[ ].*$,\1#\2' ac_dC=' ' ac_dD=',;t' # ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' ac_uB='$,\1#\2define\3' ac_uC=' ' ac_uD=',;t' for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin cat >$tmp/stdin ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} # First look for the input files in the build tree, otherwise in the # src tree. ac_file_inputs=`IFS=: for f in $ac_file_in; do case $f in -) echo $tmp/stdin ;; [\\/$]*) # Absolute (can't be DOS-style, as IFS=:) test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } # Do quote $f, to prevent DOS paths from being IFS'd. echo "$f";; *) # Relative if test -f "$f"; then # Build tree echo "$f" elif test -f "$srcdir/$f"; then # Source tree echo "$srcdir/$f" else # /dev/null tree { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } fi;; esac done` || { (exit 1); exit 1; } # Remove the trailing spaces. sed 's/[ ]*$//' $ac_file_inputs >$tmp/in _ACEOF # Transform confdefs.h into two sed scripts, `conftest.defines' and # `conftest.undefs', that substitutes the proper values into # config.h.in to produce config.h. The first handles `#define' # templates, and the second `#undef' templates. # And first: Protect against being on the right side of a sed subst in # config.status. Protect against being in an unquoted here document # in config.status. rm -f conftest.defines conftest.undefs # Using a here document instead of a string reduces the quoting nightmare. # Putting comments in sed scripts is not portable. # # `end' is used to avoid that the second main sed command (meant for # 0-ary CPP macros) applies to n-ary macro definitions. # See the Autoconf documentation for `clear'. cat >confdef2sed.sed <<\_ACEOF s/[\\&,]/\\&/g s,[\\$`],\\&,g t clear : clear s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp t end s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp : end _ACEOF # If some macros were called several times there might be several times # the same #defines, which is useless. Nevertheless, we may not want to # sort them, since we want the *last* AC-DEFINE to be honored. uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs rm -f confdef2sed.sed # This sed command replaces #undef with comments. This is necessary, for # example, in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. cat >>conftest.undefs <<\_ACEOF s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, _ACEOF # Break up conftest.defines because some shells have a limit on the size # of here documents, and old seds have small limits too (100 cmds). echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS echo ' :' >>$CONFIG_STATUS rm -f conftest.tail while grep . conftest.defines >/dev/null do # Write a limited-size here document to $tmp/defines.sed. echo ' cat >$tmp/defines.sed <>$CONFIG_STATUS # Speed up: don't consider the non `#define' lines. echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS # Work around the forget-to-reset-the-flag bug. echo 't clr' >>$CONFIG_STATUS echo ': clr' >>$CONFIG_STATUS sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS echo 'CEOF sed -f $tmp/defines.sed $tmp/in >$tmp/out rm -f $tmp/in mv $tmp/out $tmp/in ' >>$CONFIG_STATUS sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail rm -f conftest.defines mv conftest.tail conftest.defines done rm -f conftest.defines echo ' fi # grep' >>$CONFIG_STATUS echo >>$CONFIG_STATUS # Break up conftest.undefs because some shells have a limit on the size # of here documents, and old seds have small limits too (100 cmds). echo ' # Handle all the #undef templates' >>$CONFIG_STATUS rm -f conftest.tail while grep . conftest.undefs >/dev/null do # Write a limited-size here document to $tmp/undefs.sed. echo ' cat >$tmp/undefs.sed <>$CONFIG_STATUS # Speed up: don't consider the non `#undef' echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS # Work around the forget-to-reset-the-flag bug. echo 't clr' >>$CONFIG_STATUS echo ': clr' >>$CONFIG_STATUS sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS echo 'CEOF sed -f $tmp/undefs.sed $tmp/in >$tmp/out rm -f $tmp/in mv $tmp/out $tmp/in ' >>$CONFIG_STATUS sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail rm -f conftest.undefs mv conftest.tail conftest.undefs done rm -f conftest.undefs cat >>$CONFIG_STATUS <<\_ACEOF # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ if test x"$ac_file" = x-; then echo "/* Generated by configure. */" >$tmp/config.h else echo "/* $ac_file. Generated by configure. */" >$tmp/config.h fi cat $tmp/in >>$tmp/config.h rm -f $tmp/in if test x"$ac_file" != x-; then if diff $ac_file $tmp/config.h >/dev/null 2>&1; then { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 echo "$as_me: $ac_file is unchanged" >&6;} else ac_dir=`(dirname "$ac_file") 2>/dev/null || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } rm -f $ac_file mv $tmp/config.h $ac_file fi else cat $tmp/config.h rm -f $tmp/config.h fi # Compute $ac_file's index in $config_headers. _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $ac_file | $ac_file:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null || $as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X$ac_file : 'X\(//\)[^/]' \| \ X$ac_file : 'X\(//\)$' \| \ X$ac_file : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X$ac_file | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'`/stamp-h$_am_stamp_count done _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # # CONFIG_COMMANDS section. # for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue ac_dest=`echo "$ac_file" | sed 's,:.*,,'` ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_dir=`(dirname "$ac_dest") 2>/dev/null || $as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_dest" : 'X\(//\)[^/]' \| \ X"$ac_dest" : 'X\(//\)$' \| \ X"$ac_dest" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_dest" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac { echo "$as_me:$LINENO: executing $ac_dest commands" >&5 echo "$as_me: executing $ac_dest commands" >&6;} case $ac_dest in depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # So let's grep whole file. if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then dirpart=`(dirname "$mf") 2>/dev/null || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`(dirname "$file") 2>/dev/null || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p $dirpart/$fdir else as_dir=$dirpart/$fdir as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5 echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;} { (exit 1); exit 1; }; }; } # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done ;; esac done _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || { (exit 1); exit 1; } fi if test x"$coin_vpath_link_files" = x; then : ; else lnkcmd="$coin_link_input_cmd" if test "$lnkcmd" = cp; then { echo "$as_me:$LINENO: Copying data files for VPATH configuration" >&5 echo "$as_me: Copying data files for VPATH configuration" >&6;} else { echo "$as_me:$LINENO: Creating VPATH links for data files" >&5 echo "$as_me: Creating VPATH links for data files" >&6;} fi for file in $coin_vpath_link_files; do dir=`(dirname "./$file") 2>/dev/null || $as_expr X"./$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"./$file" : 'X\(//\)[^/]' \| \ X"./$file" : 'X\(//\)$' \| \ X"./$file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"./$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` if test -d $dir; then : ; else { if $as_mkdir_p; then mkdir -p $dir else as_dir=$dir as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory $dir" >&5 echo "$as_me: error: cannot create directory $dir" >&2;} { (exit 1); exit 1; }; }; } fi rm -f $file $lnkcmd $abs_source_dir/$file $file done fi if test x$coin_projectdir = xyes; then { echo "$as_me:$LINENO: Configuration of $PACKAGE_NAME successful" >&5 echo "$as_me: Configuration of $PACKAGE_NAME successful" >&6;} else { echo "$as_me:$LINENO: Main configuration of $PACKAGE_NAME successful" >&5 echo "$as_me: Main configuration of $PACKAGE_NAME successful" >&6;} fi else { echo "$as_me:$LINENO: No configuration of $PACKAGE_NAME necessary" >&5 echo "$as_me: No configuration of $PACKAGE_NAME necessary" >&6;} fi DyLP-1.6.0/DyLP/src/0000755000076700007670000000000011414302677010670 5ustar DyLP-1.6.0/DyLP/src/DylpStdLib/0000755000076700007670000000000011414302677012702 5ustar DyLP-1.6.0/DyLP/src/DylpStdLib/dylib_hash.c0000644000076700007670000001546010632415522015155 0ustar /* This file is part of the support library for the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This module contains routines for maintaining hash tables. Each entry has a character string key and a pointer to whatever data the user chooses to keep. The module is a standalone unit. I/O is handled entirely by stdio facilities unless the malloc debugging macros (dylib_std.h) are compiled in, in which case the io library is needed. */ #include "dylib_std.h" static char sccsid[] UNUSED = "@(#)hash.c 1.4 09/25/04" ; static char svnid[] UNUSED = "$Id: dylib_hash.c 148 2007-06-09 03:15:30Z lou $" ; #include #include "dylib_hash.h" static int hash (const char *key, int size) /* Function to return an index into the hash table. The function simply adds up the values of the char's in the string. Parameter: key: pointer to a character string size: size of the hash table Return value: integer hash value of the string */ { int hashval ; for (hashval = 0 ; *key != '\0' ; hashval += *key++) ; return (hashval%size) ; } void *lookup (const char *key, hel *hashtab[], int size) /* Function to search a hash table for the first occurence of a particular key. The hash index is calculated to get to the proper bucket, then the linked list is searched sequentially. The insertion strategy insures that the most recently installed entry for the key is the one found. Since one might use this routine to see if something is in the table, it doesn't complain if the entry isn't found. Parameter: key: character string to be looked up hashtab: hash table to be searched size: number of buckets in the hash table Returns: entry associated with the key, or NULL if nothing is found */ { hel *hshel ; const char *rtnnme = "lookup" ; if (key == NULL) { fprintf(stderr,"\n%s: null key!\n", rtnnme) ; return (NULL) ; } if (hashtab == NULL) { fprintf(stderr,"\n%s: null hashtab!\n", rtnnme) ; return (NULL) ; } if (size <= 0) { fprintf(stderr,"\n%s: hashtab size violates 0 < %d!\n", rtnnme, size) ; return (NULL) ; } for (hshel = hashtab[hash(key,size)] ; hshel != NULL ; hshel = hshel->next) if (strcmp(key,hshel->key) == 0) return (hshel->ent) ; return (NULL) ; } void *search (const char *key, hel *hashtab[], int size, bool init) /* Function to search a hash table for all occurences of a particular key. If init == TRUE, then the hash index is calculated to get to the proper bucket, then the linked list is searched sequentially for the first occurence of the key. This position is remembered, and subsequent calls with init set to FALSE will continue searching the chain from the point where the last call left off. Parameter: key: character string to be looked up hashtab: hash table to be searched size: number of buckets in the hash table init: controls search method, as above. Returns: entry associated with the key, or NULL if nothing is found (this will occur if the key is not present, or when there are no more entries on the hash chain with the requested key). */ { static hel *hshel ; static bool search_hshel_is_valid = FALSE ; const char *rtnnme = "search" ; if (key == NULL) { fprintf(stderr,"\n%s: null key!\n", rtnnme) ; search_hshel_is_valid = FALSE ; return (NULL) ; } if (hashtab == NULL) { fprintf(stderr,"\n%s: null hashtab!\n", rtnnme) ; search_hshel_is_valid = FALSE ; return (NULL) ; } if (size <= 0) { fprintf(stderr,"\n%s: hashtab size violates 0 < %d!\n", rtnnme, size) ; search_hshel_is_valid = FALSE ; return (NULL) ; } if (init == TRUE) { hshel = hashtab[hash(key,size)] ; search_hshel_is_valid = TRUE ; } else { if (search_hshel_is_valid != TRUE) { fprintf(stderr,"\n%s: attempt to continue before an init!\n",rtnnme) ; return (NULL) ; } if (hshel != NULL) hshel = hshel->next ; } for ( ; hshel != NULL ; hshel = hshel->next) if (strcmp(key,hshel->key) == 0) return (hshel->ent) ; search_hshel_is_valid = FALSE ; return (NULL) ; } void *enter (const char *key, hel *hashtab[], int size, void *entry) /* Function to add an entry to a hash table. The addition takes place at the head of the list (of the particular hash value). This is to facilitate the primary use of the hash tables, which is to return a pointer to the active symbol table entry for a name. Parameter: key: character string to be used as a hash key hashtab: hash table where entry is to be made size: number of buckets in the hash table entry: the entry to be associated with the key Returns: entry, or NULL if entry is not successfully entered in the table. */ { hel *new ; int hashval ; const char *rtnnme = "enter" ; if (key == NULL) { fprintf(stderr,"\n%s: null key!\n", rtnnme) ; return (NULL) ; } if (hashtab == NULL) { fprintf(stderr,"\n%s: null hashtab!\n", rtnnme) ; return (NULL) ; } if (size <= 0) { fprintf(stderr,"\n%s: hashtab size violates 0 < %d!\n", rtnnme, size) ; return (NULL) ; } new = (hel *) MALLOC(sizeof(hel)) ; hashval = hash(key, size) ; new->next = hashtab[hashval] ; new->key = key ; new->ent = entry ; hashtab[hashval] = new ; return (entry) ; } void *erase (const char *key, hel *hashtab[], int size) /* Function used to delete a particular entry from a hash table. It erases the first hash element with a matching key. It is the caller's responsibility to deal with the entry pointed to by the hash element. It is considered an error to try and erase a non-existent entry, and the routine will complain. Parameter: key: hash key hashtab: hash table from which entry is to be deleted size: number of buckets in the hash table Returns: Value of the entry field corresponding to the erased key, or NULL if the key could not be found. */ { int hashval ; hel *hshel1, **hshel2 ; void *entry ; const char *rtnnme = "erase" ; if (key == NULL) { fprintf(stderr,"\n%s: null key!\n", rtnnme) ; return (NULL) ; } if (hashtab == NULL) { fprintf(stderr,"\n%s: null hashtab!\n", rtnnme) ; return (NULL) ; } if (size <= 0) { fprintf(stderr,"\n%s: hashtab size violates 0 < %d!\n", rtnnme, size) ; return (NULL) ; } hashval = hash(key,size) ; for (hshel2 = &hashtab[hashval], hshel1 = *hshel2 ; hshel1 != NULL ; hshel2 = &hshel1->next, hshel1 = *hshel2) if (strcmp(key,hshel1->key) == 0) { *hshel2 = hshel1->next ; entry = hshel1->ent ; FREE(hshel1) ; return (entry) ; } fprintf(stderr,"\n%s: can't locate key %s.\n",rtnnme,key) ; return (NULL) ; } DyLP-1.6.0/DyLP/src/DylpStdLib/dylib_io.h0000644000076700007670000000563011021160525014635 0ustar #ifndef _DYLIB_IO_H #define _DYLIB_IO_H /* This file is part of the support library for the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* @(#)io.h 2.4 03/18/04 svn/cvs: $Id: dylib_io.h 238 2008-06-03 06:14:45Z lou $ */ #include "dylib_std.h" #ifdef _DYLIB_FORTRAN #include "dylib_fortran.h" #endif /* Common definitions for the i/o library packages. */ /* The file i/o routines in io.c use an integer i/o id to specify a stream. The only reason to have this typedef is clarity in the code (and the off chance that it might someday become a more complex type). i/o id's are positive integers, between 1 and FOPEN_MAX-2 (see io.c for details). */ typedef int ioid ; #define IOID_NOSTRM ((ioid) 0) #define IOID_INV ((ioid) -1) /* The lexeme structure, used for strings. Field Description ----- ----------- class The class of the lexeme. string The value of the lexeme. The values for class are drawn from the following set, defined below as the enum lexclass. Value Description ----- ----------- DY_LCNIL Null lexeme. DY_LCNUM A number. DY_LCID An identifier. DY_LCDEL A delimiter. DY_LCFS A fixed-length string. DY_LCQS A quoted string. DY_LCEOF Indicates end-of-file while trying to assemble a lexeme. DY_LCERR Indicates I/O error while trying to assemble a lexeme. */ typedef enum {DY_LCNIL,DY_LCNUM,DY_LCID,DY_LCDEL,DY_LCFS,DY_LCQS, DY_LCEOF,DY_LCERR} lexclass ; #ifdef __cplusplus typedef struct { lexclass clazz ; char *string ; } lex_struct ; #else typedef struct { lexclass class ; char *string ; } lex_struct ; #endif extern bool dyio_ioinit(void) ; extern void dyio_ioterm(void) ; extern ioid dyio_openfile(const char *path, const char *mode) ; extern bool dyio_isactive(ioid id) ; extern bool dyio_closefile(ioid id) ; extern bool dyio_setmode(ioid id, char mode), dyio_ttyq(ioid id) ; extern bool dyio_chgerrlog(const char *path, bool echo) ; extern const char *dyio_idtopath(ioid id) ; extern ioid dyio_pathtoid(const char *path, const char *mode) ; extern long dyio_mark(ioid id) ; extern bool dyio_backup(ioid id, long there) ; extern bool dyio_scan(ioid id, const char pattern[], bool rwnd, bool wrap) ; extern lex_struct *dyio_scanlex(ioid id), *dyio_scanstr(ioid id, lexclass stype, int fslen, char qschr, char qechr) ; extern void dyio_flushio(ioid id, bool echo), dyio_outfmt(ioid id, bool echo, const char *pattern, ... ), dyio_outchr(ioid id, bool echo, char chr) ; extern int dyio_outfxd(char *buffer, int fldsze, char lcr, const char *pattern, ... ) ; #ifdef _DYLIB_FORTRAN extern void dyio_outfmt_(integer *ftnid, logical *ftnecho, char *pattern, ... ) ; #endif #endif /* _DYLIB_IO_H */ DyLP-1.6.0/DyLP/src/DylpStdLib/dylib_fortran.h0000644000076700007670000000630610632415522015711 0ustar #ifndef _DYLIB_FORTRAN_H #define _DYLIB_FORTRAN_H /* This file is part of the support library for the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* @(#)fortran.h 1.1 09/01/99 svn/cvs: $Id: dylib_fortran.h 148 2007-06-09 03:15:30Z lou $ */ /* Common typedefs, definitions, macros, etc., which are handy when constructing C code that must talk to Fortran code. Off the top, typedefs and defines for the basic equivalences between Fortran and C data types. This list isn't complete, but it covers the common ones. (Taken from the Sun Fortran Programmer's Guide.) */ typedef short int integer_2 ; typedef long int integer ; typedef long int logical ; typedef float real ; typedef double double_precision ; #define TRUEL 1L #define FALSEL 0L /* A note about string handling in mixed code. C goes by the convention that strings are terminated by a '\0' character, and padded with '\0' on the rare occasions when padding is necessary. Fortran, on the other hand, keeps an explicit (though hidden) length, and pads with ' '. The two forms are just not compatible. Take care when passing strings back and forth. Adding an explicit null in the Fortran definition of the string is your best bet. The output routines in io.c and errs.c expect this, and do not make use of the 'hidden' parameter giving the string length. */ /* Some macros to help with Fortran arrays. 2-D arrays should simply be declared as array[rows*cols], and let the macro take care of the rest. This avoids complications due to column-major order in Fortran vs. row-major order in C. NOTE that these macros assume you are using the Fortran indexing convention, which starts at 1. */ #define f_chr(zz_ptr,zz_ndx,zz_strsze) (*(zz_ptr+((zz_ndx)-1)*(zz_strsze))) #define f_arr1(zz_ptr,zz_ndx) (*(zz_ptr+(zz_ndx)-1)) #define f_arr2(zz_ptr,zz_row,zz_col,zz_collen) \ (*(zz_ptr+((zz_col)-1)*(zz_collen)+((zz_row)-1))) /* These codes are used by the Fortran part of the code to identify arguments supplied to errmsg_, warn_, and outfmt_. The Fortran code sees them from the common block argcod_, which is initialised in errs.c:errinit (from the io library. Do not rearrange the structure declaration without making corresponding changes in the Fortran common block. The codes ftnargVARNAME and ftnargCONNAME are peculiar to the bonsai MILP program (which prompted the development of the Fortran interface for i/o and error messages) and likely of little use in other contexts. At best, modifications to the routines in errs.c and io.c are required to support them. */ #define ftnargINTEGER ((integer) 1) #define ftnargDOUBLE_PRECISION ((integer) 2) #define ftnargCHARACTER ((integer) 3) #define ftnargVARNAME ((integer) 4) #define ftnargCONNAME ((integer) 5) #define ftnargEND ((integer) 6) extern struct { integer integer_code ; integer double_precision_code ; integer character_code ; integer varname_code ; integer conname_code ; integer end_code ; } argcod_ ; #endif /* _DYLIB_FORTRAN_H */ DyLP-1.6.0/DyLP/src/DylpStdLib/dylib_hash.h0000644000076700007670000000255310632415522015161 0ustar #ifndef _DYLIB_HASH_H #define _DYLIB_HASH_H /* This file is part of the support library for the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* Hash Table Structures */ /* In order that the hashing routines can be used for a number of different tables, they do not have any knowledge of the thing being hashed. All that is maintained is the association between a key and some generic object. @(#)hash.h 1.3 06/22/04 svn/cvs: $Id: dylib_hash.h 148 2007-06-09 03:15:30Z lou $ */ /* The basic hash table entry structure field description ----- ----------- next next entry at this bucket key hash key (character string) ent structure associated with this entry */ typedef struct hel_tag { struct hel_tag *next ; const char *key ; void *ent ; } hel ; /* Hash table interface routines */ extern void *lookup(const char *key, hel *hashtab[], int size), *search(const char *key, hel *hashtab[], int size, bool init), *enter(const char *key, hel *hashtab[], int size, void *entry), *erase(const char *key, hel *hashtab[], int size) ; #endif /* _DYLIB_HASH_H */ DyLP-1.6.0/DyLP/src/DylpStdLib/dylib_bnfrdr.c0000644000076700007670000017307411021160525015506 0ustar /* This file is part of the support library for the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This module contains a set of routines which will parse input text and construct a data structure according to a bnf-like specification describing the input syntax and the data structure to be built. The routines do a top-down parse. The major deficiencies in the package at the present are that it cannot do arrays and it cannot back up over constructs that modify the user's data structure or generate labels. These seem restrictive at first glance but in practice have not been enough of a problem for me to expend the effort to fix them. */ #include "dylib_std.h" static char sccsid[] UNUSED = "@(#)bnfrdr.c 3.9 09/25/04" ; static char svnid[] UNUSED = "$Id: dylib_bnfrdr.c 238 2008-06-03 06:14:45Z lou $" ; #include "dylib_io.h" #include "dylib_errs.h" #include "dylib_strrtns.h" #include "dylib_bnfrdr.h" /* curnde is always the node created by the currently active generator reference; cndesze is its size. newnde is the node returned by the most recent successfully parsed generator reference. curtxt is the text string being formed by the currently active primitive, newtxt is the most recently formed text string. NOTE: while dolist is active, it manipulates curnde and curtxt so that they are the previous list element and the cumulative text collected by the list. This is transparent on either side of dolist and need not be taken into account when writing bnfs. */ static void *curnde,*newnde ; static int cndesze ; static char *curtxt,*newtxt ; /* bnfchn is the input channel ; it is global to the module and set by parse so that we don't have to pass it around as a parameter. */ static ioid bnfchn ; /* savedtxt is a scratchpad array for keeping around useful text strings constructed while parsing the input. */ #define SAVE_SLOTS 10 static const char *savedtxt[SAVE_SLOTS+1] ; #ifndef DYLP_NDEBUG /* Debugging aids -- compiled in and ready for use unless DYLP_NDEBUG is defined. See comments on activating debugging prints in bnfrdr.h. nestlvl is the nesting level of bnf rule; if set to -1, no tabs are used. numlvl causes the nesting level to be printed at the left margin. tablvl causes indentation proportional to the nesting level. warnzlbl causes a warning to be issued if a socket/label evaluates to 0. printtab is over in bnfrdrio.c; it does indentation of the debug trace. */ extern void printtab(ioid dbgchn, bool dbgecho, int nestlvl, bool numlvl, bool tablvl) ; static int debug = 0 ; static ioid dbgchn = IOID_NOSTRM ; static bool dbgecho = TRUE ; static int nestlvl ; static bool warnzlbl = TRUE, numlvl = TRUE, tablvl = TRUE ; #endif /* DYLP_NDEBUG */ /* The reader maintains lists of sockets and labels, one list for defined and one list for undefined of each type. Entries are made on the defined lists by all socket and label definitions. Entries are made on the undefined lists by any socket or label reference where one of the socket or label is undefined. For entries on the defined lists, the fields are interpreted as follows: Field Description ----- ----------- lblnxt Next entry in this list. lblnmtxt The name of the socket/label. lblval The value of the socket/label. lbladv TRUE if this socket/label has been advanced (redefined), FALSE otherwise. For entries on the undefined lists, the fields are interpreted as follows: Field Description ----- ----------- lblnxt Next entry in this list. lblnmtxt The name of the socket/label. lblval The value of the defined label/socket from the reference. */ typedef struct deflbl_struct_tag { struct deflbl_struct_tag *lblnxt ; const char *lblnmtxt ; void *lblval ; bool lbladv ; } deflbl_struct ; typedef struct udeflbl_struct_tag { struct udeflbl_struct_tag *lblnxt ; const char *lblnmtxt ; void *lblval ; } udeflbl_struct ; /* The list heads. */ static deflbl_struct *blbllst,*flbllst ; static udeflbl_struct *ublbllst,*uflbllst ; /* Routines to access the saved text array. The major reason these are routines is to keep the error checking and string management in one place. They're just big enough that I don't want to insert the code inline each time. */ static void strenter (int ndx, const char *txt) /* This routine is used to insert text into the saved text array. Parameters: ndx: index in the saved text array txt: string to be saved Returns: undefined */ { const char *rtnnme = "strenter" ; /* Check out the parameters. */ if (ndx < 0 || ndx > SAVE_SLOTS) { errmsg(40,rtnnme,ndx,SAVE_SLOTS) ; return ; } if (txt == NULL) { errmsg(2,rtnnme,"txt") ; return ; } /* Clean out the slot, if necessary, and store the new pointer. */ if (savedtxt[ndx] != NULL) STRFREE(savedtxt[ndx]) ; savedtxt[ndx] = STRALLOC(txt) ; return ; } static const char *strretrv (int ndx) /* This routine is used to retrieve text from the stored text array. Parameter: ndx: index in the saved text array. Returns: The character string stored in savedtxt[ndx], or NULL if there is a problem. */ { const char *rtnnme = "strretrv" ; /* Check out the parameter. */ if (ndx < 0 || ndx > SAVE_SLOTS) { errmsg(40,rtnnme,ndx,SAVE_SLOTS) ; return (NULL) ; } /* Fetch back the text. */ if (savedtxt[ndx] == NULL) errmsg(51,rtnnme,ndx) ; return (savedtxt[ndx]) ; } /* A few useful macros. offset_in_range takes an offset and a size and checks whether the offset specified is in range for storing an object of the given size in curnde. make_label generates a pointer, and make_socket makes a socket (pointer to pointer) for storing things. */ #define offset_in_range(qq_off,qq_sze) \ (((qq_off) >= 0 && (qq_off) <= cndesze - (qq_sze))?TRUE:FALSE) #define max_offset(qq_sze) \ (cndesze - (qq_sze)) #define make_label(qq_base,qq_offset) \ ((void *) ((ptrdiff_t) (qq_base) + (qq_offset))) #define make_socket(qq_base,qq_offset) \ ((void **) ((ptrdiff_t) (qq_base) + (qq_offset))) static deflbl_struct *finddlbl (deflbl_struct **lst, const char *txt) /* This routine searches for the label whose name is txt in the defined label list headed by lst. It does a simple linear search. It assumes that txt has not necessarily been entered in the literal tree, hence an actual string comparison is performed (case-independent). Parameters: lst: head of the label list txt: name of the label Returns: The entry for the label, or NULL if none is found. */ { deflbl_struct *lblent ; const char *rtnnme = "finddlbl" ; /* Check out the parameters. */ if (lst == NULL) { errmsg(2,rtnnme,"label list") ; return (NULL) ; } if (txt == NULL) { errmsg(2,rtnnme,"label name") ; return (NULL) ; } /* Search the list for the named entry. */ for (lblent = *lst ; lblent != NULL ; lblent = lblent->lblnxt) if (cistrcmp(lblent->lblnmtxt,txt) == 0) return (lblent) ; return (NULL) ; } static void lblresolve (udeflbl_struct **lst, deflbl_struct *dlbl) /* This routine searches an undefined label list for entries which can be resolved by the (presumably newly) defined label dlbl. The routine assumes that the text strings it considers will have been entered in the literal tree and thus compares pointers to test for equality. Parameters: lst: one of the undefined label lists. dlbl: a defined label Returns: undefined */ { udeflbl_struct **ulbl2,*ulbl1 ; const char *nmtxt ; void **socket ; const char *rtnnme = "lblresolve" ; /* Check out the parameters. */ if (lst == NULL) { errmsg(2,rtnnme,"label list") ; return ; } if (dlbl == NULL) { errmsg(2,rtnnme,"defined label") ; return ; } /* Search through the list, resolving any references we find. */ nmtxt = dlbl->lblnmtxt ; for (ulbl2 = lst, ulbl1 = *ulbl2 ; ulbl1 != NULL ; ulbl2 = &ulbl1->lblnxt, ulbl1 = *ulbl2) if (ulbl1->lblnmtxt == nmtxt) { *ulbl2 = ulbl1->lblnxt ; if (lst == &uflbllst) { socket = make_socket(dlbl->lblval,0) ; *socket = ulbl1->lblval ; } else { socket = make_socket(ulbl1->lblval,0) ; *socket = dlbl->lblval ; FREE((char *) ulbl1) ; } } return ; } void rdrinit (void) /* This routine initializes the bnf reader. Parameters: zerolbl: set to TRUE if the reader should issue a warning when a label evaluates to 0 Returns: undefined */ { int ndx ; curnde = NULL ; cndesze = 0 ; newnde = NULL ; curtxt = NULL ; newtxt = NULL ; for (ndx = 0 ; ndx < SAVE_SLOTS ; ndx++) savedtxt[ndx] = NULL ; flbllst = NULL ; blbllst = NULL ; uflbllst = NULL ; ublbllst = NULL ; return ; } void rdrclear (void) /* This routine clears the bnf reader by releasing the label lists and savedtxt array, and newtxt. It also makes two consistency checks: At the end of the parse, it should be true that curnde and curtxt are null. Parameters: none. Returns: undefined. */ { int ndx ; deflbl_struct *dlbl,*nxtdlbl ; udeflbl_struct *udlbl,*nxtudlbl ; const char *rtnnme = "rdrclear" ; for (dlbl = blbllst ; dlbl != NULL ; dlbl = nxtdlbl) { nxtdlbl = dlbl->lblnxt ; STRFREE(dlbl->lblnmtxt) ; FREE((char *) dlbl) ; } blbllst = NULL ; for (dlbl = flbllst ; dlbl != NULL ; dlbl = nxtdlbl) { nxtdlbl = dlbl->lblnxt ; STRFREE(dlbl->lblnmtxt) ; FREE((char *) dlbl) ; } flbllst = NULL ; for (udlbl = ublbllst ; udlbl != NULL ; udlbl = nxtudlbl) { nxtudlbl = udlbl->lblnxt ; STRFREE(udlbl->lblnmtxt) ; FREE((char *) udlbl) ; } ublbllst = NULL ; for (udlbl = uflbllst ; udlbl != NULL ; udlbl = nxtudlbl) { nxtudlbl = udlbl->lblnxt ; STRFREE(udlbl->lblnmtxt) ; FREE((char *) udlbl) ; } uflbllst = NULL ; for (ndx = 0 ; ndx < SAVE_SLOTS ; ndx++) { if (savedtxt[ndx] != NULL) STRFREE(savedtxt[ndx]) ; savedtxt[ndx] = NULL ; } if (newtxt != NULL) { FREE(newtxt) ; newtxt = NULL ; } if (curnde != NULL) warn(71,rtnnme,"curnde") ; if (curtxt != NULL) warn(71,rtnnme,"curtxt") ; return ; } /* The heart of the package, the routines which actually deal with the bnf constructs and build the user's data strucure. There is one routine to handle each type of bnf construct, plus a routine which handles lists. */ static bool dogenerator(bnfGref_struct *ref), dononprimitive(bnfNPref_struct *ref), doprimitive(bnfNPref_struct *ref), doterminal(bnfTref_struct *ref), doimmediate(bnfIref_struct *ref), doliteral(bnfLref_struct *ref), dolabel(bnfLBref_struct *ref), doreference(bnfLBref_struct *ref), dolist(bnfref_any ref) ; static bool dogenerator (bnfGref_struct *ref) /* This routine handles constructs of type generator. It checks to make sure that the reference and the definition are well-formed, then constructs the node as specified in the definition. It then enters a loop to parse the components of the body of the definition. Failure of the parse results in an error return. Parameter: ref: reference to a generator definition Result: TRUE if the parse succeeds, FALSE if it fails. */ { void *savcnde,**socket ; int savcndesze,compnum,compndx ; bnfGdef_struct *def ; bnfref_struct **comprefs ; bnfref_any compref ; bool success ; const char *rtnnme = "dogenerator" ; /* First test the reference to make sure that it references a generator. */ if (ref == NULL) { errmsg(2,rtnnme,"bnf ref") ; return (FALSE) ; } def = (bnfGdef_struct *) ref->defn ; if (def == NULL) { errmsg(33,rtnnme) ; return (FALSE) ; } if (def->type != bnfG) { errmsg(36,rtnnme) ; return (FALSE) ; } # ifndef DYLP_NDEBUG if (flgon(ref->uflgs,bnfdebug)) if (debug++ == 0) { dyio_outfmt(dbgchn,dbgecho,"\n\n>>>>>> trace begins >>>>>>\n") ; nestlvl = 0 ; } if (debug > 0) { nestlvl++ ; printtab(dbgchn,dbgecho,nestlvl,numlvl,tablvl) ; prtbnfref(dbgchn,dbgecho,(bnfref_struct *) ref) ; dyio_outfmt(dbgchn,dbgecho," ::=\n") ; } # endif /* Now look at the storage spec. If we're not in a list, we check that any storage request is within curnde. It's an error if curnde is null. If the spec passes, we form the socket address. If we're in a list, then we assume that dolist is handling the linking and no storage is done here. */ if (flgon(ref->uflgs,bnfstore) == TRUE && flgoff(ref->uflgs,bnflst) == TRUE) { if (curnde == NULL) { errmsg(68,rtnnme) ; return (FALSE) ; } if (offset_in_range(ref->offset,sizeof(void *)) == FALSE) { errmsg(30,rtnnme,ref->offset,max_offset(sizeof(void *))) ; return (FALSE) ; } socket = make_socket(curnde,ref->offset) ; } else socket = NULL ; /* Now check that the definition has a valid size. If it passes, stack the old curnde and make the new one. Clearing the new node is not just being nice - it allows us to sidestep the issue of just what sort of NIL thing we're dealing with down in doterminal. */ if (def->size <= 0) { errmsg(31,rtnnme,def->size) ; return (FALSE) ; } savcnde = curnde ; savcndesze = cndesze ; cndesze = def->size ; curnde = (void *) MALLOC(cndesze) ; memset((void *) curnde,0,cndesze) ; /* Set up for the parse loop by getting the component array and extracting the number of components. */ comprefs = def->comps ; if (comprefs != NULL) { compnum = addrToInt(*comprefs++) ; compref.com = *comprefs++ ; } else compnum = 0 ; /* The main loop to handle the components. */ for (compndx = 0, success = TRUE ; compndx < compnum && success == TRUE ; compndx++, compref.com = *comprefs++) { if (compref.com == NULL) { errmsg(32,rtnnme,compndx+1,compnum) ; success = FALSE ; break ; } switch (compref.com->type) { case bnfG: { if (flgon(compref.G->uflgs,bnflst) == TRUE) success = dolist(compref) ; else success = dogenerator(compref.G) ; break ; } case bnfNP: { if (flgon(compref.NP->uflgs,bnflst) == TRUE) success = dolist(compref) ; else success = dononprimitive(compref.NP) ; break ; } case bnfP: { if (flgon(compref.P->uflgs,bnflst) == TRUE) success = dolist(compref) ; else success = doprimitive(compref.P) ; break ; } case bnfT: { success = doterminal(compref.T) ; break ; } case bnfI: { success = doimmediate(compref.I) ; break ; } case bnfL: { errmsg(34,rtnnme,"literal","generator") ; success = FALSE ; break ; } case bnfDS: case bnfDL: { success = dolabel(compref.LB) ; break ; } case bnfRS: case bnfRL: { success = doreference(compref.LB) ; break ; } default: { errmsg(35,rtnnme,compref.com->type) ; success = FALSE ; break ; } } } # ifndef DYLP_NDEBUG if (debug > 0) { if (success == FALSE) { printtab(dbgchn,dbgecho,nestlvl,numlvl,tablvl) ; dyio_outfmt(dbgchn,dbgecho,"-- fail @ %d of %d --",compndx,compnum) ; } dyio_outchr(dbgchn,dbgecho,'\n') ; nestlvl-- ; if (flgon(ref->uflgs,bnfdebug)) if (--debug == 0) dyio_outfmt(dbgchn,dbgecho,"<<<<<< trace ends <<<<<<\n\n") ; } # endif /* If we've successfully parsed the components of the generator definition, update newnde and store a pointer to the new node if requested. */ if (success == TRUE) { if (socket != NULL) *socket = curnde ; newnde = curnde ; } /* Restore the old curnde and then return. */ curnde = savcnde ; cndesze = savcndesze ; return (success) ; } static bool dononprimitive (bnfNPref_struct *ref) /* This routine handles constructs of type non-primitive. It first checks to make sure that the reference is well-formed. Next, it creates a copy of curnde and marks the current position in the input stream for error recovery purposes. The actual parsing is handled by two nested loops. The outer loop sequences through the alternative parses, while the inner loop parses the components of each alternative. Parameter: ref: reference to a non-primitive definition Returns: TRUE if the non-primitive is successfully parsed, FALSE otherwise. */ { void *savcnde = NULL ; bnfNPdef_struct *def ; bnfref_struct ***altrefs,**comprefs ; bnfref_any compref ; int altnum,altndx,compnum,compndx ; long marker ; bool success ; const char *rtnnme = "dononprimitive" ; /* First test the reference to make sure that it references a non-primitive. */ if (ref == NULL) { errmsg(2,rtnnme,"bnf ref") ; return (FALSE) ; } def = (bnfNPdef_struct *) ref->defn ; if (def == NULL) { errmsg(33,rtnnme) ; return (FALSE) ; } if (def->type != bnfNP) { errmsg(38,rtnnme) ; return (FALSE) ; } # ifndef DYLP_NDEBUG if (flgon(ref->uflgs,bnfdebug)) if (debug++ == 0) { dyio_outfmt(dbgchn,dbgecho,"\n\n>>>>>> trace begins >>>>>>\n") ; nestlvl = 0 ; } if (debug > 0) { nestlvl++ ; printtab(dbgchn,dbgecho,nestlvl,numlvl,tablvl) ; prtbnfref(dbgchn,dbgecho,(bnfref_struct *) ref) ; dyio_outfmt(dbgchn,dbgecho," ::=\n") ; } # endif /* Prepare for failure of an alternative parse. Mark the input and create a copy of curnde, so we can recover if a parse fails. */ marker = dyio_mark(bnfchn) ; if (curnde != NULL) { if (cndesze <= 0) { errmsg(1,rtnnme,__LINE__) ; return (FALSE) ; } savcnde = (void *) MALLOC(cndesze) ; memcpy((void *) savcnde,(void *) curnde,cndesze) ; } /* Set up for the loop to do alternative parses by getting the alternative array and extracting the number of alternatives. */ altrefs = def->alts ; if (altrefs != NULL) { altnum = addrToInt(*altrefs++) ; comprefs = *altrefs++ ; } else { altnum = 0 ; comprefs = NULL ; } /* The outer loop to handle the alternatives. */ for (altndx = 0 ; altndx < altnum ; altndx++, comprefs = *altrefs++) /* Set up for the parse loop by getting the component array and extracting the number of components. It's an error if an alternative has no components. */ { # ifndef DYLP_NDEBUG if (debug > 0) { printtab(dbgchn,dbgecho,nestlvl,numlvl,tablvl) ; dyio_outfmt(dbgchn,dbgecho, "[ alternative %d of %d ]\n",altndx+1,altnum) ; } # endif if (comprefs == NULL) { errmsg(37,rtnnme,altndx+1,altnum) ; break ; } else { compnum = addrToInt(*comprefs++) ; compref.com = *comprefs++ ; } /* The inner loop to handle the components of an alternative. */ for (compndx = 0, success = TRUE ; compndx < compnum && success == TRUE ; compndx++, compref.com = *comprefs++) { if (compref.com == NULL) { errmsg(32,rtnnme,compndx+1,compnum) ; success = FALSE ; break ; } switch (compref.com->type) { case bnfG: { if (flgon(compref.G->uflgs,bnflst) == TRUE) success = dolist(compref) ; else success = dogenerator(compref.G) ; break ; } case bnfNP: { if (flgon(compref.NP->uflgs,bnflst) == TRUE) success = dolist(compref) ; else success = dononprimitive(compref.NP) ; break ; } case bnfP: { if (flgon(compref.P->uflgs,bnflst) == TRUE) success = dolist(compref) ; else success = doprimitive(compref.P) ; break ; } case bnfT: { success = doterminal(compref.T) ; break ; } case bnfI: { success = doimmediate(compref.I) ; break ; } case bnfL: { errmsg(34,rtnnme,"literal","non-primitive") ; success = FALSE ; break ; } case bnfDS: case bnfDL: { success = dolabel(compref.LB) ; break ; } case bnfRS: case bnfRL: { success = doreference(compref.LB) ; break ; } default: { errmsg(35,rtnnme,compref.com->type) ; success = FALSE ; break ; } } } # ifndef DYLP_NDEBUG if (debug > 0) { printtab(dbgchn,dbgecho,nestlvl,numlvl,tablvl) ; if (success == TRUE) { dyio_outfmt(dbgchn,dbgecho,"[ pass %d ]",altndx+1) ; nestlvl-- ; if (flgon(ref->uflgs,bnfdebug)) if (--debug == 0) dyio_outfmt(dbgchn,dbgecho,"<<<<<< trace ends <<<<<<\n\n") ; } else dyio_outfmt(dbgchn,dbgecho, "[ fail %d @ %d of %d ]",altndx+1,compndx,compnum) ; dyio_outchr(dbgchn,dbgecho,'\n') ; } # endif /* End loop to process the components of an alternative. If we've successfully parsed the alternative, clean up and return. Otherwise, back up the input and restore curnde. */ if (success == TRUE) { if (curnde != NULL) FREE((char *) savcnde) ; return (TRUE) ; } else { if (curnde != NULL) memcpy((void *) curnde,(void *) savcnde,cndesze) ; dyio_backup(bnfchn,marker) ; } } /* To get here, all the alternative parses have failed. Clean up and return failure. */ if (curnde != NULL) { memcpy((void *) curnde,(void *) savcnde,cndesze) ; FREE(savcnde) ; } # ifndef DYLP_NDEBUG if (debug > 0) { nestlvl-- ; if (flgon(ref->uflgs,bnfdebug)) if (--debug == 0) dyio_outfmt(dbgchn,dbgecho,"<<<<<< trace ends <<<<<<\n\n") ; } # endif return (FALSE) ; } static bool doprimitive (bnfNPref_struct *ref) /* This routine handles constructs of type primitive. It first checks to make sure that the reference is well-formed. Next, it creates a copy of curnde and marks the current position in the input stream for error recovery purposes. The actual parsing is handled by two nested loops. The outer loop sequences through the alternative parses, while the inner loop parses the components of each alternative. As each alternative is parsed, a text string is constructed which is the concatenation of the text strings returned by all terminals, literals, and primitives parsed for that alternative. If the parse is successful, a pointer to the string may be stored as indicated in the reference. Parameter: ref: reference to a primitive definition Returns: TRUE if the primitive is successfully parsed, FALSE otherwise. */ { void *savcnde = NULL ; void **socket ; char *savctxt,*lcltxt ; bnfPdef_struct *def ; bnfref_struct ***altrefs,**comprefs ; bnfref_any compref ; int altnum,altndx,compnum,compndx ; long marker ; bool success ; const char *rtnnme = "doprimitive" ; /* First test the reference to make sure that it references a primitive. */ if (ref == NULL) { errmsg(2,rtnnme,"bnf ref") ; return (FALSE) ; } def = (bnfPdef_struct *) ref->defn ; if (def == NULL) { errmsg(33,rtnnme) ; return (FALSE) ; } if (def->type != bnfP) { errmsg(39,rtnnme) ; return (FALSE) ; } # ifndef DYLP_NDEBUG if (flgon(ref->uflgs,bnfdebug)) if (debug++ == 0) { dyio_outfmt(dbgchn,dbgecho,"\n\n>>>>>> trace begins >>>>>>\n") ; nestlvl = 0 ; } if (debug > 0) { nestlvl++ ; printtab(dbgchn,dbgecho,nestlvl,numlvl,tablvl) ; prtbnfref(dbgchn,dbgecho,(bnfref_struct *) ref) ; dyio_outfmt(dbgchn,dbgecho," ::=\n") ; } # endif /* Prepare for failure of an alternative parse. Mark the input and create a copy of curnde, so we can recover if a parse fails. Prepare for character string collection by stacking curtxt and creating a null string. curtxt is left NULL here and only made non-null while we're dealing with a terminal, literal, or primitive in the parse loop. */ marker = dyio_mark(bnfchn) ; if (curnde != NULL) { if (cndesze <= 0) { errmsg(1,rtnnme,__LINE__) ; return (FALSE) ; } savcnde = (void *) MALLOC(cndesze) ; memcpy((void *) savcnde,(void *) curnde,cndesze) ; } savctxt = curtxt ; curtxt = NULL ; lcltxt = (char *) MALLOC(sizeof(char)) ; *lcltxt = '\0' ; /* Set up for the loop to do alternative parses by getting the alternative array and extracting the number of alternatives. */ altrefs = def->alts ; if (altrefs != NULL) { altnum = addrToInt(*altrefs++) ; comprefs = *altrefs++ ; } else { altnum = 0 ; comprefs = NULL ; } /* The outer loop to handle the alternatives. */ for (altndx = 0 ; altndx < altnum ; altndx++, comprefs = *altrefs++) /* Set up for the parse loop by getting the component array and extracting the number of components. It's an error if an alternative has no components. */ { # ifndef DYLP_NDEBUG if (debug > 0) { printtab(dbgchn,dbgecho,nestlvl,numlvl,tablvl) ; dyio_outfmt(dbgchn,dbgecho, "[ alternative %d of %d ]\n",altndx+1,altnum) ; } # endif if (comprefs == NULL) { errmsg(37,rtnnme,altndx+1,altnum) ; break ; } else { compnum = addrToInt(*comprefs++) ; compref.com = *comprefs++ ; } /* The inner loop to handle the components of an alternative. */ for (compndx = 0, success = TRUE ; compndx < compnum && success == TRUE ; compndx++, compref.com = *comprefs++) { if (compref.com == NULL) { errmsg(32,rtnnme,compndx+1,compnum) ; success = FALSE ; break ; } switch (compref.com->type) { case bnfG: { if (flgon(compref.G->uflgs,bnflst) == TRUE) success = dolist(compref) ; else success = dogenerator(compref.G) ; break ; } case bnfNP: { if (flgon(compref.NP->uflgs,bnflst) == TRUE) success = dolist(compref) ; else success = dononprimitive(compref.NP) ; break ; } case bnfP: { curtxt = lcltxt ; if (flgon(compref.P->uflgs,bnflst) == TRUE) success = dolist(compref) ; else success = doprimitive(compref.P) ; lcltxt = curtxt ; curtxt = NULL ; break ; } case bnfT: { curtxt = lcltxt ; success = doterminal(compref.T) ; lcltxt = curtxt ; curtxt = NULL ; break ; } case bnfI: { success = doimmediate(compref.I) ; break ; } case bnfL: { curtxt = lcltxt ; success = doliteral(compref.L) ; lcltxt = curtxt ; curtxt = NULL ; break ; } case bnfDS: case bnfDL: { success = dolabel(compref.LB) ; break ; } case bnfRS: case bnfRL: { success = doreference(compref.LB) ; break ; } default: { errmsg(35,rtnnme,compref.com->type) ; success = FALSE ; break ; } } } # ifndef DYLP_NDEBUG if (debug > 0) { printtab(dbgchn,dbgecho,nestlvl,numlvl,tablvl) ; if (success == TRUE) { dyio_outfmt(dbgchn,dbgecho,"[ pass %d ]",altndx+1) ; nestlvl-- ; if (flgon(ref->uflgs,bnfdebug)) if (--debug == 0) dyio_outfmt(dbgchn,dbgecho,"<<<<<< trace ends <<<<<<\n\n") ; } else dyio_outfmt(dbgchn,dbgecho, "[ fail %d @ %d of %d ]",altndx+1,compndx,compnum) ; dyio_outchr(dbgchn,dbgecho,'\n') ; } # endif /* End loop to process the components of an alternative. If we've successfully parsed the alternative, there are three actions to do. First, set newtxt to the collected text and restore the old curtxt. Next, store the new text as indicated in the reference. Finally, if curtxt is non-null, concatenate newtxt to it. For an unsuccussful parse, restore curnde, throw away the collected text, back up the input, and try again. */ if (success == TRUE) { if (newtxt != NULL) FREE(newtxt) ; newtxt = lcltxt ; curtxt = savctxt ; if (flgon(ref->uflgs,bnfstore) == TRUE && flgoff(ref->uflgs,bnflst) == TRUE) { if (flgon(ref->uflgs,bnfsv) == TRUE) { strenter(ref->offset,newtxt) ; } else { if (curnde == NULL) { errmsg(68,rtnnme) ; newtxt = NULL ; break ; } socket = make_socket(curnde,ref->offset) ; if (flgon(ref->uflgs,bnfatsgn) == TRUE) { if (offset_in_range(ref->offset,sizeof(char *)) == FALSE) { errmsg(30,rtnnme,ref->offset,max_offset(sizeof(char *))) ; newtxt = NULL ; break ; } *((const char **) socket) = STRALLOC(newtxt) ; } else { if (offset_in_range(ref->offset,strlen(newtxt)+1) == FALSE) { errmsg(30,rtnnme,ref->offset,max_offset(strlen(newtxt)+1)) ; newtxt = NULL ; break ; } (void) strcpy((char *) socket,newtxt) ; } } } if (curtxt != NULL && strlen(newtxt) > 0) { savctxt = (char *) MALLOC(strlen(curtxt)+strlen(newtxt)+1) ; (void) strcpy(savctxt,curtxt) ; (void) strcat(savctxt,newtxt) ; FREE(curtxt) ; curtxt = savctxt ; } if (curnde != NULL) FREE((char *) savcnde) ; return (TRUE) ; } else { if (curnde != NULL) memcpy((void *) curnde,(void *) savcnde,cndesze) ; *lcltxt = '\0' ; dyio_backup(bnfchn,marker) ; } } /* To get here, all the alternative parses have failed or an error was detected which caused the alternatives loop to abort. Clean up and return failure. */ if (curnde != NULL) { memcpy((void *) curnde,(void *) savcnde,cndesze) ; FREE(savcnde) ; } FREE(lcltxt) ; curtxt = savctxt ; # ifndef DYLP_NDEBUG if (debug > 0) { nestlvl-- ; if (flgon(ref->uflgs,bnfdebug)) if (--debug == 0) dyio_outfmt(dbgchn,dbgecho,"<<<<<< trace ends <<<<<<\n\n") ; } # endif return (FALSE) ; } static int scanbinary (const char *string, int *intp) /* Quick and dirty routine to convert a binary number from string form to internal representation. Has the same behaviour as sscanf. Parameters: string: string to be scanned intp: pointer to location where an integer can be stored. Returns: 1 if the number is successfully converted, 0 otherwise. */ { const char *ptr ; int val ; if (string == NULL) return 0 ; val = 0 ; for (ptr = string ; *ptr != '\0' ; ptr++) { if (*ptr != '0' && *ptr != '1') return (0) ; val = (val<<1)+*ptr-'0' ; } *intp = val ; return (1) ; } bool doterminal (bnfTref_struct *ref) /* This routine handles constructs of type terminal. It checks to be sure the reference and definition are well-formed, then scans the required terminal from the input stream. The terminal scanned must be the type requested and, if an expected string is provided, the terminal must match this string. The value is then converted to internal form if necessary and stored as directed in the reference. Parameter: ref: reference to a terminal definition Returns: TRUE if the terminal is successfully parsed, FALSE otherwise. */ { bnfTdef_struct *def ; lex_struct *lex = NULL ; void **socket ; char *lcltxt ; int cnt ; bool success ; const char *rtnnme = "doterminal" ; static lex_struct lex_nil = {DY_LCNIL,NULL} ; /* From stdio.h */ extern int sscanf(const char *str, const char *format, ...) ; /* First test the reference to make sure that it references a terminal. We'll put off testing for correct storage spec 'til further down when we sort out just what will be stored. */ if (ref == NULL) { errmsg(2,rtnnme,"bnf ref") ; return (FALSE) ; } def = (bnfTdef_struct *) ref->defn ; if (def == NULL) { errmsg(33,rtnnme) ; return (FALSE) ; } if (def->type != bnfT) { errmsg(41,rtnnme) ; return (FALSE) ; } # ifndef DYLP_NDEBUG if (flgon(ref->uflgs,bnfdebug)) if (debug++ == 0) dyio_outfmt(dbgchn,dbgecho,"\n\n>>>>>> trace begins >>>>>>\n") ; if (debug > 0) { nestlvl++ ; printtab(dbgchn,dbgecho,nestlvl,numlvl,tablvl) ; prtbnfref(dbgchn,dbgecho,(bnfref_struct *) ref) ; nestlvl-- ; } # endif /* Call the appropriate scanner to scan the terminal from the input. We check here to make sure that we got the class of thing that we expected and abort if we didn't. */ success = TRUE ; switch (def->ttype) { case bnfttNIL: { lex = &lex_nil ; break ; } case bnfttN: { lex = dyio_scanlex(bnfchn) ; if (lex->class != DY_LCNUM) success = FALSE ; break ; } case bnfttID: { lex = dyio_scanlex(bnfchn) ; if (lex->class != DY_LCID) success = FALSE ; break ; } case bnfttD: { lex = dyio_scanlex(bnfchn) ; if (lex->class != DY_LCDEL) success = FALSE ; break ; } case bnfttF: { lex = dyio_scanstr(bnfchn,DY_LCFS,def->parm1,'\0','\0') ; if (lex->class != DY_LCFS) success = FALSE ; break ; } case bnfttQ: { lex = dyio_scanstr(bnfchn,DY_LCQS,0,def->qschr,def->qechr) ; if (lex->class != DY_LCQS && lex->class != DY_LCNIL) success = FALSE ; break ; } default: { errmsg(42,rtnnme,def->ttype) ; success = FALSE ; break ; } } # ifndef DYLP_NDEBUG if (debug > 0) { if (lex->string != NULL) dyio_outfmt(dbgchn,dbgecho," = \"%s\"\n",lex->string) ; else dyio_outfmt(dbgchn,dbgecho," = nil\n") ; if (flgon(ref->uflgs,bnfdebug)) if (--debug == 0) dyio_outfmt(dbgchn,dbgecho,"<<<<<< trace ends <<<<<<\n\n") ; } # endif if (success == FALSE) return (FALSE) ; if (def->val != NULL) { if (lex->class == DY_LCNIL) return (FALSE) ; if (flgon(ref->uflgs,bnfcs) == TRUE) { if (flgon(ref->uflgs,bnfmin) == TRUE) { if (mstrcmp(lex->string,def->val) != 0) return (FALSE) ; } else { if (strcmp(lex->string,def->val) != 0) return (FALSE) ; } } else { if (flgon(ref->uflgs,bnfmin) == TRUE) { if (cimstrcmp(lex->string,def->val) != 0) return (FALSE) ; } else { if (cistrcmp(lex->string,def->val) != 0) return (FALSE) ; } } } /* Deal with the terminal as instructed by the storage instructions. We can either store a pointer to the text string or convert the string to some internal representation and store it. We don't have to worry about just what sort of thing any null object represents, since the whole node is zeroed when it is created. */ if (flgon(ref->uflgs,bnfstore) == TRUE) { socket = make_socket(curnde,ref->offset) ; if (flgon(ref->uflgs,bnfatsgn) == TRUE) { if (offset_in_range(ref->offset,sizeof(char *)) == FALSE) { errmsg(30,rtnnme,ref->offset,max_offset(sizeof(char *))) ; return (FALSE) ; } if (lex->class != DY_LCNIL) { *((const char **) socket) = STRALLOC(lex->string) ; } } else switch (def->ttype) { case bnfttNIL: { break ; } case bnfttN: { if (flgon(ref->uflgs,bnfflt) == TRUE) { if (offset_in_range(ref->offset,sizeof(float)) == FALSE) { errmsg(30,rtnnme,ref->offset,max_offset(sizeof(float))) ; return (FALSE) ; } if (def->parm1 != 10) { errmsg(46,rtnnme,def->parm1,"float") ; return (FALSE) ; } cnt = sscanf(lex->string,"%f",(float *) socket) ; } else if (flgon(ref->uflgs,bnfdbl) == TRUE) { if (offset_in_range(ref->offset,sizeof(double)) == FALSE) { errmsg(30,rtnnme,ref->offset,max_offset(sizeof(double))) ; return (FALSE) ; } if (def->parm1 != 10) { errmsg(46,rtnnme,def->parm1,"double") ; return (FALSE) ; } cnt = sscanf(lex->string,"%lf",(double *) socket) ; } else { if (offset_in_range(ref->offset,sizeof(int)) == FALSE) { errmsg(30,rtnnme,ref->offset,max_offset(sizeof(int))) ; return (FALSE) ; } switch (def->parm1) { case 10: { cnt = sscanf(lex->string,"%d",(int *) socket) ; break ; } case 8: { if (*lex->string == '#') cnt = sscanf(lex->string+1,"%o",(unsigned int *) socket) ; else cnt = sscanf(lex->string,"%o",(unsigned int *) socket) ; break ; } case 2: { cnt = scanbinary(lex->string,(int *) socket) ; break ; } default: { errmsg(46,rtnnme,def->parm1,"int") ; return (FALSE) ; } } } if (cnt != 1) { errmsg(45,rtnnme,lex->string) ; return (FALSE) ; } break ; } case bnfttID: { if (offset_in_range(ref->offset,strlen(lex->string)+1) == FALSE) { errmsg(30,rtnnme,ref->offset,max_offset(strlen(lex->string)+1)) ; return (FALSE) ; } (void) strcpy((char *) socket,lex->string) ; break ; } case bnfttD: { if (offset_in_range(ref->offset,sizeof(char)) == FALSE) { errmsg(30,rtnnme,ref->offset,max_offset(sizeof(char))) ; return (FALSE) ; } *((char *) socket) = *lex->string ; break ; } case bnfttF: { if (flgon(ref->uflgs,bnfexact) == TRUE) { if (offset_in_range(ref->offset,strlen(lex->string)) == FALSE) { errmsg(30,rtnnme,ref->offset,max_offset(strlen(lex->string))) ; return (FALSE) ; } (void) strncpy((char *) socket,lex->string,def->parm1) ; } else { if (offset_in_range(ref->offset,strlen(lex->string)+1) == FALSE) { errmsg(30,rtnnme,ref->offset,max_offset(strlen(lex->string)+1)) ; return (FALSE) ; } (void) strcpy((char *) socket,lex->string) ; } break ; } case bnfttQ: { if (offset_in_range(ref->offset,strlen(lex->string)+1) == FALSE) { errmsg(30,rtnnme,ref->offset,max_offset(strlen(lex->string)+1)) ; return (FALSE) ; } if (lex->class != DY_LCNIL) (void) strcpy((char *) socket,lex->string) ; break ; } } } /* The last thing to do is see if there is an active primitive collecting text, and if so concatenate our string onto it. */ if (curtxt != NULL && lex->class != DY_LCNIL) { lcltxt = (char *) MALLOC(strlen(curtxt)+strlen(lex->string)+1) ; (void) strcpy(lcltxt,curtxt) ; (void) strcat(lcltxt,lex->string) ; FREE(curtxt) ; curtxt = lcltxt ; } return (TRUE) ; } bool doimmediate (bnfIref_struct *ref) /* This routine handles constructs of type immediate. It checks to make sure that the reference is well-formed, then stores the value specified in the definition into the field specified in the reference. Parameter: ref: reference to an immediate definition. Returns: TRUE if the value is successfully stored, FALSE otherwise. */ { void **socket ; bnfIdef_struct *def ; const char *rtnnme = "doimmediate" ; /* First test the reference to make sure that it references an immediate and that the storage offset is in bounds. */ if (ref == NULL) { errmsg(2,rtnnme,"bnf ref") ; return (FALSE) ; } def = (bnfIdef_struct *) ref->defn ; if (def == NULL) { errmsg(33,rtnnme) ; return (FALSE) ; } if (def->type != bnfI) { errmsg(47,rtnnme) ; return (FALSE) ; } # ifndef DYLP_NDEBUG if (flgon(ref->uflgs,bnfdebug)) if (debug++ == 0) dyio_outfmt(dbgchn,dbgecho,"\n\n>>>>>> trace begins >>>>>>\n") ; if (debug > 0) { nestlvl++ ; printtab(dbgchn,dbgecho,nestlvl,numlvl,tablvl) ; prtbnfref(dbgchn,dbgecho,(bnfref_struct *) ref) ; dyio_outfmt(dbgchn,dbgecho,"\n") ; nestlvl-- ; if (flgon(ref->uflgs,bnfdebug)) if (--debug == 0) dyio_outfmt(dbgchn,dbgecho,"<<<<<< trace ends <<<<<<\n\n") ; } # endif if (offset_in_range(ref->offset,sizeof(int)) == FALSE) { errmsg(30,rtnnme,ref->offset,max_offset(sizeof(int))) ; return (FALSE) ; } /* Do the store. */ socket = make_socket(curnde,ref->offset) ; *((int *) socket) = def->ival ; return (TRUE) ; } bool doliteral (bnfLref_struct *ref) /* This routine handles constructs of type literal. It checks to make sure that the reference is well-formed, then concatenates the string requested onto curtxt. Parameter: ref: reference to a literal definition. Returns: TRUE if the string is successfully added to curtxt, FALSE otherwise. */ { bnfLdef_struct *def ; const char *txt ; char *txt2 ; const char *rtnnme = "doliteral" ; /* First test the reference to make sure that it references a literal. Also check on how the literal is to be obtained. Finally, make sure that we're in an active primitive. */ if (ref == NULL) { errmsg(2,rtnnme,"bnf ref") ; return (FALSE) ; } def = (bnfLdef_struct *) ref->defn ; if (def == NULL) { errmsg(33,rtnnme) ; return (FALSE) ; } if (def->type != bnfL) { errmsg(48,rtnnme) ; return (FALSE) ; } # ifndef DYLP_NDEBUG if (flgon(ref->uflgs,bnfdebug)) if (debug++ == 0) dyio_outfmt(dbgchn,dbgecho,"\n\n>>>>>> trace begins >>>>>>\n") ; if (debug > 0) { nestlvl++ ; printtab(dbgchn,dbgecho,nestlvl,numlvl,tablvl) ; prtbnfref(dbgchn,dbgecho,(bnfref_struct *) ref) ; nestlvl-- ; } # endif if (flgon(def->dflgs,bnfsvnm) == TRUE) txt = strretrv(addrToInt(def->txt)) ; else txt = def->txt ; # ifndef DYLP_NDEBUG if (debug > 0) { if (txt != NULL) dyio_outfmt(dbgchn,dbgecho," = \"%s\"\n",txt) ; else dyio_outfmt(dbgchn,dbgecho," = nil\n") ; if (flgon(ref->uflgs,bnfdebug)) if (--debug == 0) dyio_outfmt(dbgchn,dbgecho,"<<<<<< trace ends <<<<<<\n\n") ; } # endif if (txt == NULL) { errmsg(49,rtnnme) ; return (FALSE) ; } if (curtxt == NULL) { errmsg(50,rtnnme) ; return (FALSE) ; } /* It looks OK, so go ahead and get the text and concatenate it to curtxt. */ txt2 = (char *) MALLOC(strlen(curtxt)+strlen(txt)+1) ; (void) strcpy(txt2,curtxt) ; (void) strcat(txt2,txt) ; FREE(curtxt) ; curtxt = txt2 ; return (TRUE) ; } bool dolabel (bnfLBref_struct *ref) /* This routine handles socket and label definitions. It first checks to make sure defid is a label definition. Next the name field is processed to form the string which will be the name of the label, and the node field is processed to obtain the value of the label. The offset field from the definition is added to the value obtained from the node field to come up with the final value of the label. The routine then searches for the label in the appropriate defined label list. If it is not defined, it is added to the list. If it is defined, the routine checks to see if this definition is a redefinition (advance) of the label. If it is, the label is redefined. If the current definition is not flagged as a redefinition but the existing label is, the label is not redefined. If neither the old or new labels are flagged as advances the old label is redefined. The appropriate undefined label list is searched if the label is a new definition or the base definition of a currently existing label flagged as an advance. Parameter: ref: reference to a label definition. Returns: TRUE if the label definition was processed without error, FALSE otherwise. */ { bnfLBdef_struct *def ; const char *nmtxt,*ndtxt ; deflbl_struct *lblnde ; void *lblval ; const char *rtnnme = "dolabel" ; /* First test the reference to make sure that it references a label definition. */ if (ref == NULL) { errmsg(2,rtnnme,"bnf ref") ; return (FALSE) ; } def = (bnfLBdef_struct *) ref->defn ; if (def == NULL) { errmsg(33,rtnnme) ; return (FALSE) ; } if (def->type != bnfDS && def->type != bnfDL) { errmsg(52,rtnnme) ; return (FALSE) ; } # ifndef DYLP_NDEBUG if (flgon (ref->uflgs,bnfdebug)) if (debug++ == 0) dyio_outfmt(dbgchn,dbgecho,"\n\n>>>>>> trace begins >>>>>>\n") ; if (debug > 0) { nestlvl++ ; printtab(dbgchn,dbgecho,nestlvl,numlvl,tablvl) ; prtbnfref(dbgchn,dbgecho,(bnfref_struct *) ref) ; dyio_outchr(dbgchn,dbgecho,'\n') ; nestlvl++ ; printtab(dbgchn,dbgecho,nestlvl,numlvl,tablvl) ; dyio_outfmt(dbgchn,dbgecho,"[ name ]") ; } # endif /* Process the name parameters to get the name of the label. */ switch (def->nmcd) { case bnfncBNF: { if (def->nmsrc == NULL) { errmsg(53,rtnnme,"name") ; return (FALSE) ; } if (doprimitive((bnfPref_struct *) def->nmsrc) == FALSE) { errmsg(56,rtnnme,"name") ; return (FALSE) ; } nmtxt = newtxt ; if (flgon(def->dflgs,bnfsvnm) == TRUE) strenter(def->savnm,nmtxt) ; break ; } case bnfncS: { nmtxt = strretrv(addrToInt(def->nmsrc)) ; break ; } default: { errmsg(55,rtnnme,def->nmcd,"name") ; return (FALSE) ; } } if (nmtxt == NULL) { errmsg(57,rtnnme,"name") ; return (FALSE) ; } nmtxt = STRALLOC(nmtxt) ; # ifndef DYLP_NDEBUG if (debug > 0) { printtab(dbgchn,dbgecho,nestlvl,numlvl,tablvl) ; dyio_outfmt(dbgchn,dbgecho,"[ \"%s\" ]\n",nmtxt) ; printtab(dbgchn,dbgecho,nestlvl,numlvl,tablvl) ; dyio_outfmt(dbgchn,dbgecho,"[ value ]\n") ; printtab(dbgchn,dbgecho,nestlvl,numlvl,tablvl) ; } # endif /* Now process the value parameters to get the label value. */ switch (def->ndcd) { case bnfncBNF: { if (def->ndsrc == NULL) { errmsg(53,rtnnme,"value") ; STRFREE(nmtxt) ; return (FALSE) ; } if (doprimitive((bnfPref_struct *) def->ndsrc) == FALSE) { errmsg(56,rtnnme,"value") ; STRFREE(nmtxt) ; return (FALSE) ; } ndtxt = newtxt ; lblnde = finddlbl(&blbllst,ndtxt) ; if (lblnde == NULL) { if (ndtxt == NULL) errmsg(57,rtnnme,"value") ; else errmsg(54,rtnnme,ndtxt) ; STRFREE(nmtxt) ; return (FALSE) ; } if (flgon(def->dflgs,bnfsvnd) == TRUE) strenter(def->savnd,ndtxt) ; lblval = lblnde->lblval ; break ; } case bnfncC: { lblval = curnde ; break ; } case bnfncN: { lblval = newnde ; break ; } case bnfncS: { ndtxt = strretrv(addrToInt(def->ndsrc)) ; lblnde = finddlbl(&blbllst,ndtxt) ; if (lblnde == NULL) { if (ndtxt == NULL) errmsg(57,rtnnme,"value") ; else errmsg(54,rtnnme,ndtxt) ; STRFREE(nmtxt) ; return (FALSE) ; } lblval = lblnde->lblval ; break ; } default: { errmsg(55,rtnnme,def->nmcd,"value") ; STRFREE(nmtxt) ; return (FALSE) ; } } /* Form the full label from the value plus the offset. Warn the user if it evaluates to NULL. */ lblval = make_label(lblval,def->offset) ; # ifndef DYLP_NDEBUG if (lblval == NULL && warnzlbl == TRUE) warn(58,rtnnme,nmtxt) ; if (debug > 0) { printtab(dbgchn,dbgecho,nestlvl,numlvl,tablvl) ; dyio_outfmt(dbgchn,dbgecho,"[ value: %#1x ]\n",nmtxt) ; nestlvl -= 2 ; if (flgon(ref->uflgs,bnfdebug)) if (--debug == 0) dyio_outfmt(dbgchn,dbgecho,"<<<<<< trace ends <<<<<<\n\n") ; } # endif /* Now search for the label in the appropriate defined label list. */ if (def->type == bnfDS) lblnde = finddlbl(&flbllst,nmtxt) ; else lblnde = finddlbl(&blbllst,nmtxt) ; /* Enter in the appropriate list if the label was previously undefined. Redefine the present entry if it is not an advance, or if the label we're now defining is flagged to be an advance of the present entry. */ if (lblnde == NULL) { lblnde = (deflbl_struct *) MALLOC(sizeof(deflbl_struct)) ; if (def->type == bnfDS) { lblnde->lblnxt = flbllst ; flbllst = lblnde ; } else { lblnde->lblnxt = blbllst ; blbllst = lblnde ; } lblnde->lbladv = flgon(def->dflgs,bnfadv) ; lblnde->lblnmtxt = nmtxt ; lblnde->lblval = lblval ; } else { if (flgon(def->dflgs,bnfadv) == TRUE || lblnde->lbladv == FALSE) { lblnde->lblval = lblval ; lblnde->lbladv = flgon(def->dflgs,bnfadv) ; } } /* Now check the appropriate undefined label lists to see if we can resolve any entries. */ if (flgoff(def->dflgs,bnfadv) == TRUE) { if (def->type == bnfDS) lblresolve(&uflbllst,lblnde) ; else lblresolve(&ublbllst,lblnde) ; } return (TRUE) ; } bool doreference (bnfLBref_struct *ref) /* This routine handles references to sockets and labels. Each is handled in basically the same manner, with the exception that for a socket reference, the label to be stored in the socket must be defined, and for a label reference, the socket which will hold the label must be defined. The routine first checks to make sure that defid is a socket/label reference. It then processes nmsrc to obtain the socket and ndsrc to obtain the label. It completes the reference by making the necessary assignment (if both the socket and the label are defined) or by making an entry on the appropriate undefined list. Parameter: ref: reference to a label reference Returns: TRUE if the actions described above are completed successfully, FALSE otherwise. */ { bnfLBdef_struct *def ; const char *nmtxt = NULL ; const char *ndtxt = NULL ; deflbl_struct *lblnde ; udeflbl_struct *ulblnde ; void *val,**socket ; bool socket_valid,val_valid ; const char *rtnnme = "doreference" ; /* First test the reference to make sure that it references a label reference. */ if (ref == NULL) { errmsg(2,rtnnme,"bnf ref") ; return (FALSE) ; } def = (bnfLBdef_struct *) ref->defn ; if (def == NULL) { errmsg(33,rtnnme) ; return (FALSE) ; } if (def->type != bnfRS && def->type != bnfRL) { errmsg(52,rtnnme) ; return (FALSE) ; } # ifndef DYLP_NDEBUG if (flgon (ref->uflgs,bnfdebug)) if (debug++ == 0) dyio_outfmt(dbgchn,dbgecho,"\n\n>>>>>> trace begins >>>>>>\n") ; if (debug > 0) { nestlvl++ ; printtab(dbgchn,dbgecho,nestlvl,numlvl,tablvl) ; prtbnfref(dbgchn,dbgecho,(bnfref_struct *) ref) ; dyio_outchr(dbgchn,dbgecho,'\n') ; nestlvl++ ; printtab(dbgchn,dbgecho,nestlvl,numlvl,tablvl) ; dyio_outfmt(dbgchn,dbgecho,"[ socket ]") ; } # endif /* Now process the nm parameters to get the value of the socket. */ socket_valid = TRUE ; switch (def->nmcd) { case bnfncBNF: { if (def->nmsrc == NULL) { errmsg(59,rtnnme,"socket") ; return (FALSE) ; } if (doprimitive((bnfPref_struct *) def->nmsrc) == FALSE) { errmsg(60,rtnnme,"socket") ; return (FALSE) ; } nmtxt = newtxt ; if (nmtxt == NULL) { errmsg(61,rtnnme,"socket") ; return (FALSE) ; } lblnde = finddlbl(&flbllst,nmtxt) ; if (lblnde == NULL) { socket = NULL ; socket_valid = FALSE ; } else socket = make_socket(lblnde->lblval,0) ; if (flgon(def->dflgs,bnfsvnm) == TRUE) strenter(def->savnm,nmtxt) ; break ; } case bnfncC: { socket = make_socket(curnde,def->offset) ; break ; } case bnfncN: { socket = make_socket(newnde,def->offset) ; break ; } case bnfncS: { nmtxt = strretrv(addrToInt(def->nmsrc)) ; if (nmtxt == NULL) { errmsg(61,rtnnme,"socket") ; return (FALSE) ; } lblnde = finddlbl(&flbllst,nmtxt) ; if (lblnde == NULL) { socket = NULL ; socket_valid = FALSE ; } else socket = make_socket(lblnde->lblval,0) ; break ; } default: { errmsg(64,rtnnme,def->nmcd,"socket") ; return (FALSE) ; } } if (socket_valid == TRUE && socket == NULL) { errmsg(62,rtnnme) ; return (FALSE) ; } # ifndef DYLP_NDEBUG if (debug > 0) { printtab(dbgchn,dbgecho,nestlvl,numlvl,tablvl) ; dyio_outfmt(dbgchn,dbgecho,"[ \"%s\" = %#1x ]\n",nmtxt) ; printtab(dbgchn,dbgecho,nestlvl,numlvl,tablvl) ; dyio_outfmt(dbgchn,dbgecho,"[ label ]\n") ; printtab(dbgchn,dbgecho,nestlvl,numlvl,tablvl) ; } # endif /* And do the same for the nd parameters to get the label to be stored in the socket. */ val_valid = TRUE ; switch (def->ndcd) { case bnfncBNF: { if (def->ndsrc == NULL) { errmsg(59,rtnnme,"value") ; return (FALSE) ; } if (doprimitive((bnfPref_struct *) def->ndsrc) == FALSE) { errmsg(60,rtnnme,"value") ; return (FALSE) ; } ndtxt = newtxt ; if (ndtxt == NULL) { errmsg(61,rtnnme,"value") ; return (FALSE) ; } lblnde = finddlbl(&blbllst,ndtxt) ; if (lblnde == NULL) { val = NULL ; val_valid = FALSE ; } else val = make_label(lblnde->lblval,0) ; if (flgon(def->dflgs,bnfsvnd) == TRUE) strenter(def->savnd,ndtxt) ; break ; } case bnfncC: { val = make_label(curnde,def->offset2) ; break ; } case bnfncN: { val = make_label(newnde,def->offset2) ; break ; } case bnfncS: { ndtxt = strretrv(addrToInt(def->ndsrc)) ; if (ndtxt == NULL) { errmsg(61,rtnnme,"value") ; return (FALSE) ; } lblnde = finddlbl(&blbllst,ndtxt) ; if (lblnde == NULL) { val = NULL ; val_valid = FALSE ; } else val = make_label(lblnde->lblval,0) ; break ; } default: { errmsg(64,rtnnme,def->ndcd,"value") ; return (FALSE) ; } } # ifndef DYLP_NDEBUG if (warnzlbl == TRUE && val == NULL && val_valid == TRUE) warn(65,rtnnme) ; if (debug > 0) { printtab(dbgchn,dbgecho,nestlvl,numlvl,tablvl) ; dyio_outfmt(dbgchn,dbgecho,"[ \"%s\" = %#1x ]\n",nmtxt) ; nestlvl -= 2 ; if (flgon(ref->uflgs,bnfdebug)) if (--debug == 0) dyio_outfmt(dbgchn,dbgecho,"<<<<<< trace ends <<<<<<\n\n") ; } # endif /* Complete the reference if both the socket and the label are defined, or make an entry in the proper undefined list. */ if (def->type == bnfRS) { if (val_valid == FALSE) { errmsg(63,rtnnme) ; return (FALSE) ; } if (socket_valid == TRUE) *socket = val ; else { ulblnde = (udeflbl_struct *) MALLOC(sizeof(udeflbl_struct)) ; ulblnde->lblnxt = uflbllst ; uflbllst = ulblnde ; ulblnde->lblnmtxt = STRALLOC(nmtxt) ; ulblnde->lblval = val ; } } else { if (socket_valid == FALSE) { errmsg(66,rtnnme) ; return (FALSE) ; } if (val_valid == TRUE) *socket = val ; else { ulblnde = (udeflbl_struct *) MALLOC(sizeof(udeflbl_struct)) ; ulblnde->lblnxt = ublbllst ; ublbllst = ulblnde ; ulblnde->lblnmtxt = STRALLOC(ndtxt) ; ulblnde->lblval = (void *) socket ; } } return (TRUE) ; } bool dolist (bnfref_any ref) /* This routine handles the -LIST construct (applicable to generators, non-primitives, and primitives). It first checks to be sure that the definition and separator specified by ref are of the correct type. If both check out, the routine enters a loop, doing first the body of the definition, then the separator. The loop terminates successfully when the separator parse fails. It terminates unsuccessfully when the main parse fails. Parameter: ref: bnf reference flagged as a list construct (bnflst) Returns: TRUE if the list parses successfully, FALSE otherwise. */ { bnfref_struct *sepref ; bnfdef_any def ; void **socket ; bool firsttime,success,sepsuccess ; void *savcnde = NULL ; void *firstnde = NULL ; char *savctxt = NULL ; char *lclsavtxt = NULL ; long marker ; const char *rtnnme = "dolist" ; /* Consistency checks. First check that we're dealing with the proper bnf reference types for the separator. Errors in body type will be caught below as part of the loop setup. */ if (ref.t3 == NULL) { errmsg(2,rtnnme,"bnf ref") ; return (FALSE) ; } sepref = ref.t3->sep ; if (sepref->type != bnfP && sepref->type != bnfT) { errmsg(67,rtnnme) ; return (FALSE) ; } # ifndef DYLP_NDEBUG if (flgon(ref.t3->uflgs,bnfdebug)) if (debug++ == 0) { dyio_outfmt(dbgchn,dbgecho,"\n\n>>>>>> trace begins >>>>>>\n") ; nestlvl = 0 ; } if (debug > 0) { nestlvl++ ; printtab(dbgchn,dbgecho,nestlvl,numlvl,tablvl) ; dyio_outfmt(dbgchn,dbgecho,"[ begin list ]\n") ; } # endif /* Set up for the loop which will process the list. Nothing needs to be done for non-primitives. For generators, we want to check out the reference storage spec and the link storage spec. We put curnde out of the way so we can link the list up properly. For primitives, we can check the reference storage spec now only if we're storing a pointer to the string. A request for storage of the actual string is checked after the end of the parsing loop. We also need to put curtxt out of the way so that we can properly collect the text from all primitives in the loop. */ def.com = ref.t3->defn ; switch (def.com->type) { case bnfG: { if (flgon(ref.G->uflgs,bnfstore) == TRUE) { if (curnde == NULL) { errmsg(68,rtnnme) ; return (FALSE) ; } if (offset_in_range(ref.G->offset,sizeof(void *)) == FALSE) { errmsg(30,rtnnme,ref.G->offset,max_offset(sizeof(void *))) ; return (FALSE) ; } } if (def.G->link < 0 || def.G->link > def.G->size - sizeof(void *)) { errmsg(69,rtnnme,def.G->link,def.G->size-sizeof(void *)) ; return (FALSE) ; } savcnde = curnde ; break ; } case bnfP: { if (flgon(ref.P->uflgs,bnfstore) == TRUE) { if (curnde == NULL) { errmsg(68,rtnnme) ; return (FALSE) ; } if (flgon(ref.P->uflgs,bnfatsgn) == TRUE) if (offset_in_range(ref.P->offset,sizeof(char *)) == FALSE) { errmsg(30,rtnnme,ref.P->offset,max_offset(sizeof(char *))) ; return (FALSE) ; } } savctxt = curtxt ; curtxt = (char *) MALLOC(sizeof(char)) ; *curtxt = '\0' ; break ; } case bnfNP: { break ; } default: { errmsg(70,rtnnme,def.com->type) ; return (FALSE) ; } } /* Now we come to the processing loop. First we try to parse a list element according to the body bnf. If this fails, the loop aborts and we return an error. If an element is parsed, then an attempt is made to parse the separator. If this succeeds, the loop prepares for the next iteration and repeats. If the separator parse fails, it is taken to indicate the end of the list and we fall out of the loop to the post-processing. */ firsttime = TRUE ; while (1) { # ifndef DYLP_NDEBUG if (debug > 0) { printtab(dbgchn,dbgecho,nestlvl,numlvl,tablvl) ; dyio_outfmt(dbgchn,dbgecho,"[ body ]\n") ; } # endif switch (def.com->type) { case bnfG: { success = dogenerator(ref.G) ; break ; } case bnfNP: { success = dononprimitive(ref.NP) ; break ; } case bnfP: { success = doprimitive(ref.P) ; break ; } default: { errmsg(1,rtnnme,__LINE__) ; return (FALSE) ; } } if (success == FALSE) break ; if (def.com->type == bnfG) { if (firsttime == TRUE) { firstnde = newnde ; firsttime = FALSE ; } else { socket = make_socket(curnde,def.G->link) ; *socket = newnde ; } curnde = newnde ; } marker = dyio_mark(bnfchn) ; if (flgon(ref.t3->uflgs,bnfstbg) == TRUE && def.com->type == bnfP) { lclsavtxt = curtxt ; curtxt = NULL ; } # ifndef DYLP_NDEBUG if (debug > 0) { printtab(dbgchn,dbgecho,nestlvl,numlvl,tablvl) ; dyio_outfmt(dbgchn,dbgecho,"[ separator ]\n") ; } # endif if (sepref->type == bnfP) sepsuccess = doprimitive((bnfPref_struct *) sepref) ; else sepsuccess = doterminal((bnfTref_struct *) sepref) ; if (sepsuccess == FALSE) { if (sepref->type == bnfT) dyio_backup(bnfchn,marker) ; if (flgon(ref.t3->uflgs,bnfstbg) == TRUE && def.com->type == bnfP) curtxt = lclsavtxt ; break ; } if (flgon(ref.t3->uflgs,bnfstbg) == TRUE) { dyio_backup(bnfchn,marker) ; if (def.com->type == bnfP) curtxt = lclsavtxt ; } } /* End of the loop to parse the list. Now we clean up and return. For generators, we have to restore curnde and link the head of the list onto it. For primitives, we need to look at storing the collected text, then restore curtxt and concatenate the collected text to it, if necessary. */ switch (def.com->type) { case bnfG: { if (success == TRUE) { newnde = firstnde ; curnde = savcnde ; if (flgon(ref.G->uflgs,bnfstore) == TRUE) { socket = make_socket(curnde,ref.G->offset) ; *socket = firstnde ; } } else { curnde = savcnde ; } break ; } case bnfP: { if (success == TRUE) { if (newtxt != NULL) FREE(newtxt) ; newtxt = curtxt ; curtxt = savctxt ; if (flgon(ref.P->uflgs,bnfstore) == TRUE) { if (flgon(ref.P->uflgs,bnfsv) == TRUE) { strenter(ref.P->offset,newtxt) ; } else { socket = make_socket(curnde,ref.P->offset) ; if ( flgon(ref.P->uflgs,bnfatsgn) == TRUE) { *((const char **) socket) = STRALLOC(newtxt) ; } else { if (offset_in_range(ref.P->offset,strlen(newtxt)+1) == FALSE) { errmsg(30,rtnnme,ref.P->offset,max_offset(strlen(newtxt)+1)) ; FREE(newtxt) ; newtxt = NULL ; return (FALSE) ; } (void) strcpy((char *) socket,newtxt) ; } } } if (curtxt != NULL) { lclsavtxt = (char *) MALLOC(strlen(curtxt)+strlen(newtxt)+1) ; (void) strcpy(lclsavtxt,curtxt) ; (void) strcat(lclsavtxt,newtxt) ; FREE(curtxt) ; curtxt = lclsavtxt ; } } else { FREE(curtxt) ; curtxt = savctxt ; } break ; } default: { break ; } } # ifndef DYLP_NDEBUG if (debug > 0) { printtab(dbgchn,dbgecho,nestlvl,numlvl,tablvl) ; dyio_outfmt(dbgchn,dbgecho,"[ end list ]\n") ; nestlvl-- ; if (flgon(ref.t3->uflgs,bnfdebug)) if (--debug == 0) dyio_outfmt(dbgchn,dbgecho,"<<<<<< trace ends <<<<<<\n\n") ; } # endif return (success) ; } bool parse (ioid chn, struct bnfref_type3 *bnfid, parse_any *result) /* This routine is used to access the bnf reader to parse input. Parameters: chn: Id of the input stream, obtained from openfile bnfid: Bnf to be used to parse the input. The top-level construct must be either a generator, non-primitive, or primitive (which allows us to get away with bnfref_type3 as the common type, otherwise we'd be forced to void). result: Will be assigned the data structure or character string built by the parse. Returns: TRUE if the parse succeeds, FALSE otherwise. Note that the value built by the parse is returned in result. */ { bool success ; bnfref_any ref ; const char *rtnnme = "parse" ; /* Make sure we have a valid bnf reference, and some place to put the result for generators and primitives. */ if (bnfid == NULL) { errmsg(2,rtnnme,"bnf") ; return (FALSE) ; } ref.t3 = bnfid ; if (ref.com->type != bnfG && ref.com->type != bnfNP && ref.com->type != bnfP) { errmsg(43,rtnnme) ; return (FALSE) ; } if (ref.com->type != bnfNP) if (result == NULL) { errmsg(2,rtnnme,"result") ; return (FALSE) ; } /* Now set the input channel, call the appropriate routine to do the parse, and return the result. */ bnfchn = chn ; switch (ref.com->type) { case bnfG: { if (flgon(ref.G->uflgs,bnflst) == TRUE) success = dolist(ref) ; else success = dogenerator(ref.G) ; if (success == TRUE) result->g = newnde ; break ; } case bnfNP: { if (flgon(ref.NP->uflgs,bnflst) == TRUE) success = dolist(ref) ; else success = dononprimitive(ref.NP) ; break ; } case bnfP: { if (flgon(ref.P->uflgs,bnflst) == TRUE) success = dolist(ref) ; else success = doprimitive(ref.P) ; if (success == TRUE) result->c = newtxt ; break ; } default: { errmsg(1,rtnnme,__LINE__) ; success = FALSE ; break ; } } return (success) ; } # ifndef DYLP_NDEBUG void bnfdbgctl (ioid dbgchn_p, bool dbgecho_p, bool warnzlbl_p, bool numlvl_p, bool tablvl_p) /* By default the debugging trace warns about labels that evaluate to NULL, and (once triggered by the bnfdebug flag in a reference) prints trace lines prefixed with the nesting level and proportionally indented. The output will go to stdout only. This routine allows the behaviour to be changed. Parameters: dbgchn: i/o id for trace output (default IOID_NOSTRM) dbgecho: TRUE to echo trace output to stdout (default TRUE) warnzero: TRUE to produce warning messages for null labels (default TRUE) numlvl: TRUE to prefix trace lines with the nesting level (default TRUE) tablvl: TRUE to indent trace lines proportional to the nesting level (default TRUE) */ { dbgchn = dbgchn_p ; dbgecho = dbgecho_p ; warnzlbl = warnzlbl_p ; numlvl = numlvl_p ; tablvl = tablvl_p ; } # endif /* DYLP_NDEBUG */ DyLP-1.6.0/DyLP/src/DylpStdLib/dylib_keytab.h0000644000076700007670000000207110632415522015510 0ustar #ifndef _DYLIB_KEYTAB_H #define _DYLIB_KEYTAB_H /* This file is part of the support library for the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* Data structure for keyword tables searched by find and ambig @(#)keytab.h 1.2 08/31/99 svn/cvs: $Id: dylib_keytab.h 148 2007-06-09 03:15:30Z lou $ */ /* Field Contents ----- -------- keyword Character string for the keyword. min Minimum number of characters which must be matched before cimstrcmp will report a match. token Value returned when the keyword is matched. */ typedef struct keytab_entry_internal { const char *keyword ; int min ; int token ; } keytab_entry ; /* binsrch.c */ extern int find(char *word, keytab_entry keytab[], int numkeys), ambig(char *word, keytab_entry keytab[], int numkeys) ; #endif /* _DYLIB_KEYTAB_H */ DyLP-1.6.0/DyLP/src/DylpStdLib/dylib_binsrch.c0000644000076700007670000000474210632415522015663 0ustar /* This file is part of the support library for the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ #include "dylib_std.h" static char sccsid[] UNUSED = "@(#)binsrch.c 1.4 09/25/04" ; static char svnid[] UNUSED = "$Id: dylib_binsrch.c 148 2007-06-09 03:15:30Z lou $" ; #include "dylib_strrtns.h" #include "dylib_keytab.h" int find (char *word, keytab_entry keytab[], int numkeys) /* Find looks up a word in a keyword table. It uses binary search and is insensitive to case. Parameters: word: pointer to the word to be looked up keytab: pointer to the array of keywords numkeys: length of the keyword table Return value: Normal token number associated with the keyword Otherwise -1 if the keyword cannot be found */ { int high,low,mid,place ; low = 0 ; high = numkeys-1 ; while (low <= high) { mid = (high+low)/2 ; place = cistrcmp(word,keytab[mid].keyword) ; switch (place) { case -1: high = mid-1 ; break ; case 0: return (keytab[mid].token) ; case 1: low = mid+1 ; break ; } } return (-1) ; } int ambig (char *word, keytab_entry keytab[], int numkeys) /* This routine looks up a word in a keyword table using a "shortest unique match" algorithm. If the minimum number of characters to be matched is greater than the length of the keyword, it's taken to be a request for an exact match (think of it as requiring the terminating '\0' to be matched). Parameters: word: word to be looked up keytab: array of keywords numkeys: length of the keyword array Returns: Normal: token number associated with the keyword Otherwise: -1 if the keyword cannot be found -2 if the keyword is ambiguous */ { int high,low,mid,place ; low = 0 ; high = numkeys-1 ; while (low <= high) { mid = (high+low)/2 ; place = cimstrcmp(word,keytab[mid].keyword) ; switch(place) { case -1: { high = mid-1 ; break ; } case 0: { if (strlen(word) < keytab[mid].min-1) return (-2) ; else if (strlen(keytab[mid].keyword) >= keytab[mid].min) return (keytab[mid].token) ; else if (strlen(keytab[mid].keyword) == strlen(word)) return (keytab[mid].token) ; } case 1: { low = mid+1 ; break ; } } } return (-1) ; } DyLP-1.6.0/DyLP/src/DylpStdLib/dylib_bnfrdr.h0000644000076700007670000006043410700502137015510 0ustar #ifndef _DYLIB_BNFRDR_H #define _DYLIB_BNFRDR_H /* This file is part of the support library for the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ #include "dylib_io.h" /* sccs: @(#)bnfrdr.h 3.5 09/01/99 svn/cvs: "$Id: dylib_bnfrdr.h 181 2007-10-02 17:48:15Z lou $" ; This file contains the structure definitions required to use the bnf reader package. The bnf reader depends heavily on the following two assumptions: * There is some pointer type into which any other pointer can be cast and recovered. * An int can be cast into a pointer and recovered. This is used to prevent the complexity of the bnf data structure from getting out of hand, but could be avoided at the expense of a substantial increase in its size and awkwardness of use. The basic scheme is something like this. At the bottom, we have a number of terminal constructs: immediates, literals, terminals, and labels of various flavours. Above these are the three non-terminal constructs: primitives, non-primitives, and generators. The non-terminals have bodies which are made up of references to other terminal or non-terminal constructs. Generator bodies have only one parse; primitive and non-primitive bodies can have a number of alternative parses. A picture is probably in order here: definition body ---------- ---------- ---------- ---------- | | ---> | | ---> | ref | ---> | defn | ---------- ---------- ---------- ---------- | .... | ---------- ---------- ---------- | | ---> | ref | ---> | defn | ---------- ---------- ---------- A definition contains a pointer to its body, which is an array of pointers to references. Each reference points to a definition. Essentially, a reference specifies how the second definition is to be used in the context of the body of the first definition. The bnf reader has the capability to create arbitrary links in the data structure it's building. Some terminology will make things easier: | .... | ---------- ---------- socket -->| label -+----->| | ---------- ---------- | .... | | .... | The value of a label is the address of something. To make a link, the value of the label has to be stored. The place where it is stored is called a socket. The value of a socket is the address of the field where the value of the label is stored. When it defines a socket, the bnf reader associates a name with an address; similarly for a label. Both socket and label references cause a label to be stored in a socket; the difference between the two lies in which of the socket or label can be undefined when the reference is processed. When it's not important to distinguish between sockets and labels, the documentation uses label to include both. To write a bnf, you use the set of macros defined at the end of the file. For a detailed explanation of the sorts of things that can be specified with the bnf, the user should take a look at the supplementary documentation. The structures and code will make a lot more sense afterward. */ /* Definitions of enum types used as codes in the bnf structures which follow. */ /* bnftype_enum codes the type of the bnf definition. Value Description ----- ----------- bnfG Generator definition bnfNP Non-primitive definition bnfP Primitive definition bnfT Terminal definition bnfDS Socket definition definition bnfDL Label definition definition bnfRS Socket reference definition bnfRL Label reference definition bnfI Immediate value definition bnfL Literal definition */ typedef enum {bnfG,bnfNP,bnfP,bnfT,bnfDS, bnfDL,bnfRS,bnfRL,bnfI,bnfL} bnftype_enum ; /* bnfttype_enum codes the type of lexeme expected by a terminal. Value Description ----- ----------- bnfttNIL the null lexeme bnfttN number bnfttID identifier bnfttD delimiter bnfttF fixed-length string bnfttQ quoted string */ typedef enum {bnfttNIL,bnfttN,bnfttID,bnfttD,bnfttF,bnfttQ} bnfttype_enum ; /* bnflblsrc_enum codes the way in which text strings used for label names are obtained. Value Description ----- ----------- bnfncBNF A bnf is supplied which will produce a text string. If this code appears in the context of a name, the string will be the name of the label. If it appears in the context of a value, the string will be used as a label name and the value associated with the name will become the value of the label being defined. bnfncS An index in the saved text array is supplied. The string retrieved is interpreted as for bnfncBNF. bnfncC The value of curnde is used as the socket/label value. This code is not valid in the context of a name. bnfncN The value of newnde is used as the socket/label value. This code is not valid in the context of a name. */ typedef enum {bnfncBNF,bnfncS,bnfncC,bnfncN} bnflblsrc_enum ; /* Flag definitions used in bnf definitions. Flag Description ---- ----------- bnfadv Indicates the redefinition of a previously defined label. The usual context for use is to redefine (advance) a label which is the link in a linked list. bnfsvnd Save the text string developed by the nd part of a label definition definition or label reference definition. bnfsvnm Save the text string developed by the nm part of a label definition definition or label reference definition. This flag is also used in literal definitions to indicate that text should be retrieved from the saved text array. */ #define bnfadv 1<<0 #define bnfsvnd 1<<1 #define bnfsvnm 1<<2 /* Flag definitions used in bnf references. Flag Description ---- ----------- bnflst The definition referenced describes one element of a list of indefinite length. bnfstore The value produced by the referenced bnf will be stored somehow, and the offset field should be valid. bnfatsgn Store a pointer to the character string produced by the referenced bnf, rather than the string itself. bnfstbg The bnf referenced as the separator between list elements is really the beginning of the next list element. (Hence we'll have to back up over it once we recognize it.) bnfflt A float number is expected here. bnfdbl A double number is expected here. bnfcs Forces a case-sensitive comparison of the string read for a terminal with the value specified in the terminal definition. bnfmin Requests a minimum-length comparison - as long as the string parsed for the terminal matches the value specified in the terminal definition up to the end of the parsed string, the comparison succeeds. bnfsv Used in primitives to indicate that the string is to be stored in the savedtxt array. The offset should be a valid savedtxt index in this case. bnfexact (bnfttF only) used to prevent the addition of the null terminator at the end of a character string when the string is stored directly in a field (must be specified to store a single char in a field of size sizeof(char)) bnfdebug Debugging should be activated for this reference and all bnf rules nested within it. */ #define bnflst 1<<0 #define bnfstore 1<<1 #define bnfatsgn 1<<2 #define bnfstbg 1<<3 #define bnfflt 1<<4 #define bnfcs 1<<5 #define bnfmin 1<<6 #define bnfsv 1<<7 #define bnfexact 1<<8 #define bnfdebug 1<<9 #define bnfdbl 1<<10 /* Bnfrdr regularly uses the first ([0]) entry of an array of addresses to hold the number of addresses in the array. In order to convert this back to an integer without triggering compiler warnings, the code uses this macro. */ # define addrToInt(zz_addr_zz) \ ((int) (((char *)(zz_addr_zz)) - ((char *)(0)))) /* Data structures used for bnf definitions. There are three types of things here: individual structures for the various definition types, a common structure which consists only of the fields common to all of the individual structures, and a pointer union which is handy when walking around in a bnf. For C++ fans: really, what we're doing here is faking a base class and derived classes, with early 1980's technology. Just to keep the explanation in hand a bit, let's define components and alternatives. The body of a bnf definition consists of alternatives (alternative parses), each of which has a number of components. A component array is an array of pointers to bnf reference structures, each of which in turn references a bnf definition structure. An alternative array is an array of pointers to component arrays. I know this is ugly and involves a lot of dereferencing but it seems to be the only way to handle the variable lengths involved. NOTE: To keep things from getting completely out of hand, the first entry in a component or alternative array specifies the number of pointers that follow. This is an abuse of type and casting. Bad when the world was 32-bit architectures. Worse now that it's a mix of 32- and 64-bit architectures. See the addrToInt macro above. */ /* The common portion. Field Description ----- ----------- type Type code identifying what sort of definition this is. name The name of the rule (derived from the C variable name; see the macros gdef, npdef, etc.) */ #define bnfdef_common bnftype_enum type ; \ const char *name ; typedef struct { bnfdef_common } bnfdef_struct ; /* Data structure for a generator definition. Generators cause the creation of a node in the data structure being built for the user. For simplicity, they may not have alternative parses, but since they can reference non-primitives no flexibility is lost. Field Description ----- ----------- bnfdef_common As above. size Size (in bytes) of the node to be created. link Offset (in bytes) from the base of the node created by the generator to the field used as a link field when this node is in a linked list. comps Pointer to a component array. */ typedef struct { bnfdef_common int size ; int link ; struct bnfref_struct_tag **comps ; } bnfGdef_struct ; /* Data structure for a non-primitive definition. Non-primitives are simply a device for defining alternative parses. They don't directly create anything. Field Description ----- ----------- bnfdef_common As above. alts Pointer to an alternative array. */ typedef struct {bnfdef_common struct bnfref_struct_tag ***alts ; } bnfNPdef_struct ; /* Data structure for a primitive definition. The distinction between a primitive and a non-primitive is that a primitive constructs a string which is the concatenation of the strings returned by the bnf's referenced in the primitive's body. The data structure is identical to that for non-primitives. */ typedef bnfNPdef_struct bnfPdef_struct ; /* Data structure for a terminal. Terminals are used to specify specific things to be obtained from the input stream. The various parameters required to describe a terminal should really be mushed into a union, but then the bnf data structure would have to be built dynamically, since unions can't be initialized. Field Description ----- ----------- bnfdef_common As above. ttype Code identifying the type of terminal to be obtained. qschr Starting character for a quoted string. qechr Ending character for a quoted string. parm1 Overloaded field, interpreted as follows: numbers: specifies the radix fixed-length strings: specifies the string length val Expected value of the string obtained from the input stream. (This test is applied before the string is converted to the internal form appropriate for whatever is specified in ttype.) */ typedef struct { bnfdef_common bnfttype_enum ttype ; char qschr ; char qechr ; int parm1 ; const char *val ; } bnfTdef_struct ; /* Data structure for an immediate value. Immediates are used to jam a code into the data structure being built. Field Description ----- ----------- bnfdef_common As above. ival Integer value. */ typedef struct {bnfdef_common int ival ; } bnfIdef_struct ; /* Data structure for a literal. Literals are used to insert characters into the input stream. (Handy for generating label names, for instance.) Field Description ----- ----------- bnfdef_common As above. dflgs Flags. txt The string to be inserted. This field is also used to index into the saved text array by casting it to an int. */ typedef struct { bnfdef_common flags dflgs ; char *txt ; } bnfLdef_struct ; /* Last but not least, the data structure used to define socket/label definitions and references. (Definitions, mind you - there is another structure to reference socket/label definitions and references.) A socket/label definition associates of a name (a text string) with a value (almost always an address). A socket/label reference specifies a socket and a label. The label is inserted into the socket. Fields prefixed by nm are the name in a socket/label definition and the socket in a socket/label reference. Fields prefixed by nd are the value in a socket/label definition and the label in a socket/label reference. Field Description ----- ----------- bnfdef_common As above. dflgs Flags. nmcd Specifies how name/socket will be obtained. ndcd Specifies how value/label will be obtained. savnm Specifies location in saved text array where string associated with nm will be stored. nmsrc Pointer to bnf which will produce string for nm, or cast into an int and used as a location in the saved text array. savnd Specifies location in saved text array where string associated with nd will be stored. ndsrc Pointer to bnf which will produce string for nd, or cast into an int and used as a location in the saved text array. offset Correction (in bytes) to socket/label value (socket/label definitions) or socket (socket/label references). offset2 Correction (in bytes) to label (socket/label references). */ typedef struct { bnfdef_common flags dflgs ; bnflblsrc_enum nmcd ; bnflblsrc_enum ndcd ; int savnm ; struct bnfref_struct_tag *nmsrc ; int savnd ; struct bnfref_struct_tag *ndsrc ; int offset ; int offset2 ; } bnfLBdef_struct ; /* And finally, the handy union of pointers promised back at the start. We really should be using this in the bnf reference structure declarations, rather than (bnfdef_struct *), but since references and definitions are mutually recursive we get into ugliness. There's also the point that we want to be able to create bnfs at compile time and you can't initialize unions. */ typedef union { bnfdef_struct *com ; bnfGdef_struct *G ; bnfNPdef_struct *NP ; bnfPdef_struct *P ; bnfTdef_struct *T ; bnfIdef_struct *I ; bnfLdef_struct *L ; bnfLBdef_struct *LB ; } bnfdef_any ; /* Now, on to the data structures used to reference bnf definitions. Recall if you will the introductory comments about component and alternative arrays and the general setup of the bnf data structure. We have the same three types of data structures here as for bnf definitions. */ /* The common portion. It includes a type code, a name, usage flags, and a pointer to the bnf definition. Field Description ----- ----------- type Type code identifying what sort of definition this reference points to. name The name of the reference (derived from the C variable name; see the macros qref, npref, pref, etc.) uflgs Usage flags. defn Pointer to a bnf definition structure. */ #define bnfref_common bnftype_enum type ; \ const char *name ; \ bnfdef_struct *defn ; \ flags uflgs ; typedef struct bnfref_struct_tag { bnfref_common } bnfref_struct ; /* References to labels of all flavours and to literals require only the common fields. The only reason we need the uflgs field is for the bnfdebug flag. */ typedef bnfref_struct bnfLBref_struct ; typedef bnfref_struct bnfLref_struct ; /* References to terminals and immediates require an offset for storage. Field Description ----- ----------- bnfref_common As above. offset Offset (in bytes) into current node to the field where the value produced by the referenced bnf will be stored. */ struct bnfref_type2 { bnfref_common int offset ; } ; typedef struct bnfref_type2 bnfTref_struct ; typedef struct bnfref_type2 bnfIref_struct ; /* References to generators, non-primitives, and primitives can be in lists and require a separator specification in addition to the offset. Non-primitives do not make use of the offset field. Field Description ----- ----------- bnfref_common As above. offset Offset (in bytes) into current node to the field where the value produced by the referenced bnf will be stored. sep A reference to a bnf definition describing the separator between list elements in the input stream. */ struct bnfref_type3 { bnfref_common int offset ; bnfref_struct *sep ; } ; typedef struct bnfref_type3 bnfGref_struct ; typedef struct bnfref_type3 bnfNPref_struct ; typedef struct bnfref_type3 bnfPref_struct ; /* And the handy union pointer type. Same general comments as for the declaration of bnfdef_any. */ typedef union { bnfref_struct *com ; struct bnfref_type1 *t1 ; struct bnfref_type2 *t2 ; struct bnfref_type3 *t3 ; bnfGref_struct *G ; bnfNPref_struct *NP ; bnfPref_struct *P ; bnfTref_struct *T ; bnfIref_struct *I ; bnfLref_struct *L ; bnfLBref_struct *LB ; } bnfref_any ; /* The macros that make defining the bnf data structures marginally less painful. */ /* Macros to help with constructing field offsets. NULLP is specially designed to produce a NULL value when used as &NULLP. This is required for some of the macros where one must fill the field with either the address of a bnfref_struct or the value NULL. By this device we avoid having to make the user aware of when and when not to use &. mkoff simply produces the offset of a given field in a structure type. */ #define NULLP (*((char *) 0)) #define mksav(qqoff) (*((char *) qqoff)) #define mkoff(qqtype,qqfield) (&((qqtype *) 0)->qqfield) /* Macros for alternative and component lists. These just generate the headers; the actual lists have to be typed out, as: althd(arule_alts) = { altcnt(3), mkaref(arule_alt1), mkaref(arule_alt2), mkaref(arule_alt3) } ; comphd(arule_alt1) = { compcnt(2), mkcref(brule_ref), mkcref(crule_ref) } ; where brule_ref and crule_ref are bnf references (most likely constructed using the gref, npref, etc. macros). */ #define althd(qqnme) bnfref_struct **qqnme[] #define altcnt(qqcnt) (bnfref_struct **) (qqcnt) #define mkaref(qqref) (bnfref_struct **) (qqref) #define comphd(qqnme) bnfref_struct *qqnme[] #define compcnt(qqcnt) (bnfref_struct *) (qqcnt) #define mkcref(qqref) (bnfref_struct *) (&qqref) /* Macros to initialise bnf definitions. Note the use of the ANSI C 'stringisation' operator, '#', to get a text string for the name. For non-ANSI implementations, replacing #qqnme with "qqnme" usually works (but not all non-ANSI preprocessor implementations will see the macro parameter inside a string, and ANSI C explicitly disallows it). */ #define gdef(qqnme,qqsze,qqlnk,qqcomps) \ bnfGdef_struct qqnme = { bnfG, #qqnme, (int) (qqsze), (int) (qqlnk), \ (bnfref_struct **) qqcomps } #define npdef(qqnme,qqalts) \ bnfNPdef_struct qqnme = { bnfNP, #qqnme, (bnfref_struct ***) qqalts } #define pdef(qqnme,qqalts) \ bnfPdef_struct qqnme = { bnfP, #qqnme, (bnfref_struct ***) qqalts } #define tdef(qqnme,qqttype,qqparm,qqval) \ bnfTdef_struct qqnme = { bnfT, #qqnme, qqttype, '\0', '\0', \ (int) (qqparm), (const char *) (qqval) } #define tqdef(qqnme,qqschr,qqechr,qqval) \ bnfTdef_struct qqnme = { bnfT, #qqnme, bnfttQ, (char) qqschr, (char) qqechr,\ 0, (char *) (qqval) } #define dfdef(qqnme,qqdflgs,qqnmcd,qqnm,qqsavnm,qqndcd,qqnd,qqsavnd,qqoff) \ bnfLBdef_struct qqnme = { bnfDS, #qqnme, (flags) (qqdflgs), qqnmcd, qqndcd, \ (int) (qqsavnm), (bnfref_struct *) &qqnm, \ (int) (qqsavnd), (bnfref_struct *) &qqnd, \ (int) (qqoff), 0 } #define dbdef(qqnme,qqdflgs,qqnmcd,qqnm,qqsavnm,qqndcd,qqnd,qqsavnd,qqoff) \ bnfLBdef_struct qqnme = { bnfDL, #qqnme, (flags) (qqdflgs), qqnmcd, qqndcd, \ (int) (qqsavnm), (bnfref_struct *) &qqnm, \ (int) (qqsavnd), (bnfref_struct *) &qqnd, \ (int) (qqoff), 0 } #define rfdef(qqnme,qqdflgs,qqnmcd,qqnm,qqsavnm,qqoff,qqndcd,qqnd,qqsavnd,qqoff2) \ bnfLBdef_struct qqnme = { bnfRS, #qqnme, (flags) (qqdflgs), qqnmcd, qqndcd, \ (int) (qqsavnm), (bnfref_struct *) &qqnm, \ (int) (qqsavnd), (bnfref_struct *) &qqnd, \ (int) (qqoff), (int) (qqoff2) } #define rbdef(qqnme,qqdflgs,qqnmcd,qqnm,qqsavnm,qqoff,qqndcd,qqnd,qqsavnd,qqoff2) \ bnfLBdef_struct qqnme = { bnfRL, #qqnme, (flags) (qqdflgs), qqnmcd, qqndcd, \ (int) (qqsavnm), (bnfref_struct *) &qqnm, \ (int) (qqsavnd), (bnfref_struct *) &qqnd, \ (int) (qqoff), (int) (qqoff2) } #define idef(qqnme,qqval) \ bnfIdef_struct qqnme = { bnfI, #qqnme, (int) (qqval) } #define ldef(qqnme,qqdflgs,qqtxt) \ bnfLdef_struct qqnme = { bnfL, #qqnme, (flags) (qqdflgs), (char *) (qqtxt) } #define gref(qqnme,qqref,qquflgs,qqoff,qqsep) \ bnfGref_struct qqnme = { bnfG, #qqnme, (bnfdef_struct *) &qqref, \ (flags) (qquflgs), (int) (qqoff), \ (bnfref_struct *) &qqsep } #define npref(qqnme,qqref,qquflgs,qqsep) \ bnfNPref_struct qqnme = { bnfNP, #qqnme, (bnfdef_struct *) &qqref, \ (flags) (qquflgs), (int) 0, (bnfref_struct *) &qqsep } #define pref(qqnme,qqref,qquflgs,qqoff,qqsep) \ bnfPref_struct qqnme = { bnfP, #qqnme, (bnfdef_struct *) &qqref, \ (flags) (qquflgs), (int) (qqoff), \ (bnfref_struct *) &qqsep } #define tref(qqnme,qqref,qquflgs,qqoff) \ bnfTref_struct qqnme = { bnfT, #qqnme, (bnfdef_struct *) &qqref, \ (flags) qquflgs, (int) qqoff } #define dfref(qqnme,qqref) \ bnfLBref_struct qqnme = { bnfDS, #qqnme, (bnfdef_struct *) &qqref, (flags) 0 } #define dbref(qqnme,qqref) \ bnfLBref_struct qqnme = { bnfDL, #qqnme, (bnfdef_struct *) &qqref, (flags) 0 } #define rfref(qqnme,qqref) \ bnfLBref_struct qqnme = { bnfRS, #qqnme, (bnfdef_struct *) &qqref, (flags) 0 } #define rbref(qqnme,qqref) \ bnfLBref_struct qqnme = { bnfRL, #qqnme, (bnfdef_struct *) &qqref, (flags) 0 } #define iref(qqnme,qqref,qqoff) \ bnfIref_struct qqnme = { bnfI, #qqnme, (bnfdef_struct *) &qqref, \ (flags) 0, (int) qqoff } #define lref(qqnme,qqref) \ bnfLref_struct qqnme = { bnfL, #qqnme, (bnfdef_struct *) &qqref, (flags) 0 } #ifndef DYLP_NDEBUG /* This set of definitions sets the bnfdebug flag, but doesn't add a separate uflgs parameter (we don't want to lead the user to think any of the others are valid). */ #define dfrefdbg(qqnme,qqref) \ bnfLBref_struct qqnme = { bnfDS, #qqnme, (bnfdef_struct *) &qqref, \ (flags) bnfdebug } #define dbrefdbg(qqnme,qqref) \ bnfLBref_struct qqnme = { bnfDL, #qqnme, (bnfdef_struct *) &qqref, \ (flags) bnfdebug } #define rfrefdbg(qqnme,qqref) \ bnfLBref_struct qqnme = { bnfRS, #qqnme, (bnfdef_struct *) &qqref, \ (flags) bnfdebug } #define rbrefdbg(qqnme,qqref) \ bnfLBref_struct qqnme = { bnfRL, #qqnme, (bnfdef_struct *) &qqref, \ (flags) bnfdebug } #define lrefdbg(qqnme,qqref) \ bnfLref_struct qqnme = { bnfL, #qqnme, (bnfdef_struct *) &qqref, \ (flags) bnfdebug } #endif /* DYLP_NDEBUG */ /* Last, but not least, some declarations to allow the use of the bnf reader. rdrinit and rdrclear initialize and clear the reader; they should bracket related groups of calls. parse is the main parsing routine. The union type parse_any is the appropriate thing to hold the result. */ typedef union { void *g ; char *c ; } parse_any ; extern void rdrinit(void),rdrclear(void) ; extern bool parse(ioid chn, struct bnfref_type3 *bnfid, parse_any *result) ; #ifndef DYLP_NDEBUG /* The control routine for the bnf debugging trace output. See the comments in bnfrdr.c for the proper use of the parameters. */ extern void bnfdbgctl(ioid dbgchn, bool dbgecho, bool warnzlbl, bool numlvl, bool tablvl) ; #else #define bnfdbgctl(dgbchn,dbgecho,warnzlbl,numlvl,tablvl) #endif /* Utility print routines from bnfrdrio.c. */ extern void prtbnfref(ioid chn, bool echo, bnfref_struct *ref), prtbnfdef(ioid chn, bool echo, bnfdef_struct *def) ; #endif /* _DYLIB_BNFRDR_H */ DyLP-1.6.0/DyLP/src/DylpStdLib/dylib_std.h0000644000076700007670000001446510632415522015035 0ustar #ifndef _DYLIB_STD_H #define _DYLIB_STD_H /* This file is part of the support library for the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* @(#)dylib_std.h 1.5 09/25/04 svn/cvs: $Id: dylib_std.h 148 2007-06-09 03:15:30Z lou $ */ /* This file contains common definitions. First thing to do is haul in the Ansi C standard definitions. Takes care of NULL plus a few more obscure definitions. Also haul in the standard library declarations. */ #include #include #include "DylpConfig.h" /* A utility definition which allows for easy suppression of unused variable warnings from GCC. Useful when a variable is used only for assert() statements, and for sccsid/cvsid strings. */ #ifndef UNUSED # if defined(_GNU_SOURCE) || defined(__GNUC__) # define UNUSED __attribute__((unused)) # else # define UNUSED # endif #endif /* Memory copy functions --- memcpy, memset, and other less common ones. */ #include /* We need a boolean type. Never could understand why C doesn't have this. [Aug 10, 01] For compatibility with C++, TRUE and FALSE are defined to be the corresponding C++ values. BOOL should be set in the compiler command line to be the storage type (char/short/int/long) that matches the size of a C++ "bool". All these are necessary to link with and be called by C++ code in osi-bonsai. */ #ifndef __cplusplus #define FALSE 0 #define TRUE 1 # ifdef BOOL typedef BOOL bool ; # else /* You're in trouble. The likely source of the problem is that this file is being included in the course of a build controlled by a makefile that doesn't know about the booltype utility in the dylp distribution. See the Utils subdirectory, and also check the makefile for dylp to see how this is used. If you don't want to fiddle with your build control files, just build booltype, run it, and edit in the appropriate definition. If you're not worried about C++ compatibility, int is a good as anything. */ # warning The compile-time symbol BOOL is not defined (dylib_std.h) typedef int bool ; # endif #endif #ifdef __cplusplus #ifndef FALSE # define FALSE false #endif #ifndef TRUE # define TRUE true #endif #endif /* flags is used to indicate a data type composed of one-bit flags. Manipulated with the set of flag manipulation macros defined below. */ typedef unsigned int flags ; #define setflg(zz_flgs,zz_flg) ((zz_flgs) |= (zz_flg)) #define clrflg(zz_flgs,zz_flg) ((zz_flgs) &= ~(zz_flg)) #define comflg(zz_flgs,zz_flg) ((zz_flgs) ^= (zz_flg)) #define getflg(zz_flgs,zz_flg) ((zz_flgs)&(zz_flg)) #define flgon(zz_flgs,zz_flg) ((zz_flgs)&(zz_flg)?TRUE:FALSE) #define flgoff(zz_flgs,zz_flg) ((zz_flgs)&(zz_flg)?FALSE:TRUE) #define flgall(zz_flgs,zz_flg) ((((zz_flgs)&(zz_flg)) == (zz_flg))?TRUE:FALSE) /* lnk_struct is a general-purpose linked list structure. Field Description ----- ----------- llnxt pointer to the next list element llval pointer to the associated value */ typedef struct lnk_struct_tag { struct lnk_struct_tag *llnxt ; void *llval ; } lnk_struct ; #define lnk_in(qqlnk,qqval) ((qqlnk)->llval = (void *) (qqval)) #define lnk_out(qqlnk,qqtype) ((qqtype) (qqlnk)->llval) /* Max and min macros */ #define minn(qa,qb) (((qa) > (qb))?(qb):(qa)) #define maxx(qa,qb) (((qa) > (qb))?(qa):(qb)) /* Some macros to hide the memory allocation functions. The serious debugging versions of these macros (MALLOC_DEBUG = 2) use outfmt from the io library and assume the existence of a string, rtnnme (typically the name of the current subroutine) that's used to identify the origin of the message. There's enough information in the messages to track the allocation and deallocation of blocks, should you not have access to an interactive debugger with this capability. The casual debugging versions (MALLOC_DEBUG = 1) only check for a return value of 0 and print a message to stderr with the file and line number. This at least tells you when your code has core dumped because it ran out of space (as opposed to a bug you can actually fix). */ #if (MALLOC_DEBUG == 2) #include "dylib_io.h" void *zz_ptr_zz ; ioid zz_chn_zz ; #define MALLOC_DBG_INIT(chn) ( zz_chn_zz = chn ) #define MALLOC(zz_sze_zz) \ ( zz_ptr_zz = (void *) malloc(zz_sze_zz), \ outfmt(zz_chn_zz,FALSE,":malloc: %d bytes at %#08x in %s.\n", \ zz_sze_zz,zz_ptr_zz,rtnnme), \ zz_ptr_zz ) #define CALLOC(zz_cnt_zz,zz_sze_zz) \ ( zz_ptr_zz = (void *) calloc(zz_cnt_zz,zz_sze_zz), \ outfmt(zz_chn_zz,FALSE,":calloc: %d (%d*%d) bytes at %#08x in %s.\n", \ zz_cnt_zz*zz_sze_zz,zz_cnt_zz,zz_sze_zz,zz_ptr_zz,rtnnme), \ zz_ptr_zz ) #define REALLOC(zz_rptr_zz,zz_sze_zz) \ ( zz_ptr_zz = (void *) realloc(zz_rptr_zz,zz_sze_zz), \ outfmt(zz_chn_zz,FALSE, \ ":realloc: %#08x changed to %d bytes at %#08x in %s.\n", \ zz_rptr_zz,zz_sze_zz,zz_ptr_zz,rtnnme), \ zz_ptr_zz ) #define FREE(zz_fptr_zz) \ ( outfmt(zz_chn_zz,FALSE,":free: %#08x in %s.\n",zz_fptr_zz,rtnnme), \ free((void *) zz_fptr_zz) ) #elif (MALLOC_DEBUG == 1) #include void *zz_ptr_zz ; #define MALLOC(zz_sze_zz) \ ( zz_ptr_zz = (void *) malloc(zz_sze_zz), \ (zz_ptr_zz != 0)?0:\ fprintf(stderr,":malloc: failed to get %d bytes at %s:%d.\n", \ zz_sze_zz,__FILE__,__LINE__), \ zz_ptr_zz ) #define CALLOC(zz_cnt_zz,zz_sze_zz) \ ( zz_ptr_zz = (void *) calloc(zz_cnt_zz,zz_sze_zz), \ (zz_ptr_zz != 0)?0:\ fprintf(stderr,":calloc: failed to get %d bytes at %s:%d.\n", \ zz_sze_zz*zz_cnt_zz,__FILE__,__LINE__), \ zz_ptr_zz ) #define REALLOC(zz_rptr_zz,zz_sze_zz) \ ( zz_ptr_zz = (void *) realloc(zz_rptr_zz,zz_sze_zz), \ (zz_ptr_zz != 0)?0:\ fprintf(stderr,":realloc: failed to get %d bytes at %s:%d.\n", \ zz_sze_zz,__FILE__,__LINE__), \ zz_ptr_zz ) #define FREE(zz_fptr_zz) free((void *) zz_fptr_zz) #else #define MALLOC_DBG_INIT(chn) #define MALLOC(zz_sze_zz) malloc(zz_sze_zz) #define CALLOC(zz_cnt_zz,zz_sze_zz) calloc(zz_cnt_zz,zz_sze_zz) #define REALLOC(zz_rptr_zz,zz_sze_zz) realloc(zz_rptr_zz,zz_sze_zz) #define FREE(zz_fptr_zz) free((void *) zz_fptr_zz) #endif #endif /* _DYLIB_STD_H */ DyLP-1.6.0/DyLP/src/DylpStdLib/dylib_bnfrdrio.c0000644000076700007670000003261010700502137016026 0ustar /* This file is part of the support library for the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This module contains utility print routines which will dump a bnf data structure in a (more-or-less) human readable format. */ #include "dylib_std.h" static char sccsid[] UNUSED = "@(#)bnfrdrio.c 2.3 09/25/04" ; static char svnid[] UNUSED = "$Id: dylib_bnfrdrio.c 181 2007-10-02 17:48:15Z lou $" ; #include "dylib_io.h" #include "dylib_bnfrdr.h" static const char *prtbnftype (bnftype_enum type) /* This routine returns a pointer to the string representation of the bnf type. Parameter: type: a bnf type Returns: string representation. */ { static char badtype[30] ; int fldsze ; switch (type) { case bnfG: return ("G") ; case bnfNP: return ("NP") ; case bnfP: return ("P") ; case bnfT: return ("T") ; case bnfDS: return ("DF") ; case bnfDL: return ("DB") ; case bnfRS: return ("RF") ; case bnfRL: return ("RB") ; case bnfI: return ("I") ; case bnfL: return ("L") ; default: { fldsze = sizeof(badtype)-1 ; dyio_outfxd(badtype,-fldsze,'l',"bad bnf type (%d)",type) ; return (badtype) ; } } } static const char *prtbnfttype (bnfttype_enum ttype) /* This routine returns a pointer to the string representation of the terminal type. Parameter: ttype: a terminal type Returns: string representation. */ { static char badtype[40] ; int fldsze ; switch (ttype) { case bnfttNIL: return ("NIL") ; case bnfttN: return ("N") ; case bnfttID: return ("ID") ; case bnfttD: return ("D") ; case bnfttF: return ("F") ; case bnfttQ: return ("Q") ; default: { fldsze = sizeof(badtype)-1 ; dyio_outfxd(badtype,-fldsze,'l',"bad terminal type (%d)",ttype) ; return (badtype) ; } } } /* prtdefname and prtrefname are basically identical, but we need two to avoid playing yet more games with unions and casts. A null def or ref parameter is an error, and a null name field is most likely an error (indicating incorrect initialisation or overwriting of the structure), but valid strings are returned in both cases. */ static void prtdefname (ioid chn, bool echo, bnfdef_struct *def) /* Parameters: chn: stream id from openfile. echo: TRUE to echo to stdout def: a bnf reference Returns: undefined */ { if (def == NULL) dyio_outfmt(chn,echo,"<>") ; else if (def->name == NULL) dyio_outfmt(chn,echo,"unnamed(%#08x)",def) ; else dyio_outfmt(chn,echo,"%s",def->name) ; return ; } static void prtrefname (ioid chn, bool echo, bnfref_struct *ref) /* Parameters: chn: stream id from openfile. echo: TRUE to echo to stdout ref: a bnf reference Returns: undefined */ { if (ref == NULL) dyio_outfmt(chn,echo,"<>") ; else if (ref->name == NULL) dyio_outfmt(chn,echo,"unnamed(%#08x)",ref) ; else dyio_outfmt(chn,echo,"%s",ref->name) ; return ; } static void prtstring (ioid chn, bool echo, const char *string) /* This routine prints a text string, or * if the string is null. Parameters: chn: stream id from openfile. echo: TRUE to echo to stdout string: text string Returns: undefined */ { if (string != NULL) dyio_outfmt(chn,echo,"\"%s\"",string) ; else dyio_outchr(chn,echo,'*') ; } static void prtstore (ioid chn, bool echo, bnfref_any ref) /* This routine prints the storage directions in a bnf reference. Parameters: chn: stream id from openfile. ref: a bnf reference Returns: undefined */ { if (flgon(ref.t2->uflgs,bnfstore) == TRUE || ref.t2->type == bnfI) { if (flgon(ref.t2->uflgs,bnfatsgn) == TRUE) dyio_outchr(chn,echo,'@') ; dyio_outfmt(chn,echo,"%d",ref.t2->offset) ; } else dyio_outchr(chn,echo,'*') ; } static void prtlst (ioid chn, bool echo, struct bnfref_type3 *ref) /* This routine prints the list information in a bnf reference. Parameter: chn: stream id from openfile. ref: a bnf reference Returns: undefined */ { if (flgon(ref->uflgs,bnflst) == TRUE) { if (flgon(ref->uflgs,bnfstbg) == TRUE) dyio_outchr(chn,echo,'@') ; prtrefname(chn,echo,(bnfref_struct *) ref) ; } else dyio_outchr(chn,echo,'*') ; } static void prtlbl (ioid chn, bool echo, bnflblsrc_enum code, bnfref_struct *src) /* This routine prints the information in the code and src fields of a label definition. Parameters: chn: stream id from openfile code: value of nmcd or ndcd field. src: value of nmsrc or ndsrc field. Returns: undefined */ { switch (code) { case bnfncBNF: { prtrefname(chn,echo,src) ; break ; } case bnfncS: { dyio_outfmt(chn,echo,"%%%d",addrToInt(src)) ; break ; } case bnfncC: { dyio_outchr(chn,echo,'c') ; break ; } case bnfncN: { dyio_outchr(chn,echo,'n') ; break ; } default: { dyio_outfmt(chn,echo,"invalid! (%d)",code) ; break ; } } } static void prtlblsav (ioid chn, bool echo, int flg, bnfLBdef_struct *def) /* This routine prints the save information for a label definition. Parameters: chn: stream id from openfile. flg: either bnfsvnd or bnfsvnm. def: a label definition Returns: undefined */ { if (flgon(def->dflgs,flg) == TRUE) switch (flg) { case bnfsvnd: { dyio_outfmt(chn,echo,"%%%d",def->savnd) ; break ; } case bnfsvnm: { dyio_outfmt(chn,echo,"%%%d",def->savnm) ; break ; } } else dyio_outchr(chn,echo,'*') ; } void prtbnfref (ioid chn, bool echo, bnfref_struct *bnfref) /* This routine prints a bnf reference data structure in a (sort of) human readable format. Parameters: chn: stream id, obtained from openfile. ref: bnf reference. Returns: undefined */ { bnfref_any ref ; /* Check that ref is non-null - print if it isn't. */ ref.com = bnfref ; if (ref.com == NULL) { dyio_outfmt(chn,echo,"") ; return ; } /* Print the basics: type, name, and name of associated definition. */ dyio_outfmt(chn,echo,"<%s,",prtbnftype(ref.com->type)) ; prtrefname(chn,echo,ref.com) ; dyio_outfmt(chn,echo,"->") ; prtdefname(chn,echo,ref.com->defn) ; /* And flesh out with the remainder of the type-specific information. */ switch (ref.com->type) { case bnfG: { dyio_outchr(chn,echo,',') ; prtstore(chn,echo,ref) ; dyio_outchr(chn,echo,',') ; prtlst(chn,echo,ref.t3) ; break ; } case bnfNP: { dyio_outchr(chn,echo,',') ; prtlst(chn,echo,ref.t3) ; break ; } case bnfP: { dyio_outchr(chn,echo,',') ; if (flgon(ref.P->uflgs,bnfsv) == TRUE) dyio_outfmt(chn,echo,"%%%d",ref.P->offset) ; else prtstore(chn,echo,ref) ; dyio_outchr(chn,echo,',') ; prtlst(chn,echo,ref.t3) ; break ; } case bnfT: { dyio_outchr(chn,echo,',') ; if (flgon(ref.T->uflgs,bnfflt) == TRUE) dyio_outfmt(chn,echo,"flt,") ; if (flgon(ref.T->uflgs,bnfdbl) == TRUE) dyio_outfmt(chn,echo,"dbl,") ; if (flgon(ref.T->uflgs,bnfcs) == TRUE) dyio_outfmt(chn,echo,"cs,") ; if (flgon(ref.T->uflgs,bnfmin) == TRUE) dyio_outfmt(chn,echo,"min,") ; if (flgon(ref.T->uflgs,bnfexact) == TRUE) dyio_outfmt(chn,echo,"exact,") ; prtstore(chn,echo,ref) ; break ; } case bnfI: { dyio_outchr(chn,echo,',') ; prtstore(chn,echo,ref) ; break ; } case bnfDS: case bnfDL: case bnfRS: case bnfRL: case bnfL: { break ; } default: { break ; } } dyio_outchr(chn,echo,'>') ; } void prtbnfdef (ioid chn, bool echo, bnfdef_struct *bnfdef) /* This routine prints a bnf definition in (sort of) human readable format. Parameters: chn: stream id as returned from openfile def: a bnf definition Returns: undefined */ { bnfdef_any def ; bnfref_struct ***altrefs,**comprefs ; int altnum,altndx,compnum,compndx ; const char *txm1 = "|\n\t" ; /* Suppress compiler warning. */ comprefs = NULL ; /* Check that bnfdef is non-null - print if it isn't. */ def.com = bnfdef ; if (def.com == NULL) { dyio_outfmt(chn,echo,"") ; return ; } /* Print the definition header first: type and name. */ dyio_outfmt(chn,echo,"\n<%s,",prtbnftype(def.com->type)) ; prtdefname(chn,echo,def.com) ; if (def.com->type == bnfG) { dyio_outfmt(chn,echo,",%d,",def.G->size) ; if (def.G->link >= 0) dyio_outfmt(chn,echo,"%d",def.G->link) ; else dyio_outchr(chn,echo,'*') ; } dyio_outfmt(chn,echo,"> ::= ") ; /* And now the body of the definition. */ switch (def.com->type) { case bnfG: { comprefs = def.G->comps ; if (comprefs != NULL) compnum = addrToInt(*comprefs++) ; else compnum = 0 ; for (compndx = 0 ; compndx < compnum ; compndx++) prtbnfref(chn,echo,*comprefs++) ; break ; } case bnfNP: { altrefs = def.NP->alts ; if (altrefs != NULL) { altnum = addrToInt(*altrefs++) ; comprefs = *altrefs++ ; } else altnum = 0 ; for (altndx = 0 ; altndx < altnum ; altndx++, comprefs = *altrefs++) { if (comprefs != NULL) { compnum = addrToInt(*comprefs++) ; for (compndx = 0 ; compndx < compnum ; compndx++) prtbnfref(chn,echo,*comprefs++) ; } else dyio_outfmt(chn,echo,"",altndx+1) ; if (altndx < altnum-1) dyio_outfmt(chn,echo,txm1) ; } break ; } case bnfP: { altrefs = def.P->alts ; if (altrefs != NULL) { altnum = addrToInt(*altrefs++) ; comprefs = *altrefs++ ; } else altnum = 0 ; for (altndx = 0 ; altndx < altnum ; altndx++, comprefs = *altrefs++) { if (comprefs != NULL) { compnum = addrToInt(*comprefs++) ; for (compndx = 0 ; compndx < compnum ; compndx++) prtbnfref(chn,echo,*comprefs++) ; } else dyio_outfmt(chn,echo,"",altndx+1) ; if (altndx < altnum-1) dyio_outfmt(chn,echo,txm1) ; } break ; } case bnfT: { dyio_outfmt(chn,echo,"<%s",prtbnfttype(def.T->ttype)) ; switch (def.T->ttype) { case bnfttNIL: { break ; } case bnfttN: { dyio_outfmt(chn,echo,"(%d),",def.T->parm1) ; prtstring(chn,echo,def.T->val) ; break ; } case bnfttID: { prtstring(chn,echo,def.T->val) ; break ; } case bnfttD: { prtstring(chn,echo,def.T->val) ; break ; } case bnfttF: { dyio_outfmt(chn,echo,"(%d),",def.T->parm1) ; prtstring(chn,echo,def.T->val) ; break ; } case bnfttQ: { dyio_outchr(chn,echo,'(') ; if (def.T->qschr < ' ') dyio_outfmt(chn,echo,"%#02x",def.T->qschr) ; else dyio_outchr(chn,echo,def.T->qschr) ; dyio_outchr(chn,echo,',') ; if (def.T->qechr < ' ') dyio_outfmt(chn,echo,"%#02x",def.T->qechr) ; else dyio_outchr(chn,echo,def.T->qechr) ; dyio_outfmt(chn,echo,"),") ; prtstring(chn,echo,def.T->val) ; break ; } } dyio_outchr(chn,echo,'>') ; break ; } case bnfDS: case bnfDL: { dyio_outchr(chn,echo,'<') ; if (flgon(def.LB->dflgs,bnfadv) == TRUE) dyio_outfmt(chn,echo,"a,") ; else dyio_outfmt(chn,echo,"b,") ; prtlbl(chn,echo,def.LB->nmcd,def.LB->nmsrc) ; dyio_outchr(chn,echo,',') ; prtlblsav(chn,echo,bnfsvnm,def.LB) ; dyio_outchr(chn,echo,',') ; prtlbl(chn,echo,def.LB->ndcd,def.LB->ndsrc) ; dyio_outfmt(chn,echo,"(%d)",def.LB->offset) ; dyio_outchr(chn,echo,',') ; prtlblsav(chn,echo,bnfsvnd,def.LB) ; dyio_outchr(chn,echo,'>') ; break ; } case bnfRS: case bnfRL: { dyio_outchr(chn,echo,'<') ; if (flgon(def.LB->dflgs,bnfadv) == TRUE) dyio_outfmt(chn,echo,"a,") ; else dyio_outfmt(chn,echo,"b,") ; prtlbl(chn,echo,def.LB->nmcd,def.LB->nmsrc) ; dyio_outfmt(chn,echo,"(%d)",def.LB->offset) ; dyio_outchr(chn,echo,',') ; prtlblsav(chn,echo,bnfsvnm,def.LB) ; dyio_outchr(chn,echo,',') ; prtlbl(chn,echo,def.LB->ndcd,def.LB->ndsrc) ; dyio_outfmt(chn,echo,"(%d)",def.LB->offset2) ; dyio_outchr(chn,echo,',') ; prtlblsav(chn,echo,bnfsvnd,def.LB) ; dyio_outchr(chn,echo,'>') ; break ; } case bnfI: { dyio_outfmt(chn,echo,"<%d>",def.I->ival) ; break ; } case bnfL: { dyio_outchr(chn,echo,'<') ; if (flgon(def.L->dflgs,bnfsvnm) == TRUE) dyio_outfmt(chn,echo,"%%%d",addrToInt(def.L->txt)) ; else prtstring(chn,echo,def.L->txt) ; dyio_outchr(chn,echo,'>') ; break ; } } } #ifndef DYLP_NDEBUG void printtab (ioid chn, bool echo, int nestlvl, bool numlvl, bool tablvl) /* Utility routine to print optional line numbers and tab leadering for debugging trace lines. Parameters: chn: i/o id for trace output echo: TRUE to echo trace to stdout nestlvl: nesting level of the trace line numlvl: TRUE to print the nesting level at the left of the line tablvl: TRUE to show nesting level with indentation */ { int tabcnt ; if (numlvl == TRUE) { dyio_outfmt(chn,echo,"%2d: ",nestlvl) ; nestlvl-- ; } /* Change the field with in the dyio_outfmt statement to change the amount of indentation per level. */ if (tablvl == TRUE) { for (tabcnt = nestlvl ; tabcnt > 0 ; tabcnt--) { dyio_outfmt(chn,echo,"%4s"," ") ; } } return ; } #endif /* DYLP_NDEBUG */ DyLP-1.6.0/DyLP/src/DylpStdLib/Makefile.in0000644000076700007670000004600710752705544014762 0ustar # Makefile.in generated by automake 1.9.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2006 International Business Machines and others. # All Rights Reserved. # This file is distributed under the Common Public License. # Author: Andreas Waechter IBM 2006-04-13 srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/DylpStdLib DIST_COMMON = $(includecoin_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ac_c_add_to_includes.m4 \ $(top_srcdir)/m4/ac_c_get_sunpro_libs.m4 \ $(top_srcdir)/m4/ac_dylp_equiv_for_cpp_bool.m4 \ $(top_srcdir)/m4/ac_dylp_find_fp_funcs.m4 \ $(top_srcdir)/m4/ac_dylp_fix_cppflags.m4 \ $(top_srcdir)/m4/ac_dylp_options.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/inc/config_dylp.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libDylpStdLib_la_LIBADD = am_libDylpStdLib_la_OBJECTS = dylib_binsrch.lo dylib_bnfrdr.lo \ dylib_bnfrdrio.lo dylib_errs.lo dylib_hash.lo dylib_io.lo \ dylib_littab.lo dylib_strrtns.lo libDylpStdLib_la_OBJECTS = $(am_libDylpStdLib_la_OBJECTS) depcomp = $(SHELL) $(top_srcdir)/../depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(libDylpStdLib_la_SOURCES) DIST_SOURCES = $(libDylpStdLib_la_SOURCES) am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; am__installdirs = "$(DESTDIR)$(includecoindir)" includecoinHEADERS_INSTALL = $(INSTALL_HEADER) HEADERS = $(includecoin_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADDLIBS = @ADDLIBS@ ADD_CFLAGS = @ADD_CFLAGS@ ADD_CXXFLAGS = @ADD_CXXFLAGS@ ALWAYS_FALSE_FALSE = @ALWAYS_FALSE_FALSE@ ALWAYS_FALSE_TRUE = @ALWAYS_FALSE_TRUE@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AUX_DIR = @AUX_DIR@ AWK = @AWK@ BUILDTOOLSDIR = @BUILDTOOLSDIR@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CDEFS = @CDEFS@ # Here list all include flags, relative to this "srcdir" directory. This # "cygpath" stuff is necessary to compile with native compilers on Windows CFLAGS = @CFLAGS@ COINUTILSDOCDIR = @COINUTILSDOCDIR@ COINUTILSOBJDIR = @COINUTILSOBJDIR@ COINUTILSSRCDIR = @COINUTILSSRCDIR@ COIN_HAS_COINUTILS_FALSE = @COIN_HAS_COINUTILS_FALSE@ COIN_HAS_COINUTILS_TRUE = @COIN_HAS_COINUTILS_TRUE@ COIN_HAS_DYLP_FALSE = @COIN_HAS_DYLP_FALSE@ COIN_HAS_DYLP_TRUE = @COIN_HAS_DYLP_TRUE@ COIN_HAS_OSI_FALSE = @COIN_HAS_OSI_FALSE@ COIN_HAS_OSI_TRUE = @COIN_HAS_OSI_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEFS = @CXXDEFS@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DBG_CFLAGS = @DBG_CFLAGS@ DBG_CXXFLAGS = @DBG_CXXFLAGS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DYLPDOCDIR = @DYLPDOCDIR@ DYLPOBJDIR = @DYLPOBJDIR@ DYLPSRCDIR = @DYLPSRCDIR@ DYLP_ERRMSGDIR = @DYLP_ERRMSGDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FADDLIBS = @FADDLIBS@ FFLAGS = @FFLAGS@ HAVE_EXTERNALS_FALSE = @HAVE_EXTERNALS_FALSE@ HAVE_EXTERNALS_TRUE = @HAVE_EXTERNALS_TRUE@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBEXT = @LIBEXT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLM4 = @LIBTOOLM4@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_LDFLAGS = @LT_LDFLAGS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ MPICC = @MPICC@ MPICXX = @MPICXX@ OBJEXT = @OBJEXT@ OPT_CFLAGS = @OPT_CFLAGS@ OPT_CXXFLAGS = @OPT_CXXFLAGS@ OSIDOCDIR = @OSIDOCDIR@ OSIOBJDIR = @OSIOBJDIR@ OSISRCDIR = @OSISRCDIR@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ RPATH_FLAGS = @RPATH_FLAGS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ VPATH_DISTCLEANFILES = @VPATH_DISTCLEANFILES@ abs_bin_dir = @abs_bin_dir@ abs_include_dir = @abs_include_dir@ abs_lib_dir = @abs_lib_dir@ abs_source_dir = @abs_source_dir@ ac_c_preproc_warn_flag = @ac_c_preproc_warn_flag@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ ac_cxx_preproc_warn_flag = @ac_cxx_preproc_warn_flag@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ have_autoconf = @have_autoconf@ have_automake = @have_automake@ have_svn = @have_svn@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sol_cc_compiler = @sol_cc_compiler@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ AUTOMAKE_OPTIONS = foreign ######################################################################## # libDylpStdLib # ######################################################################## # Name of the library compiled in this directory. We don't want it to be installed # since it will be included in the libDylp library noinst_LTLIBRARIES = libDylpStdLib.la # List all source files for this library, including headers libDylpStdLib_la_SOURCES = \ DylpConfig.h \ dylib_binsrch.c \ dylib_bnfrdr.c dylib_bnfrdr.h \ dylib_bnfrdrio.c \ dylib_errs.c dylib_errs.h \ dylib_fortran.h \ dylib_hash.c dylib_hash.h \ dylib_io.c dylib_io.h \ dylib_keytab.h \ dylib_littab.c \ dylib_std.h \ dylib_strrtns.c dylib_strrtns.h # This is for libtool (on Windows) libDylpStdLib_la_LDFLAGS = $(LT_LDFLAGS) # This line is necessary to allow VPATH compilation with MS compilers # on Cygwin DEFAULT_INCLUDES = -I. -I`$(CYGPATH_W) $(srcdir)` -I$(top_builddir)/inc ######################################################################## # Headers that need to be installed # ######################################################################## # Here list all the header files that are required by a user of the library, # and that therefore should be installed in 'install/coin' includecoindir = $(includedir)/coin includecoin_HEADERS = \ ../../inc/config_dylp.h \ dylib_errs.h \ dylib_hash.h \ dylib_io.h \ dylib_std.h \ dylib_strrtns.h ############################################################################# # Create the Config.h file that always defines HAVE_CONFIG_H and install it # ############################################################################# # You only need to adapt the following line ConfigHeader = DylpConfig.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/DylpStdLib/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign src/DylpStdLib/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libDylpStdLib.la: $(libDylpStdLib_la_OBJECTS) $(libDylpStdLib_la_DEPENDENCIES) $(LINK) $(libDylpStdLib_la_LDFLAGS) $(libDylpStdLib_la_OBJECTS) $(libDylpStdLib_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dylib_binsrch.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dylib_bnfrdr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dylib_bnfrdrio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dylib_errs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dylib_hash.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dylib_io.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dylib_littab.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dylib_strrtns.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: install-includecoinHEADERS: $(includecoin_HEADERS) @$(NORMAL_INSTALL) test -z "$(includecoindir)" || $(mkdir_p) "$(DESTDIR)$(includecoindir)" @list='$(includecoin_HEADERS)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(includecoinHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(includecoindir)/$$f'"; \ $(includecoinHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(includecoindir)/$$f"; \ done uninstall-includecoinHEADERS: @$(NORMAL_UNINSTALL) @list='$(includecoin_HEADERS)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(includecoindir)/$$f'"; \ rm -f "$(DESTDIR)$(includecoindir)/$$f"; \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(mkdir_p) $(distdir)/../../inc @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(includecoindir)"; do \ test -z "$$dir" || $(mkdir_p) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-libtool distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-includecoinHEADERS install-exec-am: install-exec-local install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-includecoinHEADERS uninstall-info-am \ uninstall-local .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-exec \ install-exec-am install-exec-local install-includecoinHEADERS \ install-info install-info-am install-man install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-includecoinHEADERS \ uninstall-info-am uninstall-local install-exec-local: echo "#ifndef HAVE_CONFIG_H" >bla echo "#define HAVE_CONFIG_H" >>bla echo "#endif" >> bla cat $(srcdir)/$(ConfigHeader) >> bla $(install_sh_DATA) bla $(DESTDIR)$(includecoindir)/$(ConfigHeader) rm -f bla uninstall-local: rm -f $(DESTDIR)$(includecoindir)/$(ConfigHeader) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: DyLP-1.6.0/DyLP/src/DylpStdLib/dylib_littab.c0000644000076700007670000000736210632415522015513 0ustar /* This file is part of the support library for the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* The routines in this file implement a package for storage and allocation of text strings. The package stores all strings in a hash table, merging identical strings. A count is maintained of the number of outstanding references to the string. There are two access routines, stralloc for inserting strings and strfree for releasing them. I/O is handled entirely by stdio facilities unless the malloc debugging macros (dylib_std.h) are compiled in, in which case the io library is needed. */ #include "dylib_std.h" static char sccsid[] UNUSED = "@(#)littab.c 1.4 09/25/04" ; static char svnid[] UNUSED = "$Id: dylib_littab.c 148 2007-06-09 03:15:30Z lou $" ; #include #include "dylib_hash.h" /* Definition of litent data structure. Field Definition ----- ---------- refs Reference count for this string text Pointer to the string */ typedef struct litent_internal { int refs ; char *text ; } litent ; /* ANSI C specifies that littable will be initialised to NULL; this is important. */ #define LITTABLESIZE 2039 static hel *littable[LITTABLESIZE] ; const char *stralloc (const char *string) /* This routine is called by the user to allocate a permanent copy of string. In reality, it will search the hash table for an entry corresponding to string. If it finds one, it will increment the reference count and return a pointer to the string stored in the entry. If there is no existing entry, one is created, a copy of the string is made, and a pointer to this copy is returned. Parameters: string: text string Returns: pointer to a usable copy of string, or NULL in the event of an error. */ { litent *lit ; const char *rtnnme = "stralloc" ; if (string == NULL) { fprintf(stderr,"\n%s: null string parameter!\n",rtnnme) ; return (NULL) ; } lit = (litent *) lookup(string,littable,LITTABLESIZE) ; if (lit != NULL) { lit->refs++ ; return (lit->text) ; } lit = (litent *) MALLOC(sizeof(litent)) ; lit->text = MALLOC(strlen(string)+1) ; strcpy(lit->text,string) ; lit->refs = 1 ; if (enter(lit->text,littable,LITTABLESIZE,(char *) lit) == NULL) { fprintf(stderr,"\n%s: couldn't enter string \"%s\" in literal table!\n", rtnnme,string) ; FREE(lit->text) ; FREE(lit) ; return (NULL) ; } return (lit->text) ; } bool strfree (const char *string) /* This routine is called by the user to "free" a string. In reality, it will search the hash table for an entry corresponding to string. If it finds one, it will decrement the reference count. It is an error if there is no entry for string, which implies that at some point a pointer to the string was acquired without consulting this package. Parameter: string: text string Returns: TRUE if the string was successfully "freed", FALSE otherwise. */ { litent *lit ; const char *rtnnme = "strfree" ; if (string == NULL) { fprintf(stderr,"\n%s: null string parameter!\n",rtnnme) ; return (FALSE) ; } lit = (litent *) lookup(string,littable,LITTABLESIZE) ; if (lit == NULL) { fprintf(stderr,"\n%s: no entry for string \"%s\" in literal table!\n", rtnnme,string) ; return (FALSE) ; } if (--lit->refs == 0) { if (erase(lit->text,littable,LITTABLESIZE) == NULL) { fprintf(stderr,"\n%s: confusion deleting entry for string \"%s\"!\n", rtnnme,lit->text) ; return (FALSE) ; } FREE(lit->text) ; FREE(lit) ; } return (TRUE) ; } DyLP-1.6.0/DyLP/src/DylpStdLib/dylib_strrtns.c0000644000076700007670000000671010632415522015747 0ustar /* This file is part of the support library for the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains general purpose string manipulation routines. */ #include "dylib_std.h" static char sccsid[] UNUSED = "@(#)strrtns.c 1.5 09/25/04" ; static char svnid[] UNUSED = "$Id: dylib_strrtns.c 148 2007-06-09 03:15:30Z lou $" ; int cistrcmp (const char *str1, const char *str2) /* This routine compares two strings. It is insensitive to case ; both strings are converted to upper case before the comparison. Parameters: str1,str2: pointers to strings to be compared. strings should be null terminated Return value: -1 str1 lexicographically less than str2 0 str1 lexicographically equal to str2 1 str1 lexicographically greater than str2 */ { char cnv1,cnv2 ; while (!(*str1 == '\0' && *str2 == '\0')) { if (*str1 >= 'a' && *str1 <= 'z') cnv1 = *str1++-('a'-'A') ; else cnv1 = *str1++ ; if (*str2 >= 'a' && *str2 <= 'z') cnv2 = *str2++-('a'-'A') ; else cnv2 = *str2++ ; if (cnv1 < cnv2) return (-1) ; if (cnv1 > cnv2) return (1) ; } return (0) ; } int cimstrcmp (const char *str1, const char *str2) /* This routine compares two strings. It is insensitive to case ; both strings are converted to upper case before the comparison. If str1 is shorter than str2 but equal up to its end, this routine reports it as equal. Parameters: str1,str2: pointers to strings to be compared. strings should be null terminated Return value: -1 str1 lexicographically less than str2 0 str1 lexicographically equal to str2 (as described above) 1 str1 lexicographically greater than str2 */ { char cnv1,cnv2 ; while (!(*str1 == '\0' && *str2 == '\0')) { if (*str1 >= 'a' && *str1 <= 'z') cnv1 = *str1++-('a'-'A') ; else cnv1 = *str1++ ; if (*str2 >= 'a' && *str2 <= 'z') cnv2 = *str2++-('a'-'A') ; else cnv2 = *str2++ ; if (cnv1 < cnv2) { if (cnv1 == '\0') return (0) ; else return (-1) ; } if (cnv1 > cnv2) return (1) ; } return (0) ; } int mstrcmp (const char *str1, const char *str2) /* This routine compares two strings. If str1 is shorter than str2 but equal up to its end, this routine reports it as equal. The comparison is case sensitive. Parameters: str1,str2: pointers to strings to be compared. strings should be null terminated Return value: -1 str1 lexicographically less than str2 0 str1 lexicographically equal to str2 (as described above) 1 str1 lexicographically greater than str2 */ { for ( ; !(*str1 == '\0' && *str2 == '\0') ; str1++,str2++) { if (*str1 < *str2) { if (*str1 == '\0') return (0) ; else return (-1) ; } if (*str1 > *str2) return (1) ; } return (0) ; } char *strsave (const char *original) /* This routine copies the string pointed to by original into a new string and returns a pointer to the new string. Parameters: original pointer to string to be saved Return Value: normal: pointer to new copy of the string error: NULL */ { char *copy ; copy = MALLOC(strlen(original)+1) ; if (copy != NULL) strcpy(copy,original) ; return (copy) ; } DyLP-1.6.0/DyLP/src/DylpStdLib/dylib_errs.c0000644000076700007670000006134711033035711015204 0ustar /* This file is part of the support library for the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This is an error reporting/logging package. It contains routines to print formatted error and warning messages. The client passes a numeric identifier, along with any necessary parameters. The routines will look up the identifier in a file to find the associated error message and pass the message, with parameters, to printf. If the conditional compilation variable DYLP_NDEBUG is defined, the warn routine is converted to a complete noop. The error message file may be passed as a parameter to errinit, or specified using the environment variable ERRMSGTXT. Failing anything else, it will default to "errmsg.txt". In addition to reporting error messages via stderr, the package has provision for optionally logging error messages into a separate file, specified by elogchn. The conditional compilation variable _DYLIB_FORTRAN, when defined, will trigger the inclusion of code which provides an errmsg subroutine and interface usable from Fortran code. */ #include "dylib_std.h" static char sccsid[] UNUSED = "@(#)errs.c 3.13 11/11/04" ; static char svnid[] UNUSED = "$Id: dylib_errs.c 244 2008-07-03 02:39:05Z lou $" ; #include #include #ifndef MALLOC #define MALLOC(zz_sze_zz) malloc(zz_sze_zz) #endif /* emsgchn is the channel used to access the error message text file; elogchn is the channel used to access an error log file. errecho controls whether error messages go to stderr. */ static FILE *emsgchn,*elogchn ; static char *emsgname,*elogname ; static bool errecho ; /* The text of an error message (the unexpanded pattern) can be no longer than MAXERRTXT. */ #define MAXERRTXT 240 #define ERRPFXLEN 13 static char errtxt[MAXERRTXT+ERRPFXLEN] = "\n%s (error): " ; #ifndef DYLP_NDEBUG #define WARNPFXLEN 15 static char warntxt[MAXERRTXT+WARNPFXLEN] = "\n%s (warning): " ; #endif /* Only errmsg_, warn_, and a small bit of initialisation in errinit need the declarations of fortran.h. The file xmp.h is peculiar to the bonsai code with Fortran ylp and la05 libraries. */ #ifdef _DYLIB_FORTRAN # include "fortran.h" #endif void errinit (const char *emsgpath, char *elogpath, bool echo) /* This routine initializes the error reporting facilities. It attempts to open the error message file and an error logging file. Parameters: emsgpath: path name for the error message file (defaults to errmsg.txt) elogpath: path name for logging error messages (the default is to not log error messages) echo: TRUE if error messages should be echoed to stderr, FALSE otherwise. Returns: undefined */ { const char *rtnnme = "errinit" ; /* See if we can open a channel to the error message source text file. If we can't, we'll only be able to report routine names and error numbers. */ if (emsgpath == NULL) { emsgpath = getenv("ERRMSGTXT") ; if (emsgpath == NULL) emsgpath = "dy_errmsgs.txt" ; } emsgname = (char *) MALLOC(strlen(emsgpath)+1) ; strcpy(emsgname,emsgpath) ; emsgchn = fopen(emsgname,"r") ; if (emsgchn == NULL) { fprintf(stderr,"\n%s: couldn't open error message text file \"%s\".\n", rtnnme,emsgname) ; perror(rtnnme) ; fprintf(stderr,"\n%s: only numeric error codes will be reported.\n", rtnnme) ; } /* If a log file name has been supplied, try to open it. Keep the name locally for the benefit of errlogq, should it be called. */ if (elogpath == NULL) { elogchn = NULL ; elogname = NULL ; } else { elogname = (char *) MALLOC(strlen(elogpath)+1) ; strcpy(elogname,elogpath) ; elogchn = fopen(elogname,"w") ; if (elogchn == NULL) { fprintf(stderr,"\n%s: couldn't open error logging file \"%s\".\n", rtnnme,elogname) ; perror(rtnnme) ; } } errecho = echo ; #ifdef _DYLIB_FORTRAN /* Initialise a common block with the type codes used by Fortran when it calls errmsg_. */ argcod_.integer_code = ftnargINTEGER ; argcod_.double_precision_code = ftnargDOUBLE_PRECISION ; argcod_.character_code = ftnargCHARACTER ; argcod_.varname_code = ftnargVARNAME ; argcod_.conname_code = ftnargCONNAME ; argcod_.end_code = ftnargEND ; #endif return ; } void errterm (void) /* This routine cleans up data structures owned by the error package and closes the error file and log file, if present. Don't close stdin! ANSI stdio doesn't seem to provide a standard method for checking if a file is closed. A bit of testing says that ftell should be ok for testing normal files. Since we don't want to be closing stdin, stdout, or stderr, it's actually a feature to report an error for them. Parameters: none Returns: undefined. */ { char *rtnnme = "errterm" ; if (emsgchn != NULL && emsgchn != stdin && ftell(emsgchn) >= 0) { if (fclose(emsgchn) < 0) { fprintf(stderr,"\n%s: couldn't close error message file \"%s\".\n", emsgname,rtnnme) ; perror(rtnnme) ; } emsgchn = NULL ; } if (emsgname != NULL) { FREE(emsgname) ; emsgname = NULL ; } if (elogchn != NULL && elogchn != stdout && elogchn != stderr && ftell(elogchn) >= 0 ) { if (fclose(elogchn) < 0) { fprintf(stderr,"\n%s: couldn't close error log file \"%s\".\n", elogname,rtnnme) ; perror(rtnnme) ; } elogchn = NULL ; } if (elogname != NULL) { FREE(elogname) ; elogname = NULL ; } return ; } /* These next two routines are exported only to io.c in the default setup. They are used to allow the user to control the error log files through io.c */ FILE *errlogq (char **elogpath) /* This routine is here to keep the compartmentalisation of errs.c. Its sole purpose in life is to return the stdio FILE handle and path name for the error log file. Parameters: elogpath (o) Will be set to point to the name of the error log file, or NULL if no error log file is specified. Returns: the file handle, which will be NULL if no error log file exists. */ { *elogpath = elogname ; return (elogchn) ; } bool reseterrlogchn (const char *newpath, FILE *newchn, bool echo, bool close) /* Another routine solely dedicated to compartmentalisation. If newpath is non-NULL, the routine will reset the log file, opening it if newchn is NULL, otherwise using newchn. The errecho flag is set to echo. Parameters: newpath: new path for the log file; ignored if NULL newchn: new handle for the log file channel; ignored if NULL echo: TRUE if errors should be echoed to stderr, FALSE otherwise. close: TRUE of the old file should be closed, FALSE otherwise. Returns: TRUE if the new file is opened successfully, FALSE otherwise (note that failure to close the old file still gets a TRUE return) */ { bool success ; const char *rtnnme = "reseterrlogchn" ; /* If newchn is NULL, try to open the specified path. Retain the previous settings if we can't open the new file. If newchn isn't NULL, use it without question. There's the possibility the user has called us only to change the echo, in which case newpath will be NULL. */ success = TRUE ; if (newpath != NULL) { if (newchn == NULL) { newchn = fopen(newpath,"w") ; if (newchn == NULL) { fprintf(stderr,"\n%s: couldn't open error logging file \"%s\".\n", rtnnme,newpath) ; perror(rtnnme) ; fprintf(stderr,"\n%s: retaining previous file \"%s\".\n", rtnnme,elogname) ; success = FALSE ; } } if (success == TRUE) { if (close == TRUE) { if (fclose(elogchn) == EOF) { fprintf(stderr, "\n%s: couldn't close previous error logging file \"%s\".\n", rtnnme,elogname) ; perror(rtnnme) ; } } elogchn = newchn ; if (elogname != NULL) FREE(elogname) ; elogname = (char *) MALLOC(strlen(newpath)+1) ; strcpy(elogname,newpath) ; } } errecho = echo ; return (success) ; } static char *finderrmsg (int errid, char *buffer) /* This is a utility routine to search the error message file for the error message specified by errid. The format of an error message is: @@@ A line which has '@' as the first character is taken as the start of an error message. can be of the form or : and must be on one line. A newline immediately following the '@' which ends the error id line is stripped. Otherwise the message is free format, with "\" used to escape an '@' in the message text. The message text can be any number of lines. Comments can be inserted between error messages. The form : is intended as a convenience for leaving blocks of error message ids open for future use. The accompanying message text is used for all error numbers in the range. Parameter: errid: error message number buffer: (o) buffer to hold the message text; assumed to be of length MAXERRTXT or larger Returns: the error message, or NULL */ { int argcnt,chrcnt,id,id2,chr ; bool sync ; char *txtptr ; const char *rtnnme = "finderrmsg" ; /* Rewind to get in sync. Then scan for the '@' that introduces the message number. When it's found, scan the error id. If it's the right message, break out of the loop. If it's the wrong message, just scan till the '@' that closes the text, then iterate the search loop. EOF causes a break from the loop and a return. Anything else unexpected in the scan causes a sync ` error and a return.`, */ rewind(emsgchn) ; id = 0 ; sync = FALSE ; while (fgets(buffer,MAXERRTXT,emsgchn) != NULL) { if (buffer[0] != '@') continue ; argcnt = sscanf(buffer,"@%d%n:%d%n",&id,&chrcnt,&id2,&chrcnt) ; if ((argcnt == 1 || argcnt == 2) && buffer[chrcnt] == '@') { if ((argcnt == 1 && id == errid) || (argcnt == 2 && id <= errid && errid <= id2)) { sync = TRUE ; break ; } } else { fprintf(stderr,"\n%s: bad error message id format; line is:\n%s\n", rtnnme,buffer) ; fprintf(stderr,"\tskipping to start of next message.\n") ; } } if (sync == FALSE) { if (feof(emsgchn)) { fprintf(stderr,"\n%s: couldn't find error message %d.\n",rtnnme,errid) ; } else if (ferror(emsgchn)) { fprintf(stderr,"\n%s: i/o error.\n",rtnnme) ; perror(rtnnme) ; } else { fprintf(stderr,"\n%s: internal confusion at line %d.\n", rtnnme,__LINE__) ; } return (NULL) ; } /* We've found the message. Shift any remaining message text on this line up into the front of the buffer. If the end of the line is '@\n', and the @ isn't preceded by '\', write a null and return. Otherwise, start a loop to pick up any further lines of text. There's still a chance for EOF errors. */ txtptr = &buffer[chrcnt+1] ; if (*txtptr != '\n') { chrcnt = 0 ; while (*txtptr != '\0') { chr = *txtptr++ ; if (chr == '\\') chr = *txtptr++ ; buffer[chrcnt++] = chr ; } buffer[chrcnt] = '\0' ; txtptr = &buffer[strlen(buffer)-1] ; if (*txtptr == '\n' && *(txtptr-1) == '@' && *(txtptr-2) != '\\') { *(txtptr-1) = '\0' ; return (buffer) ; } else txtptr++ ; } else { txtptr = buffer ; } for (chr = getc(emsgchn) ; chr != EOF ; chr = getc(emsgchn)) { if (chr == '@') break ; if (chr == '\\') { chr = getc(emsgchn) ; if (chr == EOF) { fprintf(stderr, "\n%s: sync error - EOF following \"\\\" in message %d.\n", rtnnme,errid) ; return (NULL) ; } } *txtptr++ = chr ; } if (chr == EOF) { fprintf(stderr,"\n%s: sync error - EOF collecting text for message %d.\n", rtnnme,errid) ; return (NULL) ; } *txtptr = '\0' ; return (buffer) ; } void errmsg (int errid, ... ) /* Actual Call: errmsg(errid,ident,arg1, ... ,argn) errmsg is the error reporting function used by clients of this package. It prints a message with the format "ident: error message". errid identifies a printf-style error message template which is looked up in the error message text file. A variable number of parameters may follow ident; they are assumed to be compatible with the way vfprintf will interpret the error message template. The message is printed to stderr and to the error log file, if it is open. In the event that emsgchn indicates the error message file wasn't found, only the error number and ident are printed. Parameters: errid: number of the generic error message ident: string used to prefix the error message (usually a routine name or similar identifier) arg1,...: the arguments to be spliced into the error message template Returns: undefined */ { char *ident ; va_list varargs ; /* Flush stdout and elogchn, so that any buffered normal output appears before the error message. */ fflush(stdout) ; if (elogchn != NULL) fflush(elogchn) ; /* If there's no error message file, or we can't find the message, just print the error number. Otherwise call vfprintf to handle expanding the message text. */ va_start(varargs,errid) ; if (emsgchn == NULL || finderrmsg(errid,&errtxt[ERRPFXLEN]) == NULL) { ident = va_arg(varargs,char *) ; if (errecho == TRUE) fprintf(stderr,"\n%s: error %d.\n",ident,errid) ; if (elogchn != NULL) fprintf(elogchn,"\n%s: error %d.\n",ident,errid) ; } else { if (errecho == TRUE) { vfprintf(stderr,errtxt,varargs) ; putc('\n',stderr) ; } if (elogchn != NULL) { vfprintf(elogchn,errtxt,varargs) ; putc('\n',elogchn) ; } } va_end(varargs) ; /* Flush the logged error message, so that the user will definitely see it. */ if (elogchn != NULL) fflush(elogchn) ; return ; } #ifdef DYLP_NDEBUG void warn (int errid, ... ) { return ; } #else void warn (int errid, ... ) /* Actual Call: warn(errid,ident,arg1, ... ,argn) Warn is functionally identical to errmsg, but prints the message "ident (warning): warning message". Parameters: errid: number of the generic error message ident: string used to prefix the error message (usually a routine name or similar identifier) arg1,...: the arguments to be spliced into the error message template Returns: undefined */ { char *ident ; va_list varargs ; /* Flush stdout and elogchn, so that any buffered normal output appears before the error message. */ fflush(stdout) ; if (elogchn != NULL) fflush(elogchn) ; /* If there's no error message file, or we can't find the message, just print the error number. Otherwise call vfprintf to handle expanding the message text. */ va_start(varargs,errid) ; if (emsgchn == NULL || finderrmsg(errid,&warntxt[WARNPFXLEN]) == NULL) { ident = va_arg(varargs,char *) ; if (errecho == TRUE) fprintf(stderr,"\n%s: error %d.\n",ident,errid) ; if (elogchn != NULL) fprintf(elogchn,"\n%s: error %d.\n",ident,errid) ; } else { if (errecho == TRUE) { vfprintf(stderr,warntxt,varargs) ; putc('\n',stderr) ; } if (elogchn != NULL) { vfprintf(elogchn,warntxt,varargs) ; putc('\n',elogchn) ; } } va_end(varargs) ; /* Flush the logged error message, so that the user will definitely see it. */ if (elogchn != NULL) fflush(elogchn) ; return ; } #endif /* DYLP_NDEBUG */ #ifdef _DYLIB_FORTRAN /* The two routines which follow, errmsg_ and warn_, are intended to be called from Fortran code. (The is also a companion routine, io.c:outfmt_.) This interface was created because early versions of the bonsai MILP code, written in C, used Fortran versions of the ylp and la05 subroutine libraries. The problem is that the things that Fortran will hand over cannot be passed directly to vfprintf - it passes pointers, vfprintf wants values for some things, pointers for others. This means we have to interpret the values passed from Fortran, writing our own varargs block to hand to vfprintf. To do this, we have to make the fragile assumption that a varargs block is constructed in a straightforward manner --- as data items written into a contiguous block of storage which we can allocate. Older versions of the varargs macros actually did this. With more recent versions, the assumption has become increasingly tenuous. As of GCC 2.96, gcc declares the varargs macros as builtins, with no hint of implementation. This hack has worked for some 10 years now, surviving ports to various architectures and the transition to ANSI C (varargs.h -> stdarg.h), but I'm starting to feel I'm pushing my luck. Fortunately, la05 has joined ylp in the dustbin, replaced by C basis maintenance code from glpk. At present (2005), this code is historical. Eventually it will disappear. The routines deal with a limited set of argument types: the Fortran types integer, double_precision, and character, and the special categories of variable and constraint names (these last two artifacts from the ylp LP code, the predecessor to dylp). A special type code is used to indicate the end of the list of arguments. Note that we simply ignore the length parameters which accompany the character strings (they follow ftnargEND as hidden parameters), under the assumption that an explict '\0' was placed at the end of each string when it was defined in the Fortran code. Older implementations of va_arg were written in such a way that you could actually write to va_arg(varargp,). This changed with GCC 2.96, necessitating the fancy two-step of writing to varargp, then advancing it. We need to use the value to make gcc shut up, so turn it to advantage as a check this hack is still working. Speed isn't an issue here. */ void errmsg_ (integer *errid, char *ident, ... ) /* This routine provides the functionality of errmsg to Fortran code. Its primary purpose in life is to take the Fortran arguments and put them into a varargs parameter block that is acceptable to vfprintf. As mentioned above, the method used is a little dubious. The call, over in Fortran, looks something like errmsg(errno,rtnnme,ftnargtype1,arg1, ... ,ftnargtypen,argn,ftnargEND) By the time it gets here, of course, it's all pointers, and there are additional arguments tacked on at the end for character string lengths. We ignore the string length arguments, and expect that a null terminator has been added explicitly over in the Fortran code. Parameters: as explained above Returns: undefined */ { va_list fargs,varargp ; int type ; double varargs[64] ; /* double avoids alignment problems */ int intarg ; double dblarg ; char *chararg ; char *rtnnme = "errmsg_" ; /* Flush stdout and elogchn, so that any buffered normal output appears before the error message. */ fflush(stdout) ; if (elogchn != NULL) fflush(elogchn) ; /* Initialise various pointers and indices. */ varargp = (va_list) &varargs[0] ; va_start(fargs,ident) ; /* Put the ident string into the varargs block. */ *((char **) varargp) = ident ; if (ident != va_arg(varargp,char *)) { errmsg(1,rtnnme,__LINE__) ; return ; } /* Now start up a loop to process the remainder of the arguments. For each pair, we pull off the type and use it to condition a switch with a case for each type of argument we're prepared to deal with. */ for (type = (int) *va_arg(fargs,integer *) ; type != ftnargEND ; type = (int) *va_arg(fargs,integer *)) switch (type) { case ftnargINTEGER: { intarg = (int) *va_arg(fargs,integer *) ; *((int *) varargp) = intarg ; if (intarg != va_arg(varargp,int)) { errmsg(1,rtnnme,__LINE__) ; return ; } break ; } case ftnargDOUBLE_PRECISION: { dblarg = (double) *va_arg(fargs,double_precision *) ; memcpy(varargp,&dblarg,sizeof(double)) ; if (dblarg != va_arg(varargp,double)) { errmsg(1,rtnnme,__LINE__) ; return ; } break ; } case ftnargCHARACTER: { chararg = va_arg(fargs,char *) ; *((char **) varargp) = chararg ; if (chararg != va_arg(varargp,char *)) { errmsg(1,rtnnme,__LINE__) ; return ; } break ; } default: { if (errecho == TRUE) fprintf(stderr, "\n%s: unrecognised Fortran argument type code %d.\n", rtnnme,type) ; if (elogchn != NULL) fprintf(elogchn, "\n%s: unrecognised Fortran argument type code %d.\n", rtnnme,type) ; return ; } } va_end(fargs) ; /* That's it for the preprocessing. The rest of this code is just a copy of the standard errmsg used by the C part of the code. If there's no error message file, or we can't find the message, just print the error number. Otherwise call vfprintf to handle expanding the message text. */ if (emsgchn == NULL || finderrmsg((int) *errid,&errtxt[ERRPFXLEN]) == NULL) { if (errecho == TRUE) fprintf(stderr,"\n%s: error %d.\n",ident,(int) *errid) ; if (elogchn != NULL) fprintf(elogchn,"\n%s: error %d.\n",ident,(int) *errid) ; } else { if (errecho == TRUE) { vfprintf(stderr,errtxt,((va_list) &varargs[0])) ; putc('\n',stderr) ; } if (elogchn != NULL) { vfprintf(elogchn,errtxt,((va_list) &varargs[0])) ; putc('\n',elogchn) ; } } /* Flush the logged error message, so that the user will definitely see it. */ if (elogchn != NULL) fflush(elogchn) ; return ; } #ifdef DYLP_NDEBUG void warn_ (integer *errid, char *ident, ... ) { return ; } #else void warn_ (integer *errid, char *ident, ... ) /* This routine provides the functionality of warn to Fortran code. Its primary purpose in life is to take the Fortran arguments and put them into a varargs parameter block that is acceptable to vfprintf. As mentioned above, the method used is a little dubious. The call, over in Fortran, looks something like warn(errno,rtnnme,ftnargtype1,arg1, ... ,ftnargtypen,argn,ftnargEND) By the time it gets here, of course, it's all pointers, and there are additional arguments tacked on at the end for character string lengths. We ignore the string length arguments, and expect that a null terminator has been added explicitly over in the Fortran code. Parameters: as explained above Returns: undefined */ { va_list fargs,varargp ; int type ; double varargs[64] ; /* double avoids alignment problems */ int intarg ; double dblarg ; char *chararg ; char *rtnnme = "warn_" ; /* Flush stdout and elogchn, so that any buffered normal output appears before the error message. */ fflush(stdout) ; if (elogchn != NULL) fflush(elogchn) ; /* Initialise various pointers and indices. */ varargp = (va_list) &varargs[0] ; va_start(fargs,ident) ; /* Put the ident string into the varargs block. */ *((char **) varargp) = ident ; if (ident != va_arg(varargp,char *)) { errmsg(1,rtnnme,__LINE__) ; return ; } /* Now start up a loop to process the remainder of the arguments. For each pair, we pull off the type and use it to condition a switch with a case for each type of argument we're prepared to deal with. */ for (type = (int) *va_arg(fargs,integer *) ; type != ftnargEND ; type = (int) *va_arg(fargs,integer *)) switch (type) { case ftnargINTEGER: { intarg = (int) *va_arg(fargs,integer *) ; *((int *) varargp) = intarg ; if (intarg != va_arg(varargp,int)) { errmsg(1,rtnnme,__LINE__) ; return ; } break ; } case ftnargDOUBLE_PRECISION: { dblarg = (double) *va_arg(fargs,double_precision *) ; memcpy(varargp,&dblarg,sizeof(double)) ; if (dblarg != va_arg(varargp,double)) { errmsg(1,rtnnme,__LINE__) ; return ; } break ; } case ftnargCHARACTER: { chararg = va_arg(fargs,char *) ; *((char **) varargp) = chararg ; if (chararg != va_arg(varargp,char *)) { errmsg(1,rtnnme,__LINE__) ; return ; } break ; } default: { if (errecho == TRUE) fprintf(stderr, "\n%s: unrecognised Fortran argument type code %d.\n", rtnnme,type) ; if (elogchn != NULL) fprintf(elogchn, "\n%s: unrecognised Fortran argument type code %d.\n", rtnnme,type) ; return ; } } va_end(fargs) ; /* That's it for the preprocessing. The rest of this code is just a copy of the standard warn used by the C part of the code. If there's no error message file, or we can't find the message, just print the error number. Otherwise call vfprintf to handle expanding the message text. */ if (emsgchn == NULL || finderrmsg((int) *errid,&warntxt[WARNPFXLEN]) == NULL) { if (errecho == TRUE) fprintf(stderr,"\n%s: error %d.\n",ident,(int) *errid) ; if (elogchn != NULL) fprintf(elogchn,"\n%s: error %d.\n",ident,(int) *errid) ; } else { if (errecho == TRUE) { vfprintf(stderr,warntxt,((va_list) &varargs[0])) ; putc('\n',stderr) ; } if (elogchn != NULL) { vfprintf(elogchn,warntxt,((va_list) &varargs[0])) ; putc('\n',elogchn) ; } } /* Flush the logged error message, so that the user will definitely see it. */ if (elogchn != NULL) fflush(elogchn) ; return ; } #endif /* DYLP_NDEBUG */ #endif /* _DYLIB_FORTRAN */ DyLP-1.6.0/DyLP/src/DylpStdLib/dylib_strrtns.h0000644000076700007670000000342510632415522015754 0ustar #ifndef _DYLIB_STRRTNS_H #define _DYLIB_STRRTNS_H /* This file is part of the support library for the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ #include "dylib_std.h" /* This file contains external definitions for the routines in the string package. @(#)strrtns.h 1.3 06/22/04 svn/cvs: $Id: dylib_strrtns.h 148 2007-06-09 03:15:30Z lou $ */ extern int cistrcmp(const char *str1, const char *str2), /* strrtns.c */ cimstrcmp(const char *str1, const char *str2), mstrcmp(const char *str1, const char *str2) ; extern char *strsave(char *original) ; extern const char *stralloc(const char *string) ; /* littab.c */ extern bool strfree(const char *string) ; /* Some macros to hide the memory allocation functions. Note that the debugging versions of these macros use outfmt from the io library and assume the existence of a string, rtnnme (typically the name of the current subroutine) that's used to identify the origin of the message. */ #if (MALLOC_DEBUG == 2) #include "dylib_io.h" void *zz_ptr_zz ; ioid zz_chn_zz ; #define STRALLOC(zz_sptr_zz) \ ( zz_ptr_zz = (void *) stralloc(zz_sptr_zz), \ outfmt(zz_chn_zz,FALSE,":stralloc: %#08x (%s) in %s.\n", \ zz_ptr_zz,zz_ptr_zz,rtnnme), \ (char *) zz_ptr_zz ) #define STRFREE(zz_fptr_zz) \ ( outfmt(zz_chn_zz,FALSE,":strfree: %#08x (%s) in %s.\n", \ zz_fptr_zz,zz_fptr_zz,rtnnme), \ strfree(zz_fptr_zz) ) #else #define STRALLOC(zz_sptr_zz) stralloc(zz_sptr_zz) #define STRFREE(zz_fptr_zz) strfree(zz_fptr_zz) #endif #endif /* _DYLIB_STRRTNS_H */ DyLP-1.6.0/DyLP/src/DylpStdLib/DylpConfig.h0000644000076700007670000001021411414231451015076 0ustar /* This file is part of the support library for the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). Include file for the configuration of Dylp. On systems where the code is configured with the configure script (i.e., compilation is always done with HAVE_CONFIG_H defined), this header file includes the automatically generated header file config_dylp.h, then undefines macros that might configure with other ProjConfig.h files. On systems where the code is built using some other approach (e.g., Windows with MS Visual Studio), the header file configall_system.h is included to define those macros that depend on the operating system and the compiler, followed by the defines used for configuration of dylp. A user can modify the default settings by editing this file. */ #ifndef __DYLPCONFIG_H__ #define __DYLPCONFIG_H__ #ifdef HAVE_CONFIG_H #include "config_dylp.h" /* Undefine macros that could conflict with those in other config.h files */ #undef PACKAGE #undef PACKAGE_BUGREPORT #undef PACKAGE_NAME #undef PACKAGE_STRING #undef PACKAGE_TARNAME #undef PACKAGE_VERSION #undef VERSION #else /* HAVE_CONFIG_H */ /* Include the COIN-wide system specific configure header (usually in BuildTools/inc). */ #include "configall_system.h" /* Defines specific to dylp. */ /* Define to the C type corresponding to the C++ bool type. `char' is correct on many systems. The next most likely choice is int. */ #define BOOL char /* Define to the debug sanity check level (0 is no test) */ #define COIN_DYLP_CHECKLEVEL 0 /* But dylp was developed long before COIN came into being, so if you really want the paranoid checks, define DYLP_PARANOIA. The value isn't important. */ /* #define DYLP_PARANOIA 1 */ /* Define to the debug verbosity level (0 is no output) */ #define COIN_DYLP_VERBOSITY 0 /* But dylp was developed long before COIN came into being, so if you want informational printing, DO NOT define DYLP_NDEBUG. The value isn't important. */ /* #undef DYLP_NDEBUG 1 */ /* Define this variable to enable dylp's statistics collection features. */ #define DYLP_STATISTICS 1 /* Define to 1 if the DyLP package is available. */ #define COIN_HAS_DYLP 1 /* Set to the full path directory name for the location of the error text message file dy_errmsgs.txt. This file is distributed with dylp source and not normally installed elsewhere. An absolute path to DyLP/src/Dylp/ is appropriate. The string should end with a directory separator ("/" or "\", depending on your system). The surrounding quotes are part of the definition. There is no good default; the value given here will work from the examples directory, on a windows system, which seems the most likely environment to be using this part of DylpConfig.h. */ /* #define DYLP_ERRMSGDIR "..\\src\\Dylp\\" */ /* Define this symbol if your system is `big-endian', i.e., the most significant byte of a multibyte quantity is stored in the lowest byte address. Intel x86 systems are little-endian. SPARC and Motorola are big-endian. */ /* #define WORDS_BIGENDIAN 1 */ /* Define this symbol if the quiet_nan function exists. This function should return the bit pattern for IEEE quiet NaN. */ /* #define DYLP_HAS_QUIET_NAN 1 */ /* Define to be the name of the C function used to check that an IEEE floating point value is finite. Common possibilities are finite, _finite, and isfinite. */ #define DYLP_ISFINITE finite /* Define to be the name of the C function used to check that an IEEE floating point value is NaN. Common possibilities are isnan and _isnan. */ #define DYLP_ISNAN isnan /* Define to 1 if sunmath.h exists. As you might guess, define this only on a Sun/Solaris system. And really, if you're building on Sun, why are you using this part of the configuration file? Run configure! */ /* #define HAVE_SUNMATH_H 1 */ /* Dylp version number. */ #define DYLP_VERSION "1.6.0" #endif /* HAVE_CONFIG_H */ #endif /*__DYLPCONFIG_H__*/ DyLP-1.6.0/DyLP/src/DylpStdLib/Makefile.am0000644000076700007670000000501210737027670014740 0ustar # Copyright (C) 2006 International Business Machines and others. # All Rights Reserved. # This file is distributed under the Common Public License. ## $Id: Makefile.am 491 2006-05-19 20:37:52Z andreasw $ # Author: Andreas Waechter IBM 2006-04-13 AUTOMAKE_OPTIONS = foreign ######################################################################## # libDylpStdLib # ######################################################################## # Name of the library compiled in this directory. We don't want it to be installed # since it will be included in the libDylp library noinst_LTLIBRARIES = libDylpStdLib.la # List all source files for this library, including headers libDylpStdLib_la_SOURCES = \ DylpConfig.h \ dylib_binsrch.c \ dylib_bnfrdr.c dylib_bnfrdr.h \ dylib_bnfrdrio.c \ dylib_errs.c dylib_errs.h \ dylib_fortran.h \ dylib_hash.c dylib_hash.h \ dylib_io.c dylib_io.h \ dylib_keytab.h \ dylib_littab.c \ dylib_std.h \ dylib_strrtns.c dylib_strrtns.h # This is for libtool (on Windows) libDylpStdLib_la_LDFLAGS = $(LT_LDFLAGS) # Here list all include flags, relative to this "srcdir" directory. This # "cygpath" stuff is necessary to compile with native compilers on Windows CFLAGS += # This line is necessary to allow VPATH compilation with MS compilers # on Cygwin DEFAULT_INCLUDES = -I. -I`$(CYGPATH_W) $(srcdir)` -I$(top_builddir)/inc ######################################################################## # Headers that need to be installed # ######################################################################## # Here list all the header files that are required by a user of the library, # and that therefore should be installed in 'install/coin' includecoindir = $(includedir)/coin includecoin_HEADERS = \ ../../inc/config_dylp.h \ dylib_errs.h \ dylib_hash.h \ dylib_io.h \ dylib_std.h \ dylib_strrtns.h ############################################################################# # Create the Config.h file that always defines HAVE_CONFIG_H and install it # ############################################################################# # You only need to adapt the following line ConfigHeader = DylpConfig.h install-exec-local: echo "#ifndef HAVE_CONFIG_H" >bla echo "#define HAVE_CONFIG_H" >>bla echo "#endif" >> bla cat $(srcdir)/$(ConfigHeader) >> bla $(install_sh_DATA) bla $(DESTDIR)$(includecoindir)/$(ConfigHeader) rm -f bla uninstall-local: rm -f $(DESTDIR)$(includecoindir)/$(ConfigHeader) DyLP-1.6.0/DyLP/src/DylpStdLib/dylib_errs.h0000644000076700007670000000154410632415522015210 0ustar #ifndef _DYLIB_ERRS_H #define _DYLIB_ERRS_H /* This file is part of the support library for the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* sccs: @(#)errs.h 2.3 03/18/04 svn/cvs: $Id: dylib_errs.h 148 2007-06-09 03:15:30Z lou $ */ #include "dylib_std.h" #ifdef _DYLIB_FORTRAN #include "dylib_fortran.h" #endif void errinit(const char *emsgpath, const char *elogpath, bool errecho), errterm(void) ; void errmsg(int errid, ... ), warn(int errid, ... ) ; #ifdef _DYLIB_FORTRAN void errmsg_(integer *errid, char *ident, ... ) ; void warn_(integer *errid, char *ident, ... ) ; #endif #endif /* _DYLIB_ERRS_H */ DyLP-1.6.0/DyLP/src/DylpStdLib/dylib_io.c0000644000076700007670000016143111021160525014632 0ustar /* This file is part of the support library for the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains a basic i/o package, designed to isolate the client program from ANSI C file i/o primitives and augment their functionality. The package uses an integer stream id, and keeps its own records on open files. Multiple open/close requests to the same file are tracked. Output to a terminal and/or log file (and, in particular, coordinated output to one or both) is handled with reasonable sophistication. There is a moderately capable lexer, a number of formatted output routines, and various random utilities. This package requires the set of error reporting/logging utilities in errs.c. */ #include "dylib_std.h" static char sccsid[] UNUSED = "@(#)io.c 3.14 11/11/04" ; static char svnid[] UNUSED = "$Id: dylib_io.c 238 2008-06-03 06:14:45Z lou $" ; #include #include #include #include "dylib_io.h" #include "dylib_errs.h" /* These declarations are used only by dyio_outfmt_, the version of dyio_outfmt that's designed to be called from Fortran. Unless you're the proud possessor of some ancient LP software, you likely don't want to know about xmp.h. */ #ifdef _DYLIB_FORTRAN # include "dylib_fortran.h" #endif #ifndef MALLOC #define MALLOC(zz_sze_zz) malloc(zz_sze_zz) #define CALLOC(zz_cnt_zz,zz_sze_zz) calloc(zz_cnt_zz,zz_sze_zz) #define FREE(zz_fptr_zz) free(zz_fptr_zz) #endif #define MAXPATH FILENAME_MAX /* Maximum length of full path name */ /* The structure filblks keeps track of open files. In addition to the FILE structure, a filblks entry stores the channel modes and the full path (directory path plus file name) of the file. The i/o id used by the client is the index in this array. The size of this array is set in dyio_ioinit to be 2 less than the number of file descriptors available to the process. The -2 accounts for two files used in the error reporting/logging package (the error message text file, and the error message log file). They are handled without reference to this package to allow these routines to use the error reporting/logging package without creating a potential infinite recursion. Field Content ----- ------- stream ANSI C stdio FILE structure modes Flags specifying the channel mode. refcnt The number of opens that resolved to this file dname Directory path for this file. fname File name. Note that filblks is indexed from 1 to maxfiles, so that we can use NULL (0) to indicate no stream id. */ typedef struct { FILE *stream ; flags modes ; int refcnt ; char *dname ; char *fname ; } filblk_struct ; static filblk_struct *filblks ; static ioid maxfiles ; #define INVALID_IOID(zz_id) ((zz_id < (ioid) 0) || (maxfiles < zz_id)) #define INVALID_STREAMID(zz_id) ((zz_id < (ioid) 1) || (maxfiles < zz_id)) /* Flags for the modes field. Flag Description ---- ----------- io_active This entry is active. io_line Line oriented i/o, with '\n' treated as a delimiter character. io_free Free i/o, with '\n' treated as white space. io_read Stream is opened for input. io_write Stream is opened for output. */ #define io_active 1<<0 #define io_line 1<<1 #define io_free 1<<2 #define io_read 1<<3 #define io_write 1<<4 /* The chartab provides the character translation and class codes on input. nxtchar reads characters from a stream and uses chartab to provide the correct character translation and class codes to the various scan routines. The description of the chartab_struct structure used for chartab entries is as follows: Field Description ----- ----------- chrtrn Character supplied when this ascii code is read. class1 Primary character class. class2 Secondary character class, used during construction of identifiers. The values for class1 and class2 are drawn from the following set, defined below as the enum chrclass: Value Description ----- ----------- CCINV (INVtermin) Characters in this class terminate any symbol being formed, but are otherwise ignored. CCDIG (DIGit) The obvious set of digits. CCIDB (ID Begin) Characters which can start an identifier. CCDEL (DELimiter) Single character delimiters. CCIG (IGnore) Characters which are alway ignored. CCIDC (ID Continuation) Characters which are valid in an identifier but cannot start one. CCEOF Indicates end-of-file was seen. CCERR Indicates i/o error was seen. */ typedef enum {CCINV,CCDIG,CCIDB,CCDEL,CCIG,CCIDC,CCEOF,CCERR} chrclass ; typedef struct { chrclass class1 ; chrclass class2 ; char chrtrn ; } chartab_struct ; /* A few special case chartab_struct's used by nxtchar to handle special cases. chartab_eof and chartab_err are returned on EOF and i/o error respectively. chartab_nl is returned when '\n' is seen on a stream operating in line mode. */ static chartab_struct chartab_eof = { CCEOF,CCEOF,'\377' }, chartab_err = { CCERR,CCERR,'\377' }, chartab_nl = { CCDEL,CCDEL,'\n' } ; static chartab_struct chartab[128] = { { CCIG,CCIG,'\0' }, /* NULL, ^@ */ { CCIG,CCIG,'\0' }, /* SOH, ^A */ { CCIG,CCIG,'\0' }, /* STX, ^B */ { CCIG,CCIG,'\0' }, /* ETX, ^C */ { CCIG,CCIG,'\0' }, /* EOT, ^D */ { CCIG,CCIG,'\0' }, /* ENQ, ^E */ { CCIG,CCIG,'\0' }, /* ACK, ^F */ { CCIG,CCIG,'\0' }, /* BEL, ^G */ { CCIG,CCIG,'\0' }, /* BS, ^H */ { CCINV,CCINV,'\t' }, /* HT, ^I */ { CCINV,CCINV,'\n' }, /* LF, ^J */ { CCINV,CCINV,'\013' }, /* VT, ^K */ { CCINV,CCINV,'\f' }, /* FF, ^L */ { CCINV,CCINV,'\r' }, /* CR, ^M */ { CCIG,CCIG,'\0' }, /* SO, ^N */ { CCIG,CCIG,'\0' }, /* SI, ^O */ { CCIG,CCIG,'\0' }, /* DLE, ^P */ { CCIG,CCIG,'\0' }, /* DC1, ^Q */ { CCIG,CCIG,'\0' }, /* DC2, ^R */ { CCIG,CCIG,'\0' }, /* DC3, ^S */ { CCIG,CCIG,'\0' }, /* DC4, ^T */ { CCIG,CCIG,'\0' }, /* NAK, ^U */ { CCIG,CCIG,'\0' }, /* SYN, ^V */ { CCIG,CCIG,'\0' }, /* ETB, ^W */ { CCIG,CCIG,'\0' }, /* CAN, ^X */ { CCIG,CCIG,'\0' }, /* EOM, ^Y */ { CCIG,CCIG,'\0' }, /* SUB, ^Z */ { CCIG,CCIG,'\0' }, /* ESC, ^[ */ { CCIG,CCIG,'\0' }, /* FS, ^\ */ { CCIG,CCIG,'\0' }, /* GS, ^] */ { CCIG,CCIG,'\0' }, /* RS, ^^ */ { CCIG,CCIG,'\0' }, /* US, ^_ */ { CCINV,CCINV,' ' }, /* SP */ { CCDEL,CCDEL,'!' }, { CCDEL,CCDEL,'"' }, { CCDIG,CCDIG,'#' }, { CCDEL,CCDEL,'$' }, { CCDEL,CCIDC,'%' }, { CCDEL,CCDEL,'&' }, { CCDIG,CCDIG,'\047' }, /* ' */ { CCDEL,CCDEL,'(' }, { CCDEL,CCDEL,')' }, { CCDEL,CCDEL,'*' }, { CCDIG,CCDIG,'+' }, { CCDEL,CCDEL,',' }, { CCDIG,CCDIG,'-' }, { CCDIG,CCIDC,'.' }, { CCDEL,CCDEL,'/' }, { CCDIG,CCIDC,'0' }, { CCDIG,CCIDC,'1' }, { CCDIG,CCIDC,'2' }, { CCDIG,CCIDC,'3' }, { CCDIG,CCIDC,'4' }, { CCDIG,CCIDC,'5' }, { CCDIG,CCIDC,'6' }, { CCDIG,CCIDC,'7' }, { CCDIG,CCIDC,'8' }, { CCDIG,CCIDC,'9' }, { CCDEL,CCDEL,':' }, { CCDEL,CCDEL,';' }, { CCDEL,CCDEL,'<' }, { CCDEL,CCDEL,'=' }, { CCDEL,CCDEL,'>' }, { CCDEL,CCDEL,'?' }, { CCDEL,CCDEL,'@' }, { CCIDB,CCIDC,'A' }, { CCIDB,CCIDC,'B' }, { CCIDB,CCIDC,'C' }, { CCIDB,CCIDC,'D' }, { CCIDB,CCIDC,'E' }, { CCIDB,CCIDC,'F' }, { CCIDB,CCIDC,'G' }, { CCIDB,CCIDC,'H' }, { CCIDB,CCIDC,'I' }, { CCIDB,CCIDC,'J' }, { CCIDB,CCIDC,'K' }, { CCIDB,CCIDC,'L' }, { CCIDB,CCIDC,'M' }, { CCIDB,CCIDC,'N' }, { CCIDB,CCIDC,'O' }, { CCIDB,CCIDC,'P' }, { CCIDB,CCIDC,'Q' }, { CCIDB,CCIDC,'R' }, { CCIDB,CCIDC,'S' }, { CCIDB,CCIDC,'T' }, { CCIDB,CCIDC,'U' }, { CCIDB,CCIDC,'V' }, { CCIDB,CCIDC,'W' }, { CCIDB,CCIDC,'X' }, { CCIDB,CCIDC,'Y' }, { CCIDB,CCIDC,'Z' }, { CCDEL,CCDEL,'[' }, { CCDEL,CCDEL,'\\' }, { CCDEL,CCDEL,']' }, { CCDEL,CCDEL,'^' }, { CCDEL,CCIDC,'_' }, { CCDEL,CCDEL,'`' }, { CCIDB,CCIDC,'a' }, { CCIDB,CCIDC,'b' }, { CCIDB,CCIDC,'c' }, { CCIDB,CCIDC,'d' }, { CCIDB,CCIDC,'e' }, { CCIDB,CCIDC,'f' }, { CCIDB,CCIDC,'g' }, { CCIDB,CCIDC,'h' }, { CCIDB,CCIDC,'i' }, { CCIDB,CCIDC,'j' }, { CCIDB,CCIDC,'k' }, { CCIDB,CCIDC,'l' }, { CCIDB,CCIDC,'m' }, { CCIDB,CCIDC,'n' }, { CCIDB,CCIDC,'o' }, { CCIDB,CCIDC,'p' }, { CCIDB,CCIDC,'q' }, { CCIDB,CCIDC,'r' }, { CCIDB,CCIDC,'s' }, { CCIDB,CCIDC,'t' }, { CCIDB,CCIDC,'u' }, { CCIDB,CCIDC,'v' }, { CCIDB,CCIDC,'w' }, { CCIDB,CCIDC,'x' }, { CCIDB,CCIDC,'y' }, { CCIDB,CCIDC,'z' }, { CCDEL,CCDEL,'{' }, { CCDEL,CCDEL,'|' }, { CCDEL,CCDEL,'}' }, { CCIG,CCIG,'\176' }, /* ~ */ { CCIG,CCIG,'\177' } } ; /* DEL */ /* We need a few special lexemes too. lex_eof and lex_err are used to indicate EOF and lexical scan error, respectively. lex_nil is the null lexeme. */ static lex_struct lex_eof = {DY_LCEOF,"end-of-file"}, lex_err = {DY_LCERR,"lexical scan error"}, lex_nil = {DY_LCNIL,NULL} ; bool dyio_ioinit (void) /* This routine initialises the i/o data structures. It should be called only once, at the start of the client's program. It does the following: * Initialise the filblks array. We first get the size of the file descriptor table and acquire space for filblks. The first three entries are set up for stdin, stdout, and stderr, the streams opened by default under Unix. * A possible fourth entry is made if the user has opened an error log file. We need this entry here so that a later call to dyio_openfile can find it (the particular case of interest would be a desire to log normal and error messages to the same file). To maintain information hiding, there is a routine, errlogq, which returns the required information. Parameters: errlogpath: the path name of the error log file; used only if errlogq returns a non-NULL FILE handle Returns: TRUE if the initialisation succeeds, FALSE otherwise */ { int len ; filblk_struct *filblk ; char *fname,*errlogpath,*tmp ; const char *rtnnme = "dyio_ioinit" ; extern FILE *errlogq(char **elogpath) ; /* See the comments on the filblks array at the beginning of the file, for the explanation of the magic number 2. It's possible that the o/s may have imposed a more stringent limit on the client process. */ maxfiles = FOPEN_MAX-2 ; filblks = (filblk_struct *) CALLOC(maxfiles+1,sizeof(filblk_struct)) ; filblk = &filblks[1] ; filblk->stream = stdin ; filblk->dname = NULL ; filblk->fname = "stdin" ; setflg(filblk->modes,io_active|io_free|io_read) ; filblk->refcnt = 1 ; filblk = &filblks[2] ; filblk->stream = stdout ; filblk->dname = NULL ; filblk->fname = "stdout" ; setflg(filblk->modes,io_active|io_free|io_write) ; filblk->refcnt = 1 ; filblk = &filblks[3] ; filblk->stream = stderr ; filblk->dname = NULL ; filblk->fname = "stderr" ; setflg(filblk->modes,io_active|io_free|io_write) ; filblk->refcnt = 1 ; /* Check for an error log file, and make a filblks entry for it, if necessary. */ filblk = &filblks[4] ; filblk->stream = errlogq(&errlogpath) ; if (filblk->stream != NULL) { if (errlogpath == NULL) { errmsg(14,rtnnme) ; errmsg(1,rtnnme,__LINE__) ; return(FALSE) ; } fname = strrchr(errlogpath,'/') ; if (fname == NULL) { filblk->dname = NULL ; fname = errlogpath ; } else { len = fname-errlogpath ; tmp = (char *) MALLOC(len+1) ; (void) strncpy(tmp,errlogpath,len) ; tmp[len] = '\0' ; filblk->dname = tmp ; fname++ ; } tmp = (char *) MALLOC(strlen(fname)+1) ; (void) strcpy(tmp,fname) ; filblk->fname = tmp ; setflg(filblk->modes,io_active|io_write) ; filblk->refcnt = 1 ; } return(TRUE) ; } void dyio_ioterm (void) /* This routine cleans up file management data structures allocated by the i/o package. Parameters: none Returns: undefined. */ { int id ; /* Data structures allocated by dyio_ioinit to track open files. */ for (id = 4 ; id <= maxfiles ; id++) { if (filblks[id].dname != NULL) FREE(filblks[id].dname) ; if (filblks[id].fname != NULL) FREE(filblks[id].fname) ; } FREE(filblks) ; return ; } static bool rwmodecmp (filblk_struct *filblk, const char *mode) /* This routine compares the r/w mode flags in the filblks entry for a stream with the r/w mode information in mode. Parameters: filblk: filblks entry to be checked. mode: Mode parameters as supplied for the standard i/o routine fopen. Returns: TRUE if the r/w mode information matches, FALSE otherwise. */ { const char *rtnnme = "rwmodecmp" ; flags modes ; bool rw ; if (mode == NULL) { errmsg(2,rtnnme,"r/w mode") ; return (FALSE) ; } if (filblk == NULL) { errmsg(2,rtnnme,"filblk") ; return (FALSE) ; } modes = filblk->modes ; rw = (mode[1] == '+')?TRUE:FALSE ; switch (mode[0]) { case 'r': { if (flgoff(modes,io_read) == TRUE) return (FALSE) ; if (rw == TRUE && flgoff(modes,io_write) == TRUE) return (FALSE) ; return (TRUE) ; } case 'a': case 'w': { if (flgoff(modes,io_write) == TRUE) return (FALSE) ; if (rw == TRUE && flgoff(modes,io_read) == TRUE) return (FALSE) ; return (TRUE) ; } default: { errmsg(4,rtnnme,"r/w mode",mode) ; return (FALSE) ; } } } static bool setrwmode (filblk_struct *filblk, char *mode) /* This routine sets the r/w mode flags in the filblks entry for a stream. Parameters: filblk: Filblks entry to be set. mode: Mode parameters as supplied to the standard i/o routine fopen. Returns: TRUE if the mode is set successfully, FALSE otherwise. */ { const char *rtnnme = "setrwmode" ; bool rw ; if (mode == NULL) { errmsg(2,rtnnme,"r/w mode") ; return (FALSE) ; } if (filblk == NULL) { errmsg(2,rtnnme,"filblk") ; return (FALSE) ; } rw = (mode[1] == '+')?TRUE:FALSE ; switch (mode[0]) { case 'r': { if (rw == TRUE) setflg(filblk->modes,io_read|io_write) ; else setflg(filblk->modes,io_read) ; return (TRUE) ; } case 'a': case 'w': { if (rw == TRUE) setflg(filblk->modes,io_read|io_write) ; else setflg(filblk->modes,io_write) ; return (TRUE) ; } default: { errmsg(4,rtnnme,"r/w mode",mode) ; return (FALSE) ; } } } bool dyio_setmode (ioid id, char mode) /* This routine is provided as an information-hiding function so that the client can switch a stream between line and free mode. Parameters: id: i/o id. mode: Desired mode, 'f' for free, 'l' for line. Returns: TRUE if the mode was successfully set, FALSE otherwise. */ { filblk_struct *filblk ; const char *rtnnme = "dyio_setmode" ; /* Check to make sure the stream ID is OK. */ if (INVALID_STREAMID(id)) { errmsg(5,rtnnme,"stream id",id) ; return (FALSE) ; } filblk = &filblks[id] ; if (flgon(filblk->modes,io_active) == FALSE) { errmsg(15,rtnnme,id) ; return (FALSE) ; } if (flgon(filblk->modes,io_read) == FALSE) { errmsg(16,rtnnme,dyio_idtopath(id)) ; return (FALSE) ; } /* Now set the mode. */ switch (mode) { case 'l': case 'L': { clrflg(filblk->modes,io_free) ; setflg(filblk->modes,io_line) ; break ; } case 'f': case 'F': { clrflg(filblk->modes,io_line) ; setflg(filblk->modes,io_free) ; break ; } default: { errmsg(3,rtnnme,"scanning mode",mode) ; return (FALSE) ; } } return (TRUE) ; } const char *dyio_idtopath (ioid id) /* This routine returns the file name associated with the specified stream. Parameter: id: i/o id. Returns: Path name of the file opened on this stream, or an error string if the stream is not currently active. */ { static char fullpath[MAXPATH] ; static const char *badid = "!invalid id!" ; filblk_struct *filblk ; const char *rtnnme = "dyio_idtopath" ; /* Check to make sure the stream ID is OK. */ if (INVALID_STREAMID(id)) { errmsg(5,rtnnme,"stream id",id) ; return (badid) ; } filblk = &filblks[id] ; if (flgon(filblk->modes,io_active) == FALSE) { errmsg(15,rtnnme,id) ; return (badid) ; } /* Now construct the full pathname from the directory and file names. */ fullpath[0] = '\0' ; if (filblk->dname != NULL) { (void) strcat(fullpath,filblk->dname) ; (void) strcat(fullpath,"/") ; } (void) strcat(fullpath,filblk->fname) ; return (fullpath) ; } ioid dyio_pathtoid (const char *path, const char *mode) /* This routine searches the filblks array and returns the stream ID associated with the full path name given by path. If mode is non-null, the i/o mode of the file must also match. Parameters: path: Full path name of the file. mode: i/o mode, as passed to the standard i/o routine fopen Returns: I/O ID associated with the path name (and mode), or IOID_INV if nothing matched. */ { const char *fname ; int ndx,dlen ; filblk_struct *filblk ; const char *rtnnme = "dyio_pathtoid" ; if (path == NULL) { errmsg(2,rtnnme,"path") ; return (-1) ; } fname = strrchr(path,'/') ; if (fname == NULL) { dlen = 0 ; fname = path ; } else { dlen = fname-path ; fname++ ; } for (ndx = 1 ; ndx <= maxfiles ; ndx++) { filblk = &filblks[ndx] ; if (flgoff(filblk->modes,io_active) == TRUE) continue ; if (strcmp(filblk->fname,fname) != 0) continue ; if (filblk->dname == NULL) { if (dlen != 0) continue ; } else { if (strncmp(filblk->dname,path,dlen) != 0) continue ; } if (mode != NULL && rwmodecmp(filblk,mode) == FALSE) continue ; return (ndx) ; } return (IOID_INV) ; } bool dyio_ttyq (ioid id) /* This routine answers the question of whether or not the stream specified by id is attached to a tty. It is simply an interface to isatty. isatty and fileno are not ANSI standard functions, but seem pretty common among Unix implementations. Your mileage may vary. Parameters: id: i/o id Returns: TRUE if the stream is attached to a tty, FALSE otherwise; in the event of a error, FALSE is returned. */ { filblk_struct *filblk ; const char *rtnnme = "dyio_ttyq" ; extern int isatty(int fildes) ; /*extern int fileno(FILE *stream) ;*/ /* Check to make sure the stream ID is OK. */ if (INVALID_STREAMID(id)) { errmsg(5,rtnnme,"stream id",id) ; return (FALSE) ; } filblk = &filblks[id] ; if (flgon(filblk->modes,io_active) == FALSE) { errmsg(15,rtnnme,id) ; return (FALSE) ; } /* Now inquire if the stream is attached to a terminal. */ if (isatty(fileno(filblk->stream)) == 1) return (TRUE) ; else return (FALSE) ; } ioid dyio_openfile (const char *path, const char *mode) /* This routine sets up the file specified in path for i/o. It acts as the interface between the client and the C stdio library. The major differences from the standard fopen function are 1): dyio_openfile looks to see if the specified file is already opened with compatible r/w mode (see below for 'compatible') and if so it returns the ID for the preexisting stream, with no further actions. 2): Six additional modes "R","R+","W","W+","A","A+" are provided to override feature 1, i.e., to force a rewind or truncate operation, as appropriate. 3): The letter `q' (query) is interpreted as `open the file if it exists, but it's not an error if it doesn't exist.' 'Compatible' mode means everything has to match except the case of the letter. Parameters: path: Address of the full path name (directory path plus file name) of the file to be opened. mode: Address of a string giving the file i/o mode, as specified for the standard fopen function, with the extra modes as described above. Returns: stream ID, or IOID_INV if the file cannot be opened. */ { FILE *handle ; filblk_struct *filblk ; const char *fname ; char *tmp ; char mode_var[3] ; int len ; ioid id ; bool mustexist,totop ; const char *rtnnme = "dyio_openfile" ; /* Make sure the parameters are ok. */ if (path == NULL) { errmsg(2,rtnnme,"path") ; return (IOID_INV) ; } if (mode == NULL) { errmsg(2,rtnnme,"r/w mode") ; return (IOID_INV) ; } /* Get a copy of mode so we can play with the string. */ mode_var[0] = mode[0] ; mode_var[1] = mode[1] ; mode_var[2] = '\0' ; /* If mode_var starts with an upper case letter, change to lower case. For modes beginning with 'W', 'R', set the rewind flag. Convert query modes to read, but note that the file need not exist. */ mustexist = FALSE ; totop = FALSE ; switch (mode_var[0]) { case 'R': { mode_var[0] = 'r' ; totop = TRUE ; mustexist = TRUE ; break ; } case 'Q': { mode_var[0] = 'r' ; totop = TRUE ; break ; } case 'W': { mode_var[0] = 'w' ; totop = TRUE ; break ; } case 'A': { mode_var[0] = 'a' ; break ; } case 'r': { mustexist = TRUE ; break ; } case 'q': { mode_var[0] = 'r' ; break ; } case 'w': case 'a': { break ; } default: { errmsg(4,rtnnme,"r/w mode",mode) ; return (IOID_INV) ; } } /* First check if the file is already open with compatible (lower case equivalent) mode. Note that dyio_pathtoid() checks modes. If the file is already open, return with the stream id. If additionally the rewind flag totop is true, take appropriate action. The rewind flag and/or uppercase mode mean nothing if the file is not already open. */ id = dyio_pathtoid(path,mode_var) ; if (id != IOID_INV) { if (totop == TRUE) { switch (mode_var[0]) { case 'r': { rewind(filblks[id].stream) ; break ; } case 'w': { fclose(filblks[id].stream) ; filblks[id].stream = fopen(path,mode_var) ; if (filblks[id].stream == NULL) { errmsg(10,rtnnme,dyio_idtopath(id),mode_var) ; perror(rtnnme) ; return (IOID_INV) ; } break ; } case 'a': { errmsg(1,rtnnme,__LINE__) ; return (IOID_INV) ; } } } filblks[id].refcnt++ ; return (id) ; } /* The file is not currently open, so find an empty entry in filblks. */ for (id = 1 ; id <= maxfiles && flgon(filblks[id].modes,io_active) == TRUE ; id++) ; if (id > maxfiles) { errmsg(13,rtnnme) ; return (IOID_INV) ; } filblk = &filblks[id] ; /* Now attempt to open the file. */ handle = fopen(path,mode_var) ; if (handle == NULL) { if (mode_var[0] == 'r' && mustexist == FALSE) { return (IOID_NOSTRM) ; } else { errmsg(10,rtnnme,path,mode_var) ; perror(rtnnme) ; return (IOID_INV) ; } } /* File is successfully opened, so fill in the information in filblks. */ filblk->stream = handle ; setrwmode(filblk,mode_var) ; fname = strrchr(path,'/') ; if (fname == NULL) { filblk->dname = NULL ; fname = path ; } else { fname++ ; len = fname-path ; tmp = (char *) MALLOC(len+1) ; (void) strncpy(tmp,path,len) ; tmp[len] = '\0' ; filblk->dname = tmp ; } tmp = (char *) MALLOC(strlen(fname)+1) ; (void) strcpy(tmp,fname) ; filblk->fname = tmp ; setflg(filblk->modes,io_active|io_free) ; filblk->refcnt = 1 ; return (id) ; } bool dyio_isactive (ioid id) /* This routine checks to see if id corresponds to an active stream. Parameter: id: stream ID obtained from dyio_openfile Returns: TRUE if the stream is active, FALSE otherwise */ { const char *rtnnme = "dyio_isactive" ; /* We'll still complain if the id isn't valid. */ if (INVALID_IOID(id)) { errmsg(5,rtnnme,"stream id",id) ; return (FALSE) ; } if (id == IOID_NOSTRM) return (FALSE) ; return (flgon(filblks[id].modes,io_active)) ; } bool dyio_closefile (ioid id) /* This routine closes a stream and cleans up the filblks entry, iff the reference count for the stream has dropped to 0. Parameter: id: stream ID obtained from dyio_openfile Returns: TRUE if the stream is closed without error, FALSE otherwise. */ { filblk_struct *filblk ; bool retval ; const char *rtnnme = "dyio_closefile" ; /* Make sure the id is valid. */ if (INVALID_STREAMID(id)) { errmsg(5,rtnnme,"stream id",id) ; return (FALSE) ; } filblk = &filblks[id] ; if (flgon(filblk->modes,io_active) == FALSE) { errmsg(15,rtnnme,id) ; return (FALSE) ; } /* Decrement the reference count. If it's non-zero, someone else is still using the stream, so just return. */ if (--filblk->refcnt > 0) return (TRUE) ; /* Reference count is 0, so close the stream. */ if (fclose(filblk->stream) == EOF) { errmsg(11,rtnnme,dyio_idtopath(id)) ; perror(rtnnme) ; retval = FALSE ; } else retval = TRUE ; /* Mark the filblk entry as inactive and free the directory path and file name space. We can close the three standard streams (stdin, stdout, stderr) but the name strings are static (vid. dyio_ioinit) and should not be freed. */ clrflg(filblk->modes,io_active) ; if (id > 3) { if (filblk->dname != NULL) { FREE(filblk->dname) ; filblk->dname = NULL ; } FREE(filblk->fname) ; filblk->fname = NULL ; } return (retval) ; } bool dyio_chgerrlog (const char *newerrpath, bool echo) /* This routine allows for manipulation of the error logging channel via the standard interface provided by io.c. The supplied path is checked against open streams, and if one is found it is passed on to the error logging package. If there is no open stream for the new log file, it's opened. If we had no record of the old error log file, we'll let the error logging package do the close. But if we have a record, we'll handle the close here. It's possible we've been called solely to change the echo, in which case we'll do it up front and bail out. Parameters: newerrpath: path name of the file echo: TRUE if errors should be echoed to stderr, FALSE otherwise Returns: TRUE if things go well, FALSE otherwise. */ { ioid olderrid,newerrid ; bool close ; char *olderrpath ; FILE *newerrchn ; const char *rtnnme = "dyio_chgerrlog" ; extern FILE *errlogq(char **elogpath) ; extern bool reseterrlogchn(const char *elogpath, FILE *elogchn, bool echo, bool close) ; /* Just here to change the echo? */ if (newerrpath == NULL) { (void) reseterrlogchn(NULL,NULL,echo,FALSE) ; return (TRUE) ; } /* The first thing we need to do is check for the existence of the present error logging file. If the i/o package has no record, we want the error logging package to close out the old file. If we have a record, we'll do it here. */ (void) errlogq(&olderrpath) ; if (olderrpath == NULL) { close = FALSE ; olderrid = IOID_INV ; } else { olderrid = dyio_pathtoid(olderrpath,NULL) ; if (olderrid == IOID_INV) { close = TRUE ; } else { close = FALSE ; } } /* Now see if the new file is already open. If not, open it. */ newerrid = dyio_pathtoid(newerrpath,"w") ; if (newerrid == IOID_INV) { newerrid = dyio_openfile(newerrpath,"w") ; if (newerrid == IOID_INV) { errmsg(10,rtnnme,newerrpath,"w") ; return (FALSE) ; } } newerrchn = filblks[newerrid].stream ; /* Do the swap. Once we've finished, we may need to deactivate the filblks entry for olderrid. */ if (reseterrlogchn(newerrpath,newerrchn,echo,close) == FALSE) { errmsg(18,rtnnme,olderrpath,newerrpath) ; return (FALSE) ; } /* Did we have a record for this file? If so, call dyio_closefile to tidy up. */ if (olderrid != IOID_INV) (void) dyio_closefile(olderrid) ; return (TRUE) ; } long dyio_mark (ioid id) /* This routine marks the current place in the input stream. It uses ftell to obtain the current offset. As best I can figure, ftell should always return a positive integer, at least on Unix, so the error return here is -1. Parameter: id: Stream ID from dyio_openfile. Returns: A "mark", or -1 in the event of any bogosity. */ { filblk_struct *filblk ; long here ; const char *rtnnme = "dyio_mark" ; /* Check to make sure the stream ID is OK. */ if (INVALID_STREAMID(id)) { errmsg(5,rtnnme,"stream id",id) ; return (-1) ; } filblk = &filblks[id] ; if (flgon(filblk->modes,io_active) == FALSE) { errmsg(15,rtnnme,id) ; return (-1) ; } /* Now try the call to ftell to get the mark. */ here = ftell(filblk->stream) ; if (here < 0) { errmsg(23,rtnnme,dyio_idtopath(id)) ; perror(rtnnme) ; } return (here) ; } bool dyio_backup (ioid id, long there) /* This routine moves the position of the next i/o operation on this stream to there. Parameters: id: Stream ID from dyio_openfile. there: Mark supplied by dyio_mark. Returns: TRUE if the position is successfully set, FALSE otherwise. */ { filblk_struct *filblk ; const char *rtnnme = "dyio_backup" ; /* Check to make sure the stream ID is OK. */ if (INVALID_STREAMID(id)) { errmsg(5,rtnnme,"stream id",id) ; return (FALSE) ; } filblk = &filblks[id] ; if (flgon(filblk->modes,io_active) == FALSE) { errmsg(15,rtnnme,id) ; return (FALSE) ; } /* Call fseek to position the file pointer to there. */ if (fseek(filblk->stream,there,SEEK_SET) < 0) { errmsg(24,rtnnme,dyio_idtopath(id),there) ; perror(rtnnme) ; return (FALSE) ; } return (TRUE) ; } static chartab_struct *nxtchar (FILE *stream, flags modes) /* This routine reads characters from stream and removes characters of class CCIG (IGnore). Parameters: stream: stream handle modes: modes field from filblk entry for this channel Returns: chartab_struct for the character read. Note that EOF, i/o error, and '\n' receive special handling. */ { const char *rtnnme = "nxtchar" ; int nxt,id ; /* Read characters until not class CCIG or until EOF. */ for (nxt = getc(stream) ; nxt != EOF && chartab[nxt].class1 == CCIG ; nxt = getc(stream)) ; /* Check for read errors. */ if (nxt == EOF) { if (ferror(stream) != 0) { for (id = 1 ; id <= maxfiles && filblks[id].stream != stream ; id++) ; if (id <= maxfiles) { errmsg(12,rtnnme,dyio_idtopath(id)) ; } else { errmsg(12,rtnnme,"unknown") ; errmsg(1,rtnnme,__LINE__) ; } perror(rtnnme) ; return (&chartab_err) ; } else { return (&chartab_eof) ; } } if (nxt == '\n' && flgon(modes,io_line) == TRUE) return (&chartab_nl) ; else return (&chartab[nxt]) ; } bool dyio_scan (ioid id, const char pattern[], bool rwnd, bool wrap) /* This routine scans the input stream specified by id for the string specified in pattern. It leaves the i/o pointer positioned so that the next read from the channel will fetch the character following the string matched. rwnd specifies whether the stream should be reset to the beginning of the file before the scan starts. wrap is valid only if the file is not rewound, and specifies whether the search can be continued at EOF by resetting to the beginning of file and resuming the scan. wrap is a bit expensive unless you are pretty sure that the desired string will occur between where you're at and the end of the file, since there is no cheap way of stopping at the point where the scan originally started without digging into the guts of the stdio package. Hence the scan continues til the second EOF. The algorithm used is the linear substring matching algorithm described in Section 9.3 of Aho, Hopcroft, & Ullman, "The Design and Analysis of Computer Algorithms". The routine limits the length of pattern arbitrarily to 30 chars and will truncate the pattern and complain if the pattern is longer. Parameters: id: i/o id. pattern: Character string to be matched. rwnd: TRUE: start the scan from the beginning of the file FALSE: start the scan from the present position wrap: TRUE: allow the restart FALSE: quit after first EOF Returns: TRUE if the string is found, FALSE otherwise. */ #define MAXPATLEN 30 { static struct state_struct { char nxtchr ; struct state_struct *fail ; } states[MAXPATLEN] ; struct state_struct *state ; int patlen,patndx,statendx ; const char *patptr ; bool retry ; chartab_struct *chr ; filblk_struct *filblk ; FILE *stream ; flags mode ; const char *rtnnme = "dyio_scan" ; /* Check to make sure the stream ID is OK and lex points to a string. */ if (INVALID_STREAMID(id)) { errmsg(5,rtnnme,"stream id",id) ; return (FALSE) ; } filblk = &filblks[id] ; if (flgon(filblk->modes,io_active) == FALSE) { errmsg(15,rtnnme,id) ; return (FALSE) ; } if (flgon(filblk->modes,io_read) == FALSE) { errmsg(16,rtnnme,dyio_idtopath(id)) ; return (FALSE) ; } if (pattern == NULL) { errmsg(2,rtnnme,"pattern") ; return (FALSE) ; } patlen = strlen(pattern) ; if (patlen > MAXPATLEN) { errmsg(25,rtnnme,pattern,MAXPATLEN) ; patlen = MAXPATLEN ; } /* Now set up the states array. For each state, the entry specifies the next character and the failure function value. We initialize the entries for states[0] and states[1], then enter the main loop to calculate the rest. */ state = states ; patptr = pattern ; state->nxtchr = *patptr ; state->fail = states ; state++ ; patptr++ ; state->nxtchr = *patptr ; state->fail = states ; for (statendx = 2 ; statendx < patlen ; statendx++) { patndx = state->fail-states ; state++ ; while (*patptr != pattern[patndx] && patndx > 0) patndx = states[patndx].fail-states ; if (*patptr != pattern[patndx] && patndx == 0) state->fail = states ; else state->fail = &states[patndx+1] ; patptr++ ; state->nxtchr = *patptr ; } /* Set up the control variables and position the file pointer. */ stream = filblk->stream ; mode = filblk->modes ; if (rwnd == FALSE) retry = wrap ; else { rewind(stream) ; retry = FALSE ; } /* Now begin the actual matching. The first action is to read in a character. i/o error causes immediate termination; nxtchar will already have printed an error message. EOF is handled by rewinding the file, if allowed, otherwise it too causes a return. If we rewind, state is forced to 0 and we abort this iteration of the loop. */ for (state = states ; state != &states[patlen] ; ) { chr = nxtchar(stream,mode) ; if (chr->class1 == CCERR) return (FALSE) ; if (chr->class1 == CCEOF) { if (retry == FALSE) return (FALSE) ; else { rewind(stream) ; retry = FALSE ; state = states ; continue ; } } /* OK, we've got a character and we're actually ready to check it against the pattern. If it matches, we advance to the next state. */ if (chr->chrtrn == state->nxtchr) { state++ ; continue ; } /* It didn't match, so we apply the failure function until we get to a state where chr == state->nxtchr or state == 0. If we reach a state where nxtchr matches chr, we bump the state by one and iterate, otherwise we just iterate leaving state at 0. */ for (state = state->fail ; !(chr->chrtrn == state->nxtchr || state == states) ; state = state->fail) ; if (chr->chrtrn == state->nxtchr) state++ ; } /* To get here, we've matched. (Otherwise we would have returned due to EOF up above. Celebrate by returning TRUE. */ return (TRUE) ; } #undef MAXPATLEN lex_struct *dyio_scanlex (ioid id) /* This routine is a general lexical scanner. It recognizes three classes of lexemes: numbers (DY_LCNUM), identifiers (DY_LCID), and delimiters (DY_LCDEL). As with character classes, these are augmented by two classes for EOF (DY_LCEOF) and i/o error (DY_LCERR). Lexemes are limited to 80 characters in length. Longer lexemes are truncated and the user is warned, but no error is indicated in the returned value. The basic form of the scanner follows the outline presented in Section 3.3 of Gries, "Compiler Construction for Digital Computers". Parameters: id: stream id from dyio_openfile. Returns: A lex_struct reflecting the result of the scan. This will be a normal lex_struct or a lex_struct reflecting an exception (EOF or error) */ #define MAXLEXLEN 80 { chartab_struct *chr ; char *lexptr ; bool ovf ; filblk_struct *filblk ; FILE *stream ; flags mode ; static char stringspace[MAXLEXLEN+1] ; static lex_struct lex = {DY_LCNIL,stringspace} ; const char *rtnnme = "dyio_scanlex" ; /* Check to make sure that the stream id is OK. */ if (INVALID_STREAMID(id)) { errmsg(5,rtnnme,"stream id",id) ; return (&lex_err) ; } filblk = &filblks[id] ; if (flgon(filblk->modes,io_active) == FALSE) { errmsg(15,rtnnme,id) ; return (&lex_err) ; } if (flgon(filblk->modes,io_read) == FALSE) { errmsg(16,rtnnme,dyio_idtopath(id)) ; return (&lex_err) ; } stream = filblk->stream ; mode = filblk->modes ; /* Step over any characters of class CCINV (i.e., whitespace). If we get EOF or i/o error here, return appropriately. */ for (chr = nxtchar(stream,mode) ; chr->class1 == CCINV ; chr = nxtchar(stream,mode)) ; if (chr->class1 == CCEOF) return (&lex_eof) ; if (chr->class1 == CCERR) return (&lex_err) ; /* Form the lexeme. Note that the algorithm for forming a number does not attempt to be picky - it will handle a well-formed number, but it will also pass malformed numbers of various sorts. */ lexptr = lex.string ; *lexptr++ = chr->chrtrn ; ovf = FALSE ; switch (chr->class1) { case CCDIG: /* Form a number. */ { for (chr = nxtchar(stream,mode) ; (1) ; chr = nxtchar(stream,mode)) { if ((chr->class1 != CCDIG && chr->chrtrn != 'E' && chr->chrtrn != 'e') || ((chr->chrtrn == '+' || chr->chrtrn == '-') && *(lexptr-1) != 'E' && *(lexptr-1) != 'e')) break ; if (ovf == FALSE) { if (lexptr < &stringspace[MAXLEXLEN]) { *lexptr++ = chr->chrtrn ; } else { ovf = TRUE ; *lexptr = '\0' ; errmsg(26,rtnnme,lex.string,MAXLEXLEN) ; } } } if (!(chr->class1 == CCEOF || chr->class1 == CCERR)) ungetc(chr->chrtrn,stream) ; if ((lexptr-1) == lex.string && (*(lexptr-1) == '+' || *(lexptr-1) == '-')) lex.class = DY_LCDEL ; else lex.class = DY_LCNUM ; break ; } case CCIDB: /* Form an identifier. */ { for (chr = nxtchar(stream,mode) ; chr->class2 == CCIDC ; chr = nxtchar(stream,mode)) if (ovf == FALSE) { if (lexptr < &stringspace[MAXLEXLEN]) { *lexptr++ = chr->chrtrn ; } else { ovf = TRUE ; *lexptr = '\0' ; errmsg(26,rtnnme,lex.string,MAXLEXLEN) ; } } if (!(chr->class1 == CCEOF || chr->class1 == CCERR)) ungetc(chr->chrtrn,stream) ; lex.class = DY_LCID ; break ; } case CCDEL: /* Form single-character delimiter. */ { lex.class = DY_LCDEL ; break ; } default: /* Should never execute this. */ { errmsg(1,rtnnme,__LINE__) ; return (&lex_err) ; } } /* Clean up and return. We check to see if the scan was terminated by an i/o error, and if so return lex_err. Otherwise, we make sure that the string ends with a NULL and return. Termination due to EOF isn't necessarily an error; an EOF return will be generated on the next call. */ if (chr->class1 == CCERR) return (&lex_err) ; *lexptr = '\0' ; return (&lex) ; } #undef MAXLEXLEN lex_struct *dyio_scanstr (ioid id, lexclass stype, int fslen, char qschr, char qechr) /* This routine is a string scanner. It scans two types of strings, fixed length (DY_LCFS) and quoted (DY_LCQS). Before starting the string scan, the input is read until a non-CCINV character is encountered (i.e, we skip over whitespace characters). Fixed length strings have the length specified by fslen. The algorithm is to copy the next fslen characters into a text string and return. Quoted strings are bounded by a start character and an end character, passed in qschr and qechr, respectively. A check is made to see if the specified start character is present unless the start character is '\0', in which case no check is made, or the start character is ' ', in which case any CCINV (whitespace) character satisfies the check. It is an error if a specific start character is not matched in the input. Any single occurrence of the end character ends the string, unless the end character is '\0' or ' '. For '\0', any CCINV or CCDEL character ends the string, while for ' ' only CCINV characters will end the string. Double occurrences of printing end characters are reduced to a single occurrence in the string returned; surrounding quote characters are stripped. For non-printing end characters, the double-occurrence escape is not available. (This avoids problems with forming strings ended by \n or \f from terminal input, where the read may block because there are no more characters.) NOTE: It is possible to parse a string of length 0 (and hence get a DY_LCNIL return type) when a quoted string is parsed with start character '\0'. Example: a request for a string quoted with '\0','\n' (to parse off entire lines) will return DY_LCNIL if the line contains only a '\n'. Further, a string quoted with '\0','\0' is satisfied by any amount of whitespace, even the whitespace skipped over at the start of the parse. Finally, to avoid leaking the buffer allocated for the last non-null string, use a call of dyio_scanstr(ioid,DY_LCQS,0,'\0','\0') and free lex.string iff lex.class == DY_LCQS. Parameters: id: i/o ID from dyio_openfile. stype: String type, allowable values are DY_LCFS and DY_LCQS. fslen: String length (fixed-length strings only). qschr: Start character (quoted strings only). qechr: End character (quoted strings only). Returns: A lex_struct reflecting the result of the scan. This will be a normal lex_struct or a lex_struct reflecting an exception (EOF or error) */ #define MAXQSLEN 250 { chartab_struct *chr ; char *lexptr ; bool invseen ; int ndx,expcnt ; filblk_struct *filblk ; FILE *stream ; flags mode ; static lex_struct lex = {DY_LCNIL,NULL} ; const char *rtnnme = "dyio_scanstr" ; /* Release the previous lex space, if necessary. */ if (lex.string != NULL) { FREE(lex.string) ; lex.string = NULL ; } /* Check to make sure that the stream id is OK. */ if (INVALID_IOID(id)) { errmsg(5,rtnnme,"stream id",id) ; return (&lex_err) ; } filblk = &filblks[id] ; if (flgon(filblk->modes,io_active) == FALSE) { errmsg(15,rtnnme,id) ; return (&lex_err) ; } if (flgon(filblk->modes,io_read) == FALSE) { errmsg(16,rtnnme,dyio_idtopath(id)) ; return (&lex_err) ; } stream = filblk->stream ; mode = filblk->modes ; /* Step over any characters of class CCINV (i.e., whitespace). If we get EOF or i/o error here, return appropriately. */ invseen = FALSE ; for (chr = nxtchar(stream,mode) ; chr->class1 == CCINV ; chr = nxtchar(stream,mode)) invseen = TRUE ; if (chr->class1 == CCERR) return (&lex_err) ; if (chr->class1 == CCEOF) { if (invseen == TRUE && qschr == '\0' && (qechr == '\0' || qechr == ' ')) return (&lex_nil) ; else return (&lex_eof) ; } /* Now begin to construct the string. */ switch (stype) { /* Fixed length strings. Acquire some space of the right size, then copy the required number of characters. */ case DY_LCFS: { if (fslen <= 0) { errmsg(5,rtnnme,"fslen",fslen) ; ungetc(chr->chrtrn,stream) ; return (&lex_err) ; } lexptr = (char *) MALLOC(fslen+1) ; lex.string = lexptr ; *lexptr++ = chr->chrtrn ; for (ndx = fslen-1 ; ndx != 0 ; ndx--) { chr = nxtchar(stream,mode) ; if (chr->class1 == CCEOF || chr->class1 == CCERR) { *lexptr = '\0' ; errmsg(27,rtnnme,fslen,lex.string) ; FREE(lex.string) ; lex.string = NULL ; return (&lex_err) ; } *lexptr++ = chr->chrtrn ; } lex.class = DY_LCFS ; break ; } /* Quoted strings. We'll guess that MAXQSLEN characters will normally hold us, and expand if necessary. The first switch looks to see if we've satisfied the start character conditions. Then we allocate space and proceed to scan off the string. We allocate MAXQSLEN+1 to allow space for a closing null. */ case DY_LCQS: { switch (qschr) { case '\0': { if (invseen == TRUE && (qechr == '\0' || qechr == ' ')) { ungetc(chr->chrtrn,stream) ; return (&lex_nil) ; } break ; } case ' ': { if (invseen != TRUE) { ungetc(chr->chrtrn,stream) ; return (&lex_err) ; } break ; } default: { if (qschr != chr->chrtrn) { ungetc(chr->chrtrn,stream) ; return (&lex_err) ; } chr = nxtchar(stream,mode) ; break ; } } lexptr = (char *) MALLOC(MAXQSLEN+1) ; lex.string = lexptr ; ndx = MAXQSLEN ; expcnt = 0 ; while (1) { if (chr->class1 == CCEOF || chr->class1 == CCERR) { *lexptr = '\0' ; errmsg(28,rtnnme,qschr,qechr,lex.string) ; FREE(lex.string) ; lex.string = NULL ; return (&lex_err) ; } if ((qechr == ' ' && chr->class1 == CCINV) || (qechr == '\0' && (chr->class1 == CCINV || chr->class1 == CCDEL))) break ; if (chr->chrtrn == qechr) { if (qechr >= ' ') { chr = nxtchar(stream,mode) ; if (chr->chrtrn != qechr) { if (chr->class1 != CCEOF && chr->class1 != CCERR) ungetc(chr->chrtrn,stream) ; break ; } } else break ; } *lexptr++ = chr->chrtrn ; ndx-- ; if (ndx <= 0) { expcnt++ ; lexptr = (char *) MALLOC((expcnt+1)*MAXQSLEN+1) ; (void) strncpy(lexptr,lex.string,expcnt*MAXQSLEN) ; FREE(lex.string) ; lex.string = lexptr ; lexptr += expcnt*MAXQSLEN ; ndx = MAXQSLEN ; } chr = nxtchar(stream,mode) ; } if (lex.string == lexptr) { FREE(lex.string) ; lex.string = NULL ; return (&lex_nil) ; } else lex.class = DY_LCQS ; break ; } default: { errmsg(5,rtnnme,"string type",stype) ; ungetc(chr->chrtrn,stream) ; return (&lex_err) ; } } /* That's it. Terminate the string and return. Note that this return is used only when a non-null string has been scanned. */ *lexptr = '\0' ; return (&lex) ; } #undef MAXQSLEN /* The following output routines provide some measure of isolation for output, but their major function in life is to localize echoing control. */ void dyio_flushio (ioid id, bool echo) /* This routine flushes buffered output. It is strictly an interface routine, to hide the translation from integer stream id to the stdio stream handle and localize echoing control. If id == 0 and echo == FALSE, nothing happens. If id == 0 and echo == TRUE, only stdout is affected. (etc.) Parameters: id: stream id from dyio_openfile echo: specifies if we're echoing to stdout, and hence should flush it Returns: undefined */ { FILE *strmid ; filblk_struct *filblk ; const char *rtnnme = "dyio_flushio" ; /* Check for sane id. */ if (INVALID_IOID(id)) { errmsg(5,rtnnme,"i/o id",id) ; return ; } /* Flush the stream specified by id, if it's active and writeable. */ if (id != IOID_NOSTRM) { filblk = &filblks[id] ; if (flgon(filblk->modes,io_active) == FALSE) { errmsg(15,rtnnme,id) ; } else if (flgon(filblk->modes,io_write) == FALSE) { errmsg(17,rtnnme,dyio_idtopath(id)) ; } else { strmid = filblk->stream ; if (fflush(strmid) != 0) perror(rtnnme) ; } } /* Flush stdout if echo is TRUE. stdout is assumed active and writeable. */ if (echo == TRUE) if (fflush(stdout) != 0) perror(rtnnme) ; return ; } void dyio_outfmt (ioid id, bool echo, const char *pattern, ... ) /* This routine provides the client with an interface to the vfprintf routine, while maintaining a logging facility. The form of the call should be dyio_outfmt(id,echo,pattern,parm1, ... ,parmn) If id == 0 and echo == FALSE, nothing happens. If id == 0 and echo == TRUE, only stdout is affected. (etc.) Parameters: id: stream id from dyio_openfile echo: TRUE to echo to user's tty, FALSE otherwise pattern: output pattern, passed to printf parmi: the parameters for the pattern Returns: undefined */ { va_list parms ; filblk_struct *filblk ; const char *rtnnme = "dyio_outfmt" ; /* Sanity checks on i/o id and pattern. */ if (INVALID_IOID(id)) { errmsg(5,rtnnme,"i/o id",id) ; return ; } if (pattern == NULL) { errmsg(2,rtnnme,"pattern") ; return ; } /* Print to stream id, assuming it's active and writeable. */ va_start(parms,pattern) ; if (id != IOID_NOSTRM) { filblk = &filblks[id] ; if (flgon(filblk->modes,io_active) == FALSE) { errmsg(15,rtnnme,id) ; } else if (flgon(filblk->modes,io_write) == FALSE) { errmsg(17,rtnnme,dyio_idtopath(id)) ; } else { (void) vfprintf(filblk->stream,pattern,parms) ; } } /* Print to stdout if echo is TRUE and the stream id is not stdout. stdout is assumed active and writeable. */ if (echo == TRUE && id != dyio_pathtoid("stdout",NULL)) (void) vfprintf(stdout,pattern,parms) ; va_end(parms) ; return ; } void dyio_outchr (ioid id, bool echo, char chr) /* This routine interfaces to the fputc function. Note that it traps chr == '\0' as an error. If id == 0 and echo == FALSE, nothing happens. If id == 0 and echo == TRUE, only stdout is affected. Parameters: id: stream id from dyio_openfile echo: TRUE to echo to user's tty, FALSE otherwise chr: character to be output Returns: undefined */ { FILE *strmid ; filblk_struct *filblk ; const char *rtnnme = "dyio_outchr" ; /* Sanity checks on the parameters. */ if (INVALID_IOID(id)) { errmsg(5,rtnnme,"i/o id",id) ; return ; } if (chr == '\0') { errmsg(2,rtnnme,"chr") ; return ; } /* Write the character to the stream, if it's active and writeable. */ if (id != IOID_NOSTRM) { filblk = &filblks[id] ; if (flgon(filblk->modes,io_active) == FALSE) { errmsg(15,rtnnme,id) ; } else if (flgon(filblk->modes,io_write) == FALSE) { errmsg(17,rtnnme,dyio_idtopath(id)) ; } else { strmid = filblk->stream ; putc(chr,filblks[id].stream) ; } } /* Write the character to stdout, if echo is TRUE and the stream id is not stdout. stdout is assumed to be active and writeable. */ if (echo == TRUE && id != dyio_pathtoid("stdout",NULL)) putc(chr,stdout) ; return ; } int dyio_outfxd (char *buffer, int fldsze, char lcr, const char *pattern, ... ) /* The form of the call should be dyio_outfxd (buffer,fldsze,lcr,pattern,parm1, ... parmn) The input to this routine is a varargs list comprising the name of a buffer, a field size, an 'lcr' (left/centre/right) character, and finally a pattern and parameter list to be used by vsprintf. 'lcr' is an indication of whether the output is to be left justified, centered, or right justified. Strings longer than the specified fieldsize are truncated. The maximum fieldsize is limited (arbitrarily) to FLDMAX characters, since we have to keep a hidden buffer (FLDMAX is 240 currently). Centering is the only real work here. Spaces is an array of FLDMAX spaces. A negative fldsze for left justification is interpreted to mean "don't pad, just truncate if necessary". Parameters: buffer: buffer area used to construct the field fldsze: desired size of the output field lcr: left-justified ('l'), centered ('c'), or right-justified ('r') pattern: output pattern, passed to printf parms: the parameters for the pattern Returns: the length of the string placed in the buffer; 0 is returned in the event of an error */ #define FLDMAX 240 { int count ; va_list parms ; static char ourbuf[FLDMAX+1] ; static char spaces[FLDMAX] ; int tlen,hlen ; bool pad ; static bool frstflg = TRUE ; const char *rtnnme = "dyio_outfxd" ; /* Load the spaces array just once. */ if (frstflg == TRUE) for (count = 0 ; count < FLDMAX ; count++) { *(spaces+count) = ' ' ; frstflg = FALSE ; } /* Do some sanity checks. */ if (buffer == NULL) { errmsg(2,rtnnme,"buffer") ; return (0) ; } pad = (fldsze < 0)? FALSE : TRUE ; fldsze = abs(fldsze) ; if (fldsze < 1 || fldsze > FLDMAX) { errmsg(5,rtnnme,"fldsze",fldsze) ; return (0) ; } if (lcr != 'l' && lcr != 'c' && lcr != 'r') { errmsg(3,rtnnme,"left/center/right",lcr) ; return (0) ; } if (pattern == NULL) { errmsg(2,rtnnme,"pattern") ; return (0) ; } /* vsprintf builds the user's string in ourbuf. Then use fldsze and lcr to construct the string we return to the user. */ va_start(parms,pattern) ; (void) vsprintf (ourbuf,pattern,parms) ; va_end(parms) ; tlen = strlen(ourbuf) ; switch (lcr) { case 'l': { if (fldsze > tlen) { memcpy((void *) buffer,(void *) ourbuf,tlen) ; if (pad == TRUE) memcpy((void *) (buffer+tlen),(void *) spaces,fldsze-tlen) ; else fldsze = tlen ; } else { memcpy((void *) buffer,(void *) ourbuf,fldsze) ; } break ; } case 'c': { if (fldsze > tlen) { hlen = fldsze-tlen ; memcpy((void *) buffer,(void *) spaces,hlen>>1) ; memcpy((void *) (buffer+(hlen>>1)),(void *) ourbuf,tlen) ; memcpy((void *) (buffer+(hlen>>1)+tlen), (void *) spaces,hlen-(hlen>>1)) ; } else { memcpy((void *) buffer,(void *) ourbuf,fldsze) ; } break ; } case 'r': { if (fldsze > tlen) { memcpy((void *) buffer,(void *) spaces,fldsze-tlen) ; memcpy((void *) (buffer+fldsze-tlen),(void *) ourbuf,tlen) ; } else { memcpy((void *) buffer,(void *) ourbuf,fldsze) ; } break ; } } buffer[fldsze] = '\0' ; return (fldsze) ; } #undef FLDMAX #ifdef _DYLIB_FORTRAN void dyio_outfmt_ (integer *ftnid, logical *ftnecho, char *pattern, ... ) /* This routine provides a Fortran client with an interface to the vfprintf routine of ANSI C and the logging facilities of this i/o library. It deals with translating the argument types supplied by Fortran-to-C interface conventions into the arguments required by vprintf. The method is to construct a new varargs block, which is handed over to vprintf. To do this, we have to make the fragile assumption that a varargs block is constructed in a straightforward manner --- as data items written into a contiguous block of storage which we can allocate. There are more extensive comments with errmsg_ and warn_ in errs.c. The call over in Fortran will look like dyio_outfmt(id,echo,pattern,ftnargtype1,arg1, ... , ftnargtypen,argn,ftnargEND) The routine deals with a limited set of argument types: the Fortran types integer, double_precision, and character, and the special categories of variable and constraint names (the last two historical artifacts from the initial impetus for this routine -- the Fortran ylp library -- now replaced by dylp). A special type code is used to indicate the end of the list of pairs. If id == 0 and echo == FALSE, nothing happens. If id == 0 and echo == TRUE, only stdout is affected. (etc.) Parameters: ftnid: the i/o id ftnecho: true to echo output to stdout pattern: output pattern, passed to printf argtype, arg: the parameters for the pattern Returns: undefined */ { va_list fargs,varargp ; ioid id ; bool echo ; filblk_struct *filblk ; int type; double varargs[64] ; /* double avoids alignment problems */ int intarg ; double dblarg ; char *chararg ; const char *rtnnme = "dyio_outfmt_" ; /* Convert the stream id and echo values. */ id = (ioid) *ftnid ; echo = (*ftnecho == TRUEL)?TRUE:FALSE ; /* Sanity checks on stream id and pattern. */ if (INVALID_IOID(id)) { errmsg(5,rtnnme,"i/o id",id) ; return ; } if (id != IOID_NOSTRM) { filblk = &filblks[id] ; if (flgon(filblk->modes,io_active) == FALSE) { errmsg(15,rtnnme,id) ; return ; } if (flgon(filblk->modes,io_write) == FALSE) { errmsg(17,rtnnme,dyio_idtopath(id)) ; return ; } } if (pattern == NULL) { errmsg(2,rtnnme,"pattern") ; return ; } /* Now start up a loop to process the remainder of the arguments. For each pair, we pull off the type and use it to condition a switch with a case for each type of argument we're prepared to deal with. */ varargp = (va_list) &varargs[0] ; va_start(fargs,pattern) ; for (type = (int) *va_arg(fargs,integer *) ; type != ftnargEND ; type = (int) *va_arg(fargs,integer *)) switch (type) { case ftnargINTEGER: { intarg = (int) *va_arg(fargs,integer *) ; *((int *) varargp) = intarg ; if (intarg != va_arg(varargp,int)) { errmsg(1,rtnnme,__LINE__) ; return ; } break ; } case ftnargDOUBLE_PRECISION: { dblarg = (double) *va_arg(fargs,double_precision *) ; memcpy(varargp,&dblarg,sizeof(double)) ; if (dblarg != va_arg(varargp,double)) { errmsg(1,rtnnme,__LINE__) ; return ; } break ; } case ftnargCHARACTER: { chararg = va_arg(fargs,char *) ; *((char **) varargp) = chararg ; if (chararg != va_arg(varargp,char *)) { errmsg(1,rtnnme,__LINE__) ; return ; } break ; } default: { errmsg(7,rtnnme,__LINE__,"Fortran argument type code",type) ; return ; } } va_end(fargs) ; /* Finally, do the printing. Print to stdout if echo is TRUE. stdout is assumed active and writeable. */ if (id != IOID_NOSTRM) { (void) vfprintf(filblk->stream,pattern,((va_list) &varargs[0])) ; } if (echo == TRUE) { (void) vfprintf(stdout,pattern,((va_list) &varargs[0])) ; } return ; } #endif /* _DYLIB_FORTRAN */ DyLP-1.6.0/DyLP/src/Dylp/0000755000076700007670000000000011414302677011600 5ustar DyLP-1.6.0/DyLP/src/Dylp/dy_hotstart.c0000644000076700007670000006051311033030745014304 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains the routines that handle a hot start. The assumption is that the dylp data structures already exist, and the previous run terminated with one of optimal, infeasible, or unbounded status. The guiding principle, when thinking about this bit of code, was ``thou shalt not change the basis.'' For convenience with this initial implementation, I've actually held to ``thou shalt not change the set of constraints or variables in the constraint system''. This seemed like a good boundary because the user doesn't have access to the active system. Making it visible would violate all kinds of modularity principles, and writing a bunch of utility routines to make changes didn't strike me as fun. It's not possible to allow the user to change inactive constraints or variables because this could change the indices of the remaining constraints or variables (as they're moved to make room or fill holes) and hence indices in dy_actcons and dy_actvars could become invalid. The limitation that this imposes is that if you want to add or delete a constraint or variable, you have to drop back to warm start. What is allowed is changes to the variable upper and lower bounds, and the right hand side and objective function coefficients. The user must set flags indicating which arrays have been modified. Changes to the rhs and bounds interact, because the rhs values in the active system (dy_sys) must be corrected to reflect the values of inactive variables. A change to either will trigger a reinstallation of the rhs array followed by recalculation of the correction required for inactive variables. (This seems like overkill until you consider that it's no more work to do the calculation from scratch than it is to accumulate corrections to the existing values.) A change to the rhs or bounds implies that we need to reset the status array and recalculate the primal variables. Changes to the objective and bounds interact, through the contribution of inactive variables to the objective. A change to the objective also implies that we need to recalculate the dual variables. */ #define DYLP_INTERNAL #include "dylp.h" static char sccsid[] UNUSED = "@(#)dy_hotstart.c 4.5 11/06/04" ; static char svnid[] UNUSED = "$Id: dy_hotstart.c 243 2008-07-03 01:56:53Z lou $" ; /* This routine is exported only to dy_coldstart and dy_warmstart, as well as being used in dy_hotstart. */ void dy_setfinalstatus (void) /* This code is common to all three start routines (coldstart, warmstart, hotstart). It scans the newly calculated basic variables and assigns them their final status. In the process, it calculates the number of infeasible variables, and the total infeasibility. Parameters: none Returns: undefined */ { int aindx, xkndx ; double xk,lbk,ubk ; # ifdef DYLP_PARANOIA const char *rtnnme = "dy_setfinalstatus" ; # endif # ifndef DYLP_NDEBUG if (dy_opts->print.crash >= 2) dyio_outfmt(dy_logchn,dy_gtxecho,"\n\testablishing final status ...") ; # endif dy_lp->infeas = 0.0 ; dy_lp->infeascnt = 0 ; /* Step through the constraints, and have a look at the basic variable in each position. The paranoid check will complain if the basis is corrupt, but since nothing can go wrong if we're not paranoid, it just complains and moves to the next entry. */ for (aindx = 1 ; aindx <= dy_sys->concnt ; aindx++) { xkndx = dy_basis[aindx] ; xk = dy_xbasic[aindx] ; lbk = dy_sys->vlb[xkndx] ; ubk = dy_sys->vub[xkndx] ; # ifdef DYLP_PARANOIA if (xkndx <= 0 || xkndx > dy_sys->varcnt) { errmsg(303,rtnnme,dy_sys->nme,aindx,1,xkndx,dy_sys->varcnt) ; continue ; } # endif switch (dy_status[xkndx]) { case vstatB: { if (atbnd(xk,lbk)) { dy_status[xkndx] = vstatBLB ; } else if (belowbnd(xk,lbk)) { dy_lp->infeascnt++ ; dy_lp->infeas += lbk-xk ; dy_status[xkndx] = vstatBLLB ; } else if (atbnd(xk,ubk)) { dy_status[xkndx] = vstatBUB ; } else if (abovebnd(xk,ubk)) { dy_lp->infeascnt++ ; dy_lp->infeas += xk-ubk ; dy_status[xkndx] = vstatBUUB ; } break ; } case vstatBFX: { if (!atbnd(xk,lbk)) { if (belowbnd(xk,lbk)) { dy_lp->infeascnt++ ; dy_lp->infeas += lbk-xk ; dy_status[xkndx] = vstatBLLB ; } else { dy_lp->infeascnt++ ; dy_lp->infeas += xk-ubk ; dy_status[xkndx] = vstatBUUB ; } } break ; } } # ifndef DYLP_NDEBUG if (dy_opts->print.crash >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t %s (%d) %s", consys_nme(dy_sys,'v',xkndx,FALSE,NULL),xkndx, dy_prtvstat(dy_status[xkndx])) ; if (lbk > -dy_tols->inf) dyio_outfmt(dy_logchn,dy_gtxecho,", lb = %g",lbk) ; dyio_outfmt(dy_logchn,dy_gtxecho,", val = %g",xk) ; if (ubk < dy_tols->inf) dyio_outfmt(dy_logchn,dy_gtxecho,", ub = %g",ubk) ; if (flgon(dy_status[xkndx],vstatBLLB|vstatBUUB)) { dyio_outfmt(dy_logchn,dy_gtxecho,", infeasibility = ") ; if (flgon(dy_status[xkndx],vstatBLLB)) dyio_outfmt(dy_logchn,dy_gtxecho,"%g",lbk-xk) ; else dyio_outfmt(dy_logchn,dy_gtxecho,"%g",xk-ubk) ; } dyio_outchr(dy_logchn,dy_gtxecho,'.') ; } # endif } setcleanzero(dy_lp->infeas,dy_tols->zero) ; return ; } static void hot_updateMiscState (lpret_enum lpret) /* Reset various bits of miscellaneous state before we resume simplex pivoting. Pulled out of dy_hotstart so that I can call this in two places. Parameters: none Returns: undefined */ { dy_lp->lpret = lpret ; dy_lp->tot.iters = 0 ; dy_lp->tot.pivs = 0 ; dy_lp->prev_pivok = dy_lp->pivok ; dy_lp->pivok = FALSE ; dy_lp->degenpivcnt = 0 ; dy_lp->idlecnt = 0 ; return ; } static bool process_inactive (lpprob_struct *orig_lp, int oxkndx) /* This routine handles the data structure updates for an inactive variable x. We need to have a look at the bounds l and u, and perhaps update the status kept in dy_origvars. We need to add the contribution cl or cu to the objective function. Finally, if we've reloaded b & blow due to a bound or rhs change, we need to walk the column a and adjust b (and perhaps blow) for each nonzero a in the active system. Parameters: orig_lp: the original lp problem oxkndx: index of x in orig_sys Returns: TRUE if the update is made without incident, FALSE otherwise. */ { int oaindx,aindx,ndx ; double xk,lk,uk,ck ; pkvec_struct *ak ; pkcoeff_struct *aik ; consys_struct *orig_sys ; flags xkstatus ; const char *rtnnme = "process_inactive" ; orig_sys = orig_lp->consys ; xkstatus = getflg(orig_lp->status[oxkndx],vstatSTATUS) ; # ifdef DYLP_PARANOIA /* Any inactive variable should be nonbasic, and the paranoid check is looking to make sure of this. */ if (!VALID_STATUS(xkstatus)) { errmsg(300,rtnnme,(int) xkstatus, consys_nme(orig_sys,'v',oxkndx,FALSE,NULL),oxkndx) ; return (FALSE) ; } if (flgoff(xkstatus,vstatNONBASIC|vstatNBFR)) { errmsg(433,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "inactive",consys_nme(orig_sys,'v',oxkndx,TRUE,NULL),oxkndx, dy_prtvstat(xkstatus)) ; return (FALSE) ; } # endif /* The bounds can change arbitrarily, and the client may not be maintaining the status vector, but we're limited in what we can do --- bounds and status are our only clues to the value of an inactive variable. (Contrast with the equivalent section in process_active.) */ lk = orig_sys->vlb[oxkndx] ; uk = orig_sys->vub[oxkndx] ; ck = orig_sys->obj[oxkndx] ; /* Start with the case that both bounds are finite. Use a previous status of NBLB or NBUB. Otherwise, guess from the sign of the objective coefficient. `Dirty' fixed variables are marked as unloadable. */ if (lk > -dy_tols->inf && uk < dy_tols->inf) { if (atbnd(lk,uk) && lk != uk) { if (flgon(xkstatus,vstatNBLB|vstatNBUB)) { setflg(xkstatus,vstatNOLOAD) ; } else { if (ck < 0) { xkstatus = vstatNBUB|vstatNOLOAD ; } else { xkstatus = vstatNBLB|vstatNOLOAD ; } } # ifndef DYLP_NDEBUG if (dy_opts->print.setup >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\tDirty fixed variable %s (%d)", consys_nme(orig_sys,'v',oxkndx,0,0),oxkndx) ; dyio_outfmt(dy_logchn,dy_gtxecho, " assigned status %s.",dy_prtvstat(xkstatus)) ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t original lb = %g, ub = %g, diff = %g, tol = %g", lk,uk,uk-lk,dy_tols->pfeas) ; } # endif } else if (lk == uk) { xkstatus = vstatNBFX|vstatNOLOAD ; } else if (flgon(xkstatus,vstatNBLB|vstatNBUB)) { xkstatus = orig_lp->status[oxkndx] ; } else { if (ck < 0) { xkstatus = vstatNBUB ; } else { xkstatus = vstatNBLB ; } } } /* Variables with one bound, or no bounds. No choices here. */ else if (lk > -dy_tols->inf) { xkstatus = vstatNBLB ; } else if (uk < dy_tols->inf) { xkstatus = vstatNBUB ; } else { xkstatus = vstatNBFR ; } /* Determine the variable's value and set up the status entries. The default case in the switch below should never execute, but it serves for paranoia and lets gcc conclude xk will always have a value. Consider whether it's really a good idea to change orig_lp->status. */ switch (getflg(xkstatus,vstatSTATUS)) { case vstatNBLB: case vstatNBFX: { xk = lk ; break ; } case vstatNBUB: { xk = uk ; break ; } case vstatNBFR: { xk = 0 ; break ; } default: { xk = 0 ; errmsg(1,rtnnme,__LINE__) ; return (FALSE) ; } } orig_lp->status[oxkndx] = xkstatus ; dy_origvars[oxkndx] = -((int) xkstatus) ; /* Note any contribution to the objective and constraint rhs & rhslow values. */ dy_lp->inactzcorr += xk*orig_sys->obj[oxkndx] ; if (flgon(orig_lp->ctlopts,lpctlRHSCHG|lpctlLBNDCHG|lpctlUBNDCHG)) { ak = NULL ; if (consys_getcol_pk(orig_sys,oxkndx,&ak) == FALSE) { errmsg(122,rtnnme,orig_sys->nme,"variable", consys_nme(orig_sys,'v',oxkndx,TRUE,NULL),oxkndx) ; if (ak != NULL) pkvec_free(ak) ; return (FALSE) ; } for (ndx = 0, aik = &ak->coeffs[0] ; ndx < ak->cnt ; ndx++, aik++) { oaindx = aik->ndx ; if (ACTIVE_CON(oaindx)) { aindx = dy_origcons[oaindx] ; dy_sys->rhs[aindx] -= aik->val*xk ; if (dy_sys->ctyp[aindx] == contypRNG) dy_sys->rhslow[aindx] -= aik->val*xk ; } } pkvec_free(ak) ; } /* And we're done. Print some information and return. */ # ifndef DYLP_NDEBUG if (dy_opts->print.crash >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t %s (%d) %s inactive with value ", consys_nme(orig_sys,'v',oxkndx,FALSE,NULL),oxkndx, dy_prtvstat(xkstatus)) ; switch (getflg(xkstatus,vstatSTATUS)) { case vstatNBFX: case vstatNBLB: case vstatNBUB: case vstatNBFR: { dyio_outfmt(dy_logchn,dy_gtxecho,"%g.",xk) ; break ; } default: { dyio_outfmt(dy_logchn,dy_gtxecho,"??.") ; break ; } } } # endif return (TRUE) ; } static void process_active (lpprob_struct *orig_lp, int oxkndx) /* This routine handles the data structure updates for an active variable x. We need to copy the new values for l, u, and c into the active system. For nonbasic variables, we need to choose a status based on the bounds. For basic variables, the status vector encodes the basis index, so we need to decide on an initial status --- either B, BFX, or BFR. The routine expects that bounds have been groomed (i.e., if the difference between l and u is less than the feasibility tolerance, they have been forced to exact equality). Parameters: orig_lp: the original lp problem oxkndx: index of x in orig_sys Returns: undefined (the only possible error is a paranoid check) */ { int xkndx ; double lk,uk,xk ; flags xkstatus ; consys_struct *orig_sys ; # ifdef DYLP_PARANOIA const char *rtnnme = "process_active" ; # endif orig_sys = orig_lp->consys ; /* Get the index of the variable in the active system, and the status. The paranoid check is that we're not attempting to convert between basic and nonbasic status. */ xkndx = dy_origvars[oxkndx] ; xkstatus = dy_status[xkndx] ; # ifdef DYLP_PARANOIA if ((flgon(xkstatus,vstatBASIC) && ((int) orig_lp->status[oxkndx]) > 0) || (flgon(xkstatus,vstatNONBASIC|vstatNBFR) && ((int) orig_lp->status[oxkndx]) < 0)) { char buf[30] ; if (((int) orig_lp->status[oxkndx]) > 0) strcpy(buf,dy_prtvstat(orig_lp->status[oxkndx])) ; else strcpy(buf,"unspecified basic") ; errmsg(398,rtnnme,dy_sys->nme,consys_nme(dy_sys,'v',xkndx,FALSE,NULL), xkndx,dy_prtvstat(xkstatus),buf) ; return ; } # endif /* Update the bounds and objective coefficient. */ lk = orig_sys->vlb[oxkndx] ; dy_sys->vlb[xkndx] = lk ; uk = orig_sys->vub[oxkndx] ; dy_sys->vub[xkndx] = uk ; dy_sys->obj[xkndx] = orig_sys->obj[oxkndx] ; /* For nonbasic variables, set the proper status based on the bounds and put the proper value in dy_x. Because the bounds can change arbitrarily and the client may not be maintaining the status vector, it's easiest to start from scratch, using the value from dy_x to decide the best new status. For basic variables, just decide between strictly basic (B), basic fixed (BFX), and basic free (BFR). This will be correct, in the absence of bound changes, and the values held in dy_x and dy_xbasic are unchanged. If bounds have changed, we'll recalculate the primal variables and then decide on the final status of basic variables (which could be BLLB or BUUB). */ if (flgon(dy_status[xkndx],vstatNONBASIC|vstatNBFR)) { if (lk > -dy_tols->inf && uk < dy_tols->inf) { if (lk == uk) { xkstatus = vstatNBFX ; xk = lk ; } else if ((dy_x[xkndx] - lk) < (uk-dy_x[xkndx])) { xkstatus = vstatNBLB ; xk = lk ; } else { xkstatus = vstatNBUB ; xk = uk ; } } else if (lk > -dy_tols->inf) { xkstatus = vstatNBLB ; xk = lk ; } else if (uk < dy_tols->inf) { xkstatus = vstatNBUB ; xk = uk ; } else { xkstatus = vstatNBFR ; xk = 0 ; } dy_x[xkndx] = xk ; } else { if (lk == uk) xkstatus = vstatBFX ; else if (lk <= -dy_tols->inf && uk >= dy_tols->inf) xkstatus = vstatBFR ; else xkstatus = vstatB ; } dy_status[xkndx] = xkstatus ; /* We're done. Print some information and return. */ # ifndef DYLP_NDEBUG if (dy_opts->print.crash >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t %s (%d) %s active", consys_nme(dy_sys,'v',xkndx,FALSE,NULL),xkndx, dy_prtvstat(dy_status[xkndx])) ; if (flgon(xkstatus,vstatNONBASIC|vstatNBFR)) dyio_outfmt(dy_logchn,dy_gtxecho," with value %g.",dy_x[xkndx]) ; else dyio_outchr(dy_logchn,dy_gtxecho,'.') ; } # endif return ; } dyret_enum dy_hotstart (lpprob_struct *orig_lp) /* This routine is responsible for handling a hot start. The assumption is that all data structures are in place, and that the user is allowed to change the bounds on variables and any of the rhs and objective coefficients. See the comments at the head of the file. Changes to the rhs and bounds are handled first. We reinstall the rhs array, then scan the variables, updating bounds and status and making the rhs corrections required for inactive variables. If the bounds or rhs change, we need new primals. After we calculate new primals, we'll need to scan the basic variables and make sure their final status is correct. If the objective or bounds change, we need to recalculate the contribution to the objective from inactive variables. If the objective changes, we need new duals. (It's also true that if the objective changes, we need new reduced costs, but that's handled in commonstart.) The most likely situation is that we haven't pivoted since refactoring as part of the preoptimality sequence, so we shouldn't need to refactor here. Instead, we leave it to dy_duenna to pick this up with the next pivot, as well as any possible accuracy check. Once all the changes have been incorporated, calculate primals and duals to determine primal and dual feasibility, and select the appropriate simplex phase in dy_lp->simplex.next. Parameters: orig_lp: The original lp problem structure Returns: dyrOK if the setup completes without error, dyrINV or dyrFATAL otherwise. */ { int oxkndx,xkndx,oaindx,aindx ; double *ogvlb,*dyvlb,*ogvub,*dyvub,*ogobj,*dyobj,*dyrhs,*ogrhs ; double lbj,ubj ; consys_struct *orig_sys ; flags *ogstatus,calcflgs,statk ; dyret_enum retval ; lpret_enum lpret ; dyphase_enum phase ; const char *rtnnme = "dy_hotstart" ; /* dy_scaling.c */ extern void dy_refreshlclsystem(flags what) ; /* dy_force.c */ extern dyphase_enum dy_forceFull(consys_struct *orig_sys) ; /* It could happen that there are no changes, in which case there's no point in going through the motions. */ if (flgoff(orig_lp->ctlopts, lpctlLBNDCHG|lpctlUBNDCHG|lpctlOBJCHG|lpctlRHSCHG)) { # ifndef DYLP_NDEBUG if (dy_opts->print.crash >= 1) dyio_outfmt(dy_logchn,dy_gtxecho, "\n no data structure changes at hot start.") ; # endif hot_updateMiscState(lpINV) ; return (dyrOK) ; } /* But it's far more likely there are changes, and we need to get on with them. */ # ifndef DYLP_NDEBUG if (dy_opts->print.crash >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n updating data structures at hot start ...") ; if (dy_opts->print.crash >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n scanning changes to") ; if (flgon(orig_lp->ctlopts,lpctlRHSCHG)) dyio_outfmt(dy_logchn,dy_gtxecho," rhs") ; if (flgon(orig_lp->ctlopts,lpctlLBNDCHG)) dyio_outfmt(dy_logchn,dy_gtxecho," vlb") ; if (flgon(orig_lp->ctlopts,lpctlUBNDCHG)) dyio_outfmt(dy_logchn,dy_gtxecho," vub") ; if (flgon(orig_lp->ctlopts,lpctlOBJCHG)) dyio_outfmt(dy_logchn,dy_gtxecho," obj") ; dyio_outfmt(dy_logchn,dy_gtxecho," ...") ; } } # endif /* Transfer any changes from the client's system to the scaled local copy, if it exists. Then set up convenient handles for the various vectors. */ dy_refreshlclsystem(orig_lp->ctlopts) ; orig_sys = orig_lp->consys ; dyrhs = dy_sys->rhs ; ogrhs = orig_sys->rhs ; ogvlb = orig_sys->vlb ; dyvlb = dy_sys->vlb ; ogvub = orig_sys->vub ; dyvub = dy_sys->vub ; ogobj = orig_sys->obj ; dyobj = dy_sys->obj ; ogstatus = orig_lp->status ; /* If any of the rhs or bounds have been changed, we need to reinstall the rhs and bounds. Begin by scanning the orig_sys rhs array, updating the dy_sys entries for the active constraints. If a range constraint comes by, we also need to set the upper bound of the associated logical. */ if (flgon(orig_lp->ctlopts,lpctlLBNDCHG|lpctlUBNDCHG|lpctlRHSCHG)) { for (aindx = 1 ; aindx <= dy_sys->concnt ; aindx++) { oaindx = dy_actcons[aindx] ; if (oaindx > 0) { dyrhs[aindx] = ogrhs[oaindx] ; if (dy_sys->ctyp[aindx] == contypRNG) { dy_sys->rhslow[aindx] = orig_sys->rhslow[oaindx] ; dyvub[aindx] = dyrhs[aindx]-dy_sys->rhslow[aindx] ; } } } } /* We need to scan the columns no matter what changed. Objective coefficient changes are just copied into the active system as needed. The real action is updating bounds and dealing with the side effects of bounded variables. * Recalculate the contribution to inactzcorr for each inactive variable. * Update dy_sys->vlb, dy_sys->vub, and dy_sys->obj for each active variable. * Update dy_status for each active variable. * Update dy_x for each nonbasic active variable. * Update loadable/unloadable accounting. */ dy_lp->inactzcorr = 0 ; lpret = lpINV ; dy_lp->sys.vars.loadable = 0 ; dy_lp->sys.vars.unloadable = 0 ; for (oxkndx = 1 ; oxkndx <= orig_sys->varcnt ; oxkndx++) { xkndx = dy_origvars[oxkndx] ; lbj = ogvlb[oxkndx] ; ubj = ogvub[oxkndx] ; if (ogvlb[oxkndx] > ogvub[oxkndx]) { lpret = lpINFEAS ; # ifndef DYLP_NDEBUG if (dy_opts->print.setup >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tTrivial infeasibility for %s (%d), lb = %g > ub = %g.", consys_nme(orig_sys,'v',oxkndx,0,0),oxkndx, ogvlb[oxkndx],ogvub[oxkndx]) ; } # endif } /* Inactive variables: update the status in dy_origvars and calculate the contribution to inactzcorr. If we've reloaded rhs and rhslow, correct them to account for the value of the variable. Active variables: touch up bounds for fixed variables, update vlb, vub, and obj arrays for dy_sys, update dy_status, and update dy_x for nonbasic variables. */ if (xkndx < 0) { if (process_inactive(orig_lp,oxkndx) == FALSE) return (dyrFATAL) ; statk = (flags) -dy_origvars[oxkndx] ; if (flgon(statk,vstatNOLOAD)) { dy_lp->sys.vars.unloadable++ ; } else { dy_lp->sys.vars.loadable++ ; } } else { process_active(orig_lp,oxkndx) ; } } /* Now, what do we need? Calculate primal values first. If we calculate new primal variables, we need to reset the status of the basic variables, which means we need to do a quick scan of the logicals to reset their status. Arguably this is not necessary if only the objective changed, but overall it's a good investment of our time. */ if (dy_calcprimals() == FALSE) { errmsg(316,rtnnme,dy_sys->nme) ; return (dyrFATAL) ; } for (xkndx = 1 ; xkndx <= dy_sys->concnt ; xkndx++) { if (dy_var2basis[xkndx] != 0) { if (dyvub[xkndx] == dyvlb[xkndx]) dy_status[xkndx] = vstatBFX ; else dy_status[xkndx] = vstatB ; } } dy_setfinalstatus() ; /* Is the phase I objective installed? If so, remove it. This hurts a bit, particularly if we ultimately end up targetting primal phase I as the starting simplex, but it's the only way to test for a dual feasible start. And if we have dual feasibility, it's a big win. */ if (dy_lp->p1obj.installed == TRUE) { if (dy_swapobjs(dyPRIMAL2) == FALSE) { errmsg(318,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,"remove") ; return (dyrFATAL) ; } } /* Calculate duals and reduced costs and see if we're primal or dual feasible. Calculate the objective just for kicks. */ dy_calcduals() ; if (dy_calccbar() == FALSE) { errmsg(384,rtnnme,dy_sys->nme, dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; return (dyrFATAL) ; } dy_lp->z = dy_calcobj() ; calcflgs = ladPRIMFEAS|ladPFQUIET|ladDUALFEAS|ladDFQUIET ; retval = dy_accchk(&calcflgs) ; if (retval != dyrOK) { errmsg(304,rtnnme,dy_sys->nme, dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; return (retval) ; } if (flgoff(calcflgs,ladPRIMFEAS)) { dy_lp->simplex.next = dyPRIMAL2 ; } else if (flgoff(calcflgs,ladDUALFEAS)) { dy_lp->simplex.next = dyDUAL ; } else { dy_lp->simplex.next = dyPRIMAL1 ; } /* Reset a few control variables and counts in dy_lp. */ hot_updateMiscState(lpret) ; /* And that should do it. Let's make a paranoid check or two, then we're off and running. */ # ifdef DYLP_PARANOIA if (dy_chkdysys(orig_sys) == FALSE) return (dyrFATAL) ; # endif /* Now, is the client forcing the full system on top of the hot start? If so, do it here. We're up and running at this point, so dy_forceFull can do its thing. Normally, dy_forceFull is called when we've failed at primal simplex with a partial system, then tried and failed to force dual feasibility. Make it look like this while we're working. Reset phase to dyINIT and dy_lp->lpret to dyrINV when we're done so that dylp() sees the codes it expects. This is an exceptional activity, so I'm not going out of my way to do this in the most efficient manner. There really isn't a legitimate reason for this --- it's most likely careless coding on the part of the client, but we can cope without too much trouble. */ if (dy_opts->fullsys == TRUE && (dy_lp->sys.cons.loadable > 0 || dy_lp->sys.vars.loadable > 0)) { # ifndef DYLP_NDEBUG if (dy_opts->print.force >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n Forcing full system.") ; } # endif dy_lp->lpret = lpFORCEDUAL ; dy_lp->phase = dyFORCEFULL ; phase = dy_forceFull(orig_sys) ; if (phase == dyINV) { retval = dyrFATAL ; } else { dy_lp->lpret = lpINV ; dy_lp->phase = dyINIT ; retval = dyrOK ; } } else { retval = dyrOK ; } return (retval) ; } DyLP-1.6.0/DyLP/src/Dylp/dylp_utils.c0000644000076700007670000023515511245632140014140 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains utility routines for the dylp dynamic simplex package. */ #define DYLP_INTERNAL #include "dylib_strrtns.h" #include "dylp.h" #include static char sccsid[] UNUSED = "@(#)dylp_utils.c 4.6 10/15/05" ; static char svnid[] UNUSED = "$Id: dylp_utils.c 299 2009-08-28 01:35:28Z lou $" ; lpret_enum dyret2lpret (dyret_enum dyret) /* Simple-minded utility routine to translate dyret_enum codes into lpret_enum codes. A consequence of trying to contain ripples from a rewrite of the simplex routines. dyret codes without direct correspondence translate into lpINV, but in context this isn't a problem. Parameter: dyret: dyret_enum code Returns: corresponding lpret_enum code, as best it can figure it out. */ { switch (dyret) { case dyrOK: { return (lpINV) ; } case dyrOPTIMAL: { return (lpOPTIMAL) ; } case dyrUNBOUND: { return (lpUNBOUNDED) ; } case dyrSWING: { return (lpSWING) ; } case dyrINFEAS: { return (lpINFEAS) ; } case dyrREQCHK: { return (lpINV) ; } case dyrACCCHK: { return (lpACCCHK) ; } case dyrLOSTPFEAS: { return (lpLOSTFEAS) ; } case dyrLOSTDFEAS: { return (lpLOSTFEAS) ; } case dyrDEGEN: { return (lpINV) ; } case dyrRESELECT: { return (lpINV) ; } case dyrMADPIV: { return (lpINV) ; } case dyrPUNT: { return (lpPUNT) ; } case dyrPATCHED: { return (lpINV) ; } case dyrNUMERIC: { return (lpFATAL) ; } case dyrBSPACE: { return (lpNOSPACE) ; } case dyrSTALLED: { return (lpSTALLED) ; } case dyrITERLIM: { return (lpITERLIM) ; } case dyrFATAL: { return (lpFATAL) ; } case dyINV: { return (lpINV) ; } default: { return (lpINV) ; } } } bool dy_reducerhs (double *rhs, bool init) /* This routine calculates the reduced right-hand-side vector b - Nx, which accounts for nonbasic variables which have nonzero values (either because they are at a nonzero bound, or are superbasic). With that in mind, the routine needs a valid basis, status, and values for the nonbasic variables when it's called. Parameters: rhs: the rhs vector to be reduced init: if TRUE, rhs will be initialised to dy_sys->rhs Returns: true, basically; a false return indicates serious confusion */ { int vndx,pkndx,cndx ; pkvec_struct *pkcol ; const char *rtnnme = "dy_reducerhs" ; #ifdef DYLP_PARANOIA if (rhs == NULL) { errmsg(2,rtnnme,"rhs") ; return (FALSE) ; } if (dy_sys == NULL) { errmsg(2,rtnnme,"dy_sys") ; return (FALSE) ; } if (init == TRUE && dy_sys->rhs == NULL) { errmsg(2,rtnnme,"dy_sys->rhs") ; return (FALSE) ; } if (dy_x == NULL) { errmsg(2,rtnnme,"dy_x") ; return (FALSE) ; } if (dy_status == NULL) { errmsg(2,rtnnme,"dy_status") ; return (FALSE) ; } #endif if (init == TRUE) memcpy(rhs,dy_sys->rhs,(dy_sys->concnt+1)*sizeof(double)) ; /* Walk the status array. For each nonbasic variable with a non-zero value, retrieve the column and reduce the rhs accordingly. Note that we have to consider the logical variables, as a range constraint produces an upper-bounded slack. NBFR variables are 0 by definition. */ pkcol = NULL ; for (vndx = 1 ; vndx <= dy_sys->varcnt ; vndx++) if (flgon(dy_status[vndx],vstatNONBASIC) && dy_x[vndx] != 0.0) { # ifdef DYLP_PARANOIA if (fabs(dy_x[vndx]) >= dy_tols->inf) { errmsg(315,rtnnme,consys_nme(dy_sys,'v',vndx,TRUE,NULL),vndx, dy_prtvstat(dy_status[vndx])) ; return (FALSE) ; } # endif if (consys_getcol_pk(dy_sys,vndx,&pkcol) == FALSE) { errmsg(122,rtnnme,dy_sys->nme,"column", consys_nme(dy_sys,'v',vndx,TRUE,NULL),vndx) ; return (FALSE) ; } for (pkndx = 0 ; pkndx < pkcol->cnt ; pkndx++) { cndx = pkcol->coeffs[pkndx].ndx ; rhs[cndx] -= pkcol->coeffs[pkndx].val*dy_x[vndx] ; } } /* And a little quick grooming. */ for (cndx = 1 ; cndx <= dy_sys->concnt ; cndx++) setcleanzero(rhs[cndx],dy_tols->zero) ; if (pkcol != NULL) pkvec_free(pkcol) ; return (TRUE) ; } bool dy_calcprimals (void) /* This routine calculates the values of the basic variables, leaving the result in dy_x. dy_xbasic is updated if the antidegeneracy machinery is idle. There's little to do here - dy_reducerhs and dy_ftran do all the heavy lifting. Returns: TRUE unless there's serious confusion. */ { int vndx,bndx ; double *xvec ; bool degenActive ; const char *rtnnme = "dy_calcprimals" ; # ifndef DYLP_NDEBUG int print ; switch (dy_lp->phase) { case dyPRIMAL1: { print = dy_opts->print.phase1 ; break ; } case dyPRIMAL2: { print = dy_opts->print.phase2 ; break ; } case dyDUAL: { print = dy_opts->print.dual ; break ; } case dyADDCON: { if (dy_opts->print.conmgmt >= 3) print = 5 ; else print = 0 ; break ; } case dyADDVAR: { if (dy_opts->print.varmgmt >= 3) print = 5 ; else print = 0 ; break ; } case dyINIT: { if (dy_opts->print.crash >= 4) print = 7 ; else print = 0 ; break ; } default: { print = 0 ; break ; } } # endif #ifdef DYLP_PARANOIA if (dy_xbasic == NULL) { errmsg(2,rtnnme,"xbasic") ; return (FALSE) ; } if (dy_sys == NULL) { errmsg(2,rtnnme,"dy_sys") ; return (FALSE) ; } if (dy_x == NULL) { errmsg(2,rtnnme,"dy_x") ; return (FALSE) ; } if (dy_basis == NULL) { errmsg(2,rtnnme,"dy_basis") ; return (FALSE) ; } #endif xvec = NULL ; if (dy_lp->degen > 0 && (dy_lp->phase == dyPRIMAL1 || dy_lp->phase == dyPRIMAL2)) { degenActive = TRUE ; } else { degenActive = FALSE ; } /* For the normal case of a non-empty basis ... */ if (dy_sys->concnt > 0) { /* Is the antidegeneracy machinery active? If so, we need to allocate a vector for the calculation so as not to erase the perturbation in dy_xbasic. */ if (degenActive == TRUE) { xvec = (double *) MALLOC((dy_sys->concnt+1)*sizeof(double)) ; } else { xvec = dy_xbasic ; } /* Calculate x = inv(B)(rhs - Ax). dy_reducerhs accounts for nonbasic variables with nonzero values. dy_ftran takes care of premultiplying by the basis inverse. Then update the primal feasibility tolerance. */ if (dy_reducerhs(xvec,TRUE) == FALSE) { errmsg(340,rtnnme,dy_sys->nme) ; if (degenActive == TRUE) FREE(xvec) ; return (FALSE) ; } dy_ftran(xvec,FALSE) ; dy_lp->prim.norm1 = exvec_1norm(xvec,dy_sys->concnt) ; dy_lp->prim.norm2 = exvec_2norm(xvec,dy_sys->concnt) ; dy_lp->prim.max = exvec_infnorm(xvec,dy_sys->concnt,&dy_lp->prim.maxndx) ; dy_tols->pfeas = dy_lp->prim.max ; if (dy_tols->pfeas < 10.0) dy_tols->pfeas = dy_tols->zero ; else dy_tols->pfeas = log10(dy_tols->pfeas)*dy_tols->zero ; dy_tols->pfeas = dy_tols->pfeas_scale*dy_tols->pfeas ; /* Update dy_x. */ if (dy_lp->phase == dyPRIMAL1 || dy_lp->phase == dyPRIMAL2) { for (bndx = 1 ; bndx <= dy_sys->concnt ; bndx++) { vndx = dy_basis[bndx] ; if (flgon(dy_status[vndx],vstatBFX)) { # ifdef DYLP_PARANOIA if (!withintol(xvec[bndx],dy_sys->vub[vndx],dy_tols->zero)) { if (!withintol(xvec[bndx],dy_sys->vub[vndx],dy_tols->pfeas*100)) { errmsg(333,rtnnme,dy_sys->nme, dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, consys_nme(dy_sys,'v',vndx,FALSE,NULL),vndx, dy_prtvstat(dy_status[vndx]),xvec[bndx], dy_x[vndx],"fix",fabs(dy_sys->vub[vndx]-xvec[bndx]), dy_tols->pfeas*100) ; } else { warn(333,rtnnme,dy_sys->nme, dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, consys_nme(dy_sys,'v',vndx,FALSE,NULL),vndx, dy_prtvstat(dy_status[vndx]),xvec[bndx], dy_x[vndx],"fix",fabs(dy_sys->vub[vndx]-xvec[bndx]), dy_tols->zero) ; } } # endif dy_x[vndx] = xvec[bndx] ; } else { dy_x[vndx] = xvec[bndx] ; } } } else { for (bndx = 1 ; bndx <= dy_sys->concnt ; bndx++) { vndx = dy_basis[bndx] ; dy_x[vndx] = xvec[bndx] ; } } } /* And for the pathological case ... Lie about the norms, given their typical usage. */ else { dy_tols->pfeas = dy_tols->pfeas_scale*dy_tols->zero ; dy_lp->prim.norm1 = 1 ; dy_lp->prim.norm2 = 1 ; dy_lp->prim.max = 1 ; dy_lp->prim.maxndx = -1 ; } # ifndef DYLP_NDEBUG if (print >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: recalculated primal variables:",rtnnme) ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tprim.max = %g, scale = %g, pzero = %g, pfeas = %g.", dy_lp->prim.max,dy_tols->pfeas_scale, dy_tols->zero,dy_tols->pfeas) ; } # endif # ifdef DYLP_PARANOIA /* Check the nonbasic variables to see that their value agrees with their status. */ for (vndx = 1 ; vndx <= dy_sys->varcnt ; vndx++) { switch (dy_status[vndx]) { case vstatNBUB: case vstatNBFX: { if (!atbnd(dy_x[vndx],dy_sys->vub[vndx])) { errmsg(333,rtnnme,dy_sys->nme, dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, consys_nme(dy_sys,'v',vndx,FALSE,NULL),vndx, dy_prtvstat(dy_status[vndx]),dy_x[vndx], dy_sys->vub[vndx],"ub",fabs(dy_sys->vub[vndx]-dy_x[vndx]), dy_tols->pfeas*(1+fabs(dy_sys->vub[vndx]))) ; if (degenActive == TRUE) FREE(xvec) ; return (FALSE) ; } break ; } case vstatNBLB: { if (!atbnd(dy_x[vndx],dy_sys->vlb[vndx])) { errmsg(333,rtnnme,dy_sys->nme, dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, consys_nme(dy_sys,'v',vndx,FALSE,NULL),vndx, dy_prtvstat(dy_status[vndx]),dy_x[vndx], dy_sys->vlb[vndx],"lb",fabs(dy_x[vndx]-dy_sys->vlb[vndx]), dy_tols->pfeas*(1+fabs(dy_sys->vlb[vndx]))) ; if (degenActive == TRUE) FREE(xvec) ; return (FALSE) ; } break ; } } } # endif # ifndef DYLP_NDEBUG /* Do any requested printing. Level 5 gets the basic variables, level 6 adds the nonbasic variables. */ if (print >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%8s%20s%16s%16s%16s%8s","pos'n","var (ndx)", "lb","val","ub","status") ; if (degenActive) dyio_outfmt(dy_logchn,dy_gtxecho,"%16s","perturbation") ; for (bndx = 1 ; bndx <= dy_sys->concnt ; bndx++) { vndx = dy_basis[bndx] ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n%8d%14s (%3d)%16.8g%16.8g%16.8g%8s",bndx, consys_nme(dy_sys,'v',vndx,FALSE,NULL),vndx, dy_sys->vlb[vndx],dy_x[vndx],dy_sys->vub[vndx], dy_prtvstat(dy_status[vndx])) ; if (degenActive == TRUE && dy_degenset[bndx] > 0) { if (dy_brkout[bndx] > 0) dyio_outfmt(dy_logchn,dy_gtxecho,"%16.8g", dy_xbasic[bndx]-dy_sys->vlb[vndx]) ; else dyio_outfmt(dy_logchn,dy_gtxecho,"%16.8g", dy_sys->vub[vndx]-dy_xbasic[bndx]) ; } } if (print >= 6) { for (vndx = 1 ; vndx <= dy_sys->varcnt ; vndx++) { if (dy_var2basis[vndx] != 0) continue ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n%8s%14s (%3d)%16.8g%16.8g%16.8g%8s"," ", consys_nme(dy_sys,'v',vndx,FALSE,NULL),vndx, dy_sys->vlb[vndx],dy_x[vndx],dy_sys->vub[vndx], dy_prtvstat(dy_status[vndx])) ; } } } # endif /* Clean up and return. */ if (degenActive == TRUE) FREE(xvec) ; return (TRUE) ; } dyret_enum dy_updateprimals (int j, double deltaj, double *p_abarj) /* This routine updates the value and status of the primal basic variables to reflect the change in x. The calculation is straightforward: x = inv(B)b - (inv(B)a)*delta It's assumed that deltaj and abarj have the correct signs. If the client doesn't supply abarj, it will be calculated here, but not returned to the client. This routine is a bit more specialized than dy_calcprimals. It's intended to be used in the primal update portion of a pivot, and updates the status vector along with the value. The routine makes an effort to snap the updated value of x to lb, 0, or ub whenever possible. It calculates separate tolerances for each value based on the magnitude of the value and the distance travelled (deltak). If deltaj == 0, the routine will quietly return. We have to be careful to preserve the pivot reject flag w.r.t. variables on the pivot reject list. Parameters: j: index of entering variable x deltaj: amount of change in x p_abarj: inv(B)a; if NULL, will be calculated here Returns: dyrOK if the update is successful dyrREQCHK if a bogus value is created dyrSWING if we detected a massive move into infeasibility dyrFATAL is a positive indication of failure */ { int kpos,k,m ; double *abarj,abarkj,deltak,xk,ubk,lbk,newxk ; flags statk,newstatk,qualsk ; double eps0,epsu,epsl ; int swingndx ; double swingratio,maxswing ; bool swing ; dyret_enum retval ; const char *rtnnme = "dy_updateprimals" ; /* Setup */ if (withintol(deltaj,0,dy_tols->zero)) return (dyrOK) ; retval = dyrINV ; m = dy_sys->concnt ; swing = FALSE ; maxswing = 0 ; swingndx = -1 ; /* Did the user provide the ftran'd column? If not, retrieve a and calculate abar. */ if (p_abarj != NULL) { abarj = p_abarj ; } else { abarj = NULL ; if (consys_getcol_ex(dy_sys,j,&abarj) == FALSE) { errmsg(122,rtnnme,dy_sys->nme, "column",consys_nme(dy_sys,'v',j,TRUE,NULL),j) ; if (abarj != NULL) FREE(abarj) ; return (dyrFATAL) ; } dy_ftran(abarj,FALSE) ; } /* Now walk the basis. For each abar != 0, update x. */ for (kpos = 1 ; kpos <= m ; kpos++) { abarkj = abarj[kpos] ; if (abarkj == 0) continue ; deltak = abarkj*deltaj ; if (withintol(deltak,0,dy_tols->zero)) continue ; k = dy_basis[kpos] ; xk = dy_xbasic[kpos] ; statk = getflg(dy_status[k],vstatSTATUS) ; qualsk = getflg(dy_status[k],vstatQUALS) ; eps0 = dy_tols->zero ; ubk = dy_sys->vub[k] ; if (ubk < dy_tols->inf) { epsu = dy_tols->pfeas*(1.0+fabs(ubk)) ; } else { epsu = 0 ; } lbk = dy_sys->vlb[k] ; if (-dy_tols->inf < lbk) { epsl = dy_tols->pfeas*(1.0+fabs(lbk)) ; } else { epsl = 0 ; } newxk = xk-deltak ; setcleanzero(newxk,eps0) ; /* Choose a new status for x. The tests for abovebnd and belowbnd will use the feasibility tolerance. */ if (statk == vstatBFR) { newstatk = vstatBFR ; } else if (belowbnd(newxk,ubk)) { if (abovebnd(newxk,lbk)) { newstatk = vstatB ; } else if (belowbnd(newxk,lbk)) { newstatk = vstatBLLB ; } else { newstatk = vstatBLB ; } } else { if (abovebnd(newxk,ubk)) { newstatk = vstatBUUB ; } else { newstatk = vstatBUB ; } } if (flgon(newstatk,vstatBLB|vstatBUB) && lbk == ubk) { newstatk = vstatBFX ; } /* Check for bogus values? Clean zeros and values judged to be at bound cannot be bogus, so we can skip the test. If bogus === 1.0, there's no point in doing these tests, because the bogus region is identical to the tolerance region. The corrective action for a bogus value is to refactor. If basis.etas == 1, we've just refactored, so again, no sense in checking. */ if (dy_lp->basis.etas > 1 && dy_tols->bogus > 1.0 && newxk != 0 && flgoff(newstatk,vstatBLB|vstatBUB|vstatBFX)) { if (fabs(newxk) < eps0*dy_tols->bogus) { retval = dyrREQCHK ; # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 1) warn(374,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,"x",k,fabs(newxk),eps0*dy_tols->bogus, eps0*dy_tols->bogus-newxk) ; # endif } if (flgon(newstatk,vstatB|vstatBLLB) && fabs(lbk-newxk) < epsl*dy_tols->bogus) { retval = dyrREQCHK ; # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 1) warn(375,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,"lb",k,"x",k, lbk,newxk,lbk-newxk,epsl*dy_tols->bogus, epsl*dy_tols->bogus-(lbk-newxk)) ; # endif } if (flgon(newstatk,vstatB|vstatBUB) && fabs(newxk-ubk) < epsu*dy_tols->bogus) { retval = dyrREQCHK ; # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 1) { warn(375,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,"ub",k,"x",k, ubk,newxk,ubk-newxk,epsu*dy_tols->bogus, epsu*dy_tols->bogus-(ubk-newxk)) ; } # endif } } /* Are we headed off into the ozone? Make a note. */ if (flgon(newstatk,vstatBLLB|vstatBUUB)) { swingratio = (fabs(newxk)+1)/(fabs(dy_xbasic[kpos])+1) ; if (swingratio > dy_tols->swing) { swing = TRUE ; if (swingratio > maxswing) { maxswing = swingratio ; swingndx = k ; } } } /* Set the new status and value into the status and value arrays. */ dy_xbasic[kpos] = newxk ; dy_x[k] = newxk ; dy_status[k] = newstatk|qualsk ; } /* All basic variables are updated. Did we detect a swing into the unknown? */ if (swing == TRUE) { retval = dyrSWING ; dy_lp->ubnd.ndx = swingndx ; dy_lp->ubnd.ratio = maxswing ; # ifndef DYLP_NDEBUG if (dy_opts->print.dual >= 2 || dy_opts->print.phase1 >= 2 || dy_opts->print.phase2 >= 2) { k = dy_lp->ubnd.ndx ; statk = dy_status[k] ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n Pseudo-unbounded: growth %e for %s (%d) %s = %g", dy_lp->ubnd.ratio,consys_nme(dy_sys,'v',k,FALSE,NULL),k, dy_prtvstat(statk),dy_x[k]) ; if (flgon(statk,vstatBUUB)) { dyio_outfmt(dy_logchn,dy_gtxecho," > %g.",dy_sys->vub[k]) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho," < %g.",dy_sys->vlb[k]) ; } } # endif } # ifndef DYLP_NDEBUG /* Do we need to print the updates? If so, do it here. */ if (dy_opts->print.dual >= 6) { bool first = TRUE ; for (kpos = 1 ; kpos <= dy_sys->concnt ; kpos++) if (abarj[kpos] != 0) { if (first == TRUE) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\trevised primal variables:") ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n%8s%20s%16s%16s%16s %s","pos'n","var (ndx)", "lb","val","ub","status") ; first = FALSE ; } k = dy_basis[kpos] ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n%8d%14s (%3d)%16.8g%16.8g%16.8g %s",kpos, consys_nme(dy_sys,'v',k,FALSE,NULL),k, dy_sys->vlb[k],dy_xbasic[kpos],dy_sys->vub[k], dy_prtvstat(dy_status[k])) ; } if (first == TRUE) dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tno change to primal variables.") ; } # endif /* That's it. If retval is still dyrINV, nothing out of the ordinary happened, so set it to dyrOK. Clean up and we can return. */ if (retval == dyrINV) retval = dyrOK ; if (p_abarj == NULL) FREE(abarj) ; return (retval) ; } void dy_calcduals (void) /* This routine calculates the values of the dual variables as y = cinv(B). Note that these duals have the correct sign for the primal min cx problem. To be correct for the dual problem, multiply by -1. See the written documentation or the comments at the head of dy_dual.c If antidegeneracy is active, updates are restricted to duals that correspond to logicals included in the restricted subproblem. The routine also updates dfeas, the scaled zero tolerance for reduced costs. */ { int xkpos,xkndx ; bool degenActive ; double *yvec ; # ifndef DYLP_NDEBUG int print ; char *rtnnme = "dy_calcduals" ; switch (dy_lp->phase) { case dyPRIMAL1: { print = dy_opts->print.phase1 ; break ; } case dyPRIMAL2: { print = dy_opts->print.phase2 ; break ; } case dyDUAL: { print = dy_opts->print.dual ; break ; } case dyADDCON: { if (dy_opts->print.conmgmt >= 3) print = 7 ; else print = 0 ; break ; } case dyINIT: { if (dy_opts->print.crash >= 4) print = 7 ; else print = 0 ; break ; } default: { print = 0 ; break ; } } # endif if (dy_lp->phase == dyDUAL && dy_lp->degen > 0) { degenActive = TRUE ; } else { degenActive = FALSE ; } /* For a normal, non-empty basis: */ if (dy_sys->concnt > 0) { if (degenActive == TRUE) { yvec = (double *) CALLOC((dy_sys->concnt+1),sizeof(double)) ; } else { yvec = dy_y ; } for (xkpos = 1 ; xkpos <= dy_sys->concnt ; xkpos++) { xkndx = dy_basis[xkpos] ; yvec[xkpos] = dy_sys->obj[xkndx] ; } dy_btran(yvec) ; dy_lp->dual.norm1 = exvec_1norm(yvec,dy_sys->concnt) ; dy_lp->dual.norm2 = exvec_2norm(yvec,dy_sys->concnt) ; dy_lp->dual.max = exvec_infnorm(yvec,dy_sys->concnt,&dy_lp->dual.maxndx) ; dy_tols->dfeas = dy_lp->dual.max ; if (dy_tols->dfeas < 10.0) dy_tols->dfeas = dy_tols->cost ; else dy_tols->dfeas = log10(dy_tols->dfeas)*dy_tols->cost ; dy_tols->dfeas = dy_tols->dfeas_scale*dy_tols->dfeas ; if (degenActive == TRUE) { for (xkpos = 1 ; xkpos <= dy_sys->concnt ; xkpos++) { if (dy_ddegenset[xkpos] == 0) dy_y[xkpos] = yvec[xkpos] ; } FREE(yvec) ; } } /* And the pathological case of an empty basis. We lie about the norms, given their typical use. */ else { dy_tols->dfeas = dy_tols->dfeas_scale*dy_tols->cost ; dy_lp->dual.norm1 = 1 ; dy_lp->dual.norm2 = 1 ; dy_lp->dual.max = 1 ; } # ifndef DYLP_NDEBUG if (print >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: recalculated dual variables:",rtnnme) ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tdual.max = %g, scale = %g, dzero = %g, dfeas = %g.", dy_lp->dual.max,dy_tols->dfeas_scale, dy_tols->cost,dy_tols->dfeas) ; if (print >= 7) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%8s%20s%16s","pos'n","constraint","val") ; if (degenActive) dyio_outfmt(dy_logchn,dy_gtxecho,"%16s","perturbation") ; for (xkpos = 1 ; xkpos <= dy_sys->concnt ; xkpos++) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n%8d%20s%16.8g",xkpos, consys_nme(dy_sys,'c',xkpos,FALSE,NULL),dy_y[xkpos]) ; if (degenActive && dy_ddegenset[xkpos] > 0) { dyio_outfmt(dy_logchn,dy_gtxecho,"%16.8g",dy_y[xkpos]) ; } } dyio_outchr(dy_logchn,dy_gtxecho,'\n') ; } } # endif return ; } double dy_calcobj (void) /* This routine calculates the value of the objective function using the primal variables. During primal phase I, suppress inactzcorr, as c = 0 for nonbasic variables by definition. Returns: objective value, or NaN in the event of a paranoid error. */ { int vndx ; double z ; #ifdef DYLP_PARANOIA const char *rtnnme = "dy_calcobj" ; if (dy_x == NULL) { errmsg(2,rtnnme,"dy_x") ; return (quiet_nan(0)) ; } if (dy_sys == NULL) { errmsg(2,rtnnme,"dy_sys") ; return (quiet_nan(0)) ; } if (dy_sys->obj == NULL) { errmsg(2,rtnnme,"dy_sys->obj") ; return (quiet_nan(0)) ; } #endif z = 0.0 ; for (vndx = 1 ; vndx <= dy_sys->varcnt ; vndx++) if (dy_x[vndx] != 0.0) z += dy_sys->obj[vndx]*dy_x[vndx] ; if (dy_lp->p1obj.installed == FALSE) z += dy_lp->inactzcorr ; setcleanzero(z,dy_tols->zero) ; return (z) ; } double dy_calcdualobj (void) /* This routine calculates the dual objective z = yb, taking into account nonbasic variables at nonzero bounds. NOTE that the value returned will not reflect the contribution due to inactive variables. Also, unlike the primal case, we need to correct dy_y on the fly to exclude duals involved in a perturbed subproblem when antidegeneracy is active. Remember that dy_y holds duals with the correct sign for the min cx primal. We have to take care when pulling values for dual variables from cbar, as cbar (when interpreted as a dual variable value) has the correct sign for the min yb dual problem. Parameters: none Returns: dual objective value, or NaN if there's an error during the calculation. */ { int i,j,m,n ; flags statj ; double z,bndj,cbarj ; double *rhs,*vlb,*vub ; const char *rtnnme = "dy_calcdualobj" ; #ifdef DYLP_PARANOIA if (dy_x == NULL) { errmsg(2,rtnnme,"dy_x") ; return (quiet_nan(0)) ; } if (dy_y == NULL) { errmsg(2,rtnnme,"dy_y") ; return (quiet_nan(0)) ; } if (dy_var2basis == NULL) { errmsg(2,rtnnme,"dy_var2basis") ; return (quiet_nan(0)) ; } if (dy_sys == NULL) { errmsg(2,rtnnme,"dy_sys") ; return (quiet_nan(0)) ; } if (dy_sys->obj == NULL) { errmsg(2,rtnnme,"dy_sys->obj") ; return (quiet_nan(0)) ; } if (dy_sys->rhs == NULL) { errmsg(2,rtnnme,"dy_sys->rhs") ; return (quiet_nan(0)) ; } #endif z = 0.0 ; m = dy_sys->concnt ; n = dy_sys->varcnt ; rhs = dy_sys->rhs ; vlb = dy_sys->vlb ; vub = dy_sys->vub ; /* Start with the easy part: dot(y,b) for active explicit constraints. We need to exclude duals incorporated in a degenerate subproblem, which are by definition zero. */ for (i = 1 ; i <= m ; i++) { j = dy_basis[i] ; if (dy_ddegenset[j] == 0 && dy_y[i] != 0) { z += dy_y[i]*rhs[i] ; } } /* Now the harder part: the contribution due to variables nonbasic at nonzero bounds. For the min primal/min dual setup in dylp, the math tells us that the reduced cost cbar of a variable x NBUB is really the negative of the correct dual value. For x NBLB, the reduced cost is the correct dual value. But we're not done yet! The values of cbar are the correct dual values for the dual algorithm, but they have the wrong sign for the primal algorithm. A multiplication by -1; now cbar is correct for x NBUB, incorrect for x NBLB. We'll fix the value for x NBLB that by using l instead of -l (remember that a lower bound constraint looks like -x <= -l). We need to scan the logicals because range constraints can result in a slack with a finite nonzero upper bound. */ for (j = 1 ; j <= n ; j++) { if (dy_ddegenset[j] > 0) continue ; statj = getflg(dy_status[j],vstatSTATUS) ; if (flgon(statj,vstatBASIC)) continue ; cbarj = dy_cbar[j] ; if (cbarj == 0) continue ; switch (statj) { case vstatNBLB: case vstatNBFX: { bndj = vlb[j] ; break ; } case vstatNBUB: { bndj = vub[j] ; break ; } case vstatNBFR: case vstatSB: { bndj = 0 ; break ; } default: { errmsg(1,rtnnme,__LINE__) ; return (quiet_nan(0)) ; } } if (bndj != 0) z += cbarj*bndj ; } if (dy_lp->p1obj.installed == FALSE) z += dy_lp->inactzcorr ; /* Final cleanup and return. */ setcleanzero(z,dy_tols->zero) ; return (z) ; } double dy_calcpinfeas (void) /* This routine calculates primal infeasibility from scratch. It scans the status vector and totals infeasibility for all variables flagged as BLLB or BUUB. Parameters: none Returns: total primal infeasibility. */ { int k,n ; double infeas,xk,ubk,lbk ; flags statk ; double *vub,*vlb ; n = dy_sys->varcnt ; vub = dy_sys->vub ; vlb = dy_sys->vlb ; infeas = 0 ; for (k = 1 ; k <= n ; k++) { statk = dy_status[k] ; if (flgon(statk,vstatBLLB)) { lbk = vlb[k] ; xk = dy_x[k] ; infeas += lbk-xk ; } else if (flgon(statk,vstatBUUB)) { ubk = vub[k] ; xk = dy_x[k] ; infeas += xk-ubk ; } } return (infeas) ; } bool dy_calccbar (void) /* This routine calculates cbar from scratch for all nonbasic variables, as cbar = c - dot(y,a). The basic restriction for calculating reduced costs is that we must have dual variables, and we need to be able to distinguish basic variables from nonbasic variables. dy_var2basis is the earliest indicator we can use for this --- it's valid early in dyINIT, so that we can use it to try and establish a dual feasible start. It remains valid in later phases. On the other hand, if we're feeling paranoid, this is a good opportunity to check the status of all variables. Hence the two separate code blocks below. Parameters: none Returns: TRUE if the values are calculated without error, FALSE otherwise. */ { int xjndx ; double cbarj ; # ifdef DYLP_PARANOIA flags xjstatus ; const char *rtnnme = "dy_calccbar" ; # endif /* Open a loop and walk the columns, looking for nonbasic variables. */ for (xjndx = 1 ; xjndx <= dy_sys->varcnt ; xjndx++) { # ifndef DYLP_PARANOIA /* The expedient decision: basic or not? */ if (dy_var2basis[xjndx] > 0) { dy_cbar[xjndx] = 0 ; continue ; } # else /* The cautious decision (when available). */ if (dy_lp->phase == dyINIT) { if (dy_var2basis[xjndx] > 0) { dy_cbar[xjndx] = 0 ; continue ; } } else { xjstatus = dy_status[xjndx] ; if (dy_chkstatus(xjndx) == FALSE) return (FALSE) ; if (flgon(xjstatus,vstatBASIC)) { dy_cbar[xjndx] = 0.0 ; continue ; } } # endif /* Calculate the reduced cost and store it in cbar. */ cbarj = consys_dotcol(dy_sys,xjndx,dy_y) ; # ifdef DYLP_PARANOIA if (isnan(cbarj) == TRUE) { errmsg(320,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,"y",xjndx,"reduced cost") ; return (FALSE) ; } # endif dy_cbar[xjndx] = dy_sys->obj[xjndx]-cbarj ; setcleanzero(dy_cbar[xjndx],dy_tols->cost) ; } return (TRUE) ; } void dy_setbasicstatus (void) /* This routine runs through the basis and resets the status of basic variables. It's handy after arbitrary changes to the nonbasic variables (as when we patch the basis, or flip variables for activation during dual simplex). Parameters: none Returns: undefined */ { int xindx,bpos ; double xi,ubi,lbi ; flags xistatus ; /* Just scan the basis, checking the values against the bounds. */ for (bpos = 1 ; bpos <= dy_sys->concnt ; bpos++) { xindx = dy_basis[bpos] ; xi = dy_x[xindx] ; xistatus = dy_status[xindx] ; lbi = dy_sys->vlb[xindx] ; ubi = dy_sys->vub[xindx] ; if (flgoff(xistatus,vstatBFR)) { if (belowbnd(xi,lbi)) { dy_status[xindx] = vstatBLLB ; } else if (atbnd(xi,lbi)) { if (lbi == ubi) dy_status[xindx] = vstatBFX ; else dy_status[xindx] = vstatBLB ; dy_x[xindx] = lbi ; dy_xbasic[bpos] = lbi ; } else if (belowbnd(xi,ubi)) { dy_status[xindx] = vstatB ; } else if (atbnd(xi,ubi)) { dy_status[xindx] = vstatBUB ; dy_x[xindx] = ubi ; dy_xbasic[bpos] = ubi ; } else { dy_status[xindx] = vstatBUUB ; } } # ifndef DYLP_NDEBUG if (xistatus != dy_status[xindx]) { if ((dy_lp->phase != dyADDVAR && dy_opts->print.basis >= 3) || (dy_lp->phase == dyADDVAR && dy_opts->print.varmgmt >= 3)) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t%s (%d) = %g, status %s ", consys_nme(dy_sys,'v',xindx,FALSE,NULL),xindx,xi, dy_prtvstat(xistatus)) ; dyio_outfmt(dy_logchn,dy_gtxecho,"corrected to %s.", dy_prtvstat(dy_status[xindx])) ; } } # endif } return ; } void dy_dseinit (void) /* This routine calculates from scratch the basis inverse row norms used in DSE pricing. The algorithm is straightforward --- use dy_btran to calculate einv(B) = beta, then calculate ||beta||^2. Parameters: none Returns: undefined */ { int xkpos ; double *betak ; # ifndef DYLP_NDEBUG if (dy_opts->print.dual >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: initialising ||beta||^2 for DSE.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; } # endif /* Grab space for a working vector. */ betak = (double *) MALLOC((dy_sys->concnt+1)*sizeof(double)) ; /* And now the loop to do the calculation. The drill is * clear the vector * insert a 1 in the proper place * btran it * calculate the norm. */ for (xkpos = 1 ; xkpos <= dy_sys->concnt ; xkpos++) { memset(betak,0,(dy_sys->concnt+1)*sizeof(double)) ; betak[xkpos] = 1.0 ; dy_btran(betak) ; dy_rho[xkpos] = exvec_ssq(betak,dy_sys->concnt) ; } /* Clean up and return. */ FREE(betak) ; return ; } void dy_pseinit (void) /* This routine resets the reference frame for PSE pricing. It's a trivial routine, but it seemed like a good idea to encapsulate this bit of code. It gets used in several places. Parameters: none Returns: undefined */ { int xindx ; # ifndef DYLP_NDEBUG if (dy_opts->print.phase1 >= 2 || dy_opts->print.phase2 >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: initialising ||abar~||^2 for PSE.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; } # endif memset(dy_frame,0,(dy_sys->varcnt+1)*sizeof(bool)) ; memset(dy_gamma,0,(dy_sys->varcnt+1)*sizeof(double)) ; for (xindx = 1 ; xindx <= dy_sys->varcnt ; xindx++) { if (flgon(dy_status[xindx],vstatNONBASIC|vstatNBFR)) { dy_frame[xindx] = TRUE ; dy_gamma[xindx] = 1.0 ; } } return ; } #ifdef DYLP_PARANOIA bool dy_chkstatus (int vndx) /* This routine is a paranoid check routine -- it does a number of consistency checks based on the status of the variable. Major basis errors (errors of logic and big-time numerical inaccuracy) rate a return value of FALSE. There is a relatively common case where accumulated numerical inaccuracy results in errors on the order of 1.0e-10 or so; these get a return of TRUE; the normal accuracy control machinery should catch these eventually. If vndx is 0, all variables are checked. Parameters: vndx: variable index; if 0, all variables are checked Returns: TRUE if status is acceptable, FALSE if major errors turn up. */ { int first,last,xkndx,iter ; flags xkstatus ; double xk,xbk,ubk,lbk,normxb,tolu,bogusu,toll,bogusl,cbark ; bool retval,primDegen,dualDegen ; char *statk ; const char *nmek,*phase ; const char *rtnnme = "dy_chkstatus" ; if (vndx < 0 || vndx > dy_sys->varcnt) { errmsg(102,rtnnme,dy_sys->nme,"variable",vndx,0,dy_sys->varcnt) ; return (FALSE) ; } if (vndx == 0) { first = 1 ; last = dy_sys->varcnt ; } else { first = vndx ; last = vndx ; } retval = TRUE ; if (dy_lp->degen > 0 && dy_lp->phase == dyDUAL) { dualDegen = TRUE ; } else { dualDegen = FALSE ; } if (dy_lp->degen > 0 && (dy_lp->phase == dyPRIMAL1 || dy_lp->phase == dyPRIMAL2)) { primDegen = TRUE ; } else { primDegen = FALSE ; } phase = dy_prtlpphase(dy_lp->phase,TRUE) ; iter = dy_lp->tot.iters ; normxb = exvec_2norm(dy_xbasic,dy_sys->concnt) ; for (xkndx = first ; xkndx <= last ; xkndx++) { xkstatus = dy_status[xkndx] ; nmek = consys_nme(dy_sys,'v',xkndx,TRUE,NULL) ; /* Clear any qualifiers before we go further. */ clrflg(xkstatus,vstatQUALS) ; /* Check that the status is a single status, and not some mix. If we fail this, skip to the next iteration of the loop. */ if (!(xkstatus == vstatBFX || xkstatus == vstatBUB || xkstatus == vstatB || xkstatus == vstatBLB || xkstatus == vstatBLLB || xkstatus == vstatBUUB || xkstatus == vstatBFR || xkstatus == vstatNBFX || xkstatus == vstatNBUB || xkstatus == vstatNBLB || xkstatus == vstatNBFR || xkstatus == vstatSB)) { errmsg(300,rtnnme,(int) xkstatus,nmek,xkndx) ; retval = FALSE ; continue ; } statk = dy_prtvstat(xkstatus) ; /* For basic variables, check that basis and var2basis agree. For nonbasic and superbasic variables, check that var2basis is 0. Make sure that the value in dy_var2basis is valid first. While we're here, might as well check that dy_xbasic and dy_x agree for basic variables, unless the anti-degeneracy algorithm is working. (Note that this > should be < a logical question, not a tolerance question. But somewhere, small discrepancies creep in, and I haven't been able to track down the cause just yet.) */ xk = dy_x[xkndx] ; if (dy_var2basis[xkndx] < 0 || dy_var2basis[xkndx] > dy_sys->varcnt) { errmsg(330,rtnnme,dy_sys->nme,phase,iter,nmek,xkndx,statk, dy_var2basis[xkndx],-1) ; retval = FALSE ; } else if (flgon(xkstatus,vstatBASIC)) { if (dy_basis[dy_var2basis[xkndx]] != xkndx) { errmsg(330,rtnnme,dy_sys->nme,phase,iter,nmek,xkndx,statk, dy_var2basis[xkndx],dy_basis[dy_var2basis[xkndx]]) ; retval = FALSE ; } xk = dy_x[xkndx] ; xbk = dy_xbasic[dy_var2basis[xkndx]] ; if (primDegen == FALSE) { if (!withintol(xbk,xk,dy_tols->zero*(1.0+fabs(xbk)))) { if (withintol(xbk,xk,10*dy_tols->zero*(1.0+fabs(xbk)))) { warn(332,rtnnme,dy_sys->nme,phase,iter,nmek,xkndx,statk,xk,xbk, fabs(xk-xbk),dy_tols->zero*(1.0+fabs(xbk))) ; } else { errmsg(332,rtnnme,dy_sys->nme,phase,iter,nmek,xkndx,statk,xk,xbk, fabs(xk-xbk),dy_tols->zero*(1.0+fabs(xbk))) ; retval = FALSE ; } } # ifdef UNDEFINED /* This bit of code will, on a fairly regular basis, spit out warnings about |xbk-xk| around 1.0e-15 -- 1.0e-17. Typically in primal phase II. Logically, dy_x and dy_xbasic should be equivalent, and a quick check seems to say that they're updated simultaneously. 10^-17 is roughly 2^-56, so this could just be noise in the least significant bits. */ else if (xbk != xk) { warn(332,rtnnme,dy_sys->nme,phase,iter,nmek,xkndx,statk,xk,xbk, fabs(xk-xbk),0.0) ; } # endif } } else { if (dy_var2basis[xkndx] != 0) { errmsg(330,rtnnme,dy_sys->nme,phase, iter,nmek,xkndx,statk, dy_var2basis[xkndx],dy_basis[dy_var2basis[xkndx]]) ; retval = FALSE ; } xk = dy_x[xkndx] ; } /* Check that the bounds are consistent with the status. * Fixed variables (BFX, NBFX) should have equal bounds. Failure of this condition is a logical error. Conversely, variables with equal bounds should have status BFX, NBFX, BLLB, or BUUB. The latter two aren't legal in P2, but the normal error recovery machinery should cope with loss of feasibility as long as the status and value agree. * Nonbasic variables should be exactly equal to their bounds --- they are supposed to be set to the bound as they're pivoted out. Failure of this condition is a logical error. * Variables which are basic at bound (BFX, BLB, BUB) should have a value which is equal (within tolerance) of the appropriate bound. * Strictly basic (B) and superbasic (SB) variables should be strictly within bound. For basic variables, if anti-degeneracy is active this test must be made against dy_xbasic. Since we've tested above for dy_x = dy_xbasic when anti-degeneracy isn't active, we can test here using xbasic. Superbasics (by virtue of not being basic) must be tested using xk. * Free variables should have no bounds. */ ubk = dy_sys->vub[xkndx] ; lbk = dy_sys->vlb[xkndx] ; if (ubk == lbk && !(flgon(xkstatus,vstatBFX|vstatNBFX) || (flgon(xkstatus,vstatBLLB|vstatBUUB) && dy_lp->phase != dyPRIMAL2))) { errmsg(379,rtnnme,dy_sys->nme,phase,iter,nmek,xkndx,ubk,statk) ; retval = FALSE ; } tolu = dy_tols->pfeas*(1.0+maxx(normxb,fabs(ubk))) ; bogusu = 1000*tolu ; toll = dy_tols->pfeas*(1.0+maxx(normxb,fabs(lbk))) ; bogusl = 1000*toll ; switch (xkstatus) { case vstatBFX: { if (lbk != ubk) { errmsg(331,rtnnme,dy_sys->nme,phase,iter,nmek,xkndx,xbk,statk, lbk,ubk,ubk-lbk,0.0) ; retval = FALSE ; break ; } if (!atbnd(xbk,ubk)) { if (!withintol(xbk,ubk,bogusu)) { errmsg(333,rtnnme,dy_sys->nme,phase,iter,nmek,xkndx,statk, xbk,ubk,"lb = ub",fabs(xbk-ubk),bogusu) ; retval = FALSE ; } else { warn(333,rtnnme,dy_sys->nme,phase,iter,nmek,xkndx,statk, xbk,ubk,"lb = ub",fabs(xbk-ubk),tolu) ; } } break ; } case vstatBUUB: { if (!abovebnd(xbk,ubk)) { if (xbk < ubk-bogusu) { errmsg(335,rtnnme,dy_sys->nme,phase,iter,nmek,xkndx,statk, lbk,xbk,ubk,ubk-xbk,bogusu+tolu) ; retval = FALSE ; } else { warn(335,rtnnme,dy_sys->nme,phase,iter,nmek,xkndx,statk, lbk,xbk,ubk,ubk-xbk,tolu) ; } } else if (dy_lp->phase == dyPRIMAL2) warn(323,rtnnme,dy_sys->nme,phase,iter,nmek,xkndx,statk, lbk,xbk,ubk,xbk-ubk,tolu) ; break ; } case vstatBUB: { if (!atbnd(xbk,ubk)) { if (!withintol(xbk,ubk,bogusu)) { errmsg(333,rtnnme,dy_sys->nme,phase,iter,nmek,xkndx,statk, xbk,ubk,"ub",ubk-xbk,bogusu) ; retval = FALSE ; } else { warn(333,rtnnme,dy_sys->nme,phase,iter,nmek,xkndx,statk, xbk,ubk,"ub",ubk-xbk,tolu) ; } } break ; } case vstatB: { if (!(abovebnd(xbk,lbk) && belowbnd(xbk,ubk))) { if (xbk < lbk-bogusl) { errmsg(322,rtnnme,dy_sys->nme,phase,iter,nmek,xkndx,statk, lbk,xbk,ubk,lbk-xbk,bogusl+toll) ; retval = FALSE ; } else if (xbk > ubk+bogusu) { errmsg(322,rtnnme,dy_sys->nme,phase,iter,nmek,xkndx,statk, lbk,xbk,ubk,xbk-ubk,bogusu+tolu) ; retval = FALSE ; } else if (xbk < lbk+toll) { warn(322,rtnnme,dy_sys->nme,phase,iter,nmek,xkndx,statk, lbk,xbk,ubk,lbk-xbk,toll) ; } else if (xbk > ubk-tolu) { warn(322,rtnnme,dy_sys->nme,phase,iter,nmek,xkndx,statk, lbk,xbk,ubk,xbk-ubk,tolu) ; } } break ; } case vstatSB: { if (!(abovebnd(xk,lbk) && belowbnd(xk,ubk))) { if (xk < lbk-bogusl) { errmsg(322,rtnnme,dy_sys->nme,phase,iter,nmek,xkndx,statk, lbk,xk,ubk,lbk-xk,bogusl+toll) ; retval = FALSE ; } else if (xk > ubk+bogusu) { errmsg(322,rtnnme,dy_sys->nme,phase,iter,nmek,xkndx,statk, lbk,xk,ubk,xk-ubk,bogusu+tolu) ; retval = FALSE ; } else if (xk < lbk+toll) { warn(322,rtnnme,dy_sys->nme,phase,iter,nmek,xkndx,statk, lbk,xk,ubk,lbk-xk,toll) ; } else if (xk > ubk-tolu) { warn(322,rtnnme,dy_sys->nme,phase,iter,nmek,xkndx,statk, lbk,xk,ubk,xbk-ubk,tolu) ; } } break ; } case vstatBLB: { if (!atbnd(xbk,lbk)) { if (!withintol(xbk,lbk,bogusl)) { errmsg(333,rtnnme,dy_sys->nme,phase,iter,nmek,xkndx,statk, xbk,lbk,"lb",xbk-lbk,bogusl) ; retval = FALSE ; } else { warn(333,rtnnme,dy_sys->nme,phase,iter,nmek,xkndx,statk, xbk,lbk,"lb",xbk-lbk,toll) ; } } break ; } case vstatBLLB: { if (!belowbnd(xbk,lbk)) { if (xbk > lbk+bogusl) { errmsg(335,rtnnme,dy_sys->nme,phase,iter,nmek,xkndx,statk, lbk,xbk,ubk,xbk-lbk,bogusl+toll) ; retval = FALSE ; } else { warn(335,rtnnme,dy_sys->nme,phase,iter,nmek,xkndx,statk, lbk,xbk,ubk,xbk-lbk,toll) ; } } else if (dy_lp->phase == dyPRIMAL2) warn(323,rtnnme,dy_sys->nme,phase,iter,nmek,xkndx,statk, lbk,xbk,ubk,lbk-xbk,toll) ; break ; } case vstatBFR: case vstatNBFR: { if (ubk < dy_tols->inf || lbk > -dy_tols->inf) { errmsg(334,rtnnme,dy_sys->nme,phase,iter,nmek,xkndx,lbk,ubk,statk) ; retval = FALSE ; } break ; } case vstatNBFX: { if (lbk != ubk) { errmsg(331,rtnnme,dy_sys->nme,phase,iter,nmek,xkndx,xbk,statk, lbk,ubk,ubk-lbk,0.0) ; retval = FALSE ; break ; } if (xk != ubk) { errmsg(333,rtnnme,dy_sys->nme,phase,iter,nmek,xkndx,statk, xk,ubk,"lb = ub",ubk-xk,0.0) ; retval = FALSE ; } break ; } case vstatNBUB: { if (xk != ubk) { errmsg(333,rtnnme,dy_sys->nme,phase,iter,nmek,xkndx,statk, xk,ubk,"ub",ubk-xk,0.0) ; retval = FALSE ; } break ; } case vstatNBLB: { if (xk != lbk) { errmsg(333,rtnnme,dy_sys->nme,phase,iter,nmek,xkndx,statk, xk,lbk,"lb",xk-lbk,0.0) ; retval = FALSE ; } break ; } default: { errmsg(1,rtnnme,__LINE__) ; return (FALSE) ; } } /* Final checks: * Superbasic variables should only show up in primal phase II, where we're concerned about maintaining feasibility. During primal phase I or dual simplex, we force nonbasic variables to bound and live with any loss of feasibility. * Nonbasic free variables should not occur during dual simplex unless the reduced cost is zero -- we shouldn't have been able to make a feasible start otherwise. */ switch (xkstatus) { case vstatSB: { if (dy_lp->phase != dyPRIMAL2) { errmsg(346,rtnnme,dy_sys->nme,phase,iter,statk,nmek,xkndx) ; retval = FALSE ; } break ; } case vstatNBFR: { if (dy_lp->phase == dyDUAL) { cbark = dy_cbar[xkndx] ; if (cbark != 0) { errmsg(346,rtnnme,dy_sys->nme,phase,iter,statk,nmek,xkndx) ; retval = FALSE ; } } break ; } } } return (retval) ; } void dy_chkdual (int lvl) /* This routine checks the dual variables and reduced costs for correctness, and also checks for dual feasibility (agreement of reduced costs and status). If dual antidegeneracy is inactive, the routine is checking for * numerical agreement between the iteratively updated duals and reduced costs (dy_y, dy_cbar) and the fresh values calculated here; * numerical agreement between the reduced costs of logicals and the associated duals; and * logical agreement between duals, reduced costs, and primal status. When dual antidegeneracy is active, the routine allows for differences between the iterative and calculated values when the column is part of a restricted subproblem. It checks that the freshly calculated values are zero (otherwise the column should not be involved in the restricted subproblem). Unfortunately, given the way that the perturbation is applied (directly to dy_cbar), there's no way I know of to check for correct values of perturbed reduced costs and duals. Parameters: lvl: 0: suppresses all printing (allows or convenient suppression of messages without recompiling) 1: prints a summary only if problems are detected 2: prints a warning for each problem detected */ { int i,j,m,n ; flags statj ; double cbarj,yi,diff,tol ; bool degenActive ; double *y,*cbar ; int yerrcnt,cbarerrcnt,ycbarerrcnt,cbarstatuserrcnt ; double yerrtot,cbarerrtot ; /* Scaling can tighten the base value of tols.cost, and we don't want that here. Hardwire the default value. */ const double base_tol = 1.0e-11 ; const char *rtnnme = "dy_chkdual" ; if (dy_lp->degen > 0 && dy_lp->phase == dyDUAL) { degenActive = TRUE ; } else { degenActive = FALSE ; } m = dy_sys->concnt ; n = dy_sys->varcnt ; /* Start out by calculating what we think the duals and reduced costs should be, independent of the current state of the dual degeneracy algorithm. */ y = (double *) MALLOC((m+1)*sizeof(double)) ; cbar = (double *) MALLOC((n+1)*sizeof(double)) ; for (i = 1 ; i <= m ; i++) { j = dy_basis[i] ; y[i] = dy_sys->obj[j] ; } dy_btran(y) ; for (j = 1 ; j <= n ; j++) { cbarj = consys_dotcol(dy_sys,j,y) ; cbar[j] = dy_sys->obj[j]-cbarj ; } /* Now see if we agree on the values for the duals. When dual antidegeneracy is inactive, or for columns not involved in the restricted subproblem, we're simply checking our fresh values against the iteratively updated values. When dual antidegeneracy is active, in a position that's involved in a restricted subproblem, the real dual should be 0. Since reduced subproblems are nested, it's sufficient to check dy_ddegenset == 0. */ tol = 1000*base_tol ; yerrcnt = 0 ; yerrtot = 0.0 ; for (i = 1 ; i <= m ; i++) { j = dy_basis[i] ; if (dy_ddegenset[j] == 0) { diff = fabs(dy_y[i]-y[i]) ; if (diff > tol) { if (lvl >= 2) { warn(321,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, (dy_lp->degen == 0)?"real":"uninvolved", "dy_y",i,dy_y[i],y[i],diff,tol) ; } yerrcnt++ ; yerrtot += diff ; } } else { if (fabs(y[i]) > tol) { if (lvl >= 2) { warn(321,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "real","y",i,y[i],0.0,y[i],tol) ; } yerrcnt++ ; yerrtot += fabs(y[i]) ; } } } /* Now try for the reduced costs. As with the duals, if the column is involved in the reduced subproblem, the real reduced cost should be 0. If not, they should be identical. */ tol = 1000*base_tol ; cbarerrcnt = 0 ; cbarerrtot = 0.0 ; for (j = 1 ; j <= n ; j++) { if (dy_ddegenset[j] == 0) { diff = fabs(dy_cbar[j]-cbar[j]) ; if (diff > tol) { if (lvl >= 2) { warn(321,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, (dy_lp->degen == 0)?"real":"uninvolved", "dy_cbar",j,dy_cbar[j],cbar[j],diff,tol) ; } cbarerrcnt++ ; cbarerrtot += diff ; } } else { if (fabs(cbar[j]) > tol) { if (lvl >= 2) { warn(321,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "real","cbar",j,cbar[j],0.0,cbar[j],tol) ; } cbarerrcnt++ ; cbarerrtot += fabs(cbar[j]) ; } } } /* Check that, for 1 < i < m, that the reduced cost of the logical equals the negative of the dual variable for the constraint for variables not involved in a degenerate set. Since we perturbed cbar as a surrogate for perturbing c, it's no longer true that cbar = -dot(y,a); we now have cbar = c - dot(y,a). Unfortunately, we don't know c (though we could calculate it). */ ycbarerrcnt = 0 ; for (i = 1 ; i <= m ; i++) { statj = dy_status[i] ; if (dy_ddegenset[i] == 0) { cbarj = cbar[i] ; yi = y[i] ; if (fabs(cbarj+yi) > base_tol) { if (lvl >= 2) { warn(336,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, consys_nme(dy_sys,'v',i,FALSE,NULL),i,dy_prtvstat(statj), "real",-yi,cbarj,fabs(cbarj+yi),base_tol) ; } ycbarerrcnt++ ; } } } /* Check that primal status agrees with reduced costs. If antidegeneracy is active, the real values should still be in agreement (zero is neutral, hence should not cause an error). */ cbarstatuserrcnt = 0 ; for (j = 1 ; j <= n ; j++) { statj = dy_status[j] ; cbarj = dy_cbar[j] ; if ((flgon(statj,vstatNBLB) && cbarj < -dy_tols->dfeas) || (flgon(statj,vstatNBUB) && cbarj > dy_tols->dfeas) || (flgon(statj,vstatNBFR) && cbarj != 0) || flgon(statj,vstatSB)) { if (lvl >= 2) { warn(347,rtnnme,dy_sys->nme, dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, consys_nme(dy_sys,'v',j,FALSE,NULL),j, dy_prtvstat(statj),j,cbarj,dy_tols->dfeas) ; } cbarstatuserrcnt++ ; } if (degenActive && dy_ddegenset[j] < dy_lp->degen) { cbarj = cbar[j] ; if ((flgon(statj,vstatNBLB) && cbarj < -dy_tols->dfeas) || (flgon(statj,vstatNBUB) && cbarj > dy_tols->dfeas) || (flgon(statj,vstatNBFR) && cbarj != 0) || flgon(statj,vstatSB)) { if (lvl >= 2) { warn(347,rtnnme,dy_sys->nme, dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, consys_nme(dy_sys,'v',j,FALSE,NULL),j, dy_prtvstat(statj),j,cbarj,dy_tols->dfeas) ; } cbarstatuserrcnt++ ; } } } /* Summary. Print if there's any error. */ if (lvl >= 1 && yerrcnt+cbarerrcnt+ycbarerrcnt+cbarstatuserrcnt > 0) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n %s: [%s]: (%s)%d: ",rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters) ; if (yerrcnt > 0) { dyio_outfmt(dy_logchn,dy_gtxecho, "%d y value errors (%g)", yerrcnt,yerrtot) ; } if (cbarerrcnt > 0) { if (yerrcnt > 0) dyio_outfmt(dy_logchn,dy_gtxecho,", ") ; dyio_outfmt(dy_logchn,dy_gtxecho,"%d cbar value errors (%g)", cbarerrcnt,cbarerrtot) ; } if (ycbarerrcnt > 0) { if (yerrcnt+cbarerrcnt > 0) dyio_outfmt(dy_logchn,dy_gtxecho,", ") ; dyio_outfmt(dy_logchn,dy_gtxecho, "%d y/cbar agreement errors",ycbarerrcnt) ; } if (cbarstatuserrcnt > 0) { if (yerrcnt+cbarerrcnt+ycbarerrcnt > 0) { dyio_outfmt(dy_logchn,dy_gtxecho,", ") ; } dyio_outfmt(dy_logchn,dy_gtxecho, "%d cbar/status agreement errors",cbarstatuserrcnt) ; } dyio_outchr(dy_logchn,dy_gtxecho,'.') ; } /* Clean up and we're done. */ FREE(cbar) ; FREE(y) ; return ; } bool dy_chkdysys (consys_struct *orig_sys) /* This routine is a paranoid check routine. It checks that dy_sys is really the portion of orig_sys specified in dy_origvars and dy_origcons (and that this agrees with dy_actvars and dy_actcons). Parameters: orig_sys: the original constraint system Returns: TRUE if the systems seem to correspond, FALSE otherwise. */ { int ovndx,ocndx,avndx,acndx,opkndx,apkndx,cnt,noloadcnt,inactcnt ; double oaij,aaij,rhscorr,*obj,scaledtol ; pkvec_struct *opkcon,*apkcon,*apkvar ; flags vstatus ; bool retval ; char onmebuf[128],ovecnme[128] ; const char *rtnnme = "dy_chkdysys" ; /* The first thing we'll do is run through dy_origvars, count up the number of active, inactive, and unloadable entries, and check that this agrees with the size of dy_sys and dylp's running accounting. At the same time, cross-check with dy_actvars. While we're walking the columns, check for reasonable status and check that dy_sys and orig_sys agree on upper/lower bounds and objective function coefficients. We have to be a bit careful. For bounds, the initial check for equality handles the case where the bound is +/-inf. For the objective, clearly the phase I objective isn't going to match, so make sure we're looking at the phase II objective. As far as status of inactive variables, the only qualifier should be NOLOAD. Strip it out and check for valid nonbasic status. */ cnt = 0 ; noloadcnt = 0 ; inactcnt = 0 ; if (dy_lp->p1obj.installed == TRUE) obj = dy_lp->p1obj.p2obj ; else obj = dy_sys->obj ; for (ovndx = 1 ; ovndx <= orig_sys->varcnt ; ovndx++) { if (INACTIVE_VAR(ovndx)) { vstatus = (flags) -dy_origvars[ovndx] ; if (flgon(vstatus,vstatNOLOAD)) { noloadcnt++ ; clrflg(vstatus,vstatNOLOAD) ; } else { inactcnt++ ; } if (!(vstatus == vstatNBFR || vstatus == vstatNBFX || vstatus == vstatNBUB || vstatus == vstatNBLB)) { errmsg(433,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "inactive",consys_nme(orig_sys,'v',ovndx,TRUE,NULL),ovndx, dy_prtvstat(((flags) -dy_origvars[ovndx]))) ; return (FALSE) ; } } else { cnt++ ; avndx = dy_origvars[ovndx] ; if (ovndx != dy_actvars[avndx]) { errmsg(356,rtnnme,orig_sys->nme,"variable",ovndx,avndx,avndx, dy_actvars[avndx]) ; return (FALSE) ; } if (!(dy_sys->vub[avndx] == orig_sys->vub[ovndx] || withintol(dy_sys->vub[avndx],orig_sys->vub[ovndx],dy_tols->zero))) { (void) consys_nme(orig_sys,'v',ovndx,TRUE,onmebuf) ; strcpy(ovecnme,consys_assocnme(orig_sys,CONSYS_VUB)) ; errmsg(367,rtnnme,dy_sys->nme,consys_assocnme(dy_sys,CONSYS_VUB), consys_nme(dy_sys,'v',avndx,TRUE,NULL),avndx, dy_sys->vub[avndx],orig_sys->vub[ovndx],ovecnme,onmebuf,ovndx, dy_sys->vub[avndx]-orig_sys->vub[ovndx],dy_tols->zero) ; return (FALSE) ; } if (!(dy_sys->vlb[avndx] == orig_sys->vlb[ovndx] || withintol(dy_sys->vlb[avndx],orig_sys->vlb[ovndx],dy_tols->zero))) { (void) consys_nme(orig_sys,'v',ovndx,TRUE,onmebuf) ; strcpy(ovecnme,consys_assocnme(orig_sys,CONSYS_VLB)) ; errmsg(367,rtnnme,dy_sys->nme,consys_assocnme(dy_sys,CONSYS_VLB), consys_nme(dy_sys,'v',avndx,TRUE,NULL),avndx, dy_sys->vlb[avndx],orig_sys->vlb[ovndx],ovecnme,onmebuf,ovndx, dy_sys->vlb[avndx]-orig_sys->vlb[ovndx],dy_tols->zero) ; return (FALSE) ; } if (!withintol(obj[avndx],orig_sys->obj[ovndx],dy_tols->cost)) { (void) consys_nme(orig_sys,'v',ovndx,TRUE,onmebuf) ; strcpy(ovecnme,consys_assocnme(orig_sys,CONSYS_OBJ)) ; errmsg(367,rtnnme,dy_sys->nme,consys_assocnme(dy_sys,CONSYS_OBJ), consys_nme(dy_sys,'v',avndx,TRUE,NULL),avndx, obj[avndx],orig_sys->obj[ovndx],ovecnme,onmebuf,ovndx, obj[avndx]-orig_sys->obj[ovndx],dy_tols->cost) ; return (FALSE) ; } } } if (cnt != dy_sys->archvcnt) { errmsg(361,rtnnme,dy_sys->nme,"variable",dy_sys->archvcnt,cnt) ; return (FALSE) ; } if (noloadcnt != dy_lp->sys.vars.unloadable) { errmsg(446,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, dy_lp->sys.vars.unloadable,"variables","unloadable",noloadcnt) ; return (FALSE) ; } if (inactcnt != dy_lp->sys.vars.loadable) { errmsg(446,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, dy_lp->sys.vars.loadable,"variables","loadable",inactcnt) ; return (FALSE) ; } cnt = (orig_sys->varcnt-noloadcnt)-(cnt+inactcnt) ; if (cnt != 0) { errmsg(444,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "variable",orig_sys->varcnt,noloadcnt,inactcnt,dy_sys->archvcnt) ; return (FALSE) ; } /* Run a similar set of checks for constraints. */ cnt = 0 ; noloadcnt = 0 ; inactcnt = 0 ; for (ocndx = 1 ; ocndx <= orig_sys->concnt ; ocndx++) { if (INACTIVE_CON(ocndx)) { if (LOADABLE_CON(ocndx)) { inactcnt++ ; } else { noloadcnt++ ; } } else { cnt++ ; acndx = dy_origcons[ocndx] ; if (ocndx != dy_actcons[acndx]) { errmsg(356,rtnnme,orig_sys->nme,"constraint",ocndx,acndx,acndx, dy_actcons[acndx]) ; return (FALSE) ; } } } if (cnt != dy_sys->concnt) { errmsg(361,rtnnme,dy_sys->nme,"constraint",dy_sys->concnt,cnt) ; return (FALSE) ; } if (noloadcnt != dy_lp->sys.cons.unloadable) { errmsg(446,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, dy_lp->sys.cons.unloadable,"constraints","unloadable",noloadcnt) ; return (FALSE) ; } if (inactcnt != dy_lp->sys.cons.loadable) { errmsg(446,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, dy_lp->sys.cons.loadable,"constraints","loadable",inactcnt) ; return (FALSE) ; } cnt = (orig_sys->concnt-noloadcnt)-(cnt+inactcnt) ; if (cnt != 0) { errmsg(444,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "constraint",orig_sys->concnt,noloadcnt,inactcnt,dy_sys->concnt) ; return (FALSE) ; } /* Now check each active constraint to make sure that it contains exactly the coefficients it should. In the process, check the logical for each constraint and make sure that it has exactly one coefficient and the proper bounds. */ retval = TRUE ; apkcon = NULL ; apkvar = NULL ; opkcon = NULL ; for (acndx = 1 ; acndx <= dy_sys->concnt && retval == TRUE ; acndx++) { if (consys_getrow_pk(dy_sys,acndx,&apkcon) == FALSE) { errmsg(122,rtnnme,dy_sys->nme,"constraint", consys_nme(dy_sys,'c',acndx,TRUE,NULL),acndx) ; retval = FALSE ; break ; } ocndx = dy_actcons[acndx] ; if (consys_getrow_pk(orig_sys,ocndx,&opkcon) == FALSE) { errmsg(122,rtnnme,orig_sys->nme,"constraint", consys_nme(orig_sys,'c',ocndx,TRUE,NULL),ocndx) ; retval = FALSE ; break ; } rhscorr = 0 ; cnt = 0 ; for (opkndx = 0 ; opkndx < opkcon->cnt ; opkndx++) { ovndx = opkcon->coeffs[opkndx].ndx ; oaij = opkcon->coeffs[opkndx].val ; if (INACTIVE_VAR(ovndx)) { cnt++ ; vstatus = (flags) -dy_origvars[ovndx] ; switch (getflg(vstatus,vstatSTATUS)) { case vstatNBLB: { rhscorr += oaij*orig_sys->vlb[ovndx] ; break ; } case vstatNBUB: case vstatNBFX: { rhscorr += oaij*orig_sys->vub[ovndx] ; break ; } } } else { avndx = dy_origvars[ovndx] ; for (apkndx = 0 ; apkndx < apkcon->cnt ; apkndx++) { if (apkcon->coeffs[apkndx].ndx == avndx) { aaij = apkcon->coeffs[apkndx].val ; break ; } } if (apkndx >= apkcon->cnt) { errmsg(362,rtnnme,dy_sys->nme, consys_nme(dy_sys,'v',avndx,FALSE,NULL),avndx, consys_nme(dy_sys,'c',acndx,FALSE,NULL),acndx) ; retval = FALSE ; break ; } if (aaij != oaij) { errmsg(364,rtnnme,dy_sys->nme, consys_nme(dy_sys,'c',acndx,FALSE,NULL), consys_nme(dy_sys,'v',avndx,FALSE,NULL), acndx,avndx,aaij, consys_nme(orig_sys,'c',ocndx,FALSE,NULL), consys_nme(orig_sys,'v',ovndx,FALSE,NULL), ocndx,ovndx,oaij,orig_sys->nme) ; retval = FALSE ; break ; } } } if (retval == FALSE) break ; if (opkcon->cnt-cnt != apkcon->cnt-1) { errmsg(364,rtnnme,dy_sys->nme,consys_nme(dy_sys,'c',acndx,FALSE,NULL), acndx,opkcon->cnt-cnt,apkcon->cnt-1) ; retval = FALSE ; break ; } /* We have exactly the right architectural coefficients. What about the logical? First, the corresponding entry in actvars should be 0 (logicals don't exist in orig_sys). Find its coefficient (there should be exactly one in the column), then check that the logical has the right bounds. Recall that dylp isn't expecting to see anything except <= and = constraints, with range constraints handled as a <= constraint with an upper bounded slack. */ if (dy_actvars[acndx] != -INT_MAX) { errmsg(360,rtnnme,dy_sys->nme,acndx,dy_actvars[acndx]) ; retval = FALSE ; } if (consys_getcol_pk(dy_sys,acndx,&apkvar) == FALSE) { errmsg(122,rtnnme,dy_sys->nme,"variable", consys_nme(dy_sys,'v',acndx,TRUE,NULL),acndx) ; retval = FALSE ; break ; } if (apkvar->cnt != 1) { errmsg(402,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,consys_nme(dy_sys,'v',acndx,FALSE,NULL), acndx,apkvar->cnt) ; retval = FALSE ; break ; } for (apkndx = 0 ; apkndx < apkcon->cnt ; apkndx++) { if (apkcon->coeffs[apkndx].ndx == acndx) break ; } if (apkndx >= apkcon->cnt) { errmsg(365,rtnnme,dy_sys->nme,consys_nme(dy_sys,'v',acndx,FALSE,NULL), acndx,consys_nme(dy_sys,'c',acndx,FALSE,NULL),acndx) ; retval = FALSE ; break ; } if (dy_sys->vlb[acndx] != 0) { errmsg(426,rtnnme,dy_sys->nme,consys_nme(dy_sys,'v',acndx,FALSE,NULL), acndx,consys_prtcontyp(dy_sys->ctyp[acndx]), consys_nme(dy_sys,'c',acndx,FALSE,NULL),acndx,"lower", dy_sys->vlb[acndx]) ; retval = FALSE ; } switch (dy_sys->ctyp[acndx]) { case contypLE: { break ; } case contypEQ: { if (dy_sys->vub[acndx] != 0) { errmsg(426,rtnnme,dy_sys->nme,consys_nme(dy_sys,'v',acndx,FALSE,NULL), acndx,consys_prtcontyp(dy_sys->ctyp[acndx]), consys_nme(dy_sys,'c',acndx,FALSE,NULL),acndx,"upper", dy_sys->vub[acndx]) ; retval = FALSE ; } break ; } case contypRNG: { if (!withintol(dy_sys->vub[acndx], dy_sys->rhs[acndx]-dy_sys->rhslow[acndx],dy_tols->zero)) { errmsg(426,rtnnme,dy_sys->nme,consys_nme(dy_sys,'v',acndx,FALSE,NULL), acndx,consys_prtcontyp(dy_sys->ctyp[acndx]), consys_nme(dy_sys,'c',acndx,FALSE,NULL),acndx,"upper", dy_sys->vub[acndx]) ; retval = FALSE ; } break ; } default: { errmsg(463,rtnnme,dy_sys->nme,consys_prtcontyp(dy_sys->ctyp[acndx])) ; retval = FALSE ; break ; } } scaledtol = dy_tols->zero*(1+maxx(fabs(dy_sys->rhs[acndx]),fabs(rhscorr))) ; if (!withintol(dy_sys->rhs[acndx],orig_sys->rhs[ocndx]-rhscorr,scaledtol)) { if (withintol(dy_sys->rhs[acndx], orig_sys->rhs[ocndx]-rhscorr,10*scaledtol)) { warn(366,rtnnme,dy_sys->nme,acndx,dy_sys->rhs[acndx], consys_nme(dy_sys,'c',acndx,FALSE,NULL), orig_sys->rhs[ocndx]-rhscorr, fabs(dy_sys->rhs[acndx]-(orig_sys->rhs[ocndx]-rhscorr)), scaledtol,ocndx, consys_nme(orig_sys,'c',ocndx,FALSE,NULL),orig_sys->rhs[ocndx], -rhscorr) ; } else { errmsg(366,rtnnme,dy_sys->nme,acndx,dy_sys->rhs[acndx], consys_nme(dy_sys,'c',acndx,FALSE,NULL), orig_sys->rhs[ocndx]-rhscorr, fabs(dy_sys->rhs[acndx]-(orig_sys->rhs[ocndx]-rhscorr)), scaledtol,ocndx, consys_nme(orig_sys,'c',ocndx,FALSE,NULL),orig_sys->rhs[ocndx], -rhscorr) ; retval = FALSE ; break ; } } } /* Clean up and return. */ if (apkcon != NULL) pkvec_free(apkcon) ; if (apkvar != NULL) pkvec_free(apkvar) ; if (opkcon != NULL) pkvec_free(opkcon) ; return (retval) ; } #endif /* DYLP_PARANOIA */ bool dy_dupbasis (int dst_basissze, basis_struct **p_dst_basis, basis_struct *src_basis, int dst_statussze, flags **p_dst_status, int src_statuslen, flags *src_status) /* This routine duplicates the basis and status passed in src_*, leaving a copy in the basis and status pointed to by dst_*. Note that we're working with the external form of the basis and status --- this routine is intended as a convenience for the client code. If either of p_dst_basis or p_dst_status is null, no copy is made of the basis or status, respectively. It's an error if both are null. We never shrink an existing vector. If a basis is supplied and it is already longer than the requested size, the length is not changed. If max(requested size, existing size) < source size, the requested size is boosted to be sufficient. Parameters: dst_basissze: the desired allocated size for the new basis structure p_dst_basis: (i) an empty basis structure (space will be allocated as required) (o) duplicate of src_basis src_basis: basis structure to be duplicated dst_statussze: the desired allocated size for the new status vector p_dst_status: (i) an empty status vector (space will be allocated as required) src_statuslen: number of entries in src_status src_status: status vector to be copied Returns: TRUE if the copy is successful, FALSE otherwise (FALSE is possible only if we're paranoid). */ { basis_struct *dst_basis ; bool want_basis,want_status ; # ifdef DYLP_PARANOIA const char *rtnnme = "dy_dupbasis" ; if (p_dst_basis == NULL && p_dst_status == NULL) { errmsg(2,rtnnme,"&dst_basis and &dst_status") ; return (FALSE) ; } if (p_dst_basis != NULL && src_basis == NULL ) { errmsg(403,rtnnme,"basis") ; return (FALSE) ; } if (p_dst_status != NULL && src_status == NULL) { errmsg(403,rtnnme,"status") ; return (FALSE) ; } # endif if (p_dst_basis != NULL) { want_basis = TRUE ; } else { want_basis = FALSE ; } if (p_dst_status != NULL) { want_status = TRUE ; } else { want_status = FALSE ; } /* If the user's supplied a basis_struct, check it for size against src_basis and the requested allocated size, and force a reallocation of the basis vector if necessary. Then make the copy. */ if (want_basis == TRUE) { if (*p_dst_basis != NULL) { dst_basis = *p_dst_basis ; if (dst_basissze < dst_basis->len) dst_basissze = dst_basis->len ; if ((dst_basis->len < src_basis->len || dst_basis->len < dst_basissze) && dst_basis->el != NULL) { FREE(dst_basis->el) ; dst_basis->el = NULL ; } } else { dst_basis = (basis_struct *) CALLOC(1,sizeof(basis_struct)) ; *p_dst_basis = dst_basis ; } if (dst_basissze < src_basis->len) { # ifdef DYLP_PARANOIA warn(404,rtnnme,"basis",dst_basissze,src_basis->len) ; # endif dst_basissze = src_basis->len ; } if (dst_basis->el == NULL) { dst_basis->el = (basisel_struct *) MALLOC((dst_basissze+1)*sizeof(basisel_struct)) ; } memcpy(dst_basis->el,src_basis->el, (src_basis->len+1)*sizeof(basisel_struct)) ; dst_basis->len = src_basis->len ; } /* And similarly for status. If the client has supplied a status vector, we assume it's big enough. */ if (want_status == TRUE) { if (*p_dst_status == NULL) { if (dst_statussze < src_statuslen) { # ifdef DYLP_PARANOIA warn(404,rtnnme,"status",dst_statussze,src_statuslen) ; # endif dst_statussze = src_statuslen ; } *p_dst_status = (flags *) MALLOC((dst_statussze+1)*sizeof(flags)) ; } memcpy(*p_dst_status,src_status,(src_statuslen+1)*sizeof(flags)) ; } return (TRUE) ; } static void build_soln (lpprob_struct *orig_lp) /* This routine is responsible for constructing a solution that can be returned to the client. The solution consists of the status of all architectural variables, a basis vector comprised of (constraint, variable) index pairs, the values of the basic variables, and the values of the dual variables. Note that this routine will execute even for error returns, just in case the client wants to do a postmortem. For the status, the normal dylp flag codes are used for nonbasic variables, and the negative of the basis position is used for basic variables. Since we don't keep explicit values for nonbasic variables, they must be at bound. If dylp's pivoting works as advertised, there will be no nonbasic free or superbasic variables in an optimal solution, so this won't be a problem. (There is the possibility they will occur in an infeasible or unbounded problem. C'est la vie.) Basic logical variables, which don't exist outside of dylp, are reported in the basis vector as the negative of the index of their associated constraint. Parameters: orig_lp: The LP problem passed by the client. Returns: undefined */ { int ovndx,xjndx,xjpos,ubndndx,orig_ubndndx ; flags xjstatus ; consys_struct *orig_sys ; const char *rtnnme = "build_soln" ; /* dy_unscaling.c */ extern void dy_orig_soln(double *x, double *y) ; /* Grab the necessary space, if the user hasn't provided it or the space provided is too small. The basis, x, and y arrays have to be big enough to hold information for each constraint in the active system, but the status and active variable arrays have to be big enough to hold information for each variable in the original system. Note that we allocate to colsze or rowsze, even if the indicated size is larger than necessary. We have to do this to maintain consistency in allocated size between preallocated vectors and vectors we allocate here. Note that the basis_struct has a length field, but this is the actual length of the basis, not the allocated length. The allocated length is assumed to match rowsze. */ orig_sys = orig_lp->consys ; if (orig_lp->colsze < orig_sys->varcnt) { if (orig_lp->status != NULL) { FREE(orig_lp->status) ; orig_lp->status = NULL ; } if (orig_lp->actvars != NULL) { FREE(orig_lp->actvars) ; orig_lp->actvars = NULL ; } orig_lp->colsze = orig_sys->varcnt ; } if (orig_lp->status == NULL) orig_lp->status = (flags *) CALLOC((orig_lp->colsze+1),sizeof(flags)) ; if (flgon(orig_lp->ctlopts,lpctlACTVARSOUT)) { if (orig_lp->actvars == NULL) orig_lp->actvars = (bool *) CALLOC((orig_lp->colsze+1),sizeof(bool)) ; } if (orig_lp->rowsze < dy_sys->concnt) { if (orig_lp->x != NULL) { FREE(orig_lp->x) ; orig_lp->x = NULL ; } if (orig_lp->y != NULL) { FREE(orig_lp->y) ; orig_lp->y = NULL ; } if (orig_lp->basis != NULL) { if (orig_lp->basis->el != NULL) { FREE(orig_lp->basis->el) ; orig_lp->basis->el = NULL ; } } orig_lp->rowsze = dy_sys->concnt ; } if (orig_lp->basis == NULL) orig_lp->basis = (basis_struct *) CALLOC(sizeof(basis_struct),1) ; if (orig_lp->basis->el == NULL) orig_lp->basis->el = (basisel_struct *) CALLOC((orig_lp->rowsze+1),sizeof(basisel_struct)) ; if (orig_lp->x == NULL) orig_lp->x = (double *) CALLOC((orig_lp->rowsze+1),sizeof(double)) ; if (orig_lp->y == NULL) orig_lp->y = (double *) CALLOC((orig_lp->rowsze+1),sizeof(double)) ; /* Fill in the simple stuff --- objective, return code, and iterations. For an optimal solution, we'll recalculate the objective on the spot, as it's just been incrementally updated through primal II or dual II. If we stopped due to hitting an iteration limit, we also want a valid solution, but it's a bit more complicated (we may need to flush the P1 objective and recalculate duals and reduced costs). A small iteration limit is a common tactic for clients to limit computational effort; they still expect a valid objective. When the solution is unbounded, the objective is overloaded to hold the index of the variable that was discovered to be unbounded. Since we're using sign to indicate the direction of unboundedness, represent the logical for constraint i as n+i, in the original system frame of reference. */ switch (dy_lp->lpret) { case lpOPTIMAL: { orig_lp->obj = dy_calcobj() ; break ; } case lpITERLIM: { if (dy_lp->p1obj.installed == TRUE) { if (dy_swapobjs(dyPRIMAL2) == FALSE) { errmsg(318,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,"remove") ; dy_lp->lpret = lpFATAL ; } else { dy_calcduals() ; if (dy_calccbar() == FALSE) { errmsg(384,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters) ; dy_lp->lpret = lpFATAL ; } } } if (dy_lp->lpret == lpFATAL) { orig_lp->obj = dy_tols->inf ; } break ; } case lpUNBOUNDED: { ubndndx = abs(dy_lp->ubnd.ndx) ; if (ubndndx > dy_sys->concnt) { orig_ubndndx = dy_actvars[ubndndx] ; } else { orig_ubndndx = orig_sys->varcnt+dy_actcons[ubndndx] ; } if (dy_lp->ubnd.ndx < 0) { orig_lp->obj = -((double) orig_ubndndx) ; } else { orig_lp->obj = ((double) orig_ubndndx) ; } break ; } case lpINFEAS: { orig_lp->obj = dy_lp->infeas ; break ; } default: { orig_lp->obj = dy_tols->inf ; break ; } } orig_lp->lpret = dy_lp->lpret ; orig_lp->iters = dy_lp->tot.pivs ; /* Now fill in the answer. First we walk dy_origvars. For each nonbasic architectural variable (active and inactive), we fill in the status entry. NBFR variables (active or inactive) are uncommon but correct: by convention, the value is zero, and dylp will not force them into the basis unless the reduced cost is nonzero. SB variables are a different story. We should never see an inactive SB variable. Dylp will force SB variables to bound or into the basis, and they will only be seen here if dylp could not solve the problem to optimality. For each active basic architectural variable, we place the negative of the basis position in the status entry and fill in the basis information, then fill in the x and y values. Remember that there are no logicals in orig_sys. If the user is asking for an active variables vector, fill that in too. */ for (ovndx = 1 ; ovndx <= orig_sys->varcnt ; ovndx++) { if (INACTIVE_VAR(ovndx)) { xjstatus = (flags)(-dy_origvars[ovndx]) ; orig_lp->status[ovndx] = getflg(xjstatus,vstatSTATUS) ; if (flgon(orig_lp->ctlopts,lpctlACTVARSOUT)) orig_lp->actvars[ovndx] = FALSE ; } else { if (flgon(orig_lp->ctlopts,lpctlACTVARSOUT)) orig_lp->actvars[ovndx] = TRUE ; xjndx = dy_origvars[ovndx] ; xjstatus = dy_status[xjndx] ; if (flgon(xjstatus,vstatNONBASIC|vstatEXOTIC)) { if (flgon(xjstatus,vstatSB)) { if (dy_lp->lpret == lpOPTIMAL) errmsg(359,rtnnme,dy_sys->nme, consys_nme(dy_sys,'v',xjndx,FALSE,NULL),xjndx, dy_prtvstat(xjstatus)) ; # ifndef DYLP_NDEBUG else warn(359,rtnnme,dy_sys->nme, consys_nme(dy_sys,'v',xjndx,FALSE,NULL),xjndx, dy_prtvstat(xjstatus)) ; # endif } orig_lp->status[ovndx] = xjstatus ; } else { xjpos = dy_var2basis[xjndx] ; orig_lp->status[ovndx] = -xjpos ; orig_lp->basis->el[xjpos].cndx = dy_actcons[xjpos] ; orig_lp->basis->el[xjpos].vndx = ovndx ; orig_lp->x[xjpos] = dy_x[xjndx] ; orig_lp->y[xjpos] = dy_y[xjpos] ; } } } /* Now, we walk the basis, to pick up any entries occupied by basic logicals. */ for (xjpos = 1 ; xjpos <= dy_sys->concnt ; xjpos++) { if (dy_basis[xjpos] <= dy_sys->concnt) { orig_lp->basis->el[xjpos].cndx = dy_actcons[xjpos] ; orig_lp->basis->el[xjpos].vndx = -dy_actcons[dy_basis[xjpos]] ; orig_lp->x[xjpos] = dy_xbasic[xjpos] ; orig_lp->y[xjpos] = dy_y[xjpos] ; } } /* Unscale the solution. */ dy_orig_soln(orig_lp->x,orig_lp->y) ; /* Set the basis length and we're out of here. */ orig_lp->basis->len = dy_sys->concnt ; return ; } /* Handy macro for use by dy_finishup. */ #define FREE_AND_CLEAR(zz_var_zz) \ if (zz_var_zz != NULL) { FREE(zz_var_zz) ; zz_var_zz = NULL ; } void dy_finishup (lpprob_struct *orig_lp, dyphase_enum phase) /* This routine assembles the final answer from the active and inactive portions of the constraint system, and cleans up the working structures of dylp. Parameters: orig_lp: The LP problem passed by the client. phase: dylp's phase Returns: undefined */ { consys_struct *orig_sys ; extern bool dy_retained ; /* dylp.c */ /* Why are we here? It may be that the user called dylp strictly to free the data structures; this is indicated by orig_lp->phase == dyDONE, phase == dyINV, and the lpctlONLYFREE flag. It may be that dylp needs to free up previous data structures to do a warm or cold start. This is indicated by orig_lp->phase == dyINIT and phase == dyINIT and orig_lp->lpret == dyINV. Otherwise, if orig_lp->phase is dyDONE, we're cleanly done and we'll try to build an answer as best we can. `Cleanly done' covers error and non-error returns. Anything else is a serious error, and we won't even attempt to build a solution, just free the data structures. */ if (orig_lp->phase == dyDONE && phase == dyINV && flgon(orig_lp->ctlopts,lpctlONLYFREE)) { clrflg(orig_lp->ctlopts,lpctlACTVARSOUT) ; dy_initlclsystem(orig_lp,TRUE) ; } else if (orig_lp->phase == dyINIT && phase == dyINIT && orig_lp->lpret == dyINV) { dy_initlclsystem(orig_lp,TRUE) ; } else if (orig_lp->phase == dyDONE) { build_soln(orig_lp) ; } else { clrflg(orig_lp->ctlopts,lpctlACTVARSOUT) ; } /* Free up the working structures --- the constraint system and the various local vectors, the LP control structure, and the option and tolerance structures. We also need to detach origvars and origcons from orig_sys, so that we don't keep accumulating attachment structures. The code is defensive, setting all pointers back to NULL so that we don't get in trouble in an environment (like COIN) where multiple cleanup calls are possible from independent objects. The exception is if we see the lpctlNOFREE flag and we've come to one of the mathematically valid results --- optimal, unbounded, or infeasible. In this case, we can support reoptimisation with a hot start. Add to these the case of lpITERLIM, which is a valid state of affairs and occurs fairly commonly in branch & cut applications (e.g., strong branching). */ if (flgoff(orig_lp->ctlopts,lpctlNOFREE) || (!(orig_lp->lpret == lpOPTIMAL || orig_lp->lpret == lpUNBOUNDED || orig_lp->lpret == lpINFEAS || orig_lp->lpret == lpITERLIM))) { orig_sys = orig_lp->consys ; if (dy_origvars != NULL) { (void) consys_detach(orig_sys,(void **) &dy_origvars,TRUE) ; FREE(dy_origvars) ; dy_origvars = NULL ; } if (dy_origcons != NULL) { (void) consys_detach(orig_sys,(void **) &dy_origcons,TRUE) ; FREE(dy_origcons) ; dy_origcons = NULL ; } dy_freelclsystem(orig_lp,TRUE) ; if (dy_lp != NULL) (void) dy_swapobjs(dyDONE) ; if (dy_sys != NULL) { consys_free(dy_sys) ; dy_sys = NULL ; } FREE_AND_CLEAR(dy_actvars) FREE_AND_CLEAR(dy_actcons) FREE_AND_CLEAR(dy_basis) FREE_AND_CLEAR(dy_var2basis) FREE_AND_CLEAR(dy_status) FREE_AND_CLEAR(dy_x) FREE_AND_CLEAR(dy_xbasic) FREE_AND_CLEAR(dy_y) FREE_AND_CLEAR(dy_frame) FREE_AND_CLEAR(dy_gamma) FREE_AND_CLEAR(dy_cbar) FREE_AND_CLEAR(dy_rho) FREE_AND_CLEAR(dy_brkout) FREE_AND_CLEAR(dy_degenset) FREE_AND_CLEAR(dy_ddegenset) dy_freepivrej() ; FREE_AND_CLEAR(dy_lp) FREE_AND_CLEAR(dy_tols) FREE_AND_CLEAR(dy_opts) clrflg(orig_lp->ctlopts,lpctlDYVALID) ; dy_retained = FALSE ; } else { setflg(orig_lp->ctlopts,lpctlDYVALID) ; dy_freelclsystem(orig_lp,FALSE) ; dy_retained = TRUE ; } return ; } #undef FREE_AND_CLEAR void dy_freesoln (lpprob_struct *lpprob) /* Simple utility to free the solution structures hanging off an lp problem structure. Does not free the constraint system, or the lpprob_struct. Parameters: lpprob: the lp problem Returns: undefined */ { if (lpprob->basis != NULL) { if (lpprob->basis->el != NULL) FREE(lpprob->basis->el) ; FREE(lpprob->basis) ; lpprob->basis = NULL ; } if (lpprob->status != NULL) { FREE(lpprob->status) ; lpprob->status = NULL ; } if (lpprob->x != NULL) { FREE(lpprob->x) ; lpprob->x = NULL ; } if (lpprob->y != NULL) { FREE(lpprob->y) ; lpprob->y = NULL ; } if (lpprob->actvars != NULL) { FREE(lpprob->actvars) ; clrflg(lpprob->ctlopts,lpctlACTVARSIN|lpctlACTVARSOUT) ; lpprob->actvars = NULL ; } lpprob->colsze = 0 ; lpprob->rowsze = 0 ; return ; } DyLP-1.6.0/DyLP/src/Dylp/dylp.c0000644000076700007670000015137711037243540012724 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains the top-level routines for the dylp dynamic simplex package. The basic flow of the dynamic simplex algorithm is as follows: 0) Initialisation: Initialise the constraint system with equalities and some suitable selection of inequalities. Go to 4. 1) Purge Variables: Based on some threshold for reduced cost, deactivate variables which are unlikely to improve the objective. 2) Generate Variables: Generate new variables not part of the original problem statement (column generation). These are added to the set of inactive variables. 3) Add Variables: Price out the inactive variables. If any of them have suitable reduced cost, add them to the set of active variables and go to 4, otherwise go to 5. 4) Primal: Optimise with primal simplex. Go to 1. 5) Purge Constraints: If the objective strictly improved (indicating that we've moved to a new extreme point), deactivate any slack constraints. 6) Generate Constraints: Generate new constraints, not part of the original problem statement (cut generation). Equalities go directly into the active set, inequalities go into the inactive set. 7) Add Constraints: Check the inactive constraints for violations. If any violated constraints are found, add them to the active constraints. If no violated constraints are found, we're optimal over all constraints and variables. 8) Dual: Optimise with dual simplex. Go to 1. If the user has forced use of primal phase I in place of dual phase II, a silent punt occurs immediately. If the caller specifies the fullsys option, the full constraint system is loaded and all constraint and variable deactivation/activation is skipped. The dual simplex is somewhat weaker than the primal simplex -- it has no phase I, and has only antidegen lite. Consequently, the dual will punt to the primal phase I when it finds itself in trouble due to loss of feasibility or stalling. It also punts to primal phase I when it needs to add variables but can't find any that are dual feasible. Steps 2 and 6 are implemented as stubs, as they are highly problem specific. dylp requires that any variables or constraints generated by a call must be inserted in the original constraint system. They can be left to be picked up in steps 3 or 7, or the generation routines can force them into the active sets as they are generated. Inactive constraints are assumed to be loose. They're pretty simple to activate -- the row is added to dy_sys with a logical, which is made basic. If the constraint contains other variables, beyond the currrent active set, they remain inactive (this avoids any potential trouble in terms of maintaining dual feasibility). The only point to be made is that for maximum efficiency all constraints in dy_sys are billed as architectural constraints. (This prevents consys from working harder to keep the architectural and cut constraints as two distinct sets.) Inactive variables require a bit more bookkeeping when they're inactive. Since we have to be able to construct a basic feasible (i.e., extreme point) solution, inactive variables must be at bound. Texts invariably assume the simple case of a lower bound of 0 and no upper bound; in this case no special action is needed. When a variable x has non-zero lower and/or upper bounds, we'll need to correct b in dy_sys whenever a is non-zero, since the simplex routines have no other way of seeing the effect of the bound. It's worth mentioning again that dylp and consys use a nonstandard convention for variable indices. For a constraint system with m constraints and n architectural variables, logicals occupy indices 1..m and architectural variables occupy indices m+1..m+n. */ #define DYLP_INTERNAL #include "dylp.h" static char sccsid[] UNUSED = "@(#)dylp.c 4.7 10/15/05" ; static char svnid[] UNUSED = "$Id: dylp.c 246 2008-07-16 00:57:04Z lou $" ; /* To avoid passing an excessive number of parameters around inside the dylp implementation, the following globals are used to communicate between modules. These are defined in dylp.h, but their use is limited by the DYLP_INTERNAL conditional compilation variable. */ lp_struct *dy_lp = NULL ; consys_struct *dy_sys = NULL ; lpopts_struct *dy_opts = NULL ; lptols_struct *dy_tols = NULL ; #ifdef DYLP_STATISTICS lpstats_struct *dy_stats = NULL ; #endif int *dy_actvars = NULL, *dy_actcons = NULL, *dy_origvars = NULL, *dy_origcons = NULL, *dy_basis = NULL, *dy_var2basis = NULL, *dy_brkout = NULL, *dy_degenset = NULL, *dy_ddegenset = NULL ; flags *dy_status = NULL ; double *dy_x = NULL, *dy_xbasic = NULL, *dy_y = NULL, *dy_gamma = NULL, *dy_cbar = NULL, *dy_rho = NULL ; bool *dy_frame = NULL ; /* We need one last variable to tell us whether the global data structures declared above have been retained from the previous call. This is checked in dylp, and set in dy_finishup. */ bool dy_retained = FALSE ; /* Startup control type. */ typedef enum {startCOLD, startWARM, startHOT} start_enum ; static void updateOptsAndTols (lpopts_struct *client_opts, lptols_struct *client_tols) /* A nearly trivial routine to update options and tolerances. Pulled out of dylp startup sequence to keep down the clutter from comments and provide a single point of change. Most of the options and tolerances are read-only, but dylp already adjusts a few on the fly and this is likely to grow. The general strategy is simple enough: If we have retained structures, create local copies of each structure on the stack and use them to hold the current settings. Copy the client's options and tolerances into the dylp structures, then bring back the fields that dylp modifies. The bulk copy is overkill but robust against changes in the structures. Options modified by dylp: dpsel.strat Tolerances modified by dylp: pfeas dfeas Parameters: client_opts: options supplied by client client_tols: tolerances supplied by client Returns: undefined */ { lptols_struct lcl_tols ; lpopts_struct lcl_opts ; # ifdef DYLP_PARANOIA const char *rtnnme = "updateOptsAndTols" ; # endif /* Allocate dylp's structures, if they don't exist, or make copies if they do. It should be the case that we have structures iff dy_retained == TRUE */ # ifdef DYLP_PARANOIA if ((dy_retained == TRUE && (dy_tols == NULL || dy_opts == NULL)) || (dy_retained == FALSE && (dy_tols != NULL || dy_opts != NULL))) { errmsg(1,rtnnme,__LINE__) ; return ; } # endif if (dy_retained == TRUE) { memcpy(&lcl_tols,dy_tols,sizeof(lptols_struct)) ; memcpy(&lcl_opts,dy_opts,sizeof(lpopts_struct)) ; } else { dy_tols = (lptols_struct *) MALLOC(sizeof(lptols_struct)) ; dy_opts = (lpopts_struct *) MALLOC(sizeof(lpopts_struct)) ; } /* Copy the client's structures into dylp's structures. */ memcpy(dy_tols,client_tols,sizeof(lptols_struct)) ; memcpy(dy_opts,client_opts,sizeof(lpopts_struct)) ; /* If we had retained structures, copy over the fields that dylp modifies. If we're starting afresh, make sure we have a sane default in place for pfeas and dfeas. */ if (dy_retained == TRUE) { dy_opts->dpsel.strat = lcl_opts.dpsel.strat ; dy_tols->pfeas = lcl_tols.pfeas ; dy_tols->dfeas = lcl_tols.dfeas ; } else { if (dy_tols->pfeas <= 0) { dy_tols->pfeas = dy_tols->pfeas_scale*dy_tols->zero ; } if (dy_tols->dfeas <= 0) { dy_tols->dfeas = dy_tols->dfeas_scale*dy_tols->cost ; } } return ; } static dyphase_enum addcon_nextphase (int actcnt) /* This routine determines the appropriate next state after the addition of violated constraints in phase dyADDCON. It's just a bit too complicated to leave laying out in the open. We look at the active (just finished) simplex and its return code, the target simplex, and the number of constraints that were activated (the parameter actcnt). Parameter: actcnt: the number of constraints just activated; may be negative if there's been an error Returns: appropriate next phase, one of dyPRIMAL1, dyDUAL, dyDONE, or dyINV. */ { dyphase_enum retval = dyINV ; flags chkflgs = ladPRIMFEAS|ladPFQUIET ; const char *rtnnme = "addcon_nextphase" ; # ifndef NDEBUG if (dy_opts->print.major >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n Entering simplex %s (%s), loadable %d, activated %d.", dy_prtlpphase(dy_lp->simplex.active,TRUE),dy_prtlpret(dy_lp->lpret), dy_lp->sys.cons.loadable,actcnt) ; } # endif if (actcnt < 0) return (dyINV) ; switch (dy_lp->simplex.active) { case dyPRIMAL2: { switch (dy_lp->lpret) { case lpOPTIMAL: { if (actcnt == 0) { retval = dyDONE ; } else { retval = dyPURGECON ; } break ; } case lpUNBOUNDED: { if (actcnt == 0) { if (dy_lp->sys.cons.loadable > 0) { retval = dyFORCEFULL ; } else { retval = dyDONE ; } } else { retval = dy_lp->simplex.next ; } break ; } case lpSWING: { if (actcnt == 0) { retval = dyPRIMAL2 ; dy_lp->simplex.next = dyPRIMAL2 ; } else { retval = dy_lp->simplex.next ; } break ; } case lpFORCEDUAL: { if (actcnt == 0) { retval = dyFORCEFULL ; } else { retval = dyPURGECON ; } break ; } default: { break ; } } break ; } case dyPRIMAL1: { switch (dy_lp->lpret) { case lpUNBOUNDED: { if (actcnt == 0) { retval = dyFORCEFULL ; } else { retval = dyPRIMAL1 ; dy_lp->simplex.next = dyPRIMAL1 ; } break ; } case lpSWING: { if (actcnt == 0) { retval = dyPRIMAL1 ; dy_lp->simplex.next = dyPRIMAL1 ; } else { retval = dy_lp->simplex.next ; } break ; } case lpFORCEDUAL: { if (actcnt == 0) { retval = dyFORCEFULL ; } else { retval = dyPURGECON ; } break ; } case lpPUNT: case lpSTALLED: { if (actcnt == 0) { retval = dyFORCEDUAL ; } else { retval = dyPRIMAL1 ; dy_lp->simplex.next = dyPRIMAL1 ; } break ; } default: { break ; } } break ; } case dyDUAL: { switch (dy_lp->lpret) { case lpOPTIMAL: { if (actcnt == 0) { retval = dyDONE ; } else { retval = dyGENVAR ; } break ; } case lpSWING: { if (actcnt == 0) { if (dy_lp->sys.vars.loadable <= 0) { retval = dyPRIMAL1 ; dy_lp->simplex.next = dyPRIMAL1 ; } else { retval = dyADDVAR ; } } else { retval = dy_lp->simplex.next ; } break ; } case lpPUNT: case lpSTALLED: { if (actcnt == 0) { retval = dyFORCEPRIMAL ; } else { retval = dyDUAL ; dy_lp->simplex.next = dyDUAL ; } break ; } default: { break ; } } break ; } default: { break ; } } if (retval == dyDUAL && dy_opts->usedual == FALSE) { retval = dyPRIMAL1 ; dy_lp->simplex.next = dyPRIMAL1 ; } /* The call to dy_accchk is needed to ensure that the primal infeasibility information is consistent before primal1 calls initp1obj. */ if (dy_lp->simplex.next == dyPRIMAL1) { if (dy_accchk(&chkflgs) != dyrOK) { retval = dyINV ; } } if (retval == dyINV) { errmsg(435,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, actcnt,"constraints",dy_prtlpphase(dy_lp->simplex.active,TRUE), dy_prtlpret(dy_lp->lpret), dy_prtlpphase(dy_lp->simplex.next,TRUE)) ; } # ifndef NDEBUG if (dy_opts->print.major >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n Leaving phase %s, simplex %s.", dy_prtlpphase(retval,TRUE), dy_prtlpphase(dy_lp->simplex.next,TRUE)) ; } # endif return (retval) ; } static dyphase_enum addvar_nextphase (int actcnt) /* This routine determines the appropriate next state after the appropriate variable activation routine has been called in state dyADDVAR. It's just a bit too complicated to leave laying out in the open. We look at the active (just finished) simplex and its return code, the target simplex, and the number of variables that were activated (the parameter actcnt). Parameter: actcnt: the number of variables just activated (may be negative if there's been an error Returns: appropriate next phase; one of dyPRIMAL1, dyPRIMAL2, dyDUAL, dyPURGECON, dyFORCEDUAL, dyDONE, or dyINV. */ { dyphase_enum retval = dyINV ; flags chkflgs = ladPRIMFEAS|ladPFQUIET ; const char *rtnnme = "addvar_nextphase" ; if (actcnt < 0) return (dyINV) ; switch (dy_lp->simplex.active) { case dyPRIMAL1: { switch (dy_lp->lpret) { case lpINFEAS: { if (actcnt == 0) { retval = dyDONE ; } else { retval = dyPRIMAL1 ; dy_lp->simplex.next = dyPRIMAL1 ; } break ; } case lpPUNT: case lpSTALLED: { if (actcnt == 0) { if (dy_lp->sys.cons.loadable > 0) { retval = dyGENCON ; } else { retval = dyFORCEDUAL ; } } else { retval = dyPRIMAL1 ; dy_lp->simplex.next = dyPRIMAL1 ; } break ; } case lpFORCEDUAL: { retval = dyDUAL ; dy_lp->simplex.next = dyDUAL ; break ; } default: { break ; } } break ; } case dyPRIMAL2: { switch (dy_lp->lpret) { case lpOPTIMAL: { if (dy_lp->simplex.next == dyPRIMAL2) { if (actcnt == 0) { retval = dyGENCON ; dy_lp->simplex.next = dyDUAL ; } else { retval = dyPRIMAL2 ; } } else if (dy_lp->simplex.next == dyDUAL) { retval = dyDUAL ; } break ; } case lpPUNT: case lpSTALLED: { if (actcnt == 0) { retval = dyFORCEDUAL ; } else { retval = dyPRIMAL2 ; dy_lp->simplex.next = dyPRIMAL2 ; } break ; } case lpFORCEDUAL: { retval = dyDUAL ; dy_lp->simplex.next = dyDUAL ; break ; } default: { break ; } } break ; } case dyDUAL: { switch (dy_lp->lpret) { case lpOPTIMAL: { if (dy_lp->simplex.next == dyPRIMAL2) { if (actcnt == 0) { retval = dyGENCON ; dy_lp->simplex.next = dyDUAL ; } else { retval = dyPURGEVAR ; } } else if (dy_lp->simplex.next == dyDUAL) { retval = dyDUAL ; } break ; } case lpINFEAS: /* dual unbounded */ { retval = dyPRIMAL1 ; dy_lp->simplex.next = dyPRIMAL1 ; break ; } case lpSWING: { if (actcnt == 0 && dy_lp->simplex.next != dyPRIMAL1) { dy_lp->simplex.next = dyPRIMAL1 ; retval = dyADDVAR ; } else { retval = dy_lp->simplex.next ; } break ; } case lpLOSTFEAS: { retval = dy_lp->simplex.next ; break ; } case lpFORCEPRIMAL: { retval = dyPURGEVAR ; break ; } default: { break ; } } break ; } default: { break ; } } /* The call to dy_accchk is needed to ensure that the primal infeasibility information is consistent before primal1 calls dy_initp1obj. */ if (dy_lp->simplex.next == dyPRIMAL1) { if (dy_accchk(&chkflgs) != dyrOK) { retval = dyINV ; } } if (retval == dyINV) { errmsg(435,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, actcnt,"variables",dy_prtlpphase(dy_lp->simplex.active,TRUE), dy_prtlpret(dy_lp->lpret), dy_prtlpphase(dy_lp->simplex.next,TRUE)) ; } return (retval) ; } static dyphase_enum initial_activation (lpprob_struct *orig_lp) /* This routine handles requests for constraint and/or variable activation prior to starting simplex iterations. Either alone could be fit into the standard state cycle for dylp, but when both are specified it only makes sense to do constraint activation first, and that doesn't fit well with the standard state cycle. Parameter: orig_lp: the original lp Returns: dyDUAL, dyPRIMAL1, or dyPRIMAL2 if all goes well, dyINV if there's an error. */ { int xindx,xipos,conresult,varresult ; flags xistatus,calcflgs ; consys_struct *orig_sys ; dyret_enum retval ; const char *rtnnme = "initial_activation" ; orig_sys = orig_lp->consys ; conresult = -1 ; varresult = -1 ; /* If the client has asked for constraint activation, do that first. If we activate any constraints, we've lost primal feasibility, but there's still hope for dual feasibility. */ if (flgon(orig_lp->ctlopts,lpctlINITACTCON)) { # ifndef DYLP_NDEBUG if (dy_opts->print.conmgmt >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n [%s](%s)%d: pre-activating violated constraints, ", dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters) ; dyio_outfmt(dy_logchn,dy_gtxecho,"obj = %g ...",dy_lp->z) ; } # endif conresult = dy_activateCons(orig_sys,FALSE) ; if (conresult > 0) { calcflgs = ladPRIMFEAS|ladPFQUIET|ladDUALFEAS|ladDFQUIET ; retval = dy_accchk(&calcflgs) ; if (retval != dyrOK) { errmsg(304,rtnnme,dy_sys->nme, dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; return (dyINV) ; } if (flgoff(calcflgs,ladPRIMFEAS)) { dy_lp->simplex.next = dyPRIMAL2 ; } else if (flgoff(calcflgs,ladDUALFEAS)) { dy_lp->simplex.next = dyDUAL ; } else { dy_lp->simplex.next = dyPRIMAL1 ; } } } else { conresult = 0 ; } /* Now do variable activation, if requested. If we're targetting dual simplex, there's a little work involved to identify the infeasible basic primal variables. For each one, set ubnd.ndx to tell dualaddvars which row to check. */ if (conresult >= 0 && flgon(orig_lp->ctlopts,lpctlINITACTVAR)) { # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: [%s](%s)%d: pre-activating variables, ", rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters) ; dyio_outfmt(dy_logchn,dy_gtxecho,"%s rules, obj = %g ...", dy_prtlpphase(dy_lp->simplex.next,TRUE),dy_lp->z) ; } # endif if (dy_lp->simplex.next == dyPRIMAL1 || dy_lp->simplex.next == dyPRIMAL2) { varresult = dy_activateVars(orig_sys,NULL) ; } else { for (xipos = 1 ; xipos <= dy_sys->concnt ; xipos++) { xindx = dy_basis[xipos] ; xistatus = dy_status[xindx] ; if (flgon(xistatus,vstatBLLB|vstatBUUB)) { if (flgon(xistatus,vstatBUUB)) xindx = -xindx ; dy_lp->ubnd.ndx = xindx ; varresult = dy_dualaddvars(orig_sys) ; if (varresult < 0) break ; } } dy_lp->ubnd.ndx = 0 ; } } /* Figure out the appropriate return value and we're done. Unless something's gone wrong, we want to head for the initial simplex phase. */ if (conresult < 0 || varresult < 0) return (dyINV) ; else return (dy_lp->simplex.next) ; } static bool commonstart (start_enum start) /* This routine contains common initialisation actions for the antidegeneracy and pivot rejection algorithms, and DSE and PSE pricing. The allocation is unneeded for a hot start, but various other bits and pieces are necessary. Parameters: start: type of startup sequence (hot, warm, cold) Returns: TRUE if the initialisation completes without error, FALSE otherwise. */ { const char *rtnnme = "commonstart" ; /* Create and attach dy_brkout and dy_degenset (primal anti-degeneracy algorithm structures) and dy_ddegenset (dual anti-degeneracy structure). */ if (start != startHOT) { if (consys_attach(dy_sys,CONSYS_COL, sizeof(int),(void **) &dy_brkout) == FALSE) { errmsg(100,rtnnme,dy_sys->nme,"breakout vector") ; return (FALSE) ; } if (consys_attach(dy_sys,CONSYS_COL, sizeof(int),(void **) &dy_degenset) == FALSE) { errmsg(100,rtnnme,dy_sys->nme,"primal degenerate set vector") ; return (FALSE) ; } if (consys_attach(dy_sys,CONSYS_ROW, sizeof(int),(void **) &dy_ddegenset) == FALSE) { errmsg(100,rtnnme,dy_sys->nme,"dual degenerate set vector") ; return (FALSE) ; } } dy_lp->degen = 0 ; /* Allocate the initial pivot rejection list. */ if (start != startHOT) { dy_initpivrej(dy_sys->varcnt/10) ; } /* Create and attach dy_cbar, dy_gamma, and dy_frame (PSE structures), and dy_rho (DSE structure). */ if (start != startHOT) { if (consys_attach(dy_sys,CONSYS_ROW, sizeof(double),(void **) &dy_gamma) == FALSE) { errmsg(100,rtnnme,dy_sys->nme,"column norm vector") ; return (FALSE) ; } if (consys_attach(dy_sys,CONSYS_ROW, sizeof(bool),(void **) &dy_frame) == FALSE) { errmsg(100,rtnnme,dy_sys->nme,"reference frame vector") ; return (FALSE) ; } if (consys_attach(dy_sys,CONSYS_COL, sizeof(double),(void **) &dy_rho) == FALSE) { errmsg(100,rtnnme,dy_sys->nme,"basis inverse row norm") ; return (FALSE) ; } } /* Set up for steepest edge pricing. If we're headed into primal simplex, scan the status array and initialise the reference frame to the current nonbasic variables. If we're headed into dual simplex, we need the basis inverse row norms; call dy_dseinit to deal with it. */ if (dy_lp->simplex.next == dyDUAL) { dy_dseinit() ; dy_lp->simplex.init_dse = FALSE ; dy_lp->simplex.init_pse = TRUE ; } else { dy_pseinit() ; dy_lp->simplex.init_pse = FALSE ; dy_lp->simplex.init_dse = TRUE ; } return (TRUE) ; } lpret_enum dylp (lpprob_struct *orig_lp, lpopts_struct *orig_opts, lptols_struct *orig_tols, lpstats_struct *orig_stats) /* This is the top-level routine for dylp. It orchestrates the main flow through the 8 step dynamic simplex algorithm outlined at the beginning of the file. Note that orig_sys should NOT have logical variables associated with it when passed to dylp. They will be added in dy_sys, but orig_sys doesn't need them and they just get in the way. If orig_lp->phase == dyDONE, dylp will free any retained data structures and return. Any other value is ignored. Parameters: orig_lp: (i) The original problem --- at least the constraint system, and possibly an initial basis. (o) The solution to the problem, including status and basis vectors and values for the primal and dual variables, as appropriate to the problem status. orig_opts: (read only) dylp option values. The global dy_opts is used to pass these around to the various modules of dylp. orig_tols: dylp tolerance values. Copied to an internal structure as some of these are written during execution. The orig_stats structure is used only if DYLP_STATISTICS is defined. orig_stats: (i) A statistics structure; may be null, in which case no statistics are collected. (o) Statistics on the dylp run. Returns: Any of lpOPTIMAL, lpUNBOUNDED, or lpINFEAS can be returned when dylp executes without error. The remaining codes (see dylp.h for details) indicate some sort of execution error. */ { int cnt ; /* unused variable dyret_enum retval ; */ dyphase_enum phase ; double tol ; lpret_enum lpresult ; flags checks ; consys_struct *orig_sys ; const char *rtnnme = "dylp" ; start_enum start ; /* dy_force.c */ dyphase_enum dy_forcePrimal2Dual(consys_struct *orig_sys) ; dyphase_enum dy_forceDual2Primal(consys_struct *orig_sys) ; dyphase_enum dy_forceFull(consys_struct *orig_sys) ; #ifdef DYLP_PARANOIA if (orig_lp == NULL) { errmsg(2,rtnnme,"orig_lp") ; return (lpINV) ; } if (orig_opts == NULL) { errmsg(2,rtnnme,"orig_opts") ; return (lpINV) ; } if (orig_lp->consys == NULL) { errmsg(2,rtnnme,"orig_sys") ; return (lpINV) ; } #endif /* The first possibility is that this call is solely for the purpose of freeing the problem data structures. The indication is a phase of dyDONE plus the lpctlONLYFREE flag in orig_lp->ctlopts. Note that in an environment like COIN, there may be multiple independent objects using dylp, and they can make multiple calls to free data structures or attempt to free data structures even though dylp has never been called. */ if (orig_lp->phase == dyDONE && flgon(orig_lp->ctlopts,lpctlONLYFREE)) { if (dy_retained == TRUE) { dy_finishup(orig_lp,dyINV) ; } return (orig_lp->lpret) ; } /* We're here to do actual work. If the constraint system is marked as corrupt, free any retained structures, signal an error, and bail out immediately. Attempting cleanup is risky, but the alternative is to leak a lot of allocated space. */ orig_sys = orig_lp->consys ; if (flgon(orig_sys->opts,CONSYS_CORRUPT)) { errmsg(115,rtnnme,orig_sys->nme) ; if (dy_retained == TRUE) { # ifndef DYLP_NDEBUG if (orig_opts->print.major >= 1) dyio_outfmt(dy_logchn,dy_gtxecho, "\n Attempting cleanup of retained structures for %2.", orig_sys->nme) ; # endif orig_lp->phase = dyDONE ; setflg(orig_lp->ctlopts,lpctlONLYFREE) ; dy_finishup(orig_lp,dyINV) ; } return (lpFATAL) ; } /* Next we need to check the forcewarm and forcecold options, and set start accordingly. Cold dominates warm dominates hot, for convenience of use and debugging. (Forcing a cold start puts a sort of limited firewall between dylp and the client). If we're forcing a cold start, the initial phase will always be dyINV. Otherwise, we'll consider whatever the user says, but in the end the startup code will decide on primal and dual feasibility. The only say the client has is to forbid use of dual simplex. If we're trying for a warm or hot start, there had better be a basis. If the caller is trying for a hot start, do some quick checks --- there should be a status flag, the previous run should have ended cleanly (i.e., with a result of optimal, unbounded, infeasible, or iteration limit), and we should have retained data structures. Iteration limit is (sort of) a special case -- this arises frequently when a B&C code is using dylp for strong branching; the iteration limit will be deliberately inadequate. Admittedly these checks are not foolproof (the status flag and return code are accessible to the client, and we could be retaining structures based on a call from some other client), but one would like to hope the client knows what it's doing and is not arbitrarily interleaving calls from different objects. If we're paranoid, we'll check for consistency. */ # ifdef DYLP_PARANOIA if ((flgoff(orig_lp->ctlopts,lpctlDYVALID) && dy_retained == TRUE) || (flgon(orig_lp->ctlopts,lpctlDYVALID) && dy_retained == FALSE)) { errmsg(1,rtnnme,__LINE__) ; return (lpINV) ; } # endif if (orig_opts->forcecold == TRUE) { start = startCOLD ; phase = dyINV ; } else if (orig_opts->forcewarm == TRUE) { start = startWARM ; } else { start = startHOT ; if (flgoff(orig_lp->ctlopts,lpctlDYVALID) || dy_retained == FALSE) { errmsg(396,rtnnme,orig_sys->nme,"hot start") ; return (lpINV) ; } if (!(orig_lp->lpret == lpOPTIMAL || orig_lp->lpret == lpUNBOUNDED || orig_lp->lpret == lpINFEAS || orig_lp->lpret == lpITERLIM)) { errmsg(395,rtnnme,orig_sys->nme,dy_prtlpret(orig_lp->lpret)) ; return (lpINV) ; } } # ifndef DYLP_NDEBUG if (orig_opts->print.major >= 1) dyio_outfmt(dy_logchn,dy_gtxecho,"\n %s start for lp %s.", (start == startHOT)?"hot":((start == startWARM)?"warm":"cold"), orig_sys->nme) ; # endif # ifdef DYLP_PARANOIA /* In the context of an B&C code, it's common to run an LP to check a solution. If many or all variables are fixed, a presolve phase may give a 0x0 system. Warn about it if we're paranoid. */ if (orig_sys->concnt < 1 || orig_sys->varcnt < 1) { warn(351,rtnnme,orig_sys->nme,dy_prtlpphase(dyINIT,TRUE),0, orig_sys->concnt,orig_sys->varcnt) ; } if (flgon(orig_sys->opts,CONSYS_LVARS)) { errmsg(123,rtnnme,orig_sys->nme) ; return (lpINV) ; } if (orig_tols == NULL) { errmsg(2,rtnnme,"orig_tols") ; return (lpINV) ; } # endif /* Let's get to it. Mark the previous results as invalid. If we're forcing a cold or warm start, we may need to free up a data structure left from a previous run. */ orig_lp->phase = dyINIT ; orig_lp->lpret = lpINV ; lpresult = lpINV ; if (dy_retained == TRUE && start != startHOT) { checks = getflg(orig_lp->ctlopts,lpctlNOFREE) ; clrflg(orig_lp->ctlopts,lpctlNOFREE) ; dy_finishup(orig_lp,dyINIT) ; setflg(orig_lp->ctlopts,checks) ; } clrflg(orig_lp->ctlopts,lpctlDYVALID) ; /* If we're doing a warm or cold start, the first order of business is to establish the environment -- options and tolerances that'll be used by dylp as it works. For a hot start, these are already in place, but we allow the user to change them (give `em more than enough rope, I say ... ). From here on out, dy_finishup will be called to clean up, so make sure that it can tell what's been allocated and what hasn't. */ updateOptsAndTols(orig_opts,orig_tols) ; if (start != startHOT) { dy_sys = NULL ; dy_actvars = NULL ; dy_actcons = NULL ; dy_origvars = NULL ; dy_origcons = NULL ; dy_basis = NULL ; dy_var2basis = NULL ; dy_status = NULL ; dy_x = NULL ; dy_xbasic = NULL ; dy_y = NULL ; dy_cbar = NULL ; dy_gamma = NULL ; dy_frame = NULL ; dy_rho = NULL ; dy_brkout = NULL ; dy_degenset = NULL ; dy_ddegenset = NULL ; dy_freepivrej() ; dy_lp = (lp_struct *) CALLOC(1,sizeof(lp_struct)) ; dy_lp->p1obj.installed = FALSE ; dy_lp->p1obj.infvars = NULL ; dy_lp->p1obj.p1obj = NULL ; dy_lp->p1obj.p2obj = NULL ; } dy_lp->phase = dyINIT ; dy_lp->lpret = lpINV ; # ifdef DYLP_STATISTICS dy_stats = orig_stats ; # endif /* Initialise the local constraint system, if required. Scaling occurs here, if allowed. The original system is hidden away and orig_lp->consys is replaced by a scaled copy. See dy_scaling for details. */ if (dy_initlclsystem(orig_lp,(start == startHOT)?TRUE:FALSE) != TRUE) { errmsg(406,rtnnme,orig_sys->nme) ; orig_lp->lpret = lpFATAL ; dy_finishup(orig_lp,dy_lp->phase) ; return (lpFATAL) ; } orig_sys = orig_lp->consys ; /* Pick the appropriate startup routine for a hot, warm, or cold start. With a cold start, the user hasn't supplied an initial basis. Call dy_startup and dy_crash to get going. With a warm start, the user's given us a basis, but we need to call dy_warmstart to build the dylp data structures. If the previous problem was left active, we use dy_hotstart. On completion, the active constraint system and cross-reference structures will be built, a basis will be established and factored, the status vector will be valid, and values of the primal and dual variables and reduced costs will be valid. If the problem is prima facie infeasible (lower and upper bounds cross for some variable or constraint) this is reported via dy_lp->lpret, and we are immediately done. Similarly for unboundedness (an unconstrained variable with nonzero objective coefficient). */ switch (start) { case startHOT: { if (dy_hotstart(orig_lp) != dyrOK) { errmsg(371,rtnnme, orig_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),0,"hot start") ; dy_lp->lpret = lpFATAL ; } break ; } case startWARM: { if (dy_warmstart(orig_lp) != dyrOK) { errmsg(371,rtnnme, orig_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),0,"warm start") ; dy_lp->lpret = lpFATAL ; } break ; } case startCOLD: { if (dy_coldstart(orig_sys) != dyrOK) { errmsg(371,rtnnme, orig_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),0,"cold start") ; dy_lp->lpret = lpFATAL ; } else if (dy_crash() != dyrOK) { errmsg(302,rtnnme,dy_sys->nme, dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters,"crash") ; dy_lp->lpret = lpFATAL ; } break ; } } if (dy_lp->lpret != lpINV) { orig_lp->lpret = dy_lp->lpret ; if (orig_lp->lpret == lpINFEAS || orig_lp->lpret == lpUNBOUNDED) { dy_lp->phase = dyDONE ; orig_lp->phase = dyDONE ; #ifndef DYLP_NDEBUG if (dy_opts->print.major >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\n%s (%s): prima facie %s.", rtnnme,dy_sys->nme, ((orig_lp->lpret == lpINFEAS)?"infeasibility":"unboundedness")) ; } # endif } dy_finishup(orig_lp,dy_lp->phase) ; return (orig_lp->lpret) ; } /* Do a little more setup prior to invoking a simplex. commonstart handles initial setup for the antidegeneracy and pivot rejection algorithms, PSE and DSE pricing, and reduced costs. */ phase = dy_lp->simplex.next ; if (dy_opts->usedual == FALSE && phase == dyDUAL) phase = dyPRIMAL1 ; dy_lp->simplex.active = dyINV ; dy_lp->simplex.init_dse = TRUE ; dy_lp->simplex.init_pse = TRUE ; if (commonstart(start) == FALSE) { errmsg(371,rtnnme, orig_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),0,"common start") ; orig_lp->lpret = lpFATAL ; dy_finishup(orig_lp,dy_lp->phase) ; return (lpFATAL) ; } /* lastz.cd and lastz.vd control whether we do constraint and variable purging, respectively. Objective change is not, in general, monotonic, so we're just looking to get sufficient change to be sure we've moved since the last purge. ubnd.ndx is the index of the primal variable fingered for primal unboundedness. */ dy_lp->lastz.cd = -dy_tols->inf ; dy_lp->lastz.vd = -dy_tols->inf ; dy_lp->ubnd.ndx = 0 ; /* Various special startup activities. These are mutually exclusive, and need to be checked in the order given. Is this one of those pathological cases with no constraints? If so, make it look like we're optimal. No constraints doesn't mean no variables, so head for dyGENVAR. */ if (dy_sys->concnt == 0) { dy_lp->simplex.active = dyPRIMAL2 ; dy_lp->simplex.next = dyPRIMAL2 ; dy_lp->lpret = lpOPTIMAL ; phase = dyGENVAR ; } /* Do we want to do an initial variable purge, to try and cut down the number of variables? (This is particularly aimed at large set covering problems where all constraints are equalities and there are thousands of columns. dylp's normal cold start procedure will load the full system.) We need to rerun dy_initp1obj solely because deletion of variables can cause other variables to move, and this might invalidate indices in the infvars vector. */ else if (start == startCOLD && dy_opts->fullsys == FALSE && dy_sys->archvcnt > dy_opts->coldvars) { cnt = dy_deactivateVars(orig_sys) ; if (cnt < 0) { errmsg(371,rtnnme,orig_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),0, "initial variable deactivation") ; } if (phase == dyPRIMAL1 && cnt > 0) { if (dy_initp1obj() == FALSE) { errmsg(318,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,"initialise") ; phase = dyINV ; } } } /* Is the user requesting initial constraint and/or variable activation? This is a warm or hot start activity (cold start has its own rules to decide how much of the system to activate). A fatal error here will return dyINV for the phase. */ else if (start == startWARM || start == startHOT) { if (dy_opts->fullsys == FALSE && flgon(orig_lp->ctlopts,lpctlINITACTCON|lpctlINITACTVAR)) { phase = initial_activation(orig_lp) ; } } # ifdef DYLP_STATISTICS if (dy_stats != NULL) dy_stats->ini_simplex = phase ; # endif /* Open the main loop for dylp. Generally, there are two minor cycles --- purge/generate/add variables, primal simplex; and purge/generate/add constraints, dual simplex --- within an outer cycle which alternates between the primal and dual subcycles. There are, of course, complications in handling unbounded and infeasible problems. phase tracks the current algorithm phase. */ while (phase != dyDONE && phase != dyINV) { dy_lp->phase = phase ; # ifndef DYLP_NDEBUG if (dy_opts->print.major >= 1) dyio_outfmt(dy_logchn,dy_gtxecho, "\n\n%s (%s): entering phase %s, iter %d.",rtnnme, dy_sys->nme,dy_prtlpphase(phase,FALSE),dy_lp->tot.iters) ; # endif # ifdef DYLP_STATISTICS if (dy_stats != NULL) dy_stats->phasecnts[phase]++ ; # endif switch (phase) { /* Under normal circumstances, we'll enter dyPRIMAL[1|2] from dyINIT to solve the initial LP. We'll also come here from dyADDVAR, to reoptimise after adding variables, and from dyADDCONS, to reoptimise after adding constraints to an unbounded primal. There are a number of more exotic error recovery paths which lead back to primal simplex: primal phase I is the fallback when we can't recover primal or dual feasibility. Depending on where we've been, it may be necessary to reset the PSE reference frame before starting simplex iterations (simplex.init_pse == TRUE). In particular, if we've been running dual simplex, or have added constraints, we need to do a reset. Since we'll change the basis, we'll need to to a DSE reset if we ever return to dual simplex. If the result of the LP is lpOPTIMAL, we'll do a gen/add/purge constraints sequence, then dual simplex. If the result is lpINFEAS, we'll do a generate/add variables sequence, returning here if new variables were added. If the result is unbounded, we'll do a generate/add constraints sequence, returning here to try again. It's unlikely that phase I will go unbounded, but we're only dealing with a subset of the constraints, and it happens on occasion. If we return a punt or stall, it's an indication that we're in trouble down in the simplex. As a first cut, head off to check the variables. Maybe we can activate some desireable candidates that will allow us to pivot past this point. Anything else is an error. */ case dyPRIMAL1: case dyPRIMAL2: { dy_lp->simplex.active = phase ; if (dy_lp->simplex.init_pse == TRUE) { dy_pseinit() ; dy_lp->simplex.init_pse = FALSE ; } dy_lp->simplex.init_dse = TRUE ; lpresult = dy_primal() ; dy_lp->simplex.next = dy_lp->phase ; switch (lpresult) { case lpOPTIMAL: { phase = dyGENVAR ; dy_lp->simplex.next = dyPRIMAL2 ; break ; } case lpINFEAS: { phase = dyGENVAR ; break ; } case lpUNBOUNDED: { if (dy_sys->concnt < orig_sys->concnt) { phase = dyGENCON ; } else { phase = dyDONE ; } # ifdef DYLP_PARANOIA if (dy_lp->ubnd.ndx == 0) { errmsg(1,rtnnme,__LINE__) ; phase = dyINV ; break ; } # endif break ; } case lpSWING: { phase = dyGENCON ; # ifdef DYLP_PARANOIA if (dy_lp->ubnd.ndx == 0) { errmsg(1,rtnnme,__LINE__) ; phase = dyINV ; break ; } # endif break ; } case lpPUNT: case lpSTALLED: { phase = dyGENVAR ; break ; } case lpACCCHK: { phase = dyFORCEFULL ; break ; } default: { if (!(dy_opts->context == cxBANDC && lpresult == lpITERLIM)) { errmsg(353,rtnnme,orig_sys->nme,"primal", dy_prtlpret(lpresult)) ; } phase = dyDONE ; break ; } } break ; } /* In the best case, dual simplex has reported optimal, we've added variables with a gen/add variables sequence, and now we're doing a purge before returning to primal simplex. Call dy_deactivateVars to remove variables with sufficiently lousy reduced costs (in the sense that it's highly unlikely they'll return to the basis in the optimal solution). In the not so good case, we've been forced out of dual simplex for some reason and may or may not be primal feasible. There's no guarantee of monotonic change in the objective from one purge opportunity to the next. We just need to know we've moved. */ case dyPURGEVAR: { tol = dy_tols->purge*(1.0+fabs(dy_lp->z)) ; if (!withintol(dy_lp->z,dy_lp->lastz.vd,tol)) { # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n [%s](%s)%d: purging variables, obj = %g ...", dy_sys->nme,dy_prtlpphase(phase,TRUE),dy_lp->tot.iters, dy_lp->z) ; } # endif cnt = dy_deactivateVars(orig_sys) ; dy_lp->lastz.vd = dy_lp->z ; if (cnt < 0) { phase = dyINV ; } else { phase = dy_lp->simplex.next ; } } else { # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n [%s](%s)%d: variable purge skipped, obj = %g.", dy_sys->nme,dy_prtlpphase(phase,TRUE),dy_lp->tot.iters, dy_lp->z) ; } # endif phase = dy_lp->simplex.next ; } break ; } /* This phase should call a routine that generates new variables, not already present in orig_sys. This would be used for column generation algorithms and similar sorts of things. At the end of the routine, orig_sys should be modified such that the generated variables are part of the set of inactive variables, where they will be priced and added if advantageous during the dyADDVAR phase. See comments for dyADDVAR. */ case dyGENVAR: { phase = dyADDVAR ; break ; } /* This phase scans the inactive variables and adds the ones that look useful. The definition of useful varies, depending on the target simplex phase specified by dy_lp->simplex.next --- the simplex that will (eventually) run after dy_activateVars completes. If we're targetting primal simplex, we're looking for variables that price out as favourable (non-optimal) for their current status. The only complication is whether we're heading for primal phase I or II, and dy_activateVars will make sure it's using the correct reduced costs. If we're here because the dual is unbounded, we're really looking for columns which, when considered as dual constraints, can bound the dual. dy_dualaddvars will look for useful variables, considering progressively more exotic possibilities. Where we go from here depends on how we got here and how many variables were activated. See the comments with addvar_nextphase. If all is going well and we activated variables of the desired type, we'll head for the target simplex phase. If we didn't find variables, the possibilities are many and varied. Why would no variables be activated? A straightforward cause is there are no variables of the appropriate type (e.g., we're optimal or infeasible). Then there are things that dy_dualaddvars (more accurately, dual simplex) just can't cope with (e.g., no variables can be activated without losing dual feasibility). There are a number of other exotic things that can go wrong. See the comments with addvar_nextphase. */ case dyADDVAR: { if (dy_lp->sys.vars.loadable <= 0) { # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n [%s](%s)%d: no loadable variables; skipping.", dy_sys->nme,dy_prtlpphase(phase,TRUE), dy_lp->tot.iters) ; } # endif phase = addvar_nextphase(0) ; break ; } else { if (dy_lp->simplex.next == dyDUAL && dy_lp->lpret == lpINFEAS) { if (dy_opts->dualadd > 0) { # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: [%s](%s)%d: activating variables, ",rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters) ; dyio_outfmt(dy_logchn,dy_gtxecho,"%s rules, obj = %g ...", dy_prtlpphase(dy_lp->simplex.next,TRUE), dy_lp->z) ; } # endif cnt = dy_dualaddvars(orig_sys) ; } else { cnt = 0 ; } if (cnt > 0) { phase = dyDUAL ; } else if (cnt == 0) { dy_lp->simplex.next = dyPRIMAL1 ; checks = ladPRIMFEAS|ladPFQUIET ; if (dy_accchk(&checks) != dyrOK) { phase = dyINV ; } } else { phase = dyINV ; } } if (phase == dyADDVAR) { # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: [%s](%s)%d: activating variables, ", rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters) ; dyio_outfmt(dy_logchn,dy_gtxecho,"%s rules, obj = %g ...", dy_prtlpphase(dy_lp->simplex.next,TRUE),dy_lp->z) ; } # endif cnt = dy_activateVars(orig_sys,NULL) ; phase = addvar_nextphase(cnt) ; } } break ; } /* To arrive here, we've solved to optimality with primal simplex, added constraints with a gen/add constraints, and are now purging loose constraints (dual variables with unfavourable dual reduced costs) before heading for dual simplex. This phase calls dy_deactivateCons to scan the active constraints and remove any that are loose. This is done only when there's been strict degradation of the objective (i.e., we've cut off the previous optimum point) to minimise the chance of cycling. This will not, however, guarantee that a constraint will never reactivate. A loose constraint can become tight again when variables are activated and change value. */ case dyPURGECON: { tol = dy_tols->purge*(1.0+fabs(dy_lp->z)) ; if (dy_lp->z-dy_lp->lastz.cd > tol) { # ifndef DYLP_NDEBUG if (dy_opts->print.conmgmt >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n [%s](%s)%d: purging constraints, obj = %g ...", dy_sys->nme,dy_prtlpphase(phase,TRUE),dy_lp->tot.iters, dy_lp->z) ; } # endif cnt = dy_deactivateCons(orig_sys) ; if (cnt < 0) phase = dyINV ; else phase = dyDUAL ; dy_lp->lastz.cd = dy_lp->z ; # ifdef DYLP_PARANOIA if (dy_chkdysys(orig_sys) == FALSE) phase = dyINV ; # endif } else { # ifndef DYLP_NDEBUG if (dy_opts->print.conmgmt >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n [%s](%s)%d: constraint purge skipped, obj = %g.", dy_sys->nme,dy_prtlpphase(phase,TRUE),dy_lp->tot.iters, dy_lp->z) ; } # endif phase = dyDUAL ; } break ; } /* This phase should call a routine that generates new constraints --- cutting planes, for example. As with dyGENVAR, these constraints should be added to the original system, so that they can be found in phase dyADDCON. See the comments with dyADDCON. */ case dyGENCON: { phase = dyADDCON ; break ; } /* In the common case, we're adding constraints before starting dual simplex. Also normal, and all too common when working with a partial constraint system, we're here to look for constraints to bound the primal. dy_activateBndCons scans the inactive constraints for constraints that could bound the problem but are not violated. dy_activateCons scans the inactive constraints for violated constraints. When trying to bound a problem, it's fairly common that there are no nonviolated bounding constraints. In this case, we'll go for violated constraints. (Hence the seemingly redundant test around dy_activateCons.) There's no sense in even bothering to scan if there are no constraints to load. Inactive variables referenced by activated constraints can themselves be activated. Care is taken to preserve dual feasibility (primal feasibility cannot be lost). */ case dyADDCON: { if (dy_lp->sys.cons.loadable <= 0) { phase = addcon_nextphase(0) ; # ifndef DYLP_NDEBUG if (dy_opts->print.conmgmt >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n [%s](%s)%d: no loadable constraints; skipping.", dy_sys->nme,dy_prtlpphase(phase,TRUE), dy_lp->tot.iters) ; } # endif break ; } if (dy_lp->lpret == lpSWING || (dy_lp->lpret == lpUNBOUNDED && (dy_lp->simplex.next == dyPRIMAL2 || dy_lp->simplex.next == dyPRIMAL1))) { # ifndef DYLP_NDEBUG if (dy_opts->print.conmgmt >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n [%s](%s)%d: activating bounding constraints, ", dy_sys->nme,dy_prtlpphase(phase,TRUE), dy_lp->tot.iters) ; dyio_outfmt(dy_logchn,dy_gtxecho,"obj = %g ...",dy_lp->z) ; } # endif cnt = dy_activateBndCons(orig_sys) ; if (cnt > 0) { phase = dy_lp->simplex.next ; } else if (cnt == 0) { dy_lp->simplex.next = dyPRIMAL1 ; } else { phase = dyINV ; } } if (phase == dyADDCON) { # ifndef DYLP_NDEBUG if (dy_opts->print.conmgmt >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n [%s](%s)%d: activating violated constraints, ", dy_sys->nme,dy_prtlpphase(phase,TRUE), dy_lp->tot.iters) ; dyio_outfmt(dy_logchn,dy_gtxecho,"obj = %g ...",dy_lp->z) ; } # endif cnt = dy_activateCons(orig_sys,TRUE) ; phase = addcon_nextphase(cnt) ; } break ; } /* Dual simplex has no phase I, and must start from a dual feasible basis. It can happen that the startup routines generate a dual feasible basis in dyINIT. Most often, dual feasibility is obtained by running primal simplex to optimality. If dylp is running normally, we arrive here after a gen/add/purge constraints sequence and will use dual simplex to reoptimise. We can also arrive here after adding variables (dual constraints) to an unbounded dual. There are a number of more exotic error recovery paths. Bottom line, though, is we don't get here without dual feasibility. That limits the results to optimal, dual unbounded (translated to primal infeasible), or some sort of problem. If we're optimal, we'll do a gen/add/purge variables sequence, then primal simplex. If we come back dual unbounded (seen here as primal infeasible) we need to add constraints that will bound the dual, i.e., we need to add primal variables in such a way that we can return to dual simplex. Off to gen/add variables. If we can't add bounding constraints without losing dual feasibility, dylp will fall back to primal phase I. If we return a punt or stall, we'll try to add some dual variables (primal constraints). In the event of loss of dual feasibility, we'll try to force dual feasibility by dropping the offending variables, again falling back to primal phase I if we're unsuccessful. */ case dyDUAL: { dy_lp->simplex.active = dyDUAL ; if (dy_lp->simplex.init_dse == TRUE) { dy_dseinit() ; dy_lp->simplex.init_dse = FALSE ; } dy_lp->simplex.init_pse = TRUE ; lpresult = dy_dual() ; dy_lp->simplex.next = dyDUAL ; switch (lpresult) { case lpOPTIMAL: { phase = dyGENVAR ; dy_lp->simplex.next = dyPRIMAL2 ; break ; } case lpINFEAS: /* dual unbounded */ { phase = dyGENVAR ; break ; } case lpLOSTFEAS: { phase = dyFORCEDUAL ; break ; } case lpPUNT: case lpSTALLED: case lpSWING: { phase = dyGENCON ; break ; } case lpACCCHK: { phase = dyFORCEFULL ; break ; } default: { if (!(dy_opts->context == cxBANDC && lpresult == lpITERLIM)) { errmsg(353,rtnnme,orig_sys->nme,"dual", dy_prtlpret(lpresult)) ; } phase = dyDONE ; break ; } } break ; } case dyFORCEDUAL: { phase = dy_forcePrimal2Dual(orig_sys) ; break ; } case dyFORCEPRIMAL: { phase = dy_forceDual2Primal(orig_sys) ; break ; } case dyFORCEFULL: { if (dy_lp->sys.forcedfull == TRUE || (dy_lp->sys.cons.loadable <= 0 && dy_lp->sys.vars.loadable <= 0)) { dy_lp->lpret = lpFORCEFULL ; phase = dyDONE ; } else { phase = dy_forceFull(orig_sys) ; dy_lp->sys.forcedfull = TRUE ; } break ; } default: { phase = dyINV ; errmsg(1,rtnnme,__LINE__) ; break ; } } } /* End of main loop on dylp phase. phase has where we're going, and should be one of dyDONE or dyINV; the latter means something on the order of internal confusion. dy_lp->phase records the phase just completed. First order of business is a final constraint and/or variable purge. Do this only if we have an optimal solution. For constraints, cut the purge level back to 0 (i.e., purge strictly loose constraints). */ if (phase == dyDONE && dy_lp->lpret == lpOPTIMAL) { if (dy_opts->finpurge.vars == TRUE) { # ifndef DYLP_NDEBUG if (dy_opts->print.major >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\n%s (%s): entering phase %s (final), iter %d.", rtnnme,dy_sys->nme,dy_prtlpphase(dyPURGEVAR,FALSE), dy_lp->tot.iters) ; } # endif cnt = dy_deactivateVars(orig_sys) ; if (cnt < 0) { errmsg(371,rtnnme, orig_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.pivs, "final variable deactivation") ; } } if (dy_opts->finpurge.cons == TRUE) { # ifndef DYLP_NDEBUG if (dy_opts->print.major >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\n%s (%s): entering phase %s (final), iter %d.", rtnnme,dy_sys->nme,dy_prtlpphase(dyPURGECON,FALSE), dy_lp->tot.iters) ; } # endif dy_opts->con.deactlvl = 0 ; cnt = dy_deactivateCons(orig_sys) ; if (cnt < 0) { errmsg(371,rtnnme, orig_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.pivs, "final constraint deactivation") ; } } } /* If we're infeasible, and the phase I objective is still in place (the normal situation), swap it out for the original objective and recalculate duals and reduced costs. Otherwise our dual variable information is all wrong. We need to pretend the phase is dyPRIMAL2 for this to work. */ if (phase == dyDONE && dy_lp->lpret == lpINFEAS) { phase = dyPRIMAL2 ; if (dy_swapobjs(dyPRIMAL2) == FALSE) { phase = dyDONE ; errmsg(318,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,"remove") ; dy_lp->lpret = lpFATAL ; } dy_calcduals() ; if (dy_calccbar() == FALSE) { phase = dyDONE ; errmsg(384,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters) ; dy_lp->lpret = lpFATAL ; } phase = dyDONE ; } /* Call dy_finishup to assemble the final answer (as best it can) and clean up the working environment. */ orig_lp->phase = phase ; # ifdef DYLP_STATISTICS if (dy_stats != NULL) dy_finalstats(dy_stats) ; # endif dy_finishup(orig_lp,dy_lp->phase) ; return (orig_lp->lpret) ; } DyLP-1.6.0/DyLP/src/Dylp/dy_options.c0000644000076700007670000014672611266201204014140 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains generic routines to process simple options. In the main, these are called by the option processing routines that deal with the options file. */ #include "dylib_bnfrdr.h" #include "dylib_strrtns.h" #include "dylib_keytab.h" #include "dy_cmdint.h" #include "dylp.h" #include #include static char sccsid[] UNUSED = "@(#)options.c 3.5 09/25/04" ; static char svnid[] UNUSED = "$Id: dy_options.c 307 2009-10-16 23:32:20Z lou $" ; /* Routines to acquire dylp's defaults and limits for options and tolerances. */ extern void dy_exposeOptDefaults(lpopts_struct **opts_lb, lpopts_struct **opts_dflt, lpopts_struct **opts_ub), dy_exposeTolDefaults(lptols_struct **tols_dflt) ; /* We need only the options and tolerances structure from the main milp code, so a solitary declaration seems preferable to dragging in all of milp.h At best, though, this is a hack, and I need to deal with it properly, to retain dylp as a self-contained package. */ extern lpopts_struct *main_lpopts ; extern lptols_struct *main_lptols ; static bool string_opt (char **str) /* Generic (and fairly trivial) routine to parse a string. Parameters: str: address where the string is to be placed. Returns: TRUE, barring some sort of parsing failure. */ { parse_any result ; const char *rtnnme = "string_opt" ; /* BNF to parse a string, returning (char *). */ static tdef(zid,bnfttID,NULL,NULL) ; static tref(zgetstring_zid,zid,bnfstore|bnfatsgn,0) ; static comphd(zgetstring_alt) = { compcnt(1), mkcref(zgetstring_zid) } ; static gdef(zgetstring_int,sizeof(char *),NULL,zgetstring_alt) ; static gref(zgetstring,zgetstring_int,NULL,NULL,NULLP) ; /* Initialise the reader, parse the string, and check for errors. */ rdrinit() ; if (parse(dy_cmdchn,&zgetstring,&result) == FALSE) { rdrclear() ; errmsg(240,rtnnme,"zgetstring") ; return (FALSE) ; } dyio_outfmt(dy_logchn,dy_cmdecho," %s",*(char **) result.g) ; dyio_flushio(dy_logchn,dy_cmdecho) ; *str = *(char **) result.g ; /* Clean up and return. */ FREE(result.g) ; rdrclear() ; return (TRUE) ; } static bool integer_opt (int *iloc) /* Generic (and fairly trivial) routine to parse an integer. Parameters: iloc: address where the integer is to be placed. Returns: TRUE, barring some sort of parsing failure. */ { parse_any result ; const char *rtnnme = "integer_opt" ; /* BNF to parse an integer, returning (int *). */ static tdef(zdnum,bnfttN,10,NULL) ; static tref(zgetnum_zdnum,zdnum,bnfstore,0) ; static comphd(zgetnum_alt) = { compcnt(1), mkcref(zgetnum_zdnum) } ; static gdef(zgetnum_int,sizeof(int),NULL,zgetnum_alt) ; static gref(zgetnum,zgetnum_int,NULL,NULL,NULLP) ; /* Initialise the reader, parse the integer, and check for errors. */ rdrinit() ; if (parse(dy_cmdchn,&zgetnum,&result) == FALSE) { rdrclear() ; errmsg(240,rtnnme,"zgetnum") ; return (FALSE) ; } dyio_outfmt(dy_logchn,dy_cmdecho," %d",*(int *) result.g) ; dyio_flushio(dy_logchn,dy_cmdecho) ; *iloc = *(int *) result.g ; /* Clean up and return. */ FREE(result.g) ; rdrclear() ; return (TRUE) ; } static bool double_opt (double *rloc) /* Generic (and fairly trivial) routine to parse a real as a double. A double will provide about 15 -- 17 significant decimal digits. Parameters: rloc: address where the real is to be placed. Returns: TRUE, barring some sort of parsing failure. */ { parse_any result ; const char *rtnnme = "double_opt" ; /* BNF to parse a real, returning (double *). */ static tdef(zdnum,bnfttN,10,NULL) ; static tref(zgetnum_zdnum,zdnum,bnfdbl|bnfstore,0) ; static comphd(zgetnum_alt) = { compcnt(1), mkcref(zgetnum_zdnum) } ; static gdef(zgetnum_int,sizeof(double),NULL,zgetnum_alt) ; static gref(zgetnum,zgetnum_int,NULL,NULL,NULLP) ; /* Initialise the reader, parse the real, and check for errors. */ rdrinit() ; if (parse(dy_cmdchn,&zgetnum,&result) == FALSE) { rdrclear() ; errmsg(240,rtnnme,"zgetnum") ; return (FALSE) ; } dyio_outfmt(dy_logchn,dy_cmdecho," %g",*(double *) result.g) ; dyio_flushio(dy_logchn,dy_cmdecho) ; *rloc = *(double *) result.g ; /* Clean up and return. */ FREE(result.g) ; rdrclear() ; return (TRUE) ; } static UNUSED bool real_opt (float *rloc) /* Generic (and fairly trivial) routine to parse a real as a float. A float will provide about 6 -- 9 significant decimal digits. Parameters: rloc: address where the real is to be placed. Returns: TRUE, barring some sort of parsing failure. */ { parse_any result ; const char *rtnnme = "real_opt" ; /* BNF to parse a real, returning (float *). */ static tdef(zdnum,bnfttN,10,NULL) ; static tref(zgetnum_zdnum,zdnum,bnfflt|bnfstore,0) ; static comphd(zgetnum_alt) = { compcnt(1), mkcref(zgetnum_zdnum) } ; static gdef(zgetnum_int,sizeof(float),NULL,zgetnum_alt) ; static gref(zgetnum,zgetnum_int,NULL,NULL,NULLP) ; /* Initialise the reader, parse the real, and check for errors. */ rdrinit() ; if (parse(dy_cmdchn,&zgetnum,&result) == FALSE) { rdrclear() ; errmsg(240,rtnnme,"zgetnum") ; return (FALSE) ; } dyio_outfmt(dy_logchn,dy_cmdecho," %g",*(float *) result.g) ; dyio_flushio(dy_logchn,dy_cmdecho) ; *rloc = *(float *) result.g ; /* Clean up and return. */ FREE(result.g) ; rdrclear() ; return (TRUE) ; } static bool bool_opt (bool *bloc) /* Generic (and fairly trivial) routine to parse a boolean. But ... we have to take some care here because of the way bool is handled. If you look at the typedef for bool in dylib_std.h, you'll see that it can change in size --- this is necessary for C++ compatibility in the COIN OSI layer implementation. But a bnfIdef_struct (an immediate) holds its value as an int, and when doimmediate tries to load a field, it casts to an int. To make a long story short, the val field in a boolopt_struct must be an int. Parameters: bloc: address where the boolean is to be placed. Returns: TRUE, barring some sort of parsing failure. */ { struct boolopt_struct { char *str ; int val ; } *boolopt ; parse_any result ; const char *rtnnme = "bool_opt" ; /* BNF to parse a boolean, returning the string. */ static idef(ziTRUE,TRUE) ; static idef(ziFALSE,FALSE) ; static tdef(zTRUE,bnfttID,NULL,"TRUE") ; static tdef(zFALSE,bnfttID,NULL,"FALSE") ; static iref(zparsebool_ziTRUE,ziTRUE,mkoff(struct boolopt_struct,val)) ; static iref(zparsebool_ziFALSE,ziFALSE,mkoff(struct boolopt_struct,val)) ; static tref(zparsebool_zTRUE,zTRUE,bnfstore|bnfatsgn|bnfmin, mkoff(struct boolopt_struct,str)) ; static tref(zparsebool_zFALSE,zFALSE,bnfstore|bnfatsgn|bnfmin, mkoff(struct boolopt_struct,str)) ; static comphd(zparsebool_alt1) = { compcnt(2), mkcref(zparsebool_zFALSE), mkcref(zparsebool_ziFALSE) } ; static comphd(zparsebool_alt2) = { compcnt(2), mkcref(zparsebool_zTRUE), mkcref(zparsebool_ziTRUE) } ; static althd(zparsebool_alts) = { altcnt(2), mkaref(zparsebool_alt1), mkaref(zparsebool_alt2) } ; static npdef(zparsebool,zparsebool_alts) ; static npref(zparsebool_ref,zparsebool,NULL,NULLP) ; static comphd(zgetbool_alt) = { compcnt(1), mkcref(zparsebool_ref) } ; static gdef(zgetbool_int,sizeof(struct boolopt_struct),NULL,zgetbool_alt) ; static gref(zgetbool,zgetbool_int,NULL,NULL,NULLP) ; /* Initialise the reader, parse the string, and check for errors. */ rdrinit() ; if (parse(dy_cmdchn,&zgetbool,&result) == FALSE) { rdrclear() ; errmsg(240,rtnnme,"zgetbool") ; return (FALSE) ; } boolopt = (struct boolopt_struct *) result.g ; rdrclear() ; dyio_outfmt(dy_logchn,dy_cmdecho," %s",boolopt->str) ; dyio_flushio(dy_logchn,dy_cmdecho) ; *bloc = boolopt->val ; /* Clean up and return. */ STRFREE(boolopt->str) ; FREE(boolopt) ; return (TRUE) ; } /* Option processing routines. These are exported only to cmdint.c:docmds where they are called. In turn, they will often make use of one of the set of generic option processing routines above. */ cmd_retval dy_printopt (const char *keywd) /* This routine handles the manifold parameters that control just how much dylp tells you while it's working. This routine doesn't return an error, even when it can't parse the command, on the general theory that print levels aren't really critical. It will complain, however. The bnf for the print option command is: ::= lpprint ::= basis | conmgmt | crash | degen | dual | force | major | phase1 | phase2 | pivoting | pivreject | pricing | rays | scaling | setup | soln | tableau | varmgmt ::= Parameters: keywd: The command keyword Returns: cmdOK */ { char *what,cmdstr[50] ; int code,dflt,lb,ub,*opt ; lpopts_struct *opts_lb,*opts_dflt,*opts_ub ; const char *rtnnme = "dy_printopt" ; /* A lookup table with the various keywords recognised by the print command. */ enum prntcodes { poINV = 0, poBASIS, poCONMGMT, poCRASH, poDEGEN, poDUAL, poFORCE, poMAJOR, poPHASE1, poPHASE2, poPIVOTING, poPIVREJ, poPRICING, poRAYS, poSCALING, poSETUP, poSOLN, poTABLEAU, poVARMGMT } prntcode ; static keytab_entry prntkwds[] = { { "basis", 1, (int) poBASIS }, { "conmgmt", 2, (int) poCONMGMT }, { "crash", 2, (int) poCRASH }, { "degen", 2, (int) poDEGEN }, { "dual", 2, (int) poDUAL }, { "force", 2, (int) poFORCE }, { "major", 1, (int) poMAJOR }, { "phase1", 6, (int) poPHASE1 }, { "phase2", 6, (int) poPHASE2 }, { "pivoting", 4, (int) poPIVOTING }, { "pivreject", 4, (int) poPIVREJ }, { "pricing", 2, (int) poPRICING }, { "rays", 1, (int) poRAYS }, { "scaling", 2, (int) poSCALING }, { "setup", 2, (int) poSETUP }, { "soln", 2, (int) poSOLN }, { "tableau", 1, (int) poTABLEAU }, { "varmgmt", 1, (int) poVARMGMT } } ; static int numprntcodes = (sizeof prntkwds/sizeof (keytab_entry)) ; /* Acquire the option and tolerance limits and defaults. */ dy_exposeOptDefaults(&opts_lb,&opts_dflt,&opts_ub) ; /* Now to work. Parse off the keyword and see if we can look it up. */ prntcode = poINV ; if (string_opt(&what) == TRUE) { code = ambig(what,prntkwds,numprntcodes) ; if (code < 0) { if (code < -1) errmsg(233,rtnnme,what) ; else errmsg(234,rtnnme,what) ; } else prntcode = (enum prntcodes) code ; } /* Set the various variables for each command. */ dyio_outfxd(cmdstr,-((int) (sizeof(cmdstr)-1)),'l',"%s %s",keywd,what) ; switch (prntcode) { case poCONMGMT: { opt = &main_lpopts->print.conmgmt ; dflt = opts_dflt->print.conmgmt ; lb = opts_lb->print.conmgmt ; ub = opts_ub->print.conmgmt ; break ; } case poCRASH: { opt = &main_lpopts->print.crash ; dflt = opts_dflt->print.crash ; lb = opts_lb->print.crash ; ub = opts_ub->print.crash ; break ; } case poDEGEN: { opt = &main_lpopts->print.degen ; dflt = opts_dflt->print.degen ; lb = opts_lb->print.degen ; ub = opts_ub->print.degen ; break ; } case poBASIS: { opt = &main_lpopts->print.basis ; dflt = opts_dflt->print.basis ; lb = opts_lb->print.basis ; ub = opts_ub->print.basis ; break ; } case poMAJOR: { opt = &main_lpopts->print.major ; dflt = opts_dflt->print.major ; lb = opts_lb->print.major ; ub = opts_ub->print.major ; break ; } case poPHASE1: { opt = &main_lpopts->print.phase1 ; dflt = opts_dflt->print.phase1 ; lb = opts_lb->print.phase1 ; ub = opts_ub->print.phase1 ; break ; } case poPHASE2: { opt = &main_lpopts->print.phase2 ; dflt = opts_dflt->print.phase2 ; lb = opts_lb->print.phase2 ; ub = opts_ub->print.phase2 ; break ; } case poDUAL: { opt = &main_lpopts->print.dual ; dflt = opts_dflt->print.dual ; lb = opts_lb->print.dual ; ub = opts_ub->print.dual ; break ; } case poFORCE: { opt = &main_lpopts->print.force ; dflt = opts_dflt->print.force ; lb = opts_lb->print.force ; ub = opts_ub->print.force ; break ; } case poPIVOTING: { opt = &main_lpopts->print.pivoting ; dflt = opts_dflt->print.pivoting ; lb = opts_lb->print.pivoting ; ub = opts_ub->print.pivoting ; break ; } case poPIVREJ: { opt = &main_lpopts->print.pivreject ; dflt = opts_dflt->print.pivreject ; lb = opts_lb->print.pivreject ; ub = opts_ub->print.pivreject ; break ; } case poPRICING: { opt = &main_lpopts->print.pricing ; dflt = opts_dflt->print.pricing ; lb = opts_lb->print.pricing ; ub = opts_ub->print.pricing ; break ; } case poRAYS: { opt = &main_lpopts->print.rays ; dflt = opts_dflt->print.rays ; lb = opts_lb->print.rays ; ub = opts_ub->print.rays ; break ; } case poSCALING: { opt = &main_lpopts->print.scaling ; dflt = opts_dflt->print.scaling ; lb = opts_lb->print.scaling ; ub = opts_ub->print.scaling ; break ; } case poSETUP: { opt = &main_lpopts->print.setup ; dflt = opts_dflt->print.setup ; lb = opts_lb->print.setup ; ub = opts_ub->print.setup ; break ; } case poSOLN: { opt = &main_lpopts->print.soln ; dflt = opts_dflt->print.soln ; lb = opts_lb->print.soln ; ub = opts_ub->print.soln ; break ; } case poTABLEAU: { opt = &main_lpopts->print.tableau ; dflt = opts_dflt->print.tableau ; lb = opts_lb->print.tableau ; ub = opts_ub->print.tableau ; break ; } case poVARMGMT: { opt = &main_lpopts->print.varmgmt ; dflt = opts_dflt->print.varmgmt ; lb = opts_lb->print.varmgmt ; ub = opts_ub->print.varmgmt ; break ; } default: { errmsg(236,rtnnme,"","keyword",keywd) ; return (cmdOK) ; } } /* Last but not least, the actual work. A negative value is taken as a request from the user to be told the default value. */ if (integer_opt(opt) == TRUE) { if (*opt >= 0) { if (*opt > ub) { warn(241,rtnnme,lb,cmdstr,ub,*opt,ub) ; *opt = ub ; } } else { warn(243,rtnnme,cmdstr,dflt) ; } } else { errmsg(236,rtnnme,"","parameter",keywd) ; } STRFREE(what) ; return (cmdOK) ; } static bool lpctl_active (void) /* This routine processes the 'active' subcommand, which sets values that determine the initial size of dylp's copy of the constraint system. The values are expressed in terms of fractions of the number of inequalities and number of variables in the original system. The bnf for the active subcommand is: ::= lpcontrol active ; ::= variables | constraints By the time this routine is called, `lpcontrol active' is already parsed. Parameters: none Returns: TRUE if the remainder of the command parses without error, FALSE otherwise. */ { struct actfrac_struct { int var_seen ; float varfrac ; int con_seen ; float confrac ; } *actfrac ; lpopts_struct *opts_lb,*opts_dflt,*opts_ub ; parse_any result ; const char *rtnnme = "lpctl_active" ; /* BNF for the active command. */ static tdef(zcomma,bnfttD,NULL,",") ; static tref(zcomma_ref,zcomma,NULL,NULL) ; static tdef(zdnum,bnfttN,10,NULL) ; static tref(zactfrac_varfrac,zdnum,bnfstore|bnfflt, mkoff(struct actfrac_struct,varfrac)) ; static tref(zactfrac_confrac,zdnum,bnfstore|bnfflt, mkoff(struct actfrac_struct,confrac)) ; static tdef(zvar,bnfttID,NULL,"variables") ; static tref(zvar_ref,zvar,bnfmin,NULL) ; static tdef(zcon,bnfttID,NULL,"constraints") ; static tref(zcon_ref,zcon,bnfmin,NULL) ; static idef(ziTRUE,TRUE) ; static iref(zactfrac_varseen,ziTRUE,mkoff(struct actfrac_struct,var_seen)) ; static iref(zactfrac_conseen,ziTRUE,mkoff(struct actfrac_struct,con_seen)) ; static comphd(zactfrac_alt1) = { compcnt(3), mkcref(zvar_ref),mkcref(zactfrac_varseen),mkcref(zactfrac_varfrac) } ; static comphd(zactfrac_alt2) = { compcnt(3), mkcref(zcon_ref),mkcref(zactfrac_conseen),mkcref(zactfrac_confrac) } ; static althd(zactfrac_alts) = { altcnt(2), mkaref(zactfrac_alt1),mkaref(zactfrac_alt2) } ; static npdef(zactfrac,zactfrac_alts) ; static npref(zactfrac_list,zactfrac,bnflst,zcomma_ref) ; static comphd(zactfracs_alt) = { compcnt(1), mkcref(zactfrac_list) } ; static gdef(zactfracs_int,sizeof(struct actfrac_struct),NULL, zactfracs_alt) ; static gref(zactfracs,zactfracs_int,NULL,NULL,NULLP) ; dy_exposeOptDefaults(&opts_lb,&opts_dflt,&opts_ub) ; /* Now to work. Initialise the reader, attempt to parse the command, and check for errors. */ rdrinit() ; if (parse(dy_cmdchn,&zactfracs,&result) == FALSE) { rdrclear() ; errmsg(240,rtnnme,"zactfracs") ; return (FALSE) ; } actfrac = (struct actfrac_struct *) result.g ; rdrclear() ; /* Process the results. */ if (actfrac->var_seen == TRUE) { dyio_outfmt(dy_logchn,dy_gtxecho," variables %.2f",actfrac->varfrac) ; if (actfrac->con_seen == TRUE) dyio_outchr(dy_logchn,dy_gtxecho,',') ; if (actfrac->varfrac >= 0) { if (actfrac->varfrac > opts_ub->active.vars) { warn(244,rtnnme,opts_lb->active.vars,"variables", opts_ub->active.vars,actfrac->varfrac,opts_ub->active.vars) ; main_lpopts->active.vars = opts_ub->active.vars ; } else main_lpopts->active.vars = actfrac->varfrac ; } else { warn(245,rtnnme,"variables",opts_dflt->active.vars) ; } } if (actfrac->con_seen == TRUE) { dyio_outfmt(dy_logchn,dy_gtxecho," constraints %.2f",actfrac->confrac) ; if (actfrac->confrac >= 0) { if (actfrac->confrac > opts_ub->active.cons) { warn(244,rtnnme,opts_lb->active.cons,"constraints", opts_ub->active.cons,actfrac->confrac,opts_ub->active.cons) ; main_lpopts->active.cons = opts_ub->active.cons ; } else main_lpopts->active.cons = actfrac->confrac ; } else { warn(245,rtnnme,"constraints",opts_dflt->active.cons) ; } } FREE(actfrac) ; return (TRUE) ; } static bool lpctl_finpurge (void) /* This routine processes the "final" subcommand, which currently controls only whether dylp does a final round of variable and/or constraint deactivation after finding an optimal solution. Note that this option works even when the problem has been solved with the fullsys option. This is intended for use in branch&cut, where we usually want to solve the initial lp with fullsys, then continue with dynamic lp. The bnf for the final purge subcommand is ::= lpcontrol final purge ; ::= ::= variables | constraints ::= true | false By the time this routine is called, `lpcontrol final' is already parsed. Parameters: none Returns: TRUE if the remainder of the command parses without error, FALSE otherwise. */ { struct finpurge_struct { int cons ; int vars ; } ; struct finpurge_struct *optvals ; lpopts_struct *opts_lb,*opts_dflt,*opts_ub ; parse_any result ; const char *rtnnme = "lpctl_finpurge" ; /* BNF for the final purge command. */ static tdef(znil,bnfttNIL,NULL,NULL) ; static tref(znil_ref,znil,NULL,NULL) ; static tdef(zcomma,bnfttD,NULL,",") ; static tref(zcomma_ref,zcomma,NULL,NULL) ; static tdef(zpurge,bnfttID,NULL,"purge") ; static tref(zpurge_ref,zpurge,bnfmin,NULL) ; static tdef(zvar,bnfttID,NULL,"variables") ; static tref(zvar_ref,zvar,bnfmin,NULL) ; static tdef(zcon,bnfttID,NULL,"constraints") ; static tref(zcon_ref,zcon,bnfmin,NULL) ; static idef(ziminus1,-1) ; static idef(ziTRUE,TRUE) ; static idef(ziFALSE,FALSE) ; static tdef(zTRUE,bnfttID,NULL,"TRUE") ; static tref(zTRUE_ref,zTRUE,bnfmin,NULL) ; static tdef(zFALSE,bnfttID,NULL,"FALSE") ; static tref(zFALSE_ref,zFALSE,bnfmin,NULL) ; static iref(zwhatvar_ziTRUE,ziTRUE,mkoff(struct finpurge_struct,vars)) ; static iref(zwhatvar_ziFALSE,ziFALSE,mkoff(struct finpurge_struct,vars)) ; static comphd(zwhat_alt1) = { compcnt(3), mkcref(zvar_ref),mkcref(zTRUE_ref),mkcref(zwhatvar_ziTRUE) } ; static comphd(zwhat_alt2) = { compcnt(3), mkcref(zvar_ref),mkcref(zFALSE_ref),mkcref(zwhatvar_ziFALSE) } ; static iref(zwhatcon_ziTRUE,ziTRUE,mkoff(struct finpurge_struct,cons)) ; static iref(zwhatcon_ziFALSE,ziFALSE,mkoff(struct finpurge_struct,cons)) ; static comphd(zwhat_alt3) = { compcnt(3), mkcref(zcon_ref),mkcref(zFALSE_ref),mkcref(zwhatcon_ziFALSE) } ; static comphd(zwhat_alt4) = { compcnt(3), mkcref(zcon_ref),mkcref(zTRUE_ref),mkcref(zwhatcon_ziTRUE) } ; static comphd(zwhat_alt5) = { compcnt(1), mkcref(znil_ref) } ; static althd(zwhat_alts) = { altcnt(5), mkaref(zwhat_alt1),mkaref(zwhat_alt2),mkaref(zwhat_alt3), mkaref(zwhat_alt4),mkaref(zwhat_alt5) } ; static npdef(zwhat,zwhat_alts) ; static npref(zfinpurge_what,zwhat,bnflst,zcomma_ref) ; static iref(zfinpurge_varminus1,ziminus1, mkoff(struct finpurge_struct,vars)) ; static iref(zfinpurge_conminus1,ziminus1, mkoff(struct finpurge_struct,cons)) ; static comphd(zfinpurge_alt) = { compcnt(4),mkcref(zfinpurge_varminus1), mkcref(zfinpurge_conminus1),mkcref(zpurge_ref),mkcref(zfinpurge_what) } ; static gdef(zfinpurge_def, sizeof(struct finpurge_struct),NULL,zfinpurge_alt) ; static gref(zfinpurge,zfinpurge_def,NULL,NULL,NULLP) ; dy_exposeOptDefaults(&opts_lb,&opts_dflt,&opts_ub) ; /* Now to work. Initialise the reader, attempt to parse the command, and check for errors. */ rdrinit() ; if (parse(dy_cmdchn,&zfinpurge,&result) == FALSE) { rdrclear() ; errmsg(240,rtnnme,"zfinspec") ; return (FALSE) ; } optvals = (struct finpurge_struct *) result.g ; rdrclear() ; /* Process the results. An empty command is taken as a request for the default value. */ if (optvals->vars < 0 && optvals->cons < 0) { warn(246,rtnnme,"final variable deactivation", (opts_dflt->finpurge.vars == TRUE)?"true":"false") ; warn(246,rtnnme,"final constraint deactivation", (opts_dflt->finpurge.cons == TRUE)?"true":"false") ; return (TRUE) ; } /* Something is specified. Check variables, then constraints. */ if (optvals->vars >= 0) { main_lpopts->finpurge.vars = (bool) optvals->vars ; dyio_outfmt(dy_logchn,dy_gtxecho,"variables %s", (main_lpopts->finpurge.vars == TRUE)?"true":"false") ; } if (optvals->cons >= 0) { main_lpopts->finpurge.cons = (bool) optvals->cons ; if (optvals->vars >= 0) dyio_outfmt(dy_logchn,dy_gtxecho,", ") ; dyio_outfmt(dy_logchn,dy_gtxecho,"constraints %s", (main_lpopts->finpurge.cons == TRUE)?"true":"false") ; } FREE(optvals) ; return (TRUE) ; } static bool lpctl_load (void) /* This routine processes the 'load' subcommand, which sets values that control how dylp populates the constraint system in a cold start. The bnf for the load subcommand is: ::= lpcontrol load [] [] ; ::= ::= ::= ::= ::= [ | ) ::= [ | ) By the time this routine is called, `lpcontrol load' is already parsed. If only the fraction is specified, the interval defaults are used. Similarly, if there's only an interval specification, the fraction default remains. But if only one interval is specified, the second interval is marked invalid. If you want two, you have to specify two. Parameters: none Returns: TRUE if the remainder of the command parses without error, FALSE otherwise. */ { struct interval_struct { struct interval_struct *nxt ; char ldelim ; double ub ; double lb ; char rdelim ; } ; struct interval_struct *intv,*temp ; struct load_struct { int frac_valid ; double frac ; struct interval_struct *intervals ; } ; struct load_struct *loadspec ; lpopts_struct *opts_lb,*opts_dflt,*opts_ub ; char intvstr[50] ; int intvndx,intvlen ; parse_any result ; const char *rtnnme = "lpctl_load" ; /* BNF for the load command. */ static tdef(znil,bnfttNIL,NULL,NULL) ; static tref(znil_ref,znil,NULL,NULL) ; static tdef(zcomma,bnfttD,NULL,",") ; static tref(zcomma_ref,zcomma,NULL,NULL) ; static tdef(zlsq,bnfttD,NULL,"[") ; static tref(zlsq_ref,zlsq,NULL,NULL) ; static tdef(zlpar,bnfttD,NULL,"(") ; static tref(zlpar_ref,zlpar,NULL,NULL) ; static tdef(zrsq,bnfttD,NULL,"]") ; static tref(zrsq_ref,zrsq,NULL,NULL) ; static tdef(zrpar,bnfttD,NULL,")") ; static tref(zrpar_ref,zrpar,NULL,NULL) ; static tdef(zdnum,bnfttN,10,NULL) ; static comphd(zldelim_alt1) = { compcnt(1),mkcref(zlsq_ref) } ; static comphd(zldelim_alt2) = { compcnt(1),mkcref(zlpar_ref) } ; static althd(zldelim_alts) = { altcnt(2), mkaref(zldelim_alt1),mkaref(zldelim_alt2) } ; static pdef(zldelim,zldelim_alts) ; static comphd(zrdelim_alt1) = { compcnt(1),mkcref(zrsq_ref) } ; static comphd(zrdelim_alt2) = { compcnt(1),mkcref(zrpar_ref) } ; static althd(zrdelim_alts) = { altcnt(2), mkaref(zrdelim_alt1),mkaref(zrdelim_alt2) } ; static pdef(zrdelim,zrdelim_alts) ; static pref(zinterval_ldelim,zldelim,bnfstore|bnfexact, mkoff(struct interval_struct,ldelim),NULLP) ; static tref(zinterval_ub,zdnum,bnfstore|bnfdbl, mkoff(struct interval_struct,ub)) ; static tref(zinterval_lb,zdnum,bnfstore|bnfdbl, mkoff(struct interval_struct,lb)) ; static pref(zinterval_rdelim,zrdelim,bnfstore|bnfexact, mkoff(struct interval_struct,rdelim),NULLP) ; static comphd(zinterval_alt) = { compcnt(4), mkcref(zinterval_ldelim), mkcref(zinterval_ub),mkcref(zinterval_lb), mkcref(zinterval_rdelim) } ; static gdef(zinterval,sizeof(struct interval_struct), mkoff(struct interval_struct,nxt),zinterval_alt) ; static tref(zfraction_dnum,zdnum,bnfstore|bnfdbl, mkoff(struct load_struct,frac)) ; static idef(ziTRUE,TRUE) ; static iref(zfrac_valid,ziTRUE,mkoff(struct load_struct,frac_valid)) ; static comphd(zfraction_alt1) = { compcnt(2), mkcref(zfraction_dnum),mkcref(zfrac_valid) } ; static comphd(zfraction_alt2) = { compcnt(1),mkcref(znil_ref) } ; static althd(zfraction_alts) = { altcnt(2), mkaref(zfraction_alt1),mkaref(zfraction_alt2) } ; static pdef(zfraction,zfraction_alts) ; static pref(zloadbody_fraction,zfraction,NULL,NULL,NULLP) ; static gref(zloadbody_interval,zinterval,bnfstore|bnflst, mkoff(struct load_struct,intervals),zcomma_ref) ; static comphd(zloadbody_alt1) = { compcnt(2), mkcref(zloadbody_fraction),mkcref(zloadbody_interval) } ; static comphd(zloadbody_alt2) = { compcnt(1),mkcref(zloadbody_fraction) } ; static althd(zloadbody_alts) = { altcnt(2), mkaref(zloadbody_alt1),mkaref(zloadbody_alt2) } ; static npdef(zloadbody,zloadbody_alts) ; static npref(zloadbody_ref,zloadbody,NULL,NULLP) ; static comphd(zload_alt) = { compcnt(1),mkcref(zloadbody_ref) } ; static gdef(zload_def,sizeof(struct load_struct),NULL,zload_alt) ; static gref(zload,zload_def,NULL,NULL,NULLP) ; dy_exposeOptDefaults(&opts_lb,&opts_dflt,&opts_ub) ; /* Now to work. Initialise the reader, attempt to parse the command, and check for errors. */ rdrinit() ; if (parse(dy_cmdchn,&zload,&result) == FALSE) { rdrclear() ; errmsg(240,rtnnme,"zload") ; return (FALSE) ; } loadspec = (struct load_struct *) result.g ; rdrclear() ; /* Process the results. An empty command is taken as a request for the default value. */ if (loadspec->frac_valid == FALSE && loadspec->intervals == NULL) { warn(245,rtnnme,"initial load fraction",opts_dflt->initcons.frac) ; intvndx = 0 ; intvlen = sizeof(intvstr)-1 ; if (opts_dflt->initcons.i1uopen == TRUE) intvstr[intvndx] = '(' ; else intvstr[intvndx] = '[' ; intvndx++ ; intvndx += dyio_outfxd(&intvstr[intvndx],-(intvlen-intvndx), 'l',"%.5f %.5f", opts_dflt->initcons.i1u,opts_dflt->initcons.i1l) ; if (opts_dflt->initcons.i1lopen == TRUE) intvstr[intvndx] = ')' ; else intvstr[intvndx] = ']' ; intvndx++ ; if (opts_dflt->initcons.i2valid == TRUE) { if (opts_dflt->initcons.i2uopen == TRUE) intvstr[intvndx] = '(' ; else intvstr[intvndx] = '[' ; intvndx++ ; intvndx += dyio_outfxd(&intvstr[intvndx],-(intvlen-intvndx), 'l',"%.5f %.5f", opts_dflt->initcons.i2u,opts_dflt->initcons.i2l) ; if (opts_dflt->initcons.i2lopen == TRUE) intvstr[intvndx] = ')' ; else intvstr[intvndx] = ']' ; intvndx++ ; } intvstr[intvndx] = '\0' ; warn(246,rtnnme,"load interval",intvstr) ; return (TRUE) ; } /* The load fraction first. */ if (loadspec->frac_valid == TRUE) { dyio_outfmt(dy_logchn,dy_gtxecho," %.2f",loadspec->frac) ; if (loadspec->frac < opts_lb->initcons.frac || loadspec->frac > opts_ub->initcons.frac) { warn(244,rtnnme,opts_lb->initcons.frac,"initial load fraction", opts_ub->initcons.frac,loadspec->frac,opts_ub->initcons.frac) ; main_lpopts->initcons.frac = opts_ub->initcons.frac ; } else { main_lpopts->initcons.frac = loadspec->frac ; } } /* Now process the intervals, if present. For each interval, check the values and load main_lpopts->initcons. */ intv = loadspec->intervals ; FREE(loadspec) ; if (intv == NULL) return (TRUE) ; dyio_outfmt(dy_logchn,dy_gtxecho," %c %.5f %.5f %c", intv->ldelim,intv->ub,intv->lb,intv->rdelim) ; if (intv->ldelim == '(') main_lpopts->initcons.i1uopen = TRUE ; else main_lpopts->initcons.i1uopen = FALSE ; if (intv->ub > opts_ub->initcons.i1u || intv->ub < opts_lb->initcons.i1u) { warn(244,rtnnme,opts_lb->initcons.i1u,"initial load angle bound", opts_ub->initcons.i1u,intv->ub,opts_ub->initcons.i1u) ; main_lpopts->initcons.i1u = opts_ub->initcons.i1u ; } else { main_lpopts->initcons.i1u = intv->ub ; } if (intv->lb > opts_ub->initcons.i1l || intv->lb < opts_lb->initcons.i1l) { warn(244,rtnnme,opts_lb->initcons.i1l,"initial load angle bound", opts_ub->initcons.i1l,intv->lb,opts_lb->initcons.i1l) ; main_lpopts->initcons.i1l = opts_lb->initcons.i1l ; } else { main_lpopts->initcons.i1l = intv->lb ; } if (intv->rdelim == ')') main_lpopts->initcons.i1lopen = TRUE ; else main_lpopts->initcons.i1lopen = FALSE ; /* If we have only one interval, we're done, otherwise repeat the whole thing for the second interval. */ temp = intv->nxt ; FREE(intv) ; if (temp == NULL) { main_lpopts->initcons.i2valid = FALSE ; return (TRUE) ; } intv = temp ; dyio_outfmt(dy_logchn,dy_gtxecho,", %c %.5f %.5f %c", intv->ldelim,intv->ub,intv->lb,intv->rdelim) ; if (intv->ldelim == '(') main_lpopts->initcons.i2uopen = TRUE ; else main_lpopts->initcons.i2uopen = FALSE ; if (intv->ub > opts_ub->initcons.i2u || intv->ub < opts_lb->initcons.i2u) { warn(244,rtnnme,opts_lb->initcons.i2u,"initial load angle bound", opts_ub->initcons.i2u,intv->ub,opts_ub->initcons.i2u) ; main_lpopts->initcons.i2u = opts_ub->initcons.i2u ; } else { main_lpopts->initcons.i2u = intv->ub ; } if (intv->lb > opts_ub->initcons.i2l || intv->lb < opts_lb->initcons.i2l) { warn(244,rtnnme,opts_lb->initcons.i2l,"initial load angle bound", opts_ub->initcons.i2l,intv->lb,opts_lb->initcons.i2l) ; main_lpopts->initcons.i2l = opts_lb->initcons.i2l ; } else { main_lpopts->initcons.i2l = intv->lb ; } if (intv->rdelim == ')') main_lpopts->initcons.i2lopen = TRUE ; else main_lpopts->initcons.i2lopen = FALSE ; FREE(intv) ; return (TRUE) ; } static bool lpctl_infinity (void) /* This routine handles the `lpcontrol infinity' command. The reason it's broken out is so that we can use the strings IEEE and DBL_MAX to specify the most common values for infinite and finite infinity. The syntax will also accept an arbitrary (double) value. The bnf for the infinity subcommand is: ::= lpcontrol infinity [] ::= IEEE | DBL_MAX | By the time this routine is called, `lpcontrol infinity' is already parsed. A value of 0 is taken as a request for the current value. Parameters: none Returns: TRUE if the remainder of the command parses without error, FALSE otherwise. */ { struct infinity_struct { int code ; double val ; } ; struct infinity_struct *infinityspec ; lptols_struct *tols_dflt ; double infinity ; parse_any result ; const char *rtnnme = "lpctl_infinity" ; /* BNF for the infinity command. */ static tdef(zIEEE,bnfttID,NULL,"IEEE") ; static tref(zIEEE_ref,zIEEE,bnfmin,NULL) ; static idef(ziOne,1) ; static tdef(zDBLMAX,bnfttID,NULL,"DBL_MAX") ; static tref(zDBLMAX_ref,zDBLMAX,bnfmin,NULL) ; static idef(ziTwo,2) ; static tdef(zdnum,bnfttN,10,NULL) ; static idef(ziThree,3) ; static iref(zinfbody_IEEE,ziOne,mkoff(struct infinity_struct,code)) ; static comphd(zinfbody_alt1) = { compcnt(2), mkcref(zIEEE_ref),mkcref(zinfbody_IEEE) } ; static iref(zinfbody_DBLMAX,ziTwo,mkoff(struct infinity_struct,code)) ; static comphd(zinfbody_alt2) = { compcnt(2), mkcref(zDBLMAX_ref),mkcref(zinfbody_DBLMAX) } ; static iref(zinfbody_dbl,ziThree,mkoff(struct infinity_struct,code)) ; static tref(zinfbody_dblval,zdnum,bnfstore|bnfdbl, mkoff(struct infinity_struct,val)) ; static comphd(zinfbody_alt3) = { compcnt(2), mkcref(zinfbody_dblval),mkcref(zinfbody_dbl) } ; static althd(zinfbody_alts) = { altcnt(3), mkaref(zinfbody_alt1),mkaref(zinfbody_alt2), mkaref(zinfbody_alt3) } ; static npdef(zinfbody,zinfbody_alts) ; static npref(zinfbody_ref,zinfbody,NULL,NULLP) ; static comphd(zinfinitydef_alt) = { compcnt(1),mkcref(zinfbody_ref) } ; static gdef(zinfinity_def, sizeof(struct infinity_struct),NULL,zinfinitydef_alt) ; static gref(zinfinity,zinfinity_def,NULL,NULL,NULLP) ; dy_exposeTolDefaults(&tols_dflt) ; /* Now to work. Initialise the reader, attempt to parse the command, and check for errors. */ rdrinit() ; if (parse(dy_cmdchn,&zinfinity,&result) == FALSE) { rdrclear() ; errmsg(240,rtnnme,"zinfinity") ; return (FALSE) ; } infinityspec = (struct infinity_struct *) result.g ; rdrclear() ; /* Process the results. A value of 0 is taken as a request for the default. Note that we expect HUGE_VAL to be IEEE infinity. We get the default value from main_lptols, because the default isn't set until we call dy_defaults. */ switch (infinityspec->code) { case 1: { dyio_outfmt(dy_logchn,dy_gtxecho," IEEE (%g)",HUGE_VAL) ; infinity = HUGE_VAL ; if (finite(infinity)) { warn(314,rtnnme,infinity) ; } break ; } case 2: { dyio_outfmt(dy_logchn,dy_gtxecho," DBL_MAX (%g)",DBL_MAX) ; infinity = DBL_MAX ; break ; } case 3: { dyio_outfmt(dy_logchn,dy_gtxecho," %g",infinityspec->val) ; infinity = infinityspec->val ; if (infinity == 0) { infinity = main_lptols->inf ; warn(245,rtnnme,"infinity",infinity) ; } else if (infinity < 0) { errmsg(242,rtnnme,infinity,"infinity") ; infinity = tols_dflt->inf ; } break ; } default: { FREE(infinityspec) ; return (FALSE) ; } } main_lptols->inf = infinity ; FREE(infinityspec) ; return (TRUE) ; } cmd_retval dy_ctlopt (const char *keywd) /* This routine handles various control options, each taking a single parameter (TRUE/FALSE, a number, etc.) If the routine can't understand the option, it returns an error. The bnf for the control option command is: ::= lpcontrol ::= actconlim | actconlvl | active | actvarlim | bogus | check | cold | coldbasis | coldvars | costz | dchk | deactconlvl | degen | degenlite | degenpivs | dfeas | dualacttype | dualmultipiv | factor | final | forcecopy | fullsys | groom | idle | infinity | iters | load | patch | pchk | pfeas | pivot | primmultipiv | purgecon | purgevar | reframe | scaling | scan | swing | usedual | warm | zero ::= | | | The tolerances bogus, costz, dchk, pchk, pivot, purgecon, purgevar, reframe, swing, and zero expect a double. Infinity is a bit more complicated, and further parsing is handled by its own routine. The options cold, degen, forcecopy, fullsys, patch, usedual, and warm expect a boolean. Coldbasis, deactconlvl, degenlite, and groom expect a string from the appropriate list of defined keywords (see below), and the others expect an integer. Active, final, and load are more complicated, and are handled by private parsing routines. Parameters: keywd: The command keyword Returns: cmdOK or cmdHALTERROR */ { char *what,cmdstr[50] ; int code,intdflt,intlb,intub,*intopt,numkwds ; double *toler,tolerdflt ; double dblopt ; bool booldflt,*boolopt ; keytab_entry *kwds ; cmd_retval retval ; lpopts_struct *opts_lb,*opts_dflt,*opts_ub ; lptols_struct *tols_dflt ; const char *rtnnme = "dy_ctlopt" ; /* A lookup table with the various keywords recognised by the control command. */ enum ctlcodes { ctlINV = 0, ctlACTIVESZE, ctlADDVARLIM, ctlBOGUS, ctlCHECK, ctlCOLD, ctlCOLDBASIS, ctlCOLDVARS, ctlCONACTLIM, ctlCONACTLVL, ctlCONDEACTLVL, ctlCONTEXT, ctlCPYORIG, ctlCOSTZ, ctlDCHK, ctlDEGEN, ctlDEGENLITE, ctlDEGENPIVS, ctlDFEAS, ctlDUALADD, ctlDUALMULTIPIV, ctlFACTOR, ctlFINAL, ctlFULLSYS, ctlGROOM, ctlINFINITY, ctlITER, ctlIDLE, ctlLOAD, ctlPATCH, ctlPCHK, ctlPFEAS, ctlPIVOT, ctlPRIMMULTIPIV, ctlPURGE, ctlPURGEVAR, ctlREFRAME, ctlSCALING, ctlSCAN, ctlSWING, ctlUSEDUAL, ctlWARM, ctlZERO } ctlcode ; static keytab_entry ctlkwds[] = { { "actconlim", 8, (int) ctlCONACTLIM }, { "actconlvl", 8, (int) ctlCONACTLVL }, { "active", 4, (int) ctlACTIVESZE }, { "actvarlim", 4, (int) ctlADDVARLIM }, { "antidegen", 2, (int) ctlDEGEN }, { "bogus", 1, (int) ctlBOGUS }, { "check", 2, (int) ctlCHECK }, { "cold", 5, (int) ctlCOLD }, { "coldbasis", 5, (int) ctlCOLDBASIS }, { "coldvars", 5, (int) ctlCOLDVARS }, { "context", 3, (int) ctlCONTEXT }, { "costz", 3, (int) ctlCOSTZ }, { "dchk", 2, (int) ctlDCHK }, { "deactconlvl", 3, (int) ctlCONDEACTLVL }, { "degenlite", 6, (int) ctlDEGENLITE }, { "degenpivs", 6, (int) ctlDEGENPIVS }, { "dfeas", 2, (int) ctlDFEAS }, { "dualacttype", 5, (int) ctlDUALADD }, { "dualmultipiv", 5, (int) ctlDUALMULTIPIV }, { "factor", 2, (int) ctlFACTOR }, { "final", 2, (int) ctlFINAL }, { "forcecopy", 2, (int) ctlCPYORIG }, { "fullsys", 2, (int) ctlFULLSYS }, { "groom", 1, (int) ctlGROOM }, { "idle", 2, (int) ctlIDLE }, { "infinity", 2, (int) ctlINFINITY }, { "iters", 2, (int) ctlITER }, { "load", 1, (int) ctlLOAD }, { "patch", 2, (int) ctlPATCH }, { "pchk", 2, (int) ctlPCHK }, { "pfeas", 2, (int) ctlPFEAS }, { "pivot", 2, (int) ctlPIVOT }, { "primmultipiv", 5, (int) ctlPRIMMULTIPIV }, { "purgecon", 6, (int) ctlPURGE }, { "purgevar", 6, (int) ctlPURGEVAR }, { "reframe", 1, (int) ctlREFRAME }, { "scaling", 4, (int) ctlSCALING }, { "scan", 4, (int) ctlSCAN }, { "swing", 2, (int) ctlSWING }, { "usedual", 1, (int) ctlUSEDUAL }, { "warm", 1, (int) ctlWARM }, { "zero", 1, (int) ctlZERO } } ; static int numctlkwds = (sizeof ctlkwds/sizeof (keytab_entry)) ; /* Keywords used by the groom option; the option value is used only by the groombasis routine, so there's no real motivation for symbolic codes. */ static keytab_entry groomkwds[] = { { "abort", 1, 2 }, { "silent", 1, 0 }, { "warn", 1, 1 } } ; static int numgroomkwds = (sizeof groomkwds/sizeof (keytab_entry)) ; /* Keywords used by the coldbasis option. */ static keytab_entry basiskwds[] = { { "architectural", 1, ibARCH }, { "logical", 1, ibLOGICAL }, { "slack", 1, ibSLACK } } ; static int numbasiskwds = (sizeof basiskwds/sizeof (keytab_entry)) ; /* Keywords used by the context option */ static keytab_entry contextkwds[] = { { "single", 1, cxSINGLELP }, { "initial", 1, cxINITIALLP }, { "bandc", 1, cxBANDC } } ; static int numcontextkwds = (sizeof contextkwds/sizeof (keytab_entry)) ; /* Keywords used by the degenlite option; the option value is used only by the primalout and dualin routines, so there's no real motivation for symbolic codes. */ static keytab_entry litekwds[] = { { "alignedge", 6, 3 }, { "alignobj", 6, 2 }, { "perpedge", 5, 5 }, { "perpobj", 5, 4 }, { "pivot", 6, 1 }, { "pivotabort", 6, 0 } } ; static int numlitekwds = (sizeof litekwds/sizeof (keytab_entry)) ; /* Keywords used by the deactconlvl option; the option value is used only by the dy_purgecon routine, so there's no real motivation for symbolic codes. */ static keytab_entry deactkwds[] = { { "aggressive", 1, 1 }, { "fanatic", 1, 2 }, { "normal", 1, 0 } } ; static int numdeactkwds = (sizeof deactkwds/sizeof (keytab_entry)) ; /* Initialisation, so gcc doesn't complain. */ kwds = NULL ; numkwds = 0 ; intdflt = -INT_MAX ; intlb = INT_MAX ; intub = -INT_MAX ; intopt = NULL ; toler = NULL ; tolerdflt = quiet_nan(0) ; boolopt = NULL ; /* Acquire the option and tolerance limits and defaults. */ dy_exposeOptDefaults(&opts_lb,&opts_dflt,&opts_ub) ; dy_exposeTolDefaults(&tols_dflt) ; /* Now to work. Parse off the keyword and see if we can look it up. */ ctlcode = ctlINV ; if (string_opt(&what) == TRUE) { code = ambig(what,ctlkwds,numctlkwds) ; if (code < 0) { if (code < -1) errmsg(233,rtnnme,what) ; else errmsg(234,rtnnme,what) ; } else ctlcode = (enum ctlcodes) code ; } /* Set the various variables for each command. There are a few exceptions to the pattern, down at the end of the switch, which call command-specific routines for more complicated processing. */ dyio_outfxd(cmdstr,-((int) (sizeof(cmdstr)-1)),'l',"%s %s",keywd,what) ; switch (ctlcode) { case ctlADDVARLIM: { intopt = &main_lpopts->addvar ; intdflt = opts_dflt->addvar ; intlb = opts_lb->addvar ; intub = opts_ub->addvar ; break ; } case ctlBOGUS: { toler = &main_lptols->bogus ; tolerdflt = tols_dflt->bogus ; break ; } case ctlCHECK: { intopt = &main_lpopts->check ; intdflt = opts_dflt->check ; intlb = opts_lb->check ; intub = opts_ub->check ; break ; } case ctlCOLD: { boolopt = &main_lpopts->forcecold ; booldflt = opts_dflt->forcecold ; break ; } case ctlCOLDBASIS: { intopt = (int *) &main_lpopts->coldbasis ; intdflt = opts_dflt->coldbasis ; intlb = opts_lb->coldbasis ; intub = opts_ub->coldbasis ; numkwds = numbasiskwds ; kwds = basiskwds ; break ; } case ctlCOLDVARS: { intopt = &main_lpopts->coldvars ; intdflt = opts_dflt->coldvars ; intlb = opts_lb->coldvars ; intub = opts_ub->coldvars ; break ; } case ctlCONACTLIM: { intopt = &main_lpopts->con.actlim ; intdflt = opts_dflt->con.actlim ; intlb = opts_lb->con.actlim ; intub = opts_ub->con.actlim ; break ; } case ctlCONACTLVL: { intopt = &main_lpopts->con.actlvl ; intdflt = opts_dflt->con.actlvl ; intlb = opts_lb->con.actlvl ; intub = opts_ub->con.actlvl ; break ; } case ctlCONTEXT: { intopt = (int *) &main_lpopts->context ; intdflt = opts_dflt->context ; intlb = opts_lb->context ; intub = opts_ub->context ; numkwds = numcontextkwds ; kwds = contextkwds ; break ; } case ctlCOSTZ: { toler = &main_lptols->cost ; tolerdflt = tols_dflt->cost ; break ; } case ctlCPYORIG: { boolopt = &main_lpopts->copyorigsys ; booldflt = opts_dflt->copyorigsys ; break ; } case ctlDCHK: { toler = &main_lptols->dchk ; tolerdflt = tols_dflt->dchk ; break ; } case ctlDEGEN: { boolopt = &main_lpopts->degen ; booldflt = opts_dflt->degen ; break ; } case ctlDEGENLITE: { intopt = &main_lpopts->degenlite ; intdflt = opts_dflt->degenlite ; intlb = opts_lb->degenlite ; intub = opts_ub->degenlite ; numkwds = numlitekwds ; kwds = litekwds ; break ; } case ctlDEGENPIVS: { intopt = &main_lpopts->degenpivlim ; intdflt = opts_dflt->degenpivlim ; intlb = opts_lb->degenpivlim ; intub = opts_ub->degenpivlim ; break ; } case ctlDFEAS: { toler = &main_lptols->dfeas_scale ; tolerdflt = tols_dflt->dfeas_scale ; break ; } case ctlDUALADD: { intopt = &main_lpopts->dualadd ; intdflt = opts_dflt->dualadd ; intlb = opts_lb->dualadd ; intub = opts_ub->dualadd ; break ; } case ctlFACTOR: { intopt = &main_lpopts->factor ; intdflt = opts_dflt->factor ; intlb = opts_lb->factor ; intub = opts_ub->factor ; break ; } case ctlFULLSYS: { boolopt = &main_lpopts->fullsys ; booldflt = opts_dflt->fullsys ; break ; } case ctlGROOM: { intopt = &main_lpopts->groom ; intdflt = opts_dflt->groom ; intlb = opts_lb->groom ; intub = opts_ub->groom ; numkwds = numgroomkwds ; kwds = groomkwds ; break ; } case ctlITER: { intopt = &main_lpopts->iterlim ; intdflt = opts_dflt->iterlim ; intlb = opts_lb->iterlim ; intub = opts_ub->iterlim ; break ; } case ctlIDLE: { intopt = &main_lpopts->idlelim ; intdflt = opts_dflt->idlelim ; intlb = opts_lb->idlelim ; intub = opts_ub->idlelim ; break ; } case ctlDUALMULTIPIV: { intopt = &main_lpopts->dpsel.strat ; intdflt = opts_dflt->dpsel.strat ; intlb = opts_lb->dpsel.strat ; intub = opts_ub->dpsel.strat ; break ; } case ctlPRIMMULTIPIV: { intopt = &main_lpopts->ppsel.strat ; intdflt = opts_dflt->ppsel.strat ; intlb = opts_lb->ppsel.strat ; intub = opts_ub->ppsel.strat ; break ; } case ctlPATCH: { boolopt = &main_lpopts->patch ; booldflt = opts_dflt->patch ; break ; } case ctlPCHK: { toler = &main_lptols->pchk ; tolerdflt = tols_dflt->pchk ; break ; } case ctlPFEAS: { toler = &main_lptols->pfeas_scale ; tolerdflt = tols_dflt->pfeas_scale ; break ; } case ctlPIVOT: { toler = &main_lptols->pivot ; tolerdflt = tols_dflt->pivot ; break ; } case ctlPURGE: { toler = &main_lptols->purge ; tolerdflt = tols_dflt->purge ; break ; } case ctlCONDEACTLVL: { intopt = &main_lpopts->con.deactlvl ; intdflt = opts_dflt->con.deactlvl ; intlb = opts_lb->con.deactlvl ; intub = opts_ub->con.deactlvl ; numkwds = numdeactkwds ; kwds = deactkwds ; break ; } case ctlPURGEVAR: { toler = &main_lptols->purgevar ; tolerdflt = tols_dflt->purgevar ; break ; } case ctlREFRAME: { toler = &main_lptols->reframe ; tolerdflt = tols_dflt->reframe ; break ; } case ctlSCALING: { intopt = &main_lpopts->scaling ; intdflt = opts_dflt->scaling ; intlb = opts_lb->scaling ; intub = opts_ub->scaling ; break ; } case ctlSCAN: { intopt = &main_lpopts->scan ; intdflt = opts_dflt->scan ; intlb = opts_lb->scan ; intub = opts_ub->scan ; break ; } case ctlSWING: { toler = &main_lptols->swing ; tolerdflt = tols_dflt->swing ; break ; } case ctlUSEDUAL: { boolopt = &main_lpopts->usedual ; booldflt = opts_dflt->usedual ; break ; } case ctlWARM: { boolopt = &main_lpopts->forcewarm ; booldflt = opts_dflt->forcewarm ; break ; } case ctlZERO: { toler = &main_lptols->zero ; tolerdflt = tols_dflt->zero ; break ; } case ctlACTIVESZE: { booldflt = lpctl_active() ; if (booldflt == TRUE) { return (cmdOK) ; } else { return (cmdHALTERROR) ; } } case ctlINFINITY: { booldflt = lpctl_infinity() ; if (booldflt == TRUE) { return (cmdOK) ; } else { return (cmdHALTERROR) ; } } case ctlLOAD: { booldflt = lpctl_load() ; if (booldflt == TRUE) { return (cmdOK) ; } else { return (cmdHALTERROR) ; } } case ctlFINAL: { booldflt = lpctl_finpurge() ; if (booldflt == TRUE) { return (cmdOK) ; } else { return (cmdHALTERROR) ; } } default: { errmsg(236,rtnnme,"","keyword",keywd) ; STRFREE(what) ; return (cmdHALTERROR) ; } } /* Last but not least, the actual work. For an integer option or a tolerance, a negative value is taken as a request from the user to be told the default value. Further, for tolerances, 0 is not acceptable. For coldvars and factor, gripe about a violation of the upper bound, but don't enforce it. An upper bound of -1 is `no upper bound' for the integer-valued options. Assume the worst, so that we have to explicitly set a successful return code. */ retval = cmdHALTERROR ; switch (ctlcode) { case ctlADDVARLIM: case ctlCHECK: case ctlCONACTLIM: case ctlCONACTLVL: case ctlCONTEXT: case ctlDEGENPIVS: case ctlDUALADD: case ctlDUALMULTIPIV: case ctlITER: case ctlIDLE: case ctlPRIMMULTIPIV: case ctlSCALING: case ctlSCAN: { if (integer_opt(intopt) == TRUE) { if (*intopt >= 0) { if (intub > 0 && *intopt > intub) { warn(241,rtnnme,intlb,cmdstr,intub,*intopt,intub) ; *intopt = intub ; } } else { warn(243,rtnnme,cmdstr,intdflt) ; } retval = cmdOK ; } else { errmsg(236,rtnnme,"","parameter",keywd) ; } break ; } case ctlCOLDVARS: case ctlFACTOR: { if (integer_opt(intopt) == TRUE) { if (*intopt >= 0) { if (intub > 0 && *intopt > intub) { warn(241,rtnnme,intlb,cmdstr,intub,*intopt,intub) ; } } else { warn(243,rtnnme,cmdstr,intdflt) ; } retval = cmdOK ; } else { errmsg(236,rtnnme,"","parameter",keywd) ; } break ; } case ctlCOLD: case ctlCPYORIG: case ctlDEGEN: case ctlFULLSYS: case ctlPATCH: case ctlUSEDUAL: case ctlWARM: { if (bool_opt(boolopt) == TRUE) { retval = cmdOK ; } else { errmsg(236,rtnnme,"","parameter",keywd) ; } break ; } case ctlBOGUS: case ctlCOSTZ: case ctlDCHK: case ctlDFEAS: case ctlPCHK: case ctlPFEAS: case ctlPIVOT: case ctlPURGE: case ctlPURGEVAR: case ctlREFRAME: case ctlSWING: case ctlZERO: { if (double_opt(&dblopt) == TRUE) { if (dblopt <= 0) { warn(245,rtnnme,cmdstr,tolerdflt) ; } else { *toler = dblopt ; } retval = cmdOK ; } else { errmsg(236,rtnnme,"","parameter",keywd) ; } break ; } case ctlGROOM: case ctlCOLDBASIS: case ctlDEGENLITE: case ctlCONDEACTLVL: { if (string_opt(&what) == TRUE) { code = ambig(what,kwds,numkwds) ; if (code < 0) { if (code < -1) errmsg(233,rtnnme,what) ; else errmsg(234,rtnnme,what) ; } else { *intopt = code ; retval = cmdOK ; } } else { errmsg(236,rtnnme,"","parameter",cmdstr) ; } break ; } default: { errmsg(1,rtnnme,__LINE__) ; break ; } } STRFREE(what) ; return (retval) ; } DyLP-1.6.0/DyLP/src/Dylp/dy_consys_io.c0000644000076700007670000005006211026315405014440 0ustar /* This file is a portion of the Dylp LP distribution. Copyright (C) 2004 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains i/o routines for the constraint system data structures, and related routines for generating name strings for various objects. */ #include "dylib_errs.h" #include "dylib_io.h" #include "dylib_std.h" #include "dylib_strrtns.h" #include "dy_consys.h" static char sccsid[] UNUSED = "@(#)consys_io.c 4.6 11/11/04" ; static char svnid[] UNUSED = "$Id: dy_consys_io.c 240 2008-06-18 23:32:21Z lou $" ; const char *consys_prtcontyp (contyp_enum contyp) /* Utility to print a readable string for a constraint type. Parameter: contyp: constraint type Returns: appropriate string for the type, or an error string. */ { const char *rtnnme = "consys_prtcontyp" ; switch (contyp) { case contypLE: { return ("<=") ; } case contypGE: { return (">=") ; } case contypEQ: { return ("=") ; } case contypNB: { return ("><") ; } case contypRNG: { return ("<=>") ; } case contypINV: { return ("invalid") ; } default: { errmsg(5,rtnnme,"contyp",(int) contyp) ; return ("unrecognised") ; } } } const char *consys_prtvartyp (vartyp_enum vartyp) /* Utility to print a readable string for a variable type. Parameter: vartyp: variable type Returns: appropriate string for the type, or an error string. */ { const char *rtnnme = "consys_prtvartyp" ; switch (vartyp) { case vartypCON: { return ("continuous") ; } case vartypINT: { return ("general integer") ; } case vartypBIN: { return ("binary") ; } case vartypINV: { return ("invalid") ; } default: { errmsg(5,rtnnme,"vartyp",(int) vartyp) ; return ("unrecognised") ; } } } char *consys_assocnme (consys_struct *consys, flags which) /* Utility routine to produce a name for an associated vector. If consys is non-NULL, the name is fully qualified (consys.which) using the short form of which. If consys is NULL, a longer form of which is returned. Parameters: consys: constraint system which: associated vector type (from codes in dy_consys.h) Returns: a name string for the vector, or a string indicating error. */ { static char nmbuf[128] ; int nmlen ; if (consys != NULL) { nmlen = sizeof(nmbuf)/2 ; (void) dyio_outfxd(nmbuf,-nmlen,'l',"%s",consys->nme) ; strcat(nmbuf,".") ; } else { nmbuf[0] = '\0' ; } nmlen = strlen(nmbuf) ; switch (which) { case CONSYS_MTX: { strcat(nmbuf,(consys == NULL)?"constraint matrix":"mtx") ; break ; } case CONSYS_ROWHDR: { strcat(nmbuf,(consys == NULL)?"row header array":"rowhdr") ; break ; } case CONSYS_COLHDR: { strcat(nmbuf,(consys == NULL)?"column header array":"colhdr") ; break ; } case CONSYS_OBJ: { strcat(nmbuf,(consys == NULL)?"objective function":"obj") ; break ; } case CONSYS_VUB: { strcat(nmbuf,(consys == NULL)?"variable upper bounds":"vub") ; break ; } case CONSYS_VLB: { strcat(nmbuf,(consys == NULL)?"variable lower bounds":"vlb") ; break ; } case CONSYS_RHS: { strcat(nmbuf,(consys == NULL)?"right-hand-side":"rhs") ; break ; } case CONSYS_RHSLOW: { strcat(nmbuf,(consys == NULL)?"range right-hand-side":"rhslow") ; break ; } case CONSYS_CUB: { strcat(nmbuf,(consys == NULL)?"constraint upper bounds":"cub") ; break ; } case CONSYS_CLB: { strcat(nmbuf,(consys == NULL)?"constraint lower bounds":"clb") ; break ; } case CONSYS_VTYP: { strcat(nmbuf,(consys == NULL)?"variable type":"vtyp") ; break ; } case CONSYS_CTYP: { strcat(nmbuf,(consys == NULL)?"constraint type":"ctyp") ; break ; } case CONSYS_RSCALE: { strcat(nmbuf,(consys == NULL)?"row scaling":"rsc") ; break ; } case CONSYS_CSCALE: { strcat(nmbuf,(consys == NULL)?"column scaling":"csc") ; break ; } case CONSYS_COL: { strcat(nmbuf,(consys == NULL)?"generic column":"col") ; break ; } case CONSYS_ROW: { strcat(nmbuf,(consys == NULL)?"generic row":"row") ; break ; } default: { dyio_outfxd(&nmbuf[nmlen],-26,'l',"<>",(int) which) ; break ; } } return (nmbuf) ; } void consys_chgnme (consys_struct *consys, char cv, int ndx, const char *newnme) /* This routine replaces the existing name of the constraint system, objective, constraint or variable with newnme. Parameters: consys: constraint system cv: 'c' for constraint, 'v' for variable, 'o' for objective, 's' for the constraint system ndx: constraint/variable (row/column) index newnme: the new name Returns: undefined; will complain and fail to set the name if the parameters are invalid or some other problem is detected. */ { rowhdr_struct *rowhdr ; colhdr_struct *colhdr ; # ifdef DYLP_PARANOIA int varcnt ; # endif # if defined(DYLP_PARANOIA) || !defined(DYLP_NDEBUG) const char *rtnnme = "consys_chgnme" ; # endif # ifdef DYLP_PARANOIA if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return ; } switch (cv) { case 'c': { if (consys->mtx.rows == NULL) { errmsg(101,rtnnme,consys->nme,"row header") ; return ; } if (ndx <= 0 || ndx > consys->concnt) { errmsg(102,rtnnme,consys->nme,"constraint",ndx,1,consys->concnt) ; return ; } if (consys->mtx.rows[ndx] == NULL) { errmsg(103,rtnnme,consys->nme,"row",ndx) ; return ; } break ; } case 'v': { if (consys->mtx.cols == NULL) { errmsg(101,rtnnme,consys->nme,"column header") ; return ; } if (flgon(consys->opts,CONSYS_LVARS)) varcnt = consys->varcnt ; else varcnt = consys->varcnt+consys->concnt ; if (ndx <= 0 || ndx > varcnt) { errmsg(102,rtnnme,consys->nme,"variable",ndx,1,varcnt) ; return ; } if (consys->mtx.cols[ndx] == NULL) { errmsg(103,rtnnme,consys->nme,"column",ndx) ; return ; } break ; } case 'o': case 's': { break ; } default: { errmsg(3,rtnnme,"cv",cv) ; return ; } } if (newnme == NULL) { errmsg(2,rtnnme,"newnme") ; return ; } if (strlen(newnme) == 0) { errmsg(4,rtnnme,"newnme","") ; return ; } # endif /* We know that ndx is valid, the row/column header exists, and we have a non-null name to insert. (In the case of the objective or constraint system name, we only care about a non-null name.) Go to it. Remember that these strings are managed through the literal table. (STRALLOC/STRFREE) */ switch (cv) { case 'c': { rowhdr = consys->mtx.rows[ndx] ; if (rowhdr->nme != NULL) { STRFREE(rowhdr->nme) ; } rowhdr->nme = STRALLOC(newnme) ; break ; } case 'v': { colhdr = consys->mtx.cols[ndx] ; if (colhdr->nme != NULL) { STRFREE(colhdr->nme) ; } colhdr->nme = STRALLOC(newnme) ; break ; } case 'o': { if (consys->objnme != NULL) { STRFREE(consys->objnme) ; } consys->objnme = STRALLOC(newnme) ; break ; } case 's': { if (consys->nme != NULL) { STRFREE(consys->nme) ; } consys->nme = STRALLOC(newnme) ; break ; } default: { errmsg(1,rtnnme,__LINE__) ; return ; } } return ; } char *consys_lognme (consys_struct *consys, int rowndx, char *clientbuf) /* This is a utility routine that will construct the proper name for a logical variable, given the constraint index. Names constructed for logicals are guaranteed to be no more than 32 characters, including the final null. This routine exists only so that consys_nme and consys_utils:add_logical are guaranteed to produce the same names. They are the only two routines that should call consys_lognme, and add_logical is the only reason this routine isn't static. Parameters: consys: the constraint system rowndx: the constraint index clientbuf: a character buffer >= 32 characters, or NULL Returns: the user's buffer, if supplied, or an internal buffer, containing the name of the logical variable. */ { int len ; rowhdr_struct *rowhdr ; char *nmebuf ; static char ownbuf[32] ; # ifdef DYLP_PARANOIA const char *rtnnme = "consys_lognme" ; /* The usual, and checks that some necessary associated arrays are present. This is an internal routine, so index bounds checks are dropped unless we're being paranoid. */ if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (FALSE) ; } if (consys->mtx.rows == NULL) { errmsg(101,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_ROWHDR)) ; return (FALSE) ; } /* ZZ_TABLEAU_ZZ if (consys->ctyp == NULL) { errmsg(101,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_CTYP)) ; return (FALSE) ; } */ if (rowndx <= 0 || rowndx > consys->concnt) { errmsg(102,rtnnme,consys->nme,"row",rowndx,1,consys->concnt) ; return (FALSE) ; } if (consys->mtx.rows[rowndx] == NULL) { errmsg(103,rtnnme,consys->nme,"row",rowndx) ; return (FALSE) ; } # endif /* Use the client's buffer, if supplied, otherwise use the local static buffer. */ if (clientbuf == NULL) { nmebuf = ownbuf ; } else { nmebuf = clientbuf ; } /* Construct a name, based on the type of constraint. If the constraint system doesn't have a ctyp array, use the generic ".log". */ rowhdr = consys->mtx.rows[rowndx] ; len = strlen(rowhdr->nme) ; if (len > sizeof(nmebuf)-5) len = sizeof(nmebuf)-5 ; strncpy(nmebuf,rowhdr->nme,len) ; if (consys->ctyp != NULL) { switch (consys->ctyp[rowndx]) { case contypLE: { strcpy(&nmebuf[len],".slk") ; break ; } case contypEQ: { strcpy(&nmebuf[len],".art") ; break ; } case contypGE: { strcpy(&nmebuf[len],".sur") ; break ; } case contypRNG: { strcpy(&nmebuf[len],".rng") ; break ; } default: { strcpy(&nmebuf[len],".inv") ; break ; } } } else { strcpy(&nmebuf[len],".log") ; } return (nmebuf) ; } const char *consys_nme (consys_struct *consys, char cv, int ndx, bool pfx, char *clientbuf) /* Utility routine to retrieve the name of a constraint or variable. If pfx is false, the base name is returned. If pfx is true, 'consys->nme.' is added as a prefix. If the constraint or variable name is stored in a row or column header, the stored pointer is returned. The name has to be constructed in two cases: * when the prefixed form is requested, and * when the name of a logical is requested and logicals aren't enabled. In these cases, the name is built in a buffer and a pointer to the buffer is returned. If the client doesn't supply a buffer, an internal static buffer is used (which will be overwritten the next time it's needed). If the user supplies a buffer, that buffer is always used (whether the name is constructed or not). The constant CONSYS_MAXBUFLEN is the maximum buffer length. Parameters: consys: constraint system cv: 'c' for constraint, 'v' for variable ndx: the constraint/variable (row/column) index; to request the name of the logical for constraint k when logicals aren't enabled, use (consys->varcnt+k) pfx: TRUE if the fully qualified name should be generated, FALSE for the constraint/variable name only. clientbuf: if non-NULL, the name is constructed and returned in this buffer. Returns: the name of the constraint/variable, or some appropriate string indicating error. */ { static char ourbuf[CONSYS_MAXBUFLEN],ourbuftoo[CONSYS_MAXBUFLEN] ; char *nmbuf ; const char *rtnbuf ; int nmlen,partlen ; #ifdef DYLP_PARANOIA const char *rtnnme = "consys_nme", *errname = "<>" ; if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (errname) ; } switch (cv) { case 'c': { if (consys->mtx.rows == NULL) { errmsg(101,rtnnme,consys->nme,"row header") ; return (errname) ; } if (ndx <= 0 || ndx > consys->concnt) { errmsg(102,rtnnme,consys->nme,"constraint",ndx,1,consys->concnt) ; return (errname) ; } if (consys->mtx.rows[ndx] == NULL) { errmsg(103,rtnnme,consys->nme,"row",ndx) ; return (errname) ; } break ; } case 'v': { if (consys->mtx.cols == NULL) { errmsg(101,rtnnme,consys->nme,"column header") ; return (errname) ; } if (flgon(consys->opts,CONSYS_LVARS)) nmlen = consys->varcnt ; else nmlen = consys->varcnt+consys->concnt ; if (ndx <= 0 || ndx > nmlen) { errmsg(102,rtnnme,consys->nme,"variable",ndx,1,nmlen) ; return (errname) ; } if (ndx < consys->varcnt && consys->mtx.cols[ndx] == NULL) { errmsg(103,rtnnme,consys->nme,"column",ndx) ; return (errname) ; } break ; } default: { errmsg(3,rtnnme,"cv",cv) ; return (errname) ; } } #endif /* Can we just return the pointer to the name from the row/column header? (Perhaps after copying it into the client's buffer.) */ if (pfx == FALSE && (cv == 'c' || (cv == 'v' && ndx <= consys->varcnt))) { if (cv == 'c') rtnbuf = consys->mtx.rows[ndx]->nme ; else rtnbuf = consys->mtx.cols[ndx]->nme ; if (clientbuf != NULL) { if (strlen(rtnbuf) < CONSYS_MAXBUFLEN) strcpy(clientbuf,rtnbuf) ; else { strncpy(clientbuf,rtnbuf,CONSYS_MAXBUFLEN-1) ; clientbuf[CONSYS_MAXBUFLEN-1] = '\0' ; } rtnbuf = clientbuf ; } } /* We have to build the name. Not quite so bad as it seems at first glance. Figure out what buffer to use, then dump in the prefix, then dump in the name. The call to consys_lognme down below is made with a private buffer so that we don't inadvertently screw up by having a call to consys_nme interfere with a previous call to consys_lognme. Sure, it shouldn't happen, but why take the chance. The nme field in the row/column header shouldn't be null either, but we're going for robustness here -- this routine gets called a lot to generate error messages. */ else { if (clientbuf == NULL) nmbuf = ourbuf ; else nmbuf = clientbuf ; if (pfx == TRUE) { nmlen = strlen(consys->nme) ; if (nmlen > CONSYS_MAXBUFLEN/2-1) nmlen = CONSYS_MAXBUFLEN/2-1 ; strncpy(nmbuf,consys->nme,nmlen) ; nmbuf[nmlen++] = '.' ; } else { nmlen = 0 ; } switch (cv) { case 'c': { if (consys->mtx.rows[ndx]->nme == NULL) { strcpy(&nmbuf[nmlen],"<>") ; } else { partlen = strlen(consys->mtx.rows[ndx]->nme) ; if (partlen > CONSYS_MAXBUFLEN-nmlen-1) partlen = CONSYS_MAXBUFLEN-nmlen-1 ; strncpy(&nmbuf[nmlen],consys->mtx.rows[ndx]->nme,partlen) ; nmlen += partlen ; nmbuf[nmlen] = '\0' ; } break ; } case 'v': { if (ndx <= consys->varcnt) { if (consys->mtx.cols[ndx]->nme == NULL) { strcpy(&nmbuf[nmlen],"<>") ; } else { partlen = strlen(consys->mtx.cols[ndx]->nme) ; if (partlen > CONSYS_MAXBUFLEN-nmlen-1) partlen = CONSYS_MAXBUFLEN-nmlen-1 ; strncpy(&nmbuf[nmlen],consys->mtx.cols[ndx]->nme,partlen) ; nmlen += partlen ; nmbuf[nmlen] = '\0' ; } } else { (void) consys_lognme(consys,ndx-consys->varcnt,ourbuftoo) ; partlen = strlen(ourbuftoo) ; if (partlen > CONSYS_MAXBUFLEN-nmlen-1) partlen = CONSYS_MAXBUFLEN-nmlen-1 ; strncpy(&nmbuf[nmlen],ourbuftoo,partlen) ; nmlen += partlen ; nmbuf[nmlen] = '\0' ; } break ; } } rtnbuf = nmbuf ; } return (rtnbuf) ; } /* A pair of utility routines to print constraint bound names and values. */ char *consys_conbndnme (char bndlett, int cndx, conbnd_struct *bnd) /* Prints a constraint lower bound name as LB(vndx) (for a bound which is finite or has more than one infinite contribution) or LB(vndx\infndx) for a bound which has exactly one infinite contribution (infndx is the index of the variable contributing the infinity). Analogous for upper bounds. The routine is robust in the face of incorrect values for bnd.inf, in the sense that it will still produce a printable string. It doesn't actually check for errors --- that would require a constraint system as a parameter in order to check the limits on bnd.inf. Parameters: bndlett: one of 'L' or 'U' cndx: constraint index bnd: constraint bound Returns: a name string for the bound */ { static char buf[32] ; char *bufptr ; bufptr = &buf[0] ; bufptr += dyio_outfxd(bufptr,-((int) (sizeof(buf)/2-1)), 'l',"%cB(%d",bndlett,cndx) ; if (bnd->inf < 0) dyio_outfxd(bufptr,-((int) (sizeof(buf)/2-1)),'l',"\\%d)",-bnd->inf) ; else dyio_outfxd(bufptr,-1,'l',")") ; return (&buf[0]) ; } char *consys_conbndval (conbnd_struct *bnd) /* Prints the constraint bound value, as nn*inf+val, or inf+val, or val, depending as the number of infinite contributions is >1, 1, or 0, respectively. As with consys_conbndnme, the routine is robust in the face of a bogus value for bnd.inf. Parameter: bnd: constraint bound Returns: a value string for the bound */ { static char buf[32] ; char *bufptr ; bufptr = &buf[0] ; if (bnd->inf > 0) bufptr += dyio_outfxd(bufptr,-((int) (sizeof(buf)/2-1)), 'l',"%d*inf+",bnd->inf) ; else if (bnd->inf < 0) bufptr += dyio_outfxd(bufptr,-((int) (sizeof(buf)/2-1)),'l',"inf+") ; dyio_outfxd(bufptr,-((int) (sizeof(buf)/2-1)),'l',"%g",bnd->bnd) ; return (&buf[0]) ; } void consys_prtcon (ioid chn, bool echo, consys_struct *consys, int i, const char *pfx) /* This routine prints a constraint. Since this could be a lengthy string in larger problems, the routine prints directly to the output rather than to a string. The print is of the form: rhslow <= name (ndx) <= rhs coef*var(ndx) +/- coeff*var(ndx) +/- coeff*var(ndx) ... where coefficients take as many lines as necessary. Parameters: chn: i/o channel echo: TRUE to echo to tty, FALSE otherwise. consys: reference constraint system for coefficients in newcon i: index of the constraint to be printed pfx: prefix to be printed at the start of each line (typically blank space for indentation) Returns: undefined */ { int linecnt,charcnt,ndx ; contyp_enum ctypi ; pkvec_struct *coni ; pkcoeff_struct *ai ; char buf[64] ; const char *rtnnme = "consys_prtcon", *errstring = "<< !consys_prtcon print error! >>", *dfltpfx = "" ; # ifdef DYLP_PARANOIA if (consys == NULL) { errmsg(2,rtnnme,"consys") ; dyio_outfmt(chn,echo,errstring) ; return ; } if (i < 0 || i > consys->concnt) { errmsg(102,rtnnme,consys->nme,"constraint",i,1,consys->concnt) ; dyio_outfmt(chn,echo,errstring) ; return ; } # endif if (pfx == NULL) pfx = dfltpfx ; /* The basics: name, index, constraint type, rhs (and rhslow, if needed). */ ctypi = consys->ctyp[i] ; dyio_outfmt(chn,echo,"\n%s",pfx) ; if (ctypi == contypRNG) { dyio_outfmt(chn,echo,"%g <= ",consys->rhslow[i]) ; } dyio_outfmt(chn,echo,"%s (%d) %s %g",consys_nme(consys,'c',i,FALSE,NULL),i, consys_prtcontyp(ctypi),consys->rhs[i]) ; /* Now the coefficients, limiting each line to 80 characters. The initial coefficient on a line is indented and printed with an optional `-' followed by the coefficient, variable name, and index. Subsequent coefficients consist of +/-, coefficient, variable name, and index. To keep things simple, if a coefficient doesn't fit on a line, we throw it back for reformatting as the initial coefficient of the next line. */ coni = NULL ; if (consys_getrow_pk(consys,i,&coni) == FALSE) { errmsg(122,rtnnme,consys->nme, "constraint",consys_nme(consys,'c',i,FALSE,NULL),i) ; dyio_outfmt(chn,echo,errstring) ; if (coni != NULL) pkvec_free(coni) ; return ; } ai = coni->coeffs ; linecnt = 0 ; for (ndx = 0 ; ndx < coni->cnt ; ndx++) { if (linecnt == 0) { charcnt = dyio_outfxd(&buf[0],-60,'l',"\n%s % g %s(%d)",pfx,ai[ndx].val, consys_nme(consys,'v',ai[ndx].ndx,FALSE,NULL), ai[ndx].ndx) ; } else { charcnt = dyio_outfxd(&buf[0],-60,'l'," %+g %s(%d)",ai[ndx].val, consys_nme(consys,'v',ai[ndx].ndx,FALSE,NULL), ai[ndx].ndx) ; } if (linecnt+charcnt < 70) { dyio_outfmt(chn,echo,"%s",&buf[0]) ; linecnt += charcnt ; } else { ndx-- ; linecnt = 0 ; } } pkvec_free(coni) ; return ; } DyLP-1.6.0/DyLP/src/Dylp/dy_cmdint.h0000644000076700007670000000430610632415522013721 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ #ifndef _DY_CMDINT_H #define _DY_CMDINT_H /* @(#)dy_cmdint.h 3.3 06/22/04 svn/cvs: $Id: dy_cmdint.h 148 2007-06-09 03:15:30Z lou $ Declarations specific to dylp's command interpreter. */ #include "dylib_std.h" #include "dylib_io.h" #include "dylib_errs.h" /* Globals for log stream and echo control, command input stream and echo control. These must be declared in a main program somewhere. dy_cmdchn i/o id for command input dy_cmdecho controls echoing of command input to stdout dy_logchn i/o id for log file dy_gtxecho controls echoing of generated text to stdout dylp.h also contains extern declarations for dy_logchn and dy_gtxecho. Turns out that the files related to the command interpreter don't need the main dylp structures, so it's useful to duplicate the extern decl's in both .h files. */ extern ioid dy_logchn,dy_cmdchn ; extern bool dy_gtxecho,dy_cmdecho ; /* cmdint.c */ /* Return codes for command execution routines called from the command interpreter: cmdOK execution of the command was adequately successful, further command interpretation should continue. cmdHALTNOERROR execution of the command was adequately successful, but break out of the command interpretation loop. cmdHALTERROR an error occurred during execution of the command, break out of the command interpretation loop. As return codes for process_cmds, the interpretation is slightly different: cmdOK command interpretation was ended by an eof on the top level command channel (this is the normal case when command execution completes without error). cmdHALTNOERROR some command returned a cmdHALTNOERROR return code. cmdHALTERROR either a command returned a cmdHALTERROR return code, or a fatal error occurred in process_cmds. */ typedef enum { cmdOK, cmdHALTERROR, cmdHALTNOERROR } cmd_retval ; cmd_retval process_cmds(bool silent) ; #endif /* _DY_CMDINT_H */ DyLP-1.6.0/DyLP/src/Dylp/dy_solutions.c0000644000076700007670000010144011262455613014477 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2005 -- 2008 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains routines which return primal and dual solutions, unscaled, in the original system frame of reference. PRIMAL VARIABLES For primal variables, there are three routines: * dy_rowPrimals: the primal basic variables x = inv(B)b, in basis (row) order * dy_colPrimals: the primal architectural variables, in column order * dy_logPrimals: the primal logical variables, in row order Because we're working with the primal system it's easy to do a clean separation between logical and architectural variables. It's also useful to have the basic variables x in row order; this will in general be a mix of primal architectural and logical variables. dy_rowPrimals also returns a vector of variable indices matching x. As a handy adjunct, there are two routines to return the status of primal variables: * dy_colStatus: the status of the primal architectural variables, in column order * dy_logStatus: the status of the primal logical variables, in row order DUAL VARIABLES Dual variables are complicated because we're not really running dual simplex, we're faking it on the primal constraint system. There are two routines: * dy_rowDuals: the dual variables y = cinv(B) associated with the architectural constraints, in basis (row) order * dy_colDuals: the dual variables cbar = c - yN associated with implicit bound constraints, in column order Because we're running dual simplex on the primal constraint system, we don't have the same clean separation into architectural and logical duals, nor can we easily separate out the dual basic variables. The values returned by rowDuals are a mix of architectural and logical duals. The values returned by colDuals are commonly called the reduced costs of the nonbasic primal architectural variables and are a mixture of architectural and logical duals. There's one more thing to be considered with respect to dual variables: we have to choose a sign convention. Because we're faking dual simplex on the primal data structures, we have a consistency problem. With the usual max primal <=> min dual pair, the row duals y = cinv(B) are the correct sign, and the reduced costs (when interpreted as dual variables) are negated. Because dylp works with a min primal <=> min dual pair, the row duals are negated and the reduced costs are correct. One set of values must be negated for consistency, but which one? Just to complicate the issue a bit further, the canonical primal <=> dual pair assumes that the primal is Ax <= b. Dylp automagically converts >= constraints to <= constraints by hiding the -1 in the row scaling factor. The client likely expects that the duals returned to him/her will work with the original mix of >= and <= constraints. Dylp sidesteps this issue by adding a boolean to dy_rowDuals and dy_colDuals (and also to dy_rays.c:dy_dualRays). A value of false gives you duals with a sign convention appropriate for a min primal problem. A value of true gives you the true duals, i.e., the duals that would result from the standard max primal <=> min dual pairing. In either case, the sign of the dual is flipped for a >= constraint in the original system. MISCELLANEOUS These routines predate the comprehensive set of solution routines described above. Dy_orig_soln is a utility which is (at present) a fairly specialised routine used by dylp_utils:buildsoln. There's also a routine, dy_expandxopt, which takes the primal solution generated by dy_orig_soln (which contains basic variables only) and expands it to a full solution (all architectural variables). */ #define DYLP_INTERNAL #include "dylp.h" static char svnid[] UNUSED = "$Id: dy_solutions.c 301 2009-10-05 20:48:11Z lou $" ; #ifdef DYLP_PARANOIA extern bool dy_std_paranoia (const lpprob_struct *orig_lp, const char *rtnnme) ; #endif void dy_colDuals (lpprob_struct *orig_lp, double **p_cbar, bool trueDuals) /* Returns the unscaled vector of duals associated with architectural columns (aka reduced costs), in the original system frame of reference. These are the duals associated with implicit bound constraints. See dy_rowDuals for the duals associated with explicit (architectural) constraints. (These latter are the usual notion of dual variables, and also correspond to the reduced costs of logical variables.) In dylp's min primal <=> min dual pairing, the reduced costs have the correct sign for the true dual variables used by the min dual problem, except that the values associated with NBUB variables need to be negated. If you'd prefer that the duals have a sign convention appropriate for a min primal, specify trueDuals = false. The algorithm is to walk the columns of orig_sys, copying over the reduced cost from dy_cbar when the variable is active, otherwise calculting cbar on the spot. For active variables, we have sc_cbar = sc_c - sc_csc_inv(B)sc_a = cS - cSinv(S)inv(B)inv(R)RaS = cS - cinv(B)aS = cbarS To unscale sc_cbar, we simply multiply by 1/S, keeping in mind that if x is a logical for row i, the appropriate factor is R. For inactive variables, we calculate dot(y,a) using the scaled version of the original system, which leaves us with the same sc_abar. Why not use the client's original system and the vector of unscaled duals returned by dy_rowDuals? That would certainly be an option. One argument against it is the additional work involved to get the unscaled duals. The other argument is that maximising the independence of the two calculations means that the test routine (which confirms cbar = c - dot(y,a) in the external frame) is marginally more convincing. Parameters: orig_lp: the original lp problem p_cbar: (i) pointer to vector; if NULL, a vector of the appropriate size will be allocated (o) vector of reduced costs trueDuals: true to return values with a sign convention appropriate for the min dual problem, false to use a sign convention that matches the min primal. Returns: undefined */ { int i,j,m,n,i_orig,j_orig,m_orig,n_orig ; flags statj ; consys_struct *orig_sys ; double *orig_y ; consys_struct *scaled_orig_sys ; bool scaled ; const double *rscale,*cscale ; double cbarj ; double *cbar ; # ifdef DYLP_PARANOIA char *rtnnme = "dy_colDuals" ; if (dy_std_paranoia(orig_lp,rtnnme) == FALSE) { return ; } if (p_cbar == NULL) { errmsg(2,rtnnme,"cbar") ; return ; } # endif /* Is unscaling required? Acquire the scaling vectors and set up scaled_orig_sys accordingly. We'll also need the constraint type vector so that we don't overcompensate for >= constraints when returning true duals. */ scaled = dy_isscaled() ; if (scaled == TRUE) { dy_scaling_vectors(&rscale,&cscale) ; scaled_orig_sys = dy_scaled_origsys() ; } else { scaled_orig_sys = NULL ; } orig_sys = orig_lp->consys ; n_orig = orig_sys->varcnt ; m_orig = orig_sys->concnt ; n = dy_sys->varcnt ; m = dy_sys->concnt ; /* Do we need a vector? */ if (*p_cbar != NULL) { cbar = *p_cbar ; memset(cbar,0,(n_orig+1)*sizeof(double)) ; } else { cbar = (double *) CALLOC((n_orig+1),sizeof(double)) ; } /* Make a vector of duals that matches orig_sys, for efficient pricing of inactive columns. */ orig_y = (double *) CALLOC((m_orig+1),sizeof(double)) ; for (i = 1 ; i <= m ; i++) { i_orig = dy_actcons[i] ; orig_y[i_orig] = dy_y[i] ; } /* Get on with the calculation. For an active variable, we can pull the value from dy_cbar. For an inactive variable, we need to calculate dot(y,a). Then we unscale and drop the result into the proper place in the result vector. Since we're starting from orig_sys, we'll never reference a column for a logical variable. */ for (j_orig = 1 ; j_orig <= n_orig ; j_orig++) { if (ACTIVE_VAR(j_orig)) { j = dy_origvars[j_orig] ; statj = getflg(dy_status[j],vstatSTATUS) ; if (flgon(statj,vstatBASIC)) { cbarj = 0.0 ; } else { if (scaled == TRUE) { cbarj = dy_cbar[j]/cscale[j_orig] ; } else { cbarj = dy_cbar[j] ; } } } else { statj = (flags) -dy_origvars[j_orig] ; if (scaled == TRUE) { cbarj = scaled_orig_sys->obj[j_orig] ; cbarj -= consys_dotcol(scaled_orig_sys,j_orig,orig_y) ; cbarj /= cscale[j_orig] ; } else { cbarj = orig_sys->obj[j_orig] ; cbarj -= consys_dotcol(orig_sys,j_orig,orig_y) ; } } setcleanzero(cbarj,dy_tols->cost) ; /* What's our sign convention? If these values are to work with the imaginary true dual problem, we need to flip the sign on variables that are NBUB. If we're just going for the min primal convention, they're already correct. */ if (trueDuals == TRUE) { if (flgon(statj,vstatNBUB)) cbar[j_orig] = -cbarj ; else cbar[j_orig] = cbarj ; } else cbar[j_orig] = cbarj ; } /* Clean up a bit and we're done. */ if (orig_y != NULL) FREE(orig_y) ; *p_cbar = cbar ; return ; } void dy_rowDuals (lpprob_struct *orig_lp, double **p_y, bool trueDuals) /* This routine returns the unscaled vector of row duals, commonly referred to as the dual variables, cinv(B). The values are unscaled and returned in a vector matching the original system frame of reference. Duals associated with inactive rows are always zero. In dylp's min primal <=> min dual pairing, the duals have the wrong sign for the true dual variables used by the min dual problem. If you'd prefer that the duals have a sign convention appropriate for the min dual problem, specify trueDuals = false. The relevant bit of unscaling is: sc_y = sc_csc_inv(B) = cSinv(S)inv(B)inv(R) = cinv(B)inv(R) So, to recover y we need to postmultiply by inv(R). The appropriate row factor is the one associated with the original row. Parameters: orig_lp: the original lp problem p_y: (i) vector to hold the dual variables; if NULL, a vector of appropriate size will be allocated (o) values of the dual variables, unscaled, in the original system frame of reference Returns: undefined */ { int i,m,n,i_orig,m_orig,n_orig ; double yi ; double *y ; consys_struct *orig_sys ; contyp_enum *ctyp ; bool scaled ; const double *rscale,*cscale ; # ifndef DYLP_NDEBUG int j,v ; # endif # ifdef DYLP_PARANOIA char *rtnnme = "dy_rowDuals" ; if (dy_std_paranoia(orig_lp,rtnnme) == FALSE) { return ; } if (p_y == NULL) { errmsg(2,rtnnme,"y") ; return ; } # endif /* Is unscaling required? Acquire the scaling vectors. accordingly. */ scaled = dy_isscaled() ; if (scaled == TRUE) { dy_scaling_vectors(&rscale,&cscale) ; } orig_sys = orig_lp->consys ; n_orig = orig_sys->varcnt ; m_orig = orig_sys->concnt ; n = dy_sys->varcnt ; m = dy_sys->concnt ; ctyp = orig_sys->ctyp ; /* Do we need a vector? */ if (*p_y != NULL) { y = *p_y ; memset(y,0,(m_orig+1)*sizeof(double)) ; } else { y = (double *) CALLOC((m_orig+1),sizeof(double)) ; } /* Step through the constraints of the original system. For active constraints, acquire and unscale the dual value. */ for (i_orig = 1 ; i_orig <= m_orig ; i_orig++) { if (ACTIVE_CON(i_orig)) { i = dy_origcons[i_orig] ; yi = dy_y[i] ; if (scaled == TRUE) { yi *= rscale[i_orig] ; } setcleanzero(yi,dy_tols->cost) ; } else { yi = 0.0 ; } /* The true duals are the negative of the minimisation duals here. */ if (trueDuals == TRUE) y[i_orig] = -yi ; else y[i_orig] = yi ; } # ifndef DYLP_NDEBUG if (dy_opts->print.soln >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\ty =") ; v = 0 ; for (i_orig = 1 ; i_orig <= m_orig ; i_orig++) { if (y[i_orig] != 0) { if ((++v)%3 == 0) { v = 0 ; dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t ") ; } i = dy_origcons[i_orig] ; j = dy_basis[i] ; dyio_outfmt(dy_logchn,dy_gtxecho," (%d %g %s %d)", i_orig,y[i_orig], consys_nme(dy_sys,'v',j,FALSE,NULL),j) ; } } } # endif /* That's it. Return the vector. */ *p_y = y ; return ; } void dy_colPrimals (lpprob_struct *orig_lp, double **p_x) /* This routine returns the values of the primal architectural variables (basic and nonbasic), unscaled, in the frame of reference of the original system. Unscaling is straightforward. For basic variables, we have sc_x = sc_inv(B)sc_b = inv(S)inv(B)inv(R)Rb = inv(S)(inv(B)b) so all that's needed to recover x = inv(B)b is to multiply by S. Upper and lower bounds on variables have the same scaling (inv(S)). Parameters: orig_lp: the original lp problem p_x: (i) vector to hold the primal architectural variables; if NULL, a vector of appropriate size will be allocated (o) values of the primal architectural variables, unscaled, in the original system frame of reference Returns: undefined */ { int j,j_orig,n_orig ; double xj ; flags statj ; consys_struct *orig_sys ; double *x ; bool scaled ; const double *rscale,*cscale ; char *rtnnme = "dy_colPrimals" ; # ifndef DYLP_NDEBUG int v ; # endif # ifdef DYLP_PARANOIA if (dy_std_paranoia(orig_lp,rtnnme) == FALSE) { return ; } if (p_x == NULL) { errmsg(2,rtnnme,"x") ; return ; } # endif /* Is unscaling required? Acquire the scaling vectors. accordingly. */ scaled = dy_isscaled() ; if (scaled == TRUE) { dy_scaling_vectors(&rscale,&cscale) ; } orig_sys = orig_lp->consys ; n_orig = orig_sys->varcnt ; /* Do we need a vector? */ if (*p_x != NULL) { x = *p_x ; memset(x,0,(n_orig+1)*sizeof(double)) ; } else { x = (double *) CALLOC((n_orig+1),sizeof(double)) ; } /* Walk the columns of the original system. For each variable that's active (basic or nonbasic), we can obtain the value from dy_x and unscale. For each variable that's inactive, we have to do a bit of work to decode the status and look up the appropriate bound value. */ for (j_orig = 1 ; j_orig <= n_orig ; j_orig++) { if (ACTIVE_VAR(j_orig)) { j = dy_origvars[j_orig] ; if (scaled == TRUE) { xj = cscale[j_orig]*dy_x[j] ; } else { xj = dy_x[j] ; } } else { statj = (flags)(-dy_origvars[j_orig]) ; switch (statj) { case vstatNBFX: case vstatNBLB: { xj = orig_sys->vlb[j_orig] ; break ; } case vstatNBUB: { xj = orig_sys->vub[j_orig] ; break ; } case vstatNBFR: { xj = 0 ; break ; } default: { warn(359,rtnnme,orig_sys->nme, consys_nme(orig_sys,'v',j_orig,FALSE,NULL),j_orig, dy_prtvstat(statj)) ; xj = 0.0 ; break ; } } } setcleanzero(xj,dy_tols->zero) ; x[j_orig] = xj ; } # ifndef DYLP_NDEBUG if (dy_opts->print.soln >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\tx =") ; v = 0 ; for (j_orig = 1 ; j_orig <= n_orig ; j_orig++) { if (x[j_orig] != 0) { if ((++v)%3 == 0) { v = 0 ; dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t ") ; } dyio_outfmt(dy_logchn,dy_gtxecho," (%d %g %s)", j_orig,x[j_orig], consys_nme(orig_sys,'v',j_orig,FALSE,NULL)) ; } } } # endif /* That's it. Return the vector. */ *p_x = x ; return ; } void dy_rowPrimals (lpprob_struct *orig_lp, double **p_xB, int **p_indB) /* This routine returns the values of the primal basic variables, unscaled, in row (basis) order in the frame of reference of the original system. Unscaling is straightforward: sc_x = sc_inv(B)sc_b = inv(S)inv(B)inv(R)Rb = inv(S)(inv(B)b) so all that's needed to recover x = inv(B)b is to multiply by S. For logicals, recall that S = 1/R. By construction, the basic variable for inactive constraints is the logical for the constraint. Generating beta = [ -ainv(B) 1 ] for an inactive row, correcting b for nonbasic, nonzero variables (active and inactive), and calculating dot(beta,b) is a lot of work. Much easier to call colPrimals for the complete solution vector and calculate b - dot(a,x) in the original system. Parameters: orig_lp: the original lp problem p_xB: (i) vector to hold the values of the primal basic variables; if NULL, a vector of appropriate size will be allocated (o) values of the primal basic variables, unscaled, in the original system frame of reference p_indB: (i) vector to hold the indices of the primal basic variables; if NULL, a vector of appropriate size will be allocated (o) indices of the primal basic variables, unscaled, in the original system frame of reference; indices of logical variables are encoded as the negative of the constraint index Returns: undefined */ { int i,j,m,i_orig,j_orig,m_orig,n_orig ; double xj,lhs ; consys_struct *orig_sys ; double *x,*xB ; int *indB ; bool scaled ; const double *rscale,*cscale ; # ifndef DYLP_NDEBUG int v ; # endif # ifdef DYLP_PARANOIA char *rtnnme = "dy_rowPrimals" ; if (dy_std_paranoia(orig_lp,rtnnme) == FALSE) { return ; } if (p_xB == NULL) { errmsg(2,rtnnme,"x") ; return ; } if (p_indB == NULL) { errmsg(2,rtnnme,"x") ; return ; } # endif /* Is unscaling required? Acquire the scaling vectors. If there are inactive constraints, we'll need the primal architecturals in order to calculate the value of the associated (basic) logical. */ scaled = dy_isscaled() ; if (scaled == TRUE) { dy_scaling_vectors(&rscale,&cscale) ; } orig_sys = orig_lp->consys ; n_orig = orig_sys->varcnt ; m_orig = orig_sys->concnt ; m = dy_sys->concnt ; x = NULL ; if (m < m_orig) { dy_colPrimals(orig_lp,&x) ; } /* Do we need vectors? Do the necessary setup. */ if (*p_xB != NULL) { xB = *p_xB ; memset(xB,0,(m_orig+1)*sizeof(double)) ; } else { xB = (double *) CALLOC((m_orig+1),sizeof(double)) ; } if (*p_indB != NULL) { indB = *p_indB ; memset(indB,0,(m_orig+1)*sizeof(int)) ; } else { indB = (int *) CALLOC((m_orig+1),sizeof(int)) ; } /* Walk the constraints of the original system. For each constraint that's active, we can obtain the value from dy_xbasic. For each inactive constraint, we need to calculate the value of the logical. Indices of logicals are recorded in indB as the negative of the constraint index. */ for (i_orig = 1 ; i_orig <= m_orig ; i_orig++) { if (ACTIVE_CON(i_orig)) { i = dy_origcons[i_orig] ; j = dy_basis[i] ; if (j <= m) { j_orig = dy_actcons[j] ; } else { j_orig = dy_actvars[j] ; } if (scaled == TRUE) { if (j <= m) { xj = (1/rscale[j_orig])*dy_xbasic[i] ; } else { xj = cscale[j_orig]*dy_xbasic[i] ; } } else { xj = dy_xbasic[i] ; } if (j <= m) { indB[i_orig] = -j_orig ; } else { indB[i_orig] = j_orig ; } } else { lhs = consys_dotrow(orig_sys,i_orig,x) ; xj = orig_sys->rhs[i_orig]-lhs ; indB[i_orig] = -i_orig ; } setcleanzero(xj,dy_tols->zero) ; xB[i_orig] = xj ; } if (x != NULL) FREE(x) ; # ifndef DYLP_NDEBUG if (dy_opts->print.soln >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\txB =") ; v = 0 ; for (i_orig = 1 ; i_orig <= m_orig ; i_orig++) { if ((++v)%3 == 0) { v = 0 ; dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t ") ; } j_orig = indB[i_orig] ; if (j_orig < 0) { j = n_orig-j_orig ; } else { j = j_orig ; } dyio_outfmt(dy_logchn,dy_gtxecho," (%d %g %s %d)", i_orig,xB[i_orig], consys_nme(orig_sys,'v',j,FALSE,NULL),j_orig) ; } } # endif /* That's it. Return the vectors. */ *p_xB = xB ; *p_indB = indB ; return ; } void dy_logPrimals (lpprob_struct *orig_lp, double **p_logx) /* This routine returns the values of the primal logical variables, unscaled, in the frame of reference of the original system (i.e., the value of the logical for constraint i is in position i of the vector). Unscaling is straightforward: sc_x = sc_inv(B)sc_b = inv(S)inv(B)inv(R)Rb = inv(S)(inv(B)b) so all that's needed to recover x = inv(B)b is to multiply by S. We just have to remember that for a logical, S = 1/R. It's more work to get the value of the logical for an inactive constraint --- we have to actually calculate b - dot(a,x). Parameters: orig_lp: the original lp problem p_logx: (i) vector to hold the primal logical variables; if NULL, a vector of appropriate size will be allocated (o) values of the primal logical variables, unscaled, in the original system frame of reference Returns: undefined */ { int j,m,i_orig,m_orig ; double xj,lhs ; consys_struct *orig_sys ; double *logx,*x ; bool scaled ; const double *rscale,*cscale ; # ifndef DYLP_NDEBUG int v,n_orig ; # endif # ifdef DYLP_PARANOIA char *rtnnme = "dy_logPrimals" ; if (dy_std_paranoia(orig_lp,rtnnme) == FALSE) { return ; } if (p_logx == NULL) { errmsg(2,rtnnme,"logx") ; return ; } # endif /* Is unscaling required? Acquire the scaling vectors. If we have inactive constraints, we'll need the values of the architecturals in order to calculate the value of the associated logical. */ scaled = dy_isscaled() ; if (scaled == TRUE) { dy_scaling_vectors(&rscale,&cscale) ; } orig_sys = orig_lp->consys ; m_orig = orig_sys->concnt ; m = dy_sys->concnt ; x = NULL ; if (m < m_orig) { dy_colPrimals(orig_lp,&x) ; } /* Do we need a vector? */ if (*p_logx != NULL) { logx = *p_logx ; memset(logx,0,(m_orig+1)*sizeof(double)) ; } else { logx = (double *) CALLOC((m_orig+1),sizeof(double)) ; } /* Walk the rows of the original system. For each constraint that's active, we can obtain the value of the associated logical from dy_x. For each constraint that's inactive, we have to actually calculate the row activity dot(x,a) and do the arithmetic. */ for (i_orig = 1 ; i_orig <= m_orig ; i_orig++) { if (ACTIVE_CON(i_orig)) { j = dy_origcons[i_orig] ; if (scaled == TRUE) { xj = (1/rscale[i_orig])*dy_x[j] ; } else { xj = dy_x[j] ; } } else { lhs = consys_dotrow(orig_sys,i_orig,x) ; xj = orig_sys->rhs[i_orig]-lhs ; } setcleanzero(xj,dy_tols->zero) ; logx[i_orig] = xj ; } if (x != NULL) FREE(x) ; # ifndef DYLP_NDEBUG if (dy_opts->print.soln >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\tlogx =") ; n_orig = orig_sys->varcnt ; v = 0 ; for (i_orig = 1 ; i_orig <= m_orig ; i_orig++) { if (logx[i_orig] != 0) { if ((++v)%3 == 0) { v = 0 ; dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t ") ; } dyio_outfmt(dy_logchn,dy_gtxecho," (%d %g %s)", i_orig,logx[i_orig], consys_nme(orig_sys,'v',n_orig+i_orig,FALSE,NULL)) ; } } } # endif /* That's it. Return the vector. */ *p_logx = logx ; return ; } void dy_colStatus (lpprob_struct *orig_lp, flags **p_colstat) /* This routine returns the status of the primal architectural variables, in column order for the original system. The routine reports out the full set of dylp status codes. Parameters: orig_lp: the original lp problem p_colstat: (i) vector to hold the status of the primal architectural variables; if NULL, a vector of appropriate size will be allocated (o) status of the primal architectural variables, in the original system frame of reference Returns: undefined */ { int j,j_orig,n_orig ; flags statj ; consys_struct *orig_sys ; flags *colstat ; # ifndef DYLP_NDEBUG int v ; # endif # ifdef DYLP_PARANOIA char *rtnnme = "dy_colStatus" ; if (dy_std_paranoia(orig_lp,rtnnme) == FALSE) { return ; } if (p_colstat == NULL) { errmsg(2,rtnnme,"colstat") ; return ; } # endif orig_sys = orig_lp->consys ; n_orig = orig_sys->varcnt ; /* Do we need a vector? */ if (*p_colstat != NULL) { colstat = *p_colstat ; memset(colstat,0,(n_orig+1)*sizeof(flags)) ; } else { colstat = (flags *) CALLOC((n_orig+1),sizeof(flags)) ; } /* Walk the columns of the original system. For active variables, copy the status from dy_status. For inactive variables, we acquire it from dy_origvars. */ for (j_orig = 1 ; j_orig <= n_orig ; j_orig++) { if (ACTIVE_VAR(j_orig)) { j = dy_origvars[j_orig] ; statj = dy_status[j] ; } else { statj = (flags)(-dy_origvars[j_orig]) ; } colstat[j_orig] = statj ; } # ifndef DYLP_NDEBUG if (dy_opts->print.soln >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\tcolstat =") ; v = 0 ; for (j_orig = 1 ; j_orig <= n_orig ; j_orig++) { if ((++v)%3 == 0) { v = 0 ; dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t ") ; } dyio_outfmt(dy_logchn,dy_gtxecho," (%s %d %s)", consys_nme(orig_sys,'v',j_orig,FALSE,NULL),j_orig, dy_prtvstat(colstat[j_orig])) ; } } # endif /* That's it. Return the vector. */ *p_colstat = colstat ; return ; } void dy_logStatus (lpprob_struct *orig_lp, flags **p_logstat) /* This routine returns the status of the primal logical variables, in row order for the original system. The routine reports out the full set of dylp status codes. It's actually a fair bit of work to get the status right for inactive constraints. Because we're reporting the full set of dylp status codes, and the client might be calling in a situation where the outcome was infeasible or unbounded, we need to calculate the value and assign the appropriate status code. Parameters: orig_lp: the original lp problem p_logstat: (i) vector to hold the status of the primal logical variables; if NULL, a vector of appropriate size will be allocated (o) status of the primal logical variables, in the original system frame of reference Returns: undefined */ { int i,m,i_orig,m_orig ; flags stati ; double rhsi,rhslowi,lhsi,xi,lbi,ubi ; consys_struct *orig_sys ; flags *logstat ; double *x ; char *rtnnme = "dy_logStatus" ; # ifndef DYLP_NDEBUG int v,n_orig ; # endif # ifdef DYLP_PARANOIA if (dy_std_paranoia(orig_lp,rtnnme) == FALSE) { return ; } if (p_logstat == NULL) { errmsg(2,rtnnme,"logstat") ; return ; } # endif orig_sys = orig_lp->consys ; m_orig = orig_sys->concnt ; m = dy_sys->concnt ; /* If we're not playing with a full deck, we'll need the values of the architecturals to determine the appropriate status for the logical. */ x = NULL ; if (m < m_orig) { dy_colPrimals(orig_lp,&x) ; } /* Do we need a vector? */ if (*p_logstat != NULL) { logstat = *p_logstat ; memset(logstat,0,(m_orig+1)*sizeof(flags)) ; } else { logstat = (flags *) CALLOC((m_orig+1),sizeof(flags)) ; } /* Walk the rows of the original system. For active constraints, copy the status of the logical from dy_status. For inactive constraints, we need to actually calculate the value of the logical and assign the appropriate status. This is more work than you'd think, because we need to determine the appropriate bounds for the logical based on the constraint type, and we need to allow for the possibility that the problem was infeasible or unbounded and the logical is not within bounds. We also need to allow for the possibility that dylp deactivated a tight constraint with y = 0. The convention for logicals in the original system is that all have a coefficient of 1.0. Thus we have bounds of (0,infty) for a slack (contypLE), (0,0) for an artificial (contypEQ), (-infty,0) for a surplus (contypGE), and (0,rhs-rhslow) for a bounded slack (contypRNG). */ for (i_orig = 1 ; i_orig <= m_orig ; i_orig++) { if (ACTIVE_CON(i_orig)) { i = dy_origcons[i_orig] ; stati = dy_status[i] ; } else { lhsi = consys_dotrow(orig_sys,i_orig,x) ; rhsi = orig_sys->rhs[i_orig] ; xi = rhsi-lhsi ; setcleanzero(xi,dy_tols->zero) ; lbi = -dy_tols->inf ; ubi = dy_tols->inf ; switch (orig_sys->ctyp[i_orig]) { case contypLE: { lbi = 0.0 ; break ; } case contypEQ: { lbi = 0.0 ; ubi = 0.0 ; break ; } case contypGE: { ubi = 0.0 ; break ; } case contypRNG: { rhslowi = orig_sys->rhslow[i_orig] ; lbi = 0 ; ubi = rhsi-rhslowi ; break ; } case contypNB: { continue ; } default: { errmsg(1,rtnnme,__LINE__) ; break ; } } if (belowbnd(xi,lbi)) { stati = vstatBLLB ; } else if (atbnd(xi,lbi)) { stati = vstatBLB ; } else if (atbnd(xi,ubi)) { stati = vstatBUB ; } else if (abovebnd(xi,ubi)) { stati = vstatBUUB ; } else { stati = vstatB ; } } logstat[i_orig] = stati ; } if (x != NULL) FREE(x) ; # ifndef DYLP_NDEBUG if (dy_opts->print.soln >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\trowstat =") ; n_orig = orig_sys->varcnt ; v = 0 ; for (i_orig = 1 ; i_orig <= m_orig ; i_orig++) { if ((++v)%3 == 0) { v = 0 ; dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t ") ; } dyio_outfmt(dy_logchn,dy_gtxecho," (%s %d %s)", consys_nme(orig_sys,'v',i_orig+n_orig,FALSE,NULL),i_orig, dy_prtvstat(logstat[i_orig])) ; } } # endif /* That's it. Return the vector. */ *p_logstat = logstat ; return ; } void dy_orig_soln (double *x, double *y) /* This routine unscales the primal and dual variable values associated with the rows of the active system before returning them to the user. The necessary unscaling is as follows: primal architectural: xS primal logical: x/R dual: yR The vectors are indexed by basis position. This routine isn't really general purpose --- it's called only from dylp_utils:buildsoln and assumes that x and y are already populated with scaled values. It should get a makeover to match the interface conventions of the other routines in the package. Parameters: x: basic primal variables y: dual variables Returns: undefined. */ { int i,j,i_orig,j_orig ; double xi,yi ; const double *rscale,*cscale ; /* Did we scale? If not, return right off. Otherwise, acquire the scaling vectors. */ if (dy_isscaled() == FALSE) return ; dy_scaling_vectors(&rscale,&cscale) ; /* Since we're only dealing with duals and basic primal variables, it suffices to step through the constraints (equivalently, basis positions). */ for (i = 1 ; i <= dy_sys->concnt ; i++) { i_orig = dy_actcons[i] ; j = dy_basis[i] ; xi = x[i] ; if (j <= dy_sys->concnt) xi /= rscale[i_orig] ; else { j_orig = dy_actvars[j] ; xi *= cscale[j_orig] ; } setcleanzero(xi,dy_tols->zero) ; x[i] = xi ; yi = y[i] ; yi *= rscale[i_orig] ; setcleanzero(yi,dy_tols->cost) ; y[i] = yi ; } return ; } bool dy_expandxopt (lpprob_struct *lp, double **p_xopt) /* This is a utility routine to load an expanded vector with the optimal solution to an lp relaxation. If the client supplies the vector, it's assumed it's large enough to hold the result. Note that unscaling is not required here. lp->x should have been unscaled when it was generated, and the client's constraint system (lp->consys) is not touched when dylp scales. Parameters: lp: lpprob_struct with optimal solution attached p_xopt: (i) vector to be filled in (created if null) (o) vector filled with optimal solution from lp Returns: TRUE if there's no problem translating the solution, FALSE otherwise. */ { int j,jpos ; consys_struct *consys ; flags *status,jstat ; double *xopt ; const char *rtnnme = "dy_expandxopt" ; # ifdef DYLP_PARANOIA if (p_xopt == NULL) { errmsg(2,rtnnme,"&x") ; return (FALSE) ; } if (lp == NULL) { errmsg(2,rtnnme,"lp problem") ; return (FALSE) ; } if (lp->lpret != lpOPTIMAL) { errmsg(4,rtnnme,"lp return code",dy_prtlpret(lp->lpret)) ; return (FALSE) ; } if (lp->consys == NULL) { errmsg(2,rtnnme,"lp constraint system") ; return (FALSE) ; } if (lp->basis == NULL) { errmsg(2,rtnnme,"lp basis") ; return (FALSE) ; } if (lp->basis->el == NULL) { errmsg(2,rtnnme,"lp basis vector") ; return (FALSE) ; } if (lp->status == NULL) { errmsg(2,rtnnme,"lp status") ; return (FALSE) ; } # endif consys = lp->consys ; status = lp->status ; /* If the user didn't supply a solution vector, allocate one now. */ if (*p_xopt == NULL) { xopt = (double *) MALLOC((consys->varcnt+1)*sizeof(double)) ; } else { xopt = *p_xopt ; } for (j = 1 ; j <= consys->varcnt ; j++) { if (((int ) status[j]) < 0) { jstat = vstatB ; jpos = -((int) status[j]) ; xopt[j] = lp->x[jpos] ; } else { jstat = status[j] ; switch (jstat) { case vstatNBFX: case vstatNBLB: { xopt[j] = consys->vlb[j] ; break ; } case vstatNBUB: { xopt[j] = consys->vub[j] ; break ; } case vstatNBFR: { xopt[j] = 0 ; break ; } default: { errmsg(359,rtnnme,consys->nme, consys_nme(consys,'v',j,FALSE,NULL),j,dy_prtvstat(jstat)) ; if (*p_xopt == NULL) FREE(xopt) ; return (FALSE) ; } } } } *p_xopt = xopt ; return (TRUE) ; } DyLP-1.6.0/DyLP/src/Dylp/dy_scaling.c0000644000076700007670000004351011262455613014063 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains routines which handle scaling of the original constraint system. Intimately tied to this is the question of whether dylp will make a local copy of the original constraint system or simply refer to the system supplied by the client. When dylp is first called, it will call dy_initsystem to evaluate the situation and establish the `original system' seen by the rest of dylp. The rules are this: * If the client forces a local copy (copyorigsys == TRUE), we make a local copy of the original system. * If the client supplied scaling matrices, we make a scaled local copy of the original system. * If scaling is allowed, and an evaluation of the constraint system establishes that it's necessary, we make a scaled local copy of the original system. * Even if scaling is forbidden, if the constraint system contains >= constraints dylp will make use of scaling to convert them to <= constraints. (The rest of the code assumes no >= constraints.) Otherwise, no local copy is required, and dylp can reference the original system supplied by the client. THIS IS A HAZARD! It's also a feature. From an efficiency standpoint, it's a clear win. But dylp attaches vectors to the original system. If the client does something radical with it (deletes it, for instance), all bets are off. The net effect is that the rest of dylp is completely unaware that scaling has ever happened. In particular, all logical variables are inserted with the coefficient +1.0. This isn't an issue for the rest of dylp, but it *is* an issue if we ever have to supply unscaled results to the outside world (e.g., the routines that generate a solution, or the tableau routines). To make this work, if column i represents the logical for constraint i, colscale[i] must be 1/rowscale[i]. The colscale array is not physically lengthened to make this happen. When processing columns, it's necessary to check whether the column requested corresponds to a logical and scale accordingly. */ #define DYLP_INTERNAL #include "dylp.h" static char sccsid[] UNUSED = "@(#)dy_scaling.c 4.5 11/06/04" ; static char svnid[] UNUSED = "$Id: dy_scaling.c 301 2009-10-05 20:48:11Z lou $" ; /* Define this symbol to enable checks on the calculation of rows of the unscaled basis inverse. #define CHECK_UNSCALED_BETAI */ /* Constraint system pointers maintained by this module. local_sys: Pointer to the local copy of the original constraint system. Initialized by dy_initlclsystem, destroyed by dy_freelclsystem. NULL if there is no local copy. client_sys: Pointer to the system originally provided by the client. Used to remember the client's system while we're using a local copy. */ static consys_struct *local_sys, *client_sys ; /* The scaling vectors. These may have been supplied by the client, in which case they are owned by client_sys, or we may have created them here, in which case they are owned by local_sys. */ static double *lcl_rowscale,*lcl_colscale ; /* A few utility routines for use in other files that do scaling and unscaling. */ bool dy_isscaled (void) /* Returns: TRUE if scaling is active, FALSE otherwise. */ { return (!(lcl_rowscale == NULL && lcl_colscale == NULL)) ; } void dy_scaling_vectors (const double **rscale, const double **cscale) /* Exports the scaling vectors. Parameters: rscale: (o) the row scaling vector cscale: (o) the column scaling vector Returns: undefined */ { *rscale = lcl_rowscale ; *cscale = lcl_colscale ; return ; } consys_struct *dy_scaled_origsys () /* This routine exposes the scaled original system. Parameters: none Returns: the scaled original system, or NULL if no scaled local copy exists. */ { return (local_sys) ; } bool dy_initlclsystem (lpprob_struct *orig_lp, bool hotstart) /* This routine looks at the constraint system and options provided by the client and decides whether dylp can reference the supplied constraint system directly or whether a local copy should be made. A local copy is required if the constraint system is to be scaled or if the constraint system contains >= constraints. Options specified by the client can force the creation of a local copy, and force or (mostly) forbid the use of scaling. If scaling is allowed but not forced, this routine will evaluate the constraint matrix and apply scaling if necessary. Scaling vectors are attached to the local copy of the original system. This is not really necessary, but it's cheap insurance against the day in the future when I decide to do something that actually changes the local copy of the original system. If we're doing a hot start, this call is strictly for information hiding. All the data structures should exist, and it's just a question of swapping orig_lp->consys, should we need to do it. This form of the call is also used when we're freeing data structures from previous runs. Parameters: orig_lp: (i) the original lp problem, as supplied by the client (o) orig_lp->consys may be replaced with a local copy of the constraint system hotstart: TRUE if we're doing a hot start, FALSE otherwise Returns: TRUE if all goes well, FALSE if there is a failure. */ { int i,scalefactor,orig_gecnt ; bool localcopy,scale,pmone ; flags scaled_vecs ; double orig_scm,scaled_scm ; consys_struct *orig_sys ; const char *rtnnme = "dy_initlclsystem" ; # ifdef DYLP_PARANOIA if (orig_lp == NULL) { errmsg(2,rtnnme,"orig_lp") ; return (FALSE) ; } if (orig_lp->consys == NULL) { errmsg(2,rtnnme,"orig_lp->consys") ; return (FALSE) ; } # endif /* If this is a hot start, all we need to do here is (possibly) set orig_lp to point to the existing local copy. More is likely needed, but that'll be handled via dy_refreshlclsystem, called from dy_hotstart. */ if (hotstart == TRUE) { if (local_sys != NULL) { client_sys = orig_lp->consys ; orig_lp->consys = local_sys ; } return (TRUE) ; } /* It's not a hot start. Calculate the geometric mean for the original system. An error return is possible only if we're paranoid. */ orig_sys = orig_lp->consys ; if (consys_evalsys(orig_sys,&orig_scm,&orig_gecnt) == FALSE) { errmsg(138,rtnnme,orig_sys->nme) ; return (FALSE) ; } if (orig_gecnt > 0) { pmone = TRUE ; } else { pmone = FALSE ; } # ifndef DYLP_NDEBUG if (dy_opts->print.scaling >= 2 && pmone == TRUE) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n [%s]: found %d '>=' inequalities; at least +/-1 scaling.", orig_sys->nme,orig_gecnt) ; } # endif /* Decide if we need a local copy, and if we need to scale the constraint matrix. To decide if we need a scaled copy, we need to scan the constraint matrix. */ local_sys = NULL ; client_sys = NULL ; lcl_rowscale = NULL ; lcl_colscale = NULL ; localcopy = dy_opts->copyorigsys ; switch (dy_opts->scaling) { case 0: /* numeric scaling prohibited */ { scale = FALSE ; break ; } case 1: /* scale with user-supplied matrices */ { localcopy = TRUE ; scale = TRUE ; # ifdef DYLP_PARANOIA if (orig_sys->rowscale == NULL) { errmsg(101,rtnnme,"row scaling vector") ; return (FALSE) ; } if (orig_sys->colscale == NULL) { errmsg(101,rtnnme,"column scaling vector") ; return (FALSE) ; } # endif # ifndef DYLP_NDEBUG if (dy_opts->print.scaling >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n [%s]: scaling with client vectors", orig_sys->nme) ; } # endif break ; } case 2: /* scale if necessary */ { if (orig_sys->minaij >= .5 && orig_sys->maxaij <= 2) { scale = FALSE ; } else { localcopy = TRUE ; scale = TRUE ; } # ifndef DYLP_NDEBUG if (dy_opts->print.scaling >= 2) { if (scale == TRUE) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n [%s]: system will be scaled;", orig_sys->nme) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho, "\n [%s]: scaling for numeric accuracy not required;", orig_sys->nme) ; } dyio_outfmt(dy_logchn,dy_gtxecho," %g <= |a| <= %g, metric = %g.", orig_sys->minaij,orig_sys->maxaij,orig_scm) ; } # endif break ; } default: { errmsg(7,rtnnme,__LINE__,"scaling option code",dy_opts->scaling) ; return (FALSE) ; } } # ifdef DYLP_PARANOIA if (scale == TRUE && localcopy == FALSE) { errmsg(1,rtnnme,__LINE__) ; return (FALSE) ; } # endif if (pmone == TRUE) { localcopy = TRUE ; } /* If we need a local copy, make one. We don't need to duplicate all the attached vectors of the original system, only the ones relevant for LP. */ if (localcopy == TRUE) { scaled_vecs = CONSYS_OBJ| CONSYS_CTYP|CONSYS_RHS|CONSYS_RHSLOW|CONSYS_RSCALE| CONSYS_VTYP|CONSYS_VLB|CONSYS_VUB|CONSYS_CSCALE ; if (consys_dupsys(orig_sys,&local_sys,scaled_vecs) == FALSE) { errmsg(137,rtnnme,orig_sys->nme) ; return (FALSE) ; } client_sys = orig_lp->consys ; orig_lp->consys = local_sys ; } /* Do we need to scale for numeric accuracy? If the client provided us with scaling vectors, use them. We can use them directly if there's no local copy. Given a local copy, transfer the vectors to the local system. */ if (scale == TRUE) { if (dy_opts->scaling == 1) { if (localcopy == TRUE) { memcpy(local_sys->rowscale,client_sys->rowscale, ((size_t) (local_sys->concnt+1)*sizeof(double))) ; memcpy(local_sys->colscale,client_sys->colscale, ((size_t) (local_sys->varcnt+1)*sizeof(double))) ; lcl_rowscale = local_sys->rowscale ; lcl_colscale = local_sys->colscale ; } else { lcl_rowscale = client_sys->rowscale ; lcl_colscale = client_sys->colscale ; } } /* If no scaling vectors were supplied, call consys_geomscale and consys_equiscale to calculate the scaling vectors, and store them as the active vectors. */ else { if (consys_geomscale(local_sys,&local_sys->rowscale, &local_sys->colscale) == FALSE) { errmsg(135,rtnnme,local_sys->nme) ; return (FALSE) ; } # ifndef DYLP_NDEBUG if (dy_opts->print.scaling >= 2) { scaled_scm = sqrt(local_sys->maxaij/local_sys->minaij) ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n [%s]: after geometric scaling", local_sys->nme) ; dyio_outfmt(dy_logchn,dy_gtxecho," %g <= |a| <= %g, geom = %g.", local_sys->minaij,local_sys->maxaij,scaled_scm) ; } # endif if (consys_equiscale(local_sys,&local_sys->rowscale, &local_sys->colscale) == FALSE) { errmsg(135,rtnnme,local_sys->nme) ; return (FALSE) ; } # ifndef DYLP_NDEBUG if (dy_opts->print.scaling >= 2) { scaled_scm = sqrt(local_sys->maxaij/local_sys->minaij) ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n [%s]: after equilibration scaling", local_sys->nme) ; dyio_outfmt(dy_logchn,dy_gtxecho," %g <= |a| <= %g, geom = %g.", local_sys->minaij,local_sys->maxaij,scaled_scm) ; } # endif lcl_rowscale = local_sys->rowscale ; lcl_colscale = local_sys->colscale ; } /* If we have a local copy, attach it. */ if (localcopy == TRUE) { if (consys_attach(local_sys,CONSYS_RSCALE,sizeof(double), (void **) &lcl_rowscale) == FALSE) { errmsg(100,rtnnme,local_sys->nme, consys_assocnme(NULL,CONSYS_RSCALE)) ; return (FALSE) ; } if (consys_attach(local_sys,CONSYS_CSCALE,sizeof(double), (void **) &lcl_colscale) == FALSE) { errmsg(100,rtnnme,local_sys->nme, consys_assocnme(NULL,CONSYS_CSCALE)) ; return (FALSE) ; } } } /* Do we need to scale by -1 to convert >= constraints to <= constraints? If we need to do this, we're guaranteed to have a local copy of the constraint system, but we may not have scaling vectors yet. The attach will initialise them to 1.0. */ if (pmone == TRUE) { if (scale == FALSE) { if (lcl_rowscale == NULL) { if (consys_attach(local_sys,CONSYS_RSCALE,sizeof(double), (void **) &lcl_rowscale) == FALSE) { errmsg(100,rtnnme,local_sys->nme, consys_assocnme(NULL,CONSYS_RSCALE)) ; return (FALSE) ; } local_sys->rowscale = lcl_rowscale ;} if (lcl_colscale == NULL) { if (consys_attach(local_sys,CONSYS_CSCALE,sizeof(double), (void **) &lcl_colscale) == FALSE) { errmsg(100,rtnnme,local_sys->nme, consys_assocnme(NULL,CONSYS_CSCALE)) ; return (FALSE) ; } local_sys->colscale = lcl_colscale ; } } for (i = 1 ; i <= orig_sys->concnt ; i++) { if (orig_sys->ctyp[i] == contypGE) { lcl_rowscale[i] *= -1.0 ; } } } /* Apply the scaling vectors and report the result. This call will actually convert the constraint type, along with applying the scaling factors. */ if (scale == TRUE || pmone == TRUE) { if (consys_applyscale(local_sys,pmone,lcl_rowscale,lcl_colscale) == FALSE) { errmsg(135,rtnnme,local_sys->nme) ; return (FALSE) ; } scaled_scm = sqrt(local_sys->maxaij/local_sys->minaij) ; # ifndef DYLP_NDEBUG if (dy_opts->print.scaling >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n [%s]: after scaling", local_sys->nme) ; dyio_outfmt(dy_logchn,dy_gtxecho," %g <= |a| <= %g, geom = %g.", local_sys->minaij,local_sys->maxaij,scaled_scm) ; } # endif } else { scaled_scm = orig_scm ; } /* How'd we do? We may still want to adjust the zero tolerance and feasibility scaling factors. Use the ratio of the original geometric mean to the scaled geometric mean. */ scalefactor = ((int)(log10(orig_scm/scaled_scm)+.5)-1) ; if (scalefactor > 1) { dy_tols->pfeas_scale *= pow(10.0,(double) scalefactor) ; dy_tols->dfeas_scale *= pow(10.0,(double) scalefactor) ; # ifndef DYLP_NDEBUG if (dy_opts->print.scaling >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n [%s]: adjusting pfeas scale by 1.0e+%d to %g.", local_sys->nme,scalefactor,dy_tols->pfeas_scale) ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n [%s]: adjusting dfeas scale by 1.0e+%d to %g.", local_sys->nme,scalefactor,dy_tols->dfeas_scale) ; } # endif } if (scalefactor > 2) { scalefactor -= 2 ; dy_tols->zero /= pow(10.0,(double) scalefactor) ; dy_tols->cost /= pow(10.0,(double) scalefactor) ; # ifndef DYLP_NDEBUG if (dy_opts->print.scaling >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n [%s]: adjusting primal zero by 1.0e-%d to %g.", local_sys->nme,scalefactor,dy_tols->zero) ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n [%s]: adjusting dual zero by 1.0e-%d to %g.", local_sys->nme,scalefactor,dy_tols->cost) ; } # endif } return (TRUE) ; } void dy_refreshlclsystem (flags what) /* This routine is called by dy_hotstart to transfer the client's changes in rhs, bounds, or objective from client_sys to local_sys. It's moderately brutal. For each vector that's changed, we do a wholesale copy. Parameters: what: the vectors that are to be refreshed Returns: undefined */ { int i,j,m,n ; double infinity ; # ifdef DYLP_PARANOIA const char *rtnnme = "dy_refreshlclsystem" ; # endif /* If there's no scaling, nothing needs to be done. */ if (local_sys == NULL) return ; # ifdef DYLP_PARANOIA if (getflg(client_sys->opts,CONSYS_FININF) != getflg(local_sys->opts,CONSYS_FININF)) { errmsg(1,rtnnme,__LINE__) ; return ; } # endif /* For each of the vectors that can change, do a refresh if requested. When we're doing the bounds, watch out for finite infinity. */ m = client_sys->concnt ; n = client_sys->varcnt ; infinity = client_sys->inf ; if (flgon(what,lpctlOBJCHG)) { for (j = 1 ; j <= n ; j++) local_sys->obj[j] = client_sys->obj[j]*lcl_colscale[j] ; } if (flgon(what,lpctlRHSCHG)) { for (i = 1 ; i <= m ; i++) { local_sys->rhs[i] = client_sys->rhs[i]*lcl_rowscale[i] ; local_sys->rhslow[i] = client_sys->rhslow[i]*lcl_rowscale[i] ; } } if (flgon(what,lpctlLBNDCHG)) { if (flgon(client_sys->opts,CONSYS_FININF)) { for (j = 1 ; j <= n ; j++) { if (client_sys->vlb[j] > -infinity) { local_sys->vlb[j] = client_sys->vlb[j]/lcl_colscale[j] ; } else { local_sys->vlb[j] = -infinity ; } } } else { for (j = 1 ; j <= n ; j++) local_sys->vlb[j] = client_sys->vlb[j]/lcl_colscale[j] ; } } if (flgon(what,lpctlUBNDCHG)) { if (flgon(client_sys->opts,CONSYS_FININF)) { for (j = 1 ; j <= n ; j++) { if (client_sys->vub[j] < infinity) { local_sys->vub[j] = client_sys->vub[j]/lcl_colscale[j] ; } else { local_sys->vub[j] = infinity ; } } } else { for (j = 1 ; j <= n ; j++) local_sys->vub[j] = client_sys->vub[j]/lcl_colscale[j] ; } } return ; } void dy_freelclsystem (lpprob_struct *orig_lp, bool freesys) /* This routine cleans up the local copy of the constraint system. If there's no local copy, the routine is a noop. The minimal action for a local copy is to correct the pointer in orig_lp. If free is TRUE, then the local copy is released. Parameters: orig_lp: (i) the original lp problem, as supplied by the client (o) orig_lp->consys will be restored to the client copy of the constraint system freesys: TRUE to free the local system Returns: undefined */ { /* Do we even have a local copy? If not, we're done already. */ if (local_sys == NULL) return ; /* Replace the consys pointer in orig_lp with a pointer to the client's constraint system. */ orig_lp->consys = client_sys ; client_sys = NULL ; if (freesys == FALSE) return ; /* Free the constraint system. The scaling vectors are associated with some constraint system, so don't need to free them here, but we do need to clear the local pointers to be safe. */ lcl_rowscale = NULL ; lcl_colscale = NULL ; if (local_sys != NULL) { consys_free(local_sys) ; local_sys = NULL ; } return ; } DyLP-1.6.0/DyLP/src/Dylp/dy_setup.c0000644000076700007670000005676011037243540013610 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains routines to establish options and tolerances for the dylp package. */ #define DYLP_INTERNAL #include "dylp.h" static char sccsid[] UNUSED = "@(#)dy_setup.c 4.7 10/15/05" ; static char svnid[] UNUSED = "$Id: dy_setup.c 246 2008-07-16 00:57:04Z lou $" ; /* dyopts_dflt This structure holds the default values assigned prior to processing the user's option specifications. A value of -1 indicates that there is no default. Either we need to know more about the constraint system before choosing a default, or it's something only the user can tell us. The companion structures dyopts_lb and dyopts_ub give allowable ranges (where relevant) and are used to make sure the user doesn't give us nonsense values. They're sparsely populated -- it's not possible (or useful) to give bounds for a fair number of the values. An (r) indicates a recommended value -- the code will gripe about a violation, but won't enforce the limit. `Chvatal' is Chvatal, V., Linear Programming, W.H. Freeman, 1983. Some specific comments: scan: Controls the number of variables scanned when the incoming variable selected during PSE updating is rejected due to pivoting problems and we need to scan for alternates. iterlim: The value is set to 10000 <= 5*concnt in the absence of help from the user. Comments on pp. 45-46 of Chvatal indicate that 3*concnt should be sufficient for all but the worst problems. A value of 0 means no limit is enforced. idlelim: The value is set to 1000 <= 5*concnt <= 10000 in the absence of help from the user. (During dual simplex, it's enforced at 80% of that, since the dual doesn't have antidegeneracy installed.) factor: The default choice of 20 comes from the analysis on pp. 111 - 113 of Chvatal, "Linear Programming". The upper bound of 100 comes from a passing mention in the XMP documentation that factor > 100 shouldn't be used except for network problems. Given upgrades since the original version of the code, this should be relaxed, but I need to do some experiments to see just how far. check: Check actually defaults to factor/2, with an upper limit of factor. active.*: The value is for efficiency, not a limit. If it's too small, the dylp constraint system will have to do more expansions. 25% is a pure guess. I'll try and refine it with experience. print.*: The majority of the print controls are set to 0. The output is really only of interest if you're looking at some detail of the lp implementation. */ static lpopts_struct dyopts_dflt = { cxINITIALLP, /* context */ -1, /* scan */ -1, /* iterlim */ -1, /* idlelim */ { -1, /* dpsel.strat */ TRUE, /* dpsel.flex */ FALSE }, /* dpsel.allownopiv */ { 1 }, /* ppsel.strat */ 50, /* factor */ -1, /* check */ 1, /* groom */ { 1, /* con.actlvl */ 0, /* con.actlim */ 0 }, /* con.deactlvl */ 0, /* addvar */ 3, /* dualadd */ 5000, /* coldvars */ FALSE, /* forcecold */ FALSE, /* forcewarm */ TRUE, /* usedual */ TRUE, /* degen */ 1, /* degenpivlim */ 1, /* degenlite */ TRUE, /* patch */ FALSE, /* fullsys */ FALSE, /* copyorigsys */ 2, /* scaling */ { .25, /* active.vars */ .25 }, /* active.cons */ { .5, /* initcons.frac */ TRUE, /* initcons.i1lopen */ 90, /* initcons.i1l */ FALSE, /* initcons.i1uopen */ 180, /* initcons.i1u */ TRUE, /* initcons.i2valid */ FALSE, /* initcons.i2lopen */ 0, /* initcons.i2l */ TRUE, /* initcons.i2uopen */ 90 }, /* initcons.i2u */ ibLOGICAL, /* coldbasis */ { TRUE, /* finpurge.cons */ TRUE }, /* finpurge.vars */ { FALSE, /* heroics.d2p */ FALSE, /* heroics.p2d */ FALSE }, /* heroics.flips */ { 0, /* print.major */ 0, /* print.scaling */ 0, /* print.setup */ 0, /* print.crash */ 0, /* print.pricing */ 0, /* print.pivoting */ 0, /* print.pivreject */ 0, /* print.degen */ 1, /* print.phase1 */ 1, /* print.phase2 */ 1, /* print.dual */ 1, /* print.basis */ 0, /* print.conmgmt */ 0, /* print.varmgmt */ 1, /* print.force */ 0, /* print.tableau */ 0, /* print.rays */ 0 /* print.soln */ } } ; static lpopts_struct dyopts_lb = { cxSINGLELP, /* context */ 200, /* scan */ 0, /* iterlim */ 0, /* idlelim */ { 0, /* dpsel.strat */ FALSE, /* dpsel.flex */ FALSE }, /* dpsel.allownopiv */ { 0 }, /* ppsel.strat */ 1, /* factor */ 1, /* check */ 0, /* groom */ { 0, /* con.actlvl */ 0, /* con.actlim */ 0 }, /* con.deactlvl */ 0, /* addvar */ 0, /* dualadd */ 0, /* coldvars */ FALSE, /* forcecold */ FALSE, /* forcewarm */ FALSE, /* usedual */ FALSE, /* degen */ 0, /* degenpivlim */ 0, /* degenlite */ FALSE, /* patch */ FALSE, /* fullsys */ FALSE, /* copyorigsys */ 0, /* scaling */ { 0.0, /* active.vars */ 0.0 }, /* active.cons */ { 0.0, /* initcons.frac */ FALSE, /* initcons.i1lopen */ 0, /* initcons.i1l */ FALSE, /* initcons.i1uopen */ 0, /* initcons.i1u */ FALSE, /* initcons.i2valid */ FALSE, /* initcons.i2lopen */ 0, /* initcons.i2l */ FALSE, /* initcons.i2uopen */ 0 }, /* initcons.i2u */ ibLOGICAL, /* coldbasis */ { FALSE, /* finpurge.cons */ FALSE }, /* finpurge.vars */ { FALSE, /* heroics.d2p */ FALSE, /* heroics.p2d */ FALSE }, /* heroics.flips */ { 0, /* print.major */ 0, /* print.scaling */ 0, /* print.setup */ 0, /* print.crash */ 0, /* print.pricing */ 0, /* print.pivoting */ 0, /* print.pivreject */ 0, /* print.degen */ 0, /* print.phase1 */ 0, /* print.phase2 */ 0, /* print.dual */ 0, /* print.basis */ 0, /* print.conmgmt */ 0, /* print.varmgmt */ 0, /* print.force */ 0, /* print.tableau */ 0, /* print.rays */ 0 /* print.soln */ } } ; /* Roughly, MAXITERLIM = MAXINT/4, so we can set the overall iteration limit to 3*iterlim without getting into integer overflow. */ #define MAXITERLIM (int) (((unsigned) 1<<(sizeof(dyopts_ub.iterlim)*8-3))-1) static lpopts_struct dyopts_ub = { cxBANDC, /* context */ 1000, /* scan */ MAXITERLIM, /* iterlim */ MAXITERLIM, /* idlelim */ { 3, /* dpsel.strat */ TRUE, /* dpsel.flex */ TRUE }, /* dpsel.allownopiv */ { 1 }, /* ppsel.strat */ 100, /* factor (r) */ -1, /* check == factor */ 2, /* groom */ { 1, /* con.actlvl */ -1, /* con.actlim */ 2 }, /* con.deactlvl */ -1, /* addvar */ 3, /* dualadd */ 100000, /* coldvars (r) */ TRUE, /* forcecold */ TRUE, /* forcewarm */ TRUE, /* usedual */ TRUE, /* degen */ -1, /* degenpivlim */ 5, /* degenlite */ TRUE, /* patch */ TRUE, /* fullsys */ TRUE, /* copyorigsys */ 2, /* scaling */ { 1.0, /* active.vars */ 1.0 }, /* active.cons */ { 1.0, /* initcons.frac */ TRUE, /* initcons.i1lopen */ 180, /* initcons.i1l */ TRUE, /* initcons.i1uopen */ 180, /* initcons.i1u */ TRUE, /* initcons.i2valid */ TRUE, /* initcons.i2lopen */ 180, /* initcons.i2l */ TRUE, /* initcons.i2uopen */ 180 }, /* initcons.i2u */ ibARCH, /* coldbasis */ { TRUE, /* finpurge.cons */ TRUE }, /* finpurge.vars */ { TRUE, /* heroics.d2p */ TRUE, /* heroics.p2d */ TRUE }, /* heroics.flips */ { 1, /* print.major */ 2, /* print.scaling */ 5, /* print.setup */ 4, /* print.crash */ 3, /* print.pricing */ 5, /* print.pivoting */ 2, /* print.pivreject */ 5, /* print.degen */ 7, /* print.phase1 */ 7, /* print.phase2 */ 7, /* print.dual */ 5, /* print.basis */ 5, /* print.conmgmt */ 4, /* print.varmgmt */ 3, /* print.force */ 6, /* print.tableau */ 4, /* print.rays */ 4 /* print.soln */ } } ; /* dytols_dflt This structure holds the default values assigned prior to processing the user's tolerance specifications. Some specific comments: inf: Infinity. Dylp can work with either IEEE infinity or a `finite' infinity (most often, DBL_MAX). The default is HUGE_VAL, which will resolve to IEEE infinity in a Sun/Solaris environment. HUGE_VAL isn't always a compile-time constant, so we load it in dy_defaults. If the client code has a finite infinity, you surely want to pass this in to dylp. Otherwise, dylp will hand back IEEE infinity, and finite and infinite infinities do not play well together. zero: Defaults to 1.0e-11. Historically I've seen it between 1.0e-10 and 1.0e-12. A colleague offers the following rule of thumb: ``The zero tolerance should be the product of the machine accuracy and the largest number you expect to encounter during processing.'' Since the 64 bit IEEE floating point format has a 52 bit mantissa, the machine precision is 2^-52, or about 10^-15. 1.0e-11 is reasonable by this rule. pfeas: This value will be scaled by an amount proportional to the 1-norm of the basic variables, with a minimum value of zero. It's set to (pfeas_scale)*(zero tolerance) initially (right at the start of dylp), so that we have something that's valid when establishing the basis. pfeas_scale: Allows decoupling of pfeas from zero. Defaults to 10, but can be adjusted by the user. cost: The moral equivalent of 0 for things related to the objective function, reduced costs, dual variables, etc. Defaults to 1.0e-10. dfeas: This value will be scaled by an amount proportional to the 1-norm of the dual variables, with a minimum value of cost. There is no default held here. dfeas_scale: As pfeas_scale, for dfeas. pivot: This is the pivot acceptance tolerance, as a fraction of the pivot selection tolerance used by the basis package during factoring. Defaults to 1.0e-5. bogus: This multiplier is used to detect `bogus' values for reduced costs and variable values. Bogus values are values which exceed a zero tolerance but are less than bogus*tolerance. The idea is that, generally speaking, numbers close to a zero tolerance are problematic, and may well be the result of accumulated numerical inaccuracy. dylp attempts to nip this problem in the bud by watching for numbers such that tol < |val| < bogus*tol for reduced costs and variable values and requesting refactorisation when it sees one. Defaults to 1. Higher values prompt more refactoring. swing: When (new primal value)/(old primal value) > swing, dylp takes it as an indication that the problem needs more constraints (pseudo-unbounded). reframe: Multiplier used to trigger a PSE or DSE reference framework reset. The default is .1, based on the computational results reported for the primal simplex in Forrest & Goldfarb, "Steepest Edge Algorithms for Linear Programming", Mathematical Programming v.57, pp. 341--374, 1992. */ static lptols_struct dytols_dflt = { 0, /* inf = HUGE_VAL */ 1.0e-11, /* zero */ 1.0e-5, /* pchk */ -1, /* pfeas */ 100, /* pfeas_scale */ 1.0e-11, /* cost */ 1.0e-4, /* dchk */ -1, /* dfeas */ 100, /* dfeas_scale */ 1.0e-5, /* pivot */ 1, /* bogus */ 1.0e15, /* swing */ 1.0e30, /* toobig */ 1.0e-4, /* purge */ .5, /* purgevar */ .1 /* reframe */ } ; void dy_exposeOptDefaults (lpopts_struct **opts_lb, lpopts_struct **opts_dflt, lpopts_struct **opts_ub) /* The sole purpose of this routine is to allow other parts of the code to get hold of the defaults without exposing them as global variables. At present, used only by dy_options.c. */ { if (opts_lb != NULL) *opts_lb = &dyopts_lb ; if (opts_dflt != NULL) *opts_dflt = &dyopts_dflt ; if (opts_ub != NULL) *opts_ub = &dyopts_ub ; } void dy_exposeTolDefaults (lptols_struct **tols_dflt) /* As for dy_exposeOptDefaults --- make default tolerances available to the rest of the code. */ { if (tols_dflt != NULL) *tols_dflt = &dytols_dflt ; } void dy_defaults (lpopts_struct **opts, lptols_struct **tols) /* This routine loads the data structures supplied as parameters with default tolerances and options. Typically, a client calls this routine to establish base values, then tweaks the options and parameters as desired. Parameters: opts (i) lpopts structure; allocated if NULL (o) returns an lpopts structure tols (i) lptols structure ; allocated if NULL (o) returns an lptols structure Returns: undefined */ { #ifdef DYLP_PARANOIA const char *rtnnme = "dy_defaults" ; if (opts == NULL) { errmsg(2,rtnnme,"&opts") ; return ; } if (tols == NULL) { errmsg(2,rtnnme,"&tols") ; return ; } #endif if (*opts == NULL) { (*opts) = (lpopts_struct *) MALLOC(sizeof(lpopts_struct)) ; } memcpy(*opts,&dyopts_dflt,sizeof(lpopts_struct)) ; if (*tols == NULL) { (*tols) = (lptols_struct *) MALLOC(sizeof(lptols_struct)) ; } memcpy(*tols,&dytols_dflt,sizeof(lptols_struct)) ; (*tols)->inf = HUGE_VAL ; return ; } void dy_checkdefaults (consys_struct *sys, lpopts_struct *opts, lptols_struct *tols) /* This routine looks over various option and tolerance settings with an eye toward setting or adjusting values based on the size of the constraint system or other options that might be set by the user. The default values here are, by and large, grossly larger than required. The more outrageous ones are motivated by the Netlib examples. Parameters: sys: a constraint system opts: an options structure; may be modified on return Returns: undefined */ { int scalefactor ; if (opts->check < 0) opts->check = opts->factor/2 ; if (opts->check <= 0) opts->check = 1 ; if (opts->scan < 0) { opts->scan = maxx(dyopts_lb.scan,sys->archvcnt/2) ; opts->scan = minn(opts->scan,dyopts_ub.scan) ; } if (opts->iterlim < 0) { opts->iterlim = minn(5*(sys->concnt+sys->varcnt),100000) ; opts->iterlim = maxx(opts->iterlim,10000) ; } if (opts->idlelim < 0) { opts->idlelim = minn(2*(sys->concnt+sys->varcnt),50000) ; opts->idlelim = maxx(opts->idlelim,1000) ; } if (opts->degenpivlim < 0) { opts->degenpivlim = minn(1000,sys->concnt/2) ; opts->degenpivlim = maxx(100,opts->degenpivlim) ; } /* If the user has specified a dual pivot strategy, observe it. If not, start with strategy 1 (max dual objective improvement). */ if (opts->dpsel.strat >= 0) { opts->dpsel.flex = FALSE ; } else { opts->dpsel.strat = 1 ; opts->dpsel.flex = TRUE ; } if (opts->fullsys == TRUE) { opts->active.vars = 1.0 ; opts->active.cons = 1.0 ; } /* Loosen the base primal and dual accuracy check values for larger systems, and put a little more distance between the zero tolerances and feasibility tolerances. */ scalefactor = ((int) (.5 + log10((double) sys->varcnt))) - 2 ; if (scalefactor > 0) { tols->pchk *= pow(10.0,(double) scalefactor) ; tols->pfeas_scale *= pow(10.0,(double) scalefactor) ; } scalefactor = ((int) (.5 + log10((double) sys->concnt))) - 2 ; if (scalefactor > 0) { tols->dchk *= pow(10.0,(double) scalefactor) ; tols->dfeas_scale *= pow(10.0,(double) scalefactor) ; } /* XX_DEBUG_XX There's no good way to control this print statement, given the timing and purpose of this call. But it's occasionally handy for debugging. dyio_outfmt(dy_logchn,TRUE,"\nPTOLS: pzero = %g, pscale = %g, pchk = %g", tols->zero,tols->pfeas_scale,tols->pchk) ; dyio_outfmt(dy_logchn,TRUE,"\nDTOLS: dzero = %g, dscale = %g, dchk = %g", tols->cost,tols->dfeas_scale,tols->dchk) ; */ return ; } void dy_setprintopts (int lvl, lpopts_struct *opts) /* This routine tweaks the lp print level options based on a single integer code. It's intended to allow clients of dylp to easily set up overall print levels. Just a big case statement. Level 0 forces dylp to shut up. Level 1 assumes the normal dylp defaults (phase1, phase2, dual, force, and basis print levels set to 1, which allows messages about extraordinary events). Levels 2 -- 5 provide increasing amounts of information. At level 1 and above, a specific setting of a dylp value to a higher value in the options structure passed in as a parameter will override the value here. Parameters: lvl: overall print level opts: options structure; for all except lvl = 0, should be preloaded with valid values for print options. Returns: undefined */ { if (lvl < 0) lvl = 0 ; switch (lvl) { case 0: { opts->print.major = 0 ; opts->print.scaling = 0 ; opts->print.setup = 0 ; opts->print.crash = 0 ; opts->print.pricing = 0 ; opts->print.pivoting = 0 ; opts->print.pivreject = 0 ; opts->print.degen = 0 ; opts->print.phase1 = 0 ; opts->print.phase2 = 0 ; opts->print.dual = 0 ; opts->print.basis = 0 ; opts->print.conmgmt = 0 ; opts->print.varmgmt = 0 ; opts->print.force = 0 ; opts->print.tableau = 0 ; opts->print.rays = 0 ; opts->print.soln = 0 ; break ; } case 1: { opts->print.major = maxx(opts->print.major,dyopts_dflt.print.major) ; opts->print.scaling = maxx(opts->print.scaling,dyopts_dflt.print.scaling) ; opts->print.setup = maxx(opts->print.setup,dyopts_dflt.print.setup) ; opts->print.crash = maxx(opts->print.crash,dyopts_dflt.print.crash) ; opts->print.pricing = maxx(opts->print.pricing, dyopts_dflt.print.pricing) ; opts->print.pivoting = maxx(opts->print.pivoting, dyopts_dflt.print.pivoting) ; opts->print.pivreject = maxx(opts->print.pivreject, dyopts_dflt.print.pivreject) ; opts->print.degen = maxx(opts->print.degen,dyopts_dflt.print.degen) ; opts->print.phase1 = maxx(opts->print.phase1,dyopts_dflt.print.phase1) ; opts->print.phase2 = maxx(opts->print.phase2,dyopts_dflt.print.phase2) ; opts->print.dual = maxx(opts->print.dual,dyopts_dflt.print.dual) ; opts->print.basis = maxx(opts->print.basis,dyopts_dflt.print.basis) ; opts->print.conmgmt = maxx(opts->print.conmgmt, dyopts_dflt.print.conmgmt) ; opts->print.varmgmt = maxx(opts->print.varmgmt, dyopts_dflt.print.varmgmt) ; opts->print.force = maxx(opts->print.force,dyopts_dflt.print.force) ; opts->print.tableau = maxx(opts->print.tableau, dyopts_dflt.print.tableau) ; opts->print.rays = maxx(opts->print.rays, dyopts_dflt.print.rays) ; opts->print.soln = maxx(opts->print.soln, dyopts_dflt.print.soln) ; break ; } case 2: { opts->print.major = maxx(opts->print.major,1) ; opts->print.scaling = maxx(opts->print.scaling,1) ; opts->print.setup = maxx(opts->print.setup,1) ; opts->print.crash = maxx(opts->print.crash,1) ; opts->print.pricing = maxx(opts->print.pricing,0) ; opts->print.pivoting = maxx(opts->print.pivoting,0) ; opts->print.pivreject = maxx(opts->print.pivreject,0) ; opts->print.degen = maxx(opts->print.degen,1) ; opts->print.phase1 = maxx(opts->print.phase1,1) ; opts->print.phase2 = maxx(opts->print.phase2,1) ; opts->print.dual = maxx(opts->print.dual,1) ; opts->print.basis = maxx(opts->print.basis,1) ; opts->print.conmgmt = maxx(opts->print.conmgmt,1) ; opts->print.varmgmt = maxx(opts->print.varmgmt,1) ; opts->print.force = maxx(opts->print.force,1) ; opts->print.tableau = maxx(opts->print.tableau,1) ; opts->print.rays = maxx(opts->print.rays,1) ; opts->print.soln = maxx(opts->print.soln,1) ; break ; } case 3: { opts->print.major = maxx(opts->print.major,1) ; opts->print.scaling = maxx(opts->print.scaling,2) ; opts->print.setup = maxx(opts->print.setup,2) ; opts->print.crash = maxx(opts->print.crash,2) ; opts->print.pricing = maxx(opts->print.pricing,0) ; opts->print.pivoting = maxx(opts->print.pivoting,0) ; opts->print.pivreject = maxx(opts->print.pivreject,0) ; opts->print.degen = maxx(opts->print.degen,1) ; opts->print.phase1 = maxx(opts->print.phase1,3) ; opts->print.phase2 = maxx(opts->print.phase2,3) ; opts->print.dual = maxx(opts->print.dual,3) ; opts->print.basis = maxx(opts->print.basis,2) ; opts->print.conmgmt = maxx(opts->print.conmgmt,2) ; opts->print.varmgmt = maxx(opts->print.varmgmt,2) ; opts->print.force = maxx(opts->print.force,1) ; opts->print.tableau = maxx(opts->print.tableau,1) ; opts->print.rays = maxx(opts->print.rays,1) ; opts->print.soln = maxx(opts->print.soln,1) ; break ; } case 4: { opts->print.major = maxx(opts->print.major,1) ; opts->print.scaling = maxx(opts->print.scaling,2) ; opts->print.setup = maxx(opts->print.setup,3) ; opts->print.crash = maxx(opts->print.crash,3) ; opts->print.pricing = maxx(opts->print.pricing,0) ; opts->print.pivoting = maxx(opts->print.pivoting,0) ; opts->print.pivreject = maxx(opts->print.pivreject,0) ; opts->print.degen = maxx(opts->print.degen,2) ; opts->print.phase1 = maxx(opts->print.phase1,4) ; opts->print.phase2 = maxx(opts->print.phase2,4) ; opts->print.dual = maxx(opts->print.dual,4) ; opts->print.basis = maxx(opts->print.basis,3) ; opts->print.conmgmt = maxx(opts->print.conmgmt,3) ; opts->print.varmgmt = maxx(opts->print.varmgmt,2) ; opts->print.force = maxx(opts->print.force,2) ; opts->print.tableau = maxx(opts->print.tableau,1) ; opts->print.rays = maxx(opts->print.rays,3) ; opts->print.soln = maxx(opts->print.soln,3) ; break ; } default: { opts->print.major = maxx(opts->print.major,1) ; opts->print.scaling = maxx(opts->print.scaling,2) ; opts->print.setup = maxx(opts->print.setup,5) ; opts->print.crash = maxx(opts->print.crash,4) ; opts->print.pricing = maxx(opts->print.pricing,1) ; opts->print.pivoting = maxx(opts->print.pivoting,1) ; opts->print.pivreject = maxx(opts->print.pivreject,1) ; opts->print.degen = maxx(opts->print.degen,2) ; opts->print.phase1 = maxx(opts->print.phase1,5) ; opts->print.phase2 = maxx(opts->print.phase2,5) ; opts->print.dual = maxx(opts->print.dual,5) ; opts->print.basis = maxx(opts->print.basis,5) ; opts->print.conmgmt = maxx(opts->print.conmgmt,3) ; opts->print.varmgmt = maxx(opts->print.varmgmt,2) ; opts->print.force = maxx(opts->print.force,3) ; opts->print.tableau = maxx(opts->print.tableau,4) ; opts->print.rays = maxx(opts->print.rays,4) ; opts->print.soln = maxx(opts->print.soln,4) ; break ; } } return ; } DyLP-1.6.0/DyLP/src/Dylp/dy_primal.c0000644000076700007670000022561011026315405013722 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains the routines specific to the primal simplex algorithm. */ #define DYLP_INTERNAL #include "dylp.h" static char sccsid[] UNUSED = "@(#)dy_primal.c 4.6 10/15/05" ; static char svnid[] UNUSED = "$Id: dy_primal.c 240 2008-06-18 23:32:21Z lou $" ; /* A word or three on the handling of infeasible variables during phase I. The underlying philosophy is that once a variable becomes feasible, it stays feasible, hence the number of infeasible variables decreases monotonically. To construct the phase I objective, dy_initp1obj makes a list of the infeasible variables, puts +/- 1.0 in the objective in the corresponding spots, and calculates the duals and reduced costs. Dylp minimises, so we use +1 for BUUB variables, -1 for BLLB variables. To install the phase I objective, the phase II objective is detached from dy_sys->obj and cached, and the phase I objective is attached in its place. With each iteration, tweakp1obj scans the list of infeasible variables to see what's happened and make adjustments. The possibilities are: * No variable became feasible, in which case nothing need be done. * Exactly one variable (the leaving variable) became feasible and became nonbasic. Its (now nonbasic) objective coefficient is set to 0. This change will not affect the duals (y = cinv(B)) or any reduced costs except cbar (cbar = c - yA, so we only need to compensate for the change to c). I suppose we could check to see if x is now an attractive candidate to pivot into the basis, but it seems more trouble than it's worth. * One or more variables became feasible, and remained basic. In this case, all hell breaks loose, as we'll need to change objective coefficients for variables that are still basic, and the change will ripple everywhere. I think that a reasonably efficient update calculation might be possible, but for now the approach is to simply recalculate the duals and reduced costs. At least the column norms don't change. All variables which gain feasibility are removed from the list of infeasible variables, and the list is compressed. Eventually, it dwindles to nothing and we're feasible (hence optimal) and done with phase I. Now, if you believe this heart-warming story, I have a fine bridge you might want to purchase. What'll really happen (not always, but often enough to hurt) is that accumulating numeric inaccuracy will creep in. At some point we'll refactor and find that previously feasible variables have lost feasibility. The variables' status will be reset correctly, so that they'll be properly evaluated and handled during pivoting, EXCEPT, the objective coefficient will be incorrect (i.e., 0). Rather than dance around trying to add to the list of infeasible variables, we'll simply let it dwindle to nothing and catch any variables that became infeasible in the meantime with the preoptimality check for primal feasibility (which, as a side effect, will make sure that the value of infeascnt in dy_lp is correct). If we fail the check (by way of some variables having lost feasibility), we run dy_initp1obj again and give it another shot. In order to implement an initial variable purge, prior to the first run of a simplex routine, we need to be able to install the phase I objective before entering the main dynamic simplex loop. Hence the dy_lp structure contains phase I objective information. We also have to make dy_initp1obj available to dylp. In the normal course of things, commonstart will initialise the phase I objective, and dy_finishup will free it. Nonetheless, dy_primal does a check prior to calling primal1, in case we've kicked back into phase I due to loss of feasibility. primal1 may also call dy_initp1obj if it finds formerly feasible variables have lost feasibility. */ /* Antidegeneracy comes in two strengths: * `Anti-degen lite' attempts to choose the leaving variable using a heuristic based on alignment of hyperplanes. There are 6 variations available. Two of them actually ignore hyperplane alignment. The other four try to choose the leaving variable by considering the relative alignment of the plane that will become tight to either the objective function or the edge direction for the pivot. See further comments in the relevant subroutines (primalout & subroutines) in dy_primalpivot.c. * If the lite approach fails, the heavy artillery is a strategy based on perturbation of the problem. When faced with numeric ill-conditioning, the idea is that we gradually boost the minimum pivot ratio. This will happen when groombasis has to make a major status correction, and when we encounter unexpected loss of dual feasibility (optimality) or primal feasibility once we think we've obtained either. */ static bool forcesuperbasic (void) /* To put it bluntly, this routine is a bandaid. For good or ill, primal I knows that it should never see superbasic variables; they're not necessary when feasibility isn't at issue. But, we have the following failure scenario: We're in phase II, and a pivot attempt results in a singular basis. dylp soldiers on, calling dy_accchk to refactor (which will patch the basis) and recalculate the primal and dual variables. But, sad to say, the primal feasibility check fails (we've removed some accumulated numerical inaccuracy by refactoring, or changed the numeric conditioning of the basis) and we revert to primal phase I. Which promptly fails because of the superbasic variable left by the patch. So, this bandaid scans the nonbasic variables and, if it finds a superbasic variable, adjusts it to the best bound, based on the objective coefficient. In the event that we adjust a variable, we'll call dy_accchk to make sure we have an accurate count of infeasible basic variables going into phase I. Parameters: none Returns: TRUE if all goes well, FALSE otherwise. */ { int k,supercnt ; flags statk,checks ; double valk,lbk,ubk ; /* Open up a loop to walk the variables, looking for superbasics. */ supercnt = 0 ; for (k = 1 ; k < dy_sys->varcnt ; k++) { /* It's a superbasic variable. Force it to the appropriate bound based on the objective coefficient and presence/absence of the bound. */ if (flgon(dy_status[k],vstatSB)) { supercnt++ ; ubk = dy_sys->vub[k] ; lbk = dy_sys->vlb[k] ; statk = vstatSB ; if (ubk < dy_tols->inf && lbk > -dy_tols->inf) { if (dy_sys->obj[k] < 0) { setflg(statk,vstatNBUB) ; valk = ubk ; } else { setflg(statk,vstatNBLB) ; valk = lbk ; } } else if (ubk < dy_tols->inf) { setflg(statk,vstatNBUB) ; valk = ubk ; } else if (lbk > -dy_tols->inf) { setflg(statk,vstatNBLB) ; valk = lbk ; } else { setflg(statk,vstatNBFR) ; valk = 0 ; } comflg(dy_status[k],statk) ; dy_x[k] = valk ; } # ifdef DYLP_PARANOIA /* If we're paranoid, run a status check while we're at it. This << must >> follow the code that forces superbasics. dy_chkstatus won't tolerate BLLB or BUUB in phase II, and we're here because of loss of feasbility, hence we need to show phase I. But dy_chkstatus won't tolerate SB in phase I, so we have to get rid of them before we check. */ if (dy_chkstatus(k) == FALSE) return (FALSE) ; # endif } /* Did we do anything? If so, use dy_accchk to do a primal feasibility check, which will ensure that the values in dy_lp are accurate. */ if (supercnt > 0) { checks = ladPRIMFEAS|ladPFQUIET ; if (dy_accchk(&checks) != dyrOK) return (FALSE) ; } return (TRUE) ; } static dyret_enum preoptimality (dyret_enum lpretval, flags *result) /* This routine does the prep work so that we can have confidence in a report of optimality, infeasibility (phase I only), or unboundedness (phase II only) by the primal simplex routines. It clears the pivot reject list, backs out any restricted subproblems, refactors, recalculates the primal and (phase II only) dual variables, and performs an accuracy and feasibility check. Parameters: lpretval: return code assigned by primal1 or primal2 result: (o) loaded with the result flags from dy_accchk Returns: dyrOK: if all goes smoothly dyrPATCHED: if the only bump is that the basis was patched by dy_factor dyrLOSTPFEAS: if the primal feasibility check by dy_accchk fails dyrLOSTDFEAS: if the dual feasibility check by dy_accchk fails (phase II only) dyrFATAL: if anything else goes wrong Also can relay error codes from dy_accchk (dyrACCCHK, and various basis factoring errors). Loss of primal feasibility dominates loss of dual feasibility. */ { flags checkflags ; dyret_enum retval ; # if defined(DYLP_PARANOIA) || !defined(DYLP_NDEBUG) const char *rtnnme = "preoptimality" ; # endif # ifndef DYLP_NDEBUG int print ; # endif # ifdef DYLP_PARANOIA if (!(lpretval == dyrOPTIMAL || lpretval == dyrINFEAS || lpretval == dyrPUNT || lpretval == dyrUNBOUND)) { errmsg(4,rtnnme,"lp return code",dy_prtdyret(lpretval)) ; return (dyrFATAL) ; } # endif # ifndef DYLP_NDEBUG if (dy_lp->phase == dyPRIMAL1) print = dy_opts->print.phase1 ; else print = dy_opts->print.phase2 ; if (print >= 4) dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: validating %s at iteration (%s)%d.", rtnnme,dy_prtdyret(lpretval), dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; # endif /* A little prep work. First, we don't want dy_accchk to take heroic measures in the event of loss of primal or dual feasibility, so suppress that. In phase I, because we're continually playing games with the objective function, and we've defined optimality to be primal feasibility, it's possible that we won't have dual feasibility when we come here reporting optimality. Also, if we go unbounded in phase I, we may not be primal or dual feasible. If this looks to be straightforward optimality and we've just refactored, don't request an initial refactor. */ *result = 0 ; checkflags = 0 ; setflg(checkflags,ladFACTOR|ladPRIMALCHK|ladPRIMFEAS|ladPFQUIET| ladDUALCHK|ladDUALFEAS|ladDFQUIET) ; if (lpretval == dyrOPTIMAL && dy_lp->basis.etas == 0) clrflg(checkflags,ladFACTOR) ; /* Start with the easy stuff -- clear the pivot reject list and back out any restricted subproblems. If degenout notes accuracy loss, request a refactor. */ # ifndef DYLP_NDEBUG if (print >= 4) dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tclearing pivot rejection and antidegeneracy machinery ... ") ; # endif if (dy_clrpivrej(NULL) != TRUE) return (dyrFATAL) ; if (dy_lp->degen > 0) { if (dy_degenout(0) == dyrREQCHK) setflg(checkflags,ladFACTOR) ; } /* And now the accuracy checks. Failure here is hard failure --- dy_accchk is very persistent, as is dy_factor, and any problems would have been fixed if possible. */ # ifndef DYLP_NDEBUG if (print >= 4) dyio_outfmt(dy_logchn,dy_gtxecho,"done.\n\t%schecking accuracy ... ", flgon(checkflags,ladFACTOR)?"refactoring and ":"") ; # endif retval = dy_accchk(&checkflags) ; *result = checkflags ; if (!(retval == dyrOK || retval == dyrPATCHED)) { # ifndef DYLP_NDEBUG if (print >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho,"%sfailed.",(print >= 5)?"\n\t":" ") ; } # endif return (retval) ; } else if (flgon(checkflags,ladPRIMALCHK|ladDUALCHK)) { # ifndef DYLP_NDEBUG if (print >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho,"%sfailed",(print >= 5)?"\n\t":" ") ; if (flgon(checkflags,ladPRIMALCHK)) dyio_outfmt(dy_logchn,dy_gtxecho," primal") ; if (flgon(checkflags,ladDUALCHK)) dyio_outfmt(dy_logchn,dy_gtxecho," dual") ; dyio_outfmt(dy_logchn,dy_gtxecho," check(s).") ; } # endif retval = dyrACCCHK ; } else if (flgon(checkflags,ladPRIMFEAS|ladDUALFEAS)) { # ifndef DYLP_NDEBUG if (print >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho,"%slost",(print >= 5)?"\n\t":" ") ; if (flgon(checkflags,ladPRIMALCHK)) dyio_outfmt(dy_logchn,dy_gtxecho," primal") ; if (flgon(checkflags,ladDUALCHK)) dyio_outfmt(dy_logchn,dy_gtxecho," dual") ; dyio_outfmt(dy_logchn,dy_gtxecho," feasibility.") ; } # endif if (flgon(checkflags,ladPRIMFEAS)) retval = dyrLOSTPFEAS ; else retval = dyrLOSTDFEAS ; } # ifndef DYLP_NDEBUG else { if (print >= 4) dyio_outfmt(dy_logchn,dy_gtxecho,"%s%s.",(print >= 5)?"\n\t":" ", (retval == dyrOK)?"done":"patched") ; } # endif return (retval) ; } bool dy_swapobjs (dyphase_enum phase) /* This routine handles the allocation, exchange, and deallocation of phase I and phase II objective vectors. The actions are as follows, depending on the value of the phase parameter: dyPRIMAL1: We're headed into primal phase I. If the vectors for infvars and the phase I objective are not yet allocated, do it, and attach p1obj and p2obj as additional pointers to the phase I and II objectives, respectively. The actual swap consists of detaching dy_sys->obj as a pointer to the phase II objective and reattaching it as a pointer to the phase I objective. It may be that the phase I objective is already installed; in that case we have only to check infvars for size. dyPRIMAL2: We're headed into primal phase II. Detach dy_sys->obj as a pointer to the phase I objective, and reattach it as a pointer to the phase II objective. dyDONE: Detach the lot and free infvars and p1obj. Parameters: phase: dyPRIMAL1 to swap the phase I objective into place, dyPRIMAL2 to swap the phase II objective into place, dyDONE to clean up. Returns: TRUE if the swap goes ok, FALSE otherwise */ { const char *rtnnme = "dy_swapobjs" ; # ifdef DYLP_PARANOIA /* A little paranoia. The routine will do the right thing (i.e., nothing) if called to install the P2 objective and it's already in place. But chances are we're confused if it happens. There are valid reasons to want to reinitialize the P1 objective, so no warning is issued. */ if (!(phase == dyPRIMAL1 || phase == dyPRIMAL2 || phase == dyDONE)) { errmsg(4,rtnnme,"direction",dy_prtlpphase(phase,FALSE)) ; return (FALSE) ; } if (dy_lp->p1obj.installed == FALSE && phase == dyPRIMAL2) { warn(399,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters,"II") ; } # endif /* We're here to install the phase I objective. If it's already installed, all we need to do is check infvars for size. If it's not installed, the first thing to check is whether we need to (re)allocate vectors for infvars and the phase I objective and attach pointers p1obj and p2obj. Then do the routine part of the swap, detaching dy_sys->obj as a pointer to the phase II objective and reattaching it as a pointer to the phase I objective. */ if (phase == dyPRIMAL1) { if (dy_lp->p1obj.installed == TRUE) { if (dy_lp->infeascnt > dy_lp->p1obj.infvars_sze) { dy_lp->p1obj.infvars_sze = dy_lp->infeascnt ; dy_lp->p1obj.infvars = (int *) REALLOC(dy_lp->p1obj.infvars,dy_lp->infeascnt*sizeof(int)) ; } } else { if (dy_lp->p1obj.p1obj == NULL) { dy_lp->p1obj.infvars = (int *) MALLOC(dy_lp->infeascnt*sizeof(int)) ; dy_lp->p1obj.infvars_sze = dy_lp->infeascnt ; dy_lp->p1obj.p1obj = NULL ; if (consys_attach(dy_sys,CONSYS_OBJ,sizeof(double), (void **) &dy_lp->p1obj.p1obj) == FALSE) { errmsg(100,rtnnme,dy_sys->nme,"&dy_lp->p1obj.p1obj") ; return (FALSE) ; } dy_lp->p1obj.p2obj = dy_sys->obj ; if (consys_attach(dy_sys,CONSYS_OBJ,sizeof(double), (void **) &dy_lp->p1obj.p2obj) == FALSE) { errmsg(100,rtnnme,dy_sys->nme,"&dy_lp->p1obj.p2obj") ; return (FALSE) ; } } else { if (dy_lp->infeascnt > dy_lp->p1obj.infvars_sze) { dy_lp->p1obj.infvars_sze = dy_lp->infeascnt ; dy_lp->p1obj.infvars = (int *) REALLOC(dy_lp->p1obj.infvars,dy_lp->infeascnt*sizeof(int)) ; } } if (consys_detach(dy_sys,(void **) &dy_sys->obj,FALSE) == FALSE) { errmsg(105,rtnnme,dy_sys->nme,"&dy_sys->obj (P2)") ; return (FALSE) ; } dy_sys->obj = dy_lp->p1obj.p1obj ; if (consys_attach(dy_sys,CONSYS_OBJ, sizeof(double),(void **) &dy_sys->obj) == FALSE) { errmsg(100,rtnnme,dy_sys->nme,"&dy_sys->obj (P1)") ; return (FALSE) ; } dy_lp->p1obj.installed = TRUE ; } } /* We're here to remove the phase I objective and reattach the phase II objective. Detach dy_sys->obj as a pointer to the phase I objective and reattach it as a pointer to the phase II objective. */ else if (phase == dyPRIMAL2) { if (dy_lp->p1obj.installed == FALSE) return (TRUE) ; if (consys_detach(dy_sys,(void **) &dy_sys->obj,FALSE) == FALSE) { errmsg(105,rtnnme,dy_sys->nme,"&dy_sys->obj (P1)") ; return (FALSE) ; } dy_sys->obj = dy_lp->p1obj.p2obj ; if (consys_attach(dy_sys,CONSYS_OBJ, sizeof(double),(void **) &dy_sys->obj) == FALSE) { errmsg(100,rtnnme,dy_sys->nme,"&dy_sys->obj (P2)") ; return (FALSE) ; } ; dy_lp->p1obj.installed = FALSE ; } /* We're finishing up and releasing the dylp data structures. We need to free infvars, and whichever objective isn't currently installed (the other will be freed when the dy_sys constraint system is freed). */ else { if (dy_lp->p1obj.infvars != NULL) FREE(dy_lp->p1obj.infvars) ; if (dy_lp->p1obj.installed == TRUE) { if (dy_lp->p1obj.p2obj != NULL) FREE(dy_lp->p1obj.p2obj) ; } else { if (dy_lp->p1obj.p1obj != NULL) FREE(dy_lp->p1obj.p1obj) ; } } return (TRUE) ; } bool dy_initp1obj (void) /* This routine is responsible for initialising the phase I objective. dy_swapobjs takes care of making sure the associated structures are ok. Initialisation consists of scanning the basis to fill in infvars with the indices of infeasible variables, and setting the appropriate values in the phase I objective. Once the objective function is established, we'll call dy_calcduals and dy_calccbar to calculate the duals and reduced costs. Parameters: none Returns: TRUE if the initialisation goes through without problem, FALSE otherwise. */ { int *infvars,infcnt,xipos,xindx ; double *p1obj ; const char *rtnnme = "dy_initp1obj" ; # ifndef DYLP_NDEBUG if (dy_opts->print.phase1 >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n initialising phase 1 objective and reduced costs.") ; } # endif /* Call dy_swapobjs to have a look at the infvars and phase I objective vectors. They'll be (re)allocated as necessary, and the phase I objective will be installed in place of the phase II objective. Note that whenever we're in here, dy_lp->infeascnt should be correct, but we can't confirm that with a paranoid check until after we scan the basis. */ if (dy_swapobjs(dyPRIMAL1) == FALSE) { errmsg(318,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,"install/resize") ; return (FALSE) ; } /* Clear the phase I objective to 0. We can track the changes under most circumstances, but arbitrary changes due to recovery from loss of accuracy or basis singularity would defeat us. */ infvars = dy_lp->p1obj.infvars ; p1obj = dy_lp->p1obj.p1obj ; infcnt = 0 ; memset(p1obj,0,(dy_sys->varcnt+1)*sizeof(double)) ; /* Scan the basis and record the indices of infeasible variables. For each variable, set the objective coefficient to -1 for variables above their upper bound and +1 for variables below their lower bound. */ for (xipos = 1 ; xipos <= dy_sys->concnt ; xipos++) { xindx = dy_basis[xipos] ; if (flgoff(dy_status[xindx],vstatBLLB|vstatBUUB)) continue ; infvars[infcnt++] = xindx ; if (flgon(dy_status[xindx],vstatBLLB)) { dy_sys->obj[xindx] = -1.0 ; # ifndef DYLP_NDEBUG if (dy_opts->print.phase1 >= 7) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t%16s (%3d) = %16.8g < lb = %16.8g, infeas = %16.8g", consys_nme(dy_sys,'v',xindx,FALSE,NULL),xindx, dy_xbasic[xipos],dy_sys->vlb[xindx], dy_sys->vlb[xindx]-dy_xbasic[xipos]) ; } # endif } else { dy_sys->obj[xindx] = 1.0 ; # ifndef DYLP_NDEBUG if (dy_opts->print.phase1 >= 7) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t%16s (%3d) = %16.8g > ub = %16.8g, infeas = %16.8g", consys_nme(dy_sys,'v',xindx,FALSE,NULL),xindx, dy_xbasic[xipos],dy_sys->vub[xindx], dy_xbasic[xipos]-dy_sys->vub[xindx]) ; } # endif } } dy_lp->p1obj.infcnt = infcnt ; # ifdef DYLP_PARANOIA /* Any time that we're in here, dy_lp->infeascnt should be accurate --- either we're just starting up, or we've kicked back here after discovering a lack of feasibility. In the latter case, a primal feasibility check should have run. If we don't match, there's a problem. */ if (infcnt != dy_lp->infeascnt) { errmsg(1,rtnnme,__LINE__) ; return (FALSE) ; } # endif # ifndef DYLP_NDEBUG if (dy_opts->print.phase1 >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n saw %d infeasible variables, tot. infeas. %g.", infcnt,dy_lp->infeas) ; } # endif /* Calculate the duals and reduced costs for the objective, and the objective itself. */ dy_calcduals() ; if (dy_calccbar() == FALSE) { errmsg(384,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters) ; return (FALSE) ; } dy_lp->z = dy_calcobj() ; # ifndef DYLP_NDEBUG if (dy_opts->print.phase1 >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t recalculated duals and reduced costs.") ; } # endif # ifdef DYLP_STATISTICS /* Keep track of the number of pivots between changes in feasibility status. */ if (dy_stats != NULL) { int pivcnt ; dy_stats->infeas.chgcnt2++ ; if (dy_stats->infeas.maxcnt < infcnt) dy_stats->infeas.maxcnt = infcnt ; pivcnt = dy_lp->tot.pivs-dy_stats->infeas.prevpiv ; dy_stats->infeas.totpivs += pivcnt ; if (pivcnt > dy_stats->infeas.maxpivs) dy_stats->infeas.maxpivs = pivcnt ; dy_stats->infeas.prevpiv = dy_lp->tot.pivs ; } # endif return (TRUE) ; } static dyret_enum tweakp1obj (bool *reselect, int candxj) /* This routine is responsible for updating the phase I objective function as variables gain feasibility. If no variable gains feasibility, there's nothing to do --- the objective is unchanged. If only a single variable has gained feasibility with this pivot, the best case involves two variables, such that x left the basis and gained feasibility as x entered. In this case, a little thought brings the realisation that since x is now nonbasic, we can change its objective coefficient without disturbing the duals (y = cinv(B)). Since the reduced costs are cbar = c-yA, we only have to adjust cbar by -c, before setting c to 0. This doesn't entirely get us out of trouble (it could be that x has been selected to reenter, and when we rewrite cbar we make it unsuitable). If a variable gains feasibility and remains basic, all hell breaks loose. It looks to me like a reasonably efficient update operation is possible, but it's going to be complex. For the nonce, just recalculate all the duals and reduced costs. At least the column norms don't change. Fixed variables that move from BLLB to BUUB fall in the `all hell breaks loose' category. Parameters: reselect: (o) set to TRUE if the reduced costs have been recalculated and a new entering variable should be selected, set to FALSE otherwise candxj: the candidate entering variable x Returns: dyrINFEAS if the problem is still infeasible dyrOPTIMAL if the problem is feasible (thus optimal w.r.t. the phase I objective) dyrFATAL for errors. */ { int *infvars,ndx,maxndx,newfeas,xkndx ; flags statk ; bool recalccbar ; const char *rtnnme = "tweakp1obj" ; # ifndef DYLP_NDEBUG int xkpos ; double infeas ; # endif # ifdef DYLP_PARANOIA double chkz ; # endif # ifndef DYLP_NDEBUG infeas = 0 ; if (dy_opts->print.phase1 >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t checking feasibility & tweaking phase 1 objective.") ; } # endif # ifdef DYLP_PARANOIA chkz = dy_calcobj() ; if (!withintol(chkz,dy_lp->z,fabs(1000*dy_tols->cost*(1+fabs(chkz))))) { warn(405,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, dy_lp->z,chkz,dy_lp->z-chkz,fabs(1000*dy_tols->cost*(1+chkz))) ; } # endif /* Walk the list of infeasible variables, looking for changes in status and adjusting the objective and reduced cost accordingly. Each newly feasible variable is compressed out of infvars. If the only change from infeasible to feasible is the leaving variable x, we can make the adjustment here in the loop. Otherwise, we just note that a variable has gained feasibility or changed infeasibility and remained basic, and recalculate after we leave the loop. */ newfeas = 0 ; maxndx = dy_lp->p1obj.infcnt-1 ; *reselect = FALSE ; recalccbar = FALSE ; infvars = dy_lp->p1obj.infvars ; for (ndx = 0 ; ndx <= maxndx ; ) { xkndx = infvars[ndx] ; statk = getflg(dy_status[xkndx],vstatSTATUS) ; # ifndef DYLP_NDEBUG if (dy_opts->print.phase1 >= 5 && flgon(statk,vstatBLLB|vstatBUUB)) { xkpos = dy_var2basis[xkndx] ; if (dy_opts->print.phase1 >= 7) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t %4s %16s (%3d) = %16.8g", dy_prtvstat(statk),consys_nme(dy_sys,'v',xkndx,FALSE,NULL), xkndx,dy_xbasic[xkpos]) ; } if (flgon(statk,vstatBLLB)) { infeas += dy_sys->vlb[xkndx]-dy_xbasic[xkpos] ; if (dy_opts->print.phase1 >= 7) { dyio_outfmt(dy_logchn,dy_gtxecho," < lb = %16.8g, inf = %16.8g", dy_sys->vlb[xkndx], dy_sys->vlb[xkndx]-dy_xbasic[xkpos]) ; } } else { infeas += dy_xbasic[xkpos]-dy_sys->vub[xkndx] ; if (dy_opts->print.phase1 >= 7) { dyio_outfmt(dy_logchn,dy_gtxecho," > ub = %16.8g, inf = %16.8g", dy_sys->vub[xkndx], dy_xbasic[xkpos]-dy_sys->vub[xkndx]) ; } } } # endif if (flgon(statk,vstatBLLB)) { ndx++ ; if (dy_sys->obj[xkndx] != -1.0) { dy_sys->obj[xkndx] = -1.0 ; recalccbar = TRUE ; } } else if (flgon(statk,vstatBUUB)) { ndx++ ; if (dy_sys->obj[xkndx] != 1.0) { dy_sys->obj[xkndx] = 1.0 ; recalccbar = TRUE ; } } else { newfeas++ ; infvars[ndx] = infvars[maxndx--] ; if (flgon(statk,vstatNONBASIC|vstatNBFR)) { dy_cbar[xkndx] -= dy_sys->obj[xkndx] ; setcleanzero(dy_cbar[xkndx],dy_tols->zero) ; dy_lp->z -= dy_sys->obj[xkndx]*dy_x[xkndx] ; if (xkndx == candxj) *reselect = TRUE ; } else { recalccbar = TRUE ; } dy_sys->obj[xkndx] = 0.0 ; } } dy_lp->p1obj.infcnt = maxndx+1 ; # ifndef DYLP_NDEBUG if (dy_opts->print.phase1 >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t saw %d infeasible variables, down %d, tot. infeas. %g.", dy_lp->p1obj.infcnt,newfeas,infeas) ; } if (dy_opts->print.phase1 >= 2 && *reselect == TRUE) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n reselect; newly feasible %s (%d) selected to enter.", consys_nme(dy_sys,'v',candxj,FALSE,NULL),candxj) ; } # endif # ifdef DYLP_PARANOIA /* Are we feeling paranoid? Do a scan to make sure that objective coefficients are 0 for all variables that are in bound. (At this point, there may be a few newly infeasible variables with coefficients of 0, when they should be +/- 1.0, hence we don't check for those.) In the simple case where the leaving variable is the only variable to gain feasibility, we can test the iteratively updated objective. */ for (xkndx = 1 ; xkndx <= dy_sys->varcnt ; xkndx++) { statk = dy_status[xkndx] ; if (flgoff(statk,vstatBLLB|vstatBUUB) && dy_sys->obj[xkndx] != 0.0) { errmsg(389,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,consys_nme(dy_sys,'v',xkndx,FALSE,NULL),xkndx, dy_prtvstat(statk),xkndx,dy_sys->obj[xkndx]) ; return (dyrFATAL) ; } } if (newfeas == 1 && recalccbar == FALSE) { chkz = dy_calcobj() ; if (!withintol(chkz,dy_lp->z,fabs(1000*dy_tols->cost*(1+fabs(chkz))))) { warn(405,rtnnme,dy_sys->nme, dy_prtlpphase(dy_lp->phase,TRUE),-dy_lp->tot.iters, dy_lp->z,chkz,dy_lp->z-chkz, fabs(1000*dy_tols->cost*(1+chkz))) ; } } # endif # ifdef DYLP_STATISTICS /* Keep track of the number of pivots between changes in feasibility status which require recalculation of the duals and reduced costs. */ if (dy_stats != NULL && newfeas != 0) { int pivcnt ; if (recalccbar == FALSE) dy_stats->infeas.chgcnt1++ ; else dy_stats->infeas.chgcnt2++ ; pivcnt = dy_lp->tot.pivs-dy_stats->infeas.prevpiv ; dy_stats->infeas.totpivs += pivcnt ; if (pivcnt > dy_stats->infeas.maxpivs) dy_stats->infeas.maxpivs = pivcnt ; dy_stats->infeas.prevpiv = dy_lp->tot.pivs ; } # endif /* If dy_lp->p1obj.infcnt == 0, then we've gained feasibility (at least with respect to the variables in infvars; see notes at the head of the file). Return with an indication of optimality. (Note that we might not really be optimal w.r.t. the phase I objective, but that's not important.) We'll clear dy_y and cbar, just to keep the math straight. */ if (dy_lp->p1obj.infcnt == 0) { memset(dy_y,0,(dy_sys->concnt+1)*sizeof(double)) ; memset(dy_cbar,0,(dy_sys->varcnt+1)*sizeof(double)) ; return (dyrOPTIMAL) ; } /* If recalccbar is TRUE we need to redo the duals, reduced costs, and objective. And we'll need to reselect the entering variable. Sigh. */ if (recalccbar == TRUE) { dy_calcduals() ; if (dy_calccbar() == FALSE) { errmsg(384,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters) ; return (dyrFATAL) ; } dy_lp->z = dy_calcobj() ; *reselect = TRUE ; # ifndef DYLP_NDEBUG if (dy_opts->print.phase1 >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\trecalculated duals and reduced costs.", maxndx,infeas) ; } # endif } /* That's it. Return an indication that we're still infeasible. */ return (dyrINFEAS) ; } static dyret_enum verifyp1obj (void) /* This routine attempts to verify that the phase I objective is indeed correct. The main thing we're looking for is unexpected loss or gain of feasibility due to accumulated numeric inaccuracy. We need to do this when we have an indication of optimality in phase I, because of the problems outlined at the head of the file. If new variables become infeasible after infvars is loaded, tweakp1obj will not assign the proper objective coefficients. If the objective is all 0's, there's no motivation to reduce infeasibility, eh? The quick test is equality of dy_lp->p1obj.infcnt and dy_lp->infeascnt. If that fails, we have a problem. Even if we have equal counts, we still have to check the individual variables, to make sure we haven't had a pair of variables swap roles, or had a fixed variable move from BLLB to BUUB. If the objective doesn't verify, it's an indication that we're having accuracy problems. Boost the pivot selection tolerances and do a refactor on the way out. Parameters: none Returns: dyrOK if the objective verifies, dyrRESELECT if the objective didn't verify, and dyrFATAL, or error code from dy_accchk, if something goes wrong. */ { int *infvars,ndx,xkndx ; double ck ; flags statk,checks ; dyret_enum retval ; bool err ; retval = dyrINV ; /* Use dy_accchk to do a primal feasibility check, which will ensure that the values in dy_lp are accurate. Because we're only asking for a recalculation, dy_accchk can return only dyrOK or dyrFATAL. */ checks = 0 ; setflg(checks,ladPRIMFEAS|ladPFQUIET) ; retval = dy_accchk(&checks) ; if (retval != dyrOK) return (retval) ; /* First compare dy_lp->p1obj.infcnt to dy_lp->infeascnt. If they're unequal, it's a cinch the objective is incorrect. Otherwise, open up a loop to step through infvars and check each entry. If we're debugging, we'll check them all, but if we're not we break on the first inconsistency. */ if (dy_lp->p1obj.infcnt != dy_lp->infeascnt) { retval = dyrRESELECT ; } else { retval = dyrOK ; err = FALSE ; infvars = dy_lp->p1obj.infvars ; for (ndx = 0 ; ndx < dy_lp->p1obj.infcnt ; ndx++) { xkndx = infvars[ndx] ; statk = getflg(dy_status[xkndx],vstatSTATUS) ; ck = dy_sys->obj[xkndx] ; switch (statk) { case vstatBLLB: { if (ck != -1.0) err = TRUE ; break ; } case vstatBUUB: { if (ck != 1.0) err = TRUE ; break ; } default: { err = TRUE ; break ; } } if (err == TRUE) { retval = dyrRESELECT ; # ifdef DYLP_NDEBUG break ; # else err = FALSE ; if (dy_opts->print.phase1 >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tphase I c<%d> = %g inconsistent for %s %s (%d) = %g;", xkndx,dy_sys->obj[xkndx],dy_prtvstat(statk), consys_nme(dy_sys,'v',xkndx,FALSE,NULL),xkndx,dy_x[xkndx]) ; dyio_outfmt(dy_logchn,dy_gtxecho," lb = %g, ub = %g", dy_sys->vlb[xkndx],dy_sys->vub[xkndx]) ; if (!withinbnds(dy_sys->vlb[xkndx],dy_x[xkndx],dy_sys->vub[xkndx])) { if (flgon(statk,vstatBLLB)) { dyio_outfmt(dy_logchn,dy_gtxecho,", infeas = %g.", dy_sys->vlb[xkndx]-dy_x[xkndx]) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho,", infeas = %g.", dy_x[xkndx]-dy_sys->vub[xkndx]) ; } } else { dyio_outchr(dy_logchn,dy_gtxecho,'.') ; } } # endif } } } /* If the objective doesn't check, it indicates that we've lost numerical accuracy somewhere along the way. Boost the pivot selection tolerances and refactor now, for two reasons: We'll get back accuracy, if we can, and (more subtle) we'll clean up any inconsistency between value and status before initp1obj complains about it. */ if (retval == dyrRESELECT) { (void) dy_setpivparms(+1,+1) ; checks = 0 ; setflg(checks, ladFACTOR|ladPRIMFEAS|ladPFQUIET) ; retval = dy_accchk(&checks) ; if (retval == dyrOK || retval == dyrPATCHED) retval = dyrRESELECT ; } return (retval) ; } static dyret_enum primal1 (void) /* Phase 1 of the primal simplex. There are two nested loops, an inner pivoting loop and an outer control loop. The pivoting loop is a three step sequence: pivot (dy_primalpivot), deal with any problems & routine maintenance (dy_duenna), then check for primal feasibility and update the objective (tweakp1obj). As a side effect of the pivot, dy_primalpivot returns the index of the preferred candidate, xjcand, to enter on the next pivot. (Except when the pivot is a bound-to-bound swing by x; in this case, there's no pricing update, hence no selection of a candidate x, and we have to do it here.) The biggest difference between phase I and phase II is that in phase I we tweak the objective each time a variable gains feasibility. There's a lot of action hidden in dy_initp1obj and tweakp1obj. Exits from the pivoting loop fall into two basic groups: * We need to select a new entering x, but there's no other problem. * We have something that looks like a termination condition --- optimality, infeasibility, unboundedness, a punt, or some fatal problem. When we need to select a new x, we circle back to the top of the control loop where dy_primalin is called to select a new incoming variable. As long as an incoming variable can be selected, and nothing fatal goes wrong, the inner pivoting loop resumes. When we suspect a termination condition, things get more complex. In phase I, optimality is defined to be primal feasibility and is detected by tweakp1obj. Inability to find a candidate for entry (a.k.a. dual feasbility, the normal condition for optimality, used by dy_primalin and dy_primalpivot) actually equates to infeasibility. A punt is just (infeasible) optimality with the possibility we could make further progress if we relaxed the pivot selection tolerance. Unboundedness remains unboundedness. Because life is not fair (see remarks at head of file), when we suspect feasibility the first thing we need to do is check that we're really considering all infeasible variables. If necessary, we reset the phase I objective and resume pivoting. Otherwise, it's the normal sequence for termination: call preoptimality to refactor and do accuracy and feasibility checks, then react accordingly. Parameters: none Returns: most of the dyret_enum codes. */ { dyret_enum lpretval,scanresult,pivresult,duennaresult,preopresult, p1objresult ; int startcol,scan,nextcol,candxj,xjndx,indir,xindx,outdir,optcnt ; double cbarj,abarij,delta ; bool do_pivots,reselect ; flags xjstatus,checks ; const char *rtnnme = "primal1" ; # ifndef DYLP_NDEBUG bool uxpfeas,uxnpfeas,uxdfeas,uxndfeas ; dyret_enum tmpretval ; # endif # ifdef DYLP_PARANOIA if (dy_lp->degen != 0) { errmsg(317,rtnnme,dy_sys->nme,dy_lp->degen) ; return (dyrFATAL) ; } if (dy_lp->p1.iters != 0) { errmsg(5,rtnnme,"phase 1 iteration count",dy_lp->p1.iters) ; return (dyrFATAL) ; } if (dy_lp->infeascnt <= 0) { errmsg(319,rtnnme,dy_sys->nme) ; return (dyrFATAL) ; } # endif # ifdef DYLP_STATISTICS if (dy_stats != NULL) dy_stats->infeas.prevpiv = dy_lp->tot.pivs ; # endif dy_lp->p1.pivs = 0 ; dy_lp->pivok = FALSE ; dy_lp->prev_pivok = FALSE ; lpretval = dyrINV ; if (dy_clrpivrej(NULL) != TRUE) return (dyrFATAL) ; /* Initialise the phase I objective, if it's not already in place. */ if (dy_lp->p1obj.installed == FALSE) { if (dy_initp1obj() == FALSE) { errmsg(318,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,"initialise") ; return (dyrFATAL) ; } } /* Open the control loop. The purpose of this outer loop is to allow easy recovery from false indications of optimality, infeasibility, or unboundedness, as well as problems involving pivot selection. All the recovery actions happen at the bottom of the loop, after we fall out of the pivoting loop. Initialise a few variables and get going. */ scan = dy_opts->scan ; nextcol = 1 ; optcnt = 0 ; while (lpretval == dyrINV) { /* Scan to select an incoming variable x. If primalin cannot find a candidate, we're infeasible (or perhaps we've punted). We're not primal feasible (else tweakp1obj would have seen it). If we've punted, call dy_dealWithPunt to free up any potential candidates on the pivot rejection list and iterate to try again. */ startcol = nextcol ; scanresult = dy_primalin(startcol,scan,&candxj,&nextcol) ; switch (scanresult) { case dyrOK: { do_pivots = TRUE ; break ; } case dyrPUNT: { scanresult = dy_dealWithPunt() ; if (scanresult == dyrRESELECT) { continue ; } else { do_pivots = FALSE ; lpretval = scanresult ; } break ; } case dyrOPTIMAL: { do_pivots = FALSE ; lpretval = dyrINFEAS ; break ; } default: { do_pivots = FALSE ; lpretval = scanresult ; break ; } } /* Open the pivoting loop. While we have a candidate x for entry, we do a three-step: attempt the pivot with x (dy_primalpivot), then check that everything went off ok (dy_duenna), and finally check for feasibility and revise the objective. As part of updating the PSE pricing information, a new x will be selected (but note that changes in feasibility status may render this choice obsolete, forcing a reselect). There are two types of escapes from this loop: * We need to (re)select a candidate x for some reason. * We have a suspected termination condition --- optimality, infeasibility (or punt), unboundedness, or fatal error. The first action in the loop is to decide which way the incoming variable is moving, based on the variable's status and the sign of cbar. Arguably this could move into dy_primalpivot. */ for (xjndx = candxj ; do_pivots == TRUE ; xjndx = candxj) { # ifdef DYLP_PARANOIA if (xjndx <= 0) { errmsg(386,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,"entering") ; return (dyrFATAL) ; } # endif indir = 0 ; xjstatus = dy_status[xjndx] ; cbarj = dy_cbar[xjndx] ; if (cbarj <= 0 && flgon(xjstatus,vstatNBLB|vstatSB|vstatNBFR)) { indir = 1 ; } else if (cbarj > 0 && flgon(xjstatus,vstatNBUB|vstatSB|vstatNBFR)) { indir = -1 ; } # ifdef DYLP_PARANOIA else { errmsg(1,rtnnme,__LINE__) ; return (dyrFATAL) ; } # endif # ifndef DYLP_NDEBUG if (dy_opts->print.pricing >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: %s (%d), entering %s from %s, price = %g ... ", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, consys_nme(dy_sys,'v',xjndx,TRUE,NULL),xjndx, (indir < 0)?"decreasing":"increasing",dy_prtvstat(xjstatus), cbarj/sqrt(dy_gamma[xjndx])) ; } # endif /* Time to get down to business and attempt the pivot. dy_primalpivot does all the heavy lifting --- the actual pivot, plus updates of data structures and variables. Under normal conditions, we're looking for one of dyrOK (vanilla pivot) or dyrDEGEN (degenerate pivot), indicating a successful pivot and selection of a new candidate x. dyrOPTIMAL or dyrPUNT are less common, and indicate a successful pivot but failure to find a new x. Other possibilities are dyrUNBOUND, dyrREQCHK (suspected accuracy problems), dyrMADPIV (pivot rejection), and various errors, including dyrLOSTPFEAS, dyrSINGULAR, dyrBSPACE, and dyrFATAL. */ pivresult = dy_primalpivot(xjndx,indir, &xindx,&outdir,&abarij,&delta,&candxj) ; # ifndef DYLP_NDEBUG if (dy_opts->print.phase1 >= 4) dy_logpivot(pivresult,xjndx,indir,cbarj,xindx,outdir,abarij,delta) ; # endif /* La Duenna makes sure the proprieties are observed and deals with any scandals. In the end, these are the cases to consider: * dyrOK: The pivot went through without a problem, or whatever went wrong has been dealt with transparently from La Duenna's point of view. Call tweakp1obj to tweak the objective. We might discover we're feasible, in which case call it optimal and try for termination. If tweakp1obj ends up resetting the reduced costs, escape to reselect, otherwise we'll go to the next pivot with the candidate selected by pseupdate. There are a few circumstances where no candidate will be selected (the pivot was a nonbasic swing, or primalout returned REQCHK), and these also require a reselect. dyrOPTIMAL, dyrPUNT are much like dyrOK (i.e., the pivot went through) but we also think we're optimal (i.e., we can't find an entering variable). If tweakp1obj says we're feasible, try for optimal termination, but if it says we're still infeasible, try for infeasible termination. dyrPUNT indicates there are potential pivots flagged with the NOPIVOT qualifier, but it's pointless to try them again. * dyrRESELECT: Whatever happened requires that we select a new entering variable. Most commonly, this indicates that primalout couldn't find a numerically stable pivot. Less commonly, new pivot candidates have been released from the pivot rejection list in response to a punt. Occasionally, something more exotic has happened (e.g., the basis has been patched due to singularity). Escape to the outer loop to reselect. * dyrUNBOUND: We'll kick this back to the caller if preoptimality confirms the condition. We need additional constraints. Remember the unbounded column. * dyrSWING: The primal variables are moving too far, too fast. dyrSWING is a recommendation that we pop out of simplex and try to add constraints. But we won't do this unless we've completed a minimum number of basis changes (currently hardwired to 10). * anything else: These are problems too severe to handle here; they, too, get kicked back to the calling routine. The main reason for enumerating return values here is to make sure we catch a code that was somehow overlooked --- it'll trigger an error message. In general, if we're going to continue the pivoting loop, neither do_pivots or lpretval should be changed. If we're just going to escape to the outer loop for reselection, we set do_pivots to FALSE and leave lpretval at dyrINV. To attempt to end phase I, lpretval must be properly set as well. */ duennaresult = dy_duenna(pivresult,xjndx,xindx,candxj,-1) ; switch (duennaresult) { case dyrOK: case dyrOPTIMAL: case dyrPUNT: { p1objresult = tweakp1obj(&reselect,candxj) ; switch (p1objresult) { case dyrINFEAS: { if (duennaresult == dyrOK) { if (candxj <= 0) reselect = TRUE ; if (reselect == TRUE || xindx == xjndx) do_pivots = FALSE ; } else { do_pivots = FALSE ; if (duennaresult == dyrPUNT) lpretval = dyrPUNT ; else lpretval = dyrINFEAS ; } break ; } case dyrOPTIMAL: { lpretval = dyrOPTIMAL ; do_pivots = FALSE ; break ; } case dyrFATAL: { errmsg(318,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,"tweak") ; do_pivots = FALSE ; lpretval = p1objresult ; break ; } default: { errmsg(7,rtnnme,__LINE__,"tweakp1obj code",p1objresult) ; do_pivots = FALSE ; lpretval = p1objresult ; break ; } } break ; } case dyrRESELECT: { do_pivots = FALSE ; break ; } case dyrUNBOUND: { do_pivots = FALSE ; lpretval = duennaresult ; dy_lp->ubnd.ndx = xjndx*indir ; dy_lp->ubnd.ratio = 0 ; break ; } case dyrSWING: { if (dy_lp->basis.pivs >= 10) { lpretval = duennaresult ; do_pivots = FALSE ; } break ; } case dyrACCCHK: case dyrSINGULAR: case dyrBSPACE: case dyrSTALLED: case dyrITERLIM: case dyrNUMERIC: case dyrFATAL: { do_pivots = FALSE ; lpretval = duennaresult ; break ; } default: { errmsg(7,rtnnme,__LINE__,"La Duenna return code", (int) duennaresult) ; do_pivots = FALSE ; lpretval = dyrFATAL ; break ; } } } /* End of the pivoting loop. Why are we out here? The simplest case is that we just want to reselect --- head back to the top of the loop from here. */ if (lpretval == dyrINV) continue ; /* Do we think we're optimal (feasible), infeasible, or unbounded? (I.e., we're reporting one of dyrOPTIMAL, dyrINFEAS, dyrUNBOUND, or dyrPUNT.) If so, check that we have the objective function correct. If it's out-of-date, bring it up-to-date, and head back to the top of the loop to try and reselect an entering variable. dyrSWING isn't subject to the previous checks --- we just want to pop out and try to augment the constraint system. verifyp1obj recalculates the primal variables but does not refactor unless it concludes the objective is incorrect (thus there is the potential for loss of primal feasibility in preoptimality). */ if (lpretval == dyrOPTIMAL || lpretval == dyrINFEAS || lpretval == dyrUNBOUND || lpretval == dyrPUNT) { p1objresult = verifyp1obj() ; switch (p1objresult) { case dyrOK: { break ; } case dyrRESELECT: { # ifndef DYLP_NDEBUG if (dy_opts->print.phase1 >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tfalse termination (%s) due to inconsistent objective", dy_prtdyret(lpretval)) ; dyio_outfmt(dy_logchn,dy_gtxecho, " at (%s)%d; rebuilding P1 objective.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; } # endif if (dy_initp1obj() == TRUE) { lpretval = dyrINV ; continue ; } errmsg(318,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,"reinitialise") ; p1objresult = dyrFATAL ; break ; } default: { p1objresult = dyrFATAL ; break ; } } if (p1objresult == dyrFATAL) return (dyrFATAL) ; } /* To get to here, we have a termination condition and the objective has been verified. We can take useful action for dyrOPTIMAL, dyrUNBOUND, dyrINFEAS, and dyrPUNT; everything else is bounced directly back to the caller. For all, the first thing to do is call preoptimality to factor the basis and do accuracy and feasibility checks. If we get back dyrOK, dyrPATCHED, or dyrLOSTDFEAS, then we have primal feasibility and we're out of here regardless of the lpretval code. (Dual feasibility or boundedness are nice, but not required). Force a return code of dyrOPTIMAL. If we get back dyrLOSTPFEAS, it's a little more complicated. If lpretval is dyrINFEAS or dyrUNBOUND, and the primal & dual feasibility status reported by preoptimality agrees, we can return. If lpretval is dyrPUNT, there are variables on the pivot rejection list, but dy_dealWithPunt has already concluded none of them can be used. If preoptimality shows dual feasibility, none of them would help in any event, and we can return dyrINFEAS with a clear conscience. Otherwise return dyrPUNT. Anything else means that the feasibility status has taken an unexpected turn. The working hypothesis is that we need to be more careful in selecting pivots for both factoring and pivoting, which we do by tightening the current value and lower bound for the pivot selection parameters. There are a number of cases which imply unexpected gain/loss of primal or dual feasibility, based on lpretval and the results of preoptimality. Messages may be generated for these, if DYLP_NDEBUG allows it. */ if (lpretval == dyrOPTIMAL || lpretval == dyrUNBOUND || lpretval == dyrINFEAS || lpretval == dyrPUNT) { optcnt++ ; # ifndef DYLP_NDEBUG uxpfeas = FALSE ; uxnpfeas = FALSE ; uxdfeas = FALSE ; uxndfeas = FALSE ; tmpretval = lpretval ; # endif preopresult = preoptimality(lpretval,&checks) ; switch (preopresult) { case dyrOK: case dyrPATCHED: case dyrLOSTDFEAS: { # ifndef DYLP_NDEBUG if (lpretval == dyrINFEAS || lpretval == dyrPUNT || lpretval == dyrUNBOUND) uxpfeas = TRUE ; if (preopresult == dyrLOSTDFEAS) { if (lpretval == dyrINFEAS) uxndfeas = TRUE ; } else { if (lpretval == dyrPUNT || lpretval == dyrUNBOUND) uxdfeas = TRUE ; } # endif lpretval = dyrOPTIMAL ; break ; } case dyrLOSTPFEAS: { # ifndef DYLP_NDEBUG if (lpretval == dyrOPTIMAL) uxnpfeas = TRUE ; # endif if (flgoff(checks,ladDUALFEAS)) { # ifndef DYLP_NDEBUG if (lpretval == dyrUNBOUND || lpretval == dyrPUNT) uxdfeas = TRUE ; # endif if (!(lpretval == dyrINFEAS || lpretval == dyrPUNT)) { (void) dy_setpivparms(+1,+1) ; lpretval = dyrINV ; } else { lpretval = dyrINFEAS ; } } else { if (lpretval == dyrUNBOUND || lpretval == dyrPUNT) { /* no action required */ } else { # ifndef DYLP_NDEBUG if (lpretval == dyrINFEAS) uxndfeas = TRUE ; # endif (void) dy_setpivparms(+1,+1) ; lpretval = dyrINV ; } } break ; } default: { lpretval = preopresult ; break ; } } /* Ok, we've done the necessary processing. There are two things to deal with now. If DYLP_NDEBUG permits, check for warnings about unexpected primal/dual (in)feasibility. If we're going to repeat (dyrINV), check that we haven't exceeded the repetition count. The warnings could be compacted, but this way we also get to see if the four variables have been set to a nonsense pattern. */ # ifndef DYLP_NDEBUG if (dy_opts->print.phase1 >= 2) { if (uxpfeas == TRUE) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tunexpected primal feasibility at iteration (%s)%d.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; } if (uxnpfeas == TRUE) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tunexpected loss of primal feasibility at iteration (%s)%d.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; } if (uxdfeas == TRUE) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tunexpected dual feasibility at iteration (%s)%d.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; } if (uxndfeas == TRUE) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tunexpected loss of dual feasibility at iteration (%s)%d.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; } } # endif if (lpretval == dyrINV) { if (optcnt > 15) { errmsg(387,rtnnme,dy_sys->nme, dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters,optcnt) ; lpretval = dyrFATAL ; } # ifndef DYLP_NDEBUG else { if (dy_opts->print.phase1 >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t(%s)%d: false termination (%s); resuming pivoting.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, dy_prtdyret(tmpretval)) ; } } # endif } } } /* We've finished the outer loop. If we're optimal (and hence headed for phase II of the simplex) we'll reinstall the phase II objective, recalculate the objective value, duals, and reduced costs, and reset the reference frame. This makes primal I transparent to the rest of the code, w.r.t. playing with the objective. But ... no sense in doing any of this if we're infeasible, unbounded, or otherwise. In this case, we'll be popping out of simplex entirely, and there's no sense trying to anticipate. */ if (dy_clrpivrej(NULL) != TRUE) lpretval = dyrFATAL ; if (dy_lp->degen > 0) (void) dy_degenout(0) ; if (lpretval == dyrOPTIMAL) { if (dy_swapobjs(dyPRIMAL2) == FALSE) { errmsg(318,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,"remove") ; return (dyrFATAL) ; } dy_calcduals() ; if (dy_calccbar() == FALSE) { errmsg(384,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters) ; return (dyrFATAL) ; } dy_lp->z = dy_calcobj() ; dy_pseinit() ; } # ifndef DYLP_NDEBUG if (lpretval == dyrUNBOUND && dy_opts->print.phase1 >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n [%s] (%s)%d: system is unbounded.", dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters) ; } # endif # ifdef DYLP_STATISTICS if (dy_stats != NULL) { dy_stats->p1.iters += dy_lp->p1.iters ; dy_stats->p1.pivs += dy_lp->p1.pivs ; } # endif return (lpretval) ; } static dyret_enum primal2 (void) /* Phase 2 of the primal simplex. The basic action is a simple loop: pivot (dy_primalpivot), then see what went wrong (dy_duenna). As a side effect of the pivot, dy_primalpivot returns the index of the preferred candidate, xjcand, to enter on the next pivot. The work in this routine goes into trying to deal with problems of pivot rejection. If the preferred candidate is rejected, dy_primalin is called to select a new incoming variable. As long as an incoming variable can be selected, and nothing fatal goes wrong, the inner pivoting loop continues. Exit from the inner loop occurs due to optimality, unboundedness, a punt, or a fatal error (of which there are many). Optimality and unboundedness are self-explanatory. We run a preoptimality check (refactor plus primal and dual feasibility checks) to confirm. Loss of dual feasibility causes a return to the pivoting loop. Loss of primal feasibility causes a reversion to phase I. A punt indicates that no incoming variable could be selected but there are variables flagged with the NOPIVOT qualifier. This can be indicated by dy_primalpivot or by dy_primalin. If preoptimality indicates loss of dual feasibility (it ignores NOPIVOT qualifiers when doing the check), we'll relax the pivot selection tolerance and try again to select a pivot. The tolerance is progressively relaxed until a successful pivot occurs, at which point it snaps back to the original tolerance. If we relax to the bogus number tolerance before managing a successful pivot, we abort. Parameters: none Returns: most of the dyret_enum codes. */ { dyret_enum lpretval,scanresult,pivresult,duennaresult,preopresult ; int startcol,scan,nextcol,candxj, xjndx,indir,xindx,outdir,optcnt ; double cbarj,abarij,delta ; bool do_pivots ; flags xjstatus,checks ; const char *rtnnme = "primal2" ; # ifndef DYLP_NDEBUG bool uxnpfeas,uxdfeas,uxndfeas ; dyret_enum tmpretval ; # endif # ifdef DYLP_PARANOIA if (dy_lp->degen != 0) { errmsg(317,rtnnme,dy_sys->nme,dy_lp->degen) ; return (dyrFATAL) ; } if (dy_lp->p2.iters != 0) { errmsg(5,rtnnme,"phase 2 iteration count",dy_lp->p2.iters) ; return (dyrFATAL) ; } # endif dy_lp->p2.pivs = 0 ; dy_lp->pivok = FALSE ; dy_lp->prev_pivok = FALSE ; lpretval = dyrINV ; /* Open the main loop. The purpose of this outer loop is to allow easy recovery from false indications of optimality or unboundedness, as well as some errors involving pivot selection. All the action happens at the bottom of the loop, after we fall out of the pivoting loop. Initialise a few variables and get going. */ if (dy_clrpivrej(NULL) != TRUE) return (dyrFATAL) ; optcnt = 0 ; scan = dy_opts->scan ; nextcol = 1 ; while (lpretval == dyrINV) { /* The first thing we need to do is a scan to select an incoming variable x. If primalin cannot find a candidate, we're optimal, or perhaps we've punted. Optimality falls into the default case. If we've punted, call dy_dealWithPunt to free up any potential candidates on the pivot rejection list and iterate to try again. */ startcol = nextcol ; scanresult = dy_primalin(startcol,scan,&candxj,&nextcol) ; switch (scanresult) { case dyrOK: { do_pivots = TRUE ; break ; } case dyrPUNT: { scanresult = dy_dealWithPunt() ; if (scanresult == dyrRESELECT) { continue ; } else { do_pivots = FALSE ; lpretval = scanresult ; } break ; } default: { do_pivots = FALSE ; lpretval = scanresult ; break ; } } /* Open the loop that executes pivots. While we have a candidate x for entry, we do a two-step: attempt the pivot with x (dy_primalpivot), then check that everything went off ok (dy_duenna). As part of updating the PSE pricing information, a new x will be selected, and we repeat the loop. There are two valid escapes from this loop: * We find optimality (no candidates for entry) or unboundedness (a direction of recession). * la Duenna aborts the problem (due to a problem it's not able to fix). The first action in the loop is to decide which way the incoming variable is moving, based on the variable's status and the sign of cbar. Arguably this should move into dy_primalpivot. */ for (xjndx = candxj ; do_pivots == TRUE ; xjndx = candxj) { # ifdef DYLP_PARANOIA if (xjndx <= 0) { errmsg(386,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,"entering") ; return (dyrFATAL) ; } # endif indir = 0 ; xjstatus = dy_status[xjndx] ; cbarj = dy_cbar[xjndx] ; if (cbarj <= 0 && flgon(xjstatus,vstatNBLB|vstatSB|vstatNBFR)) { indir = 1 ; } else if (cbarj > 0 && flgon(xjstatus,vstatNBUB|vstatSB|vstatNBFR)) { indir = -1 ; } # ifdef DYLP_PARANOIA else { errmsg(1,rtnnme,__LINE__) ; return (dyrFATAL) ; } # endif # ifndef DYLP_NDEBUG if (dy_opts->print.pricing >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: %s (%d), entering %s from %s, price = %g ... ", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, consys_nme(dy_sys,'v',xjndx,TRUE,NULL),xjndx, (indir < 0)?"decreasing":"increasing",dy_prtvstat(xjstatus), cbarj/sqrt(dy_gamma[xjndx])) ; } # endif /* Time to get down to business and attempt the pivot. dy_primalpivot does all the heavy lifting --- the actual pivot, plus updates of data structures and variables. Under normal conditions, we're looking for one of dyrOK (vanilla pivot) or dyrDEGEN (degenerate pivot), indicating a successful pivot and selection of a new candidate x. dyrOPTIMAL or dyrPUNT are less common, and indicate a successful pivot but failure to find a new x. Other possibilities are dyrUNBOUND, dyrREQCHK (suspected accuracy problems), dyrMADPIV (pivot rejection), and various errors, including dyrLOSTPFEAS, dyrSINGULAR, dyrBSPACE, and dyrFATAL. */ pivresult = dy_primalpivot(xjndx,indir, &xindx,&outdir,&abarij,&delta,&candxj) ; # ifndef DYLP_NDEBUG if (dy_opts->print.phase2 >= 4) dy_logpivot(pivresult,xjndx,indir,cbarj,xindx,outdir,abarij,delta) ; # endif /* La Duenna makes sure the proprieties are observed and deals with any scandals. In the end, there are four cases to distinguish: * dyrOK: The pivot went through without a problem, or whatever went wrong has been dealt with transparently from La Duenna's point of view. We'll go on to the next pivot using the candidate selected by dy_primalpivot. There are a few circumstances where no candidate will be selected (the pivot was a nonbasic swing, or primalout returned REQCHK), and these require we force a reselect. * dyrOPTIMAL, dyrPUNT, dyrUNBOUND: We'll want to escape the pivoting loop and run preoptimality. Depending on what it reports, we'll return to the caller or resume pivoting. Unbounded gets a case of its own so we can remember the unbounded column. Punt means there are potential pivots marked with the NOPIVOT qualifier. * dyrRESELECT: Whatever happened requires that we select a new entering variable. Most commonly, this indicates that primalout couldn't find a numerically stable pivot. Less commonly, new pivot candidates have been released from the pivot rejection list in response to a punt. Occasionally, something more exotic has happened (e.g., the basis has been patched due to singularity). Escape to the outer loop to reselect. * dyrSWING: The primal variables are moving too far, too fast. dyrSWING is a recommendation that we pop out of simplex and try to add constraints. But we won't do this unless we've completed a minimum number of basis changes (currently hardwired to 10). * Anything else: These are errors too severe to handle here; they get kicked back to the calling routine. The main reason for enumerating return values here is to make sure we catch a code that was somehow overlooked --- it'll trigger an error message. In general, if we're going to continue the pivoting loop, neither do_pivots or lpretval should be changed. If we're going to escape to the outer loop, lpretval must be properly set and do_pivots should be set to FALSE. */ duennaresult = dy_duenna(pivresult,xjndx,xindx,candxj,-1) ; switch (duennaresult) { case dyrOK: { if (candxj <= 0 || xjndx == xindx) do_pivots = FALSE ; break ; } case dyrRESELECT: { do_pivots = FALSE ; break ; } case dyrOPTIMAL: case dyrPUNT: { do_pivots = FALSE ; lpretval = duennaresult ; break ; } case dyrUNBOUND: { do_pivots = FALSE ; lpretval = duennaresult ; dy_lp->ubnd.ndx = xjndx*indir ; dy_lp->ubnd.ratio = 0 ; break ; } case dyrSWING: { if (dy_lp->basis.pivs >= 10) { lpretval = duennaresult ; do_pivots = FALSE ; } break ; } case dyrACCCHK: case dyrSINGULAR: case dyrBSPACE: case dyrSTALLED: case dyrITERLIM: case dyrLOSTPFEAS: case dyrNUMERIC: case dyrFATAL: { do_pivots = FALSE ; lpretval = duennaresult ; break ; } default: { errmsg(7,rtnnme,__LINE__,"La Duenna return code", (int) duennaresult) ; do_pivots = FALSE ; lpretval = dyrFATAL ; break ; } } } /* Why are we here? The simplest case is that we just need to select a new entering variable --- head back to the top of the loop from here. */ if (lpretval == dyrINV) continue ; /* Do we think we're optimal or unbounded? (I.e., we're reporting dyrOPTIMAL, dyrPUNT, or dyrUNBOUND.) If so, the first thing to do is call preoptimality to refactor and do accuracy and feasibility checks. If we have primal and dual feasibility (dyrOK, dyrPATCHED), we can return dyrOPTIMAL with a clear conscience. If preoptimality reports primal and dual feasibility for dyrUNBOUND or dyrPUNT, well, unexpected primal feasibility is always a pleasure, and we'll play along. dyrLOSTDFEAS is what we'd expect for dyrUNBOUND, so this is also a clean termination. dyrLOSTDFEAS with dyrPUNT says that there are variables on the pivot rejection list, but dy_dealWithPunt has already concluded nothing can be done to make them useable. Return dyrPUNT. Anything else means that the feasibility status has taken an unexpected turn. The working hypothesis is that we need to be more careful in selecting pivots for both factoring and pivoting, which we do by tightening the current value and lower bound for the pivot selection parameters. If we've lost primal feasibility, revert to phase I (dy_primal will take care of tightening the pivot selection parameters). If we've only lost dual feasibility, head back to the top of the loop to resume pivoting. */ if (lpretval == dyrOPTIMAL || lpretval == dyrUNBOUND || lpretval == dyrPUNT) { optcnt++ ; # ifndef DYLP_NDEBUG uxnpfeas = FALSE ; uxdfeas = FALSE ; uxndfeas = FALSE ; tmpretval = lpretval ; # endif preopresult = preoptimality(lpretval,&checks) ; switch (preopresult) { case dyrOK: case dyrPATCHED: { # ifndef DYLP_NDEBUG if (lpretval == dyrUNBOUND || lpretval == dyrPUNT) uxdfeas = TRUE ; # endif lpretval = dyrOPTIMAL ; break ; } case dyrLOSTPFEAS: { # ifndef DYLP_NDEBUG if (dy_opts->print.phase2 >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: lost primal feasibility.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; } uxnpfeas = TRUE ; if (flgon(checks,ladDUALFEAS)) { if (lpretval == dyrOPTIMAL) uxndfeas = TRUE ; } else { if (lpretval != dyrOPTIMAL) uxdfeas = TRUE ; } # endif lpretval = dyrLOSTPFEAS ; break ; } case dyrLOSTDFEAS: { if (lpretval == dyrUNBOUND || lpretval == dyrPUNT) { /* no action required */ } else if (lpretval == dyrOPTIMAL) { lpretval = dyrINV ; (void) dy_setpivparms(+1,+1) ; # ifndef DYLP_NDEBUG uxndfeas = TRUE ; # endif } break ; } default: { lpretval = preopresult ; break ; } } /* Ok, we've done the necessary processing. There are two things to deal with now. If DYLP_NDEBUG permits, check for warnings about unexpected primal/dual (in)feasibility. If we're going to repeat (dyrINV), check that we haven't exceeded the repetition count. The warnings could be compacted, but this way we also get to see if the four variables have been set to a nonsense pattern. */ # ifndef DYLP_NDEBUG if (dy_opts->print.phase2 >= 2) { if (uxnpfeas == TRUE) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tunexpected loss of primal feasibility at iteration (%s)%d.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; } if (uxdfeas == TRUE) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tunexpected dual feasibility at iteration (%s)%d.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; } if (uxndfeas == TRUE) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tunexpected loss of dual feasibility at iteration (%s)%d.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; } } # endif if (lpretval == dyrINV) { if (optcnt > 15) { errmsg(387,rtnnme,dy_sys->nme, dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters,optcnt) ; lpretval = dyrFATAL ; } # ifndef DYLP_NDEBUG else { if (dy_opts->print.phase2 >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tfalse termination (%s) at (%s)%d; resuming pivoting.", dy_prtdyret(tmpretval),dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters) ; } } # endif } } } /* We've finished the outer loop. Clean up before we leave. */ if (dy_clrpivrej(NULL) != TRUE) lpretval = dyrFATAL ; if (dy_lp->degen > 0) (void) dy_degenout(0) ; # ifndef DYLP_NDEBUG if (dy_opts->print.phase2 >= 2) { if (lpretval == dyrUNBOUND) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n%s: system %s is unbounded.", rtnnme,dy_sys->nme) ; } else if (lpretval == dyrSWING) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n%s: system %s is pseudo-unbounded.", rtnnme,dy_sys->nme) ; } } # endif # ifdef DYLP_STATISTICS if (dy_stats != NULL) { dy_stats->p2.iters += dy_lp->p2.iters ; dy_stats->p2.pivs += dy_lp->p2.pivs ; } # endif return (lpretval) ; } lpret_enum dy_primal (void) /* This is the driver routine for the primal simplex algorithm. It expects that the problem will come in with an initial basis. The algorithm is two-phase, running phase I to attain feasibility, if needed, then running phase II to obtain optimality. Loss of feasibility in phase II will cause reentry into phase I. Presently there's a hardcoded limit of 10 occurrences before the code aborts. Parameters: none Returns: any of lpret_enum codes. */ { lpret_enum retval ; dyret_enum dyret ; int lostfeascnt ; const char *rtnnme = "dy_primal" ; retval = lpINV ; dy_lp->lpret = lpINV ; (void) dy_setpivparms(-100,-100) ; (void) dy_setpivparms(+1,+1) ; dy_lp->basis.pivs = 0 ; /* We open a loop here to allow for the possibility of returning to phase I if we loose feasibility in phase II. There's a limit on how many times we'll allow this, though. Run phase I if we need it. */ for (lostfeascnt = 0 ; lostfeascnt < 10 ; lostfeascnt++) { if (dy_lp->infeas > 0.0) { dy_lp->phase = dyPRIMAL1 ; dy_lp->p1.iters = 0 ; dyret = primal1() ; # ifndef DYLP_NDEBUG if ((dy_opts->print.phase1 >= 2) || (dy_opts->print.phase1 >= 1 && dyret != dyrOPTIMAL)) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: primal phase I ended, %d pivots, status %s.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, dy_lp->p1.pivs,dy_prtdyret(dyret)) ; } if (dy_opts->print.major >= 1 && dyret == dyrOPTIMAL) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\n%s (%s): entering phase %s, iter %d.", "dylp",dy_sys->nme,dy_prtlpphase(dyPRIMAL2,FALSE), dy_lp->tot.iters) ; } # endif # ifdef DYLP_STATISTICS if (dy_stats != NULL && dyret == dyrOPTIMAL) { dy_stats->phasecnts[dyPRIMAL2]++ ; } # endif } else { dyret = dyrOPTIMAL ; } if (dyret != dyrOPTIMAL) break ; /* Phase I succeeded, so we can go on to phase II. Call primal2 to do the work. */ # ifndef DYLP_NDEBUG if (dy_opts->print.phase2 >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: entering primal phase II, z = %g", rtnnme,dy_lp->z) ; if (dy_opts->print.phase2 >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho, ", dual active yb = %g",dy_calcdualobj()) ; } dyio_outchr(dy_logchn,dy_gtxecho,'.') ; } # endif dy_lp->phase = dyPRIMAL2 ; dy_lp->simplex.active = dyPRIMAL2 ; dy_lp->p2.iters = 0 ; dyret = primal2() ; /* What do we have? Optimality is best, but unboundedness is also possible. Loss of feasibility takes us back to phase I again. Anything else is an error. Only loss of feasibility iterates the loop. Tighten up the minimum pivot selection parameters, perhaps we can avoid this next time around. Force dyPRIMAL1 as the phase for the benefit of paranoid checks on status inside forcesuperbasic. */ if (dyret == dyrLOSTPFEAS) { # ifndef DYLP_NDEBUG if (dy_opts->print.phase2 >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: lost feasibility by %g after %d pivots; ", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, dy_lp->infeas,dy_lp->p2.pivs) ; if (lostfeascnt+1 < 10) dyio_outfmt(dy_logchn,dy_gtxecho,"returning to phase I for try %d.", lostfeascnt+2) ; else dyio_outfmt(dy_logchn,dy_gtxecho,"aborting after %d tries.", lostfeascnt+1) ; } # endif if (lostfeascnt+1 < 10) { dy_lp->phase = dyPRIMAL1 ; if (forcesuperbasic() == FALSE) { errmsg(391,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters) ; dyret = dyrFATAL ; break ; } (void) dy_setpivparms(0,+1) ; } continue ; } else { # ifndef DYLP_NDEBUG if ((dy_opts->print.phase2 >= 2) || (dy_opts->print.phase2 >= 1 && dyret != dyrOPTIMAL)) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: primal phase II ended, %d pivots, status %s.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, dy_lp->p2.pivs,dy_prtdyret(dyret)) ; } # endif break ; } } /* That's it. Why are we here? * If all went well, we have phase II optimality. * We could have infeasibility (phase I) or unboundedness (phase I or II). * We could have exceeded the occurrence limit for loss of feasibility. * We may have reached an iteration limit. * Something major went wrong. Take a minute to translate the dyret_enum code into an lpret_enum code and the do a bunch of printing. */ retval = dyret2lpret(dyret) ; # ifndef DYLP_NDEBUG if (retval == lpOPTIMAL || retval == lpUNBOUNDED || retval == lpINFEAS) { if ((dy_lp->phase == dyPRIMAL1 && dy_opts->print.phase1 >= 2) || (dy_lp->phase == dyPRIMAL2 && dy_opts->print.phase2 >= 2)) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n (%s)%d: ", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; dyio_outfmt(dy_logchn,dy_gtxecho,"%s ended, %d pivots, ", dy_prtlpphase(dy_lp->phase,FALSE),dy_lp->tot.pivs) ; if (retval == lpOPTIMAL) dyio_outfmt(dy_logchn,dy_gtxecho,"z = %g.",dy_lp->z) ; else if (retval == lpINFEAS) dyio_outfmt(dy_logchn,dy_gtxecho,"infeas = %g.",dy_lp->infeas) ; else dyio_outfmt(dy_logchn,dy_gtxecho,"unbounded.") ; } } else if (retval == lpLOSTFEAS) { if (dy_opts->print.phase2 >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: primal simplex aborted; lost feasibility %d times.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, lostfeascnt-1) ; } } else if (retval == lpITERLIM) { if ((dy_lp->phase == dyPRIMAL1 && dy_opts->print.phase1 >= 1) || (dy_lp->phase == dyPRIMAL2 && dy_opts->print.phase2 >= 1)) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: primal simplex terminated; iteration limit (%d).", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, dy_opts->iterlim) ; } } else { if ((dy_lp->phase == dyPRIMAL1 && dy_opts->print.phase1 >= 1) || (dy_lp->phase == dyPRIMAL2 && dy_opts->print.phase2 >= 1)) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n (%s)%d: ", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; dyio_outfmt(dy_logchn,dy_gtxecho,"%s failed, status %s after %d pivots.", dy_prtlpphase(dy_lp->phase,FALSE),dy_prtdyret(dyret), dy_lp->tot.pivs) ; } } /* For curiousity's sake, try the traditional certificate of optimality: dual objective == yb == cx == primal objective. */ if (dy_opts->print.phase2 >= 4 && retval == lpOPTIMAL) { double dualobj,primalobj ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: comparing dual and primal objectives.",rtnnme) ; dualobj = dy_calcdualobj() ; dyio_outfmt(dy_logchn,dy_gtxecho,"\n\tdual objective yb = %g.",dualobj) ; primalobj = dy_calcobj() ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tprimal objective cx = %g.",primalobj) ; if (!withintol(dualobj,primalobj,dy_tols->dchk)) dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tWHOOPS! yb - cx = %g - %g = %g > %g.", dualobj,primalobj,dualobj-primalobj,dy_tols->dchk) ; else dyio_outfmt(dy_logchn,dy_gtxecho,"\n\tobjectives match.") ; } # endif /* A last bit of substance --- set the return code & we're out of here. */ dy_lp->lpret = retval ; return (retval) ; } DyLP-1.6.0/DyLP/src/Dylp/dy_consys_utils.c0000644000076700007670000032620211026315405015173 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains utility routines for maintaining a constraint system data structure, tailored for LP-based branch-and-cut MILP algorithms. 'Architectural constraints' are the constraints included in the original problem statement; by analogy, 'architectural variables' are the variables in those constraints. 'Logical variables' are the various slack, surplus, and artificial variables that are added to the constraint system for ease of solving the LP. 'Cuts', or 'cutting planes', are additional constraints used in the course of (M)ILP. Column generation algorithms may add new architectural variables. Cutting planes may also add new architectural variables, and will come with their own associated logical variables. Consider now a system with n architectural variables, m constraints (architectural and/or cut), and m logical variables associated with the constraints. The design goals for supporting a LP algorithm are: * Efficient access by row (constraint) or by column (variable), in either sparse or expanded vector format. * Efficient 'compact' access -- constraints should be indexed 1..m with no gaps, and architectural variables should be indexed 1..n with no gaps. * A standard convention for deriving the index of the associated logical variable from the index of a constraint. * Efficient substitution of alternate objective, rhs, and bound vectors. * A compact handle for passing around a constraint system. The above are sufficient for simple LP, which sees a constant constraint system and solves it. Dynamic LP is more challenging, requiring the ability to work with a dynamically changing subsystem of the original constraint system. The implementation must provide support for addition and deletion of constraints and variables in such a way that maintenance of a basis and tracking the relationship between the original and partial systems can be done in a reasonably efficient manner. The branch-and-cut level imposes some additional goals: * Efficient addition and deletion of cutting planes (both the constraint and its associated logical variable). * Efficient access to a specified constraint or variable. The consys package maintains two classes of variables, architectural and logical. For reasons of efficiency (which will become clear below) we reverse the usual convention, numbering logicals from 1..m and architecturals from m+1..m+n. This permits efficient addition/deletion of constraints and architectural variables by reordering. The consys package also maintains two classes of constraints, architectural and cut. The constraint indices are a single compact set, with the indices of architectural constraints preceding the indices of cut constraints. Unlike the architectural/logical variable distinction, the architectural/ cut constraint distinction can be ignored by a client, if it so chooses. The addition/deletion of an architectural variable is handled as follows: * To add a variable at index k, the current occupant is moved to a newly created slot at index n+1 and the new variable is inserted at index k. * To delete a variable at index k, the variable is removed and the variable at index n is moved into the empty slot. In short, addition/deletion is handled by swapping between the add/delete location and the last architectural location. This gives a constant cost, independent of the size of the system. Addition and deletion of constraints can be handled in the same way, by swapping between the add/delete location and the last location. The logical variables are reordered to match and the appropriate move is made in the set of architectural variables. The extension to maintaining architectural and cut constraints as separate classes is straightforward. It's important to note that this would fail if consys actually stored architectural variables at indices 1..n and logicals at indices n+1..n+m. Adding an architectural variable would require freeing index n+1, which would imply moving the logical in slot n+1 to slot n+m+1. But because logical indices are derived from constraint indices, we can't reorder logicals without reordering the constraints. Now consider the effect on the constraint indices of moving the logical at position n+1 to position n+m+1 so that an architectural variable can take index n+1. Or moving from n+m to n-1 on deletion of an architectural. The only way to get it right is to physically move the whole set of logicals to open/close a hole at the end of the set of architecturals. This is just too expensive. In practice, an external client cannot specify the column for adding a variable or constraint. Additions always take place at the last position of a set; the client can only specify if the addition is an architectural variable, architectural constraint, or cut constraint. As a final comment, specifying access to a particular constraint or variable from the branch-and-cut level is trickier than it looks. Scenario: Cut (a) is added to the constraint array; suppose this gives a total of m constraints. Then cut (b) is deleted from pos'n k < m, and cut (a) is moved from pos'n m to pos'n k to maintain compactness. When it comes time to delete cut (a), we need to be able to specify it uniquely and find it, now that it's in pos'n k.) There's no solution in place yet; guess I'll cross that bridge when I come to it. The constraint system structure can be grouped into four components: * A header structure, which is the 'handle' used to pass the data structure; * a constraint coefficient matrix; * a set of associated vectors * a list of attached vectors The set of associated vectors is comprised of: * constraint and variable type vectors; * an objective function vector; * a rhs vector, and (when required) a 'range' rhs vector, rhslow, for range constraints; * variable upper and lower bounds; * constraint upper and lower bounds (for the lhs of constraints; this is used by the arc consistency algorithms). The constraint matrix is the only integral part. The header contains pointers to the other components, which can be swapped with relative ease. The only real difference between associated and attached vectors is that there are dedicated pointers in the constraint system header for the associated vectors. The list of attached vectors is intended to address the problem of dynamic resizing. On one hand, it's desireable to have no a priori limit on, say, the number of cuts that can be added. But if the client has a number of alternate rhs vectors being used with this constraint system, they must also be resized when the constraint system is resized. The list of attached vectors addresses this -- vectors on the list are resized with the constraint system. Since the vector might be moved by realloc, each vector has a list of pointers which should be rewritten if the vector is moved. Extreme coefficients are always a problem, at both ends. The infinitesimal is easier, in some sense. By fiat, |a| < 1.0e-20 is dropped. The infinite is harder. There's far too much code out there that thinks that infinity should be a large finite number (typically, the maximum double precision floating point value, DBL_MAX) rather than the IEEE FP standard value for infinity. Finite and infinite infinity simply do not play well together. So that we can implement scaling and avoid scaling finite infinity, you need to tell consys_create what you plan to use for infinity. At some point, it may become obvious that the same should apply at the infinitesimal end. Don't get me started on NaN. Or numeric_limits in C++. */ #include "dylib_errs.h" #include "dylib_io.h" #include "dylib_std.h" #include "dylib_strrtns.h" #include "dy_consys.h" static char sccsid[] UNUSED = "@(#)dy_consys_utils.c 4.7 10/15/05" ; static char svnid[] UNUSED = "$Id: dy_consys_utils.c 240 2008-06-18 23:32:21Z lou $" ; /* Default constraint system constants */ #define ARCHC_DFLT 2500 #define CUT_DFLT 500 #define ARCHV_DFLT 1000 #define EXPAND_MIN_DFLT 10 #define EXPAND_PCT_DFLT .1 /* For debugging vector attach/detach. Defining this variable will cause a trace of attach / update / detach operations. #define DY_CONSYS_TRACE_ATTACH 1 */ static bool empty_col (consys_struct *consys, int colndx, bool *rescan) /* This routine removes the coefficients of a column. If one of the deleted coefficients belongs to the current maximum row, rescan will be set to TRUE. If DYLP_NDEBUG is not defined, a check for zero length columns can be activated with the CONSYS_WRNZERO flag. Since this is an internal routine, index range checks are active only when we're paranoid. Parameters: consys: The constraint system. colndx: Column to be emptied. rescan: (o) Set to TRUE if the column deletion affected the current maximum length row, FALSE otherwise. Returns: TRUE if the column is emptied without error, FALSE otherwise (paranoia only) */ { int rowndx ; colhdr_struct *colhdr ; rowhdr_struct *rowhdr ; coeff_struct *ccoeff,*rcoeff ; # if defined(DYLP_PARANOIA) || !defined(DYLP_NDEBUG) const char *rtnnme = "empty_column" ; # endif # ifdef DYLP_PARANOIA if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (FALSE) ; } if (consys->mtx.rows == NULL) { errmsg(101,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_ROWHDR)) ; return (FALSE) ; } if (consys->mtx.cols == NULL) { errmsg(101,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_COLHDR)) ; return (FALSE) ; } if (rescan == NULL) { errmsg(2,rtnnme,"rescan") ; return (FALSE) ; } if (colndx <= 0 || colndx > consys->varcnt) { errmsg(102,rtnnme,consys->nme,"column",colndx,1,consys->varcnt) ; return (FALSE) ; } # endif /* Empty the column by repeatedly delinking and freeing the coefficient next to the header. Flag for a rescan if we're unlucky enough to delete an element from the maximum length row. */ *rescan = FALSE ; colhdr = consys->mtx.cols[colndx] ; # ifdef DYLP_PARANOIA if (colhdr == NULL) { errmsg(103,rtnnme,consys->nme,"column",colndx) ; return (FALSE) ; } if (colndx != colhdr->ndx) { errmsg(126,rtnnme,consys->nme,"column",colhdr,colhdr->ndx,colndx,colhdr) ; return (FALSE) ; } # endif for (ccoeff = colhdr->coeffs ; ccoeff != NULL ; ccoeff = colhdr->coeffs) { colhdr->coeffs = ccoeff->colnxt ; rowhdr = ccoeff->rowhdr ; # ifdef DYLP_PARANOIA if (rowhdr == NULL) { errmsg(125,rtnnme,consys->nme,"rowhdr",ccoeff,"column", consys_nme(consys,'v',colndx,FALSE,NULL),colndx) ; return (FALSE) ; } # endif rowndx = rowhdr->ndx ; # ifdef DYLP_PARANOIA if (rowndx <= 0 || rowndx > consys->concnt) { errmsg(102,rtnnme,consys->nme,"row",rowndx,1,consys->concnt) ; return (FALSE) ; } if (consys->mtx.rows[rowndx] != rowhdr) { errmsg(126,rtnnme,consys->nme,"row",rowhdr,rowndx,rowndx, consys->mtx.rows[rowndx]) ; return (FALSE) ; } # endif if (rowndx == consys->maxrowndx) *rescan = TRUE ; if (rowhdr->coeffs == ccoeff) rowhdr->coeffs = ccoeff->rownxt ; else { for (rcoeff = rowhdr->coeffs ; rcoeff != NULL ; rcoeff = rcoeff->rownxt) if (rcoeff->rownxt == ccoeff) break ; # ifdef DYLP_PARANOIA if (rcoeff == NULL) { errmsg(119,rtnnme,consys->nme,rowndx,colndx,ccoeff->val, "column",colndx,"row",rowndx) ; return (FALSE) ; } # endif rcoeff->rownxt = ccoeff->rownxt ; } rowhdr->len-- ; # ifndef DYLP_NDEBUG if (rowhdr->len == 0 && flgon(consys->opts,CONSYS_WRNZERO)) warn(118,rtnnme,consys->nme,"row",rowhdr->nme,rowndx) ; # endif FREE(ccoeff) ; } consys->mtx.coeffcnt -= colhdr->len ; colhdr->len = 0 ; return (TRUE) ; } static bool empty_row (consys_struct *consys, int rowndx, bool *rescan) /* This routine removes the coefficients of a row. The structure and flow parallels empty_col, but there's really no way to reduce the amount of code by merging the two routines. If DYLP_NDEBUG is not defined, a check for zero length columns can be activated with the CONSYS_WRNZERO flag. Since this is an internal routine, index range checks are active only when we're paranoid. Parameters: consys: The constraint system. rowndx: Row to be emptied. rescan: (o) Set to TRUE if the row deletion affected the current maximum length column, FALSE otherwise. Returns: TRUE if the row is emptied without error, FALSE otherwise (paranoia only). */ { int colndx ; colhdr_struct *colhdr ; rowhdr_struct *rowhdr ; coeff_struct *ccoeff,*rcoeff ; # if defined(DYLP_PARANOIA) || !defined(DYLP_NDEBUG) const char *rtnnme = "empty_row" ; # endif # ifdef DYLP_PARANOIA if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (FALSE) ; } if (consys->mtx.rows == NULL) { errmsg(101,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_ROWHDR)) ; return (FALSE) ; } if (consys->mtx.cols == NULL) { errmsg(101,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_COLHDR)) ; return (FALSE) ; } if (rescan == NULL) { errmsg(2,rtnnme,"rescan") ; return (FALSE) ; } if (rowndx <= 0 || rowndx > consys->concnt) { errmsg(102,rtnnme,consys->nme,"row",rowndx,consys->concnt) ; return (FALSE) ; } # endif /* Empty the row by repeatedly delinking and freeing the coefficient next to the header. Flag for a rescan if we're unlucky enough to delete an element from the maximum length column. */ *rescan = FALSE ; rowhdr = consys->mtx.rows[rowndx] ; # ifdef DYLP_PARANOIA if (rowhdr == NULL) { errmsg(103,rtnnme,consys->nme,"row",rowndx) ; return (FALSE) ; } if (rowndx != rowhdr->ndx) { errmsg(126,rtnnme,consys->nme,"row",rowhdr,rowhdr->ndx,rowndx,rowhdr) ; return (FALSE) ; } # endif for (rcoeff = rowhdr->coeffs ; rcoeff != NULL ; rcoeff = rowhdr->coeffs) { rowhdr->coeffs = rcoeff->rownxt ; colhdr = rcoeff->colhdr ; # ifdef DYLP_PARANOIA if (colhdr == NULL) { errmsg(125,rtnnme,consys->nme,"colhdr",rcoeff,"row", consys_nme(consys,'c',rowndx,FALSE,NULL),rowndx) ; return (FALSE) ; } # endif colndx = colhdr->ndx ; # ifdef DYLP_PARANOIA if (colndx <= 0 || colndx > consys->varcnt) { errmsg(102,rtnnme,consys->nme,"column",colndx,1,consys->varcnt) ; return (FALSE) ; } if (consys->mtx.cols[colndx] != colhdr) { errmsg(126,rtnnme,consys->nme,"column",colhdr,colndx,colndx, consys->mtx.cols[colndx]) ; return (FALSE) ; } # endif if (colndx == consys->maxcolndx) *rescan = TRUE ; if (colhdr->coeffs == rcoeff) colhdr->coeffs = rcoeff->colnxt ; else { for (ccoeff = colhdr->coeffs ; ccoeff != NULL ; ccoeff = ccoeff->colnxt) if (ccoeff->colnxt == rcoeff) break ; # ifdef DYLP_PARANOIA if (ccoeff == NULL) { errmsg(119,rtnnme,consys->nme,rowndx,colndx,rcoeff->val, "row",rowndx,"column",colndx) ; return (FALSE) ; } # endif ccoeff->colnxt = rcoeff->colnxt ; } colhdr->len-- ; # ifndef DYLP_NDEBUG if (colhdr->len == 0 && flgon(consys->opts,CONSYS_WRNZERO)) warn(118,rtnnme,consys->nme,"column",colhdr->nme,colndx) ; # endif FREE(rcoeff) ; } consys->mtx.coeffcnt -= rowhdr->len ; rowhdr->len = 0 ; return (TRUE) ; } static bool move_col (consys_struct *consys, int fndx, int tndx) /* This routine relocates a column from position fndx to position tndx. It is assumed that there is space at tndx. The routine adjusts the column header and any relevant attached arrays. Since this is an internal routine, index range checks are active only if we're paranoid. Parameters: consys: The constraint matrix fndx: The 'from' index tndx: The 'to' index Returns: TRUE if the transfer completes without error, FALSE otherwise. The routine will not fail unless paranoid or debugging checks are enabled. */ { attvhdr_struct *attvhdr ; colhdr_struct *colhdr ; # ifdef DYLP_PARANOIA const char *rtnnme = "move_col" ; if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (FALSE) ; } if (consys->mtx.cols == NULL) { errmsg(101,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_COLHDR)) ; return (FALSE) ; } if (fndx <= 0 || fndx > consys->varcnt) { errmsg(102,rtnnme,consys->nme,"column",fndx,1,consys->varcnt) ; return (FALSE) ; } if (tndx <= 0 || tndx > consys->varcnt+1) { errmsg(102,rtnnme,consys->nme,"column",tndx,1,consys->varcnt+1) ; return (FALSE) ; } # endif /* Get the the column header and relocate the column. */ colhdr = consys->mtx.cols[fndx] ; consys->mtx.cols[tndx] = colhdr ; colhdr->ndx = tndx ; if (consys->maxcolndx == fndx) consys->maxcolndx = tndx ; if (consys->xzndx == fndx) consys->xzndx = tndx ; /* Walk the attached vectors list and make the corresponding change in any of the row vectors. */ for (attvhdr = consys->attvecs ; attvhdr != NULL ; attvhdr = attvhdr->nxt) { # ifdef DYLP_PARANOIA if (!(VALID_ATTVTYPE(attvhdr->what))) { errmsg(114,rtnnme,consys->nme,"attached",attvhdr->what) ; return (FALSE) ; } if (attvhdr->vec == NULL) { errmsg(127,rtnnme,consys->nme,attvhdr, consys_assocnme(NULL,attvhdr->what)) ; return (FALSE) ; } # endif if (flgon(attvhdr->what,CONSYS_ROWVEC)) memcpy(((char *) attvhdr->vec)+tndx*attvhdr->elsze, ((char *) attvhdr->vec)+fndx*attvhdr->elsze,attvhdr->elsze) ; } return (TRUE) ; } static bool move_row (consys_struct *consys, int fndx, int tndx) /* This routine relocates a row from position fndx to position tndx. It is assumed that there is space at tndx. The routine adjusts the row header and any relevant attached arrays. Since this is an internal routine, index range checks are active only if we're paranoid. Parameters: consys: The constraint matrix fndx: The 'from' index tndx: The 'to' index Returns: TRUE if the transfer completes without error, FALSE otherwise. The routine will not fail unless paranoid or debugging checks are enabled. */ { attvhdr_struct *attvhdr ; rowhdr_struct *rowhdr ; # ifdef DYLP_PARANOIA const char *rtnnme = "move_row" ; if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (FALSE) ; } if (consys->mtx.rows == NULL) { errmsg(101,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_ROWHDR)) ; return (FALSE) ; } if (fndx <= 0 || fndx > consys->concnt) { errmsg(102,rtnnme,consys->nme,"row",fndx,1,consys->concnt) ; return (FALSE) ; } if (tndx <= 0 || tndx > consys->concnt+1) { errmsg(102,rtnnme,consys->nme,"row",tndx,1,consys->concnt+1) ; return (FALSE) ; } # endif /* Get the the row header and relocate the row. */ rowhdr = consys->mtx.rows[fndx] ; consys->mtx.rows[tndx] = rowhdr ; rowhdr->ndx = tndx ; if (consys->maxrowndx == fndx) consys->maxrowndx = tndx ; if (consys->objndx == fndx) consys->objndx = tndx ; /* Walk the attached vectors and make the corresponding change in any of the column vectors. */ for (attvhdr = consys->attvecs ; attvhdr != NULL ; attvhdr = attvhdr->nxt) { # ifdef DYLP_PARANOIA if (!(VALID_ATTVTYPE(attvhdr->what))) { errmsg(114,rtnnme,consys->nme,"attached",attvhdr->what) ; return (FALSE) ; } if (attvhdr->vec == NULL) { errmsg(127,rtnnme,consys->nme,attvhdr, consys_assocnme(NULL,attvhdr->what)) ; return (FALSE) ; } # endif if (flgon(attvhdr->what,CONSYS_COLVEC)) memcpy(((char *) attvhdr->vec)+tndx*attvhdr->elsze, ((char *) attvhdr->vec)+fndx*attvhdr->elsze,attvhdr->elsze) ; } return (TRUE) ; } static bool find_maxes (consys_struct *consys, bool scan_cols, bool scan_rows) /* This routine scans the constraint matrix for the maximum length column and/or row, as indicated. Parameters: consys: The constraint matrix. scan_cols: TRUE if the maximum length column needs to be located. scan_rows: TRUE if the maximum length row needs to be located. Returns: TRUE if the scan completes without error, FALSE otherwise. The routine will not fail unless paranoid checks are enabled. */ { int colndx,rowndx ; # if defined(DYLP_PARANOIA) || !defined(DYLP_NDEBUG) const char *rtnnme = "find_maxes" ; # endif # ifdef DYLP_PARANOIA if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (FALSE) ; } if (consys->mtx.rows == NULL) { errmsg(101,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_ROWHDR)) ; return (FALSE) ; } if (consys->mtx.cols == NULL) { errmsg(101,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_COLHDR)) ; return (FALSE) ; } # endif /* Do the scans, as requested. */ if (scan_cols == TRUE) { consys->maxcollen = 0 ; for (colndx = 1 ; colndx <= consys->varcnt ; colndx++) { # ifdef DYLP_PARANOIA if (consys->mtx.cols[colndx] == NULL) { errmsg(103,rtnnme,consys->nme,"column",colndx) ; return (FALSE) ; } # endif # ifndef DYLP_NDEBUG if (consys->mtx.cols[colndx]->len == 0 && flgon(consys->opts,CONSYS_WRNZERO)) warn(118,rtnnme, consys->nme,"column",consys->mtx.cols[colndx]->nme,colndx) ; # endif if (consys->mtx.cols[colndx]->len > consys->maxcollen) { consys->maxcollen = consys->mtx.cols[colndx]->len ; consys->maxcolndx = colndx ; } } } if (scan_rows == TRUE) { consys->maxrowlen = 0 ; for (rowndx = 1 ; rowndx <= consys->concnt ; rowndx++) { # ifdef DYLP_PARANOIA if (consys->mtx.rows[rowndx] == NULL) { errmsg(103,rtnnme,consys->nme,"row",rowndx) ; return (FALSE) ; } # endif # ifndef DYLP_NDEBUG if (consys->mtx.rows[rowndx]->len == 0 && flgon(consys->opts,CONSYS_WRNZERO)) warn(118,rtnnme, consys->nme,"row",consys->mtx.rows[rowndx]->nme,rowndx) ; # endif if (consys->mtx.rows[rowndx]->len > consys->maxrowlen) { consys->maxrowlen = consys->mtx.rows[rowndx]->len ; consys->maxrowndx = rowndx ; } } } return (TRUE) ; } static bool add_logical (consys_struct *consys, int rowndx) /* This routine adds a logical variable appropriate for the constraint specified by rowndx. The routine assumes that its caller has arranged for the column at rowndx to be empty. It will create a new column header and coefficient, and fill in the various associated arrays. The conventions are as follows: Constraint Logical Coefficient Bounds LE slack 1.0 0 <= slack <= +inf EQ artificial 1.0 0 <= artificial <= 0 GE surplus -1.0 0 <= surplus <= +inf RNG slack 1.0 0 <= slack <= (rhs-rhslow) To properly set up an artificial variable, the vub array must be present. To properly set up a slack for a range constraint, the rhs, rhslow, and vub arrays must be present. Parameters: consys: constraint system rowndx: constraint receiving the logical variable. Returns: TRUE if the logical is successfully created, FALSE if there are problems. */ { int colndx ; colhdr_struct *colhdr ; rowhdr_struct *rowhdr ; coeff_struct *coeff ; contyp_enum contyp ; double val, lb, ub ; char *nme ; const char *rtnnme = "add_logical" ; /* consys_io.c */ extern char *consys_lognme(consys_struct *consys, int rowndx, char *clientbuf) ; # ifdef DYLP_PARANOIA /* The usual, and checks that some necessary associated arrays are present. This is an internal routine, so index bounds checks are dropped unless we're being paranoid. */ if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (FALSE) ; } if (consys->mtx.rows == NULL) { errmsg(101,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_ROWHDR)) ; return (FALSE) ; } if (consys->ctyp == NULL) { errmsg(101,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_CTYP)) ; return (FALSE) ; } if (rowndx <= 0 || rowndx > consys->concnt) { errmsg(102,rtnnme,consys->nme,"row",rowndx,1,consys->concnt) ; return (FALSE) ; } if (consys->mtx.rows[rowndx] == NULL) { errmsg(103,rtnnme,consys->nme,"row",rowndx) ; return (FALSE) ; } if (consys->mtx.cols == NULL) { errmsg(101,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_COLHDR)) ; return (FALSE) ; } if (consys->vtyp == NULL) { errmsg(101,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_VTYP)) ; return (FALSE) ; } # endif /* Construct a name, coefficient and upper and lower bounds, based on the type of constraint. */ nme = consys_lognme(consys,rowndx,NULL) ; rowhdr = consys->mtx.rows[rowndx] ; val = 1.0 ; lb = 0.0 ; ub = consys->inf ; contyp = consys->ctyp[rowndx] ; switch (contyp) { case contypLE: { break ; } case contypEQ: { if (consys->vub != NULL) ub = 0.0 ; else { errmsg(120,rtnnme,consys->nme,nme,rowhdr->nme,rowndx) ; return (FALSE) ; } break ; } case contypGE: { val = -1.0 ; break ; } case contypRNG: { if (consys->rhs != NULL && consys->rhslow != NULL && consys->vub != NULL) { ub = consys->rhs[rowndx]-consys->rhslow[rowndx] ; } else { errmsg(120,rtnnme,consys->nme,nme,rowhdr->nme,rowndx) ; return (FALSE) ; } break ; } default: { errmsg(1,rtnnme,__LINE__) ; return (FALSE) ; } } # ifdef DYLP_PARANOIA if (consys->varcnt+1 > consys->colsze) { errmsg(129,rtnnme,consys->nme,nme,rowndx,consys->varcnt+1, "variables",consys->colsze) ; return (FALSE) ; } # endif /* Initialise the column header, install the coefficient in the constraint, and set values in the associated arrays. The previous checks guarantee that the arrays are present if they're really needed. You wouldn't think we'd need to check maxcollen here, but creating constraint systems in the presence of lots of fixed variables can leads to seriously degenerate situations. */ colndx = rowndx ; colhdr = (colhdr_struct *) CALLOC(1,sizeof(colhdr_struct)) ; consys->mtx.cols[colndx] = colhdr ; colhdr->ndx = colndx ; colhdr->nme = STRALLOC(nme) ; coeff = (coeff_struct *) MALLOC(sizeof(coeff_struct)) ; coeff->rowhdr = rowhdr ; coeff->colhdr = colhdr ; coeff->val = val ; coeff->colnxt = colhdr->coeffs ; colhdr->coeffs = coeff ; colhdr->len = 1 ; if (consys->maxcollen == 0) { consys->maxcollen = 1 ; consys->maxcolndx = colndx ; } coeff->rownxt = rowhdr->coeffs ; rowhdr->coeffs = coeff ; rowhdr->len++ ; if (rowhdr->len > consys->maxrowlen) { consys->maxrowlen = rowhdr->len ; consys->maxrowndx = rowndx ; } consys->mtx.coeffcnt++ ; consys->logvcnt++ ; consys->varcnt++ ; consys->vtyp[colndx] = vartypCON ; if (consys->obj != NULL) consys->obj[colndx] = 0.0 ; if (consys->vlb != NULL) consys->vlb[colndx] = 0.0 ; if (consys->vub != NULL) consys->vub[colndx] = ub ; return (TRUE) ; } consys_struct *consys_create (const char *nme, flags parts, flags opts, int concnt, int varcnt, double infinity) /* This routine initialises a constraint system data structure, returning a pointer to the header. The parameters varcnt and concnt can be used to set the initial size of the structure; they are interpreted as follows: <= 0: use default sizes > 0: use parameter value Parameters: nme: the name of the constraint system parts: flags indicating which of the associated vectors should be created opts: flags indicating which options should be set varcnt: the expected number of variables concnt: the expected number of constraints infinity: the value to be used as infinity Returns: pointer to the header. */ { int colsze,rowsze ; consys_struct *consys ; const char *rtnnme = "consys_create" ; /* Set the row and column sizes. */ if (concnt > 0) rowsze = concnt ; else rowsze = ARCHC_DFLT+CUT_DFLT ; if (varcnt > 0) colsze = varcnt ; else colsze = ARCHV_DFLT ; if (flgon(opts,CONSYS_LVARS)) colsze += rowsze ; /* Create the header and initialise the non-pointer fields as needed. We're counting on calloc to clear the allocated space, so that the parts field is clear and the associated vector pointers are null. */ consys = (consys_struct *) CALLOC(1,sizeof(consys_struct)) ; if (nme == NULL) consys->nme = STRALLOC("<>") ; else consys->nme = STRALLOC(nme) ; consys->opts = opts ; consys->inf = infinity ; consys->tiny = 1.0e-20 ; if (finite(infinity)) setflg(consys->opts,CONSYS_FININF) ; consys->colsze = colsze ; consys->rowsze = rowsze ; /* Do up the constraint matrix headers next. */ consys->mtx.cols = (colhdr_struct **) CALLOC(colsze+1,sizeof(colhdr_struct *)) ; consys->mtx.rows = (rowhdr_struct **) CALLOC(rowsze+1,sizeof(rowhdr_struct *)) ; /* Now add any requested associated vectors. */ #define CONSYS_MKASSOC(zz_flg_zz,zz_type_zz,zz_ptr_zz) \ if (flgon(parts,zz_flg_zz)) \ { if (consys_attach(consys,zz_flg_zz, \ sizeof(zz_type_zz),(void **) &zz_ptr_zz) == FALSE) \ { errmsg(100,rtnnme,consys->nme,consys_assocnme(NULL,zz_flg_zz)) ; \ return (NULL) ; } \ setflg(consys->parts,zz_flg_zz) ; \ clrflg(parts,zz_flg_zz) ; } CONSYS_MKASSOC(CONSYS_OBJ,double,consys->obj) CONSYS_MKASSOC(CONSYS_VTYP,vartyp_enum,consys->vtyp) CONSYS_MKASSOC(CONSYS_VUB,double,consys->vub) CONSYS_MKASSOC(CONSYS_VLB,double,consys->vlb) CONSYS_MKASSOC(CONSYS_RHS,double,consys->rhs) CONSYS_MKASSOC(CONSYS_RHSLOW,double,consys->rhslow) CONSYS_MKASSOC(CONSYS_CTYP,contyp_enum,consys->ctyp) CONSYS_MKASSOC(CONSYS_CUB,conbnd_struct,consys->cub) CONSYS_MKASSOC(CONSYS_CLB,conbnd_struct,consys->clb) CONSYS_MKASSOC(CONSYS_RSCALE,double,consys->rowscale) CONSYS_MKASSOC(CONSYS_CSCALE,double,consys->colscale) #undef CONSYS_MKASSOC # ifndef DYLP_NDEBUG if (parts != 0) { errmsg(114,rtnnme,consys->nme,"associated",parts) ; } # endif return (consys) ; } bool consys_dupsys (consys_struct *src, consys_struct **p_dst, flags dstvecs) /* This routine duplicates a constraint system, including the coefficient matrix and those associated vectors specified by dstvecs which exist in the source system. The algorithm is to first create an empty constraint system with allocated size equal to the original. The new header is touched up with information from the source. Empty rows are created in the new system by walking the row header of the source and calling addrow_pk for each row. The columns are filled in using getcol_pk and addcol_pk to copy from the source to the destination. Finally, the specified associated vectors are block copied. Parameters: src: the constraint system to be duplicated p_dst: (o) the duplicate constraint system dstvecs: flags indicating the associated vectors that are to be duplicated. Returns: TRUE if the duplication completes without error, FALSE otherwise. */ { int i,j ; char ac ; pkvec_struct *pkvec ; consys_struct *dst ; const char *rtnnme = "consys_dupsys" ; # ifdef DYLP_PARANOIA if (src == NULL) { errmsg(2,rtnnme,"src") ; return (FALSE) ; } if (p_dst == NULL) { errmsg(2,rtnnme,"&dst") ; return (FALSE) ; } # endif *p_dst = NULL ; /* For a start, create an empty system with the proper allocated size and associated vectors. We're only interested in the vectors that actually exist in the source. */ dstvecs = dstvecs & src->parts ; dst = consys_create(src->nme,dstvecs,0,src->rowsze,src->colsze,src->inf) ; if (dst == NULL) { errmsg(152,rtnnme,src->nme) ; return (FALSE) ; } /* Copy various header fields from the source system. The reason that src->opts is not used to create dst is that it may contain CONSYS_LVARS, which would complicate the calculation of allocated size. */ dst->opts = src->opts ; dst->maxaij = src->maxaij ; dst->minaij = src->minaij ; if (src->objnme != NULL) dst->objnme = STRALLOC(src->objnme) ; dst->objndx = src->objndx ; dst->xzndx = src->xzndx ; /* Walk the row header of src and add empty rows to dst. */ pkvec = pkvec_new(0) ; for (i = 1 ; i <= src->concnt ; i++) { pkvec->nme = src->mtx.rows[i]->nme ; if (i <= src->archccnt) ac = 'a' ; else ac = 'c' ; if (consys_addrow_pk(dst,ac,src->ctyp[i],pkvec,0.0,0.0,NULL,NULL) == FALSE) { errmsg(156,rtnnme,"row",dst->nme,pkvec->nme) ; if (pkvec != NULL) pkvec_free(pkvec) ; consys_free(dst) ; return (FALSE) ; } # ifdef DYLP_PARANOIA if (i != pkvec->ndx) { errmsg(136,rtnnme,src->nme,"loss of synch","rows",i,pkvec->ndx) ; if (pkvec != NULL) pkvec_free(pkvec) ; consys_free(dst) ; return (FALSE) ; } # endif } if (pkvec != NULL) pkvec_free(pkvec) ; /* Add the coefficients, column by column. */ pkvec = pkvec_new(src->maxcollen) ; for (j = 1 ; j <= src->varcnt ; j++) { if (consys_getcol_pk(src,j,&pkvec) == FALSE) { errmsg(122,rtnnme,src->nme,"column",consys_nme(src,'v',j,TRUE,NULL),j) ; if (pkvec != NULL) pkvec_free(pkvec) ; consys_free(dst) ; return (FALSE) ; } if (consys_addcol_pk(dst,src->vtyp[j],pkvec,0.0,0.0,0.0) == FALSE) { errmsg(156,rtnnme,"column",dst->nme,pkvec->nme) ; if (pkvec != NULL) pkvec_free(pkvec) ; consys_free(dst) ; return (FALSE) ; } # ifdef DYLP_PARANOIA if (j != pkvec->ndx) { errmsg(136,rtnnme,src->nme,"loss of synch","columns",i,pkvec->ndx) ; if (pkvec != NULL) pkvec_free(pkvec) ; consys_free(dst) ; return (FALSE) ; } # endif } if (pkvec != NULL) pkvec_free(pkvec) ; # ifdef DYLP_PARANOIA if (src->mtx.coeffcnt != dst->mtx.coeffcnt) { errmsg(136,rtnnme,src->nme,"coefficient count mismatch","columns", src->mtx.coeffcnt,dst->mtx.coeffcnt) ; consys_free(dst) ; return (FALSE) ; } # endif /* Force copy to use the same maximum row and column indices as the original. (The difference arises from insertion order of columns.) */ dst->maxrowndx = src->maxrowndx ; dst->maxcolndx = src->maxcolndx ; /* Copy the associated vectors. */ if (flgon(dstvecs,CONSYS_OBJ)) memcpy(dst->obj,src->obj,(src->varcnt+1)*sizeof(double)) ; if (flgon(dstvecs,CONSYS_VUB)) memcpy(dst->vub,src->vub,(src->varcnt+1)*sizeof(double)) ; if (flgon(dstvecs,CONSYS_VLB)) memcpy(dst->vlb,src->vlb,(src->varcnt+1)*sizeof(double)) ; if (flgon(dstvecs,CONSYS_VTYP)) memcpy(dst->vtyp,src->vtyp,(src->varcnt+1)*sizeof(vartyp_enum)) ; if (flgon(dstvecs,CONSYS_CSCALE)) memcpy(dst->colscale,src->colscale,(src->varcnt+1)*sizeof(double)) ; if (flgon(dstvecs,CONSYS_RHS)) memcpy(dst->rhs,src->rhs,(src->concnt+1)*sizeof(double)) ; if (flgon(dstvecs,CONSYS_RHSLOW)) memcpy(dst->rhslow,src->rhslow,(src->concnt+1)*sizeof(double)) ; if (flgon(dstvecs,CONSYS_CUB)) memcpy(dst->cub,src->cub,(src->concnt+1)*sizeof(conbnd_struct)) ; if (flgon(dstvecs,CONSYS_CLB)) memcpy(dst->clb,src->clb,(src->concnt+1)*sizeof(conbnd_struct)) ; if (flgon(dstvecs,CONSYS_CTYP)) memcpy(dst->ctyp,src->ctyp,(src->concnt+1)*sizeof(contyp_enum)) ; if (flgon(dstvecs,CONSYS_RSCALE)) memcpy(dst->rowscale,src->rowscale,(src->concnt+1)*sizeof(double)) ; *p_dst = dst ; return (TRUE) ; } void consys_free (consys_struct *consys) /* This routine frees the space allocated for a constraint system. Sigh. The trouble with complex data structures is they're a pain to disassemble. Parameter: consys: constraint system Returns: undefined */ { int ndx ; attvhdr_struct *attvhdr ; lnk_struct *lnk ; colhdr_struct *colhdr ; rowhdr_struct *rowhdr ; coeff_struct *coeff ; # ifdef DYLP_PARANOIA const char *rtnnme = "consys_free" ; if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return ; } # endif /* Start by dismantling the attached vector list. */ for (attvhdr = consys->attvecs ; attvhdr != NULL ; attvhdr = consys->attvecs) { consys->attvecs = attvhdr->nxt ; for (lnk = attvhdr->pveclst ; lnk != NULL ; lnk = attvhdr->pveclst) { attvhdr->pveclst = lnk->llnxt ; FREE(lnk) ; } FREE(attvhdr) ; } /* Take care of the associated vectors. */ if (consys->obj != NULL) FREE(consys->obj) ; if (consys->vtyp != NULL) FREE(consys->vtyp) ; if (consys->vub != NULL) FREE(consys->vub) ; if (consys->vlb != NULL) FREE(consys->vlb) ; if (consys->rhs != NULL) FREE(consys->rhs) ; if (consys->rhslow != NULL) FREE(consys->rhslow) ; if (consys->ctyp != NULL) FREE(consys->ctyp) ; if (consys->cub != NULL) FREE(consys->cub) ; if (consys->clb != NULL) FREE(consys->clb) ; if (consys->rowscale != NULL) FREE(consys->rowscale) ; if (consys->colscale != NULL) FREE(consys->colscale) ; /* Now dismantle the constraint matrix. Walk the column header array, freeing the coefficients and header for each column. Then walk the row header array, freeing the header for each row. Finally, free the column and row header arrays and the matrix header. */ for (ndx = 1 ; ndx <= consys->varcnt ; ndx++) { colhdr = consys->mtx.cols[ndx] ; for (coeff = colhdr->coeffs ; coeff != NULL ; coeff = colhdr->coeffs) { colhdr->coeffs = coeff->colnxt ; FREE(coeff) ; } if (colhdr->nme != NULL) STRFREE(colhdr->nme) ; FREE(colhdr) ; } for (ndx = 1 ; ndx <= consys->concnt ; ndx++) { rowhdr = consys->mtx.rows[ndx] ; if (rowhdr->nme != NULL) STRFREE(rowhdr->nme) ; FREE(rowhdr) ; } FREE(consys->mtx.cols) ; FREE(consys->mtx.rows) ; /* Finish up with the constraint system header. */ if (consys->objnme != NULL) STRFREE(consys->objnme) ; if (consys->nme != NULL) STRFREE(consys->nme) ; FREE(consys) ; return ; } bool consys_attach (consys_struct *consys, flags what, int elsze, void **pvec) /* This routine 'attaches' a vector (more specifically, a reference to it) to the constraint system so that the vector and references will be automatically resized when the constraint system is resized. If *pvec is null, a vector of appropriate size is created. If the vector pointed to by pvec isn't already on the attvecs list, a new entry is created. Then pvec is added to the list of pointers referring to the vector. The expectation is that this list will never become very big, so there's no particular attempt to keep the entries in order. If DYLP_NDEBUG is not set and the WRNATT flag is set, a warning will be issued if the attach request specifies a (pointer,vector) pair already attached to the system. Parameters: consys: constraint system what: type of vector being attached elsze: the size of an element in the vector pvec: (i) address of pointer to the vector; if *pvec == NULL, a vector will be created (o) *pvec holds address of vector Returns: TRUE if the attachment is successful, FALSE otherwise (paranoia only). */ { int ndx ; attvhdr_struct *attvhdr ; lnk_struct *lnk ; double *dvec ; # if defined(DYLP_PARANOIA) || !defined(DYLP_NDEBUG) const char *rtnnme = "consys_attach" ; # endif # ifdef DYLP_PARANOIA if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (FALSE) ; } if (pvec == NULL) { errmsg(2,rtnnme,"&vec") ; return (FALSE) ; } if (!(VALID_ATTVTYPE(what))) { errmsg(6,rtnnme,"vector type",what) ; return (FALSE) ; } if (elsze <= 0) { errmsg(5,rtnnme,"element size",elsze) ; return (FALSE) ; } # endif /* Have a look at vec, and create one if we need to. Otherwise, look through the list of attached vectors to see if there's already a header for this vector (and we're just adding another pointer to it). Remember, colsze is the allocated column capacity, hence the size of a row; similarly for rowsze. */ if (*pvec == NULL) { if (flgon(what,CONSYS_ROWVEC)) { *pvec = (void *) CALLOC(consys->colsze+1,elsze) ; } else { *pvec = (void *) CALLOC(consys->rowsze+1,elsze) ; } if (flgon(what,CONSYS_VUB)) { dvec = (double *) *pvec ; dvec[0] = 0.0 ; for (ndx = 1 ; ndx <= consys->colsze ; ndx++) { dvec[ndx] = consys->inf ; } } else if (flgon(what,CONSYS_CSCALE)) { dvec = (double *) *pvec ; dvec[0] = 0.0 ; for (ndx = 1 ; ndx <= consys->colsze ; ndx++) dvec[ndx] = 1.0 ; } else if (flgon(what,CONSYS_RSCALE)) { dvec = (double *) *pvec ; dvec[0] = 0.0 ; for (ndx = 1 ; ndx <= consys->rowsze ; ndx++) dvec[ndx] = 1.0 ; } attvhdr = NULL ; } else { for (attvhdr = consys->attvecs ; attvhdr != NULL ; attvhdr = attvhdr->nxt) if (attvhdr->vec == *pvec) break ; } /* If we didn't find a header, create one now. */ if (attvhdr == NULL) { attvhdr = (attvhdr_struct *) MALLOC(sizeof(attvhdr_struct)) ; attvhdr->what = what ; attvhdr->elsze = elsze ; attvhdr->vec = *pvec ; attvhdr->pveclst = NULL ; attvhdr->nxt = consys->attvecs ; consys->attvecs = attvhdr ; } # ifdef DYLP_PARANOIA else { if (attvhdr->what != what) { errmsg(1,rtnnme,__LINE__) ; return (FALSE) ; } } # endif /* Make an entry for pvec. If there's already an entry, consider warning the user. */ for (lnk = attvhdr->pveclst ; lnk != NULL ; lnk = lnk->llnxt) if (pvec == (void **) lnk->llval) break ; if (lnk == NULL) { lnk = (lnk_struct *) MALLOC(sizeof(lnk_struct)) ; lnk->llval = (void *) pvec ; lnk->llnxt = attvhdr->pveclst ; attvhdr->pveclst = lnk ; } # ifndef DYLP_NDEBUG else { if (flgon(consys->opts,CONSYS_WRNATT)) warn(107,rtnnme,consys_assocnme(consys,what),*pvec,pvec) ; } # endif # if DY_CONSYS_TRACE_ATTACH dyio_outfmt(IOID_NOSTRM,TRUE,"\n [%s] Attached",consys->nme) ; dyio_outfmt(IOID_NOSTRM,TRUE," vec = %#0x, ref = %#0x.",*pvec,pvec) ; # endif return (TRUE) ; } bool consys_update (consys_struct *consys, void *old, void *new) /* This routine looks up the entry for the vector specified by old and updates all the references with the vector in new. In effect, the old vector is detached from the constraint system and the new one attached in its place. It's the user's responsibility to make sure that some reference to old is retained, should that be necessary. Parameters: consys: constraint system old: old vector new: new vector Returns: TRUE if the update is successful, FALSE otherwise. */ { attvhdr_struct *attvhdr ; lnk_struct *lnk ; const char *rtnnme = "consys_update" ; # ifdef DYLP_PARANOIA if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (FALSE) ; } if (old == NULL) { errmsg(2,rtnnme,"old") ; return (FALSE) ; } if (new == NULL) { errmsg(2,rtnnme,"new") ; return (FALSE) ; } # endif # if DY_CONSYS_TRACE_ATTACH dyio_outfmt(IOID_INV,TRUE,"\n [%s] Converting ",consys->nme) ; dyio_outfmt(IOID_INV,TRUE,", old = %#0x to new = %#0x.",old,new) ; # endif /* Look for an entry for old. It's an error if we can't find it. */ for (attvhdr = consys->attvecs ; attvhdr != NULL ; attvhdr = attvhdr->nxt) if (attvhdr->vec == old) break ; if (attvhdr == NULL) { setflg(consys->opts,CONSYS_CORRUPT) ; errmsg(104,rtnnme,consys->nme,old) ; return (FALSE) ; } /* Do the update. */ # ifdef DYLP_PARANOIA if (attvhdr->pveclst == NULL) { errmsg(108,rtnnme,consys_assocnme(NULL,attvhdr->what),attvhdr->vec) ; return (FALSE) ; } # endif attvhdr->vec = new ; for (lnk = attvhdr->pveclst ; lnk != NULL ; lnk = lnk->llnxt) { # ifdef DYLP_PARANOIA if (lnk->llval == NULL) { errmsg(1,rtnnme,__LINE__) ; return (FALSE) ; } # endif *((void **) lnk->llval) = new ; } return (TRUE) ; } bool consys_detach (consys_struct *consys, void **pvec, bool all) /* This routine detaches the reference specified by pvec by removing it from the attached vector list. If all == TRUE, all references to the vector *pvec are removed and the vector is removed from the attached vector list. It's an error if pvec doesn't show up on the reference list for the vector. Parameters: consys: constraint system pvec: address of pointer to vector; *pvec must also be valid all: TRUE to detach all references to this vector except the associated vector entry, FALSE if only pvec is to be detached. Returns: TRUE if the entry is found and detached, FALSE otherwise */ { attvhdr_struct *attvhdr,**pattvhdr ; lnk_struct *lnk,**plnk ; bool pvec_seen ; void *vec ; const char *rtnnme = "consys_detach" ; # ifdef DYLP_PARANOIA if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (FALSE) ; } if (consys->attvecs == NULL) { errmsg(101,rtnnme,consys->nme,"attached vector list") ; return (FALSE) ; } if (pvec == NULL) { errmsg(2,rtnnme,"&vec") ; return (FALSE) ; } if (*pvec == NULL) { errmsg(2,rtnnme,"vec") ; return (FALSE) ; } # endif # if DY_CONSYS_TRACE_ATTACH dyio_outfmt(IOID_NOSTRM,TRUE,"\n [%s] Detaching ",consys->nme) ; if (all == TRUE) { dyio_outfmt(IOID_NOSTRM,TRUE,"(all) ") ; } dyio_outfmt(IOID_NOSTRM,TRUE,", vec = %#0x, ref = %#0x.",*pvec,pvec) ; # endif /* Find the entry for the vector. It's an error to try and detach a vector that isn't attached. */ vec = *pvec ; for (pattvhdr = &consys->attvecs, attvhdr = *pattvhdr ; attvhdr != NULL ; pattvhdr = &attvhdr->nxt, attvhdr = *pattvhdr) if (attvhdr->vec == vec) break ; if (attvhdr == NULL) { setflg(consys->opts,CONSYS_CORRUPT) ; errmsg(104,rtnnme,consys->nme,vec) ; return (FALSE) ; } # ifdef DYLP_PARANOIA if (attvhdr->pveclst == NULL) { errmsg(108,rtnnme,consys_assocnme(NULL,attvhdr->what),attvhdr->vec) ; return (FALSE) ; } # endif /* Work over the pvec list, detaching entries as appropriate. If there are no references left, delete the vector's entry too. */ if (all == TRUE) { for (lnk = attvhdr->pveclst ; lnk != NULL ; lnk = attvhdr->pveclst) { attvhdr->pveclst = lnk->llnxt ; FREE(lnk) ; } *pattvhdr = attvhdr->nxt ; FREE(attvhdr) ; } else { pvec_seen = FALSE ; plnk = &attvhdr->pveclst ; for (lnk = *plnk ; lnk != NULL ; lnk = *plnk) { if (pvec == (void **) lnk->llval) { pvec_seen = TRUE ; *plnk = lnk->llnxt ; FREE(lnk) ; } else { plnk = &lnk->llnxt ; } } if (pvec_seen == FALSE) { setflg(consys->opts,CONSYS_CORRUPT) ; errmsg(109,rtnnme,consys->nme,pvec,consys_assocnme(NULL,attvhdr->what), attvhdr->vec) ; return (FALSE) ; } if (attvhdr->pveclst == NULL) { *pattvhdr = attvhdr->nxt ; FREE(attvhdr) ; } } return (TRUE) ; } bool consys_realloc (consys_struct *consys, char rowcol, int incr) /* This routine is responsible for expanding the constraint matrix and the attached arrays when additional room is needed to add rows or columns. It does nothing except create open space at the end of arrays (increasing colsze or rowsze). Expanding the column capacity entails expanding the column header of the constraint matrix, and any attached row vectors. Expanding the row capacity entails expanding the row header of the constraint matrix, and any attached column vectors. If coupling is enabled, a column expansion is forced to make room for the logical variables that will go with the new rows. In practice, it's all pretty straightforward: The row and/or column headers are expanded as needed, then we walk the attached vector list, expanding as needed and updating pointers when the expanded vector moves in memory. If incr is <= 0, a default expansion of 10% (minimum 10 rows/columns) is used. Parameters: consys: Constraint system. rowcol: 'c' for column expansion, 'r' for row expansion incr: The number of additional rows/columns. Returns: TRUE if the expansion is successful, FALSE otherwise. */ { int rowsze,oldrowsze,colsze,oldcolsze,ndx,elsze ; bool expcols,exprows ; flags what ; char *vec ; double *dvec ; attvhdr_struct *attvhdr ; lnk_struct *lnk ; const char *rtnnme = "consys_realloc" ; /* Suppress `might be used uninitialized' from gcc. */ rowsze = -1 ; oldrowsze = -1 ; colsze = -1 ; oldcolsze = -1 ; # ifdef DYLP_PARANOIA if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (FALSE) ; } if (consys->mtx.rows == NULL) { errmsg(101,rtnnme,consys->nme,"row header") ; return (FALSE) ; } if (consys->mtx.cols == NULL) { errmsg(101,rtnnme,consys->nme,"column header") ; return (FALSE) ; } # endif /* Figure out the size of the increase, if the user didn't specify. If we're asked to do a row increase and coupling is enabled, check that the capacity remaining on the column side is sufficient to accommodate the additional logicals. If not, calculate the needed increase and force a column expansion. */ expcols = FALSE ; exprows = FALSE ; switch (rowcol) { case 'c': { if (incr <= 0) incr = maxx(10,(int)(consys->colsze*EXPAND_PCT_DFLT)) ; colsze = consys->colsze+incr ; expcols = TRUE ; break ; } case 'r': { if (incr <= 0) incr = maxx(10,(int)(consys->rowsze*EXPAND_PCT_DFLT)) ; rowsze = consys->rowsze+incr ; exprows = TRUE ; if (flgon(consys->opts,CONSYS_LVARS)) if (consys->colsze < consys->varcnt+incr) { expcols = TRUE ; colsze = consys->varcnt+incr ; } break ; } default: { errmsg(3,rtnnme,"rowcol",rowcol) ; return (FALSE) ; } } /* Expand the row and column header as necessary. */ if (exprows == TRUE) { oldrowsze = consys->rowsze ; consys->mtx.rows = (rowhdr_struct **) REALLOC(consys->mtx.rows,(rowsze+1)*sizeof(rowhdr_struct **)) ; memset(&consys->mtx.rows[oldrowsze+1],0, (rowsze-oldrowsze)*sizeof(rowhdr_struct **)) ; consys->rowsze = rowsze ; } if (expcols == TRUE) { oldcolsze = consys->colsze ; consys->mtx.cols = (colhdr_struct **) REALLOC(consys->mtx.cols,(colsze+1)*sizeof(colhdr_struct **)) ; memset(&consys->mtx.cols[oldcolsze+1],0, (colsze-oldcolsze)*sizeof(colhdr_struct **)) ; consys->colsze = colsze ; } /* Now, walk the attached vector list and do any necessary expansions. Where the expansion results in the vector moving to a different block of memory, walk the reference list and update the pointers. Note that we don't care why vec didn't change -- it could be that the vector wasn't expanded at all, or that it was expanded but didn't move. */ for (attvhdr = consys->attvecs ; attvhdr != NULL ; attvhdr = attvhdr->nxt) { vec = (char *) attvhdr->vec ; what = attvhdr->what ; elsze = attvhdr->elsze ; # ifdef DYLP_PARANOIA if (elsze <= 0) { errmsg(106,rtnnme,consys->nme,vec,elsze) ; return (FALSE) ; } if (attvhdr->pveclst == NULL) { errmsg(108,rtnnme,consys_assocnme(NULL,attvhdr->what),attvhdr->vec) ; return (FALSE) ; } if (!(VALID_ATTVTYPE(what))) { errmsg(114,rtnnme,consys->nme,"attached",attvhdr->what) ; return (FALSE) ; } # endif if (flgon(what,CONSYS_ROWVEC)) { if (expcols == TRUE) { vec = (char *) REALLOC(attvhdr->vec,(colsze+1)*elsze) ; if (flgon(what,CONSYS_VUB)) { dvec = (double *) vec ; for (ndx = oldcolsze+1 ; ndx <= colsze ; ndx++) { dvec[ndx] = consys->inf ; } } else if (flgon(what,CONSYS_CSCALE)) { dvec = (double *) vec ; dvec[0] = 0.0 ; for (ndx = oldcolsze+1 ; ndx <= colsze ; ndx++) dvec[ndx] = 1.0 ; } else { memset(vec+(oldcolsze+1)*elsze,0,(colsze-oldcolsze)*elsze) ; } } } else { if (exprows == TRUE) { vec = (char *) REALLOC(attvhdr->vec,(rowsze+1)*elsze) ; if (flgon(what,CONSYS_RSCALE)) { dvec = (double *) vec ; dvec[0] = 0.0 ; for (ndx = oldrowsze+1 ; ndx <= rowsze ; ndx++) dvec[ndx] = 1.0 ; } else { memset(vec+(oldrowsze+1)*elsze,0,(rowsze-oldrowsze)*elsze) ; } } } if (vec != attvhdr->vec) { for (lnk = attvhdr->pveclst ; lnk != NULL ; lnk = lnk->llnxt) { # ifdef DYLP_PARANOIA if (lnk->llval == NULL) { errmsg(110,rtnnme,lnk,consys_assocnme(NULL,what),attvhdr->vec) ; return (FALSE) ; } # endif *((void **) lnk->llval) = (void *) vec ; } attvhdr->vec = (void *) vec ; } } # ifdef DYLP_PARANOIA /* Just checking to see if we dropped anything. */ if (flgon(consys->parts,CONSYS_RHS) && consys->rhs == NULL) { errmsg(113,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_RHS)) ; return (FALSE) ; } if (flgon(consys->parts,CONSYS_RHSLOW) && consys->rhslow == NULL) { errmsg(113,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_RHSLOW)) ; return (FALSE) ; } if (flgon(consys->parts,CONSYS_CTYP) && consys->ctyp == NULL) { errmsg(113,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_CTYP)) ; return (FALSE) ; } if (flgon(consys->parts,CONSYS_CUB) && consys->cub == NULL) { errmsg(113,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_CUB)) ; return (FALSE) ; } if (flgon(consys->parts,CONSYS_CLB) && consys->clb == NULL) { errmsg(113,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_CLB)) ; return (FALSE) ; } if (flgon(consys->parts,CONSYS_OBJ) && consys->obj == NULL) { errmsg(113,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_OBJ)) ; return (FALSE) ; } if (flgon(consys->parts,CONSYS_VTYP) && consys->vtyp == NULL) { errmsg(113,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_VTYP)) ; return (FALSE) ; } if (flgon(consys->parts,CONSYS_VUB) && consys->vub == NULL) { errmsg(113,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_VUB)) ; return (FALSE) ; } if (flgon(consys->parts,CONSYS_VLB) && consys->vlb == NULL) { errmsg(113,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_VLB)) ; return (FALSE) ; } if (flgon(consys->parts,CONSYS_RSCALE) && consys->rowscale == NULL) { errmsg(113,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_RSCALE)) ; return (FALSE) ; } if (flgon(consys->parts,CONSYS_CSCALE) && consys->rowscale == NULL) { errmsg(113,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_CSCALE)) ; return (FALSE) ; } # endif return (TRUE) ; } bool consys_addcol_pk (consys_struct *consys, vartyp_enum vartyp, pkvec_struct *pkcol, double obj, double vlb, double vub) /* This routine adds an architectural variable to the constraint matrix (expanding the allocated size if necessary). If the appropriate associated vectors exist, the objective coefficient and lower and upper bounds will be set. If DYLP_NDEBUG is not defined and the WRNZERO flag is set, the routine will warn about columns with no non-zero coefficients. NO WARNING is issued if an associated vector doesn't exist. If pkcol is a vector of capacity 0 (pkcol->sze == 0) this is taken to be a call for the sole purpose of creating the header, and no warning is issued. Parameters: consys: Constraint system. vartyp: The type of variable. pkcol: (i) name (optional) and coefficients for the column. (o) column index; name, if not supplied. obj: Coefficient for the objective function. vlb, vub Lower and upper bounds. Returns: TRUE if the insertion is successful, FALSE otherwise. */ { int colndx,vecndx,avail,nzcnt ; colhdr_struct *colhdr ; rowhdr_struct *rowhdr ; coeff_struct *coeff ; pkcoeff_struct *pkcoeff ; char nmebuf[20] ; const char *rtnnme = "consys_addcol_pk" ; # ifdef DYLP_PARANOIA if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (FALSE) ; } if (consys->mtx.rows == NULL) { errmsg(101,rtnnme,consys->nme,"row header") ; return (FALSE) ; } if (consys->mtx.cols == NULL) { errmsg(101,rtnnme,consys->nme,"column header") ; return (FALSE) ; } /* ZZ_TABLEAU_ZZ if (consys->vtyp == NULL) { errmsg(101,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_VTYP)) ; return (FALSE) ; } */ if (consys->vtyp != NULL) { if (!VALID_VARTYPE(vartyp)) { errmsg(5,rtnnme,"vartyp",(int) vartyp) ; return (FALSE) ; } } if (pkcol == NULL) { errmsg(2,rtnnme,"pkcol") ; return (FALSE) ; } pkcol->ndx = 0 ; # endif /* Calculate the column index (and a name, if necessary). Then make sure we have space; acquire some if needed. */ colndx = consys->varcnt+1 ; pkcol->ndx = colndx ; if (pkcol->nme == NULL) { dyio_outfxd(nmebuf,-((int) (sizeof(nmebuf)-1)),'l',"var<%d>",colndx) ; pkcol->nme = nmebuf ; } # ifdef DYLP_PARANOIA /* We need to postpone this check to here because pkvec_check requires that nme != NULL. */ if (pkvec_check(pkcol,rtnnme) == FALSE) return (FALSE) ; # endif if (flgon(consys->opts,CONSYS_LVARS)) avail = consys->colsze-consys->rowsze ; else avail = consys->colsze ; if (avail < consys->varcnt+1) if (consys_realloc(consys,'c',0) == FALSE) { setflg(consys->opts,CONSYS_CORRUPT) ; errmsg(112,rtnnme,consys->nme, "capacity expansion","column",pkcol->nme,pkcol->ndx) ; return (FALSE) ; } /* Initialise the column header and set the type. Adjust the variable counts. */ colhdr = (colhdr_struct *) CALLOC(1,sizeof(colhdr_struct)) ; consys->mtx.cols[colndx] = colhdr ; colhdr->ndx = colndx ; colhdr->nme = STRALLOC(pkcol->nme) ; if (consys->vtyp != NULL) { consys->vtyp[colndx] = vartyp ; } consys->archvcnt++ ; consys->varcnt++ ; if (vartyp == vartypINT) consys->intvcnt++ ; else if (vartyp == vartypBIN) consys->binvcnt++ ; /* If we're using our private buffer, hide it again. */ if (pkcol->nme == nmebuf) pkcol->nme = colhdr->nme ; /* Add the column, keeping an eye out for any changes in row or column maxima. It's an error to try and insert a coefficient into a constraint that's not already in existence. If pkcol->sze is 0, then there are no coefficients (the purpose of the call was to create the header). */ if (pkcol->sze > 0) { # ifndef DYLP_NDEBUG if (pkcol->cnt == 0 && flgon(consys->opts,CONSYS_WRNZERO)) warn(118,rtnnme,consys->nme,"column",colhdr->nme,colndx) ; # endif nzcnt = 0 ; pkcoeff = pkcol->coeffs ; for (vecndx = 0 ; vecndx < pkcol->cnt ; vecndx++) { if (pkcoeff->ndx <= 0 || pkcoeff->ndx > consys->concnt) { errmsg(102,rtnnme,consys->nme,"row",pkcoeff->ndx,1,consys->concnt) ; return (FALSE) ; } if (fabs(pkcoeff->val) >= consys->inf) { setflg(consys->opts,CONSYS_CORRUPT) ; errmsg(128,rtnnme,consys->nme,pkcoeff->ndx,colndx,pkcoeff->val, "column",colhdr->nme) ; return (FALSE) ; } if (fabs(pkcoeff->val) > consys->tiny) { rowhdr = consys->mtx.rows[pkcoeff->ndx] ; # ifdef DYLP_PARANOIA if (rowhdr == NULL) { errmsg(103,rtnnme,consys->nme,"row",pkcoeff->ndx) ; return (FALSE) ; } if (pkcoeff->ndx != rowhdr->ndx) { errmsg(126,rtnnme,consys->nme,"row",rowhdr,rowhdr->ndx, pkcoeff->ndx,rowhdr) ; return (FALSE) ; } # endif coeff = (coeff_struct *) MALLOC(sizeof(coeff_struct)) ; coeff->rowhdr = rowhdr ; coeff->colhdr = colhdr ; coeff->val = pkcoeff->val ; coeff->rownxt = rowhdr->coeffs ; rowhdr->coeffs = coeff ; coeff->colnxt = colhdr->coeffs ; colhdr->coeffs = coeff ; rowhdr->len++ ; nzcnt++ ; if (rowhdr->len > consys->maxrowlen) { consys->maxrowlen = rowhdr->len ; consys->maxrowndx = pkcoeff->ndx ; } } # ifndef DYLP_NDEBUG else { warn(130,rtnnme,consys->nme,pkcoeff->ndx,colndx,pkcoeff->val, consys->tiny,"column",colhdr->nme) ; } # endif pkcoeff++ ; } colhdr->len = nzcnt ; consys->mtx.coeffcnt += nzcnt ; if (colhdr->len > consys->maxcollen) { consys->maxcollen = colhdr->len ; consys->maxcolndx = colndx ; } } /* Check for the relevant associated arrays -- obj, vlb, vub -- and set values if they're present. */ if (consys->obj != NULL) consys->obj[colndx] = obj ; if (consys->vlb != NULL) consys->vlb[colndx] = vlb ; if (consys->vub != NULL) consys->vub[colndx] = vub ; return (TRUE) ; } bool consys_addcol_ex (consys_struct *consys, vartyp_enum vartyp, const char **nme, double *excol, double obj, double vlb, double vub) /* This routine adds an architectural variable to the constraint matrix (expanding the allocated size if necessary). If the appropriate associated vectors exist, the objective coefficient and lower and upper bounds will be set. It is assumed that excol is of size consys->concnt. Only non-zero entries are installed in the constraint system; zeros are quietly suppressed. Parameters: consys: Constraint system. vartyp: The type of variable. nme: (i) The name for the variable (will be generated if null) (o) The name for the variable excol: (i) coefficients for the column. (o) excol[0] is set to the column index. obj: Coefficient for the objective function. vlb, vub Lower and upper bounds. Returns: TRUE if the insertion is successful, FALSE otherwise. */ { int colndx,rowndx,avail ; colhdr_struct *colhdr ; rowhdr_struct *rowhdr ; coeff_struct *coeff ; char nmebuf[20] ; const char *rtnnme = "consys_addcol_ex" ; # ifdef DYLP_PARANOIA if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (FALSE) ; } if (consys->mtx.rows == NULL) { errmsg(101,rtnnme,consys->nme,"row header") ; return (FALSE) ; } if (consys->mtx.cols == NULL) { errmsg(101,rtnnme,consys->nme,"column header") ; return (FALSE) ; } /* ZZ_TABLEAU_ZZ if (consys->vtyp == NULL) { errmsg(101,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_VTYP)) ; return (FALSE) ; } */ if (consys->vtyp != NULL) { if (!VALID_VARTYPE(vartyp)) { errmsg(5,rtnnme,"vartyp",(int) vartyp) ; return (FALSE) ; } } if (excol == NULL) { errmsg(2,rtnnme,"excol") ; return (FALSE) ; } if (nme == NULL) { errmsg(2,rtnnme,"nme") ; return (FALSE) ; } # endif /* Calculate the column index (and a name, if necessary). Then make sure we have space; acquire some if needed. */ colndx = consys->varcnt+1 ; excol[0] = colndx ; if (nme == NULL) { dyio_outfxd(nmebuf,-((int) (sizeof(nmebuf)-1)),'l',"var<%d>",colndx) ; *nme = nmebuf ; } if (flgon(consys->opts,CONSYS_LVARS)) avail = consys->colsze-consys->rowsze ; else avail = consys->colsze ; if (avail < consys->varcnt+1) if (consys_realloc(consys,'c',0) == FALSE) { setflg(consys->opts,CONSYS_CORRUPT) ; errmsg(112,rtnnme,consys->nme, "capacity expansion","column",*nme,excol[0]) ; return (FALSE) ; } /* Initialise the column header and set the type. Adjust the variable counts. */ colhdr = (colhdr_struct *) CALLOC(1,sizeof(colhdr_struct)) ; consys->mtx.cols[colndx] = colhdr ; colhdr->ndx = colndx ; colhdr->nme = STRALLOC(*nme) ; if (consys->vtyp != NULL) { consys->vtyp[colndx] = vartyp ; } consys->archvcnt++ ; consys->varcnt++ ; if (vartyp == vartypINT) consys->intvcnt++ ; else if (vartyp == vartypBIN) consys->binvcnt++ ; /* If we're using our private buffer, hide it again. */ if (*nme == nmebuf) *nme = colhdr->nme ; /* Add the column, keeping an eye out for any changes in row or column maxima. It's an error to try and insert a coefficient into a constraint that's not already in existence. */ for (rowndx = 1 ; rowndx <= consys->concnt ; rowndx++) { if (fabs(excol[rowndx]) >= consys->inf) { setflg(consys->opts,CONSYS_CORRUPT) ; errmsg(128,rtnnme,consys->nme,rowndx,colndx,excol[rowndx], "column",colhdr->nme) ; return (FALSE) ; } if (fabs(excol[rowndx]) >= consys->tiny) { colhdr->len++ ; rowhdr = consys->mtx.rows[rowndx] ; # ifdef DYLP_PARANOIA if (rowhdr == NULL) { errmsg(103,rtnnme,consys->nme,"row",rowndx) ; return (FALSE) ; } if (rowndx != rowhdr->ndx) { errmsg(126,rtnnme,consys->nme,"row",rowhdr,rowhdr->ndx,rowndx,rowhdr) ; return (FALSE) ; } # endif coeff = (coeff_struct *) MALLOC(sizeof(coeff_struct)) ; coeff->rowhdr = rowhdr ; coeff->colhdr = colhdr ; coeff->val = excol[rowndx] ; coeff->rownxt = rowhdr->coeffs ; rowhdr->coeffs = coeff ; coeff->colnxt = colhdr->coeffs ; colhdr->coeffs = coeff ; rowhdr->len++ ; if (rowhdr->len > consys->maxrowlen) { consys->maxrowlen = rowhdr->len ; consys->maxrowndx = rowndx ; } } # ifndef DYLP_NDEBUG else if (excol[rowndx] != 0.0) { rowhdr = consys->mtx.rows[rowndx] ; warn(130,rtnnme,consys->nme,rowndx,colndx,excol[rowndx], consys->tiny,"row",rowhdr->nme) ; } # endif } consys->mtx.coeffcnt += colhdr->len ; if (colhdr->len > consys->maxcollen) { consys->maxcollen = colhdr->len ; consys->maxcolndx = colndx ; } /* Check for the relevant associated arrays -- obj, vlb, vub -- and set values if they're present. */ if (consys->obj != NULL) consys->obj[colndx] = obj ; if (consys->vlb != NULL) consys->vlb[colndx] = vlb ; if (consys->vub != NULL) consys->vub[colndx] = vub ; return (TRUE) ; } bool consys_addrow_pk (consys_struct *consys, char class, contyp_enum contyp, pkvec_struct *pkrow, double rhs, double rhslow, conbnd_struct *cub, conbnd_struct *clb) /* This routine adds a constraint to the constraint matrix, expanding the allocated size if necessary and reordering constraints as appropriate. If the relevant associated vectors exist, the right-hand-side, range (rhslow), and upper and lower bounds will be set. If coupling is on (i.e., logical variables are enabled), a logical variable will be created according to the usual rules and any reordering of constraints will be reflected in the logicals. IT'S IMPORTANT that the logical not be added until after pkrow is unloaded -- after all, pkrow could have a coefficient in the column occupied by the first architectural variable, and we don't want to screw up the column index stored with the coefficient. If DYLP_NDEBUG is not defined and the WRNZERO flag is set, the routine will warn about columns with no non-zero coefficients. NO WARNING is issued if an associated vector doesn't exist. Parameters: consys: Constraint system. class: Class of the constraint -- 'a' for architectural, 'c' for cut contyp: The type of constraint. pkrow: (i) name (optional) and coefficients for the row (o) row index; name, if not supplied rhs: right-hand-side coefficient rhslow: alternate right-hand-side coefficient, for range constraints cub,clb: upper and lower bounds for the value of the left-hand-side Returns: TRUE if the insertion is successful, FALSE otherwise. */ { int rowndx,vecndx,nzcnt ; colhdr_struct *colhdr ; rowhdr_struct *rowhdr ; coeff_struct *coeff ; pkcoeff_struct *pkcoeff ; char nmebuf[20] ; const char *rtnnme = "consys_addrow_pk" ; # ifdef DYLP_PARANOIA if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (FALSE) ; } if (consys->mtx.rows == NULL) { errmsg(101,rtnnme,consys->nme,"row header") ; return (FALSE) ; } if (consys->mtx.cols == NULL) { errmsg(101,rtnnme,consys->nme,"column header") ; return (FALSE) ; } if (!(class == 'a' || class == 'c')) { errmsg(3,rtnnme,"constraint class",class) ; return (FALSE) ; } /* if (consys->ctyp == NULL) { errmsg(101,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_CTYP)) ; return (FALSE) ; } */ if (consys->ctyp != NULL) { if (!(VALID_CONTYPE(contyp) || contyp == contypNB)) { errmsg(5,rtnnme,"contyp",(int) contyp) ; return (FALSE) ; } } if (pkrow == NULL) { errmsg(2,rtnnme,"pkrow") ; return (FALSE) ; } pkrow->ndx = 0 ; if (flgon(consys->opts,CONSYS_LVARS)) if (consys->logvcnt != consys->concnt) { errmsg(131,rtnnme,consys->nme,consys->logvcnt,consys->concnt) ; return (FALSE) ; } # endif /* Calculate the row index and name. A new architectural constraint will be placed at the end of the block of architectural constraints, and a new cut constraint will be placed at the end of the rows. */ if (class == 'a') rowndx = consys->archccnt+1 ; else rowndx = consys->concnt+1 ; pkrow->ndx = rowndx ; if (pkrow->nme == NULL) { dyio_outfxd(nmebuf,-((int) (sizeof(nmebuf)-1)),'l',"%s<%d>", (class == 'a')?"con":"cut",rowndx) ; pkrow->nme = nmebuf ; } # ifdef DYLP_PARANOIA /* We need to postpone this check to here because pkvec_check requires that nme != NULL. */ if (pkvec_check(pkrow,rtnnme) == FALSE) return (FALSE) ; # endif /* If necessary, boost the allocated capacity to open up space for the new row. (Space for the logical will also be allocated if coupling is enabled.) Then move the first cut out of the way if that's necessary to make a space for a new architectural constraints. */ if (consys->rowsze < consys->concnt+1) if (consys_realloc(consys,'r',0) == FALSE) { setflg(consys->opts,CONSYS_CORRUPT) ; errmsg(112,rtnnme,consys->nme, "capacity expansion","row",pkrow->nme,pkrow->ndx) ; return (FALSE) ; } if (rowndx < consys->concnt+1) if (move_row(consys,rowndx,consys->concnt+1) == FALSE) { setflg(consys->opts,CONSYS_CORRUPT) ; errmsg(112,rtnnme,consys->nme,"swap","row", consys_nme(consys,'c',rowndx,FALSE,NULL),rowndx) ; return (FALSE) ; } /* Initialise the row header and type. Bump the appropriate constraint counts. */ rowhdr = (rowhdr_struct *) CALLOC(1,sizeof(rowhdr_struct)) ; consys->mtx.rows[rowndx] = rowhdr ; rowhdr->ndx = rowndx ; rowhdr->nme = STRALLOC(pkrow->nme) ; if (consys->ctyp != NULL) { consys->ctyp[rowndx] = contyp ; } if (class == 'a') consys->archccnt++ ; else consys->cutccnt++ ; consys->concnt++ ; /* If we're using our private buffer, hide it again. */ if (pkrow->nme == nmebuf) pkrow->nme = rowhdr->nme ; /* Add the row, keeping an eye out for any change in the maximum length column. It's an error to try and insert a coefficient into a column that's not already in existence. If pkrow->sze == 0, we're just here to create the header. */ if (pkrow->sze > 0) { # ifndef DYLP_NDEBUG if (pkrow->cnt == 0 && flgon(consys->opts,CONSYS_WRNZERO)) warn(118,rtnnme,consys->nme,"row",rowhdr->nme,rowndx) ; # endif nzcnt = 0 ; pkcoeff = pkrow->coeffs ; for (vecndx = 0 ; vecndx < pkrow->cnt ; vecndx++) { if (pkcoeff->ndx <= 0 || pkcoeff->ndx > consys->varcnt) { errmsg(102,rtnnme,consys->nme,"column",pkcoeff->ndx,1,consys->varcnt) ; return (FALSE) ; } if (fabs(pkcoeff->val) >= consys->inf) { setflg(consys->opts,CONSYS_CORRUPT) ; errmsg(128,rtnnme,consys->nme,rowndx,pkcoeff->ndx,pkcoeff->val, "row",rowhdr->nme) ; return (FALSE) ; } if (fabs(pkcoeff->val) > consys->tiny) { colhdr = consys->mtx.cols[pkcoeff->ndx] ; # ifdef DYLP_PARANOIA if (colhdr == NULL) { errmsg(103,rtnnme,consys->nme,"column",pkcoeff->ndx) ; return (FALSE) ; } if (pkcoeff->ndx != colhdr->ndx) { errmsg(126,rtnnme,consys->nme,"column",colhdr,colhdr->ndx, pkcoeff->ndx,colhdr) ; return (FALSE) ; } # endif coeff = (coeff_struct *) MALLOC(sizeof(coeff_struct)) ; coeff->colhdr = colhdr ; coeff->rowhdr = rowhdr ; coeff->val = pkcoeff->val ; coeff->rownxt = rowhdr->coeffs ; rowhdr->coeffs = coeff ; coeff->colnxt = colhdr->coeffs ; colhdr->coeffs = coeff ; colhdr->len++ ; nzcnt++ ; if (colhdr->len > consys->maxcollen) { consys->maxcollen = colhdr->len ; consys->maxcolndx = pkcoeff->ndx ; } } # ifndef DYLP_NDEBUG else { warn(130,rtnnme,consys->nme,rowndx,pkcoeff->ndx,pkcoeff->val, consys->tiny,"row",rowhdr->nme) ; } # endif pkcoeff++ ; } rowhdr->len = nzcnt ; consys->mtx.coeffcnt += nzcnt ; /* Check if this row should become the maximum length row. */ if (rowhdr->len > consys->maxrowlen) { consys->maxrowlen = rowhdr->len ; consys->maxrowndx = rowndx ; } } /* Check for the relevant associated arrays -- rhs, rhslow, clb, cub -- and set values if they're present. */ if (consys->rhs != NULL) consys->rhs[rowndx] = rhs ; if (consys->rhslow != NULL) consys->rhslow[rowndx] = rhslow ; if (consys->clb != NULL && clb != NULL) consys->clb[rowndx] = *clb ; if (consys->cub != NULL && cub != NULL) consys->cub[rowndx] = *cub ; /* Add a logical? If so, we'll move the first architectural out of the way. We might also have to move the logical associated with the first cut, if we're adding an architectural constraint when cuts are already present. */ if (flgon(consys->opts,CONSYS_LVARS)) { if (consys->archvcnt > 0) if (move_col(consys,consys->logvcnt+1,consys->varcnt+1) == FALSE) { setflg(consys->opts,CONSYS_CORRUPT) ; errmsg(112,rtnnme,consys->nme,"swap","column", consys_nme(consys,'v',consys->logvcnt+1,FALSE,NULL), consys->logvcnt+1) ; return (FALSE) ; } if (rowndx < consys->concnt) if (move_col(consys,rowndx,consys->logvcnt+1) == FALSE) { setflg(consys->opts,CONSYS_CORRUPT) ; errmsg(112,rtnnme,consys->nme,"swap","column", consys_nme(consys,'c',rowndx,FALSE,NULL),rowndx) ; return (FALSE) ; } if (add_logical(consys,rowndx) == FALSE) { setflg(consys->opts,CONSYS_CORRUPT) ; errmsg(121,rtnnme,consys->nme,rowhdr->nme,rowndx) ; return (FALSE) ; } } return (TRUE) ; } bool consys_getcol_pk (consys_struct *consys, int colndx, pkvec_struct **pkvec) /* This routine copies a column out of the constraint matrix into the vector pkvec (creating a vector if needed). The routine will complain if a vector is supplied and it's too small for the column. As a special case, a vector of size 0 will retrieve only the column header information. Parameters: consys: constraint system colndx: column to be fetched pkvec: (i) packed vector (if NULL, one will be created) (o) packed vector, loaded with column Returns: TRUE if the column is fetched without incident, FALSE otherwise (paranoia or debug only). */ { colhdr_struct *colhdr ; coeff_struct *coeff ; pkcoeff_struct *pkcoeff ; # if defined(DYLP_PARANOIA) || !defined(DYLP_NDEBUG) const char *rtnnme = "consys_getcol_pk" ; # endif # ifdef DYLP_PARANOIA if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (FALSE) ; } if (consys->mtx.cols == NULL) { errmsg(101,rtnnme,consys->nme,"column header") ; return (FALSE) ; } # endif # ifndef DYLP_NDEBUG if (colndx <= 0 || colndx > consys->varcnt) { errmsg(102,rtnnme,consys->nme,"column",colndx,1,consys->varcnt) ; return (FALSE) ; } # endif colhdr = consys->mtx.cols[colndx] ; # ifdef DYLP_PARANOIA if (colhdr == NULL) { errmsg(103,rtnnme,consys->nme,"column",colndx) ; return (FALSE) ; } if (colndx != colhdr->ndx) { errmsg(126,rtnnme,consys->nme,"column",colhdr,colhdr->ndx,colndx, colhdr) ; return (FALSE) ; } if (pkvec == NULL) { errmsg(2,rtnnme,"&pkvec") ; return (FALSE) ; } # endif /* Get a fresh vector, if need be. Step along the column and copy the coefficients and row indices to the packed vector. Finally, fill in the header information for the packed vector. */ if (*pkvec == NULL) *pkvec = pkvec_new(consys->maxcollen) ; # ifdef DYLP_PARANOIA else if (pkvec_check(*pkvec,rtnnme) == FALSE) return FALSE ; # endif if ((*pkvec)->sze != 0) { # ifdef DYLP_PARANOIA if ((*pkvec)->sze < colhdr->len) { errmsg(92,rtnnme,((*pkvec)->nme == NULL)?"<>":(*pkvec)->nme, (*pkvec)->ndx,(*pkvec)->sze,"column", consys_nme(consys,'v',colndx,TRUE,NULL),colhdr->len) ; return (FALSE) ; } # endif for (coeff = colhdr->coeffs,pkcoeff = (*pkvec)->coeffs ; coeff != NULL ; coeff = coeff->colnxt,pkcoeff++) { # ifdef DYLP_PARANOIA if (coeff->rowhdr == NULL) { errmsg(125,rtnnme,consys->nme,"rowhdr",coeff,"column", consys_nme(consys,'v',colndx,FALSE,NULL),colndx) ; return (FALSE) ; } if (coeff->rowhdr != consys->mtx.rows[coeff->rowhdr->ndx]) { errmsg(126,rtnnme,consys->nme,"row",coeff->rowhdr,coeff->rowhdr->ndx, coeff->rowhdr->ndx,consys->mtx.rows[coeff->rowhdr->ndx]) ; return (FALSE) ; } # endif pkcoeff->ndx = coeff->rowhdr->ndx ; pkcoeff->val = coeff->val ; } } (*pkvec)->ndx = colndx ; (*pkvec)->nme = colhdr->nme ; (*pkvec)->dim = consys->concnt ; (*pkvec)->dflt = 0 ; (*pkvec)->cnt = colhdr->len ; return (TRUE) ; } bool consys_getcol_ex (consys_struct *consys, int colndx, double **vec) /* This routine copies a column out of the constraint matrix into the vector vec (creating a vector if needed). Parameters: consys: constraint system colndx: column to be fetched vec: (i) vector (if NULL, one will be created) (o) vector loaded with column Returns: TRUE if the column is fetched without incident, FALSE otherwise (paranoia or debug only). */ { colhdr_struct *colhdr ; coeff_struct *coeff ; # if defined(DYLP_PARANOIA) || !defined(DYLP_NDEBUG) const char *rtnnme = "consys_getcol_ex" ; # endif # ifdef DYLP_PARANOIA if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (FALSE) ; } if (consys->mtx.cols == NULL) { errmsg(101,rtnnme,consys->nme,"column header") ; return (FALSE) ; } # endif # ifndef DYLP_NDEBUG if (colndx <= 0 || colndx > consys->varcnt) { errmsg(102,rtnnme,consys->nme,"column",colndx,1,consys->varcnt) ; return (FALSE) ; } # endif colhdr = consys->mtx.cols[colndx] ; # ifdef DYLP_PARANOIA if (colhdr == NULL) { errmsg(103,rtnnme,consys->nme,"column",colndx) ; return (FALSE) ; } if (colndx != colhdr->ndx) { errmsg(126,rtnnme,consys->nme,"column",colhdr,colhdr->ndx,colndx, colhdr) ; return (FALSE) ; } if (vec == NULL) { errmsg(2,rtnnme,"&vec") ; return (FALSE) ; } # endif /* Make a vector, if need be, or clear the one we're handed. Then step along the column and set the necessary coefficients. */ if (*vec == NULL) *vec = (double *) CALLOC(consys->concnt+1,sizeof(double)) ; else memset(*vec,0,(consys->concnt+1)*sizeof(double)) ; for (coeff = colhdr->coeffs ; coeff != NULL ; coeff = coeff->colnxt) { # ifdef DYLP_PARANOIA if (coeff->rowhdr == NULL) { errmsg(125,rtnnme,consys->nme,"rowhdr",coeff,"column", consys_nme(consys,'v',colndx,FALSE,NULL),colndx) ; return (FALSE) ; } if (coeff->rowhdr != consys->mtx.rows[coeff->rowhdr->ndx]) { errmsg(126,rtnnme,consys->nme,"row",coeff->rowhdr,coeff->rowhdr->ndx, coeff->rowhdr->ndx,consys->mtx.rows[coeff->rowhdr->ndx]) ; return (FALSE) ; } # endif (*vec)[coeff->rowhdr->ndx] = coeff->val ; } return (TRUE) ; } bool consys_getrow_pk (consys_struct *consys, int rowndx, pkvec_struct **pkvec) /* This routine copies a row out of the constraint matrix into the vector pkvec (creating a vector if needed). The routine will complain if a vector is supplied and it's not big enough to hold the row. As a special case, a vector of size 0 will retrieve just the row header information. Parameters: consys: constraint system rowndx: row to be fetched pkvec: (i) packed vector (if NULL, one will be created) (o) packed vector, loaded with row Returns: TRUE if the row is fetched without incident, FALSE otherwise (paranoia or debug only). */ { rowhdr_struct *rowhdr ; coeff_struct *coeff ; pkcoeff_struct *pkcoeff ; # if defined(DYLP_PARANOIA) || !defined(DYLP_NDEBUG) const char *rtnnme = "consys_getrow_pk" ; # endif # ifdef DYLP_PARANOIA if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (FALSE) ; } if (consys->mtx.rows == NULL) { errmsg(101,rtnnme,consys->nme,"row header") ; return (FALSE) ; } # endif # ifndef DYLP_NDEBUG if (rowndx <= 0 || rowndx > consys->concnt) { errmsg(102,rtnnme,consys->nme,"row",rowndx,1,consys->concnt) ; return (FALSE) ; } # endif rowhdr = consys->mtx.rows[rowndx] ; # ifdef DYLP_PARANOIA if (rowhdr == NULL) { errmsg(103,rtnnme,consys->nme,"row",rowndx) ; return (FALSE) ; } if (rowndx != rowhdr->ndx) { errmsg(126,rtnnme,consys->nme,"row",rowhdr,rowhdr->ndx,rowndx, rowhdr) ; return (FALSE) ; } if (pkvec == NULL) { errmsg(2,rtnnme,"&pkvec") ; return (FALSE) ; } # endif /* Get a fresh vector, if need be. Step along the row and copy the coefficients and column indices to the packed vector. Finally, fill in the header information for the packed vector. */ if (*pkvec == NULL) *pkvec = pkvec_new(consys->maxrowlen) ; # ifdef DYLP_PARANOIA else if (pkvec_check(*pkvec,rtnnme) == FALSE) return FALSE ; # endif if ((*pkvec)->sze != 0) { # ifdef DYLP_PARANOIA if ((*pkvec)->sze < rowhdr->len) { errmsg(92,rtnnme,((*pkvec)->nme == NULL)?"<>":(*pkvec)->nme, (*pkvec)->ndx,(*pkvec)->sze,"row", consys_nme(consys,'c',rowndx,TRUE,NULL),rowhdr->len) ; return (FALSE) ; } # endif for (coeff = rowhdr->coeffs,pkcoeff = (*pkvec)->coeffs ; coeff != NULL ; coeff = coeff->rownxt,pkcoeff++) { # ifdef DYLP_PARANOIA if (coeff->colhdr == NULL) { errmsg(125,rtnnme,consys->nme,"colhdr",coeff,"row", consys_nme(consys,'c',rowndx,FALSE,NULL),rowndx) ; return (FALSE) ; } if (coeff->colhdr != consys->mtx.cols[coeff->colhdr->ndx]) { errmsg(126,rtnnme,consys->nme,"column",coeff->colhdr,coeff->colhdr->ndx, coeff->colhdr->ndx,consys->mtx.cols[coeff->colhdr->ndx]) ; return (FALSE) ; } # endif pkcoeff->ndx = coeff->colhdr->ndx ; pkcoeff->val = coeff->val ; } } (*pkvec)->ndx = rowndx ; (*pkvec)->nme = rowhdr->nme ; (*pkvec)->dim = consys->varcnt ; (*pkvec)->dflt = 0 ; (*pkvec)->cnt = rowhdr->len ; return (TRUE) ; } bool consys_getrow_ex (consys_struct *consys, int rowndx, double **vec) /* This routine copies a row out of the constraint matrix into the vector vec (creating a vector if needed). Parameters: consys: constraint system rowndx: row to be fetched vec: (i) vector (if NULL, one will be created) (o) vector loaded with row Returns: TRUE if the row is fetched without incident, FALSE otherwise (paranoia or debug only). */ { rowhdr_struct *rowhdr ; coeff_struct *coeff ; # if defined(DYLP_PARANOIA) || !defined(DYLP_NDEBUG) const char *rtnnme = "consys_getrow_ex" ; # endif # ifdef DYLP_PARANOIA if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (FALSE) ; } if (consys->mtx.rows == NULL) { errmsg(101,rtnnme,consys->nme,"row header") ; return (FALSE) ; } # endif # ifndef DYLP_NDEBUG if (rowndx <= 0 || rowndx > consys->concnt) { errmsg(102,rtnnme,consys->nme,"row",rowndx,1,consys->concnt) ; return (FALSE) ; } # endif rowhdr = consys->mtx.rows[rowndx] ; # ifdef DYLP_PARANOIA if (rowhdr == NULL) { errmsg(103,rtnnme,consys->nme,"row",rowndx) ; return (FALSE) ; } if (rowndx != rowhdr->ndx) { errmsg(126,rtnnme,consys->nme,"row",rowhdr,rowhdr->ndx,rowndx, rowhdr) ; return (FALSE) ; } if (vec == NULL) { errmsg(2,rtnnme,"&vec") ; return (FALSE) ; } # endif /* Make a vector, if need be, or clear the one we're handed. Then step along the row and set the necessary coefficients. */ if (*vec == NULL) *vec = (double *) CALLOC(consys->varcnt+1,sizeof(double)) ; else memset(*vec,0,(consys->varcnt+1)*sizeof(double)) ; for (coeff = rowhdr->coeffs ; coeff != NULL ; coeff = coeff->rownxt) { # ifdef DYLP_PARANOIA if (coeff->colhdr == NULL) { errmsg(125,rtnnme,consys->nme,"colhdr",coeff,"row", consys_nme(consys,'c',rowndx,FALSE,NULL),rowndx) ; return (FALSE) ; } if (coeff->colhdr != consys->mtx.cols[coeff->colhdr->ndx]) { errmsg(126,rtnnme,consys->nme,"column",coeff->colhdr,coeff->colhdr->ndx, coeff->colhdr->ndx,consys->mtx.cols[coeff->colhdr->ndx]) ; return (FALSE) ; } # endif (*vec)[coeff->colhdr->ndx] = coeff->val ; } return (TRUE) ; } bool consys_delcol (consys_struct *consys, int colndx) /* This routine removes a column from the constraint matrix. If needed, the last architectural variable is swapped into the vacated slot. Parameters: consys: Constraint system colndx: Index of the column to be deleted. Returns: TRUE if the deletion proceeded without error, FALSE otherwise. */ { colhdr_struct *colhdr ; vartyp_enum vartyp ; bool rescan_rows,rescan_cols ; const char *rtnnme = "consys_delcol" ; # ifdef DYLP_PARANOIA if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (FALSE) ; } if (consys->mtx.rows == NULL) { errmsg(101,rtnnme,consys->nme,"row header") ; return (FALSE) ; } if (consys->mtx.cols == NULL) { errmsg(101,rtnnme,consys->nme,"column header") ; return (FALSE) ; } /* ZZ_TABLEAU_ZZ if (consys->vtyp == NULL) { errmsg(101,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_VTYP)) ; return (FALSE) ; } */ # endif # ifndef DYLP_NDEBUG if (colndx <= consys->logvcnt || colndx > consys->varcnt) { errmsg(102,rtnnme,consys->nme,"column", colndx,consys->logvcnt+1,consys->varcnt) ; return (FALSE) ; } # endif colhdr = consys->mtx.cols[colndx] ; # ifdef DYLP_PARANOIA if (colhdr == NULL) { errmsg(103,rtnnme,consys->nme,"column",colndx) ; return (FALSE) ; } if (colndx != colhdr->ndx) { errmsg(126,rtnnme,consys->nme,"column",colhdr,colhdr->ndx,colndx, colhdr) ; return (FALSE) ; } # endif /* Empty the column, forcing the column rescan flag if we're deleting the current maximum length column. */ if (empty_col(consys,colndx,&rescan_rows) == FALSE) { setflg(consys->opts,CONSYS_CORRUPT) ; errmsg(112,rtnnme,consys->nme,"empty","column",colhdr->nme,colndx) ; return (FALSE) ; } if (colndx == consys->maxcolndx) rescan_cols = TRUE ; else rescan_cols = FALSE ; /* Before we fill in the hole, correct the integer variable counts and check if we've removed the variable associated with the objective constraint. This is best done before columns are shifted. */ if (colndx == consys->xzndx) consys->xzndx = -1 ; if (consys->vtyp != NULL) { vartyp = consys->vtyp[colndx] ; if (vartyp == vartypINT) consys->intvcnt-- ; else if (vartyp == vartypBIN) consys->binvcnt-- ; } /* If this wasn't the last architectural variable, shift the last variable down to fill the hole, then correct the main variable counts. (Changing the main variable counts before moving the column will trigger a range error.) */ if (colndx < consys->varcnt) if (move_col(consys,consys->varcnt,colndx) == FALSE) { setflg(consys->opts,CONSYS_CORRUPT) ; errmsg(112,rtnnme,consys->nme,"swap","column", consys_nme(consys,'v',consys->varcnt,FALSE,NULL),consys->varcnt) ; return (FALSE) ; } consys->archvcnt-- ; consys->varcnt-- ; /* Rescan for maxima if necessary, and free the column header. That pretty well takes care of it. */ if (rescan_rows == TRUE || rescan_cols == TRUE) if (find_maxes(consys,rescan_cols,rescan_rows) == FALSE) { errmsg(112,rtnnme,consys->nme,"maxima update","column",colhdr->nme, colhdr->ndx) ; return (FALSE) ; } if (colhdr->nme != NULL) STRFREE(colhdr->nme) ; FREE(colhdr) ; return (TRUE) ; } bool consys_delrow (consys_struct *consys, int rowndx) /* This routine removes a row from the constraint matrix. If coupling is enabled, the corresponding logical variable is also removed. Any required row and column swaps are made to keep the constraint system compact. Parameters: consys: Constraint system rowndx: Index of the row to be deleted. Returns: TRUE if the deletion proceeded without error, FALSE otherwise. */ { int colndx ; colhdr_struct *colhdr ; rowhdr_struct *rowhdr ; bool rescan_rows,rescan_cols ; const char *rtnnme = "consys_delrow" ; # ifdef DYLP_PARANOIA if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (FALSE) ; } if (consys->mtx.rows == NULL) { errmsg(101,rtnnme,consys->nme,"row header") ; return (FALSE) ; } if (consys->mtx.cols == NULL) { errmsg(101,rtnnme,consys->nme,"column header") ; return (FALSE) ; } if (flgon(consys->opts,CONSYS_LVARS)) if (consys->logvcnt != consys->concnt) { errmsg(131,rtnnme,consys->nme,consys->logvcnt,consys->concnt) ; return (FALSE) ; } # endif # ifndef DYLP_NDEBUG if (rowndx <= 0 || rowndx > consys->concnt) { errmsg(102,rtnnme,consys->nme,"row",rowndx,1,consys->concnt) ; return (FALSE) ; } # endif rowhdr = consys->mtx.rows[rowndx] ; # ifdef DYLP_PARANOIA if (rowhdr == NULL) { errmsg(103,rtnnme,consys->nme,"row",rowndx) ; return (FALSE) ; } if (rowndx != rowhdr->ndx) { errmsg(126,rtnnme,consys->nme,"row",rowhdr,rowhdr->ndx,rowndx, rowhdr) ; return (FALSE) ; } # endif /* If coupling is on, delete the logical variable (this avoids a pointless warning about a 0-length column in the usual case where the logical variable appears only in its associated constraint). We'll need to swap the last logical into the space vacated by the deleted logical, and swap the last architectural variable into the space vacated by the last logical. We may need to do an additional swap within the logicals, to maintain the separation between architectural and cut constraints. */ rescan_rows = FALSE ; if (flgon(consys->opts,CONSYS_LVARS)) { colndx = rowndx ; colhdr = consys->mtx.cols[colndx] ; # ifdef DYLP_PARANOIA if (colhdr == NULL) { errmsg(103,rtnnme,consys->nme,"column",colndx) ; return (FALSE) ; } if (colhdr->ndx != colndx) { errmsg(126,rtnnme,consys->nme,"column",colhdr,colhdr->ndx,colndx,colhdr) ; return (FALSE) ; } # endif if (empty_col(consys,colndx,&rescan_rows) == FALSE) { setflg(consys->opts,CONSYS_CORRUPT) ; errmsg(112,rtnnme,consys->nme,"empty","column",colhdr->nme,colndx) ; return (FALSE) ; } if (colhdr->nme != NULL) STRFREE(colhdr->nme) ; FREE(colhdr) ; if (colndx < consys->archccnt && consys->cutccnt > 0) { if (move_col(consys,consys->archccnt,colndx) == FALSE) { setflg(consys->opts,CONSYS_CORRUPT) ; errmsg(112,rtnnme,consys->nme,"swap","column", consys_nme(consys,'v',consys->archccnt,FALSE,NULL), consys->archccnt) ; return (FALSE) ; } colndx = consys->archccnt ; } if (colndx < consys->logvcnt) if (move_col(consys,consys->logvcnt,colndx) == FALSE) { setflg(consys->opts,CONSYS_CORRUPT) ; errmsg(112,rtnnme,consys->nme,"swap","column", consys_nme(consys,'v',consys->logvcnt,FALSE,NULL), consys->logvcnt) ; return (FALSE) ; } if (consys->archvcnt > 0) if (move_col(consys,consys->varcnt,consys->logvcnt) == FALSE) { setflg(consys->opts,CONSYS_CORRUPT) ; errmsg(112,rtnnme,consys->nme,"swap","column", consys_nme(consys,'v',consys->varcnt,FALSE,NULL), consys->varcnt) ; return (FALSE) ; } consys->logvcnt-- ; consys->varcnt-- ; } /* Now empty the row, forcing the row rescan flag if we're deleting the current maximum length row, and invalidating objndx if we've deleted the objective constraint. We'll need to do the same reordering of the constraints that we applied to the logicals. */ if (empty_row(consys,rowndx,&rescan_cols) == FALSE) { setflg(consys->opts,CONSYS_CORRUPT) ; errmsg(112,rtnnme,consys->nme,"empty","row",rowhdr->nme,rowndx) ; return (FALSE) ; } if (rowndx == consys->maxrowndx) rescan_rows = TRUE ; if (rowndx == consys->objndx) consys->objndx = -1 ; if (rowndx < consys->archccnt && consys->cutccnt > 0) { if (move_row(consys,consys->archccnt,rowndx) == FALSE) { setflg(consys->opts,CONSYS_CORRUPT) ; errmsg(112,rtnnme,consys->nme,"swap","row", consys_nme(consys,'c',consys->archccnt,FALSE,NULL), consys->archccnt) ; return (FALSE) ; } rowndx = consys->archccnt ; } if (rowndx < consys->concnt) if (move_row(consys,consys->concnt,rowndx) == FALSE) { setflg(consys->opts,CONSYS_CORRUPT) ; errmsg(112,rtnnme,consys->nme,"swap","row", consys_nme(consys,'c',consys->concnt,FALSE,NULL),consys->concnt) ; return (FALSE) ; } if (rowhdr->ndx <= consys->archccnt) consys->archccnt-- ; else consys->cutccnt-- ; consys->concnt-- ; /* Rescan for maxima if necessary, and free the row header. That pretty well takes care of it. */ if (rescan_rows == TRUE || rescan_cols == TRUE) if (find_maxes(consys,rescan_cols,rescan_rows) == FALSE) { errmsg(112,rtnnme,consys->nme,"maxima update","row",rowhdr->nme, rowhdr->ndx) ; return (FALSE) ; } if (rowhdr->nme != NULL) STRFREE(rowhdr->nme) ; FREE(rowhdr) ; return (TRUE) ; } bool consys_delrow_stable (consys_struct *consys, int rowndx) /* [Jun 01, 01] Same as consys_delrow, except it maintains the order of constraints (thus the name 'stable').... TODO This routine removes a row from the constraint matrix. If coupling is enabled, the corresponding logical variable is also removed. Any required row and column swaps are made to keep the constraint system compact. Parameters: consys: Constraint system rowndx: Index of the row to be deleted. Returns: TRUE if the deletion proceeded without error, FALSE otherwise. */ { int colndx,i ; colhdr_struct *colhdr ; rowhdr_struct *rowhdr ; bool rescan_rows,rescan_cols ; const char *rtnnme = "consys_delrow" ; # ifdef DYLP_PARANOIA if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (FALSE) ; } if (consys->mtx.rows == NULL) { errmsg(101,rtnnme,consys->nme,"row header") ; return (FALSE) ; } if (consys->mtx.cols == NULL) { errmsg(101,rtnnme,consys->nme,"column header") ; return (FALSE) ; } if (flgon(consys->opts,CONSYS_LVARS)) if (consys->logvcnt != consys->concnt) { errmsg(131,rtnnme,consys->nme,consys->logvcnt,consys->concnt) ; return (FALSE) ; } # endif # ifndef DYLP_NDEBUG if (rowndx <= 0 || rowndx > consys->concnt) { errmsg(102,rtnnme,consys->nme,"row",rowndx,1,consys->concnt) ; return (FALSE) ; } # endif rowhdr = consys->mtx.rows[rowndx] ; # ifdef DYLP_PARANOIA if (rowhdr == NULL) { errmsg(103,rtnnme,consys->nme,"row",rowndx) ; return (FALSE) ; } if (rowndx != rowhdr->ndx) { errmsg(126,rtnnme,consys->nme,"row",rowhdr,rowhdr->ndx,rowndx, rowhdr) ; return (FALSE) ; } # endif /* If coupling is on, delete the logical variable (this avoids a pointless warning about a 0-length column in the usual case where the logical variable appears only in its associated constraint). We'll need to swap the last logical into the space vacated by the deleted logical, and swap the last architectural variable into the space vacated by the last logical. We may need to do an additional swap within the logicals, to maintain the separation between architectural and cut constraints. */ rescan_rows = FALSE ; if (flgon(consys->opts,CONSYS_LVARS)) { colndx = rowndx ; colhdr = consys->mtx.cols[colndx] ; # ifdef DYLP_PARANOIA if (colhdr == NULL) { errmsg(103,rtnnme,consys->nme,"column",colndx) ; return (FALSE) ; } if (colhdr->ndx != colndx) { errmsg(126,rtnnme,consys->nme,"column",colhdr,colhdr->ndx,colndx,colhdr) ; return (FALSE) ; } # endif if (empty_col(consys,colndx,&rescan_rows) == FALSE) { setflg(consys->opts,CONSYS_CORRUPT) ; errmsg(112,rtnnme,consys->nme,"empty","column",colhdr->nme,colndx) ; return (FALSE) ; } if (colhdr->nme != NULL) STRFREE(colhdr->nme) ; FREE(colhdr) ; if (colndx < consys->archccnt && consys->cutccnt > 0) { if (move_col(consys,consys->archccnt,colndx) == FALSE) { setflg(consys->opts,CONSYS_CORRUPT) ; errmsg(112,rtnnme,consys->nme,"swap","column", consys_nme(consys,'v',consys->archccnt,FALSE,NULL), consys->archccnt) ; return (FALSE) ; } colndx = consys->archccnt ; } if (colndx < consys->logvcnt) if (move_col(consys,consys->logvcnt,colndx) == FALSE) { setflg(consys->opts,CONSYS_CORRUPT) ; errmsg(112,rtnnme,consys->nme,"swap","column", consys_nme(consys,'v',consys->logvcnt,FALSE,NULL), consys->logvcnt) ; return (FALSE) ; } if (consys->archvcnt > 0) if (move_col(consys,consys->varcnt,consys->logvcnt) == FALSE) { setflg(consys->opts,CONSYS_CORRUPT) ; errmsg(112,rtnnme,consys->nme,"swap","column", consys_nme(consys,'v',consys->varcnt,FALSE,NULL), consys->varcnt) ; return (FALSE) ; } consys->logvcnt-- ; consys->varcnt-- ; } /* Now empty the row, forcing the row rescan flag if we're deleting the current maximum length row, and invalidating objndx if we've deleted the objective constraint. We'll need to do the same reordering of the constraints that we applied to the logicals. */ if (empty_row(consys,rowndx,&rescan_cols) == FALSE) { setflg(consys->opts,CONSYS_CORRUPT) ; errmsg(112,rtnnme,consys->nme,"empty","row",rowhdr->nme,rowndx) ; return (FALSE) ; } if (rowndx == consys->maxrowndx) rescan_rows = TRUE ; if (rowndx == consys->objndx) consys->objndx = -1 ; if (rowndx < consys->archccnt && consys->cutccnt > 0) { if (move_row(consys,consys->archccnt,rowndx) == FALSE) { setflg(consys->opts,CONSYS_CORRUPT) ; errmsg(112,rtnnme,consys->nme,"swap","row", consys_nme(consys,'c',consys->archccnt,FALSE,NULL), consys->archccnt) ; return (FALSE) ; } rowndx = consys->archccnt ; } if (rowndx < consys->concnt) if (move_row(consys,consys->concnt,rowndx) == FALSE) { setflg(consys->opts,CONSYS_CORRUPT) ; errmsg(112,rtnnme,consys->nme,"swap","row", consys_nme(consys,'c',consys->concnt,FALSE,NULL),consys->concnt) ; return (FALSE) ; } for (i=rowndx; iconcnt; i++) { if (move_row(consys,i+1,i) == FALSE) { setflg(consys->opts,CONSYS_CORRUPT) ; errmsg(112,rtnnme,consys->nme,"swap","row", consys_nme(consys,'c',i+1,FALSE,NULL),i+1) ; return (FALSE) ; } } if (rowhdr->ndx <= consys->archccnt) consys->archccnt-- ; else consys->cutccnt-- ; consys->concnt-- ; /* Rescan for maxima if necessary, and free the row header. That pretty well takes care of it. */ if (rescan_rows == TRUE || rescan_cols == TRUE) if (find_maxes(consys,rescan_cols,rescan_rows) == FALSE) { errmsg(112,rtnnme,consys->nme,"maxima update","row",rowhdr->nme, rowhdr->ndx) ; return (FALSE) ; } if (rowhdr->nme != NULL) STRFREE(rowhdr->nme) ; FREE(rowhdr) ; return (TRUE) ; } double consys_getcoeff (consys_struct *consys, int rowndx, int colndx) /* This routine retrieves a single coefficient a from the constraint matrix. The specified row and column must exist. If the coefficient doesn't exist, the routine assumes it's zero. consys_getcoeff searches for the coefficient by scanning the column, on the observation that in lp constraint systems the number of variables is usually much greater than the number of constraints. Parameters: consys: the constraint system rowndx: row index colndx: column index Returns: a if the coefficient exists, 0 if rowndx and colndx are valid, but a is absent, NaN otherwise (paranoia only) */ { int lclndx ; coeff_struct *coeff ; colhdr_struct *colhdr ; rowhdr_struct *rowhdr ; # if defined(DYLP_PARANOIA) || !defined(DYLP_NDEBUG) const char *rtnnme = "consys_getcoeff" ; # endif # ifdef DYLP_PARANOIA if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (quiet_nan(0)) ; } if (consys->mtx.rows == NULL) { errmsg(101,rtnnme,consys->nme,"row header") ; return (quiet_nan(0)) ; } if (consys->mtx.cols == NULL) { errmsg(101,rtnnme,consys->nme,"column header") ; return (quiet_nan(0)) ; } if (flgon(consys->opts,CONSYS_LVARS)) if (consys->logvcnt != consys->concnt) { errmsg(131,rtnnme,consys->nme,consys->logvcnt,consys->concnt) ; return (quiet_nan(0)) ; } # endif # ifndef DYLP_NDEBUG if (rowndx <= 0 || rowndx > consys->concnt) { errmsg(102,rtnnme,consys->nme,"row",rowndx,1,consys->concnt) ; return (quiet_nan(0)) ; } if (colndx <= 0 || colndx > consys->varcnt) { errmsg(102,rtnnme,consys->nme,"column",colndx,1,consys->varcnt) ; return (quiet_nan(0)) ; } # endif colhdr = consys->mtx.cols[colndx] ; # ifdef DYLP_PARANOIA if (colhdr == NULL) { errmsg(103,rtnnme,consys->nme,"column",colndx) ; return (quiet_nan(0)) ; } if (colndx != colhdr->ndx) { errmsg(126,rtnnme,consys->nme,"column",colhdr,colhdr->ndx,colndx, colhdr) ; return (quiet_nan(0)) ; } rowhdr = consys->mtx.rows[rowndx] ; if (rowhdr == NULL) { errmsg(103,rtnnme,consys->nme,"row",rowndx) ; return (quiet_nan(0)) ; } if (rowndx != rowhdr->ndx) { errmsg(126,rtnnme,consys->nme,"row",rowhdr,rowhdr->ndx,rowndx, rowhdr) ; return (quiet_nan(0)) ; } # endif /* Scan the column for the requested coefficient. */ for (coeff = colhdr->coeffs ; coeff != NULL ; coeff = coeff->colnxt) { rowhdr = coeff->rowhdr ; # ifdef DYLP_PARANOIA if (rowhdr == NULL) { errmsg(125,rtnnme,consys->nme,"rowhdr",coeff,"column", consys_nme(consys,'v',colndx,FALSE,NULL),colndx) ; return (quiet_nan(0)) ; } # endif lclndx = rowhdr->ndx ; # ifdef DYLP_PARANOIA if (lclndx <= 0 || lclndx > consys->concnt) { errmsg(102,rtnnme,consys->nme,"row",lclndx,1,consys->concnt) ; return (quiet_nan(0)) ; } if (consys->mtx.rows[lclndx] != rowhdr) { errmsg(126,rtnnme,consys->nme,"row",rowhdr,lclndx,lclndx, consys->mtx.rows[lclndx]) ; return (quiet_nan(0)) ; } # endif if (lclndx == rowndx) break ; } /* Return the value, or zero. */ if (coeff == NULL) return (0.0) ; else return (coeff->val) ; } bool consys_setcoeff (consys_struct *consys, int rowndx, int colndx, double val) /* This routine modifies a single coefficient a in the constraint matrix. If rowndx and colndx are valid but the coefficient doesn't exist, it will be created. If the coefficient exists, but val is zero, it will be removed. consys_setcoeff searches for the coefficient by scanning the column, on the observation that in lp constraint systems the number of variables is usually much greater than the number of constraints. Parameters: consys: the constraint system rowndx: row index colndx: column index val: new value of the coefficient Returns: TRUE if the indices are valid and the coefficient is properly set, FALSE otherwise. */ { int lclndx ; bool scanrows,scancols ; coeff_struct *coeff,**pcoeff ; colhdr_struct *colhdr ; rowhdr_struct *rowhdr ; const char *rtnnme = "consys_chgcoeff" ; # ifdef DYLP_PARANOIA if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (FALSE) ; } if (consys->mtx.rows == NULL) { errmsg(101,rtnnme,consys->nme,"row header") ; return (FALSE) ; } if (consys->mtx.cols == NULL) { errmsg(101,rtnnme,consys->nme,"column header") ; return (FALSE) ; } if (flgon(consys->opts,CONSYS_LVARS)) if (consys->logvcnt != consys->concnt) { errmsg(131,rtnnme,consys->nme,consys->logvcnt,consys->concnt) ; return (FALSE) ; } # endif # ifndef DYLP_NDEBUG if (rowndx <= 0 || rowndx > consys->concnt) { errmsg(102,rtnnme,consys->nme,"row",rowndx,1,consys->concnt) ; return (FALSE) ; } if (colndx <= 0 || colndx > consys->varcnt) { errmsg(102,rtnnme,consys->nme,"column",colndx,1,consys->varcnt) ; return (FALSE) ; } # endif colhdr = consys->mtx.cols[colndx] ; # ifdef DYLP_PARANOIA if (colhdr == NULL) { errmsg(103,rtnnme,consys->nme,"column",colndx) ; return (FALSE) ; } if (colndx != colhdr->ndx) { errmsg(126,rtnnme,consys->nme,"column",colhdr,colhdr->ndx,colndx, colhdr) ; return (FALSE) ; } rowhdr = consys->mtx.rows[rowndx] ; if (rowhdr == NULL) { errmsg(103,rtnnme,consys->nme,"row",rowndx) ; return (FALSE) ; } if (rowndx != rowhdr->ndx) { errmsg(126,rtnnme,consys->nme,"row",rowhdr,rowhdr->ndx,rowndx, rowhdr) ; return (FALSE) ; } # endif if (fabs(val) >= consys->inf) { setflg(consys->opts,CONSYS_CORRUPT) ; errmsg(128,rtnnme,consys->nme,rowndx,colndx,val, "coefficient","") ; return (FALSE) ; } /* Scan the column for the requested coefficient. If we find it, we can change the value and we're finished. */ if (val != 0) { for (coeff = colhdr->coeffs ; coeff != NULL ; coeff = coeff->colnxt) { rowhdr = coeff->rowhdr ; # ifdef DYLP_PARANOIA if (rowhdr == NULL) { errmsg(125,rtnnme,consys->nme,"rowhdr",coeff,"column", consys_nme(consys,'v',colndx,FALSE,NULL),colndx) ; return (FALSE) ; } # endif lclndx = rowhdr->ndx ; # ifdef DYLP_PARANOIA if (lclndx <= 0 || lclndx > consys->concnt) { errmsg(102,rtnnme,consys->nme,"row",lclndx,1,consys->concnt) ; return (FALSE) ; } if (consys->mtx.rows[lclndx] != rowhdr) { errmsg(126,rtnnme,consys->nme,"row",rowhdr,lclndx,lclndx, consys->mtx.rows[lclndx]) ; return (FALSE) ; } # endif if (lclndx == rowndx) break ; } /* Found it. Set the value and we're done. */ if (coeff != NULL) { coeff->val = val ; return (TRUE) ; } /* Sigh. No coefficient, we'll have to create one. */ rowhdr = consys->mtx.rows[rowndx] ; coeff = (coeff_struct *) MALLOC(sizeof(coeff_struct)) ; coeff->rowhdr = rowhdr ; coeff->colhdr = colhdr ; coeff->val = val ; coeff->rownxt = rowhdr->coeffs ; rowhdr->coeffs = coeff ; rowhdr->len++ ; if (rowhdr->len > consys->maxrowlen) { consys->maxrowlen = rowhdr->len ; consys->maxrowndx = rowndx ; } colhdr->len++ ; if (colhdr->len > consys->maxcollen) { consys->maxcollen = colhdr->len ; consys->maxcolndx = colndx ; } } /* If val is zero, we have to run a slightly more complicated search loop which will allow us to delete the coefficient. */ else { for (pcoeff = &colhdr->coeffs, coeff = *pcoeff ; coeff != NULL ; pcoeff = &coeff->colnxt, coeff = *pcoeff) { rowhdr = coeff->rowhdr ; # ifdef DYLP_PARANOIA if (rowhdr == NULL) { errmsg(125,rtnnme,consys->nme,"rowhdr",coeff,"column", consys_nme(consys,'v',colndx,FALSE,NULL),colndx) ; return (FALSE) ; } # endif lclndx = rowhdr->ndx ; # ifdef DYLP_PARANOIA if (lclndx <= 0 || lclndx > consys->concnt) { errmsg(102,rtnnme,consys->nme,"row",lclndx,1,consys->concnt) ; return (FALSE) ; } if (consys->mtx.rows[lclndx] != rowhdr) { errmsg(126,rtnnme,consys->nme,"row",rowhdr,lclndx,lclndx, consys->mtx.rows[lclndx]) ; return (FALSE) ; } # endif if (lclndx == rowndx) break ; } /* Best if we don't find the coefficient, actually. */ if (coeff == NULL) return (TRUE) ; /* But if we do, delink it from the column, then find it row-wise and delink it from the row, then free the space. */ *pcoeff = coeff->colnxt ; for (pcoeff = &rowhdr->coeffs ; *pcoeff != NULL ; pcoeff = &(*pcoeff)->rownxt) { if (*pcoeff == coeff) break ; } # ifdef DYLP_PARANOIA if (*pcoeff == NULL) { errmsg(119,rtnnme,consys->nme,rowndx,colndx,coeff->val, "column",colhdr->ndx,"row",rowhdr->ndx) ; return (FALSE) ; } # endif *pcoeff = coeff->rownxt ; FREE(coeff) ; /* Correct the column and row lengths, and the total coefficient count, and rescan for maximum column and row if necessary. */ consys->mtx.coeffcnt-- ; colhdr->len-- ; if (colndx == consys->maxcolndx) scancols = TRUE ; else scancols = FALSE ; rowhdr->len-- ; if (rowndx == consys->maxrowndx) scanrows = TRUE ; else scanrows = FALSE ; if (scancols == TRUE || scanrows == TRUE) { if (find_maxes(consys,scancols,scanrows) == FALSE) { errmsg(112,rtnnme,consys->nme,"maxima update","column",colhdr->nme, colhdr->ndx) ; return (FALSE) ; } } } return (TRUE) ; } bool consys_logicals (consys_struct *consys) /* This routine establishes logical variables for a constraint system. Parameters: consys: the constraint system Returns: TRUE if logicals are set up successfully, FALSE otherwise. */ { int ndx ; const char *rtnnme = "consys_logicals" ; # ifdef DYLP_PARANOIA if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (FALSE) ; } if (consys->mtx.rows == NULL) { errmsg(101,rtnnme,consys->nme,"row header") ; return (FALSE) ; } if (consys->mtx.cols == NULL) { errmsg(101,rtnnme,consys->nme,"column header") ; return (FALSE) ; } if (flgon(consys->opts,CONSYS_LVARS) || consys->logvcnt > 0) { errmsg(123,rtnnme,consys->nme) ; return (FALSE) ; } # endif /* Make sure the constraint system has enough room for the logicals. */ ndx = consys->archvcnt+consys->concnt-consys->colsze ; if (ndx > 0) if (consys_realloc(consys,'c',ndx) == FALSE) { setflg(consys->opts,CONSYS_CORRUPT) ; errmsg(124,rtnnme,consys->nme) ; return (FALSE) ; } /* Now step through the rows and create logical variables. */ for (ndx = 1 ; ndx <= consys->concnt ; ndx++) if (add_logical(consys,ndx) == FALSE) { setflg(consys->opts,CONSYS_CORRUPT) ; errmsg(121,rtnnme,consys->nme, consys_nme(consys,'c',ndx,FALSE,NULL),ndx) ; return (FALSE) ; } /* Turn on coupling and we're done. */ setflg(consys->opts,CONSYS_LVARS) ; return (TRUE) ; } DyLP-1.6.0/DyLP/src/Dylp/dy_warmstart.c0000644000076700007670000007224711026315405014470 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains the routines that handle a warm start, given a basis & status passed in by the user. */ #define DYLP_INTERNAL #include "dylp.h" static char sccsid[] UNUSED = "@(#)dy_warmstart.c 4.5 11/06/04" ; static char svnid[] UNUSED = "$Id: dy_warmstart.c 240 2008-06-18 23:32:21Z lou $" ; static void correct_for_patch (void) /* This routine scans dy_status looking for architectural variables that are recorded as basic but have been booted out of the basis by a patch operation. It's a very special-purpose routine, separated out so it doesn't clutter up the code in dy_warmstart. Parameters: none Returns: undefined */ { int j,cnt ; flags statj ; double *vlb,*vub ; vlb = dy_sys->vlb ; vub = dy_sys->vub ; /* Open a loop to scan the status array, checking that variables recorded as basic are really basic. dy_patch clears the var2basis entry when it makes the patch, so we're looking for basic status with a 0 in var2basis. When we find a variable that needs to be corrected, decide an appropriate nonbasic status based on the sign of the objective coefficient and the presence/absence of finite bounds. */ # ifndef DYLP_NDEBUG if (dy_opts->print.crash >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tcorrecting status due to basis patch ...") ; } # endif cnt = 0 ; for (j = dy_sys->concnt+1 ; j <= dy_sys->varcnt ; j++) { statj = dy_status[j] ; if (flgon(statj,vstatBASIC) && dy_var2basis[j] == 0) { if (vlb[j] > -dy_tols->inf && vub[j] < dy_tols->inf) { if (vub[j] == vlb[j]) { dy_status[j] = vstatNBFX ; dy_x[j] = vub[j] ; } else if (dy_sys->obj[j] >= 0) { dy_status[j] = vstatNBLB ; dy_x[j] = vlb[j] ; } else { dy_status[j] = vstatNBUB ; dy_x[j] = vub[j] ; } } else if (vlb[j] > -dy_tols->inf) { dy_status[j] = vstatNBLB ; dy_x[j] = vlb[j] ; } else if (vub[j] < dy_tols->inf) { dy_status[j] = vstatNBUB ; dy_x[j] = vub[j] ; } else { dy_status[j] = vstatNBFR ; dy_x[j] = 0 ; } # ifndef DYLP_NDEBUG if (dy_opts->print.crash >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t changing status for %s (%d) to %s,", consys_nme(dy_sys,'v',j,FALSE,NULL),j, dy_prtvstat(dy_status[j])) ; dyio_outfmt(dy_logchn,dy_gtxecho," value %g.",dy_x[j]) ; } # endif cnt++ ; } } # ifndef DYLP_NDEBUG /* Given that this routine has been called, there should be corrections to be made, but it's possible that the patch involved only logicals. If so, dy_warmstart has already dealt with the problem and we simply can't tell. (The necessary data structure is not exported from dy_basis.c) The least we can do is print a message. */ if (cnt == 0 && dy_opts->print.crash >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t no architecturals corrected.") ; } # endif return ; } dyret_enum dy_warmstart (lpprob_struct *orig_lp) /* This routine is responsible for recreating the active constraint system, basis, and status specified by the user in orig_lp. It will handle even the pathological case of 0 active constraints and 0 active variables. If the user has supplied an active variable vector, only those variables will be activated. Clearly, the supplied basis, status, and active variable vector should be consistent, or bad things will happen. If we're operating in fullsys mode, we need to check here for additions to the constraint system. << In the very near future, this routine should also be upgraded to cope with the possibility that constraints specified in the warm start basis have disappeared. >> Parameters: orig_lp: The original lp problem structure Returns: dyrOK if the setup completes without error, any of a number of error codes otherwise (dyrFATAL, dyrINV, or a code from dy_factor) */ { int vndx,dyvndx,bpos,cndx,dycndx,dycsze,dyvsze,nbfxcnt ; double *vlb,*vub,vlbj,vubj,obj ; consys_struct *orig_sys ; flags *orig_status,vstat,calcflgs ; dyret_enum retval ; basisel_struct *orig_basis ; bool *orig_actvars,rngseen,noactvarspec ; pkvec_struct *pkcol ; char nmebuf[50] ; flags parts = CONSYS_OBJ|CONSYS_VUB|CONSYS_VLB|CONSYS_RHS|CONSYS_RHSLOW| CONSYS_VTYP|CONSYS_CTYP, opts = CONSYS_LVARS|CONSYS_WRNATT ; const char *rtnnme = "dy_warmstart" ; extern void dy_setfinalstatus(void) ; /* dy_hotstart.c */ # if defined(DYLP_PARANOIA) || !defined(DYLP_NDEBUG) double xi ; # endif retval = dyrINV ; nbfxcnt = -1 ; /* Do a little unpacking. */ orig_sys = orig_lp->consys ; orig_status = orig_lp->status ; orig_basis = orig_lp->basis->el ; if (flgon(orig_lp->ctlopts,lpctlACTVARSIN) && dy_opts->fullsys == FALSE) { orig_actvars = orig_lp->actvars ; noactvarspec = FALSE ; } else { orig_actvars = NULL ; noactvarspec = TRUE ; } /* Initialise the statistics on loadable/unloadable variables and constraints. */ dy_lp->sys.forcedfull = FALSE ; dy_lp->sys.vars.loadable = orig_sys->varcnt ; dy_lp->sys.vars.unloadable = 0 ; dy_lp->sys.cons.loadable = orig_sys->concnt ; dy_lp->sys.cons.unloadable = 0 ; /* Create the dy_sys constraint system to match the user's basis and active variables (if specified). We'll create the system with logicals enabled. For variables, if there is an active variable vector, skim it for a count. Otherwise, skim the status array and count the number of nonbasic fixed variables (which will never become active). For constraints, we need to consider the possibility that the user has added cuts and is trusting dylp to deal with it. If we're operating in the usual dynamic mode, this will be picked up automatically, and we can size the constraint system to the active constraints of the basis. But if we're operating in fullsys mode, we need to add them here. In this case, the number of constraints is the current size of the constraint system. Take this opportunity to clean the bounds arrays, making sure that bounds within the feasibility tolerance of one another are set to be exactly equal. (This simplifies handling fixed variables.) For nonbasic variables, force the status to NBFX and cancel activation if actvars is present. Basic variables which need BFX are picked up later, after the basis is established. */ vub = orig_sys->vub ; vlb = orig_sys->vlb ; dyio_outfxd(nmebuf,-((int) (sizeof(nmebuf)-1)), 'l',"%s[actv]",orig_sys->nme) ; if (noactvarspec == FALSE) { dyvsze = 0 ; for (vndx = 1 ; vndx <= orig_sys->varcnt ; vndx++) { vlbj = vlb[vndx] ; vubj = vub[vndx] ; if (atbnd(vlbj,vubj)) { if (vlbj != vubj) { # ifndef DYLP_NDEBUG if (dy_opts->print.setup >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tForcing equal bound %g for %s (%d)", (vlbj+vubj)/2,consys_nme(orig_sys,'v',vndx,0,0),vndx) ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t original lb = %g, ub = %g, diff = %g, tol = %g", vlbj,vubj,vubj-vlbj,dy_tols->pfeas) ; } # endif vlb[vndx] = (vlbj+vubj)/2 ; vub[vndx] = vlb[vndx] ; } if (((int) orig_status[vndx]) > 0) { orig_status[vndx] = vstatNBFX ; orig_actvars[vndx] = FALSE ; } } if (vlb[vndx] > vub[vndx]) { dy_lp->lpret = lpINFEAS ; # ifndef DYLP_NDEBUG if (dy_opts->print.setup >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tTrivial infeasibility for %s (%d), lb = %g > ub = %g.", consys_nme(orig_sys,'v',vndx,0,0),vndx,vlb[vndx],vub[vndx]) ; } # endif } if (orig_actvars[vndx] == TRUE) dyvsze++ ; } } else { nbfxcnt = 0 ; for (vndx = 1 ; vndx <= orig_sys->varcnt ; vndx++) { vlbj = vlb[vndx] ; vubj = vub[vndx] ; if (atbnd(vlbj,vubj)) { if (vlbj != vubj) { # ifndef DYLP_NDEBUG if (dy_opts->print.setup >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tForcing equal bound %g for %s (g)", (vlbj+vubj)/2,consys_nme(orig_sys,'v',vndx,0,0),vndx) ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t original lb = %g, ub = %g, diff = %g, tol = %g", vlbj,vubj,vubj-vlbj,dy_tols->pfeas) ; } # endif vlb[vndx] = (vlbj+vubj)/2 ; vub[vndx] = vlb[vndx] ; } if (((int) orig_status[vndx]) > 0) { orig_status[vndx] = vstatNBFX ; } } if (vlb[vndx] > vub[vndx]) { dy_lp->lpret = lpINFEAS ; } if ((((int) orig_status[vndx]) > 0) && flgon(orig_status[vndx],vstatNBFX)) { nbfxcnt++ ; } } dyvsze = orig_sys->varcnt-nbfxcnt ; } if (dy_opts->fullsys == TRUE) dycsze = orig_sys->concnt ; else dycsze = orig_lp->basis->len ; dyvsze += dycsze ; # ifndef DYLP_NDEBUG if (dy_opts->print.setup >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n creating constraint system %s (%d x %d+%d)", nmebuf,dycsze,dyvsze-dycsze,dycsze) ; if (dy_opts->print.setup >= 3) { if (flgoff(orig_lp->ctlopts,lpctlACTVARSIN)) dyio_outfmt(dy_logchn,dy_gtxecho, "\n %d nonbasic fixed variables excluded.", nbfxcnt) ; } } # endif dy_sys = consys_create(nmebuf,parts,opts,dycsze,dyvsze,dy_tols->inf) ; if (dy_sys == NULL) { errmsg(152,rtnnme,nmebuf) ; return (dyrFATAL) ; } /* Hang a set of translation vectors onto each system: origcons and origvars on orig_sys, and actcons and actvars on dy_sys. */ if (consys_attach(dy_sys,CONSYS_ROW, sizeof(int),(void **) &dy_actvars) == FALSE) { errmsg(100,rtnnme,dy_sys->nme,"active -> original variable map") ; return (dyrFATAL) ; } if (consys_attach(dy_sys,CONSYS_COL, sizeof(int),(void **) &dy_actcons) == FALSE) { errmsg(100,rtnnme,dy_sys->nme,"active -> original constraint map") ; return (dyrFATAL) ; } if (consys_attach(orig_sys,CONSYS_ROW, sizeof(int),(void **) &dy_origvars) == FALSE) { errmsg(100,rtnnme,orig_sys->nme,"original -> active variable map") ; return (dyrFATAL) ; } if (consys_attach(orig_sys,CONSYS_COL, sizeof(int),(void **) &dy_origcons) == FALSE) { errmsg(100,rtnnme,orig_sys->nme,"original -> active constraint map") ; return (dyrFATAL) ; } /* dy_origvars is cleared to 0 as it's attached, indicating that the original variables have no predefined status. We need to correct this. If the caller's supplied an active variable vector, we can use it to activate variables prior to adding constraints. (But in any case don't activate nonbasic fixed variables.) It's illegal to declare a formerly basic variable to be inactive by the simple expedient of setting actvars[vndx] = FALSE, hence the paranoid check. Otherwise, we'll need to depend on dy_loadcon to activate the variables referenced in the active constraints. We'll still fill in origvars, with two purposes: * We can avoid activating nonbasic fixed variables. * We can use dy_origvars == 0 as a paranoid check from here on out. Inactive variables are required to be nonbasic, so in this case the proper status for formerly basic variables is SB. */ if (noactvarspec == FALSE) { # ifndef DYLP_NDEBUG if (dy_opts->print.setup >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n processing active variable list ...") ; } # endif pkcol = pkvec_new(0) ; for (vndx = 1 ; vndx <= orig_sys->varcnt ; vndx++) { if (((int) orig_status[vndx]) > 0) vstat = orig_status[vndx] ; else vstat = vstatB ; if (orig_actvars[vndx] == TRUE && flgoff(vstat,vstatNBFX)) { if (consys_getcol_pk(orig_sys,vndx,&pkcol) == FALSE) { errmsg(122,rtnnme,orig_sys->nme,"variable", consys_nme(orig_sys,'v',vndx,TRUE,NULL),vndx) ; retval = dyrFATAL ; break ; } if (consys_addcol_pk(dy_sys,vartypCON,pkcol, orig_sys->obj[vndx],vlb[vndx],vub[vndx]) == FALSE) { errmsg(156,rtnnme,"variable",dy_sys->nme,pkcol->nme) ; retval = dyrFATAL ; break ; } dyvndx = pkcol->ndx ; dy_origvars[vndx] = dyvndx ; dy_actvars[dyvndx] = vndx ; # ifndef DYLP_NDEBUG if (dy_opts->print.setup >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tactivating %s variable %s (%d) to index %d.", consys_prtvartyp(orig_sys->vtyp[vndx]), consys_nme(orig_sys,'v',vndx,FALSE,NULL),vndx,dyvndx) ; } # endif } else { # ifdef DYLP_PARANOIA if (flgon(vstat,vstatBASIC)) { errmsg(380,rtnnme,orig_sys->nme, consys_nme(orig_sys,'v',vndx,FALSE,NULL),vndx, dy_prtvstat(vstat),"non-basic") ; retval = dyrFATAL ; break ; } # endif dy_origvars[vndx] = -((int) vstat) ; } } pkvec_free(pkcol) ; if (retval != dyrINV) return (retval) ; } else { for (vndx = 1 ; vndx <= orig_sys->varcnt ; vndx++) { if (((int) orig_status[vndx]) > 0) vstat = orig_status[vndx] ; else vstat = vstatSB ; MARK_INACTIVE_VAR(vndx,-((int) vstat)) ; } } /* Walk the basis and install the constraints in order. When we're finished with this, the active system will be up and about. In the case where there's no active variable specification, some of the status information written into dy_origvars may have been overwritten; only variables with vstatNBFX are guaranteed to remain inactive. */ rngseen = FALSE ; for (bpos = 1 ; bpos <= orig_lp->basis->len ; bpos++) { cndx = orig_basis[bpos].cndx ; # ifndef DYLP_NDEBUG if (dy_opts->print.setup >= 2) dyio_outfmt(dy_logchn,dy_gtxecho, "\n activating %s %s (%d) in pos'n %d", consys_prtcontyp(orig_sys->ctyp[cndx]), consys_nme(orig_sys,'c',cndx,FALSE,NULL),cndx,bpos) ; # endif # ifdef DYLP_STATISTICS if (dy_stats != NULL) dy_stats->cons.init[cndx] = TRUE ; # endif if (dy_loadcon(orig_sys,cndx,noactvarspec,NULL) == FALSE) { errmsg(430,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "activate","constraint", consys_nme(orig_sys,'c',cndx,TRUE,NULL),cndx) ; return (dyrFATAL) ; } if (orig_sys->ctyp[cndx] == contypRNG) rngseen = TRUE ; } /* If we're in fullsys mode, repeat constraint installation actions for any cuts added after this basis was assembled. */ if (dy_opts->fullsys == TRUE) { for (cndx = orig_lp->basis->len+1 ; cndx <= orig_sys->concnt ; cndx++) { # ifndef DYLP_NDEBUG if (dy_opts->print.setup >= 2) dyio_outfmt(dy_logchn,dy_gtxecho, "\n activating %s %s (%d) in pos'n %d", consys_prtcontyp(orig_sys->ctyp[cndx]), consys_nme(orig_sys,'c',cndx,FALSE,NULL),cndx,cndx) ; # endif # ifdef DYLP_STATISTICS if (dy_stats != NULL) dy_stats->cons.init[cndx] = TRUE ; # endif if (dy_loadcon(orig_sys,cndx,noactvarspec,NULL) == FALSE) { errmsg(430,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "activate","constraint", consys_nme(orig_sys,'c',cndx,TRUE,NULL),cndx) ; return (dyrFATAL) ; } if (orig_sys->ctyp[cndx] == contypRNG) rngseen = TRUE ; } } # ifdef DYLP_PARANOIA /* Paranoid checks and informational print statements. */ if (dy_chkdysys(orig_sys) == FALSE) return (dyrINV) ; # endif # ifndef DYLP_NDEBUG if (dy_opts->print.setup >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n system %s has %d constraints, %d+%d variables", dy_sys->nme,dy_sys->concnt,dy_sys->archvcnt,dy_sys->logvcnt) ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n %d constraints, %d variables remain inactive in system %s.", orig_sys->concnt-dy_sys->concnt,orig_sys->archvcnt-dy_sys->archvcnt, orig_sys->nme) ; if (dy_opts->print.setup >= 4) { nbfxcnt = 0 ; for (vndx = 1 ; vndx <= orig_sys->varcnt ; vndx++) { if (INACTIVE_VAR(vndx)) { vstat = (flags) (-dy_origvars[vndx]) ; switch (getflg(vstat,vstatSTATUS)) { case vstatNBUB: { xi = orig_sys->vub[vndx] ; break ; } case vstatNBLB: case vstatNBFX: { xi = orig_sys->vlb[vndx] ; break ; } case vstatNBFR: { xi = 0 ; break ; } default: { errmsg(433,rtnnme,dy_sys->nme, dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "inactive",consys_nme(orig_sys,'v',vndx,TRUE,NULL), vndx,dy_prtvstat(vstat)) ; return (dyrINV) ; } } if (xi != 0) { if (nbfxcnt == 0) dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tinactive variables with nonzero values:") ; nbfxcnt++ ; dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t%s (%d) = %g, status %s", consys_nme(orig_sys,'v',vndx,FALSE,NULL),vndx,xi, dy_prtvstat(vstat)) ; } } } if (nbfxcnt == 0) dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tall inactive variables are zero.") ; } } # endif /* Time to assemble the basis. Attach the basis and inverse basis vectors to the constraint system. consys_attach will initialise them to 0. */ if (consys_attach(dy_sys,CONSYS_COL, sizeof(int),(void **) &dy_basis) == FALSE) { errmsg(100,rtnnme,dy_sys->nme,"basis vector") ; return (dyrFATAL) ; } if (consys_attach(dy_sys,CONSYS_ROW, sizeof(int),(void **) &dy_var2basis) == FALSE) { errmsg(100,rtnnme,dy_sys->nme,"inverse basis vector") ; return (dyrFATAL) ; } # ifndef DYLP_NDEBUG if (dy_opts->print.crash >= 1) { if (dy_opts->print.setup == 0) dyio_outfmt(dy_logchn,dy_gtxecho, "\n %s: regenerating the basis ...",rtnnme) ; else dyio_outfmt(dy_logchn,dy_gtxecho, "\n regenerating the basis.",rtnnme) ; } # endif /* Load the basis. For variables, we need to translate architecturals using dy_origvars, and watch out for logicals (vndx = negative of associated constraint index). After all the paranoia, we finally update dy_basis and dy_var2basis. Because we loaded the constraints in the order they were listed in the basis, we should have that dycndx = bpos, hence dy_actcons[bpos] = cndx. If we're installing a basic variable, it should be active already. For architectural variables, the check is made in dy_origvars. For a logical, the associated constraint should be active, hence a non-zero entry in dy_origcons. For architecturals, we also check if there are any non-zero coefficients remaining in the column (who knows what the user has done to the constraint system). This rates a message if the print level is high enough, but the basis pacakge is capable of patching the basis. (Indeed, it's hard to do it correctly here.) */ # ifdef DYLP_PARANOIA pkcol = pkvec_new(0) ; retval = dyrOK ; # endif for (bpos = 1 ; bpos <= orig_lp->basis->len ; bpos++) { cndx = orig_basis[bpos].cndx ; dycndx = dy_origcons[cndx] ; vndx = orig_basis[bpos].vndx ; if (vndx < 0) { dyvndx = dy_origcons[-vndx] ; } else { dyvndx = dy_origvars[vndx] ; } # ifdef DYLP_PARANOIA if (dycndx <= 0) { errmsg(369,rtnnme,orig_sys->nme,"constraint", consys_nme(orig_sys,'c',cndx,FALSE,NULL),cndx, "cons",cndx,dycndx) ; retval = dyrINV ; break ; } if (dy_actcons[bpos] != cndx) { errmsg(370,rtnnme,dy_sys->nme, consys_nme(orig_sys,'c',cndx,FALSE,NULL),cndx,bpos, consys_nme(orig_sys,'c',dy_actcons[bpos],FALSE,NULL), dy_actcons[bpos]) ; if (dycndx != bpos) { errmsg(1,rtnnme,__LINE__) ; } retval = dyrINV ; break ; } if (vndx < 0) { if (dyvndx <= 0) { errmsg(369,rtnnme,orig_sys->nme,"constraint", consys_nme(orig_sys,'c',-vndx,FALSE,NULL),-vndx, "cons",-vndx,dyvndx) ; retval = dyrINV ; break ; } } else { if (dyvndx <= 0) { errmsg(369,rtnnme,orig_sys->nme,"variable", consys_nme(orig_sys,'v',vndx,FALSE,NULL),vndx, "vars",vndx,dyvndx) ; retval = dyrINV ; break ; } if (consys_getcol_pk(dy_sys,dyvndx,&pkcol) == FALSE) { errmsg(122,rtnnme,orig_sys->nme,"variable", consys_nme(orig_sys,'v',vndx,TRUE,NULL),vndx) ; retval = dyrFATAL ; break ; } if (pkcol->cnt == 0 && dy_opts->print.crash >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n %s (%d) has no non-zeros in active constraints.", consys_nme(dy_sys,'v',dyvndx,TRUE,NULL),dyvndx) ; } } # endif dy_basis[dycndx] = dyvndx ; dy_var2basis[dyvndx] = dycndx ; } /* If we're in fullsys mode, make the logical basic for any remaining constraints. */ if (dy_opts->fullsys == TRUE) { for ( ; bpos <= dy_sys->concnt ; bpos++) { dy_basis[bpos] = bpos ; dy_var2basis[bpos] = bpos ; } } # ifdef DYLP_PARANOIA pkvec_free(pkcol) ; if (retval != dyrOK) return (retval) ; # endif # ifndef DYLP_NDEBUG if (dy_opts->print.crash >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t Pos'n Variable Constraint") ; for (bpos = 1 ; bpos <= orig_lp->basis->len ; bpos++) { vndx = dy_basis[bpos] ; dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t %3d (%3d) %-15s",bpos,vndx, consys_nme(dy_sys,'v',vndx,FALSE,NULL)) ; dyio_outfmt(dy_logchn,dy_gtxecho,"%-15s", consys_nme(dy_sys,'c',bpos,FALSE,NULL)) ; } } # endif /* Factor the basis. We don't want any of the primal or dual variables calculated just yet. If this fails we're in deep trouble. Don't do this if we're dealing with a constraint system with no constraints! */ if (dy_sys->concnt > 0) { # ifndef DYLP_NDEBUG if (dy_opts->print.crash >= 2) dyio_outfmt(dy_logchn,dy_gtxecho,"\n factoring ...") ; # endif calcflgs = 0 ; retval = dy_factor(&calcflgs) ; switch (retval) { case dyrOK: case dyrPATCHED: { break ; } default: { errmsg(309,rtnnme,dy_sys->nme) ; return (retval) ; } } } /* Attach and clear the vectors which will hold the status, values of primal and dual variables, and reduced costs. */ if (consys_attach(dy_sys,CONSYS_ROW, sizeof(flags),(void **) &dy_status) == FALSE) { errmsg(100,rtnnme,dy_sys->nme,"status vector") ; return (dyrFATAL) ; } if (consys_attach(dy_sys,CONSYS_COL, sizeof(double),(void **) &dy_xbasic) == FALSE) { errmsg(100,rtnnme,dy_sys->nme,"basic variable vector") ; return (dyrFATAL) ; } if (consys_attach(dy_sys,CONSYS_ROW, sizeof(double),(void **) &dy_x) == FALSE) { errmsg(100,rtnnme,dy_sys->nme,"primal variable vector") ; return (dyrFATAL) ; } if (consys_attach(dy_sys,CONSYS_COL, sizeof(double),(void **) &dy_y) == FALSE) { errmsg(100,rtnnme,dy_sys->nme,"dual variable vector") ; return (dyrFATAL) ; } if (consys_attach(dy_sys,CONSYS_ROW, sizeof(double),(void **) &dy_cbar) == FALSE) { errmsg(100,rtnnme,dy_sys->nme,"reduced cost vector") ; return (dyrFATAL) ; } /* Calculate dual variables and reduced costs. Might as well make a try for a dual feasible start, eh? */ # ifndef DYLP_NDEBUG if (dy_opts->print.crash >= 2) dyio_outfmt(dy_logchn,dy_gtxecho,"\n calculating dual values ...") ; # endif dy_calcduals() ; if (dy_calccbar() == FALSE) { errmsg(384,rtnnme,dy_sys->nme, dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; return (dyrFATAL) ; } /* Initialise dy_status for logicals, using dy_var2basis and dy_cbar as guides. We have to consider the type of constraint so that we can give artificials NBFX status (thus avoiding the issue of whether NBLB or NBUB gives dual feasibility), and so that we can check the sign of the associated reduced cost to determine the proper bound for the logical associated with a range constraint. */ vlb = dy_sys->vlb ; vub = dy_sys->vub ; # ifndef DYLP_NDEBUG if (dy_opts->print.crash >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n establishing initial status and reference frame ...") ; dyio_outfmt(dy_logchn,dy_gtxecho,"\n logicals ...") ; } # endif for (dyvndx = 1 ; dyvndx <= dy_sys->concnt ; dyvndx++) { if (dy_var2basis[dyvndx] != 0) { if (vub[dyvndx] == vlb[dyvndx]) dy_status[dyvndx] = vstatBFX ; else dy_status[dyvndx] = vstatB ; } else { switch (dy_sys->ctyp[dyvndx]) { case contypLE: case contypGE: { dy_status[dyvndx] = vstatNBLB ; dy_x[dyvndx] = 0 ; break ; } case contypEQ: { dy_status[dyvndx] = vstatNBFX ; dy_x[dyvndx] = 0 ; break ; } case contypRNG: { if (vub[dyvndx] == vlb[dyvndx]) { dy_status[dyvndx] = vstatNBFX ; dy_x[dyvndx] = vub[dyvndx] ; } else if (dy_cbar[dyvndx] < 0) { dy_status[dyvndx] = vstatNBUB ; dy_x[dyvndx] = vub[dyvndx] ; } else { dy_status[dyvndx] = vstatNBLB ; dy_x[dyvndx] = vlb[dyvndx] ; } break ; } default: { errmsg(1,rtnnme,__LINE__) ; return (dyrFATAL) ; } } } # ifndef DYLP_NDEBUG if (dy_opts->print.crash >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t %s (%d) %s", consys_nme(dy_sys,'v',dyvndx,FALSE,NULL),dyvndx, dy_prtvstat(dy_status[dyvndx])) ; if (flgon(dy_status[dyvndx],vstatNONBASIC|vstatNBFR)) dyio_outfmt(dy_logchn,dy_gtxecho," with value %g.",dy_x[dyvndx]) ; else dyio_outchr(dy_logchn,dy_gtxecho,'.') ; } # endif } /* Scan dy_origvars, with two purposes in mind: * For active architectural variables, initialise dy_status from orig_status, using the actual status for nonbasic variables, and vstatB, vstatBFX, or vstatBFR for basic variables. (We'll tune this once we have the values of the basic variables.) Initialise dy_x to the proper value for nonbasic variables. We shouldn't see NBFX here, as those variables should have been left inactive. * For inactive architectural variables, accumulate the objective function correction. Nonbasic free variables are assumed to have value 0. */ # ifndef DYLP_NDEBUG if (dy_opts->print.crash >= 2) dyio_outfmt(dy_logchn,dy_gtxecho,"\n architecturals ...") ; # endif dy_lp->inactzcorr = 0 ; for (vndx = 1 ; vndx <= orig_sys->varcnt ; vndx++) { dyvndx = dy_origvars[vndx] ; if (dyvndx < 0) { obj = orig_sys->obj[vndx] ; switch ((flags) (-dyvndx)) { case vstatNBFX: case vstatNBLB: { dy_lp->inactzcorr += obj*orig_sys->vlb[vndx] ; break ; } case vstatNBUB: { dy_lp->inactzcorr += obj*orig_sys->vub[vndx] ; break ; } # ifdef DYLP_PARANOIA case vstatNBFR: { break ; } default: { errmsg(1,rtnnme,__LINE__) ; return (dyrINV) ; } # endif } } else { if (((int) orig_status[vndx]) < 0) { if (vlb[dyvndx] == vub[dyvndx]) dy_status[dyvndx] = vstatBFX ; else if (vlb[dyvndx] <= -dy_tols->inf && vub[dyvndx] >= dy_tols->inf) dy_status[dyvndx] = vstatBFR ; else dy_status[dyvndx] = vstatB ; } else { dy_status[dyvndx] = orig_status[vndx] ; switch (dy_status[dyvndx]) { case vstatNBLB: { dy_x[dyvndx] = vlb[dyvndx] ; break ; } case vstatNBUB: { dy_x[dyvndx] = vub[dyvndx] ; break ; } case vstatNBFR: { dy_x[dyvndx] = 0 ; break ; } # ifdef DYLP_PARANOIA default: { errmsg(1,rtnnme,__LINE__) ; return (dyrINV) ; } # endif } } # ifndef DYLP_NDEBUG if (dy_opts->print.crash >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t %s (%d) %s", consys_nme(dy_sys,'v',dyvndx,FALSE,NULL),dyvndx, dy_prtvstat(dy_status[dyvndx])) ; if (flgon(dy_status[dyvndx],vstatNONBASIC|vstatNBFR)) dyio_outfmt(dy_logchn,dy_gtxecho," with value %g.",dy_x[dyvndx]) ; else dyio_outchr(dy_logchn,dy_gtxecho,'.') ; } # endif } } /* Did we patch the basis? If so, we need to scan the status array and correct the entries for the architectural variables that were booted out during the patch. */ if (retval == dyrPATCHED) correct_for_patch() ; /* Ok, status is set. Now it's time to calculate initial values for the primal variables and objective. Arguably we don't need the true objective for phase I, but it's cheap to calculate. Once we have the primal variables, adjust the status for any that are pinned against a bound or out of bounds, and see how it looks, in terms of primal infeasibility. */ # ifndef DYLP_NDEBUG if (dy_opts->print.crash >= 2) dyio_outfmt(dy_logchn,dy_gtxecho,"\n calculating primal values ...") ; # endif if (dy_calcprimals() == FALSE) { errmsg(316,rtnnme,dy_sys->nme) ; return (dyrFATAL) ; } dy_lp->z = dy_calcobj() ; dy_setfinalstatus() ; /* Make the check for primal and/or dual feasibility, and set the initial simplex phase accordingly. */ calcflgs = ladPRIMFEAS|ladPFQUIET|ladDUALFEAS|ladDFQUIET ; retval = dy_accchk(&calcflgs) ; if (retval != dyrOK) { errmsg(304,rtnnme,dy_sys->nme, dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; return (retval) ; } if (flgoff(calcflgs,ladPRIMFEAS)) { dy_lp->simplex.next = dyPRIMAL2 ; } else if (flgoff(calcflgs,ladDUALFEAS)) { dy_lp->simplex.next = dyDUAL ; } else { dy_lp->simplex.next = dyPRIMAL1 ; } # ifndef DYLP_NDEBUG if (dy_opts->print.crash >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n phase %s, initial objective %g", dy_prtlpphase(dy_lp->simplex.next,FALSE),dy_lp->z) ; if (dy_lp->infeascnt != 0) dyio_outfmt(dy_logchn,dy_gtxecho,", %d infeasible vars, infeas = %g", dy_lp->infeascnt,dy_lp->infeas) ; dyio_outchr(dy_logchn,dy_gtxecho,'.') ; } if (dy_opts->print.crash >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\nPos'n\tConstraint\tDual\t\tPrimal\n") ; for (bpos = 1 ; bpos <= dy_sys->concnt; bpos++) { cndx = dy_actcons[bpos] ; dyvndx = dy_basis[bpos] ; if (dyvndx <= dy_sys->concnt) vndx = orig_sys->varcnt+dyvndx ; else vndx = dy_actvars[dyvndx] ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n%5d\t(%4d) %-8s\t%12.4g\t(%4d) %-8s %12.4g", bpos,cndx, consys_nme(dy_sys,'c',bpos,FALSE,NULL),dy_y[bpos],vndx, consys_nme(dy_sys,'v',dyvndx,FALSE,NULL),dy_x[dyvndx]) ; } } # endif return (dyrOK) ; } DyLP-1.6.0/DyLP/src/Dylp/dy_dualpivot.c0000644000076700007670000030441711245632140014451 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains the routines which select entering and leaving variables for the dual simplex, and perform a dual pivot. See the comments at the head of dy_dual.c for an overview of the dual simplex algorithm implemented here. Some words about anti-degen lite in the dual context. Analogous to the primal case, the notion is that we want to choose leaving dual variables based on the alignment of the hyperplane coming tight with the pivot, relative to the direction we want to go. One candidate for `direction we want to go' is the dual objective. Another good candidate is the dual direction of motion. But we're running dual simplex in the primal data structure and handling upper and lower bounds on the primal variables algorithmically, and that makes the explanation of why it all works just a little tricky. Architecturals nonbasic at bound represent tight constraints of the form x <= u or -x <= -l. There should be nonzero duals associated with these constraints, and we need to account for them when formulating dual constraints and when determining alignment to the dual objective, but carefully keep our head in the sand when it comes to alignment with the direction of motion. The unfortunate fact of the matter is that there's just one column for x in the primal nonbasic partition, but it can represent any of three dual variables, depending on your point of view. Fortunately, it only needs to be one of them at any one time. We need to account for the coefficients of any finite upper and lower bounds. The system we want is really A'x ? b', which expands to Ax = b -Ix <= -l Ix <= u where x has expanded to include slacks as well as the original architectural variables, and -Ix <= -l contains explicit lower bound constraints for the slacks as well as the original architectural variables. All primal variables are `free' variables with explicit bound constraints. We're interested in y'a' = [y w v][a -e e]. The dual constraint is the equality ya - w + v = -c. The objective is augmented to become y'b', where b' = [b -l u] (the order of l and u isn't important, as long as we choose one and stick with it). The dual variables y are free variables (to match the equalities Ax = b). (But note that the columns for the slack variables introduce explicit dual constraints y - w = 0. These serve to enforce the usual y >= 0. I'll leave it to you to extend the interpretation to upper-bounded slacks for range constraints.) Now comes the part where we abridge the explanation (see the accompanying technical doc'n for the gory details). Clearly a primal variable can be in one of three states: at its lower bound, at its upper bound, or in between. Interpreting ya - w + v = -c in this light, we have: Primal w v constraint x = lb nonzero zero ya - w = -c => ya >= -c x = ub zero nonzero ya + v = -c => ya <= -c between zero zero ya = -c So, for a dual pivot where w decreases to 0 and goes nonbasic (x increases from lb to some intermediate value), the dual inequality ya >= -c is made tight. When v decreases to 0 and goes nonbasic (x decreases from ub), the dual inequality ya <= -c is made tight. While x is strictly between bounds, ya = c must hold. What's the dual direction of motion, zeta? The portion matching the basic dual variables (all of y, those w for variables at lb, those v for variables at ub) is the vector [ inv(B) inv(B)N ]; there's another chunk for the nonbasic variables. Again, you should see the accompanying technical doc'n for details. The upshot of all the math is that dot(zeta,a) = abar for x leaving to become NBLB, and -abar for x leaving to become NBUB. How do we calculate alignment with the objective? Since we're minimising, we want to head in the direction -b'. The direction we attribute to the normal of the dual constraint depends on the type of pivot. All of the above translates nicely into the real world of revised simplex with implicit primal bounds and dual variables with implicit lower bounds of 0. Again, it's in the accompanying documentation. Probably the least obvious point is that a shortage of coefficients of appropriate sign (remember, one column serves for three!) results in the v's taking on negative values. Translating from primal space to dual space and back again still makes my head hurt, though I'm getting better at it. Chant this mantra: nonbasic primal architectural variables match up with basic w or v dual variables, and nonbasic primal slack variables match up with basic y dual variables. */ #define DYLP_INTERNAL #include "dylp.h" static char sccsid[] UNUSED = "@(#)dy_dualpivot.c 4.7 10/15/05" ; static char svnid[] UNUSED = "$Id: dy_dualpivot.c 299 2009-08-28 01:35:28Z lou $" ; /* Define this symbol to enable a thorough check of the updates to cbar and rho. Set to FALSE if you want errors to trigger a fatal error, TRUE to note the errors but soldier on. Be aware that this check will almost certainly trigger fatal errors if the LP is numerically ill-conditioned. You must also define DYLP_PARANOIA during the dylp build. #define CHECK_DSE_UPDATES TRUE */ /* Define this symbol to enable a thorough check of the dual pivot row abar. As with CHECK_DSE_UPDATES, define this as TRUE if you just want to know about errors, FALSE if an error should trigger an abort. Here, too, the check will almost certainly trigger fatal errors if the LP has numerical problems. You must also define DYLP_PARANOIA during the dylp build. #define CHECK_DUAL_PIVROW TRUE */ #if defined(DYLP_STATISTICS) || !defined(DYLP_NDEBUG) /* Pivot counting structure for the antidegeneracy mechanism. This structure is sufficient for simple debugging; more complicated stats are collected when DYLP_STATISTICS is defined. DYSTATS_MAXDEGEN is defined in dylp.h. Field Definition ----- ---------- iterin iterin[i] is the value of tot.pivs when degeneracy level i was entered. */ typedef struct { int iterin[DYSTATS_MAXDEGEN] ; } degenstats_struct ; static degenstats_struct degenstats ; #endif /* DYLP_STATISTICS || !DYLP_NDEBUG */ dyret_enum dy_confirmDualPivot (int i, int j, double *abari, double maxabari, double **p_abarj) /* The routines that select the entering variable x for a dual pivot use the row vector abar when evaluating candidates. Abar is calculated as dot(beta,a), k = 1, ..., n, by dualpivrow. See dualpivrow for an explanation of why dylp takes this approach. This routine calculates the column vector abar = inv(B)a and then compares the two values obtained for the pivot abar. The criteria for acceptance is a difference of less than 1 part in pctErr (see below). The reason we need this routine is that numerical inaccuracy happens. In particular, we're looking to avoid the situation where the value from abar appears suitable, but the value from abar is not suitable. The value from abar more accurately reflects calculation in the basis package, and if it's no good, the basis update is liable to fail. For dual multipivot, where we may flip variables prior to the final pivot, this is a sure fire way to lose dual feasibility. Hence this routine, which is called by both dualmultiin and dualin. There's no real loss in terms of efficiency, because we can instruct the basis package to remember the intermediate result from the calculation of inv(B)a that it will subsequently use for the basis update. Returning dyrMADPIV for the case where the values of abar do not agree and the basis was recently refactored doesn't address the numeric problem, but it will get x onto the rejected pivot list, and we can hope that some other x will result in a different choice of x. Parameters: i: The index of the variable x selected to leave. j: The index of the variable x selected to enter. abari: The dual pivot row, calculated as dot(beta,a), k = 1, ..., n maxabari: The maximum absolute value in abari. p_abarj: (o) used to return abar Returns: dyrOK if the values agree, or if the values differ but we've just refactored. dyrREQCHK if the values differ and there's been at least one pivot since the last refactor of the basis. At least we can try to fix the problem. dyrMADPIV if the values agree and are honestly mad, or if the values disagree and the value from abar is mad. dyrFATAL if the calculation fails */ { int xipos ; double *abarj ; double abari_j,abarj_i,tol,err,pivRating ; dyret_enum retval ; const double pctErr = 1.0e-10 ; const char *rtnnme = "confirmDualPivot" ; # ifndef DYLP_NDEBUG int cnt,xkpos,printtmp ; # endif retval = dyrINV ; *p_abarj = NULL ; xipos = dy_var2basis[i] ; abari_j = abari[j] ; /* Fetch a and calculate abar = inv(B)a. */ abarj = NULL ; if (consys_getcol_ex(dy_sys,j,&abarj) == FALSE) { errmsg(122,rtnnme,dy_sys->nme, "column",consys_nme(dy_sys,'v',j,TRUE,NULL),j) ; if (abarj != NULL) FREE(abarj) ; return (dyrFATAL) ; } # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\tentering column a<%d>:",j) ; cnt = 1 ; for (xkpos = 1 ; xkpos <= dy_sys->concnt ; xkpos++) { if (abarj[xkpos] == 0) continue ; cnt = (cnt+1)%2 ; if (cnt == 0) dyio_outchr(dy_logchn,dy_gtxecho,'\n') ; dyio_outfmt(dy_logchn,dy_gtxecho, "\ta<%d,%d> = %g",xkpos,j,abarj[xkpos]) ; } } # endif dy_ftran(abarj,TRUE) ; abarj_i = abarj[xipos] ; # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tentering column abar<%d> = inv(B)a<%d>:",j,j) ; cnt = 1 ; for (xkpos = 1 ; xkpos <= dy_sys->concnt ; xkpos++) { if (abarj[xkpos] == 0) continue ; cnt = (cnt+1)%2 ; if (cnt == 0) dyio_outchr(dy_logchn,dy_gtxecho,'\n') ; dyio_outfmt(dy_logchn,dy_gtxecho, "\ta<%d,%d> = %g",xkpos,j,abarj[xkpos]) ; } } /* Suppress print in dy_chkpiv. */ printtmp = dy_opts->print.pivoting ; dy_opts->print.pivoting = 0 ; # endif pivRating = dy_chkpiv(abarj_i,maxabari) ; # ifndef DYLP_NDEBUG dy_opts->print.pivoting = printtmp ; # endif /* Well, are we equal? If so, the recommendation depends on pivot stability. */ err = fabs(abarj_i-abari_j) ; tol = pctErr*(1+fabs(abarj_i)) ; if (err < tol) { if (pivRating < 1.0) { retval = dyrMADPIV ; } else { retval = dyrOK ; } } /* Nope, not equal. If we're paranoid, print a warning for really bad cases. */ else { # ifdef DYLP_PARANOIA if (!(err > tol*1000)) { warn(385,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters+1,i,j,abari_j,abarj_i,err, fabs(err/abarj_i),pctErr) ; } # endif /* If we've done at least one pivot since refactoring, request a refactor. But if we've just refactored, report ok unless the pivot is numerically unstable. */ if (dy_lp->basis.etas >= 2) { retval = dyrREQCHK ; } else if (pivRating < 1.0) { retval = dyrMADPIV ; } else { retval = dyrOK ; } # ifndef DYLP_NDEBUG if (dy_opts->print.dual >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n dual pivot numeric drift: ") ; dyio_outfmt(dy_logchn,dy_gtxecho, "abari = %g, abarj = %g, diff = %g", abari_j,abarj_i,fabs(abari_j-abarj_i)) ; dyio_outfmt(dy_logchn,dy_gtxecho," (%g%%); ",tol*100) ; dyio_outfmt(dy_logchn,dy_gtxecho,"returning %s.",dy_prtdyret(retval)) ; } # endif } *p_abarj = abarj ; return (retval) ; } #ifdef CHECK_DUAL_PIVROW static bool check_dualpivrow (int xipos, const double *abari, double maxabari) /* This routine does a cross-check of the dual pivot row abar, row i of inv(B)N. abar is calculated as dot(beta,a), where beta is row i of inv(B). Here we cross-check by calculating inv(B)a and comparing the two values of abar. Experience says that this routine can churn out huge numbers of errors for numerically difficult problems, even with quite loose tolerances. It'll issue a warning for an individual coefficient only when the precentage error exceeds 1% (a huge error, by any usual accuracy standards). Parameters: xipos: basis position of the leaving variable abari: row i of inv(B)N, the pivot row coefficients maxabari: maximum value in abari Returns: TRUE if the two methods of calculation agree, CHECK_DUAL_PIVROW otherwise. (In use, this controls whether a failure results in an abort.) */ { int k ; flags statk ; double *abark ; double abari_k,abark_i ; bool retval ; int printtmp ; int errcnt ; double tol,diff,pct,maxpct,maxerr,maxerrcoeff,toterr,toterrcoeffs ; const char *rtnnme = "check_dualpivrow" ; /* Suppress print in dy_chkpiv. */ printtmp = dy_opts->print.pivoting ; dy_opts->print.pivoting = 0 ; /* Somewhat arbitrarily, declare that an error of .0001% (1.0e-6) is our limit. */ tol = 1.0e-6 ; retval = TRUE ; errcnt = 0 ; toterr = 0 ; toterrcoeffs = 0 ; maxpct = 0 ; maxerr = 0 ; maxerrcoeff = 0 ; abark = (double *) MALLOC((dy_sys->concnt+1)*sizeof(double)) ; /* Open a loop to do the scan. The first order of business is a consistency check on x's status. Then decide whether we need to pursue the check. In primal terms, we're not interested in basic variables or nonbasic fixed variables. These correspond to nonbasic duals and basic free duals, respectively. We only need to check coefficients corresponding to basic duals that can be pivoted out. But if we're paranoid, check them anyway for consistency with other paranoid checks. */ for (k = 1 ; k <= dy_sys->varcnt ; k++) { statk = dy_status[k] ; if (dy_chkstatus(k) == FALSE) { retval = CHECK_DUAL_PIVROW ; continue ; } # ifdef DYLP_PARANOIA if (flgon(statk,vstatBASIC)) continue ; # else if (flgon(statk,vstatBASIC|vstatNBFX)) continue ; # endif /* Acquire column a and calculate abar = inv(B)a. */ if (consys_getcol_ex(dy_sys,k,&abark) == FALSE) { errmsg(122,rtnnme,dy_sys->nme,"column", consys_nme(dy_sys,'c',k,TRUE,NULL),k) ; retval = CHECK_DUAL_PIVROW ; continue ; } dy_ftran(abark,FALSE) ; /* Exclude values that are not numerically stable pivots. These will never be pivots, and they complicate the business of generating a meaningful metric. */ abari_k = abari[k] ; abark_i = abark[xipos] ; if (dy_chkpiv(abark_i,maxabari) < 1.0) continue ; /* Do the comparison. Because the relative magnitude of coefficients varies wildly, we'll work with percentage error. Remember the worst we've seen. Issue an individual warning for errors of 1% or more. */ diff = fabs(abark_i-abari_k) ; pct = diff/fabs(abark_i) ; if (pct > tol) { errcnt++ ; toterr += diff ; toterrcoeffs += fabs(abark_i) ; if (pct > maxpct) { maxpct = pct ; maxerr = diff ; maxerrcoeff = fabs(abark_i) ; } if (pct > .01) { warn(385,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters+1,dy_basis[xipos],k,abari_k,abark_i, fabs(abark_i-abari_k),.01*fabs(abark_i)) ; } retval = CHECK_DUAL_PIVROW ; } } FREE(abark) ; /* Print a summary message if any coefficients failed the comparison. */ if (errcnt > 0) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n(%s)%d: comparing pivot row %d. ", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters,xipos) ; dyio_outfmt(dy_logchn,dy_gtxecho, "%d coeffs differ, total error %g%%, max %g%% (%g/%g).", errcnt,(toterr/toterrcoeffs)*100, maxpct*100,maxerr,maxerrcoeff) ; } return (retval) ; } #endif /* CHECK_DUAL_PIVROW */ bool dualpivrow (int xipos, double *betai, double *abari, double *maxabari) /* This routine calculates row i of the basis inverse, beta, and also the dual pivot row abar, row i of inv(B)N. beta is easy -- we simply premultiply inv(B) by the unit vector e. Calculating abar is not so easy. We'll need to do individual dot products for each nonbasic column a in the nonbasic partition. Arguably, we'd be better off doing dot(beta,a) as needed during the selection of the entering (primal) variable by dualin. But I'm interested in this approach to see if we do better on numerical accuracy by using the max of the pivot row when checking for a suitable pivot. Parameters: xipos: basis position of the leaving variable betai: (i) must be a 0 vector (o) row i of the basis inverse abari: (i) must be a 0 vector (o) row i of inv(B)N, the pivot row coefficients maxabari: (o) max{j} |abar|, the largest value in the pivot row Returns: TRUE if the calculations complete with no difficulty, FALSE otherwise */ { int xkndx ; flags xkstatus ; double abarik ; # ifndef DYLP_NDEBUG const char *rtnnme = "dualpivrow" ; # endif # ifndef DYLP_NDEBUG pkvec_struct *ai ; # endif /* We can use dy_btran to retrieve beta. The calculation is einv(B). */ betai[xipos] = 1.0 ; dy_btran(betai) ; # ifndef DYLP_NDEBUG /* If the user is interested, retrieve and print the nonbasic coefficients of row a. */ if (dy_lp->phase != dyADDVAR && dy_opts->print.pivoting >= 4) { int ndx,cnt ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n nonbasic coefficients of leaving row a<%d>:",xipos) ; ai = NULL ; if (consys_getrow_pk(dy_sys,xipos,&ai) == FALSE) { errmsg(122,rtnnme,dy_sys->nme,"row", consys_nme(dy_sys,'c',xipos,TRUE,NULL),xipos) ; if (ai != NULL) pkvec_free(ai) ; return (FALSE) ; } cnt = 1 ; for (ndx = 0 ; ndx < ai->cnt ; ndx++) { xkndx = ai->coeffs[ndx].ndx ; if (dy_var2basis[xkndx] == 0) { cnt = (cnt+1)%2 ; if (cnt == 0) dyio_outchr(dy_logchn,dy_gtxecho,'\n') ; dyio_outfmt(dy_logchn,dy_gtxecho,"\ta<%d,%d> = %g", xipos,xkndx,ai->coeffs[ndx].val) ; } } pkvec_free(ai) ; } # endif /* We need to do individual dot products dot(beta,a) to obtain abar. We also want maxabar = MAX{j}(abar) so that we can check a potential pivot for numerical stability. Open a loop to walk the columns, doing the necessary calculations for each nonbasic column which is eligible for entry (i.e., we can skip basic variables and NBFX variables). When we're paranoid, process NBFX columns for consistency with other paranoid checks. */ *maxabari = 0 ; for (xkndx = 1 ; xkndx <= dy_sys->varcnt ; xkndx++) { xkstatus = dy_status[xkndx] ; # ifdef DYLP_PARANOIA if (flgon(xkstatus,vstatBASIC)) continue ; # else if (flgon(xkstatus,vstatBASIC|vstatNBFX)) continue ; # endif abarik = consys_dotcol(dy_sys,xkndx,betai) ; if (!withintol(abarik,0,dy_tols->zero)) { abari[xkndx] = abarik ; if (fabs(abarik) > *maxabari) *maxabari = fabs(abarik) ; } } # ifndef DYLP_NDEBUG /* If the user is interested, print the transformed row abar. */ if ((dy_lp->phase != dyADDVAR && dy_opts->print.pivoting >= 4) || (dy_lp->phase == dyADDVAR && dy_opts->print.varmgmt >= 3)) { int cnt ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n nonbasic coefficients of transformed row abar<%d>, max %g:", xipos,*maxabari) ; cnt = 1 ; for (xkndx = 1 ; xkndx <= dy_sys->varcnt ; xkndx++) { if (fabs(abari[xkndx]) < .001*dy_tols->zero) continue ; cnt = (cnt+1)%2 ; if (cnt == 0) dyio_outchr(dy_logchn,dy_gtxecho,'\n') ; dyio_outfmt(dy_logchn,dy_gtxecho, "\ta<%d,%d> = %g",xipos,xkndx,abari[xkndx]) ; } } # endif # ifdef CHECK_DUAL_PIVROW /* And if the user is really paranoid, go over the pivot row with a fine tooth comb. check_dualpivrow can return FALSE only if CHECK_DUAL_PIVROW is defined to be FALSE. */ if (check_dualpivrow(xipos,abari,*maxabari) == FALSE) return (FALSE) ; # endif /* That should do it. We're outta here. */ return (TRUE) ; } static void dualdegenin (void) /* This routine forms a new restricted subproblem, increasing the degeneracy level kept in dy_lp->degen. A base perturbation is calculated so that the maximum possible perturbation is perturb = (base)*(varcnt) <= 1.0e-6 This is then increased, if necessary, so that the perturbation exceeds the dual zero tolerance. For each variable, the actual perturbation is calculated as base*j. The routine should not be called if dual degeneracy isn't present, and will do a paranoid check to make sure that's true. Parameters: none Returns: undefined */ { int j,oldlvl ; flags statj ; double base,perturb ; const char *rtnnme = "dualdegenin" ; # if defined(DYLP_PARANOIA) || defined(DYLP_STATISTICS) || !defined(DYLP_NDEBUG) int degencnt = 0 ; # endif /* Figure out the appropriate perturbation and bump the degeneracy level. Because we're dealing directly with dual variables, we can use a smaller perturbation than the primal, and we don't need to be worrying about getting outside of the dy_tols.dfeas range around zero. Still, it seems prudent to exceed the dual zero tolerance. */ base = pow(10.0,(-6-ceil(log10(dy_sys->concnt)))) ; while (base <= dy_tols->cost) base *= 10 ; oldlvl = dy_lp->degen++ ; # ifndef DYLP_NDEBUG if (dy_opts->print.degen >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: antidegeneracy increasing to level %d", dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,dy_lp->degen) ; dyio_outfmt(dy_logchn,dy_gtxecho,", base perturbation %g",base) ; if (dy_opts->print.degen >= 5) dyio_outchr(dy_logchn,dy_gtxecho,':') ; } # endif # if defined(DYLP_STATISTICS) || !defined(DYLP_NDEBUG) if (dy_lp->degen < DYSTATS_MAXDEGEN) degenstats.iterin[dy_lp->degen] = dy_lp->tot.pivs ; # endif # ifdef DYLP_STATISTICS if (dy_stats != NULL && dy_lp->degen < DYSTATS_MAXDEGEN) { if (dy_stats->ddegen[0].cnt < dy_lp->degen) dy_stats->ddegen[0].cnt = dy_lp->degen ; dy_stats->ddegen[dy_lp->degen].cnt++ ; } # endif /* Create the perturbed subproblem. We're only interested in variables that are participating in the current subproblem, hence the check of ddegenset. Further, we're only interested in basic duals that we can drive to bound (0) which amounts to nonbasic primals, except for NBFX and NBFR. (Put another way, driving the dual to 0 amounts to loosening the primal constraint. For architecturals, the relevant constraint is the upper/lower bound. For logicals, it's the associated architectural constraint. Equalities can't be loosened.) And, of course, we're only interested if the value is 0. You might think that a toleranced test would work here, and to some extent it does, but ... inevitably, we'll suck up a few dual variables that really aren't involved in the degeneracy, just very small at the point the restricted problem is formed. Then, as we pivot, these values can legitimately grow large, and it plays havoc with accuracy checks and iterative updates, because chunks of the code are doing on-the-fly compensation, setting y to 0 for duals involved in the restricted subproblem. */ for (j = 1 ; j <= dy_sys->varcnt ; j++) { if (dy_ddegenset[j] != oldlvl) continue ; statj = dy_status[j] ; if (flgon(statj,vstatBASIC|vstatNBFX|vstatNBFR)) continue ; if (dy_cbar[j] != 0.0) continue ; /* Make the perturbation. We need to perturb in the correct direction (positive for NBLB, negative for NBUB) in order to maintain dual feasibility. Note that we're pretending to perturb c by perturbing cbar. Given that j is nonbasic, cbar = c - dot(y,a), and we shouldn't perturb the associated dual. */ dy_ddegenset[j] = dy_lp->degen ; switch (statj) { case vstatNBLB: { perturb = base*j ; break ; } case vstatNBUB: { perturb = -base*j ; break ; } case vstatNBFR: case vstatSB: { errmsg(346,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,dy_prtvstat(statj), consys_nme(dy_sys,'v',j,FALSE,NULL),j) ; return ; } default: { errmsg(1,rtnnme,__LINE__) ; return ; } } dy_cbar[j] = perturb ; # if defined(DYLP_PARANOIA) || defined(DYLP_STATISTICS) degencnt++ ; # endif # ifndef DYLP_NDEBUG if (dy_opts->print.degen >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\tcbar<%d> perturbed to %g (%s %s).", j,dy_cbar[j],dy_prtvstat(statj), consys_nme(dy_sys,'v',j,FALSE,NULL)) ; } # endif } # ifdef DYLP_PARANOIA if (degencnt <= 0) { errmsg(327,rtnnme,dy_sys->nme) ; return ; } # endif # ifndef DYLP_NDEBUG if (dy_opts->print.degen >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho,"%s%d variables.", (dy_opts->print.degen < 5)?", ":"\n\ttotal ",degencnt) ; } # endif # ifdef DYLP_STATISTICS if (dy_stats != NULL && dy_lp->degen < DYSTATS_MAXDEGEN) { if (dy_stats->ddegen[dy_lp->degen].maxsiz < degencnt) dy_stats->ddegen[dy_lp->degen].maxsiz = degencnt ; j = dy_stats->ddegen[dy_lp->degen].cnt-1 ; perturb = dy_stats->ddegen[dy_lp->degen].avgsiz ; dy_stats->ddegen[dy_lp->degen].avgsiz = (float) ((perturb*j+degencnt)/(j+1)) ; } # endif return ; } dyret_enum dy_dualdegenout (int level) /* This routine backs out all restricted subproblems to the level given by the parameter. The value of the involved dual variables is reset to 0 in dy_cbar, and dy_ddegenset and dy_lp->degen are adjusted. All variables involved in a restricted subproblem were at bound (hence, zero) when they were collected into the subproblem. Numeric inaccuracy can cause drift over the course of pivoting. This is tested as part of the accuracy checks and the antidegeneracy mechanism will be backed out if a problem is detected. Here, the same tests are just paranoia. Parameter: level: The target level for removal of restricted subproblems. Returns: dyrOK if the restoration goes without problem, dyrREQCHK if there's been too much numerical drift since we began the degenerate subproblem. */ { int j ; dyret_enum retval ; # ifdef DYLP_STATISTICS int curlvl,curpivs ; # endif # ifndef DYLP_NDEBUG if (dy_opts->print.degen >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: antidegeneracy dropping to level %d after %d pivots.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters,level, dy_lp->tot.pivs-degenstats.iterin[dy_lp->degen]) ; } # endif # ifdef DYLP_STATISTICS /* Record the iteration counts. This needs to be a loop because we can peel off multiple levels. */ if (dy_stats != NULL) for (curlvl = dy_lp->degen ; curlvl > level ; curlvl--) { if (curlvl < DYSTATS_MAXDEGEN) { curpivs = dy_lp->tot.pivs-degenstats.iterin[curlvl] ; dy_stats->ddegen[curlvl].totpivs += curpivs ; dy_stats->ddegen[curlvl].avgpivs = ((float) dy_stats->ddegen[curlvl].totpivs)/ dy_stats->ddegen[curlvl].cnt ; if (curpivs > dy_stats->ddegen[curlvl].maxpivs) dy_stats->ddegen[curlvl].maxpivs = curpivs ; } } # endif retval = dyrOK ; /* Back out restricted subproblems to the level specified by level. By removing the perturbation (setting c back to 0), we restore the equality y = cbar for logicals. */ for (j = 1 ; j <= dy_sys->varcnt ; j++) { if (dy_ddegenset[j] > level) { dy_ddegenset[j] = level ; dy_cbar[j] = 0 ; if (j <= dy_sys->concnt) { dy_y[j] = 0 ; } # ifndef DYLP_NDEBUG if (dy_opts->print.degen >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tcbar<%d> restored to %g, (%s %s)", j,0.0,dy_prtvstat(dy_status[j]), consys_nme(dy_sys,'v',j,FALSE,NULL)) ; } # endif } } dy_lp->degen = level ; return (retval) ; } #ifdef CHECK_DSE_UPDATES static bool check_dse_update (int xkndx, double u_cbark, double u_rhok, bool recalc) /* This routine checks x for consistent status, then does one of the following: * for nonbasic variables, a `from scratch' calculation of cbar as c - c(inv(B)a) * for basic variables, a `from scratch' calculation of rho as ||einv(B)||. Parameters: xkndx: index for the variable u_cbark: updated cbar (valid only if x is nonbasic) u_rhok: updated rho (valid only if x is basic) recalc: TRUE if dseupdate is already recommending that this value be recalculated from scratch, FALSE otherwise. Returns: TRUE if the updates agree with the values calculated from first principles, CHECK_DSE_UPDATES otherwise. (In use, this controls whether a failure causes an abort.) */ { int xkpos,xindx,xipos ; double cbark,*abark,rhok,*betak ; flags xkstatus ; bool retval ; const char *rtnnme = "check_dse_update" ; /* Make sure we're ok as far as consistent status and values. */ retval = dy_chkstatus(xkndx) ; xkstatus = dy_status[xkndx] ; /* The first case is for a basic variable. We're interested in checking the norm of the row of the basis inverse. We load up betak as a unit vector with a 1 in the appropriate position, btran it, and then calculate the norm. */ if (flgon(xkstatus,vstatBASIC)) { betak = (double *) CALLOC(dy_sys->concnt+1,sizeof(double)) ; xkpos = dy_var2basis[xkndx] ; betak[xkpos] = 1.0 ; dy_btran(betak) ; rhok = exvec_ssq(betak,dy_sys->concnt) ; if (!withintol(rhok,u_rhok,dy_tols->reframe*(1+fabs(rhok)))) { errmsg(388,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,"rho",xkpos,u_rhok,rhok,fabs(u_rhok-rhok), dy_tols->reframe*(1+fabs(rhok))) ; if (recalc == FALSE) retval = CHECK_DSE_UPDATES ; } FREE(betak) ; } /* For nonbasic variables, check that the reduced cost c - cabar matches u_cbark. If dual anti-degeneracy is active, the value we calculate here should be 0, and in general will not match u_cbark (unless we're headed for higher-level degeneracy). */ else { abark = NULL ; if (consys_getcol_ex(dy_sys,xkndx,&abark) == FALSE) { errmsg(122,rtnnme,dy_sys->nme, "column",consys_nme(dy_sys,'v',xkndx,TRUE,NULL),xkndx) ; if (abark != NULL) FREE(abark) ; return (FALSE) ; } dy_ftran(abark,FALSE) ; cbark = dy_sys->obj[xkndx] ; for (xipos = 1 ; xipos <= dy_sys->concnt ; xipos++) { xindx = dy_basis[xipos] ; cbark -= dy_sys->obj[xindx]*abark[xipos] ; } if (dy_ddegenset[xkndx] == 0) { if (!withintol(cbark,u_cbark,dy_tols->reframe*(1+fabs(cbark)))) { errmsg(388,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,"cbar",xkndx,u_cbark,cbark,fabs(u_cbark-cbark), dy_tols->reframe*(1+fabs(cbark))) ; if (recalc == FALSE) retval = CHECK_DSE_UPDATES ; } } else { if (!withintol(cbark,0.0,dy_tols->dfeas)) { if (withintol(cbark,0.0,1000*dy_tols->dfeas)) { warn(388,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,"cbar",xkndx,0.0,cbark, fabs(cbark),dy_tols->dfeas) ; } else { errmsg(388,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,"cbar",xkndx,0.0,cbark, fabs(cbark),dy_tols->dfeas) ; if (recalc == FALSE) retval = CHECK_DSE_UPDATES ; } } } FREE(abark) ; } return (retval) ; } #endif static void dualpricexk (int xkndx, int *xindx, double *nbbari, bool *pivreject) /* This routine does the pricing calculation for the single variable x. For simplicity, assume that x occupies pos'n k of the basis. The pricing is dual steepest edge, adapted for bounded variables. Just as with primal steepest edge pricing, in dual space we're looking for the largest reduced cost, normalised by the norm of the direction of motion. Translated into the primal space, we're looking for the largest infeasibility, normalised by rho (the norm of row k of the basis inverse). If xbasic is the value of x and bnd is the violated bound closest to x, the `reduced cost' is |x-bnd|/||beta||. Parameters: xkndx: the index of x, the variable to be priced xindx: (i) index of the current incumbent x (the value is not used within dualpricexk) (o) updated to the index of x if x should supplant the current candidate x nbbari: (i) the normalised `reduced cost' of x (o) updated if x supplants the previous incumbent pivreject: (o) set to TRUE if x would be the winning candidate, but it's flagged with the NOPIVOT qualifier Returns: TRUE if x supplanted x, FALSE otherwise */ { int xkpos ; double deltak,nbbark ; flags xkstatus ; # ifndef DYLP_NDEBUG const char *rtnnme = "dualpricexk" ; # endif /* Get the position and status of x. */ xkpos = dy_var2basis[xkndx] ; xkstatus = dy_status[xkndx] ; # ifndef DYLP_NDEBUG if (dy_opts->print.pricing >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\tpricing %s (%d), status %s; ", consys_nme(dy_sys,'v',xkndx,FALSE,NULL),xkndx, dy_prtvstat(xkstatus)) ; } # endif /* Calculate the dual `reduced cost', and the normalised distance to bound. dualpricexk is only called for vstatBLLB, vstatBUUB, so by definition the `reduced cost' is larger than the relevant tolerance (the primal feasibility tolerance, as it happens). But we still need to check for values in the bogus range, and for the NOPIVOT status qualifier. */ if (flgon(xkstatus,vstatBLLB)) { deltak = dy_sys->vlb[xkndx]-dy_x[xkndx] ; } else { deltak = dy_x[xkndx]-dy_sys->vub[xkndx] ; } nbbark = deltak/sqrt(dy_rho[xkpos]) ; # ifndef DYLP_NDEBUG if (dy_opts->print.pricing >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "bbar = %g, ||beta|| = %g, |bbar|/||beta|| = %g.", deltak,sqrt(dy_rho[xkpos]),nbbark) ; } # endif if (withintol(deltak,0,dy_tols->pfeas*dy_tols->bogus)) { if (withintol(deltak,0,dy_tols->pfeas)) { # ifndef DYLP_NDEBUG if (dy_opts->print.pricing >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho," << zero!? >>") ; errmsg(1,rtnnme,__LINE__) ; } # endif return ; } else if (dy_lp->basis.etas > 1) { # ifndef DYLP_NDEBUG if (dy_opts->print.pricing >= 3) dyio_outfmt(dy_logchn,dy_gtxecho," << bogus >>") ; # endif return ; } } if (flgon(xkstatus,vstatNOPIVOT)) { *pivreject = TRUE ; # ifndef DYLP_NDEBUG if (dy_opts->print.pricing >= 3) dyio_outfmt(dy_logchn,dy_gtxecho," << reject >>") ; # endif return ; } /* x is a suitable candidate; the only question is whether it's better than the current candidate. If it is, x supplants it. */ if (nbbark > *nbbari) { *nbbari = nbbark ; *xindx = xkndx ; # ifndef DYLP_NDEBUG if (dy_opts->print.pricing >= 3) dyio_outfmt(dy_logchn,dy_gtxecho," << supplant >>") ; # endif return ; } else { # ifndef DYLP_NDEBUG if (dy_opts->print.pricing >= 3) dyio_outfmt(dy_logchn,dy_gtxecho," << inferior >>") ; # endif return ; } } dyret_enum dy_dualout (int *xindx) /* In the normal course of events with DSE pricing, the leaving variable for the next pivot is chosen during the update of cbar and rho. Still, on occasion we'll need to select again because the pivot is unsuitable, and we need a way to select the leaving variable for the initial pivot. That's where this routine comes in. This routine scans the basis and selects a leaving variable x by choosing the variable with the greatest normalised infeasibility. (If this were viewed in terms of the dual space, we're doing a steepest edge algorithm. See the discussion of DSE pricing in the documentation.) The routine dualpricexk does the actual work. If all infeasible variables are on the pivot reject list (and thus we can't bring them to feasibility) we'll return dyrPUNT. In a sense, the situation is analogous to true infeasibility --- there is no suitable variable to enter --- and the hope is that as dylp reverts to primal phase I it'll be sufficiently intelligent to add some variables and find a decent pivot. Parameters: xindx: (o) Index of the leaving variable x; 0 if no leaving variable is selected. Returns: dyrOK if the leaving variable is selected without incident dyrOPTIMAL if all variables are within bounds dyrPUNT if all infeasible variables are on the pivot reject list */ { int xkndx,xkpos ; flags xkstatus ; bool pivreject ; double candbbari ; dyret_enum retval ; # ifndef DYLP_NDEBUG const char *rtnnme = "dy_dualout" ; # endif retval = dyrINV ; # ifndef DYLP_NDEBUG if (dy_opts->print.pricing >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: pricing %d rows from %d for %d candidate.", rtnnme,dy_sys->concnt,1,1) ; } # endif candbbari = 0 ; *xindx = 0 ; pivreject = FALSE ; /* Open a loop to walk through the basic variables, looking for the one that has the greatest normalised infeasibility and is eligible for pivoting. */ for (xkpos = 1 ; xkpos <= dy_sys->concnt ; xkpos++) { xkndx = dy_basis[xkpos] ; xkstatus = dy_status[xkndx] ; if (flgoff(xkstatus,vstatBLLB|vstatBUUB)) { # ifndef DYLP_NDEBUG if (dy_opts->print.pricing >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tpricing %s (%d), status %s; << status >>", consys_nme(dy_sys,'v',xkndx,FALSE,NULL),xkndx, dy_prtvstat(xkstatus)) ; } # endif continue ; } dualpricexk(xkndx,xindx,&candbbari,&pivreject) ; } /* We're done. Time to set the proper return value. If we have a new candidate for entry, set the return value to dyrOK. If we don't have a candidate, there are three possible reasons: * We have potential pivots on the reject list: pivreject == TRUE. We want to return dyrPUNT. * We're optimal. pivreject == FALSE. dyrOPTIMAL is the proper return value. * We saw some infeasible variables, but the infeasibility was within the bogus number tolerance. pivreject == FALSE. dyrOPTIMAL is still the correct return code (we'll end up doing a refactor in preoptimality, and the bogus numbers will either disappear, or we'll be back here ready to use them). */ if (*xindx == 0) { if (pivreject == TRUE) retval = dyrPUNT ; else retval = dyrOPTIMAL ; } else { retval = dyrOK ; } # ifndef DYLP_NDEBUG if (dy_opts->print.pricing >= 2) { if (*xindx != 0) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: selected %s (%d) %s to leave, DSE price %g.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, consys_nme(dy_sys,'v',*xindx,TRUE,NULL),*xindx, dy_prtvstat(dy_status[*xindx]),candbbari) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho,"\n (%s)%d: no suitable candidates.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; } } if (dy_opts->print.pricing >= 1) { if (retval == dyrPUNT) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: all suitable x on rejected pivot list.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; } } # endif return (retval) ; } static double ddirdothyper (int xindx, double *abari, int diri, int xqndx, int dirq) /* This routine is used in the context of dual anti-degen lite, where we're trying to choose the leaving dual variable based on the alignment of the hyperplane that will become tight relative to the desired dual direction of motion zeta. See extensive comments at the top of the file. The upshot of all the math is that dot(zeta,a) = abar for x leaving to become NBLB, and -abar for x leaving to become NBUB. In short, dot(zeta,a) = dir*abar. All we do here is normalise by ||a||. For convenience, the signs of the dot products are set as if we were dealing with <= constraints (i.e., the maximum positive value indicates a hyperplane that perfectly blocks motion in the direction of the edge). This entails multiplication of the dot product by -dir. There is no paranoid check, unlike the primal routine pdirdothyper. Since we calculated each abar as dot(beta,a), it seems a little pointless to repeat it here. We might still encounter empty columns, though, so we add 1 to ||a||. Parameters: xindx: index of x, the leaving primal variable (hence entering dual) abari: einv(B)N, calculated as betaa for a in N; the portions of zeta matching the w and v variables diri: direction of motion of x (matches direction of motion of entering dual) xqndx: index of x, the primal candidate to enter (hence candidate leaving dual) dirq: direction of motion of x (opposite the direction of motion of the leaving dual) Returns: -dir*dir*abar/||a||, or NaN if something goes awry. */ { double normaq,abariq,dotprod ; abariq = abari[xqndx] ; normaq = consys_2normcol(dy_sys,xqndx) ; dotprod = -dirq*diri*abariq/(normaq+1) ; setcleanzero(dotprod,dy_tols->zero) ; return (dotprod) ; } static double bdothyper (int xqndx, int dirq) /* This routine is used in the context of dual antidegen lite, where we're trying to choose the leaving dual variable based on the alignment of the hyperplane coming tight with the pivot relative to the direction that minimises the objective. See extensive comments at the head of the file. The routine calculates the dot product of -b' = [b -l u] with a constraint normal a', normalised by ||a'||. ||-b'|| doesn't change over the various candidates, so we don't need to include it in the normalisation for comparison purposes. A little care is required to orient the normal of the dual constraint. If x is NBLB, we're dealing with ya - w = c, viewed as a >= constraint. If x is NBUB, we're dealing with ya + v = c, viewed as a <= constraint. We want to have the maximum dot product when the hyperplane exactly blocks motion in the direction of the objective. Case analysis gives the calculation as dir*dot(constraint,[b -l u]), where `constraint' is replaced by the appropriate constraint normal. If x is a slack, we're talking about a leaving dual y, and the relevant constraint boils down to y >= 0 or y <= 0. Parameters: xqndx: x, the primal candidate for entry (hence the leaving dual) dirq: the direction of motion of x Returns: dir*dot(b',a')/||a'||, as described above, or NaN if the calculation goes awry. */ { double dotprod,normq ; /* If a dual is leaving, all we need to do is find the correct value in b. */ if (xqndx <= dy_sys->concnt) { dotprod = dy_sys->rhs[xqndx] ; } /* Otherwise, we need to calculate dot(b',a'), which breaks down as dot(b,a) plus the contribution due to w or v. */ else { dotprod = consys_dotcol(dy_sys,xqndx,dy_sys->rhs) ; normq = sqrt(consys_ssqcol(dy_sys,xqndx)+1) ; if (dirq > 0) dotprod += dy_sys->vlb[xqndx] ; else dotprod += dy_sys->vub[xqndx] ; dotprod = dotprod/normq ; } dotprod = dirq*dotprod ; setcleanzero(dotprod,dy_tols->zero) ; return (dotprod) ; } static dyret_enum dualin (int xindx, int outdir, int *xjndx, int *indir, double *abari, double maxabari, double **p_abarj) /* This routine selects the incoming variable x for a dual pivot. Recall that in the primal, where x = xbar - abardelta_x, we look for the limiting xbar s.t. xbar/abar is minimum over i to determine the leaving variable x. Without getting into the technicalities of the algebra (and playing fast and loose with the indices), the analogous calculation in the dual problem is y = cbar + abardelta_y, and we're looking to find the limiting cbar s.t. cbar/abar is minimum over the nonbasic columns. This will give us the leaving dual variable y. But it's impossible (short of a few pages) to do the explanation properly in the dual context, so I'll switch now to the primal context. x has been selected to leave at its upper/lower bound, and the corresponding direction of motion and total change have been determined. We're now looking for x to enter. After this pivot, the reduced cost of x will be cbar = -cbar/abar, where |cbar/abar| is the smallest such value over the nonbasic columns. cbar also has to have the right sign -- if x will end up out at its lower bound, cbar must end up positive; if x will be out at its upper bound, cbar must end up negative (we're minimising in the dylp primal, eh). Returning to the dual context for a second, dualin implements a version of anti-degen lite. Analogous to the primal case, the notion is that we want to keep tight the hyperplanes most closely aligned with where we want to go ([abar e]). But it gets complicated, largely because we're only running the dual implicitly, and you have to make up some pieces on the spot. See the comments at the head of the file, and in ddirdothyper. Since dy_cbar is updated in dseupdate, the test for loss of dual feasibility is performed there (might as well catch it as it happens). Parameters: xindx: index of the leaving variable x outdir: direction of movement of x, 1 if rising to lower bound -1 if falling to upper bound xjndx: (o) index of the entering variable x indir: (o) direction of movement for x, 1 if rising from lower bound -1 if falling from upper bound abari: row i of inv(B)N (the pivot row) maxabari: maximum value in abar p_abarj: (o) used to return the value of abar Returns: dyret_enum code, as follows: dyrOK: the pivot is (dual) nondegenerate dyrDEGEN: the pivot is (dual) degenerate dyrUNBOUND: the problem is dual unbounded (primal infeasible) (i.e., no incoming variable can be selected) dyrREQCHK: if the pivot a is a bogus number dyrMADPIV: if a fails the numerical stability test dyrFATAL: fatal confusion */ { int reject,xkndx,degencnt,dirk ; flags xkstatus ; double deltak,abarik,ratioik,deltamax,abarij,ratioij,bdotaj,bdotak ; bool newxj ; dyret_enum retval,confirm ; const char *rtnnme = "dualin" ; retval = dyrINV ; # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n (%s)%d: selecting entering variable", dy_prtlpphase(dy_lp->phase, TRUE),dy_lp->tot.iters+1) ; if (dy_opts->print.pivoting >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n %s (%d) leaving %s (%d) %s", consys_nme(dy_sys,'v',xindx,FALSE,NULL),xindx, consys_nme(dy_sys,'c',dy_var2basis[xindx],FALSE,NULL), dy_var2basis[xindx],(outdir > 0)?"increasing":"decreasing") ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tVariable\tcbar\tabar\tdelta\tDisp") ; } } # endif deltamax = dy_tols->inf ; *xjndx = 0 ; *indir = 0 ; abarij = 0 ; ratioij = quiet_nan(0) ; bdotaj = quiet_nan(0) ; dirk = 0 ; /* Open a loop to step through the variables. We skip basic variables and variables that are nonbasic fixed, but anyone else is eligible. If the status is ok, the second easy test is for abar = 0, in which case we're done with this column. Note that we shouldn't see superbasics here, as we're primal infeasible while running dual simplex and superbasics should not be created. Nor should we see nonbasic free variables except when their reduced cost is zero. dy_chkstatus enforces this when we're paranoid. */ newxj = FALSE ; degencnt = 0 ; bdotak = 0 ; for (xkndx = 1 ; xkndx <= dy_sys->varcnt ; xkndx++) { if (dy_lp->degen > 0 && dy_ddegenset[xkndx] != dy_lp->degen) continue ; xkstatus = dy_status[xkndx] ; # ifdef DYLP_PARANOIA if (dy_chkstatus(xkndx) == FALSE) return (dyrFATAL) ; # endif /* Do the tests to determine if this variable is a possible candidate: it cannot be basic or NBFX, the pivot abar must be large enough to be stable, and the sign of abar must be compatible with the direction of motion for x and x. Case analysis for cbar = -cbar/abar yields: * x rising to lb and leaving, cbar to be >= 0 + x nonbasic at l, c >= 0, implies abar must be <= 0 + x nonbasic at u, c <= 0, implies abar must be >= 0 * x dropping to ub and leaving, cbar to be <= 0 + x nonbasic at l, c >= 0, implies abar must be >= 0 + x nonbasic at u, c <= 0, implies abar must be <= 0 */ reject = 0 ; abarik = abari[xkndx] ; if (flgon(xkstatus,vstatBASIC|vstatNBFX)) { reject = -1 ; } else if (withintol(abarik,0.0,dy_tols->zero)) { reject = -2 ; } else { if (outdir == -1) { if ((flgon(xkstatus,vstatNBUB) && abarik > 0) || (flgon(xkstatus,vstatNBLB) && abarik < 0)) { reject = -3 ; } } else { if ((flgon(xkstatus,vstatNBUB) && abarik < 0) || (flgon(xkstatus,vstatNBLB) && abarik > 0)) { reject = -3 ; } } } # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 3 || (dy_opts->print.pivoting >= 2 && reject >= 0)) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t%-8s (%d)", consys_nme(dy_sys,'v',xkndx,FALSE,NULL),xkndx) ; dyio_outfmt(dy_logchn,dy_gtxecho,"\t%g\t%g",dy_cbar[xkndx],abarik) ; } if (dy_opts->print.pivoting >= 3) { switch (reject) { case -1: /* basic/NBFX */ { dyio_outfmt(dy_logchn,dy_gtxecho,"\t\trejected -- status %s", dy_prtvstat(xkstatus)) ; break ; } case -2: /* zero pivot */ { dyio_outfmt(dy_logchn,dy_gtxecho,"\t\trejected -- zero pivot") ; break ; } case -3: /* incompatible sign */ { dyio_outfmt(dy_logchn,dy_gtxecho,"\t\trejected -- wrong sign") ; break ; } } } # endif /* If we've rejected x, get on to the next candidate, otherwise set the direction of entry and continue. */ if (reject < 0) continue ; if (outdir == -1) { if (abarik > 0) { dirk = 1 ; } else { dirk = -1 ; } } else { if (abarik > 0) { dirk = -1 ; } else { dirk = 1 ; } } /* Calculate the limit on the allowable delta for the entering dual imposed by this leaving dual. */ deltak = fabs(dy_cbar[xkndx]/abarik) ; # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho,"\t%g",deltak) ; } # endif /* We have delta. Now, is x a better candidate to enter than the current incumbent x? If delta is really smaller, there's no contest. We do not want a toleranced comparison here --- small differences in delta multiplied by large abar can result in loss of feasibility elsewhere. */ ratioik = quiet_nan(0) ; if (deltak < deltamax) { newxj = TRUE ; ratioik = dy_chkpiv(abarik,maxabari) ; # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho," (%g)",deltamax-deltak) ; } # endif degencnt = 0 ; } /* If there's a tie, decide it based on the user's choice of antidegen lite options. See comments at the head of dy_primalpivot for more details on the decision criteria for AlignObj and AlignEdge. But if abar is an unsuitable pivot, don't even bother with further checks. */ else if (deltak == deltamax) { ratioik = dy_chkpiv(abarik,maxabari) ; if (ratioik >= 1.0) { switch (dy_opts->degenlite) { case 0: /* pivotabort */ { if (ratioik > ratioij) newxj = TRUE ; break ; } case 1: /* pivot */ { if (ratioik > ratioij) newxj = TRUE ; degencnt++ ; break ; } case 2: /* alignobj */ case 3: /* alignedge */ { if (dy_opts->degenlite == 2) { if (degencnt == 0) bdotaj = bdothyper(*xjndx,*indir) ; bdotak = bdothyper(xkndx,dirk) ; } else { if (degencnt == 0) bdotaj = ddirdothyper(xindx,abari,outdir,*xjndx,*indir) ; bdotak = ddirdothyper(xindx,abari,outdir,xkndx,dirk) ; } degencnt++ ; if (bdotaj > 0 && bdotak <= 0) { /* keep x */ } else if (bdotaj <= 0 && bdotak > 0) { newxj = TRUE ; } else if (fabs(bdotaj) > fabs(bdotak)) { newxj = TRUE ; } else if (bdotaj == bdotak) { if (ratioik > ratioij) newxj = TRUE ; } break ; } case 4: /* perpobj */ case 5: /* perpedge */ { if (dy_opts->degenlite == 4) { if (degencnt == 0) bdotaj = bdothyper(*xjndx,*indir) ; bdotak = bdothyper(xkndx,dirk) ; } else { if (degencnt == 0) bdotaj = ddirdothyper(xindx,abari,outdir,*xjndx,*indir) ; bdotak = ddirdothyper(xindx,abari,outdir,xkndx,dirk) ; } degencnt++ ; if (bdotak > bdotaj) newxj = TRUE ; break ; } } } } # ifndef DYLP_NDEBUG else { if (dy_opts->print.pivoting >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho," (%g)",deltamax-deltak) ; } } # endif /* If we've selected a new entering variable, make the changes. If the user's choice of antidegen lite option was pivotabort, maybe we can skip the rest of the scan. */ if (newxj == TRUE) { deltamax = deltak ; *xjndx = xkndx ; *indir = dirk ; abarij = abarik ; ratioij = ratioik ; bdotaj = bdotak ; newxj = FALSE ; # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho,"\tentering from %s", (flgon(xkstatus,vstatNBUB))?"ub":"lb") ; } # endif if (dy_opts->degenlite == 0 && deltak == 0 && ratioij >= 1.0) break ; } } /* Why are we here? With luck, we have a nondegenerate (deltamax > 0) and numerically stable pivot abar. There are two other possibilities: the dual is unbounded (deltamax = infty), or we're degenerate (deltamax = 0). */ switch (retval) { case dyrINV: { if (deltamax < dy_tols->inf) { if (ratioij >= 1.0) { if (dy_lp->basis.etas > 1 && withintol(abarij,0,dy_tols->bogus*dy_tols->zero)) { retval = dyrREQCHK ; # ifndef DYLP_NDEBUG warn(381,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters+1,"abar",xindx,*xjndx,abarij, dy_tols->bogus*dy_tols->zero, dy_tols->bogus*dy_tols->zero-fabs(abarij)) ; # endif } else if (deltamax == 0) { retval = dyrDEGEN ; } else { retval = dyrOK ; } } else { retval = dyrMADPIV ; } } else { *xjndx = -1 ; retval = dyrUNBOUND ; } break ; } default: { errmsg(1,rtnnme,__LINE__) ; return (dyrFATAL) ; } } /* If we think this pivot is ok (including degenerate), confirm it. */ if (retval == dyrOK || retval == dyrDEGEN) { confirm = dy_confirmDualPivot(xindx,*xjndx,abari,maxabari,p_abarj) ; if (confirm != dyrOK) retval = confirm ; } /* We're done, except perhaps for printing some information. */ # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting == 1) { dyio_outfmt(dy_logchn,dy_gtxecho,"...") ; } if ((retval == dyrOK || retval == dyrDEGEN) && dy_opts->print.pivoting >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n selected %s (%d) to enter from ", consys_nme(dy_sys,'v',*xjndx,FALSE,NULL),*xjndx) ; if (*indir > 0) { dyio_outfmt(dy_logchn,dy_gtxecho, " %s = %g, ","lb",dy_sys->vlb[*xjndx]) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho, " %s = %g, ","ub",dy_sys->vub[*xjndx]) ; } dyio_outfmt(dy_logchn,dy_gtxecho, "abar<%d,%d> = %g, cbar<%d> = %g, delta = %g.", xindx,*xjndx,abarij,*xjndx,dy_cbar[*xjndx],deltamax) ; } if (retval == dyrDEGEN && dy_opts->print.dual >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: %s %s %s (%d), cbar<%d> = %g", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters+1, dy_prtdyret(retval),dy_prtvstat(dy_status[*xjndx]), consys_nme(dy_sys,'v',*xjndx,FALSE,NULL),*xjndx, *xjndx,dy_cbar[*xjndx]) ; if (dy_opts->degenlite >= 2 && dy_opts->degenlite <= 5) { if (degencnt > 0) { dyio_outfmt(dy_logchn,dy_gtxecho, ", align = %g, deg = %d.",bdotaj,degencnt) ; } } else { dyio_outchr(dy_logchn,dy_gtxecho,'.') ; } } # endif return (retval) ; } static dyret_enum dseupdate (int xindx, int xjndx, int *candxi, double *tau, double *betai, double *abari, double *abarj) /* This routine handles the updates of rho = ||beta||^2 required for DSE pricing. It also updates cbar for the nonbasic variables, so that we don't have to recalculate them each time we return to the primal problem. Assuming for simplicity that x occupies row i of the basis, the update formula for rho is rho' = rho - 2*(abar/abar)*tau + (abar/abar)*rho k != i rho' = rho/abar^2 While we're doing the updates, we also select the next candidate to leave the basis. Because we need tau = dot(beta,beta) for all rows of the old basis inverse, this is precalculated before the pivot as inv(B)beta using dy_ftran, and passed in as the vector tau. To update the reduced costs, the formulae are cbar' = -cbar/abar cbar' = cbar - cbar*(abar/abar) k != i The major cost here is the scan of the nonbasic columns --- we've already taken the time and trouble to calculate abar. When antidegeneracy is active, we need to take care that we update only columns that are included in the restricted subproblem. REMEMBER that we've already pivoted, so x is now basic in pos'n i, and x is now nonbasic. Parameters: xindx: index of the leaving variable x xjndx: index of the entering variable x candxi: (o) index of the leaving variable for the next pivot tau: inv(B)beta betai: row i of the basis inverse abari: row i of inv(B)N abarj: column j of inv(B)N Returns: dyrOK if the update proceeds without error and a new leaving variable is selected dyrOPTIMAL if the update proceeds without error but there are no out-of-bound primal variables dyrPUNT if the update proceeds without error but the only out-of-bound primal variables are flagged as `do not pivot' dyrLOSTDFEAS if we detect loss of dual feasibility while updating the reduced costs dyrFATAL if there's a problem (only when we're paranoid) */ { int xipos,xkndx,xkpos ; double abarij,abarkj,cbarj,abarik,cbark,rhoi,rhok,alphak,candbbari,deltak ; double *betak ; flags xjstatus,xkstatus ; bool pivreject,recalc ; dyret_enum retval ; # ifdef DYLP_PARANOIA const char *rtnnme = "dseupdate" ; # endif # ifndef DYLP_NDEBUG bool accurate,badguess ; # endif /* Do a little setup and pull out some common values. If we're feeling paranoid, check that a direct calculation of dot(beta,beta) matches the value we got from tau = inv(B)beta. */ *candxi = 0 ; candbbari = 0 ; pivreject = FALSE ; retval = dyrINV ; xipos = dy_var2basis[xjndx] ; abarij = abari[xjndx] ; cbarj = dy_cbar[xjndx] ; xjstatus = dy_status[xjndx] ; rhoi = tau[xipos] ; # ifdef DYLP_PARANOIA rhok = exvec_ssq(betai,dy_sys->concnt) ; if (!withintol(rhoi,rhok,dy_tols->zero*(1+rhok))) { if (!withintol(rhoi,rhok,dy_tols->zero+dy_tols->bogus*(1+rhok))) { errmsg(394,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,xipos,xipos,rhoi,xipos,rhok,fabs(rhoi-rhok), dy_tols->zero*dy_tols->bogus*(1+rhok)) ; return (dyrFATAL) ; } else { warn(394,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,xipos,xipos,rhoi,xipos,rhok,fabs(rhoi-rhok), dy_tols->zero*dy_tols->bogus*(1+rhok)) ; } } # endif /* Have we drifted so far that we should reset the norms from scratch? The test is that the iteratively updated norm rho is within dy_tols->reframe percent of the value tau = ||beta||^2 that we calculated as betainv(B). The PSE reframe tolerance is used here because it's handy, and because it's appropriately loose (default of .1). Once the norms are recalculated, execute a simplified loop to price a candidate. */ if (!withintol(dy_rho[xipos],rhoi,dy_tols->reframe*(1+rhoi))) { # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 1 || dy_opts->print.dual >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n %s: (%s)%d: resetting DSE norms; trigger %s (%d), pos'n %d", dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, consys_nme(dy_sys,'v',xindx,FALSE,NULL),xindx,xipos) ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n\texact rho = %g, approx = %g, error = %g, tol = %g.", rhoi,dy_rho[xipos],fabs(rhoi-dy_rho[xipos]), dy_tols->reframe*rhoi) ; } # endif dy_dseinit() ; for (xkpos = 1 ; xkpos <= dy_sys->concnt ; xkpos++) { xkndx = dy_basis[xkpos] ; xkstatus = dy_status[xkndx] ; if (flgoff(xkstatus,vstatBLLB|vstatBUUB)) { # ifndef DYLP_NDEBUG if (dy_opts->print.pricing >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tpricing %s (%d), status %s; << status >>", consys_nme(dy_sys,'v',xkndx,TRUE,NULL),xkndx, dy_prtvstat(xkstatus)) ; } # endif continue ; } dualpricexk(xkndx,candxi,&candbbari,&pivreject) ; } } /* If we didn't recalculate from scratch, open a loop to walk the basis and update the row norms rho. About the only guarantee we have for rho is that it's greater than zero. The observed numerical behaviour for this calculation is just awful. Try to anticipate particularly bad instances: rho large, roughly equal, and opposite sign to the iterative update; and abar/abar very large. */ else { dy_rho[xipos] = rhoi ; betak = NULL ; for (xkpos = 1 ; xkpos <= dy_sys->concnt ; xkpos++) { recalc = FALSE ; xkndx = dy_basis[xkpos] ; if (xkpos == xipos) { rhok = rhoi/(abarij*abarij) ; if (fabs(abarij) < 1.0e-5) recalc = TRUE ; } else { abarkj = abarj[xkpos] ; if (abarkj != 0.0) { rhok = 0 ; if (fabs(abarkj/abarij) > 1.0e5) recalc = TRUE ; alphak = -(2*tau[xkpos]*abarkj)/abarij ; rhok += alphak ; alphak = (rhoi*abarkj*abarkj)/(abarij*abarij) ; rhok += alphak ; if (dy_rho[xkpos] > 1.0e8 && rhok < -1.0e8) recalc = TRUE ; rhok += dy_rho[xkpos] ; } else { rhok = dy_rho[xkpos] ; } } # ifdef CHECK_DSE_UPDATES /* This will return a fatal error only if CHECK_DSE_UPDATES is defined as FALSE and the update code did not recommend we recalculate. */ if (check_dse_update(xkndx,0.0,rhok,recalc) == FALSE) return (dyrFATAL) ; # endif /* If the update code recommended a recalculation, or rho ends up less than zero, we need to recalculate. */ if (recalc == TRUE || rhok < 0.0) { if (betak == NULL) { betak = (double *) CALLOC(dy_sys->concnt+1,sizeof(double)) ; } else { memset(betak,0,(dy_sys->concnt+1)*sizeof(double)) ; } betak[xkpos] = 1.0 ; dy_btran(betak) ; cbark = exvec_ssq(betak,dy_sys->concnt) ; # ifndef DYLP_NDEBUG if (withintol(rhok,cbark,dy_tols->cost*(1+cbark))) { accurate = TRUE ; } else { accurate = FALSE ; } if (accurate == recalc) badguess = TRUE ; else badguess = FALSE ; if (dy_opts->print.dual >= 5 || (dy_opts->print.dual >= 3 && accurate == FALSE && badguess == TRUE)) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t(%s)%d: recalculated rho<%d>; ", dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,xkpos) ; dyio_outfmt(dy_logchn,dy_gtxecho, "original %g, updated %g, correct %g, error %g;", dy_rho[xkpos],rhok,cbark,rhok-cbark) ; if (badguess == TRUE) { dyio_outfmt(dy_logchn,dy_gtxecho," bad guess.") ; } else { dyio_outfmt(dy_logchn,dy_gtxecho," good guess.") ; } } # endif dy_rho[xkpos] = cbark ; } else { dy_rho[xkpos] = rhok ; } /* Now that we've updated the norm, call dualpricexk to price the variable, supplanting the incumbent if that's appropriate. Variables that are within bound can be rejected out-of-hand. */ xkstatus = dy_status[xkndx] ; if (flgoff(xkstatus,vstatBLLB|vstatBUUB)) { # ifndef DYLP_NDEBUG if (dy_opts->print.pricing >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tpricing %s (%d), status %s; << status >>", consys_nme(dy_sys,'v',xkndx,TRUE,NULL),xkndx, dy_prtvstat(xkstatus)) ; } # endif continue ; } dualpricexk(xkndx,candxi,&candbbari,&pivreject) ; } if (betak != NULL) FREE(betak) ; } /* That's it for the row norms. On to the primal reduced costs. We have to update cbar for all nonbasic variables x. When antidegeneracy is active, we update only the columns involved in the restricted subproblem. (If we're nonparanoid, we can also skip the update for NBFX, which will never be considered for reentry. But the paranoid check routines get very upset.) The update formulae are: cbar' = -cbar/abar cbar' = cbar - cbar*alpha where alpha = abar/abar. To avoid a special case for x, now nonbasic, note that prior to the pivot abar = inv(B)a = 1.0 and cbar = 0.0 (since x was basic). Set these values prior to entering the loop, and the general update formula for cbar' collapses properly to the special case for cbar', hence we don't need to check for x in the loop. For x, now basic, just set the reduced cost to 0. */ dy_cbar[xjndx] = 0.0 ; abari[xindx] = 1.0 ; dy_cbar[xindx] = 0.0 ; for (xkndx = 1 ; xkndx <= dy_sys->varcnt ; xkndx++) { if (dy_lp->degen > 0 && dy_ddegenset[xkndx] != dy_lp->degen) continue ; xkstatus = dy_status[xkndx] ; # ifdef DYLP_PARANOIA if (flgon(xkstatus,vstatBASIC)) continue ; # else if (flgon(xkstatus,vstatBASIC|vstatNBFX)) continue ; # endif abarik = abari[xkndx] ; deltak = cbarj*abarik/abarij ; if (deltak != 0) { cbark = dy_cbar[xkndx]-deltak ; if ((flgon(xkstatus,vstatNBLB) && cbark < -dy_tols->dfeas) || (flgon(xkstatus,vstatNBUB) && cbark > dy_tols->dfeas)) { retval = dyrLOSTDFEAS ; # ifndef DYLP_NDEBUG if (dy_opts->print.dual >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n lost dual feasibility, %s (%d) %s,", consys_nme(dy_sys,'v',xkndx,FALSE,NULL),xkndx, dy_prtvstat(xkstatus)) ; dyio_outfmt(dy_logchn,dy_gtxecho, " old = %g, new = %g, abarij = %g, delta = %g, tol = %g .", dy_cbar[xkndx],cbark,abarij,deltak,dy_tols->dfeas) ; } # endif } dy_cbar[xkndx] = cbark ; } # ifdef CHECK_DSE_UPDATES else { cbark = dy_cbar[xkndx] ; } if (check_dse_update(xkndx,cbark,0.0,FALSE) == FALSE) return (dyrFATAL) ; # endif } /* We're done. Time to set the proper return value. One possibility is that we've lost dual feasibility, and retval is set to dyrLOSTDFEAS. If retval is still dyrINV, look at x. If we have a new candidate to leave, set the return value to dyrOK. If we don't have a candidate, there are three possible reasons: * We have potential pivots on the reject list: pivreject == TRUE. We want to return dyrPUNT. * We're optimal. pivreject == FALSE. dyrOPTIMAL is the proper return value. * We saw some infeasible variables, but the infeasibility was within the bogus number tolerance. pivreject == FALSE. dyrOPTIMAL is still the correct return code (we'll end up doing a refactor in preoptimality, and the bogus numbers will either disappear, or we'll be back here ready to use them). If we're running multipivoting, we can cope with loss of dual feasibility. */ if (retval == dyrLOSTDFEAS) { if (dy_opts->dpsel.strat > 0) retval = dyrINV ; } if (retval == dyrINV) { if (*candxi == 0) { if (pivreject == TRUE) retval = dyrPUNT ; else retval = dyrOPTIMAL ; } else { retval = dyrOK ; } } # ifndef DYLP_NDEBUG if (dy_opts->print.pricing >= 2) { if (*candxi != 0) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: selected %s (%d) %s to leave, DSE price %g.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, consys_nme(dy_sys,'v',*candxi,TRUE,NULL),*candxi, dy_prtvstat(dy_status[*candxi]),candbbari) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho,"\n (%s)%d: no suitable candidates.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; } } if (dy_opts->print.pricing >= 1) { if (retval == dyrPUNT) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: all suitable x on rejected pivot list.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; } } # endif return (retval) ; } static dyret_enum dualupdate (int xjndx, int indir, int xindx, int outdir, double *abarj, double *p_delta, double *betai) /* This routine is responsible for updating the various data structures which hold the basis, primal variable values and status, and dual variable values. Note that both abarj and betai are calculated based on the basis prior to pivoting, since this is what is used in the update formulas. Unfortunately, one problem we can't get over is dirty degeneracy. It may well be that x fails the primal feasibility test, but x/abar is less than the zero tolerance. As in the primal case, we force the pivot and let the various error correction mechanisms take over. We can't bail out in the middle of this routine if we think we've seen a bogus value (the basis is left with inconsistent status and will fail the subsequent status check). Parameters: xjndx: index of the entering variable x indir: the direction of change of the entering variable +1: rising (usually from lower bound) -1: falling (usually from upper bound) xindx: index of the leaving variable x outdir: the direction of change of the outgoing variable abarj: the ftran'd column abar = inv(B)a p_delta: (o) absolute value of change in x betai: row i of inv(B) Returns: dyrOK if there are no glitches, dyrSWING for excessive growth of a primal variable value, dyrREQCHK if one of the newly calculated values looks bogus. dyrFATAL can be returned if we're paranoid and fail a check. */ { int xkpos,xkndx,xipos ; double deltai,xi,lbi,ubi ; double xj,cbarj,deltaj,abarij,ubj,lbj ; double deltak,yk ; flags stati,statj ; dyret_enum retval,upd_retval ; bool swing ; int swingndx ; double swingratio,maxswing ; const char *rtnnme = "dualupdate" ; # ifdef DYLP_PARANOIA double epsl,epsu ; # endif # ifndef DYLP_NDEBUG flags statk ; # endif retval = dyrOK ; swing = FALSE ; maxswing = 0 ; swingndx = -1 ; statj = dy_status[xjndx] ; xj = dy_x[xjndx] ; lbj = dy_sys->vlb[xjndx] ; ubj = dy_sys->vub[xjndx] ; cbarj = dy_cbar[xjndx] ; xipos = dy_var2basis[xindx] ; stati = dy_status[xindx] ; xi = dy_xbasic[xipos] ; lbi = dy_sys->vlb[xindx] ; ubi = dy_sys->vub[xindx] ; abarij = abarj[xipos] ; # ifdef DYLP_PARANOIA /* The incoming variable should have status NBLB, NBUB, or NBFR. The dual simplex isn't prepared to deal with SB (not dual feasible) or NBFX (shouldn't be entering). The outgoing variable should have status BUUB or BLLB (i.e., it's primal infeasible). */ if (!flgon(statj,vstatNBLB|vstatNBUB|vstatNBFR)) { errmsg(355,rtnnme,dy_sys->nme,consys_nme(dy_sys,'v',xjndx,FALSE,NULL), xjndx,dy_prtvstat(statj)) ; return (dyrFATAL) ; } if (!flgon(stati,vstatBLLB|vstatBUUB)) { errmsg(349,rtnnme,dy_sys->nme, consys_nme(dy_sys,'v',xindx,FALSE,NULL),xindx,xi, dy_prtvstat(stati),lbi,ubi) ; return (dyrFATAL) ; } /* If x is within bounds, we're confused -- what are we doing trying to pivot on a primal variable that's already feasible? */ if (withinbnds(lbi,xi,ubi)) { errmsg(358,rtnnme,dy_sys->nme,consys_nme(dy_sys,'v',xindx,FALSE,NULL), xindx,lbi,xi,ubi,abarij) ; return (dyrFATAL) ; } # endif /* A little setup -- extract the pivot and calculate the actual change in x required to drive x to bound. */ if (outdir > 0) { deltai = lbi-xi ; } else { deltai = ubi-xi ; } setcleanzero(deltai,dy_tols->zero) ; if (deltai != 0) { deltaj = -deltai/abarij ; setcleanzero(deltaj,dy_tols->zero) ; # ifndef DYLP_NDEBUG if (deltaj == 0 && dy_opts->print.pivoting >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n %s (%d) = %g, %s, leaving at %s, dirty degenerate pivot.", consys_nme(dy_sys,'v',xindx,FALSE,NULL),xindx,xi, dy_prtvstat(stati),(outdir < 0)?"ub":"lb") ; } # endif } else { deltaj = 0 ; } *p_delta = fabs(deltaj) ; # ifndef DYLP_NDEBUG if (dy_opts->print.dual >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n (%s)%d: dual update:", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters+1) ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t%s (%d) entering pos'n %d from %s %g, delta %g, cbarj %g.", consys_nme(dy_sys,'v',xjndx,FALSE,NULL),xjndx,xipos, (indir == 1)?"lb ":"ub ",xj,deltaj,cbarj) ; dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t%s (%d) = %g leaving at ", consys_nme(dy_sys,'v',xindx,FALSE,NULL),xindx,xi) ; if (outdir == 1) { dyio_outfmt(dy_logchn,dy_gtxecho,"lb %g, pivot %g.",lbi,abarij) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho,"ub %g, pivot %g.",ubi,abarij) ; } } # endif /* Update the objective and the value and status of the basic variables to reflect the change in x. The calculation is straightforward, from the formulas: z = cinv(B) - (c - cinv(B)a)*delta x = inv(B)b - (inv(B)a)*delta dy_updateprimals does the heavy lifting. It should not return dyrFATAL here, as we're providing abarj, but the code is prepared for it. We can suppress the change to the objective if x is in a restricted subproblem, because we know it got there with cbar = 0. (Various paranoid accuracy checks are happier this way.) */ if (deltaj != 0) { if (dy_ddegenset[xjndx] == 0) { dy_lp->z += cbarj*deltaj ; } upd_retval = dy_updateprimals(xjndx,deltaj,abarj) ; switch (upd_retval) { case dyrOK: { break ; } case dyrSWING: { swing = TRUE ; swingndx = dy_lp->ubnd.ndx ; maxswing = dy_lp->ubnd.ratio ; break ; } case dyrREQCHK: { retval = dyrREQCHK ; break ; } default: { errmsg(1,rtnnme,__LINE__) ; retval = dyrFATAL ; break ; } } stati = dy_status[xindx] ; xi = dy_x[xindx] ; # ifdef DYLP_PARANOIA /* Consider the result. x should end up at bound (BLB, BUB, or BFX). */ if (flgoff(stati,vstatBLB|vstatBFX|vstatBUB)) { deltak = abarij*deltaj ; if (fabs(ubi-xi) < fabs(lbi-xi)) { epsu = snaptol2(fabs(deltak),fabs(ubi)) ; if (fabs(ubi-xi) < 100*epsu) { warn(357,rtnnme,dy_sys->nme, consys_nme(dy_sys,'v',xindx,FALSE,NULL),xindx, dy_prtvstat(stati),"ub",ubi,xi,xi-ubi,epsu) ; } else { errmsg(357,rtnnme,dy_sys->nme, consys_nme(dy_sys,'v',xindx,FALSE,NULL),xindx, dy_prtvstat(stati),"ub",ubi,xi,xi-ubi,epsu) ; return (dyrFATAL) ; } } else { epsl = snaptol2(fabs(deltak),fabs(lbi)) ; if (fabs(lbi-xi) < 100*epsl) { warn(357,rtnnme,dy_sys->nme, consys_nme(dy_sys,'v',xindx,FALSE,NULL),xindx, dy_prtvstat(stati),"lb",lbi,xi,lbi-xi,epsl) ; } else { errmsg(357,rtnnme,dy_sys->nme, consys_nme(dy_sys,'v',xindx,FALSE,NULL),xindx, dy_prtvstat(stati),"lb",lbi,xi,lbi-xi,epsl) ; return (dyrFATAL) ; } } } # endif } /* The `dirty degeneracy' case. Force x to the appropriate (basic) status. Other basic variables are unchanged. */ else { if (lbi == ubi) { stati = vstatBFX ; } else if (outdir > 0) { stati = vstatBLB ; } else { stati = vstatBUB ; } dy_status[xindx] = stati ; } if (retval == dyrFATAL) return (dyrFATAL) ; /* Deal with the entering and leaving variables. The first thing we do is update dy_basis and dy_var2basis. The leaving variable x still appeared to be basic as far as updateprimals was concerned, so all that remains is to change from basic to nonbasic status and force the value exactly to bound. If we've come a long way to get to bound, we might miss by a bit. */ dy_var2basis[xjndx] = xipos ; dy_var2basis[xindx] = 0 ; dy_basis[xipos] = xjndx ; if (flgon(dy_status[xindx],vstatBFX)) { stati = vstatNBFX ; xi = lbi ; } else if (flgon(dy_status[xindx],vstatBLB)) { stati = vstatNBLB ; xi = lbi ; } else if (flgon(dy_status[xindx],vstatBUB)) { stati = vstatNBUB ; xi = ubi ; } else { if (lbi == ubi) { stati = vstatNBFX ; xi = lbi ; } else if (fabs(xi-lbi) < fabs(xi-ubi)) { stati = vstatNBLB ; xi = lbi ; } else { stati = vstatNBUB ; xi = ubi ; } retval = dyrREQCHK ; # ifndef DYLP_NDEBUG if (dy_opts->print.dual >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: Forced leaving variable %s (%d) = %g", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, consys_nme(dy_sys,'v',xindx,FALSE,NULL),xindx,dy_x[xindx]) ; dyio_outfmt(dy_logchn,dy_gtxecho," to %s bound %g, error %g;", (stati == vstatNBUB)?"upper":"lower", xi,fabs(dy_x[xindx]-xi)) ; dyio_outfmt(dy_logchn,dy_gtxecho," recommending request refactor.") ; } # endif } dy_status[xindx] = stati ; dy_x[xindx] = xi ; /* For the entering variable x, it's a matter of retrieving the value, adding deltaj, and setting the appropriate status. Because dylp occasionally wants to make nonstandard dual pivots, we need to allow for the possibility that x will enter and go out of bound. */ if (deltaj != 0) { if (flgon(statj,vstatNBLB)) { xj = lbj+deltaj ; } else if (flgon(statj,vstatNBUB)) { xj = ubj+deltaj ; } else { xj = deltaj ; } setcleanzero(xj,dy_tols->zero) ; /* Choose a new status for x. The tests for abovebnd and belowbnd will use the feasibility tolerance. Check for bogus numbers and excessive swing. */ if (flgon(statj,vstatNBFR)) { statj = vstatBFR ; } else { if (belowbnd(xj,ubj)) { if (abovebnd(xj,lbj)) { statj = vstatB ; } else if (belowbnd(xj,lbj)) { statj = vstatBLLB ; } else { statj = vstatBLB ; } } else { if (abovebnd(xj,ubj)) { statj = vstatBUUB ; } else { statj = vstatBUB ; } } if (flgon(statj,vstatBLB|vstatBUB) && lbj == ubj) { statj = vstatBFX ; } } if (dy_lp->basis.etas > 1 && dy_tols->bogus > 1.0 && xj != 0.0 && flgoff(statj,vstatBLB|vstatBFX|vstatBUB)) { if (fabs(xj) < dy_tols->zero*dy_tols->bogus) { retval = dyrREQCHK ; # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 1) warn(374,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,"x",xjndx,fabs(xj),dy_tols->zero*dy_tols->bogus, dy_tols->zero*dy_tols->bogus-xj) ; # endif } } if (flgon(statj,vstatBLLB|vstatBUUB)) { swingratio = (fabs(xj)+1)/(fabs(dy_x[xjndx])+1) ; if (swingratio > dy_tols->swing) { swing = TRUE ; if (swingratio > maxswing) { maxswing = swingratio ; swingndx = xjndx ; } } } } /* If we're dealing with a dirty degenerate pivot, the whole affair is much simpler --- just change the status of x from nonbasic to basic. */ else { if (flgon(statj,vstatNBLB)) { statj = vstatBLB ; xj = lbj ; } else { statj = vstatBUB ; xj = ubj ; } } dy_status[xjndx] = statj ; dy_x[xjndx] = xj ; dy_xbasic[xipos] = xj ; # ifdef DYLP_PARANOIA { deltak = dy_calcobj() ; if (fabs(deltak-dy_lp->z) > fabs(.001*(1+fabs(deltak)))) { warn(405,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters+1,dy_lp->z,deltak,fabs(dy_lp->z-deltak), fabs(.001*deltak)) ; } } # endif /* Update the dual variables. The derivation of these formulas is straightforward once you've seen it, but more than can be explained here. See the technical documentation or a text. If antidegeneracy is active, we want to be careful to only update duals associated with the restricted subproblem. These will be duals for constraints whose logicals are part of the subproblem. If we were in dual land, maintaining a dual basis, we'd have marked the basis pos'n and variables would slide in and out of it. But here, we have to move the marker from the leaving dual variable (xjndx) to the entering dual variable (xindx). */ if (dy_lp->degen > 0) { xkpos = dy_ddegenset[xindx] ; dy_ddegenset[xindx] = dy_ddegenset[xjndx] ; dy_ddegenset[xjndx] = xkpos ; } if (fabs(cbarj) > dy_tols->cost) { for (xkpos = 1 ; xkpos <= dy_sys->concnt ; xkpos++) { xkndx = dy_basis[xkpos] ; if (dy_lp->degen > 0 && dy_ddegenset[xkndx] < dy_lp->degen) continue ; deltak = cbarj*betai[xkpos] ; deltak = deltak/abarij ; yk = dy_y[xkpos]+deltak ; dy_y[xkpos] = yk ; } } /* Decide on a return value. Swing overrides the others, as it'll cause us to pop out of simplex. But if there are no loadable constraints or variables, well, let's not, eh? */ if (swing == TRUE) { if (dy_lp->sys.cons.loadable > 0 || dy_lp->sys.vars.loadable > 0) { retval = dyrSWING ; } dy_lp->ubnd.ndx = swingndx ; dy_lp->ubnd.ratio = maxswing ; # ifndef DYLP_NDEBUG if (dy_opts->print.dual >= 2) { xkndx = dy_lp->ubnd.ndx ; statk = dy_status[xkndx] ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n Pseudo-unbounded: growth %e for %s (%d) %s = %g", dy_lp->ubnd.ratio, consys_nme(dy_sys,'v',xkndx,FALSE,NULL),xkndx, dy_prtvstat(statk),dy_x[xkndx]) ; if (flgon(statk,vstatBUUB)) { dyio_outfmt(dy_logchn,dy_gtxecho," > %g.",dy_sys->vub[xkndx]) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho," < %g.",dy_sys->vlb[xkndx]) ; } } # endif } # ifndef DYLP_NDEBUG /* That's it, except for some informational printing. */ if (dy_opts->print.dual >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\trevised objective %g.",dy_lp->z) ; # ifdef DYLP_PARANOIA deltak = dy_calcobj() ; if (!atbnd(deltak,dy_lp->z)) dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tWHOOPS! updated obj - true obj = %g - %g = %g > %g", dy_lp->z,deltak,dy_lp->z-deltak,dy_tols->dchk) ; # endif if (deltaj != 0) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n revised dual variables, cbar tolerance %g", dy_tols->dfeas) ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n%8s%20s%16s","pos'n","constraint","val") ; for (xkpos = 1 ; xkpos <= dy_sys->concnt ; xkpos++) { if (betai[xkpos] != 0) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n%8d%20s%16.8g",xkpos, consys_nme(dy_sys,'c',xkpos,FALSE,NULL), dy_y[xkpos]) ; } } } } # endif /* DYLP_NDEBUG */ return (retval) ; } dyret_enum dy_dualpivot (int xindx, int outdir, int *p_xjndx, int *p_indir, double *p_cbarj, double *p_abarij, double *p_delta, int *p_xicand) /* This routine executes a dual pivot given the leaving variable x (assume for simplicity that x occupies basis posn i). The first action is to call dualpivrow to calculate beta (row i of inv(B)) and abar (row i of inv(B)N). Then dualin is called to select the entering variable x. There follows some mathematical prep, then dy_pivot performs the actual pivot, followed by dualupdate and dseupdate to update the variables and DSE pricing information. Under normal circumstances, when dy_dualpivot is called x is not specified. However, dy_dualpivot can be called from dy_dualaddvars when it attempts to activate and immediately pivot a variable that isn't dual feasible. In this case, dy_dualaddvars will specify x at the call, and it may be the case that the entering variable is rising from its upper bound or falling from its lower bound. dualmultiin can also return a pivot of this nature --- it provides a way of dealing with the case where the reduced cost has the wrong sign, but is within the dual feasibility tolerance. Parameters: xindx: index of the leaving variable x outdir: direction of motion of x 1: rising to lower bound -1: falling to upper bound p_xjndx: (i) index of entering variable x, or <= 0 if the entering variable should be selected here (o) index of the entering variable x p_indir: (i) direction of motion of x, if x has been selected (o) direction of motion of x 1: rising (usually from lower bound) -1: falling (usually from upper bound) p_cbarj: (o) reduced cost of entering variable p_abarij: (o) pivot coefficient p_delta: (o) change in x p_xicand: (o) index of the variable selected to leave on the next pivot Returns: dyret_enum code, as follows: successful pivots: dyrOK: The pivot completed successfully and a new x was selected. dyrDEGEN: (dualin) A dual degenerate pivot completed successfully and a new x was selected. dyrOPTIMAL: (dseupdate) The pivot completed successfully, and no candidate x could be selected because all variables are primal feasible. dyrPUNT: (dseupdate) The pivot completed successfully, but no candidate x could be selected because all candidates were flagged as NOPIVOT. dyrREQCHK: (dualupdate) The pivot completed successfully, but a bogus value was calculated during primal and dual variable updating. unsuccessful (aborted) pivots: dyrREQCHK: (dualin) The pivot coefficient is a bogus number, and a refactor is requested before it's used. dyrMADPIV: The pivot coefficient was judged (numerically) unstable (dualin, possibly dy_pivot). dyrRESELECT: (dualmultiin) special circumstances have caused dualmultiin to abort the pivot and request reselection of the leaving variable. dyrUNBOUND: The problem is dual unbounded (primal infeasible) (dualin). dyrLOSTDFEAS: Dual feasibility has been lost (dseupdate). dyrSINGULAR: The pivot resulted in a singular basis (dy_pivot). dyrBSPACE: basis package ran out of room to work (dy_pivot). dyrFATAL: Fatal confusion (data structure error, internal confusion, etc.) (various sources) */ { int xipos,xjndx,indir,degen_cyclecnt ; double *betai,*abari,*tau,maxabari,*abarj ; dyret_enum retval,inretval,dseretval,confirm ; bool validxj,reselect,patch ; flags factorflgs ; const char *rtnnme = "dy_dualpivot" ; extern dyret_enum dualmultiin (int xindx, int outdir, int *p_xjndx, int *p_indir, double *abari, double maxabari, double **p_abarj) ; # ifdef DYLP_PARANOIA int chkduallvl = 2 ; dy_chkdual(chkduallvl) ; # endif /* Setup. If the leaving variable isn't specified, assume a normal dual pivot with x leaving at its near bound. If x is specified, indir should also be valid. */ retval = dyrINV ; if (*p_xjndx <= 0) { *p_xjndx = -1 ; *p_indir = 0 ; validxj = FALSE ; } else { validxj = TRUE ; } *p_cbarj = 0 ; *p_abarij = quiet_nan(0) ; *p_delta = quiet_nan(0) ; *p_xicand = -1 ; abarj = NULL ; xipos = dy_var2basis[xindx] ; # ifndef DYLP_NDEBUG /* Print some information about the pivot, should the user want it. */ if (dy_opts->print.pivoting >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: x<%d> (%s) leaving pos'n %d (%s), status %s, %s from %g, ", rtnnme,xindx,consys_nme(dy_sys,'v',xindx,FALSE,NULL), xipos,consys_nme(dy_sys,'c',xipos,FALSE,NULL), dy_prtvstat(dy_status[xindx]), (outdir < 0)?"decreasing":"increasing",dy_x[xindx]) ; dyio_outfmt(dy_logchn,dy_gtxecho,"lb = %g, ub = %g.", dy_sys->vlb[xindx],dy_sys->vub[xindx]) ; } # endif /* Do the prep work. Allocate some space for beta and abar, then call dualpivrow to do the calculations. */ betai = (double *) CALLOC(dy_sys->concnt+1,sizeof(double)) ; abari = (double *) CALLOC(dy_sys->varcnt+1,sizeof(double)) ; if (dualpivrow(xipos,betai,abari,&maxabari) == FALSE) { errmsg(392,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,xipos,xipos, consys_nme(dy_sys,'v',xindx,FALSE,NULL),xindx) ; FREE(betai) ; FREE(abari) ; return (dyrFATAL) ; } /* If we don't have x, try to select an entering variable. This can be simple selection of one variable for a standard pivot (dualin) or a more complex process which can do bound-to-bound flips of primal variables on the way to a final pivot (dualmultiin). A loop is required to handle the possible installation/removal of a restricted, perturbed subproblem as an antidegeneracy measure. There are some pathologies to deal with, hence the need for degen_cyclecnt and the check for an existing abarj. The possible results from entering variable selection are: * dyrOK, dyrDEGEN: a valid (if degenerate) pivot. xjndx and indir are valid. dyrDEGEN may cause the installation of a restricted perturbed subproblem, in which case the selection loop will iterate and we'll try again to select an entering variable. * dyrUNBOUND indicates dual unboundedness. If antidegeneracy is active, we'll remove one level and try again to select an entering variable. If antidegeneracy isn't active, we're really dual unbounded (primal infeasible) and will kick the problem back to the caller. * dyrREQCHK indicates that the selected pivot abar is a bogus number, and requests a refactor before we actually try to use it. dyrMADPIV indicates it failed the pivot stability test. dyrFATAL covers any remaining sins. All are returned to the caller. */ if (validxj == FALSE) { reselect = TRUE ; degen_cyclecnt = 0 ; while (reselect) { if (abarj != NULL) { FREE(abarj) ; abarj = NULL ; } if (dy_opts->dpsel.strat > 0) { inretval = dualmultiin(xindx,outdir,&xjndx,&indir, abari,maxabari,&abarj) ; } else { inretval = dualin(xindx,outdir,&xjndx,&indir, abari,maxabari,&abarj) ; } switch (inretval) { /* dualin returns dyrOK We have an uncomplicated, nondegenerate pivot. Yeah! */ case dyrOK: { reselect = FALSE ; break ; } /* dualin returns dyrDEGEN Do we want (and are we allowed) to activate the antidegeneracy mechanism? If so, set up and perturb the restricted subproblem and then repeat the pivot selection. In order to create a restricted subproblem, opts.degen must permit it, and we must have executed opts.degenpivlim successive degenerate and nonconstructive pivots. The idea is to activate the antidegeneracy algorithm only when we have serious degeneracy involving dual constraints where we can perturb the objective coefficients (which we accomplish by the equivalent action of perturbing the values of the reduced costs). To this end, we exclude degenerate pivots where a fixed variable is leaving. The rules for selecting an incoming variable guarantee it won't come back. It's possible, when we fall through to the last case because we're forcing a degenerate pivot, that dualmultiin has not set abarj. Make sure we deal with it. */ case dyrDEGEN: { if (flgon(dy_status[xindx],vstatBFX) || flgon(dy_status[xjndx],vstatNBFR)) { reselect = FALSE ; # ifndef DYLP_NDEBUG if (dy_opts->print.degen >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: constructive degenerate pivot.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t%s %s (%d) leaving,", dy_prtvstat(dy_status[xindx]), consys_nme(dy_sys,'v',xindx,FALSE,NULL),xindx) ; dyio_outfmt(dy_logchn,dy_gtxecho," %s %s (%d) entering %d.", dy_prtvstat(dy_status[xjndx]), consys_nme(dy_sys,'v',xjndx,FALSE,NULL),xjndx) ; } # endif } else if (dy_opts->degen == TRUE && degen_cyclecnt == 0 && dy_opts->degenpivlim < dy_lp->degenpivcnt) { # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 1 || dy_opts->print.degen >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: antidegeneracy increasing to level %d.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, dy_lp->degen+1) ; } # endif dualdegenin() ; degen_cyclecnt++ ; } else { reselect = FALSE ; if (abarj == NULL) { confirm = dy_confirmDualPivot(xindx,xjndx, abari,maxabari,&abarj) ; if (confirm == dyrOK) { inretval = dyrDEGEN ; } else { inretval = confirm ; } } # ifndef DYLP_NDEBUG if (dy_opts->print.degen >= 2 && degen_cyclecnt > 0) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: forced degenerate pivot after %d cycles;", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, degen_cyclecnt) ; dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t%s %s (%d) entering.", dy_prtvstat(dy_status[xjndx]), consys_nme(dy_sys,'v',xjndx,FALSE,NULL),xjndx) ; } else if (dy_opts->print.degen >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: degenerate pivot; %s %s (%d) entering.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, dy_prtvstat(dy_status[xjndx]), consys_nme(dy_sys,'v',xjndx,FALSE,NULL),xjndx) ; } # endif } break ; } /* dualin returns dyrUNBOUND Are we currently coping with degeneracy? If not, the problem is truly unbounded and we need to return to some higher level to deal with it. If there's a restricted subproblem installed, we've discovered a breakout direction from the degenerate vertex, and need to reselect the leaving variable after backing out the restricted subproblem. (Presumably we'll find a limiting variable in the full problem.) */ case dyrUNBOUND: { if (dy_lp->degen > 0) { # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 1 || dy_opts->print.degen >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: backing out level %d after %d pivots, unbounded.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, dy_lp->degen, dy_lp->tot.pivs-degenstats.iterin[dy_lp->degen]) ; } # endif dy_dualdegenout(dy_lp->degen-1) ; reselect = TRUE ; } else { reselect = FALSE ; } break ; } /* Remaining cases, and end of the pivot selection loop. If dualin returned anything other than dyrOK, dyrUNBOUND, or dyrDEGEN, it'll fall through to here and we'll punt back to the caller. dyrREQCHK and dyrMADPIV will have selected a pivot, but it's got problems. dualmultiin can on occasion request reselection of the leaving variable (dyrRESELECT). */ case dyrRESELECT: case dyrMADPIV: case dyrREQCHK: case dyrFATAL: { reselect = FALSE ; break ; } default: { errmsg(1,rtnnme,__LINE__) ; reselect = FALSE ; break ; } } } /* We have a pivot (or an error). Set the return values. We set p_delta to NaN here just to give it a value. The call to dualupdate calculates the authoritative value. */ if (inretval == dyrOK || inretval == dyrDEGEN || inretval == dyrREQCHK || inretval == dyrMADPIV || inretval == dyrRESELECT) { *p_xjndx = xjndx ; *p_indir = indir ; *p_cbarj = dy_cbar[xjndx] ; *p_abarij = abari[xjndx] ; *p_delta = quiet_nan(0) ; } } /* If dy_dualpivot was called with a valid x, it's just a matter of making things look good here. Call dy_confirmDualPivot to get abarj and check the pivot's suitabillity */ else { xjndx = *p_xjndx ; indir = *p_indir ; *p_cbarj = dy_cbar[xjndx] ; *p_abarij = abari[xjndx] ; inretval = dy_confirmDualPivot(xindx,xjndx,abari,maxabari,&abarj) ; if (inretval == dyrOK && dy_cbar[xjndx] == 0) { inretval = dyrDEGEN ; } *p_delta = quiet_nan(0) ; } /* Send the errors back to the caller. */ if (!(inretval == dyrOK || inretval == dyrDEGEN)) { if (inretval == dyrMADPIV) { (void) dy_addtopivrej(xindx,dyrMADPIV,*p_abarij,maxabari) ; } FREE(betai) ; FREE(abari) ; if (abarj != NULL) FREE(abarj) ; return (inretval) ; } /* Dual degenerate pivot? If not, reset the successive degenerate pivot count. Note that this differs from the primal action, where pivoting a BFX or NBFR variable resets degenpivcnt. Here, we'll never see NBFR (not dual feasible) nor BFX (primal feasible). We could trap this later (leaving variable goes to NBFX status) but it turns out to be better to let antidegeneracy kick in based on dual simplex criteria. */ if (inretval == dyrOK) { dy_lp->degenpivcnt = 0 ; } else { dy_lp->degenpivcnt++ ; } # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n x<%d> (%s) entering, status %s, %s from %s = %g, ", xjndx,consys_nme(dy_sys,'v',xjndx,FALSE,NULL), dy_prtvstat(dy_status[xjndx]), (indir < 0)?"decreasing":"increasing", ((flgon(dy_status[xjndx],vstatNBUB))?"ub": ((flgon(dy_status[xjndx],vstatNBLB))?"lb":"x")), dy_x[xjndx]) ; } # endif /* Time to attempt the pivot. We first calculate a vector tau = inv(B)beta, which we'll use in dseupdate. */ tau = (double *) MALLOC((dy_sys->concnt+1)*sizeof(double)) ; memcpy(tau,betai,(dy_sys->concnt+1)*sizeof(double)) ; dy_ftran(tau,FALSE) ; /* Attempt the pivot to update the LU factorisation. This can fail for three reasons: the pivot element didn't meet the numerical stability criteria (we've already checked this, but the check's not foolproof), the pivot produced a singular or near-singular basis, or the basis package ran out of space. If we fail, and we've done flips as part of a multipivot, we have a problem. There's no easy way to back out the flips, and without the pivot we've almost certainly lost dual feasibility. For near-singularity (dyrNUMERIC) or lack of space (dyrBSPACE), we can try to refactor and recalculate the primals and duals, then try the pivot again. All this worked before, up to the pivot attempt, so assume it'll work again. If the pivot fails a second time, well, at least we tried. For the rest, dylp's error recovery algorithms will cope, but it'll be ugly. */ retval = dy_pivot(xipos,abarj[xipos],maxabari) ; if (retval == dyrBSPACE || retval == dyrNUMERIC) { factorflgs = ladPRIMALS|ladDUALS ; patch = dy_opts->patch ; dy_opts->patch = FALSE ; dseretval = dy_factor(&factorflgs) ; dy_opts->patch = patch ; if (dseretval == dyrOK) { FREE(abarj) ; abarj = NULL ; (void) consys_getcol_ex(dy_sys,xjndx,&abarj) ; dy_ftran(abarj,TRUE) ; retval = dy_pivot(xipos,abarj[xipos],maxabari) ; if (retval == dyrNUMERIC) retval = dyrSINGULAR ; } else { if (dseretval == dyrNUMERIC) { retval = dyrSINGULAR ; } else { retval = dseretval ; } } } /* If the basis is successfully pivoted, we need to do updates. Call dualupdate to do the primal and dual variables. If that works, call dseupdate to update dual steepest edge information and choose a leaving variable for the next iteration. In terms of return values, dualupdate can return dyrOK, dyrREQCHK, dyrSWING, or dyrFATAL. dyrFATAL will pop us out of simplex, so we can skip dseupdate. dseupdate can return dyrOK, dyrOPTIMAL, dyrLOSTDFEAS, dyrPUNT, or dyrFATAL. The only possibilities for inretval at this point are dyrOK and dyrDEGEN. Basically, we're trying to return the most interesting value, resorting to the bland dyrOK only if nothing else turns up. */ if (retval == dyrOK) { dy_lp->pivok = TRUE ; retval = dualupdate(xjndx,indir,xindx,outdir,abarj,p_delta,betai) ; if (retval == dyrOK || retval == dyrREQCHK || retval == dyrSWING) { dseretval = dseupdate(xindx,xjndx,p_xicand,tau,betai,abari,abarj) ; if (dseretval != dyrOK) retval = dseretval ; } if (retval == dyrOK) retval = inretval ; # ifdef DYLP_PARANOIA dy_chkdual(chkduallvl) ; # endif } /* Tidy up and return. */ FREE(abarj) ; FREE(abari) ; FREE(betai) ; FREE(tau) ; return (retval) ; } DyLP-1.6.0/DyLP/src/Dylp/dy_pivreject.c0000644000076700007670000004307311026315405014432 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains routines which handle the pivot rejection list. In addition to routines to add and remove entries, there's a routine to examine the list and decide on an appropriate action when a simplex punts. The basic mechanism used for pivot rejection is a qualifier flag, vstatNOPIVOT, which is added to a variable's status. Flagged variables are not considered for entering the basis (primal) or leaving the basis (dual). For management purposes, information about flagged variables is kept in an array, pivrejlst. There is also a control structure, pivrej_ctl. */ #define DYLP_INTERNAL #include "dylp.h" static char sccsid[] UNUSED = "@(#)dy_pivreject.c 4.4 11/06/04" ; static char svnid[] UNUSED = "$Id: dy_pivreject.c 240 2008-06-18 23:32:21Z lou $" ; /* pivrej_struct Each pivrej_struct holds the index of the variable, the value of basis.pivs at the time of rejection, and an indication of why the variable was rejected: * dyrSINGULAR indicates that the basis became singular when this variable tried to enter the basis. * dyrMADPIV indicates that abar was rejected by dy_chkpiv; in this case the rejection ratio is stored. Keeping a list saves scanning the entire nonbasic (primal) or basic (dual) partition when we come to clear marked variables after a successful pivot. Keeping the acceptance ratio allows us to make an intelligent decision about whether to reduce the pivot tolerance or break out of simplex and attempt to modify the constraint system. Field Definition ----- ---------- ndx index of rejected variable iter value of basis.pivs when the pivot was rejected why the reason the pivot was rejected (dyrSINGULAR or dyrMADPIV) ratio the ratio returned by dy_chkpiv when the pivot was rejected, multiplied by the value of dy_tols.pivot at time of rejection (for independence from possible changes to tols.pivot) */ typedef struct { int ndx ; int iter ; dyret_enum why ; double ratio ; } pivrej_struct ; static pivrej_struct *pivrejlst = NULL ; /* pivrejctl_struct Control structure for the pivot rejection mechanism. Field Definition ----- ---------- sze allocated capacity of pivrejlst cnt number of entries in pivrejlst mad number of entries rejected due to small abar sing number of entries rejected due to singular basis iter_reduced value of basis.pivs when the pivot tolerance was reduced; -1 if we're running with the default tolerance. savedtol saved copy of the default pivot tolerance; captured by initpivrej pivmul reduction factor for pivot tolerance; currently hardcoded in initpivrej; when reduction is required, it's in steps of 1/pivmul. */ typedef struct { int sze ; int cnt ; int mad ; int sing ; int iter_reduced ; double savedtol ; double pivmul ; } pivrejctl_struct ; static pivrejctl_struct pivrej_ctl ; void dy_initpivrej (int sze) /* Allocate the pivrej control structure and an initial pivrejlst array. Parameter: sze: allocated capacity of the pivot rejection list */ { pivrej_ctl.sze = maxx(sze,5) ; pivrejlst = (pivrej_struct *) MALLOC(pivrej_ctl.sze*sizeof(pivrej_struct)) ; pivrej_ctl.cnt = 0 ; pivrej_ctl.mad = 0 ; pivrej_ctl.sing = 0 ; pivrej_ctl.iter_reduced = -1 ; pivrej_ctl.savedtol = dy_tols->pivot ; pivrej_ctl.pivmul = 1000.0 ; # ifdef DYLP_STATISTICS if (dy_stats != NULL) dy_stats->pivrej.min_pivtol = dy_tols->pivot ; # endif return ; } void dy_freepivrej (void) /* Free the pivot rejection list. Solely for information hiding. */ { if (pivrejlst != NULL) { FREE(pivrejlst) ; pivrejlst = NULL ; } return ; } void dy_checkpivtol (void) /* A quick little routine to see if we've been running long enough on a reduced pivot multiplier. If so, get back to the default. The primary purpose of this is information hiding. */ { if (pivrej_ctl.iter_reduced > 0 && dy_lp->basis.pivs-pivrej_ctl.iter_reduced > dy_opts->factor) { dy_tols->pivot = pivrej_ctl.savedtol ; pivrej_ctl.iter_reduced = -1 ; } return ; } static int int_nonincreasing (const void *p_i, const void *p_j) /* Reverse integer comparison so we can sort arrays of indices in nonincreasing order. Returns: < 0 if i > j 0 if i = j > 0 if i < j */ { int i = *((const int *) p_i) ; int j = *((const int *) p_j) ; return ((j)-(i)) ; } bool dy_clrpivrej (int *entries) /* This routine removes variables from rejected pivot list. As far as the rest of dylp is concerned, all that needs to be done is to clear the NOPIVOT qualifier from the variable's status entry. Internally, there are really two modes: clear specified entries, and clear the entire list. If the client supplies an array of indices in the entries parameter, selective removal is performed, otherwise the entire list is cleared. Parameters: entries: an array with indices of entries to be removed entries[0] is expected to contain the number of entries Returns: TRUE if the clearing operation is successful, FALSE otherwise. */ { int n,j,ndx,last,endx,elast ; flags statj ; const char *rtnnme = "dy_clrpivrej" ; # ifdef DYLP_PARANOIA flags chkflgs ; /* For dual simplex, only out-of-bound basic variables are considered for pivoting, but subsequent dual pivots could change that to pretty much any basic status. For primal simplex, any nonbasic status is ok, including the exotic ones. */ if (dy_lp->phase == dyDUAL) { chkflgs = vstatBASIC ; } else { chkflgs = vstatNONBASIC|vstatEXOTIC ; } # endif /* Are we clearing the entire list? If so, also restore the default pivot tolerance. If we're being selective about clearing, leave the tolerance unchanged and assume the client will take care of it. If there are no entries in pivrejlst, that's all we need to do. */ if (entries == NULL) { dy_tols->pivot = pivrej_ctl.savedtol ; pivrej_ctl.iter_reduced = -1 ; } if (pivrej_ctl.cnt == 0) return (TRUE) ; # ifndef DYLP_NDEBUG if (dy_opts->print.pivreject >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n %s pivot reject list ... ", (entries == NULL)?"clearing":"winnowing") ; } # endif n = dy_sys->varcnt ; last = pivrej_ctl.cnt-1 ; /* If the client hasn't supplied entries, we're clearing the entire list. */ if (entries == NULL) { for (ndx = 0 ; ndx <= last ; ndx++) { j = pivrejlst[ndx].ndx ; statj = dy_status[j] ; # ifdef DYLP_PARANOIA if (j < 1 || j > n) { errmsg(102,rtnnme,dy_sys->nme,"rejected variable",j,1,n) ; return (FALSE) ; } if (flgoff(statj,vstatNOPIVOT) || flgoff(statj,chkflgs)) { errmsg(329,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, consys_nme(dy_sys,'v',j,FALSE,NULL),j,ndx,dy_prtvstat(statj), (dy_lp->phase == dyDUAL)?"basic":"nonbasic") ; return (FALSE) ; } # endif # ifndef DYLP_NDEBUG if (dy_opts->print.pivreject >= 2) dyio_outfmt(dy_logchn,dy_gtxecho, "\n\trestoring %s (%d) as eligible for pivoting.", consys_nme(dy_sys,'v',j,TRUE,NULL),j) ; # endif clrflg(dy_status[j],vstatNOPIVOT) ; } last = -1 ; pivrej_ctl.mad = 0 ; pivrej_ctl.sing = 0 ; } /* The more complicated case: Remove the set of entries specified by the client. The sort is necessary so that we can compress in place, moving the last entry to replace the deleted entry. */ else { elast = entries[0] ; if (elast > 1) { qsort(&entries[1],elast,sizeof(int),int_nonincreasing) ; } for (endx = 1 ; endx <= elast ; endx++) { ndx = entries[endx] ; # ifdef DYLP_PARANOIA if (ndx < 0 || ndx >= pivrej_ctl.cnt) { errmsg(102,rtnnme,dy_sys->nme,"pivrej list index",ndx, 0,pivrej_ctl.cnt-1) ; return (FALSE) ; } # endif j = pivrejlst[ndx].ndx ; statj = dy_status[j] ; # ifdef DYLP_PARANOIA if (j < 1 || j > n) { errmsg(102,rtnnme,dy_sys->nme,"rejected variable",j,1,n) ; return (FALSE) ; } if (flgoff(statj,vstatNOPIVOT) || flgoff(statj,chkflgs)) { errmsg(329,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, consys_nme(dy_sys,'v',j,FALSE,NULL),j,ndx,dy_prtvstat(statj), (dy_lp->phase == dyDUAL)?"basic":"nonbasic") ; return (FALSE) ; } # endif clrflg(dy_status[j],vstatNOPIVOT) ; # ifndef DYLP_NDEBUG if (dy_opts->print.pivreject >= 2) dyio_outfmt(dy_logchn,dy_gtxecho, "\n\trestoring %s (%d) as eligible for pivoting.", consys_nme(dy_sys,'v',j,TRUE,NULL),j) ; # endif if (ndx < last) { pivrejlst[ndx] = pivrejlst[last] ; switch (pivrejlst[ndx].why) { case dyrSINGULAR: { pivrej_ctl.sing-- ; break ; } case dyrMADPIV: { pivrej_ctl.mad-- ; break ; } default: { errmsg(1,rtnnme,__LINE__) ; return (FALSE) ; } } } last-- ; } } last++ ; # ifndef DYLP_NDEBUG if (dy_opts->print.pivreject >= 1) { if (dy_opts->print.pivreject >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n ") ; } dyio_outfmt(dy_logchn,dy_gtxecho,"restored %d variables.", pivrej_ctl.cnt-last) ; } # endif pivrej_ctl.cnt = last ; return (TRUE) ; } dyret_enum dy_addtopivrej (int j, dyret_enum why, double abarij, double maxabarij) /* This routine adds x to the rejected pivot list by adding an entry to pivrejlst and adding the NOPIVOT qualifier to x's status. If necessary, it expands the size of the list. Parameter: j: the variable x why: the reason it's going on the pivot reject list; one of dyrSINGULAR or dyrMADPIV abarij: (why == dyrMADPIV) the pivot element maxabarij: (why == dyrMADPIV) the maximum pivot element in the pivot column (primal) or row (dual). Returns: dyrOK if the entry is added without error, dyrFATAL if we can't get more space, or if a paranoid check fails. */ { int n,ndx,newsze ; double ratio ; const char *rtnnme = "dy_addtopivrej" ; # ifndef DYLP_NDEBUG int saveprint ; saveprint = dy_opts->print.pivoting ; dy_opts->print.pivoting = 0 ; # endif /* We don't actually need the pivot ratio until further down, but it's handy to do it here where we can easily suppress the internal print, then restore the print level. */ ratio = dy_chkpiv(abarij,maxabarij) ; n = dy_sys->varcnt ; # ifndef DYLP_NDEBUG dy_opts->print.pivoting = saveprint ; # endif # ifdef DYLP_PARANOIA if (j < 1 || j > n) { errmsg(102,rtnnme,dy_sys->nme,"variable",j,1,n) ; return (dyrFATAL) ; } if (!(why == dyrSINGULAR || why == dyrMADPIV)) { errmsg(1,rtnnme,__LINE__) ; return (dyrFATAL) ; } # endif # ifndef DYLP_NDEBUG /* The default case in this switch is needed to suppress GCC warnings --- it doesn't grok the paranoid check. */ if (dy_opts->print.pivreject >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n marking %s (%d) ineligible for pivoting ", consys_nme(dy_sys,'v',j,TRUE,NULL),j) ; switch (why) { case dyrSINGULAR: { dyio_outfmt(dy_logchn,dy_gtxecho,"(%s).",dy_prtdyret(why)) ; break ; } case dyrMADPIV: { dyio_outfmt(dy_logchn,dy_gtxecho,"(%s = %g).",dy_prtdyret(why),ratio) ; break ; } default: { errmsg(1,rtnnme,__LINE__) ; return (dyrFATAL) ; } } } # endif /* Flag the culprit --- the extent of externally visible activity. Then make the entry in the pivot reject list. Check for adequate list length and expand if necessary. */ setflg(dy_status[j],vstatNOPIVOT) ; ndx = pivrej_ctl.cnt++ ; if (ndx >= pivrej_ctl.sze) { newsze = minn(2*pivrej_ctl.sze,n+1) ; # ifndef DYLP_NDEBUG if (dy_opts->print.pivreject >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: expanding pivot reject list from %d to %d entries.", rtnnme,pivrej_ctl.sze,newsze) ; } # endif pivrejlst = (pivrej_struct *) REALLOC(pivrejlst,newsze*sizeof(pivrej_struct)) ; if (pivrejlst == NULL) { errmsg(337,rtnnme,dy_sys->nme,pivrej_ctl.sze,newsze) ; return (dyrFATAL) ; } pivrej_ctl.sze = newsze ; } pivrejlst[ndx].ndx = j ; pivrejlst[ndx].iter = dy_lp->basis.pivs ; pivrejlst[ndx].why = why ; switch (why) { case dyrSINGULAR: { pivrej_ctl.sing++ ; break ; } case dyrMADPIV: { pivrej_ctl.mad++ ; ratio = dy_chkpiv(abarij,maxabarij) ; pivrejlst[ndx].ratio = ratio*dy_tols->pivot ; break ; } default: { errmsg(1,rtnnme,__LINE__) ; return (dyrFATAL) ; } } # ifdef DYLP_STATISTICS if (dy_stats != NULL) { switch (why) { case dyrSINGULAR: { dy_stats->pivrej.sing++ ; break ; } case dyrMADPIV: { dy_stats->pivrej.mad++ ; break ; } default: { errmsg(1,rtnnme,__LINE__) ; return (dyrFATAL) ; } } if (pivrej_ctl.cnt > dy_stats->pivrej.max) { dy_stats->pivrej.max = pivrej_ctl.cnt ; } } # endif return (dyrOK) ; } dyret_enum dy_dealWithPunt (void) /* This routine decides on the appropriate action(s) when a simplex decides to punt. The algorithm is this: 1) Sort the entries in pivrejlst into two sets: iter == basis.pivs (current) and iter != basis.pivs (old). In the current set, count the number of mad and singular entries. 2) If there are any entries in old, remove them from pivrejlst and return with an indication to resume pivoting (dyrRESELECT). 3) If all entries in current are of type singular, return with an indication to abort this simplex phase (dyrPUNT) and hope that we can alter the constraint system. 4) For each permissible reduction in pivot tolerance, check for entries of type MADPIV that might become acceptable. If there are any, remove them from pivrejlst and return dyrRESELECT. 5) If 4) failed to identify pivots, return dyrPUNT. Parameters: none Returns: dyrRESELECT if pivoting can resume dyrPUNT to abort this simplex phase dyrFATAL if something goes wrong */ { int j,ndx,last,oldcnt,curcnt,curmad,brk ; double maxratio,pivmul ; bool clr_retval ; dyret_enum retval ; int *old,*current ; pivrej_struct *pivrej ; # ifndef DYLP_NDEBUG const char *rtnnme = "dy_dealWithPunt" ; # endif # ifdef DYLP_STATISTICS if (dy_stats != NULL) dy_stats->pivrej.puntcall++ ; # endif retval = dyrINV ; /* If there are no rejected pivots, the punt stands. */ if (pivrej_ctl.cnt == 0) { # ifdef DYLP_STATISTICS if (dy_stats != NULL) dy_stats->pivrej.puntret++ ; # endif return (dyrPUNT) ; } /* Setup and scan pivrejlst as indicated above. */ last = pivrej_ctl.cnt ; brk = dy_lp->basis.pivs ; old = (int *) MALLOC((last+1)*sizeof(int)) ; current = (int *) MALLOC((last+1)*sizeof(int)) ; oldcnt = 0 ; curcnt = 0 ; curmad = 0 ; maxratio = 0 ; for (ndx = 0 ; ndx < last ; ndx++) { pivrej = &pivrejlst[ndx] ; if (pivrej->iter != brk) { old[++oldcnt] = ndx ; } else { current[++curcnt] = ndx ; if (pivrej->why == dyrMADPIV) { curmad++ ; if (maxratio < pivrej->ratio) maxratio = pivrej->ratio ; } } } /* If there are old entries, we can always hope the intervening pivots have cured the problem. It happens. */ if (oldcnt > 0) { old[0] = oldcnt ; clr_retval = dy_clrpivrej(old) ; if (clr_retval == TRUE) { retval = dyrRESELECT ; } else { retval = dyrFATAL ; } # ifndef DYLP_NDEBUG if (dy_opts->print.pivreject >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n restored %d entries queued before iter = %d.", old[0],brk) ; } # endif } /* Are there any mad pivots that we can press into service by reducing the pivot tolerance? */ else if (curmad > 0 && maxratio > dy_tols->zero) { pivmul = 1/dy_tols->pivot ; while (maxratio*pivmul < 1.0) pivmul *= pivrej_ctl.pivmul ; if (1/pivmul >= dy_tols->zero*100) { # ifndef DYLP_NDEBUG if (dy_opts->print.pivreject >= 1) { warn(376,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, dy_tols->pivot,1/pivmul) ; } # endif dy_tols->pivot = 1/pivmul ; # ifdef DYLP_STATISTICS if (dy_stats != NULL) { dy_stats->pivrej.pivtol_red++ ; if (dy_tols->pivot < dy_stats->pivrej.min_pivtol) { dy_stats->pivrej.min_pivtol = dy_tols->pivot ; } } # endif j = 0 ; for (ndx = 1 ; ndx <= curcnt ; ndx++) { pivrej = &pivrejlst[current[ndx]] ; if (pivrej->ratio*pivmul > 1.0) { current[++j] = current[ndx] ; } } current[0] = j ; clr_retval = dy_clrpivrej(current) ; if (clr_retval == TRUE) { retval = dyrRESELECT ; } else { retval = dyrFATAL ; } # ifndef DYLP_NDEBUG if (dy_opts->print.pivreject >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n restored %d entries queued at iter = %d at piv. tol = %g", current[0],brk,dy_tols->pivot) ; } # endif } else { # ifndef DYLP_NDEBUG if (dy_opts->print.pivreject >= 1) { warn(383,rtnnme,dy_sys->nme, dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, dy_tols->zero,dy_prtdyret(dyrPUNT)) ; } # endif retval = dyrPUNT ; } } else { retval = dyrPUNT ; } /* That's it, we've done our best. Free the old and current arrays and return. */ FREE(old) ; FREE(current) ; # ifndef DYLP_NDEBUG if (retval == dyrPUNT && dy_opts->print.pivreject >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n PUNT! mad = %d, singular = %d.", pivrej_ctl.mad,pivrej_ctl.sing) ; } # endif # ifdef DYLP_STATISTICS if (dy_stats != NULL && retval == dyrPUNT) dy_stats->pivrej.puntret++ ; # endif return (retval) ; } DyLP-1.6.0/DyLP/src/Dylp/dy_errmsgs.txt0000644000076700007670000010734011033030745014513 0ustar sccs: @(#)bonsaierrs.txt 4.3 11/06/04 svn/cvs: $Id: dy_errmsgs.txt 243 2008-07-03 01:56:53Z lou $ This file is a part of the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). I haven't yet gone through and removed messages specific to the bonsaiG MIP code. That'll happen eventually. General error messages, useful pretty much anywhere @1@internal confusion, line %d.@ @2@%s parameter is null.@ @3@%s parameter has invalid value '%c'.@ @4@%s parameter has invalid value "%s".@ @5@%s parameter has invalid value "%d".@ @6@%s parameter has invalid value "%#08x".@ @7@line %d: unrecognised %s %d.@ @8@line %d: unable to allocate %d bytes.@ @9@<>@ Error messages used primarily by the basic io routines in io(io) @10@open failed for file "%s", mode "%s".@ @11@close failed for file "%s".@ @12@i/o error while reading from "%s".@ @13@all available i/o streams are in use.@ @14@error log file is open but has no name.@ @15@stream %d is not active.@ @16@file "%s" is not opened for input.@ @17@file "%s" is not opened for output.@ @18@failed to change error log file from "%s" to "%s".@ @19:22@<>@ @23@could not obtain mark for file "%s".@ @24@could not position file "%s" to mark "%ld".@ @25@pattern "%s" is too long, truncating to %d characters.@ @26@lexeme beginning with "%s" is too long, truncating to %d characters.@ @27@fixed-length string of length %d beginning with "%s" prematurely truncated.@ @28@string quoted with "%c", "%c" beginning with "%s" prematurely truncated.@ @29@<>@ Error messages used primarily by the routines of io(bnfrdr) @30@storage offset %d is outside legal range 0 to %d for the current node.@ @31@node size %d is less than 0.@ @32@null bnf reference encountered for component %d, %d components expected.@ @33@null bnf definition in bnf reference.@ @34@a %s is inappropriate as a component in a %s.@ @35@invalid bnf reference type %d.@ @36@bnf reference does not reference a generator.@ @37@null component list encountered for alternative %d, %d alternatives expected.@ @38@bnf reference does not reference a non-primitive.@ @39@bnf reference does not reference a primitive.@ @40@saved text array index %d is outside legal range 0 to %d.@ @41@bnf reference does not reference a terminal.@ @42@terminal definition specifies invalid terminal type %d.@ @43@bnf must begin with a generator, non-primitive, or primitive.@ @44@<>@ @45@string "%s" cannot be converted to a number.@ @46@base %d is not implemented for %s.@ @47@bnf reference does not reference an immediate.@ @48@bnf reference does not reference a literal.@ @49@null text pointer in literal.@ @50@no primitive is active.@ @51@saved text array entry %d is null.@ @52@bnf reference does not reference a label definition.@ @53@null bnf specified for label %s in label definition.@ @54@name %s specified for label value in label definition is not a defined label.@ @55@code %d specified for label %s in label definition is not valid.@ @56@parse of bnf specified for label %s in label definition failed.@ @57@null string obtained for label %s in label definition.@ @58@null value obtained for label %s in label definition.@ @59@null bnf specified for %s in label reference.@ @60@parse of bnf specified for %s in label reference failed.@ @61@null string obtained for %s name in label reference.@ @62@null value obtained for socket in label reference.@ @63@the value to be stored must be defined in a forward label reference.@ @64@code %d specified for %s in label reference is not valid.@ @65@null value obtained for value in label reference.@ @66@the socket must be defined in a backward label reference.@ @67@separator is not a primitive or terminal.@ @68@reference requests storage but curnde is null.@ @69@link offset %d is outside legal range 0 to %d for the current node.@ @70@only generators, non-primitives, and primitives can be list components; type %d is invalid.@ @71@%s should normally be null at the completion of a parse.@ @72:89@<>@ Error messages related to packed vectors @90@inconsistent packed vector %s (%d): size %d, nonzero %d, coefficient array %sallocated.@ @91@vector %s (%d) requires space for %d entries; resize specifies %d.@ @92@vector %s (%d) has space for %d entries; %s %s (%d) has %d.@ @93@in vector %s, default index = %d, default value = %g.@ @94@in vector %s (%d), coeffs[%d].ndx = %d, coeffs[%d].val = %g.@ @95@vector %#08x has null name.@ @96:99@<>@ Error messages related to constraint system care and maintenance @100@[%s]: unable to attach "%s".@ @101@[%s]: %s is missing.@ @102@[%s]: %s index %d violates range %d..%d.@ @103@[%s]: missing header for %s %d.@ @104@[%s]: vec = %#08x not on attached vector list.@ @105@[%s]: unable to detach "%s".@ @106@[%s]: element size for vector %#08x is %d.@ @107@[%s]: duplicate %s attach request, vec = %#08x, pvec = %#08x.@ @108@[%s]: no reference list for attached %s %#08x.@ @109@[%s]: pvec = %#08x not on reference list for %s %#08x.@ @110@[%s]: empty reference at %#08x on reference list for %s %#08x.@ @111@[%s]: unable to update references to %s from %#08x to %#08x.@ @112@[%s]: %s failed for %s %s (%d).@ @113@[%s]: parts flags indicate %s is present, but associated pointer field is null.@ @114@[%s]: unrecognised %s vector type(s) %#08x.@ @115@[%s]: constraint system is flagged as corrupt.@ @116@[%s]: row %s (%d) claims %d coefficients but has %d.@ @117@<>@ @118@[%s]: %s %s (%d) has length 0.@ @119@[%s]: coefficient a<%d,%d> = %g appears in %s %d but not %s %d.@ @120@[%s]: unable to properly install %s for constraint %s (%d); required associated vectors are missing.@ @121@[%s]: unable to add logical variable for constraint %s (%d).@ @122@[%s]: could not retrieve %s %s (%d).@ @123@[%s] already has logical variables!@ @124@[%s]: could not expand to incorporate logical variables.@ @125@[%s]: null/incorrect %s in matrix coefficient %#08x, %s %s (%d).@ @126@[%s]: internal confusion; %s hdr = %#08x, hdr.ndx = %d, but mtx.hdr[%d] == %#08x.@ @127@[%s]: null vector pointer in header (%#08x) for attached vector type %s.@ @128@[%s]: coefficient a<%d,%d> = %g encountered while adding %s %s. Aborting due to invalid value.@ @129@[%s]: addition of %s (%d) gives %d %s; allocated capacity is only %d.@ @130@[%s]: infinitesimal a<%d,%d> = %.10g < %.10g suppressed while adding %s %s.@ @131@[%s]: logical variable count %d does not equal constraint count %d.@ @132@[%s]: multiplication of %s %s (%d) by 0.@ @133@[%s]: failed to set coefficient a<%d,%d> to %g.@ @134@[%s]: %s %s (%d) claims %d coefficients but has %s pointer.@ @135@[%s]: scaling failure.@ @136@[%s]: %s error while duplicating %s, src = %d, dst = %d.@ @137@[%s]: failed to duplicate constraint system.@ @138@[%s]: failed to evaluate constraint system for scaling.@ @139:149@<>@ Error messages used primarily by the MPS i/o package. @150@expecting the keyword "%s", instead found "%s".@ @151@mangled %s %s record.@ @152@could not create constraint system "%s".@ @153@null %s name while processing %s section.@ @154@[%s]: unrecognised constraint type code %d (%c) at constraint %s.@ @155@could not enter %s %s into hash table.@ @156@could not install %s %s.%s.@ @157@unexpected additional field "%s", %s %s.@ @158@row name or 'marker' missing in entry %s.%s.@ @159@marker keyword missing in entry %s.%s.@ @160@can't process %s section; %s vector is missing.@ @161@'%s' (%s) seen, but no '%s'!@ @162@couldn't locate %s "%s", entry %s %s.@ @163@unrecognised marker keyword "%s" at marker %s.@ @164@null coefficient, system %s, column %s, row %s.@ @165@cannot convert "%s" to number, system %s, column %s, row %s.@ @166@couldn't locate %s "%s", %s %s.%s.@ @167@unrecognised bound type code "%s" for variable %s (%d).@ @168@i/o error while attempting %s section.@ @169@unexpected eof while attempting %s section.@ @170@cannot process mps input file "%s"; aborting.@ @171@constructed constraints (Dx code) are not accepted; define constraint %s explicitly.@ @172@discarding non-binding constraint %s.%s.@ @173@[%s]: attempt to multiply objective %s (%d) by -1 for maximisation failed.@ @174@vector resize failed while collecting coefficients for column %s.%s.@ @175@non-binding constraint %s (%d) should not have a rhs range.@ @176@constraint %s (%d) is supposedly a Type 3 SOS constraint, but it has type %s instead of equality.@ @177@[%s]: did not find objective function "%s". @178@[%s]: %s %s (%d) has invalid type %s.@ @179@[%s]: deleting empty constraint %s (%d).@ @180:199@<>@ Error messages from the main program @200@cannot get system time.@ @201@could not open log file %s; logging disabled.@ @202@[%s]: could not create search tree root.@ @203@could not initialise the arc consistency package.@ @204@[%s]: constraint propagation for %s failed, T%d:#%d.@ @205@[%s]: failed to create branch-and-bound search tree root.@ @206@[%s]: failed %s at T%d from subproblem %d\@%d.@ @207@[%s]: failed to process subproblems after tour %d.@ @208@[%s]: failed to ready new active subproblem following tour %d.@ @209@[%s]: failed to regenerate incumbent T%d:#%d\@%d.@ @210@(T%d:#%d\@%d): coefficient reduction failed for %s.@ @211@could not %s %s signal handler.@ @212@(T%d:#%d\@%d): purging %s constraints failed for %s.@ @213:229@<>@ Error messages from the command interpreter @230@unexpected command text "%s".@ @231@<>@ @232@indirect command file "%s" did not close properly.@ @233@ambiguous command keyword "%s".@ @234@unknown command keyword "%s".@ @235@unrecoverable error; command interpretation aborted.@ @236@failed to scan %s %s, %s command.@ @237:239@<>@ @240@parser error while attempting bnf %s.@ @241@enforcing %d <= "%s" <= %d; %d forced to %d.@ @242@ignoring invalid value %g for "%s".@ @243@"%s" defaulted to %d.@ @244@enforcing %.2f <= "%s" <= %.2f; %.2f forced to %.2f.@ @245@"%s" defaulted to %.8g.@ @246@"%s" defaulted to "%s".@ @247:299@<>@ Error messages from the LP code @300@nonsense status %#08x for variable %s (%d).@ @301@found only %d of the %d basic variables required to form a basis for constraint system %s.@ @302@[%s]: (%s)%d: could not %s an initial basis.@ @303@[%s]: in basis pos'n %d, variable index violates %d <= %d <= %d.@ @304@[%s]: (%s)%d: error while testing primal/dual feasibility.@ @305@@[%s]: (%s)%d: could not %s %s variables for inclusion in initial basis.@ @306@[%s]: (%s)%d: error attempting to correct LP data structures after patch of singular basis.@ @307@[%s]: (%s)%d: aborting attempt to factor basis due to numerical instability. Pivot parameters at %s.@ @308@[%s]: (%s)%d: aborting attempt to factor basis, return code %s.@ @309@[%s]: could not factor basis.@ @310@error calculating orientation of constraint %s (%d) to objective.@ @311@[%s] has no logical variables.@ @312@[%s]: (%s)%d: could not sort constraints before forming active system.@ @313@[%s]: (%s)%d: unable to load active system from %s.@ @314@HUGE_VAL = %g, not IEEE infinity. If you really want to use IEEE infinity, consider FIX_HUGE_VAL in vector.h, and confirm that your environment supports the IEEE FP standard.@ @315@variable %s (%d) is non-basic with status %s but has an absolute value of infinity.@ @316@[%s]: could not calculate value of primal basic variables.@ @317@[%s]: antidegeneracy algorithm active at level %d on entry to primal phase 1.@ @318@[%s]: (%s)%d: could not %s phase I objective function.@ @319@[%s] is already feasible; phase I should not have happened.@ @320@[%s]: (%s)%d: could not calculate dot(%s,a<%d>) for %s.@ @321@[%s]: (%s)%d: %s %s[%d] = %g, should be %g; |diff| = %g, tol = %g.@ @322@[%s]: (%s)%d: %s (%d), status %s, violates lb = %g < %g < %g = ub; err = %g; tol = %g.@ @323@[%s]: (%s)%d: unexpected loss of primal feasibility --- %s (%d), status %s, violates lb = %g <= %g <= %g = ub err = %g; tol = %g.@ @324@[%s]: (%s)%d: apparent unboundedness.@ @325@[%s]: (%s)%d: variable %s (%d) = %g, lb = %g, ub = %g, status %s. Nonbasic variables should be within bounds.@ @326@[%s]: (%s)%d: variable %s (%d) = %g = %s, status %s. This variable should not have been chosen to enter at %s.@ @327@[%s]: attempted to form restricted subproblem but found no candidates.@ @328@[%s]: limit of %d total pivots exceeded.@ @329@[%s]: (%s)%d: variable %s (%d) on pivot reject list pos'n %d has status %s; should be %s with nopivot qualifier. @330@[%s]: (%s)%d: variable %s (%d) has status %s, var2basis gives pos'n %d, but basis pos'n holds index %d.@ @331@[%s]: (%s)%d: variable %s (%d) = %g has status %s, but lb = %g != %g = ub; err = %g, tol = %g.@ @332@[%s](%s)%d: %s (%d), status %s, x = %g != x = %g, |x - x| = %g, tol = %g.@ @333@[%s]: (%s)%d: variable %s (%d) has status %s but x = %g != %g = %s; err = %g; tol = %g.@ @334@[%s]: (%s)%d: variable %s (%d) has lb = %g, ub = %g, but status %s; it should not be free with a finite bound.@ @335@[%s]: (%s)%d: variable %s (%d) has status %s but is within bounds, lb = %g <= %g <= %g = ub; err = %g; tol = %g.@ @336@[%s]: (%s)%d: for %s (%d) %s, %s -y = %g != %g = cbar, diff = %g, tol = %g.@ @337@[%s]: could not expand pivot reject list capacity from %d entries to %d entries.@ @338@[%s]: loss of %s feasibility should not be reported in primal phase I.@ @339@[%s]: (%s)%d: cycling suspected; %d pivots with no change in objective.@ @340@[%s]: could not construct reduced right-hand-side (b - Nx). @341@[%s]: (%s)%d: %s accuracy check failed; 1+norm(%c) = %g; residual %g, tolerance %g.@ @342@[%s]: %s (%d) was in degenerate set, but restored value %g is not at lb = %g or ub = %g; %s %g, tolerance %g.@ @343@[%s]: fatal error at pivot %d.@ @344@[%s]: %s (%d) will overshoot feasibility from %s at pivot %d; val = %g, lb = %g, ub = %g, delta = %g.@ @345@[%s]: attempt to change value of fixed variable %s (%d) = %g at pivot %d; delta = %g.@ @346@[%s]: (%s)%d: status %s for %s (%d) is not legal in this phase.@ @347@[%s]: (%s)%d: unexpected loss of dual feasibility --- %s (%d) status %s, cbar<%d> = %g has the wrong sign, tol = %g.@ @348@@[%s]: (%s)%d: failed to price entering variable %s (%d).@ @349@[%s]: variable %s (%d) = %g, status %s, is within bounds lb = %g, ub = %g; it should not have been chosen to leave.@ @350@[%s]: (%s)%d: predicted %s infeasibility = %g from iter %d does not match starting infeasibility = %g; err = %g.@ @351@[%s]: (%s)%d: constraint system is %d x %d.@ @352@<>@ @353@[%s]: %s simplex returned %s; aborting.@ @354@<>@ @355@[%s]: entering variable %s (%d) has status %s; dual simplex is only prepared for non-basic at upper/lower bound.@ @356@[%s]: %s cross-reference failure. original[%d] = %d but active[%d] = %d.@ @357@[%s]: status of leaving variable %s (%d) is %s, %s = %g, val = %g, err = %g, tol = %g; should be nonbasic at upper/lower bound or fixed.@ @358@[%s]: delta is 0 for dual pivot on %s (%d); lb = %g; x = %g ; ub = %g ; abar = %g.@ @359@[%s]: %s (%d) has status %s in final answer.@ @360@[%s]: variable cross-reference failure. active[%d] = %d; entries for logicals should be 0.@ @361@[%s]: %s count of %d disagrees with %d entries coded as active in cross reference vector.@ @362@[%s]: could not locate coefficient for active %s (%d) in constraint %s (%d).@ @363@<>@ @364@[%s]: constraint %s (%d) should have %d coefficients for active architectural variables, but has %d.@ @365@[%s]: can't find coefficient for logical %s (%d) in constraint %s (%d).@ @366@[%s]: rhs<%d> = %g for constraint %s should be %g; error %g; tol. %g; original rhs<%d> for %s is %g, correction %g.@ @367@[%s]: %s %s (%d) = %g != %g = %s %s (%d) diff = %g, tol = %g.@ @368@<>@ @369@[%s]: %s %s (%d) should be active but isn't; orig%s[%d] = %d.@ @370@[%s]: expected original constraint %s (%d) in basis pos'n %d, but found %s (%d).@ @371@[%s]: (%s)%d: %s failed.@ @372@[%s]: (%s)%d: %s (%d) has status %s, requires major correction to %s; lb = %g, x = %g, ub = %g, x - %s = %g, tol. = %g.@ @373@[%s]: inconsistent basis status after refactorisation.@ @374@[%s]: (%s)%d: forcing refactor (bogus number); |%s<%d>| = |%g| < bogus tol %g by %g.@ @375@[%s]: (%s)%d: forcing refactor (bogus number); |%s<%d>-%s<%d>| = |%g-%g| = %g < bogus tol %g by %g.@ @376@[%s]: (%s)%d: temporarily lowering pivot tolerance from %g to %g.@ @377@<>@ @378@<>@ @379@[%s]: (%s)%d: %s (%d) has lb = %g = ub, status %s; status should be one of BFX, NBFX, BLLB, or BUUB.@ @380@[%s]: %s (%d) has status %s, should be %s.@ @381@[%s]: (%s)%d: forcing refactor on suspicion of numerical error; |%s<%d,%d>| = |%g| < bogosity tolerance %g by %g.@ @382@[%s]: (%s)%d: variable %s (%d) to leave at %s = %g; this should not be!@ @383@[%s]: (%s)%d: pivot multiplier would be below limit %g. Declaring %s.@ @384@[%s]: (%s)%d: could not calculate reduced costs.@ @385@[%s]: (%s)%d: pivot abar<%d,%d> = %g; should be %g, error %g (%g%%), tol %g.@ @386@[%s]: (%s)%d: no %s variable selected at start of pivot loop.@ @387@[%s]: (%s)%d: %d false terminations; retry limit exceeded; aborting.@ @388@[%s]: (%s)%d: %s<%d> update error; update = %g; calc = %g; |error| = %g; tol = %g.@ @389@[%s]: (%s)%d: %s (%d) feasible %s but c<%d> = %g; should be 0.@ @390@[%s]: (%s)%d: degenset[%d] = %d for %s (%d), %s, but antidegeneracy level is only %d. @391@[%s]: (%s)%d: failed to clear superbasics prior to return to phase I.@ @392@[%s]: (%s)%d: could not calculate beta<%d> or abar<%d> for dual pivot; leaving variable %s (%d).@ @393@<>@ @394@[%s]: (%s)%d: inconsistency in rho<%d> for pivot row; inv(B)beta<%d> = %g, ||beta<%d>||^2 = %g, err = %g, tol = %g.@ @395@[%s]: previous return code %s; cannot hot start.@ @396@[%s]: dylp data structures valid flag not set; cannot %s.@ @397@<>@ @398@[%s]: basic <-> nonbasic conversion illegal on hot start; attempt to convert %s (%d) from %s to %s.@ @399@[%s]: (%s)%d: phase %s objective already installed?@ @400@[%s]: (%s)%d: type %d evaluation routine failed for %s (%d).@ @401@[%s]: (%s)%d: %g = dot(eta<%d>,a<%d>) != abar<%d,%d> = %g; err = %g, tol = %g.@ @402@[%s]: (%s)%d: logical %s (%d) has %d coefficients; it should have exactly one.@ @403@duplicate %s requested, but source not supplied.@ @404@requested destination %s size of %d is less than source size of %d; boosting to match. @ @405@[%s]: (%s)%d: updated objective differs from calculated objective; z = %g, z = %g, diff = %g, tol = %g.@ @406@[%s]: initialization/scaling of constraint system failed.@ @407:425@<>@ @426@[%s]: logical %s (%d) for %s constraint %s (%d) has improper %s bound %g.@ @427:429@<>@ @430@[%s]: (%s)%d: unable to %s %s %s (%d).@ @431@[%s]: (%s)%d: %s %s (%d) is already active as %s (%d).@ @432@[%s]: (%s)%d: could not prep column %s (%d) for activation.@ @433@[%s]: (%s)%d: %s variable %s (%d) has status %s; expected NBLB, NBUB, NBFX, or NBFR.@ @434@[%s]: (%s)%d: %s scan for %s failed.@ @435@[%s]: (%s)%d: unexpected situation; %d %s activated, previous simplex %s returned %s, next simplex %s.@ @436@[%s]: (%s)%d: logical for constraint %s (%d) has status %s; expected BUUB, BLLB, B, BUB, BLB, BFR, or BFX.@ @437@[%s]: (%s)%d: logical for constraint %s (%d) has status %s; expected NBLB, NBUB, or NBFX.@ @438@[%s]: (%s)%d: variable %s (%d) has status %s; expected BLLB or BUUB.@ @439@[%s]: (%s)%d: unexpected %s of %s feasibility.@ @440@[%s]: (%s)%d: failed to activate variables referenced by activated constraints.@ @441@[%s]: (%s)%d: unexpected situation; previous simplex %s returned %s.@ @442@[%s]: (%s)%d: logical for newly activated constraint %s (%d) has status %s but constraint should be %s.@ @443@[%s]: (%s)%d: failed to solve lp relaxation, return code %s.@ @444@[%s]: (%s)%d: %s invariant failure; should be zero. ((orig %d)-(ineligible %d))-((eligible %d)+(active %d)) = %d.@ @445@[%s]: (%s)%d: %s %s (%d) marked as ineligible for activation.@ @446@[%s]: (%s)%d: %d %s recorded as %s but count is %d.@ @447:449@<>@ Error messages from the arc consistency package. @450@[%s]: coefficient a<%d,%d> = a<%s,%s>= 0.@ @451@[%s]: could not calculate bounds for constraint %s (%d).@ @452@[%s]: failed to push constraint %s (%d).@ @453@[%s]: constraint %s (%d) has type %s; only equality, less-than-or-equal, or range constraints should be present.@ @454@[%s]: the bound change of %g%% for %s %s (%d) is less than the propagation tolerance %g; not propagated.@ @455@unable to expand propagation stack from %d to %d entries.@ @456@internal confusion; on_propstack indicates %s (%d) is on stack, but search for index failed.@ @457@[%s]: constraint %s has %s = %s; cannot propagate from an infinite bound.@ @458@[%s]: new %s for %s (%d) = %g weaker or equal to old bound %g; diff %g.@ @459@[%s]: could not propagate %s change for %s (%d).@ @460@<>@ @461@invalid constraint type code %d, constraint %s (%d).@ @462@constraint propagation failed for constraint %s (%d).@ @463@[%s]: unexpected constraint type %s.@ @464@[%s]: infinity count error at recalculation; old %s, new %s.@ @465@[%s]: significant error in finite part of bound at recalculation; old %s, new %s, diff %g.@ @466@[%s]: both bounds are infinite for %s constraint %s (%d); cannot propagate from infinite bounds.@ @467@constraint propagation is disabled; this call should not happen.@ @468@snap tolerance %g is smaller than dylp bogus number tolerance %g.@ @469:509@<>@ Error messages from the 2-3 tree package. @510@in the %s tree, %s (%#08x) thinks its children are of type %s; they should be %s.@ @511@%s problem at %s tree %s (%#08x); count is %d, reality is %d.@ @512@purported parent (%#08x) of %s (%#08x) in %s tree has disowned it.@ @513@%s %d (%#08x, max %g) and %d (%#08x, max %g) of a %s (%#08x) in the %s tree are out of order.@ @514@%s (%#08x) in the %s tree has no parent, but the header thinks (%#08x) is the root.@ @515@error while freeing vertices of tree %s.@ @516@unrecognised two-three vertex type %d at the root of the %s tree.@ @517@failed to install leaf for content (%#08x), key %g, in %s tree.@ @518@in the %s tree, max at %s (%#08x) is %g, but the largest max among %s is %g for %s (%#08x).@ @519@leaf (%#08x) in the %s tree has no content.@ @520@%s count of %d at %s (%#08x) in %s tree is outside the valid range of %d to %d.@ @521@attempting rebalance of a %s (%#08x) in %s tree and no rebalance pattern matched.@ @522@failed to find a leaf with value %g in %s tree.@ @523@inconsistent header for tree %s; root type %s, root %#08x, %d vertices, %d leaves. @524@tree %s has no associated tree.@ @525@tree %s has associated tree %s, but no associated node was present for the deleted leaf.@ @526@attempt to delete %sleaf %#08x from tree %s failed.@ @527@attempt to delete leaf with key %g from tree %s failed. @527:531@<>@ @532@the header in the %s tree claims (%#08x) is the root, but (%#08x) says its parent is (%#08x).@ @533@%s (%#08x) in the %s tree claims %s (%#08x) as its child, but the %s claims its parent is (%#08x).@ @534@unequal number of leaves in paired trees; %s tree has %d != %d in %s tree.@ @535@<>@ @536@<>@ @537@<>@ @538@failed to rebalance the %s tree.@ @539@attempt to delete leaf with key = %g from tree %s, but the tree bounds are %g < bound < %g.@ @540@<>@ @541@<>@ @542@failed to find leaf (%#08x) in %s tree.@ @543@<>@ @544@%s tree is empty.@ @545@%s tree is empty, but %s field is %g, not %g.@ @546@<>@ @547@content field recovered from deleted node is null.@ @548@<>@ @549@in the %s tree, the leaf (%#08x) in the %s position has value %g, but the header value is %g.@ @550@in the %s tree, the header specifies leaf (%#08x) as the minimum leaf, but actually it's (%#08x).@ @551:600@<>@ Error messages from the branch-and-bound tree routines. @600@(T%d:#%d\@%d): cannot create this node in the branch-and-bound search tree.@ @601@(T%d:#%d\@%d): improper status %s; should be %s.@ @602@(T%d:#%d\@%d): killing this node will leave orphans; it's not right.@ @603@(T%d): node #%d\@%d (%#08x) is an orphan; proceeding with deletion anyway.@ @604@(T%d): could not delete node #%d\@%d (%#08x) from the branch-and-bound search tree.@ @605@(T%d): attempt to delete %s node from live set failed.@ @606@analysis of objective function failed.@ @607@<>@ @608@(T%d:#%d\@%d): integrated variable forcing loop failed.@ @609@(T%d:#%d\@%d): status is %s but there are no kids.@ @610@(T%d:#%d\@%d): invalid branch specification; branch cnt = %d, branch_vars is %snull.@ @611@<>@ @612@(T%d:#%d\@%d): unable to restore %s %s.@ @613@(T%d:#%d\@%d): failed to solve lp relaxation, return code %s.@ @614@(T%d:#%d\@%d): unexpected branch instruction %s = %s.@ @615@<>@ @616@(T%d:#%d\@%d): failed to generate %s edits.@ @617@(T%d:#%d\@%d): couldn't insert subproblem in live set.@ @618@(T%d:#%d\@%d): couldn't regenerate environment of survivor of tour.@ @619@(T%d): couldn't recover subproblem from live set.@ @620@(T%d:#%d\@%d): couldn't resurrect subproblem.@ @621@(T%d:#%d\@%d): error while installing %s edits.@ @622@(T%d:#%d\@%d): failed resurrection attempt.@ @623@(T%d): unable to prune subtree rooted at node #%d\@%d.@ @624@(T%d:#%d\@%d): node has %s copy but not %s copy; if one is present, both must be present.@ @625@(T%d): not prepared to deal with full status or bounds copies at interior node #%d\@%d.@ @626@(T%d): searched to the root without finding stored basis & bounds copies.@ @627@(T%d): search tree node #%d\@%d (%#08x) has no parent.@ @628@(T%d): search tree node #%d\@%d has no liveinfo structure.@ @629@(T%d): leaf delete (%#08x) failed for node #%d\@%d.@ @630@(T%d:#%d\@%d): inconsistency between ivf_fixed and status array; ivf_fixed says %s (%d) fixed at %g, status is %s.@ @631@(T%d:#%d\@%d): no active variable structure to manipulate!@ @632@(T%d:#%d\@%d): inconsistent new constraint structures: count is %d but array is %snull.@ @633@(T%d:#%d\@%d): failed to delete new constraint structures.@ @634:649@<>@ Error messages from the bound storage/regeneration utilities. @650@[%s]: %s<%s (%d)> = %g has IEEE FP class %s (%d).@ @651@[%s]: %s<%s (%d)> = %g is inside the zero tolerance %g.@ @652@[%s]: %s.bnd = %g has IEEE FP class %s (%d).@ @653@[%s]: %s.bnd = %g is inside the zero tolerance %g.@ @654@[%s]: %s.inf = %d is 1, < -%d, or > %d; invalid value.@ @655@[%s]: currently there are %d %s, but the stored bounds arrays have length %d.@ @656@the %s array is null in the bounds copy specified by key %d at T%d:#%d@%d.@ @657@invalid magic cookie at T%d:#%d@%d.@ @658@(T%d:#%d\@%d): bound edit (%#08x) for %s (%d) has no valid edits.@ @659@infeasible %s bound edit for %s (%d) at T%d:#%d\@%d; rewriting is not in progress; edit forced to feasibility.@ @660@ignored weak %s bound edit for %s (%d) at T%d:#%d\@%d; rewriting is not in progress; edit strengthened.@ @661@could not install bound edit %d (%#08x) for %s (%d) at T%d:#%d\@%d.@ @662@(T%d:#%d\@%d): cannot store a copy of the %s arrays.@ @663@cannot delete stored copy of %s at T%d:#%d\@%d.@ @664@(T%d:#%d\@%d): bounds rewriting is forced but not allowed.@ @665@(T%d:#%d\@%d): %s of %s edit information failed.@ @666@(T%d:#%d\@%d): %s %s (%d) should not have a %s but %s is present.@ @667@<>@ @668@(T%d:#%d\@%d): invalid edit counts (%d/%d) in bound edit structure.@ @669:674@<>@ Error messages from the basis storage/regeneration utilities. @675@no %s in stored basis copy.@ @676@[%s]: stored %s array length %d violates allowable range %d..%d.@ @677@(T%d:#%d\@%d:) %s %s edit information absent.@ @678@(T%d:#%d\@%d:) %s %s edit information already present.@ @679@[%s]: variable %s (%d) has status %s; explicit basic status should not be seen outside dylp.@ @680@inconsistent %s edit structure: edit count is %d but array is %snull.@ @681@[%s]: new %s size in edit structure violates allowable range %d <= %d <= %d.@ @682:699@<>@ Error messages related to tours, integrated variable forcing & fixing @700@[%s]: %s could not install fixed variables at T%d:#%d\@%d.@ @701@(T%d:#%d\@%d): the monotone variable count is %d, but the monotone variable list is %snull.@ @702@(T%d:#%d\@%d): request to fix variable %s (%d) = %d but it is already fixed at %g.@ @703@(T%d:#%d\@%d): request to fix variable %s (%d) but lb = %g != %g = ub.@ @704@<>@ @705@request to fix variable %s (%d) = %g at node T%d:#%d\@%d; this value is not integral (frac = %g).@ @706@(T%d:#%d\@%d): lp return code is %s; expecting %s.@ @707@(T%d:#%d\@%d): error while processing %s instructions.@ @708@(T%d:#%d\@%d): unexpected action code %s in %s entry for %s (%d).@ @709@(T%d:#%d\@%d): %s (%d) is to be fixed at %g, but this is not equal to lb = %g or ub = %g.@ @710@<>@ @711@(T%d:#%d\@%d): no new incumbent this tour but branch is %s; branch instruction %s = %s current bounds lb = %g, ub = %g.@ @712@(T%d:#%d\@%d): failed to process branch instruction %s = %s." @713@(T%d:#%d\@%d): %s constraint not suitable for %s branch.@ @714@(T%d:#%d\@%d): branch is %s; branch instruction %s = %s current bounds LB = %g, UB = %g.@ @715@(T%d:#%d\@%d): parent's estimate of lb = %g is greater than actual optimum for child's lp relaxation z = %g; error = %g, tol = %g.@ @716@(T%d:#%d\@%d): could not remove cuts.@ @717:724@<>@ Error messages related to fathoming and penalties @725@subproblem T%d:#%d fathomed on %s; it should have evaluated as infeasible because of the objective constraint.@ @726@cannot perform penalty calculations at T%d:#%d\@%d.@ @727@error evaluating new integer solution at T%d:#%d\@%d.@ @728@<>@ @729@the solution at subproblem T%d:#%d\@%d is not labelled integer.@ @730@the incumbent T%d:#%d\@%d has no stored %s array.@ @731@error while winnowing the set of live subproblems; bound %g.@ @732@[%s](T%d:#%d\@%d): error while attempting fathoming.@ @733@[%s](T%d:#%d\@%d): initial lp relaxation fathomed by bound.@ @734@[%s](T%d:#%d\@%d): cannot calculate reduced costs.@ @735@[%s](T%d:#%d\@%d): cannot calculate penalties for %s (%d).@ @736@[%s]: %s<%d,%d> = %g < 0. This should not be.@ @737@[%s]: don't know how to calculate penalty for inactive architectural variable %s (%d).@ @738@[%s]: cbar<%d> = %g for %s %s (%d); inside dual feasibility tolerance %g by %g.@ @739@[%s]: %s variable %s (%d) has status %s but cbarj = %g; incorrect sign.@ @740@[%s]: failed to calculate unscaled %s %s<%d>.@ @741@[%s]: alternate calculations of abar<%d,%d> disagree. beta*a = %g, (inv(B)a)<%d> = %g, diff = %g, tol = %g.@ @742@[%s]: alternate calculations of beta<%d,%d> disagree. beta = %g, (inv(B)e) = %g, diff = %g, tol = %g.@ @743@[%s]: dot(beta<%d>,a<%d>) should be %g, instead %g, diff = %g, tol = %g.@ @744:749@<>@ Error messages related to branching priority and tour groups (bonsai MIP code only) @750@(T%d): invalid priority %d recovered for %s (%d).@ @751@(T%d:#%d\@%d): %d variable(s) remain to be forced; tour leader selection is premature.@ @752@(T%d:#%d\@%d): code %d does not specify a valid tour leader selection strategy.@ @753@(T%d:#%d\@%d): failed to select tour leader(s).@ @754@(T%d:#%d\@%d): liveinfo structure already exists.@ @755@empty priority specification.@ @756@priority class %d has no members.@ @757@null entry in member list for class %d.@ @758@all integer variables defaulted to a single branching priority class.@ @759@(T%d): %s (%d) is type %s; only integral variables have a branching priority.@ @760@tour group #%d has only one member.@ @761@initial processing of tour specifications failed.@ @762@in tour #%d the station vector being processed has general integer form; bonsai is not yet ready for this.@ @763@empty tourclass specification.@ @764@tour specification #%d has no %s.@ @765@null entry (position %d) in %s list for tour specification #%d.@ @766@cannot hash variable name %s to index in tour specification #%d.@ @767@duplicate entry for variable %s (%d); it seems to be in tour groups #%d and #%d.@ @768@failed to generate %s station(s) for tour specification #%d.@ @769@tour specification #%d has %d members, but the station vector being processed has only %d digits.@ @770@tour group size in specification %d violates legal range %d <= %d <= %d.@ @771@duplicate %s in stations for tour specification #%d; ignored.@ @772@stations #%d and #%d in tour specification #%d are identical.@ @773@%s (%d) is type %s; only binary variables may appear with a %s station specification.@ @774@(T%d): %s (%d) is type %s; only integral variables can be members of a tour group.@ @775:799@<>@ Error messages related to expansion of the active subproblem. (bonsai MIP code only) @800@(T%d:#%d\@%d): missing liveinfo or var1/var2 structures.@ @801@(T%d:#%d\@%d): this node is already a parent.@ @802@<>@ @803@(T%d:#%d\@%d): the tour %s %s (%d) has status %s; it should be %s.@ @804@(T%d:#%d\@%d): variable %s (%d) is not the tour leader; bonsai is not prepared to cope with a relative station specification for other tour group members.@ @805@(T%d:#%d\@%d): unrecognized change instruction %#08x at pos'n %d for variable %s (%d).@ @806@(T%d:#%d\@%d): cannot finalise the tour itinerary.@ @807@(T%d:#%d\@%d): error while processing tour stations.@ @808@(T%d:#%d\@%d): could not create child at station %s.@ @809@(T%d:#%d\@%d): all branch variable changes were looser than current bounds, hence all subproblems were suppressed. Are you sure the tour specification is correct?@ @810@(T%d:#%d\@%d): rhs ub = %g < %g = lb for %s constraint %s (%d).@ @811@(T%d:#%d\@%d): unable to verify or replace tour leader.@ @812@(T%d:#%d\@%d): failed to regenerate lp relaxation for tour parent.@ @813@(T%d:#%d\@%d): failed to generate tour environment data structures.@ @814:849@<>@ Error messages related to constraint analysis, box bounds, branch-on-hyperplane, and max-min-slack. @850@[%s]: %s (%d) mismatch in variable/coefficient classification; row count %d, classified %d vars, %d coefficients.@ @851@[%s]: constraint classification failed.@ @852@(T%d:#%d\@%d): unable to calculate box bounds.@ @853@[%s]: unable to calculate off constraint bounds.@ @854@(T%d:#%d\@%d): error while scanning for BOH Type 1 candidate.@ @855@(T%d:#%d\@%d): error while attempting quick & dirty max-min-slack.@ @856@(T%d:#%d\@%d): max-min-slack lp failed, status %s.@ @857@(T%d:#%d\@%d): could not create expanded x vector.@ @858@(T%d:#%d\@%d): no valid hyperplanes after %s hyperplane pattern expansion.@ @859@(T%d:#%d\@%d): could not complete %s for max-min-slack lp.@ @860@(T%d:#%d\@%d): error while attempting scan to center.@ @861@(T%d:#%d\@%d): expected to convert %d %s, but actually converted %d.@ @862@(T%d:#%d\@%d): failed to install %s for %g <= %s (%d) <= %g.@ @863@[%s]: right-hand-side reduction failed.@ @864@<>@ @865@(T%d:#%d\@%d): can't install new incumbent (rounding).@ @866@(T%d:#%d\@%d): failed to solve lp relaxation of heuristic solution.@ @867@(T%d:#%d\@%d): failed to manufacture branching hyperplane from %s (%d).@ @868@(T%d:#%d\@%d): coefficient reduction cannot be performed on %s constraint %s (%d).@ @869@(T%d:#%d\@%d): coefficient reduction failed for %s (%d).@ @870@[%s]: integral equality %s (%d) has real rhs = %g! Check your model and try again.@ @871:899@<>@ Error messages generated by cutting plane management. @900@(T%d:#%d\@%d): error in range of cuts to delete. Deleting to %s (%d) will delete architectural constraints from %d to %d.@ @901@(T%d:#%d\@%d): suspicious constraint count %d is not equal to size of parent system (%d) or root system (%d).@ @902@(T%d:#%d\@%d): error in range for cut edit generation. Starting from %s (%d) will generate edits for architectural constraints from %d to %d.@ @903@<>@ @904@(T%d:#%d\@%d): could not install cut %s.@ @905@(T%d:#%d\@%d): error while evaluating MMS branching candidates.@ @906:949@<>@ Error messages related to dylp's simplex/tableau and ray routines @950@[%s]: inactive %s %s (%d); cannot %s.@ @951@[%s]: nonbasic variable %s (%d); cannot %s.@ @952@[%s]: error calculating basis inverse %s %d, %s %s (%d).@ @953@[%s]: error calculating %s %s, %s (%d).@ @954@[%s]: cannot calculate %s rays; incompatible lp return code %s.@ @955@[%s]: error while generating %s rays.@ DyLP-1.6.0/DyLP/src/Dylp/glpluf.h0000644000076700007670000003712710643314772013256 0ustar /* glpluf.h */ /*---------------------------------------------------------------------- -- Copyright (C) 2000, 2001, 2002 Andrew Makhorin , -- Department for Applied Informatics, Moscow Aviation -- Institute, Moscow, Russia. All rights reserved. -- -- This file is a part of GLPK (GNU Linear Programming Kit). -- -- Licensed under the Common Public License (CPL) by permission of the -- author for inclusion in the DyLP LP distribution. ----------------------------------------------------------------------*/ /* @(#)glpluf.h 1.1 10/18/02 svn/cvs: $Id: glpluf.h 158 2007-07-06 01:25:14Z lou $ */ #ifndef _GLPLUF_H #define _GLPLUF_H #define luf_create dy_glp_luf_create #define luf_defrag_sva dy_glp_luf_defrag_sva #define luf_enlarge_row dy_glp_luf_enlarge_row #define luf_enlarge_col dy_glp_luf_enlarge_col #define luf_alloc_wa dy_glp_luf_alloc_wa #define luf_free_wa dy_glp_luf_free_wa #define luf_decomp dy_glp_luf_decomp #define luf_f_solve dy_glp_luf_f_solve #define luf_v_solve dy_glp_luf_v_solve #define luf_solve dy_glp_luf_solve #define luf_delete dy_glp_luf_delete /*---------------------------------------------------------------------- -- The structure LUF defines LU-factorization of a square matrix A, -- which is the following quartet: -- -- [A] = (F, V, P, Q), (1) -- -- where F and V are such matrices that -- -- A = F * V, (2) -- -- and P and Q are such permutation matrices that the matrix -- -- L = P * F * inv(P) (3) -- -- is lower triangular with unity diagonal, and the matrix -- -- U = P * V * Q (4) -- -- is upper triangular. All the matrices have the order n. -- -- The matrices F and V are stored in row/column-wise sparse format as -- row and column linked lists of non-zero elements. Unity elements on -- the main diagonal of the matrix F are not stored. Pivot elements of -- the matrix V (that correspond to diagonal elements of the matrix U) -- are also missing from the row and column lists and stored separately -- in an ordinary array. -- -- The permutation matrices P and Q are stored as ordinary arrays using -- both row- and column-like formats. -- -- The matrices L and U being completely defined by the matrices F, V, -- P, and Q are not stored explicitly. -- -- It can easily be shown that the factorization (1)-(3) is a version of -- LU-factorization. Indeed, from (3) and (4) it follows that -- -- F = inv(P) * L * P, -- -- V = inv(P) * U * inv(Q), -- -- and substitution into (2) gives -- -- A = F * V = inv(P) * L * U * inv(Q). -- -- For more details see the program documentation. */ typedef struct LUF LUF; typedef struct LUF_WA LUF_WA; struct LUF { /* LU-factorization of a square matrix */ int n; /* order of the matrices A, F, V, P, Q */ int valid; /* if this flag is not set, the factorization is invalid */ /*--------------------------------------------------------------*/ /* matrix F in row-wise format */ int *fr_ptr; /* int fr_ptr[1+n]; */ /* fr_ptr[0] is not used; fr_ptr[i], i = 1, ..., n, is a pointer to the first element of the i-th row in the sparse vector area */ int *fr_len; /* int fr_len[1+n]; */ /* fr_len[0] is not used; fr_len[i], i = 1, ..., n, is number of elements in the i-th row (except unity diagonal element) */ /*--------------------------------------------------------------*/ /* matrix F in column-wise format */ int *fc_ptr; /* int fc_ptr[1+n]; */ /* fc_ptr[0] is not used; fc_ptr[j], j = 1, ..., n, is a pointer to the first element of the j-th column in the sparse vector area */ int *fc_len; /* int fc_len[1+n]; */ /* fc_len[0] is not used; fc_len[j], j = 1, ..., n, is number of elements in the j-th column (except unity diagonal element) */ /*--------------------------------------------------------------*/ /* matrix V in row-wise format */ int *vr_ptr; /* int vr_ptr[1+n]; */ /* vr_ptr[0] is not used; vr_ptr[i], i = 1, ..., n, is a pointer to the first element of the i-th row in the sparse vector area */ int *vr_len; /* int vr_len[1+n]; */ /* vr_len[0] is not used; vr_len[i], i = 1, ..., n, is number of elements in the i-th row (except pivot element) */ int *vr_cap; /* int vr_cap[1+n]; */ /* vr_cap[0] is not used; vr_cap[i], i = 1, ..., n, is capacity of the i-th row, i.e. maximal number of elements, which can be stored there without relocating the row, vr_cap[i] >= vr_len[i] */ double *vr_piv; /* double vr_piv[1+n]; */ /* vr_piv[0] is not used; vr_piv[p], p = 1, ..., n, is the pivot element v[p,q], which corresponds to a diagonal element of the matrix U = P*V*Q */ /*--------------------------------------------------------------*/ /* matrix V in column-wise format */ int *vc_ptr; /* int vc_ptr[1+n]; */ /* vc_ptr[0] is not used; vc_ptr[j], j = 1, ..., n, is a pointer to the first element of the j-th column in the sparse vector area */ int *vc_len; /* int vc_len[1+n]; */ /* vc_len[0] is not used; vc_len[j], j = 1, ..., n, is number of elements in the j-th column (except pivot element) */ int *vc_cap; /* int vc_cap[1+n]; */ /* vc_cap[0] is not used; vc_cap[j], j = 1, ..., n, is capacity of the j-th column, i.e. maximal number of elements, which can be stored there without relocating the column, vc_cap[j] >= vc_len[j] */ /*--------------------------------------------------------------*/ /* matrix P */ int *pp_row; /* int pp_row[1+n]; */ /* pp_row[0] is not used; pp_row[i] = j means that p[i,j] = 1 */ int *pp_col; /* int pp_col[1+n]; */ /* pp_col[0] is not used; pp_col[j] = i means that p[i,j] = 1 */ /* if i-th row or column of the matrix F corresponds to i'-th row or column of the matrix L = P*F*inv(P), or if i-th row of the matrix V corresponds to i'-th row of the matrix U = P*V*Q, then pp_row[i'] = i and pp_col[i] = i' */ /*--------------------------------------------------------------*/ /* matrix Q */ int *qq_row; /* int qq_row[1+n]; */ /* qq_row[0] is not used; qq_row[i] = j means that q[i,j] = 1 */ int *qq_col; /* int qq_col[1+n]; */ /* qq_col[0] is not used; qq_col[j] = i means that q[i,j] = 1 */ /* if j-th column of the matrix V corresponds to j'-th column of the matrix U = P*V*Q, then qq_row[j] = j' and qq_col[j'] = j */ /*--------------------------------------------------------------*/ /* sparse vector area (SVA) is a set of locations intended to store sparse vectors that represent rows and columns of the matrices F and V; each location is the doublet (ndx, val), where ndx is an index and val is a numerical value of a sparse vector element; in the whole each sparse vector is a set of adjacent locations defined by a pointer to the first element and number of elements; these pointer and number are stored in the corresponding matrix data structure (see above); the left part of SVA is used to store rows and columns of the matrix V, the right part is used to store rows and columns of the matrix F; between the left and right parts there is the middle part, locations of which are free */ int sv_size; /* total size of the sparse vector area, in locations; locations are numbered by integers 1, 2, ..., sv_size, and location with the number 0 is not used; if it is necessary, the size of SVA is automatically increased */ int sv_beg, sv_end; /* SVA partitioning pointers: locations 1, ..., sv_beg-1 belong to the left part; locations sv_beg, ..., sv_end-1 belong to the middle part; locations sv_end, ..., sv_size belong to the right part; number of free locations, i.e. locations that belong to the middle part, is (sv_end - sv_beg) */ int *sv_ndx; /* int sv_ndx[1+sv_size]; */ /* sv_ndx[0] is not used; sv_ndx[k], 1 <= k <= sv_size, is the index field of the k-th location */ double *sv_val; /* double sv_val[1+sv_size]; */ /* sv_val[0] is not used; sv_val[k], 1 <= k <= sv_size, is the value field of the k-th location */ /* in order to efficiently defragment the left part of SVA there is a double linked list of rows and columns of the matrix V, where rows have numbers 1, ..., n, and columns have numbers n+1, ..., n+n, due to that each row and column can be uniquely identified by one integer; in this list rows and columns are ordered by ascending their pointers vr_ptr[i] and vc_ptr[j] */ int sv_head; /* the number of the leftmost row/column */ int sv_tail; /* the number of the rightmost row/column */ int *sv_prev; /* int sv_prev[1+n+n]; */ /* sv_prev[k], k = 1, ..., n+n, is the number of a row/column, which precedes the k-th row/column */ int *sv_next; /* int sv_next[1+n+n]; */ /* sv_next[k], k = 1, ..., n+n, is the number of a row/column, which succedes the k-th row/column */ /*--------------------------------------------------------------*/ /* working arrays */ int *flag; /* int flag[1+n]; */ /* integer working array */ double *work; /* double work[1+n]; */ /* floating-point working array */ /*--------------------------------------------------------------*/ /* control parameters */ int new_sva; /* new required size of the sparse vector area, in locations; set automatically by the factorizing routine */ double piv_tol; /* threshold pivoting tolerance, 0 < piv_tol < 1; element v[i,j] of the active submatrix fits to be pivot if it satisfies to the stability condition |v[i,j]| >= piv_tol * max|v[i,*]|, i.e. if this element is not very small (in absolute value) among other elements in the same row; decreasing this parameter involves better sparsity at the expense of numerical accuracy and vice versa */ int piv_lim; /* maximal allowable number of pivot candidates to be considered; if piv_lim pivot candidates have been considered, the pivoting routine terminates the search with the best candidate found */ int suhl; /* if this flag is set, the pivoting routine applies a heuristic rule proposed by Uwe Suhl: if a column of the active submatrix has no eligible pivot candidates (i.e. all its elements don't satisfy to the stability condition), the routine excludes such column from the futher consideration until it becomes a column singleton; in many cases this reduces a time needed for pivot searching */ double eps_tol; /* epsilon tolerance; each element of the matrix V with absolute value less than eps_tol is replaced by exact zero */ double max_gro; /* maximal allowable growth of elements of the matrix V during all the factorization process; if on some elimination step the ratio big_v / max_a (see below) becomes greater than max_gro, the matrix A is considered as ill-conditioned (it is assumed that the tolerance piv_tol has an adequate value) */ /*--------------------------------------------------------------*/ /* some statistics */ int nnz_a; /* number of non-zeros in the matrix A */ int nnz_f; /* number of non-zeros in the matrix F (except diagonal elements, which are always equal to one and therefore not stored) */ int nnz_v; /* number of non-zeros in the matrix V (except pivot elements, which correspond to diagonal elements of the matrix U = P*V*Q and which are stored separately in the array vr_piv) */ double max_a; /* largest of absolute values of elements of the matrix A */ double big_v; /* estimated largest of absolute values of elements appeared in the active submatrix during all the factorization process */ int rank; /* estimated rank of the matrix A */ }; struct LUF_WA { /* working area (used only during factorization) */ double *rs_max; /* double rs_max[1+n]; */ /* rs_max[0] is not used; rs_max[i], 1 <= i <= n, is used only if the i-th row of the matrix V belongs to the active submatrix and is the largest of absolute values of elements in this row; rs_max[i] < 0.0 means that the largest value is not known yet and should be determined by the pivoting routine */ /*--------------------------------------------------------------*/ /* in order to efficiently implement Markowitz strategy and Duff search technique there are two families {R[0], R[1], ..., R[n]} and {C[0], C[1], ..., C[n]}; member R[k] is a set of active rows of the matrix V, which have k non-zeros; similarly, member C[k] is a set of active columns of the matrix V, which have k non-zeros (in the active submatrix); each set R[k] and C[k] is implemented as a separate doubly linked list */ int *rs_head; /* int rs_head[1+n]; */ /* rs_head[k], 0 <= k <= n, is number of the first active row, which has k non-zeros */ int *rs_prev; /* int rs_prev[1+n]; */ /* rs_prev[0] is not used; rs_prev[i], 1 <= i <= n, is number of the previous active row, which has the same number of non-zeros as the i-th row */ int *rs_next; /* int rs_next[1+n]; */ /* rs_next[0] is not used; rs_next[i], 1 <= i <= n, is number of the next active row, which has the same number of non-zeros as the i-th row */ int *cs_head; /* int cs_head[1+n]; */ /* cs_head[k], 0 <= k <= n, is number of the first active column, which has k non-zeros (in the active submatrix) */ int *cs_prev; /* int cs_prev[1+n]; */ /* cs_prev[0] is not used; cs_prev[j], 1 <= j <= n, is number of the previous active column, which has the same number of non-zeros (in the active submatrix) as the j-th column */ int *cs_next; /* int cs_next[1+n]; */ /* cs_next[0] is not used; cs_next[j], 1 <= j <= n, is number of the next active column, which has the same number of non-zeros (in the active submatrix) as the j-th column */ }; LUF *luf_create(int n, int sv_size); /* create LU-factorization */ void luf_defrag_sva(LUF *luf); /* defragment the sparse vector area */ int luf_enlarge_row(LUF *luf, int i, int cap); /* enlarge row capacity */ int luf_enlarge_col(LUF *luf, int j, int cap); /* enlarge column capacity */ LUF_WA *luf_alloc_wa(LUF *luf); /* pre-allocate working area */ void luf_free_wa(LUF_WA *wa); /* free working area */ int luf_decomp(LUF *luf, void *info, int (*col)(void *info, int j, int rn[], double aj[]), LUF_WA *wa); /* compute LU-factorization */ void luf_f_solve(LUF *luf, int tr, double x[]); /* solve system F*x = b or F'*x = b */ void luf_v_solve(LUF *luf, int tr, double x[]); /* solve system V*x = b or V'*x = b */ void luf_solve(LUF *luf, int tr, double x[]); /* solve system A*x = b or A'*x = b */ void luf_delete(LUF *luf); /* delete LU-factorization */ #endif /* eof */ DyLP-1.6.0/DyLP/src/Dylp/dy_statistics.c0000644000076700007670000004542611026315405014635 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains routines related to dylp's statistics collection facilities. To activate statistics collection, it's first necessary to define the compile-time symbol DYLP_STATISTICS. The client code should then perform this sequence of actions: * Before calling dylp, call dy_initstats to set up the statistics data structure. * The pointer returned from dy_initstats should then be passed as one of the parameters to the call to dylp. * Once dylp has returned, dy_dumpstats can be used to print the contents of the statistics structure to a file. * When the structure is no longer required, call dy_freestats to free the data structure. */ #define DYLP_INTERNAL #include "dylp.h" #include #include static char sccsid[] UNUSED = "@(#)dy_statistics.c 4.5 11/06/04" ; static char svnid[] UNUSED = "$Id: dy_statistics.c 240 2008-06-18 23:32:21Z lou $" ; /* Handy macros for initialising and freeing an lpstats_struct */ #define FREE_AND_CLEAR(zz_var_zz) \ if (zz_var_zz != NULL) { FREE(zz_var_zz) ; zz_var_zz = NULL ; } #define ALLOC_OR_CLEAR(zz_field_zz,zz_sze_zz,zz_type_zz) \ if (zz_field_zz == NULL) \ { zz_field_zz = (zz_type_zz *) CALLOC((zz_sze_zz+1),sizeof(zz_type_zz)) ; } \ else \ { memset(zz_field_zz,0,(zz_sze_zz+1)*sizeof(zz_type_zz)) ; } void dy_initstats (lpstats_struct **p_lpstats, consys_struct *orig_sys) /* This routine allocates (as necessary) and initialises the data structure that dylp uses to collect detailed statistics. Parameters: p_lpstats: (i) pointer to an lpstats structure; if null, one will be allocated (o) an initialised lpstats structure orig_sys: the constraint system that will be passed to dylp Returns: undefined */ { int k,m,n ; lpstats_struct *lpstats ; # ifdef DYLP_PARANOIA const char *rtnnme = "dy_initstats" ; if (p_lpstats == NULL) { errmsg(2,rtnnme,"&lpstats") ; return ; } # endif /* Allocate the basic structure, if needed. */ if (*p_lpstats != NULL) { lpstats = *p_lpstats ; } else { lpstats = (lpstats_struct *) CALLOC(1,sizeof(lpstats_struct)) ; } /* Check the capacity of the arrays allocated for constraint and variable statistics. If allocated arrays are too small, free them. */ m = orig_sys->concnt ; n = orig_sys->varcnt ; if (lpstats->cons.sze <= m) { FREE_AND_CLEAR(lpstats->cons.angle) FREE_AND_CLEAR(lpstats->cons.actcnt) FREE_AND_CLEAR(lpstats->cons.deactcnt) FREE_AND_CLEAR(lpstats->cons.init) FREE_AND_CLEAR(lpstats->cons.fin) lpstats->cons.sze = 0 ; } if (lpstats->vars.sze <= n) { FREE_AND_CLEAR(lpstats->vars.actcnt) FREE_AND_CLEAR(lpstats->vars.deactcnt) lpstats->vars.sze = 0 ; } /* Allocate or clear the constraint and variable arrays. */ lpstats->cons.sze = m ; lpstats->vars.sze = n ; ALLOC_OR_CLEAR(lpstats->cons.angle,m,double) ALLOC_OR_CLEAR(lpstats->cons.actcnt,m,int) ALLOC_OR_CLEAR(lpstats->cons.deactcnt,m,int) ALLOC_OR_CLEAR(lpstats->cons.init,m,bool) ALLOC_OR_CLEAR(lpstats->cons.fin,m,bool) ALLOC_OR_CLEAR(lpstats->vars.actcnt,n,int) ALLOC_OR_CLEAR(lpstats->vars.deactcnt,n,int) /* Clear state counts. */ memset(lpstats->phasecnts,0,(dyDONE+1)*sizeof(int)) ; /* Clear constraint angle summary statistics */ lpstats->angle.max = -FLT_MAX ; lpstats->angle.min = FLT_MAX ; memset(lpstats->angle.hist,0,DYSTATS_HISTBINS*sizeof(int)) ; /* Clear refactoring statistics */ lpstats->factor.cnt = 0 ; lpstats->factor.prevpiv = 0 ; lpstats->factor.avgpivs = 0 ; lpstats->factor.maxpivs = 0 ; /* Clear/set pivot rejection statistics */ lpstats->pivrej.max = 0 ; lpstats->pivrej.mad = 0 ; lpstats->pivrej.sing = 0 ; lpstats->pivrej.pivtol_red = 0 ; lpstats->pivrej.min_pivtol = DBL_MAX ; lpstats->pivrej.puntcall = 0 ; lpstats->pivrej.puntret = 0 ; /* Clear dual multipivot statistics */ lpstats->dmulti.flippable = 0 ; lpstats->dmulti.cnt = 0 ; lpstats->dmulti.cands = 0 ; lpstats->dmulti.promote = 0 ; lpstats->dmulti.nontrivial = 0 ; lpstats->dmulti.evals = 0 ; lpstats->dmulti.flips = 0 ; lpstats->dmulti.pivrnks = 0 ; lpstats->dmulti.maxrnk = 0 ; /* Clear primal multipivot statistics */ lpstats->pmulti.cnt = 0 ; lpstats->pmulti.cands = 0 ; lpstats->pmulti.nontrivial = 0 ; lpstats->pmulti.promote = 0 ; /* Clear infeasibility statistics */ lpstats->infeas.prevpiv = 0 ; lpstats->infeas.maxcnt = 0 ; lpstats->infeas.totpivs = 0 ; lpstats->infeas.maxpivs = 0 ; lpstats->infeas.chgcnt1 = 0 ; lpstats->infeas.chgcnt2 = 0 ; /* Clear antidegeneracy statistics */ for (k = 0 ; k < DYSTATS_MAXDEGEN ; k++) { lpstats->pdegen[k].cnt = 0 ; lpstats->pdegen[k].avgsiz = 0 ; lpstats->pdegen[k].maxsiz = 0 ; lpstats->pdegen[k].totpivs = 0 ; lpstats->pdegen[k].avgpivs = 0 ; lpstats->pdegen[k].maxpivs = 0 ; } for (k = 0 ; k < DYSTATS_MAXDEGEN ; k++) { lpstats->ddegen[k].cnt = 0 ; lpstats->ddegen[k].avgsiz = 0 ; lpstats->ddegen[k].maxsiz = 0 ; lpstats->ddegen[k].totpivs = 0 ; lpstats->ddegen[k].avgpivs = 0 ; lpstats->ddegen[k].maxpivs = 0 ; } *p_lpstats = lpstats ; return ; } void dy_freestats (lpstats_struct **p_lpstats) /* This routine frees an lpstats structure. Parameters: p_lpstats: (i) lpstats structure to be freed (o) NULL Returns: undefined */ { lpstats_struct *lpstats ; # ifdef DYLP_PARANOIA const char *rtnnme = "dy_freestats" ; if (p_lpstats == NULL) { errmsg(2,rtnnme,"&lpstats") ; return ; } # endif lpstats = *p_lpstats ; *p_lpstats = NULL ; # ifdef DYLP_PARANOIA if (lpstats == NULL) { errmsg(2,rtnnme,"lpstats") ; return ; } # endif FREE_AND_CLEAR(lpstats->cons.angle) FREE_AND_CLEAR(lpstats->cons.actcnt) FREE_AND_CLEAR(lpstats->cons.deactcnt) FREE_AND_CLEAR(lpstats->cons.init) FREE_AND_CLEAR(lpstats->cons.fin) FREE_AND_CLEAR(lpstats->vars.actcnt) FREE_AND_CLEAR(lpstats->vars.deactcnt) FREE(lpstats) ; return ; } #undef ALLOC_OR_CLEAR #undef FREE_AND_CLEAR void dy_finalstats (lpstats_struct *lpstats) /* Various finishing activities: * Scan the final active constraint system and set the cons.fin array. * Copy final pivot and iteration totals from dy_lp. Not much at this point, but it's broken out in anticipation that it may one day do more. Parameters: none Returns: undefined */ { int i,k ; # ifdef DYLP_PARANOIA const char *rtnnme = "dy_finalstats" ; if (lpstats == NULL) { errmsg(2,rtnnme,"lpstats") ; return ; } # endif /* Scan the active constraints and record the ones that are still active. */ for (k = 1 ; k <= dy_sys->concnt ; k++) { i = dy_actcons[k] ; if (i > 0) { lpstats->cons.fin[i] = TRUE ; } } /* Pick up final pivot and iteration totals. */ lpstats->tot.iters = dy_lp->tot.iters ; lpstats->tot.pivs = dy_lp->tot.pivs ; return ; } void dy_dumpstats (ioid chn, bool echo, lpstats_struct *lpstats, consys_struct *orig_sys) /* This is a utility routine which will dump an lpstats_struct in a readable manner. Parameters: chn: file channnel for output echo: TRUE to echo to stdout, FALSE otherwise lpstats: the statistics structure orig_sys: The constraint system Returns: undefined */ { int i,j,m,n,ndx,tot ; int totvact,maxvact,minvact,totvdeact,maxvdeact,minvdeact ; int totcact,maxcact,mincact,totcdeact,maxcdeact,mincdeact ; int ineqcnt,nearcnt,perpcnt,farcnt ; int initallcact,initcact,fincact,right_init,wrong_init,right_fin,wrong_fin ; int rinear,winear,rfnear,wfnear, riperp,wiperp,rfperp,wfperp, rifar,wifar,rffar,wffar ; double anglei,degperbin,brklow,brkhi,temp ; contyp_enum ctypi ; bool initi,fini ; const char *rtnnme = "dy_dumpstats" ; double outbrks[] = { 30, 60, 85, 90, 95, 120, 150, 180 } ; int outbins = sizeof(outbrks)/sizeof(double) ; int outhist[sizeof(outbrks)/sizeof(int)+1] ; char outbuf[20] ; int histfld = 9 ; if (lpstats == NULL) { dyio_outfmt(chn,echo,"\n\n<< %s: NULL lpstats structure! >>\n",rtnnme) ; return ; } dyio_outfmt(chn,echo,"\n\nLP statistics:") ; dyio_outfmt(chn,echo,"\n Angle of constraints to objective (degrees):") ; dyio_outfmt(chn,echo,"\n\tmax: %g\tmin: %g\n", lpstats->angle.max,lpstats->angle.min) ; degperbin = 180/(DYSTATS_HISTBINS-1) ; j = 0 ; brkhi = 0 ; for (i = 0 ; i < outbins ; i++) { brklow = brkhi ; brkhi = outbrks[i] ; if (i < outbins/2) { (void) dyio_outfxd(outbuf,histfld,'c', "[%d-%d)",((int) brklow),((int) brkhi)) ; } else { (void) dyio_outfxd(outbuf,histfld,'c', "(%d-%d]",((int) brklow),((int) brkhi)) ; } dyio_outfmt(chn,echo," %s",outbuf) ; if (brkhi == 90) dyio_outfmt(chn,echo," [90] ") ; outhist[i] = 0 ; for ( ; j*degperbin < brkhi ; j++) { outhist[i] += lpstats->angle.hist[j] ; } } dyio_outchr(chn,echo,'\n') ; for (i = 0 ; i < outbins/2 ; i++) { (void) dyio_outfxd(outbuf,histfld,'c',"%d",outhist[i]) ; dyio_outfmt(chn,echo," %s",outbuf) ; } dyio_outfxd(outbuf,8,'c',"%d",lpstats->angle.hist[DYSTATS_HISTBINS-1]) ; dyio_outfmt(chn,echo," %s",outbuf) ; for ( ; i < outbins ; i++) { (void) dyio_outfxd(outbuf,histfld,'c',"%d",outhist[i]) ; dyio_outfmt(chn,echo," %s",outbuf) ; } dyio_outfmt(chn,echo, "\n Factoring: %d refactorisations",lpstats->factor.cnt) ; dyio_outfmt(chn,echo,"\n\trefactor interval (pivots): avg. %.2f\tmax %d", lpstats->factor.avgpivs,lpstats->factor.maxpivs) ; dyio_outfmt(chn,echo, "\n Pivot rejection: %d unstable, %d singular, max len. %d.", lpstats->pivrej.mad,lpstats->pivrej.sing,lpstats->pivrej.max) ; if (lpstats->pivrej.max > 0) { dyio_outfmt(chn,echo,"\n\tpivot tolerance: %d reductions, min. tol = %g.", lpstats->pivrej.pivtol_red,lpstats->pivrej.min_pivtol) ; dyio_outfmt(chn,echo,"\n\tpunts: %d called, %d returned.", lpstats->pivrej.puntcall,lpstats->pivrej.puntret) ; } dyio_outfmt(chn,echo,"\n Reduction of infeasibility:") ; dyio_outfmt(chn,echo," maximum number of infeasible vars: %d", lpstats->infeas.maxcnt) ; if (lpstats->infeas.maxcnt > 0) { tot = lpstats->infeas.chgcnt1+lpstats->infeas.chgcnt2 ; temp = ((double) lpstats->infeas.totpivs)/tot ; dyio_outfmt(chn,echo,"\n\tpivots to reduce: tot. %d, avg. %.2f, max %d", lpstats->infeas.totpivs,temp,lpstats->infeas.maxpivs) ; dyio_outfmt(chn,echo,"\n\tsingle change: %d, multiple change: %d", lpstats->infeas.chgcnt1,lpstats->infeas.chgcnt2) ; } dyio_outfmt(chn,echo,"\n Primal Multipivot: %d calls, %d sort, %d promote", lpstats->pmulti.cnt,lpstats->pmulti.nontrivial, lpstats->pmulti.promote) ; if (lpstats->pmulti.cnt > 0) { temp = ((float) lpstats->pmulti.cands)/lpstats->pmulti.cnt ; dyio_outfmt(chn,echo,"\n\tcandidates: tot. %d\tavg. %.2f", lpstats->pmulti.cands,temp) ; } dyio_outfmt(chn,echo, "\n Dual Multipivot: %d calls, %d promote, %d multipivot", lpstats->dmulti.cnt,lpstats->dmulti.promote, lpstats->dmulti.nontrivial) ; if (lpstats->dmulti.cnt > 0) { if (lpstats->dmulti.nontrivial > 0) { temp = ((float) lpstats->dmulti.pivrnks)/lpstats->dmulti.nontrivial ; } else { temp = 0 ; } dyio_outfmt(chn,echo, ", avg. rank %.2f, max %d",temp,lpstats->dmulti.maxrnk) ; temp = ((float) lpstats->dmulti.cands)/lpstats->dmulti.cnt ; dyio_outfmt(chn,echo,"\n\tcandidates: tot. %d\tavg. %.2f", lpstats->dmulti.cands,temp) ; temp = ((float) lpstats->dmulti.evals)/lpstats->dmulti.cnt ; dyio_outfmt(chn,echo,"\n\tcolumn evals: tot. %d\tavg. %.2f", lpstats->dmulti.evals,temp) ; temp = ((float) lpstats->dmulti.flips)/lpstats->dmulti.cnt ; dyio_outfmt(chn,echo,"\n\tbound flips: tot. %d\tavg. %.2f", lpstats->dmulti.flips,temp) ; } temp = ((float) lpstats->dmulti.flippable)/orig_sys->varcnt ; dyio_outfmt(chn,echo,"\n\tflippable vars: %d (%.2f%%)", lpstats->dmulti.flippable,temp*100) ; dyio_outfmt(chn,echo,"\n Degeneracy:") ; if (lpstats->pdegen[0].cnt == 0) { dyio_outfmt(chn,echo,"\n Primal: inactive") ; } else { dyio_outfmt(chn,echo, "\n Primal:\tLevel\tEntries\t Vars.\t\tPivots") ; dyio_outfmt(chn,echo,"\n\t\t\t\tAvg.\tMax\tTot.\tAvg.\tMax") ; for (ndx = 1 ; ndx <= lpstats->pdegen[0].cnt ; ndx++) { dyio_outfmt(chn,echo,"\n\t\t%d\t%d\t%.2f\t%d\t%d\t%.2f\t%d", ndx,lpstats->pdegen[ndx].cnt, lpstats->pdegen[ndx].avgsiz,lpstats->pdegen[ndx].maxsiz, lpstats->pdegen[ndx].totpivs,lpstats->pdegen[ndx].avgpivs, lpstats->pdegen[ndx].maxpivs) ; } dyio_outchr(chn,echo,'\n') ; } if (lpstats->ddegen[0].cnt == 0) { dyio_outfmt(chn,echo,"\n Dual: inactive") ; } else { dyio_outfmt(chn,echo,"\n Dual:\tLevel\tEntries\t Vars.\t\tPivots") ; dyio_outfmt(chn,echo,"\n\t\t\t\tAvg.\tMax\tTot.\tAvg.\tMax") ; for (ndx = 1 ; ndx <= lpstats->ddegen[0].cnt ; ndx++) { dyio_outfmt(chn,echo,"\n\t\t%d\t%d\t%.2f\t%d\t%d\t%.2f\t%d", ndx,lpstats->ddegen[ndx].cnt, lpstats->ddegen[ndx].avgsiz,lpstats->ddegen[ndx].maxsiz, lpstats->ddegen[ndx].totpivs,lpstats->ddegen[ndx].avgpivs, lpstats->ddegen[ndx].maxpivs) ; } } dyio_outchr(chn,echo,'\n') ; /* Run through the constraint management information and calculate totals, mins, and maxes, and information about how well we did guessing the correct initial constraint system. Note that it's possible, under fanatic constraint management, to deactivate/activate equalities. But we don't want to include them in information about the initial constraint system, where they're always included. */ m = orig_sys->concnt ; n = orig_sys->varcnt ; totcact = 0 ; totcdeact = 0 ; maxcact = 0 ; mincact = INT_MAX ; maxcdeact = 0 ; mincdeact = INT_MAX ; ineqcnt = 0 ; nearcnt = 0 ; perpcnt = 0 ; farcnt = 0 ; initallcact = 0 ; initcact = 0 ; fincact = 0 ; right_init = 0 ; wrong_init = 0 ; right_fin = 0 ; wrong_fin = 0 ; rinear = 0 ; winear = 0 ; rfnear = 0 ; wfnear = 0 ; riperp = 0 ; wiperp = 0 ; rfperp = 0 ; wfperp = 0 ; rifar = 0 ; wifar = 0 ; rffar = 0 ; wffar = 0 ; for (i = 1 ; i <= m ; i++) { j = lpstats->cons.actcnt[i] ; totcact += j ; if (maxcact < j) maxcact = j ; if (mincact > j) mincact = j ; j = lpstats->cons.deactcnt[i] ; totcdeact += j ; if (maxcdeact < j) maxcdeact = j ; if (mincdeact > j) mincdeact = j ; initi = lpstats->cons.init[i] ; if (initi == TRUE) initallcact++ ; ctypi = orig_sys->ctyp[i] ; if (ctypi == contypGE || ctypi == contypLE || ctypi == contypRNG) { ineqcnt++ ; anglei = lpstats->cons.angle[i] ; if (anglei < 90) { farcnt++ ; } else if (anglei > 90) { nearcnt++ ; } else { perpcnt++ ; } if (initi == TRUE) initcact++ ; fini = lpstats->cons.fin[i] ; if (fini == TRUE) fincact++ ; if (initi == fini) { if (initi == TRUE) { right_init++ ; if (anglei < 90) { rifar++ ; } else if (anglei > 90) { rinear++ ; } else { riperp++ ; } } else { right_fin++ ; if (anglei < 90) { rffar++ ; } else if (anglei > 90) { rfnear++ ; } else { rfperp++ ; } } } else if (initi == TRUE) { wrong_init++ ; if (anglei < 90) { wifar++ ; } else if (anglei > 90) { winear++ ; } else { wiperp++ ; } } else { wrong_fin++ ; if (anglei < 90) { wffar++ ; } else if (anglei > 90) { wfnear++ ; } else { wfperp++ ; } } } } totvact = 0 ; totvdeact = 0 ; maxvact = 0 ; minvact = INT_MAX ; maxvdeact = 0 ; minvdeact = INT_MAX ; for (j = 1 ; j <= n ; j++) { i = lpstats->vars.actcnt[j] ; totvact += i ; if (maxvact < i) maxvact = i ; if (minvact > i) minvact = i ; i = lpstats->vars.deactcnt[j] ; totvdeact += i ; if (maxvdeact < i) maxvdeact = i ; if (minvdeact > i) minvdeact = i ; } /* Dump per phase information. */ dyio_outfmt(chn,echo,"\n State\tEntry\tActivity\tAverage\n") ; for (i = dyPRIMAL1 ; i <= dyFORCEFULL ; i++) { j = lpstats->phasecnts[i] ; dyio_outfmt(chn,echo,"\n %2s%2s\t%5d", dy_prtlpphase(((dyphase_enum) i),TRUE), (lpstats->ini_simplex == ((dyphase_enum) i))?"* ":" ",j) ; temp = 0 ; switch (i) { case dyPRIMAL1: { if (j > 0) { temp = ((double) lpstats->p1.pivs)/j ; dyio_outfmt(chn,echo,"\t%8d\t%7.1f",lpstats->p1.pivs,temp) ; } break ; } case dyPRIMAL2: { if (j > 0) { temp = ((double) lpstats->p2.pivs)/j ; dyio_outfmt(chn,echo,"\t%8d\t%7.1f",lpstats->p2.pivs,temp) ; } break ; } case dyDUAL: { if (j > 0) { temp = ((double) lpstats->d2.pivs)/j ; dyio_outfmt(chn,echo,"\t%8d\t%7.1f",lpstats->d2.pivs,temp) ; } break ; } case dyPURGEVAR: { if (j > 0) { dyio_outfmt(chn,echo, "\t%8d\t%7.1f",totvdeact,((float) totvdeact)/j) ; } break ; } case dyADDVAR: { if (j > 0) { dyio_outfmt(chn,echo,"\t%8d\t%7.1f",totvact,((float) totvact)/j) ; } break ; } case dyPURGECON: { if (j > 0) { dyio_outfmt(chn,echo, "\t%8d\t%7.1f",totcdeact,((float) totcdeact)/j) ; } break ; } case dyADDCON: { if (j > 0) { dyio_outfmt(chn,echo,"\t%8d\t%7.1f",totcact-initallcact, ((float) (totcact-initallcact))/j) ; } break ; } } } dyio_outchr(chn,echo,'\n') ; /* Dump initial and final constraint summary information. */ dyio_outfmt(chn,echo,"\n Initial/Final Constraint System: ") ; dyio_outfmt(chn,echo,"%d inequalities, initial %d, final %d", ineqcnt,initcact,fincact) ; dyio_outfmt(chn,echo,"\n\t%d near, %d perp, %d far",nearcnt,perpcnt,farcnt) ; dyio_outfmt(chn,echo,"\n\ttotal: %d/%d active, %d/%d inactive.", right_init,wrong_fin,right_fin,wrong_init) ; dyio_outfmt(chn,echo,"\n\tnear: %d/%d active, %d/%d inactive.", rinear,wfnear,rfnear,winear) ; dyio_outfmt(chn,echo,"\n\tperp: %d/%d active, %d/%d inactive.", riperp,wfperp,rfperp,wiperp) ; dyio_outfmt(chn,echo,"\n\tfar: %d/%d active, %d/%d inactive.\n", rifar,wffar,rffar,wifar) ; /* That takes care of the summaries. Now the detailed statistics on constraints. */ dyio_outfmt(chn,echo, "\n Constraint\tType Angle\tInit\tAct\tDeact\tFinal\n") ; for (i = 1 ; i <= m ; i++) { dyio_outfmt(chn,echo,"\n%5d %s\t%2s %9.5f\t", i,consys_nme(orig_sys,'c',i,FALSE,NULL), consys_prtcontyp(orig_sys->ctyp[i]), lpstats->cons.angle[i]) ; if (lpstats->cons.init[i] == TRUE) dyio_outfmt(chn,echo,"Y") ; dyio_outfmt(chn,echo,"\t%d\t%d\t", lpstats->cons.actcnt[i],lpstats->cons.deactcnt[i]) ; if (lpstats->cons.fin[i] == TRUE) dyio_outfmt(chn,echo,"Y") ; } dyio_outchr(chn,echo,'\n') ; return ; } DyLP-1.6.0/DyLP/src/Dylp/dy_primalmultipivot.c0000644000076700007670000006660111026315405016062 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains routines which select the leaving variable under somewhat more relaxed primal pivoting rules. The general notion is that we can have `soft' and `hard' limits on delta for the incoming variable x. To give an example, suppose we're in primal phase I, and we're looking at a variable x, BUUB, which will decrease and leave the basis. We can pivot x out when it reaches its upper bound (the `soft' limit on delta) or allow it to continue to move and pivot it out at the lower bound (the `hard' limit). The strategy is to scan the candidates to leave, recording each pivot opportunity and marking it as soft or hard. Then we sort by nondecreasing delta and pick the best looking pivot opportunity from the candidates up to the first hard limit. The real advantage comes in cases where the candidate with the limiting hard delta has a numerically unstable pivot. Often we can promote a candidate with a slightly larger delta and a stable pivot, because (tiny unstable pivot)*(slightly larger delta) is still too small to cause loss of primal feasibility. */ #define DYLP_INTERNAL #include "dylp.h" static char sccsid[] UNUSED = "@(#)dy_primalmultipivot.c 1.4 11/06/04" ; static char svnid[] UNUSED = "$Id: dy_primalmultipivot.c 240 2008-06-18 23:32:21Z lou $" ; /* The structure to hold pivot candidates Field Description ----- ----------- ndx The index of the candidate x deltakj Absolute value of delta for this candidate abarkj Absolute value of pivot for this candidate ratiokj Stability ratio for this candidate; 1.0 is the boundary between stable and unstable. madpiv TRUE if this pivot is unstable, FALSE otherwise dir Direction of motion of x; -1 to decrease, +1 to increase bnd The bound where x will pivot; -1 for lb, +1 for ub hard TRUE if this is a hard limit, false if it's a soft limit */ typedef struct { int ndx ; double deltakj ; double abarkj ; double ratiokj ; bool madpiv ; int dir ; int bnd ; bool hard ; } primcand_struct ; static int primcand_cmp (const void *p_primcand1, const void *p_primcand2) /* Comparison function for qsort to sort an array of primcand_structs. The primary criterion is deltakj, with ratiokj used as the tiebreaker. Parameters: p_primcand1,2: primcand_structs to be compared Returns: -1 if primcand1 < primcand2 0 for equality 1 if primcand1 > primcand2 */ { double delta1,delta2,ratio1,ratio2 ; const primcand_struct *primcand1,*primcand2 ; primcand1 = (const primcand_struct *) p_primcand1 ; primcand2 = (const primcand_struct *) p_primcand2 ; /* The primary criterion is nondecreasing delta. See promoteSanePivot for an optimization. */ delta1 = primcand1->deltakj ; delta2 = primcand2->deltakj ; if (delta1 < delta2) { return (-1) ; } else if (delta1 > delta2) { return (1) ; } /* Equal deltas. Order by nonincreasing pivot ratio. */ ratio1 = primcand1->ratiokj ; ratio2 = primcand2->ratiokj ; if (ratio1 > ratio2) return (-1) ; else if (ratio1 < ratio2) return (1) ; else return (0) ; } static void promoteSanePivot (primcand_struct *outcands) /* This routine attempts to promote a candidate with a sane pivot to the front of the candidate list. The observation is this: numerically unstable (mad) pivots are often small. If the delta of a sane pivot is small enough, we won't cause primal infeasibility. Suppose we have two candidates x (sane) and x (mad) to leave as x enters. If (delta-delta)*a < tol, then it's a good bet we can promote x past x in the pivot list. We also want to prefer hard pivots over soft pivots, which are often degenerate (i.e., x is already at bound and could be pivoted out with no motion). But in a pinch, we'll take a degenerate soft pivot over a mad pivot. So --- our goal is to walk along outcands until we find the first sane hard pivot and then try to promote it to the front of the list. For hard limits, we have to be under the tolerance. Soft limits can be ignored. Parameters: outcands: (i) the candidate list; outcands[0].ndx is the number of candidates (o) the candidate list, possibly rearranged as described Returns: undefined */ { int ndx,candcnt,firsthardsane,firstsoftsane ; double tol ; primcand_struct sane,insane ; /* If outcands[1] is sane and hard, all is copacetic and we can return with no further effort. */ if (outcands[1].madpiv == FALSE && outcands[1].hard == TRUE) return ; /* It's a mad, mad, mad, mad world. Scan for sane pivots, ending the scan when we find the first hard, sane pivot. If there are no sane pivots, we're done. */ candcnt = outcands[0].ndx ; firstsoftsane = -1 ; firsthardsane = -1 ; for (ndx = 1 ; ndx <= candcnt && firsthardsane == -1 ; ndx++) { if (outcands[ndx].madpiv == FALSE) { if (outcands[ndx].hard == TRUE) { firsthardsane = ndx ; } else if (firstsoftsane == -1) { firstsoftsane = ndx ; } } } if (firsthardsane < 0 && firstsoftsane < 0) return ; # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t ") ; if (firstsoftsane > 0) { ndx = outcands[firstsoftsane].ndx ; dyio_outfmt(dy_logchn,dy_gtxecho,"first soft sane %s (%d) at %d", consys_nme(dy_sys,'v',ndx,FALSE,NULL),ndx,firstsoftsane) ; } if (firsthardsane > 0) { ndx = outcands[firsthardsane].ndx ; if (firstsoftsane > 0) dyio_outfmt(dy_logchn,dy_gtxecho,", ") ; dyio_outfmt(dy_logchn,dy_gtxecho,"first hard sane %s (%d) at %d", consys_nme(dy_sys,'v',ndx,FALSE,NULL),ndx,firsthardsane) ; } dyio_outchr(dy_logchn,dy_gtxecho,'.') ; } # endif /* First try to promote a sane pivot with a hard limit. We have a sane pivot at firsthardsane and mad pivots up to firsthardsane-1. Work back towards the front of the list. */ tol = log10(dy_tols->pfeas/dy_tols->zero)/2 ; tol = dy_tols->zero*pow(10.0,tol) ; if (firsthardsane > 1) { for (ndx = firsthardsane ; ndx > 1 ; ndx--) { sane = outcands[ndx] ; insane = outcands[ndx-1] ; if (insane.hard == FALSE || ((sane.deltakj-insane.deltakj)*insane.abarkj < tol)) { outcands[ndx-1] = sane ; outcands[ndx] = insane ; } else { break ; } } # ifndef DYLP_NDEBUG if ((dy_opts->print.pivoting >= 2 && ndx == 1) || dy_opts->print.pivoting >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t promoted hard sane %s (%d) to %d. ", consys_nme(dy_sys,'v',outcands[1].ndx,FALSE,NULL), outcands[1].ndx,ndx) ; } # endif # ifdef DYLP_STATISTICS if (dy_stats != NULL) { if (ndx == 1) dy_stats->pmulti.promote++ ; } # endif if (ndx == 1) return ; } /* Try again with the soft sane pivot. */ if (firstsoftsane > 1) { for (ndx = firstsoftsane ; ndx > 1 ; ndx--) { sane = outcands[ndx] ; insane = outcands[ndx-1] ; if (insane.hard == FALSE || ((sane.deltakj-insane.deltakj)*insane.abarkj < tol)) { outcands[ndx-1] = sane ; outcands[ndx] = insane ; } else { break ; } } # ifndef DYLP_NDEBUG if ((dy_opts->print.pivoting >= 2 && ndx == 1) || dy_opts->print.pivoting >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t promoted hard sane %s (%d) to %d. ", consys_nme(dy_sys,'v',outcands[1].ndx,FALSE,NULL), outcands[1].ndx,ndx) ; } # endif # ifdef DYLP_STATISTICS if (dy_stats != NULL) { if (ndx == 1) dy_stats->pmulti.promote++ ; } # endif } return ; } static dyret_enum scanForPrimOutCands (primcand_struct *outcands, int j, int indir, double *abarj, double maxabarj) /* This routine scans the basic variables for candidates to become the leaving variable; the criteria are outlined below in the scan loop. Candidates are stored in the outcands array. For each candidate, we record the index, information about the pivot coefficient (value, stability), and the pivot operation (direction of motion, bound, delta, hard/soft limit). During the scan, we use the usual primal delta limit to track a `best' candidate, with pivot ratio used as the tiebreaker. If this candidate looks good (a sane pivot with a hard |delta| > 0) at the end of the search, it's returned without further ado. Note that while it's possible to generate two candidate entries (a soft and a hard) for a given variable, the hard candidate will always be the second one, which is the one we'll test below. Otherwise, the entries are sorted. The primary criteria is nonincreasing primal delta, with stability ratio used as the tie-breaker. The sorted list is passed to promoteSanePivot, which will try its best to make sure that the top candidate has a sane pivot coefficient and a hard delta limit. Parameters: outcands: (i) pointer to array to hold the candidates for entry (o) filled and sorted array; in particular outcands[0].ndx is the number of candidates outcands[1..] are the candidates j: index of the entering variable x indir: direction of motion of the entering variable x abarj: The ftran'd pivot column abar, column j of inv(B)N maxabarj: The maximum value in the pivot column Returns: dyrOK if there are candidates and no errors dyrDEGEN if the pivot would be degenerate dyrUNBOUND if there are no candidates dyrFATAL on error (should only occur when we're paranoid) */ { int m,k,kpos,reject,candcnt,lastcandcnt ; double abarkj,ratiokj,xk,ubk,lbk ; double *vub,*vlb ; flags statk ; bool hard,sort ; primcand_struct *outcand,*curbest,best ; dyret_enum retval ; /* Unclear that it's useful to allow soft degenerate pivots, and it's definitely prone to cycling. Could be made into an option, but just disallow for now. */ const bool allowsoftdegen = FALSE ; # ifdef DYLP_PARANOIA const char *rtnnme = "scanForPrimOutCands" ; # endif # if !defined(DYLP_NDEBUG) || defined(DYLP_PARANOIA) int print ; print = dy_opts->print.pivoting ; /* suppress print in dy_chkpiv */ dy_opts->print.pivoting = 0 ; # endif # ifdef DYLP_PARANOIA if (outcands == NULL) { errmsg(2,rtnnme,"outcands array") ; return (dyrFATAL) ; } # endif retval = dyrFATAL ; memset(&best,0,sizeof(primcand_struct)) ; m = dy_sys->concnt ; vub = dy_sys->vub ; vlb = dy_sys->vlb ; outcands[0].ndx = -1 ; # ifndef DYLP_NDEBUG if (print >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n gathering candidates to leave ... ") ; if (print >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tVariable\t x\t\tabar\t delta\t\tDisp") ; } } # endif /* Check if the entering variable is eligible to be the leaving variable. The normal case here is a bound-to-bound flip, but the code is written to handle moving a superbasic variable to bound. ratiokj is set to inf on the theory that not pivoting at all is the ultimate in stable pivots (not to mention the work we avoid by not needing to update the basis inverse). */ candcnt = 0 ; curbest = NULL ; if ((vlb[j] > -dy_tols->inf && indir == -1) || (vub[j] < dy_tols->inf && indir == 1)) { candcnt++ ; outcand = &outcands[candcnt] ; xk = dy_x[j] ; outcand->ndx = j ; outcand->abarkj = 1.0 ; if (indir == -1) { outcand->deltakj = xk-dy_sys->vlb[j] ; } else { outcand->deltakj = dy_sys->vub[j]-xk ; } setcleanzero(outcand->deltakj,dy_tols->zero) ; outcand->ratiokj = dy_tols->inf ; outcand->madpiv = FALSE ; outcand->dir = indir ; outcand->bnd = indir ; outcand->hard = TRUE ; curbest = outcand ; # ifndef DYLP_NDEBUG if (print >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t%-8s (%d)", consys_nme(dy_sys,'v',j,FALSE,NULL),j) ; dyio_outfmt(dy_logchn,dy_gtxecho,"\t%8g\t%8g",xk,-1.0) ; dyio_outfmt(dy_logchn,dy_gtxecho, "\t%8g\t accepted",outcand->deltakj*indir) ; } # endif } /* Open a loop and scan for suitable basic variables. First we look for obvious reasons to reject x, then determine if x imposes a limit on delta. */ lastcandcnt = candcnt ; for (kpos = 1 ; kpos <= m ; kpos++) { k = dy_basis[kpos] ; # ifdef DYLP_PARANOIA if (dy_chkstatus(k) == FALSE) { outcands[0].ndx = -1 ; dy_opts->print.pivoting = print ; return (dyrFATAL) ; } # endif /* First check if we can reject x out of hand: * We're working a restricted subproblem, and x is not included * abar == 0 * stat == BFR. Then check to see if x actually imposes a limit by looking at x, lb, and ub. The order of tests depends on the direction of motion for x. For example, if x is decreasing: * (x >= ub) implies ub is finite and means we can decrease x to ub and pivot. If lb is finite, then we have a choice to go for lb and the delta required to reach ub is a soft limit. If lb is -inf, then ub is our only choice and this is a hard limit. * (ub > x >= lb and lb > -inf) means we can decrease x to lb and pivot. This is a hard limit. * (ub > x > lb and lb <= -inf) means x imposes no limit on delta and is not a candidate to leave. * (!belowbnd(xk,ubk)) We're right at bound, or borderline infeasible, still within the feasibility tolerance. In any case, neither phase I or II will tolerate loss of feasibility. * (otherwise) We're well into infeasibility. If this is phase I, trust that cbar is correct and overall this is a good bet. If this is phase II, well, this shouldn't happen. An accuracy or sanity check will catch it. */ reject = 0 ; statk = dy_status[k] ; abarkj = abarj[kpos] ; xk = quiet_nan(0) ; outcand = NULL ; if (dy_lp->degen > 0 && dy_degenset[kpos] != dy_lp->degen) { reject = -5 ; } else if (flgon(statk,vstatBFR)) { reject = -1 ; } else if (withintol(abarkj,0.0,dy_tols->zero)) { reject = -2 ; } else { ubk = vub[k] ; lbk = vlb[k] ; xk = dy_xbasic[kpos] ; if (ubk >= dy_tols->inf || lbk <= -dy_tols->inf) { hard = TRUE ; } else { hard = FALSE ; } if (abarkj*indir > 0) /* x decreasing */ { if (xk > ubk || (xk == ubk && hard == FALSE && allowsoftdegen == TRUE)) { candcnt++ ; outcand = &outcands[candcnt] ; outcand->ndx = k ; outcand->abarkj = fabs(abarkj) ; outcand->deltakj = fabs((ubk-xk)/outcand->abarkj) ; setcleanzero(outcand->deltakj,dy_tols->zero) ; ratiokj = dy_chkpiv(abarkj,maxabarj) ; outcand->ratiokj = ratiokj ; if (ratiokj < 1.0) { outcand->madpiv = TRUE ; } else { outcand->madpiv = FALSE ; } outcand->dir = -1 ; outcand->bnd = 1 ; outcand->hard = hard ; } if (lbk > -dy_tols->inf) { if (xk >= lbk) { candcnt++ ; outcand = &outcands[candcnt] ; outcand->ndx = k ; outcand->abarkj = fabs(abarkj) ; outcand->deltakj = fabs((lbk-xk)/outcand->abarkj) ; setcleanzero(outcand->deltakj,dy_tols->zero) ; ratiokj = dy_chkpiv(abarkj,maxabarj) ; outcand->ratiokj = ratiokj ; if (ratiokj < 1.0) { outcand->madpiv = TRUE ; } else { outcand->madpiv = FALSE ; } outcand->dir = -1 ; outcand->bnd = -1 ; outcand->hard = TRUE ; } else if (!belowbnd(xk,lbk)) { candcnt++ ; outcand = &outcands[candcnt] ; outcand->ndx = k ; outcand->deltakj = 0 ; outcand->abarkj = fabs(abarkj) ; ratiokj = dy_chkpiv(abarkj,maxabarj) ; outcand->ratiokj = ratiokj ; if (ratiokj < 1.0) { outcand->madpiv = TRUE ; } else { outcand->madpiv = FALSE ; } outcand->dir = -1 ; outcand->bnd = -1 ; outcand->hard = TRUE ; } else { reject = -3 ; } } else if (xk < ubk) { reject = -4 ; } } else /* x increasing */ { if (xk < lbk || (xk == lbk && hard == FALSE && allowsoftdegen == TRUE)) { candcnt++ ; outcand = &outcands[candcnt] ; outcand->ndx = k ; outcand->abarkj = fabs(abarkj) ; outcand->deltakj = fabs((lbk-xk)/outcand->abarkj) ; setcleanzero(outcand->deltakj,dy_tols->zero) ; ratiokj = dy_chkpiv(abarkj,maxabarj) ; outcand->ratiokj = ratiokj ; if (ratiokj < 1.0) { outcand->madpiv = TRUE ; } else { outcand->madpiv = FALSE ; } outcand->dir = 1 ; outcand->bnd = -1 ; outcand->hard = hard ; } if (ubk < dy_tols->inf) { if (xk <= ubk) { candcnt++ ; outcand = &outcands[candcnt] ; outcand->ndx = k ; outcand->abarkj = fabs(abarkj) ; outcand->deltakj = fabs((ubk-xk)/outcand->abarkj) ; setcleanzero(outcand->deltakj,dy_tols->zero) ; ratiokj = dy_chkpiv(abarkj,maxabarj) ; outcand->ratiokj = ratiokj ; if (ratiokj < 1.0) { outcand->madpiv = TRUE ; } else { outcand->madpiv = FALSE ; } outcand->dir = 1 ; outcand->bnd = 1 ; outcand->hard = TRUE ; } else if (!abovebnd(xk,ubk)) { candcnt++ ; outcand = &outcands[candcnt] ; outcand->ndx = k ; outcand->deltakj = 0 ; outcand->abarkj = fabs(abarkj) ; ratiokj = dy_chkpiv(abarkj,maxabarj) ; outcand->ratiokj = ratiokj ; if (ratiokj < 1.0) { outcand->madpiv = TRUE ; } else { outcand->madpiv = FALSE ; } outcand->dir = 1 ; outcand->bnd = 1 ; outcand->hard = TRUE ; } else { reject = -3 ; } } else if (xk > lbk) { reject = -4 ; } } } /* Fast test for an incumbent candidate. */ if (candcnt != lastcandcnt) { if (curbest == NULL) { curbest = outcand ; } else if (curbest->deltakj > outcand->deltakj) { curbest = outcand ; } else if (curbest->deltakj == outcand->deltakj && curbest->ratiokj < outcand->ratiokj) { curbest = outcand ; } } # ifndef DYLP_NDEBUG if (print >= 4 && candcnt != lastcandcnt) { for (lastcandcnt++ ; lastcandcnt <= candcnt ; lastcandcnt++) { outcand = &outcands[lastcandcnt] ; dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t%-8s (%d)", consys_nme(dy_sys,'v',k,FALSE,NULL),k) ; dyio_outfmt(dy_logchn,dy_gtxecho,"\t%8g\t%8g",xk,abarkj) ; dyio_outfmt(dy_logchn,dy_gtxecho, "\t%8g\t accepted",outcand->deltakj*indir) ; if (outcand->madpiv == TRUE) { dyio_outfmt(dy_logchn,dy_gtxecho," (mad)") ; } if (outcand->deltakj == 0) { dyio_outfmt(dy_logchn,dy_gtxecho," (degen)") ; } if (outcand->hard == FALSE) { dyio_outfmt(dy_logchn,dy_gtxecho," (soft)") ; } } lastcandcnt-- ; } else if (print >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t%-8s (%d)", consys_nme(dy_sys,'v',k,FALSE,NULL),k) ; dyio_outfmt(dy_logchn,dy_gtxecho,"\t%8g\t%8g",xk,abarkj) ; switch (reject) { case -1: { dyio_outfmt(dy_logchn,dy_gtxecho,"\t\trejected -- status %s", dy_prtvstat(statk)) ; break ; } case -2: { dyio_outfmt(dy_logchn,dy_gtxecho,"\t\trejected -- zero pivot") ; break ; } case -3: { dyio_outfmt(dy_logchn,dy_gtxecho, "\t\trejected -- borderline infeasible") ; break ; } case -4: { dyio_outfmt(dy_logchn,dy_gtxecho, "\t\trejected -- no limiting bound") ; break ; } case -5: { dyio_outfmt(dy_logchn,dy_gtxecho, "\t\trejected -- not in restricted subproblem") ; break ; } } } # endif lastcandcnt = candcnt ; } /* End of scan loop */ outcands[0].ndx = candcnt ; /* If we saved a suitable candidate while scanning, we can skip sorting and promotion. Suitable is defined as a hard delta > 0 and a sane pivot. */ sort = TRUE ; if (curbest != NULL) { if (curbest->hard == TRUE && curbest->deltakj > 0 && curbest->madpiv == FALSE) { best = *curbest ; sort = FALSE ; } } /* sort = TRUE ; */ /* If we have no candidates, we're unbounded. If the candidate we've saved while scanning looks good (sort == FALSE), then we simply copy it into outcands[1]. If we didn't save a suitable candidate (sort == TRUE), and we do have a list of candidates, sort the list and then try to promote the best pivot to the front. If we have only one candidate, well, we know it's bad, but there's nothing we can do. The assignments to outcands[0].[deltakj,madpiv] are targetted at a quirk of qsort: it seems to occasionally sort outcands[0]. An optimization of some sort, presumably. Degeneracy is declared if the top two candidates both have deltakj == 0 and the second candidate is a hard bound. This may miss the odd instance, but should catch the troublesome cases. */ # ifndef DYLP_NDEBUG dy_opts->print.pivoting = print ; # endif if (candcnt > 0) { if (sort == TRUE) { if (candcnt > 1) { # ifndef DYLP_NDEBUG if (print >= 2) { if (sort == FALSE) dyio_outfmt(dy_logchn,dy_gtxecho,"!") ; dyio_outfmt(dy_logchn,dy_gtxecho,"sorting ... ") ; } # endif outcands[0].deltakj = -dy_tols->inf ; outcands[0].madpiv = FALSE ; qsort(&outcands[1],candcnt,sizeof(primcand_struct),primcand_cmp) ; promoteSanePivot(outcands) ; # ifdef DYLP_STATISTICS if (dy_stats != NULL) dy_stats->pmulti.nontrivial++ ; # endif if (outcands[1].deltakj == 0 && outcands[2].deltakj == 0 && outcands[2].hard == TRUE) { retval = dyrDEGEN ; } else { retval = dyrOK ; } } else { retval = dyrOK ; } } if (sort == FALSE) { /* if (best.ndx != outcands[1].ndx) { dyio_outfmt(dy_logchn,dy_gtxecho, "\nMISMATCH (%d)\n",dy_lp->tot.iters) ; dyio_outfmt(dy_logchn,dy_gtxecho, " sort %s (%d) delta = %g ratio = %g\n", consys_nme(dy_sys,'v',outcands[1].ndx,0,NULL), outcands[1].ndx,outcands[1].deltakj,outcands[1].ratiokj) ; dyio_outfmt(dy_logchn,dy_gtxecho, " best %s (%d) delta = %g ratio = %g\n", consys_nme(dy_sys,'v',best.ndx,0,NULL),best.ndx, best.deltakj,best.ratiokj) ; dyio_outfmt(dy_logchn,dy_gtxecho, " diff delta = %g ratio = %g\n", outcands[1].deltakj-best.deltakj, outcands[1].ratiokj-best.ratiokj) ; } */ outcands[1] = best ; retval = dyrOK ; } } else { retval = dyrUNBOUND ; } # ifndef DYLP_NDEBUG if (print >= 1) { if (print >= 3 && candcnt > 0) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n ") ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tVariable\tratio\tdelta") ; for (m = 1 ; m <= candcnt ; m++) { k = outcands[m].ndx ; ratiokj = outcands[m].ratiokj ; xk = outcands[m].deltakj ; dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t%-8s (%d)", consys_nme(dy_sys,'v',k,FALSE,NULL),k) ; dyio_outfmt(dy_logchn,dy_gtxecho,"\t%8g\t%8g",ratiokj,xk) ; if (outcands[m].madpiv == TRUE) { dyio_outfmt(dy_logchn,dy_gtxecho," (mad)") ; } if (xk == 0) { dyio_outfmt(dy_logchn,dy_gtxecho," (degen)") ; } if (outcands[m].hard == FALSE) { dyio_outfmt(dy_logchn,dy_gtxecho," (soft)") ; } } dyio_outfmt(dy_logchn,dy_gtxecho,"\n ") ; } dyio_outfmt(dy_logchn,dy_gtxecho,"%d candidates.",candcnt) ; if (print >= 2 && (retval == dyrOK || retval == dyrDEGEN)) { k = outcands[1].ndx ; if (j != k) { kpos = dy_var2basis[k] ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n selected %s (%d) = %g to leave pos'n %d at", consys_nme(dy_sys,'v',k,FALSE,NULL),k, dy_xbasic[kpos],kpos) ; if (outcands[1].dir > 0) { dyio_outfmt(dy_logchn,dy_gtxecho," %s = %g, ", (dy_status[k] != vstatBLLB)?"ub":"lb", (dy_status[k] != vstatBLLB)?vub[k]:vlb[k]) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho," %s = %g, ", (dy_status[k] != vstatBUUB)?"lb":"ub", (dy_status[k] != vstatBUUB)?vlb[k]:vub[k]) ; } dyio_outfmt(dy_logchn,dy_gtxecho, "abar<%d,%d> = %g, ",j,k,abarj[kpos]) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho, "\n selected %s (%d) = %g to change to %s = %g, ", consys_nme(dy_sys,'v',k,FALSE,NULL),k,dy_x[k], (outcands[1].dir > 0)?"ub":"lb", (outcands[1].dir > 0)?vub[k]:vlb[k]) ; } dyio_outfmt(dy_logchn,dy_gtxecho,"delta = %g.",outcands[1].deltakj) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho, " Returning %s.",dy_prtdyret(retval)) ; } } dy_opts->print.pivoting = print ; # endif return (retval) ; } dyret_enum primmultiout (int j, int indir, double *abarj, double maxabarj, int *p_xindx, int *p_outdir, double *p_deltaj) /* Select a candidate to leave the basis. This routine coordinates the process, and really has very little work to do. scanForPrimOutCands does the heavy lifting, collecting a list of candidates and sorting them so that the candidate returned in position #1 of the candidate array is the correct choice. This routine doesn't report loss of primal feasibility. scanForPrimOutCands understands how to do pivot selection in the presence of primal infeasibility. We'll hope that any problems are transitory and leave it to dylp's regular feasibility checks to catch anything serious. Parameters: xjndx: Index of the entering variable x. indir: Direction of motion of x. -1: decreasing from upper bound 1: increasing from lower bound abarj: Ftran'd column inv(B)a associated with x. maxabarj: MAX{j}(abar) p_xindx: (o) Index of the leaving variable x. Also valid for return code dyrLOSTPFEAS (in which case it is the index of the variable where feasibility loss was discovered) and dyrREQCHK (in which case it is the index of the variable whose pivot a was declared bogus). p_outdir: (o) Direction of motion of x, coded as: -1: decreasing to lower bound 1: increasing to upper bound p_deltaj: (o) Absolute value of the allowable change in x. Returns: dyret_enum code, as follows: dyrOK: a strictly basic leaving variable was successfully selected (this includes dirty degeneracy) dyrDEGEN: a basic at bound leaving variable is selected; the pivot will be (cleanly) degenerate dyrMADPIV: the pivot coefficient abar would be numerically unstable dyrREQCHK: a possibly bogus abar was selected as the pivot, and refactoring seems wise before trying to use it (basis.etas > 1 is the criteria) dyrUNBOUND: the problem is unbounded dyrFATAL: fatal confusion */ { int m,candcnt ; dyret_enum retval ; primcand_struct *outcands,*candk ; /* Setup. Potentially, each basic variable can produce a soft and a hard pivot delta, and we need to allow for a bound-to-bound pivot. Hence we need a candidate array of length 2*m+1. */ retval = dyrINV ; *p_xindx = 0 ; *p_outdir = 0 ; *p_deltaj = -1 ; m = dy_sys->concnt ; outcands = (primcand_struct *) MALLOC((2*m+1+1)*sizeof(primcand_struct)) ; # ifdef DYLP_ZEROFAULT /* Alignment padding. */ memset(outcands,0,(2*m+1+1)*sizeof(primcand_struct)) ; # endif # ifdef DYLP_STATISTICS if (dy_stats != NULL) dy_stats->pmulti.cnt++ ; # endif /* Generate a sorted list of candidates to leave. No candidates means we're primal unbounded (dyrUNBOUND). Fatal error (dyrFATAL) is possible only if we're paranoid. Otherwise, the candidate in position #1 is the choice. Degeneracy is indicated when we have multiple candidates with a hard delta of 0. */ retval = scanForPrimOutCands(outcands,j,indir,abarj,maxabarj) ; if (retval == dyrOK || retval == dyrDEGEN) { candcnt = outcands[0].ndx ; candk = &outcands[1] ; *p_xindx = candk->ndx ; *p_outdir = candk->dir ; *p_deltaj = candk->deltakj ; if (candk->madpiv == TRUE) { retval = dyrMADPIV ; } # ifdef DYLP_STATISTICS if (dy_stats != NULL) dy_stats->pmulti.cands += outcands[0].ndx ; # endif } else { *p_xindx = -1 ; } FREE(outcands) ; return (retval) ; } DyLP-1.6.0/DyLP/src/Dylp/dy_bound.c0000644000076700007670000016214011245632140013544 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2005 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains routines which attempt to deal with an unbounded simplex problem. For both primal and dual simplex, this entails adding constraints. The goal, in each case, is to find constraints that will bound the problem without losing feasibility. */ #define DYLP_INTERNAL #include "dylp.h" static char sccsid[] UNUSED = "@(#)dy_bound.c 4.6 11/11/04" ; static char svnid[] UNUSED = "$Id: dy_bound.c 299 2009-08-28 01:35:28Z lou $" ; # if 0 /* debug routine */ int dbg_scanPrimConBndAct (consys_struct *orig_sys, int act_j, int **p_ocndxs) /* An modified version of scanPrimConBndAct that simply scans all the constraints in orig_sys. This routine scans the original constraint system looking for constraints that can bound motion in the direction -etadelta, where delta is the change in the variable x and eta is the jth column of the matrix trans(inv(B)N -I). (trans(*) is matrix transpose.) This derives from the relation trans(x x) = trans(inv(B)b l/u) - trans(inv(B)N -I)deltax where l/u is the upper or lower bound, as appropriate, for the nonbasic variables. When we choose the entering variable x, deltax becomes a vector of zeros, with delta in the proper position. This selects column j of trans(inv(B)N -I) = eta. Parameters: orig_sys: The original constraint system act_j: index (in dy_sys) of the offending column; negated if the variable is decreasing p_ocndxs: (i) empty vector to hold constraint indices; assumed sufficiently large if non-NULL; if *p_ocndxs = NULL, allocated if necessary; if p_ocndxs = NULL, nothing is returned. (o) indices of constraints to be activated; may not be allocated if no constraints are identified Returns: number of candidates for activation, -1 if error. */ { int i,j,k,bpos,m,n,act_m,actcnt,cand_limit,dir,retval,save_print ; int *ocndxs ; double *abarj ; double *orig_x,*orig_rhs,*orig_rhslow,*orig_vub,*orig_vlb,*orig_etaj ; double idotj,lhsi,rhsi,rhslowi ; contyp_enum *orig_ctyp,ctypi ; flags statj ; bool activate ; const char *rtnnme = "dbg_scanPrimConBndAct" ; # ifdef DYLP_PARANOIA if (orig_sys == NULL) { errmsg(2,rtnnme,"orig_sys") ; return (-1) ; } # endif save_print = dy_opts->print.conmgmt ; dy_opts->print.conmgmt = 4 ; /* Set the multiplier for eta. If x is increasing, we'd normally multiply by -1. To compensate for decreasing (negative) motion, change dir to +1. */ if (act_j < 0) { dir = 1 ; act_j = -act_j ; } else { dir = -1 ; } # ifdef DYLP_PARANOIA if (act_j < 1 || act_j > dy_sys->varcnt) { errmsg(102,rtnnme,"active variable",act_j,1,dy_sys->varcnt) ; return (-1) ; } # endif /* The first thing to do is to calculate abar = inv(B)a. */ abarj = NULL ; if (consys_getcol_ex(dy_sys,act_j,&abarj) == FALSE) { errmsg(122,rtnnme,dy_sys->nme, "column",consys_nme(dy_sys,'v',act_j,TRUE,NULL),act_j) ; if (abarj != NULL) FREE(abarj) ; return (-1) ; } dy_ftran(abarj,FALSE) ; # ifndef DYLP_NDEBUG if (dy_opts->print.conmgmt >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n eta for %s (%d) %s:", consys_nme(dy_sys,'v',act_j,FALSE,NULL),act_j, (dir < 0)?"increasing":"decreasing") ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n%8s%20s%16s","pos'n","var (ndx)","eta") ; for (bpos = 1 ; bpos <= dy_sys->concnt ; bpos++) { if (abarj[bpos] != 0) dyio_outfmt(dy_logchn,dy_gtxecho,"\n%8d%14s (%3d)%16.8g",bpos, consys_nme(dy_sys,'v',dy_basis[bpos],FALSE,NULL), dy_basis[bpos],-abarj[bpos]) ; } dyio_outfmt(dy_logchn,dy_gtxecho,"\n%8s%14s (%3d)%16.8g","n/a", consys_nme(dy_sys,'v',act_j,FALSE,NULL),act_j,1.0) ; } # endif /* Now load abar into a vector orig_eta that we can use directly to form dot(orig_a,orig_eta) in the original system. If x is decreasing, we need to negate eta, which is handled by multiplying by dir. Remember that logicals do not exist in the original system. */ retval = 0 ; m = orig_sys->concnt ; n = orig_sys->varcnt ; act_m = dy_sys->concnt ; orig_etaj = (double *) CALLOC((n+1),sizeof(double)) ; for (bpos = 1 ; bpos <= act_m ; bpos++) { k = dy_basis[bpos] ; if (k > act_m) { j = dy_actvars[k] ; # ifdef DYLP_PARANOIA if (j < 1 || j > n) { errmsg(102,rtnnme,"original variable",j,1,n) ; retval = -1 ; break ; } # endif orig_etaj[j] = dir*abarj[bpos] ; } } if (act_j > act_m) { j = dy_actvars[act_j] ; orig_etaj[j] = -1.0*dir ; } if (abarj != NULL) FREE(abarj) ; # ifdef DYLP_PARANOIA if (j < 1 || j > n) { errmsg(102,rtnnme,"original variable",j,1,n) ; retval = -1 ; } if (retval < 0) { if (orig_etaj != NULL) FREE(orig_etaj) ; return (-1) ; } # endif /* Similarly, form the solution vector in terms of the original system. */ orig_vub = orig_sys->vub ; orig_vlb = orig_sys->vlb ; orig_x = (double *) CALLOC((n+1),sizeof(double)) ; for (j = 1 ; j <= n ; j++) { k = dy_origvars[j] ; if (ACTIVE_VAR(j)) { # ifdef DYLP_PARANOIA if (k <= act_m || k > dy_sys->varcnt) { errmsg(102,rtnnme,"original variable",j,act_m+1,dy_sys->varcnt) ; retval = -1 ; break ; } # endif orig_x[j] = dy_x[k] ; } else { statj = (flags) -k ; # ifdef DYLP_PARANOIA if (flgoff(statj,vstatNONBASIC|vstatNBFR)) { errmsg(433,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "inactive",consys_nme(orig_sys,'v',j,TRUE,NULL),j, dy_prtvstat(statj)) ; retval = -1 ; break ; } # endif if (flgon(statj,vstatNBUB)) { orig_x[j] = orig_vub[j] ; } else if (flgon(statj,vstatNBLB|vstatNBFX)) { orig_x[j] = orig_vlb[j] ; } } } # ifdef DYLP_PARANOIA if (retval < 0) { if (orig_etaj != NULL) FREE(orig_etaj) ; if (orig_x != NULL) FREE(orig_x) ; return (-1) ; } # endif /* Does the client want indices returned? Did the client supply a vector for candidate indices? If not, make one. Here's one of the modifications for the debug version: the limit is all of the original constraints. The other modification is just below in the scan loop: we look at all constraints, not just loadable constraints. */ cand_limit = orig_sys->concnt ; if (p_ocndxs == NULL || *p_ocndxs == NULL) { ocndxs = (int *) MALLOC(cand_limit*sizeof(int)) ; } else { ocndxs = *p_ocndxs ; } /* Now we can step through the constraints in the original system. For each constraint, we first check idotj = dot(orig_a,orig_eta) to see if we have a bounding candidate. For a <= constraint, we need idotj > 0; for an equality or range constraint, idotj != 0 is sufficient. */ orig_ctyp = orig_sys->ctyp ; orig_rhs = orig_sys->rhs ; orig_rhslow = orig_sys->rhslow ; actcnt = 0 ; for (i = 1 ; i <= m && actcnt <= cand_limit ; i++) { ctypi = orig_ctyp[i] ; idotj = consys_dotrow(orig_sys,i,orig_etaj) ; setcleanzero(idotj,dy_tols->zero) ; if (idotj == 0 || (ctypi == contypLE && idotj < 0)) { # ifndef DYLP_NDEBUG if (dy_opts->print.conmgmt >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n skipping %s %s (%d), dot(a,eta) = %g, ", consys_prtcontyp(ctypi), consys_nme(orig_sys,'c',i,FALSE,NULL),i,idotj) ; } # endif continue ; } # ifndef DYLP_NDEBUG if (dy_opts->print.conmgmt >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n considering %s %s (%d), dot(a,eta) = %g, ", consys_prtcontyp(ctypi), consys_nme(orig_sys,'c',i,FALSE,NULL),i,idotj) ; } # endif /* We have a bounding candidate. Is it violated at the current solution? */ lhsi = consys_dotrow(orig_sys,i,orig_x) ; setcleanzero(lhsi,dy_tols->zero) ; rhsi = orig_rhs[i] ; if (ctypi == contypRNG) { rhslowi = orig_rhslow[i] ; } else if (ctypi == contypEQ) { rhslowi = rhsi ; } else { rhslowi = -dy_tols->inf ; } if (abovebnd(lhsi,rhsi) || belowbnd(lhsi,rhslowi)) { activate = FALSE ; } else { activate = TRUE ; } # ifndef DYLP_NDEBUG if (activate == TRUE) { if (dy_opts->print.conmgmt >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n queued %s %s (%d), %g <= %g <= %g.", consys_prtcontyp(orig_ctyp[i]), consys_nme(orig_sys,'c',i,FALSE,NULL),i, rhslowi,lhsi,rhsi) ; } } else { if (dy_opts->print.conmgmt >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n skipping %s constraint %s (%d),", consys_prtcontyp(orig_ctyp[i]), consys_nme(orig_sys,'c',i,FALSE,NULL),i) ; if (abovebnd(lhsi,rhsi)) { dyio_outfmt(dy_logchn,dy_gtxecho, " lhs - rhs = %g - %g = %g, tol %g.", lhsi,rhsi,lhsi-rhsi,dy_tols->zero*(1+fabs(rhsi))) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho, " rhslow - lhs = %g - %g = %g, tol %g.", rhslowi,lhsi,rhslowi-lhsi, dy_tols->zero*(1+fabs(rhslowi))) ; } } } # endif if (activate == TRUE) ocndxs[actcnt++] = i ; } if (orig_etaj != NULL) FREE(orig_etaj) ; if (orig_x != NULL) FREE(orig_x) ; /* If we supplied ocndxs and found no candidates to activate, free it. */ if (p_ocndxs != NULL) { if (*p_ocndxs == NULL) { if (actcnt == 0) { FREE(ocndxs) ; } else { *p_ocndxs = ocndxs ; } } } else { FREE(ocndxs) ; } # ifndef DYLP_NDEBUG if (dy_opts->print.conmgmt >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n queued %d constraints for activation.",actcnt) ; } # endif dy_opts->print.conmgmt = save_print ; return (actcnt) ; } #endif /* debug routine */ /* Routines to bound an unbounded primal problem. */ static int scanPrimConBndAct (consys_struct *orig_sys, int act_j, int **p_ocndxs) /* This routine scans the original constraint system looking for constraints that can bound motion in the direction -etadelta, where delta is the change in the variable x and eta is the jth column of the matrix trans(inv(B)N -I). (trans(*) is matrix transpose.) This derives from the relation trans(x x) = trans(inv(B)b l/u) - trans(inv(B)N -I)deltax where l/u is the upper or lower bound, as appropriate, for the nonbasic variables. When we choose the entering variable x, deltax becomes a vector of zeros, with delta in the proper position. This selects column j of trans(inv(B)N -I) = eta. Parameters: orig_sys: The original constraint system act_j: index (in dy_sys) of the offending column; negated if the variable is decreasing p_ocndxs: (i) empty vector to hold constraint indices; assumed sufficiently large if non-NULL; if NULL, allocated if necessary (o) indices of constraints to be activated; may not be allocated if no constraints are identified Returns: number of candidates for activation, -1 if error. */ { int i,j,k,bpos,m,n,act_m,actcnt,cand_limit,dir,retval ; int *ocndxs ; double *abarj ; double *orig_x,*orig_rhs,*orig_rhslow,*orig_vub,*orig_vlb,*orig_etaj ; double idotj,lhsi,rhsi,rhslowi ; contyp_enum *orig_ctyp,ctypi ; flags statj ; bool activate ; const char *rtnnme = "scanPrimConBndAct" ; # ifdef DYLP_PARANOIA if (orig_sys == NULL) { errmsg(2,rtnnme,"orig_sys") ; return (-1) ; } if (p_ocndxs == NULL) { errmsg(2,rtnnme,"&ocndxs") ; return (-1) ; } # endif /* Set the multiplier for eta. If x is increasing, we'd normally multiply by -1. To compensate for decreasing (negative) motion, change dir to +1. */ if (act_j < 0) { dir = 1 ; act_j = -act_j ; } else { dir = -1 ; } # ifdef DYLP_PARANOIA if (act_j < 1 || act_j > dy_sys->varcnt) { errmsg(102,rtnnme,"active variable",act_j,1,dy_sys->varcnt) ; return (-1) ; } # endif /* The first thing to do is to calculate abar = inv(B)a. */ abarj = NULL ; if (consys_getcol_ex(dy_sys,act_j,&abarj) == FALSE) { errmsg(122,rtnnme,dy_sys->nme, "column",consys_nme(dy_sys,'v',act_j,TRUE,NULL),act_j) ; if (abarj != NULL) FREE(abarj) ; return (-1) ; } dy_ftran(abarj,FALSE) ; # ifndef DYLP_NDEBUG if (dy_opts->print.conmgmt >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n eta for %s (%d) %s:", consys_nme(dy_sys,'v',act_j,FALSE,NULL),act_j, (dir < 0)?"increasing":"decreasing") ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n%8s%20s%16s","pos'n","var (ndx)","eta") ; for (bpos = 1 ; bpos <= dy_sys->concnt ; bpos++) { if (abarj[bpos] != 0) dyio_outfmt(dy_logchn,dy_gtxecho,"\n%8d%14s (%3d)%16.8g",bpos, consys_nme(dy_sys,'v',dy_basis[bpos],FALSE,NULL), dy_basis[bpos],-abarj[bpos]) ; } dyio_outfmt(dy_logchn,dy_gtxecho,"\n%8s%14s (%3d)%16.8g","n/a", consys_nme(dy_sys,'v',act_j,FALSE,NULL),act_j,1.0) ; } # endif /* Now load abar into a vector orig_eta that we can use directly to form dot(orig_a,orig_eta) in the original system. If x is decreasing, we need to negate eta, which is handled by multiplying by dir. Remember that logicals do not exist in the original system. */ retval = 0 ; m = orig_sys->concnt ; n = orig_sys->varcnt ; act_m = dy_sys->concnt ; orig_etaj = (double *) CALLOC((n+1),sizeof(double)) ; for (bpos = 1 ; bpos <= act_m ; bpos++) { k = dy_basis[bpos] ; if (k > act_m) { j = dy_actvars[k] ; # ifdef DYLP_PARANOIA if (j < 1 || j > n) { errmsg(102,rtnnme,"original variable",j,1,n) ; retval = -1 ; break ; } # endif orig_etaj[j] = dir*abarj[bpos] ; } } if (act_j > act_m) { j = dy_actvars[act_j] ; orig_etaj[j] = -1.0*dir ; } if (abarj != NULL) FREE(abarj) ; # ifdef DYLP_PARANOIA if (j < 1 || j > n) { errmsg(102,rtnnme,"original variable",j,1,n) ; retval = -1 ; } if (retval < 0) { if (orig_etaj != NULL) FREE(orig_etaj) ; return (-1) ; } # endif /* Similarly, form the solution vector in terms of the original system. */ orig_vub = orig_sys->vub ; orig_vlb = orig_sys->vlb ; orig_x = (double *) CALLOC((n+1),sizeof(double)) ; for (j = 1 ; j <= n ; j++) { k = dy_origvars[j] ; if (k > 0) { # ifdef DYLP_PARANOIA if (k <= act_m || k > dy_sys->varcnt) { errmsg(102,rtnnme,"original variable",j,act_m+1,dy_sys->varcnt) ; retval = -1 ; break ; } # endif orig_x[j] = dy_x[k] ; } else { statj = (flags) -k ; # ifdef DYLP_PARANOIA if (flgoff(statj,vstatNONBASIC|vstatNBFR)) { errmsg(433,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "inactive",consys_nme(orig_sys,'v',j,TRUE,NULL),j, dy_prtvstat(statj)) ; retval = -1 ; break ; } # endif if (flgon(statj,vstatNBUB)) { orig_x[j] = orig_vub[j] ; } else if (flgon(statj,vstatNBLB|vstatNBFX)) { orig_x[j] = orig_vlb[j] ; } } } # ifdef DYLP_PARANOIA if (retval < 0) { if (orig_etaj != NULL) FREE(orig_etaj) ; if (orig_x != NULL) FREE(orig_x) ; return (-1) ; } # endif /* Did the client supply a vector for candidate indices? If not, make one. */ cand_limit = m-act_m ; if (dy_opts->con.actlim > 0) { cand_limit = minn(dy_opts->con.actlim,cand_limit) ; } if (*p_ocndxs == NULL) { ocndxs = (int *) MALLOC(cand_limit*sizeof(int)) ; } else { ocndxs = *p_ocndxs ; } /* Now we can step through the constraints in the original system. For each inactive constraint, we first check idotj = dot(orig_a,orig_eta) to see if we have a bounding candidate. For a <= constraint, we need idotj > 0; for an equality or range constraint, idotj != 0 is sufficient. */ orig_ctyp = orig_sys->ctyp ; orig_rhs = orig_sys->rhs ; orig_rhslow = orig_sys->rhslow ; actcnt = 0 ; for (i = 1 ; i <= m && actcnt <= cand_limit ; i++) { if (!LOADABLE_CON(i)) continue ; ctypi = orig_ctyp[i] ; idotj = consys_dotrow(orig_sys,i,orig_etaj) ; setcleanzero(idotj,dy_tols->zero) ; if (idotj == 0 || (ctypi == contypLE && idotj < 0)) { # ifndef DYLP_NDEBUG if (dy_opts->print.conmgmt >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n skipping %s %s (%d), dot(a,eta) = %g, ", consys_prtcontyp(ctypi), consys_nme(orig_sys,'c',i,FALSE,NULL),i,idotj) ; } # endif continue ; } # ifndef DYLP_NDEBUG if (dy_opts->print.conmgmt >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n considering %s %s (%d), dot(a,eta) = %g, ", consys_prtcontyp(ctypi), consys_nme(orig_sys,'c',i,FALSE,NULL),i,idotj) ; } # endif /* We have a bounding candidate. Is it violated at the current solution? */ lhsi = consys_dotrow(orig_sys,i,orig_x) ; setcleanzero(lhsi,dy_tols->zero) ; rhsi = orig_rhs[i] ; if (ctypi == contypRNG) { rhslowi = orig_rhslow[i] ; } else if (ctypi == contypEQ) { rhslowi = rhsi ; } else { rhslowi = -dy_tols->inf ; } if (abovebnd(lhsi,rhsi) || belowbnd(lhsi,rhslowi)) { activate = FALSE ; } else { activate = TRUE ; } # ifndef DYLP_NDEBUG if (activate == TRUE) { if (dy_opts->print.conmgmt >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n queued %s %s (%d), %g <= %g <= %g.", consys_prtcontyp(orig_ctyp[i]), consys_nme(orig_sys,'c',i,FALSE,NULL),i, rhslowi,lhsi,rhsi) ; } } else { if (dy_opts->print.conmgmt >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n skipping %s constraint %s (%d),", consys_prtcontyp(orig_ctyp[i]), consys_nme(orig_sys,'c',i,FALSE,NULL),i) ; if (abovebnd(lhsi,rhsi)) { dyio_outfmt(dy_logchn,dy_gtxecho, " lhs - rhs = %g - %g = %g, tol %g.", lhsi,rhsi,lhsi-rhsi,dy_tols->zero*(1+fabs(rhsi))) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho, " rhslow - lhs = %g - %g = %g, tol %g.", rhslowi,lhsi,rhslowi-lhsi, dy_tols->zero*(1+fabs(rhslowi))) ; } } } # endif if (activate == TRUE) ocndxs[actcnt++] = i ; } if (orig_etaj != NULL) FREE(orig_etaj) ; if (orig_x != NULL) FREE(orig_x) ; /* If we supplied ocndxs and found no candidates to activate, free it. */ if (*p_ocndxs == NULL) { if (actcnt == 0) { FREE(ocndxs) ; } else { *p_ocndxs = ocndxs ; } } # ifndef DYLP_NDEBUG if (dy_opts->print.conmgmt >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n queued %d constraints for activation.",actcnt) ; } # endif return (actcnt) ; } int dy_activateBndCons (consys_struct *orig_sys) /* This routine coordinates bounding constraint activation in phase dyADDCON. In addition to the actual scan and activation, it sees to rebuilding the basis and solution. The heavy lifting is performed in scanPrimConBndAct and actBLogPrimCon. See the comments in dy_conmgmt.c for the effects on PSE and DSE norms. Notwithstanding, the approach taken here is to simply set the init_dse flag. The reason is that dylp does not have a phase transition sequence which adds constraints and returns to dual simplex. It's always primal -> act/deact constraints -> dual -> act/deact variables -> primal The DSE norms are not maintained through primal simplex, so there's no motivation to do an update here. Parameter: orig_sys: The original constraint system Returns: number of constraints activated; -1 if there's an error. */ { int *candidates,cand_cnt,act_j ; int retval ; bool actresult ; flags calcflgs ; dyret_enum factorresult ; const char *rtnnme = "dy_activateBndCons" ; retval = -1 ; /* Call scanPrimConBndAct to return a list of candidates for activation, then call actBLogPrimConList to install them. Installing nothing always succeeds. */ candidates = NULL ; act_j = dy_lp->ubnd.ndx ; cand_cnt = scanPrimConBndAct(orig_sys,act_j,&candidates) ; if (cand_cnt < 0) { errmsg(434,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "constraint","bounding activation") ; actresult = FALSE ; } else if (cand_cnt > 0) { actresult = dy_actBLogPrimConList(orig_sys,cand_cnt,candidates,NULL) ; } else { actresult = TRUE ; } if (candidates != NULL) FREE(candidates) ; if (actresult == FALSE) return (retval) ; /* If we added constraints, we need to refactor and recalculate the primal and dual variables. Then decide on the simplex phase. If we came in with primal feasibility, we should still have it. */ if (cand_cnt > 0) { dy_lp->simplex.init_dse = TRUE ; # ifndef DYLP_NDEBUG if (dy_opts->print.conmgmt >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n factoring, calculating variables, ") ; dyio_outfmt(dy_logchn,dy_gtxecho,"and checking feasibility ...") ; } # endif calcflgs = ladFACTOR|ladPRIMFEAS|ladPFQUIET|ladDUALFEAS|ladDFQUIET ; factorresult = dy_accchk(&calcflgs) ; switch (factorresult) { case dyrOK: case dyrPATCHED: { retval = cand_cnt ; # ifndef DYLP_NDEBUG if (dy_opts->print.conmgmt >= 3) { if (factorresult == dyrOK) dyio_outfmt(dy_logchn,dy_gtxecho,"\n done.") ; else dyio_outfmt(dy_logchn,dy_gtxecho,"\n patched.") ; } # endif # ifdef DYLP_PARANOIA if (dy_lp->simplex.active == dyPRIMAL2 && factorresult == dyrOK && (flgon(calcflgs,ladPRIMFEAS))) { errmsg(1,rtnnme,__LINE__) ; retval = -1 ; break ; } # endif if (flgoff(calcflgs,ladPRIMFEAS)) { dy_lp->simplex.next = dyPRIMAL2 ; } else if (flgoff(calcflgs,ladDUALFEAS)) { dy_lp->simplex.next = dyDUAL ; } else { dy_lp->simplex.next = dyPRIMAL1 ; } break ; } default: { retval = -1 ; # ifndef DYLP_NDEBUG if (dy_opts->print.conmgmt >= 3) dyio_outfmt(dy_logchn,dy_gtxecho,"\n failed.") ; # endif break ; } } } else { retval = cand_cnt ; } # ifndef DYLP_NDEBUG if (dy_opts->print.conmgmt >= 1) { if (dy_opts->print.conmgmt >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n ") ; } dyio_outfmt(dy_logchn,dy_gtxecho," %d activations.",cand_cnt) ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n constraint system %s now %d x %d (%d + %d).", dy_sys->nme,dy_sys->concnt,dy_sys->varcnt,dy_sys->archvcnt, dy_sys->logvcnt) ; } # endif return (retval) ; } /* Routines to bound an unbounded dual problem. */ static int type1var (consys_struct *orig_sys, int xindx, int diri, int oxkndx, flags xkstatus, double abarik, double cbark) /* This routine evaluates x to see if it qualifies as a type 1 variable. A type 1 variable will bound the dual problem (its associated dual can be driven to 0 as y enters) and it can be activated into the nonbasic partition while retaining dual feasibility. Parameters: orig_sys: the original constraint system xindx: index of the entering dual y (leaving primal x) diri: direction of motion for y (x) +1 to increase from 0 (to lb) -1 to decrease from 0 (to ub) oxkndx: index of candidate for activation y (x) xkstatus: status for x abarik: pivot element abar cbark: value of y (reduced cost of x) Returns: 1 if x is activated, 0 if x is not activated -1 if something goes fatally wrong */ { int xkndx ; const char *rtnnme = "type1var" ; /* Will this variable be dual feasible? If not, it can't be a type 1. If it is dual feasible, it'll work, because we tested that cbar and abar had the proper signs before calling type1var. */ if ((flgon(xkstatus,vstatNBLB) && cbark < 0) || (flgon(xkstatus,vstatNBUB) && cbark > 0)) { # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tt1eval: %s %s (%d) not dual feasible; cbar = %g.", dy_prtvstat(xkstatus), consys_nme(orig_sys,'v',oxkndx,TRUE,NULL),oxkndx,cbark) ; } # endif return (0) ; } /* x satisfies the type 1 criteria. Activate it, and insert the reduced cost in dy_cbar. */ # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n type 1 activation %s %s (%d), ", dy_prtvstat(xkstatus), consys_nme(orig_sys,'v',oxkndx,TRUE,NULL),oxkndx) ; dyio_outfmt(dy_logchn,dy_gtxecho,"cbar = %g, abar = %g.", cbark,abarik) ; } # endif if (dy_actNBPrimArch(orig_sys,oxkndx) == FALSE) { errmsg(430,rtnnme, orig_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "activate","variable", consys_nme(orig_sys,'v',oxkndx,TRUE,NULL),oxkndx) ; return (-1) ; } xkndx = dy_origvars[oxkndx] ; dy_cbar[xkndx] = cbark ; return (1) ; } static void type2eval (consys_struct *orig_sys,int xindx, int diri, int oxkndx, flags xkstatus, double abarik, double cbark, int *oxjndx, double *deltaj, double *cbarj, int *dirj) /* This routine evaluates x as a possible type 2 variable, and replaces the incumbent type 2 candidate if that's appropriate. We're looking for variables which bound the dual problem but would not be dual feasible if they were activated as nonbasic. A type 2 variable has the signs of cbar and abar reversed from the usual conventions for a dual pivot. Because of this, the primal move is in the `wrong' direction. E.g., if x is rising to its lower bound and leaving, and x is NBLB with abar > 0, x has to >decrease< in order to bring x to its lower bound. Parameters: orig_sys: the original constraint system xindx: index of the entering dual y (leaving primal x) diri: direction of motion for y (x) +1 to increase from 0 (to lb) -1 to decrease from 0 (to ub) oxkndx: index of candidate for activation y (x) xkstatus: status for x abarik: pivot element abar cbark: value of y (reduced cost of x) oxjndx: (i) if nonzero, index of the type 2 incumbent x (o) replaced with new incumbent, if appropriate deltaj: (i) dual delta for y given x (o) replaced with new delta, if x is replaced cbarj: (i) reduced cost of x (o) replaced with new reduced cost, if x is replaced dirj: (i) direction of motion of x (o) replaced with new direction of motion if x is replaced Returns: undefined */ { double deltak ; /* Will this variable be dual feasible? If so, it can't be a type 2. If it isn't dual feasible, it'll work, because we tested that cbar and abar had the proper signs before calling type2var. */ if ((flgon(xkstatus,vstatNBLB) && cbark > 0) || (flgon(xkstatus,vstatNBUB) && cbark < 0) || flgon(xkstatus,vstatNBFR)) { # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tt2eval: %s %s (%d) dual feasible; cbar = %g.", dy_prtvstat(xkstatus), consys_nme(orig_sys,'v',oxkndx,TRUE,NULL),oxkndx,cbark) ; } # endif return ; } /* Is x a better choice than the current incumbent x? If so, replace it. It takes a little work to figure out the proper direction of motion, particularly if x is NBFR. Remember, the primal direction of change is backwards from the normal motion. */ deltak = fabs(cbark/abarik) ; if (deltak < *deltaj) { *oxjndx = oxkndx ; *deltaj = deltak ; *cbarj = cbark ; if (flgon(xkstatus,vstatNBLB)) { *dirj = -1 ; } else if (flgon(xkstatus,vstatNBUB)) { *dirj = 1 ; } else { if (diri > 0) { if (abarik > 0) { *dirj = 1 ; } else { *dirj = -1 ; } } else { if (abarik > 0) { *dirj = -1 ; } else { *dirj = 1 ; } } } # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n t2eval: choosing %s %s (%d), delta %g,", dy_prtvstat(xkstatus), consys_nme(orig_sys,'v',*oxjndx,TRUE,NULL),*oxjndx,*deltaj) ; dyio_outfmt(dy_logchn,dy_gtxecho,"cbar = %g, abar = %g.", *cbarj,abarik) ; } # endif } # ifndef DYLP_NDEBUG else { if (dy_opts->print.varmgmt >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n t2eval: skipping %s %s (%d), delta %g,", dy_prtvstat(xkstatus), consys_nme(orig_sys,'v',oxkndx,TRUE,NULL),oxkndx,deltak) ; dyio_outfmt(dy_logchn,dy_gtxecho,"cbar = %g, abar = %g.", cbark,abarik) ; } } # endif return ; } static void type3eval (consys_struct *orig_sys, int xindx, int diri, int oxkndx, flags xkstatus, double abarik, double cbark, int *oxjndx, double *distj, double *cbarj, int *dirj, double *abarij) /* This routine evaluates x as a possible type 3 variable, and replaces the incumbent type 3 candidate if that's appropriate. We're looking for variables which can be activated with a bound-to-bound pivot and drive the reduced cost of y to 0 (drive x toward feasibility). We'll pick the variable that puts us on the correct side of the bound, with a preference to minimise |bnd - delta*abar|. Parameters: orig_sys: the original constraint system xindx: index of the entering dual y (leaving primal x) diri: direction of motion for y (x) +1 to increase from 0 (to lb) -1 to decrease from 0 (to ub) oxkndx: index of candidate for activation y (x) xkstatus: status for x abarik: pivot element abar cbark: value of y (reduced cost of x) oxjndx: (i) if nonzero, index of the type 3 incumbent x (o) replaced with new incumbent, if appropriate distj: (i) |bnd - (x+delta)|, with sign assigned to be positive if we're within bounds, and negative if we're out of bound. (o) replaced with new delta, if x is replaced cbarj: (i) reduced cost of x (o) replaced with new reduced cost, if x is replaced dirj: (i) direction of motion of x (o) replaced with new direction of motion if x is replaced abarij: (i) pivot for x (o) replaced with new pivot, if x is replaced Returns: undefined */ { int dirk ; double lbk,ubk,deltak,distk,bndi,xival ; bool newxj ; /* Get the bounds on x and calculate the possible delta. If x doesn't have both bounds, it can't be a type 3 variable. */ lbk = orig_sys->vlb[oxkndx] ; ubk = orig_sys->vub[oxkndx] ; if (lbk <= -dy_tols->inf || ubk >= dy_tols->inf) { # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n t3eval: skipping %s %s (%d)", dy_prtvstat(xkstatus), consys_nme(orig_sys,'v',oxkndx,TRUE,NULL),oxkndx) ; if (lbk <= -dy_tols->inf) dyio_outfmt(dy_logchn,dy_gtxecho,", lb = %g",lbk) ; if (ubk >= dy_tols->inf) dyio_outfmt(dy_logchn,dy_gtxecho,", ub = %g",ubk) ; dyio_outchr(dy_logchn,dy_gtxecho,'.') ; } # endif return ; } /* Now look at x's status and reduced cost, and from that decide if we can flip and activate it. */ if (flgon(xkstatus,vstatNBLB)) { if (cbark > 0) { # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n t3eval: skipping %s %s (%d), cbar = %g, can't flip.", dy_prtvstat(xkstatus), consys_nme(orig_sys,'v',oxkndx,TRUE,NULL),oxkndx,cbark) ; } # endif return ; } dirk = 1 ; deltak = -abarik*(ubk-lbk) ; } else { if (cbark < 0) { # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n t3eval: skipping %s %s (%d), cbar = %g, can't flip.", dy_prtvstat(xkstatus), consys_nme(orig_sys,'v',oxkndx,TRUE,NULL),oxkndx,cbark) ; } # endif return ; } dirk = -1 ; deltak = -abarik*(lbk-ubk) ; } setcleanzero(deltak,dy_tols->zero) ; /* Does delta move x toward feasibility? */ if (deltak == 0) { # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n t3eval: skipping %s %s (%d), delta = 0.", dy_prtvstat(xkstatus), consys_nme(orig_sys,'v',oxkndx,TRUE,NULL),oxkndx) ; } # endif return ; } if ((diri > 0 && deltak < 0) || (diri < 0 && deltak > 0)) { # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n t3eval: skipping %s %s (%d), direction; delta = %g.", dy_prtvstat(xkstatus),consys_nme(orig_sys,'v',oxkndx,TRUE,NULL), oxkndx,deltak) ; } # endif return ; } /* The only remaining question is whether x brings x closer to feasibility than the incumbent. The preference is for feasibility. If both x and x are feasible or infeasible (sign(dist) = sign(dist)), we want to get as close to the bound as possible. If the distance is equal, keep the incumbent. The sign of dist is set to be negative if the new value of x is out-of-bound in either direction. */ xival = dy_x[xindx]+deltak ; setcleanzero(xival,dy_tols->zero) ; newxj = FALSE ; if (diri < 0) { bndi = dy_sys->vub[xindx] ; distk = bndi-xival ; if (belowbnd(xival,dy_sys->vlb[xindx])) distk = -distk ; } else { bndi = dy_sys->vlb[xindx] ; distk = xival-bndi ; if (abovebnd(xival,dy_sys->vub[xindx])) distk = -distk ; } setcleanzero(distk,dy_tols->zero) ; if (distk > 0 && *distj < 0) { newxj = TRUE ; } else if (fabs(distk) < fabs(*distj)) { newxj = TRUE ; } if (newxj == TRUE) { *oxjndx = oxkndx ; *distj = distk ; *cbarj = cbark ; *dirj = dirk ; *abarij = abarik ; # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n t3eval: choosing %s %s (%d), ", dy_prtvstat(xkstatus), consys_nme(orig_sys,'v',*oxjndx,TRUE,NULL),*oxjndx) ; dyio_outfmt(dy_logchn,dy_gtxecho,"cbar = %g, delta = %g, dist = %g.", *cbarj,deltak,*distj) ; } # endif } return ; } static int type2activate (consys_struct *orig_sys, int xindx, int diri, int oxjndx, int dirj, double cbarj) /* This routine performs the activate and pivot step required for a type 2 variable. It has some error recovery capability, but makes no attempt at real sophistication. If things get too rough, we can always fall back on primal simplex. Because we've flipped the signs on cbar and abar, the primal move is in the `wrong' direction. E.g., if x is rising to its lower bound and leaving, x NBLB, and abar > 0, x has to >decrease< in order to bring x to its lower bound. Parameters: orig_sys: the original constraint system xindx: index of the leaving variable x diri: direction of motion of x oxjndx: index (in orig_sys) of the entering variable x dirj: direction of motion of x cbarj: reduced cost of x Returns: 1 if a variable is activated and pivoted into the basis without error 0 if there's a nonfatal problem (this will cause a reversion to primal simplex). -1 if there's a fatal problem */ { int xjndx,xkndx ; double abarij,deltaj ; bool pivoted ; dyret_enum pivresult,duennaresult ; int retval ; const char *rtnnme = "type2activate" ; # ifndef DYLP_NDEBUG flags xjstatus ; if (dy_opts->print.varmgmt >= 1) { xjstatus = (flags) -dy_origvars[oxjndx] ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n activating and pivoting %s %s (%d), ", dy_prtvstat(xjstatus), consys_nme(orig_sys,'v',oxjndx,TRUE,NULL),oxjndx) ; dyio_outfmt(dy_logchn,dy_gtxecho," cbar = %g, %s.", cbarj,(dirj < 0)?"falling":"rising") ; } # endif /* Try to activate the variable. */ if (dy_actNBPrimArch(orig_sys,oxjndx) == FALSE) { errmsg(430,rtnnme, orig_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "activate","variable", consys_nme(orig_sys,'v',oxjndx,TRUE,NULL),oxjndx) ; return (-1) ; } xjndx = dy_origvars[oxjndx] ; dy_cbar[xjndx] = cbarj ; /* Now attempt the pivot. */ pivresult = dy_dualpivot(xindx,diri,&xjndx,&dirj,&cbarj,&abarij, &deltaj,&xkndx) ; switch (pivresult) { case dyrOK: case dyrDEGEN: case dyrOPTIMAL: case dyrPUNT: case dyrREQCHK: { pivoted = TRUE ; break ; } default: { pivoted = FALSE ; break ; } } # ifndef DYLP_NDEBUG if ((dy_opts->print.varmgmt >= 3) || (dy_opts->print.varmgmt >= 2 && pivresult != dyrOK)) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n pivot attempt %s, pivot return code = %s.", (pivoted == TRUE)?"succeeded":"failed", dy_prtdyret(pivresult)) ; } if (dy_opts->print.dual >= 4) dy_logpivot(pivresult,xjndx,dirj,cbarj,xindx,diri,abarij,deltaj) ; # endif /* Call La Duenna after the pivot as usual. It boils down to these cases: * The pivot went through, and La Duenna had no complaints. In this case, we can go back to dual simplex and try for normal pivots. * The pivot went through, but La Duenna had non-fatal problems. We'll revert to primal simplex and see if it goes better. * The pivot didn't go through, but La Duenna managed to salvage the situation. In this case we haven't managed to change the situation and returning to dual simplex would be futile. Again, try primal simplex. If `salvage the situation' meant dealing with a singular pivot, we need to remove the leaving variable from the pivot reject list (there will be no other entries, given we're in dyADDVAR). * There was a fatal error, either in the pivot attempt or from La Duenna. Return dyINV. If the pivot resulted in a fatal error, that'll be reflected in the return code from dy_duenna. We have to lie about the phase for a moment here, to avoid running afoul of all kinds of checks. */ dy_lp->phase = dyDUAL ; duennaresult = dy_duenna(pivresult,xjndx,xindx,-1,-1) ; if (pivresult == dyrSINGULAR) { if (dy_clrpivrej(NULL) != TRUE) return (-1) ; } dy_lp->phase = dyADDVAR ; switch (duennaresult) { case dyrOK: case dyrRESELECT: case dyrOPTIMAL: { if (pivoted == TRUE) { retval = 1 ; } else { retval = 0 ; } break ; } case dyrPUNT: case dyrLOSTDFEAS: { retval = 0 ; break ; } default: { retval = -1 ; } } # ifndef DYLP_NDEBUG if ((dy_opts->print.varmgmt >= 3) || (dy_opts->print.varmgmt >= 2 && duennaresult != dyrOK)) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n La Duenna return code %s.", dy_prtdyret(duennaresult)) ; } if (dy_opts->print.varmgmt >= 1) { if (dy_opts->print.varmgmt >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n ") ; } if (retval == 1) { dyio_outfmt(dy_logchn,dy_gtxecho," 1 activation and pivot.") ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n constraint system %s now %d x %d (%d + %d).", dy_sys->nme,dy_sys->concnt,dy_sys->varcnt,dy_sys->archvcnt, dy_sys->logvcnt) ; } else if (retval == 0) { dyio_outfmt(dy_logchn,dy_gtxecho, " activate & pivot failed; reverting to primal.") ; } } # endif return (retval) ; } static int type3activate (consys_struct *orig_sys, double *betai, int xindx, int diri, int oxjndx, int dirj, double cbarj, double abarij, int *p_actcnt) /* This routine is responsible for handling type 3 variables. It expects to be passed a type 3 variable x which can be activated with a bound-to-bound pivot. Once the initial variable is dealt with, we recalculate the primal variables and then run dualout to see if the same leaving variable x is selected. If not, we're done, and we can return to dual simplex. Otherwise, we scan for another type 3 variable and repeat. If we run out of type 3 variables before we select a different leaving variable, we're in trouble. In theory that's it, but for now revert to the primal to see if it can figure it out. The overall flow of each pivot is much as type2activate --- we do the pivot (easy, it's just a matter of updating the primal variables), then call dy_duenna to check things over and do some bookkeeping. If anything goes mildly wrong, we bail out back to the primal simplex. Parameters: orig_sys: the original constraint system betai: row i of the basis inverse xindx: index of the leaving variable x diri: direction of motion of x oxjndx: index (in orig_sys) of the swinging variable x dirj: direction of motion of x cbarj: reduced cost of x abarij: pivot for x p_actcnt: (o) the number of type 3 variables activated Returns: 1: if one or more bound-to-bound pivots has succeeded in changing the variable selected by dy_dualout; a normal dual pivot is possible 0: if we run out of type 3 variables and still get the same leaving variable, or if we encounter some other recoverable condition -1: when things go badly wrong */ { int candxi,oxkndx,xjndx,xqndx,pkndx ; double cbark,abarik,deltak,distj ; flags xjstatus,xkstatus ; bool fatal ; int actcnt,retval ; dyret_enum duennaresult,outresult ; pkvec_struct *ak ; pkcoeff_struct *aqk ; const char *rtnnme = "type3activate" ; # ifndef DYLP_NDEBUG double deltaj ; # endif retval = -1 ; *p_actcnt = -1 ; actcnt = 0 ; ak = NULL ; /* Dive right into the loop that handles activation, pivot, and selection of a new type 3 variable. We do this as long as we're still selecting x to leave and have a variable x to activate and pivot. */ candxi = xindx ; while (oxjndx != 0) { # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 1) { xjstatus = (flags) -dy_origvars[oxjndx] ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n activating and flipping %s %s (%d), ", dy_prtvstat(xjstatus), consys_nme(orig_sys,'v',oxjndx,TRUE,NULL),oxjndx) ; dyio_outfmt(dy_logchn,dy_gtxecho," cbar = %g, %s.", cbarj,(dirj < 0)?"falling":"rising") ; } # endif /* Try to activate the variable. */ if (dy_actNBPrimArch(orig_sys,oxjndx) == FALSE) { errmsg(430,rtnnme, orig_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "activate","variable", consys_nme(orig_sys,'v',oxjndx,TRUE,NULL),oxjndx) ; return (-1) ; } actcnt++ ; /* Do the bound-to-bound swing. This is inefficient, but if the algorithm works I can always come back and change this to an incremental update. */ xjndx = dy_origvars[oxjndx] ; xjstatus = dy_status[xjndx] ; if (flgon(xjstatus,vstatNBLB)) { dy_status[xjndx] = vstatNBUB ; dy_x[xjndx] = dy_sys->vub[xjndx] ; } else { dy_status[xjndx] = vstatNBLB ; dy_x[xjndx] = dy_sys->vlb[xjndx] ; } dy_cbar[xjndx] = cbarj ; if (dy_calcprimals() == FALSE) { errmsg(316,rtnnme,dy_sys->nme) ; return (-1) ; } dy_setbasicstatus() ; /* Log the pivot and run it past La Duenna. */ # ifndef DYLP_NDEBUG if (dy_opts->print.dual >= 4) { deltaj = dirj*(dy_sys->vub[xjndx]-dy_sys->vlb[xjndx]) ; dy_logpivot(dyrOK,xjndx,dirj,cbarj,xjndx,dirj,abarij,deltaj) ; } # endif dy_lp->phase = dyDUAL ; duennaresult = dy_duenna(dyrOK,xjndx,xindx,-1,-1) ; dy_lp->phase = dyADDVAR ; switch (duennaresult) { case dyrOK: case dyrRESELECT: case dyrOPTIMAL: { retval = 1 ; break ; } case dyrPUNT: case dyrLOSTDFEAS: { retval = 0 ; break ; } default: { retval = -1 ; break ; } } /* If the pivot went through without problem, keep going. The next thing to do is call dy_dualout to see what we select for the leaving variable. dy_dualout can return one of dyrOK (found a candidate), dyrOPTIMAL or dyrPUNT (no candidates, or what there were are are flagged with the NOPIVOT qualifier). If candxi isn't the same as xindx, we're done with these wierd pivots and can go back to normal dual simplex. It's obvious we want to return to dual simplex (retval = 1) when we've successfully pivoted and will select a new leaving variable. The reason for returning when we get dyrOPTIMAL or dyrPUNT from dy_dualout is that it's easier to allow dy_dual to take care of cleanly winding up the dual simplex run. */ if (retval != 1) break ; outresult = dy_dualout(&candxi) ; if (!(outresult == dyrOK || outresult == dyrOPTIMAL)) { retval = 0 ; break ; } if (xindx != candxi) { retval = 1 ; break ; } /* Sigh. We need another type 3 candidate. Open a loop to scan the inactive variables and see if we can find another one. By the time we get here, we've been through the inactive variables once already, so drop the paranoia. */ oxjndx = 0 ; distj = dy_tols->inf ; cbarj = 0.0 ; abarij = 0.0 ; fatal = FALSE ; for (oxkndx = 1 ; oxkndx <= orig_sys->varcnt ; oxkndx++) { xkstatus = (flags) -dy_origvars[oxkndx] ; if (!LOADABLE_VAR(oxkndx)) { # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n skipping %s %s (%d).", ((dy_origvars[oxkndx] > 0)?"loaded":dy_prtvstat(xkstatus)), consys_nme(orig_sys,'v',oxkndx,TRUE,NULL),oxkndx) ; } # endif continue ; } /* Fetch the column for x and calculate abar = betaa and cbar = c - ya. We use only the active elements of a. If abar = 0, there's no point in activating the variable. */ if (consys_getcol_pk(orig_sys,oxkndx,&ak) == FALSE) { errmsg(122,rtnnme,orig_sys->nme, "column",consys_nme(orig_sys,'v',oxkndx,TRUE,NULL),oxkndx) ; fatal = TRUE ; break ; } abarik = 0.0 ; cbark = orig_sys->obj[oxkndx] ; for (pkndx = 0,aqk = ak->coeffs ; pkndx < ak->cnt ; pkndx++,aqk++) { if (ACTIVE_CON(aqk->ndx)) { xqndx = dy_origcons[aqk->ndx] ; abarik += betai[xqndx]*aqk->val ; cbark -= dy_y[xqndx]*aqk->val ; } } setcleanzero(abarik,dy_tols->zero) ; if (abarik == 0) { # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n skipping %s %s (%d), abarik = 0.", dy_prtvstat(xkstatus), consys_nme(orig_sys,'v',oxkndx,TRUE,NULL),oxkndx) ; } # endif continue ; } setcleanzero(cbark,dy_tols->zero) ; deltak = cbark/abarik ; setcleanzero(deltak,dy_tols->zero) ; /* Is this suitable for a type 3 variable? If we get a distance from bound of 0.0, it won't get any better. Break out of the search loop and do the pivot. */ if (diri*(-deltak) <= 0) { type3eval(orig_sys,xindx,diri,oxkndx,xkstatus,abarik,cbark, &oxjndx,&distj,&cbarj,&dirj,&abarij) ; if (distj == 0) break ; } } } /* We've dropped out of the main loop. There are lots of reasons, but we don't need to deal with any of them here. */ if (oxjndx == 0) retval = 0 ; *p_actcnt = actcnt ; if (ak != NULL) pkvec_free(ak) ; # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n activated %d variables",actcnt) ; switch (retval) { case 1: { dyio_outfmt(dy_logchn,dy_gtxecho,", success.") ; break ; } case 0: { dyio_outfmt(dy_logchn,dy_gtxecho,", exhaustion.") ; break ; } default: { dyio_outfmt(dy_logchn,dy_gtxecho,", error.") ; break ; } } } # endif return (retval) ; } int dy_dualaddvars (consys_struct *orig_sys) /* dy_dualaddvars is called when the dual simplex reports unbounded (hence primal infeasible), and we need to add dual constraints (primal variables) to bound the dual. The problem, in dual terms, is that y can increase without bound. The offending y is actually identified by placing the index of the leaving primal associated with basis position i into dy_lp.ubnd.ndx. dualaddvars can also be called as part of dylp's initialisation sequence, adding variables prior to beginning dual simplex iterations. In this case, the routine considers only type 1 activations --- it's too early to pivot. There are three possibilities: 1) There are inactive variables which could bound the dual problem and can be activated into the nonbasic partition while retaining dual feasibility. In this case, we'll activate all such variables and return to the dual simplex. If there are no such variables, perhaps ... 2) There are inactive variables which could bound the dual problem but would be dual infeasible if activated into the nonbasic partition. In this case, we choose one such variable, according to a permuted version of the usual dual pivoting rules, activate it, pivot it into the basis, and then return to dual simplex. There's a real chance that we'll be right back here on the next pivot, but c'est la vie. If there are no such variables, then ... 3) There are inactive variables with a != 0, but they don't satisfy the conditions for 1) or 2). We're at a point that's primal infeasible and dual unbounded for the subset we've been working with, and adding any inactive variables will make us dual infeasible. What's called for here is bound-to-bound (b2b) pivots as we activate variables, chosen in such a way that we eventually want to chose some other dual variable to enter. I.e., we change y's reduced cost until some other dual looks like a better candidate to enter. In primal terms, we want to drive x toward feasibility. After some preliminaries, the inactive variables are scanned, looking for type 1, 2, and 3 variables. Once we've found the first type 1, we quit looking for the other two types. Any type 1 variables are activated as they are found. If we find no type 1 variables, but have a suitable type 2 variable, we do the pivot here and then return to dual simplex. It's a pretty costly way to do a dual pivot (in terms of the overhead of leaving and reentering dual simplex) but it shouldn't happen too often. If we find no type 1 or 2 variables, we do the b2b pivot on the type 3 variable and then run dualout to see if we get a different entering dual. If so, we return to dual simplex. If not, we enter a loop that repeats the process. (We need a pivot or a different y before we can hope to find any type 1 or type 2 variables.) To see how the type 2 pivot works, recall that in dual simplex one looks for an entering variable x s.t. j = arg min{k} |cbar/abar| and the signs of cbar and abar are appropriate. So, for x leaving at lb and x entering from lb, we need cbar >= 0 and abar < 0 so that cbar = -cbar/abar >= 0 after the pivot. But if we had cbar <= 0 and abar > 0, cbar would still be ok. But we couldn't activate x into the nonbasic partition, because for x NBLB, we need cbar >= 0 for dual feasibility. See dy_dualpivot.c:dy_dualin for a more complete explanation of the dual pivot rules. We apply them here with the bound reversed for the entering variable. Parameters: orig_sys: The original constraint system Returns: number of variables activated; -1 if there's an error */ { int acttype,newcnt,xindx,xipos,diri,evalcode, oxkndx,pkndx,xqndx,ox2ndx,dir2,ox3ndx,dir3 ; double *betai,abarik,cbark,deltak,delta2,cbar2,dist3,cbar3,abari3 ; flags xkstatus ; bool fatal ; pkvec_struct *ak ; pkcoeff_struct *aqk ; int retval ; const char *rtnnme = "dy_dualaddvars" ; retval = -1 ; dir2 = 0 ; # ifdef DYLP_PARANOIA if (orig_sys == NULL) { errmsg(2,rtnnme,"orig_sys") ; return (retval) ; } if (dy_lp->simplex.next != dyDUAL) { errmsg(4,rtnnme,"phase",dy_prtlpphase(dy_lp->simplex.next,FALSE)) ; return (retval) ; } if (!dy_lp->lpret == lpINFEAS) { errmsg(4,rtnnme,"lp return code",dy_prtlpret(dy_lp->lpret)) ; return (retval) ; } if (dy_lp->ubnd.ndx == 0 || abs(dy_lp->ubnd.ndx) > dy_sys->varcnt ) { errmsg(102,rtnnme,dy_sys->nme,"variable",abs(dy_lp->ubnd.ndx), 1,dy_sys->varcnt) ; return (retval) ; } # endif /* Preliminaries. First figure out how the entering variable is leaving. Then calculate beta. */ xindx = dy_lp->ubnd.ndx ; if (xindx < 0) { xindx = -xindx ; diri = -1 ; } else { diri = 1 ; } xipos = dy_var2basis[xindx] ; # ifdef DYLP_PARANOIA if (xipos <= 0 || xipos > dy_sys->concnt) { errmsg(102,rtnnme,dy_sys->nme,"constraint",xipos,1,dy_sys->concnt) ; return (retval) ; } # endif betai = (double *) CALLOC(dy_sys->concnt+1,sizeof(double)) ; betai[xipos] = 1.0 ; dy_btran(betai) ; # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n leaving variable %s (%d) ", consys_nme(dy_sys,'v',xindx,TRUE,NULL),xindx) ; if (diri > 0) { dyio_outfmt(dy_logchn,dy_gtxecho, "rising to lb = %g.",dy_sys->vlb[xindx]) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho, "falling to ub = %g.",dy_sys->vub[xindx]) ; } } # endif /* Now open up a loop to walk the variables in orig_sys and check the inactive ones for activation. If we're here as part of initialisation, we're only interested in type 1 activations. */ if (dy_lp->phase == dyINIT) { acttype = 1 ; } else { acttype = dy_opts->dualadd ; } ak = NULL ; newcnt = 0 ; ox2ndx = 0 ; delta2 = dy_tols->inf ; cbar2 = 0.0 ; ox3ndx = 0 ; dist3 = -dy_tols->inf ; cbar3 = 0.0 ; abari3 = 0 ; fatal = FALSE ; for (oxkndx = 1 ; oxkndx <= orig_sys->varcnt ; oxkndx++) { xkstatus = (flags) -dy_origvars[oxkndx] ; if (!LOADABLE_VAR(oxkndx)) { # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n skipping %s %s (%d).", ((dy_origvars[oxkndx] > 0)?"loaded":dy_prtvstat(xkstatus)), consys_nme(orig_sys,'v',oxkndx,TRUE,NULL),oxkndx) ; } # endif continue ; } # ifdef DYLP_PARANOIA if (flgoff(xkstatus,vstatNBUB|vstatNBLB|vstatNBFR)) { errmsg(433,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "inactive",consys_nme(orig_sys,'v',oxkndx,TRUE,NULL), oxkndx,dy_prtvstat(xkstatus)) ; fatal = TRUE ; break ; } # endif /* Fetch the column for x and calculate abar = betaa and cbar = c - ya. We use only the active elements of a. If abar = 0, there's no point in activating the variable. */ if (consys_getcol_pk(orig_sys,oxkndx,&ak) == FALSE) { errmsg(122,rtnnme,orig_sys->nme, "column",consys_nme(orig_sys,'v',oxkndx,TRUE,NULL),oxkndx) ; fatal = TRUE ; break ; } abarik = 0.0 ; cbark = orig_sys->obj[oxkndx] ; for (pkndx = 0,aqk = ak->coeffs ; pkndx < ak->cnt ; pkndx++,aqk++) { if (ACTIVE_CON(aqk->ndx)) { xqndx = dy_origcons[aqk->ndx] ; abarik += betai[xqndx]*aqk->val ; cbark -= dy_y[xqndx]*aqk->val ; } } setcleanzero(abarik,dy_tols->zero) ; if (abarik == 0) { # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n skipping %s %s (%d), abarik = 0.", dy_prtvstat(xkstatus), consys_nme(orig_sys,'v',oxkndx,TRUE,NULL),oxkndx) ; } # endif continue ; } setcleanzero(cbark,dy_tols->zero) ; deltak = cbark/abarik ; setcleanzero(deltak,dy_tols->zero) ; /* What do we have? If dir*(-cbar/abar) >= 0, x is a possible type 1 or type 2. Check first for a type 1 variable. type1var will make the necessary checks and activate x if it qualifies. If this isn't a type 1, and we have none to date, try for a type 2. type2var will make the necessary checks, and replace the incumbent type 2 variable if appropriate. */ if (diri*(-deltak) >= 0) { evalcode = type1var(orig_sys,xindx,diri,oxkndx,xkstatus,abarik,cbark) ; if (evalcode < 0) { errmsg(400,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,1, consys_nme(orig_sys,'v',oxkndx,TRUE,NULL),oxkndx) ; fatal = TRUE ; break ; } else if (evalcode > 0) { newcnt++ ; } else if (newcnt == 0 && acttype >= 2) { type2eval(orig_sys,xindx,diri,oxkndx,xkstatus,abarik,cbark, &ox2ndx,&delta2,&cbar2,&dir2) ; } } /* Maybe this variable is a possible type 3. If we don't have anything better going, call type3eval to do the evaluation. */ else if (newcnt == 0 && ox2ndx == 0 && acttype >= 3) { type3eval(orig_sys,xindx,diri,oxkndx,xkstatus,abarik,cbark, &ox3ndx,&dist3,&cbar3,&dir3,&abari3) ; } /* Are we over our limit? If so, abort the loop. */ if (dy_opts->addvar > 0 && newcnt >= dy_opts->addvar) break ; } /* Free the storage we've acquired. Bail out if we've had a fatal error. If we've activated variables, return to dual simplex. */ if (ak != NULL) pkvec_free(ak) ; if (fatal == TRUE) return (retval) ; if (newcnt > 0) { # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 1) { if (dy_opts->print.varmgmt >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n ") ; } dyio_outfmt(dy_logchn,dy_gtxecho," %d activations.",newcnt) ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n constraint system %s now %d x %d (%d + %d).", dy_sys->nme,dy_sys->concnt,dy_sys->varcnt,dy_sys->archvcnt, dy_sys->logvcnt) ; } # endif retval = newcnt ; } /* We didn't activate any type 1 variables. Do we have a type 2 variable which we can pivot in? */ else if (ox2ndx > 0 && acttype >= 2) { retval = type2activate(orig_sys,xindx,diri,ox2ndx,dir2,cbar2) ; } /* Well, do we have a type 3 variable? If so, call type3activate to do the bound-to-bound pivot. type3activate will keep on with the bound-to-bound pivots until x is no longer selected as the leaving variable or until there are no type 3 variables remaining. */ else if (ox3ndx > 0 && acttype >= 3) { retval = type3activate(orig_sys,betai, xindx,diri,ox3ndx,dir3,cbar3,abari3,&newcnt) ; if (retval >= 0) { retval = newcnt ; } } /* Nothing! Guess we're done, eh? */ else { retval = 0 ; } if (betai != NULL) FREE(betai) ; /* A little paranoia and we're out of here. */ # ifdef DYLP_PARANOIA if (dy_chkdysys(orig_sys) == FALSE) retval = -1 ; # endif return (retval) ; } DyLP-1.6.0/DyLP/src/Dylp/glpinv.c0000644000076700007670000006745010632415522013252 0ustar /* glpinv.c */ /*---------------------------------------------------------------------- -- Copyright (C) 2000, 2001, 2002, 2003 Andrew Makhorin, Department -- for Applied Informatics, Moscow Aviation Institute, Moscow, Russia. -- All rights reserved. E-mail: . -- -- This file is a part of GLPK (GNU Linear Programming Kit). -- -- Licensed under the Common Public License (CPL) by permission of the -- author for inclusion in the DyLP LP distribution. ----------------------------------------------------------------------*/ #ifndef UNUSED # if defined(_GNU_SOURCE) || defined(__GNUC__) # define UNUSED __attribute__((unused)) # else # define UNUSED # endif #endif static char sccsid[] UNUSED = "@(#)glpinv.c 1.4 09/25/04" ; static char svnid[] UNUSED = "$Id: glpinv.c 148 2007-06-09 03:15:30Z lou $" ; #include #include #include "glpinv.h" #include "glplib.h" /*---------------------------------------------------------------------- -- inv_create - create factorization of the basis matrix. -- -- *Synopsis* -- -- #include "glpinv.h" -- INV *inv_create(int m, int max_upd); -- -- *Description* -- -- The routine inv_create creates factorization data structure for the -- the basis matrix of the order m. -- -- The parameter max_upd specifies maximal number of updates of the -- factorization. (This parameter defines maximal number of factors of -- the matrix H, since each update of the factorization for an adjacent -- basis matrix gives one factor of the matrix H.) The value 100 may be -- recommended in most cases. -- -- Being created the factorization initially corresponds to the unity -- basis matrix (F = H = V = P0 = P = Q = I, so B = I). -- -- *Returns* -- -- The routine returns a pointer to the created data structure. */ INV *inv_create(int m, int max_upd) { INV *inv; int k; if (m < 1) fault("inv_create: m = %d; invalid parameter", m); if (max_upd < 0) fault("inv_create: max_upd = %d; invalid parameter", max_upd); inv = umalloc(sizeof(INV)); inv->m = m; inv->valid = 1; inv->luf = luf_create(m, 0); inv->hh_max = max_upd; inv->hh_nfs = 0; inv->hh_ndx = ucalloc(1+max_upd, sizeof(int)); inv->hh_ptr = ucalloc(1+max_upd, sizeof(int)); inv->hh_len = ucalloc(1+max_upd, sizeof(int)); inv->p0_row = ucalloc(1+m, sizeof(int)); inv->p0_col = ucalloc(1+m, sizeof(int)); for (k = 1; k <= m; k++) inv->p0_row[k] = inv->p0_col[k] = k; inv->cc_len = -1; inv->cc_ndx = ucalloc(1+m, sizeof(int)); inv->cc_val = ucalloc(1+m, sizeof(double)); #if 0 inv->upd_tol = 1e-12; #else inv->upd_tol = 1e-6; #endif inv->nnz_h = 0; return inv; } /*---------------------------------------------------------------------- -- inv_decomp - compute factorization of the basis matrix. -- -- *Synopsis* -- -- #include "glpinv.h" -- int inv_decomp(INV *inv, -- void *info, int (*col)(void *info, int j, int rn[], double bj[])); -- -- *Description* -- -- The routine inv_decomp computes the factorization of the given basis -- matrix B (reinverts the basis matrix). -- -- The parameter inv specifies the factorization data structure built by -- the routine inv_create. -- -- The parameter info is a transit pointer passed to the formal routine -- col (see below). -- -- The formal routine col specifies the given basis matrix B. In order -- to obtain j-th column of the matrix B the routine inv_decomp calls -- the routine col with the parameter j (1 <= j <= m, where m is the -- order of B). In response the routine col should store row indices and -- numerical values of non-zero elements of the j-th column of B to the -- locations rn[1], ..., rn[len] and bj[1], ..., bj[len] respectively, -- where len is number of non-zeros in the j-th column, which should be -- returned on exit. Neiter zero nor duplicate elements are allowed. -- -- *Returns* -- -- The routine inv_decomp returns one of the following codes: -- -- 0 - no errors; -- 1 - the given basis matrix is singular (on some elimination step all -- elements of the active submatrix are zeros, due to that the pivot -- can't be chosen); -- 2 - the given basis matrix is ill-conditioned (on some elimination -- step too intensive growth of elements of the active submatrix has -- been detected). -- -- In case of non-zero return code the factorization becomes invalid. -- It should not be used in other operations until the cause of failure -- has been eliminated and the factorization has been recomputed again -- using the routine inv_decomp. For details of obtaining information -- needed for repairing the basis matrix see the routine luf_decomp (in -- the module GLPLUF). -- -- *Algorithm* -- -- The routine inv_decomp is an interface to the routine luf_decomp -- (see the module 'glpluf'), which actually computes LU-factorization -- of the basis matrix B in the form -- -- [B] = (F, V, P, Q), -- -- where F and V are such matrices that -- -- B = F * V, -- -- and P and Q are such permutation matrices that the matrix -- -- L = P * F * inv(P) -- -- is lower triangular with unity diagonal, and the matrix -- -- U = P * V * Q -- -- is upper triangular. -- -- In order to build the complete representation of the factorization -- (see the formula (1) in the file 'glpinv.h') the routine inv_decomp -- just additionally sets H = I and P0 = P. */ int inv_decomp(INV *inv, void *info, int (*col)(void *info, int j, int rn[], double bj[])) { int *pp_row = inv->luf->pp_row; int *pp_col = inv->luf->pp_col; int *p0_row = inv->p0_row; int *p0_col = inv->p0_col; int m = inv->m, ret; ret = luf_decomp(inv->luf, info, col, NULL); if (ret == 0) { /* the matrix B has been successfully factorized */ inv->valid = 1; /* set H = I */ inv->hh_nfs = 0; /* set P0 = P */ memcpy(&p0_row[1], &pp_row[1], sizeof(int) * m); memcpy(&p0_col[1], &pp_col[1], sizeof(int) * m); /* invalidate partially transformed column */ inv->cc_len = -1; /* currently the matrix H has no factors */ inv->nnz_h = 0; /* stability is inverse of growth; imperfect, but it'll do for a first cut */ inv->min_vrratio = inv->luf->max_gro*inv->luf->max_a/inv->luf->big_v ; } else { /* the factorization is not valid due to failure */ inv->valid = 0; } return ret; } /*---------------------------------------------------------------------- -- inv_h_solve - solve system H*x = b or H'*x = b. -- -- *Synopsis* -- -- #include "glpinv.h" -- void inv_h_solve(INV *inv, int tr, double x[]); -- -- *Description* -- -- The routine inv_h_solve solves either the system H*x = b (if the -- flag tr is zero) or the system H'*x = b (if the flag tr is non-zero), -- where the matrix H is a component of the factorization specified by -- the parameter inv, H' is a matrix transposed to H. -- -- On entry the array x should contain elements of the right-hand side -- vector b in locations x[1], ..., x[m], where m is the order of the -- matrix H. On exit this array will contain elements of the solution -- vector x in the same locations. */ void inv_h_solve(INV *inv, int tr, double x[]) { int nfs = inv->hh_nfs; int *hh_ndx = inv->hh_ndx; int *hh_ptr = inv->hh_ptr; int *hh_len = inv->hh_len; int *sv_ndx = inv->luf->sv_ndx; double *sv_val = inv->luf->sv_val; int i, k, beg, end, ptr; double temp; if (!inv->valid) fault("inv_h_solve: the factorization is not valid"); if (!tr) { /* solve the system H*x = b */ for (k = 1; k <= nfs; k++) { i = hh_ndx[k]; temp = x[i]; beg = hh_ptr[k]; end = beg + hh_len[k] - 1; for (ptr = beg; ptr <= end; ptr++) temp -= sv_val[ptr] * x[sv_ndx[ptr]]; x[i] = temp; } } else { /* solve the system H'*x = b */ for (k = nfs; k >= 1; k--) { i = hh_ndx[k]; temp = x[i]; if (temp == 0.0) continue; beg = hh_ptr[k]; end = beg + hh_len[k] - 1; for (ptr = beg; ptr <= end; ptr++) x[sv_ndx[ptr]] -= sv_val[ptr] * temp; } } return; } /*---------------------------------------------------------------------- -- inv_ftran - perform forward transformation (FTRAN). -- -- *Synopsis* -- -- #include "glpinv.h" -- void inv_ftran(INV *inv, double x[], int save); -- -- *Description* -- -- The routine inv_ftran performs forward transformation (FTRAN) of the -- given vector using the factorization of the basis matrix. -- -- In order to perform FTRAN the routine solves the system B*x' = x, -- where B is the basis matrix, x' is vector of unknowns (transformed -- vector that should be computed), x is vector of right-hand sides -- (input vector that should be transformed). -- -- On entry the array x should contain components of the vector x in -- locations x[1], x[2], ..., x[m], where m is the order of the basis -- matrix. On exit this array will contain components of the vector x' -- in the same locations. -- -- The parameter save is a flag. If this flag is set, it means that the -- input vector x is a column of the non-basic variable, which has been -- chosen to enter the basis. In this case the routine inv_ftran saves -- this column (after partial transformation) in order that the routine -- inv_update could update (recompute) the factorization for an adjacent -- basis using this partially transformed column. The simplex method -- routine should call the routine inv_ftran with the save flag set at -- least once before a subsequent call to the routine inv_update. */ void inv_ftran(INV *inv, double x[], int save) { int m = inv->m; int *pp_row = inv->luf->pp_row; int *pp_col = inv->luf->pp_col; double eps_tol = inv->luf->eps_tol; int *p0_row = inv->p0_row; int *p0_col = inv->p0_col; int *cc_ndx = inv->cc_ndx; double *cc_val = inv->cc_val; int i, len; double temp; if (!inv->valid) fault("inv_ftran: the factorization is not valid"); /* B = F*H*V, therefore inv(B) = inv(V)*inv(H)*inv(F) */ inv->luf->pp_row = p0_row; inv->luf->pp_col = p0_col; luf_f_solve(inv->luf, 0, x); inv->luf->pp_row = pp_row; inv->luf->pp_col = pp_col; inv_h_solve(inv, 0, x); /* save partially transformed column (if required) */ if (save) { len = 0; for (i = 1; i <= m; i++) { temp = x[i]; if (temp == 0.0 || fabs(temp) < eps_tol) continue; len++; cc_ndx[len] = i; cc_val[len] = temp; } inv->cc_len = len; } luf_v_solve(inv->luf, 0, x); return; } /*---------------------------------------------------------------------- -- inv_btran - perform backward transformation (BTRAN). -- -- *Synopsis* -- -- #include "glpinv.h" -- void inv_btran(INV *inv, double x[]); -- -- *Description* -- -- The routine inv_btran performs backward transformation (BTRAN) of the -- given vector using the factorization of the basis matrix. -- -- In order to perform BTRAN the routine solves the system B'*x' = x, -- where B' is a matrix transposed to the basis matrix B, x' is vector -- of unknowns (transformed vector that should be computed), x is vector -- of right-hand sides (input vector that should be transformed). -- -- On entry the array x should contain components of the vector x in -- locations x[1], x[2], ..., x[m], where m is the order of the basis -- matrix. On exit this array will contain components of the vector x' -- in the same locations. */ void inv_btran(INV *inv, double x[]) { int *pp_row = inv->luf->pp_row; int *pp_col = inv->luf->pp_col; int *p0_row = inv->p0_row; int *p0_col = inv->p0_col; /* B = F*H*V, therefore inv(B') = inv(F')*inv(H')*inv(V') */ if (!inv->valid) fault("inv_btran: the factorization is not valid"); luf_v_solve(inv->luf, 1, x); inv_h_solve(inv, 1, x); inv->luf->pp_row = p0_row; inv->luf->pp_col = p0_col; luf_f_solve(inv->luf, 1, x); inv->luf->pp_row = pp_row; inv->luf->pp_col = pp_col; return; } /*---------------------------------------------------------------------- -- inv_update - update factorization for adjacent basis matrix. -- -- *Synopsis* -- -- #include "glpinv.h" -- int inv_update(INV *inv, int j); -- -- *Description* -- -- The routine inv_update recomputes the factorization, which on entry -- corresponds to the current basis matrix B, in order that the updated -- factorization would correspond to the adjacent basis matrix B' that -- differs from B in the j-th column. -- -- The new j-th column of the basis matrix is passed implicitly to the -- routine inv_update. It is assumed that this column was saved before -- by the routine inv_ftran (see above). -- -- *Returns* -- -- The routine inv_update returns one of the following codes: -- -- 0 - no errors; -- 1 - the adjacent basis matrix is structurally singular, since after -- changing the j-th column of the matrix V by the new column (see -- the algorithm below) the case k1 > k2 occured; -- 2 - the factorization is inaccurate, since after transforming the -- k2-th row of the matrix U = P*V*Q, the diagonal element u[k2,k2] -- is zero or close to zero; -- 3 - maximal number of updates has been reached; -- 4 - overflow of the sparse vector area. -- -- In case of non-zero return code the factorization becomes invalid. -- It should not be used until it has been recomputed using the routine -- inv_decomp. -- -- *Algorithm* -- -- The routine inv_update is based on the transformation proposed by -- Forrest and Tomlin. -- -- Let the j-th column of the basis matrix B have been replaced by new -- column B[j]. In order to keep the equality B = F*H*V the j-th column -- of the matrix V should be replaced by the column inv(F*H)*B[j]. The -- latter is partially transformed column, which the routine inv_ftran -- saves on performing forward transformation of B[j]. -- -- From the point of view of the matrix U = P*V*Q, replacement of the -- j-th column of the matrix V involves replacement of the k1-th column -- of the matrix U, where k1 is determined by the permutation matrix Q. -- Thus, the matrix U loses its upper triangular form and becomes the -- following: -- -- 1 k1 k2 m -- 1 x x * x x x x x x x -- . x * x x x x x x x -- k1 . . * x x x x x x x -- . . * x x x x x x x -- . . * . x x x x x x -- . . * . . x x x x x -- . . * . . . x x x x -- k2 . . * . . . . x x x -- . . . . . . . . x x -- m . . . . . . . . . x -- -- where row index k2 corresponds to the lowest non-zero element of the -- k1-th column. -- -- Then the routine shifts rows and columns k1+1, k1+2, ..., k2 of the -- matrix U by one position to the left and upwards and moves k1-th row -- and k1-th column to the position k2. As the result of such symmetric -- permutations the matrix U becomes the following: -- -- 1 k1 k2 m -- 1 x x x x x x x * x x -- . x x x x x x * x x -- k1 . . x x x x x * x x -- . . . x x x x * x x -- . . . . x x x * x x -- . . . . . x x * x x -- . . . . . . x * x x -- k2 . . x x x x x * x x -- . . . . . . . . x x -- m . . . . . . . . . x -- -- Now the routine performs gaussian elimination in order to eliminate -- the elements u[k2,k1], u[k2,k1+1], ..., u[k2,k2-1] using the diagonal -- elements u[k1,k1], u[k1+1,k1+1], ..., u[k2-1,k2-1] as pivots in the -- same way as described in comments to the routine luf_decomp (see the -- module 'glpluf'). Note that actually all operations are performed on -- the matrix V, not on the matrix U. During the elimination process the -- routine permutes neither rows nor columns, therefore only the k2-th -- row of the matrix U is changed. -- -- In order to keep the equality B = F*H*V, each time when the routine -- applies elementary gaussian transformation to the transformed row of -- the matrix V (that corresponds to the k2-th row of the matrix U), it -- also adds a new element (gaussian multiplier) to the current row-like -- factor of the matrix H, which (factor) corresponds to the transformed -- row of the matrix V. */ int inv_update(INV *inv, int j) { int m = inv->m; LUF *luf = inv->luf; int *vr_ptr = luf->vr_ptr; int *vr_len = luf->vr_len; int *vr_cap = luf->vr_cap; double *vr_piv = luf->vr_piv; int *vc_ptr = luf->vc_ptr; int *vc_len = luf->vc_len; int *vc_cap = luf->vc_cap; int *pp_row = luf->pp_row; int *pp_col = luf->pp_col; int *qq_row = luf->qq_row; int *qq_col = luf->qq_col; int *sv_ndx = luf->sv_ndx; double *sv_val = luf->sv_val; double *work = luf->work; double eps_tol = luf->eps_tol; int *hh_ndx = inv->hh_ndx; int *hh_ptr = inv->hh_ptr; int *hh_len = inv->hh_len; int cc_len = inv->cc_len; int *cc_ndx = inv->cc_ndx; double *cc_val = inv->cc_val; double upd_tol = inv->upd_tol; int ret = 0; int i, i_beg, i_end, i_ptr, j_beg, j_end, j_ptr, k, k1, k2, p, q, p_beg, p_end, p_ptr, ptr; double f, temp; if (!inv->valid) fault("inv_update: the factorization is not valid"); if (inv->cc_len < 0) fault("inv_update: new column has not been prepared"); if (!(1 <= j && j <= m)) fault("inv_update: j = %d; invalid column number", j); /* check if a new factor of the matrix H can be created */ if (inv->hh_nfs == inv->hh_max) { /* maximal number of updates has been reached */ inv->valid = luf->valid = 0; ret = 3; goto done; } /* remove elements of the j-th column from the matrix V */ j_beg = vc_ptr[j]; j_end = j_beg + vc_len[j] - 1; for (j_ptr = j_beg; j_ptr <= j_end; j_ptr++) { /* get row index of v[i,j] */ i = sv_ndx[j_ptr]; /* find v[i,j] in the i-th row */ i_beg = vr_ptr[i]; i_end = i_beg + vr_len[i] - 1; for (i_ptr = i_beg; sv_ndx[i_ptr] != j; i_ptr++) /* nop */; insist(i_ptr <= i_end); /* remove v[i,j] from the i-th row */ sv_ndx[i_ptr] = sv_ndx[i_end]; sv_val[i_ptr] = sv_val[i_end]; vr_len[i]--; } /* now the j-th column of the matrix V is empty */ luf->nnz_v -= vc_len[j]; vc_len[j] = 0; /* add elements of the new j-th column to the matrix V; determine indices k1 and k2 */ k1 = qq_row[j]; k2 = 0; for (ptr = 1; ptr <= cc_len; ptr++) { /* get row index of v[i,j] */ i = cc_ndx[ptr]; /* at least one unused location is needed in the i-th row */ if (vr_len[i] + 1 > vr_cap[i]) { if (luf_enlarge_row(luf, i, vr_len[i] + 10)) { /* overflow of the sparse vector area */ inv->valid = luf->valid = 0; luf->new_sva = luf->sv_size + luf->sv_size; ret = 4; goto done; } } /* add v[i,j] to the i-th row */ i_ptr = vr_ptr[i] + vr_len[i]; sv_ndx[i_ptr] = j; sv_val[i_ptr] = cc_val[ptr]; vr_len[i]++; /* adjust the index k2 */ if (k2 < pp_col[i]) k2 = pp_col[i]; } /* capacity of the j-th column (which is currently empty) should be not less than cc_len locations */ if (vc_cap[j] < cc_len) { if (luf_enlarge_col(luf, j, cc_len)) { /* overflow of the sparse vector area */ inv->valid = luf->valid = 0; luf->new_sva = luf->sv_size + luf->sv_size; ret = 4; goto done; } } /* add elements of the new j-th column to the column list */ j_ptr = vc_ptr[j]; memmove(&sv_ndx[j_ptr], &cc_ndx[1], cc_len * sizeof(int)); memmove(&sv_val[j_ptr], &cc_val[1], cc_len * sizeof(double)); vc_len[j] = cc_len; luf->nnz_v += cc_len; /* k1 > k2 means that the diagonal element u[k2,k2] is zero and therefore the adjacent basis matrix is structurally singular */ if (k1 > k2) { inv->valid = luf->valid = 0; ret = 1; goto done; } /* perform implicit symmetric permutations of rows and columns of the matrix U */ i = pp_row[k1], j = qq_col[k1]; for (k = k1; k < k2; k++) { pp_row[k] = pp_row[k+1], pp_col[pp_row[k]] = k; qq_col[k] = qq_col[k+1], qq_row[qq_col[k]] = k; } pp_row[k2] = i, pp_col[i] = k2; qq_col[k2] = j, qq_row[j] = k2; /* note that now the i-th row of the matrix V is the k2-th row of the matrix U; since no pivoting is used, only this row will be transformed */ /* copy elements of the i-th row of the matrix V to the working array and remove these elements from the matrix V */ for (j = 1; j <= m; j++) work[j] = 0.0; i_beg = vr_ptr[i]; i_end = i_beg + vr_len[i] - 1; for (i_ptr = i_beg; i_ptr <= i_end; i_ptr++) { /* get column index of v[i,j] */ j = sv_ndx[i_ptr]; /* store v[i,j] to the working array */ work[j] = sv_val[i_ptr]; /* find v[i,j] in the j-th column */ j_beg = vc_ptr[j]; j_end = j_beg + vc_len[j] - 1; for (j_ptr = j_beg; sv_ndx[j_ptr] != i; j_ptr++) /* nop */; insist(j_ptr <= j_end); /* remove v[i,j] from the j-th column */ sv_ndx[j_ptr] = sv_ndx[j_end]; sv_val[j_ptr] = sv_val[j_end]; vc_len[j]--; } /* now the i-th row of the matrix V is empty */ luf->nnz_v -= vr_len[i]; vr_len[i] = 0; /* create the next row-like factor of the matrix H; this factor corresponds to the i-th (transformed) row */ inv->hh_nfs++; hh_ndx[inv->hh_nfs] = i; /* hh_ptr[] will be set later */ hh_len[inv->hh_nfs] = 0; /* up to (k2 - k1) free locations are needed to add new elements to the non-trivial row of the row-like factor */ if (luf->sv_end - luf->sv_beg < k2 - k1) { luf_defrag_sva(luf); if (luf->sv_end - luf->sv_beg < k2 - k1) { /* overflow of the sparse vector area */ inv->valid = luf->valid = 0; luf->new_sva = luf->sv_size + luf->sv_size; ret = 4; goto done; } } /* eliminate subdiagonal elements of the matrix U */ for (k = k1; k < k2; k++) { /* v[p,q] = u[k,k] */ p = pp_row[k], q = qq_col[k]; /* this is the cruical point, where even tiny non-zeros should not be dropped */ if (work[q] == 0.0) continue; /* compute gaussian multiplier f = v[i,q] / v[p,q] */ f = work[q] / vr_piv[p]; /* perform gaussian transformation: (i-th row) := (i-th row) - f * (p-th row) in order to eliminate v[i,q] = u[k2,k] */ p_beg = vr_ptr[p]; p_end = p_beg + vr_len[p] - 1; for (p_ptr = p_beg; p_ptr <= p_end; p_ptr++) work[sv_ndx[p_ptr]] -= f * sv_val[p_ptr]; /* store new element (gaussian multiplier that corresponds to the p-th row) in the current row-like factor */ luf->sv_end--; sv_ndx[luf->sv_end] = p; sv_val[luf->sv_end] = f; hh_len[inv->hh_nfs]++; } /* set pointer to the current row-like factor of the matrix H (if no elements were added to this factor, it is unity matrix and therefore can be discarded) */ if (hh_len[inv->hh_nfs] == 0) inv->hh_nfs--; else { hh_ptr[inv->hh_nfs] = luf->sv_end; inv->nnz_h += hh_len[inv->hh_nfs]; } /* store new pivot that corresponds to u[k2,k2] */ vr_piv[i] = work[qq_col[k2]]; #if 0 /* this naive check has been replaced by more appropriate check (see below) */ /* check if u[k2,k2] is close to zero */ if (fabs(vr_piv[i]) < upd_tol) { /* the factorization should be considered as inaccurate (this mainly happens due to excessive round-off errors) */ inv->valid = luf->valid = 0; ret = 2; goto done; } #endif /* new elements of the i-th row of the matrix V (which correspond to non-diagonal elements u[k2,k2+1], ..., u[k2,m] of the matrix U = P*V*Q) are contained in the working array; add them to the matrix V */ cc_len = 0; for (k = k2+1; k <= m; k++) { /* get column index and value of v[i,j] = u[k2,k] */ j = qq_col[k]; temp = work[j]; /* if v[i,j] is close to zero, skip it */ if (fabs(temp) < eps_tol) continue; /* at least one unused location is needed in the j-th column */ if (vc_len[j] + 1 > vc_cap[j]) { if (luf_enlarge_col(luf, j, vc_len[j] + 10)) { /* overflow of the sparse vector area */ inv->valid = luf->valid = 0; luf->new_sva = luf->sv_size + luf->sv_size; ret = 4; goto done; } } /* add v[i,j] to the j-th column */ j_ptr = vc_ptr[j] + vc_len[j]; sv_ndx[j_ptr] = i; sv_val[j_ptr] = temp; vc_len[j]++; /* also store v[i,j] to the auxiliary array */ cc_len++; cc_ndx[cc_len] = j; cc_val[cc_len] = temp; } /* capacity of the i-th row (which is currently empty) should be not less than cc_len locations */ if (vr_cap[i] < cc_len) { if (luf_enlarge_row(luf, i, cc_len)) { /* overflow of the sparse vector area */ inv->valid = luf->valid = 0; luf->new_sva = luf->sv_size + luf->sv_size; ret = 4; goto done; } } /* add new elements of the i-th row to the row list */ i_ptr = vr_ptr[i]; memmove(&sv_ndx[i_ptr], &cc_ndx[1], cc_len * sizeof(int)); memmove(&sv_val[i_ptr], &cc_val[1], cc_len * sizeof(double)); vr_len[i] = cc_len; luf->nnz_v += cc_len; #if 1 /* updating is finished; check that diagonal element u[k2,k2] is not very small in absolute value among other elements in k2-th row and k2-th column of the matrix U = P*V*Q */ /* temp = max(|u[k2,*]|, |u[*,k2]|) */ temp = 0.0; /* walk through k2-th row of U which is i-th row of V */ i = pp_row[k2]; i_beg = vr_ptr[i]; i_end = i_beg + vr_len[i] - 1; for (i_ptr = i_beg; i_ptr <= i_end; i_ptr++) if (temp < fabs(sv_val[i_ptr])) temp = fabs(sv_val[i_ptr]); /* walk through k2-th column of U which is j-th column of V */ j = qq_col[k2]; j_beg = vc_ptr[j]; j_end = j_beg + vc_len[j] - 1; for (j_ptr = j_beg; j_ptr <= j_end; j_ptr++) if (temp < fabs(sv_val[j_ptr])) temp = fabs(sv_val[j_ptr]); /* check that u[k2,k2] is not very small */ inv->min_vrratio = fabs(vr_piv[i])/(upd_tol*temp) ; if (fabs(vr_piv[i]) < upd_tol * temp) { /* the factorization seems to be inaccurate and therefore must be recomputed */ inv->valid = luf->valid = 0; ret = 2; goto done; } #endif /* the factorization has been successfully updated */ inv->cc_len = -1; done: /* return to the simplex method routine */ return ret; } /*---------------------------------------------------------------------- -- inv_delete - delete factorization of the basis matrix. -- -- *Synopsis* -- -- #include "glpinv.h" -- void inv_delete(INV *inv); -- -- *Description* -- -- The routine inv_delete deletes factorization data structure, which -- the parameter inv points to, freeing all the memory allocated to this -- object. */ void inv_delete(INV *inv) { luf_delete(inv->luf); ufree(inv->hh_ndx); ufree(inv->hh_ptr); ufree(inv->hh_len); ufree(inv->p0_row); ufree(inv->p0_col); ufree(inv->cc_ndx); ufree(inv->cc_val); ufree(inv); return; } /* eof */ DyLP-1.6.0/DyLP/src/Dylp/dy_vector.h0000644000076700007670000002352110737027670013756 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ #ifndef _DYLP_VECTOR_H #define _DYLP_VECTOR_H /* @(#)dy_vector.h 4.5 11/06/04 svn/cvs: $Id: dy_vector.h 198 2008-01-03 00:43:36Z lou $ */ #include /* Why, you might ask, are we including ctype.h? Well, it's required by the ANSI C specification, so it's pretty well guaranteed to exist. And, at least in Solaris and Linux environments that I'm familiar with, it'll pull in the compile-time symbols that specify big- or little-endian, which we really want. */ #include /* A bunch of standard definitions. */ #include "dylib_std.h" /* In a few rare instances, the declarations here will be unused, but for dylp this is a good bet. */ #include /* Some subset of these will work on any system. Check config_dylp.h to see which ones are actually in use. */ #ifdef HAVE_FLOAT_H # include #endif #ifdef HAVE_IEEEFP_H # include #endif #ifdef HAVE_SUNMATH_H # include #endif /* The Theory: quiet_nan is used to indicate failure (by returning NaN) without triggering a signal the client may not be prepared to catch. The idea is that any reasonable checks in the client will detect NaN fairly quickly. signalling_nan is used when there's no advantage in delaying a signal. The Reality: Neither seems to trigger a signal, and many computing environments can't tell the difference. But it's coded into dylp, and it'd be much ado to change. Hence the compile-time ugliness that follows. In the Sun Workshop environment, quiet_nan and signalling_nan are declared in sunmath.h and found in libsunmath. With release 5.0, sunmath.h includes some declarations of type `long long', which isn't supported under the -Xc (strict ANSI compatibility) option for cc. So, we extract only the definitions we need. Unfortunately, sunmath.h is present only in the Sun Workshop programming environment. Sun without Workshop has only the require file nan.h, which is inadequate. For a long while, GNU C didn't distinguish QNaN and SNaN. More recently, its support for IEEE 754 seems to have improved, but it's not clear that we can count on everyone having a recent GCC environment just yet. Here, too, nan.h is inadequate. The easy way out is to simply #define them as macros that return the proper bit pattern. Arguably this would make more sense in general than Sun's implementation as functions. According to IEEE 754, the proper bit patterns are: 0x7ff00000 00000000 for Inf 0x7fffffff ffffffff for QNaN 0x7ff00000 00000001 for SNaN It works this way: The IEEE definition of NaN is Bits Value 63 sign --- don't care for a NaN, but nice to be positive (0) 62:52 exponent --- must be maximum value, 0x7ff 51:0 fraction --- must not be zero (a fraction of zero is the representation of infinity). Sun documentation defines QNaN as having bit 51 of the fraction set to 1, SNaN as having bit 51 set to 0. Creating the proper constants qualifies as a serious gross hack. And if you have a little-endian machine (the 80x86 family being far and away the most common example), you need to flip the byte order. */ typedef union { unsigned char fpchr[8] ; double fpdbl ; } fpunion_t ; /* Yes, all this really is needed to get all the various compilers to quit complaining. We need the `(unsigned char)' to prevent some compilers from complaining about the initialiser being out of range. Goes to the ANSI C rule that `Character constants not preceded by the letter L have type int.' */ #ifdef WORDS_BIGENDIAN static fpunion_t QNaNbits UNUSED = { { (unsigned char) '\177', (unsigned char) '\377', (unsigned char) '\377', (unsigned char) '\377', (unsigned char) '\377', (unsigned char) '\377', (unsigned char) '\377', (unsigned char) '\376' } } ; static fpunion_t SNaNbits UNUSED = { { (unsigned char) '\177', (unsigned char) '\360', (unsigned char) '\0', (unsigned char) '\0', (unsigned char) '\0', (unsigned char) '\0', (unsigned char) '\0', (unsigned char) '\001' } } ; static fpunion_t Infbits UNUSED = { { (unsigned char) '\177', (unsigned char) '\360', (unsigned char) '\0', (unsigned char) '\0', (unsigned char) '\0', (unsigned char) '\0', (unsigned char) '\0', (unsigned char) '\0' } } ; #else static fpunion_t QNaNbits UNUSED = { { (unsigned char) '\376', (unsigned char) '\377', (unsigned char) '\377', (unsigned char) '\377', (unsigned char) '\377', (unsigned char) '\377', (unsigned char) '\377', (unsigned char) '\177' } } ; static fpunion_t SNaNbits UNUSED = { { (unsigned char) '\001', (unsigned char) '\0', (unsigned char) '\0', (unsigned char) '\0', (unsigned char) '\0', (unsigned char) '\0', (unsigned char) '\360', (unsigned char) '\177' } } ; static fpunion_t Infbits UNUSED = { { (unsigned char) '\0', (unsigned char) '\0', (unsigned char) '\0', (unsigned char) '\0', (unsigned char) '\0', (unsigned char) '\0', (unsigned char) '\360', (unsigned char) '\177' } } ; #endif /* WORDS_BIGENDIAN */ /* If we didn't find a quiet_nan function, fake it with a macro. */ #ifndef DYLP_HAS_QUIET_NAN # define quiet_nan(zz_dummy_zz) (QNaNbits.fpdbl) #endif /* On some machines, HUGE_VAL isn't actually IEEE infinity. Make sure that it really is IEEE infinity. */ #undef HUGE_VAL #define HUGE_VAL (Infbits.fpdbl) /* In a Sun/Solaris environment, the definitions and functions that support IEEE floating point are in ieeefp.h. This seems to be true even if GNU compilers are being used instead of Sun Workshop compilers. In a GNU/Linux environment, the necessary definitions seem to live in math.h. The upshot is that we need to explicitly pull in ieeefp.h here for a Sun environment. In a Microsoft environment the correct functions look to be _finite and _isnan from float.h. Assign the proper names to finite and isnan, based on the values deduced by configure. Again, check config_dylp to see the actual names. If either name is already defined, bet that it's the correct definition. */ #ifndef finite # define finite DYLP_ISFINITE #endif #ifndef isnan # define isnan DYLP_ISNAN #endif /* Packed Vectors The packed vector type consists of a header plus an array of pairs for the non-default entries of the vector. pkcoeff_struct Field Description ----- ----------- ndx the column/row index for the coefficient val the value of the coefficient pkvec_struct Field Description ----- ----------- ndx the common index for all coefficients when the vector is a row or column from a matrix nme name associated with this vector, if any dim length of the vector when unpacked dflt the default value of coefficients not in coeffs cnt number of non-default coefficients in the coeffs array sze allocated capacity (in pkcoeff_struct's) of the coeffs array coeffs the array of (column/row index, coefficient) pairs NOTE: pkvec_struct->coeffs is indexed from 0 and sized accordingly. */ typedef struct { int ndx ; double val ; } pkcoeff_struct ; typedef struct { int ndx ; const char *nme ; int dim ; double dflt ; int cnt ; int sze ; pkcoeff_struct *coeffs ; } pkvec_struct ; pkvec_struct *pkvec_new(int sze) ; bool pkvec_resize(pkvec_struct *pkvec, int sze) ; void pkvec_free(pkvec_struct *pkvec) ; bool pkvec_check(pkvec_struct *pkvec, const char *caller) ; double pkvec_2norm(pkvec_struct *vec) ; double exvec_1norm(double *vec, int len), exvec_ssq(double *vec, int len), exvec_2norm(double *vec, int len), exvec_infnorm(double *vec, int len, int *p_jmax) ; double pkvec_dotexvec(pkvec_struct *pkvec, double *exvec) ; #endif /* _DYLP_VECTOR_H */ DyLP-1.6.0/DyLP/src/Dylp/glplib4.c0000644000076700007670000001064310632415522013300 0ustar /* glplib4.c */ /*---------------------------------------------------------------------- -- Copyright (C) 2000, 2001, 2002 Andrew Makhorin , -- Department for Applied Informatics, Moscow Aviation -- Institute, Moscow, Russia. All rights reserved. -- -- This file is a part of GLPK (GNU Linear Programming Kit). -- -- Licensed under the Common Public License (CPL) by permission of the -- author for inclusion in the DyLP LP distribution. ----------------------------------------------------------------------*/ #ifndef UNUSED # if defined(_GNU_SOURCE) || defined(__GNUC__) # define UNUSED __attribute__((unused)) # else # define UNUSED # endif #endif static char sccsid[] UNUSED = "@(#)glplib4.c 1.2 09/25/04" ; static char svnid[] UNUSED = "$Id: glplib4.c 148 2007-06-09 03:15:30Z lou $" ; #include #include #include #include "glplib.h" #define MEM_FLAG 0x20101960 /* a value used as memory block descriptor flag (may be changed if necessary) */ /*---------------------------------------------------------------------- -- umalloc - allocate memory block. -- -- *Synopsis* -- -- #include "glpset.h" -- void *umalloc(int size); -- -- *Description* -- -- The routine umalloc allocates a memory block of size bytes long. -- -- Note that being allocated the memory block contains arbitrary data -- (not binary zeros). -- -- *Returns* -- -- The routine umalloc returns a pointer to the allocated memory block. -- To free this block the routine ufree (not free!) should be used. */ void *umalloc(int size) { ENV *env = get_env_ptr(); MEM *desc; int size_of_desc = align_datasize(sizeof(MEM)); if (size < 1) fault("umalloc: invalid size"); if (size > INT_MAX - size_of_desc) fault("umalloc: size too big"); size += size_of_desc; if (size > env->mem_limit - env->mem_total) fault("umalloc: no memory available"); desc = malloc(size); if (desc == NULL) fault("umalloc: malloc failed"); #if 1 memset(desc, '?', size); #endif desc->size = size; desc->flag = MEM_FLAG; desc->prev = NULL; desc->next = env->mem_ptr; if (desc->next != NULL) desc->next->prev = desc; env->mem_ptr = desc; env->mem_total += size; if (env->mem_tpeak < env->mem_total) env->mem_tpeak = env->mem_total; env->mem_count++; if (env->mem_cpeak < env->mem_count) env->mem_cpeak = env->mem_count; return (void *)((char *)desc + size_of_desc); } /*---------------------------------------------------------------------- -- ucalloc - allocate memory block. -- -- *Synopsis* -- -- #include "glpset.h" -- void *ucalloc(int nmemb, int size); -- -- *Description* -- -- The routine ucalloc allocates a memory block of (nmemb*size) bytes -- long. -- -- Note that being allocated the memory block contains arbitrary data -- (not binary zeros). -- -- *Returns* -- -- The routine ucalloc returns a pointer to the allocated memory block. -- To free this block the routine ufree (not free!) should be used. */ void *ucalloc(int nmemb, int size) { if (nmemb < 1) fault("ucalloc: invalid nmemb"); if (size < 1) fault("ucalloc: invalid size"); if (nmemb > INT_MAX / size) fault("ucalloc: array too big"); return umalloc(nmemb * size); } /*---------------------------------------------------------------------- -- ufree - free memory block. -- -- *Synopsis* -- -- #include "glpset.h" -- void ufree(void *ptr); -- -- *Description* -- -- The routine ufree frees the memory block pointed to by ptr and which -- was previuosly allocated by the routine umalloc or ucalloc. */ void ufree(void *ptr) { ENV *env = get_env_ptr(); MEM *desc; int size_of_desc = align_datasize(sizeof(MEM)); if (ptr == NULL) fault("ufree: null pointer"); desc = (void *)((char *)ptr - size_of_desc); if (desc->flag != MEM_FLAG) fault("ufree: invalid pointer"); if (env->mem_total < desc->size || env->mem_count == 0) fault("ufree: memory allocation error"); if (desc->prev == NULL) env->mem_ptr = desc->next; else desc->prev->next = desc->next; if (desc->next == NULL) ; else desc->next->prev = desc->prev; env->mem_total -= desc->size; env->mem_count--; memset(desc, '?', size_of_desc); free(desc); return; } /* eof */ DyLP-1.6.0/DyLP/src/Dylp/dy_coldstart.c0000644000076700007670000020453411266201204014434 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains routines to populate the active constraint system and select an initial basis for an lp. Both of these activities are discussed in more detail below. For here, it suffices to say that dylp offers a great deal of flexibility in establishing the initial constraint system and selecting the initial basis. */ #define DYLP_INTERNAL #include "dylp.h" static char sccsid[] UNUSED = "@(#)dy_coldstart.c 4.6 10/15/05" ; static char svnid[] UNUSED = "$Id: dy_coldstart.c 307 2009-10-16 23:32:20Z lou $" ; /* Cold start routines. dy_coldstart and subsidiary routines select a set of constraints to populate the initial active system. There are a number of options. But first a bit of general explanation. Ideally, we'd like to be able to guess the constraints that will be tight at optimum and load exactly those constraints. If we can also guess the right basic variables, we have the answer. It's not that easy, of course. See the comments in the second half of the file for an explanation of how dylp chooses the initial set of basic variables. Back to the subject at hand. Recall that we're dealing with equalities and <= constraints. Also recall that we're minimising. Then the normals a to the inequality constraints point out of the feasible region, and at optimum the normal c to the objective will point into the feasible region. Hence ideal `alignment' with the objective occurs when the angle between a and c is 180 degrees. When the angle is 0 degrees, the constraint is forming the far side of the polytope. For convenience, call the inequalities with 180 <= angle(a,c) < 90 the `near' group, those with angle(a,c) = 90 the `perp' group, and those with 90 < angle(a,c) <= 0 the `far' group. The implementation creates a sorted list of inequalities, in nonincreasing order using angle(a,c), and marks the boundaries between the near, perp, and far groups. To populate the active system, equalities are loaded first. All equalities are loaded, always. Empty constraints are never loaded. For the inequalities, it's possible to load one or two specified angular ranges, with a specified sampling rate. This seems to allow as much flexibility as is useful. NOTE: The routines that construct the initial basis use knowledge of the load order, and knowledge of how consys augments columns, to scan the columns in the proper order when selecting architectural variables for basis positions. If you change one, you must change both. See ib_archvselect. Note that specifying a range of 180 - 0 degrees with sampling rate 1.0 (i.e., activate all the original constraints) is >not< quite the same as the fullsys option. 100% activation still allows initial variable deactivation (hence multiple variable activation/deactivation phases) and final variable and constraint deactivation; fullsys suppresses these. Recall that angle(a,c) = (180/pi)*arccos(dot(a,c)/(||a||||c||)) */ /* Utility structures angle_struct Field Definition ----- ---------- ndx constraint index angle angle between a and c ineq_struct Field Definition ----- ---------- cnt Number of inequalities perp index in angles of first inequality with angle(a,c) = 90 degrees far index in angles of first inequality with angle(a,c) < 90 degrees angles inequalities, sorted by angle (indexed from 0) */ typedef struct { int ndx ; double angle ; } angle_struct ; typedef struct { int cnt ; int perp ; int far ; angle_struct *angles ; } ineq_struct ; static int near_perp_far (const void *elem1, const void *elem2) { const angle_struct *c1,*c2 ; c1 = (const angle_struct *) elem1 ; c2 = (const angle_struct *) elem2 ; if (c1->angle > c2->angle) return (-1) ; else if (c1->angle < c2->angle) return (1) ; else return (0) ; } static bool cold_sortcons (consys_struct *orig_sys, int **p_eqs, ineq_struct **p_ineqs, int **p_noload) /* This routine separates the constraints into equalities and inequalities, dropping empty and nonbinding constraints. It also checks the bounds of ranged constraints for prima facie infeasibility. Depending on options, various additional work is performed: * If fullsys is not specified, the inequalities are sorted according to their angle from the objective function. * If full statistics are enabled, constraint angles are loaded into the statistics structure and a histogram is compiled. * If debug printing is enabled, the requested information is dumped to the log. Parameters: orig_sys: The original constraint system p_eqs: (i) empty array of int; assumed to be sufficiently large; allocated if NULL (o) eqs[0] set to number of equalities eqs[1 .. eqs[0]] set to indices of equality constraints p_ineqs: (i) empty ineq_struct; assumed to be sufficiently large; allocated if NULL (o) filled in with inequality information as described in comments at head of file p_noload (i) empty array of int; assumed to be sufficiently large; allocated if NULL (o) noload[0] set to number of constraints ineligible for activation; noload[1 .. noload[0]] set to indices of ineligible constraints Return value: TRUE if all goes as planned, FALSE on error. dy_lp->lpret is set to lpINFEAS for prima facie infeasibility */ { int i,ndx,m,n,eqcnt,ineqcnt,noloadcnt,nearcnt,perpcnt,farcnt ; double cnorm,ainorm,aidotc,pi180,anglei ; double *c ; int *eqs,*noload ; ineq_struct *ineqs ; angle_struct *angles ; contyp_enum *ctyp ; double *rhs,*rhslow ; bool retval,need_angles ; pkvec_struct *ai ; const char *rtnnme = "cold_sortcons" ; # ifdef DYLP_STATISTICS int k ; # endif # ifdef DYLP_PARANOIA if (orig_sys == NULL) { errmsg(2,rtnnme,"orig_sys") ; return (FALSE) ; } if (p_eqs == NULL) { errmsg(2,rtnnme,"&eqs") ; return (FALSE) ; } if (p_ineqs == NULL) { errmsg(2,rtnnme,"&ineqs") ; return (FALSE) ; } if (p_noload == NULL) { errmsg(2,rtnnme,"&noload") ; return (FALSE) ; } # endif /* Allocate the equality, inequality, and noload data structures, if the client didn't supply them. */ if (*p_eqs == NULL) { eqs = (int *) MALLOC((orig_sys->concnt+1)*sizeof(int)) ; } else { eqs = *p_eqs ; } if (*p_ineqs == NULL) { ineqs = CALLOC(1,sizeof(ineq_struct)) ; ineqs->angles = (angle_struct *) MALLOC(orig_sys->concnt*sizeof(angle_struct)) ; } else { ineqs = *p_ineqs ; } if (*p_noload == NULL) { noload = (int *) MALLOC((orig_sys->concnt+1)*sizeof(int)) ; } else { noload = *p_noload ; } # ifdef DYLP_PARANOIA if (ineqs->angles == NULL) { errmsg(2,rtnnme,"angle array") ; return (FALSE) ; } # endif angles = ineqs->angles ; m = orig_sys->concnt ; n = orig_sys->varcnt ; retval = TRUE ; /* Scan orig_sys, sorting the constraints into eqs and ineqs->angles and discarding empty and nonbinding constraints and checking range constraints for prima facie infeasibility. */ ai = pkvec_new(0) ; eqcnt = 0 ; ineqcnt = 0 ; noloadcnt = 0 ; ctyp = orig_sys->ctyp ; rhs = orig_sys->rhs ; rhslow = orig_sys->rhslow ; for (i = 1 ; i <= m ; i++) { if (ctyp[i] == contypNB) { dy_lp->sys.cons.unloadable++ ; dy_lp->sys.cons.loadable-- ; noload[++noloadcnt] = i ; # ifndef DYLP_NDEBUG if (dy_opts->print.setup >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tskipping nonbinding constraint %s (%d).", consys_nme(orig_sys,'c',i,FALSE,NULL),i) ; } # endif continue ; } if (ctyp[i] == contypRNG) { if (rhs[i] < rhslow[i]) { # ifndef DYLP_NDEBUG if (dy_opts->print.setup >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n Prima facie infeasibility for %s (%d),", consys_nme(orig_sys,'c',i,FALSE,NULL),i) ; dyio_outfmt(dy_logchn,dy_gtxecho," rhslow = %g > rhs = %g.", rhslow[i],rhs[i]) ; } # endif dy_lp->lpret = lpINFEAS ; } } if (consys_getrow_pk(orig_sys,i,&ai) == FALSE) { errmsg(122,rtnnme,orig_sys->nme,"row", consys_nme(orig_sys,'c',i,TRUE,NULL),i) ; retval = FALSE ; break ; } if (ai->cnt == 0) { dy_lp->sys.cons.unloadable++ ; dy_lp->sys.cons.loadable-- ; noload[++noloadcnt] = i ; # ifndef DYLP_NDEBUG if (dy_opts->print.setup >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tskipping empty constraint %s (%d).", consys_nme(orig_sys,'c',i,FALSE,NULL),i) ; } # endif } else { if (ctyp[i] == contypEQ) { eqs[++eqcnt] = i ; } else { angles[ineqcnt++].ndx = i ; } } } if (ai != NULL) pkvec_free(ai) ; eqs[0] = eqcnt ; ineqs->cnt = ineqcnt ; noload[0] = noloadcnt ; # ifndef DYLP_NDEBUG if (dy_opts->print.setup >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n found %d equalities, %d inequalities", eqcnt,ineqcnt) ; if (noloadcnt != 0) { dyio_outfmt(dy_logchn,dy_gtxecho,", discarded %d empty/nonbinding rows", noloadcnt) ; } dyio_outchr(dy_logchn,dy_gtxecho,'.') ; } # endif # ifdef DYLP_PARANOIA if (dy_lp->sys.cons.loadable+dy_lp->sys.cons.unloadable != orig_sys->concnt) { errmsg(1,rtnnme,__LINE__) ; retval = FALSE ; } # endif if (retval == FALSE) { if (*p_eqs == NULL && eqs != NULL) FREE(eqs) ; if (*p_ineqs == NULL && ineqs != NULL) { if (ineqs->angles != NULL) FREE(angles) ; FREE(ineqs) ; } if (*p_noload == NULL && noload != NULL) FREE(noload) ; return (FALSE) ; } /* Now, how much more work do we need to do? Decide if we need to calculate angles. */ need_angles = TRUE ; if (dy_opts->fullsys == TRUE) need_angles = FALSE ; # ifdef DYLP_STATISTICS need_angles = TRUE ; # endif # ifndef DYLP_NDEBUG if (dy_opts->print.setup >= 2) need_angles = TRUE ; # endif /* If we need the angles, get down to it. Calculate angle(a,c) = (180/pi)*arccos(dot(a,c)/(||a||||c||)) for each inequality, then sort the list of inequalities. */ if (need_angles == TRUE) { c = orig_sys->obj ; nearcnt = 0 ; perpcnt = 0 ; farcnt = 0 ; cnorm = exvec_2norm(c,n) ; pi180 = 180/acos(-1.0) ; # ifndef DYLP_NDEBUG if (dy_opts->print.setup >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t||c|| = %.4f",cnorm) ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tConstraint\t\t||a||\t(c/||c||).(a/||a||)\tangle") ; } # endif for (ndx = 0 ; ndx < ineqcnt ; ndx++) { i = angles[ndx].ndx ; aidotc = consys_dotrow(orig_sys,i,c) ; if (withintol(aidotc,0,dy_tols->zero)) { # ifndef DYLP_NDEBUG ainorm = consys_2normrow(orig_sys,i) ; # endif anglei = 90 ; } else { ainorm = consys_2normrow(orig_sys,i) ; anglei = pi180*acos(aidotc/(ainorm*cnorm)) ; } angles[ndx].angle = anglei ; if (anglei > 90) { nearcnt++ ; } else if (anglei < 90) { farcnt++ ; } else { perpcnt++ ; } # ifndef DYLP_NDEBUG if (dy_opts->print.setup >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t%-10s (%3d) %12.4f %18.10f%15.6f", consys_nme(orig_sys,'c',i,FALSE,NULL),i, ainorm,aidotc/(ainorm*cnorm),anglei) ; } # endif } # ifndef DYLP_NDEBUG if (dy_opts->print.setup >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n inequality partition %d near, %d perp, %d far.", nearcnt,perpcnt,farcnt) ; } # endif ineqs->perp = nearcnt ; ineqs->far = nearcnt+perpcnt ; qsort(&angles[0],ineqcnt,sizeof(angle_struct),near_perp_far) ; } # ifdef DYLP_STATISTICS /* If we're collecting full statistics, record the angle for each inequality and calculate a histogram (36 5 degree bins and a dedicated 90 degree bin). This could have been folded into the previous loop, but it's more clear as a separate loop. Bins below 90 degrees include their lower bound, bins above 90 degrees include their upper bound. */ if (dy_stats != NULL) { for (ndx = 0 ; ndx < ineqcnt ; ndx++) { i = angles[ndx].ndx ; anglei = angles[ndx].angle ; dy_stats->cons.angle[i] = anglei ; if (anglei == 90) { dy_stats->angle.hist[DYSTATS_HISTBINS-1]++ ; } else { if (anglei < 90) { k = (int) floor(anglei/5) ; } else { k = (int) ceil(anglei/5)-1 ; } k = minn(k,(DYSTATS_HISTBINS-1)) ; dy_stats->angle.hist[k]++ ; } if (anglei > dy_stats->angle.max) { dy_stats->angle.max = (float) anglei ; } if (anglei < dy_stats->angle.min) { dy_stats->angle.min = (float) anglei ; } } } # endif /* Set up the return values and we're done. */ if (*p_eqs == NULL) *p_eqs = eqs ; if (*p_ineqs == NULL) *p_ineqs = ineqs ; if (*p_noload == NULL) *p_noload = noload ; return (TRUE) ; } static bool cold_createdysys (consys_struct *orig_sys, int eqcnt, int ineqcnt) /* This routine creates the dy_sys constraint system and attaches the translation vectors that are used to move between the original (orig_sys) and active (dy_sys) constraint systems. While unrelated to creating dy_sys, it turns out that this routine is a convenient place for another pre-loading activity, grooming the bounds on variables in orig_sys and assigning an initial status to the inactive variables. Where lb > ub, indicate prima facie infeasibility. Where |ub - lb| < dy_tols->pfeas, the bounds are forced to equality and the variable is marked as fixed (NBFX). (This sort of thing can happen when a client program is tweaking the bounds on variables.) This may or may not be visible to the client --- depends on whether dylp has made a local copy of the constraint system. Variables which are not fixed are arbitrarily set to the bound that best matches their objective coefficient. What's a good estimate of maximum size? If the fullsys option is specified, just use the original constraint system size. Otherwise, take the attitude that some (user) specified fraction of the original constraints and variables (active.cons, active.vars) could be active at any one time while we're solving the LP. This is purely for efficiency -- if we're undersized, the system will automatically expand. Given that all equalities are loaded, initcons.frac is interpreted as the initial fraction of inequalities that should be loaded. Again, for efficiency active.cons should be greater than initcons.frac. dy_sys is created with logicals enabled. Parameters: orig_sys: the original constraint system eqcnt: the number of equalities in orig_sys ineqcnt: the number of inequalities in orig_sys Returns: TRUE if the system is created without error, FALSE otherwise. */ { int m_sze,n_sze ; char nmebuf[50] ; flags parts = CONSYS_OBJ|CONSYS_VUB|CONSYS_VLB|CONSYS_RHS|CONSYS_RHSLOW| CONSYS_VTYP|CONSYS_CTYP, opts = CONSYS_LVARS|CONSYS_WRNATT ; const char *rtnnme = "cold_createdysys" ; /* Settle the appropriate size for dy_sys, and create the consys structure. The variable capacity is set to accommodate logicals. */ dyio_outfxd(nmebuf,-((int) (sizeof(nmebuf)-1)), 'l',"%s[actv]",orig_sys->nme) ; if (dy_opts->fullsys == TRUE) { m_sze = orig_sys->concnt ; n_sze = orig_sys->archvcnt+m_sze ; } else { m_sze = eqcnt+((int) orig_sys->concnt*dy_opts->active.cons) ; n_sze = (int) (orig_sys->archvcnt*dy_opts->active.vars+m_sze) ; } # ifndef DYLP_NDEBUG if (dy_opts->print.setup >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n creating constraint system %s (%d x %d)", nmebuf,m_sze,n_sze) ; } # endif dy_sys = consys_create(nmebuf,parts,opts,m_sze,n_sze,dy_tols->inf) ; if (dy_sys == NULL) { errmsg(152,rtnnme,nmebuf) ; return (FALSE) ; } /* Hang a set of translation vectors onto each system: origcons and origvars on orig_sys, and actcons and actvars on dy_sys. dy_origvars is cleared to 0 as it's attached, and this is important to indicate that the original variables have no predefined status. Note that we won't leak memory here, even if there's an error. Any attached vectors will be deleted when dy_sys is deleted. */ dy_actvars = NULL ; if (consys_attach(dy_sys,CONSYS_ROW, sizeof(int),(void **) &dy_actvars) == FALSE) { errmsg(100,rtnnme,dy_sys->nme,"active -> original variable map") ; return (FALSE) ; } dy_actcons = NULL ; if (consys_attach(dy_sys,CONSYS_COL, sizeof(int),(void **) &dy_actcons) == FALSE) { errmsg(100,rtnnme,dy_sys->nme,"active -> original constraint map") ; return (FALSE) ; } dy_origvars = NULL ; if (consys_attach(orig_sys,CONSYS_ROW, sizeof(int),(void **) &dy_origvars) == FALSE) { errmsg(100,rtnnme,orig_sys->nme,"original -> active variable map") ; return (FALSE) ; } dy_origcons = NULL ; if (consys_attach(orig_sys,CONSYS_COL, sizeof(int),(void **) &dy_origcons) == FALSE) { errmsg(100,rtnnme,orig_sys->nme,"original -> active constraint map") ; return (FALSE) ; } return (TRUE) ; } static bool cold_scanvars (consys_struct *orig_sys) /* Assign a status to all variables in orig_sys. There are lots of reasons for doing this right off the top: * We can use origvars == 0 as a paranoid check from here on out. * It's not uncommon for people to fix variables in an MPS model. This takes them out of consideration right from the start. Assign status NBFX and mark them as ineligible for activation. * dylp's intended use is in branch-and-cut codes, which tend to update bounds on a regular basis. This can result in bounds which are not precisely equal, but are within the primal feasibility tolerance of one another. The variable is fixed, for all practical purposes, but it's a `dirty' fix. Push it to one bound or another and mark it ineligible for activation. * A careless client may hand us a model with prima facie infeasibility, lb > ub. We need to detect this and report it --- the main body of dylp does not react well to this situation. * More legitimate (but not by much), the client may hand us a model with variables that are only present in the objective. We can set these to bound based on the objective coefficient and mark them as ineligible for activation. If the appropriate bound is not finite, we can report unboundedness. * If there are no variables with upper and lower bounds (`flippable', in dual multipivot) then we might as well turn multipivot off. Parameters: orig_sys: the original constraint system Returns: TRUE if all goes well, FALSE otherwise. If prima facie infeasibility is detected, dy_lp->lpret is set to lpINFEAS. If prima facie unboundedness is detected, dy_lp->lpret is set to lpUNBOUNDED. */ { int j,flippable ; flags statj ; double *vlb,*vub,*obj ; double lj,uj,cj ; bool retval ; pkvec_struct *aj ; char *rtnnme = "cold_scanvars" ; retval = TRUE ; /* Prep, then open up a loop to do the scan. */ vlb = orig_sys->vlb ; vub = orig_sys->vub ; obj = orig_sys->obj ; flippable = 0 ; aj = pkvec_new(0) ; for (j = 1 ; j <= orig_sys->varcnt ; j++) { lj = vlb[j] ; uj = vub[j] ; cj = obj[j] ; /* Sort into cases. Variables with two finite bounds first. If we have a `dirty' fix, set the variable to one of the bounds and mark it ineligible for activation. If the bounds are crossed, note prima facie infeasibility. Otherwise, note that the variable is flippable and assign a status based on the objective coefficient. */ if (lj > -dy_tols->inf && uj < dy_tols->inf) { if (atbnd(lj,uj) && lj != uj) { if (cj < 0) { statj = vstatNBUB|vstatNOLOAD ; } else { statj = vstatNBLB|vstatNOLOAD ; } # ifndef DYLP_NDEBUG if (dy_opts->print.setup >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\tDirty fixed variable %s (%d)", consys_nme(orig_sys,'v',j,0,0),j) ; dyio_outfmt(dy_logchn,dy_gtxecho, " assigned status %s.",dy_prtvstat(statj)) ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t original lb = %g, ub = %g, diff = %g, tol = %g", lj,uj,uj-lj,dy_tols->pfeas) ; } # endif } else if (uj < lj) { dy_lp->lpret = lpINFEAS ; # ifndef DYLP_NDEBUG if (dy_opts->print.setup >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tPrima facie infeasibility for %s (%d), lb = %g > ub = %g.", consys_nme(orig_sys,'v',j,0,0),j,lj,uj) ; } # endif statj = vstatNBLB|vstatNOLOAD ; } else if (lj == uj) { statj = vstatNBFX|vstatNOLOAD ; # ifndef DYLP_NDEBUG if (dy_opts->print.setup >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\tFixed variable %s (%d) = %g", consys_nme(orig_sys,'v',j,0,0),j,lj) ; dyio_outfmt(dy_logchn,dy_gtxecho, " assigned status %s.",dy_prtvstat(statj)) ; } # endif } else { flippable++ ; if (cj < 0) { statj = vstatNBUB ; } else { statj = vstatNBLB ; } } } /* For variables with one finite bound, choose the finite bound as the initial status. If there are no finite bounds, we're left with NBFR. */ else if (lj > -dy_tols->inf) { statj = vstatNBLB ; } else if (uj < dy_tols->inf) { statj = vstatNBUB ; } else { statj = vstatNBFR ; } /* Check if the variable is not referenced by any constraint. Note that this isn't the definitive test. There's a variation of this pathology in which the client has left a nonbinding row in the system and the variable is referenced only by the nonbinding row. Doing the necessary work here fails the `make the common case fast' test. Doing the necessary work later is still questionable. See comments in dy_varmgmt::scanPrimVarStdAct. If we pass the test for boundedness, the status is already correct. Just mark it as ineligible for activation. */ if (consys_getcol_pk(orig_sys,j,&aj) == FALSE) { errmsg(122,rtnnme,dy_sys->nme,"column", consys_nme(dy_sys,'v',j,TRUE,NULL),j) ; retval = FALSE ; break ; } if (aj->cnt == 0) { if ((cj > 0 && lj <= -dy_tols->inf) || (cj < 0 && uj >= dy_tols->inf)) { dy_lp->lpret = lpUNBOUNDED ; dy_lp->z = -j ; # ifndef DYLP_NDEBUG if (dy_opts->print.setup >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tPrima facie unboundedness for %s (%d), ", consys_nme(orig_sys,'v',j,0,0),j) ; dyio_outfmt(dy_logchn,dy_gtxecho,"c = %g, lb = %g, ub = %g.", cj,lj,uj) ; } # endif } else { setflg(statj,vstatNOLOAD) ; # ifndef DYLP_NDEBUG if (dy_opts->print.setup >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tEmpty column for variable %s (%d),", consys_nme(orig_sys,'v',j,0,0),j,lj) ; dyio_outfmt(dy_logchn,dy_gtxecho, " assigned status %s,",dy_prtvstat(statj)) ; dyio_outfmt(dy_logchn,dy_gtxecho, " c = %g, lb = %g, ub = %g.",cj,lj,uj) ; } # endif } } dy_origvars[j] = -((int) statj) ; if (flgon(statj,vstatNOLOAD) == TRUE) { dy_lp->sys.vars.unloadable++ ; dy_lp->sys.vars.loadable-- ; } } if (aj != NULL) pkvec_free(aj) ; /* That's it for the scan loop. Disable dual multipivoting? Fairly arbitrarily, give 25% flippable variables as the threshold. */ # ifdef DYLP_STATISTICS if (dy_stats != NULL) dy_stats->dmulti.flippable = flippable ; # endif uj = ((double) flippable)/orig_sys->varcnt ; if (uj < .25 && dy_opts->dpsel.flex == TRUE) { dy_opts->dpsel.flex = FALSE ; dy_opts->dpsel.strat = 0 ; # ifndef DYLP_NDEBUG if (dy_opts->print.setup >= 2 || dy_opts->print.dual >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n %d (%.1f%%) flippable variables; disabling dual multipivot.", flippable,uj*100) ; } # endif } # ifdef DYLP_PARANOIA if (dy_lp->sys.vars.unloadable+dy_lp->sys.vars.loadable != orig_sys->varcnt) { errmsg(1,rtnnme,__LINE__) ; retval = FALSE ; } # endif return (retval) ; } static bool cold_loadfull (consys_struct *orig_sys, int *eqs, ineq_struct *ineqs) /* This routine loads the full original constraint system into dy_sys. It's just easier to handle this separate from the more complicated business of loading a partial system. Parameters: orig_sys: the original constraint system eqs: indices of equality constraints; eq[0] contains the number of valid entries ineqs: information on inequalities; only the number of inequalities and their indices are used here. Returns: TRUE if all constraints are loaded successfully, FALSE otherwise. */ { int i,ndx,eqcnt,ineqcnt ; bool retval ; angle_struct *angles ; const char *rtnnme = "cold_loadfull" ; eqcnt = eqs[0] ; ineqcnt = ineqs->cnt ; retval = TRUE ; /* Load any equalities first. */ if (eqcnt > 0) { for (ndx = 1 ; ndx <= eqcnt ; ndx++) { i = eqs[ndx] ; # ifndef DYLP_NDEBUG if (dy_opts->print.setup >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n activating %s %s (%d) ...", consys_prtcontyp(orig_sys->ctyp[i]), consys_nme(orig_sys,'c',i,FALSE,NULL),i) ; } # endif # ifdef DYLP_STATISTICS if (dy_stats != NULL) dy_stats->cons.init[i] = TRUE ; # endif if (dy_loadcon(orig_sys,i,TRUE,NULL) == FALSE) { errmsg(430,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "activate","constraint", consys_nme(orig_sys,'c',i,TRUE,NULL),i) ; retval = FALSE ; break ; } } # ifndef DYLP_NDEBUG if (dy_opts->print.setup >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n transferred %d equalities ...",eqcnt) ; } # endif if (retval == FALSE) { return (FALSE) ; } } /* And the inequalities. */ if (ineqcnt > 0) { angles = ineqs->angles ; for (ndx = 0 ; ndx < ineqcnt ; ndx++) { i = angles[ndx].ndx ; # ifndef DYLP_NDEBUG if (dy_opts->print.setup >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n activating %s %s (%d) ...", consys_prtcontyp(orig_sys->ctyp[i]), consys_nme(orig_sys,'c',i,FALSE,NULL),i) ; } # endif # ifdef DYLP_STATISTICS if (dy_stats != NULL) dy_stats->cons.init[i] = TRUE ; # endif if (dy_loadcon(orig_sys,i,TRUE,NULL) == FALSE) { errmsg(430,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "activate","constraint", consys_nme(orig_sys,'c',i,TRUE,NULL),i) ; retval = FALSE ; break ; } } # ifndef DYLP_NDEBUG if (dy_opts->print.setup >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n transferred %d inequalities ...",ineqcnt) ; } # endif } return (retval) ; } static bool cold_loadpartial (consys_struct *orig_sys, int *eqs, ineq_struct *ineqs) /* This routine loads some fraction of the original constraint system into dy_sys. As explained in the comments at the head of the file, the inequalities are sorted by angle(a,c). The client can specify one or two angular intervals, and the upper and lower bounds of each interval can be closed or open. Both intervals are sampled at the specified fractional rate. Parameters: orig_sys: the original constraint system eqs: indices of equality constraints; eq[0] contains the number of valid entries ineqs: information on inequalities; only the number of inequalities and their indices are used here. Returns: TRUE if all constraints are loaded successfully, FALSE otherwise. */ { int i,ndx,eqcnt,ineqcnt,ineq_actvcnt ; bool retval ; angle_struct *angles ; int intcnt,intndx ; double albs[2],aubs[2],alb,aub,dblndx,incr ; const char *rtnnme = "cold_loadpartial" ; eqcnt = eqs[0] ; ineqcnt = ineqs->cnt ; retval = TRUE ; /* Load any equalities first. */ if (eqcnt > 0) { for (ndx = 1 ; ndx <= eqcnt ; ndx++) { i = eqs[ndx] ; # ifndef DYLP_NDEBUG if (dy_opts->print.setup >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n activating %s %s (%d) ...", consys_prtcontyp(orig_sys->ctyp[i]), consys_nme(orig_sys,'c',i,FALSE,NULL),i) ; } # endif # ifdef DYLP_STATISTICS if (dy_stats != NULL) dy_stats->cons.init[i] = TRUE ; # endif if (dy_loadcon(orig_sys,i,TRUE,NULL) == FALSE) { errmsg(430,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "activate","constraint", consys_nme(orig_sys,'c',i,TRUE,NULL),i) ; retval = FALSE ; break ; } } # ifndef DYLP_NDEBUG if (dy_opts->print.setup >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n transferred %d equalities ...",eqcnt) ; } # endif if (retval == FALSE) { return (FALSE) ; } } /* If there are no inequalities, we're done. */ if (ineqcnt == 0) return (TRUE) ; /* Establish the number of intervals, angular boundaries, and fractional increment. Recall that constraints are sorted nonincreasing from 180 degrees to 0 degrees. To approximate an open interval, we pull in the specified bound by the zero tolerance; for a closed interval, we push it out. */ # ifndef DYLP_NDEBUG if (dy_opts->print.setup >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n inequalities: sampling %.2f, %c %.4f %.4f %c", dy_opts->initcons.frac, (dy_opts->initcons.i1uopen == TRUE)?'(':'[', dy_opts->initcons.i1u,dy_opts->initcons.i1l, (dy_opts->initcons.i1lopen == TRUE)?')':']') ; if (dy_opts->initcons.i2valid == TRUE) { dyio_outfmt(dy_logchn,dy_gtxecho,", %c %.4f %.4f %c", (dy_opts->initcons.i2uopen == TRUE)?'(':'[', dy_opts->initcons.i2u,dy_opts->initcons.i2l, (dy_opts->initcons.i2lopen == TRUE)?')':']') ; } } # endif incr = 1/dy_opts->initcons.frac ; if (dy_opts->initcons.i1lopen == TRUE) { albs[0] = dy_opts->initcons.i1l+dy_tols->zero ; } else { albs[0] = dy_opts->initcons.i1l-dy_tols->zero ; } if (dy_opts->initcons.i1uopen == TRUE) { aubs[0] = dy_opts->initcons.i1u-dy_tols->zero ; } else { aubs[0] = dy_opts->initcons.i1u+dy_tols->zero ; } if (dy_opts->initcons.i2valid == TRUE) { if (dy_opts->initcons.i2lopen == TRUE) { albs[1] = dy_opts->initcons.i2l+dy_tols->zero ; } else { albs[1] = dy_opts->initcons.i2l-dy_tols->zero ; } if (dy_opts->initcons.i2uopen == TRUE) { aubs[1] = dy_opts->initcons.i2u-dy_tols->zero ; } else { aubs[1] = dy_opts->initcons.i2u+dy_tols->zero ; } intcnt = 2 ; } else { intcnt = 1 ; } angles = ineqs->angles ; ineq_actvcnt = 0 ; /* The outer loop is just to avoid replicating code for each interval. */ ndx = 0 ; for (intndx = 0 ; intndx < intcnt ; intndx++) { alb = albs[intndx] ; aub = aubs[intndx] ; /* Scan to the upper boundary of the interval. Consider the possibility that we might run off the end of angles. An easy and all too common example: the intervals exclude 90 degrees, and all inequalities are at 90 degrees to the objective. This is an artifact of a modelling style in which the objective function is a single variable z, constrained to be equal to the real objective cx. Then z appears only in the single equality z - cx = 0. */ while (ndx < ineqcnt && angles[ndx].angle > aub) ndx++ ; dblndx = ndx ; /* Now the actual loading loop. We load the constraint, then move ndx to the next value according to the sampling fraction. */ while (ndx < ineqcnt && angles[ndx].angle > alb) { i = angles[ndx].ndx ; # ifndef DYLP_NDEBUG if (dy_opts->print.setup >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n activating %s %s (%d) %g off 90 ...", consys_prtcontyp(orig_sys->ctyp[i]), consys_nme(orig_sys,'c',i,FALSE,NULL),i, (angles[ndx].angle-90)) ; } # endif # ifdef DYLP_STATISTICS if (dy_stats != NULL) dy_stats->cons.init[i] = TRUE ; # endif if (dy_loadcon(orig_sys,i,TRUE,NULL) == FALSE) { errmsg(430,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "activate","constraint", consys_nme(orig_sys,'c',i,TRUE,NULL),i) ; retval = FALSE ; break ; } ineq_actvcnt++ ; dblndx += incr ; ndx = (int) dblndx ; } } /* That's it. A little information and we're out of here. */ # ifndef DYLP_NDEBUG if (dy_opts->print.setup >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n transferred %d inequalities ...",ineq_actvcnt) ; } # endif return (retval) ; } dyret_enum dy_coldstart (consys_struct *orig_sys) /* This routine is responsible for setting up the lp problem that'll be solved by dylp. It creates the lp and constraint system structures (dy_lp and dy_sys, respectively) and oversees the load of the initial constraint system. Parameters: orig_sys: The original constraint system Returns: dyrOK if the setup completes without error, dyrFATAL otherwise. */ { int i,j,ndx,n,eqcnt,ineqcnt,noloadcnt ; double *vlb,*vub,*obj ; double vlbj,vubj,objj ; flags statj ; int *eqs,*noload ; ineq_struct *ineqs ; # ifndef DYLP_NDEBUG int nbfxcnt = 0 ; # endif bool retval ; const char *rtnnme = "dy_coldstart" ; /* Initialise the statistics on loadable/unloadable variables and constraints. */ dy_lp->sys.forcedfull = FALSE ; dy_lp->sys.vars.loadable = orig_sys->varcnt ; dy_lp->sys.vars.unloadable = 0 ; dy_lp->sys.cons.loadable = orig_sys->concnt ; dy_lp->sys.cons.unloadable = 0 ; /* To get started, sort the constraints into equalities and inequalities. If we're loading a partial active system, the inequalities will also be sorted by angle from the objective function. */ eqs = NULL ; ineqs = NULL ; noload = NULL ; retval = cold_sortcons(orig_sys,&eqs,&ineqs,&noload) ; if (retval == FALSE) { errmsg(312,rtnnme, orig_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; if (eqs != NULL) FREE(eqs) ; if (ineqs != NULL) { if (ineqs->angles != NULL) FREE(ineqs->angles) ; FREE(ineqs) ; } if (noload != NULL) FREE(noload) ; return (dyrFATAL) ; } eqcnt = eqs[0] ; ineqcnt = ineqs->cnt ; /* Next, create dy_sys and attach the translation vectors that will allow us to move between the original and active systems. */ retval = cold_createdysys(orig_sys,eqcnt,ineqcnt) ; if (retval == FALSE) { if (eqs != NULL) FREE(eqs) ; if (ineqs != NULL) { if (ineqs->angles != NULL) FREE(ineqs->angles) ; FREE(ineqs) ; } if (noload != NULL) FREE(noload) ; return (dyrFATAL) ; } /* Do an initial scan of the variables. Assign initial status, deal with a few pathological cases, and detect prima facie infeasibility and unboundedness. */ retval = cold_scanvars(orig_sys) ; if (retval == FALSE) { if (eqs != NULL) FREE(eqs) ; if (ineqs != NULL) { if (ineqs->angles != NULL) FREE(ineqs->angles) ; FREE(ineqs) ; } if (noload != NULL) FREE(noload) ; return (dyrFATAL) ; } /* Mark the constraints that are ineligible for loading and dispose of noload. */ noloadcnt = noload[0] ; if (noloadcnt > 0) { for (ndx = 1 ; ndx <= noloadcnt ; ndx++) { i = noload[ndx] ; MARK_UNLOADABLE_CON(i) ; } } if (noload != NULL) FREE(noload) ; /* Transfer the required constraints. Once this is done, we're finished with the lists of equalities and inequalities. There's a pathology we may need to deal with here. It can happen that the client is negligent and passes in a constraint system which contains nonbinding rows and variables which are referenced only in the nonbinding rows. If we're running in dynamic mode, these variables will be found during normal variable activation. But if we're running in fullsys mode, there will be no second chance. Check for the situation and deal with it. */ if (dy_opts->fullsys == TRUE) { retval = cold_loadfull(orig_sys,eqs,ineqs) ; dy_lp->sys.forcedfull = TRUE ; if (retval == TRUE && dy_sys->archvcnt+dy_lp->sys.vars.unloadable < orig_sys->varcnt) { # ifndef DYLP_NDEBUG if (dy_opts->print.setup >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n system %s has %d variables referenced only by nonbinding rows.", orig_sys->nme, (orig_sys->varcnt-(dy_sys->archvcnt+dy_lp->sys.vars.unloadable))) ; } # endif } } else { retval = cold_loadpartial(orig_sys,eqs,ineqs) ; dy_lp->sys.forcedfull = FALSE ; } if (eqs != NULL) FREE(eqs) ; if (ineqs != NULL) { if (ineqs->angles != NULL) FREE(ineqs->angles) ; FREE(ineqs) ; } if (retval == FALSE) { errmsg(313,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, orig_sys->nme) ; return (dyrFATAL) ; } /* Scan the variables in orig_sys once again and calculate the correction to the objective function. (loadcon handled any rhs adjustments for the constraints it loaded.) Inactive free variables are assumed to be 0. */ n = orig_sys->varcnt ; vlb = orig_sys->vlb ; vub = orig_sys->vub ; obj = orig_sys->obj ; dy_lp->inactzcorr = 0 ; for (j = 1 ; j <= n ; j++) { if (INACTIVE_VAR(j)) { statj = (flags) (-dy_origvars[j]) ; clrflg(statj,vstatNOLOAD) ; vlbj = vlb[j] ; vubj = vub[j] ; objj = obj[j] ; switch (statj) { case vstatNBLB: case vstatNBFX: { dy_lp->inactzcorr += objj*vlbj ; # ifndef DYLP_NDEBUG if (statj == vstatNBFX) nbfxcnt++ ; # endif break ; } case vstatNBUB: { dy_lp->inactzcorr += objj*vubj ; break ; } } } } /* Paranoid checks and informational print statements. Apologies for abusing previously declared variables for the print loop. */ # ifdef DYLP_PARANOIA if (dy_chkdysys(orig_sys) == FALSE) return (dyrFATAL) ; # endif # ifndef DYLP_NDEBUG if (dy_opts->print.setup >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n system %s has %d constraints, (%d+%d) variables", dy_sys->nme,dy_sys->concnt,dy_sys->archvcnt,dy_sys->logvcnt) ; dyio_outfmt(dy_logchn,dy_gtxecho,"\n %d constraints, %d variables ", orig_sys->concnt-dy_sys->concnt, orig_sys->archvcnt-dy_sys->archvcnt) ; if (nbfxcnt > 0) dyio_outfmt(dy_logchn,dy_gtxecho," (%d fixed)",nbfxcnt) ; dyio_outfmt(dy_logchn,dy_gtxecho, " remain inactive in system %s.",orig_sys->nme) ; if (dy_lp->sys.cons.unloadable > 0 || dy_lp->sys.vars.unloadable > 0) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n %d constraints, %d variables unloadable.", dy_lp->sys.cons.unloadable,dy_lp->sys.vars.unloadable) ; } if (dy_opts->print.setup >= 6) { vubj = 0 ; for (j = 1 ; j <= n ; j++) { if (INACTIVE_VAR(j)) { statj = (flags)(-dy_origvars[j]) ; switch (getflg(statj,vstatSTATUS)) { case vstatNBUB: { vlbj = vub[j] ; break ; } case vstatNBLB: { vlbj = vlb[j] ; break ; } case vstatNBFX: case vstatNBFR: { vlbj = 0 ; break ; } default: { errmsg(433,rtnnme,dy_sys->nme, dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "inactive",consys_nme(orig_sys,'v',j,TRUE,NULL), j,dy_prtvstat(statj)) ; return (dyrFATAL) ; } } if (vlbj != 0) { if (vubj == 0) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tinactive variables with nonzero values:") ; } vubj++ ; dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t%s (%d) = %g, status %s", consys_nme(orig_sys,'v',j,FALSE,NULL),j,vlbj, dy_prtvstat(statj)) ; } } } if (vubj == 0) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tall inactive variables are zero.") ; } } } # endif return (dyrOK) ; } /* Routines to select an initial basis. dylp offers three types of starting basis: logical: Basis positions occupied by inequalities are covered with slack variables. Basis positions occupied by equalities are covered with artificial variables. This is the standard starting basis. slack: Basis positions occupied by inequalities are covered with slack variables. For basis positions occupied by equalities, an attempt is made to select architectural variables before falling back on artificial variables. architectural: For all basis positions, an attempt is made to cover the position with an architectural variable, before falling back on a slack or artificial. The selection process is performed in a way that will use an architectural to cover an equality before considering inequalities. As Bixby notes in an ORSA JOC article, crash is often taken to mean trying to guess the optimal basis. That's part of what's happening here, but not all. Architectural is chosen as the default basis type on the grounds that the default algorithms used in dy_coldstart and subsidiary routines are trying to choose constraints that will be tight at optimum. So it makes sense to build an initial basis with as few basic logicals as possible. But just as important, dy_crash and subsidiary routines try to select variables with an eye for numerical stability and ease of factorization. The algorithms used here to construct the slack and architectural basis styles had their roots in Bixby's article: Bixby, R., "Implementing the Simplex Method: The Initial Basis", ORSA J. on Computing, 4(3), Summer, 1992, pp. 267-284. */ /* Some utility declarations used in building the initial basis. The ibrank structure holds information useful in selecting architectural variable for inclusion in the initial basis. The function ib_archvcomp is used by qsort to sort the list of eligible candidates. ibrank_struct bndcnt and nonzero are used for the initial sort of the architecturals. If the matrix has been scaled, ajmax = 1 by definition for every row and column. But if the matrix hasn't been scaled, it's useful to know the maximum. Field Definition ----- ---------- ndx The index of the variable bndcnt The number of bounds nonzero The number of nonzero coefficients in the column ajmax The largest value in the column */ typedef struct { int ndx ; int bndcnt ; int nonzero ; double ajmax ; } ibrank_struct ; static int ib_archvcomp (const void *elem1, const void *elem2) /* This function is called by qsort to compare architectural variables. The comparison is calculated using the following criteria: * Number of bounds: free variables (no finite bounds) are best, followed by variables with one finite bound, then two finite bounds * Number of coefficients in the column: Fewer coefficients are preferable, as this will tend to minimize the work during factoring. */ { const ibrank_struct *v1,*v2 ; v1 = (const ibrank_struct *) elem1 ; v2 = (const ibrank_struct *) elem2 ; if (v1->bndcnt < v2->bndcnt) { return (-1) ; } else if (v1->bndcnt > v2->bndcnt) { return (1) ; } else if (v1->nonzero < v2->nonzero) { return (-1) ; } else if (v1->nonzero > v2->nonzero) { return (1) ; } else { return (0) ; } } static bool ib_archvrank (int *p_cnt, ibrank_struct **p_archvars) /* This routine sorts the architectural variables in preparation for constructing the initial basis. It scans the architectural variables, compiling information on the eligible candidates in archvars, and returns a sorted list. The ranking criteria are explained above in the comments for ib_archvcomp (the comparison function passed to qsort). Parameters: p_cnt: (o) the number of eligible variables returned in p_archvars p_archvars: (i) empty crashrank_struct vector of sufficient size; if NULL, one will be allocated (o) list of eligible architectural variables, sorted in order of preference for inclusion in the basis; may be NULL if there are no candidates (extremely unlikely) Returns: TRUE if the sort concludes without error, FALSE otherwise */ { int j,m,n,eligible ; double *vlb,*vub ; double vlbj,vubj ; pkvec_struct *aj ; ibrank_struct *archvars ; bool scaled,retval ; const char *rtnnme = "ib_archvrank" ; # ifndef DYLP_NDEBUG int freecnt,onebndcnt,twobndcnt ; freecnt = 0 ; onebndcnt = 0 ; twobndcnt = 0 ; # endif retval = TRUE ; vlb = dy_sys->vlb ; vub = dy_sys->vub ; /* Did the client supply a vector? If not, allocate one. */ if (*p_archvars == NULL) { archvars = (ibrank_struct *) MALLOC(dy_sys->archvcnt*sizeof(ibrank_struct)) ; } else { archvars = *p_archvars ; } /* Scan the architecturals, recording the necessary information in archvars. Fixed variables should not be loaded, so we should not see them here. If the constraint system has not been scaled, recover the maximum coefficient for the column. */ n = dy_sys->varcnt ; m = dy_sys->logvcnt ; scaled = dy_isscaled() ; eligible = 0 ; aj = pkvec_new(0) ; for (j = m+1 ; j <= n ; j++) { if (consys_getcol_pk(dy_sys,j,&aj) == FALSE) { errmsg(122,rtnnme,dy_sys->nme,"column", consys_nme(dy_sys,'v',j,TRUE,NULL),j) ; retval = FALSE ; break ; } archvars[eligible].ndx = j ; archvars[eligible].nonzero = aj->cnt ; if (scaled) { archvars[eligible].ajmax = 1.0 ; } else { archvars[eligible].ajmax = consys_infnormcol(dy_sys,j) ; } vlbj = vlb[j] ; vubj = vub[j] ; if (vlbj > -dy_tols->inf && vubj < dy_tols->inf) { archvars[eligible].bndcnt = 2 ; # ifdef DYLP_PARANOIA if (vlbj == vubj) { errmsg(1,rtnnme,__LINE__) ; retval = FALSE ; break ; } # endif # ifndef DYLP_NDEBUG twobndcnt++ ; # endif } else if (vlbj > -dy_tols->inf || vubj < dy_tols->inf) { archvars[eligible].bndcnt = 1 ; # ifndef DYLP_NDEBUG onebndcnt++ ; # endif } else { archvars[eligible].bndcnt = 0 ; # ifndef DYLP_NDEBUG freecnt++ ; # endif } eligible++ ; } # ifndef DYLP_NDEBUG if (dy_opts->print.crash >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t%d eligible architecturals: %d free, %d 1-bound, %d 2-bound", eligible,freecnt,onebndcnt,twobndcnt) ; } # endif if (aj != NULL) pkvec_free(aj) ; if (retval == FALSE) { if (archvars != NULL) FREE(archvars) ; return (FALSE) ; } /* And sort them. If there aren't any candidates, and we supplied the vector for archvars, release it. */ if (eligible > 1) { qsort(&archvars[0],eligible,sizeof(ibrank_struct),ib_archvcomp) ; } else if (eligible == 0) { if (*p_archvars == NULL) { if (archvars != NULL) FREE(archvars) ; archvars = NULL ; } } /* Return the sorted list. */ *p_cnt = eligible ; *p_archvars = archvars ; return (TRUE) ; } static int ib_archvselect (int cnt, ibrank_struct *vars) /* This routine tries to populate the basis using the ranked architectural variables listed in vars. Equalities are examined first, because if we can't cover them with architectural variables, we'll have to use artificials. The variables in vars are already ranked according to how desireable it is to place them in the basis, taking into account bounds and number of nonzeros in a column. Here we'll try to allocate the variables to basis positions based on the pivot element a, and a notion that in an ideal world we'd like to construct a lower diagonal basis matrix. Why lower diagonal? Because we can turn it into a diagonal matrix, which is trivially easy to invert! To require that the columns we select conform strictly to the lower diagonal view, when we pick a pivot a, we would need to require that a = 0, k < i. In practice, this is pretty restrictive. So we settle for requiring that elimination using multiples of rows a, k < i, have minimal impact on our chosen pivot a. We do this by requiring that coefficients a, k < i, be small compared to the pivots a: specifically, a < .1 a. (If you're having trouble visualising this, you might want to go off and do a quick 3x3 example about now.) As we're selecting, we also try to pay a bit of attention to numerical stability. If the matrix is scaled, the maximum coefficient in each row and column is 1.0, and we simply require |a| > .9. If the matrix is unscaled, well, we settle for |a/a| > .9. (Arguably we should also look at a, but if you're really having stability trouble, you should consider allowing dylp to scale the matrix.) Note that we don't have to make marginal choices here --- we'll fill any vacant positions with the logical (slack or artificial) for the constraint. Parameters: cnt: the number of variables in vars vars: ranked vector of architectural variables Returns: the number of basis positions covered, or -1 if an error occurs. */ { int i,j,m,ndx,pkndx,covered ; double ratio ; double *estpiv ; ibrank_struct *var ; bool scaled,select ; pkvec_struct *aj ; pkcoeff_struct *aij ; dyret_enum retval ; const char *rtnnme = "ib_archvselect" ; # ifndef DYLP_NDEBUG int bndcnt ; double maxratio ; # endif retval = 0 ; ratio = 0 ; /* Allocate bookkeeping arrays. */ m = dy_sys->concnt ; scaled = dy_isscaled() ; aj = NULL ; estpiv = (double *) MALLOC((m+1)*sizeof(double)) ; for (i = 1 ; i <= m ; i++) estpiv[i] = dy_tols->inf ; covered = 0 ; /* Open a loop to scan vars and attempt to use each variable. */ for (ndx = 0 ; ndx < cnt ; ndx++) { var = &vars[ndx] ; j = var->ndx ; if (consys_getcol_pk(dy_sys,j,&aj) == FALSE) { errmsg(122,rtnnme,dy_sys->nme,"column", consys_nme(dy_sys,'v',j,TRUE,NULL),j) ; retval = -1 ; break ; } # ifndef DYLP_NDEBUG bndcnt = 0 ; if (dy_sys->vlb[j] > -dy_tols->inf) bndcnt++ ; if (dy_sys->vub[j] < dy_tols->inf) bndcnt++ ; maxratio = -1.0 ; # endif /* Scan the column: We need a coefficient in an uncovered row (dy_basis[i] == 0) which satisfies the stability criteria (ratio > .9). The coefficients we scan before finding a suitable pivot can't do too much damage to our goal of lower diagonal (|aij->val| < .1*estpiv[i]). NOTE: Scan order is crucially important here. We need to consider equalities before inequalities in order to minimize eventual use of artificials to cover equalities. Because of the way dy_sys is loaded (equalities first) and the way consys augments columns (new coefficients go at the front) we need to scan from back to front in order to consider equalities first. */ select = FALSE ; for (pkndx = aj->cnt-1 ; pkndx >= 0 ; pkndx--) { aij = &aj->coeffs[pkndx] ; i = aij->ndx ; ratio = fabs(aij->val) ; if (!scaled) ratio /= var->ajmax ; if (dy_basis[i] == 0) { if (ratio > .9) { select = TRUE ; break ; } # ifndef DYLP_NDEBUG else { if (maxratio < ratio) maxratio = ratio ; } # endif } else { if (ratio > .1*estpiv[i]) break ; } } /* Did we select this variable? If so, install it. If we have a full basis, break out of the search loop. */ if (select == TRUE) { dy_basis[i] = j ; dy_var2basis[j] = i ; estpiv[i] = ratio ; covered++ ; # ifndef DYLP_NDEBUG if (dy_opts->print.crash >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t adding %s (%d) (%d bounds)", consys_nme(dy_sys,'v',j,FALSE,NULL),j,bndcnt) ; dyio_outfmt(dy_logchn,dy_gtxecho," to cover %s %s (%d),", consys_prtcontyp(dy_sys->ctyp[i]), consys_nme(dy_sys,'c',i,FALSE,NULL),i) ; dyio_outfmt(dy_logchn,dy_gtxecho," |a<%d,%d>/max(a<*,%d>)| = %g.", i,j,j,ratio) ; } # endif if (covered == m) break ; } # ifndef DYLP_NDEBUG else if (dy_opts->print.crash >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t rejected %s (%d) (%d bounds)", consys_nme(dy_sys,'v',j,FALSE,NULL),j,bndcnt) ; if (pkndx >= 0) { dyio_outfmt(dy_logchn,dy_gtxecho,"; lower diag violation at .1;") ; dyio_outfmt(dy_logchn,dy_gtxecho, " a<%d,%d> = %g, estpiv<%d> = %g, ratio %g.", i,j,ratio,i,estpiv[i],ratio/estpiv[i]) ; } else { if (maxratio > 0) { dyio_outfmt(dy_logchn,dy_gtxecho," at %g < .9; no suitable pivots.", maxratio) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho, " no non-zeroes in uncovered rows.") ; } } } # endif } if (aj != NULL) pkvec_free(aj) ; if (estpiv != NULL) FREE(estpiv) ; if (retval < 0) return (retval) ; /* We're done. Print a summary and return. */ # ifndef DYLP_NDEBUG { if (dy_opts->print.crash >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n added %d architectural variables.",covered) ; } } # endif return (covered) ; } static int ib_slackselect (void) /* This routine will populate the basis slots corresponding to inequalities using the logical (slack) variable for the inequality. Parameters: none Returns: the number of basis slots filled. */ { int i,m,covered ; contyp_enum *ctyp ; /* Walk the constraints, installing the logical for each inequality. */ m = dy_sys->concnt ; ctyp = dy_sys->ctyp ; covered = 0 ; for (i = 1 ; i <= m ; i++) { if (ctyp[i] != contypEQ && dy_basis[i] == 0) { dy_basis[i] = i ; dy_var2basis[i] = i ; covered++ ; # ifndef DYLP_NDEBUG if (dy_opts->print.crash >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t adding %s (%d)", consys_nme(dy_sys,'v',i,FALSE,NULL),i) ; dyio_outfmt(dy_logchn,dy_gtxecho," to cover %s (%d).", consys_nme(dy_sys,'c',i,FALSE,NULL),i) ; } # endif } } # ifndef DYLP_NDEBUG if (dy_opts->print.crash >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n added %d slack/surplus variables.",covered) ; } # endif return (covered) ; } static int ib_artifselect (void) /* This routine will populate the basis slots corresponding to equalities using the logical (artificial) variable for the equality. Parameters: none Returns: the number of basis slots filled */ { int i,m,covered ; contyp_enum *ctyp ; /* Walk the constraints, installing the logical for each inequality. */ m = dy_sys->concnt ; ctyp = dy_sys->ctyp ; covered = 0 ; for (i = 1 ; i <= dy_sys->concnt ; i++) { if (ctyp[i] == contypEQ && dy_basis[i] == 0) { dy_basis[i] = i ; dy_var2basis[i] = i ; covered++ ; # ifndef DYLP_NDEBUG if (dy_opts->print.crash >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t adding %s (%d)", consys_nme(dy_sys,'v',i,FALSE,NULL),i) ; dyio_outfmt(dy_logchn,dy_gtxecho," to cover %s (%d).", consys_nme(dy_sys,'c',i,FALSE,NULL),i) ; } # endif } } # ifndef DYLP_NDEBUG if (dy_opts->print.crash >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n added %d artificial variables.",covered) ; } # endif return (covered) ; } static bool ib_populatebasis (void) /* This routine is responsible for populating the basis (i.e., selecting basic variables for each basis position) using a mixture of architectural and logical variables. The type of basis is determined by the coldbasis option, as follows: ibLOGICAL: (logical) uses only logical variables (slacks and artificials). ibSLACK: (slack) uses slacks for inequalities, then covers as many equalities as possible with architecturals before falling back on artificials. ibARCH: (architectural) uses architecturals first, trying to cover equalities before inequalities, and falling back on logicals for uncovered positions. Parameters: none Returns: TRUE if a basis is built, FALSE if something goes wrong. */ { int m,basiscnt,archvcnt,slkcnt,artifcnt,iretval ; bool bretval ; ibrank_struct *archvars ; const char *rtnnme = "ib_populatebasis" ; # ifndef DYLP_NDEBUG int i,j ; # endif # ifdef DYLP_PARANOIA if (!(dy_opts->coldbasis >= ibLOGICAL && dy_opts->coldbasis <= ibARCH)) { errmsg(5,rtnnme,"initial basis type",dy_opts->coldbasis) ; return (FALSE) ; } # endif m = dy_sys->concnt ; # ifndef DYLP_NDEBUG if (dy_opts->print.crash >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n constructing ") ; switch (dy_opts->coldbasis) { case ibLOGICAL: { dyio_outfmt(dy_logchn,dy_gtxecho,"logical") ; break ; } case ibSLACK: { dyio_outfmt(dy_logchn,dy_gtxecho,"slack") ; break ; } case ibARCH: { dyio_outfmt(dy_logchn,dy_gtxecho,"architectural") ; break ; } default: { errmsg(1,rtnnme,__LINE__) ; return (FALSE) ; } } dyio_outfmt(dy_logchn,dy_gtxecho," basis for system %s, %d constraints.", dy_sys->nme,m) ; } # endif basiscnt = 0 ; /* Logical and slack basis types will use slacks to cover off inequalities. */ if (dy_opts->coldbasis == ibLOGICAL || dy_opts->coldbasis == ibSLACK) { slkcnt = ib_slackselect() ; basiscnt += slkcnt ; } /* Slack and architectural basis types will use architectural variables. For a slack basis, we're just trying to cover equalities before falling back on artificial variables. For an architectural basis, we're covering equalities and inequalities, scanning the columns in a way that will see equalities before inequalities (hence preferentially use architecturals to cover equalities). Start by sorting them into their respective classes by number of bounds, then ordering within classes by the rating described in the header. Exclude fixed variables from the two-bound group. A simple equality test is all we need, as dy_coldstart has already groomed the bounds. */ if (basiscnt < m && (dy_opts->coldbasis == ibSLACK || dy_opts->coldbasis == ibARCH)) { archvars = NULL ; bretval = ib_archvrank(&archvcnt,&archvars) ; if (bretval == FALSE) { errmsg(305,rtnnme,dy_sys->nme, dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "rank","architectural") ; if (archvars != NULL) FREE(archvars) ; return (FALSE) ; } iretval = ib_archvselect(archvcnt,archvars) ; if (archvars != NULL) FREE(archvars) ; if (iretval < 0) { errmsg(305,rtnnme,dy_sys->nme, dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "select","architectural") ; return (FALSE) ; } basiscnt += iretval ; } /* Use logicals for any uncovered inequalities in an architectural basis. */ if (basiscnt < m && dy_opts->coldbasis == ibARCH) { slkcnt = ib_slackselect() ; basiscnt += slkcnt ; } /* If we have uncovered equalities (and that's all that can remain, at this point), give in and use artificial variables. */ if (basiscnt < m) { artifcnt = ib_artifselect() ; basiscnt += artifcnt ; } # ifndef DYLP_NDEBUG if (dy_opts->print.crash >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t Pos'n Variable Constraint") ; for (i = 1 ; i <= basiscnt ; i++) { j = dy_basis[i] ; dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t %3d (%3d) %-15s",i,j, consys_nme(dy_sys,'v',j,FALSE,NULL)) ; dyio_outfmt(dy_logchn,dy_gtxecho,"%-15s", consys_nme(dy_sys,'c',i,FALSE,NULL)) ; } } # endif /* And if we still have uncovered rows, there's something seriously wrong. */ if (basiscnt < m) { errmsg(301,rtnnme,basiscnt,m,dy_sys->nme) ; return (FALSE) ; } return (TRUE) ; } dyret_enum dy_crash (void) /* This routine coordinates the selection of an initial basis for an lp problem. The task of selecting a set of basic variables is hidden away in ib_populatebasis and subsidiary routines (see the comments at the head of this group of routines). What's visible here is the work associated with factoring the basis, establishing status, and calculating primal and dual variables and reduced costs. Parameters: dy_lp: lp problem dy_opts: lp algorithm options dy_tols: lp algorithm control and tolerances Returns: dyrOK if a basis is constructed; originates dyrFATAL on error, and can relay dyrNUMERIC, dyrBSPACE, and dyrSINGULAR originated by dy_factor. */ { int vndx ; double *vub,*vlb,*obj ; flags calcflgs ; dyret_enum retval ; const char *rtnnme = "dy_crash" ; extern void dy_setfinalstatus(void) ; /* dy_hotstart.c */ # ifndef DYLP_NDEBUG int cndx ; # endif # ifdef DYLP_PARANOIA if (dy_lp == NULL) { errmsg(2,rtnnme,"dy_lp") ; return (dyrFATAL) ; } if (dy_sys == NULL) { errmsg(2,rtnnme,"dy_sys") ; return (dyrFATAL) ; } if (dy_sys == NULL) { errmsg(2,rtnnme,consys_assocnme(dy_sys,CONSYS_MTX)) ; return (dyrFATAL) ; } if (dy_sys->vlb == NULL) { errmsg(2,rtnnme,consys_assocnme(dy_sys,CONSYS_VLB)) ; return (dyrFATAL) ; } if (dy_sys->obj == NULL) { errmsg(2,rtnnme,consys_assocnme(dy_sys,CONSYS_OBJ)) ; return (dyrFATAL) ; } if (dy_sys->ctyp == NULL) { errmsg(2,rtnnme,consys_assocnme(dy_sys,CONSYS_CTYP)) ; return (dyrFATAL) ; } if (flgoff(dy_sys->opts,CONSYS_LVARS)) { errmsg(311,rtnnme,dy_sys->nme) ; return (dyrFATAL) ; } if (dy_opts == NULL) { errmsg(2,rtnnme,"dy_opts") ; return (dyrFATAL) ; } if (dy_tols == NULL) { errmsg(2,rtnnme,"dy_tols") ; return (dyrFATAL) ; } # endif /* Unpack a few arrays we'll use frequently, and attach the basis and inverse basis vectors to the constraint system. consys_attach will initialise them to 0. */ obj = dy_sys->obj ; vlb = dy_sys->vlb ; vub = dy_sys->vub ; if (consys_attach(dy_sys,CONSYS_COL, sizeof(int),(void **) &dy_basis) == FALSE) { errmsg(100,rtnnme,dy_sys->nme,"basis vector") ; return (dyrFATAL) ; } if (consys_attach(dy_sys,CONSYS_ROW, sizeof(int),(void **) &dy_var2basis) == FALSE) { errmsg(100,rtnnme,dy_sys->nme,"inverse basis vector") ; return (dyrFATAL) ; } /* Populate the basis. */ if (ib_populatebasis() == FALSE) { errmsg(302,rtnnme,dy_sys->nme, dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters,"populate") ; return (dyrFATAL) ; } /* Factor the basis. We don't want any of the primal or dual variables calculated just yet. If this fails we're in deep trouble. */ if (dy_sys->concnt > 0) { # ifndef DYLP_NDEBUG if (dy_opts->print.crash >= 2) dyio_outfmt(dy_logchn,dy_gtxecho,"\n\tfactoring ...") ; # endif calcflgs = 0 ; retval = dy_factor(&calcflgs) ; switch (retval) { case dyrOK: case dyrPATCHED: { break ; } default: { errmsg(309,rtnnme,dy_sys->nme) ; return (retval) ; } } } /* Attach and clear the vectors which will hold the status and values of variables, and the reduced cost. */ if (consys_attach(dy_sys,CONSYS_ROW, sizeof(flags),(void **) &dy_status) == FALSE) { errmsg(100,rtnnme,dy_sys->nme,"status vector") ; return (dyrFATAL) ; } if (consys_attach(dy_sys,CONSYS_COL, sizeof(double),(void **) &dy_xbasic) == FALSE) { errmsg(100,rtnnme,dy_sys->nme,"basic variable vector") ; return (dyrFATAL) ; } if (consys_attach(dy_sys,CONSYS_ROW, sizeof(double),(void **) &dy_x) == FALSE) { errmsg(100,rtnnme,dy_sys->nme,"primal variable vector") ; return (dyrFATAL) ; } if (consys_attach(dy_sys,CONSYS_COL, sizeof(double),(void **) &dy_y) == FALSE) { errmsg(100,rtnnme,dy_sys->nme,"dual variable vector") ; return (dyrFATAL) ; } if (consys_attach(dy_sys,CONSYS_ROW, sizeof(double),(void **) &dy_cbar) == FALSE) { errmsg(100,rtnnme,dy_sys->nme,"reduced cost vector") ; return (dyrFATAL) ; } /* Might as well work toward a dual feasible start. Calculate the duals, then the reduced costs, so we can make intelligent decisions about the status of the nonbasic variables. */ dy_calcduals() ; if (dy_calccbar() == FALSE) { errmsg(384,rtnnme,dy_sys->nme, dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; return (dyrFATAL) ; } /* For nonbasic variables, we have to decide the proper status, based on number of bounds and the sign of the reduced cost (we're minimising, remember). Once we know the status, we can set a value in dy_x. Nonbasic free variables are arbitrarily awarded a value of 0. For basic variables, if we can't say they're fixed or free, assume strictly between bounds until we calculate their initial values. We won't bother to set dy_x and dy_xbasic until we've done the calculation. */ # ifndef DYLP_NDEBUG if (dy_opts->print.crash >= 2) dyio_outfmt(dy_logchn,dy_gtxecho, "\n\testablishing initial status and reference frame ...") ; # endif for (vndx = 1 ; vndx <= dy_sys->varcnt ; vndx++) { if (dy_var2basis[vndx] != 0) { if (vlb[vndx] == vub[vndx]) { dy_status[vndx] = vstatBFX ; } else if (vlb[vndx] <= -dy_tols->inf && vub[vndx] >= dy_tols->inf) { dy_status[vndx] = vstatBFR ; } else { dy_status[vndx] = vstatB ; } } else { if (vlb[vndx] > -dy_tols->inf && vub[vndx] < dy_tols->inf) { if (vub[vndx] == vlb[vndx]) { dy_status[vndx] = vstatNBFX ; dy_x[vndx] = vub[vndx] ; } else if (dy_cbar[vndx] >= 0) { dy_status[vndx] = vstatNBLB ; dy_x[vndx] = vlb[vndx] ; } else { dy_status[vndx] = vstatNBUB ; dy_x[vndx] = vub[vndx] ; } } else if (vlb[vndx] > -dy_tols->inf) { dy_status[vndx] = vstatNBLB ; dy_x[vndx] = vlb[vndx] ; } else if (vub[vndx] < dy_tols->inf) { dy_status[vndx] = vstatNBUB ; dy_x[vndx] = vub[vndx] ; } else { dy_status[vndx] = vstatNBFR ; dy_x[vndx] = 0 ; } } # ifndef DYLP_NDEBUG if (dy_opts->print.crash >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t %s (%d) %s", consys_nme(dy_sys,'v',vndx,FALSE,NULL),vndx, dy_prtvstat(dy_status[vndx])) ; if (flgon(dy_status[vndx],vstatNONBASIC|vstatNBFR)) dyio_outfmt(dy_logchn,dy_gtxecho," with value %g.",dy_x[vndx]) ; else dyio_outchr(dy_logchn,dy_gtxecho,'.') ; } # endif } /* Ok, status is set. Now it's time to calculate initial values for the basic variables and objective. Once we have values for the basic variables, see how bad it looks, in terms of primal infeasibility, and adjust the status for any that are pinned against a bound or out of bounds. */ # ifndef DYLP_NDEBUG if (dy_opts->print.crash >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tcalculating basic variable values ...") ; } # endif if (dy_calcprimals() == FALSE) { errmsg(316,rtnnme,dy_sys->nme) ; return (dyrFATAL) ; } dy_lp->z = dy_calcobj() ; dy_setfinalstatus() ; /* Make the check for primal and/or dual feasibility, and set the initial simplex phase accordingly. */ calcflgs = ladPRIMFEAS|ladPFQUIET|ladDUALFEAS|ladDFQUIET ; retval = dy_accchk(&calcflgs) ; if (retval != dyrOK) { errmsg(304,rtnnme,dy_sys->nme, dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; return (retval) ; } if (flgoff(calcflgs,ladPRIMFEAS)) { dy_lp->simplex.next = dyPRIMAL2 ; } else if (flgoff(calcflgs,ladDUALFEAS)) { dy_lp->simplex.next = dyDUAL ; } else { dy_lp->simplex.next = dyPRIMAL1 ; } # ifndef DYLP_NDEBUG /* Some debug printing, to dump the initial basis & variables. */ if (dy_opts->print.crash >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n Pos'n Constraint\tDual\tPrimal\t\t Status\tValue") ; for (cndx = 1 ; cndx <= dy_sys->concnt ; cndx++) { vndx = dy_basis[cndx] ; dyio_outfmt(dy_logchn,dy_gtxecho,"\n %4d %-13s%7g",cndx, consys_nme(dy_sys,'c',cndx,FALSE,NULL),dy_y[cndx]) ; dyio_outfmt(dy_logchn,dy_gtxecho," (%4d) %-13s %-7s %7g",vndx, consys_nme(dy_sys,'v',vndx,FALSE,NULL), dy_prtvstat(dy_status[vndx]),dy_x[vndx]) ; } } if (dy_opts->print.crash >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\tinitial objective %g",dy_lp->z) ; if (dy_lp->infeascnt != 0) { dyio_outfmt(dy_logchn,dy_gtxecho,", %d infeasible vars, infeas. = %g", dy_lp->infeascnt,dy_lp->infeas) ; } dyio_outfmt(dy_logchn,dy_gtxecho,", target simplex %s.", dy_prtlpphase(dy_lp->simplex.next,FALSE)) ; } # endif return (dyrOK) ; } DyLP-1.6.0/DyLP/src/Dylp/dy_consys_mathutils.c0000644000076700007670000011126011026315405016041 0ustar /* This file is a portion of the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains math utility routines for the constraint system data structure. These handle things like dot products, norms, etc. */ #include "dylib_errs.h" #include "dylib_std.h" #include "dy_consys.h" static char sccsid[] UNUSED = "@(#)dy_consys_mathutils.c 4.5 11/11/04" ; static char svnid[] UNUSED = "$Id: dy_consys_mathutils.c 240 2008-06-18 23:32:21Z lou $" ; double consys_dotrow (consys_struct *consys, int rowndx, double *vec) /* This routine computes the dot product of the specified row with the expanded vector passed in vec. Parameters: consys: constraint system rowndx: row vec: vector Returns: dot product, or NaN if the calculation goes awry. */ { double dotprod ; rowhdr_struct *rowhdr ; coeff_struct *coeff ; # if defined(DYLP_PARANOIA) || !defined(DYLP_NDEBUG) const char *rtnnme = "consys_dotrow" ; # endif # ifdef DYLP_PARANOIA if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (quiet_nan(0)) ; } if (consys->mtx.rows == NULL) { errmsg(101,rtnnme,consys->nme,"row header") ; return (quiet_nan(0)) ; } # endif # ifndef DYLP_NDEBUG if (rowndx <= 0 || rowndx > consys->concnt) { errmsg(102,rtnnme,consys->nme,"row",rowndx,1,consys->concnt) ; return (quiet_nan(0)) ; } # endif rowhdr = consys->mtx.rows[rowndx] ; # ifdef DYLP_PARANOIA if (rowhdr == NULL) { errmsg(103,rtnnme,consys->nme,"row",rowndx) ; return (quiet_nan(0)) ; } if (rowndx != rowhdr->ndx) { errmsg(126,rtnnme,consys->nme,"row",rowhdr,rowhdr->ndx,rowndx,rowhdr) ; return (quiet_nan(0)) ; } if (vec == NULL) { errmsg(2,rtnnme,"vec") ; return (quiet_nan(0)) ; } # endif dotprod = 0 ; for (coeff = rowhdr->coeffs ; coeff != NULL ; coeff = coeff->rownxt) { # ifdef DYLP_PARANOIA if (coeff->colhdr == NULL) { errmsg(125,rtnnme,consys->nme,"colhdr",coeff,"row", consys_nme(consys,'c',rowndx,FALSE,NULL),rowndx) ; return (quiet_nan(0)) ; } if (coeff->colhdr->ndx <= 0 || coeff->colhdr->ndx > consys->varcnt) { errmsg(102,rtnnme,consys->nme,"column",coeff->colhdr->ndx, 1,consys->varcnt) ; return (quiet_nan(0)) ; } if (coeff->colhdr != consys->mtx.cols[coeff->colhdr->ndx]) { errmsg(126,rtnnme,consys->nme,"column",coeff->colhdr,coeff->colhdr->ndx, coeff->colhdr->ndx,consys->mtx.cols[coeff->colhdr->ndx]) ; return (quiet_nan(0)) ; } # endif dotprod += coeff->val*vec[coeff->colhdr->ndx] ; } return (dotprod) ; } double consys_dotcol (consys_struct *consys, int colndx, double *vec) /* This routine computes the dot product of the specified column with the expanded vector passed in vec. Parameters: consys: constraint system colndx: column vec: vector Returns: dot product, or NaN if the calculation goes awry. */ { double dotprod ; colhdr_struct *colhdr ; coeff_struct *coeff ; # if defined(DYLP_PARANOIA) || !defined(DYLP_NDEBUG) const char *rtnnme = "consys_dotcol" ; # endif # ifdef DYLP_PARANOIA if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (quiet_nan(0)) ; } if (consys->mtx.cols == NULL) { errmsg(101,rtnnme,consys->nme,"column header") ; return (quiet_nan(0)) ; } # endif # ifndef DYLP_NDEBUG if (colndx <= 0 || colndx > consys->varcnt) { errmsg(102,rtnnme,consys->nme,"column",colndx,1,consys->varcnt) ; return (quiet_nan(0)) ; } # endif colhdr = consys->mtx.cols[colndx] ; # ifdef DYLP_PARANOIA if (colhdr == NULL) { errmsg(103,rtnnme,consys->nme,"column",colndx) ; return (quiet_nan(0)) ; } if (colndx != colhdr->ndx) { errmsg(126,rtnnme,consys->nme,"column",colhdr,colhdr->ndx,colndx,colhdr) ; return (quiet_nan(0)) ; } if (vec == NULL) { errmsg(2,rtnnme,"vec") ; return (quiet_nan(0)) ; } # endif dotprod = 0 ; for (coeff = colhdr->coeffs ; coeff != NULL ; coeff = coeff->colnxt) { # ifdef DYLP_PARANOIA if (coeff->rowhdr == NULL) { errmsg(125,rtnnme,consys->nme,"rowhdr",coeff,"column", consys_nme(consys,'v',colndx,FALSE,NULL),colndx) ; return (quiet_nan(0)) ; } if (coeff->rowhdr->ndx <= 0 || coeff->rowhdr->ndx > consys->concnt) { errmsg(102,rtnnme,consys->nme,"row",coeff->rowhdr->ndx, 1,consys->concnt) ; return (quiet_nan(0)) ; } if (coeff->rowhdr != consys->mtx.rows[coeff->rowhdr->ndx]) { errmsg(126,rtnnme,consys->nme,"row",coeff->rowhdr,coeff->rowhdr->ndx, coeff->rowhdr->ndx,consys->mtx.rows[coeff->rowhdr->ndx]) ; return (quiet_nan(0)) ; } # endif dotprod += coeff->val*vec[coeff->rowhdr->ndx] ; } return (dotprod) ; } double consys_1normrow (consys_struct *consys, int rowndx) /* This routine computes the 1-norm of a row: SUM{j} |a| Parameters: consys: constraint system rowndx: row Returns: value of the norm, or NaN if the calculation goes awry */ { double norm ; rowhdr_struct *rowhdr ; coeff_struct *coeff ; # if defined(DYLP_PARANOIA) || !defined(DYLP_NDEBUG) const char *rtnnme = "consys_1normrow" ; # endif # ifdef DYLP_PARANOIA if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (quiet_nan(0)) ; } if (consys->mtx.rows == NULL) { errmsg(101,rtnnme,consys->nme,"row header") ; return (quiet_nan(0)) ; } # endif # ifndef DYLP_NDEBUG if (rowndx <= 0 || rowndx > consys->concnt) { errmsg(102,rtnnme,consys->nme,"row",rowndx,1,consys->concnt) ; return (quiet_nan(0)) ; } # endif rowhdr = consys->mtx.rows[rowndx] ; # ifdef DYLP_PARANOIA if (rowhdr == NULL) { errmsg(103,rtnnme,consys->nme,"row",rowndx) ; return (quiet_nan(0)) ; } if (rowndx != rowhdr->ndx) { errmsg(126,rtnnme,consys->nme,"row",rowhdr,rowhdr->ndx,rowndx,rowhdr) ; return (quiet_nan(0)) ; } # endif norm = 0 ; for (coeff = rowhdr->coeffs ; coeff != NULL ; coeff = coeff->rownxt) { #ifdef DYLP_PARANOIA if (coeff->colhdr == NULL) { errmsg(125,rtnnme,consys->nme,"colhdr",coeff,"row", consys_nme(consys,'c',rowndx,FALSE,NULL),rowndx) ; return (quiet_nan(0)) ; } if (coeff->colhdr->ndx <= 0 || coeff->colhdr->ndx > consys->varcnt) { errmsg(102,rtnnme,consys->nme,"column",coeff->colhdr->ndx, 1,consys->varcnt) ; return (quiet_nan(0)) ; } if (coeff->colhdr != consys->mtx.cols[coeff->colhdr->ndx]) { errmsg(126,rtnnme,consys->nme,"column",coeff->colhdr,coeff->colhdr->ndx, coeff->colhdr->ndx,consys->mtx.cols[coeff->colhdr->ndx]) ; return (quiet_nan(0)) ; } #endif norm += fabs(coeff->val) ; } return (norm) ; } double consys_ssqrow (consys_struct *consys, int rowndx) /* This routine computes the sum of squares of a row: SUM{j} a**2. It's sometimes more useful to have this than the actual 2-norm. Parameters: consys: constraint system rowndx: row Returns: value of the sum of squares, or NaN if the calculation goes awry */ { double norm ; rowhdr_struct *rowhdr ; coeff_struct *coeff ; # if defined(DYLP_PARANOIA) || !defined(DYLP_NDEBUG) const char *rtnnme = "consys_ssqrow" ; # endif /* The usual paranoia, plus an honest index check. */ # ifdef DYLP_PARANOIA if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (quiet_nan(0)) ; } if (consys->mtx.rows == NULL) { errmsg(101,rtnnme,consys->nme,"row header") ; return (quiet_nan(0)) ; } # endif # ifndef DYLP_NDEBUG if (rowndx <= 0 || rowndx > consys->concnt) { errmsg(102,rtnnme,consys->nme,"row",rowndx,1,consys->concnt) ; return (quiet_nan(0)) ; } # endif rowhdr = consys->mtx.rows[rowndx] ; # ifdef DYLP_PARANOIA if (rowhdr == NULL) { errmsg(103,rtnnme,consys->nme,"row",rowndx) ; return (quiet_nan(0)) ; } if (rowndx != rowhdr->ndx) { errmsg(126,rtnnme,consys->nme,"row",rowhdr,rowhdr->ndx,rowndx,rowhdr) ; return (quiet_nan(0)) ; } # endif norm = 0 ; for (coeff = rowhdr->coeffs ; coeff != NULL ; coeff = coeff->rownxt) { # ifdef DYLP_PARANOIA if (coeff->colhdr == NULL) { errmsg(125,rtnnme,consys->nme,"colhdr",coeff,"row", consys_nme(consys,'c',rowndx,FALSE,NULL),rowndx) ; return (quiet_nan(0)) ; } if (coeff->colhdr->ndx <= 0 || coeff->colhdr->ndx > consys->varcnt) { errmsg(102,rtnnme,consys->nme,"column",coeff->colhdr->ndx, 1,consys->varcnt) ; return (quiet_nan(0)) ; } if (coeff->colhdr != consys->mtx.cols[coeff->colhdr->ndx]) { errmsg(126,rtnnme,consys->nme,"column",coeff->colhdr,coeff->colhdr->ndx, coeff->colhdr->ndx,consys->mtx.cols[coeff->colhdr->ndx]) ; return (quiet_nan(0)) ; } # endif norm += coeff->val*coeff->val ; } return (norm) ; } double consys_2normrow (consys_struct *consys, int rowndx) /* This routine computes the 2-norm of a row: sqrt(SUM{j} a**2) Parameters: consys: constraint system rowndx: row Returns: value of the norm, or NaN if the calculation goes awry */ { double norm ; rowhdr_struct *rowhdr ; coeff_struct *coeff ; # if defined(DYLP_PARANOIA) || !defined(DYLP_NDEBUG) const char *rtnnme = "consys_2normrow" ; # endif /* The usual paranoia, plus an honest index check. */ # ifdef DYLP_PARANOIA if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (quiet_nan(0)) ; } if (consys->mtx.rows == NULL) { errmsg(101,rtnnme,consys->nme,"row header") ; return (quiet_nan(0)) ; } # endif # ifndef DYLP_NDEBUG if (rowndx <= 0 || rowndx > consys->concnt) { errmsg(102,rtnnme,consys->nme,"row",rowndx,1,consys->concnt) ; return (quiet_nan(0)) ; } # endif rowhdr = consys->mtx.rows[rowndx] ; # ifdef DYLP_PARANOIA if (rowhdr == NULL) { errmsg(103,rtnnme,consys->nme,"row",rowndx) ; return (quiet_nan(0)) ; } if (rowndx != rowhdr->ndx) { errmsg(126,rtnnme,consys->nme,"row",rowhdr,rowhdr->ndx,rowndx,rowhdr) ; return (quiet_nan(0)) ; } # endif norm = 0 ; for (coeff = rowhdr->coeffs ; coeff != NULL ; coeff = coeff->rownxt) { # ifdef DYLP_PARANOIA if (coeff->colhdr == NULL) { errmsg(125,rtnnme,consys->nme,"colhdr",coeff,"row", consys_nme(consys,'c',rowndx,FALSE,NULL),rowndx) ; return (quiet_nan(0)) ; } if (coeff->colhdr->ndx <= 0 || coeff->colhdr->ndx > consys->varcnt) { errmsg(102,rtnnme,consys->nme,"column",coeff->colhdr->ndx, 1,consys->varcnt) ; return (quiet_nan(0)) ; } if (coeff->colhdr != consys->mtx.cols[coeff->colhdr->ndx]) { errmsg(126,rtnnme,consys->nme,"column",coeff->colhdr,coeff->colhdr->ndx, coeff->colhdr->ndx,consys->mtx.cols[coeff->colhdr->ndx]) ; return (quiet_nan(0)) ; } # endif norm += coeff->val*coeff->val ; } return (sqrt(norm)) ; } double consys_infnormrow (consys_struct *consys, int rowndx) /* This routine computes the infinity-norm of a row: MAX{j} |a| Parameters: consys: constraint system rowndx: row Returns: value of the norm, or NaN if the calculation goes awry */ { double norm ; rowhdr_struct *rowhdr ; coeff_struct *coeff ; # if defined(DYLP_PARANOIA) || !defined(DYLP_NDEBUG) const char *rtnnme = "consys_infnormrow" ; # endif /* The usual paranoia, plus an honest index check. */ # ifdef DYLP_PARANOIA if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (quiet_nan(0)) ; } if (consys->mtx.rows == NULL) { errmsg(101,rtnnme,consys->nme,"row header") ; return (quiet_nan(0)) ; } # endif # ifndef DYLP_NDEBUG if (rowndx <= 0 || rowndx > consys->concnt) { errmsg(102,rtnnme,consys->nme,"row",rowndx,1,consys->concnt) ; return (quiet_nan(0)) ; } # endif rowhdr = consys->mtx.rows[rowndx] ; # ifdef DYLP_PARANOIA if (rowhdr == NULL) { errmsg(103,rtnnme,consys->nme,"row",rowndx) ; return (quiet_nan(0)) ; } if (rowndx != rowhdr->ndx) { errmsg(126,rtnnme,consys->nme,"row",rowhdr,rowhdr->ndx,rowndx,rowhdr) ; return (quiet_nan(0)) ; } # endif norm = 0 ; for (coeff = rowhdr->coeffs ; coeff != NULL ; coeff = coeff->rownxt) { # ifdef DYLP_PARANOIA if (coeff->colhdr == NULL) { errmsg(125,rtnnme,consys->nme,"colhdr",coeff,"row", consys_nme(consys,'c',rowndx,FALSE,NULL),rowndx) ; return (quiet_nan(0)) ; } if (coeff->colhdr->ndx <= 0 || coeff->colhdr->ndx > consys->varcnt) { errmsg(102,rtnnme,consys->nme,"column",coeff->colhdr->ndx, 1,consys->varcnt) ; return (quiet_nan(0)) ; } if (coeff->colhdr != consys->mtx.cols[coeff->colhdr->ndx]) { errmsg(126,rtnnme,consys->nme,"column",coeff->colhdr,coeff->colhdr->ndx, coeff->colhdr->ndx,consys->mtx.cols[coeff->colhdr->ndx]) ; return (quiet_nan(0)) ; } # endif norm = maxx(fabs(coeff->val),norm) ; } return (norm) ; } double consys_1normcol (consys_struct *consys, int colndx) /* This routine computes the 1-norm of a column: SUM{i} |a|. Parameters: consys: constraint system colndx: column Returns: value of the norm, or NaN if the calculation goes awry */ { double norm ; colhdr_struct *colhdr ; coeff_struct *coeff ; # if defined(DYLP_PARANOIA) || !defined(DYLP_NDEBUG) const char *rtnnme = "consys_1normcol" ; # endif # ifdef DYLP_PARANOIA if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (quiet_nan(0)) ; } if (consys->mtx.cols == NULL) { errmsg(101,rtnnme,consys->nme,"column header") ; return (quiet_nan(0)) ; } # endif # ifndef DYLP_NDEBUG if (colndx <= 0 || colndx > consys->varcnt) { errmsg(102,rtnnme,consys->nme,"column",colndx,1,consys->varcnt) ; return (quiet_nan(0)) ; } # endif colhdr = consys->mtx.cols[colndx] ; # ifdef DYLP_PARANOIA if (colhdr == NULL) { errmsg(103,rtnnme,consys->nme,"column",colndx) ; return (quiet_nan(0)) ; } if (colndx != colhdr->ndx) { errmsg(126,rtnnme,consys->nme,"column",colhdr,colhdr->ndx,colndx,colhdr) ; return (quiet_nan(0)) ; } # endif norm = 0 ; for (coeff = colhdr->coeffs ; coeff != NULL ; coeff = coeff->colnxt) { # ifdef DYLP_PARANOIA if (coeff->rowhdr == NULL) { errmsg(125,rtnnme,consys->nme,"rowhdr",coeff,"column", consys_nme(consys,'v',colndx,FALSE,NULL),colndx) ; return (quiet_nan(0)) ; } if (coeff->rowhdr->ndx <= 0 || coeff->rowhdr->ndx > consys->varcnt) { errmsg(102,rtnnme,consys->nme,"row",coeff->rowhdr->ndx, 1,consys->varcnt) ; return (quiet_nan(0)) ; } if (coeff->rowhdr != consys->mtx.rows[coeff->rowhdr->ndx]) { errmsg(126,rtnnme,consys->nme,"row",coeff->rowhdr,coeff->rowhdr->ndx, coeff->rowhdr->ndx,consys->mtx.rows[coeff->rowhdr->ndx]) ; return (quiet_nan(0)) ; } # endif norm += fabs(coeff->val) ; } return (norm) ; } double consys_ssqcol (consys_struct *consys, int colndx) /* This routine computes the sum of squares of a column: SUM{i} a**2. It's sometimes more useful to have this than the actual 2-norm. Parameters: consys: constraint system colndx: column Returns: value of the norm, or NaN if the calculation goes awry */ { double norm ; colhdr_struct *colhdr ; coeff_struct *coeff ; # if defined(DYLP_PARANOIA) || !defined(DYLP_NDEBUG) const char *rtnnme = "consys_ssqcol" ; # endif # ifdef DYLP_PARANOIA if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (quiet_nan(0)) ; } if (consys->mtx.cols == NULL) { errmsg(101,rtnnme,consys->nme,"column header") ; return (quiet_nan(0)) ; } # endif # ifndef DYLP_NDEBUG if (colndx <= 0 || colndx > consys->varcnt) { errmsg(102,rtnnme,consys->nme,"column",colndx,1,consys->varcnt) ; return (quiet_nan(0)) ; } # endif colhdr = consys->mtx.cols[colndx] ; # ifdef DYLP_PARANOIA if (colhdr == NULL) { errmsg(103,rtnnme,consys->nme,"column",colndx) ; return (quiet_nan(0)) ; } if (colndx != colhdr->ndx) { errmsg(126,rtnnme,consys->nme,"column",colhdr,colhdr->ndx,colndx,colhdr) ; return (quiet_nan(0)) ; } # endif norm = 0 ; for (coeff = colhdr->coeffs ; coeff != NULL ; coeff = coeff->colnxt) { # ifdef DYLP_PARANOIA if (coeff->rowhdr == NULL) { errmsg(125,rtnnme,consys->nme,"rowhdr",coeff,"column", consys_nme(consys,'v',colndx,FALSE,NULL),colndx) ; return (quiet_nan(0)) ; } if (coeff->rowhdr->ndx <= 0 || coeff->rowhdr->ndx > consys->varcnt) { errmsg(102,rtnnme,consys->nme,"row",coeff->rowhdr->ndx, 1,consys->varcnt) ; return (quiet_nan(0)) ; } if (coeff->rowhdr != consys->mtx.rows[coeff->rowhdr->ndx]) { errmsg(126,rtnnme,consys->nme,"row",coeff->rowhdr,coeff->rowhdr->ndx, coeff->rowhdr->ndx,consys->mtx.rows[coeff->rowhdr->ndx]) ; return (quiet_nan(0)) ; } # endif norm += coeff->val*coeff->val ; } return (norm) ; } double consys_2normcol (consys_struct *consys, int colndx) /* This routine computes the 2-norm of a column: sqrt(SUM{i} a**2). Parameters: consys: constraint system colndx: column Returns: value of the norm, or NaN if the calculation goes awry */ { double norm ; colhdr_struct *colhdr ; coeff_struct *coeff ; # if defined(DYLP_PARANOIA) || !defined(DYLP_NDEBUG) const char *rtnnme = "consys_2normcol" ; # endif # ifdef DYLP_PARANOIA if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (quiet_nan(0)) ; } if (consys->mtx.cols == NULL) { errmsg(101,rtnnme,consys->nme,"column header") ; return (quiet_nan(0)) ; } # endif # ifndef DYLP_NDEBUG if (colndx <= 0 || colndx > consys->varcnt) { errmsg(102,rtnnme,consys->nme,"column",colndx,1,consys->varcnt) ; return (quiet_nan(0)) ; } # endif colhdr = consys->mtx.cols[colndx] ; # ifdef DYLP_PARANOIA if (colhdr == NULL) { errmsg(103,rtnnme,consys->nme,"column",colndx) ; return (quiet_nan(0)) ; } if (colndx != colhdr->ndx) { errmsg(126,rtnnme,consys->nme,"column",colhdr,colhdr->ndx,colndx,colhdr) ; return (quiet_nan(0)) ; } # endif norm = 0 ; for (coeff = colhdr->coeffs ; coeff != NULL ; coeff = coeff->colnxt) { # ifdef DYLP_PARANOIA if (coeff->rowhdr == NULL) { errmsg(125,rtnnme,consys->nme,"rowhdr",coeff,"column", consys_nme(consys,'v',colndx,FALSE,NULL),colndx) ; return (quiet_nan(0)) ; } if (coeff->rowhdr->ndx <= 0 || coeff->rowhdr->ndx > consys->varcnt) { errmsg(102,rtnnme,consys->nme,"row",coeff->rowhdr->ndx, 1,consys->varcnt) ; return (quiet_nan(0)) ; } if (coeff->rowhdr != consys->mtx.rows[coeff->rowhdr->ndx]) { errmsg(126,rtnnme,consys->nme,"row",coeff->rowhdr,coeff->rowhdr->ndx, coeff->rowhdr->ndx,consys->mtx.rows[coeff->rowhdr->ndx]) ; return (quiet_nan(0)) ; } # endif norm += coeff->val*coeff->val ; } return (sqrt(norm)) ; } double consys_infnormcol (consys_struct *consys, int colndx) /* This routine computes the infinity-norm of a column: MAX{i} |a|. Parameters: consys: constraint system colndx: column Returns: value of the norm, or NaN if the calculation goes awry */ { double norm ; colhdr_struct *colhdr ; coeff_struct *coeff ; # if defined(DYLP_PARANOIA) || !defined(DYLP_NDEBUG) const char *rtnnme = "consys_infnormcol" ; # endif # ifdef DYLP_PARANOIA if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (quiet_nan(0)) ; } if (consys->mtx.cols == NULL) { errmsg(101,rtnnme,consys->nme,"column header") ; return (quiet_nan(0)) ; } # endif # ifndef DYLP_NDEBUG if (colndx <= 0 || colndx > consys->varcnt) { errmsg(102,rtnnme,consys->nme,"column",colndx,1,consys->varcnt) ; return (quiet_nan(0)) ; } # endif colhdr = consys->mtx.cols[colndx] ; # ifdef DYLP_PARANOIA if (colhdr == NULL) { errmsg(103,rtnnme,consys->nme,"column",colndx) ; return (quiet_nan(0)) ; } if (colndx != colhdr->ndx) { errmsg(126,rtnnme,consys->nme,"column",colhdr,colhdr->ndx,colndx,colhdr) ; return (quiet_nan(0)) ; } # endif norm = 0 ; for (coeff = colhdr->coeffs ; coeff != NULL ; coeff = coeff->colnxt) { # ifdef DYLP_PARANOIA if (coeff->rowhdr == NULL) { errmsg(125,rtnnme,consys->nme,"rowhdr",coeff,"column", consys_nme(consys,'v',colndx,FALSE,NULL),colndx) ; return (quiet_nan(0)) ; } if (coeff->rowhdr->ndx <= 0 || coeff->rowhdr->ndx > consys->varcnt) { errmsg(102,rtnnme,consys->nme,"row",coeff->rowhdr->ndx, 1,consys->varcnt) ; return (quiet_nan(0)) ; } if (coeff->rowhdr != consys->mtx.rows[coeff->rowhdr->ndx]) { errmsg(126,rtnnme,consys->nme,"row",coeff->rowhdr,coeff->rowhdr->ndx, coeff->rowhdr->ndx,consys->mtx.rows[coeff->rowhdr->ndx]) ; return (quiet_nan(0)) ; } # endif norm = maxx(fabs(coeff->val),norm) ; } return (norm) ; } bool consys_mulrow (consys_struct *consys, int rowndx, double scalar) /* This routine multiplies a row i by a scalar q. It deals with the coefficients a, and also with b, blow, cub, and clb, if they exist. If q < 0, the type of constraint is changed accordingly (>= swapped with <=) and clb is swapped with cub. Note that range constraints always take the form blow <= ax <= b, so if we multiply a range constraint by q < 0, the resulting constraint is qblow >= (qa)x >= qb => qb <= (qa)x <= qblow. Attempting to multiply a constraint by 0 gets you a warning if the CONSYS_WRNZERO flag is set in consys->opts. The routine will work with clb and cub only if both are present. It's difficult to define consistent changes otherwise. Parameters: consys: constraint system rowndx: row to be modified scalar: the multiplicative scalar Returns: TRUE if no problems are encountered, FALSE otherwise. */ { double tmprhs ; rowhdr_struct *rowhdr ; coeff_struct *coeff ; conbnd_struct tmpbnd ; bool do_conbnds ; const char *rtnnme = "consys_mulrow" ; /* The usual paranoia, plus an honest index check. */ # ifdef DYLP_PARANOIA if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (FALSE) ; } if (consys->mtx.rows == NULL) { errmsg(101,rtnnme,consys->nme,"row header") ; return (FALSE) ; } # endif # ifndef DYLP_NDEBUG if (rowndx <= 0 || rowndx > consys->concnt) { errmsg(102,rtnnme,consys->nme,"row",rowndx,1,consys->concnt) ; return (FALSE) ; } # endif rowhdr = consys->mtx.rows[rowndx] ; # ifdef DYLP_PARANOIA if (rowhdr == NULL) { errmsg(103,rtnnme,consys->nme,"row",rowndx) ; return (FALSE) ; } if (rowndx != rowhdr->ndx) { errmsg(126,rtnnme,consys->nme,"row",rowhdr,rowhdr->ndx,rowndx,rowhdr) ; return (FALSE) ; } # endif # ifndef DYLP_NDEBUG if (scalar == 0 && flgon(consys->opts,CONSYS_WRNZERO)) { warn(132,rtnnme,consys->nme,"row",rowhdr->nme,rowndx) ; } # endif if (consys->cub != NULL && consys->clb != NULL) do_conbnds = TRUE ; else do_conbnds = FALSE ; /* The straightforward part. Multiply the coefficients by the scalar. */ for (coeff = rowhdr->coeffs ; coeff != NULL ; coeff = coeff->rownxt) { # ifdef DYLP_PARANOIA if (coeff->colhdr == NULL) { errmsg(125,rtnnme,consys->nme,"colhdr",coeff,"row", consys_nme(consys,'c',rowndx,FALSE,NULL),rowndx) ; return (FALSE) ; } if (coeff->colhdr->ndx <= 0 || coeff->colhdr->ndx > consys->varcnt) { errmsg(102,rtnnme,consys->nme,"column",coeff->colhdr->ndx, 1,consys->varcnt) ; return (FALSE) ; } if (coeff->colhdr != consys->mtx.cols[coeff->colhdr->ndx]) { errmsg(126,rtnnme,consys->nme,"column",coeff->colhdr,coeff->colhdr->ndx, coeff->colhdr->ndx,consys->mtx.cols[coeff->colhdr->ndx]) ; return (FALSE) ; } # endif coeff->val *= scalar ; } /* If we did get a 0 for the scalar, we can be done in no time. */ if (scalar == 0) { if (consys->rhs != NULL) consys->rhs[rowndx] = 0 ; if (consys->rhslow != NULL) consys->rhslow[rowndx] = 0 ; if (do_conbnds == TRUE) { tmpbnd.revs = 0 ; tmpbnd.inf = 0 ; tmpbnd.bnd = 0 ; consys->cub[rowndx] = tmpbnd ; consys->clb[rowndx] = tmpbnd ; } return (TRUE) ; } /* For q != 0, it's a little more work. Correct b, blow, cub, and clb, if they exist. */ if (consys->rhs != NULL) consys->rhs[rowndx] *= scalar ; if (consys->rhslow != NULL) consys->rhslow[rowndx] *= scalar ; if (do_conbnds == TRUE) { consys->cub[rowndx].bnd *= scalar ; consys->clb[rowndx].bnd *= scalar ; } /* And now the complicated bit. If q < 0, swap the constraint bounds, then take additional action as needed, depending on the constraint type. */ if (scalar < 0) { if (do_conbnds == TRUE) { tmpbnd = consys->cub[rowndx] ; consys->cub[rowndx] = consys->clb[rowndx] ; consys->clb[rowndx] = tmpbnd ; } switch (consys->ctyp[rowndx]) { case contypLE: { consys->ctyp[rowndx] = contypGE ; break ; } case contypGE: { consys->ctyp[rowndx] = contypLE ; break ; } case contypRNG: { tmprhs = consys->rhs[rowndx] ; consys->rhs[rowndx] = consys->rhslow[rowndx] ; consys->rhslow[rowndx] = tmprhs ; break ; } case contypEQ: case contypNB: { break ; } default: { errmsg(1,rtnnme,__LINE__) ; return (FALSE) ; } } } return (TRUE) ; } bool consys_divrow (consys_struct *consys, int rowndx, double scalar) /* This routine divides a row i by a scalar q. It deals with the coefficients a, and also with b, blow, cub, and clb, if they exist. If q < 0, the type of constraint is changed accordingly (>= swapped with <=) and clb is swapped with cub. It's a separate routine (rather than using consys_mulrow to multiply by 1/scalar) to try and retain accuracy. Note that range constraints always take the form blow <= ax <= b, so if we divide a range constraint by q < 0, the resulting constraint is qblow >= (qa)x >= qb => qb <= (qa)x <= qblow. Attempting to divide a constraint by 0 is an error. The routine will work with clb and cub only if both are present. It's difficult to define consistent changes otherwise. Parameters: consys: constraint system rowndx: row to be divided scalar: the dividing scalar Returns: TRUE if no problems are encountered, FALSE otherwise. */ { double tmprhs ; rowhdr_struct *rowhdr ; coeff_struct *coeff ; conbnd_struct tmpbnd ; bool do_conbnds ; const char *rtnnme = "consys_divrow" ; /* The usual paranoia, plus an honest index check. */ # ifdef DYLP_PARANOIA if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (FALSE) ; } if (consys->mtx.rows == NULL) { errmsg(101,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_ROWHDR)) ; return (FALSE) ; } # endif # ifndef DYLP_NDEBUG if (rowndx <= 0 || rowndx > consys->concnt) { errmsg(102,rtnnme,consys->nme,"row",rowndx,1,consys->concnt) ; return (FALSE) ; } # endif rowhdr = consys->mtx.rows[rowndx] ; # ifdef DYLP_PARANOIA if (rowhdr == NULL) { errmsg(103,rtnnme,consys->nme,"row",rowndx) ; return (FALSE) ; } if (rowndx != rowhdr->ndx) { errmsg(126,rtnnme,consys->nme,"row",rowhdr,rowhdr->ndx,rowndx,rowhdr) ; return (FALSE) ; } if (scalar == 0) { errmsg(5,rtnnme,"scalar",(int) scalar) ; return (FALSE) ; } # endif if (consys->cub != NULL && consys->clb != NULL) do_conbnds = TRUE ; else do_conbnds = FALSE ; /* The straightforward part. Divide the coefficients by the scalar. */ for (coeff = rowhdr->coeffs ; coeff != NULL ; coeff = coeff->rownxt) { # ifdef DYLP_PARANOIA if (coeff->colhdr == NULL) { errmsg(125,rtnnme,consys->nme,"colhdr",coeff,"row", consys_nme(consys,'c',rowndx,FALSE,NULL),rowndx) ; return (FALSE) ; } if (coeff->colhdr->ndx <= 0 || coeff->colhdr->ndx > consys->varcnt) { errmsg(102,rtnnme,consys->nme,"column",coeff->colhdr->ndx, 1,consys->varcnt) ; return (FALSE) ; } if (coeff->colhdr != consys->mtx.cols[coeff->colhdr->ndx]) { errmsg(126,rtnnme,consys->nme,"column",coeff->colhdr,coeff->colhdr->ndx, coeff->colhdr->ndx,consys->mtx.cols[coeff->colhdr->ndx]) ; return (FALSE) ; } # endif coeff->val /= scalar ; } /* Correct b, blow, cub, and clb, if they exist. */ if (consys->rhs != NULL) consys->rhs[rowndx] /= scalar ; if (consys->rhslow != NULL) consys->rhslow[rowndx] /= scalar ; if (do_conbnds == TRUE) { consys->cub[rowndx].bnd /= scalar ; consys->clb[rowndx].bnd /= scalar ; } /* And now the complicated bit. If q < 0, swap the constraint bounds, then take additional action as needed, depending on the constraint type. */ if (scalar < 0) { if (do_conbnds == TRUE) { tmpbnd = consys->cub[rowndx] ; consys->cub[rowndx] = consys->clb[rowndx] ; consys->clb[rowndx] = tmpbnd ; } switch (consys->ctyp[rowndx]) { case contypLE: { consys->ctyp[rowndx] = contypGE ; break ; } case contypGE: { consys->ctyp[rowndx] = contypLE ; break ; } case contypRNG: { tmprhs = consys->rhs[rowndx] ; consys->rhs[rowndx] = consys->rhslow[rowndx] ; consys->rhslow[rowndx] = tmprhs ; break ; } case contypEQ: case contypNB: { break ; } default: { errmsg(1,rtnnme,__LINE__) ; return (FALSE) ; } } } return (TRUE) ; } int consys_gcdrow (consys_struct *consys, int rowndx) /* This routine calculates the gcd of the coefficients of the specified row using the euclidean algorithm. Note that explicit zeros should not appear in the coefficient matrix. Obviously, the coefficients should be integer. If they're not, the routine returns 0. If the row is empty, the routine returns 0, on the theory that whatever you were trying to do with this row, it's probably not suitable. The code uses the following statement of the euclidean algorithm, courtesy of Martin, Large Scale Linear and Integer Optimization, p. 106. Assume a<1> and a<2> positive integer, a<1> > a<2>. while (a<1> > 0 && a<2> > 0) { q = floor(a<1>/a<2>) ; r = a<1> - q*a<2> ; a<1> = a<2> ; a<2> = r ; } Parameters: consys: constraint system rowndx: row to be evaluated Returns: gcd(a<1>, ..., a), 0 if the coefficients aren't integer, -1 if anything else goes wrong. */ { double gcd,a1,a2,q,r ; rowhdr_struct *rowhdr ; coeff_struct *coeff ; # if defined(DYLP_PARANOIA) || !defined(DYLP_NDEBUG) const char *rtnnme = "consys_gcdrow" ; # endif /* The usual paranoia, plus an honest index check. */ # ifdef DYLP_PARANOIA if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (-1) ; } if (consys->mtx.rows == NULL) { errmsg(101,rtnnme,consys->nme,"row header") ; return (-1) ; } # endif # ifndef DYLP_NDEBUG if (rowndx <= 0 || rowndx > consys->concnt) { errmsg(102,rtnnme,consys->nme,"row",rowndx,1,consys->concnt) ; return (-1) ; } # endif rowhdr = consys->mtx.rows[rowndx] ; # ifdef DYLP_PARANOIA if (rowhdr == NULL) { errmsg(103,rtnnme,consys->nme,"row",rowndx) ; return (-1) ; } if (rowndx != rowhdr->ndx) { errmsg(126,rtnnme,consys->nme,"row",rowhdr,rowhdr->ndx,rowndx,rowhdr) ; return (-1) ; } # endif /* Trivial cases: 0 or 1 coefficients. */ if (rowhdr->len == 0) return (1) ; coeff = rowhdr->coeffs ; # ifdef DYLP_PARANOIA if (coeff == NULL) { errmsg(116,rtnnme,consys->nme,rowhdr->nme,rowhdr->ndx,rowhdr->len,0) ; return (-1) ; } if (coeff->colhdr == NULL) { errmsg(125,rtnnme,consys->nme,"colhdr",coeff,"row", consys_nme(consys,'c',rowndx,FALSE,NULL),rowndx) ; return (-1) ; } if (coeff->colhdr->ndx <= 0 || coeff->colhdr->ndx > consys->varcnt) { errmsg(102,rtnnme,consys->nme,"column",coeff->colhdr->ndx, 1,consys->varcnt) ; return (-1) ; } if (coeff->colhdr != consys->mtx.cols[coeff->colhdr->ndx]) { errmsg(126,rtnnme,consys->nme,"column",coeff->colhdr,coeff->colhdr->ndx, coeff->colhdr->ndx,consys->mtx.cols[coeff->colhdr->ndx]) ; return (-1) ; } # endif a1 = coeff->val ; if (a1 < 0) a1 = -a1 ; if (floor(a1) != a1) return (0) ; if (rowhdr->len == 1) return ((int) a1) ; /* Two or more coefficients. We work through them, calculating gcd(gcd,a). We first do a quick test for a/gcd integer (in which case we can keep gcd and move on to the next coefficient). When the gcd drops to 1, we bail out. */ gcd = a1 ; for (coeff = coeff->rownxt ; gcd > 1 && coeff != NULL ; coeff = coeff->rownxt) { # ifdef DYLP_PARANOIA if (coeff->colhdr == NULL) { errmsg(125,rtnnme,consys->nme,"colhdr",coeff,"row", consys_nme(consys,'c',rowndx,FALSE,NULL),rowndx) ; return (-1) ; } if (coeff->colhdr->ndx <= 0 || coeff->colhdr->ndx > consys->varcnt) { errmsg(102,rtnnme,consys->nme,"column",coeff->colhdr->ndx, 1,consys->varcnt) ; return (-1) ; } if (coeff->colhdr != consys->mtx.cols[coeff->colhdr->ndx]) { errmsg(126,rtnnme,consys->nme,"column",coeff->colhdr,coeff->colhdr->ndx, coeff->colhdr->ndx,consys->mtx.cols[coeff->colhdr->ndx]) ; return (-1) ; } # endif a1 = coeff->val ; if (a1 < 0) a1 = -a1 ; if (floor(a1) != a1) return (0) ; if (a1 > gcd) { if (floor(a1/gcd) == a1/gcd) continue ; a2 = gcd ; } else { a2 = a1 ; a1 = gcd ; } /* We need to do a gcd calculation. */ while (a1 > 0 && a2 > 0) { q = floor(a1/a2) ; r = a1 - q*a2 ; a1 = a2 ; a2 = r ; } gcd = a1 ; } return ((int) gcd) ; } bool consys_accumcol (consys_struct *consys, int colndx, double *vec) /* This routine adds the column specified by colndx to the expanded vector passed in vec. Parameters: consys: constraint system colndx: column vec: vector Returns: TRUE if there are no problems, FALSE otherwise. */ { colhdr_struct *colhdr ; coeff_struct *coeff ; # if defined(DYLP_PARANOIA) || !defined(DYLP_NDEBUG) const char *rtnnme = "consys_accumcol" ; # endif # ifdef DYLP_PARANOIA if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (FALSE) ; } if (consys->mtx.cols == NULL) { errmsg(101,rtnnme,consys->nme,"column header") ; return (FALSE) ; } # endif # ifndef DYLP_NDEBUG if (colndx <= 0 || colndx > consys->varcnt) { errmsg(102,rtnnme,consys->nme,"column",colndx,1,consys->varcnt) ; return (FALSE) ; } # endif colhdr = consys->mtx.cols[colndx] ; # ifdef DYLP_PARANOIA if (colhdr == NULL) { errmsg(103,rtnnme,consys->nme,"column",colndx) ; return (FALSE) ; } if (colndx != colhdr->ndx) { errmsg(126,rtnnme,consys->nme,"column",colhdr,colhdr->ndx,colndx,colhdr) ; return (FALSE) ; } if (vec == NULL) { errmsg(2,rtnnme,"vec") ; return (FALSE) ; } # endif for (coeff = colhdr->coeffs ; coeff != NULL ; coeff = coeff->colnxt) { # ifdef DYLP_PARANOIA if (coeff->rowhdr == NULL) { errmsg(125,rtnnme,consys->nme,"rowhdr",coeff,"column", consys_nme(consys,'v',colndx,FALSE,NULL),colndx) ; return (FALSE) ; } if (coeff->rowhdr->ndx <= 0 || coeff->rowhdr->ndx > consys->concnt) { errmsg(102,rtnnme,consys->nme,"row",coeff->rowhdr->ndx, 1,consys->concnt) ; return (FALSE) ; } if (coeff->rowhdr != consys->mtx.rows[coeff->rowhdr->ndx]) { errmsg(126,rtnnme,consys->nme,"row",coeff->rowhdr,coeff->rowhdr->ndx, coeff->rowhdr->ndx,consys->mtx.rows[coeff->rowhdr->ndx]) ; return (FALSE) ; } # endif vec[coeff->rowhdr->ndx] += coeff->val ; } return (TRUE) ; } bool consys_mulaccumcol (consys_struct *consys, int colndx, double scalar, double *vec) /* This routine multiplies the column specified by colndx by scalar and then adds it to the expanded vector passed in vec. Identical to consys_accumcol, except for the multiplication. Parameters: consys: constraint system colndx: column scalar: scalar multiplier for column vec: vector Returns: TRUE if there are no problems, FALSE otherwise. */ { colhdr_struct *colhdr ; coeff_struct *coeff ; # if defined(DYLP_PARANOIA) || !defined(DYLP_NDEBUG) const char *rtnnme = "consys_accumcol" ; # endif # ifdef DYLP_PARANOIA if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (FALSE) ; } if (consys->mtx.cols == NULL) { errmsg(101,rtnnme,consys->nme,"column header") ; return (FALSE) ; } # endif # ifndef DYLP_NDEBUG if (colndx <= 0 || colndx > consys->varcnt) { errmsg(102,rtnnme,consys->nme,"column",colndx,1,consys->varcnt) ; return (FALSE) ; } # endif colhdr = consys->mtx.cols[colndx] ; # ifdef DYLP_PARANOIA if (colhdr == NULL) { errmsg(103,rtnnme,consys->nme,"column",colndx) ; return (FALSE) ; } if (colndx != colhdr->ndx) { errmsg(126,rtnnme,consys->nme,"column",colhdr,colhdr->ndx,colndx,colhdr) ; return (FALSE) ; } if (vec == NULL) { errmsg(2,rtnnme,"vec") ; return (FALSE) ; } # endif for (coeff = colhdr->coeffs ; coeff != NULL ; coeff = coeff->colnxt) { # ifdef DYLP_PARANOIA if (coeff->rowhdr == NULL) { errmsg(125,rtnnme,consys->nme,"rowhdr",coeff,"column", consys_nme(consys,'v',colndx,FALSE,NULL),colndx) ; return (FALSE) ; } if (coeff->rowhdr->ndx <= 0 || coeff->rowhdr->ndx > consys->concnt) { errmsg(102,rtnnme,consys->nme,"row",coeff->rowhdr->ndx, 1,consys->concnt) ; return (FALSE) ; } if (coeff->rowhdr != consys->mtx.rows[coeff->rowhdr->ndx]) { errmsg(126,rtnnme,consys->nme,"row",coeff->rowhdr,coeff->rowhdr->ndx, coeff->rowhdr->ndx,consys->mtx.rows[coeff->rowhdr->ndx]) ; return (FALSE) ; } # endif vec[coeff->rowhdr->ndx] += scalar*coeff->val ; } return (TRUE) ; } DyLP-1.6.0/DyLP/src/Dylp/dy_primalpivot.c0000644000076700007670000032643211026315405015010 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains the routines which select entering and leaving variables for a primal pivot, and the primal pivot routine. */ /* A few words on degeneracy and the antidegeneracy mechanism. There's a pathological problem which I don't see any way to avoid. Suppose |x - bnd| > dy_tols->pfeas but delta = (x - bnd)/abar < dy_tols->zero. We have a `dirty' degeneracy, and there doesn't seem to be any way to handle this gracefully. The method chosen to deal with the problem follows the outlines of the handling of bogus values. The first time primalout scans one of these gems, it'll call for a refactor unless one has just been done. If we can't get rid of the problem that way, the solution adopted is to set x to whatever bound it's supposed to leave at, take a degenerate pivot, and call for an immediate refactor. Results will vary. Another problem to watch out for is the case where the perturbation used for a restricted subproblem is overly large. dy_degenin attempts to scale the perturbation so that it's at most about 1/1000 of the bound the variable is currently pinned at, but this isn't always possible. A pathological combination of small and large values of abar in the pivot column can still allow a too-large delta, so that we get a false indication of a breakout. To guard against this, the code detects cases where there are no intervening pivots between dy_degenin and dy_degenout and reduces the perturbation by a factor of 10 on each occurrence. It's not necessary to actually count pivots. Detection occurs because we never escape the loop in dy_primalpivot which selects the leaving variable. The sequence goes like this: 1) Selection of the leaving variable detects degeneracy. degenin is called to form a restricted subproblem, and degen_cyclecnt is incremented. The loop iterates. 2) Selection of a leaving variable detects an apparent breakout. degenout is called to remove the restricted subproblem. The loop iterates. 3) If we really had a breakout, selection of a leaving variable would now result in a nonzero delta. But if the breakout is false, we'll be back at step 1). We need to escape the selection loop in order to reset degen_cyclecnt, so we can do this at most three times (currently hardcoded) before the selection loop gives up and takes a degenerate pivot. At the extreme end of the scale, it can happen that it's not possible to perturb a variable at all because the bounds are too close together (a pathological problem, to be sure, but it occurs when a program (such as an ILP branch-and-bound code) is setting the bounds). What happens is that when dy_degenin attempts to scale the perturbation based on the difference between the bounds, the perturbation ends up smaller than the tolerance around the bound. Such variables are flagged with a vstatNOPER qualifier and are treated much like fixed variables for purposes of pivoting (i.e., preferentially pivot this variable out of the basis, and don't trigger a new level of antidegeneracy). Though it might not be immediately obvious, this same problem (perturbation too small) can show up as a result of the perturbation reduction described in the previous paragraph. */ /* As a `lite' alternative to installing a restricted subproblem, bonsaiG can look at hyperplane alignment for the hyperplane made tight by the leaving variable. For x leaving, if it's the slack for a it makes a tight. If it's some architectural, it makes a bound hyperplane tight. The procedure is pretty obvious except for the AlignEdge and AlignObj strategies. Consider AlignObj. Suppose we have incumbent leaving variable x, which makes hyperplane a tight, and candidate x, which will make hyperplane a tight, and delta = delta (most likely both are 0). Let h be dot(-c,a), h be dot(-c,a). If h > 0, then a will tend to shut down motion in the direction -c, since it'll become tight at this vertex. (In the extreme where -c and a go in precisely the same direction, it's the proverbial brick wall.) If h < 0, then a opens in the direction of -c (alternatively, -c moves away from a). Summarised, if only one of h and h are strictly greater than 0, you have to go with it, because it shuts down the other one. Otherwise, choose on relative magnitude. For AlignEdge, it's all the same except that h<*> = dot(eta,a<*>). If we have h == h, we can try again to resolve the tie using alignment with the objective. */ #define DYLP_INTERNAL #include "dylp.h" static char sccsid[] UNUSED = "@(#)dy_primalpivot.c 4.6 10/15/05" ; static char svnid[] UNUSED = "$Id: dy_primalpivot.c 240 2008-06-18 23:32:21Z lou $" ; /* Define this symbol to enable a thorough check of the updates to cbar and gamma, but be aware that it'll almost certainly trigger fatal errors if the LP is numerically ill-conditioned. #define CHECK_PSE_UPDATES */ #if defined(DYLP_STATISTICS) || !defined(DYLP_NDEBUG) /* Pivot counting structure for the antidegeneracy mechanism. This structure is sufficient for simple debugging; more complicated stats are collected when DYLP_STATISTICS is defined. DYSTATS_MAXDEGEN is defined in dylp.h. Field Definition ----- ---------- iterin iterin[i] is the value of tot.pivs when degeneracy level i was entered. */ typedef struct { int iterin[DYSTATS_MAXDEGEN] ; } degenstats_struct ; static degenstats_struct degenstats ; #endif /* DYLP_STATISTICS || !DYLP_NDEBUG */ /* Anti-cycling variable for the anti-degeneracy mechanism. degen_cyclecnt tracks the number of cycles and controls the reduction in the perturbation. */ static int degen_cyclecnt ; dyret_enum dy_degenout (int level) /* This routine backs out all restricted subproblems to the level given by the parameter. It copies the original value of x from dy_x into dy_xbasic, properly sets the status, adjusts dy_degenset, and resets dy_lp->degen. All variables involved in a restricted subproblem were at bound when they were collected into the subproblem. Numeric inaccuracy can cause drift over the course of pivoting. Likewise, for variables not part of the degenerate set, dy_x should equal dy_xbasic unless there's drift due to inaccuracy. This is tested as part of the accuracy checks and the antidegeneracy mechanism will be backed out if a problem is detected. Here, the same tests are just paranoia. But, this is the rationale behind resetting dy_xbasic to dy_x for variables not in the restricted subproblem, when we back out to level 0, and for coping with the possibility of status other than BLB and BUB for variables in the restricted subproblem. Parameter: level: The target level for removal of restricted subproblems. Returns: dyrOK if the restoration goes without problem, dyrREQCHK if there's been too much numerical drift since we began the degenerate subproblem. */ { int xkpos,xkndx ; double val,*vub,*vlb ; flags statk,qualk ; dyret_enum retval ; # ifdef DYLP_PARANOIA const char *rtnnme = "dy_degenout" ; # endif # ifdef DYLP_STATISTICS int curlvl,curpivs ; # endif # ifndef DYLP_NDEBUG if (dy_opts->print.degen >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: antidegeneracy dropping to level %d after %d pivots.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters,level, dy_lp->tot.pivs-degenstats.iterin[dy_lp->degen]) ; } # endif # ifdef DYLP_STATISTICS /* Record the iteration counts. This needs to be a loop because we can peel off multiple levels. */ if (dy_stats != NULL) for (curlvl = dy_lp->degen ; curlvl > level ; curlvl--) { if (curlvl < DYSTATS_MAXDEGEN) { curpivs = dy_lp->tot.pivs-degenstats.iterin[curlvl] ; dy_stats->pdegen[curlvl].totpivs += curpivs ; dy_stats->pdegen[curlvl].avgpivs = ((float) dy_stats->pdegen[curlvl].totpivs)/ dy_stats->pdegen[curlvl].cnt ; if (curpivs > dy_stats->pdegen[curlvl].maxpivs) dy_stats->pdegen[curlvl].maxpivs = curpivs ; } } # endif retval = dyrOK ; vub = dy_sys->vub ; vlb = dy_sys->vlb ; /* Back out restricted subproblems to the level specified by level. Keep in mind that all variables initially sucked into a restricted subproblem were basic at bound, but the variables currently occupying those slots could be free variables. */ for (xkpos = 1 ; xkpos <= dy_sys->concnt ; xkpos++) { xkndx = dy_basis[xkpos] ; val = dy_x[xkndx] ; if (dy_degenset[xkpos] > level) { dy_degenset[xkpos] = level ; if (level == 0) clrflg(dy_status[xkndx],vstatNOPER) ; statk = dy_status[xkndx] ; if (flgon(statk,vstatBFR)) { dy_xbasic[xkpos] = dy_x[xkndx] ; } else if (flgon(statk,vstatBFX)) { dy_xbasic[xkpos] = vub[xkndx] ; } else { qualk = getflg(dy_status[xkndx],vstatQUALS) ; if (atbnd(val,vub[xkndx])) { statk = vstatBUB ; val = vub[xkndx] ; dy_x[xkndx] = val ; } else if (atbnd(val,vlb[xkndx])) { statk = vstatBLB ; val = vlb[xkndx] ; dy_x[xkndx] = val ; } else { retval = dyrREQCHK ; if (val < vlb[xkndx]) statk = vstatBLLB ; else if (val > vub[xkndx]) statk = vstatBUUB ; else statk = vstatB ; # ifdef DYLP_PARANOIA if (withintol(val,vub[xkndx], 1000*dy_tols->pfeas*(1+fabs(vub[xkndx])))) { warn(342,rtnnme,dy_sys->nme, consys_nme(dy_sys,'v',xkndx,FALSE,NULL),xkndx,val, vlb[xkndx],vub[xkndx],"bogosity",fabs(val-vub[xkndx]), 1000*dy_tols->pfeas*(1+fabs(vub[xkndx]))) ; } else if (withintol(val,vlb[xkndx], 1000*dy_tols->zero*(1+fabs(vlb[xkndx])))) { warn(342,rtnnme,dy_sys->nme, consys_nme(dy_sys,'v',xkndx,FALSE,NULL),xkndx,val, vlb[xkndx],vub[xkndx],"bogosity",fabs(val-vlb[xkndx]), 1000*dy_tols->pfeas*(1+fabs(vlb[xkndx]))) ; } else { if (fabs(val-vlb[xkndx]) < fabs(val-vub[xkndx])) { errmsg(342,rtnnme,dy_sys->nme, consys_nme(dy_sys,'v',xkndx,FALSE,NULL),xkndx,val, vlb[xkndx],vub[xkndx],"violation",fabs(val-vlb[xkndx]), dy_tols->pfeas*(1+fabs(vlb[xkndx]))) ; } else { errmsg(342,rtnnme,dy_sys->nme, consys_nme(dy_sys,'v',xkndx,FALSE,NULL),xkndx,val, vlb[xkndx],vub[xkndx],"violation",fabs(val-vub[xkndx]), dy_tols->pfeas*(1+fabs(vub[xkndx]))) ; } } # endif } setflg(statk,qualk) ; dy_status[xkndx] = statk ; dy_xbasic[xkpos] = val ; } # ifndef DYLP_NDEBUG if ((dy_opts->print.degen >= 4 && flgoff(dy_status[xkndx],vstatBLB|vstatBFX|vstatBUB)) || dy_opts->print.degen >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t%s (%d) restored to %g, status %s", consys_nme(dy_sys,'v',xkndx,FALSE,NULL),xkndx, val,dy_prtvstat(dy_status[xkndx])) ; if (flgoff(dy_status[xkndx],vstatBLB|vstatBFX|vstatBUB|vstatBFR)) { if (fabs(val-vlb[xkndx]) < fabs(val-vub[xkndx])) dyio_outfmt(dy_logchn,dy_gtxecho,", accum. error %g (tol. %g)", fabs(val-vlb[xkndx]), dy_tols->zero*(1.0+fabs(vlb[xkndx]))) ; else dyio_outfmt(dy_logchn,dy_gtxecho,", accum. error %g (tol. %g)", fabs(val-vub[xkndx]), dy_tols->zero*(1.0+fabs(vub[xkndx]))) ; } } # endif } else if (level == 0) { if (!atbnd(val,dy_xbasic[xkpos])) { retval = dyrREQCHK ; # ifndef DYLP_NDEBUG if (dy_opts->print.degen >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t%s (%d) unperturbed, accum. error %g (tol. %g)", consys_nme(dy_sys,'v',xkndx,FALSE,NULL),xkndx, fabs(val-dy_xbasic[xkpos]), dy_tols->zero*(1.0+fabs(dy_xbasic[xkpos]))) ; } # endif } dy_xbasic[xkpos] = val ; } } dy_lp->degen = level ; return (retval) ; } static void dy_degenin (void) /* This routine forms a new restricted subproblem, increasing the degeneracy level kept in dy_lp->degen. An initial base perturbation is calculated so that the maximum possible perturbation fraction, perturb = (base)*(concnt), is less than 1.0e-3. The base is then increased, if necessary, so that the minimum perturbation exceeds the basic feasibility tolerance. For each variable, the actual perturbation is calculated as perturb = base*xkpos*min((1+bnd),.5*(vub-vlb)). If we don't scale the perturbation by the size of the bound, we're in trouble at the upper end of the scale because the perturbation won't be big enough to move out of the tolerance range around the bound. Adding 1 to the relevant bound gets us out of trouble around zero. Taking into account the range vub-vlb saves us when both bounds are small, or when for some reason the range has been seriously reduced. It can happen that the scaled perturbation is just too small --- the routine uses the bogus number tolerance --- in which case the variable is flagged with a vstatNOPER qualifier, and will be treated essentially the same as a fixed variable for pivoting purposes (i.e., preferentially move it out of the basis). The routine should not be called if degeneracy isn't present, and will do a paranoid check to make sure that's true. Parameters: none Returns: undefined */ { int xkpos,xkndx,oldlvl ; double base,perturb,xk,ubk,lbk,toobig ; flags xkstatus ; # ifdef DYLP_PARANOIA char *rtnnme = "dy_degenin" ; # endif # if defined(DYLP_PARANOIA) || defined(DYLP_STATISTICS) || !defined(DYLP_NDEBUG) int degencnt ; degencnt = 0 ; # endif /* We want the base perturbation to be such that (concnt)*(base) <= 1.0e-3. But ... if we're in here again because the previous perturbation was too large (degen_cyclecnt > 0), decrease it by a factor of 10 for each repeat. Balance that against the notion that if the perturbation is too small (less than pfeas), we simply can't see it. */ base = pow(10.0,(-3-ceil(log10(dy_sys->concnt))-degen_cyclecnt)) ; while (base <= dy_tols->pfeas) base *= 10 ; oldlvl = dy_lp->degen++ ; # ifndef DYLP_NDEBUG if (dy_opts->print.degen >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: antidegeneracy increasing to level %d", dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,dy_lp->degen) ; if (degen_cyclecnt > 0) dyio_outfmt(dy_logchn,dy_gtxecho,", cycle %d",degen_cyclecnt) ; dyio_outfmt(dy_logchn,dy_gtxecho,", base perturbation %g%s", base,(dy_opts->print.degen >= 4)?":":".") ; } # endif # if defined(DYLP_STATISTICS) || !defined(DYLP_NDEBUG) if (dy_lp->degen < DYSTATS_MAXDEGEN) degenstats.iterin[dy_lp->degen] = dy_lp->tot.pivs ; # endif # ifdef DYLP_STATISTICS if (dy_stats != NULL && dy_lp->degen < DYSTATS_MAXDEGEN) { if (dy_stats->pdegen[0].cnt < dy_lp->degen) dy_stats->pdegen[0].cnt = dy_lp->degen ; dy_stats->pdegen[dy_lp->degen].cnt++ ; } # endif for (xkpos = 1 ; xkpos <= dy_sys->concnt ; xkpos++) { if (dy_degenset[xkpos] != oldlvl) continue ; xkndx = dy_basis[xkpos] ; xkstatus = dy_status[xkndx] ; if (flgoff(xkstatus,vstatBLB|vstatBFX|vstatBUB)) continue ; ubk = dy_sys->vub[xkndx] ; lbk = dy_sys->vlb[xkndx] ; xk = dy_xbasic[xkpos] ; toobig = .001*(ubk-lbk) ; dy_degenset[xkpos] = dy_lp->degen ; switch (xkstatus) { case vstatBLB: { dy_brkout[xkpos] = 1 ; perturb = base*xkpos*(1+fabs(lbk)) ; xk += perturb ; if (perturb < toobig && !atbnd(xk,lbk)) { dy_xbasic[xkpos] = xk ; dy_status[xkndx] = vstatB ; } else setflg(dy_status[xkndx],vstatNOPER) ; break ; } case vstatBUB: { dy_brkout[xkpos] = -1 ; perturb = base*xkpos*(1+fabs(ubk)) ; xk -= perturb ; if (perturb < toobig && !atbnd(xk,ubk)) { dy_xbasic[xkpos] = xk ; dy_status[xkndx] = vstatB ; } else setflg(dy_status[xkndx],vstatNOPER) ; break ; } case vstatBFX: { dy_brkout[xkpos] = 0 ; setflg(dy_status[xkndx],vstatNOPER) ; break ; } } # if defined(DYLP_PARANOIA) || defined(DYLP_STATISTICS) degencnt++ ; # endif # ifndef DYLP_NDEBUG if (dy_opts->print.degen >= 5 || (dy_opts->print.degen >= 4 && flgon(dy_status[xkndx],vstatNOPER) && flgoff(dy_status[xkndx],vstatBFX))) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t%s %s (%d) in pos'n %d ", dy_prtvstat(dy_status[xkndx]), consys_nme(dy_sys,'v',xkndx,FALSE,NULL),xkndx,xkpos) ; if (flgon(dy_status[xkndx],vstatNOPER)) dyio_outfmt(dy_logchn,dy_gtxecho,"unperturbed.") ; else { dyio_outfmt(dy_logchn,dy_gtxecho,"perturbed from %g (%s) to %g", dy_x[xkndx],dy_prtvstat(xkstatus),dy_xbasic[xkpos]) ; dyio_outfmt(dy_logchn,dy_gtxecho,", breakout %s.", (dy_brkout[xkpos] == 1)?"up":"down") ; } } # endif } # ifdef DYLP_PARANOIA if (degencnt <= 0) { errmsg(327,rtnnme,dy_sys->nme) ; return ; } # endif # ifndef DYLP_NDEBUG if (dy_opts->print.degen >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho,"%s%d variables.", (dy_opts->print.degen <= 4)?", ":"\n\ttotal ",degencnt) ; } # endif # ifdef DYLP_STATISTICS if (dy_stats != NULL && dy_lp->degen < DYSTATS_MAXDEGEN) { if (dy_stats->pdegen[dy_lp->degen].maxsiz < degencnt) dy_stats->pdegen[dy_lp->degen].maxsiz = degencnt ; xkndx = dy_stats->pdegen[dy_lp->degen].cnt-1 ; perturb = dy_stats->pdegen[dy_lp->degen].avgsiz ; dy_stats->pdegen[dy_lp->degen].avgsiz = (float) ((perturb*xkndx+degencnt)/(xkndx+1)) ; } # endif return ; } static bool pricexk (int k, int *p_j, double *p_ncbarj, bool *p_pivreject) /* This routine encapsulates the code used to decide if the variable x prices out more favourably than the current candidate for entry x. It's pulled out as a subroutine for readability and to make sure that the same rules are used in each location where variables are priced. The first part of the routine deals with various a priori reasons for disqualification: * x is SB and x is not * the sign of cbar is wrong for minimisation, given stat * x is NBLB or NBUB and cbar == 0 * x is flagged as NOPIVOT SB variables get past the cbar == 0 test because we want them to be basic in the final answer, so that we have a valid basic solution. NBFR variables are preferentially pivoted into the basis (where they will never leave) but in order to handle pathological examples with more free variables than constraints, we can't force this. Given that x passes the above tests and is thus a feasible candidate, we're interested in whether it's the best candidate. The tests are 1) stat == SB and stat != SB 2) |ncbar| > |ncbar| 3) stat == NBFR and stat != NBFR Parameters: k: index of x, the variable to be priced p_j: (o) if x should supplant x, xjndx will be updated, otherwise it'll be unchanged p_ncbarj: (i) |cbar|/||abar||, where x is the current candidate (o) if x should supplant x, ncbarj will be updated, otherwise it'll be unchanged p_pivreject: (o) will be set to TRUE if x could have been a contender except for being flagged with the NOPIVOT status qualifier; otherwise, it'll be unchanged. Returns: TRUE if x replaced x, FALSE otherwise. */ { int j ; double ncbarj,cbark,ncbark ; flags statk,statj ; j = *p_j ; ncbarj = *p_ncbarj ; if (j != 0) statj = dy_status[j] ; else statj = 0 ; statk = dy_status[k] ; # ifndef DYLP_NDEBUG if (dy_opts->print.pricing >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\tpricing %s (%d), status %s; ", consys_nme(dy_sys,'v',k,FALSE,NULL),k, dy_prtvstat(statk)) ; } # endif /* A quick status check. If x is SB and x is not, x loses and we can skip the effort of actually pricing it. */ if (flgoff(statk,vstatSB) && flgon(statj,vstatSB)) { # ifndef DYLP_NDEBUG if (dy_opts->print.pricing >= 3) dyio_outfmt(dy_logchn,dy_gtxecho," << reject (vstatSB) >>") ; # endif return (FALSE) ; } /* Price x as ncbar = dot(c,h)/||h||, where dot(c,h) is held in cbar and ||h||^2 is held in gamma. Check that cbar has the right sign and that ncbar is big enough to consider. For SB variables, we're potentially interested even if ncbar is 0. */ cbark = dy_cbar[k] ; if ((cbark < 0 && flgon(statk,vstatNBUB)) || (cbark > 0 && flgon(statk,vstatNBLB))) { # ifndef DYLP_NDEBUG if (dy_opts->print.pricing >= 3) dyio_outfmt(dy_logchn,dy_gtxecho," << reject (incompatible status) >>") ; # endif return (FALSE) ; } if (flgoff(statk,vstatSB)) { if (withintol(cbark,0,dy_tols->dfeas)) { # ifndef DYLP_NDEBUG if (dy_opts->print.pricing >= 3) dyio_outfmt(dy_logchn,dy_gtxecho," << reject (zero) >>") ; # endif return (FALSE) ; } } ncbark = fabs(cbark)/sqrt(dy_gamma[k]) ; setcleanzero(ncbark,dy_tols->cost) ; # ifndef DYLP_NDEBUG if (dy_opts->print.pricing >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "cbar = %g, ||h|| = %g, |cbar|/||h|| = %g.", cbark,sqrt(dy_gamma[k]),ncbark) ; } # endif /* x could enter. Reject if it's flagged with the NOPIVOT qualifier and note that we've done so. */ if (flgon(statk,vstatNOPIVOT)) { *p_pivreject = TRUE ; # ifndef DYLP_NDEBUG if (dy_opts->print.pricing >= 3) dyio_outfmt(dy_logchn,dy_gtxecho," << reject (vstatNOPIVOT) >>") ; # endif return (FALSE) ; } /* x is suitable. The only question remaining is whether it's more suitable than x. The criteria, in order, are: 1) stat == vstatSB 2) ncbar > ncbar 3) stat == vstatNBFR and stat != vstatNBFR */ if (flgon(statk,vstatSB) && flgoff(statj,vstatSB)) { j = k ; # ifndef DYLP_NDEBUG if (dy_opts->print.pricing >= 3) dyio_outfmt(dy_logchn,dy_gtxecho," << accept (vstatSB) >>") ; # endif } else if (ncbark > ncbarj) { j = k ; # ifndef DYLP_NDEBUG if (dy_opts->print.pricing >= 3) dyio_outfmt(dy_logchn,dy_gtxecho," << accept (ncbar) >>") ; # endif } else if (withintol(ncbark,ncbarj,dy_tols->dfeas) && flgon(statk,vstatNBFR) && flgoff(statj,vstatNBFR)) { j = k ; # ifndef DYLP_NDEBUG if (dy_opts->print.pricing >= 3) dyio_outfmt(dy_logchn,dy_gtxecho," << accept (vstatNBFR) >>") ; # endif } else { # ifndef DYLP_NDEBUG if (dy_opts->print.pricing >= 3) dyio_outfmt(dy_logchn,dy_gtxecho," << reject (inferior) >>") ; # endif } if (j != *p_j) { *p_j = j ; *p_ncbarj = ncbark ; return (TRUE) ; } else { return (FALSE) ; } } dyret_enum dy_primalin (int startcol, int scan, int *xjndx, int *nextcol) /* In the normal course of events with PSE pricing, selection of the next incoming variable is made during the update of cbar and gamma. But we need a backup to select a new candidate when the preselected candidate is rejected, and we need a way to select an initial pivot. Hence this routine. dy_primalin prices columns to come up with an entering candidate. It uses a sort of partial pricing, scanning a block of columns of size scan and returning the column index of the best candidate. The routine is persistent, in the sense that it will scan until a candidate is discovered or all columns have been scanned. A return value of dyrOPTIMAL means that all columns were scanned without finding a variable suitable for pivoting into the basis. The last column scanned is returned in lastcol. (Why all this fuss? Historical inertia --- a previous version of the code used full-blown partial pricing.) If |cbar| < bogus*dfeas, x is not considered for entry unless we've just refactored. The assumed sequence of events is that primalin returns dyrOPTIMAL with xjndx == 0, triggering preoptimality, which refactors, finds loss of dual feasibility, and we're back here ready to consider tiny reduced costs. If we see cbar of the correct sign, but x is flagged as NOPIVOT, we return dyrPUNT. Roughly the same sequence will occur (preoptimality & loss of dual feasibility) but with the important side-effect of relaxing the pivot selection tolerance (so that some of the x flagged as NOPIVOT may become useable). Parameters: startcol: The first column to be priced by this call. scan: The number of columns to be priced. xjndx: (o) Index of the candidate x. nextcol: (o) The next column to be priced. Returns: dyrOK if a candidate x is found without problem, dyrOPTIMAL if no candidate is selected, dyrPUNT if no candidate was selected but there are potential x on the pivot reject list, dyrFATAL otherwise */ { int xkndx,scanned,total_scanned,scan_blk,this_blk ; flags xkstatus ; bool pivreject ; double ncbarj ; dyret_enum retval ; # if defined(DYLP_PARANOIA) || !defined(DYLP_NDEBUG) const char *rtnnme = "dy_primalin" ; # endif # ifdef DYLP_PARANOIA if (dy_cbar == NULL) { errmsg(101,rtnnme,dy_sys->nme,"dy_cbar") ; return (dyrFATAL) ; } if (startcol <= 0 || startcol > dy_sys->varcnt) { errmsg(102,rtnnme,dy_sys->nme,"column",startcol,1,dy_sys->varcnt) ; return (dyrFATAL) ; } # endif /* Set up for the scan. We'll be looking for the largest normalised reduced cost |cbar|/||abar|| over nonbasic columns k, so 0 is bad. */ *xjndx = 0 ; ncbarj = -dy_tols->inf ; xkndx = startcol ; scan_blk = minn(scan,dy_sys->varcnt) ; retval = dyrINV ; # ifndef DYLP_NDEBUG if (dy_opts->print.pricing >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: pricing %d columns from %d for %d candidate.", rtnnme,scan_blk,xkndx,1) ; } # endif /* Open up a pair of loops to start pricing columns. The outer loop gives persistence -- scan until we find something or have scanned all the columns. The inner loop steps through the columns. Make sure the size of the scan_blk is not more than the number of columns remaining to be scanned, nor larger than the distance to the end of the array. */ pivreject = FALSE ; for (total_scanned = 0 ; (total_scanned < scan_blk) || (total_scanned < dy_sys->varcnt && *xjndx == 0) ; total_scanned += scanned) { this_blk = minn(scan_blk,dy_sys->varcnt-total_scanned) ; this_blk = minn(this_blk,dy_sys->varcnt-xkndx+1) ; for (scanned = 0 ; scanned < this_blk ; scanned++,xkndx++) { xkstatus = dy_status[xkndx] ; # ifdef DYLP_PARANOIA if (dy_chkstatus(xkndx) == FALSE) return (dyrFATAL) ; # endif /* We're not interested in basic variables or nonbasic fixed variables, so step right over them. (Artificials will fall into the NBFX class). We also skip variables on the rejected pivot list, flagged as not eligible for entry with the NOPIVOT qualifier. */ if (flgon(xkstatus,vstatBASIC|vstatNBFX)) { # ifndef DYLP_NDEBUG if (dy_opts->print.pricing >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tpricing %s (%d), status %s; << status >>", consys_nme(dy_sys,'v',xkndx,TRUE,NULL),xkndx, dy_prtvstat(xkstatus)) ; } # endif continue ; } /* Price x and replace the current candidate x if appropriate. */ (void) pricexk(xkndx,xjndx,&ncbarj,&pivreject) ; } /* End of loop for this_blk. We need to wrap xkndx here, after falling out of the this_blk loop, to make sure nextcol returns with the proper value when the scan ends precisely on the last column. */ if (xkndx > dy_sys->varcnt) xkndx = 1 ; } /* If we're here, then the scan went ok. As a paranoid check, if we didn't find any candidates to enter we should have scanned all the columns, hence total_scanned should equal dy_sys->varcnt and xkndx should equal startcol. */ # ifdef DYLP_PARANOIA if (*xjndx == 0) { if (total_scanned != dy_sys->varcnt || xkndx != startcol) { errmsg(1,rtnnme,__LINE__) ; return (dyrFATAL) ; } } # endif /* What's the proper return value? If we have a candidate, return dyrOK. There are three possible reasons for finding no candidate (*xjndx == 0): * We have potential pivots on the reject list: pivreject == TRUE. We want to return dyrPUNT; see comments at head of routine. * We're optimal (phase II) or infeasible (phase I): pivreject == FALSE. dyrOPTIMAL is the proper return value. * We saw some cbar with the correct sign, but they were bogus numbers: pivreject == FALSE: dyrOPTIMAL is still the correct return code; see comments at head of routine. */ if (*xjndx == 0) { if (pivreject == TRUE) retval = dyrPUNT ; else retval = dyrOPTIMAL ; } else { retval = dyrOK ; } # ifndef DYLP_NDEBUG if (dy_opts->print.pricing >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: (%s)%d: scanned %d columns %d to %d, selected %d", rtnnme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, total_scanned,startcol,(xkndx-1 < 1)?dy_sys->varcnt:(xkndx-1), (*xjndx == 0)?0:1) ; if (dy_opts->print.pricing >= 2 && *xjndx != 0) { dyio_outchr(dy_logchn,dy_gtxecho,':') ; dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t%s (%d) scaled reduced cost %g.", consys_nme(dy_sys,'v',*xjndx,TRUE,NULL),*xjndx,ncbarj) ; } else if (retval == dyrPUNT) { dyio_outfmt(dy_logchn,dy_gtxecho, ",\n\tall suitable x on rejected pivot list.") ; } else { dyio_outchr(dy_logchn,dy_gtxecho,'.') ; } } # endif /* That's it. Report the next column to be scanned and return. */ *nextcol = xkndx ; return (retval) ; } static double cdothyper (int xkndx, int dirk) /* This routine is used in the context of primal antidegen lite, where we're trying to choose the leaving variable using hyperplane alignment with the objective. The choice of leaving variable determines the hyperplane which will become tight on completion of the pivot. The routine calculates the dot product of -c with a constraint normal a, normalised by ||a||. ||c|| doesn't change over the various candidates, so we don't need to include it in the normalisation for comparison purposes. The only thing to watch is that we get the right direction for the hyperplane. See pdirdothyper for extensive comments that explain how dirk is applied. Parameters: xkndx: index of x, the candidate to leave dirk: the direction of change; -1 to decrease, +1 to increase Returns: -dirk*dot(-c,a)/||a||, as described above, or NaN if something goes awry. */ { double dotprod ; /* If x is a slack, we want the coefficients of the explicit constraint. */ if (xkndx <= dy_sys->concnt) { dotprod = consys_dotrow(dy_sys,xkndx,dy_sys->obj) ; dotprod = dirk*dotprod/consys_2normrow(dy_sys,xkndx) ; } /* If x is an architectural, we have a bound constraint, coefficient 1.0 for x only. */ else { dotprod = dirk*(-dy_sys->obj[xkndx]) ; } setcleanzero(dotprod,dy_tols->zero) ; return (dotprod) ; } static double pdirdothyper (int xjndx, double *abarj, int dirj, int xkndx, int dirk) /* This routine is used in the context of primal antidegen lite, where we're trying to choose the leaving variable x using hyperplane alignment. The choice of entering variable x determined the edge eta to be traversed. The choice of leaving variable will determine the hyperplane ax <= b which will become tight on completion of the pivot. This routine is called with a candidate leaving variable x, and we're interested in the alignment of eta with the normal a, which will be dot(eta,a)/(||eta||)(||a||). Since ||eta|| won't change in the course of selecting a leaving variable, we don't bother with it here. If x is decreasing, we need to multiply eta by -1 to get the direction of motion right. When x is a slack, the constraint coming tight is (nominally) ax <= b. If x is in fact an upper bounded slack increasing to its upper bound, we need to multiply a by -1, since the constraint is really ax >= blow. We also need to be careful in phase I that we compensate when we're approaching a constraint from the wrong side. Here's a table: Direction bound constraint correction decreasing lb ax <= b +1 decreasing ub ax >= blow, wrong side +1 increasing ub ax >= blow -1 increasing lb ax <= b, wrong side -1 The `wrong side' cases occur in phase I. The bottom line is multiplication by -dir will do it. Here too, the dot product boils down to -abar. When x is an architectural variable, the constraint coming tight is implicit --- either the upper bound constraint x <= ub or the lower bound constraint x >= l. It's easiest to do this as a separate case. The constraint normal is e, and the norm is 1.0. The dot product simply selects -abar from eta. A little care is required to make sure we always put the constraint into <= form, particularly when we approach a bound from the wrong side in phase I, but it boils down to multiplication by dir to get it right. The paranoid calculation actually does the dot product for explicit constraints as a check, retrieving the coefficients and then translating between basis pos'n and variable index, since abar is indexed by basis pos'n while a uses variable indices. It's a small but ugly truth that the dynamic nature of the constraint system allows for us to encounter `empty' constraints, with no active variables except for the slack. Hence we need to add 1 to ||a|| to protect against division by zero. Parameters: xjndx: index of x, the entering variable abarj: inv(B)a, part of the desired direction of motion for this pivot dirj: direction of motion for x, -1 if it's decreasing from its upper bound, +1 if it's increasing from its lower bound xkndx: index of x, the candidate to leave dirk: proposed direction of motion for x, -1 to decrease, +1 to increase Returns: dir*(-dir)*dot(eta,a)/||a||, or NaN if something goes awry. */ { double dotprod,normak,abarkj ; # ifdef DYLP_PARANOIA int pkndx,xqndx,xqpos ; double xqcoeff ; pkvec_struct *ak ; pkcoeff_struct *akq ; const char *rtnnme = "pdirdothyper" ; # endif abarkj = abarj[dy_var2basis[xkndx]] ; /* Start with the case where x is a slack, and we're dealing with an explicit constraint. */ if (xkndx <= dy_sys->concnt) { # ifdef DYLP_PARANOIA /* Retrieve the constraint normal a and do the dot product. The procedure is to walk the (sparse) row, translating each column coefficient to a basis pos'n to find the proper value in eta. Exclude the slack variable (we're working with the inequality, not the equality that results from adding the slack). Multiply the accumulated result by dir to account for the entering variable's direction of motion, and -dir to account for the incoming variable's motion (hence the type of constraint coming tight). Check that we're equal to abar. */ ak = NULL ; if (consys_getrow_pk(dy_sys,xkndx,&ak) == FALSE) { errmsg(122,rtnnme,dy_sys->nme, "row",consys_nme(dy_sys,'c',xkndx,TRUE,NULL),xkndx) ; if (ak != NULL) pkvec_free(ak) ; return (quiet_nan(0)) ; } dotprod = 0 ; for (pkndx = 0, akq = ak->coeffs ; pkndx < ak->cnt ; pkndx++, akq++) { xqndx = akq->ndx ; if (xqndx == xkndx) continue ; xqcoeff = akq->val ; xqpos = dy_var2basis[xqndx] ; if (xqpos > 0) { dotprod -= xqcoeff*abarj[xqpos] ; } else if (xqndx == xjndx) { dotprod += xqcoeff ; } } pkvec_free(ak) ; if (!withintol(dotprod,abarkj,dy_tols->zero)) { errmsg(401,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters+1,dotprod,xjndx,xkndx,xkndx,xjndx,-abarkj, fabs(dotprod-abarkj),dy_tols->zero) ; return (quiet_nan(0)) ; } # endif normak = consys_2normrow(dy_sys,xkndx) ; dotprod = dirj*(-dirk)*(-abarkj)/(normak+1) ; } /* Architecturals need a bound constraint. As per the analysis at the head of the routine, multiplication by dir is necessary to properly convert to a <= constraint under all circumstances. */ else { dotprod = dirj*dirk*(-abarkj) ; } setcleanzero(dotprod,dy_tols->zero) ; return (dotprod) ; } static dyret_enum primalout (int xjndx, int indir, double *abarj, double maxabarj, int *xindx, int *outdir, double *deltaj) /* This routine selects the leaving variable x given the entering variable x and the direction of movement (indir) as x enters the basis. The calculation is the standard limit test, starting from the expression that x = inv(B)b - inv(B)ax. We're interesting in finding out the limit on the change in x (delta) imposed by lb, ub, and by the upper and lower bounds on the basic variables x. The minimum delta over all these determines the leaving variable x. x can move from one bound to the other and be both the entering and leaving variable. This is complicated slightly if we're working a perturbed subproblem due to degeneracy. In this case, we only consider the basic variables associated with the constraints involved in the degeneracy. If two variables have equal delta (we're about to pivot into a degenerate vertex) the tie is broken based on the stability of the pivot (default), or according to one of the alignment-based antidegen lite strategies (which see). If we find an x with a delta of 0 (we're already at a degenerate vertex) the default is to take it (and abort the scan) unless the pivot looks bogus. Again, one of the antidegen lite strategies can be specified as an option. Where the tie is between a basic variable x vs. a bound-to-bound swing of x, x always wins, because we avoid pivoting the basis. Note that during phase I, if we're out-of-bound, we calculate the limit on delta based on the maximum move (across the near bound to the far bound, when it exists, otherwise just to the near bound). The wisdom of this is debatable. It offers the possibility of many variables gaining feasibilty in a single pivot, but there are real costs associated with maintaining PSE pricing information, and hypothetical costs associated with whether this is actually good in terms of the phase I objective (c for a variable should go to 0 when it hits feasibility, so moving to the far bound might not look favorable if we were to recalculate the reduced cost) and in terms of the phase II objective (difficult to quantify). Parameters: xjndx: Index of the entering variable x. indir: Direction of motion of x. -1: decreasing from upper bound 1: increasing from lower bound abarj: Ftran'd column inv(B)a associated with x. maxabarj: MAX{i}(abar) xindx: (o) Index of the leaving variable x. Also valid for return code dyrLOSTPFEAS (in which case it is the index of the variable where feasibility loss was discovered) and dyrREQCHK (in which case it is the index of the variable whose pivot a was declared bogus). outdir: (o) Direction of motion of x, coded as: -1: decreasing to lower bound 1: increasing to upper bound deltaj: (o) Absolute value of the allowable change in x. Returns: dyret_enum code, as follows: dyrOK: a strictly basic leaving variable was successfully selected (this includes dirty degeneracy) dyrDEGEN: a basic at bound leaving variable is selected; the pivot will be (cleanly) degenerate dyrMADPIV: the pivot coefficient abar would be numerically unstable dyrREQCHK: a possibly bogus abar was selected as the pivot, and refactoring seems wise before trying to use it (basis.etas > 1 is the criteria) dyrUNBOUND: the problem is unbounded dyrLOSTPFEAS: primal feasibility has been lost dyrFATAL: fatal confusion */ { int xkpos,xkndx,outk,degencnt ; flags xkstatus ; double abarij,ratioij,aligni,deltak,abarkj,ratiokj,bndk,alignk ; bool newxi ; dyret_enum retval ; const char *rtnnme = "primalout" ; retval = dyrINV ; # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: selecting leaving variable, iteration %d", rtnnme,dy_lp->tot.iters+1) ; if (dy_opts->print.pivoting >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\tentering variable %s (%d) %s", consys_nme(dy_sys,'v',xjndx,FALSE,NULL),xjndx, (indir > 0)?"increasing":"decreasing") ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tPos'n\tVariable\tValue\tabar\tbound\tdelta\tDisp") ; } } # endif /* Start off by assuming the entering variable x will also be the leaving variable. Calculate the limits on delta imposed by moving to ub or lb. (Using dy_x allows uniform handling of normal nonbasic and superbasic variables.) If delta is infinite, the relevant bound doesn't exist, and we'll need to find our leaving variable among the basic variables. If the allowable delta is less than or equal to 0, we have serious confusion. If delta < 0, the variable is nonbasic and outside its bounds. If delta == 0, the variable is trying to reenter at the same bound it left with, and it shouldn't have been chosen by primalin as a candidate for entry. */ *xindx = xjndx ; *outdir = indir ; abarij = 1.0 ; if (indir == -1) { *deltaj = dy_x[xjndx]-dy_sys->vlb[xjndx] ; } else { *deltaj = dy_sys->vub[xjndx]-dy_x[xjndx] ; } # ifdef DYLP_PARANOIA if (*deltaj < -dy_tols->zero) { errmsg(325,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters+1,consys_nme(dy_sys,'v',xjndx,FALSE,NULL), xjndx,dy_x[xjndx],dy_sys->vlb[xjndx],dy_sys->vub[xjndx], dy_prtvstat(dy_status[xjndx])) ; return (dyrFATAL) ; } if (withintol(*deltaj,0,dy_tols->zero)) { errmsg(326,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters+1,consys_nme(dy_sys,'v',xjndx,FALSE,NULL),xjndx, dy_x[xjndx],(indir == 1)?"ub":"lb",dy_prtvstat(dy_status[xjndx]), (indir == 1)?"ub":"lb") ; return (dyrFATAL) ; } # endif # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 3 && *deltaj < dy_tols->inf) dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t n/a\t%-8s (%d)\t%7g\t%9g\t%7g\t%7g\tleaving at %s", consys_nme(dy_sys,'v',xjndx,FALSE,NULL),xjndx, (indir > 0)?dy_sys->vlb[xjndx]:dy_sys->vub[xjndx],1.0, (indir > 0)?dy_sys->vub[xjndx]:dy_sys->vlb[xjndx],*deltaj, (*outdir > 0)?"ub":"lb") ; # endif /* Open a loop to step through the basic variables. We'll keep at it until we've scanned them all, barring something extraordinary. For each variable x, we * Check if it's eligible in the presence of degeneracy (i.e., the variable is associated with a constraint in the current degenerate set). * Check that abar is nonzero. * Check for basic free -- these never leave. * Flip the sign of abar if x is entering and decreasing. This gives two cases in the next step, instead of four. */ newxi = FALSE ; ratioij = quiet_nan(0) ; aligni = quiet_nan(0) ; degencnt = 0 ; alignk = 0 ; bndk = quiet_nan(0) ; for (xkpos = 1 ; xkpos <= dy_sys->concnt && retval == dyrINV ; xkpos++) { if (dy_lp->degen > 0 && dy_degenset[xkpos] != dy_lp->degen) continue ; abarkj = abarj[xkpos] ; if (withintol(abarkj,0,dy_tols->zero)) continue ; xkndx = dy_basis[xkpos] ; xkstatus = dy_status[xkndx] ; if (flgon(xkstatus,vstatBFR)) continue ; if (indir < 0) abarkj = -abarkj ; # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 3) dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t%5d\t%-8s (%d)\t%g\t%g\t",xkpos, consys_nme(dy_sys,'v',xkndx,FALSE,NULL),xkndx, dy_xbasic[xkpos],(indir < 0)?-abarkj:abarkj) ; # endif /* Figure out delta = |(bnd - x)/abar|. The hard part is deciding on the proper limiting bound. Remember that if abar > 0, we're moving x toward its lower bound, and if abar < 0, we're moving x toward its upper bound. If we're in phase I dealing with an infeasible variable, look for the far bound first, and fall back to the near bound if necessary. If we're degenerate (BLB and x decreasing, BUB and x increasing, or BFX), declare delta to be 0, period. */ if (abarkj > 0.0) { if (flgon(xkstatus,vstatBLLB)) continue ; outk = -1 ; if (flgon(xkstatus,vstatBFX|vstatBLB)) { deltak = 0.0 ; # ifndef DYLP_NDEBUG bndk = dy_sys->vlb[xkndx] ; # endif } else { bndk = dy_sys->vlb[xkndx] ; if (bndk <= -dy_tols->inf) { if (dy_lp->phase == dyPRIMAL1 && flgon(xkstatus,vstatBUUB)) bndk = dy_sys->vub[xkndx] ; else continue ; } deltak = dy_xbasic[xkpos]-bndk ; } } else { if (flgon(xkstatus,vstatBUUB)) continue ; outk = 1 ; if (flgon(xkstatus,vstatBFX|vstatBUB)) { deltak = 0.0 ; # ifndef DYLP_NDEBUG bndk = dy_sys->vlb[xkndx] ; # endif } else { bndk = dy_sys->vub[xkndx] ; if (bndk >= dy_tols->inf) { if (dy_lp->phase == dyPRIMAL1 && flgon(xkstatus,vstatBLLB)) bndk = dy_sys->vlb[xkndx] ; else continue ; } deltak = bndk-dy_xbasic[xkpos] ; } } /* To make it to here, delta should be finite and positive. If delta < -dy_tols->pfeas*(1+fabs(bndk)), we've lost feasibility and it isn't reflected in the status. In phase I, it just means we've lost accuracy. In phase II, it's more serious --- we'll have to revert to phase I. In any event, we're done with searching. For values between loss of feasibility and 0, force delta to 0. */ setcleanzero(deltak,dy_tols->zero) ; if (deltak < 0.0) { if (deltak < -dy_tols->pfeas*(1+fabs(bndk))) { # ifndef DYLP_NDEBUG if (dy_opts->print.phase2 >= 1 || dy_opts->print.phase1 >= 1) warn(323,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters+1,consys_nme(dy_sys,'v',xkndx,FALSE,NULL), xkndx,dy_prtvstat(xkstatus),dy_sys->vlb[xkndx], dy_xbasic[xkpos],dy_sys->vub[xkndx],-deltak, dy_tols->pfeas*(1+fabs(bndk))) ; # endif retval = dyrLOSTPFEAS ; *xindx = xkndx ; *outdir = outk ; *deltaj = deltak ; continue ; } deltak = 0.0 ; } /* See how much we can really move. Even with a reasonable delta, we can still end up with something that looks like degeneracy if abar is very large. */ deltak = fabs(deltak/abarkj) ; setcleanzero(deltak,dy_tols->zero) ; # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 3) dyio_outfmt(dy_logchn,dy_gtxecho,"%g\t%g\t",bndk,deltak) ; # endif /* We have delta. Now, is x a better candidate to leave than the current incumbent x? If delta is really smaller, there's no contest. */ ratiokj = quiet_nan(0) ; if (deltak < *deltaj) { newxi = TRUE ; ratiokj = dy_chkpiv(abarkj,maxabarj) ; degencnt = 0 ; } /* If it's a tie, the first preference is to stick with x (and avoid pivoting the basis altogether). Only if abar looks good do we go to further tie-breakers. The next choice is to pivot out x if it has status BFX and the pivot is tolerable. Once out, it'll never reenter and can be purged from the active problem. Still, go for the best pivot value between BFX variables. After that, we resort to whatever tiebreaking strategy is in effect. The default action is Pivot: scan all basic variables, and break ties with |abar|. See the top of the file for additional comments about AlignObj and AlignEdge. We do not want a toleranced comparison here --- small differences in delta multiplied by large abar can result in loss of feasibility. */ else if (deltak == *deltaj && *xindx != xjndx) { ratiokj = dy_chkpiv(abarkj,maxabarj) ; if (ratiokj >= 1.0) { if (flgon(xkstatus,vstatBFX)) { if (!(flgon(dy_status[*xindx],vstatBFX) && fabs(abarij) >= fabs(abarkj))) newxi = TRUE ; } else { switch (dy_opts->degenlite) { case 0: /* pivotabort */ { if (ratiokj > ratioij) newxi = TRUE ; break ; } case 1: /* pivot */ { if (ratiokj > ratioij) newxi = TRUE ; degencnt++ ; break ; } case 2: /* alignobj */ case 3: /* alignedge */ { if (dy_opts->degenlite == 2) { if (degencnt == 0) aligni = cdothyper(*xindx,*outdir) ; alignk = cdothyper(xkndx,outk) ; } else { if (degencnt == 0) aligni = pdirdothyper(xjndx,abarj,indir,*xindx,*outdir) ; alignk = pdirdothyper(xjndx,abarj,indir,xkndx,outk) ; } degencnt++ ; if (aligni > 0 && alignk <= 0) { /* keep x */ } else if (aligni <= 0 && alignk > 0) { newxi = TRUE ; } else if (fabs(aligni) > fabs(alignk)) { newxi = TRUE ; } else if (aligni == alignk) { if (ratiokj > ratioij) newxi = TRUE ; } break ; } case 4: /* perpobj */ case 5: /* perpedge */ { if (dy_opts->degenlite == 4) { if (degencnt == 0) aligni = cdothyper(*xindx,*outdir) ; alignk = cdothyper(xkndx,outk) ; } else { if (degencnt == 0) aligni = pdirdothyper(xjndx,abarj,indir,*xindx,*outdir) ; alignk = pdirdothyper(xjndx,abarj,indir,xkndx,outk) ; } degencnt++ ; if (alignk > aligni) newxi = TRUE ; break ; } } } } } /* Is x better? If so, make x the new leaving variable x. If the user's choice of antidegen lite option is pivotabort, maybe we can skip the rest of the scan. */ if (newxi == TRUE) { *deltaj = deltak ; *xindx = xkndx ; *outdir = outk ; abarij = indir*abarkj ; ratioij = ratiokj ; aligni = alignk ; newxi = FALSE ; # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 3) { if (*xindx == xkndx) dyio_outfmt(dy_logchn,dy_gtxecho,"\tleaving at %s", (bndk == dy_sys->vub[xkndx])?"ub":"lb") ; } # endif if (dy_opts->degenlite == 0 && deltak == 0 && ratioij >= 1.0) break ; } } /* Why are we here? We could have broken out of the loop due to detection of loss of feasibility (dyrLOSTPFEAS), we could have broken out because we've found a BFX variable to pivot out, or we could have finished the scan (in the latter two cases, retval should still be dyrINV). If delta is still infinite, we're unbounded. A finite and nonzero delta and a numerically stable abar is what we hope for (dyrOK). We distinguish between clean degeneracy (x at bound) vs. `dirty' degeneracy (x not at bound, but delta = 0). The first gets dyrDEGEN, the second dyrOK (which will not trigger the antidegeneracy mechanism). If we're about to pivot on a bogus number, ask for a refactor first (dyrREQCHK). A numerically unstable pivot returns dyrMADPIV. But note that if we're doing a bound-to-bound pivot on a nonbasic, we're automatically ok --- neither degeneracy or a numerically unstable pivot is possible. Note that both the antidegeneracy machinery and the fact that we're running with a partial constraint system can lead to apparent unboundedness, even in primal phase I. */ switch (retval) { case dyrINV: { if (*deltaj < dy_tols->inf) { if (*xindx != xjndx) { if (ratioij >= 1.0) { if (dy_lp->basis.etas > 1 && withintol(abarij,0,dy_tols->bogus*dy_tols->zero)) { retval = dyrREQCHK ; # ifndef DYLP_NDEBUG warn(381,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters+1,"abar",*xindx,xjndx,abarij, dy_tols->bogus*dy_tols->zero, dy_tols->bogus*dy_tols->zero-fabs(abarij)) ; # endif } else if (*deltaj == 0 && degencnt > 0 && flgon(dy_status[*xindx],vstatBUB|vstatBLB|vstatBFX)) { retval = dyrDEGEN ; } else { retval = dyrOK ; } } else { retval = dyrMADPIV ; } } else { retval = dyrOK ; } } else { *xindx = -1 ; # ifndef DYLP_NDEBUG if (dy_lp->degen == 0 && (dy_opts->print.phase1 >= 2 || dy_opts->print.phase2 >= 2)) warn(324,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters+1) ; # endif retval = dyrUNBOUND ; } break ; } case dyrLOSTPFEAS: { break ; } default: { errmsg(1,rtnnme,__LINE__) ; return (dyrFATAL) ; } } /* We're done, except perhaps for printing some information. */ # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting == 1) dyio_outfmt(dy_logchn,dy_gtxecho,"...") ; if ((retval == dyrOK || retval == dyrDEGEN) && dy_opts->print.pivoting >= 1) { if (xjndx != *xindx) { xkpos = dy_var2basis[*xindx] ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n selected %s (%d) = %g to leave pos'n %d at", consys_nme(dy_sys,'v',*xindx,FALSE,NULL),*xindx, dy_xbasic[xkpos],xkpos) ; if (*outdir > 0) { dyio_outfmt(dy_logchn,dy_gtxecho," %s = %g, ", (dy_status[*xindx] != vstatBLLB)?"ub":"lb", (dy_status[*xindx] != vstatBLLB)? dy_sys->vub[*xindx]:dy_sys->vlb[*xindx]) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho," %s = %g, ", (dy_status[*xindx] != vstatBUUB)?"lb":"ub", (dy_status[*xindx] != vstatBUUB)? dy_sys->vlb[*xindx]:dy_sys->vub[*xindx]) ; } dyio_outfmt(dy_logchn,dy_gtxecho, "abar<%d,%d> = %g, ",xjndx,*xindx,abarij) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho, "\n selected %s (%d) = %g to change to %s = %g, ", consys_nme(dy_sys,'v',*xindx,FALSE,NULL),*xindx,dy_x[*xindx], (*outdir > 0)?"ub":"lb", (*outdir > 0)?dy_sys->vub[*xindx]:dy_sys->vlb[*xindx]) ; } if (retval == dyrOK) dyio_outfmt(dy_logchn,dy_gtxecho,"delta = %g.",*deltaj) ; else dyio_outfmt(dy_logchn,dy_gtxecho,"degenerate.") ; } if (retval == dyrDEGEN && (dy_opts->print.phase1 >= 3 || dy_opts->print.phase2 >= 3)) { xkpos = dy_var2basis[*xindx] ; xkstatus = dy_status[*xindx] ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d %s pos'n %d, %s %s (%d) = %g = %s = %g", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, dy_prtdyret(retval),xkpos,dy_prtvstat(xkstatus), consys_nme(dy_sys,'v',*xindx,FALSE,NULL),*xindx, dy_xbasic[xkpos],(*outdir > 0)?"ub":"lb", (*outdir > 0)?dy_sys->vub[*xindx]:dy_sys->vlb[*xindx]) ; if (dy_opts->degenlite >= 2 && dy_opts->degenlite <= 5) { if (degencnt > 0) dyio_outfmt(dy_logchn,dy_gtxecho, ", align = %g, deg = %d.",aligni,degencnt) ; } else { dyio_outchr(dy_logchn,dy_gtxecho,'.') ; } } # endif return (retval) ; } static dyret_enum primalupdate (int xjndx, int indir, int xindx, int outdir, double *abarj, double delta, double *betai) /* This routine is responsible for updating the various data structures which hold the basis, status, and primal and dual variable values. Nondegenerate pivots will have delta > 0, and require a full scan of the basic variables to update their values. In the process, the value of the leaving variable will be updated. `Dirty' degeneracy gives us delta == 0, but requires some special handling to force the leaving variable to bound. Other pivots with delta == 0 require no updates to the basic variables. There's a fair bit of attention given here to controlling roundoff, with a (hopefully) intelligent choice of tolerances so that we get clean values when x approaches 0 or a bound. Generally, the rule is to try and scale the snap interval by the larger of the absolute value of the target value or the distance travelled to get there. If we decide we've seen a bogus value, we can't just bail out. That leaves the status information completely inconsistent and we'll fail a subsequent status check. For the purposes of this routine, a value is bogus if either |value| < tols.bogus or |lb-value| < tols.bogus or |ub-value| < tols.bogus. (The latter two come from the notion of trying to snap variables to bound.) Parameters: xjndx: index of the entering variable x indir: the direction of change of the entering variable xindx: index of the leaving variable x outdir: the direction of change of the outgoing variable abarj: the ftran'd column abar = inv(B)a delta: the amount of change of the entering variable; always >= 0. betai: the ith row of inv(B); used for updating dual variables. NOTE that cbar, abar, and beta are all calculated prior to the pivot! Returns: dyrOK if all goes well, dyrSWING if a variable grew too much, dyrREQCHK if a bogus value is calculated or the pivot is dirty degenerate, and dyrFATAL if paranoid checks fail. */ { int xkpos,xkndx,xipos ; flags xkstatus,quals ; dyret_enum retval ; double val,deltak,ubk,lbk,eps0,epsu,epsl,cbarj,abarij ; bool dirtyz,swing ; double swingratio,maxswing ; int swingndx ; const char *rtnnme = "primalupdate" ; # ifndef DYLP_NDEBUG int print ; # endif retval = dyrOK ; dirtyz = FALSE ; swing = FALSE ; maxswing = 0 ; swingndx = -1 ; xipos = dy_var2basis[xindx] ; abarij = abarj[xipos] ; cbarj = dy_cbar[xjndx] ; # ifndef DYLP_NDEBUG if (dy_lp->phase == dyPRIMAL1) print = dy_opts->print.phase1 ; else print = dy_opts->print.phase2 ; if (print >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n%s: updating at iteration %d:",rtnnme, dy_lp->tot.iters+1) ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t%s (%d) entering pos'n %d from %s%g, delta %g, cbarj %g.", consys_nme(dy_sys,'v',xjndx,FALSE,NULL),xjndx,xipos, (dy_status[xjndx] == vstatSB)?"":((indir == 1)?"lb ":"ub "), dy_x[xjndx],(indir == 1)?delta:-delta,dy_cbar[xjndx]) ; dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t%s (%d) = %g leaving at ", consys_nme(dy_sys,'v',xindx,FALSE,NULL),xindx, dy_xbasic[xipos]) ; if (outdir == 1) { dyio_outfmt(dy_logchn,dy_gtxecho,"%s %g, pivot %g.", flgon(dy_status[xindx],vstatBLLB)?"lb":"ub", flgon(dy_status[xindx],vstatBLLB)? dy_sys->vlb[xindx]:dy_sys->vub[xindx],abarij) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho,"%s %g, pivot %g.", flgon(dy_status[xindx],vstatBUUB)?"ub":"lb", flgon(dy_status[xindx],vstatBUUB)? dy_sys->vub[xindx]:dy_sys->vlb[xindx],abarij) ; } } # endif /* Update the value and status of the basic variables to reflect the change in x. The calculation is straightforward, from the formulas: z = cinv(B) + (c - cinv(B)a)*delta = z + cbar*delta x = inv(B)b - (inv(B)a)*delta = x - abar*delta Note that while the antidegeneracy mechanism is active, we're really doing degenerate pivots in the original, unperturbed problem, so we shouldn't change the objective or any variables not part of the restricted problem. Nor do we update dy_x for the variables in the restricted subproblem -- dy_x is holding their original values for when we back out the perturbation. As we're updating the basic variables, collect the 1-norm to scale the primal feasibility tolerance. Paranoid checks: * We should never attempt to change the value of a fixed variable. But, we'll occasionally fudge this in order to promote a sane pivot over mad pivots. In this case, the change should never exceed pfeas. * In phase I, infeasible variables should not overshoot their opposite bound (see comments in primalout), and feasible variables should not loose feasibility. * In phase II, variables should always remain feasible. */ if (delta > 0.0) { if (indir == -1) delta = -delta ; if (dy_lp->degen == 0) { dy_lp->z += cbarj*delta ; setcleanzero(dy_lp->z,dy_tols->zero) ; } for (xkpos = 1 ; xkpos <= dy_sys->concnt ; xkpos++) { if (abarj[xkpos] != 0 && dy_degenset[xkpos] == dy_lp->degen) { deltak = abarj[xkpos]*delta ; if (withintol(deltak,0,dy_tols->zero)) continue ; xkndx = dy_basis[xkpos] ; xkstatus = getflg(dy_status[xkndx],vstatSTATUS) ; quals = getflg(dy_status[xkndx],vstatQUALS) ; eps0 = dy_tols->zero ; ubk = dy_sys->vub[xkndx] ; if (ubk < dy_tols->inf) { epsu = dy_tols->pfeas*(1.0+fabs(ubk)) ; } else epsu = 0 ; lbk = dy_sys->vlb[xkndx] ; if (-dy_tols->inf < lbk) { epsl = dy_tols->pfeas*(1.0+fabs(lbk)) ; } else epsl = 0 ; val = dy_xbasic[xkpos]-deltak ; setcleanzero(val,eps0) ; if (val != 0.0 && fabs(val) < eps0*dy_tols->bogus && dy_lp->basis.etas > 1) { retval = dyrREQCHK ; # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 1) warn(374,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,"x",xkndx,fabs(val), eps0*dy_tols->bogus,eps0*dy_tols->bogus-val) ; # endif } # ifdef DYLP_PARANOIA if (flgon(xkstatus,vstatBFX) && fabs(deltak) > dy_tols->pfeas) { errmsg(345,rtnnme,dy_sys->nme, consys_nme(dy_sys,'v',xkndx,FALSE,NULL),xkndx,val, dy_lp->tot.iters+1,delta) ; return (dyrFATAL) ; } if (dy_lp->phase == dyPRIMAL1) { if ((flgon(xkstatus,vstatBLLB) && val > ubk+epsu) || (flgon(xkstatus,vstatBUUB) && val < lbk-epsl)) { errmsg(344,rtnnme,dy_sys->nme, consys_nme(dy_sys,'v',xkndx,FALSE,NULL),xkndx, dy_prtvstat(xkstatus),dy_lp->tot.iters+1,val,lbk,ubk,delta) ; return (dyrFATAL) ; } if (flgon(xkstatus,vstatBLB|vstatB|vstatBUB) && (val < lbk-dy_tols->bogus*epsl || val > ubk+dy_tols->bogus*epsu)) { if (val < lbk-dy_tols->bogus*epsl) errmsg(323,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters+1, consys_nme(dy_sys,'v',xkndx,FALSE,NULL),xkndx, dy_prtvstat(xkstatus),lbk,val,ubk, (lbk-dy_tols->bogus*epsl)-val,dy_tols->bogus*epsl) ; else errmsg(323,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters+1, consys_nme(dy_sys,'v',xkndx,FALSE,NULL),xkndx, dy_prtvstat(xkstatus),lbk,val,ubk, val-(ubk+dy_tols->bogus*epsu),dy_tols->bogus*epsu) ; return (dyrFATAL) ; } } else if (dy_lp->phase == dyPRIMAL2 && (val < lbk-dy_tols->bogus*epsl || val > ubk+dy_tols->bogus*epsu)) { if (val < lbk-epsl) errmsg(323,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters+1, consys_nme(dy_sys,'v',xkndx,FALSE,NULL),xkndx, dy_prtvstat(xkstatus),lbk,val,ubk, (lbk-dy_tols->bogus*epsl)-val,dy_tols->bogus*epsl) ; else errmsg(323,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters+1, consys_nme(dy_sys,'v',xkndx,FALSE,NULL),xkndx, dy_prtvstat(xkstatus),lbk,val,ubk, val-(ubk+dy_tols->bogus*epsu),dy_tols->bogus*epsu) ; return (dyrFATAL) ; } # endif switch (xkstatus) { case vstatB: case vstatBLB: case vstatBUB: { if (atbnd(val,ubk)) { dy_status[xkndx] = vstatBUB ; } else if (atbnd(val,lbk)) { dy_status[xkndx] = vstatBLB ; } else { dy_status[xkndx] = vstatB ; } break ; } case vstatBLLB: { if (belowbnd(val,lbk)) { /* do nothing */ } else if (atbnd(val,lbk)) { if (lbk == ubk) dy_status[xkndx] = vstatBFX ; else dy_status[xkndx] = vstatBLB ; } else if (belowbnd(val,ubk)) { dy_status[xkndx] = vstatB ; } else { dy_status[xkndx] = vstatBUB ; } break ; } case vstatBUUB: { if (abovebnd(val,ubk)) { /* do nothing */ } else if (atbnd(val,ubk)) { if (lbk == ubk) dy_status[xkndx] = vstatBFX ; else dy_status[xkndx] = vstatBUB ; } else if (abovebnd(val,lbk)) { dy_status[xkndx] = vstatB ; } else { dy_status[xkndx] = vstatBLB ; } break ; } case vstatBFR: case vstatBFX: { break ; } default: { errmsg(1,rtnnme,__LINE__) ; return (dyrFATAL) ; } } setflg(dy_status[xkndx],quals) ; /* Check for bogus values, within the bogosity tolerance of a bound but not close enough to snap to it. */ if (flgoff(dy_status[xkndx],vstatBFX|vstatBLB|vstatBUB)) { if (fabs(val-lbk) < epsl*dy_tols->bogus && dy_lp->basis.etas > 1) { retval = dyrREQCHK ; # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 1) warn(375,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,"x",xkndx,"lb",xkndx, val,lbk,val-lbk,epsl*dy_tols->bogus, epsl*dy_tols->bogus-(val-lbk)) ; # endif } else if (fabs(ubk-val) < epsu*dy_tols->bogus && dy_lp->basis.etas > 1) { retval = dyrREQCHK ; # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 1) warn(375,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,"ub",xkndx,"x",xkndx, ubk,val,ubk-val,epsu*dy_tols->bogus, epsu*dy_tols->bogus-(ubk-val)) ; # endif } } swingratio = (fabs(val)+1)/(fabs(dy_xbasic[xkpos])+1) ; if (swingratio > dy_tols->swing) { swing = TRUE ; if (swingratio > maxswing) { maxswing = swingratio ; swingndx = xkndx ; } } dy_xbasic[xkpos] = val ; if (dy_lp->degen == 0) dy_x[xkndx] = val ; # ifdef DYLP_PARANOIA /* Check that x has acquired the proper status after the update of basic variables. */ if ((xkndx == xindx) && !flgon(dy_status[xindx],vstatBLB|vstatBFX|vstatBUB)) { if (fabs(ubk-val) < fabs(lbk-val)) { if (fabs(ubk-val) < 100*epsu) { warn(357,rtnnme,dy_sys->nme, consys_nme(dy_sys,'v',xindx,FALSE,NULL),xindx, dy_prtvstat(dy_status[xindx]),"ub",ubk,val,val-ubk,epsu) ; } else { errmsg(357,rtnnme,dy_sys->nme, consys_nme(dy_sys,'v',xindx,FALSE,NULL),xindx, dy_prtvstat(dy_status[xindx]),"ub",ubk,val,val-ubk,epsu) ; return (dyrFATAL) ; } } else { if (fabs(lbk-val) < 100*epsl) { warn(357,rtnnme,dy_sys->nme, consys_nme(dy_sys,'v',xindx,FALSE,NULL),xindx, dy_prtvstat(dy_status[xindx]),"lb",lbk,val,lbk-val,epsl) ; } else { errmsg(357,rtnnme,dy_sys->nme, consys_nme(dy_sys,'v',xindx,FALSE,NULL),xindx, dy_prtvstat(dy_status[xindx]),"lb",lbk,val,lbk-val,epsl) ; return (dyrFATAL) ; } } } # endif } } } /* This next clause is for `dirty' degeneracy. See the notes at the top of the file. In effect, we clean up by forcing the variable to the appropriate bound. A little care is required to decide what the appropriate bound really is when in phase I. Set a flag if we need to recalculate the objective function (after completing the update bookkeeping for x and x). */ else if (xjndx != xindx && flgoff(dy_status[xindx],vstatBFX|vstatBLB|vstatBUB)) { if (dy_lp->degen == 0) dirtyz = TRUE ; xkstatus = getflg(dy_status[xindx],vstatSTATUS) ; lbk = dy_sys->vlb[xindx] ; ubk = dy_sys->vub[xindx] ; if (lbk == ubk) { val = lbk ; xkstatus = vstatBFX ; } else if (outdir < 0) { val = lbk ; if (val <= -dy_tols->inf) { if (dy_lp->phase == dyPRIMAL1 && flgon(xkstatus,vstatBUUB)) { val = ubk ; xkstatus = vstatBUB ; } else { errmsg(382,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,consys_nme(dy_sys,'v',xindx,FALSE,NULL), xindx,"lb",val) ; return (dyrFATAL) ; } } else { xkstatus = vstatBLB ; } } else { val = ubk ; if (val >= dy_tols->inf) { if (dy_lp->phase == dyPRIMAL1 && flgon(xkstatus,vstatBLLB)) { val = lbk ; xkstatus = vstatBLB ; } else { errmsg(382,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,consys_nme(dy_sys,'v',xindx,FALSE,NULL), xindx,"ub",val) ; return (dyrFATAL) ; } } else { xkstatus = vstatBUB ; } } dy_xbasic[xipos] = val ; dy_status[xindx] = 0 ; setflg(dy_status[xindx],xkstatus) ; if (dy_lp->degen == 0) dy_x[xindx] = val ; retval = dyrREQCHK ; # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n %s (%d) = %g, %s, leaving at %s, dirty degenerate pivot.", consys_nme(dy_sys,'v',xindx,FALSE,NULL),xindx,dy_xbasic[xipos], dy_prtvstat(dy_status[xindx]),(outdir < 0)?"lb":"ub") ; } # endif } /* Deal with the entering and leaving variables. In the case where the entering variable x and the leaving variable x are different variables, the value at entry is obtained from dy_x, rather than going to the upper or lower bound vectors. This lets us handle superbasics and variables at bound uniformly. If delta != 0, the final status for x should be B or BFR (if x was NBFR). But it's not that simple --- a very small or very large delta, combined with a relatively large pfeas tolerance, can leave us at either of BLB or BUB, regardless of where we started from. If the pivot is degenerate, we simply convert from nonbasic to the equivalent basic status. As above, if the antidegeneracy mechanism is active, we don't update dy_x for x. On the other hand, if it is active, we have to update the breakout entry for this basis position. The proper value is the entry direction, since in the original, nondegenerate problem, the entering variable remains at the bound it entered from. We updated all basic variables in the previous loop, including the leaving variable x, so it will have status BLB, BUB, or BFX as we move it to the nonbasic partition here. We'll set dy_x from the bounds vector as a check on accumulated inaccuracy due to incremental modification. When x == x is both the entering and leaving variable, we need only change its status and value. Note that if a superbasic is selected to enter and then driven to bound, it will also be selected as the leaving variable, so if it remains in the basis, it'll have status B. */ if (xjndx != xindx) { dy_var2basis[xjndx] = xipos ; dy_var2basis[xindx] = 0 ; dy_basis[xipos] = xjndx ; xkstatus = getflg(dy_status[xindx],vstatSTATUS) ; if (xkstatus == vstatBLB) { dy_status[xindx] = vstatNBLB ; dy_x[xindx] = dy_sys->vlb[xindx] ; } else if (xkstatus == vstatBUB) { dy_status[xindx] = vstatNBUB ; dy_x[xindx] = dy_sys->vub[xindx] ; } else { dy_status[xindx] = vstatNBFX ; dy_x[xindx] = dy_sys->vlb[xindx] ; } if (delta != 0) { val = dy_x[xjndx]+delta ; swingratio = (fabs(val)+1)/(fabs(dy_x[xjndx])+1) ; if (swingratio > dy_tols->swing) { swing = TRUE ; if (swingratio > maxswing) { maxswing = swingratio ; swingndx = xjndx ; } } setcleanzero(val,dy_tols->zero*(1.0+fabs(delta))) ; switch (dy_status[xjndx]) { case vstatNBLB: case vstatNBUB: case vstatSB: { if (atbnd(val,dy_sys->vub[xjndx])) dy_status[xjndx] = vstatBUB ; else if (atbnd(val,dy_sys->vlb[xjndx])) dy_status[xjndx] = vstatBLB ; else dy_status[xjndx] = vstatB ; break ; } case vstatNBFR: { dy_status[xjndx] = vstatBFR ; break ; } # ifdef DYLP_PARANOIA default: { errmsg(1,rtnnme,__LINE__) ; return (dyrFATAL) ; } # endif } } else { val = dy_x[xjndx] ; switch (dy_status[xjndx]) { case vstatNBLB: { dy_status[xjndx] = vstatBLB ; break ; } case vstatNBUB: { dy_status[xjndx] = vstatBUB ; break ; } case vstatSB: { dy_status[xjndx] = vstatB ; break ; } case vstatNBFR: { dy_status[xjndx] = vstatBFR ; break ; } # ifdef DYLP_PARANOIA default: { errmsg(1,rtnnme,__LINE__) ; return (dyrFATAL) ; } # endif } } if (dy_lp->degen > 0) dy_brkout[xipos] = indir ; else dy_x[xjndx] = val ; dy_xbasic[xipos] = val ; } else { if (outdir == 1) { dy_status[xindx] = vstatNBUB ; dy_x[xindx] = dy_sys->vub[xindx] ; } else { dy_status[xindx] = vstatNBLB ; dy_x[xindx] = dy_sys->vlb[xindx] ; } } /* Do we need to recalculate the objective, as a result of dirty degeneracy? */ if (dirtyz == TRUE) { dy_lp->z = dy_calcobj() ; } # ifdef DYLP_PARANOIA else { val = dy_calcobj() ; if (fabs(val-dy_lp->z) > fabs(.001*(1+fabs(val)))) { warn(405,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters+1,dy_lp->z,val,fabs(dy_lp->z-val), fabs(.001*val)) ; } } # endif /* Do we need to update the duals? y = cinv(B), so an update is required only if we actually pivoted (x != x) and thus changed c. We'll update even during primal I, but keep in mind that c might be revised in tweakp1obj if a variable other than x gained feasibility with this pivot. */ if (xjndx != xindx) { if (fabs(cbarj) > dy_tols->cost) { for (xkpos = 1 ; xkpos <= dy_sys->concnt ; xkpos++) { deltak = cbarj*betai[xkpos] ; deltak = deltak/abarij ; val = dy_y[xkpos]+deltak ; setcleanzero(val,dy_tols->cost) ; if (val != 0.0 && dy_lp->basis.etas > 1 && fabs(val) < dy_tols->cost*dy_tols->bogus) { retval = dyrREQCHK ; # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 1) warn(374,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,"y",xkpos,fabs(val), dy_tols->cost*dy_tols->bogus, dy_tols->cost*dy_tols->bogus-val) ; # endif } dy_y[xkpos] = val ; } } } /* Decide on a return value. Swing overrides the others, as it'll cause us to pop out of simplex. (But if there are no loadable constraints, then let's not, eh?) */ if (swing == TRUE) { if (dy_lp->sys.cons.loadable > 0) { retval = dyrSWING ; } dy_lp->ubnd.ndx = swingndx ; dy_lp->ubnd.ratio = maxswing ; # ifndef DYLP_NDEBUG if (print >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n Pseudo-unbounded: growth %e for %s (%d)", dy_lp->ubnd.ratio, consys_nme(dy_sys,'v',dy_lp->ubnd.ndx,FALSE,NULL), dy_lp->ubnd.ndx) ; } # endif } /* That's it, except for some informational printing. */ # ifndef DYLP_NDEBUG if (print >= 5) { bool first,all ; dyio_outfmt(dy_logchn,dy_gtxecho,"\n\trevised objective %g.",dy_lp->z) ; # ifdef DYLP_PARANOIA if (dy_lp->phase == dyPRIMAL2) { deltak = dy_calcobj() ; if (!atbnd(deltak,dy_lp->z)) dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tWHOOPS! updated obj - true obj = %g - %g = %g > %g", dy_lp->z,deltak,dy_lp->z-deltak,dy_tols->dchk) ; } # endif if (print >= 6) all = TRUE ; else all = FALSE ; first = TRUE ; for (xkpos = 1 ; xkpos <= dy_sys->concnt ; xkpos++) if (abarj[xkpos] != 0 || all == TRUE) { if (first == TRUE) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t%sprimal variables:", (all == TRUE)?"":"revised ") ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n%8s%20s%16s%16s%16s %s","pos'n","var (ndx)", "lb","val","ub","status") ; first = FALSE ; } xkndx = dy_basis[xkpos] ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n%8d%14s (%3d)%16.8g%16.8g%16.8g %s",xkpos, consys_nme(dy_sys,'v',xkndx,FALSE,NULL),xkndx, dy_sys->vlb[xkndx],dy_xbasic[xkpos],dy_sys->vub[xkndx], dy_prtvstat(dy_status[xkndx])) ; } if (first == TRUE) dyio_outfmt(dy_logchn,dy_gtxecho,"\n\tno change to primal variables.") ; if (print >= 7) { if (xindx != xjndx) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n dual variables, cbar tolerance %g", dy_tols->dfeas) ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n%8s%20s%16s","pos'n","constraint","val") ; for (xkpos = 1 ; xkpos <= dy_sys->concnt ; xkpos++) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n%8d%20s%16.8g",xkpos, consys_nme(dy_sys,'c',xkpos,FALSE,NULL),dy_y[xkpos]) ; } } else { dyio_outfmt(dy_logchn,dy_gtxecho, "\n no change to dual variables.") ; } } } # endif return (retval) ; } #ifdef CHECK_PSE_UPDATES static bool check_pse_update (int xkndx, double u_cbark, double u_gammak) /* This routine checks x for consistent status, then does one of the following: * For nonbasic variables it does a `from scratch' calculation of cbar and gamma to check the accuracy of the PSE update calculations. * For basic variables, it checks that inv(B)a is a unit vector with a 1 in the basis position occupied by x. The routine should not be called for a variable with status NBFX. The calculations are: cbar = c - c(inv(B)a) gamma~ = ||abar~||^2, where abar = inv(B)a and abar~ is abar with non-reference-frame entries removed. Parameters: xkndx: index for column u_cbark: updated cbar u_gammak: updated gamma Returns: TRUE if the updated values agree with values calculated from first principles, FALSE otherwise. */ { int xipos,xindx,xkpos ; double *abark,cbark,gammak ; bool retval ; const char *rtnnme = "check_pse_update" ; /* Make sure we're ok with the status of the variable. */ if (dy_chkstatus(xkndx) == FALSE) return (FALSE) ; /* The next thing we want to do is extract the column and FTRAN it. */ abark = NULL ; if (consys_getcol_ex(dy_sys,xkndx,&abark) == FALSE) { errmsg(122,rtnnme,dy_sys->nme, "column",consys_nme(dy_sys,'v',xkndx,TRUE,NULL),xkndx) ; if (abark != NULL) FREE(abark) ; return (FALSE) ; } dy_ftran(abark,FALSE) ; retval = TRUE ; /* Do the appropriate check. For x basic, check that inv(B)a is a unit vector with a 1 in the basis position occupied by x. */ if (flgon(dy_status[xkndx],vstatBASIC)) { xkpos = dy_var2basis[xkndx] ; for (xipos = 1 ; xipos <= dy_sys->concnt ; xipos++) { if (xipos == xkpos) { if (!withintol(abark[xipos],1.0,dy_tols->zero)) { errmsg(385,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,xipos,xkndx,abark[xipos],1.0, abark[xipos]-1.0,dy_tols->zero) ; retval = FALSE ; } } else { if (!withintol(abark[xipos],0.0,dy_tols->zero)) { errmsg(385,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,xipos,xkndx,abark[xipos],0.0, abark[xipos],dy_tols->zero) ; retval = FALSE ; } } } } /* For nonbasic variables, calculate the reduced cost, c - cabar. Calculate the projected column norm using only those elements in the reference frame. gamma must be at least 1, since every nonbasic variable should be in the reference frame. */ else { cbark = dy_sys->obj[xkndx] ; gammak = 1.0 ; for (xipos = 1 ; xipos <= dy_sys->concnt ; xipos++) { xindx = dy_basis[xipos] ; cbark -= dy_sys->obj[xindx]*abark[xipos] ; if (dy_frame[xindx] == TRUE) gammak += abark[xipos]*abark[xipos] ; } if (!withintol(cbark,u_cbark,dy_tols->reframe*(1+fabs(cbark)))) { errmsg(388,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,"cbar",xkndx,u_cbark,cbark,fabs(u_cbark-cbark), dy_tols->reframe*(1+fabs(cbark))) ; retval = FALSE ; } if (!withintol(gammak,u_gammak,dy_tols->reframe*(1+fabs(gammak)))) { errmsg(388,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,"gamma",xkndx,u_gammak,gammak, fabs(u_gammak-gammak),dy_tols->reframe*(1+fabs(gammak))) ; retval = FALSE ; } } if (abark != NULL) FREE(abark) ; return (retval) ; } #endif static dyret_enum pseupdate (int xjndx, int xindx, int *candxj, double *abarj, double *v, double *betai) /* This routine updates the reduced cost vector dy_cbar and the column norm vector dy_gamma. We're doing projected steepest edge, and vectors tagged with `~' include only entries corresponding to variables in the reference frame. The update formulas are as follows: cbar' = -cbar/abar cbar' = cbar - cbar*(abar/abar) k != i gamma' = gamma/abar^2 gamma' = gamma - 2*(abar/abar)*dot(a,v) + (abar/abar)^2*gamma k != i It'd be easy to collapse the update formula for cbar' to that of cbar', since cbar = 0 and abar = 1 for x basic. But, the algebra to collapse the formulas for gamma isn't so transparent, and we can skip a dot product, so they are kept separate. Having introduced the special case, we might as well use it for cbar' too, since there's some advantage in robustness (we don't have to worry about values of gamma or cbar for basic variables, since they get reset when the become nonbasic). We use betai to calculate the values abar for each column. If the leaving variable x is not already a member of the reference framework, it's added, and gamma is boosted by 1. pseupdate is also responsible for deciding if a reference frame reset is in order, and carrying it out if necessary. The test is that the iteratively updated column norm gamma be within a percentage (dy_tols->reframe) of the exact norm ||abar~||^2. If the LP is numerically illconditioned, the gamma updates can begin to drift, and this may not be picked up in a timely manner by the reframe test. The one thing we watch out for when calculating any gamma update is a value < 1, and reset the update to 1 when this happens. The cbar updates don't seem to give any trouble, numerically speaking. NOTE that the basis has been pivoted by the time this routine is called, and the arrays dy_basis, dy_var2basis, and dy_status reflect this. Parameters: xjndx: index of the entering variable xindx: index of the leaving variable candxj: (o) the index of the variable chosen to enter on the next pivot abarj: inv(B)a, calculated prior to pivoting the basis v: abar~inv(B), calculated prior to pivoting the basis betai: einv(B), row i of the basis inverse, calculated prior to pivoting the basis Returns: dyrOK if the update proceeds without error and a new candidate x is selected; dyrOPTIMAL if the update proceeds without error and no x is selected; dyrPUNT if the update proceeds without error but all candidate x were flagged with the NOPIVOT qualifier; dyrFATAL if there's a problem (only if we're paranoid). */ { int xkpos,xkndx,xipos ; double abarij,cbarj,gammaj,abarik,alphak,cbark,gammak,akdotv,candcbarj ; flags xkstatus ; bool reset,pivreject ; dyret_enum retval ; # if defined(DYLP_PARANOIA) || !defined(DYLP_NDEBUG) const char *rtnnme = "pseupdate" ; # endif /* Do a little prep, pulling out common values and setting initial values. Remember that x is now occupying the basis position vacated by x. Set the reduced cost for x to 0, since it's now basic. */ xipos = dy_var2basis[xjndx] ; abarij = abarj[xipos] ; cbarj = dy_cbar[xjndx] ; dy_cbar[xjndx] = 0 ; retval = dyrINV ; candcbarj = -dy_tols->inf ; *candxj = 0 ; /* Do we need to reset the frame of reference? The test is that the iteratively updated norm gamma is within dy_tols->reframe percent of the exact value ||abar~||^2+1. We need to be careful here --- we're contemplating norms as of prior to the pivot, so we need the previous basis image. Working on the ``make the common case fast'' theory, even if a reset is needed we'll proceed with the updates as if nothing has happened, then rewrite dy_frame and dy_gamma at the end. */ dy_basis[xipos] = xindx ; gammaj = 1 ; for (xkpos = 1 ; xkpos <= dy_sys->concnt ; xkpos++) if (dy_frame[dy_basis[xkpos]] == TRUE) gammaj += abarj[xkpos]*abarj[xkpos] ; if (!withintol(dy_gamma[xjndx],gammaj,dy_tols->reframe*gammaj)) { reset = TRUE ; # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n %s: (%s)%d: resetting reference frame; trigger %s (%d)", dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, consys_nme(dy_sys,'v',xjndx,FALSE,NULL),xjndx) ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n\texact gamma = %g, approx = %g, error = %g, tol = %g.", gammaj,dy_gamma[xjndx],fabs(gammaj-dy_gamma[xjndx]), dy_tols->reframe*gammaj) ; } # endif } else { reset = FALSE ; } dy_basis[xipos] = xjndx ; dy_gamma[xjndx] = gammaj ; /* Open a loop to walk the nonbasic variables, updating the reduced costs and column norms. (But note that we don't bother with nonbasic fixed variables, which will never pivot in.) The first thing we do, once we enter the loop, is calculate alpha. If it's zero, then no update will be needed. */ pivreject = FALSE ; for (xkndx = 1 ; xkndx <= dy_sys->varcnt ; xkndx++) { xkstatus = dy_status[xkndx] ; if (flgon(xkstatus,vstatBASIC|vstatNBFX)) { # ifdef CHECK_PSE_UPDATES if (flgon(xkstatus,vstatBASIC)) if (check_pse_update(xkndx,0,0) == FALSE) return (dyrFATAL) ; # endif continue ; } abarik = consys_dotcol(dy_sys,xkndx,betai) ; # ifdef DYLP_PARANOIA if (isnan(abarik) == TRUE) { errmsg(320,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,"beta",xkndx,"PSE update") ; return (dyrFATAL) ; } # endif alphak = abarik/abarij ; setcleanzero(alphak,dy_tols->zero) ; # ifdef DYLP_PARANOIA /* Since x was basic when we extracted betai, abar should be 1.0. While we don't check for it explicitly, alpha should not be 0 --- it could only happen if |1/abar| < dy_tols->zero, and you have to wonder why we're here in that case. So we're guaranteed to execute the updates on cbar and gamma (which don't depend on alpha, in spite of the appearance that they could be skipped due to alpha = 0). Arguably we should return a fatal error when this check fails, but it can be dealt with as an accuracy problem. Scaling can tighten tols.zero, which we don't want here, so hardwire the default value of 1.0e-11. */ if (xindx == xkndx) { if (!withintol(abarik,1.0,dy_tols->bogus*1.0e-11)) { if (!withintol(abarik,1.0,.001)) { errmsg(385,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,xindx,xkndx,abarik,1.0,abarik-1.0,.001) ; } else { warn(385,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,xindx,xkndx,abarik,1.0,abarik-1.0, dy_tols->bogus*dy_tols->zero) ; } } } # endif /* If alpha is nonzero, we have actual update work ahead. For handy reference, the formulas are: cbar' = -cbar/abar cbar' = cbar - cbar*alpha gamma' = gamma/abar^2 gamma' = gamma - 2*alpha*dot(a,v) + alpha^2*gamma Also, we need to add x to the reference frame, if it's not already in it (including bumping gamma by +1). While it may look like we're risking the update of gamma, we're not --- as mentioned above, alpha should not be 0. As a pragmatic solution to numerical error, if gamma comes up less than 1, set it to 1. */ if (alphak != 0) { if (xkndx != xindx) { cbark = dy_cbar[xkndx]-cbarj*alphak ; akdotv = consys_dotcol(dy_sys,xkndx,v) ; # ifdef DYLP_PARANOIA if (isnan(akdotv) == TRUE) { errmsg(320,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,"v",xkndx,"PSE update") ; return (dyrFATAL) ; } # endif gammak = dy_gamma[xkndx]-alphak*(2*akdotv-alphak*gammaj) ; } else { cbark = -cbarj/abarij ; gammak = gammaj/(abarij*abarij) ; if (dy_frame[xkndx] != TRUE) { dy_frame[xkndx] = TRUE ; gammak += 1 ; } } setcleanzero(cbark,dy_tols->cost) ; dy_cbar[xkndx] = cbark ; if (gammak < 1.0) gammak = 1.0 ; dy_gamma[xkndx] = gammak ; } # ifdef CHECK_PSE_UPDATES if (check_pse_update(xkndx,dy_cbar[xkndx],dy_gamma[xkndx]) == FALSE) return (dyrFATAL) ; # endif /* Updates are finished. Price x and replace the current candidate x if appropriate. */ (void) pricexk(xkndx,candxj,&candcbarj,&pivreject) ; } /* That's the end of the PSE update & pricing loop. Did we decide up at the top that we need a reference frame reset? If so, do it now, before we get into setting the return value. */ if (reset == TRUE) { memset(dy_frame,0,(dy_sys->varcnt+1)*sizeof(bool)) ; memset(dy_gamma,0,(dy_sys->varcnt+1)*sizeof(double)) ; for (xkndx = 1 ; xkndx <= dy_sys->varcnt ; xkndx++) { if (flgon(dy_status[xkndx],vstatNONBASIC|vstatEXOTIC)) { dy_frame[xkndx] = TRUE ; dy_gamma[xkndx] = 1.0 ; } } } /* What's the proper return value? If we've found a candidate x, return dyrOK. There are three possible reasons for finding no candidate (candxj == 0): * We have potential pivots on the reject list: pivreject == TRUE. We want to return dyrPUNT; see comments at head of dy_primalin. * We're optimal (phase II) or infeasible (phase I): pivreject == FALSE. dyrOPTIMAL is the proper return value. * We saw some cbar with the correct sign, but they were bogus numbers: pivreject == FALSE. dyrOPTIMAL is still the correct return code; see comments at the head of dy_primalin. */ if (*candxj == 0) { if (pivreject == TRUE) retval = dyrPUNT ; else retval = dyrOPTIMAL ; } else { retval = dyrOK ; } # ifndef DYLP_NDEBUG if (dy_opts->print.pricing >= 2) { if (*candxj != 0) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: (%s)%d: selected %s (%d), PSE price %g.", rtnnme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, consys_nme(dy_sys,'v',*candxj,TRUE,NULL), *candxj,candcbarj) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: (%s)%d: no suitable candidates.",rtnnme, dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; } } if (dy_opts->print.pricing >= 1) { if (retval == dyrPUNT) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: (%s)%d: all suitable x on rejected pivot list.", rtnnme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters) ; } } # endif return (retval) ; } dyret_enum dy_primalpivot (int xjndx, int indir, int *p_xindx, int *p_outdir, double *p_abarij, double *p_delta, int *p_xjcand) /* This routine executes a primal pivot. It calculates abar = inv(B)a (i.e., it ftran's the pivot column) and calls primalout to determine the leaving variable. It then calls dy_pivot (which in turn calls inv_update) to update the basis representation, and makes the necessary changes in the dylp data structures. In the course of updating primal and dual variables, we also update PSE pricing structures and choose a candidate to enter on the next pivot. There is a fairly elaborate antidegeneracy algorithm implemented here. When degeneracy is detected, a restricted problem is formed, composed of only the subset of constraints involved in the degeneracy. This problem is perturbed (radically!) and used in place of the original problem until a direction of recession is found (i.e., a pivot which results in a move away from the degenerate vertex). In the presence of finite upper and lower bounds, it's a bit tricky to distinguish a valid nondegenerate pivot from movement due to the perturbations, but we get by with some careful bookkeeping. The reference below discusses the algorithm in the standard (but overly simple) context of lower bounds of 0 and upper bounds of infinity. Note that there's an implicit assumption that the upper and lower bound on a variable will not be equal unless the variable's status is indicated as fixed (and hence it's ineligible for entering). Note also that while the antidegeneracy algorithm is active, the perturbation is applied to dy_xbasic but entries in dy_x are kept unperturbed so that we can quickly back out the perturbation. Reference: Ryan, D., Osborne, M., "On the Solution of Highly Degenerate Linear Programmes", Mathematical Programming, v.41, pp. 385-392, 1988. Parameters: xjndx: The index of the entering variable. indir: The direction of movement; +1 if x is increasing, -1 if x is decreasing. p_xindx: (o) Index of the leaving variable x. For return code dyrLOSTPFEAS, set to the index of the variable where primal feasibility loss was discovered p_outdir: (o) returns the direction of movement for x; +1 if it increased and left at its upper bound, -1 if it decreased and left at its lower bound. p_abarij: (o) the pivot element abar p_delta: (o) the amount of change to x p_xjcand: (o) Index of the candidate entering variable for the next pivot. The four output values are also valid for return codes dyrSINGULAR and dyrBSPACE, as they are all determined before inv_update is asked to pivot the basis. Returns: dyret_enum code, as follows: successful pivots: dyrOK: The pivot completed successfully and a new candidate x was selected. dyrDEGEN: (primalout) As dyrOK, but the pivot was degenerate. dyrOPTIMAL: (pseupdate) The pivot completed successfully, but no candidate x could be found. dyrPUNT: (pseupdate) The pivot completed successfully, but no candidate x could be selected because all candidates were flagged with the NOPIVOT qualifier. dyrREQCHK: (primalupdate) The pivot completed successfully, but a bogus number was calculated, or the pivot was dirty degenerate. unsuccessful (aborted) pivots: dyrMADPIV: The pivot coefficient was judged (numerically) unstable (primalout, dy_pivot). dyrREQCHK: The pivot coefficient is a bogus number (primalout), or there's been too much numerical drift while the antidegeneracy mechanism was active (degenout). dyrUNBOUND: The problem is unbounded (primalout). dyrLOSTPFEAS: Primal feasibility has been lost (primalout). dyrSINGULAR: The pivot resulted in a singular basis (dy_pivot). dyrBSPACE: basis package ran out of room to work (dy_pivot). dyrFATAL: Fatal confusion (data structure error, internal confusion, etc.) (various sources) */ { int xipos,xindx,xkpos,outdir ; double *abarj,*v,*betai,maxabarj,abarij,delta ; dyret_enum retval,outretval,pseretval ; bool reselect ; const char *rtnnme = "dy_primalpivot" ; extern dyret_enum primmultiout(int j, int indir, double *abarj, double maxabarj, int *p_xindx, int *p_outdir, double *p_deltaj) ; /* Force invalid return values in case we abort before they're set normally. (This also avoids spurious `read from unitialized' errors.) */ retval = dyrINV ; *p_xindx = -1 ; *p_outdir = 0 ; *p_xjcand = -1 ; *p_abarij = quiet_nan(0) ; *p_delta = quiet_nan(0) ; /* First we do some prep work. Retrieve and ftran column a. We need its max to use later to check for pivot stability. */ abarj = NULL ; if (consys_getcol_ex(dy_sys,xjndx,&abarj) == FALSE) { errmsg(122,rtnnme,dy_sys->nme, "column",consys_nme(dy_sys,'v',xjndx,TRUE,NULL),xjndx) ; if (abarj != NULL) FREE(abarj) ; return (dyrFATAL) ; } # ifndef DYLP_NDEBUG /* Print the column, if the user's interested. There should be no dirty zeroes, and the print will expose them if they occur. */ if (dy_opts->print.pivoting >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: x<%d> (%s) entering, status %s, %s from %g, ", rtnnme,xjndx,consys_nme(dy_sys,'v',xjndx,FALSE,NULL), dy_prtvstat(dy_status[xjndx]), (indir < 0)?"decreasing":"increasing",dy_x[xjndx]) ; dyio_outfmt(dy_logchn,dy_gtxecho,"lb = %g, ub = %g.", dy_sys->vlb[xjndx],dy_sys->vub[xjndx]) ; if (dy_opts->print.pivoting >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n entering column a<%d>:",xjndx) ; xkpos = 1 ; for (xipos = 1 ; xipos <= dy_sys->concnt ; xipos++) { if (abarj[xipos] == 0) continue ; xkpos = (xkpos+1)%2 ; if (xkpos == 0) dyio_outchr(dy_logchn,dy_gtxecho,'\n') ; xindx = dy_basis[xipos] ; dyio_outfmt(dy_logchn,dy_gtxecho,"\t%ca<%d,%d> = %g", (dy_lp->degen > 0 && dy_lp->degen == dy_degenset[xindx])?'*':'\0', xipos,xjndx,abarj[xipos]) ; } } } # endif dy_ftran(abarj,TRUE) ; maxabarj = exvec_infnorm(abarj,dy_sys->concnt,NULL) ; # ifndef DYLP_NDEBUG /* Print the ftran'd column. Again, there should be no dirty zeroes. */ if (dy_opts->print.pivoting >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n entering column abar<%d> = inv(B)a<%d>, max %g:", xjndx,xjndx,maxabarj) ; xkpos = 1 ; for (xipos = 1 ; xipos <= dy_sys->concnt ; xipos++) { if (abarj[xipos] == 0) continue ; xkpos = (xkpos+1)%2 ; if (xkpos == 0) dyio_outchr(dy_logchn,dy_gtxecho,'\n') ; xindx = dy_basis[xipos] ; dyio_outfmt(dy_logchn,dy_gtxecho,"\t%ca<%d,%d> = %g", (dy_lp->degen > 0 && dy_lp->degen == dy_degenset[xindx])?'*':'\0', xipos,xjndx,abarj[xipos]) ; } } # endif /* Open a loop to choose a leaving variable and perform a pivot. The reason we need a loop is because of the antidegeneracy algorithm. If it decides that this pivot will break us out of the degenerate vertex, we'll back out one level of restricted subproblem and repeat the selection process. If, on the other hand, primalout comes back with a degenerate pivot, we may want to form and perturb a restricted subproblem and reselect the pivot within that subproblem. Note that an indication from primalout that the problem is unbounded cannot be taken seriously while we're dealing with a restricted subproblem. The switch that follows is really spread out by comments, so watch for the comment indicating the end. */ reselect = TRUE ; degen_cyclecnt = 0 ; xipos = -1 ; while (reselect) { if (dy_opts->ppsel.strat == 0) { outretval = primalout(xjndx,indir,abarj,maxabarj, &xindx,&outdir,&delta) ; } else { outretval = primmultiout(xjndx,indir,abarj,maxabarj, &xindx,&outdir,&delta) ; } switch (outretval) { /* primalout returns dyrUNBOUND Are we currently coping with degeneracy? If not, the problem is truly unbounded and we need to return to some higher level to deal with it. If there's a restricted subproblem installed, we've discovered a breakout direction from the degenerate vertex, and need to reselect the leaving variable after backing out the restricted subproblem. (Presumably we'll find a limiting variable in the full problem.) dy_degenout returns dyrREQCHK if it notices too much numerical drift of the current values in dy_x from the values when the degenerate subproblem was formed. */ case dyrUNBOUND: { if (dy_lp->degen <= 0) { FREE(abarj) ; return (dyrUNBOUND) ; } # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 1 || dy_opts->print.degen >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: backing out level %d after %d pivots, unbounded.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters,dy_lp->degen, dy_lp->tot.pivs-degenstats.iterin[dy_lp->degen]) ; } # endif if (dy_degenout(dy_lp->degen-1) != dyrOK) { outretval = dyrREQCHK ; reselect = FALSE ; } break ; } /* primalout returns dyrOK Are we currently coping with degeneracy? If not, we have an uncomplicated, nondegenerate pivot. Yeah! If we are at a degenerate vertex, does this pivot break us out? The trick is distinguishing a genuine bounded but nondegenerate pivot from a pivot that appears nondegenerate due to the perturbation in the restricted subproblem. To do this the code depends on dy_brkout, which specifies the required direction -- away from the bound where the variable entered the basis. By extension, a pivot where the entering variable swings to its opposite bound and leaves is also nondegenerate. Note that xipos is not valid when xjndx == xindx (x isn't basic), so the order of the tests for breakout is important. If we've discovered a breakout direction, we need to reselect the leaving variable after backing out the restricted subproblem. (With more variables to consider and the perturbation gone, the limiting variable will likely be different.) dy_degenout returns dyrREQCHK if it notices too much numerical drift of the current values in dy_x from the values when the degenerate subproblem was formed. */ case dyrOK: { if (xjndx != xindx) xipos = dy_var2basis[xindx] ; if (dy_lp->degen > 0 && (xjndx == xindx || outdir == dy_brkout[xipos])) { # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 1 || dy_opts->print.degen >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: backing out level %d after %d pivots, ", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, dy_lp->degen, dy_lp->tot.pivs-degenstats.iterin[dy_lp->degen]) ; dyio_outfmt(dy_logchn,dy_gtxecho,"nondegenerate pivot.") ; } # endif if (dy_degenout(dy_lp->degen-1) != dyrOK) { outretval = dyrREQCHK ; reselect = FALSE ; } } else reselect = FALSE ; break ; } /* primalout returns dyrDEGEN Do we want (and are we allowed) to activate the antidegeneracy mechanism? If so, set up and perturb the restricted subproblem and then repeat the pivot selection. In order to create a restricted subproblem, opts.degen must permit it, and we must have executed opts.degenpivlim successive degenerate and nonconstructive pivots. The idea is to activate the antidegeneracy algorithm only when we have serious degeneracy involving explicit constraints where we can perturb the right-hand side (which we accomplish by the equivalent action of perturbing the values of the basic variables). To this end, we exclude degenerate pivots where: * A fixed variable is leaving. A fixed variable is certainly part of the cause of degeneracy, and the rules for selecting an incoming variable guarantee it won't come back. * A free variable is entering. Free variables have no bound, hence can't be a cause of degeneracy, and the rules for selecting a leaving variable guarantee that a free variable will never leave the basis. And nonbasic free variables preclude dual feasibility. * A superbasic variable is entering. Since it's not at bound, it won't be an immediate cause of degeneracy. And superbasic variables preclude dual feasibility. * The leaving variable is flagged as `do not perturb'. For all intents and purposes, it might as well be fixed, and we need to get it out of the basis. We'll allow only three attempts at getting the perturbation right, then we take the degenerate pivot and be done with it. */ case dyrDEGEN: { if (flgon(dy_status[xindx],vstatBFX|vstatNOPER) || flgon(dy_status[xjndx],vstatNBFR|vstatSB)) { reselect = FALSE ; xipos = dy_var2basis[xindx] ; # ifndef DYLP_NDEBUG if (dy_opts->print.degen >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: constructive degenerate pivot.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t%s %s (%d) leaving,", dy_prtvstat(dy_status[xindx]), consys_nme(dy_sys,'v',xindx,FALSE,NULL),xindx) ; dyio_outfmt(dy_logchn,dy_gtxecho," %s %s (%d) entering.", dy_prtvstat(dy_status[xjndx]), consys_nme(dy_sys,'v',xjndx,FALSE,NULL),xjndx) ; } # endif } else if (dy_opts->degen == TRUE && dy_opts->degenpivlim < dy_lp->degenpivcnt && degen_cyclecnt < 3) { # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 1 || dy_opts->print.degen >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: antidegeneracy increasing to level %d.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, dy_lp->degen+1) ; } # endif dy_degenin() ; degen_cyclecnt++ ; } else { reselect = FALSE ; xipos = dy_var2basis[xindx] ; # ifndef DYLP_NDEBUG if (dy_opts->print.degen >= 2 && degen_cyclecnt >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: forced degenerate pivot after %d cycles;", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, degen_cyclecnt) ; dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t%s %s (%d) leaving.", dy_prtvstat(dy_status[xindx]), consys_nme(dy_sys,'v',xindx,FALSE,NULL),xindx) ; } else if (dy_opts->print.degen >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: degenerate pivot, %s %s (%d) leaving.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, dy_prtvstat(dy_status[xindx]), consys_nme(dy_sys,'v',xindx,FALSE,NULL),xindx) ; } # endif } break ; } /* Remaining cases, and end of the pivot selection loop. If primalout returned anything other than dyrOK, dyrUNBOUND, or dyrDEGEN, it'll fall through to here and we'll punt back to the caller. Possibilities are dyrREQCHK, dyrMADPIV, dyrLOSTPFEAS and dyrFATAL. Make the default a trap for internal confusion. */ case dyrMADPIV: { xipos = dy_var2basis[xindx] ; abarij = abarj[xipos] ; (void) dy_addtopivrej(xjndx,dyrMADPIV,abarij,maxabarj) ; reselect = FALSE ; break ; } case dyrREQCHK: case dyrLOSTPFEAS: { xipos = dy_var2basis[xindx] ; reselect = FALSE ; break ; } case dyrFATAL: { FREE(abarj) ; return (outretval) ; } default: { errmsg(1,rtnnme,__LINE__) ; FREE(abarj) ; return (outretval) ; } } } /* Set the various output parameters, then return for everthing except dyrOK and dyrDEGEN (the second case arising because we've chosen not to activate the antidegeneracy mechanism). We'll claim 1.0 as the pivot coefficient if the pivot is a nonbasic variable swinging bound-to-bound. Note that we can wind up out here with outretval = dyrREQCHK and xjndx != xindx = -1 if primalout returned dyrUNBOUND, then dy_degenout ran into trouble and returned dyrREQCHK. */ *p_xindx = xindx ; *p_outdir = outdir ; *p_delta = delta ; abarij = quiet_nan(0) ; if (xjndx != xindx) { if (xindx > 0) { abarij = abarj[xipos] ; *p_abarij = abarij ; } } else { *p_abarij = 1.0 ; } if (!(outretval == dyrOK || outretval == dyrDEGEN)) { FREE(abarj) ; return (outretval) ; } /* The notion is that BFX will never reenter and NBFR will never leave, once the pivot is complete. So we're in no danger of cycling. */ if (outretval == dyrOK) { dy_lp->degenpivcnt = 0 ; } else { if (flgon(dy_status[xindx],vstatBFX|vstatNOPER) || flgon(dy_status[xjndx],vstatNBFR|vstatSB)) dy_lp->degenpivcnt = 0 ; else dy_lp->degenpivcnt++ ; } /* It looks like the pivot will go through, so get down to business. Updating the PSE and pricing information (dy_cbar and dy_gamma) will require beta (row i of the basis inverse), and the vector v = abar~inv(B). We need to calculate these prior to the basis change. Unfortunately, we'll then need to recalculate inv(B)abar for primal updates. After the prep work, attempt the pivot to update the LU factorisation. This can fail for three reasons: the pivot element didn't meet the numerical stability criteria (but we've checked this already), the pivot produced a singular basis, or the basis package ran out of space. On the dual side, it was a big win, computationally, to attempt to salvage the pivot at this point with a refactor if dy_pivot reported dyrNUMERIC (near singularity). It's not clear that this is a problem on the primal side, but if I find myself staring at this bit of code, it's worth a shot. All this code should be pulled out to a small subroutine if I add recovery. */ if (xjndx != xindx) { for (xkpos = 1 ; xkpos <= dy_sys->concnt ; xkpos++) if (dy_frame[dy_basis[xkpos]] == FALSE) abarj[xkpos] = 0 ; dy_btran(abarj) ; v = (double *) MALLOC((dy_sys->concnt+1)*sizeof(double)) ; memcpy(v,abarj,(dy_sys->concnt+1)*sizeof(double)) ; betai = (double *) CALLOC((dy_sys->concnt+1),sizeof(double)) ; betai[xipos] = 1.0 ; dy_btran(betai) ; if (consys_getcol_ex(dy_sys,xjndx,&abarj) == FALSE) { errmsg(122,rtnnme,dy_sys->nme,"column", consys_nme(dy_sys,'v',xjndx,FALSE,NULL),xjndx) ; retval = dyrFATAL ; } else { dy_ftran(abarj,TRUE) ; retval = dy_pivot(xipos,abarij,maxabarj) ; } } else { v = NULL ; betai = NULL ; retval = dyrOK ; } /* Then update the dylp data structures -- primalupdate does the basis, status, and primal and dual variable values, pseupdate does the column norms and reduced costs. In the process of updating the reduced costs, we'll select a candidate for the next entering variable. Note that there's no pseupdate if the pivot was a bound-to-bound move by a nonbasic variable (no basis change, no pseupdate). Finally, decide on the appropriate return value. Assuming pseupdate doesn't run into trouble, dyrREQCHK (primalupdate) wins over dyrDEGEN (primalout) which wins over dyrOK (various). */ if (retval == dyrOK) { dy_lp->pivok = TRUE ; retval = primalupdate(xjndx,indir,xindx,outdir,abarj,delta,betai) ; if (retval == dyrOK || retval == dyrREQCHK || retval == dyrSWING) { if (xjndx != xindx) { pseretval = pseupdate(xjndx,xindx,p_xjcand,abarj,v,betai) ; } else { pseretval = dyrOK ; *p_xjcand = 0 ; } } else { pseretval = dyrOK ; } if (pseretval != dyrOK) retval = pseretval ; else if (retval == dyrOK) { if (outretval == dyrDEGEN) retval = dyrDEGEN ; } } else if (retval == dyrNUMERIC) { retval = dyrSINGULAR ; } /* Tidy up and return. */ FREE(abarj) ; if (v != NULL) FREE(v) ; if (betai != NULL) FREE(betai) ; return (retval) ; } DyLP-1.6.0/DyLP/src/Dylp/glplib3.c0000644000076700007670000000752610632415522013305 0ustar /* glplib3.c */ /*---------------------------------------------------------------------- -- Copyright (C) 2000, 2001, 2002 Andrew Makhorin , -- Department for Applied Informatics, Moscow Aviation -- Institute, Moscow, Russia. All rights reserved. -- -- This file is a part of GLPK (GNU Linear Programming Kit). -- -- Licensed under the Common Public License (CPL) by permission of the -- author for inclusion in the DyLP LP distribution. ----------------------------------------------------------------------*/ #ifndef UNUSED # if defined(_GNU_SOURCE) || defined(__GNUC__) # define UNUSED __attribute__((unused)) # else # define UNUSED # endif #endif static char sccsid[] UNUSED = "@(#)glplib3.c 1.2 09/25/04" ; static char svnid[] UNUSED = "$Id: glplib3.c 148 2007-06-09 03:15:30Z lou $" ; #include #include #include #ifndef __CYGWIN__ /* With --pedantic-errors, cygwin won't compile its own signal.h, which is included from time.h */ # include #endif #include "glplib.h" /*---------------------------------------------------------------------- -- print - print informative message. -- -- *Synopsis* -- -- #include "glplib.h" -- void print(char *fmt, ...); -- -- *Description* -- -- The routine print prints an informative message specified by the -- format control string fmt and optional parameter list. */ void print(const char *fmt, ...) { va_list arg; /* print an informative message */ va_start(arg, fmt); vfprintf(stdout, fmt, arg); va_end(arg); fputc('\n', stdout); /* return to the calling program */ return; } /*---------------------------------------------------------------------- -- fault - print error message and terminate program execution. -- -- *Synopsis* -- -- #include "glplib.h" -- void fault(char *fmt, ...); -- -- *Description* -- -- The routine fault prints an error message specified by the format -- control string fmt and optional parameter list, and then abnormally -- terminates execution of the program. -- -- *Returns* -- -- The routine fault never returns. */ void fault(const char *fmt, ...) { va_list arg; /* print an error message */ va_start(arg, fmt); vfprintf(stdout, fmt, arg); va_end(arg); fputc('\n', stdout); /* deinitialize library environment */ free_lib_env(); /* terminate program execution */ #if 0 abort(); #else exit(3); #endif /* no return */ } /*---------------------------------------------------------------------- -- insist - check for logical condition. -- -- *Synopsis* -- -- #include "glplib.h" -- void insist(int expr); -- -- *Description* -- -- The routine insist (implemented as a macro) checks for a logical -- condition specified by the parameter expr. If the condition is false -- (i.e. expr is zero), the routine prints an appropriate error message -- and abnormally terminates the program. -- -- This routine is a replacement of the standard function assert. */ void _insist(const char *expr, const char *file, int line) { /* print an error message */ fputc('\n', stdout); fprintf(stdout, "Assertion failed: %s, file %s, line %d\n", expr, file, line); /* deinitialize library environment */ free_lib_env(); /* terminate program execution */ #if 0 abort(); #else exit(3); #endif /* no return */ } /*---------------------------------------------------------------------- -- watch - take reading of stop-watch. -- -- *Synopsis* -- -- #include "glplib.h" -- double watch(void); -- -- *Returns* -- -- The routine watch returns the processor time in seconds. */ #ifndef __CYGWIN__ /* As mentioned above, we get in trouble if we include time.h, so this function has to go. */ double watch(void) { return (double)clock() / (double)CLOCKS_PER_SEC; } #endif /* eof */ DyLP-1.6.0/DyLP/src/Dylp/glpinv.h0000644000076700007670000001566110643314772013263 0ustar /* glpinv.h */ /*---------------------------------------------------------------------- -- Copyright (C) 2000, 2001, 2002, 2003 Andrew Makhorin, Department -- for Applied Informatics, Moscow Aviation Institute, Moscow, Russia. -- All rights reserved. E-mail: . -- -- This file is a part of GLPK (GNU Linear Programming Kit). -- -- Licensed under the Common Public License (CPL) by permission of the -- author for inclusion in the DyLP LP distribution. ----------------------------------------------------------------------*/ /* @(#)glpinv.h 1.3 06/22/04 svn/cvs: $Id: glpinv.h 158 2007-07-06 01:25:14Z lou $ */ #ifndef _GLPINV_H #define _GLPINV_H #include "glpluf.h" #define inv_create dy_glp_inv_create #define inv_decomp dy_glp_inv_decomp #define inv_h_solve dy_glp_inv_h_solve #define inv_ftran dy_glp_inv_ftran #define inv_btran dy_glp_inv_btran #define inv_update dy_glp_inv_update #define inv_delete dy_glp_inv_delete /*---------------------------------------------------------------------- -- The structure INV defines an invertable form of the basis matrix B, -- which is based on LU-factorization and is the following sextet: -- -- [B] = (F, H, V, P0, P, Q), (1) -- -- where F, H, and V are such matrices that -- -- B = F * H * V, (2) -- -- and P0, P, and Q are such permutation matrices that the matrix -- -- L = P0 * F * inv(P0) (3) -- -- is lower triangular with unity diagonal, and the matrix -- -- U = P * V * Q (4) -- -- is upper triangular. All the matrices have the same order m, which -- is the order of the basis matrix B. -- -- The matrices F, V, P, and Q are stored in the structure LUF (see the -- section GLPLUF), which is a member of the structure INV. -- -- The matrix H is stored in the form of eta file using row-like format -- as follows: -- -- H = H[1] * H[2] * ... * H[nfs], (5) -- -- where H[k], k = 1, 2, ..., nfs, is a row-like factor, which differs -- from the unity matrix only by one row, nfs is current number of row- -- like factors. After the factorization has been built for some given -- basis matrix B the matrix H has no factors and thus it is the unity -- matrix. Then each time when the factorization is recomputed for an -- adjacent basis matrix, the next factor H[k], k = 1, 2, ... is built -- and added to the end of the eta file H. -- -- Being sparse vectors non-trivial rows of the factors H[k] are stored -- in the right part of the sparse vector area (SVA) in the same manner -- as rows and columns of the matrix F. -- -- For more details see the program documentation. */ typedef struct INV INV; struct INV { /* invertable (factorized) form of the basis matrix */ int m; /* order of the matrices B, F, H, V, P0, P, Q */ int valid; /* if this flag is not set, the invertable form is invalid and can't be updated nor used in ftran and btran operations */ LUF *luf; /* LU-factorization (holds the matrices F, V, P, Q) */ /*--------------------------------------------------------------*/ /* matrix H in the form of eta file */ int hh_max; /* maximal number of row-like factors (that limits maximal number of updates of the factorization) */ int hh_nfs; /* current number of row-like factors (0 <= hh_nfs <= hh_max) */ int *hh_ndx; /* int hh_ndx[1+hh_max]; */ /* hh_ndx[0] is not used; hh_ndx[k], k = 1, ..., nfs, is number of a non-trivial row of the factor H[k] */ int *hh_ptr; /* int hh_ptr[1+hh_max]; */ /* hh_ptr[0] is not used; hh_ptr[k], k = 1, ..., nfs, is a pointer to the first element of the non-trivial row of the factor H[k] in the sparse vector area */ int *hh_len; /* int hh_len[1+hh_max]; */ /* hh_len[0] is not used; hh_len[k], k = 1, ..., nfs, is total number of elements in the non-trivial row of the factor H[k] */ /*--------------------------------------------------------------*/ /* matrix P0 */ int *p0_row; /* int p0_row[1+n]; */ /* p0_row[0] is not used; p0_row[i] = j means that p0[i,j] = 1 */ int *p0_col; /* int p0_col[1+n]; */ /* p0_col[0] is not used; p0_col[j] = i means that p0[i,j] = 1 */ /* if i-th row or column of the matrix F corresponds to i'-th row or column of the matrix L = P0*F*inv(P0), then p0_row[i'] = i and p0_col[i] = i' */ /*--------------------------------------------------------------*/ /* partially transformed column is inv(F*H)*B[j], where B[j] is a new column, which will replace the existing j-th column of the basis matrix */ int cc_len; /* number of (non-zero) elements in the partially transformed column; if cc_len < 0, the column has been not prepared yet */ int *cc_ndx; /* int cc_ndx[1+m]; */ /* cc_ndx[0] is not used; cc_ndx[k], k = 1, ..., cc_len, is a row index of the partially transformed column element */ double *cc_val; /* double cc_val[1+m]; */ /* cc_val[0] is not used; cc_val[k], k = 1, ..., cc_len, is a numerical (non-zero) value of the column element */ /*--------------------------------------------------------------*/ /* control parameters */ double upd_tol; #if 0 /* update tolerance; if on updating the factorization absolute value of some diagonal element of the matrix U = P*V*Q is less than upd_tol, the factorization is considered as inaccurate */ #else /* update tolerance; if after the factorization has been updated absolute value of some diagonal element u[k,k] of the matrix U = P*V*Q is less than upd_tol * max(|u[k,*]|, |u[*,k]|), the factorization is considered as inaccurate */ #endif /*--------------------------------------------------------------*/ /* some statistics */ int nnz_h; /* current number of non-zeros in all factors of the matrix H */ double min_vrratio ; /* minimum value of u[k,k]/(upd_tol)*max(|u[k,*]|, |u[*,k]|) since last pivot. */ }; INV *inv_create(int m, int max_upd); /* create factorization of the basis matrix */ int inv_decomp(INV *inv, void *info, int (*col)(void *info, int j, int rn[], double bj[])); /* compute factorization of the basis matrix */ void inv_h_solve(INV *inv, int tr, double x[]); /* solve system H*x = b or H'*x = b */ void inv_ftran(INV *inv, double x[], int save); /* perform forward transformation (FTRAN) */ void inv_btran(INV *inv, double x[]); /* perform backward transformation (BTRAN) */ int inv_update(INV *inv, int j); /* update factorization for adjacent basis matrix */ void inv_delete(INV *inv); /* delete factorization of the basis matrix */ #endif /* eof */ DyLP-1.6.0/DyLP/src/Dylp/dy_varmgmt.c0000644000076700007670000013335011026315405014112 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains routines for primal architectural variable management. The two primitive routines, dy_actNBPrimArch and dy_deactNBPrimArch, provide activation and deactivation of a nonbasic primal architectural variable. The top-level routines for normal bulk activation and deactivation are dy_activateVars and dy_deactivateVars, respectively. dy_activateVars pays attention to the target simplex phase and will only activate variables which will be feasible for the phase. In the normal course of events, dylp will deactivate architecturals with unfavourable cbar and activate architecturals with favourable cbar. Put another way, variables already at their optimum bound and unlikely to ever change are deactivated. Inactive variables not at their optimum bound are activated for adjustment. Put another way, loose dual constraints are deactivated, violated dual constraints are activated. When attempting to recover from pivoting problems in primal simplex, dylp will deactivate architecturals with favourable cbar in an attempt to force dual feasibility and allow a transition to dual simplex. Logical variables cannot be activated or deactivated independently; they are manipulated with their associated constraint. See dy_conmgmt.c Activating or deactivating a basic primal variable is problematic. Viewed from a primal perspective, activation requires we find a basis position, while deactivation amounts to forcing the variable to bound. Implementation is nontrivial, and both actions can have serious side effects. This package does not support activation into the basis. (Note, however, that it's standard procedure when activating a constraint to use the associated logical as the new basic variable.) Don't be taken in by the pseudo-primitive, dy_deactBPrimArch. It's used only in the context of attempting to force primal feasibility, and it's a faint hope at best. The specified variable must be primal infeasible, and all hell will break loose when this variable is forced to bound as it's moved into the nonbasic partition prior to calling dy_deactNBPrimArch. Sometimes we want to view the column for x as a dual constraint: In terms of the dual problem, we're activating or deactivating a dual constraint in order to bound the dual. The routines that control this activity (dy_dualaddvars and subordinates) are in dy_bound.c. */ /* A few words about the activation and deactivation of variables as it relates to the PSE and DSE pricing algorithms. Variable deactivation targets only nonbasic architectural variables. For DSE pricing, that's not a problem --- the basis inverse row norms ||beta|| are not affected. For PSE pricing, there is again no difficulty. The column goes away, but the norms ||abar~|| of other columns are not affected. Variable activation has no effect on DSE pricing. Again, bringing a variable into the nonbasic partition doesn't affect the beta. For PSE pricing, the variable must be added to the reference frame and ||abar~|| must be calculated. Activation and deactivation of constraints and associated logicals is a very different story. See the discussion in dy_conmgmt.c. */ #define DYLP_INTERNAL #include "dylp.h" static char sccsid[] UNUSED = "@(#)dy_varmgmt.c 4.6 10/15/05" ; static char svnid[] UNUSED = "$Id: dy_varmgmt.c 240 2008-06-18 23:32:21Z lou $" ; /* Reverse integer comparison so we can sort arrays of indices in nonincreasing order. Returns: < 0 if i > j 0 if i = j > 0 if i < j */ static int intcompare (const void *p_i, const void *p_j) { int i = *((const int *) p_i) ; int j = *((const int *) p_j) ; return ((j)-(i)) ; } static bool prepcol_pk (consys_struct *orig_sys, int oxjndx, pkvec_struct **p_aj) /* This routine `preps' a column a from the original constraint system for use in the active constraint system. It returns a packed vector containing only the active coefficients, with row indices translated from the original system to the active system. Parameters: orig_sys: The original constraint system. oxjndx: The index of x in the original system. p_aj: (i) A pkvec structure, or NULL (in which case a vector will be allocated) (o) The prepped column a. Returns: TRUE if a is prepped without error, FALSE otherwise. */ { int pkndx,ocndx,cndx ; pkvec_struct *aj ; pkcoeff_struct *aij ; const char *rtnnme = "prepcol_pk" ; # ifdef DYLP_PARANOIA /* We shouldn't be here if x is already active. */ if (p_aj == NULL) { errmsg(2,rtnnme,"&a") ; return (FALSE) ; } if (ACTIVE_VAR(oxjndx)) { char onmbuf[128] ; (void) consys_nme(orig_sys,'v',oxjndx,TRUE,onmbuf) ; errmsg(431,rtnnme, orig_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "variable",onmbuf,oxjndx, consys_nme(dy_sys,'v',dy_origvars[oxjndx],TRUE,NULL), dy_origvars[oxjndx]) ; return (FALSE) ; } # endif /* Pull the column from orig_sys. If the user didn't supply a pkvec to hold the prepped column, one will be allocated in the process. */ if (consys_getcol_pk(orig_sys,oxjndx,p_aj) == FALSE) { errmsg(122,rtnnme,orig_sys->nme, "column",consys_nme(orig_sys,'v',oxjndx,TRUE,NULL),oxjndx) ; return (FALSE) ; } aj = *p_aj ; /* For coefficients in active constraints, convert the row index. Delete coefficients in inactive constraints. */ for (pkndx = 0,aij = aj->coeffs ; pkndx < aj->cnt ; ) { ocndx = aij->ndx ; if (INACTIVE_CON(ocndx)) { cndx = dy_origcons[ocndx] ; # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tdeleting a<%d,%d> = %g; %s constraint %s inactive.", ocndx,oxjndx,aij->val, consys_prtcontyp(orig_sys->ctyp[ocndx]), consys_nme(orig_sys,'c',ocndx,FALSE,NULL)) ; } # endif aj->cnt-- ; if (pkndx < aj->cnt) { aij->ndx = aj->coeffs[aj->cnt].ndx ; aij->val = aj->coeffs[aj->cnt].val ; } } else { cndx = dy_origcons[ocndx] ; # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\ta<%d,%d> = %g becomes a<%d,%d>; %s constraint %s active.", ocndx,oxjndx,aij->val,cndx,oxjndx, consys_prtcontyp(orig_sys->ctyp[ocndx]), consys_nme(orig_sys,'c',ocndx,FALSE,NULL)) ; } # endif aij->ndx = cndx ; pkndx++ ; aij++ ; } } return (TRUE) ; } bool dy_actNBPrimArch (consys_struct *orig_sys, int ovndx) /* This routine activates the nonbasic primal architectural variable x with index ovndx in orig_sys, installing it in the active system dy_sys with index j and the status it held while inactive. There are a number of details to attend to: * The rhs and rhslow values of affected constraints are adjusted. * The objective correction is adjusted. * The variable is added to the PSE reference frame and the projected column norm gamma[j] is initialized to 1. Note that by convention, NBFR variables have value zero. It's left to the client to decide if initializing gamma[j] to 1 is adequate. The alternative (calculating the correct projected norm for the current reference frame) is best done in bulk rather than one variable at a time. Parameters: orig_sys: The original constraint system. ovndx: The index of the variable in the original system. Returns: TRUE if the activation completes without error; FALSE otherwise. */ { int pkndx,i,j ; double valj,cj,lbj,ubj ; flags statj ; pkvec_struct *aj ; pkcoeff_struct *aij ; const char *rtnnme = "dy_actNBPrimArch" ; # ifdef DYLP_PARANOIA if (orig_sys == NULL) { errmsg(2,rtnnme,"orig_sys") ; return (FALSE) ; } if (ovndx <= 0 || ovndx > orig_sys->archvcnt) { errmsg(102,rtnnme,"inactive variable",ovndx,1,orig_sys->archvcnt) ; return (FALSE) ; } j = (orig_sys->varcnt-dy_lp->sys.vars.unloadable) - (dy_lp->sys.vars.loadable+dy_sys->archvcnt) ; if (j != 0) { errmsg(444,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "variable",orig_sys->varcnt,dy_lp->sys.vars.unloadable, dy_lp->sys.vars.loadable,dy_sys->archvcnt,j) ; return (FALSE) ; } if (ACTIVE_VAR(ovndx)) { char onmbuf[128] ; j = dy_origvars[ovndx] ; (void) consys_nme(orig_sys,'v',ovndx,TRUE,onmbuf) ; errmsg(431,rtnnme, orig_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "variable",onmbuf,ovndx, consys_nme(dy_sys,'v',j,TRUE,NULL),j) ; return (FALSE) ; } # endif /* Get the status. If we're paranoid, confirm that it's normal nonbasic and loadable. */ statj = (flags) (-dy_origvars[ovndx]) ; # ifdef DYLP_PARANOIA if (!LOADABLE_VAR(ovndx)) { errmsg(445,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "variable",consys_nme(orig_sys,'v',ovndx,TRUE,NULL),ovndx) ; return (FALSE) ; } if (flgoff(statj,vstatNBLB|vstatNBUB|vstatNBFR)) { errmsg(433,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "inactive",consys_nme(orig_sys,'v',ovndx,TRUE,NULL),ovndx, dy_prtvstat(statj)) ; return (FALSE) ; } # endif /* Pull the column from orig_sys and prep it for installation in dy_sys. */ aj = NULL ; if (prepcol_pk(orig_sys,ovndx,&aj) == FALSE) { errmsg(432,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, consys_nme(orig_sys,'v',ovndx,TRUE,NULL),ovndx) ; if (aj != NULL) pkvec_free(aj) ; return (FALSE) ; } cj = orig_sys->obj[ovndx] ; ubj = orig_sys->vub[ovndx] ; lbj = orig_sys->vlb[ovndx] ; /* Install the column and update the associated structures. */ if (consys_addcol_pk(dy_sys,vartypCON,aj,cj, orig_sys->vlb[ovndx],orig_sys->vub[ovndx]) == FALSE) { errmsg(156,rtnnme,"variable",dy_sys->nme,aj->nme) ; pkvec_free(aj) ; return (FALSE) ; } j = aj->ndx ; dy_origvars[ovndx] = j ; dy_actvars[j] = ovndx ; dy_status[j] = statj ; dy_var2basis[j] = 0 ; if (dy_lp->p1obj.installed == TRUE) { dy_lp->p1obj.p2obj[j] = cj ; dy_sys->obj[j] = 0.0 ; } /* Get the variable's value. If it's nonzero, scan the column and make any necessary adjustments to rhs and rhslow of affected constraints. Also adjust the objective correction. */ if (flgon(statj,vstatNBLB)) { valj = lbj ; } else if (flgon(statj,vstatNBUB)) { valj = ubj ; } else { valj = 0.0 ; } dy_x[j] = valj ; if (valj != 0) { for (pkndx = 0,aij = aj->coeffs ; pkndx < aj->cnt ; pkndx++,aij++) { i = aij->ndx ; dy_sys->rhs[i] += aij->val*valj ; setcleanzero(dy_sys->rhs[i],dy_tols->zero) ; if (dy_sys->ctyp[i] == contypRNG) { dy_sys->rhslow[i] += aij->val*valj ; setcleanzero(dy_sys->rhslow[i],dy_tols->zero) ; } # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tadjusting %s constraint %s (%d), ", consys_prtcontyp(dy_sys->ctyp[i]), consys_nme(dy_sys,'c',i,FALSE,NULL),i) ; dyio_outfmt(dy_logchn,dy_gtxecho,"a<%d,%d> = %g, x<%d> = %g, ", i,j,aij->val,j,valj) ; if (dy_sys->ctyp[i] == contypRNG) dyio_outfmt(dy_logchn,dy_gtxecho,"rhslow & ") ; dyio_outfmt(dy_logchn,dy_gtxecho,"rhs += %g.", aij->val*valj) ; } # endif } dy_lp->inactzcorr -= cj*valj ; } pkvec_free(aj) ; /* Add the variable to the reference frame and initialize gamma[j]. */ dy_frame[j] = TRUE ; dy_gamma[j] = 1 ; /* And finally, a little bookkeeping. */ dy_lp->sys.vars.loadable-- ; # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\tadjusting objective correction, ") ; dyio_outfmt(dy_logchn,dy_gtxecho,"c<%d> = %g, x<%d> = %g, zcorr -= %g.", ovndx,orig_sys->obj[ovndx],ovndx,valj, orig_sys->obj[ovndx]*valj) ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t%s %s (%d) = %g copied to index %d, status %s.", consys_prtvartyp(dy_sys->vtyp[j]), consys_nme(orig_sys,'v',ovndx,FALSE,NULL),ovndx,valj,j, dy_prtvstat(statj)) ; } # endif # ifdef DYLP_STATISTICS if (dy_stats != NULL) dy_stats->vars.actcnt[ovndx]++ ; # endif return (TRUE) ; } bool dy_actNBPrimArchList (consys_struct *orig_sys, int cnt, int *ovndxs) /* This routine is purely a shell to call dy_actNBPrimArch for each of the indices in the vector ovndxs. It performs minimal error checking, relying on checking in actNBPrimArch. One thing it does do is check if the variable is already active. This can happen when the list passed in avndxs includes duplicate indices, so we don't want it trapped later as an error. Parameters: orig_sys: The original constraint system. cnt: The number of indices in ovndxs ovndxs: Vector of variable indices (0-based) Returns: TRUE if all variables are successfully activated, FALSE otherwise */ { int j,k ; bool retval ; const char *rtnnme = "dy_actNBPrimArchList" ; # ifdef DYLP_PARANOIA if (orig_sys == NULL) { errmsg(2,rtnnme,"orig_sys") ; return (FALSE) ; } if (ovndxs == NULL) { errmsg(2,rtnnme,"ovndxs") ; return (FALSE) ; } if (cnt <= 0 || cnt > orig_sys->archvcnt) { errmsg(5,rtnnme,"cnt",cnt) ; return (FALSE) ; } # endif retval = TRUE ; for (k = 0 ; k < cnt && retval == TRUE ; k++) { j = ovndxs[k] ; if (ACTIVE_VAR(j)) continue ; # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n activating variable %s (%d)", consys_nme(orig_sys,'v',j,TRUE,NULL),j) ; } # endif retval = dy_actNBPrimArch(orig_sys,j) ; if (retval == FALSE) { errmsg(430,rtnnme, orig_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "activate","variable", consys_nme(orig_sys,'v',j,TRUE,NULL),j) ; } } # ifdef DYLP_PARANOIA if (retval == TRUE) { retval = dy_chkdysys(orig_sys) ; } # endif return (retval) ; } bool dy_deactBPrimArch (consys_struct *orig_sys, int j) /* This routine deactivates the basic primal architectural variable x, removing it from dy_sys. The only reason we want to do this is because we're trying to force primal feasibility. The chance of achieving primal feasibility is pretty well zero, given that we can't really deactivate the implicit bound constraint --- as we force x into the nonbasic partition, we simultaneously force it to the nearest bound. But in the context of dual error recovery, it will serve the purpose of moving the basis. We can't deactivate a basic variable, so we need to force x into the nonbasic partition. Suppose x occupies basis pos'n i. The obvious candidate to fill the slot is the logical for constraint i. If it's nonbasic, we swap it in with value 0 and then call dy_deactNBPrimArch to deactivate the newly nonbasic x. But it could also be that x is basic in some other position, k. In which case we just try again, with the logical x as the new target. Why, you ask, are we hunting down logicals, instead of just swapping with any old variable? Because we'll have enough problems after this without accidentally creating a singular basis. Parameters: orig_sys: Original constraint system j: The variable to be deactivated Returns: TRUE if the deactivation succeeds, FALSE otherwise. */ { int i,k ; double valj ; flags statj,stati ; const char *rtnnme = "dy_deactBPrimArch" ; /* Prep intermixed with paranoia. We need to retrieve the status and check that it's what we expect. */ # ifdef DYLP_PARANOIA if (j <= dy_sys->logvcnt || j > dy_sys->varcnt) { errmsg(102,rtnnme,"active variable",j,dy_sys->logvcnt+1,dy_sys->varcnt) ; return (FALSE) ; } # endif statj = dy_status[j] ; # ifdef DYLP_PARANOIA if (flgoff(statj,vstatBLLB|vstatBUUB)) { errmsg(438,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, consys_nme(dy_sys,'v',j,TRUE,NULL),j,dy_prtvstat(statj)) ; return (FALSE) ; } # endif /* Search for a nonbasic logical x which we can swap into the basis to replace x. No loop body required, except for paranoia. */ for (i = dy_var2basis[j] ; dy_var2basis[i] != 0 ; i = dy_var2basis[i]) { # ifdef DYLP_PARANOIA if (i <= 0 || i > dy_sys->concnt) { errmsg(102,rtnnme,"logical variable",i,1,dy_sys->concnt) ; return (FALSE) ; } # endif } /* We have to determine the appropriate new status for both x and x. Arguably, we shouldn't see vstatSB here (superbasic and dual feasible just don't go together), but it's trivial to handle. Capture x's new value while we're at it. */ statj = getflg(dy_status[j],vstatSTATUS) ; switch (statj) { case vstatBLLB: { statj = vstatNBLB ; valj = dy_sys->vlb[j] ; break ; } case vstatBUUB: { statj = vstatNBUB ; valj = dy_sys->vub[j] ; break ; } default: { errmsg(1,rtnnme,__LINE__) ; return (FALSE) ; } } stati = getflg(dy_status[i],vstatSTATUS) ; switch (stati) { case vstatNBLB: { stati = vstatBLB ; break ; } case vstatNBUB: { stati = vstatBUB ; break ; } case vstatNBFX: { stati = vstatBFX ; break ; } case vstatNBFR: { stati = vstatBFR ; break ; } case vstatSB: { stati = vstatB ; break ; } default: { errmsg(1,rtnnme,__LINE__) ; return (FALSE) ; } } # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n swapping %s (%d) %s -> ", consys_nme(dy_sys,'v',j,FALSE,NULL),j, dy_prtvstat(dy_status[j])) ; dyio_outfmt(dy_logchn,dy_gtxecho,"%s ",dy_prtvstat(statj)) ; dyio_outfmt(dy_logchn,dy_gtxecho,"<=> %s (%d) %s -> ", consys_nme(dy_sys,'v',i,FALSE,NULL),i, dy_prtvstat(dy_status[i])) ; dyio_outfmt(dy_logchn,dy_gtxecho,"%s.",dy_prtvstat(stati)) ; } # endif /* Tweak dy_basis, dy_var2basis, dy_status, dy_x, and dy_xbasic to do the swap. The entries for x are going to disappear momentarily, but deactNBPrimArch will want to examine them to do the deactivation. Guaranteed we change the composition of the PSE and DSE norms with this maneuver. */ k = dy_var2basis[j] ; dy_basis[k] = i ; dy_xbasic[k] = dy_x[i] ; dy_var2basis[i] = k ; dy_status[i] = stati ; dy_var2basis[j] = 0 ; dy_status[j] = statj ; dy_x[j] = valj ; dy_lp->simplex.init_pse = TRUE ; dy_lp->simplex.init_dse = TRUE ; /* Reality is altered. Call dy_deactNBPrimArch to do the heavy lifting. */ return (dy_deactNBPrimArch(orig_sys,j)) ; } bool dy_deactNBPrimArch (consys_struct *orig_sys, int j) /* This routine deactivates the nonbasic primal architectural variable x, removing it from dy_sys. There are a number of details to attend to: * The rhs and rhslow values for affected constraints are adjusted. * The objective correction is adjusted. If consys shifts a variable to fill the hole at index j (the common case), we also need to * Update the dy_origvars entry for the new x. * Check if the new x is basic, and, if so, correct dy_basis. Note that by convention, NBFR variables have value zero. We don't have to remove x from the reference frame --- since dy_frame and dy_gamma are attached to dy_sys, removal occurs automatically as a side effect of removing the variable from dy_sys. Parameters: orig_sys: The original constraint system. j: The index of the variable in the active system. orig_sys is used only for printing and paranoid checks, but it gives a nice symmetry with dy_actNBPrimArch. Returns: TRUE if the installation completes without error; FALSE otherwise. */ { int ovndx,i,pkndx ; double valj ; flags statj ; pkvec_struct *aj ; pkcoeff_struct *aij ; const char *rtnnme = "dy_deactNBPrimArch" ; /* Prep intermixed with paranoia. We need to retrieve the status and check that it's appropriate for deactivation, and that we have a valid index in the old system. */ # ifdef DYLP_PARANOIA if (j <= dy_sys->logvcnt || j > dy_sys->varcnt) { errmsg(102,rtnnme,"active variable",j,dy_sys->logvcnt+1,dy_sys->varcnt) ; return (FALSE) ; } # endif statj = dy_status[j] ; # ifdef DYLP_PARANOIA if (flgoff(statj,vstatNONBASIC|vstatNBFR)) { errmsg(433,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "active",consys_nme(dy_sys,'v',j,TRUE,NULL),j, dy_prtvstat(statj)) ; return (FALSE) ; } # endif ovndx = dy_actvars[j] ; # ifdef DYLP_PARANOIA if (ovndx <= 0 || ovndx > orig_sys->varcnt) { errmsg(102,rtnnme,"original variable",ovndx,1,orig_sys->varcnt) ; return (FALSE) ; } i = (orig_sys->varcnt-dy_lp->sys.vars.unloadable) - (dy_lp->sys.vars.loadable+dy_sys->archvcnt) ; if (i != 0) { errmsg(444,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "variable", orig_sys->varcnt,dy_lp->sys.vars.unloadable, dy_lp->sys.vars.loadable,dy_sys->archvcnt,i) ; return (FALSE) ; } # endif /* More prep. Retrieve the column and the value of the variable. */ aj = NULL ; if (consys_getcol_pk(dy_sys,j,&aj) == FALSE) { errmsg(122,rtnnme,dy_sys->nme,"variable", consys_nme(dy_sys,'v',j,TRUE,NULL),j) ; if (aj != NULL) pkvec_free(aj) ; return (FALSE) ; } valj = dy_x[j] ; /* Ok, things look good --- we can locate the variable in the active and original systems, and we have the column in hand. To deactivate, we clean the status and set it in dy_origvars to mark the variable inactive. If the outgoing variable is NBFX, mark it with the NOLOAD qualifier. If x is nonzero, traverse the column and correct the rhs and rhslow values, and adjust the objective correction. */ clrflg(statj,vstatQUALS) ; if (statj == vstatNBFX) setflg(statj,vstatNOLOAD) ; MARK_INACTIVE_VAR(ovndx,-((int) statj)) ; if (valj != 0) { for (pkndx = 0, aij = aj->coeffs ; pkndx < aj->cnt ; pkndx++, aij++) { i = aij->ndx ; dy_sys->rhs[i] -= aij->val*valj ; setcleanzero(dy_sys->rhs[i],dy_tols->zero) ; if (dy_sys->ctyp[i] == contypRNG) { dy_sys->rhslow[i] -= aij->val*valj ; setcleanzero(dy_sys->rhslow[i],dy_tols->zero) ; } # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tadjusting %s constraint %s (%d), ", consys_prtcontyp(dy_sys->ctyp[i]), consys_nme(dy_sys,'c',i,FALSE,NULL),i) ; dyio_outfmt(dy_logchn,dy_gtxecho,"a<%d,%d> = %g, x<%d> = %g, ", i,j,aij->val,j,valj) ; if (dy_sys->ctyp[i] == contypRNG) dyio_outfmt(dy_logchn,dy_gtxecho,"rhslow & ") ; dyio_outfmt(dy_logchn,dy_gtxecho,"rhs -= %g.", aij->val*valj) ; } # endif } dy_lp->inactzcorr += dy_sys->obj[j]*valj ; # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tadjusting objective correction, ") ; dyio_outfmt(dy_logchn,dy_gtxecho,"c<%d> = %g, x<%d> = %g, zcorr += %g.", j,dy_sys->obj[j],j,valj,dy_sys->obj[j]*valj) ; } # endif } pkvec_free(aj) ; /* Delete the column from the active system. Row vectors attached to dy_sys will be automatically rearranged by the consys package. */ if (consys_delcol(dy_sys,j) == FALSE) { errmsg(112,rtnnme,dy_sys->nme,"delete","variable", consys_nme(dy_sys,'v',j,FALSE,NULL),j) ; return (FALSE) ; } # ifdef DYLP_STATISTICS if (dy_stats != NULL) dy_stats->vars.deactcnt[ovndx]++ ; # endif /* Unless x was the last variable in dy_sys, the last variable has been moved into slot j to close up the hole. Normally, there will be two remaining details to attend to: * Consult dy_actvars[j] to find the index ovndx of x in the original system, and correct dy_origvars[ovndx]. * Check dy_var2basis[j], and see if the variable moved into this slot is basic. If so, correct dy_basis. */ if (j <= dy_sys->varcnt) { ovndx = dy_actvars[j] ; # ifdef DYLP_PARANOIA if (dy_origvars[ovndx] != dy_sys->varcnt+1) { errmsg(1,rtnnme,__LINE__) ; return (FALSE) ; } # endif # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t%s (%d) shifted from column %d", consys_nme(dy_sys,'v',j,FALSE,NULL),ovndx, dy_origvars[ovndx]) ; } # endif dy_origvars[ovndx] = j ; i = dy_var2basis[j] ; if (i != 0) { # ifdef DYLP_PARANOIA if (dy_basis[i] != dy_sys->varcnt+1) { errmsg(1,rtnnme,__LINE__) ; return (FALSE) ; } # endif # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho,", basis entry %d corrected",i) ; } # endif dy_basis[i] = j ; } } /* And finally ... if the status was anything other than NBFX, we now have a variable we can activate. But if it was NBFX, well, the number of unloadable variables just increased. */ if (flgon(statj,vstatNBFX)) { dy_lp->sys.vars.unloadable++ ; } else { dy_lp->sys.vars.loadable++ ; } return (TRUE) ; } static bool deactNBPrimArchList (consys_struct *orig_sys, int cnt, int *avndxs) /* This routine is purely a shell to call dy_deactNBPrimArch for each of the indices in the vector avndxs. It performs minimal error checking, relying on checking in dy_deactNBPrimArch. Parameters: orig_sys: The original constraint system cnt: The number of indices in avndxs avndxs: Vector of variable indices (0-based) orig_sys is used only for printing and paranoid checks, but it gives a nice symmetry with actNBPrimArchList. Returns: TRUE if all variables are successfully deactivated, FALSE otherwise */ { int k ; bool retval ; const char *rtnnme = "deactNBPrimArchList" ; # ifdef DYLP_PARANOIA if (avndxs == NULL) { errmsg(2,rtnnme,"avndxs") ; return (FALSE) ; } if (cnt <= 0 || cnt > dy_sys->archvcnt) { errmsg(5,rtnnme,"cnt",cnt) ; return (FALSE) ; } # endif /* To make sure consys doesn't shift variables out from under us, we need to delete in nonincreasing order. */ qsort(&avndxs[0],cnt,sizeof(int),intcompare) ; retval = TRUE ; for (k = 0 ; k < cnt && retval == TRUE ; k++) { # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n deactivating variable %s (%d)", consys_nme(dy_sys,'v',avndxs[k],TRUE,NULL),avndxs[k]) ; } # endif retval = dy_deactNBPrimArch(orig_sys,avndxs[k]) ; if (retval == FALSE) { errmsg(430,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "deactivate","variable", consys_nme(dy_sys,'v',avndxs[k],TRUE,NULL),avndxs[k]) ; } } # ifdef DYLP_PARANOIA if (retval == TRUE) { retval = dy_chkdysys(orig_sys) ; } # endif return (retval) ; } static int scanPrimVarStdDeact (int **p_avndxs) /* This routine scans the active constraint system for variables that are candidates for normal variable deactivation during primal simplex, i.e., nonbasic architectural variables which are judged unlikely to be useful in improving the solution because they have a lousy reduced cost. The routine begins by scanning dy_cbar to determine a deactivation threshold, then purges all variables with reduced costs which exceed dy_tols.purgevar times the threshold. Variables with status NBFX are deactivated if we happen to scan them, but they're relatively rare and we won't do a deactivation scan just for them. Parameters: p_avndxs: (i) empty vector to hold variable indices; assumed to be sufficiently large; will be allocated if NULL (o) indices of variables to be deactivated; may not be allocated if no candidates are identified Returns: number of variables to be deactivated, -1 if there's an error during scanning (error is possible only when paranoid) */ { int j,m,n,purgecnt,*avndxs ; double maxpcbar,pthresh,maxncbar,nthresh,cbarj ; flags statj ; bool purge ; # ifdef DYLP_PARANOIA const char *rtnnme = "scanPrimVarStdDeact" ; if (p_avndxs == NULL) { errmsg(2,rtnnme,"avndxs") ; return (-1) ; } # endif /* Scan the nonbasic variables to calculate the deactivation thresholds. We're interested in variables with status NBLB and cbar > 0, and variables with status NBUB and cbar < 0. */ m = dy_sys->concnt ; n = dy_sys->varcnt ; maxpcbar = 0 ; maxncbar = 0 ; for (j = m+1 ; j <= n ; j++) { if (flgon(dy_status[j],vstatNBLB)) { cbarj = dy_cbar[j] ; if (cbarj > maxpcbar) maxpcbar = cbarj ; } else if (flgon(dy_status[j],vstatNBUB)) { cbarj = dy_cbar[j] ; if (cbarj < maxncbar) maxncbar = cbarj ; } } # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n %g <= cbar <= %g over deactivation candidates.", maxncbar,maxpcbar) ; } # endif purge = FALSE ; if (maxpcbar > 0) { pthresh = dy_tols->purgevar*maxpcbar ; if (pthresh > dy_tols->bogus*dy_tols->dfeas) { purge = TRUE ; } else { pthresh = dy_tols->inf ; } } else { pthresh = dy_tols->inf ; } if (maxncbar < 0) { nthresh = dy_tols->purgevar*maxncbar ; if (-nthresh > dy_tols->bogus*dy_tols->dfeas) { purge = TRUE ; } else { nthresh = -dy_tols->inf ; } } else { nthresh = -dy_tols->inf ; } # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 2) { if (purge == FALSE) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n %g <= purge threshold <= %g; tol = %g; scan aborted.", dy_tols->purgevar*maxncbar,dy_tols->purgevar*maxpcbar, dy_tols->bogus*dy_tols->dfeas) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho, "\n %g <= purge threshold <= %g; tol = %g; scanning.", nthresh,pthresh,dy_tols->bogus*dy_tols->dfeas) ; } } # endif if (purge == FALSE) return (0) ; /* Scan preparation. If the user hasn't supplied a vector to hold the indices, allocate one now. */ purgecnt = 0 ; if (*p_avndxs == NULL) { avndxs = (int *) MALLOC(dy_sys->archvcnt*sizeof(int)) ; } else { avndxs = *p_avndxs ; } /* Scan the architecturals again, this time with an eye to collecting a list of variables to be deactivated. */ for (j = m+1 ; j <= n ; j++) { purge = FALSE ; statj = dy_status[j] ; cbarj = dy_cbar[j] ; /* Do the tests for purging: NBFX status, or NBLB or NBUB status and reduced cost over the purge threshold. */ if ((flgon(statj,vstatNBLB) && cbarj > pthresh) || (flgon(statj,vstatNBUB) && cbarj < nthresh) || flgon(statj,vstatNBFX)) { purge = TRUE ; # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n queuing %s (%d) for deactivation, %s, cbar<%d> = %g", consys_nme(dy_sys,'v',j,TRUE,NULL),j, dy_prtvstat(statj),j,cbarj) ; } # endif } if (purge == TRUE) { avndxs[purgecnt++] = j ; } } /* If we supplied avndxs and found no variables to deactivate, free the vector. If we found candidates, set avndxs into p_avndxs. */ if (*p_avndxs == NULL) { if (purgecnt == 0) { FREE(avndxs) ; } else { (*p_avndxs) = avndxs ; } } # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n queued %d variables for deactivation.",purgecnt) ; } # endif return (purgecnt) ; } static int scanPrimVarStdAct (consys_struct *orig_sys, int **p_ovndxs, int *preset) /* This routine scans the reduced cost of a set of inactive variables, selecting suitable variables for activation. The set of inactive variables can be specified using the preset parameter. If preset is missing, the set of variables to consider is all inactive variables. `Suitable' depends on the simplex phase. In primal simplex, a variable must price out with a favourable (nonoptimal) reduced cost. In dual simplex, a variable must price out as dual feasible (equivalently, an unfavourable (optimal) reduced cost). Parameters: orig_sys: The original constraint system. p_ovndxs: (i) empty vector to hold variable indices; assumed to be sufficiently large; will be allocated if NULL (o) indices of variables to be activated; may not be allocated if no candidates are identified preset A preset list of candidates to consider. preset[0] should contain the number of candidates in the list. Returns: number of variables to activate, -1 if there's an error during scanning. */ { int i,j,k,actcnt,cand_limit ; int *ovndxs ; int *scanvars,scan_cnt,ndx ; double *orig_obj,cbarj,*orig_y ; bool fatal,use_all,activate ; flags statj ; # ifdef DYLP_PARANOIA const char *rtnnme = "scanPrimVarStdAct" ; if (orig_sys == NULL) { errmsg(2,rtnnme,"orig_sys") ; return (-1) ; } if (orig_sys->obj == NULL) { errmsg(101,rtnnme,orig_sys->nme,consys_assocnme(NULL,CONSYS_OBJ)) ; return (-1) ; } # endif # ifndef DYLP_NDEBUG cbarj = -1 ; /* Suppress a compiler warning. */ # endif fatal = FALSE ; orig_obj = orig_sys->obj ; actcnt = 0 ; /* Did the client supply a vector for candidates? If not, make one. We shouldn't be here if there's no room to activate. If we're paranoid, check this. */ cand_limit = dy_lp->sys.vars.loadable ; # ifdef DYLP_PARANOIA if (cand_limit == 0) { errmsg(1,rtnnme,__LINE__) ; return (-1) ; } # endif if (dy_opts->addvar > 0) { cand_limit = minn(dy_opts->addvar,cand_limit) ; } if (*p_ovndxs == NULL) { ovndxs = (int *) MALLOC(cand_limit*sizeof(int)) ; } else { ovndxs = *p_ovndxs ; } /* Make a vector of duals that matches orig_sys, for efficient evaluation of columns. */ orig_y = (double *) CALLOC((orig_sys->concnt+1),sizeof(double)) ; for (i = 1 ; i <= dy_sys->concnt ; i++) { k = dy_actcons[i] ; orig_y[k] = dy_y[i] ; } /* Make the candidate list we'll actually evaluate. If not supplied in preset, scan origvars to make the list. If we're scanning here, avoid unloadable variables, but we can't guarantee the contents of preset and will need to screen again in the next loop. Even if we're supplied a preset list of variables, we can use only those that are dual feasible if we're in dual simplex. Note that scanvars is set up with 1-based indexing. */ if (preset != NULL) { scanvars = preset ; scan_cnt = preset[0] ; if (dy_lp->simplex.next == dyDUAL) use_all = FALSE ; else use_all = TRUE ; } else { use_all = FALSE ; scan_cnt = orig_sys->archvcnt-dy_sys->archvcnt ; scanvars = (int *) MALLOC((scan_cnt+1)*sizeof(int)) ; scanvars[0] = 0 ; scan_cnt = 0 ; for (j = 1 ; j <= orig_sys->archvcnt ; j++) { if (!LOADABLE_VAR(j)) continue ; # ifdef DYLP_PARANOIA statj = (flags) -dy_origvars[j] ; if (flgoff(statj,vstatNONBASIC|vstatNBFR)) { errmsg(433,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "active",consys_nme(orig_sys,'v',j,TRUE,NULL),j, dy_prtvstat(statj)) ; fatal = TRUE ; break ; } # endif scanvars[++scan_cnt] = j ; } if (fatal == TRUE) { if (scanvars != NULL && scanvars != preset) FREE(scanvars) ; if (orig_y != NULL) FREE(orig_y) ; return (-1) ; } } /* Open a loop to walk scanvars checking for architectural variables that price out favourably. */ for (ndx = 1 ; ndx <= scan_cnt && actcnt < cand_limit ; ndx++) { j = scanvars[ndx] ; /* Skip over variables that are ineligible for activation (status NBFX or flagged with vstatNOLOAD). */ if (!LOADABLE_VAR(j)) { activate = FALSE ; } /* If the variable x is inactive, price it as cbar = c - ya, taking only the active rows into account (by construction of orig_y). If we're in primal phase I, c is identically 0 by definition, since inactive variables must be at their upper or lower bound. If our target is dual simplex, we want variables with optimal reduced costs, the negative of the primal case. */ else { statj = (flags) -dy_origvars[j] ; if (dy_lp->simplex.next == dyPRIMAL1) cbarj = 0 ; else cbarj = orig_obj[j] ; cbarj -= consys_dotcol(orig_sys,j,orig_y) ; setcleanzero(cbarj,dy_tols->cost) ; if (dy_lp->simplex.next == dyDUAL) { cbarj = -cbarj ; } /* Now compare the sign of the reduced cost with the status of the variable, to decide if we want to bring this variable into the active set. We're minimising, eh. Arguably, if we want to detect columns with nonzero coefficients only in rows that are ineligible for activation, this is the place. But it's not clear that it's worth the effort. This particular pathology is rare and we would expend a lot of effort prepping columns, even with a filter of cbar = 0. The cost for doing nothing is that we redo consys_dotcol for the pathological columns with each scan. Given that this sort of column is typically rare and sparse, doing nothing special makes sense. */ if (use_all == TRUE) { activate = TRUE ; } else if (cbarj == 0 || (cbarj > 0 && statj == vstatNBLB) || (cbarj < 0 && statj == vstatNBUB)) { activate = FALSE ; } else { activate = TRUE ; } } # ifndef DYLP_NDEBUG if (activate == FALSE) { if (dy_opts->print.varmgmt >= 3) { statj = (flags) -dy_origvars[j] ; dyio_outfmt(dy_logchn,dy_gtxecho,"\n skipping %s %s (%d), status %s", consys_prtvartyp(orig_sys->vtyp[j]), consys_nme(orig_sys,'v',j,FALSE,NULL),j, dy_prtvstat(statj)) ; if (flgon(statj,vstatNBFX)) dyio_outchr(dy_logchn,dy_gtxecho,'.') ; else dyio_outfmt(dy_logchn,dy_gtxecho,", cbar = %g.",cbarj) ; } } else { if (dy_opts->print.varmgmt >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n activating %s %s (%d), status %s, cbar = %g.", consys_prtvartyp(orig_sys->vtyp[j]), consys_nme(orig_sys,'v',j,FALSE,NULL),j, dy_prtvstat(statj),cbarj) ; } } # endif if (activate == TRUE) ovndxs[actcnt++] = j ; } if (orig_y != NULL) FREE(orig_y) ; if (scanvars != NULL && scanvars != preset) FREE(scanvars) ; /* If we supplied ovndxs and found no candidates to activate, free the vector. */ if (*p_ovndxs == NULL) { if (actcnt == 0) { FREE(ovndxs) ; } else { *p_ovndxs = ovndxs ; } } # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n queued %d variables for activation.",actcnt) ; } # endif return (actcnt) ; } int dy_deactivateVars (consys_struct *orig_sys) /* This routine is a simple coordination shell for normal variable deactivation from primal simplex in phase dyPURGEVAR. Parameters: orig_sys: The original constraint system orig_sys is only required for debug printing and paranoid checks. Still, it's really convenient to have it as a parameter and it provides a nice symmetry with activateVars. Returns: number of variables deactivated, or -1 if there's an error. */ { int *candidates,candcnt ; int retval ; const char *rtnnme = "dy_deactivateVars" ; retval = -1 ; /* Call scanPrimVarStdDeact to return a list of candidates for deactivation. If we find candidates, try to deactivate them. */ candidates = NULL ; candcnt = scanPrimVarStdDeact(&candidates) ; if (candcnt < 0) { errmsg(434,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "variable","normal deactivation") ; } else if (candcnt > 0) { if (deactNBPrimArchList(orig_sys,candcnt,candidates) == TRUE) { retval = candcnt ; } } else { retval = 0 ; } /* Clean up and return. */ if (candidates != NULL) FREE(candidates) ; # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 1) { if (dy_opts->print.varmgmt >= 2) dyio_outfmt(dy_logchn,dy_gtxecho,"\n ") ; dyio_outfmt(dy_logchn,dy_gtxecho," %d deactivations.",candcnt) ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n constraint system %s now %d x %d (%d + %d).", dy_sys->nme,dy_sys->concnt,dy_sys->varcnt,dy_sys->archvcnt, dy_sys->logvcnt) ; } # endif return (retval) ; } int dy_activateVars (consys_struct *orig_sys, int *preset) /* This routine handles normal variable activation into primal simplex in phase dyADDVAR. Most of the heavy work is performed by scanPrimVarStdAct and actNBPrimArchList. A little bit of cleanup is then required to update PSE norms. If a list of candidates is supplied in preset, only those variables are considered. The principle used in choosing PSE initialisation or update is a level playing field. If we're entering primal simplex from dual simplex, the PSE norms have not been maintained, and it's reasonable to initialise all the norms to 1. But if we're just taking a break from primal simplex pivoting to add variables, it makes sense to calculate the correct norms for the variables we're adding to keep them on equal footing with variables already active. Parameters: orig_sys: The original constraint system. preset: A preset list of candidate variables to consider. Returns: number of variables activated, or -1 if there's an error. */ { int candcnt,candndx,j,i,bfcnt,bfndx ; int *candidates,*basic_frame ; double abarij,gammaj ; double *abarj ; flags calcflgs ; bool actresult,pseresult ; dyret_enum factorresult ; int retval ; const char *rtnnme = "dy_addvars" ; # ifdef DYLP_PARANOIA if (orig_sys == NULL) { errmsg(2,rtnnme,"orig_sys") ; return (dyINV) ; } # endif retval = -1 ; actresult = TRUE ; pseresult = TRUE ; /* Make sure we have the correct objective and reduced costs for the target simplex. */ if (dy_lp->simplex.next == dyPRIMAL1 && dy_lp->p1obj.installed == FALSE) { if (dy_initp1obj() == FALSE) { errmsg(318,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "initialise") ; return (-1) ; } } else if (dy_lp->simplex.next == dyPRIMAL2 && dy_lp->p1obj.installed == TRUE) { if (dy_swapobjs(dyPRIMAL2) == FALSE) { errmsg(318,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "remove") ; return (-1) ; } dy_calcduals() ; if (dy_calccbar() == FALSE) { errmsg(384,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters) ; return (-1) ; } } /* Call scanPrimVarStdAct to get a list of candidates. If we get candidates back, install them. Installing nothing always succeeds. */ candidates = NULL ; candcnt = scanPrimVarStdAct(orig_sys,&candidates,preset) ; if (candcnt < 0) { errmsg(434,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "variable","normal activation") ; actresult = FALSE ; } else if (candcnt > 0) { actresult = dy_actNBPrimArchList(orig_sys,candcnt,candidates) ; } else { actresult = TRUE ; } if (actresult == FALSE) { if (candidates != NULL) FREE(candidates) ; return (retval) ; } /* If we're just taking a break from primal simplex pivoting to add variables, calculate correct projected column norms gamma = ||abar~||^2 + 1 for the new variables. (Note that dy_actNBPrimArch has already added x to the reference frame and 1nitialised gamma to 1.) To make the update a bit more efficient, scan out a vector of reference frame members who are currently basic --- these are the variables of interest in calculating the projected norms. The safest way to make this decision is to look at dy_lp->simplex.init_pse. If it's false, we need to to this update. */ if (candcnt > 0 && dy_lp->simplex.init_pse == FALSE) { basic_frame = (int *) MALLOC(dy_sys->concnt*sizeof(int)) ; bfcnt = 0 ; for (i = 1 ; i <= dy_sys->concnt ; i++) { j = dy_basis[i] ; if (dy_frame[j] == TRUE) { basic_frame[bfcnt++] = i ; } } abarj = NULL ; for (candndx = 0 ; candndx < candcnt ; candndx++) { j = dy_origvars[candidates[candndx]] ; if (consys_getcol_ex(dy_sys,j,&abarj) == FALSE) { errmsg(122,rtnnme,dy_sys->nme,"column", consys_nme(dy_sys,'v',j,TRUE,NULL),j) ; pseresult = FALSE ; break ; } dy_ftran(abarj,FALSE) ; gammaj = 1 ; for (bfndx = 0 ; bfndx < bfcnt ; bfndx++) { i = basic_frame[bfndx] ; abarij = abarj[i] ; if (abarij != 0) { gammaj += abarij*abarij ; } } dy_gamma[j] = gammaj ; } if (abarj != NULL) FREE(abarj) ; if (basic_frame != NULL) FREE(basic_frame) ; } if (candidates != NULL) FREE(candidates) ; if (pseresult == FALSE) return (retval) ; /* One final point. If we've added variables, we need to get the reduced costs correct. The easy way is to call for a dual feasibility check, which we should pass if we're headed for dual simplex, and fail if we're headed for primal simplex. */ retval = candcnt ; if (candcnt > 0) { calcflgs = ladDUALFEAS|ladDFQUIET ; factorresult = dy_accchk(&calcflgs) ; # if defined(DYLP_PARANOIA) || !defined(DYLP_NDEBUG) switch (factorresult) { case dyrOK: { # ifndef DYLP_NDEBUG if (dy_opts->print.conmgmt >= 3) { if (factorresult == dyrOK) dyio_outfmt(dy_logchn,dy_gtxecho,"\n done.") ; } # endif # ifdef DYLP_PARANOIA /* In spite of the comment above, there's always numerical accuracy, and we can run into a situation where we're adding a variable with tol.cost < fabs(cbarj) < tol.dfeas. I'd rather let the main simplex deal with this, so all we do here is issue a warning. */ if (dy_lp->simplex.next == dyDUAL) { if (flgon(calcflgs,ladDUALFEAS)) { warn(439,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "loss","dual") ; } } else { if (flgoff(calcflgs,ladDUALFEAS)) { warn(439,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "gain","dual") ; } } # endif break ; } default: { retval = -1 ; # ifndef DYLP_NDEBUG if (dy_opts->print.conmgmt >= 3) dyio_outfmt(dy_logchn,dy_gtxecho,"\n failed.") ; # endif break ; } } # endif } # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 1) { if (dy_opts->print.varmgmt >= 2) dyio_outfmt(dy_logchn,dy_gtxecho,"\n ") ; dyio_outfmt(dy_logchn,dy_gtxecho," %d activations.",candcnt) ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n constraint system %s now %d x %d (%d + %d).", dy_sys->nme,dy_sys->concnt,dy_sys->varcnt,dy_sys->archvcnt, dy_sys->logvcnt) ; } # endif return (retval) ; } DyLP-1.6.0/DyLP/src/Dylp/Makefile.in0000644000076700007670000005504711040016063013642 0ustar # Makefile.in generated by automake 1.9.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2006 International Business Machines and others. # All Rights Reserved. # This file is distributed under the Common Public License. # Author: Andreas Waechter IBM 2006-04-13 srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/Dylp DIST_COMMON = $(includecoin_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ac_c_add_to_includes.m4 \ $(top_srcdir)/m4/ac_c_get_sunpro_libs.m4 \ $(top_srcdir)/m4/ac_dylp_equiv_for_cpp_bool.m4 \ $(top_srcdir)/m4/ac_dylp_find_fp_funcs.m4 \ $(top_srcdir)/m4/ac_dylp_fix_cppflags.m4 \ $(top_srcdir)/m4/ac_dylp_options.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/inc/config_dylp.h CONFIG_CLEAN_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includecoindir)" libLTLIBRARIES_INSTALL = $(INSTALL) LTLIBRARIES = $(lib_LTLIBRARIES) am_libDylp_la_OBJECTS = dy_consys_io.lo dy_consys_mathutils.lo \ dy_consys_scaling.lo dy_consys_utils.lo dy_basis.lo \ dy_bound.lo dy_cmdint.lo dy_coldstart.lo dy_conmgmt.lo \ dy_dual.lo dy_dualmultipivot.lo dy_dualpivot.lo dy_duenna.lo \ dy_force.lo dy_hotstart.lo dylp.lo dylp_io.lo dylp_utils.lo \ dy_options.lo dy_penalty.lo dy_pivreject.lo dy_primal.lo \ dy_primalmultipivot.lo dy_primalpivot.lo dy_rays.lo \ dy_scaling.lo dy_setup.lo dy_solutions.lo dy_statistics.lo \ dy_tableau.lo dy_varmgmt.lo dy_warmstart.lo glpinv.lo \ glplib1.lo glplib2.lo glplib3.lo glplib4.lo glpluf.lo \ dy_vector_utils.lo libDylp_la_OBJECTS = $(am_libDylp_la_OBJECTS) depcomp = $(SHELL) $(top_srcdir)/../depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(libDylp_la_SOURCES) DIST_SOURCES = $(libDylp_la_SOURCES) includecoinHEADERS_INSTALL = $(INSTALL_HEADER) HEADERS = $(includecoin_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADDLIBS = @ADDLIBS@ ADD_CFLAGS = @ADD_CFLAGS@ ADD_CXXFLAGS = @ADD_CXXFLAGS@ ALWAYS_FALSE_FALSE = @ALWAYS_FALSE_FALSE@ ALWAYS_FALSE_TRUE = @ALWAYS_FALSE_TRUE@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AUX_DIR = @AUX_DIR@ AWK = @AWK@ BUILDTOOLSDIR = @BUILDTOOLSDIR@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CDEFS = @CDEFS@ CFLAGS = @CFLAGS@ COINUTILSDOCDIR = @COINUTILSDOCDIR@ COINUTILSOBJDIR = @COINUTILSOBJDIR@ COINUTILSSRCDIR = @COINUTILSSRCDIR@ COIN_HAS_COINUTILS_FALSE = @COIN_HAS_COINUTILS_FALSE@ COIN_HAS_COINUTILS_TRUE = @COIN_HAS_COINUTILS_TRUE@ COIN_HAS_DYLP_FALSE = @COIN_HAS_DYLP_FALSE@ COIN_HAS_DYLP_TRUE = @COIN_HAS_DYLP_TRUE@ COIN_HAS_OSI_FALSE = @COIN_HAS_OSI_FALSE@ COIN_HAS_OSI_TRUE = @COIN_HAS_OSI_TRUE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEFS = @CXXDEFS@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DBG_CFLAGS = @DBG_CFLAGS@ DBG_CXXFLAGS = @DBG_CXXFLAGS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DYLPDOCDIR = @DYLPDOCDIR@ DYLPOBJDIR = @DYLPOBJDIR@ DYLPSRCDIR = @DYLPSRCDIR@ DYLP_ERRMSGDIR = @DYLP_ERRMSGDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FADDLIBS = @FADDLIBS@ FFLAGS = @FFLAGS@ HAVE_EXTERNALS_FALSE = @HAVE_EXTERNALS_FALSE@ HAVE_EXTERNALS_TRUE = @HAVE_EXTERNALS_TRUE@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBEXT = @LIBEXT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLM4 = @LIBTOOLM4@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_LDFLAGS = @LT_LDFLAGS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ MPICC = @MPICC@ MPICXX = @MPICXX@ OBJEXT = @OBJEXT@ OPT_CFLAGS = @OPT_CFLAGS@ OPT_CXXFLAGS = @OPT_CXXFLAGS@ OSIDOCDIR = @OSIDOCDIR@ OSIOBJDIR = @OSIOBJDIR@ OSISRCDIR = @OSISRCDIR@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ RPATH_FLAGS = @RPATH_FLAGS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ VPATH_DISTCLEANFILES = @VPATH_DISTCLEANFILES@ abs_bin_dir = @abs_bin_dir@ abs_include_dir = @abs_include_dir@ abs_lib_dir = @abs_lib_dir@ abs_source_dir = @abs_source_dir@ ac_c_preproc_warn_flag = @ac_c_preproc_warn_flag@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ ac_cxx_preproc_warn_flag = @ac_cxx_preproc_warn_flag@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ have_autoconf = @have_autoconf@ have_automake = @have_automake@ have_svn = @have_svn@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sol_cc_compiler = @sol_cc_compiler@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ AUTOMAKE_OPTIONS = foreign EXTRA_DIST = dy_errmsgs.txt ######################################################################## # libDylp # ######################################################################## # Name of the library compiled in this directory. We want it to be installed # in the 'lib' directory lib_LTLIBRARIES = libDylp.la # List all source files for this library, including headers libDylp_la_SOURCES = \ dy_consys.h \ dy_consys_io.c \ dy_consys_mathutils.c \ dy_consys_scaling.c \ dy_consys_utils.c \ dy_basis.c \ dy_bound.c \ dy_cmdint.c dy_cmdint.h \ dy_coldstart.c \ dy_conmgmt.c \ dy_dual.c \ dy_dualmultipivot.c \ dy_dualpivot.c \ dy_duenna.c \ dy_force.c \ dy_hotstart.c \ dylp.c dylp.h \ dylp_io.c \ dylp_utils.c \ dy_options.c \ dy_penalty.c \ dy_pivreject.c \ dy_primal.c \ dy_primalmultipivot.c \ dy_primalpivot.c \ dy_rays.c \ dy_scaling.c \ dy_setup.c \ dy_solutions.c \ dy_statistics.c \ dy_tableau.c \ dy_varmgmt.c \ dy_warmstart.c \ glpinv.c glpinv.h \ glplib1.c \ glplib2.c \ glplib3.c \ glplib4.c \ glplib.h \ glpluf.c glpluf.h \ dy_vector.h \ dy_vector_utils.c # This is for libtool (on Windows) libDylp_la_LDFLAGS = $(LT_LDFLAGS) # We want to have also the objects from the DylpStdLib in this library libDylp_la_LIBADD = ../DylpStdLib/libDylpStdLib.la # Since automake is not doing this on its own, we need to declare the # dependencies to the subdirectory libraries here libDylp_la_DEPENDENCIES = $(libDylp_la_LIBADD) # Here list all include flags, relative to this "srcdir" directory. This # "cygpath" stuff is necessary to compile with native compilers on Windows AM_CPPFLAGS = -I`$(CYGPATH_W) $(srcdir)/../DylpStdLib` # This line is necessary to allow VPATH compilation with MS compilers # on Cygwin DEFAULT_INCLUDES = -I. -I`$(CYGPATH_W) $(srcdir)` -I$(top_builddir)/inc ######################################################################## # Headers that need to be installed # ######################################################################## # Here list all the header files that are required by a user of the library, # and that therefore should be installed in 'install/coin' includecoindir = $(includedir)/coin includecoin_HEADERS = \ dy_cmdint.h \ dy_consys.h \ dylp.h \ dy_vector.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Dylp/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Dylp/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ if test -f $$p; then \ f=$(am__strip_dir) \ echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \ else :; fi; \ done uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @set -x; list='$(lib_LTLIBRARIES)'; for p in $$list; do \ p=$(am__strip_dir) \ echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \ $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libDylp.la: $(libDylp_la_OBJECTS) $(libDylp_la_DEPENDENCIES) $(LINK) -rpath $(libdir) $(libDylp_la_LDFLAGS) $(libDylp_la_OBJECTS) $(libDylp_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dy_basis.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dy_bound.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dy_cmdint.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dy_coldstart.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dy_conmgmt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dy_consys_io.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dy_consys_mathutils.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dy_consys_scaling.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dy_consys_utils.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dy_dual.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dy_dualmultipivot.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dy_dualpivot.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dy_duenna.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dy_force.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dy_hotstart.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dy_options.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dy_penalty.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dy_pivreject.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dy_primal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dy_primalmultipivot.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dy_primalpivot.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dy_rays.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dy_scaling.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dy_setup.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dy_solutions.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dy_statistics.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dy_tableau.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dy_varmgmt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dy_vector_utils.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dy_warmstart.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dylp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dylp_io.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dylp_utils.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glpinv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glplib1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glplib2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glplib3.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glplib4.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glpluf.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: install-includecoinHEADERS: $(includecoin_HEADERS) @$(NORMAL_INSTALL) test -z "$(includecoindir)" || $(mkdir_p) "$(DESTDIR)$(includecoindir)" @list='$(includecoin_HEADERS)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(includecoinHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(includecoindir)/$$f'"; \ $(includecoinHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(includecoindir)/$$f"; \ done uninstall-includecoinHEADERS: @$(NORMAL_UNINSTALL) @list='$(includecoin_HEADERS)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(includecoindir)/$$f'"; \ rm -f "$(DESTDIR)$(includecoindir)/$$f"; \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includecoindir)"; do \ test -z "$$dir" || $(mkdir_p) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-libtool distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-includecoinHEADERS install-exec-am: install-libLTLIBRARIES install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-includecoinHEADERS uninstall-info-am \ uninstall-libLTLIBRARIES .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-exec \ install-exec-am install-includecoinHEADERS install-info \ install-info-am install-libLTLIBRARIES install-man \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am \ uninstall-includecoinHEADERS uninstall-info-am \ uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: DyLP-1.6.0/DyLP/src/Dylp/dy_rays.c0000644000076700007670000013542111263231135013414 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2008 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains routines to return primal and dual rays, expressed in terms of the original system. If you think back to LP duality, (primal, dual) unbounded implies (dual, primal) infeasibility. The reverse does not hold: it's possible to be primal and dual infeasible. Still, it takes some pretty special pathology to manage simultaneous infeasibility (primal infeasibility defined by parallel constraints, so that we'd be unbounded if only we could achieve feasibility). If dylp returns primal or dual unbounded, then we know there's a ray in there somewhere. In fact, you'll never see dual unbounded, as return codes are always expressed in terms of the primal problem, and dual unbounded is converted to primal infeasible. Dylp's dual simplex doesn't have a phase I, so it's impossible to get to simultaneous dual and primal infeasibility by that route. Primal simplex does have a phase I and may well return primal infeasible without ever running dual simplex. Still, given the rarity of simultaneous dual and primal infeasibility, I'm not inclined to try and juggle return codes to explicitly distinguish {primal, dual} {unbounded, infeasible}. These routines assume that dylp has run to completion, and returned * unbounded, in which case there will be primal rays, or * infeasible, in which case there will (with high probability) be dual rays. The infeasible case can be refined a bit by checking dy_lp->active to see if the last simplex phase was dual or primal. If it was dual, we have a ray with probability 1. We're only going to return rays that emanate from the current basic solution. A search for all rays is a nontrivial and expensive task. With these assumptions, we can ignore any interactions with the inactive parts of the constraint system when testing for ray-ness. That doesn't mean that ray components associated with inactive constraints or variables are all zero, only that the inactive components will not block the ray. If they could, dylp would have activated them and we wouldn't be here. There's another bit of pathology to consider: It's possible to define a problem where we can move infinitely far in either direction. For example, min x1 s.t. x1 + x2 = 0 x1, x2 free However, only the direction that improves the objective qualifies as a ray. This follows by extension from the very common case where the constraints of an lp form a polyhedral cone with a finite optimum for, say, minimisation, but changing to maximisation results in an unbounded problem. Clearly, moving in a direction that degrades the objective does not normally qualify as a ray. */ #define DYLP_INTERNAL #include "dylp.h" static char svnid[] UNUSED = "$Id: dy_rays.c 302 2009-10-08 00:29:17Z lou $" ; #if DYLP_PARANOIA > 0 /* dy_tableau.c */ extern bool dy_std_paranoia(const lpprob_struct *orig_lp,const char *rtnnme) ; static bool check_dualRay (lpprob_struct *orig_lp, bool fullRay, int i_ray, int rayDir, double *ray, bool trueDuals) /* This is a paranoid check routine used for debugging dy_dualRays. It compares the ray passed as a parameter with the result of calculating betaA on the original system. The routine works in the original system frame of reference. It uses dy_betai to calculate beta and dy_colStatus and dy_logStatus to retrieve the status for logical and architectural variables. But we do cheat and use dy_tols. Parameters: orig_lp: the lp problem structure fullRay: TRUE if ray includes components associated with nonbasic architecturals, FALSE if it includes only components associated with explicit constraints. i_ray: index of the row in the original constraint system used to generate the ray rayDir: the direction of motion for the entering dual associated with this ray ray: the ray to be checked trueDuals: true if the ray uses the true dual sign convention, false to use dylp's min primal convention. Returns: TRUE if the ray checks out, FALSE otherwise */ { int m,n,i,j,errs ; double *goldRay,*betai_ray,*y,*cbar ; double rayk ; bool retval ; consys_struct *sys ; flags *log_status,*arch_status ; char *rtnnme = "check_dualRay" ; sys = orig_lp->consys ; if (dy_opts->print.rays >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n%s: checking ray from %s (%d) ... ", rtnnme,consys_nme(sys,'c',i_ray,FALSE,NULL),i_ray) ; } /* Acquire beta. */ betai_ray = NULL ; if (dy_betai(orig_lp,i_ray,&betai_ray) == FALSE) { errmsg(952,rtnnme,sys->nme,"row",i_ray,"constraint", consys_nme(sys,'c',i_ray,FALSE,NULL),i_ray) ; if (betai_ray != NULL) FREE(betai_ray) ; return (FALSE) ; } /* Acquire the status vectors for the logicals and architecturals, and the row and column duals (a.k.a. duals and reduced costs). */ log_status = NULL ; dy_logStatus(orig_lp,&log_status) ; arch_status = NULL ; dy_colStatus(orig_lp,&arch_status) ; y = NULL ; dy_rowDuals(orig_lp,&y,TRUE) ; cbar = NULL ; dy_colDuals(orig_lp,&cbar,TRUE) ; /* Allocate space for the golden ray. Always allocate space large enough for a full ray. This is, after all, a paranoid routine and having the full ray makes the code a bit simpler. */ m = sys->concnt ; n = sys->varcnt ; goldRay = (double *) CALLOC((m+n+1),sizeof(double)) ; /* Calculate the ray elements. For the logicals, the ray element is simply the ith element of beta. For the architecturals, we need to do an honest dot product. Keep in mind that inv(B)N is -(dualN)(inv(dualB)), and that absorbs the minus sign that would otherwise appear here. Flip the ray (-1) for NBUB variables. */ for (i = 1 ; i <= m ; i++) { if (flgon(log_status[i],vstatBASIC)) continue ; goldRay[i] = rayDir*betai_ray[i] ; } for (j = 1 ; j <= n ; j++) { if (flgon(arch_status[j],vstatBASIC)) continue ; rayk = rayDir*consys_dotcol(sys,j,betai_ray) ; if (flgon(arch_status[j],vstatNBUB) && trueDuals == TRUE) rayk = -rayk ; goldRay[m+j] = rayk ; } /* And compare */ errs = 0 ; for (i = 1 ; i <= m ; i++) { if (dy_opts->print.rays >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n y<%d> = %g, ray<%d> = %g", i,y[i],i,ray[i]) ; } if (fabs(ray[i]-goldRay[i]) > dy_tols->cost) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n ERROR: ray<%d> = %g != %g = gold<%d>; error %g, tol %g.", i,ray[i],goldRay[i],i,ray[i]-goldRay[i],dy_tols->cost) ; errs++ ; } } if (fullRay == TRUE) { for (j = 1 ; j <= n ; j++) { if (dy_opts->print.rays >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n cbar<%d> = %g, ray<%d+%d> = %g", j,cbar[j],m,j,ray[m+j]) ; } if (fabs(ray[m+j]-goldRay[m+j]) > dy_tols->cost) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n ERROR: ray<%d+%d> = %g != %g = gold<%d+%d>; error %g, tol %g.", m,j,ray[m+j],goldRay[m+j],m,j,ray[m+j]-goldRay[m+j],dy_tols->cost) ; errs++ ; } } } if (errs == 0) { if (dy_opts->print.rays >= 3) { if (dy_opts->print.rays >= 4) dyio_outchr(dy_logchn,dy_gtxecho,'\n') ; dyio_outfmt(dy_logchn,dy_gtxecho," ok.") ; } retval = TRUE ; } else { if (dy_opts->print.rays >= 3) { if (dy_opts->print.rays >= 4) dyio_outchr(dy_logchn,dy_gtxecho,'\n') ; dyio_outfmt(dy_logchn,dy_gtxecho," %d errors.",errs) ; } retval = FALSE ; } if (log_status != NULL) FREE(log_status) ; if (arch_status != NULL) FREE(arch_status) ; if (betai_ray != NULL) FREE(betai_ray) ; if (goldRay != NULL) FREE(goldRay) ; return (retval) ; } #endif static bool testForPrimalRay (int j, int *p_dir, double **p_abarj) /* This routine evaluates an active column abar = inv(B)a to determine if it constitutes a primal ray. It's a much-simplified version of the algorithm that selects the leaving variable for primal simplex. * Instead of searching for the smallest limit on the change in x, we just want to know if there's no limit. Hence we can abandon the evaluation as soon as any basic primal variable limits the change in x. * There's no need to worry about degeneracy, numerical stability and all the other little considerations that go into selecting a good pivot. NOTE: This routine works in the active system reference frame. The vector returned is abar. This is not quite a ray: it needs a coefficient (-1.0) for x and it must be negated to become the corresponding ray. It makes more sense to do this in the client, once we know how the ray is to be presented. See, for example, dy_primalRays, which transforms the ray for use by the outside world. Parameters: j: Index of the column to be evaluated p_dir: (o) Direction of motion, 1: ray in the direction abar (x increasing) 0: not a ray =1: ray in the direction -abar (x decreasing) p_abarj: (o) if non-NULL, used to return abar as an expanded vector in basis order iff abar is a primal ray, otherwise *p_abarj is set to NULL Returns: TRUE if the evaluation completes without error, FALSE otherwise. */ { int k = 0,m,kpos,dir ; flags statj,statk ; double *abarj ; double abarkj = 0.0,cbarj ; bool rayUp,rayDown ; const char *rtnnme = "testForPrimalRay" ; # ifndef DYLP_NDEBUG int v ; if (dy_opts->print.rays >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n Testing if column %s (%d) is a primal ray", consys_nme(dy_sys,'v',j,FALSE,NULL),j) ; } # endif if (p_abarj != NULL) *p_abarj = NULL ; *p_dir = 0 ; rayUp = TRUE ; rayDown = TRUE ; /* Start by checking the reduced cost. If cbar = 0, we can change x all we like, but we won't go unbounded. Use the reduced cost / objective tolerance here, otherwise we could be in disagreement with dylp. If the reduced cost is not zero, then any ray must improve the objective. Dylp is always minimising: min z = cinv(B)b + cbarx, where cbar = (c - cinv(B)N). */ cbarj = dy_cbar[j] ; if (withintol(cbarj,0,dy_tols->cost)) { # ifndef DYLP_NDEBUG if (dy_opts->print.rays >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho, ".\n\tcbar<%d> = %g; no ray.",j,cbarj) ; } # endif return (TRUE) ; } else if (cbarj < 0) { rayDown = FALSE ; dir = 1 ; } else { rayUp = FALSE ; dir = -1 ; } # ifndef DYLP_NDEBUG if (dy_opts->print.rays >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho,".\n\tcbar<%d> = %g allows %s ray", j,cbarj,((dir < 0)?"down":"up")) ; } # endif /* Reduce the possibilities based on the status of x. We shouldn't be called for basic variables, but bail out now if that's the case. */ statj = getflg(dy_status[j],vstatSTATUS) ; if (flgon(statj,vstatBASIC)) { rayUp = FALSE ; rayDown = FALSE ; } else { switch (statj) { case vstatNBFX: { rayUp = FALSE ; rayDown = FALSE ; break ; } case vstatNBLB: { rayDown = FALSE ; if (dy_sys->vub[j] < dy_tols->inf) { rayUp = FALSE ; } break ; } case vstatNBUB: { rayUp = FALSE ; if (dy_sys->vlb[j] > -dy_tols->inf) { rayDown = FALSE ; } break ; } case vstatNBFR: { break ; } case vstatSB: { if (dy_sys->vlb[j] > -dy_tols->inf) { rayDown = FALSE ; } if (dy_sys->vub[j] < dy_tols->inf) { rayUp = FALSE ; } break ; } default: { errmsg(1,rtnnme,__LINE__) ; return (FALSE) ; } } } if (rayUp == FALSE && rayDown == FALSE) { # ifndef DYLP_NDEBUG if (dy_opts->print.rays >= 4) { if (flgon(statj,vstatBASIC|vstatNBFX)) { dyio_outfmt(dy_logchn,dy_gtxecho,"; status %s; no ray.", j,cbarj,dy_prtvstat(statj)) ; } else if (dir == 1) { dyio_outfmt(dy_logchn,dy_gtxecho,"; status %s, ub = %g; no ray.", dy_prtvstat(statj),dy_sys->vub[j]) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho,"; status %s, lb = %g; no ray.", dy_prtvstat(statj),dy_sys->vlb[j]) ; } } # endif return (TRUE) ; } /* We'll have to work for it. Retrieve and ftran column a. */ abarj = NULL ; if (consys_getcol_ex(dy_sys,j,&abarj) == FALSE) { errmsg(122,rtnnme,dy_sys->nme, "column",consys_nme(dy_sys,'v',j,TRUE,NULL),j) ; if (abarj != NULL) FREE(abarj) ; return (FALSE) ; } dy_ftran(abarj,FALSE) ; m = dy_sys->concnt ; /* Separate the loops for an up ray and a down ray for efficiency and clarity. Only one case will apply. Open a loop to step through the basic variables. As soon as we find a limit on delta, we're done. Clearly, if abar = 0, or x is free, no limit is implied. Otherwise, if increasing x moves x to a finite bound, we're bounded. For x increasing, if abar > 0, we're moving x toward lb, and if abar < 0, we're moving x toward ub. */ if (rayUp == TRUE) { for (kpos = 1 ; kpos <= m ; kpos++) { setcleanzero(abarj[kpos],dy_tols->zero) ; abarkj = abarj[kpos] ; if (abarkj == 0.0) continue ; k = dy_basis[kpos] ; statk = dy_status[k] ; if (flgon(statk,vstatBFR)) continue ; if ((abarkj > 0.0 && dy_sys->vlb[k] > -dy_tols->inf) || (abarkj < 0.0 && dy_sys->vub[k] < dy_tols->inf)) { rayUp = FALSE ; break ; } } # ifndef DYLP_NDEBUG if (dy_opts->print.rays >= 4) { if (rayUp == FALSE) { dyio_outfmt(dy_logchn,dy_gtxecho, "; basis pos'n %d: abar<%d,%d> = %g; %s (%d) ", kpos,k,j,abarkj,consys_nme(dy_sys,'v',k,FALSE,NULL),k) ; if (abarkj < 0) { dyio_outfmt(dy_logchn,dy_gtxecho,"ub = %g ; no ray up.", dy_sys->vub[k]) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho,"lb = %g ; no ray up.", dy_sys->vlb[k]) ; } } else { dyio_outfmt(dy_logchn,dy_gtxecho,"; confirmed.") ; } } # endif } /* The same, for a down ray. Here, abar > 0 will move x toward ub and abar < 0 will move x toward lb. */ if (rayDown == TRUE) { for (kpos = 1 ; kpos <= m ; kpos++) { setcleanzero(abarj[kpos],dy_tols->zero) ; abarkj = abarj[kpos] ; if (abarkj == 0.0) continue ; k = dy_basis[kpos] ; statk = dy_status[k] ; if (flgon(statk,vstatBFR)) continue ; if ((abarkj > 0.0 && dy_sys->vub[k] < dy_tols->inf) || (abarkj < 0.0 && dy_sys->vlb[k] > -dy_tols->inf)) { rayDown = FALSE ; break ; } } # ifndef DYLP_NDEBUG if (dy_opts->print.rays >= 4) { if (rayDown == FALSE) { dyio_outfmt(dy_logchn,dy_gtxecho, "; basis pos'n %d: abar<%d,%d> = %g; %s (%d) ", kpos,k,j,abarkj,consys_nme(dy_sys,'v',k,FALSE,NULL),k) ; if (abarkj < 0) { dyio_outfmt(dy_logchn,dy_gtxecho,"lb = %g ; no ray down.", dy_sys->vlb[k]) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho,"ub = %g ; no ray down.", dy_sys->vub[k]) ; } } else { dyio_outfmt(dy_logchn,dy_gtxecho,"; confirmed.") ; } } # endif } # ifndef DYLP_NDEBUG if ((rayUp == TRUE || rayDown == TRUE) && dy_opts->print.rays >= 6) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n active ray %s (%d)\n non-zeros:", consys_nme(dy_sys,'v',j,FALSE,NULL),j) ; v = 0 ; for (kpos = 1 ; kpos <= m ; kpos++) { abarkj = abarj[kpos] ; if (withintol(abarkj,0,dy_tols->zero)) continue ; k = dy_basis[kpos] ; dyio_outfmt(dy_logchn,dy_gtxecho," (%s (%d) %g)", consys_nme(dy_sys,'v',k,FALSE,NULL),k,abarkj) ; v++ ; if (v%3 == 0) dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t\t") ; } } # endif /* That's it. If this is a ray, set the direction and return abar if the client's requested it, otherwise free it. */ if (rayUp == TRUE || rayDown == TRUE) { *p_dir = dir ; if (p_abarj != NULL) { *p_abarj = abarj ; } else { if (abarj != NULL) FREE(abarj) ; } # ifndef DYLP_NDEBUG if (dy_opts->print.rays == 3) { dyio_outfmt(dy_logchn,dy_gtxecho,": yes.") ; } # endif } else { if (abarj != NULL) FREE(abarj) ; # ifndef DYLP_NDEBUG if (dy_opts->print.rays == 3) { dyio_outfmt(dy_logchn,dy_gtxecho,": no.") ; } # endif } return (TRUE) ; } bool dy_primalRays (lpprob_struct *orig_lp, int *p_numRays, double ***p_rays) /* This routine returns the primal rays emanating from the current basic solution. A call to this routine is productive only when the previous call to dylp returned a result of unbounded and dylp's internal data structures are still valid. A call when the previous simplex ended in anything other than optimal, infeasible, or unbounded is considered an error (in judgment, at the least). A call when the result of optimisation was anything other than unbounded will return zero rays. Note that we don't have to worry about synthesizing ray elements for inactive constraints. By definition, the basic variable for an inactive constraint is the associated logical, and we don't report any ray components for logical variables. Parameters: orig_lp: the lp problem structure p_numRays: (i) the maximum number of rays to return (o) the actual number of rays returned p_rays: (i) vector of (double *) or NULL; 0-based indexing If supplied by client, must be capable of holding at least p_numRays rays. If not supplied by client, allocated if necessary; in particular, not allocated unless at least one ray is returned (o) p_numRays entries will point to rays; each ray is an n-vector in original system column order. Returns: TRUE if no errors occurred while searching for rays; FALSE otherwise. */ { int m,n,i,j,m_orig,n_orig,j_orig ; int retval ; bool error ; double *sc_abarj ; consys_struct *orig_sys ; bool scaled ; const double *rscale,*cscale ; double invSj,dir ; int numCols, numRays,maxRays,rayDir,j_ray,j_orig_ray,i_orig_ray ; flags statj_ray ; double **rayCollection ; bool ourCollection,logical ; double *ray ; char *rtnnme = "dy_primalRays" ; # if DYLP_PARANOIA > 0 if (dy_std_paranoia(orig_lp,rtnnme) == FALSE) { return (FALSE) ; } if (p_numRays == NULL) { errmsg(2,rtnnme,"&numRays") ; return (FALSE) ; } if (p_rays == NULL) { errmsg(2,rtnnme,"&rays") ; return (FALSE) ; } # endif /* Do enough setup for a valid return with no rays. */ maxRays = *p_numRays ; if (maxRays == 0) { return (TRUE) ; } *p_numRays = 0 ; rayCollection = *p_rays ; if (rayCollection != NULL) { ourCollection = FALSE ; } else { ourCollection = TRUE ; } /* What was the result of the last lp? If it was unbounded, we have some rays. If it was optimal or infeasible, by definition we have no rays and can return TRUE. Any other code indicates an error; return FALSE. */ orig_sys = orig_lp->consys ; switch (orig_lp->lpret) { case lpUNBOUNDED: { break ; } case lpOPTIMAL: case lpINFEAS: { warn(954,rtnnme,orig_sys->nme,"primal",dy_prtlpret(orig_lp->lpret)) ; return (TRUE) ; } default: { errmsg(954,rtnnme,orig_sys->nme,"primal",dy_prtlpret(orig_lp->lpret)) ; return (FALSE) ; } } /* The lp was unbounded, so we have one sure ray specified in orig_lp. Since we've coopted sign to indicate ray direction, the logical for constraint i is coded as n+i. */ n_orig = orig_sys->varcnt ; m_orig = orig_sys->concnt ; i_orig_ray = -1 ; j_orig_ray = (int) orig_lp->obj ; if (j_orig_ray < 0) { j_orig_ray = -j_orig_ray ; rayDir = -1 ; } else { rayDir = 1 ; } if (j_orig_ray > n_orig) { i_orig_ray = j_orig_ray-n_orig ; logical = TRUE ; } else { logical = FALSE ; } /* Set up a header to hold the collection, if the client did not supply it. Also determine if we'll need to do unscaling, and if so acquire the scaling matrices. */ if (ourCollection == TRUE) { rayCollection = (double **) MALLOC(maxRays*sizeof(double *)) ; } sc_abarj = NULL ; scaled = dy_isscaled() ; if (scaled == TRUE) { dy_scaling_vectors(&rscale,&cscale) ; } /* Set up to walk the columns of the active system, starting from the known unbounded column j and wrapping around. For each column that tests out as a ray, testForPrimalRay will return abar in basis order in the active reference frame. We'll unscale it and simultaneously drop the coefficients into a vector in variable order in the original reference frame. */ error = FALSE ; numRays = 0 ; if (logical == TRUE) { j_ray = dy_origcons[i_orig_ray] ; } else { j_ray = dy_origvars[j_orig_ray] ; } n = dy_sys->varcnt ; m = dy_sys->concnt ; /* Start to walk the columns of the active system. Basic variables can't be rays. Neither can NBFX variables. */ for (numCols = 1 ; numCols <= n ; numCols++, j_ray = (j_ray%n)+1) { statj_ray = dy_status[j_ray] ; if (flgon(statj_ray,vstatBASIC|vstatNBFX)) continue ; /* The column is not obviously unqualified, so call for a thorough check. */ retval = testForPrimalRay(j_ray,&rayDir,&sc_abarj) ; if (retval == FALSE) { errmsg(447,rtnnme,dy_sys->nme, consys_nme(dy_sys,'v',j_ray,FALSE,NULL),j_ray,"primal") ; error = TRUE ; break ; } if (rayDir == 0) continue ; /* We have a ray. We need to unscale it and translate it from active system basis order to original system variable order. Begin by allocating a vector to hold the ray. In terms of scaling, we have sc_abar = inv(S)inv(B)aS and we need to remove the leading and trailing column scaling, if present. Getting the ray pointed in the right direction takes some work. We're testing x = inv(B)b - abarx, so ray = -abar. Then, if x is decreasing, that's another factor of -1 (encoded in rayDir). Finally, if the constraint in question is a >= constraint in the original system, there's another factor of -1 folded into the direction of change of the logical (which is really headed toward -inf in the original >= constraint). In terms of change of reference frame, we're moving from active system basis order to original system variable order. The translation is basis position to basic variable (active) to variable (original), i -> j -> j_orig. Drop logicals, as they're not present in the original system. Last, but not least, x is itself moving and must be part of the ray. Add a coefficient of 1.0, adjusted for direction, directly in the original reference frame. */ ray = CALLOC((n_orig+1),sizeof(double)) ; rayCollection[numRays] = ray ; numRays++ ; dir = -1.0*rayDir ; if (logical == TRUE) { i_orig_ray = dy_actcons[j_ray] ; if (orig_sys->ctyp[i_orig_ray] == contypGE) { dir = -dir ; } } else { j_orig_ray = dy_actvars[j_ray] ; } if (scaled == TRUE) { if (logical == TRUE) { invSj = rscale[i_orig_ray]*dir ; } else { invSj = 1/cscale[j_orig_ray]*dir ; } for (i = 1 ; i <= m ; i++) { if (sc_abarj[i] == 0) continue ; j = dy_basis[i] ; if (j <= dy_sys->concnt) continue ; j_orig = dy_actvars[j] ; ray[j_orig] = cscale[j_orig]*sc_abarj[i]*invSj ; setcleanzero(ray[j_orig],dy_tols->zero) ; } } else { for (i = 1 ; i <= m ; i++) { if (sc_abarj[i] == 0) continue ; j = dy_basis[i] ; if (j <= dy_sys->concnt) continue ; j_orig = dy_actvars[j] ; ray[j_orig] = sc_abarj[i]*dir ; setcleanzero(ray[j_orig],dy_tols->zero) ; } } if (sc_abarj != NULL) { FREE(sc_abarj) ; sc_abarj = NULL ; } if (logical == FALSE) { ray[j_orig_ray] = 1.0*dir ; } # ifndef DYLP_NDEBUG if (dy_opts->print.rays >= 5) { if (logical == TRUE) { j_orig = orig_sys->varcnt+i_orig_ray ; } else { j_orig = j_orig_ray ; } dyio_outfmt(dy_logchn,dy_gtxecho, "\n ray<%d>: %s (%d)\n non-zeros:", numRays,consys_nme(orig_sys,'v',j_orig,FALSE,NULL),j_orig) ; i = 0 ; for (j_orig = 1 ; j_orig <= n_orig ; j_orig++) { if (ray[j_orig] != 0) { dyio_outfmt(dy_logchn,dy_gtxecho," (%s (%d) %g)", consys_nme(orig_sys,'v',j_orig,FALSE,NULL),j_orig, ray[j_orig]) ; } i++ ; if (i%3 == 0) dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t\t") ; } } # endif if (numRays >= maxRays) break ; } /* End of scanning loop. We've either found the requested number of rays, scanned all columns, or encountered an error. Time for cleanup. Free the vector used for abar. If we have an error, free the ray collection. */ if (sc_abarj != NULL) FREE(sc_abarj) ; if (error == TRUE) { if (rayCollection != NULL) { for (i = 0 ; i < numRays ; i++) { if (rayCollection[i] != NULL) { FREE(rayCollection[i]) ; rayCollection[i] = NULL ; } } if (ourCollection == TRUE) FREE(rayCollection) ; } return (FALSE) ; } /* That's it --- finish up and return. */ *p_rays = rayCollection ; *p_numRays = numRays ; return (TRUE) ; } static void testForDualRay (int i, int *p_dir, double **p_abari) /* This routine evaluates an active row abar = e(inv(B)N) to determine if it constitutes a dual ray. As explained at the head of the file and in dy_dualRays, there's a nonzero possibility this is a pathological problem that's primal and dual infeasible. Still, we can assume that dylp has activated all variables that might help. The algorithm is a much-simplified version of the algorithm that selects the leaving dual variable (entering primal variable) for dual simplex. * Instead of searching for the smallest limit on the change in y, we just want to know if there's no limit. Hence we can abandon the evaluation as soon as any basic dual variable limits the change in y. * There's no need to worry about degeneracy, numerical stability and all the other little considerations that go into a selecting a good pivot. Remember that if we were actually using the dual matrices, we'd be checking y - abardelta, where abar is row i of (dualN)inv(dualB), to see if we could drive some y to zero by increasing y. If all abar <= 0 and some abar < 0, we have a ray. But we're using the primal matrices, y is cbar, abar is row i of inv(B)N = -(dualN)inv(dualB), and we have implicit bounds to cope with, which means that y could be increasing to zero (x entering from UB) or decreasing to zero (x entering from LB) and y could be increasing from zero (x increasing and leaving at LB) or decreasing from zero (x decreasing and leaving at UB). So the test expression is cbar - (-abar)delta = cbar + abardelta and abar is the potential ray. If we have delta*(-cbar/abar) <= 0 for all k and strictly less than zero for at least one k, then we have a ray. NOTE: This routine works in the active system reference frame. The vector returned is abar. This is not quite a ray: it needs a coefficient (1.0) for y. It makes more sense to do this in the client, once we know how the ray is to be presented. See, for example, dy_dualRays, which transforms the ray for use by the outside world. Parameters: i: Index of the row to be evaluated p_dir: (o) Direction of motion, 1: ray in the direction abar (y increasing) 0: not a ray -1: ray in the direction -abar (y decreasing) p_abari: (o) if non-NULL, used to return abar as an expanded vector in column order iff abar is a dual ray, otherwise *p_abari is set to NULL. Returns: undefined */ { int bvi,j,k,m,n,dir ; flags stati,statk = 0 ; double abarik = 0.0 ; bool rayUp,rayDown ; double *betai,*abari ; # ifndef DYLP_NDEBUG if (dy_opts->print.rays >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n Testing if row %s (%d) is a dual ray", consys_nme(dy_sys,'c',i,FALSE,NULL),i) ; } # endif /* Initial setup assumes no ray. */ betai = NULL ; abari = NULL ; if (p_abari != NULL) *p_abari = NULL ; *p_dir = 0 ; rayUp = FALSE ; rayDown = FALSE ; dir = 0 ; /* Start by checking the dual reduced cost, bbar = einv(B)b. (a.k.a. the value of the basic variable in pos'n i). If bbar = 0, we can change y all we like, but we won't go unbounded. If bbar is not zero, then any ray must improve the objective. If you think of the dual as minimising, then for bbar > 0, y must enter decreasing. For bbar < 0, y must enter increasing. To avoid the awkward questions that arise once you start to think hard about this while running dual simplex on the primal structures, we'll just go with the status of the basic variable: * If it's BUUB, then the dual will enter decreasing. * If it's BLLB, then the dual will enter increasing. * Otherwise, the dual reduced cost is 0 or unfavourable, and we don't have a ray. */ bvi = dy_basis[i] ; stati = getflg(dy_status[bvi],vstatSTATUS) ; switch (stati) { case vstatBUUB: { rayDown = TRUE ; dir = -1 ; break ; } case vstatBLLB: { rayUp = TRUE ; dir = 1 ; break ; } default: { break ; } } /* The action for no ray is simply to return. This is obscured by all the printing in the debug version. */ # ifdef DYLP_NDEBUG if (dir == 0) { return ; } # else if (dir == 0) { if (dy_opts->print.rays >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho,".\n\tbasic var %s (%d) %s; no ray.", consys_nme(dy_sys,'v',bvi,FALSE,NULL),bvi, dy_prtvstat(stati)) ; } return ; } else if (dy_opts->print.rays >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho,".\n\tbasic var %s (%d) %s allows %s ray", consys_nme(dy_sys,'v',bvi,FALSE,NULL),bvi,dy_prtvstat(stati), ((dir < 0)?"down":"up")) ; } # endif /* We'll have to work for it. We can use dy_btran to retrieve beta as einv(B). It's annoying, but allocate abari too, even though we may throw it away, 'cause otherwise we'll have no place to put coefficients while we're working. At least we don't need to initialise it. */ m = dy_sys->concnt ; n = dy_sys->varcnt ; betai = CALLOC((m+1),sizeof(double)) ; abari = MALLOC((n+1)*sizeof(double)) ; betai[i] = 1.0 ; dy_btran(betai) ; /* Separate the loops for an up ray and a down ray for efficiency and clarity. Only one case will apply. Walk the columns (skipping basic variables) looking for coefficients that will block motion. We're looking at y = cbar + abardelta and asking whether we can drive y to 0. If we make it through all the columns without turning up a blocking coefficient, we have a ray. For an up ray (y increasing), the blocking conditions are: * x NBLB (hence cbar >= 0) and abarik < 0 * x NBUB (hence cbar <= 0) and abarik > 0 * x NBFR (hence cbar == 0) and abarik != 0 If we happen to run across an NBFR variable with abarik != 0, we're immediately done. Dual feasibility is possible only with cbar == 0. NBFX variables, on the other hand, can never block --- we can regard them as NBLB or NBUB as needed. SB variables should not occur, but treat them as NBFR if seen. */ if (rayUp == TRUE) { for (k = 1 ; k <= n ; k++) { abari[k] = 0 ; statk = getflg(dy_status[k],vstatSTATUS) ; if (flgon(statk,vstatBASIC)) continue ; abarik = consys_dotcol(dy_sys,k,betai) ; abari[k] = abarik ; if (flgon(statk,vstatNBFX)) continue ; if (withintol(abarik,0,dy_tols->zero)) continue ; if (flgon(statk,vstatSB|vstatNBFR) || (flgon(statk,vstatNBLB) && abarik < 0) || (flgon(statk,vstatNBUB) && abarik > 0)) { rayUp = FALSE ; break ; } } # ifndef DYLP_NDEBUG if (dy_opts->print.rays >= 4) { if (rayUp == FALSE) { dyio_outfmt(dy_logchn,dy_gtxecho, "; %s %s (%d): abar<%d,%d> = %g; %s (%d) ", dy_prtvstat(statk),consys_nme(dy_sys,'v',k,FALSE,NULL),k, i,k,abarik) ; if (flgon(statk,vstatNBFR)) { dyio_outfmt(dy_logchn,dy_gtxecho,"; no ray.") ; } else { dyio_outfmt(dy_logchn,dy_gtxecho,"; no ray up.") ; } } else { dyio_outfmt(dy_logchn,dy_gtxecho,"; confirmed.") ; } } # endif } /* The same, for a down ray. */ if (rayDown == TRUE) { for (k = 1 ; k <= n ; k++) { abari[k] = 0 ; statk = getflg(dy_status[k],vstatSTATUS) ; if (flgon(statk,vstatBASIC)) continue ; abarik = consys_dotcol(dy_sys,k,betai) ; abari[k] = abarik ; if (flgon(statk,vstatNBFX)) continue ; if (withintol(abarik,0,dy_tols->zero)) continue ; if (flgon(statk,vstatSB|vstatNBFR) || (flgon(statk,vstatNBLB) && abarik > 0) || (flgon(statk,vstatNBUB) && abarik < 0)) { rayDown = FALSE ; break ; } } # ifndef DYLP_NDEBUG if (dy_opts->print.rays >= 4) { if (rayDown == FALSE) { dyio_outfmt(dy_logchn,dy_gtxecho, "; %s %s (%d): abar<%d,%d> = %g; %s (%d) ", dy_prtvstat(statk),consys_nme(dy_sys,'v',k,FALSE,NULL),k, i,k,abarik) ; if (flgon(statk,vstatNBFR)) { dyio_outfmt(dy_logchn,dy_gtxecho,"; no ray.") ; } else { dyio_outfmt(dy_logchn,dy_gtxecho,"; no ray down.") ; } } else { dyio_outfmt(dy_logchn,dy_gtxecho,"; confirmed.") ; } } # endif } if (betai != NULL) FREE(betai) ; # ifndef DYLP_NDEBUG if ((rayUp == TRUE || rayDown == TRUE) && dy_opts->print.rays >= 6) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n active ray %s (%d)\n non-zeros:", consys_nme(dy_sys,'c',i,FALSE,NULL),i) ; j = 0 ; for (k = 1 ; k <= n ; k++) { abarik = abari[k] ; if (withintol(abarik,0,dy_tols->zero)) continue ; dyio_outfmt(dy_logchn,dy_gtxecho," (%s (%d) %g)", consys_nme(dy_sys,'v',k,FALSE,NULL),k,abarik) ; j++ ; if (j%3 == 0) dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t\t") ; } } # endif /* That's it. If this is a ray, set the direction and return abar if the client's requested it, otherwise free it. */ if (rayUp == TRUE || rayDown == TRUE) { *p_dir = dir ; if (p_abari != NULL) { *p_abari = abari ; } else { if (abari != NULL) FREE(abari) ; } # ifndef DYLP_NDEBUG if (dy_opts->print.rays == 3) { dyio_outfmt(dy_logchn,dy_gtxecho,": yes.") ; } # endif } else { if (abari != NULL) FREE(abari) ; # ifndef DYLP_NDEBUG if (dy_opts->print.rays == 3) { dyio_outfmt(dy_logchn,dy_gtxecho,": no.") ; } # endif } return ; } bool dy_dualRays (lpprob_struct *orig_lp, bool fullRay, int *p_numRays, double ***p_rays, bool trueDuals) /* This routine returns the dual rays emanating from the current basic solution. A call to this routine can be productive only when the previous call to dylp returned a result of (primal) infeasible(*) and dylp's internal data structures are still valid. A call when the previous simplex ended in anything other than optimal, infeasible, or unbounded is considered an error (in judgment, at the least). A call when the result of optimisation was anything other than infeasible will return zero rays. The ray returned depends on the value of fullRay. * If fullRay is true, the full ray is returned as an (m+n)-vector in the original system frame of reference. The first m entries hold ray components for the duals associated with explicit constraints, listed in row order. The remaining n entries hold ray components for the duals that would be associated with tight bound constraints (if those constraints were explicit), listed in column order. * If fullRay is false, duals associated with tight bound constraints are ignored. The ray components for the duals associated with the explicit constraints are returned as above. We're not interested in dual logicals. The meaning of trueDuals is explained in full in the preamble to dy_solutions.c. (*) Not to belabour the point, but it's possible for a problem to be dual and primal infeasible. In this case, you'll get no rays. Parameters: orig_lp: the lp problem structure fullRay: TRUE to return the full ray, FALSE to return only the ray components associated with explicit constraints. p_numRays: (i) the maximum number of rays to return (o) the actual number of rays returned p_rays: (i) vector of (double *) or NULL; 0-based indexing If supplied by client, must be capable of holding at least p_numRays rays. If not supplied by client, allocated if necessary; in particular, not allocated unless at least one ray is returned (o) p_numRays entries will point to rays; each ray is an m-vector in original system row order. trueDuals if TRUE, return the ray with a sign convention appropriate for the true dual problem; if false, use a sign convention appropriate for the given min primal with implicit bounds. Returns: TRUE if no errors occurred while searching for rays; FALSE otherwise. */ { int m,n,i,j,m_orig,n_orig,i_orig,j_orig,rayLen ; bool error ; double *sc_abari ; consys_struct *orig_sys ; bool scaled ; const double *rscale,*cscale ; double Si,sc_abarij,rayk ; int numRays,maxRays,rayDir,i_ray,i_orig_ray,bv_ray,bv_orig_ray ; flags statbv_ray ; double **rayCollection ; bool ourCollection,logical ; double *ray ; char *rtnnme = "dy_dualRays" ; # if DYLP_PARANOIA > 0 if (dy_std_paranoia(orig_lp,rtnnme) == FALSE) { return (FALSE) ; } if (p_numRays == NULL) { errmsg(2,rtnnme,"&numRays") ; return (FALSE) ; } if (p_rays == NULL) { errmsg(2,rtnnme,"&rays") ; return (FALSE) ; } # endif /* Do enough setup for a valid return with no rays. */ maxRays = *p_numRays ; if (maxRays == 0) { return (TRUE) ; } *p_numRays = 0 ; rayCollection = *p_rays ; if (rayCollection != NULL) { ourCollection = FALSE ; } else { ourCollection = TRUE ; } /* What was the result of the last lp? If it was infeasible, we probably have some rays. If it was optimal or unbounded, by definition we have no rays and can return TRUE. Any other code indicates an error; return FALSE. */ orig_sys = orig_lp->consys ; switch (orig_lp->lpret) { case lpINFEAS: { break ; } case lpOPTIMAL: case lpUNBOUNDED: { warn(954,rtnnme,orig_sys->nme,"dual",dy_prtlpret(orig_lp->lpret)) ; return (TRUE) ; } default: { errmsg(954,rtnnme,orig_sys->nme,"dual",dy_prtlpret(orig_lp->lpret)) ; return (FALSE) ; } } /* The lp was infeasible, so with high probability we'll have a ray. Set up a header to hold the collection, if the client did not supply it. Also determine if we'll need to do unscaling, and if so acquire the scaling matrices. */ if (ourCollection == TRUE) { rayCollection = (double **) MALLOC(maxRays*sizeof(double *)) ; } sc_abari = NULL ; scaled = dy_isscaled() ; if (scaled == TRUE) { dy_scaling_vectors(&rscale,&cscale) ; } /* Set up to walk the rows of the active system. For each row that tests out as a ray, testForDualRay will return abar in column order in the active reference frame. We'll unscale it and simultaneously drop the coefficients into the proper place in the ray, in the original reference frame. */ n_orig = orig_sys->varcnt ; m_orig = orig_sys->concnt ; if (fullRay == TRUE) { rayLen = m_orig+n_orig ; } else { rayLen = m_orig ; } n = dy_sys->varcnt ; m = dy_sys->concnt ; error = FALSE ; numRays = 0 ; rayDir = 0 ; /* Start to walk the rows of the active system. If the row is not a candidate for a dual pivot, there can be no ray. Test for BLLB or BUUB status for the associated basic variable. */ for (i_ray = 1 ; i_ray <= m ; i_ray++) { bv_ray = dy_basis[i_ray] ; statbv_ray = dy_status[bv_ray] ; if (!flgon(statbv_ray,vstatBLLB|vstatBUUB)) continue ; /* The row is not obviously unqualified, so call for a thorough check. If we have a ray, allocate a vector to hold it. */ testForDualRay(i_ray,&rayDir,&sc_abari) ; if (rayDir == 0) continue ; ray = CALLOC((rayLen+1),sizeof(double)) ; rayCollection[numRays] = ray ; numRays++ ; /* We need to unscale the ray and translate it from active system column order to original system row/column order. Getting the ray components pointed in the right direction takes a little work. If y is (apparently) decreasing because the basic primal is leaving at its upper bound, that's a factor of -1 (encoded in rayDir). Then, if the ray derives from a >= constraint in the original system, there's another factor of -1 to be applied, already encoded in the row scaling (rscale). BUT ... we have to be careful about semantics when the basic variable is a slack. If a >= constraint has been scaled to a <= constraint, dylp has added a slack after the multiplication by -1, and that slack is now BLLB on 0 <= slack <= infty. The coefficient of +1 is embedded in the basis inverse; we can't change it. When we convert back to a >= constraint, multiplying by -1, that +1 doesn't change! To get this right, we have to interpret the logical as a surplus that's BUUB on bounds of -infty <= surplus <= 0. Check for this case and reverse the ray direction (rayDir). TO THINK ABOUT: What about range constraints? And should we be checking for the scaling factor associated with this constraint (i_orig_ray) instead of the basic logical (bv_orig_ray)? This could be an unnatural logical, after all. I need to come up with an example that's dual unbounded and has an unnatural logical basic on a >= constraint. */ i_orig_ray = dy_actcons[i_ray] ; if (bv_ray <= m) { logical = TRUE ; bv_orig_ray = dy_actcons[bv_ray] ; if (scaled == TRUE && rscale[bv_orig_ray] < 0) rayDir = -rayDir ; } else { logical = FALSE ; bv_orig_ray = dy_actvars[bv_ray] ; } /* In terms of scaling, we have sc_abar = e(inv(S)inv(B)NS) and we need to remove the leading and trailing column scaling, if present. For the duals associated with implicit upper and lower bounds, it boils down to `if these constraints were explicitly added to the system, we'd write them as honest <= constraints, and they would have a positive dual.' A rigourous explanation of how we come to have apparently negative duals requires detailed examination of just how it is that you can run dual simplex at all using the primal matrices and data structures. See the typeset documentation on the relationship between primal and dual simplex. NOTE: The code assumes that the lower bound constraint will take the form -x <= -lb. The rationale is that the canonical primal problem is Ax <= b, hence it makes sense to assume this form when reconstructing an implicit constraint. But this is a choice, not a mathematical requirement. We could pretend these are >= constraints, at the cost of some mental gymnastics. NBFX is not an issue, as the dual for an equality is a free variable. In terms of change of reference frame, we're moving from active system column order to original system row/column order. For logicals, it's simply row i -> i_orig; for columns, j -> j_orig. If the user is asking for the full ray, we need to scan all of abar; otherwise, only the first m positions (the positions occupied by logicals). */ if (scaled == TRUE) { if (logical == TRUE) { Si = 1/rscale[bv_orig_ray]*rayDir ; } else { Si = cscale[bv_orig_ray]*rayDir ; } for (i = 1 ; i <= m ; i++) { if (sc_abari[i] == 0) continue ; i_orig = dy_actcons[i] ; rayk = Si*sc_abari[i]*rscale[i_orig] ; setcleanzero(rayk,dy_tols->zero) ; ray[i_orig] = rayk ; } if (fullRay == TRUE) { for (j = m+1 ; j <= n ; j++) { # if DYLP_PARANOIA > 0 if (dy_chkstatus(j) == FALSE) { error = TRUE ; } # endif if (sc_abari[j] == 0) continue ; /* Deal with a ray coefficient that's negated because the corresponding primal is NBUB. */ j_orig = dy_actvars[j] ; rayk = Si*sc_abari[j]*(1/cscale[j_orig]) ; if (trueDuals == TRUE && flgon(dy_status[j],vstatNBUB)) { # if DYLP_PARANOIA > 0 if (rayk > dy_tols->cost) { errmsg(739,rtnnme,dy_sys->nme,"active", consys_nme(dy_sys,'v',j,FALSE,NULL),j, dy_prtvstat(dy_status[j]),rayk) ; error = TRUE ; } # endif rayk = -rayk ; } setcleanzero(rayk,dy_tols->zero) ; ray[m_orig+j_orig] = rayk ; } } } /* The same, but without scaling. We still need to cope with rayDir and NBUB variables. */ else { for (i = 1 ; i <= m ; i++) { if (sc_abari[i] == 0) continue ; i_orig = dy_actcons[i] ; rayk = sc_abari[i]*rayDir ; setcleanzero(rayk,dy_tols->zero) ; ray[i_orig] = rayk ; } if (fullRay == TRUE) { for (j = m+1 ; j <= n ; j++) { # if DYLP_PARANOIA > 0 if (dy_chkstatus(j) == FALSE) { error = TRUE ; } # endif if (sc_abari[j] == 0) continue ; rayk = sc_abari[j]*rayDir ; if (trueDuals == TRUE && flgon(dy_status[j],vstatNBUB)) { # if DYLP_PARANOIA > 0 if (rayk > dy_tols->cost) { errmsg(739,rtnnme,dy_sys->nme,"active", consys_nme(dy_sys,'v',j,FALSE,NULL),j, dy_prtvstat(dy_status[j]),rayk) ; error = TRUE ; } # endif rayk = -rayk ; } j_orig = dy_actvars[j] ; setcleanzero(rayk,dy_tols->zero) ; ray[m_orig+j_orig] = rayk ; } } } if (sc_abari != NULL) { FREE(sc_abari) ; sc_abari = NULL ; } # if DYLP_PARANOIA > 0 /* Do the paranoid check before adding the coeff for the nonbasic dual. All we're testing here is einv(B)N. */ check_dualRay(orig_lp,fullRay,i_orig_ray,rayDir,ray,trueDuals) ; # endif /* Last, but not least, y is itself moving and must be part of the ray. Add a coefficient of 1.0 in the original reference frame. Except for a >= constraint, where we need -1 because any inversion encoded in the row scaling hasn't yet been applied to this coefficient. */ if (logical == TRUE) { if (orig_sys->ctyp[bv_orig_ray] == contypGE) { ray [bv_orig_ray] = -1.0 ; } else { ray[bv_orig_ray] = 1.0 ; } } else if (fullRay == TRUE) { ray[m_orig+bv_orig_ray] = 1.0 ; } # ifndef DYLP_NDEBUG if (dy_opts->print.rays >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n ray<%d>: %s (%d)\n non-zeros:",numRays, consys_nme(orig_sys,'c',i_orig_ray,FALSE,NULL),i_orig_ray) ; j_orig = 0 ; for (i_orig = 1 ; i_orig <= m_orig ; i_orig++) { if (ray[i_orig] != 0) { if (j_orig != 0 && j_orig%3 == 0) dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t\t") ; dyio_outfmt(dy_logchn,dy_gtxecho," (%s (%d) %g)", consys_nme(orig_sys,'c',i_orig,FALSE,NULL),i_orig, ray[i_orig]) ; j_orig++ ; } } if (fullRay == TRUE) { i_orig = j_orig ; for (j_orig = 1 ; j_orig <= n_orig ; j_orig++) { if (ray[m_orig+j_orig] != 0) { if (i_orig%3 == 0) dyio_outfmt(dy_logchn,dy_gtxecho,"\n*\t\t") ; dyio_outfmt(dy_logchn,dy_gtxecho," (%s (%d) %g)", consys_nme(orig_sys,'v',j_orig,FALSE,NULL),j_orig, ray[m_orig+j_orig]) ; i_orig++ ; } } } } # endif if (numRays >= maxRays) break ; } /* End of scanning loop. We've either found the requested number of rays, scanned all rows, or encountered an error. Time for cleanup. Free the vector used for sc_abar. If we have an error, free the ray collection. */ if (sc_abari != NULL) FREE(sc_abari) ; if (error == TRUE) { if (rayCollection != NULL) { for (i = 0 ; i < numRays ; i++) { if (rayCollection[i] != NULL) { FREE(rayCollection[i]) ; rayCollection[i] = NULL ; } } if (ourCollection == TRUE) FREE(rayCollection) ; } return (FALSE) ; } /* That's it --- finish up and return. */ *p_rays = rayCollection ; *p_numRays = numRays ; return (TRUE) ; } DyLP-1.6.0/DyLP/src/Dylp/dy_conmgmt.c0000644000076700007670000016503411026315405014105 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2005 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ #define DYLP_INTERNAL #include "dylp.h" #include static char sccsid[] UNUSED = "@(#)dy_conmgmt.c 4.6 10/15/05" ; static char svnid[] UNUSED = "$Id: dy_conmgmt.c 240 2008-06-18 23:32:21Z lou $" ; /* This file contains routines for primal constraint management. It provides routines to handle the the activation and deactivation of a primal constraint with a basic logical variable, and deactivation of a primal constraint with a nonbasic logical variable. There are also routines to scan for candidates for activation and deactivation. The normal top-level routines for bulk activation and deactivation are dy_activateCons and dy_deactivateCons, respectively. In terms of the dual problem, we're activating or deactivating a dual architectural variable. In the normal course of events, dylp will deactivate loose primal constraints (basic feasible logicals; nonbasic dual architecturals with unfavourable reduced costs) and activate violated constraints (basic infeasble logicals; nonbasic dual architecturals with favourable reduced costs). (Recall the the reduced cost of a dual is the value of the primal variable in that basis position.) When attempting to recover from pivoting problems in the dual simplex, dylp will deactivate dual architecturals on the pivot reject list (corresponding to violated constraints; these will have favourable dual reduced cost) in an attempt to achieve primal feasibility and allow a transition to primal phase II. Activating or deactivating a constraint with a nonbasic logical is problematic. Viewed from a primal perspective, activation requires we find a variable to occupy the basis position, and deactivation requires we deal with the variable that's basic for the constraint. When attempting to regain dual feasibility, dylp may request deactivation of a constraint with a nonbasic logical because the logical is dual infeasible. This case is handled by forcing the current occupant of the basis position into the nonbasic partition and replacing it with the logical for the constraint. From there, it's a matter of deactivating a constraint with a basic logical. Activation of a constraint using a nonbasic logical isn't an issue in dylp. Should the need ever arise, the appropriate strategy would be to convert some nonbasic variable to basic at bound and add the logical as nonbasic at bound or superbasic. The bottom routine for constraint activation is dy_loadcon, which handles the business of translating a constraint from the original system frame of reference and installing it in the active system. This is used bare during initialisation. Immediately above is dy_actBLogPrimCon, which deals with basis and status issues once dylp has finished initialisation and into simplex. For deactivation, the bottom routine is deactBLogPrimCon. */ /* A few words about the algebra of constraint addition and deletion, as it relates to the PSE and DSE variables. First, suppose that no new variables are activated with a constraint, with the exception of the associated logical. It becomes basic with a coefficient of 1 (by definition; remember the constraints have been rewritten to convert >= constraints to <= constraints). It is, however, unfortunately true that added constraints may have non-zero coefficients for any of the existing basic variables. Suppose we're adding constraint k. The new basis has the form B' = [[B 0][a 1]], and the inverse will be inv(B') = [[inv(B) 0][-ainv(B) 1]]. The cost vector c = (c 0). For reduced costs, we have no changes, given that the objective coefficient for the slack variable is 0. We do, however, recalculate the duals anyway, for accuracy (we will be refactoring to get the new basis inverse). For PSE, the gamma = ||abar~||^2 will not change --- the projected edge abar~ is unchanged because the new slack is basic, hence not part of the reference frame. When we delete a constraint with a basic logical, PSE norms must be updated if the slack was nonbasic (hence added to the reference frame) at some point in the past. Suppose the slack is basic in position k. Removing it will change values of gamma for all columns where abar~ has a nonzero. The efficient way out is to reset the reference frame. (It's an open question whether adjusting the norms would give better performance.) For DSE, the situation is interesting. You'd think that changing the basis by adding/deleting both rows (the constraints) and columns (the logicals) would change everything. But as the algebra above shows, the special form of the partitions means that the existing beta do not change. Deactivation requires no changes at all. Activation requires that we calculate the norms for the new rows. In practice, when dylp adds constraints, it collects a list of inactive variables referenced by the constraints and then considers activating them, based on the target simplex phase (for primal, we want favourable (nonoptimal) reduced cost; for dual, unfavourable (optimal)). But this is handled by variable activation routines, which deal with the side effects. */ /* Reverse integer comparison so we can sort arrays of indices in nonincreasing order. Returns: < 0 if i > j 0 if i = j > 0 if i < j */ static int intcompare (const void *p_i, const void *p_j) { int i = *((const int *) p_i) ; int j = *((const int *) p_j) ; return ((j)-(i)) ; } bool dy_loadcon (consys_struct *orig_sys, int i, bool genvars, int *inactndxs) /* This routine loads a constraint i from the original system (orig_sys) into the active system (dy_sys). It expects dy_origvars to be valid. If genvars == TRUE, new columns are generated as needed for eligible inactive variables x. A variable is eligible if a != 0 and the variable is not fixed. If genvars is FALSE, only the coefficients a corresponding to already active variables will be installed when a is loaded. If a vector is provided in inactndxs, it is used to return the indices of eligible variables x which would have been activated if genvars were TRUE. WARNING: Use genvars == TRUE only for loading the initial constraint system. The simple procedure used here assumes that an empty column is generated when a variable x is first encountered. It WILL FAIL if there are non-zero coefficients for x in constraints that are already active. When dylp is given an active variable specification, it will establish the active variable set before loading constraints, and genvars will be FALSE. If there's no active variable specification, the constraints determine the active variables, and genvars will be TRUE. Once dylp is past loading the initial constraint system, there is much more work to do to activate a variable. Use inactndxs to return the candidates and call an appropriate variable activation routine (viz. dy_varmgmt.c). The generation of the logical variable associated with the constraint will be handled automatically. The routine will correct dy_origvars and dy_actvars when an architectural variable is shifted to make room for this constraint's logical variable. Other than dy_origvars and dy_actvars, no other data structures are updated. The assumption is that this routine is used during initialization of dy_sys, before other lp data structures are established. Parameters: orig_sys: The original constraint system. i: Index of the constraint to be activated. genvars: TRUE if inactive variables used in this constraint should be activated; FALSE otherwise inactndxs: (i) Vector to hold inactive variable indices, or NULL (o) If genvars == FALSE, and inactndxs != NULL, the indices of inactive variables with nonzero coefficients in a will be loaded into inactndxs. inactndxs[0] is set to the number of valid indices stored in inactndxs[1 .. inactndxs[0]]. The vector is assumed to be of adequate size. Returns: TRUE if the constraint is successfully installed, FALSE otherwise. */ { int ndx,act_ndx,j,act_j,act_i ; int inact_ndx ; double rhsadj,rhscorr,act_rhs,act_rhslow ; flags statj ; pkvec_struct *ai,*aj ; pkcoeff_struct *aij ; bool retval ; const char *rtnnme = "dy_loadcon" ; # ifndef DYLP_NDEBUG int print ; switch (dy_lp->phase) { case dyINIT: { print = dy_opts->print.setup ; break ; } case dyFORCEFULL: case dyADDCON: { print = dy_opts->print.conmgmt+1 ; break ; } default: { errmsg(1,rtnnme,__LINE__) ; return (FALSE) ; } } # endif # ifdef DYLP_PARANOIA if (orig_sys == NULL) { errmsg(2,rtnnme,"orig_sys") ; return (FALSE) ; } if (genvars == TRUE && dy_lp->phase != dyINIT) { errmsg(1,rtnnme,__LINE__) ; return (FALSE) ; } if (i <= 0 || i > orig_sys->concnt) { errmsg(102,rtnnme,orig_sys->nme,"constraint",i,1,orig_sys->concnt) ; return (FALSE) ; } ndx = (orig_sys->concnt-dy_lp->sys.cons.unloadable) - (dy_lp->sys.cons.loadable+dy_sys->concnt) ; if (ndx != 0) { errmsg(444,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "constraint",orig_sys->concnt,dy_lp->sys.cons.unloadable, dy_lp->sys.cons.loadable,dy_sys->concnt,ndx) ; return (FALSE) ; } if (ACTIVE_CON(i)) { char onmbuf[128] ; act_j = dy_origcons[i] ; (void) consys_nme(orig_sys,'c',i,TRUE,onmbuf) ; errmsg(431,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "constraint",onmbuf,i, consys_nme(dy_sys,'c',act_j,TRUE,NULL),act_j) ; return (FALSE) ; } if (!LOADABLE_CON(i)) { errmsg(445,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "constraint",consys_nme(orig_sys,'c',i,TRUE,NULL),i) ; return (FALSE) ; } # endif /* Prep work. Make a 0-length vector that we'll use to retrieve and create column headers. Make sure the row vector pointer is null so that getrow_pk will allocate one for us, and retrieve the constraint. */ if (genvars == TRUE) { aj = pkvec_new(0) ; } else { aj = NULL ; } ai = NULL ; if (consys_getrow_pk(orig_sys,i,&ai) == FALSE) { errmsg(122,rtnnme,orig_sys->nme, "row",consys_nme(orig_sys,'c',i,TRUE,NULL),i) ; if (aj != NULL) pkvec_free(aj) ; if (ai != NULL) pkvec_free(ai) ; return (FALSE) ; } retval = TRUE ; /* Walk the constraint and convert the column indices from the original system frame of reference to the dylp system frame of reference. If we're allowed to activate, create empty columns as necessary for each eligible variable. If we're not allowed to activate, inactive variables are removed from a by compressing the coefficient vector in place. rhsadj keeps track of the effect on the rhs of the constraint. */ rhsadj = 0 ; inact_ndx = 0 ; act_ndx = 0 ; for (ndx = 0 ; ndx < ai->cnt ; ndx++) { aij = &ai->coeffs[ndx] ; j = aij->ndx ; # ifdef DYLP_PARANOIA if (j <= 0 || j > orig_sys->varcnt) { errmsg(102,rtnnme,orig_sys->nme,"variable",j,1,orig_sys->varcnt) ; retval = FALSE ; break ; } if (dy_origvars[j] == 0) { errmsg(1,rtnnme,__LINE__) ; retval = FALSE ; break ; } # endif /* If x is inactive, we need to activate it or step over it. As explained in the opening comments, for activation we simply create an empty column. Fixed variables are never activated. All variables are continuous, as far as dylp is concerned. In spite of what error message 433 says, we need to allow for inactive SB variables here. The source is a warm start. During initialisation, all variables start out as inactive, hence nonbasic. The variables that the warm start thinks should be basic are assigned SB status. */ if (INACTIVE_VAR(j)) { statj = (flags) (-dy_origvars[j]) ; # ifdef DYLP_PARANOIA if (dy_lp->phase == dyINIT) { retval = flgon(statj,vstatNONBASIC|vstatEXOTIC) ; } else { retval = flgon(statj,vstatNONBASIC|vstatNBFR) ; } if (retval == FALSE) { errmsg(433,rtnnme,dy_sys->nme, dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "inactive",consys_nme(orig_sys,'v',j,TRUE,NULL), j,dy_prtvstat(statj)) ; break ; } # endif if (genvars == TRUE && LOADABLE_VAR(j)) { retval = consys_getcol_pk(orig_sys,j,&aj) ; if (retval == FALSE) { errmsg(122,rtnnme,orig_sys->nme,"variable", consys_nme(orig_sys,'v',j,TRUE,NULL),j) ; break ; } retval = consys_addcol_pk(dy_sys,vartypCON,aj,orig_sys->obj[j], orig_sys->vlb[j],orig_sys->vub[j]) ; if ( retval == FALSE) { errmsg(156,rtnnme,"variable",dy_sys->nme,aj->nme) ; break ; } act_j = aj->ndx ; # ifndef DYLP_NDEBUG if (print >= 6) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t activating %s variable %s (%d) to index %d, status %s.", consys_prtvartyp(orig_sys->vtyp[j]), consys_nme(orig_sys,'v',j,FALSE,NULL),j,act_j, (statj == 0)?"unspecified":dy_prtvstat(statj)) ; } # endif dy_origvars[j] = act_j ; dy_actvars[act_j] = j ; dy_lp->sys.vars.loadable-- ; } /* If activation is disallowed, note the contribution to the right-hand-side. If the variable is loadable, record the index in inactndxs. Then move on to the next variable. */ else { if (inactndxs != NULL && LOADABLE_VAR(j)) inactndxs[++inact_ndx] = j ; switch (getflg(statj,vstatSTATUS)) { case vstatNBLB: { rhscorr = aij->val*orig_sys->vlb[j] ; break ; } case vstatNBUB: case vstatNBFX: { rhscorr = aij->val*orig_sys->vub[j] ; break ; } default: { rhscorr = 0 ; break ; } } rhsadj -= rhscorr ; # ifndef DYLP_NDEBUG if (print >= 6) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t skipping inactive %s variable %s (%d), status %s.", consys_prtvartyp(orig_sys->vtyp[j]), consys_nme(orig_sys,'v',j,FALSE,NULL),j,dy_prtvstat(statj)) ; dyio_outfmt(dy_logchn,dy_gtxecho,", rhs += %g.",-rhscorr) ; } # endif continue ; } } /* We're going to use this variable, so convert the index from the original system frame to the active system frame. We need to copy the value, too, just in case we're compressing. */ # ifndef DYLP_NDEBUG if (print >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t copying %s variable %s (%d) to index %d.", consys_prtvartyp(orig_sys->vtyp[j]), consys_nme(orig_sys,'v',j,FALSE,NULL),j,dy_origvars[j]) ; } # endif ai->coeffs[act_ndx].ndx = dy_origvars[j] ; ai->coeffs[act_ndx].val = aij->val ; act_ndx++ ; } if (aj != NULL) pkvec_free(aj) ; if (inactndxs != NULL) inactndxs[0] = inact_ndx ; if (retval == FALSE) { if (ai != NULL) pkvec_free(ai) ; return (FALSE) ; } ai->cnt = act_ndx ; /* The constraint has been converted -- column indices are in the dy_sys frame of reference and inactive columns are removed. Add the row to dy_sys. Everything is an architectural constraint as far as dy_sys is concerned. Note that we should never look at slots in dy_actvars corresponding to logicals --- they don't exist in orig_sys. -INT_MAX should guarantee errors if we ever use the value. */ act_rhs = orig_sys->rhs[i]+rhsadj ; if (orig_sys->ctyp[i] == contypRNG) { act_rhslow = orig_sys->rhslow[i]+rhsadj ; } else { act_rhslow = 0 ; } retval = consys_addrow_pk(dy_sys,'a',orig_sys->ctyp[i], ai,act_rhs,act_rhslow,NULL,NULL) ; if (retval == FALSE) { errmsg(156,rtnnme,"constraint",dy_sys->nme,ai->nme) ; if (ai != NULL) pkvec_free(ai) ; return (FALSE) ; } act_i = ai->ndx ; pkvec_free(ai) ; dy_origcons[i] = act_i ; dy_actcons[act_i] = i ; dy_actvars[act_i] = -INT_MAX ; /* Are there architectural variables? The addition of the logical will cause the architectural variable that used to occupy position act_i to be moved to dy_sys->varcnt, and we need to adjust dy_origvars accordingly. (dy_actvars is attached to dy_sys and has been updated automatically.) */ if (dy_sys->archvcnt > 0) { act_j = dy_sys->varcnt ; j = dy_actvars[act_j] ; # ifdef DYLP_PARANOIA if (dy_origvars[j] != act_i) { errmsg(1,rtnnme,__LINE__) ; return (FALSE) ; } # endif dy_origvars[j] = act_j ; # ifndef DYLP_NDEBUG if (print >= 6) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t variable %s (%d) shifted from index %d", consys_nme(dy_sys,'v',act_j,FALSE,NULL),act_j,act_i) ; } # endif } # ifndef DYLP_NDEBUG if (print >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n %s %s (%d) copied to index %d", consys_prtcontyp(dy_sys->ctyp[act_i]), consys_nme(dy_sys,'c',act_i,FALSE,NULL),i,act_i) ; } # endif /* Bookkeeping. */ dy_lp->sys.cons.loadable-- ; # ifdef DYLP_STATISTICS if (dy_stats != NULL) dy_stats->cons.actcnt[i]++ ; # endif return (TRUE) ; } bool dy_actBLogPrimCon (consys_struct *orig_sys, int origi, int *inactvars) /* Assume dy_sys has m constraints and n variables (logical plus architectural). This routine activates a primal constraint a to index i, where i = m+1. The basis is augmented with a basic logical x. To make room for the logical x, the first architectural x is moved to index j = n+1. The constraint could be loose, tight, or violated, depending on the value of x. What's important here is that we can easily generate a new basis by augmenting the existing basis with x. Once dy_loadcon adds the constraint to dy_sys, we'll need to examine and correct the arrays dy_basis and dy_var2basis. Parameters: orig_sys: The original constraint system. origi: The constraint to be activated. inactvars: (i) An array to hold indices of inactive variables referenced by the constraint, or NULL if not desired (o) Indices of inactive referenced variables, if requested. Returns: TRUE if activation succeeds, FALSE if there's an error. */ { int i,j ; double lhsi,rhsi,rhslowi ; contyp_enum ctypi ; const char *rtnnme = "dy_actBLogPrimCon" ; # ifdef DYLP_PARANOIA /* A little paranoia. Check that origi is valid. */ if (orig_sys == NULL) { errmsg(2,rtnnme,"orig_sys") ; return (FALSE) ; } if (origi <= 0 || origi > orig_sys->concnt) { errmsg(102,rtnnme,"original constraint",origi,1,orig_sys->concnt) ; return (FALSE) ; } # endif ctypi = orig_sys->ctyp[origi] ; # ifndef DYLP_NDEBUG /* A little information, if the user wants it. */ if (dy_opts->print.conmgmt >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n activating ") ; if (ctypi == contypRNG) { dyio_outfmt(dy_logchn,dy_gtxecho,"%g <= ",orig_sys->rhslow[origi]) ; } dyio_outfmt(dy_logchn,dy_gtxecho,"%s (%d) %s %g", consys_nme(orig_sys,'c',origi,FALSE,NULL),origi, consys_prtcontyp(ctypi),orig_sys->rhs[origi]) ; } # endif /* Load the constraint into dy_sys. No new architectural variables. */ if (dy_loadcon(orig_sys,origi,FALSE,inactvars) == FALSE) { errmsg(430,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "activate","original constraint", consys_nme(orig_sys,'c',origi,TRUE,NULL),origi) ; return (FALSE) ; } /* Correct the basis. The new constraint has index i = m+1 and the logical x becomes the basic variable. Since it's basic, it's not part of the PSE reference frame, and its reduced cost is zero. If there are architectural variables, the old x has become x. If it's basic, we need to correct dy_basis. */ i = dy_sys->concnt ; j = dy_sys->varcnt ; dy_basis[i] = i ; dy_var2basis[i] = i ; dy_frame[i] = FALSE ; dy_cbar[i] = 0.0 ; if (j > dy_sys->concnt) { if (dy_var2basis[j] != 0) dy_basis[dy_var2basis[j]] = j ; } /* Finally, we need to set the status of the logical. Evaluate the constraint and set it accordingly. Since x is part of the constraint, set it to 0 before the evaluation. Note that we need the loaded rhs values here to capture the correction for nonzero inactive values. */ rhsi = dy_sys->rhs[i] ; dy_x[i] = 0 ; lhsi = consys_dotrow(dy_sys,i,dy_x) ; setcleanzero(lhsi,dy_tols->zero) ; if (abovebnd(lhsi,rhsi)) { dy_status[i] = vstatBLLB ; } else if (atbnd(lhsi,rhsi)) { if (ctypi == contypEQ) { dy_status[i] = vstatBFX ; } else { dy_status[i] = vstatBLB ; } } else if (ctypi != contypRNG) { dy_status[i] = vstatB ; } else { rhslowi = dy_sys->rhslow[i] ; if (belowbnd(lhsi,rhslowi)) { dy_status[i] = vstatBUUB ; } else if (atbnd(lhsi,rhslowi)) { dy_status[i] = vstatBUB ; } else { dy_status[i] = vstatB ; } } /* And finally, a little paranoia. Generally, we should only be activating violated or tight constraints, so the logical should be at or outside its bounds. There are two exceptions: If we're trying to bound an unbounded primal, or we're forcing a full system. */ # ifdef DYLP_PARANOIA if (flgon(dy_status[i],vstatB) || (dy_opts->con.actlvl = 0 && flgon(dy_status[i],vstatBLLB|vstatBUUB))) { if (dy_lp->phase == dyFORCEFULL || (dy_lp->phase == dyADDCON && (dy_lp->lpret == lpSWING || dy_lp->lpret == lpUNBOUNDED))) { /* ok */ } else { warn(442,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, consys_nme(dy_sys,'c',i,FALSE,NULL),i,dy_prtvstat(dy_status[i]), (dy_opts->con.actlvl == 0)?"violated":"tight or violated") ; } } # endif return (TRUE) ; } bool dy_actBLogPrimConList (consys_struct *orig_sys, int cnt, int *ocndxs, int **p_inactvars) /* This routine is a shell to call actBLogPrimCon for each of the indices in the vector ocndxs. It performs minimal error checking, relying on checking in actBLogPrimCon. If p_inactvars is non-NULL, the routine accumulates a list of indices of inactive variables referenced by the activated constraints. There is no attempt to remove duplicates, hence there's no good limit on the size of this vector. It may be realloc'd over the course of activation. We can bound the number of indices collected for a given constraint, however. Parameters: orig_sys: The original constraint system cnt: The number of indices in ocndxs ocndxs: Vector of constraint indices (0-based) p_inactvars: (i) If p_inactvars == NULL, collection of indices of referenced variables is suppressed. If *p_inactvars == NULL, a vector will be allocated. If *p_inactvars != NULL, (*p_inactvars)[0] must contain the allocated size. (o) If collection of indices is taking place, the vector of indices is returned, with (*p_inactvars)[0] set to the number of indices collected. If no referenced variables were encountered, *p_inactvars will remain NULL if no vector was supplied. Returns: TRUE if all constraints are successfully activated, FALSE otherwise. */ { int j,k,ndx,act_n,inact_n ; int *onecon,onecon_cnt,*collection,coll_cnt,coll_sze ; bool *seen ; bool with_vars,retval ; const char *rtnnme = "dy_actBLogPrimConList" ; # ifdef DYLP_PARANOIA if (orig_sys == NULL) { errmsg(2,rtnnme,"orig_sys") ; return (FALSE) ; } if (ocndxs == NULL) { errmsg(2,rtnnme,"ocndxs") ; return (FALSE) ; } if (cnt <= 0 || cnt > orig_sys->concnt) { errmsg(5,rtnnme,"cnt",cnt) ; return (FALSE) ; } # endif retval = TRUE ; /* Are we collecting indices of referenced variables? If so, set up to do it. We can guarantee that any one constraint will reference no more than (inact_n - act_n) variables. To avoid duplicates, we need to keep track of the indices already collected. Then we can guarantee that the collection itself will be no more than (inact_n - act_n) variables. */ if (p_inactvars != NULL) { with_vars = TRUE ; act_n = dy_sys->archvcnt ; inact_n = orig_sys->archvcnt ; coll_sze = inact_n-act_n+1 ; seen = (bool *) CALLOC((inact_n+1),sizeof(bool)) ; if (*p_inactvars == NULL) { collection = (int *) MALLOC(coll_sze*sizeof(int)) ; } else { collection = *p_inactvars ; coll_sze = collection[0] ; } collection[0] = 0 ; coll_cnt = 0 ; onecon = (int *) MALLOC(coll_sze*sizeof(int)) ; } else { with_vars = FALSE ; onecon = NULL ; collection = NULL ; coll_cnt = -1 ; seen = NULL ; } /* Open a loop to request activation of each constraint in ocndxs. On return, concatenate the indices from onecon to collection. */ for (k = 0 ; k < cnt && retval == TRUE ; k++) { # ifndef DYLP_NDEBUG if (dy_opts->print.conmgmt >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n activating constraint %s (%d)", consys_nme(orig_sys,'c',ocndxs[k],TRUE,NULL),ocndxs[k]) ; if (with_vars == FALSE || dy_opts->print.conmgmt < 4) { dyio_outchr(dy_logchn,dy_gtxecho,'.') ; } } # endif retval = dy_actBLogPrimCon(orig_sys,ocndxs[k],onecon) ; if (retval == FALSE) { errmsg(430,rtnnme, orig_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "activate","constraint", consys_nme(orig_sys,'c',ocndxs[k],TRUE,NULL),ocndxs[k]) ; } if (with_vars == TRUE) { onecon_cnt = onecon[0] ; for (ndx = 1 ; ndx <= onecon_cnt ; ndx++) { j = onecon[ndx] ; if (seen[j] == FALSE) { collection[++coll_cnt] = j ; seen[j] = TRUE ; } } # ifndef DYLP_NDEBUG if (dy_opts->print.conmgmt >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho,", %d referenced variables queued.", coll_cnt-collection[0]) ; collection[0] = coll_cnt ; } # endif } } /* Clean up from collection of indices of referenced variables. */ if (with_vars == TRUE) { collection[0] = coll_cnt ; if (*p_inactvars == NULL) { if (coll_cnt == 0) { FREE(collection) ; } else { *p_inactvars = collection ; } } if (onecon != NULL) FREE(onecon) ; if (seen != NULL) FREE(seen) ; } # ifdef DYLP_PARANOIA if (retval == TRUE) { retval = dy_chkdysys(orig_sys) ; } # endif return (retval) ; } bool dy_deactNBLogPrimCon (consys_struct *orig_sys, int i) /* This routine deactivates a tight primal constraint a with a nonbasic logical x. The only reason we want to do this is because we're trying to force dual feasibility and we need to deactivate the logical. Realistically, though, we're deleting the (dual) column associated with a nonzero dual, so dual feasibility will be a stroke of luck. But deactivating a primal constraint can't harm primal feasibility, eh? The routine takes the attitude that if we have primal feasibility, it'll try to retain it and force the basic variable out with superbasic status. What's important here is that the job is complicated considerably by the presence of some other variable x basic in pos'n i. The easiest way to overcome this problem is to alter reality. We'll take the variable x and mark it nonbasic at bound, unless we have primal feasibility, in which case we'll opt for SB status in an attempt to retain feasibility. Then we'll take x, the nonbasic logical for a, and mark it basic in pos'n i. Then we'll call deactBLogPrimCon to do the heavy lifting. Parameters: orig_sys: The original constraint system. i: The constraint to be deactivated. orig_sys is used only for printing, statistics, and paranoid checks, but it gives a nice symmetry with actBLogPrimCon. Returns: TRUE if deactivation succeeds, FALSE if there's an error. */ { int j,m,n ; double lbj,ubj,valj ; flags stati,statj ; const char *rtnnme = "dy_deactNBLogPrimCon" ; /* A little paranoia, mixed with prep. Check that i is valid and nonbasic. */ m = dy_sys->concnt ; n = dy_sys->varcnt ; # ifdef DYLP_PARANOIA if (i <= 0 || i > m) { errmsg(102,rtnnme,"constraint",i,1,m) ; return (FALSE) ; } # endif stati = getflg(dy_status[i],vstatSTATUS) ; # ifdef DYLP_PARANOIA if (flgoff(stati,vstatNBLB|vstatNBUB|vstatNBFX)) { errmsg(437,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, consys_nme(dy_sys,'c',i,TRUE,NULL),i,dy_prtvstat(stati)) ; return (FALSE) ; } # endif /* Grab hold of x, the variable that's basic in pos'n i, and push it out into the nonbasic partition. If we're unlucky, it'll go out with SB status. If we're doubly unlucky, it's part of the reference frame and we'll need to reinitialize the PSE reference frame. SB status only applies in primal phase II. If we don't have feasibility, no need to use exotic status to preserve it. Just pick a finite bound. */ j = dy_basis[i] ; statj = getflg(dy_status[j],vstatSTATUS) ; lbj = dy_sys->vlb[j] ; ubj = dy_sys->vub[j] ; switch (statj) { case vstatB: { if (dy_lp->simplex.active == dyPRIMAL2) { statj = vstatSB ; valj = dy_x[j] ; } else { if (lbj > -dy_tols->inf) { statj = vstatNBLB ; valj = lbj ; } else { statj = vstatNBUB ; valj = ubj ; } } break ; } case vstatBUB: case vstatBUUB: { statj = vstatNBUB ; valj = ubj ; break ; } case vstatBLB: case vstatBLLB: { statj = vstatNBLB ; valj = lbj ; break ; } case vstatBFX: { statj = vstatNBFX ; valj = lbj ; break ; } case vstatBFR: { statj = vstatNBFR ; valj = dy_x[j] ; break ; } default: { errmsg(1,rtnnme,__LINE__) ; return (FALSE) ; } } switch (stati) { case vstatNBLB: { stati = vstatBLB ; break ; } case vstatNBUB: { stati = vstatBUB ; break ; } case vstatNBFX: { stati = vstatBFX ; break ; } default: { errmsg(1,rtnnme,__LINE__) ; return (FALSE) ; } } # ifndef DYLP_NDEBUG if (dy_opts->print.conmgmt >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n swapping %s (%d) %s -> ", consys_nme(dy_sys,'v',i,FALSE,NULL),i, dy_prtvstat(dy_status[i])) ; dyio_outfmt(dy_logchn,dy_gtxecho,"%s ",dy_prtvstat(stati)) ; dyio_outfmt(dy_logchn,dy_gtxecho,"<=> %s (%d) %s -> ", consys_nme(dy_sys,'v',j,FALSE,NULL),j, dy_prtvstat(dy_status[j])) ; dyio_outfmt(dy_logchn,dy_gtxecho,"%s.",dy_prtvstat(statj)) ; } # endif /* Tweak dy_basis, dy_var2basis, and dy_status to do the swap. The entries for x are going to disappear momentarily, but deactBLogPrimCon will want to examine them. If x is part of the reference frame, moving it to the nonbasic partition changes the composition of the PSE norms. The change in basis changes the DSE norms. */ dy_var2basis[j] = 0 ; dy_status[j] = statj ; if (dy_frame[j] == TRUE) dy_lp->simplex.init_pse = TRUE ; dy_x[j] = valj ; dy_lp->simplex.init_dse = TRUE ; dy_basis[i] = i ; dy_var2basis[i] = i ; dy_status[i] = stati ; /* Reality is altered. Call deactBLogPrimCon to do the heavy lifting. */ return (dy_deactBLogPrimCon(orig_sys,i)) ; } bool dy_deactBLogPrimCon (consys_struct *orig_sys, int i) /* This routine deactivates a primal constraint a with a basic logical x. The constraint could be loose, tight, or violated, depending on the value of the logical. What's important here is that we can easily fix up the basis because we'll be deleting one basis position and one basic variable. To make cleanup easier, if x does not already occupy basis position i, do a swap to make it so. Assuming m constraints and n variables (including logicals) before deletion, the pattern of motion becomes a --> deleted a --> a x --> deleted x --> x x --> x Once the constraint is deleted, we'll need to examine and correct the arrays dy_basis and dy_var2basis, as well as dy_origcons and dy_origvars. It's entirely possible to find that there are no constraints left after removing loose constraints. It follows that there will be no variables, and in fact we can end up with a completely empty constraint system. This is not uncommon deep in a branch-and-bound search tree, when dylp can be handed a system with many fixed variables. If we delete a logical that's part of the current PSE index, we need to correct the projected column norms. But ... in the context of dylp, there's a good chance we'll proceed from constraint deletion into dual simplex. So we'll just indicate that the column norms need to be initialized when we reenter primal simplex. Parameters: orig_sys: The original constraint system. i: The constraint to be deactivated. orig_sys is used only for printing, statistics, and paranoid checks, but it gives a nice symmetry with actBLogPrimCon. Returns: TRUE if deactivation succeeds, FALSE if there's an error. */ { int j,k,m,n,bposi,origi ; flags stati ; const char *rtnnme = "dy_deactBLogPrimCon" ; /* A little paranoia, mixed with prep. Check that i is valid, that we can locate a in the original system, and that the logical is basic. Also check the constraint invariant. */ m = dy_sys->concnt ; n = dy_sys->varcnt ; # ifdef DYLP_PARANOIA if (i <= 0 || i > m) { errmsg(102,rtnnme,"constraint",i,1,m) ; return (FALSE) ; } # endif stati = dy_status[i] ; bposi = dy_var2basis[i] ; # ifdef DYLP_PARANOIA if (flgoff(stati,vstatBASIC)) { errmsg(436,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, consys_nme(dy_sys,'c',i,TRUE,NULL),i,dy_prtvstat(stati)) ; return (FALSE) ; } if (bposi <= 0 || dy_basis[bposi] != i) { errmsg(330,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, consys_nme(dy_sys,'v',i,FALSE,NULL),i,dy_prtvstat(stati), bposi,dy_basis[bposi]) ; return (FALSE) ; } # endif origi = dy_actcons[i] ; # ifdef DYLP_PARANOIA if (orig_sys == NULL) { errmsg(2,rtnnme,"orig_sys") ; return (FALSE) ; } if (origi <= 0 || origi > orig_sys->concnt) { errmsg(102,rtnnme,"original constraint",origi,1,orig_sys->concnt) ; return (FALSE) ; } k = (orig_sys->concnt-dy_lp->sys.cons.unloadable) - (dy_lp->sys.cons.loadable+dy_sys->concnt) ; if (k != 0) { errmsg(444,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "constraint",orig_sys->concnt,dy_lp->sys.cons.unloadable, dy_lp->sys.cons.loadable,dy_sys->concnt,k) ; return (FALSE) ; } # endif # ifdef DYLP_STATISTICS if (dy_stats != NULL) dy_stats->cons.deactcnt[origi]++ ; # endif /* Before this entry is deleted, check if x is part of the PSE reference frame. If it is, indicate that we'll need to initialize the projected column norms the next time we enter primal simplex. */ if (dy_frame[i] == TRUE) dy_lp->simplex.init_pse = TRUE ; /* We've verified that the constraint is suitable for deletion. To make the basis touchup easier, ensure that x occupies basis position i by swapping with the current occupant. We don't need to set the new values in dy_basis and dy_var2basis (they're about to disappear, along with the ith entry of all other vectors attached to dy_sys). */ if (bposi != i) { k = dy_basis[i] ; dy_basis[bposi] = k ; dy_var2basis[k] = bposi ; } /* In a similar vein, if x is basic, and we will shift a to fill the hole left by deleting a, do a swap to ensure x is basic in pos'n m. Then the automatic compression of basis and var2basis will move them in tandem. One less complication to deal with after the fact. */ if (i < m) { k = dy_var2basis[m] ; if (k > 0 && k != m) { j = dy_basis[m] ; dy_var2basis[j] = k ; dy_basis[k] = j ; dy_var2basis[m] = m ; dy_basis[m] = m ; } } /* At this point, we can say the following: + Logical x occupies basis pos'n i and will be deleted along with constraint a + If logical x is basic, it occupies pos'n m. If logical x is nonbasic, then some variable x occupies basis pos'n m. It's possible that q = n. + If architectural x is basic, it occupies pos'n p. It's possible p = m. Now delete the constraint a. Mark it as inactive in origcons and then perform the actual deletion from dy_sys. Deletion of the associated logical x will occur automatically, as will shifts to compact the constraint system and the various attached arrays. In particular: + dy_basis and dy_actcons will be compacted as a is deleted. The information in pos'n m will be moved to pos'n i. + dy_var2basis and dy_actvars will be compacted as x is deleted. The information in pos'n m will be moved to pos'n i, and the information in pos'n n will be moved to pos'n m. */ k = dy_actcons[i] ; MARK_INACTIVE_CON(k) ; if (consys_delrow(dy_sys,i) == FALSE) { errmsg(112,rtnnme,dy_sys->nme,"delete","constraint", consys_nme(dy_sys,'c',i,FALSE,NULL),i) ; return (FALSE) ; } # ifdef DYLP_PARANOIA /* A few checks to make sure that things are in the expected places. If there are constraints remaining and a was not the last constraint, then the old constraint a should occupy position i. Similarly, if there are architecturals remaining, the old variable x should now be x. */ if (i <= dy_sys->concnt) { k = dy_actcons[i] ; if (dy_origcons[k] != m) { errmsg(1,rtnnme,__LINE__) ; return (FALSE) ; } } if (m <= dy_sys->varcnt) { k = dy_actvars[m] ; if (dy_origvars[k] != n) { errmsg(1,rtnnme,__LINE__) ; return (FALSE) ; } } # endif /* Now to repair the collateral damage. The trick is to avoid fixing things more than once. Let's start with the direct effects of constraint motion. If a was not the last constraint, a has been shifted to position i, and the associated slack x is now x. We need to correct origcons, var2basis, and basis. Avoid corrections that involve x; we'll get to them in the next block of code. */ if (i <= dy_sys->concnt) { k = dy_actcons[i] ; dy_origcons[k] = i ; k = dy_basis[i] ; if (k == m) { dy_basis[i] = i ; dy_var2basis[i] = i ; } else if (k != n) { dy_var2basis[k] = i ; } } /* If we shifted an architectural (which will happen unless there were none to shift), then we need to correct origvars, var2basis, and basis. Index shift is n -> m, and var2basis is compressed. So we check var2basis[m] to see if our architectural is basic. If it was basic in pos'n m, we need to change that to i, where the information now lives. Then go and correct the basis entry to contain our variable's new index. */ if (m <= dy_sys->varcnt) { k = dy_actvars[m] ; dy_origvars[k] = m ; bposi = dy_var2basis[m] ; if (bposi != 0) { if (bposi == m) { dy_basis[i] = m ; dy_var2basis[m] = i ; } else { dy_basis[bposi] = m ; } } } /* And finally, a little bookkeeping. */ dy_lp->sys.cons.loadable++ ; /* We're done. Do some printing, if requested, then return. */ # ifndef DYLP_NDEBUG if (dy_opts->print.conmgmt >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\tactive now %d x %d (%d+%d).", dy_sys->concnt,dy_sys->varcnt, dy_sys->archvcnt,dy_sys->concnt) ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tconstraint %s (%d) and logical deleted from pos'n %d.", consys_nme(orig_sys,'c',origi,FALSE,NULL),origi,i) ; if (i <= dy_sys->concnt) { k = dy_actcons[i] ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tconstraint %s (%d) shifted from pos'n %d, ", consys_nme(orig_sys,'c',k,FALSE,NULL),k,m) ; k = dy_basis[i] ; dyio_outfmt(dy_logchn,dy_gtxecho,"basis[%d] = %s (%d)", i,consys_nme(dy_sys,'v',k,FALSE,NULL),k) ; k = dy_var2basis[i] ; if (k != 0) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tbasis pos'n %d updated to %s (%d).", k,consys_nme(dy_sys,'v',dy_basis[k],FALSE,NULL), dy_basis[k]) ; } } if (m <= dy_sys->varcnt) { k = dy_actvars[m] ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tarchitectural %s (%d) shifted from pos'n %d.", consys_nme(orig_sys,'v',k,FALSE,NULL),k,n) ; k = dy_var2basis[m] ; if (k != 0) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tbasis pos'n %d updated to %s (%d).", k,consys_nme(dy_sys,'v',dy_basis[k],FALSE,NULL), dy_basis[k]) ; } } } # endif return (TRUE) ; } static bool deactBLogPrimConList (consys_struct *orig_sys, int cnt, int *acndxs) /* This routine is purely a shell to call deactBLogPrimCon for each of the indices in the vector acndxs. It performs minimal error checking, relying on checking in deactBLogPrimCon. Parameters: orig_sys: The original constraint system cnt: The number of indices in acndxs acndxs: Vector of constraint indices (0-based) orig_sys is used only for printing and paranoid checks, but it gives a nice symmetry with dy_actBLogPrimConList. Returns: TRUE if all constraints are successfully activated, FALSE otherwise */ { int k ; bool retval ; const char *rtnnme = "deactBLogPrimConList" ; # ifdef DYLP_PARANOIA if (acndxs == NULL) { errmsg(2,rtnnme,"acndxs") ; return (FALSE) ; } if (cnt <= 0 || cnt > dy_sys->concnt) { errmsg(5,rtnnme,"cnt",cnt) ; return (FALSE) ; } # endif /* To make sure consys doesn't shift constraints out from under us, we need to delete in nonincreasing order. */ qsort(&acndxs[0],cnt,sizeof(int),intcompare) ; retval = TRUE ; for (k = 0 ; k < cnt && retval == TRUE ; k++) { # ifndef DYLP_NDEBUG if (dy_opts->print.conmgmt >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n deactivating constraint %s (%d)", consys_nme(dy_sys,'c',acndxs[k],TRUE,NULL),acndxs[k]) ; } # endif retval = dy_deactBLogPrimCon(orig_sys,acndxs[k]) ; if (retval == FALSE) { errmsg(430,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "deactivate","constraint", consys_nme(dy_sys,'c',acndxs[k],TRUE,NULL),acndxs[k]) ; } } # ifdef DYLP_PARANOIA if (retval == TRUE) { retval = dy_chkdysys(orig_sys) ; } # endif return (retval) ; } static int scanPrimConStdAct (consys_struct *orig_sys, int **p_ocndxs) /* This routine scans the original constraint system looking for inactive constraints to add to the active system. There are two settings for opts.con.actlvl: 0: activate violated constraints 1: activate tight and violated constraints Parameters: orig_sys: The original constraint system p_ocndxs: (i) empty vector to hold constraint indices; assumed sufficiently large if non-NULL; if NULL, allocated if necessary (o) indices of constraints to be activated; may not be allocated if no constraints are identified Returns: number of candidates for activation, -1 if error. */ { int i,j,k,m,n,actcnt,cand_limit ; int *ocndxs ; double *orig_x,*orig_rhs,*orig_rhslow,*orig_vub,*orig_vlb ; double lhsi,rhsi,rhslowi ; contyp_enum *orig_ctyp,ctypi ; flags statj ; bool activate ; const char *rtnnme = "scanPrimConStdAct" ; # ifdef DYLP_PARANOIA if (orig_sys == NULL) { errmsg(2,rtnnme,"orig_sys") ; return (-1) ; } if (p_ocndxs == NULL) { errmsg(2,rtnnme,"&ocndxs") ; return (-1) ; } # endif m = orig_sys->concnt ; n = orig_sys->varcnt ; /* Did the client supply a vector for candidate indices? If not, make one. We shouldn't be here if there's no room to activate. Check this if we're paranoid. */ cand_limit = dy_lp->sys.cons.loadable ; # ifdef DYLP_PARANOIA if (cand_limit == 0) { errmsg(1,rtnnme,__LINE__) ; return (-1) ; } # endif if (dy_opts->con.actlim > 0) { cand_limit = minn(dy_opts->con.actlim,cand_limit) ; } if (*p_ocndxs == NULL) { ocndxs = (int *) MALLOC(cand_limit*sizeof(int)) ; } else { ocndxs = *p_ocndxs ; } /* Create a solution vector that matches orig_sys, to make the scan a bit more efficient. */ orig_vub = orig_sys->vub ; orig_vlb = orig_sys->vlb ; orig_x = (double *) CALLOC((n+1),sizeof(double)) ; for (j = 1 ; j <= n ; j++) { k = dy_origvars[j] ; if (k > 0) { orig_x[j] = dy_x[k] ; } else { statj = (flags) -k ; # ifdef DYLP_PARANOIA if (flgoff(statj,vstatNONBASIC|vstatNBFR)) { errmsg(433,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "inactive",consys_nme(orig_sys,'v',j,TRUE,NULL),j, dy_prtvstat(statj)) ; if (orig_x != NULL) FREE(orig_x) ; if (*p_ocndxs == NULL) FREE(ocndxs) ; return (-1) ; } # endif if (flgon(statj,vstatNBUB)) { orig_x[j] = orig_vub[j] ; } else if (flgon(statj,vstatNBLB|vstatNBFX)) { orig_x[j] = orig_vlb[j] ; } } } /* Now we can step through the constraints. Evaluate each loadable inactive constraint and check to see if it's violated. */ orig_ctyp = orig_sys->ctyp ; orig_rhs = orig_sys->rhs ; orig_rhslow = orig_sys->rhslow ; actcnt = 0 ; for (i = 1 ; i <= m && actcnt < cand_limit ; i++) { if (!LOADABLE_CON(i)) continue ; ctypi = orig_ctyp[i] ; lhsi = consys_dotrow(orig_sys,i,orig_x) ; setcleanzero(lhsi,dy_tols->zero) ; /* Check the lhs against the rhs. There are two levels of activation, specified by opts.con.actlvl: * strict (0) activates only when lhs < rhslow or lhs > rhs * tight (1) activates when lhs <= rhslow or lhs >= rhs */ rhsi = orig_rhs[i] ; if (ctypi == contypRNG) { rhslowi = orig_rhslow[i] ; } else if (ctypi == contypEQ) { rhslowi = rhsi ; } else { rhslowi = -dy_tols->inf ; } switch (dy_opts->con.actlvl) { case 0: { if (abovebnd(lhsi,rhsi) || belowbnd(lhsi,rhslowi)) { activate = TRUE ; } else { activate = FALSE ; } break ; } case 1: { if (!(belowbnd(lhsi,rhsi) && abovebnd(lhsi,rhslowi))) { activate = TRUE ; } else { activate = FALSE ; } break ; } default: { errmsg(1,rtnnme,__LINE__) ; if (orig_x != NULL) FREE(orig_x) ; if (*p_ocndxs == NULL) FREE(ocndxs) ; return (-1) ; } } # ifndef DYLP_NDEBUG if (activate == FALSE) { if (dy_opts->print.conmgmt >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n skipping %s constraint %s (%d), %g <= %g <= %g.", consys_prtcontyp(orig_ctyp[i]), consys_nme(orig_sys,'c',i,FALSE,NULL),i, rhslowi,lhsi,rhsi) ; } } else { if (dy_opts->print.conmgmt >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n queued %s constraint %s (%d),", consys_prtcontyp(orig_ctyp[i]), consys_nme(orig_sys,'c',i,FALSE,NULL),i) ; if (abovebnd(lhsi,rhsi)) { dyio_outfmt(dy_logchn,dy_gtxecho, " lhs - rhs = %g - %g = %g, tol %g.", lhsi,rhsi,lhsi-rhsi,dy_tols->zero*(1+fabs(rhsi))) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho, " rhslow - lhs = %g - %g = %g, tol %g.", rhslowi,lhsi,rhslowi-lhsi, dy_tols->zero*(1+fabs(rhslowi))) ; } } } # endif if (activate == TRUE) ocndxs[actcnt++] = i ; } if (orig_x != NULL) FREE(orig_x) ; /* If we supplied ocndxs and found no candidates to activate, free it. */ if (*p_ocndxs == NULL) { if (actcnt == 0) { FREE(ocndxs) ; } else { *p_ocndxs = ocndxs ; } } # ifndef DYLP_NDEBUG if (dy_opts->print.conmgmt >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n queued %d %s constraints for activation.",actcnt, dy_opts->con.actlvl == 0?"violated":"tight or violated") ; } # endif return (actcnt) ; } static int scanPrimConStdDeact (int **p_acndxs) /* This routine scans the active constraint system for constraints that are candidates for deactivation. The primary criterion is that the logical for the constraint must be basic. Within this group of candidates, selection is based on the value of opts.con.deactlvl: * 0: (normal) Queues for deactivation inequalities a which are strictly loose. Logicals x must be strictly within bound (status vstatB). The notion is that we've left these constraints behind and will never return. * 1: (aggressive) Adds inequalities a which are tight but the value of the associated dual variable y = 0. (Logicals x are at bound with status vstatBUB or vstatBLB.) The notion is that these inequalities aren't contributing (in terms of satisfying the dual, yA >= c) and are more than likely just loitering about being degenerate. * 2: (fanatic) Adds equalities a with y = 0. (Logicals (artificials) x have status vstatBFX.) Aimed at purging constraints in large set covering problems but has relatively little effect because it's hard to catch x with status vstatBFX. Likely should consider x with status NBFX. Needs more thought. Logicals always have at least one finite bound and should never have status vstatBFR. Logicals for a range constraint can have two finite bounds, but they should never be equal, so they can never have status vstatBFX. The logical (artificial) for a satisfied equality can only have status vstatBFX, but we'd be lucky to see it before dylp's pivoting priorities move it to the nonbasic partition, never to return. All of this means that we don't actually have to check constraint types, just look for the appropriate status codes. Parameters: p_acndxs: (i) empty vector to hold constraint indices; assumed sufficiently large if non-NULL; if NULL, allocated as necessary (o) indices of constraints to be deactivated; may not be allocated if no constraints are identified Returns: number of candidates for deactivation; -1 if error. Errors are possible only if we're paranoid. */ { int j,m,purgecnt ; int *acndxs ; flags statj ; bool purge ; const char *rtnnme = "scanPrimConStdDeact" ; # ifdef DYLP_PARANOIA if (p_acndxs == NULL) { errmsg(2,rtnnme,"&acndxs") ; return (-1) ; } # endif m = dy_sys->concnt ; if (*p_acndxs == NULL) { acndxs = (int *) MALLOC(m*sizeof(int)) ; } else { acndxs = *p_acndxs ; } /* Open a loop to search for candidates for deactivation. It's pretty straightforward, as all we need to do is examine the status of the logical and (perhaps) the dual. */ purgecnt = 0 ; for (j = 1 ; j <= m ; j++) { statj = dy_status[j] ; purge = FALSE ; if (flgon(statj,vstatB|vstatBLB|vstatBUB|vstatBFX)) { switch (dy_opts->con.deactlvl) { case 0: /* normal */ { if (flgon(statj,vstatB)) purge = TRUE ; break ; } case 1: /* aggressive */ { if (flgon(statj,vstatB) || (flgon(statj,vstatBLB|vstatBUB) && dy_y[j] == 0)) purge = TRUE ; break ; } case 2: /* fanatic */ { if (flgon(statj,vstatB) || (flgon(statj,vstatBLB|vstatBUB|vstatBFX) && dy_y[j] == 0)) purge = TRUE ; break ; } default: { errmsg(1,rtnnme,__LINE__) ; if (*p_acndxs == NULL && acndxs != NULL) FREE(acndxs) ; return (-1) ; } } } # ifndef DYLP_NDEBUG if (purge == FALSE) { if (dy_opts->print.conmgmt >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n skipped %s %s (%d), ", consys_prtcontyp(dy_sys->ctyp[j]), consys_nme(dy_sys,'c',j,TRUE,NULL),j) ; dyio_outfmt(dy_logchn,dy_gtxecho, "%s (%d) = %g, status %s, basis pos'n %d.", consys_nme(dy_sys,'v',j,TRUE,NULL),j, dy_x[j],dy_prtvstat(statj),dy_basis[j]) ; } } else { if (dy_opts->print.conmgmt >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n queued %s %s (%d), ", consys_prtcontyp(dy_sys->ctyp[j]), consys_nme(dy_sys,'c',j,TRUE,NULL),j) ; dyio_outfmt(dy_logchn,dy_gtxecho, "%s (%d) = %g, status %s, basis pos'n %d.", consys_nme(dy_sys,'v',j,TRUE,NULL),j, dy_x[j],dy_prtvstat(statj),dy_basis[j]) ; } } # endif if (purge == TRUE) { acndxs[purgecnt++] = j ; } } if (*p_acndxs == NULL) { if (purgecnt <= 0) { FREE(acndxs) ; } else { *p_acndxs = acndxs ; } } # ifndef DYLP_NDEBUG if (dy_opts->print.varmgmt >= 1) { const char *strat ; switch (dy_opts->con.deactlvl) { case 0: { strat = "normal" ; break ; } case 1: { strat = "aggressive" ; break ; } case 2: { strat = "fanatic" ; break ; } default: { strat = "invalid" ; break ; } } dyio_outfmt(dy_logchn,dy_gtxecho, "\n %s scan queued %d constraints for deactivation.", strat,purgecnt) ; } # endif return (purgecnt) ; } int dy_deactivateCons (consys_struct *orig_sys) /* This routine coordinates normal constraint deactivation in phase dyPURGECON. In addition to the actual scan and deactivation, it sees to rebuilding the basis and solution. The heavy lifting is performed in scanPrimConStdDeact and deactBLogPrimCon. See the comments at the head of the file for the effects on PSE and DSE norms. Parameters: orig_sys: The original constraint system orig_sys is used only for debug printing and paranoid checks. Still, it's really convenient to have it as a parameter and it provides a nice symmetry with activateCons. Returns: number of constraints deactivated; -1 if there's an error. */ { int *candidates,cand_cnt ; dyret_enum factorresult ; flags factorflags ; int retval ; const char *rtnnme = "dy_deactivateCons" ; retval = -1 ; /* Call scanPrimConStdDeact to return a list of candidates for deactivation. If we find candidates, try to deactivate them. */ candidates = NULL ; cand_cnt = scanPrimConStdDeact(&candidates) ; if (cand_cnt < 0) { errmsg(434,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "constraint","normal deactivation") ; } else if (cand_cnt > 0) { if (deactBLogPrimConList(orig_sys,cand_cnt,candidates) == TRUE) /* If we purged constraints and there are still some left, we need to refactor and recalculate the primal and dual variables. It has happened that the only tight constraints are variables at bound, so that no explicit constraints remain. Arguably this is overkill --- in most cases, we'll move to dyADDCON, add constraints, and refactor again. */ { if (dy_sys->concnt > 0) { factorflags = ladDUALS|ladPRIMALS ; # ifndef DYLP_NDEBUG if (dy_opts->print.conmgmt >= 3) dyio_outfmt(dy_logchn,dy_gtxecho,"\n refactoring ...") ; # endif factorresult = dy_factor(&factorflags) ; switch (factorresult) { case dyrOK: case dyrPATCHED: { retval = cand_cnt ; # ifndef DYLP_NDEBUG if (dy_opts->print.conmgmt >= 3) { if (factorresult == dyrOK) dyio_outfmt(dy_logchn,dy_gtxecho,"\n done.") ; else dyio_outfmt(dy_logchn,dy_gtxecho,"\n patched.") ; } # endif break ; } default: { retval = -1 ; # ifndef DYLP_NDEBUG if (dy_opts->print.conmgmt >= 3) dyio_outfmt(dy_logchn,dy_gtxecho,"\n failed.") ; # endif break ; } } } else { retval = cand_cnt ; } } else { retval = -1 ; } } else { retval = cand_cnt ; } if (candidates != NULL) FREE(candidates) ; # ifndef DYLP_NDEBUG if (dy_opts->print.conmgmt >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n %d constraints deactivated.",cand_cnt) ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n constraint system %s now %d x %d (%d + %d).", dy_sys->nme,dy_sys->concnt,dy_sys->varcnt,dy_sys->archvcnt, dy_sys->logvcnt) ; } # endif return (retval) ; } int dy_activateCons (consys_struct *orig_sys, bool with_vars) /* This routine coordinates normal constraint activation in phase dyADDCON. In addition to the actual scan and activation, it sees to rebuilding the basis and solution. The heavy lifting is performed in scanPrimConStdAct and actBLogPrimCon. See the comments at the head of the file for the algebra and (lack of) side effects associated with constraint activation without variable activation. Fortunately, if we're activating variables, too, the details are handled by the variable activation routines. Parameter: orig_sys: The original constraint system with_vars: If true, consider activating inactive variables associated with newly activated constraints. Returns: number of constraints activated; -1 if there's an error. */ { int *candidates,cand_cnt,*inactvars,inact_cnt ; int retval,var_retval ; bool actresult ; flags calcflgs ; dyret_enum factorresult ; const char *rtnnme = "dy_activateCons" ; retval = -1 ; /* Call scanPrimConStdAct to return a list of candidates for activation, then call actBLogPrimConList to install them. Installing nothing always succeeds. If with_vars == TRUE, pass in a pointer that will return loaded with a vector of indices of inactive variables referenced by the candidate constraints. */ candidates = NULL ; inactvars = NULL ; inact_cnt = 0 ; cand_cnt = scanPrimConStdAct(orig_sys,&candidates) ; if (cand_cnt < 0) { errmsg(434,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "constraint","normal activation") ; actresult = FALSE ; } else if (cand_cnt > 0) { if (with_vars == TRUE) { actresult = dy_actBLogPrimConList(orig_sys,cand_cnt, candidates,&inactvars) ; if (inactvars != NULL) { inact_cnt = inactvars[0] ; } } else { actresult = dy_actBLogPrimConList(orig_sys,cand_cnt, candidates,NULL) ; } } else { actresult = TRUE ; } if (candidates != NULL) FREE(candidates) ; if (actresult == FALSE) { if (inactvars != NULL) FREE(inactvars) ; return (retval) ; } /* If we added constraints, we need to refactor and recalculate the primal and dual variables. It's unlikely we'll have primal feasibility, but very likely we'll have dual feasibility. */ retval = cand_cnt ; if (cand_cnt > 0) { dy_lp->simplex.init_dse = TRUE ; # ifndef DYLP_NDEBUG if (dy_opts->print.conmgmt >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n factoring, calculating variables, ") ; dyio_outfmt(dy_logchn,dy_gtxecho,"and checking feasibility ...") ; } # endif calcflgs = ladFACTOR|ladPRIMFEAS|ladPFQUIET|ladDUALFEAS|ladDFQUIET ; factorresult = dy_accchk(&calcflgs) ; switch (factorresult) { case dyrOK: case dyrPATCHED: { retval = cand_cnt ; # ifndef DYLP_NDEBUG if (dy_opts->print.conmgmt >= 3) { if (factorresult == dyrOK) dyio_outfmt(dy_logchn,dy_gtxecho,"\n done.") ; else dyio_outfmt(dy_logchn,dy_gtxecho,"\n patched.") ; } # endif if (flgoff(calcflgs,ladDUALFEAS)) { dy_lp->simplex.next = dyDUAL ; } else if (flgoff(calcflgs,ladPRIMFEAS)) { dy_lp->simplex.next = dyPRIMAL2 ; } else { dy_lp->simplex.next = dyPRIMAL1 ; } break ; } default: { retval = -1 ; # ifndef DYLP_NDEBUG if (dy_opts->print.conmgmt >= 3) dyio_outfmt(dy_logchn,dy_gtxecho,"\n failed.") ; # endif break ; } } /* Are we activating referenced variables? If so, invoke the variable management routines. */ if (with_vars == TRUE && inact_cnt > 0) { var_retval = dy_activateVars(orig_sys,inactvars) ; if (var_retval < 0) { errmsg(440,rtnnme,dy_sys->nme, dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; retval = var_retval ; } } } if (inactvars != NULL) FREE(inactvars) ; # ifndef DYLP_NDEBUG if (dy_opts->print.conmgmt >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n activated %d constraints",cand_cnt) ; if (with_vars == TRUE) { dyio_outfmt(dy_logchn,dy_gtxecho, " with %d referenced variables",inact_cnt) ; } dyio_outchr(dy_logchn,dy_gtxecho,'.') ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n constraint system %s now %d x %d (%d + %d).", dy_sys->nme,dy_sys->concnt,dy_sys->varcnt,dy_sys->archvcnt, dy_sys->logvcnt) ; } # endif return (retval) ; } DyLP-1.6.0/DyLP/src/Dylp/dy_basis.c0000644000076700007670000012323411026315405013536 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2005 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains the interface layer between dylp and the glpk routines which maintain an LU factorization of the basis inverse. One of the nicer aspects of using glpk is that it uses the same convention for indexing as dylp: vector[0] is unused, and entries start with vector[1]. */ #define DYLP_INTERNAL #include "dylp.h" #include "glpinv.h" static char sccsid[] UNUSED = "@(#)dy_basis.c 4.6 11/06/04" ; static char svnid[] UNUSED = "$Id: dy_basis.c 240 2008-06-18 23:32:21Z lou $" ; /* The basis data structure. glpinv/glpluf does not distinguish between allocated capacity and actual basis size. So we cheat --- we allocate the size we want, to get vectors of the proper capacity, then reset the size fields so that glpinv/glpluf use only what's needed. */ static INV *luf_basis = NULL ; static int luf_capacity = 0 ; /* Basis patch structure. This structure is used to record changes to the basis when a singular basis is repaired. It's filled in by adjust_basis and then used by adjust_therest. Field Definition ----- ---------- pos the basis position that has changed out the variable removed from the basis in the variable inserted into the basis */ typedef struct { int pos ; int out ; int in ; } patch_struct ; /* Pivot selection during factoring glpinv/glpluf uses dynamic Markowitz pivot selection with partial (PTPS) threshold pivot selection. A pivot for row i must satisfy piv_tol*max{j}|a|. There are seven levels of pivot selection, as follows: stable look ------ ------- .01 4 .05 4 .1 4 .2 4 .4 6 .8 8 .95 10 The values for stable are based on guidelines in Suhl & Suhl, Computing Sparse LU Factorizations for Large-Scale Linear Programming Bases, ORSA Journal on Computing, v2(4), Fall, 1990. glpluf uses a default threshold of .1, and tightens to .3, then .7, before giving up. We're moving further at both extremes. Note that 1.0 is illegal, according to glpluf. glpinv/glpluf also provides for a heuristic limit on the number of pivot candidates considered. After k candidates have been examined, it returns the best so far. This parameter will affect sparsity (numerical stability must be satisfied by all pivots). As we get fussier about numerical stability, make glpluf look a bit harder for sparsity. What's implemented in practice is a table with the above values, and a subroutine which takes a parameter, delta, and raises (delta > 0) or lowers (delta < 0) the pivot selection parameters delta steps. Any large value of delta serves to slam the tolerances to one extreme or the other. There's also a static value, minpivlevel, which defaults to 0 but can be raised to deal with persistent accuracy problems. The routine dy_factor can tighten the pivot selection parameters if an attempt to factor the basis is aborted due to numerical instability. It does not loosen them, however --- this decision is left to higher levels. (In dylp, dy_accchk can raise and lower the current pivot selection parameters. Unexpected loss of accuracy or feasibility during preoptimality checks results in a boost to the minimum pivot level which remains in effect until the start of a new LP phase.) pivtols_struct Field Description ----- ----------- stable The pivot selection ratio. look The number of candidates considered. */ typedef struct { double stable ; int look ; } pivtols_struct ; static pivtols_struct pivtols[] = {{.01,4}, {.05,4}, {.1,4}, {.2,4}, {.4,6}, {.8,8}, {.95,10}} ; static int pivlevel,minpivlevel ; #define MAX_PIVLEVEL (((sizeof pivtols)/(sizeof(pivtols_struct)))-1) char *dy_prtpivparms (int lvl) /* Utility routine to construct a print string for a set of pivoting parameters. It exists just to keep things local to this file. Parameters: lvl: pivot level to print; if < 0, the current pivot level (as set in luf_basis) is printed Returns: pointer to a static character string */ { static char buffer[20] ; pivtols_struct pivtol ; # ifdef DYLP_PARANOIA const char *rtnnme = "dy_prtpivparms" ; if (luf_basis == NULL) { errmsg(2,rtnnme,"luf_basis") ; return ("<>") ; } # endif if (lvl < 0 || lvl > MAX_PIVLEVEL) { pivtol.stable = luf_basis->luf->piv_tol ; pivtol.look = luf_basis->luf->piv_lim ; } else { pivtol.stable = pivtols[lvl].stable ; pivtol.look = pivtols[lvl].look ; } dyio_outfxd(buffer,-19,'l',"PTPS(%.2f,%d)",pivtol.stable,pivtol.look) ; return (buffer) ; } bool dy_setpivparms (int curdelta, int mindelta) /* This routine exists to allow other parts of the lp code to adjust the pivot regimen used when the basis is factored. curdelta is the change in the current pivot level, mindelta the change in the minimum pivot level. A positive delta increases (tightens) the tolerances by delta steps, and a negative delta lowers (loosens) them. If either delta is 0, there's no change. A large positive or negative value slams the tolerance to the appropriate extreme. Parameters: curdelta: change to the current pivot level mindelta: change to the minimum pivot level Returns: TRUE if any change actually occurred, FALSE if we were already at the relevant limit(s) (BE CAREFUL interpreting the return value if you're changing both at once) */ { bool minretval,curretval ; # ifdef DYLP_PARANOIA const char *rtnnme = "dy_setpivparms" ; if (luf_basis == NULL) { errmsg(2,rtnnme,"luf_basis") ; return (FALSE) ; } # endif minretval = FALSE ; curretval = FALSE ; /* Adjust the minimum pivot level first. This may imply an adjustment in the current pivot level. */ if (mindelta != 0) { if ((minpivlevel <= 0 && mindelta < 0) || (minpivlevel >= MAX_PIVLEVEL && mindelta > 0)) { # ifndef DYLP_NDEBUG if ((dy_opts->print.basis >= 3) || (dy_opts->print.basis >= 2 && mindelta > 0)) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t min. pivot ratio unchanged at %s (%d)", dy_prtpivparms(minpivlevel),minpivlevel) ; } # endif } else { minretval = TRUE ; minpivlevel += mindelta ; if (minpivlevel < 0) minpivlevel = 0 ; else if (minpivlevel > MAX_PIVLEVEL) minpivlevel = MAX_PIVLEVEL ; if (pivlevel < minpivlevel) curdelta = maxx(curdelta,(minpivlevel-pivlevel)) ; # ifndef DYLP_NDEBUG if (dy_opts->print.basis >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t setting min. pivot ratio to %s (%d)", dy_prtpivparms(minpivlevel),minpivlevel) ; } # endif } } /* Adjust the current pivot level. */ if (curdelta != 0) { if ((pivlevel <= minpivlevel && curdelta < 0) || (pivlevel >= MAX_PIVLEVEL && curdelta > 0)) { # ifndef DYLP_NDEBUG if ((dy_opts->print.basis >= 3) || (dy_opts->print.basis >= 2 && mindelta > 0)) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t cur. pivot ratio unchanged at %s (%d)", dy_prtpivparms(-1),pivlevel) ; } # endif } else { curretval = TRUE ; pivlevel += curdelta ; if (pivlevel < minpivlevel) pivlevel = minpivlevel ; else if (pivlevel > MAX_PIVLEVEL) pivlevel = MAX_PIVLEVEL ; luf_basis->luf->piv_tol = pivtols[pivlevel].stable ; luf_basis->luf->piv_lim = pivtols[pivlevel].look ; # ifndef DYLP_NDEBUG if (dy_opts->print.basis >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t setting cur. pivot ratio to %s (%d)", dy_prtpivparms(-1),pivlevel) ; } # endif } } if (curretval == FALSE && minretval == FALSE) return (FALSE) ; else return (TRUE) ; } double dy_chkpiv (double abarij, double maxabar) /* This routine checks that the pivot element satisfies a stability test. The stability test is |abarij/maxabar| > dy_tols->pivot*piv_tol The motivation for the check is to try and choose reasonably stable pivots --- inv_update will do what we tell it, might as well try to choose half wisely. Balance that against the desire to make progress toward the optimum. Setting dy_tols->pivot to 1 would give the same selection criteria as is used during factorization. Parameters: abarij: the pivot element (only the absolute value is used) maxabar: (primal) max{i} |abar| (dual) max{j} |abar| Returns: |abarij/(dy_tols->pivot*piv_tol*maxabar)| return value < 1.0 indicates an unstable pivot */ { double ratio,abspiv,stable ; # if defined(DYLP_PARANOIA) || !defined(DYLP_NDEBUG) const char *rtnnme = "dy_chkpiv" ; # endif # ifdef DYLP_PARANOIA if (luf_basis == NULL) { errmsg(2,rtnnme,"luf_basis") ; return (dyrFATAL) ; } # endif /* In some instances (for example, netlib/grow22), we run into trouble because column coefficients inflate to outrageous values --- 1.0e18, for example. Take the attitude that any pivot s.t. |abar > 1.0| should be accepted, to give a bit more choice in pivot selection. To do this, lie about the stability ratio, */ abspiv = fabs(abarij) ; ratio = dy_tols->pivot*luf_basis->luf->piv_tol ; stable = ratio*maxabar ; # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 1) { if (abspiv/stable < 1.0) dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: %s pivot = %g < %g; column max = %g, ratio = %g.", rtnnme,(abspiv < 1.0)?"rejecting":"tolerating", abarij,stable,maxabar,ratio) ; } # endif if (abspiv/stable >= 1.0) return (abspiv/stable) ; else if (abspiv >= 1.0) return (1.0) ; else return (abspiv/stable) ; } void dy_initbasis (int concnt, int factor, double zero_tol) /* This routine calls the glpk routine inv_create to initialize the basis data structures, then sets values for the zero tolerance (eps_tol), pivot ratio (piv_tol) and number of candidates examined (piv_lim). NOTE: This routine can be (and typically is) called before any of the main dylp data structures exist. Be careful what you reference. Parameters: concnt: the number of constraints (rows) that the basis representation should be capable of handling factor: the planned refactorisation frequency; passed to glpk as the basis inverse update capacity (i.e., the limit on the number of pivots between refactorisations) zero_tol: zero tolerance; a value of 0.0 uses the glpk default (INV->LUF->eps_tol = 1.0e-15). Returns: void */ { int sva_size ; const char *rtnnme = "dy_initbasis" ; /* Create the basis. Allow for at least five constraints (also handles pathological examples with no explicit constraints). */ luf_capacity = maxx(concnt,5) ; luf_basis = inv_create(luf_capacity,factor) ; if (luf_basis == NULL) { if (dy_lp == NULL) { errmsg(302,rtnnme,"empty","pre-init",0,"create") ; } else { errmsg(302,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,"create") ; } return ; } /* WARNING: We're going to reach inside glpluf to get it to triple the amount of space that it allocates for the sparse vector area. We're doing this by triggering the reallocation mechanism built into luf_decomp (called by inv_decomp). */ sva_size = luf_basis->luf->sv_size ; luf_basis->luf->new_sva = 3*sva_size ; # ifndef DYLP_NDEBUG if (dy_opts != NULL && dy_opts->print.basis >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\ninitbasis: %s(%d) basis capacity %d, piv lim %d.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, luf_basis->luf->n,luf_basis->hh_max) ; } /* XX_DEBUG_XX There's no good way to control this output, given the timing of the call (before dy_opts is initialised), but it's sometimes useful when debugging. else { dyio_outfmt(dy_logchn,TRUE, "\ninitbasis: EXTERN(0) basis capacity %d, piv lim %d.", luf_basis->luf->n,luf_basis->hh_max) ; } */ # endif /* Set the initial pivot level to {.01,4}, and allow it to drop to {.01,4}. */ pivlevel = 0 ; minpivlevel = 0 ; if (zero_tol != 0.0) luf_basis->luf->eps_tol = zero_tol ; luf_basis->luf->piv_tol = pivtols[pivlevel].stable ; luf_basis->luf->piv_lim = pivtols[pivlevel].look ; luf_basis->luf->max_gro = 1.0e7 ; /* This is the smallest value that can appear on the diagonal of U after a pivot update. dylp will (in extremis) drop its pivot selection tolerance tols.pivot to 1e-9 (or thereabouts), so upd_tol had better be less or we spend a lot of time refactoring. This should probably be adjusted as needed, in response to adjustments in tols.pivot, but I need to sit down and really think about the math. In the meantime, this seems to be adequate. */ luf_basis->upd_tol = 1.0e-10 ; return ; } void dy_freebasis (void) /* This routine calls inv_delete to clean up the space allocated for the basis representation, then free_lib_env to clean up the library. Parameters: none Returns: undefined */ { /* glplib2.c */ extern int dy_glp_free_lib_env(void) ; if (luf_basis != NULL) { inv_delete(luf_basis) ; luf_basis = NULL ; } (void) dy_glp_free_lib_env() ; return ; } static void luf_adjustsize (void) /* This routine sets the proper working size in the basis. It also checks that the allocated capacity of the basis is sufficient for the current size of the constraint system and increases it if necessary. Parameters: none Returns: undefined */ { double upd_tol,piv_tol,zero_tol,max_gro ; int factor,look,capacity ; # ifndef DYLP_NDEBUG int oldcapacity ; # endif /* Check that we're within the allocated limits, and resize if necessary. Preserve the tolerance settings that we may have tweaked. */ if (dy_sys->concnt > luf_capacity) { factor = luf_basis->hh_max ; upd_tol = luf_basis->upd_tol ; zero_tol = luf_basis->luf->eps_tol ; piv_tol = luf_basis->luf->piv_tol ; look = luf_basis->luf->piv_lim ; max_gro = luf_basis->luf->max_gro ; # ifndef DYLP_NDEBUG oldcapacity = luf_basis->m ; # endif dy_freebasis() ; capacity = (int) (dy_sys->concnt*1.5) ; dy_initbasis(capacity,factor,zero_tol) ; luf_basis->upd_tol = upd_tol ; luf_basis->luf->eps_tol = zero_tol ; luf_basis->luf->piv_tol = piv_tol ; luf_basis->luf->piv_lim = look ; luf_basis->luf->max_gro = max_gro ; # ifndef DYLP_NDEBUG if (dy_opts->print.basis >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n increased basis capacity from %d to %d constraints", oldcapacity,luf_basis->m) ; dyio_outfmt(dy_logchn,dy_gtxecho,", piv lim %d.",luf_basis->hh_max) ; } # endif } /* Now set the working size. */ luf_basis->m = dy_sys->concnt ; luf_basis->luf->n = dy_sys->concnt ; return ; } void dy_ftran (double *col, bool save) /* This is a shell that calls inv_ftran to perform inv(B)*col. Glpk does not set clean zeros based on its internal zero tolerance, so the returned vector will in general have values < dy_tols->zero. But it's not clear we want to clean them off here. Parameter: col: The column vector to be ftran'ed. save: This will be the entering column in the next pivot, and the basis maintenance code should remember it (as the implicit parameter to the pivot). Returns: undefined */ { int isave ; if (save == TRUE) isave = 1 ; else isave = 0 ; inv_ftran(luf_basis,col,isave) ; return ; } void dy_btran (double *col) /* This is a shell that calls inv_btran to perform col*inv(B). As with ftran, the returned vector is not necessarily clean. Parameter: col: The column vector to be btran'ed. Returns: undefined */ { inv_btran(luf_basis,col) ; return ; } static void adjust_basis (int *p_patchcnt, patch_struct **p_patches) /* This routine corrects the dylp basis arrays when glpinv/glpluf declares the current basis to be singular. glpluf doesn't actually salvage the basis --- it just reports the linearly dependent (hence unpivoted) columns and corresponding unpivoted rows. Once we've adjusted the basis accordingly, we can make another attempt to factor. The convention is as follows: luf_basis.rank gives the rank of the basis. qq_col[rank+1 .. m] contain the indices of the basic columns that must be removed from the basis. pp_row[rank+1 .. m] contain the indices of the basic rows that remain unpivoted; we'll put the logicals for these rows into the basis. Both of the above are expressed in terms of basis positions. For the rows, basis position i is equivalent to constraint i; for the columns, we need to look up the variable j in basis position i. Recognise that in general this is the easiest part of salvaging the situation. We record the changes for adjust_therest, which will do the remainder of the work after the basis is successfully factored. Parameters: p_patchcnt: (o) the number of basis corrections p_patches: (o) patch array recording the basis corrections Returns: undefined */ { int *qq_col, *pp_row ; int rank,pqndx,i,j,k,pndx ; patch_struct *patches ; #ifdef DYLP_PARANOIA const char *rtnnme = "adjust_basis" ; if (dy_sys == NULL) { errmsg(2,rtnnme,"dy_sys") ; return ; } if (dy_basis == NULL) { errmsg(2,rtnnme,"basis") ; return ; } if (dy_var2basis == NULL) { errmsg(2,rtnnme,"var2basis") ; return ; } if (luf_basis == NULL) { errmsg(2,rtnnme,"LUF basis") ; return ; } if (p_patches == NULL) { errmsg(2,rtnnme,"p_patches") ; return ; } #endif qq_col = luf_basis->luf->qq_col ; pp_row = luf_basis->luf->pp_row ; rank = luf_basis->luf->rank ; patches = (patch_struct *) MALLOC((dy_sys->concnt-rank)*sizeof(patch_struct)) ; /* Walk qq_col, retrieving the basis position that must be corrected. Remove the corresponding variable from the basis, and put in its place the slack for the basis row. */ for (pqndx = rank+1, pndx = 0 ; pqndx <= dy_sys->concnt ; pqndx++, pndx++) { k = qq_col[pqndx] ; j = dy_basis[k] ; i = pp_row[pqndx] ; dy_basis[k] = i ; dy_var2basis[j] = 0 ; dy_var2basis[i] = k ; patches[pndx].pos = k ; patches[pndx].out = j ; patches[pndx].in = i ; # ifndef DYLP_NDEBUG if (dy_opts->print.basis >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n pos'n %d (%s (%d)) replacing %s (%d) with %s (%d).", k,consys_nme(dy_sys,'c',k,FALSE,NULL),k, consys_nme(dy_sys,'v',j,FALSE,NULL),j, consys_nme(dy_sys,'v',i,FALSE,NULL),i) ; } # endif } *p_patchcnt = pndx ; *p_patches = patches ; return ; } static dyret_enum adjust_therest (int patchcnt, patch_struct *patches) /* We're here because we've successfully patched a singular basis. The patches array contains entries of the form , x>, where x has just been kicked out of the basis and replaced by x. The basis and var2basis vectors are already corrected (we needed them to complete the factorization). Now we need to adjust other dylp data structures to reflect the unexpected change. The amount of additional work to be done depends on the phase of the simplex algorithm. dyINIT: We're done. We've just factored the initial basis and none of the other data structures have been initialised. We didn't really need this call, but the code is cleaner this way. If we're farther along, we might be in the middle of simplex (dyPRIMAL1, dyPRIMAL2, or dyDUAL), or we might be manipulating the constraint system. If we're running simplex, the first actions are cleanup: clear the pivot reject list and back out any antidegeneracy activity. Next, set the status of the newly nonbasic variables, consistent with their previous status. The general rule is to perturb the solution as little as possible. If we're in a primal or dual simplex phase, try to make decisions that are compatible with primal or dual feasibility. Two specific points: * Superbasic (SB) variables are only created in dyPRIMAL2. * Nonbasic free (NBFR) variables imply loss of dual feasibility. Once we have nonbasic status set, we can calculate new primals, duals, and reduced costs and fine-tune the status of the newly basic variables. If we've arrived here from one of the constraint system manipulation phases, there will almost certainly be duplication of effort once we return. But hey, how often does a basis patch happen, anyway? If we're in a simplex phase, there's still some work to do to make the patch as transparent as possible. For dual simplex, we'll check the status of the nonbasic variables and try to maintain dual feasibility. This may not be possible. If we do maintain dual feasibility, reset the DSE norms. For primal simplex, we need to reset the PSE norms. Parameters: patchcnt: the number of basis changes patches: array of basis changes Returns: dyrOK if the repair proceeds without error, dyrLOSTDFEAS if feasibility is lost in dual phase II, and dyrFATAL if anything else goes wrong. */ { int i,j,pndx ; pkvec_struct *aj ; flags statj ; dyret_enum retval ; dyphase_enum phase ; double valj,cbarj,*vub,*vlb,*obj ; const char *rtnnme = "adjust_therest" ; # ifndef DYLP_NDEBUG flags stati ; double vali ; # endif # ifdef DYLP_PARANOIA if (dy_sys == NULL) { errmsg(2,rtnnme,"dy_sys") ; return (dyrFATAL) ; } if (dy_basis == NULL) { errmsg(2,rtnnme,"basis") ; return (dyrFATAL) ; } if (dy_var2basis == NULL) { errmsg(2,rtnnme,"var2basis") ; return (dyrFATAL) ; } if (patches == NULL) { errmsg(2,rtnnme,"patch") ; return (dyrFATAL) ; } # endif phase = dy_lp->phase ; # ifdef DYLP_PARANOIA if (!(phase == dyINIT || phase == dyADDVAR || phase == dyADDCON || phase == dyPRIMAL1 || phase == dyPRIMAL2 || phase == dyDUAL || phase == dyFORCEPRIMAL || phase == dyFORCEDUAL)) { errmsg(1,rtnnme,__LINE__) ; return (dyrFATAL) ; } if (!(phase == dyINIT)) { if (dy_status == NULL) { errmsg(2,rtnnme,"status") ; return (dyrFATAL) ; } if (dy_x == NULL) { errmsg(2,rtnnme,"x") ; return (dyrFATAL) ; } if (dy_xbasic == NULL) { errmsg(2,rtnnme,"x") ; return (dyrFATAL) ; } } #endif if (phase == dyINIT) return (dyrOK) ; vlb = dy_sys->vlb ; vub = dy_sys->vub ; obj = dy_sys->obj ; aj = NULL ; retval = dyrOK ; /* If we're in one of the simplex phases, back out any antidegeneracy activity and clear the pivot rejection list. It's easiest to clear the pivot reject list ahead of the status modifications so that we don't have to worry about the NOPIVOT qualifier when checking status values. */ if (phase == dyPRIMAL1 || phase == dyPRIMAL2 || phase == dyDUAL) { if (dy_clrpivrej(NULL) != TRUE) return (dyrFATAL) ; if (dy_lp->degen > 0) { if (phase == dyDUAL) { (void) dy_dualdegenout(0) ; } else { (void) dy_degenout(0) ; } } } /* Now correct the status for newly nonbasic variables. We need to correct dy_x if the status change forces a change in value. If we end up with a NBFR variable, we've lost dual feasibility. While we're walking the patches, set the status for x (the newly basic variable) to vstatB. No need to be more precise at this point. */ for (pndx = 0 ; pndx < patchcnt ; pndx++) { i = patches[pndx].in ; # ifndef DYLP_NDEBUG stati = dy_status[i] ; vali = dy_x[i] ; # endif dy_status[i] = vstatB ; j = patches[pndx].out ; statj = dy_status[j] ; valj = dy_x[j] ; switch (statj) { case vstatBLLB: { dy_status[j] = vstatNBLB ; dy_x[j] = vlb[j] ; break ; } case vstatBLB: { dy_status[j] = vstatNBLB ; break ; } case vstatB: { if (phase == dyPRIMAL2) dy_status[j] = vstatSB ; else if (valj-vlb[j] < vub[j]-valj) { dy_status[j] = vstatNBLB ; dy_x[j] = vlb[j] ; } else { dy_status[j] = vstatNBUB ; dy_x[j] = vub[j] ; } break ; } case vstatBUB: { dy_status[j] = vstatNBUB ; break ; } case vstatBUUB: { dy_status[j] = vstatNBUB ; dy_x[j] = vub[j] ; break ; } case vstatBFX: { dy_status[j] = vstatNBFX ; break ; } case vstatBFR: { dy_status[j] = vstatNBFR ; if (phase == dyDUAL) { # ifndef DYLP_NDEBUG if (dy_opts->print.dual >= 1) { warn(346,rtnnme, dy_sys->nme,dy_prtlpphase(phase,TRUE),dy_lp->tot.iters+1, dy_prtvstat(statj),consys_nme(dy_sys,'v',j,FALSE,NULL),j) ; } # endif retval = dyrLOSTDFEAS ; } break ; } default: { errmsg(380,rtnnme,dy_sys->nme,consys_nme(dy_sys,'v',j,FALSE,NULL),j, dy_prtvstat(statj),"basic") ; return (dyrFATAL) ; } } # ifndef DYLP_NDEBUG if (dy_opts->print.basis >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t%s (%d) had status %s, value %g, ", consys_nme(dy_sys,'v',i,FALSE,NULL),i, dy_prtvstat(stati),vali) ; dyio_outfmt(dy_logchn,dy_gtxecho,"now status %s.", dy_prtvstat(dy_status[i])) ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t%s (%d) had status %s, value %g, ", consys_nme(dy_sys,'v',j,FALSE,NULL),j, dy_prtvstat(statj),valj) ; dyio_outfmt(dy_logchn,dy_gtxecho,"now status %s, value %g.", dy_prtvstat(dy_status[j]),dy_x[j]) ; } # endif } # ifdef DYLP_PARANOIA /* If paranoid checks are in place, we need agreement between dy_status, dy_x, and dy_xbasic, lest dy_calccbar fail. Call dy_calcprimals and dy_setbasicstatus to get the basic status right. This is restricted to paranoid mode because the proper place to do this is after making corrections to nonbasic status for dual feasibility. */ if (dy_calcprimals() == FALSE) return (dyrFATAL) ; dy_setbasicstatus() ; # endif /* Calculate the duals and reduced costs. */ dy_calcduals() ; if (dy_calccbar() == FALSE) { errmsg(384,rtnnme, dy_sys->nme,dy_prtlpphase(phase,TRUE),dy_lp->tot.iters) ; return (dyrFATAL) ; } /* If we're in phase dyDUAL, it's worth a scan to check dual feasibility and make adjustments to maintain it, if possible. (retval = dyrLOSTDFEAS says we introduced a NBFR variable, in which case we have no hope). Open a loop to scan the nonbasic variables. NBFX variables are always dual feasible, NBFR variables are never dual feasible. We're minimising, so dual feasibility (primal optimality) is cbarj < 0 && x at upper bound, or cbarj > 0 && x at lower bound. It's important that the zero tolerance for cbar here be the same as the one used in dy_dualin when it checks for loss of dual feasibility. */ if (phase == dyDUAL && retval != dyrLOSTDFEAS) { for (j = 1 ; j <= dy_sys->varcnt ; j++) { statj = dy_status[j] ; if (flgon(statj,vstatBASIC|vstatNBFX)) continue ; if (flgon(statj,vstatNBFR)) { retval = dyrLOSTDFEAS ; # ifndef DYLP_NDEBUG cbarj = dy_cbar[j] ; if (dy_opts->print.dual >= 1) { warn(347,rtnnme, dy_sys->nme,dy_prtlpphase(phase,TRUE),dy_lp->tot.iters+1, consys_nme(dy_sys,'v',j,FALSE,NULL),j, dy_prtvstat(statj),j,cbarj,dy_tols->dfeas) ; } # endif break ; } cbarj = dy_cbar[j] ; if (cbarj < -dy_tols->dfeas && flgoff(statj,vstatNBUB)) { if (vub[j] >= dy_tols->inf) { # ifndef DYLP_NDEBUG if (dy_opts->print.dual >= 1) { warn(347,rtnnme, dy_sys->nme,dy_prtlpphase(phase,TRUE),dy_lp->tot.iters+1, consys_nme(dy_sys,'v',j,FALSE,NULL),j, dy_prtvstat(statj),j,cbarj,dy_tols->dfeas) ; } # endif retval = dyrLOSTDFEAS ; break ; } else { dy_status[j] = vstatNBUB ; dy_x[j] = vub[j] ; } } else if (cbarj > dy_tols->dfeas && flgoff(statj,vstatNBLB)) { if (vlb[j] >= dy_tols->inf) { # ifndef DYLP_NDEBUG if (dy_opts->print.dual >= 1) { warn(347,rtnnme, dy_sys->nme,dy_prtlpphase(phase,TRUE),dy_lp->tot.iters+1, consys_nme(dy_sys,'v',j,FALSE,NULL),j, dy_prtvstat(statj),j,cbarj,dy_tols->dfeas) ; } # endif retval = dyrLOSTDFEAS ; break ; } else { dy_status[j] = vstatNBLB ; dy_x[j] = vlb[j] ; } } # ifndef DYLP_NDEBUG if (dy_opts->print.basis >= 3 && dy_status[j] != statj) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tchanged status of %s (%d) from %s to", consys_nme(dy_sys,'v',j,FALSE,NULL),j,dy_prtvstat(statj)) ; dyio_outfmt(dy_logchn,dy_gtxecho, " %s to maintain dual feasibility; cbar = %g.", dy_prtvstat(dy_status[j]),cbarj) ; } # endif } } /* The dual variables and reduced costs have been recalculated, and we have the final status for all nonbasic variables. Recalculate the primal variables and set the status of the basic variables. */ if (dy_calcprimals() == FALSE) return (dyrFATAL) ; dy_setbasicstatus() ; /* If we're running primal simplex, reset the PSE reference frame. If we're running dual simplex and haven't lost dual feasibility, recalculate the basis inverse row norms. */ if (phase == dyPRIMAL1 || phase == dyPRIMAL2) { dy_pseinit() ; } else if (phase == dyDUAL && retval != dyrLOSTDFEAS) { dy_dseinit() ; } return (retval) ; } static int factor_loadcol (void *p_consys, int i, int *rndx, double *coeff) /* This routine is used by luf_decomp to load columns of the basis into its internal data structure. The requirements are that it load rndx[] and coeff[] with the row indices and coefficients, respectively, of column i of the basis, returning the number of coefficients. Here, we need to look up the index j of the variable that actually occupies basis position i, retrieve the column, and load it into rndx and coeff. Parameters: p_consys: a consys_struct i: basis index rndx: (o) row indices i of coefficients a coeff: (o) coefficients a Returns: number of coefficients, or -1 in the event of an error. */ { int j,vecndx,pkndx ; double aij ; pkvec_struct *aj ; consys_struct *consys ; const char *rtnnme = "factor_loadcol" ; # ifdef DYLP_PARANOIA if (p_consys == NULL) { errmsg(2,rtnnme,"consys") ; return (-1) ; } if (rndx == NULL) { errmsg(2,rtnnme,"row index vector") ; return (-1) ; } if (coeff == NULL) { errmsg(2,rtnnme,"coefficient") ; return (-1) ; } # endif consys = (consys_struct *) p_consys ; aj = pkvec_new(consys->maxcollen) ; /* Retrieve the column ... */ j = dy_basis[i] ; if (consys_getcol_pk(consys,j,&aj) == FALSE) { errmsg(112,rtnnme,dy_sys->nme,"retrieve","column", consys_nme(dy_sys,'v',j,FALSE,NULL),j) ; if (aj != NULL) pkvec_free(aj) ; return (-1) ; } /* ... and load it into the return vectors rndx and coeff. */ vecndx = 1 ; for (pkndx = 0 ; pkndx < aj->cnt ; pkndx++) { aij = aj->coeffs[pkndx].val ; if (aij != 0.0) { rndx[vecndx] = aj->coeffs[pkndx].ndx ; coeff[vecndx] = aij ; vecndx++ ; } } /* Clean up and return. */ pkvec_free(aj) ; return (vecndx-1) ; } dyret_enum dy_factor (flags *calcflgs) /* This routine orchestrates the LU factorisation of the basis. The glpk routines do the grunt work. This routine provides the intelligence. If inv_decomp aborts the attempt to factor due to numerical instability, we tighten the pivot selection parameters one notch and try again, giving up only when no further increase is possible. The sequence of values for the pivot selection parameters are defined in a table at the top of this file. If inv_decomp aborts the attempt to factor because the basis is singular, we correct the basis with adjust_basis and take another run at factoring. In the event that the basis is successfully patched, we have serious work to do. See the comments with adjust_therest for further information. If the user has for some reason disabled basis patching, we return dyrSINGULAR. inv_decomp (actually, luf_decomp) is self-expanding --- if more space is needed to hold the factorization, the expansion is handled internally. dylp uses ladEXPAND to force basis expansion after a pivot fails due to lack of space. In glpk, inv_update will set instructions in the basis structure and luf_decomp will handle the expansion, so ladEXPAND is redundant. No action need be taken in this routine. It's also not possible to tell if the basis has been expanded, so ladEXPAND is not set on output. Parameters: calcflgs: (i) ladPRIMALS indicates the primal variables should be recalculated after factoring the basis. ladDUALS indicates the dual variables should be recalculated after factoring the basis. ladEXPAND indicates that the basis should be expanded prior to refactoring. (o) flags are set to indicate if the corresponding variables have been recalculated. Returns: dyrOK if the basis is factored without incident dyrPATCHED if the basis was singular and has been repaired dyrSINGULAR if the basis was singular and has not been repaired dyrNUMERIC if factoring failed for the strictest pivoting regimen dyrFATAL for other fatal errors NOTE: glpinv/glpluf will crash and burn if they encounter what they consider to be a fatal error, rather than returning a fatal error code. This needs to be addressed at some point. In particular, failure to expand the basis, failure to load the basis from the constraint system, and various parameter errors fall into this category. */ { int retval,patchcnt ; bool try_again,patched ; dyret_enum retcode ; patch_struct *patches ; const char *rtnnme = "dy_factor" ; #ifdef DYLP_PARANOIA if (dy_sys == NULL) { errmsg(2,rtnnme,"dy_sys") ; return (dyrFATAL) ; } if (dy_basis == NULL) { errmsg(2,rtnnme,"basis") ; return (dyrFATAL) ; } #endif # ifdef DYLP_STATISTICS if (dy_stats != NULL) { int pivcnt ; pivcnt = dy_lp->tot.pivs-dy_stats->factor.prevpiv ; dy_stats->factor.avgpivs = dy_stats->factor.avgpivs*dy_stats->factor.cnt ; dy_stats->factor.avgpivs += pivcnt ; dy_stats->factor.cnt++ ; dy_stats->factor.avgpivs /= dy_stats->factor.cnt ; if (pivcnt > dy_stats->factor.maxpivs) dy_stats->factor.maxpivs = pivcnt ; dy_stats->factor.prevpiv = dy_lp->tot.pivs ; } # endif retcode = dyrINV ; patchcnt = 0 ; patches = NULL ; /* Call luf_adjustsize to set the actual size of the basis. If the allocated capacity is too small, it will be expanded. */ luf_adjustsize() ; /* Open a loop for factorisation attempts. We'll persist in the face of numerical stability problems as long as there's room to tighten the pivot selection. At present, glpinv/glpluf will crash and burn if they encounter fatal problems. The basis load is implicit --- the routine factor_loadcol is called from luf_decomp to load up the coefficients. */ try_again = TRUE ; patched = FALSE ; while (try_again) { retval = inv_decomp(luf_basis,dy_sys,factor_loadcol) ; # ifndef DYLP_NDEBUG if ((retval == 0 && dy_opts->print.basis >= 4) || (retval > 0 && dy_opts->print.basis >= 2)) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: factored with %s, basis stability %g.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, dy_prtpivparms(-1),luf_basis->min_vrratio) ; } # endif /* Deal with the result. A return code of 0 means there were no difficulties; 1 says the basis was singular and had to be patched before the factorisation could be completed. Either is success, and we're done. */ switch (retval) { case 0: { try_again = FALSE ; retcode = dyrOK ; break ; } /* Alas, the failures. If the problem is a singular basis (retval = 1), fix up the basis structures as indicated in the luf_basis structure and try again to factor the basis, unless the user has forbidden it. If the problem is numerical instability (retval = 2) try to make the pivot selection more stringent, and keep trying until we can try no more, at which point we'll return numeric instability to the caller. What's left is fatal confusion; pass the buck back to the caller. */ case 1: { if (dy_opts->patch == FALSE) { errmsg(308,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,dy_prtdyret(dyrSINGULAR)) ; clrflg(*calcflgs,ladPRIMALS|ladDUALS) ; return (dyrSINGULAR) ; } # ifndef DYLP_NDEBUG if (dy_opts->print.basis >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: attempting to patch singular basis.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; } # endif adjust_basis(&patchcnt,&patches) ; patched = TRUE ; break ; } case 2: { retcode = dyrNUMERIC ; # ifndef DYLP_NDEBUG if (dy_opts->print.basis >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: factor failed at %s, numerical instability,", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, dy_prtpivparms(-1)) ; dyio_outfmt(dy_logchn,dy_gtxecho," max = %g, gro = %g.", luf_basis->luf->big_v,luf_basis->luf->max_gro) ; } # endif if (dy_setpivparms(+1,0) == FALSE) { errmsg(307,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,dy_prtpivparms(-1)) ; return (retcode) ; } # ifndef DYLP_NDEBUG if (dy_opts->print.basis >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\ttrying again with %s.", dy_prtpivparms(-1)) ; } # endif break ; } default: { errmsg(7,rtnnme,__LINE__,"inv_decomp return code",retval) ; return (dyrFATAL) ; } } } /* If we reach here, we managed to factor the basis. Reset the count of pivots since the last refactor. If the basis was patched, we have some serious cleanup to do, so call adjust_therest to deal with the details. Otherwise, turn to the requests to calculate values for the primal and/or dual variables. */ dy_lp->basis.etas = 0 ; if (patched == TRUE) { retcode = adjust_therest(patchcnt,patches) ; FREE(patches) ; if (retcode == dyrFATAL) { errmsg(306,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters) ; return (dyrFATAL) ; } # ifndef DYLP_NDEBUG if (dy_opts->print.basis >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t[%s]: compensated for basis correction.", dy_sys->nme) ; } # endif if (!(dy_lp->phase == dyINIT)) { setflg(*calcflgs,ladPRIMALS|ladDUALS) ; if (retcode == dyrLOSTDFEAS) setflg(*calcflgs,ladDUALFEAS) ; } retcode = dyrPATCHED ; } else { if (flgon(*calcflgs,ladPRIMALS)) { if (dy_calcprimals() == FALSE) { clrflg(*calcflgs,ladPRIMALS) ; return (dyrFATAL) ; } } if (flgon(*calcflgs,ladDUALS)) dy_calcduals() ; } return (retcode) ; } dyret_enum dy_pivot (int xipos, double abarij, double maxabarj) /* This routine handles a single pivot. It first checks that the pivot element satisfies a stability test, then calls inv_update to pivot the basis. We can still run into trouble, however, if the pivot results in a singular or near-singular basis. NOTE: There is an implicit argument here that's not immediately obvious. inv_update gets the entering column from a cached result set with the most recent call to inv_ftran(*,1) (dy_ftran(*,true), if you prefer). The underlying assumption is that this is readily available from when we ftran'd the entering column to find the leaving variable. Parameters: xipos: the basis position of the entering variable abarij: the pivot element (only the absolute value is used) maxabarj: for a primal pivot, max{i} |abar|, for a dual pivot, max{j} |abar| Returns: dyrOK: the pivot was accomplished without incident (inv_update) dyrMADPIV: the pivot element abar was rejected as numerically unstable (dy_chkpiv) dyrSINGULAR: the pivot attempt resulted in a structurally singular basis (i.e., some diagonal element is zero) (inv_update) dyrNUMERIC: the pivot attempt resulted in a numerically singular (unstable) basis (i.e, some diagonal element is too small compared to other elements in the associated row and column) (inv_update) dyrBSPACE: glpinv/glpluf ran out of space for the basis representation (inv_update) dyrFATAL: internal confusion */ { int retval ; double ratio ; dyret_enum retcode ; const char *rtnnme = "dy_pivot" ; /* Check that the pivot element meets the current criterion for numerical stability. Arguably this should have been checked by the caller, but that's no excuse for not doing it now. */ ratio = dy_chkpiv(abarij,maxabarj) ; if (ratio < 1.0) { # ifndef DYLP_NDEBUG if (dy_opts->print.basis >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n %s(%d) pivot aborted; est. pivot stability %g.", dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,rtnnme,ratio) ; } # endif return (dyrMADPIV) ; } /* Make the call to inv_update, then recode the result. */ retval = inv_update(luf_basis,xipos) ; # ifndef DYLP_NDEBUG if ((retval == 0 && dy_opts->print.basis >= 5) || (retval > 0 && dy_opts->print.basis >= 3)) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n %s(%d) estimated pivot stability %g; ", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters,ratio) ; dyio_outfmt(dy_logchn,dy_gtxecho,"measured pivot stability %g.", luf_basis->min_vrratio) ; } # endif switch (retval) { case 0: { retcode = dyrOK ; break ; } case 1: { retcode = dyrSINGULAR ; # ifndef DYLP_NDEBUG if (dy_opts->print.basis >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n %s(%d) singular basis (structural) after pivot.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; } # endif break ; } case 2: { retcode = dyrNUMERIC ; # ifndef DYLP_NDEBUG if (dy_opts->print.basis >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n %s(%d) singular basis (numeric) after pivot.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; } # endif break ; } case 3: case 4: { retcode = dyrBSPACE ; # ifndef DYLP_NDEBUG if (dy_opts->print.basis >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n %s(%d) out of space (%s)", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, (retval == 3)?"eta matrix limit":"sparse vector area") ; } # endif break ; } default: { errmsg(1,rtnnme,__LINE__) ; retcode = dyrFATAL ; break ; } } return (retcode) ; } DyLP-1.6.0/DyLP/src/Dylp/dy_consys.h0000644000076700007670000005433711026315405013767 0ustar /* This file is a portion of the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ #ifndef _CONSYS_H #define _CONSYS_H /* @(#)dy_consys.h 4.4 11/11/04 svn/cvs: $Id: dy_consys.h 240 2008-06-18 23:32:21Z lou $ This header file contains declarations for a constraint system data structure, tailored for LP-based branch-and-cut MILP algorithms (more generally, for any situation where dynamic change in the number of rows and/or columns is expected). The constraint system allows for arbitrary additions and deletions. Additional space is allocated as needed; there are no a priori limits. Allocated space is never reduced, however, short of destroying the constraint system. The coefficient matrix is implemented as a sparse structure, linked by row and by column. Access to the rows and columns of the coefficient matrix is via utility routines. To provide O(1) cost for row and column addition and deletion, while maintaining a dense index set, the hole left by deleting a row or column is filled by moving the last row or column to occupy the vacant index slot. The client can 'attach' row and column vectors to the constraint system; more precisely, vectors and multiple pointers to those vectors. The vectors will be dynamically resized and pointers updated whenever rows or columns are added to the constraint system. Entries in attached vectors are automatically reordered when a row or column is moved to fill the hole left by a deletion. The user is expected to work directly with any attached vectors; there are no special access routines. Because rows and columns can move, clients must be careful when they keep records of row or column indices, and update these records as necessary. A special set of attached vectors are referred to as associated vectors. These are distinguished only by having pointers allocated in the constraint system header structure. NOTE: The package assumes that variables and constraints are indexed from 1; this makes error checking a lot more reliable, particularly for errors of omission (whoops, forgot to set that index ... ). Vectors intended for expanded rows or columns must be sized accordingly. (I.e., if vector is to hold k values, the actual allocated space is k+1 entries, with vector[0] unused.) consys will do this automatically when asked to allocate space. Clients must remember this when allocating space for vectors that they will attach to a constraint system. NOTE: The constraint system is prepared to deal with both finite (most often DBL_MAX) and infinite (IEEE) infinity in the upper and lower bounds vectors for variables (vlb, vub). Explicit checks are necessary to maintain the value of a finite infinity when scaling the constraint system. The value of infinity must be supplied as a parameter to create_consys(). It's not a good idea to have infinity popping up elsewhere, but IEEE infinity should work (because no explicit checks are required for mathematical correctness). NOTE: At the infinitesimal end, any coefficient with absolute value less than 1.0e-20 will be dropped. Currently this is hardwired (see consys_create). It may change if there's a need. */ #include "dy_vector.h" /* Constraint coefficient matrix This is a sparse-matrix data structure, linked by row and column. Note that rows and columns are << not >> sorted in index order. Insertions and deletions are done adjacent to the headers, for efficiency. */ /* Coefficients Field Description ----- ----------- rowhdr The row header for this coefficient. colhdr The column header for this coefficient. val The value of this coefficient. rownxt The next coefficient in this row. colnxt The next coefficient in this column. */ typedef struct coeff_struct_tag { struct rowhdr_struct_tag *rowhdr ; struct colhdr_struct_tag *colhdr ; double val ; struct coeff_struct_tag *rownxt ; struct coeff_struct_tag *colnxt ; } coeff_struct ; /* Column headers Field Description ----- ----------- ndx The index of this column. len The number of coefficients in the column. nme The name of the variable associated with the column. coeffs The coefficients of the column. */ typedef struct colhdr_struct_tag { int ndx ; int len ; const char *nme ; coeff_struct *coeffs ; } colhdr_struct ; /* Row headers Field Description ----- ----------- ndx The index of this row. len The number of coefficients in the row. nme The name of the variable associated with the row. coeffs The coefficients of the row. */ typedef struct rowhdr_struct_tag { int ndx ; int len ; const char *nme ; coeff_struct *coeffs ; } rowhdr_struct ; /* Coefficient matrix header Field Definition ----- --------- coeffcnt The number of coefficients in the matrix. cols Array of pointers to column headers. rows Array of pointers to row headers. */ typedef struct { int coeffcnt ; colhdr_struct **cols ; rowhdr_struct **rows ; } conmtx_struct ; /* Attached Vectors: As mentioned at the top, attached vectors are automatically resized whenever the constraint system is resized, and reorderd to track the movement of rows and columns due to deletions. A particular subset of attached vectors are designated as associated vectors; a system has at most one of each type of associated vector. Their only distinguishing characteristic is that they occupy the dedicated pointers in the constraint system header: * objective function * variable type <3> * variable upper & lower bounds * right-hand-side (a.k.a. rhs or b) and rhsl (a.k.a. rhslow or blow) <1> * constraint type * upper & lower bounds for constraint left-hand-sides <2> * row and column scaling vectors (more accurately, the diagonal elements of row and column scaling matrices) <1> rhsl is created when range constraints (blow <= ax <= b) are present in the constraint system. <2> These are calculated using the upper and lower bounds on the variables in the constraint, and are used in arc consistency calculations. See further explanation below. <3> Arguably the variable type vector only needs to cover the architectural variables, but it'd be a pain to distinguish a resize involving the architectural columns from a resize involving the logical columns. Easier to waste a little space. The flags given below are used in attached vector headers to indicate how a vector should be handled, and in the consys_struct.parts field to indicate which components of the constraint system are present. Their most important function is to specify whether a vector is a row vector or a column vector. Beyond that, they serve as weak consistency and type checks. Notes: * MTX, ROWHDR, and COLHDR cannot be allocated/deallocated, but having codes for them makes the interface to some of the utility routines a bit more uniform. * COL and ROW should be used for generic column and row vectors, respectively. * VUB is initialised to +infinity. * RSCALE and CSCALE are initialised to 1.0 * VTYP and CTYP are tied to the vartyp_enum and contyp_enum types. */ #define CONSYS_MTX ((flags) 1<<0) #define CONSYS_ROW ((flags) 1<<1) #define CONSYS_COL ((flags) 1<<2) #define CONSYS_OBJ ((flags) 1<<3) #define CONSYS_VUB ((flags) 1<<4) #define CONSYS_VLB ((flags) 1<<5) #define CONSYS_RHS ((flags) 1<<6) #define CONSYS_CUB ((flags) 1<<7) #define CONSYS_CLB ((flags) 1<<8) #define CONSYS_RHSLOW ((flags) 1<<9) #define CONSYS_VTYP ((flags) 1<<10) #define CONSYS_CTYP ((flags) 1<<11) #define CONSYS_COLHDR ((flags) 1<<12) #define CONSYS_ROWHDR ((flags) 1<<13) #define CONSYS_RSCALE ((flags) 1<<14) #define CONSYS_CSCALE ((flags) 1<<15) /* Macros to identify row and column vectors. */ #define CONSYS_ROWVEC \ (CONSYS_OBJ|CONSYS_VUB|CONSYS_VLB|CONSYS_VTYP|CONSYS_CSCALE| \ CONSYS_COLHDR|CONSYS_ROW) #define CONSYS_COLVEC \ (CONSYS_RHS|CONSYS_RHSLOW|CONSYS_CUB|CONSYS_CLB|CONSYS_CTYP|CONSYS_RSCALE| \ CONSYS_ROWHDR|CONSYS_COL) /* A macro to check for a valid vector type. */ #define VALID_ATTVTYPE(zz_vectype_zz) \ (zz_vectype_zz == CONSYS_OBJ || \ zz_vectype_zz == CONSYS_VUB || zz_vectype_zz == CONSYS_VLB || \ zz_vectype_zz == CONSYS_RHS || zz_vectype_zz == CONSYS_RHSLOW || \ zz_vectype_zz == CONSYS_CUB || zz_vectype_zz == CONSYS_CUB || \ zz_vectype_zz == CONSYS_VTYP || zz_vectype_zz == CONSYS_CTYP || \ zz_vectype_zz == CONSYS_RSCALE || zz_vectype_zz == CONSYS_CSCALE || \ zz_vectype_zz == CONSYS_ROW || zz_vectype_zz == CONSYS_COL) /* Attached vector header This structure is used in the list of attached vectors that should be checked and resized with the constraint system. Field Definition ----- ---------- nxt List link. what The type of vector (coded with the flag values for attached and associated vectors) elsze The size of an element in the vector. vec The address of the vector. pveclst A list of addresses which hold pointers to vec. If vec is moved as a result of a resize, these are rewritten. */ typedef struct attvhdr_struct_tag { struct attvhdr_struct_tag *nxt ; flags what ; int elsze ; void *vec ; lnk_struct *pveclst ; } attvhdr_struct ; /* Constraint bounds Constraint bounds are upper and lower bounds on the value of the left-hand-side of a constraint, calculated using the upper and lower bounds on variables. In the case where all variables have finite bounds, the constraint bound will also be finite, and things are straightforward. But there's a complication --- we'll want to be able to efficiently handle the case where all variables have finite bounds except one, x. In this case we can calculate a finite bound for the free variable, using the bounds on the other variables. Bottom line is we need a structure that keeps count of the number of infinities, as well as the finite portion of the bound. See consistency.c for more about the mechanics of particular cases. The interpretation of an entry is as follows: -varcnt <= inf < 0 inf is the negative of the index of the single remaining variable contributing an infinity; bnd is the finite lhs bound calculated from the other variables of the constraint inf >= 0 inf is the number of variables contributing infinity to the bound; bnd is the value of the finite portion of the lhs bound. If inf == 0, the lhs bound is finite. inf < -varcnt and inf = 1 are invalid. A value which exceeds the number of variables in the constraint is also bogus. This encoding means that it's impossible to distinguish +inf and -inf just by looking at the bound. But, in the case of constraint bounds, this hasn't been a problem in practice. Lower bounds go to -inf, and upper bounds go to +inf, and context has been sufficient. The revs field is used to keep track of the number of times the bound has been revised. See milp.h:mipopts_struct for the recalculation frequency. */ typedef struct { int revs ; int inf ; double bnd ; } conbnd_struct ; /* Constraint type codes These codes have their origin in the MPS input standard. contypINV invalid contypNB non-binding constraint <1> contypGE >= inequality contypEQ equality contypLE <= inequality contypRNG 'range' constraint, lb <= ax <= ub (a sort of shorthand for a >= and a <= inequality) <1> Non-binding constraints are a bit odd. They are used in two ways. The first non-binding constraint in the MPS file is, by convention, the objective function. The other use for non-binding constraints is in rows of type Dx (x one of N, E, G, or L), which specify linear combinations of constraints. <2> Following OSL (a good lead to follow when they're going where I want to go :-), bonsai doesn't accept Dx rows, and throws away all but the first non-binding constraint, which it keeps only if it needs it for the objective function. */ typedef enum { contypINV = 0, contypNB, contypGE, contypEQ, contypLE, contypRNG } contyp_enum ; #define VALID_CONTYPE(zz_ctyp_zz) \ (zz_ctyp_zz == contypGE || zz_ctyp_zz == contypEQ || \ zz_ctyp_zz == contypLE || zz_ctyp_zz == contypRNG) /* Variable type codes vartypINV invalid vartypCON continuous variable vartypINT general integer variable vartypBIN binary variable */ typedef enum { vartypINV = 0, vartypCON, vartypINT, vartypBIN } vartyp_enum ; #define VALID_VARTYPE(zz_vtyp_zz) \ (zz_vtyp_zz == vartypCON || \ zz_vtyp_zz == vartypINT || \ zz_vtyp_zz == vartypBIN) #define INT_VARTYPE(zz_vtyp_zz) \ (zz_vtyp_zz == vartypINT || \ zz_vtyp_zz == vartypBIN) /* Behavioural options These codes are used as flags in the opts field of the constraint system header. CONSYS_LVARS Set to indicate that logical variables are present and should be automatically maintained during constraint system manipulations. CONSYS_WRNZERO Set to indicate that a warning should be issued when the constraint system utility routines encounter a zero-length column or row. Also causes a warning during row/column creation and basis initialisation if an explicit zero coefficient is encountered. CONSYS_WRNATT Set to indicate that a warning should be issued when a duplicate attach request is encountered (i.e., both the vector and the pointer to the vector are already on the attvecs list). CONSYS_FININF `Finite infinity' --- the client is indulging in the common trick of using a large finite value (most often, DBL_MAX) as infinity. CONSYS_CORRUPT The constraint system is corrupt --- an error has occurred during construction or modification that caused an operation to abort. Currently set only for errors that occur outside of debug and paranoia (you're supposed to look at the error messages for paranoia and debug). */ #define CONSYS_LVARS ((flags) 1<<0) #define CONSYS_WRNZERO ((flags) 1<<1) #define CONSYS_WRNATT ((flags) 1<<2) #define CONSYS_FININF ((flags) 1<<3) #define CONSYS_CORRUPT ((flags) 1<<4) /* Constraint system header The top-level 'handle' for the structure. Field Definition ----- --------- nme The name assigned to this constraint system. parts Flags indicating which components of the constraint system are supposed to be present. opts Flags indicating various behavioural options. inf The value of infinity. tiny The value of the infinitesimal. varcnt The total number of variables (and the column dimension). archvcnt The number of architectural variables. The number of continuous architectural variables is archvcnt-(intvcnt+binvcnt). logvcnt The number of logical variables. intvcnt The number of general integer variables. binvcnt The number of binary variables. maxcollen The number of coefficients in the largest column. maxcolndx The index of the largest column. concnt The total number of constraints (and the row dimension). archccnt The number of architectural constraints. cutccnt The number of cut constraints. maxrowlen The number of coefficients in the largest row. maxrowndx The index of the largest row. colsze The allocated column capacity for the constraint system. rowsze The allocated row capacity for the constraint system. mtx The constraint matrix header. The vectors rowscale and colscale are valid only after execution of one of the scaling routines consys_geomscale, consys_equiscale, or consys_applyscale. The fields maxaij and minaij are valid only after execution of consys_evalsys or any of the scaling routines. maxaij max{i,j} |a| (valid only after scaling) minaij min{i,j, a != 0} |a| (valid only after scaling) rowscale The row scaling vector. colscale The column scaling vector. objnme The name of the objective function. objndx Index of the objective function, if it's installed as a constraint cx - x = 0. xzndx Index of the variable x. obj The objective function. vtyp The type of variable. vub The upper bounds for variables. vlb The lower bounds for variables. rhs The right-hand-side vector. rhslow blow for range constraints of form blow <= ax <= b. ctyp The type of constraint (contyp_enum). cub The upper bounds for constraint left-hand-sides. clb The lower bounds for constraint left-hand sides. attvecs The list of attached vectors. NOTE the distinction between dimension and size -- the allocated capacity of the constraint system is [rowsze x colsze], while the actual size of the constraint system is [concnt x varcnt]. */ typedef struct { const char *nme ; flags parts ; flags opts ; double inf ; double tiny ; int varcnt ; int archvcnt ; int logvcnt ; int intvcnt ; int binvcnt ; int maxcollen ; int maxcolndx ; int concnt ; int archccnt ; int cutccnt ; int maxrowlen ; int maxrowndx ; int colsze ; int rowsze ; conmtx_struct mtx ; double maxaij ; double minaij ; double *rowscale ; double *colscale ; const char *objnme ; int objndx ; int xzndx ; double *obj ; vartyp_enum *vtyp ; double *vub ; double *vlb ; double *rhs ; double *rhslow ; contyp_enum *ctyp ; conbnd_struct *cub ; conbnd_struct *clb ; attvhdr_struct *attvecs ; } consys_struct ; /* consys_utils.c */ extern consys_struct *consys_create(const char *nme, flags parts, flags opts, int concnt, int varcnt, double infinity) ; extern bool consys_dupsys(consys_struct *src, consys_struct **dst, flags dstvecs) ; extern void consys_free (consys_struct *consys) ; extern bool consys_realloc(consys_struct *consys, char rowcol, int incr), consys_attach(consys_struct *consys, flags what, int elsze, void **pvec), consys_update(consys_struct *consys, void *oldvec, void *newvec), consys_detach(consys_struct *consys, void **pvec, bool all) ; extern bool consys_addcol_pk(consys_struct *consys, vartyp_enum vartyp, pkvec_struct *pkcol, double obj, double vlb, double vub), consys_addcol_ex(consys_struct *consys, vartyp_enum vartyp, const char **nme, double *excol, double obj, double vlb, double vub), consys_addrow_pk(consys_struct *consys, char rowclass, contyp_enum contyp, pkvec_struct *pkrow, double rhs, double rhslow, conbnd_struct *cub, conbnd_struct *clb), consys_getcol_pk(consys_struct *consys, int colndx, pkvec_struct **pkvec), consys_getcol_ex(consys_struct *consys, int colndx, double **vec), consys_getrow_pk(consys_struct *consys, int rowndx, pkvec_struct **pkvec), consys_getrow_ex(consys_struct *consys, int rowndx, double **vec), consys_delcol(consys_struct *consys, int colndx), consys_delrow(consys_struct *consys, int rowndx), consys_delrow_stable(consys_struct *consys, int rowndx) ; extern bool consys_setcoeff(consys_struct *consys, int rowndx, int colndx, double val) ; extern double consys_getcoeff(consys_struct *consys, int rowndx, int colndx) ; extern bool consys_logicals(consys_struct *consys) ; /* consys_mathutils.c */ extern int consys_gcdrow(consys_struct *consys, int rowndx) ; extern double consys_dotcol(consys_struct *consys, int colndx, double *vec), consys_dotrow(consys_struct *consys, int rowndx, double *vec) ; extern double consys_1normrow(consys_struct *consys, int rowndx), consys_ssqrow(consys_struct *consys, int rowndx), consys_2normrow(consys_struct *consys, int rowndx), consys_infnormrow(consys_struct *consys, int rowndx), consys_1normcol(consys_struct *consys, int rowndx), consys_ssqcol(consys_struct *consys, int rowndx), consys_2normcol(consys_struct *consys, int rowndx), consys_infnormcol(consys_struct *consys, int rowndx) ; extern bool consys_mulrow(consys_struct *consys, int rowndx, double scalar) ; extern bool consys_divrow(consys_struct *consys, int rowndx, double scalar) ; extern bool consys_accumcol(consys_struct *consys, int colndx, double *vec) ; extern bool consys_mulaccumcol(consys_struct *consys, int colndx, double scalar, double *vec) ; /* consys_scaling.c */ extern bool consys_evalsys(consys_struct *consys, double *scm, int *gecnt) ; extern bool consys_geomscale(consys_struct *consys, double **rowscale, double **colscale), consys_equiscale(consys_struct *consys, double **rowscale, double **colscale), consys_applyscale(consys_struct *consys, bool convctyp, double *rowscale, double *colscale) ; /* consys_io.c */ extern const char *consys_prtvartyp(vartyp_enum vartyp), *consys_prtcontyp(contyp_enum contyp) ; extern char *consys_assocnme(consys_struct *consys, flags which), *consys_conbndnme(char bndlett, int cndx, conbnd_struct *bnd), *consys_conbndval(conbnd_struct *bnd) ; #ifndef DYLP_NDEBUG #include "dylib_io.h" #include "dylib_std.h" extern void consys_prtcon(ioid chn, bool echo, consys_struct *consys, int i, const char *pfx) ; #endif /* A routine to set (change, really) the name of an existing constraint or variable. */ extern void consys_chgnme(consys_struct *consys, char cv, int ndx, const char *newnme) ; /* consys_nme returns a string containing the name of the specified constraint or variable. If the client supplies a buffer, that buffer is used to return the name. If a buffer isn't supplied, a little care is required. * If consys_nme can find a pointer to the name stored in the constraint matrix (i.e., in the row or column header) it will return the stored pointer. Successive calls will not interfere with one another. * If consys_nme has to build the name, it will use an internal buffer. Successive calls will reuse this buffer as required (overwriting the previous name). Names have to be built in two cases: * A fully prefixed name is requested (a prefix of 'consys->nme.' is added to the variable or constraint name). * The name of a logical variable is requested and logicals aren't enabled in the constraint system. A buffer of size CONSYS_MAXBUFLEN is guaranteed to be adequate. */ #define CONSYS_MAXBUFLEN 32 extern const char *consys_nme(consys_struct *consys, char cv, int ndx, bool pfx, char *clientbuf) ; #endif /* _CONSYS_H */ DyLP-1.6.0/DyLP/src/Dylp/dy_dualmultipivot.c0000644000076700007670000017027311026315405015524 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ #define DYLP_INTERNAL #include "dylp.h" static char sccsid[] UNUSED = "@(#)dy_dualmultipivot.c 4.6 10/15/05" ; static char svnid[] UNUSED = "$Id: dy_dualmultipivot.c 240 2008-06-18 23:32:21Z lou $" ; /* This is an experimental dual pivoting algorithm. The inspiration comes from two places: * Observing the `dual death spiral', where the dual simplex executes a succession of pivots that result in steadily increasing (and infeasible) values of the primal variables. Each pivot is driving one variable to bound, but at the cost of driving other primal variables farther from bound. It's still unclear to me how/why this occurs. It's not simply a side effect of working with the partial system --- grow22 is a pathological case, and it's all equalities, loaded in full. But it leads to the thought ``Wouldn't it be nice to choose the dual pivot to reduce primal infeasibility?'' After all, attaining primal feasibility is equivalent to reaching optimality, given we start with dual feasibility. * Looking over the dual pivot selection algorithm in clp. Instead of just choosing the variable x associated with the most restrictive delta, it examines a set of candidates. If it prefers a candidate with a larger delta, it considers the effect of flipping candidates with smaller delta to their opposite bound (thus maintaining dual feasibility). With the germ of the idea in hand, some poking around on the web turned up a paper by Istvan Maros, ``A Generalized Dual Phase-2 Simplex Algorithm'', Departmental Technical Report 2001/2, Department of Computing, Imperial College, London, January 2001, revised December 2002, ISSN 1469-4174. It describes another variation on this idea, and describes some very preliminary results, ending with a comment that this needs to be explored further. This material is repeated in Chap. 10 of Maros' book, "Computational Techniques of the Simplex Method". The general outline of generalised dual pivoting is as follows: scan for entry candidates x and sort by delta foreach sorted x calculate abar = inv(B)a ; calculate the change in infeasibility if we pivot on x = (change due to previous flips) + (change moving delta) ; calculate the change in infeasibility if we flip x = (change due to previous flips) + (change flipping x) ; if we can't flip x, quit --- it, or a predecessor, is the pivot otherwise, remember the infeasibility if we choose x, and continue to the next candidate end foreach pivot on the x with the best infeasibility, flipping variables as required. The foreach loop ends when either 1) we reach a variable that can't be flipped, hence must be pivoted, or 2) flipping a variable would drive x within bound. (Remember, the value of x is the dual reduced cost. When it comes within bound, the reduced cost changes from favourable to unfavourable.) The pivot can be the variable that ended the scan, or any of its predecessors (modulo numerical stability considerations). The development above implies we're tracking the primal infeasibilty of all basic variables. And indeed the original thought was to choose the incoming primal variable to minimise the maximum infeasibility over the primal basic variables. It turns out that always choosing a pivot this way is not a good strategy --- the DYLP tech report says more about this --- but it looks to be worth some further experimentation. The default strategy is to look solely at the infeasibility of x (the leaving variable) unless swings in other primal variables get out of hand. Put another way, improving the dual objective is the goal unless swings in primal variable values become large enough to threaten numerical stability. This is enhanced with a couple of tweaks. The most important of these is the notion of promoting a sane (numerically stable) pivot. It'll often happen that the front of the candidate list is occupied with variables x with delta = 0 (or some tiny value) and abar numerically unstable. But precisely because abar is tiny, it might be that we can pass over it to another x with a non-zero delta and a much larger abar. As long as (delta/abar)*abar is sufficiently small that we can tolerate the dual infeasibility of cbar, we can take the better pivot on x. We avoid a degenerate pivot and we have better numerical stability. */ /* Structure used to carry around candidates for entry. Field Description ----- ----------- ndx index of the variable x abarik |abar| ratioik stability ratio of abar; larger is better, 1.0 is the boundary between stable and unstable madpiv TRUE if abar failed the pivot stability check ddelta magnitude of dual delta |delta| = |cbar/abar| pivdir direction of movement if x is the entering primal variable; 1 for rising, -1 for falling flippable TRUE if x has an opposite bound (hence can be flipped). rev TRUE if x is actually a reverse pivot (i.e., cbar is slightly on the wrong side of 0, and this will bring us back to dual feasibility). piv If x is used as the entering variable delta standard primal delta = delta/abar when x is the entering variable, where delta is the movement required to drive x out of the basis. inf change in total primal infeasibility if x enters maxinf maximum infeasibility of a primal variable after x is pivoted into the basis flip If x is flipped to its opposite bound delta primal delta for movement to opposite bound inf change in total primal infeasibility if x is flipped to the opposite bound maxinf maximum infeasibility of a primal variable after x is flipped */ typedef struct { int ndx ; double abarik ; double ratioik ; bool madpiv ; double ddelta ; int pivdir ; bool flippable ; bool rev ; struct { double delta ; double inf ; double maxinf ; } piv ; struct { double delta ; double inf ; double maxinf ; } flip ; } dualcand_struct ; /* # ifdef DYLP_PARANOIA static int predictiter ; static double predicttotinf,predictmaxinf ; # endif */ static int dualcand_cmp (const void *p_dualcand1, const void *p_dualcand2) /* Comparison function for qsort to sort an array of dualcand_structs. See scanForDualInCands for the sort criteria. The primary criterion is dual delta; it only gets interesting when the deltas are equal. It turns out that sorting by nonincreasing ratio as the tiebreaker is critical. Otherwise, we're trying to bring x to bound using dinky little pivots, and in the meantime we're swinging the values of the other basic variables off into the ozone. Parameters: p_dualcand1,2: dualcand_structs to be compared Returns: -1 if dualcand1 < dualcand2 0 for equality 1 if dualcand1 > dualcand2 */ { double delta1,delta2,ratio1,ratio2 ; bool flip1,flip2,mad1,mad2 ; const dualcand_struct *dualcand1,*dualcand2 ; dualcand1 = (const dualcand_struct *) p_dualcand1 ; dualcand2 = (const dualcand_struct *) p_dualcand2 ; delta1 = dualcand1->ddelta ; delta2 = dualcand2->ddelta ; mad1 = dualcand1->madpiv ; mad2 = dualcand2->madpiv ; /* The primary criterion is the size of the delta. See promoteSanePivot for an optimization. Unfortunately, we'll have sort problems if we do it here. */ if (delta1 < delta2) { return (-1) ; } else if (delta1 > delta2) { return (1) ; } /* Prefer non-mad pivots. These need to be pushed up here lest they be trapped behind tiny pivots with equal delta. */ if (mad1 != mad2) { if (mad1 == TRUE) { return (1) ; } else { return (-1) ; } } /* Now we have equal deltas. For degenerate candidates (delta == 0) prefer flippable; for nondegenerate, prefer nonflippable. */ flip1 = dualcand1->flippable ; flip2 = dualcand2->flippable ; if (delta1 == 0) { if (flip1 != flip2) { if (flip1 == TRUE) return (-1) ; else return (1) ; } } else { if (flip1 != flip2) { if (flip1 == FALSE) return (-1) ; else return (1) ; } } /* Equal deltas, and both flippable or nonflippable. Order by nonincreasing pivot ratio. */ ratio1 = dualcand1->ratioik ; ratio2 = dualcand2->ratioik ; if (ratio1 > ratio2) return (-1) ; else if (ratio1 < ratio2) return (1) ; else return (0) ; } static void promoteSanePivot (dualcand_struct *incands) /* This routine attempts to promote a sane pivot high enough in the list to be used. The rationale is this: Mad pivots are tiny. If the delta of a sane pivot is small enough, we won't cause dual infeasibility. Suppose we have two variables x (sane) and x (mad). If (delta-delta)*a < tol then it's a good bet we can promote x past x in the pivot list. So --- our goal is to walk along incands until we find the first sane pivot. If everything up to that point has been flippable, we need do nothing. But if we've passed nonflippable mad pivots, try to promote the sane one. Parameters: incands: (i) the candidate list; incands[0].ndx is the number of candidates (o) the candidate list, possibly rearranged as described Returns: undefined */ { int ndx,candcnt,firstnoflip,firstsane ; double tol ; dualcand_struct sane,insane ; /* Do the initial scan. If we find a sane pivot and havn't run into a non-flippable, non-reverse pivot, all is copacetic and we can return with no further effort. There may be no sane pivots. */ candcnt = incands[0].ndx ; firstnoflip = -1 ; firstsane = -1 ; for (ndx = 1 ; ndx <= candcnt ; ndx++) { if (incands[ndx].madpiv == FALSE) { firstsane = ndx ; break ; } if (firstnoflip < 0 && incands[ndx].flippable == FALSE && incands[ndx].rev == FALSE) { firstnoflip = ndx ; } } if (firstsane < 0 || (firstnoflip < 0 && firstsane > 0)) return ; /* We have a sane pivot at firstsane and we have mad pivots from firstnoflip to firstsane-1. At least the pivot at firstnoflip cannot be flipped. The tolerance is calculated to split the difference in exponent between the zero tolerance and the feasibility tolerance. Reverse pivots can always be stepped over. */ tol = log10(dy_tols->dfeas/dy_tols->cost)/2 ; tol = dy_tols->cost*pow(10.0,tol) ; for (ndx = firstsane ; ndx > firstnoflip ; ndx--) { sane = incands[ndx] ; insane = incands[ndx-1] ; if (insane.rev == TRUE || (sane.ddelta-insane.ddelta)*insane.abarik < tol) { incands[ndx-1] = sane ; incands[ndx] = insane ; } else { break ; } } /* That's it. With any luck, we've promoted a sane candidate to a place where it can be used. */ # ifndef DYLP_NDEBUG if ((dy_opts->print.pivoting >= 2 && ndx == firstnoflip) || dy_opts->print.pivoting >= 3) { int j ; j = incands[firstnoflip].ndx ; dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t first no-flip %s (%d) at %d, ", consys_nme(dy_sys,'v',j,FALSE,NULL),j,firstnoflip) ; j = incands[firstsane].ndx ; dyio_outfmt(dy_logchn,dy_gtxecho,"first sane %s (%d) at %d", consys_nme(dy_sys,'v',j,FALSE,NULL),j,firstsane) ; dyio_outfmt(dy_logchn,dy_gtxecho,", promoted to %d. ",ndx) ; } # endif # ifdef DYLP_STATISTICS if (dy_stats != NULL) { if (firstsane > 1 && ndx == 1) dy_stats->dmulti.promote++ ; } # endif return ; } static dyret_enum scanForDualInCands (dualcand_struct *incands, int outdir, double *abari, double maxabari) /* This routine scans the nonbasic variables for candidates to become the entering variable; the criteria are outlined below at the head of the scan loop. Candidates are stored in the incands array. For each candidate, we record the index, magnitude of the pivot and dual delta, whether the pivot is unstable, and whether or not the variable is flippable. Once we've completed the scan, multiple candidates are sorted. The primary sort order is nondecreasing dual delta, delta. * Within the degenerate pivot group, delta == 0, we can flip variables at will, so the secondary sort orders are flippable < nonflippable, then nonincreasing ratio. Paraphrased, flip all we can, and pivot on the variable with the most stable pivot. But hope that all degenerate variables are flippable and we can move on to ... * The nondegenerate group, where we need to be more circumspect. To flip a variable, we need to drive the reduced cost past zero to the opposite sign. So, to flip a variable with a given delta, we actually need to pivot on a variable with a greater delta. Sort nonflippable < flippable, then nonincreasing ratio. Then we don't worry about flipping when we're going to have to pivot, and we'll get the most stable pivot. Parameters: incands: (i) pointer to array to hold the candidates for entry (o) filled and sorted array; in particular incands[0].ndx is the number of candidates incands[1..] are the candidates outdir: direction of motion of the leaving variable x abari: The transformed pivot row, row i of inv(B)N maxabari: The maximum value in the pivot row abar Returns: dyrOK if there are candidates and no errors dyrUNBOUND if there are no candidates dyrFATAL on error (only when we're paranoid) */ { int n,k,reject,candcnt,dirk ; double abarik,cbark,deltak,ratioik ; double *vub,*vlb ; flags statk ; bool rev ; dyret_enum retval ; # ifdef DYLP_PARANOIA const char *rtnnme = "scanForDualInCands" ; # endif # if !defined(DYLP_NDEBUG) || defined(DYLP_PARANOIA) int print ; print = dy_opts->print.pivoting ; /* suppress print in dy_chkpiv */ dy_opts->print.pivoting = 0 ; # endif # ifdef DYLP_PARANOIA if (incands == NULL) { errmsg(2,rtnnme,"incands array") ; return (dyrFATAL) ; } # endif n = dy_sys->varcnt ; vub = dy_sys->vub ; vlb = dy_sys->vlb ; incands[0].ndx = -1 ; # ifndef DYLP_NDEBUG if (print >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n gathering candidates to enter ... ") ; if (print >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tVariable\t cbar\tabar\t delta\tDisp") ; } } # endif /* Open a loop and scan for suitable nonbasic variables. Note that we shouldn't see superbasics here, as we're primal infeasible while running dual simplex and superbasics should not be created. Nor should we see nonbasic free variables; they can't be nonbasic in a dual feasible solution. dy_chkstatus enforces this when we're paranoid. */ candcnt = 0 ; for (k = 1 ; k <= n ; k++) { if (dy_lp->degen > 0 && dy_ddegenset[k] != dy_lp->degen) continue ; # ifdef DYLP_PARANOIA if (dy_chkstatus(k) == FALSE) { incands[0].ndx = -1 ; dy_opts->print.pivoting = print ; return (dyrFATAL) ; } # endif /* Test if x is a candidate to enter: * exclude basic and NBFX variables, * exclude if abar == 0, * exclude if the sign of abar is wrong given the direction of motion for x and x, * flag x if abar is too small to be stable. Case analysis for cbar = -cbar/abar yields: * x rising to lb and leaving, cbar to be >= 0 + x nonbasic at l, c >= 0, implies abar must be <= 0 + x nonbasic at u, c <= 0, implies abar must be >= 0 * x dropping to ub and leaving, cbar to be <= 0 + x nonbasic at l, c >= 0, implies abar must be >= 0 + x nonbasic at u, c <= 0, implies abar must be <= 0 Some fancy footwork for dealing with variables where cbar has the wrong sign, but is within the dual feasibility tolerance: Case analysis says that we can deal with this by lying about status and reversing the normal direction of motion for the entering primal. (For example, if x is NBLB but -dfeas < cbar < 0, claim x is NBUB for purposes of evaluating it, and note that when x enters it will decrease, becoming BLLB). That won't quite get us out of trouble, though. Suppose we have a variable x that's NBLB with cbar < 0 and abar < 0 (i.e., the pivot is the wrong sign for the `slightly infeasible' case). We can safely ignore the case where the pivot is the wrong sign when a candidate variable is dual feasible. But if it's slightly infeasible, we can't be so cavalier. The risk is that we'll decide to do a nondegenerate pivot with a candidate x where abar < 0 (a standard NBLB candidate, or a slightly infeasible NBUB candidate). Then we'll drive cbar further into infeasibility, and may well lose dual feasibility. The solution is to declare x a candidate for a normal degenerate pivot by forcing cbark to 0 below. */ statk = dy_status[k] ; cbark = dy_cbar[k] ; if ((flgon(statk,vstatNBUB) && cbark > 0) || (flgon(statk,vstatNBLB) && cbark < 0)) { comflg(statk,vstatNBUB|vstatNBLB) ; rev = TRUE ; } else { rev = FALSE ; } reject = 0 ; abarik = abari[k] ; if (flgon(statk,vstatBASIC|vstatNBFX)) { reject = -1 ; } else if (withintol(abarik,0.0,dy_tols->zero)) { reject = -2 ; } else { if (outdir == -1) { if ((flgon(statk,vstatNBUB) && abarik > 0) || (flgon(statk,vstatNBLB) && abarik < 0)) { reject = -3 ; } } else { if ((flgon(statk,vstatNBUB) && abarik < 0) || (flgon(statk,vstatNBLB) && abarik > 0)) { reject = -3 ; } } } if (rev == TRUE && reject == -3) { cbark = 0 ; rev = FALSE ; comflg(statk,vstatNBUB|vstatNBLB) ; reject = 0 ; } if (reject >= 0) { ratioik = dy_chkpiv(abarik,maxabari) ; if (ratioik < 1.0) { reject = 1 ; } } else { ratioik = quiet_nan(0) ; } # ifndef DYLP_NDEBUG if (print >= 5 || (print >= 4 && reject >= 0)) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t%-8s (%d)", consys_nme(dy_sys,'v',k,FALSE,NULL),k) ; dyio_outfmt(dy_logchn,dy_gtxecho,"\t%8g\t%8g",cbark,abarik) ; if (print >= 5) { switch (reject) { case -1: { dyio_outfmt(dy_logchn,dy_gtxecho,"\t\trejected -- status %s", dy_prtvstat(statk)) ; break ; } case -2: { dyio_outfmt(dy_logchn,dy_gtxecho,"\t\trejected -- zero pivot") ; break ; } case -3: { dyio_outfmt(dy_logchn,dy_gtxecho, "\t\trejected -- wrong sign abar") ; break ; } } } } # endif if (reject < 0) continue ; /* x is a possible candidate for entry. Record it in incands with its associated dual delta. For reverse pivots, negate the deltak to make sure it ends up at the very front of the list. */ incands[++candcnt].ndx = k ; incands[candcnt].abarik = fabs(abarik) ; incands[candcnt].ratioik = ratioik ; if (reject == 1) { incands[candcnt].madpiv = TRUE ; } else { incands[candcnt].madpiv = FALSE ; } deltak = fabs(cbark/abarik) ; if (rev == TRUE) { incands[candcnt].rev = TRUE ; incands[candcnt].ddelta = -deltak ; comflg(statk,vstatNBLB|vstatNBUB) ; } else { incands[candcnt].rev = FALSE ; incands[candcnt].ddelta = deltak ; } if (outdir == -1) { if (abarik > 0) { dirk = 1 ; } else { dirk = -1 ; } } else { if (abarik > 0) { dirk = -1 ; } else { dirk = 1 ; } } if (rev == FALSE) { incands[candcnt].pivdir = dirk ; } else { incands[candcnt].pivdir = -dirk ; } if (flgon(statk,vstatNBUB)) { if (vlb[k] > -dy_tols->inf) { incands[candcnt].flippable = TRUE ; incands[candcnt].flip.delta = vlb[k]-vub[k] ; } else { incands[candcnt].flippable = FALSE ; } } else { if (vub[k] < dy_tols->inf) { incands[candcnt].flippable = TRUE ; incands[candcnt].flip.delta = vub[k]-vlb[k] ; } else { incands[candcnt].flippable = FALSE ; } } # ifndef DYLP_NDEBUG if (print >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho,"\t%8g\t accepted",deltak) ; if (reject == 1) { dyio_outfmt(dy_logchn,dy_gtxecho," (mad)") ; } if (deltak == 0) { dyio_outfmt(dy_logchn,dy_gtxecho," (degen)") ; } if (incands[candcnt].flippable == TRUE) { dyio_outfmt(dy_logchn,dy_gtxecho," (flip)") ; } if (rev == TRUE) { dyio_outfmt(dy_logchn,dy_gtxecho," (rev)") ; } } # endif } /* If we have a list of candidates, sort the list. If we have no candidates, we're unbounded. The assignments to incands[0].[ddelta,madpiv] are targetted at a quirk of qsort: it seems to occasionally sort incands[0]. An optimization of some sort, presumably. */ incands[0].ndx = candcnt ; incands[0].ddelta = -dy_tols->inf ; incands[0].madpiv = FALSE ; if (candcnt > 0) { if (candcnt > 1) { qsort(&incands[1],candcnt,sizeof(dualcand_struct),dualcand_cmp) ; } retval = dyrOK ; } else { retval = dyrUNBOUND ; } /* Now try a little bit of an optimization, to push decent pivots up past mad pivots. */ # ifndef DYLP_NDEBUG dy_opts->print.pivoting = print ; # endif promoteSanePivot(incands) ; # ifndef DYLP_NDEBUG if (print >= 1) { if (print >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n ") ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tVariable\tratio\tdelta") ; for (n = 1 ; n <= candcnt ; n++) { k = incands[n].ndx ; ratioik = incands[n].ratioik ; deltak = incands[n].ddelta ; dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t%-8s (%d)", consys_nme(dy_sys,'v',k,FALSE,NULL),k) ; dyio_outfmt(dy_logchn,dy_gtxecho,"\t%8g\t%8g",ratioik,deltak) ; if (incands[n].madpiv == TRUE) { dyio_outfmt(dy_logchn,dy_gtxecho," (mad)") ; } if (deltak == 0) { dyio_outfmt(dy_logchn,dy_gtxecho," (degen)") ; } if (incands[n].flippable == TRUE) { dyio_outfmt(dy_logchn,dy_gtxecho," (flip)") ; } statk = dy_status[k] ; if ((flgon(statk,vstatNBUB) && incands[n].pivdir == 1) || (flgon(statk,vstatNBLB) && incands[n].pivdir == -1)) { dyio_outfmt(dy_logchn,dy_gtxecho," (rev)") ; } if (n > 1) { dyio_outfmt(dy_logchn,dy_gtxecho, " (%g)",deltak-incands[n-1].ddelta) ; } } dyio_outfmt(dy_logchn,dy_gtxecho,"\n ") ; } dyio_outfmt(dy_logchn,dy_gtxecho,"%d candidates.",candcnt) ; if (retval != dyrOK) { dyio_outfmt(dy_logchn,dy_gtxecho, " Returning %s.",dy_prtdyret(retval)) ; } } dy_opts->print.pivoting = print ; # endif return (retval) ; } static int calcInfChange (dualcand_struct *candk, int i, double *xbasic) /* This routine calculates the change in primal infeasibility due to the change in the value of x under two assumptions: * x is the pivot variable * x will be flipped to its opposite bound Parameters: candk: (i) dualcand structure for x (o) information for x pivoted or flipped is set i: index of x, the leaving variable xbasic: (i/o) current values of basic variables; updated with each pricing to reflect the effect of flipping the candidate. Returns: 1 if the calculation completes without error, and x is still infeasible 0 if the calculation completes without error, and the flip makes x feasible -1 if there's an error. */ { int m,ipos ; flags stati ; double *vlb,*vub ; double xi,lbi,ubi,deltai ; int k ; double newxk,lbk,ubk,pivdeltak,flipdeltak, pivinf,maxpivinf,flipinf,maxflipinf ; double *abark,abarik ; bool flippable ; flags statk ; int l,lpos ; double xl,newxl,lbl,ubl,abarlk,curinf,infl ; const char *rtnnme = "calcInfChange" ; # ifdef DYLP_STATISTICS if (dy_stats != NULL) dy_stats->dmulti.evals++ ; # endif m = dy_sys->concnt ; vub = dy_sys->vub ; vlb = dy_sys->vlb ; /* Get x, its status and upper and lower bounds, and calculate delta. */ ipos = dy_var2basis[i] ; xi = xbasic[ipos] ; stati = dy_status[i] ; ubi = vub[i] ; lbi = vlb[i] ; if (flgon(stati,vstatBUUB)) { deltai = ubi-xi ; } else { deltai = lbi-xi ; } /* Get k, its status, and upper and lower bounds. */ k = candk->ndx ; statk = dy_status[k] ; lbk = vlb[k] ; ubk = vub[k] ; if (candk->flippable == TRUE) { flippable = TRUE ; flipdeltak = candk->flip.delta ; } else { flippable = FALSE ; flipdeltak = quiet_nan(0) ; } /* Retrieve a, calculate abar, then calculate the delta for the case where x is chosen as the entering variable. */ abark = NULL ; if (consys_getcol_ex(dy_sys,k,&abark) == FALSE) { errmsg(122,rtnnme,dy_sys->nme, "column",consys_nme(dy_sys,'v',k,TRUE,NULL),k) ; if (abark != NULL) FREE(abark) ; return (-1) ; } dy_ftran(abark,FALSE) ; abarik = abark[ipos] ; pivdeltak = -deltai/abarik ; setcleanzero(pivdeltak,dy_tols->zero) ; candk->piv.delta = pivdeltak ; pivinf = 0 ; if (pivdeltak < 0) { /* candk->pivdir = -1 ; */ newxk = ubk+pivdeltak ; if (belowbnd(newxk,lbk)) { pivinf = lbk-newxk ; } } else { /* candk->pivdir = 1 ; */ newxk = lbk+pivdeltak ; if (abovebnd(newxk,ubk)) { pivinf = newxk-ubk ; } } maxpivinf = pivinf ; /* Now it's just a straightforward grind. For each basic variable x s.t. abar != 0, calculate the affect on primal feasibility for x pivoted and flipped. abark should be groomed, so we can test for abar == 0. Update xbasic when we calculate the effect of the flip. Note that we need to consider unaffected x when calculating the max values --- they will hold for both pivot and flip. */ curinf = 0 ; flipinf = 0 ; maxflipinf = 0 ; for (lpos = 1 ; lpos <= m ; lpos++) { l = dy_basis[lpos] ; xl = xbasic[lpos] ; lbl = vlb[l] ; ubl = vub[l] ; if (abovebnd(xl,ubl)) { infl = xl-ubl ; } else if (belowbnd(xl,lbl)) { infl = lbl-xl ; } else { infl = 0 ; } abarlk = abark[lpos] ; if (abarlk == 0) { if (infl > maxpivinf) maxpivinf = infl ; if (infl > maxflipinf) maxflipinf = infl ; continue ; } curinf += infl ; newxl = xl-abarlk*pivdeltak ; if (abovebnd(newxl,ubl)) { infl = newxl-ubl ; } else if (belowbnd(newxl,lbl)) { infl = lbl-newxl ; } else { infl = 0 ; } pivinf += infl ; if (infl > maxpivinf) maxpivinf = infl ; if (flippable == TRUE) { newxl = xl-abarlk*flipdeltak ; if (abovebnd(newxl,ubl)) { infl = newxl-ubl ; } else if (belowbnd(newxl,lbl)) { infl = lbl-newxl ; } else { infl = 0 ; } xbasic[lpos] = newxl ; flipinf += infl ; if (infl > maxflipinf) maxflipinf = infl ; } } candk->piv.inf = -curinf+pivinf ; candk->piv.maxinf = maxpivinf ; if (flippable == TRUE) { candk->flip.inf = -curinf+flipinf ; candk->flip.maxinf = maxflipinf ; } # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t%s (%d) piv = %g, pivmax = %g", consys_nme(dy_sys,'v',k,FALSE,NULL),k, candk->piv.inf,candk->piv.maxinf) ; if (flippable == TRUE) { dyio_outfmt(dy_logchn,dy_gtxecho," flip = %g, flipmax = %g", candk->flip.inf,candk->flip.maxinf) ; } dyio_outfmt(dy_logchn,dy_gtxecho," pivdelta = %g",pivdeltak) ; if (flippable == TRUE) { dyio_outfmt(dy_logchn,dy_gtxecho," flipdelta = %g",flipdeltak) ; } } # endif /* That's it. The final thing we need to do is check on the status of the entering variable x. If this flip would change it, we have to disallow the flip. */ FREE(abark) ; xi = xbasic[ipos] ; if ((flgon(stati,vstatBUUB) && !abovebnd(xi,ubi)) || (flgon(stati,vstatBLLB) && !belowbnd(xi,lbi))) { return (0) ; } else { return (1) ; } } bool selectWithInf (int i, dualcand_struct *incands, int *indices, double *candinf, double *startinf) /* This routine scans the list of candidates x, calculating the primal infeasibility over all basic variables if x is flipped and if it's chosen as the pivot. This is an expensive calculation, because we'll need to calculate inv(B)a for each variable that we price. The candidates in incands are assumed to be sorted (see the comments with scanForDualInCands), and the calculation of infeasibility is based on the notion that all variables preceding the variable under evaluation will be flipped. In the end, selectWithInf will return up to three indices: (1) An index marking the end of a sequence of flips, with no final pivot, chosen so as to minimise the maximum primal infeasibility. (2) An index marking the end of a sequence of flips, with a final pivot, chose so as to minimise the maximum primal infeasibility. (3) An index marking the end of the longest possible sequence of flips, with a final pivot. Any or all of the above can be -1, indicating that there was no qualified candidate with the required qualities. Parameters: i: The index of x, the entering variable. incands: The list of candidates, indexed from 1. incands[0].ndx is the number of candidates. indices: (i) An array with three entries. (o) The index for candidate k is in indices[k-1]. candinf: (i) An array with three entries. (o) The infeasibilities corresponding to the candidates specified in indices. startinf (i) An array with two entries. (o) [0] is total infeasibility [1] is maximum infeasibility Returns: TRUE if the selection process proceeds without error, FALSE otherwise. */ { int m,j,jpos ; double xj,lbj,ubj,infj ; double *vlb,*vub ; double starttotinf,startmaxinf ; double *xbasic ; int ndx,candcnt,price_retval ; double flipinfk,pivinfk,totinfk ; int bestflipcand,bestpivcand,lastpivcand ; double bestflipinf,bestpivinf,lastpivinf ; bool pivEndsScan,flipEndsScan ; dualcand_struct *candk ; const char *rtnnme = "selectWithInf" ; # ifndef DYLP_NDEBUG int lastdegen = 0 ; # endif m = dy_sys->concnt ; vlb = dy_sys->vlb ; vub = dy_sys->vub ; /* We have multiple candidates and at least a chance to flip variables. To properly calculate the change in infeasibility, we'll need to know the infeasibility now, and we'll need a copy of xbasic that we can modify as we go. */ xbasic = (double *) MALLOC((m+1)*sizeof(double)) ; starttotinf = 0 ; startmaxinf = 0 ; for (jpos = 1 ; jpos <= m ; jpos++) { xbasic[jpos] = dy_xbasic[jpos] ; xj = xbasic[jpos] ; j = dy_basis[jpos] ; lbj = vlb[j] ; ubj = vub[j] ; infj = 0 ; if (belowbnd(xj,lbj)) { infj = lbj-xj ; } else if (abovebnd(xj,ubj)) { infj = xj-ubj ; } if (infj > startmaxinf) startmaxinf = infj ; starttotinf += infj ; } startinf[0] = starttotinf ; startinf[1] = startmaxinf ; # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n starting inf tot = %g, max = %g", starttotinf,startmaxinf) ; } # endif /* # ifdef DYLP_PARANOIA if (dy_lp->d2.iters > 0 && predictiter+1 == dy_lp->d2.iters) { if (!atbnd(predicttotinf,starttotinf)) { warn(350,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "total",predicttotinf,predictiter, starttotinf,predicttotinf-starttotinf) ; } if (!atbnd(predictmaxinf,startmaxinf)) { warn(350,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "maximum",predictmaxinf,predictiter, startmaxinf,predictmaxinf-startmaxinf) ; } } # endif */ /* For better or worse, we'll stick with the sort order while deciding what to do. calcInfChange will price a candidate x, determining the change in primal infeasibility when we flip the variable and when we choose it as the pivot. This is expensive, because we have to calculate inv(B)a to do the calculation. The predicted maximum primal infeasibility when we use a variable x as a pivot (piv.maxinf), includes the change due to flipping all candidates prior to x in the candidate list. The first nonflippable variable stops the scan --- we have to use it to pivot. Within the set of degenerate candidates, we can choose to do only flips. Once we get to nondegenerate candidates, we need to do a pivot with a dual delta greater than previous candidates in order to flip the previous candidates. We're perfectly happy to flip variables with mad pivots, but we won't use them as pivot candidates. */ bestpivcand = -1 ; bestflipcand = -1 ; lastpivcand = -1 ; bestpivinf = dy_tols->inf ; bestflipinf = dy_tols->inf ; lastpivinf = quiet_nan(0) ; pivEndsScan = FALSE ; flipEndsScan = FALSE ; candcnt = incands[0].ndx ; totinfk = 0 ; /* Scan the degenerate pivots. If we run across a nonflippable, nonreverse variable, we've found our entering variable. It's also possible that the cumulative effect of flips up to and including cand will make x feasible or drive it right past the opposite bound (price_retval == 0). In that case, we stop with cand, and can choose to flip it or pivot on it. Note that for reverse pivots, the primal variable will not change bound (we're recovering from slight dual infeasibility). */ for (ndx = 1,candk = &incands[1] ; candk->ddelta <= 0 && ndx <= candcnt ; ndx++,candk++) { if (candk->rev == FALSE) { price_retval = calcInfChange(candk,i,xbasic) ; } else { price_retval = 1 ; } if (price_retval < 0) { FREE(xbasic) ; errmsg(348,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters+1, consys_nme(dy_sys,'v',candk->ndx,FALSE,NULL),candk->ndx) ; return (FALSE) ; } flipinfk = candk->flip.maxinf ; pivinfk = candk->piv.maxinf ; totinfk += candk->flip.inf ; # if 0 predicttotinf = 0 ; for (jpos = 1 ; jpos <= m ; jpos++) { xj = xbasic[jpos] ; j = dy_basis[jpos] ; lbj = vlb[j] ; ubj = vub[j] ; if (belowbnd(xj,lbj)) { predicttotinf += lbj-xj ; } else if (abovebnd(xj,ubj)) { predicttotinf += xj-ubj ; } } if (dy_opts->print.pivoting >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n debug piv = %g, flip = %g, tot = %g, infeasibility = %g", pivinfk,flipinfk,totinfk,predicttotinf) ; } # endif if (candk->madpiv == FALSE) { lastpivcand = ndx ; lastpivinf = pivinfk ; if (pivinfk < bestpivinf) { bestpivcand = ndx ; bestpivinf = pivinfk ; } } if (candk->flippable == FALSE && candk->rev == FALSE) { pivEndsScan = TRUE ; break ; } if (flipinfk < bestflipinf) { bestflipcand = ndx ; bestflipinf = flipinfk ; } if (price_retval == 0) { flipEndsScan = TRUE ; if (candk->madpiv == FALSE) { lastpivcand = ndx ; lastpivinf = pivinfk ; } break ; } } # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 2 && ndx > 1) { if (pivEndsScan == TRUE || flipEndsScan == TRUE) { jpos = ndx ; } else { jpos = ndx-1 ; } lastdegen = jpos ; dyio_outfmt(dy_logchn,dy_gtxecho,"\n after %d degen",jpos) ; if (bestflipcand > 0) { j = incands[bestflipcand].ndx ; dyio_outfmt(dy_logchn,dy_gtxecho, ", best flip #%d, %s (%d) = %g",bestflipcand, consys_nme(dy_sys,'v',j,FALSE,NULL),j,bestflipinf) ; } if (bestpivcand > 0) { j = incands[bestpivcand].ndx ; dyio_outfmt(dy_logchn,dy_gtxecho,", best piv #%d, %s (%d) = %g", bestpivcand, consys_nme(dy_sys,'v',j,FALSE,NULL),j,bestpivinf) ; } if (lastpivcand > 0) { j = incands[lastpivcand].ndx ; dyio_outfmt(dy_logchn,dy_gtxecho,", last piv #%d, %s (%d) = %g", lastpivcand, consys_nme(dy_sys,'v',j,FALSE,NULL),j,lastpivinf) ; } if (bestflipcand < 0 && bestpivcand < 0 && lastpivcand < 0) { dyio_outfmt(dy_logchn,dy_gtxecho,", nothing") ; } dyio_outchr(dy_logchn,dy_gtxecho,'.') ; } # endif /* If we're not done, continue to scan the nondegenerate pivots. We no longer have the choice of just flipping, so we're only searching for a pivot candidate. If we get a return value of 0 from calcInfChange, it means we have to pivot at that variable. */ if (pivEndsScan == FALSE && flipEndsScan == FALSE) { for ( ; ndx <= candcnt ; ndx++,candk++) { price_retval = calcInfChange(candk,i,xbasic) ; if (price_retval < 0) { FREE(xbasic) ; errmsg(348,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters+1, consys_nme(dy_sys,'v',candk->ndx,FALSE,NULL),candk->ndx) ; return (FALSE) ; } flipinfk = candk->flip.maxinf ; pivinfk = candk->piv.maxinf ; totinfk += candk->flip.inf ; # if 0 bestinf = 0 ; for (jpos = 1 ; jpos <= m ; jpos++) { xj = xbasic[jpos] ; j = dy_basis[jpos] ; lbj = vlb[j] ; ubj = vub[j] ; if (belowbnd(xj,lbj)) { bestinf += lbj-xj ; } else if (abovebnd(xj,ubj)) { bestinf += xj-ubj ; } } if (dy_opts->print.pivoting >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n debug piv = %g, flip = %g, tot = %g, infeasibility = %g", pivinfk,flipinfk,starttotinf,bestinf) ; } # endif if (candk->madpiv == FALSE) { lastpivcand = ndx ; lastpivinf = pivinfk ; if (pivinfk < bestpivinf) { bestpivcand = ndx ; bestpivinf = pivinfk ; } } if (candk->flippable == FALSE || price_retval == 0) { pivEndsScan = TRUE ; if (candk->madpiv == FALSE) { lastpivcand = ndx ; lastpivinf = pivinfk ; } break ; } } # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 2) { if (pivEndsScan == TRUE || flipEndsScan == TRUE) { jpos = ndx ; } else { jpos = ndx-1 ; } dyio_outfmt(dy_logchn,dy_gtxecho, "\n after %d nondegen",jpos-lastdegen) ; if (bestflipcand > 0) { j = incands[bestflipcand].ndx ; dyio_outfmt(dy_logchn,dy_gtxecho, ", best flip #%d, %s (%d) = %g",bestflipcand, consys_nme(dy_sys,'v',j,FALSE,NULL),j,bestflipinf) ; } if (bestpivcand > 0) { j = incands[bestpivcand].ndx ; dyio_outfmt(dy_logchn,dy_gtxecho, ", best piv #%d, %s (%d) = %g",bestpivcand, consys_nme(dy_sys,'v',j,FALSE,NULL),j,bestpivinf) ; } if (lastpivcand > 0) { j = incands[lastpivcand].ndx ; dyio_outfmt(dy_logchn,dy_gtxecho, ", last piv #%d, %s (%d) = %g",lastpivcand, consys_nme(dy_sys,'v',j,FALSE,NULL),j,lastpivinf) ; } if (bestflipcand < 0 && bestpivcand < 0 && lastpivcand < 0) { dyio_outfmt(dy_logchn,dy_gtxecho,", nothing") ; } dyio_outchr(dy_logchn,dy_gtxecho,'.') ; } # endif } FREE(xbasic) ; # ifdef DYLP_PARANOIA if ((bestpivcand > 0 && lastpivcand < 0) || (bestpivcand < 0 && lastpivcand > 0)) { errmsg(1,rtnnme,__LINE__) ; return (FALSE) ; } # endif /* Load up the return values and we're done. */ indices[0] = bestflipcand ; indices[1] = bestpivcand ; indices[2] = lastpivcand ; if (bestflipcand > 0) { candinf[0] = bestflipinf ; } else { candinf[0] = quiet_nan(0) ; } if (bestpivcand > 0) { candinf[1] = bestpivinf ; } else { candinf[0] = quiet_nan(0) ; } if (lastpivcand > 0) { candinf[2] = lastpivinf ; } else { candinf[0] = quiet_nan(0) ; } return (TRUE) ; } bool selectWithoutInf (int i, double *abari, dualcand_struct *incands, int *indices) /* This routine scans the list of candidates x, calculating the primal infeasibility of the leaving variable x if x is flipped and if it's chosen as the pivot. This is pretty cheap, because we already have the pivot row handy. The candidates in incands are assumed to be sorted (see the comments with scanForDualInCands), and the calculation of infeasibility is based on the notion that all variables preceding the variable under evaluation will be flipped (or are reverse pivots, correcting slight dual infeasibility). In the end, selectWithoutInf will return up to two indices: (1) An index marking the end of the longest possible sequence of flips, with no final pivot. (2) (Reserved, for compatibility with selectWithInf.) (3) An index marking the end of the longest possible sequence of flips, with a final pivot. Any or all of the above can be -1, indicating that there was no qualified candidate with the required qualities. Parameters: i: The index of x, the entering variable. abari: The pivot row inv(B)N. incands: The list of candidates, indexed from 1. incands[0].ndx is the number of candidates. indices: (i) An array with three entries. (o) The index for candidate k is in indices[k-1]. indices[1] is always -1. Returns: TRUE if the selection process proceeds without error, FALSE otherwise. */ { int m ; double *vlb,*vub ; int ipos ; double xi,lbi,ubi ; flags stati ; int k ; double lbk,ubk,deltak,abarik ; flags statk ; double startinf ; int ndx,candcnt ; int lastflipcand,lastpivcand ; bool pivEndsScan,flipEndsScan,flipsOnly ; dualcand_struct *candk ; # ifndef DYLP_NDEBUG int j,jndx,lastdegen ; lastdegen = 0 ; # endif /* # ifdef DYLP_PARANOIA const char *rtnnme = "selectWithOutInf" ; # endif */ m = dy_sys->concnt ; vlb = dy_sys->vlb ; vub = dy_sys->vub ; /* We have multiple candidates and at least a chance to flip variables. To properly track the change in infeasibility for x, we'll need to know the infeasibility now. */ ipos = dy_var2basis[i] ; stati = dy_status[i] ; xi = dy_x[i] ; ubi = vub[i] ; lbi = vlb[i] ; if (flgon(stati,vstatBUUB)) { startinf = xi-ubi ; } else { startinf = lbi-xi ; } # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n starting inf<%d> = %g",i,startinf) ; } # endif /* # ifdef DYLP_PARANOIA if (dy_lp->d2.iters == 0) { predictinf = 0 ; predictiter = 0 ; } else if (dy_lp->d2.iters > 0 && predictiter+1 == dy_lp->d2.iters) { if (!atbnd(predictinf,startinf)) { warn(350,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "x",predictinf,predictiter,startinf,predictinf-startinf) ; } } # endif */ /* For better or worse, we'll stick with the sort order while deciding what to do. Given that we're only tracking the infeasibility of the leaving variable x, we walk the candidates until a sequence of flips makes x feasible, or until we come across a variable we have to use as a pivot. We're perfectly happy to flip variables with mad pivots, but we won't use them as pivot candidates. */ lastflipcand = -1 ; lastpivcand = -1 ; pivEndsScan = FALSE ; flipEndsScan = FALSE ; candcnt = incands[0].ndx ; /* Scan the degenerate and reverse pivots. The scan ends when we run into a nonflippable, non-reverse candidate, or when the accumulated effect of flips drives x within bounds or right out the other side of its feasible region. Any x with a stable pivot (including reverse) is a candidate for pivoting. The primal variable associated with a reverse pivot will not actually flip (remember, we're recovering from slight dual infeasibility). We'll consider a sequence of flips until the accumulated change drives x into or through feasibility. If x ends up feasible, then it's possible to consider a `pivot' sequence that has only flips, with no final pivot. Mad pivots are not a problem for flipping --- the flip simply has little effect on x. */ for (ndx = 1,candk = &incands[1] ; ndx <= candcnt && candk->ddelta <= 0 ; ndx++,candk++) { k = candk->ndx ; if (candk->madpiv == FALSE) { lastpivcand = ndx ; } if (candk->flippable == FALSE && candk->rev == FALSE) { pivEndsScan = TRUE ; break ; } if (candk->rev == TRUE) continue ; statk = dy_status[k] ; lbk = vlb[k] ; ubk = vub[k] ; if (flgon(statk,vstatNBLB)) { deltak = ubk-lbk ; } else { deltak = lbk-ubk ; } abarik = abari[k] ; xi -= abarik*deltak ; if ((flgon(stati,vstatBUUB) && !abovebnd(xi,ubi)) || (flgon(stati,vstatBLLB) && !belowbnd(xi,lbi))) { if (withinbnds(lbi,xi,ubi)) { lastflipcand = ndx ; } flipEndsScan = TRUE ; break ; } } /* If flips alone can drive us to feasibility, then we'll consider using a sequence of flips with no final pivot. Note that the condition that x be feasible for a flip-only sequence is not enough to prevent cycling. Consider two basic variables x<1> and x<2> and a nonbasic variable x<3>. I've seen instances where x<1> is selected to leave, and a flip of x<3> drives x<1> feasible and x<2> infeasible. x<2> is now selected to leave, and x<3> is selected to flip, which drives x<2> feasible and x infeasible. Etc., ad infinitum. */ if (flipEndsScan == TRUE && lastflipcand > 0) { flipsOnly = TRUE ; } else { flipsOnly = FALSE ; } # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 2 && ndx >= 1) { if (pivEndsScan == TRUE || flipEndsScan == TRUE) { jndx = ndx ; } else { jndx = ndx-1 ; } lastdegen = jndx ; if (jndx > 0) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n after %d degen",jndx) ; if (lastflipcand > 0) { j = incands[lastflipcand].ndx ; dyio_outfmt(dy_logchn,dy_gtxecho, ", last flip #%d, %s (%d)",lastflipcand, consys_nme(dy_sys,'v',j,FALSE,NULL),j) ; } if (lastpivcand > 0) { j = incands[lastpivcand].ndx ; dyio_outfmt(dy_logchn,dy_gtxecho,", last piv #%d, %s (%d)", lastpivcand,consys_nme(dy_sys,'v',j,FALSE,NULL),j) ; } if (lastflipcand < 0 && lastpivcand < 0) { dyio_outfmt(dy_logchn,dy_gtxecho,", nothing") ; } dyio_outchr(dy_logchn,dy_gtxecho,'.') ; } } # endif /* If we're not done, continue to scan the nondegenerate pivots. We no longer have the choice of just flipping, so we're only searching for a pivot candidate. But we still need to track reductions in x due to flips. */ if (pivEndsScan == FALSE && flipEndsScan == FALSE) { for ( ; ndx <= candcnt ; ndx++,candk++) { k = candk->ndx ; if (candk->madpiv == FALSE) { lastpivcand = ndx ; } if (candk->flippable == FALSE) { pivEndsScan = TRUE ; break ; } statk = dy_status[k] ; lbk = vlb[k] ; ubk = vub[k] ; if (flgon(statk,vstatNBLB)) { deltak = ubk-lbk ; } else { deltak = lbk-ubk ; } abarik = abari[k] ; xi -= abarik*deltak ; if ((flgon(stati,vstatBUUB) && !abovebnd(xi,ubi)) || (flgon(stati,vstatBLLB) && !belowbnd(xi,lbi))) { flipEndsScan = TRUE ; break ; } } # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 2) { if (pivEndsScan == TRUE || flipEndsScan == TRUE) { jndx = ndx ; } else { jndx = ndx-1 ; } dyio_outfmt(dy_logchn,dy_gtxecho, "\n after %d nondegen",jndx-lastdegen) ; if (lastflipcand > 0) { j = incands[lastflipcand].ndx ; dyio_outfmt(dy_logchn,dy_gtxecho, ", last flip #%d, %s (%d)",lastflipcand, consys_nme(dy_sys,'v',j,FALSE,NULL),j) ; } if (lastpivcand > 0) { j = incands[lastpivcand].ndx ; dyio_outfmt(dy_logchn,dy_gtxecho,", last piv #%d, %s (%d)",lastpivcand, consys_nme(dy_sys,'v',j,FALSE,NULL),j) ; } if (lastflipcand < 0 && lastpivcand < 0) { dyio_outfmt(dy_logchn,dy_gtxecho,", nothing") ; } dyio_outchr(dy_logchn,dy_gtxecho,'.') ; } # endif } /* Load up the return values and we're done. */ if (flipsOnly == TRUE) { indices[0] = lastflipcand ; } else { indices[0] = -1 ; } indices[1] = -1 ; indices[2] = lastpivcand ; return (TRUE) ; } dyret_enum dualmultiin (int i, int outdir, int *p_xjndx, int *p_indir, double *abari, double maxabari, double **p_abarj) /* Implements the selection algorithm described at the head of the file. If there are variables to flip, the routine will flip them before returning the final pivot variable. On return, p_xjndx and p_indir will be set just as for normal dualin. Parameters: i: index of the leaving variable x outdir: direction of movement of x, 1 if rising to lower bound -1 if falling to upper bound p_xjndx: index of the variable chosen as pivot p_indir: direction of motion for x; 1 for rising, -1 for falling abari: row i of inv(B)N (the pivot row) maxabari: maximum value in abar p_abarj: (o) used to return abar Returns: dyret_enum code, as follows: dyrOK: the pivot is (dual) nondegenerate dyrDEGEN: the pivot is (dual) degenerate dyrUNBOUND: the problem is dual unbounded (primal infeasible) (i.e., no incoming variable can be selected) dyrMADPIV: if a fails the numerical stability test dyrRESELECT: if the routine elects to do only flips dyrFATAL: fatal confusion */ { int n,m,candcnt ; double *vub,*vlb,*accumj ; dyret_enum retval,upd_retval,confirm ; bool swing,reqchk,flipOnly,sel_retval ; int j ; double xj,deltaj,starttotinf,startmaxinf ; flags statj ; int dpstrat,candndx[4] ; double candinf[4],startinf[2] ; int ndx,bestpivcand,bestflipcand,lastpivcand,bestcand ; double bestpivinf,lastpivinf,bestflipinf,bestinf ; dualcand_struct *incands,*candk ; const char *rtnnme = "dualmultiin" ; /* dy_dualpivot.c */ dyret_enum dy_confirmDualPivot(int i, int j, double *abari, double maxabari, double **p_abarj) ; # ifndef DYLP_NDEBUG double infj ; # endif /* Setup */ retval = dyrINV ; *p_xjndx = 0 ; *p_indir = 0 ; n = dy_sys->varcnt ; m = dy_sys->concnt ; vub = dy_sys->vub ; vlb = dy_sys->vlb ; incands = (dualcand_struct *) MALLOC((n-m+1)*sizeof(dualcand_struct)) ; /* Determine our strategy: 1: maximum objective improvement 2: minimum predicted infeasibility 3: infeasibility reduction if possible, otherwise maximum objective improvement. If we move to strategy 2 or 3, loosen dfeas accordingly. Chances are good that these breakpoints and toobig will change, and/or become parameters. Some experimentation is required. */ if (dy_opts->dpsel.flex == TRUE) { if (dy_lp->prim.max > dy_tols->toobig/100) { dy_opts->dpsel.strat = 2 ; } else if (dy_lp->prim.max > dy_tols->toobig/1000) { dy_opts->dpsel.strat = 3 ; } else { dy_opts->dpsel.strat = 1 ; } } dpstrat = dy_opts->dpsel.strat ; # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: selecting entering variable, strategy %d", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters+1,dpstrat) ; } # endif # ifdef DYLP_STATISTICS if (dy_stats != NULL) dy_stats->dmulti.cnt++ ; # endif /* Generate a sorted list of candidates to enter. No candidates means we're dual unbounded (dyrUNBOUND). Fatal error (dyrFATAL) is possible only if we're paranoid. */ retval = scanForDualInCands(incands,outdir,abari,maxabari) ; if (retval != dyrOK) { *p_xjndx = -1 ; FREE(incands) ; return (retval) ; } candk = &incands[0] ; candcnt = candk->ndx ; candk++ ; # ifdef DYLP_STATISTICS if (dy_stats != NULL) dy_stats->dmulti.cands += candcnt ; # endif /* If we have only one candidate, or the first candidate isn't flippable, we have no choice. Confirm that there's no numerical drift, then we can return, saving a large amount of work. */ if (candcnt == 1 || (candk->flippable == FALSE && candk->rev == FALSE)) { *p_xjndx = candk->ndx ; *p_indir = candk->pivdir ; if (candk->madpiv == TRUE) { retval = dyrMADPIV ; } else if (candk->ddelta == 0) { retval = dyrDEGEN ; } else { retval = dyrOK ; } confirm = dy_confirmDualPivot(i,candk->ndx,abari,maxabari,p_abarj) ; if (confirm != dyrOK) retval = confirm ; FREE(incands) ; return (retval) ; } /* We have multiple candidates and at least a chance to flip variables or correct slight infeasibilities. The question is how much effort we'll need to put into pricing. If primal magnitudes are reasonable, we can attempt to select a sequence considering only the dual objective (i.e., find the longest sequence). If the primal magnitudes are over the top, we'd better pay attention to primal infeasibility. Note that the various infeasibilities are not considered in any way for strategy #1. The assignment below (quiet_nan) mollifies access checking and guarantees we'll see the effect of improper use. */ # ifdef DYLP_STATISTICS if (dy_stats != NULL) dy_stats->dmulti.nontrivial++ ; # endif if (dpstrat == 1) { sel_retval = selectWithoutInf(i,abari,incands,candndx) ; } else { sel_retval = selectWithInf(i,incands,candndx,candinf,startinf) ; } if (sel_retval == FALSE) { FREE(incands) ; return (dyrFATAL) ; } bestflipcand = candndx[0] ; bestpivcand = candndx[1] ; lastpivcand = candndx[2] ; if (dpstrat != 1) { bestflipinf = candinf[0] ; bestpivinf = candinf[1] ; lastpivinf = candinf[2] ; starttotinf = startinf[0] ; startmaxinf = startinf[1] ; } else { bestflipinf = quiet_nan(0) ; bestpivinf = quiet_nan(0) ; lastpivinf = quiet_nan(0) ; starttotinf = quiet_nan(0) ; startmaxinf = quiet_nan(0) ; } # if (!defined(DYLP_NDEBUG) || defined(DYLP_PARANOIA)) if (dpstrat == 1) { if (flgon(dy_status[i],vstatBLLB)) { starttotinf = vlb[i]-dy_x[i] ; } else { starttotinf = dy_x[i]-vub[i] ; } } # endif /* What shall we do? * dualmultipiv == 1 forces lastpivcand (max dual objective change) * dualmultipiv == 2 forces bestpivcand (min predicted infeasibility) * dualmultipiv == 3 will choose bestpivcand only if there's an actual reduction in infeasibility; otherwise, it'll choose lastpivcand, unless lastpivcand is degenerate, in which case it'll go back to bestpivcand. Note that bestpivcand > 0 iff lastpivcand > 0. If we have no pivot candidate, we'll consider doing only flips, but only if it'll actually reduce infeasibility. In the event that we have no pivot candidate and can't or choose not to flip, return the first candidate (which will be a mad pivot). */ switch (dpstrat) { case 1: { bestcand = lastpivcand ; bestinf = lastpivinf ; break ; } case 2: { bestcand = bestpivcand ; bestinf = bestpivinf ; break ; } case 3: { if (bestpivcand > 0) { if (bestpivinf < startmaxinf) { bestcand = bestpivcand ; bestinf = bestpivinf ; } else if (incands[lastpivcand].ddelta > 0) { bestcand = lastpivcand ; bestinf = lastpivinf ; } else { bestcand = bestpivcand ; bestinf = bestpivinf ; } } else { bestcand = -1 ; bestinf = quiet_nan(0) ; } break ; } default: { errmsg(1,rtnnme,__LINE__) ; FREE(incands) ; return (dyrFATAL) ; } } flipOnly = FALSE ; if (bestcand <= 0) { if (dy_opts->dpsel.allownopiv == TRUE && bestflipcand > 0 && (dpstrat == 1 || bestflipinf < startmaxinf)) { flipOnly = TRUE ; bestcand = bestflipcand ; bestinf = bestflipinf ; } else { bestcand = 1 ; } } candk = &incands[bestcand] ; # ifdef DYLP_STATISTICS if (dy_stats != NULL && bestcand > 0) { dy_stats->dmulti.pivrnks += bestcand ; if (dy_stats->dmulti.maxrnk < bestcand) dy_stats->dmulti.maxrnk = bestcand ; } # endif # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 1) { j = candk->ndx ; infj = starttotinf ; if (dpstrat > 1) { for (ndx = 1 ; ndx < bestcand ; ndx++) { infj += incands[ndx].flip.inf ; } if (flipOnly == TRUE) infj += candk->flip.inf ; else infj += candk->piv.inf ; } dyio_outfmt(dy_logchn,dy_gtxecho, "\n selected %s #%d, %s (%d), est. maxinf = %g, totinf = %g", (flipOnly == TRUE)?"flip":"pivot", bestcand,consys_nme(dy_sys,'v',j,FALSE,NULL),j, bestinf,infj) ; } # endif /* # ifdef DYLP_PARANOIA if (dy_opts->dpsel.strat >= 2 && incands[bestcand].madpiv == FALSE) { predictiter = dy_lp->d2.iters ; predicttotinf = starttotinf ; for (ndx = 1 ; ndx < bestcand ; ndx++) { predicttotinf += incands[ndx].flip.inf ; } if (flipOnly == TRUE) predicttotinf += candk->flip.inf ; else predicttotinf += candk->piv.inf ; predictmaxinf = bestinf ; } # endif */ /* We've made our choice. But ... if this is a degenerate pivot, and antidegeneracy can be activated, let's hold off for a moment. */ if (candk->ddelta == 0) { if (dy_opts->degen == TRUE && dy_opts->degenpivlim < dy_lp->degenpivcnt) { *p_xjndx = candk->ndx ; *p_indir = candk->pivdir ; retval = dyrDEGEN ; FREE(incands) ; return (retval) ; } } /* One last check --- confirm that abar from abar agrees with abar from abar = inv(B)a. */ confirm = dy_confirmDualPivot(i,candk->ndx,abari,maxabari,p_abarj) ; if (confirm != dyrOK) { *p_xjndx = candk->ndx ; *p_indir = candk->pivdir ; FREE(incands) ; return (confirm) ; } /* If there are flips to perform, we need to handle them now before we can return and let dy_dualpivot handle the actual pivot. Rather than doing a separate ftran for each a, accumulate delta*a in accum for all variables and then do a single ftran. But do update the objective as we process each column. Reverse pivots will not flip. When we're doing only flips, boost bestcand by 1 so that we'll flip the candidate specified by bestcand, instead of reserving it for pivoting (and undo the increment after the loop ends). */ swing = FALSE ; reqchk = FALSE ; if (bestcand > 1 || flipOnly == TRUE) { if (flipOnly == TRUE) bestcand++ ; accumj = (double *) CALLOC((m+1),sizeof(double)) ; for (ndx = 1 ; ndx < bestcand ; ndx++) { candk = &incands[ndx] ; j = candk->ndx ; statj = dy_status[j] ; if (candk->rev == TRUE) { # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tpassing reverse %s (%d) %s = %g.", consys_nme(dy_sys,'v',j,FALSE,NULL),j, dy_prtvstat(statj),dy_x[j]) ; } # endif continue ; } # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\tflipping %s (%d) %s = %g to ", consys_nme(dy_sys,'v',j,FALSE,NULL),j, dy_prtvstat(statj),dy_x[j]) ; } # endif comflg(statj,vstatNBUB|vstatNBLB) ; if (flgon(statj,vstatNBLB)) { xj = vlb[j] ; } else { xj = vub[j] ; } dy_status[j] = statj ; dy_x[j] = xj ; # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho,"%s = %g.", dy_prtvstat(dy_status[j]),dy_x[j]) ; } # endif # ifdef DYLP_STATISTICS if (dy_stats != NULL) dy_stats->dmulti.flips++ ; # endif deltaj = candk->flip.delta ; if (dy_ddegenset[j] == 0) { dy_lp->z += dy_cbar[j]*deltaj ; } if (consys_mulaccumcol(dy_sys,j,deltaj,accumj) == FALSE) { errmsg(122,rtnnme,dy_sys->nme, "column",consys_nme(dy_sys,'v',j,TRUE,NULL),j) ; retval = dyrFATAL ; break ; } } if (retval == dyrFATAL) { if (accumj != NULL) FREE(accumj) ; FREE(incands) ; return (retval) ; } if (flipOnly == TRUE) bestcand-- ; /* Ftran the accumulated SUM{j in cands}delta*a and pass it to dy_updateprimals to update the basic variables. */ dy_ftran(accumj,FALSE) ; upd_retval = dy_updateprimals(candk->ndx,1.0,accumj) ; switch (upd_retval) { case dyrOK: { break ; } case dyrSWING: { swing = TRUE ; break ; } case dyrREQCHK: { reqchk = TRUE ; break ; } default: { retval = dyrFATAL ; break ; } } FREE(accumj) ; /* There's a remote chance that the flips will reduce x exactly to bound. (Yes, it's happened.) Catch this at the end of the loop, and claim flips only when it happens, abandoning the prospective pivot. */ if (flgoff(dy_status[i],vstatBUUB|vstatBLLB)) { flipOnly = TRUE ; # ifndef DYLP_NDEBUG if (dy_opts->print.pivoting >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n whoa! %s (%d) = %g %s after flips; cancelling pivot.", consys_nme(dy_sys,'v',i,FALSE,NULL),i,dy_x[i], dy_prtvstat(dy_status[i])) ; } # endif } if (retval == dyrFATAL) { FREE(incands) ; return (retval) ; } } /* If we have a pivot to recommend, set up the return values so we look like the usual dualin return. If we don't have a pivot to recommend, return dyrRESELECT, to indicate that we should try reselecting the leaving variable. Note that here we prefer dyrMADPIV over dyrDEGEN --- if antidegeneracy was active, we'd have taken the earlier return. We're going to use this pivot, degenerate or not, so it's more important to know that it's unstable. */ if (flipOnly == FALSE) { candk = &incands[bestcand] ; *p_xjndx = candk->ndx ; *p_indir = candk->pivdir ; if (candk->madpiv == TRUE) { retval = dyrMADPIV ; } else if (candk->ddelta == 0) { retval = dyrDEGEN ; } else { retval = dyrOK ; } } else { retval = dyrRESELECT ; } FREE(incands) ; return (retval) ; } DyLP-1.6.0/DyLP/src/Dylp/glplib2.c0000644000076700007670000001155010632415522013274 0ustar /* glplib2.c */ /*---------------------------------------------------------------------- -- Copyright (C) 2000, 2001, 2002 Andrew Makhorin , -- Department for Applied Informatics, Moscow Aviation -- Institute, Moscow, Russia. All rights reserved. -- -- This file is a part of GLPK (GNU Linear Programming Kit). -- -- Licensed under the Common Public License (CPL) by permission of the -- author for inclusion in the DyLP LP distribution. ----------------------------------------------------------------------*/ #ifndef UNUSED # if defined(_GNU_SOURCE) || defined(__GNUC__) # define UNUSED __attribute__((unused)) # else # define UNUSED # endif #endif static char sccsid[] UNUSED = "@(#)glplib2.c 1.2 09/25/04" ; static char svnid[] UNUSED = "$Id: glplib2.c 148 2007-06-09 03:15:30Z lou $" ; #include #include #include #include "glplib.h" /*---------------------------------------------------------------------- -- init_lib_env - initialize library environment. -- -- *Synopsis* -- -- #include "glplib.h" -- int init_lib_env(void); -- -- *Description* -- -- The routine init_lib_env creates and initializes library environment -- block used by other low-level library routines. -- -- If it is neccessary, this routine is called automatically, therefore -- the user needn't to call it explicitly. -- -- *Returns* -- -- The routine returns one of the following error codes: -- -- 0 - no errors; -- 1 - the library environment has been already initialized; -- 2 - initialization failed. */ int init_lib_env(void) { ENV *env; /* obtain a pointer to the environmental block */ env = read_pointer(); /* check if the environment has been initialized */ if (env != NULL) return 1; /* allocate the environmental block */ env = malloc(sizeof(ENV)); /* check if the block has been successfully allocated */ if (env == NULL) return 2; /* initialize the environmental block */ env->mem_ptr = NULL; env->mem_limit = INT_MAX; env->mem_total = 0; env->mem_tpeak = 0; env->mem_count = 0; env->mem_cpeak = 0; /* save a pointer to the environmental block */ save_pointer(env); /* initialization completed */ return 0; } /*---------------------------------------------------------------------- -- get_env_ptr - obtain a pointer to the environmental block. -- -- *Synopsis* -- -- #include "glplib.h" -- ENV *get_env_ptr(void); -- -- *Description* -- -- The routine get_env_ptr obtains and returns a pointer to the library -- environmental block. -- -- If the library environment has not been initialized yet, the routine -- performs initialization. If initialization fails, the routine prints -- an error message to stderr and abnormally terminates the program. -- -- *Returns* -- -- The routine returns a pointer to the environmental block. */ ENV *get_env_ptr(void) { ENV *env; /* obtain a pointer to the environmental block */ env = read_pointer(); /* check if the environment has been initialized */ if (env == NULL) { /* not initialized yet; perform initialization */ if (init_lib_env() != 0) { /* initialization failed; print an error message */ fprintf(stderr, "\nget_env_ptr: initialization failed\n"); fflush(stderr); /* and abnormally terminate the program */ abort(); } /* initialization completed; obtain a pointer */ env = read_pointer(); } return env; } /*---------------------------------------------------------------------- -- free_lib_env - deinitialize library environment. -- -- *Synopsis* -- -- #include "glplib.h" -- int free_lib_env(void); -- -- *Description* -- -- The routine free_lib_env frees all resources (memory blocks, etc.), -- which was allocated by the library routines and which are currently -- still in use. -- -- The user needn't to call this routine until he wishes to explicitly -- free all the resources. -- -- *Returns* -- -- The routine returns one of the following codes: -- -- 0 - no errors; -- 1 - the library environment is inactive (not initialized); -- 2 - deinitialization completed, but the routine was unable to free -- some resources properly. */ int free_lib_env(void) { ENV *env; /* obtain a pointer to the environmental block */ env = read_pointer(); /* check if the environment has been initialized */ if (env == NULL) return 1; /* free memory blocks, which are still allocated */ while (env->mem_ptr != NULL) { MEM *this = env->mem_ptr; env->mem_ptr = this->next; free(this); } /* free memory allocated to the environmental block */ free(env); /* reset a pointer to the environmental block */ save_pointer(NULL); /* deinitialization completed */ return 0; } /* eof */ DyLP-1.6.0/DyLP/src/Dylp/glpluf.c0000644000076700007670000021370010632415522013233 0ustar /* glpluf.c */ /*---------------------------------------------------------------------- -- Copyright (C) 2000, 2001, 2002 Andrew Makhorin , -- Department for Applied Informatics, Moscow Aviation -- Institute, Moscow, Russia. All rights reserved. -- -- This file is a part of GLPK (GNU Linear Programming Kit). -- -- Licensed under the Common Public License (CPL) by permission of the -- author for inclusion in the DyLP LP distribution. ----------------------------------------------------------------------*/ #ifndef UNUSED # if defined(_GNU_SOURCE) || defined(__GNUC__) # define UNUSED __attribute__((unused)) # else # define UNUSED # endif #endif static char sccsid[] UNUSED = "@(#)glpluf.c 1.2 09/25/04" ; static char svnid[] UNUSED = "$Id: glpluf.c 148 2007-06-09 03:15:30Z lou $" ; #include #include #include #include "glplib.h" #include "glpluf.h" /*---------------------------------------------------------------------- -- luf_create - create LU-factorization. -- -- *Synopsis* -- -- #include "glpluf.h" -- LUF *luf_create(int n, int sv_size); -- -- *Description* -- -- The routine luf_create creates LU-factorization data structure for -- a matrix of the order n. Initially the factorization corresponds to -- the unity matrix (F = V = P = Q = I, so A = I). -- -- The parameter sv_size specifies initial size of the sparse vector -- area (SVA) in locations. If sv_size = 0, the routine uses a default -- initial size of SVA. -- -- *Returns* -- -- The routine returns a pointer to the created LU-factorization data -- structure, which represents the unity matrix of the order n. */ LUF *luf_create(int n, int sv_size) { LUF *luf; int i, j, k; if (n < 1) fault("luf_create: n = %d; invalid parameter", n); if (sv_size < 0) fault("luf_create: sv_size = %d; invalid parameter", sv_size); if (sv_size == 0) sv_size = 5 * (n + 10); luf = umalloc(sizeof(LUF)); luf->n = n; luf->valid = 1; /* matrix F in row-wise format (initially F = I) */ luf->fr_ptr = ucalloc(1+n, sizeof(int)); luf->fr_len = ucalloc(1+n, sizeof(int)); for (i = 1; i <= n; i++) { luf->fr_ptr[i] = sv_size + 1; luf->fr_len[i] = 0; } /* matrix F in column-wise format (initially F = I) */ luf->fc_ptr = ucalloc(1+n, sizeof(int)); luf->fc_len = ucalloc(1+n, sizeof(int)); for (j = 1; j <= n; j++) { luf->fc_ptr[j] = sv_size + 1; luf->fc_len[j] = 0; } /* matrix V in row-wise format (initially V = I) */ luf->vr_ptr = ucalloc(1+n, sizeof(int)); luf->vr_len = ucalloc(1+n, sizeof(int)); luf->vr_cap = ucalloc(1+n, sizeof(int)); luf->vr_piv = ucalloc(1+n, sizeof(double)); for (i = 1; i <= n; i++) { luf->vr_ptr[i] = 1; luf->vr_len[i] = 0; luf->vr_cap[i] = 0; luf->vr_piv[i] = 1.0; } /* matrix V in column-wise format (initially V = I) */ luf->vc_ptr = ucalloc(1+n, sizeof(int)); luf->vc_len = ucalloc(1+n, sizeof(int)); luf->vc_cap = ucalloc(1+n, sizeof(int)); for (j = 1; j <= n; j++) { luf->vc_ptr[j] = 1; luf->vc_len[j] = 0; luf->vc_cap[j] = 0; } /* matrix P (initially P = I) */ luf->pp_row = ucalloc(1+n, sizeof(int)); luf->pp_col = ucalloc(1+n, sizeof(int)); for (k = 1; k <= n; k++) { luf->pp_row[k] = k; luf->pp_col[k] = k; } /* matrix Q (initially Q = I) */ luf->qq_row = ucalloc(1+n, sizeof(int)); luf->qq_col = ucalloc(1+n, sizeof(int)); for (k = 1; k <= n; k++) { luf->qq_row[k] = k; luf->qq_col[k] = k; } /* sparse vector area (initially all locations are free) */ luf->sv_size = sv_size; luf->sv_beg = 1; luf->sv_end = sv_size + 1; luf->sv_ndx = ucalloc(1+sv_size, sizeof(int)); luf->sv_val = ucalloc(1+sv_size, sizeof(double)); /* initially all rows and columns of the matrix V are empty, and therefore the order 1, ..., n, n+1, ..., n+n is used */ luf->sv_head = 1; luf->sv_tail = n+n; luf->sv_prev = ucalloc(1+n+n, sizeof(int)); luf->sv_next = ucalloc(1+n+n, sizeof(int)); for (k = 1; k <= n+n; k++) { luf->sv_prev[k] = k-1; luf->sv_next[k] = k+1; } luf->sv_next[n+n] = 0; /* allocate working arrays */ luf->flag = ucalloc(1+n, sizeof(int)); luf->work = ucalloc(1+n, sizeof(double)); /* set default values of control parameters */ luf->new_sva = 0; luf->piv_tol = 0.10; luf->piv_lim = 4; luf->suhl = 1; luf->eps_tol = 1e-15; luf->max_gro = 1e+12; /* set statistics for the initial factorization */ luf->nnz_a = n; luf->nnz_f = 0; luf->nnz_v = 0; luf->max_a = 1.0; luf->big_v = 1.0; luf->rank = n; return luf; } /*---------------------------------------------------------------------- -- luf_defrag_sva - defragment the sparse vector area. -- -- *Synopsis* -- -- #include "glpluf.h" -- void luf_defrag_sva(LUF *luf); -- -- *Description* -- -- The routine luf_defrag_sva defragments the sparse vector area (SVA) -- gathering all unused locations in one continuous extent. In order to -- do that the routine moves all unused locations from the left part of -- SVA (which contains rows and columns of the matrix V) to the middle -- part (which contains free locations). This is attained by relocating -- elements of rows and columns of the matrix V toward the beginning of -- the left part. -- -- NOTE that this "garbage collection" involves changing row and column -- pointers of the matrix V. */ void luf_defrag_sva(LUF *luf) { int n = luf->n; int *vr_ptr = luf->vr_ptr; int *vr_len = luf->vr_len; int *vr_cap = luf->vr_cap; int *vc_ptr = luf->vc_ptr; int *vc_len = luf->vc_len; int *vc_cap = luf->vc_cap; int *sv_ndx = luf->sv_ndx; double *sv_val = luf->sv_val; int *sv_next = luf->sv_next; int sv_beg = 1; int i, j, k; /* skip rows and columns, which needn't to be relocated */ for (k = luf->sv_head; k != 0; k = sv_next[k]) { if (k <= n) { /* i-th row of the matrix V */ i = k; if (vr_ptr[i] != sv_beg) break; vr_cap[i] = vr_len[i]; sv_beg += vr_cap[i]; } else { /* j-th column of the matrix V */ j = k - n; if (vc_ptr[j] != sv_beg) break; vc_cap[j] = vc_len[j]; sv_beg += vc_cap[j]; } } /* relocate other rows and columns in order to gather all unused locations in one continuous extent */ for (k = k; k != 0; k = sv_next[k]) { if (k <= n) { /* i-th row of the matrix V */ i = k; memmove(&sv_ndx[sv_beg], &sv_ndx[vr_ptr[i]], vr_len[i] * sizeof(int)); memmove(&sv_val[sv_beg], &sv_val[vr_ptr[i]], vr_len[i] * sizeof(double)); vr_ptr[i] = sv_beg; vr_cap[i] = vr_len[i]; sv_beg += vr_cap[i]; } else { /* j-th column of the matrix V */ j = k - n; memmove(&sv_ndx[sv_beg], &sv_ndx[vc_ptr[j]], vc_len[j] * sizeof(int)); memmove(&sv_val[sv_beg], &sv_val[vc_ptr[j]], vc_len[j] * sizeof(double)); vc_ptr[j] = sv_beg; vc_cap[j] = vc_len[j]; sv_beg += vc_cap[j]; } } /* set new pointer to the beginning of the free part */ luf->sv_beg = sv_beg; return; } /*---------------------------------------------------------------------- -- luf_enlarge_row - enlarge row capacity. -- -- *Synopsis* -- -- #include "glpluf.h" -- int luf_enlarge_row(LUF *luf, int i, int cap); -- -- *Description* -- -- The routine luf_enlarge_row enlarges capacity of the i-th row of the -- matrix V to cap locations (assuming that its current capacity is less -- than cap). In order to do that the routine relocates elements of the -- i-th row to the end of the left part of SVA (which contains rows and -- columns of the matrix V) and then expands the left part by allocating -- cap free locations from the free part. If there are less than cap -- free locations, the routine defragments the sparse vector area. -- -- Due to "garbage collection" this operation may involve changing row -- and column pointers of the matrix V. -- -- *Returns* -- -- If no error occurred, the routine returns zero. Otherwise, in case of -- overflow of the sparse vector area, the routine returns non-zero. */ int luf_enlarge_row(LUF *luf, int i, int cap) { int n = luf->n; int *vr_ptr = luf->vr_ptr; int *vr_len = luf->vr_len; int *vr_cap = luf->vr_cap; int *vc_cap = luf->vc_cap; int *sv_ndx = luf->sv_ndx; double *sv_val = luf->sv_val; int *sv_prev = luf->sv_prev; int *sv_next = luf->sv_next; int ret = 0; int cur, k, kk; insist(1 <= i && i <= n); insist(vr_cap[i] < cap); /* if there are less than cap free locations, defragment SVA */ if (luf->sv_end - luf->sv_beg < cap) { luf_defrag_sva(luf); if (luf->sv_end - luf->sv_beg < cap) { ret = 1; goto done; } } /* save current capacity of the i-th row */ cur = vr_cap[i]; /* copy existing elements to the beginning of the free part */ memmove(&sv_ndx[luf->sv_beg], &sv_ndx[vr_ptr[i]], vr_len[i] * sizeof(int)); memmove(&sv_val[luf->sv_beg], &sv_val[vr_ptr[i]], vr_len[i] * sizeof(double)); /* set new pointer and new capacity of the i-th row */ vr_ptr[i] = luf->sv_beg; vr_cap[i] = cap; /* set new pointer to the beginning of the free part */ luf->sv_beg += cap; /* now the i-th row starts in the rightmost location among other rows and columns of the matrix V, so its node should be moved to the end of the row/column linked list */ k = i; /* remove the i-th row node from the linked list */ if (sv_prev[k] == 0) luf->sv_head = sv_next[k]; else { /* capacity of the previous row/column can be increased at the expense of old locations of the i-th row */ kk = sv_prev[k]; if (kk <= n) vr_cap[kk] += cur; else vc_cap[kk-n] += cur; sv_next[sv_prev[k]] = sv_next[k]; } if (sv_next[k] == 0) luf->sv_tail = sv_prev[k]; else sv_prev[sv_next[k]] = sv_prev[k]; /* insert the i-th row node to the end of the linked list */ sv_prev[k] = luf->sv_tail; sv_next[k] = 0; if (sv_prev[k] == 0) luf->sv_head = k; else sv_next[sv_prev[k]] = k; luf->sv_tail = k; done: return ret; } /*---------------------------------------------------------------------- -- luf_enlarge_col - enlarge column capacity. -- -- *Synopsis* -- -- #include "glpluf.h" -- int luf_enlarge_col(LUF *luf, int j, int cap); -- -- *Description* -- -- The routine luf_enlarge_col enlarges capacity of the j-th column of -- the matrix V to cap locations (assuming that its current capacity is -- less than cap). In order to do that the routine relocates elements -- of the j-th column to the end of the left part of SVA (which contains -- rows and columns of the matrix V) and then expands the left part by -- allocating cap free locations from the free part. If there are less -- than cap free locations, the routine defragments the sparse vector -- area. -- -- Due to "garbage collection" this operation may involve changing row -- and column pointers of the matrix V. -- -- *Returns* -- -- If no error occurred, the routine returns zero. Otherwise, in case of -- overflow of the sparse vector area, the routine returns non-zero. */ int luf_enlarge_col(LUF *luf, int j, int cap) { int n = luf->n; int *vr_cap = luf->vr_cap; int *vc_ptr = luf->vc_ptr; int *vc_len = luf->vc_len; int *vc_cap = luf->vc_cap; int *sv_ndx = luf->sv_ndx; double *sv_val = luf->sv_val; int *sv_prev = luf->sv_prev; int *sv_next = luf->sv_next; int ret = 0; int cur, k, kk; insist(1 <= j && j <= n); insist(vc_cap[j] < cap); /* if there are less than cap free locations, defragment SVA */ if (luf->sv_end - luf->sv_beg < cap) { luf_defrag_sva(luf); if (luf->sv_end - luf->sv_beg < cap) { ret = 1; goto done; } } /* save current capacity of the j-th column */ cur = vc_cap[j]; /* copy existing elements to the beginning of the free part */ memmove(&sv_ndx[luf->sv_beg], &sv_ndx[vc_ptr[j]], vc_len[j] * sizeof(int)); memmove(&sv_val[luf->sv_beg], &sv_val[vc_ptr[j]], vc_len[j] * sizeof(double)); /* set new pointer and new capacity of the j-th column */ vc_ptr[j] = luf->sv_beg; vc_cap[j] = cap; /* set new pointer to the beginning of the free part */ luf->sv_beg += cap; /* now the j-th column starts in the rightmost location among other rows and columns of the matrix V, so its node should be moved to the end of the row/column linked list */ k = n + j; /* remove the j-th column node from the linked list */ if (sv_prev[k] == 0) luf->sv_head = sv_next[k]; else { /* capacity of the previous row/column can be increased at the expense of old locations of the j-th column */ kk = sv_prev[k]; if (kk <= n) vr_cap[kk] += cur; else vc_cap[kk-n] += cur; sv_next[sv_prev[k]] = sv_next[k]; } if (sv_next[k] == 0) luf->sv_tail = sv_prev[k]; else sv_prev[sv_next[k]] = sv_prev[k]; /* insert the j-th column node to the end of the linked list */ sv_prev[k] = luf->sv_tail; sv_next[k] = 0; if (sv_prev[k] == 0) luf->sv_head = k; else sv_next[sv_prev[k]] = k; luf->sv_tail = k; done: return ret; } /*---------------------------------------------------------------------- -- luf_alloc_wa - pre-allocate working area. -- -- *Synopsis* -- -- #include "glpluf.h" -- LUF_WA *luf_alloc_wa(LUF *luf); -- -- *Description* -- -- The routine luf_alloc_wa pre-allocates the working area that can be -- subsequently used for computing LU-factorization. -- -- *Returns* -- -- The routine returns a pointer to the pre-allocated working area. */ LUF_WA *luf_alloc_wa(LUF *luf) { LUF_WA *wa; int n = luf->n; wa = umalloc(sizeof(LUF_WA)); wa->rs_max = ucalloc(1+n, sizeof(double)); wa->rs_head = ucalloc(1+n, sizeof(int)); wa->rs_prev = ucalloc(1+n, sizeof(int)); wa->rs_next = ucalloc(1+n, sizeof(int)); wa->cs_head = ucalloc(1+n, sizeof(int)); wa->cs_prev = ucalloc(1+n, sizeof(int)); wa->cs_next = ucalloc(1+n, sizeof(int)); return wa; } /*---------------------------------------------------------------------- -- luf_free_wa - free working area. -- -- *Synopsis* -- -- #include "glpluf.h" -- void luf_free_wa(LUF_WA *wa); -- -- *Description* -- -- The routine luf_free_wa frees the pre-allocated working area, which -- the parameter wa points to. */ void luf_free_wa(LUF_WA *wa) { ufree(wa->rs_max); ufree(wa->rs_head); ufree(wa->rs_prev); ufree(wa->rs_next); ufree(wa->cs_head); ufree(wa->cs_prev); ufree(wa->cs_next); ufree(wa); return; } /*---------------------------------------------------------------------- -- initialize - initialize LU-factorization data structures. -- -- This routine initializes data structures for subsequent computing -- the LU-factorization of a given matrix A, which is specified by the -- formal routine col. On exit V = A and F = P = Q = I, where I is the -- unity matrix. (Row-wise representation of the matrix F is not used at -- the factorization stage and therefore is not initialized.) -- -- If no error occurred, the routine returns zero. Otherwise, in case of -- overflow of the sparse vector area, the routine returns non-zero. */ static int initialize(LUF *luf, void *info, int (*col)(void *info, int j, int rn[], double aj[]), LUF_WA *wa) { int n = luf->n; int *fc_ptr = luf->fc_ptr; int *fc_len = luf->fc_len; int *vr_ptr = luf->vr_ptr; int *vr_len = luf->vr_len; int *vr_cap = luf->vr_cap; int *vc_ptr = luf->vc_ptr; int *vc_len = luf->vc_len; int *vc_cap = luf->vc_cap; int *pp_row = luf->pp_row; int *pp_col = luf->pp_col; int *qq_row = luf->qq_row; int *qq_col = luf->qq_col; int *sv_ndx = luf->sv_ndx; double *sv_val = luf->sv_val; int *sv_prev = luf->sv_prev; int *sv_next = luf->sv_next; int *flag = luf->flag; double *work = luf->work; double *rs_max = wa->rs_max; int *rs_head = wa->rs_head; int *rs_prev = wa->rs_prev; int *rs_next = wa->rs_next; int *cs_head = wa->cs_head; int *cs_prev = wa->cs_prev; int *cs_next = wa->cs_next; int ret = 0; int i, i_ptr, j, j_beg, j_end, k, len, nnz, sv_beg, sv_end, ptr; double big, val; /* free all locations of the sparse vector area */ sv_beg = 1; sv_end = luf->sv_size + 1; /* (row-wise representation of the matrix F is not initialized, because it is not used at the factorization stage) */ /* build the matrix F in column-wise format (initially F = I) */ for (j = 1; j <= n; j++) { fc_ptr[j] = sv_end; fc_len[j] = 0; } /* clear rows of the matrix V; clear the flag array */ for (i = 1; i <= n; i++) vr_len[i] = vr_cap[i] = 0, flag[i] = 0; /* build the matrix V in column-wise format (initially V = A); count non-zeros in rows of this matrix; count total number of non-zeros; compute largest of absolute values of elements */ nnz = 0; big = 0.0; for (j = 1; j <= n; j++) { int *rn = pp_row; double *aj = work; /* obtain j-th column of the matrix A */ len = col(info, j, rn, aj); if (!(0 <= len && len <= n)) fault("luf_decomp: j = %d; len = %d; invalid column length", j, len); /* check for free locations */ if (sv_end - sv_beg < len) { /* overflow of the sparse vector area */ ret = 1; goto done; } /* set pointer to the j-th column */ vc_ptr[j] = sv_beg; /* set length of the j-th column */ vc_len[j] = vc_cap[j] = len; /* count total number of non-zeros */ nnz += len; /* walk through elements of the j-th column */ for (ptr = 1; ptr <= len; ptr++) { /* get row index and numerical value of a[i,j] */ i = rn[ptr]; val = aj[ptr]; if (!(1 <= i && i <= n)) fault("luf_decomp: i = %d; j = %d; invalid row index", i, j); if (flag[i]) fault("luf_decomp: i = %d; j = %d; duplicate element not" " allowed", i, j); if (val == 0.0) fault("luf_decomp: i = %d; j = %d; zero element not allo" "wed", i, j); /* add new element v[i,j] = a[i,j] to j-th column */ sv_ndx[sv_beg] = i; sv_val[sv_beg] = val; sv_beg++; /* big := max(big, |a[i,j]|) */ if (val < 0.0) val = - val; if (big < val) big = val; /* mark non-zero in the i-th position of the j-th column */ flag[i] = 1; /* increase length of the i-th row */ vr_cap[i]++; } /* reset all non-zero marks */ for (ptr = 1; ptr <= len; ptr++) flag[rn[ptr]] = 0; } /* allocate rows of the matrix V */ for (i = 1; i <= n; i++) { /* get length of the i-th row */ len = vr_cap[i]; /* check for free locations */ if (sv_end - sv_beg < len) { /* overflow of the sparse vector area */ ret = 1; goto done; } /* set pointer to the i-th row */ vr_ptr[i] = sv_beg; /* reserve locations for the i-th row */ sv_beg += len; } /* build the matrix V in row-wise format using representation of this matrix in column-wise format */ for (j = 1; j <= n; j++) { /* walk through elements of the j-th column */ j_beg = vc_ptr[j]; j_end = j_beg + vc_len[j] - 1; for (k = j_beg; k <= j_end; k++) { /* get row index and numerical value of v[i,j] */ i = sv_ndx[k]; val = sv_val[k]; /* store element in the i-th row */ i_ptr = vr_ptr[i] + vr_len[i]; sv_ndx[i_ptr] = j; sv_val[i_ptr] = val; /* increase count of the i-th row */ vr_len[i]++; } } /* initialize the matrices P and Q (initially P = Q = I) */ for (k = 1; k <= n; k++) pp_row[k] = pp_col[k] = qq_row[k] = qq_col[k] = k; /* set sva partitioning pointers */ luf->sv_beg = sv_beg; luf->sv_end = sv_end; /* the initial physical order of rows and columns of the matrix V is n+1, ..., n+n, 1, ..., n (firstly columns, then rows) */ luf->sv_head = n+1; luf->sv_tail = n; for (i = 1; i <= n; i++) { sv_prev[i] = i-1; sv_next[i] = i+1; } sv_prev[1] = n+n; sv_next[n] = 0; for (j = 1; j <= n; j++) { sv_prev[n+j] = n+j-1; sv_next[n+j] = n+j+1; } sv_prev[n+1] = 0; sv_next[n+n] = 1; /* clear working arrays */ for (k = 1; k <= n; k++) { flag[k] = 0; work[k] = 0.0; } /* initialize some statistics */ luf->nnz_a = nnz; luf->nnz_f = 0; luf->nnz_v = nnz; luf->max_a = big; luf->big_v = big; luf->rank = -1; /* initially the active submatrix is the entire matrix V */ /* largest of absolute values of elements in each active row is unknown yet */ for (i = 1; i <= n; i++) rs_max[i] = -1.0; /* build linked lists of active rows */ for (len = 0; len <= n; len++) rs_head[len] = 0; for (i = 1; i <= n; i++) { len = vr_len[i]; rs_prev[i] = 0; rs_next[i] = rs_head[len]; if (rs_next[i] != 0) rs_prev[rs_next[i]] = i; rs_head[len] = i; } /* build linked lists of active columns */ for (len = 0; len <= n; len++) cs_head[len] = 0; for (j = 1; j <= n; j++) { len = vc_len[j]; cs_prev[j] = 0; cs_next[j] = cs_head[len]; if (cs_next[j] != 0) cs_prev[cs_next[j]] = j; cs_head[len] = j; } done: /* return to the factorizing routine */ return ret; } /*---------------------------------------------------------------------- -- find_pivot - choose a pivot element. -- -- This routine chooses a pivot element in the active submatrix of the -- matrix U = P*V*Q. -- -- It is assumed that on entry the matrix U has the following partially -- triangularized form: -- -- 1 k n -- 1 x x x x x x x x x x -- . x x x x x x x x x -- . . x x x x x x x x -- . . . x x x x x x x -- k . . . . * * * * * * -- . . . . * * * * * * -- . . . . * * * * * * -- . . . . * * * * * * -- . . . . * * * * * * -- n . . . . * * * * * * -- -- where rows and columns k, k+1, ..., n belong to the active submatrix -- (elements of the active submatrix are marked by '*'). -- -- Since the matrix U = P*V*Q is not stored, the routine works with the -- matrix V. It is assumed that the row-wise representation corresponds -- to the matrix V, but the column-wise representation corresponds to -- the active submatrix of the matrix V, i.e. elements of the matrix V, -- which doesn't belong to the active submatrix, are missing from the -- column linked lists. It is also assumed that each active row of the -- matrix V is in the set R[len], where len is number of non-zeros in -- the row, and each active column of the matrix V is in the set C[len], -- where len is number of non-zeros in the column (in the latter case -- only elements of the active submatrix are counted; such elements are -- marked by '*' on the figure above). -- -- For the reason of numerical stability the routine applies so called -- threshold pivoting proposed by J.Reid. It is assumed that an element -- v[i,j] can be selected as a pivot candidate if it is not very small -- (in absolute value) among other elements in the same row, i.e. if it -- satisfies to the stability condition |v[i,j]| >= tol * max|v[i,*]|, -- where 0 < tol < 1 is a given tolerance. -- -- In order to keep sparsity of the matrix V the routine uses Markowitz -- strategy, trying to choose such element v[p,q], which satisfies to -- the stability condition (see above) and has smallest Markowitz cost -- (nr[p]-1) * (nc[q]-1), where nr[p] and nc[q] are numbers of non-zero -- elements, respectively, in the p-th row and in the q-th column of the -- active submatrix. -- -- In order to reduce the search, i.e. not to walk through all elements -- of the active submatrix, the routine exploits a technique proposed by -- I.Duff. This technique is based on using the sets R[len] and C[len] -- of active rows and columns. -- -- If the pivot element v[p,q] has been chosen, the routine stores its -- indices to the locations *p and *q and returns zero. Otherwise, if -- the active submatrix is empty and therefore the pivot element can't -- be chosen, the routine returns non-zero. */ static int find_pivot(LUF *luf, LUF_WA *wa, int *_p, int *_q) { int n = luf->n; int *vr_ptr = luf->vr_ptr; int *vr_len = luf->vr_len; int *vc_ptr = luf->vc_ptr; int *vc_len = luf->vc_len; int *sv_ndx = luf->sv_ndx; double *sv_val = luf->sv_val; double piv_tol = luf->piv_tol; int piv_lim = luf->piv_lim; int suhl = luf->suhl; double *rs_max = wa->rs_max; int *rs_head = wa->rs_head; int *rs_next = wa->rs_next; int *cs_head = wa->cs_head; int *cs_prev = wa->cs_prev; int *cs_next = wa->cs_next; int p, q, len, i, i_beg, i_end, i_ptr, j, j_beg, j_end, j_ptr, ncand, next_j, min_p, min_q, min_len; double best, cost, big, temp; /* initially no pivot candidates have been found so far */ p = q = 0, best = DBL_MAX, ncand = 0; /* if in the active submatrix there is a column that has the only non-zero (column singleton), choose it as pivot */ j = cs_head[1]; if (j != 0) { insist(vc_len[j] == 1); p = sv_ndx[vc_ptr[j]], q = j; goto done; } /* if in the active submatrix there is a row that has the only non-zero (row singleton), choose it as pivot */ i = rs_head[1]; if (i != 0) { insist(vr_len[i] == 1); p = i, q = sv_ndx[vr_ptr[i]]; goto done; } /* there are no singletons in the active submatrix; walk through other non-empty rows and columns */ for (len = 2; len <= n; len++) { /* consider active columns that have len non-zeros */ for (j = cs_head[len]; j != 0; j = next_j) { /* the j-th column has len non-zeros */ j_beg = vc_ptr[j]; j_end = j_beg + vc_len[j] - 1; /* save pointer to the next column with the same length */ next_j = cs_next[j]; /* find an element in the j-th column, which is placed in a row with minimal number of non-zeros and satisfies to the stability condition (such element may not exist) */ min_p = min_q = 0, min_len = INT_MAX; for (j_ptr = j_beg; j_ptr <= j_end; j_ptr++) { /* get row index of v[i,j] */ i = sv_ndx[j_ptr]; i_beg = vr_ptr[i]; i_end = i_beg + vr_len[i] - 1; /* if the i-th row is not shorter than that one, where minimal element is currently placed, skip v[i,j] */ if (vr_len[i] >= min_len) continue; /* determine the largest of absolute values of elements in the i-th row */ big = rs_max[i]; if (big < 0.0) { /* the largest value is unknown yet; compute it */ for (i_ptr = i_beg; i_ptr <= i_end; i_ptr++) { temp = sv_val[i_ptr]; if (temp < 0.0) temp = - temp; if (big < temp) big = temp; } rs_max[i] = big; } /* find v[i,j] in the i-th row */ for (i_ptr = vr_ptr[i]; sv_ndx[i_ptr] != j; i_ptr++); insist(i_ptr <= i_end); /* if v[i,j] doesn't satisfy to the stability condition, skip it */ temp = sv_val[i_ptr]; if (temp < 0.0) temp = - temp; if (temp < piv_tol * big) continue; /* v[i,j] is better than the current minimal element */ min_p = i, min_q = j, min_len = vr_len[i]; /* if Markowitz cost of the current minimal element is not greater than (len-1)**2, it can be chosen right now; this heuristic reduces the search and works well in many cases */ if (min_len <= len) { p = min_p, q = min_q; goto done; } } /* the j-th column has been scanned */ if (min_p != 0) { /* the minimal element is a next pivot candidate */ ncand++; /* compute its Markowitz cost */ cost = (double)(min_len - 1) * (double)(len - 1); /* choose between the minimal element and the current candidate */ if (cost < best) p = min_p, q = min_q, best = cost; /* if piv_lim candidates have been considered, there are doubts that a much better candidate exists; therefore it's time to terminate the search */ if (ncand == piv_lim) goto done; } else { /* the j-th column has no elements, which satisfy to the stability condition; Uwe Suhl suggests to exclude such column from the further consideration until it becomes a column singleton; in hard cases this significantly reduces a time needed for pivot searching */ if (suhl) { /* remove the j-th column from the active set */ if (cs_prev[j] == 0) cs_head[len] = cs_next[j]; else cs_next[cs_prev[j]] = cs_next[j]; if (cs_next[j] == 0) /* nop */; else cs_prev[cs_next[j]] = cs_prev[j]; /* the following assignment is used to avoid an error when the routine eliminate (see below) will try to remove the j-th column from the active set */ cs_prev[j] = cs_next[j] = j; } } } /* consider active rows that have len non-zeros */ for (i = rs_head[len]; i != 0; i = rs_next[i]) { /* the i-th row has len non-zeros */ i_beg = vr_ptr[i]; i_end = i_beg + vr_len[i] - 1; /* determine the largest of absolute values of elements in the i-th row */ big = rs_max[i]; if (big < 0.0) { /* the largest value is unknown yet; compute it */ for (i_ptr = i_beg; i_ptr <= i_end; i_ptr++) { temp = sv_val[i_ptr]; if (temp < 0.0) temp = - temp; if (big < temp) big = temp; } rs_max[i] = big; } /* find an element in the i-th row, which is placed in a column with minimal number of non-zeros and satisfies to the stability condition (such element always exists) */ min_p = min_q = 0, min_len = INT_MAX; for (i_ptr = i_beg; i_ptr <= i_end; i_ptr++) { /* get column index of v[i,j] */ j = sv_ndx[i_ptr]; /* if the j-th column is not shorter than that one, where minimal element is currently placed, skip v[i,j] */ if (vc_len[j] >= min_len) continue; /* if v[i,j] doesn't satisfy to the stability condition, skip it */ temp = sv_val[i_ptr]; if (temp < 0.0) temp = - temp; if (temp < piv_tol * big) continue; /* v[i,j] is better than the current minimal element */ min_p = i, min_q = j, min_len = vc_len[j]; /* if Markowitz cost of the current minimal element is not greater than (len-1)**2, it can be chosen right now; this heuristic reduces the search and works well in many cases */ if (min_len <= len) { p = min_p, q = min_q; goto done; } } /* the i-th row has been scanned */ if (min_p != 0) { /* the minimal element is a next pivot candidate */ ncand++; /* compute its Markowitz cost */ cost = (double)(len - 1) * (double)(min_len - 1); /* choose between the minimal element and the current candidate */ if (cost < best) p = min_p, q = min_q, best = cost; /* if piv_lim candidates have been considered, there are doubts that a much better candidate exists; therefore it's time to terminate the search */ if (ncand == piv_lim) goto done; } else { /* this can't be because this can never be */ insist(min_p != min_p); } } } done: /* bring the pivot to the factorizing routine */ *_p = p, *_q = q; return (p == 0); } /*---------------------------------------------------------------------- -- eliminate - perform gaussian elimination. -- -- This routine performs elementary gaussian transformations in order -- to eliminate subdiagonal elements in the k-th column of the matrix -- U = P*V*Q using the pivot element u[k,k], where k is the number of -- the current elimination step. -- -- The parameters p and q are, respectively, row and column indices of -- the element v[p,q], which corresponds to the element u[k,k]. -- -- Each time when the routine applies the elementary transformation to -- a non-pivot row of the matrix V, it stores the corresponding element -- to the matrix F in order to keep the main equality A = F*V. -- -- The routine assumes that on entry the matrices L = P*F*inv(P) and -- U = P*V*Q are the following: -- -- 1 k 1 k n -- 1 1 . . . . . . . . . 1 x x x x x x x x x x -- x 1 . . . . . . . . . x x x x x x x x x -- x x 1 . . . . . . . . . x x x x x x x x -- x x x 1 . . . . . . . . . x x x x x x x -- k x x x x 1 . . . . . k . . . . * * * * * * -- x x x x _ 1 . . . . . . . . # * * * * * -- x x x x _ . 1 . . . . . . . # * * * * * -- x x x x _ . . 1 . . . . . . # * * * * * -- x x x x _ . . . 1 . . . . . # * * * * * -- n x x x x _ . . . . 1 n . . . . # * * * * * -- -- matrix L matrix U -- -- where rows and columns of the matrix U with numbers k, k+1, ..., n -- form the active submatrix (eliminated elements are marked by '#' and -- other elements of the active submatrix are marked by '*'). Note that -- each eliminated non-zero element u[i,k] of the matrix U gives the -- corresponding element l[i,k] of the matrix L (marked by '_'). -- -- Actually all operations are performed on the matrix V. Should note -- that the row-wise representation corresponds to the matrix V, but the -- column-wise representation corresponds to the active submatrix of the -- matrix V, i.e. elements of the matrix V, which doesn't belong to the -- active submatrix, are missing from the column linked lists. -- -- Let u[k,k] = v[p,q] be the pivot. In order to eliminate subdiagonal -- elements u[i',k] = v[i,q], i' = k+1, k+2, ..., n, the routine applies -- the following elementary gaussian transformations: -- -- (i-th row of V) := (i-th row of V) - f[i,p] * (p-th row of V), -- -- where f[i,p] = v[i,q] / v[p,q] is a gaussian multiplier. -- -- Additionally, in order to keep the main equality A = F*V, each time -- when the routine applies the transformation to i-th row of the matrix -- V, it also adds f[i,p] as a new element to the matrix F. -- -- IMPORTANT: On entry the working arrays flag and work should contain -- zeros. This status is provided by the routine on exit. -- -- If no error occurred, the routine returns zero. Otherwise, in case of -- overflow of the sparse vector area, the routine returns non-zero. */ static int eliminate(LUF *luf, LUF_WA *wa, int p, int q) { int n = luf->n; int *fc_ptr = luf->fc_ptr; int *fc_len = luf->fc_len; int *vr_ptr = luf->vr_ptr; int *vr_len = luf->vr_len; int *vr_cap = luf->vr_cap; double *vr_piv = luf->vr_piv; int *vc_ptr = luf->vc_ptr; int *vc_len = luf->vc_len; int *vc_cap = luf->vc_cap; int *sv_ndx = luf->sv_ndx; double *sv_val = luf->sv_val; int *sv_prev = luf->sv_prev; int *sv_next = luf->sv_next; int *flag = luf->flag; double *work = luf->work; double eps_tol = luf->eps_tol; double *rs_max = wa->rs_max; int *rs_head = wa->rs_head; int *rs_prev = wa->rs_prev; int *rs_next = wa->rs_next; int *cs_head = wa->cs_head; int *cs_prev = wa->cs_prev; int *cs_next = wa->cs_next; /* at this stage the row-wise representation of the matrix F is not used, so fr_len can be used as a working array */ int *ndx = luf->fr_len; int ret = 0; int len, fill, i, i_beg, i_end, i_ptr, j, j_beg, j_end, j_ptr, k, p_beg, p_end, p_ptr, q_beg, q_end, q_ptr; double fip, val, vpq, temp; insist(1 <= p && p <= n); insist(1 <= q && q <= n); /* remove the p-th (pivot) row from the active set; this row will never return there */ if (rs_prev[p] == 0) rs_head[vr_len[p]] = rs_next[p]; else rs_next[rs_prev[p]] = rs_next[p]; if (rs_next[p] == 0) ; else rs_prev[rs_next[p]] = rs_prev[p]; /* remove the q-th (pivot) column from the active set; this column will never return there */ if (cs_prev[q] == 0) cs_head[vc_len[q]] = cs_next[q]; else cs_next[cs_prev[q]] = cs_next[q]; if (cs_next[q] == 0) ; else cs_prev[cs_next[q]] = cs_prev[q]; /* find the pivot v[p,q] = u[k,k] in the p-th row */ p_beg = vr_ptr[p]; p_end = p_beg + vr_len[p] - 1; for (p_ptr = p_beg; sv_ndx[p_ptr] != q; p_ptr++) /* nop */; insist(p_ptr <= p_end); /* store value of the pivot */ vpq = (vr_piv[p] = sv_val[p_ptr]); /* remove the pivot from the p-th row */ sv_ndx[p_ptr] = sv_ndx[p_end]; sv_val[p_ptr] = sv_val[p_end]; vr_len[p]--; p_end--; /* find the pivot v[p,q] = u[k,k] in the q-th column */ q_beg = vc_ptr[q]; q_end = q_beg + vc_len[q] - 1; for (q_ptr = q_beg; sv_ndx[q_ptr] != p; q_ptr++) /* nop */; insist(q_ptr <= q_end); /* remove the pivot from the q-th column */ sv_ndx[q_ptr] = sv_ndx[q_end]; vc_len[q]--; q_end--; /* walk through the p-th (pivot) row, which doesn't contain the pivot v[p,q] already, and do the following... */ for (p_ptr = p_beg; p_ptr <= p_end; p_ptr++) { /* get column index of v[p,j] */ j = sv_ndx[p_ptr]; /* store v[p,j] to the working array */ flag[j] = 1; work[j] = sv_val[p_ptr]; /* remove the j-th column from the active set; this column will return there later with new length */ if (cs_prev[j] == 0) cs_head[vc_len[j]] = cs_next[j]; else cs_next[cs_prev[j]] = cs_next[j]; if (cs_next[j] == 0) ; else cs_prev[cs_next[j]] = cs_prev[j]; /* find v[p,j] in the j-th column */ j_beg = vc_ptr[j]; j_end = j_beg + vc_len[j] - 1; for (j_ptr = j_beg; sv_ndx[j_ptr] != p; j_ptr++) /* nop */; insist(j_ptr <= j_end); /* since v[p,j] leaves the active submatrix, remove it from the j-th column; however, v[p,j] is kept in the p-th row */ sv_ndx[j_ptr] = sv_ndx[j_end]; vc_len[j]--; } /* walk through the q-th (pivot) column, which doesn't contain the pivot v[p,q] already, and perform gaussian elimination */ while (q_beg <= q_end) { /* element v[i,q] should be eliminated */ /* get row index of v[i,q] */ i = sv_ndx[q_beg]; /* remove the i-th row from the active set; later this row will return there with new length */ if (rs_prev[i] == 0) rs_head[vr_len[i]] = rs_next[i]; else rs_next[rs_prev[i]] = rs_next[i]; if (rs_next[i] == 0) ; else rs_prev[rs_next[i]] = rs_prev[i]; /* find v[i,q] in the i-th row */ i_beg = vr_ptr[i]; i_end = i_beg + vr_len[i] - 1; for (i_ptr = i_beg; sv_ndx[i_ptr] != q; i_ptr++) /* nop */; insist(i_ptr <= i_end); /* compute gaussian multiplier f[i,p] = v[i,q] / v[p,q] */ fip = sv_val[i_ptr] / vpq; /* since v[i,q] should be eliminated, remove it from the i-th row */ sv_ndx[i_ptr] = sv_ndx[i_end]; sv_val[i_ptr] = sv_val[i_end]; vr_len[i]--; i_end--; /* and from the q-th column */ sv_ndx[q_beg] = sv_ndx[q_end]; vc_len[q]--; q_end--; /* perform gaussian transformation: (i-th row) := (i-th row) - f[i,p] * (p-th row) note that now the p-th row, which is in the working array, doesn't contain the pivot v[p,q], and the i-th row doesn't contain the eliminated element v[i,q] */ /* walk through the i-th row and transform existing non-zero elements */ fill = vr_len[p]; for (i_ptr = i_beg; i_ptr <= i_end; i_ptr++) { /* get column index of v[i,j] */ j = sv_ndx[i_ptr]; /* v[i,j] := v[i,j] - f[i,p] * v[p,j] */ if (flag[j]) { /* v[p,j] != 0 */ temp = (sv_val[i_ptr] -= fip * work[j]); if (temp < 0.0) temp = - temp; flag[j] = 0; fill--; /* since both v[i,j] and v[p,j] exist */ if (temp == 0.0 || temp < eps_tol) { /* new v[i,j] is closer to zero; replace it by exact zero, i.e. remove it from the active submatrix */ /* remove v[i,j] from the i-th row */ sv_ndx[i_ptr] = sv_ndx[i_end]; sv_val[i_ptr] = sv_val[i_end]; vr_len[i]--; i_ptr--; i_end--; /* find v[i,j] in the j-th column */ j_beg = vc_ptr[j]; j_end = j_beg + vc_len[j] - 1; for (j_ptr = j_beg; sv_ndx[j_ptr] != i; j_ptr++); insist(j_ptr <= j_end); /* remove v[i,j] from the j-th column */ sv_ndx[j_ptr] = sv_ndx[j_end]; vc_len[j]--; } else { /* v_big := max(v_big, |v[i,j]|) */ if (luf->big_v < temp) luf->big_v = temp; } } } /* now flag is the pattern of the set v[p,*] \ v[i,*], and fill is number of non-zeros in this set; therefore up to fill new non-zeros may appear in the i-th row */ if (vr_len[i] + fill > vr_cap[i]) { /* enlarge the i-th row */ if (luf_enlarge_row(luf, i, vr_len[i] + fill)) { /* overflow of the sparse vector area */ ret = 1; goto done; } /* defragmentation may change row and column pointers of the matrix V */ p_beg = vr_ptr[p]; p_end = p_beg + vr_len[p] - 1; q_beg = vc_ptr[q]; q_end = q_beg + vc_len[q] - 1; } /* walk through the p-th (pivot) row and create new elements of the i-th row that appear due to fill-in; column indices of these new elements are accumulated in the array ndx */ len = 0; for (p_ptr = p_beg; p_ptr <= p_end; p_ptr++) { /* get column index of v[p,j], which may cause fill-in */ j = sv_ndx[p_ptr]; if (flag[j]) { /* compute new non-zero v[i,j] = 0 - f[i,p] * v[p,j] */ temp = (val = - fip * work[j]); if (temp < 0.0) temp = - temp; if (temp == 0.0 || temp < eps_tol) /* if v[i,j] is closer to zero; just ignore it */; else { /* add v[i,j] to the i-th row */ i_ptr = vr_ptr[i] + vr_len[i]; sv_ndx[i_ptr] = j; sv_val[i_ptr] = val; vr_len[i]++; /* remember column index of v[i,j] */ ndx[++len] = j; /* big_v := max(big_v, |v[i,j]|) */ if (luf->big_v < temp) luf->big_v = temp; } } else { /* there is no fill-in, because v[i,j] already exists in the i-th row; restore the flag of the element v[p,j], which was reset before */ flag[j] = 1; } } /* add new non-zeros v[i,j] to the corresponding columns */ for (k = 1; k <= len; k++) { /* get column index of new non-zero v[i,j] */ j = ndx[k]; /* one free location is needed in the j-th column */ if (vc_len[j] + 1 > vc_cap[j]) { /* enlarge the j-th column */ if (luf_enlarge_col(luf, j, vc_len[j] + 10)) { /* overflow of the sparse vector area */ ret = 1; goto done; } /* defragmentation may change row and column pointers of the matrix V */ p_beg = vr_ptr[p]; p_end = p_beg + vr_len[p] - 1; q_beg = vc_ptr[q]; q_end = q_beg + vc_len[q] - 1; } /* add new non-zero v[i,j] to the j-th column */ j_ptr = vc_ptr[j] + vc_len[j]; sv_ndx[j_ptr] = i; vc_len[j]++; } /* now the i-th row has been completely transformed, therefore it can return to the active set with new length */ rs_prev[i] = 0; rs_next[i] = rs_head[vr_len[i]]; if (rs_next[i] != 0) rs_prev[rs_next[i]] = i; rs_head[vr_len[i]] = i; /* the largest of absolute values of elements in the i-th row is currently unknown */ rs_max[i] = -1.0; /* at least one free location is needed to store the gaussian multiplier */ if (luf->sv_end - luf->sv_beg < 1) { /* there are no free locations at all; defragment SVA */ luf_defrag_sva(luf); if (luf->sv_end - luf->sv_beg < 1) { /* overflow of the sparse vector area */ ret = 1; goto done; } /* defragmentation may change row and column pointers of the matrix V */ p_beg = vr_ptr[p]; p_end = p_beg + vr_len[p] - 1; q_beg = vc_ptr[q]; q_end = q_beg + vc_len[q] - 1; } /* add the element f[i,p], which is the gaussian multiplier, to the matrix F */ luf->sv_end--; sv_ndx[luf->sv_end] = i; sv_val[luf->sv_end] = fip; fc_len[p]++; /* end of elimination loop */ } /* at this point the q-th (pivot) column should be empty */ insist(vc_len[q] == 0); /* reset capacity of the q-th column */ vc_cap[q] = 0; /* remove node of the q-th column from the addressing list */ k = n + q; if (sv_prev[k] == 0) luf->sv_head = sv_next[k]; else sv_next[sv_prev[k]] = sv_next[k]; if (sv_next[k] == 0) luf->sv_tail = sv_prev[k]; else sv_prev[sv_next[k]] = sv_prev[k]; /* the p-th column of the matrix F has been completely built; set its pointer */ fc_ptr[p] = luf->sv_end; /* walk through the p-th (pivot) row and do the following... */ for (p_ptr = p_beg; p_ptr <= p_end; p_ptr++) { /* get column index of v[p,j] */ j = sv_ndx[p_ptr]; /* erase v[p,j] from the working array */ flag[j] = 0; work[j] = 0.0; /* the j-th column has been completely transformed, therefore it can return to the active set with new length; however the special case c_prev[j] = c_next[j] = j means that the routine find_pivot excluded the j-th column from the active set due to Uwe Suhl's rule, and therefore in this case the column can return to the active set only if it is a column singleton */ if (!(vc_len[j] != 1 && cs_prev[j] == j && cs_next[j] == j)) { cs_prev[j] = 0; cs_next[j] = cs_head[vc_len[j]]; if (cs_next[j] != 0) cs_prev[cs_next[j]] = j; cs_head[vc_len[j]] = j; } } done: /* return to the factorizing routine */ return ret; } /*---------------------------------------------------------------------- -- build_v_cols - build the matrix V in column-wise format. -- -- This routine builds the column-wise representation of the matrix V -- using its row-wise representation. -- -- If no error occurred, the routine returns zero. Otherwise, in case of -- overflow of the sparse vector area, the routine returns non-zero. */ static int build_v_cols(LUF *luf) { int n = luf->n; int *vr_ptr = luf->vr_ptr; int *vr_len = luf->vr_len; int *vc_ptr = luf->vc_ptr; int *vc_len = luf->vc_len; int *vc_cap = luf->vc_cap; int *sv_ndx = luf->sv_ndx; double *sv_val = luf->sv_val; int *sv_prev = luf->sv_prev; int *sv_next = luf->sv_next; int ret = 0; int i, i_beg, i_end, i_ptr, j, j_ptr, k, nnz; /* it is assumed that on entry all columns of the matrix V are empty, i.e. vc_len[j] = vc_cap[j] = 0 for all j = 1, ..., n, and have been removed from the addressing list */ /* count non-zeros in columns of the matrix V; count total number of non-zeros in this matrix */ nnz = 0; for (i = 1; i <= n; i++) { /* walk through elements of the i-th row and count non-zeros in the corresponding columns */ i_beg = vr_ptr[i]; i_end = i_beg + vr_len[i] - 1; for (i_ptr = i_beg; i_ptr <= i_end; i_ptr++) vc_cap[sv_ndx[i_ptr]]++; /* count total number of non-zeros */ nnz += vr_len[i]; } /* store total number of non-zeros */ luf->nnz_v = nnz; /* check for free locations */ if (luf->sv_end - luf->sv_beg < nnz) { /* overflow of the sparse vector area */ ret = 1; goto done; } /* allocate columns of the matrix V */ for (j = 1; j <= n; j++) { /* set pointer to the j-th column */ vc_ptr[j] = luf->sv_beg; /* reserve locations for the j-th column */ luf->sv_beg += vc_cap[j]; } /* build the matrix V in column-wise format using this matrix in row-wise format */ for (i = 1; i <= n; i++) { /* walk through elements of the i-th row */ i_beg = vr_ptr[i]; i_end = i_beg + vr_len[i] - 1; for (i_ptr = i_beg; i_ptr <= i_end; i_ptr++) { /* get column index */ j = sv_ndx[i_ptr]; /* store element in the j-th column */ j_ptr = vc_ptr[j] + vc_len[j]; sv_ndx[j_ptr] = i; sv_val[j_ptr] = sv_val[i_ptr]; /* increase length of the j-th column */ vc_len[j]++; } } /* now columns are placed in the sparse vector area behind rows in the order n+1, n+2, ..., n+n; so insert column nodes in the addressing list using this order */ for (k = n+1; k <= n+n; k++) { sv_prev[k] = k-1; sv_next[k] = k+1; } sv_prev[n+1] = luf->sv_tail; sv_next[luf->sv_tail] = n+1; sv_next[n+n] = 0; luf->sv_tail = n+n; done: /* return to the factorizing routine */ return ret; } /*---------------------------------------------------------------------- -- build_f_rows - build the matrix F in row-wise format. -- -- This routine builds the row-wise representation of the matrix F using -- its column-wise representation. -- -- If no error occurred, the routine returns zero. Otherwise, in case of -- overflow of the sparse vector area, the routine returns non-zero. */ static int build_f_rows(LUF *luf) { int n = luf->n; int *fr_ptr = luf->fr_ptr; int *fr_len = luf->fr_len; int *fc_ptr = luf->fc_ptr; int *fc_len = luf->fc_len; int *sv_ndx = luf->sv_ndx; double *sv_val = luf->sv_val; int ret = 0; int i, j, j_beg, j_end, j_ptr, ptr, nnz; /* clear rows of the matrix F */ for (i = 1; i <= n; i++) fr_len[i] = 0; /* count non-zeros in rows of the matrix F; count total number of non-zeros in this matrix */ nnz = 0; for (j = 1; j <= n; j++) { /* walk through elements of the j-th column and count non-zeros in the corresponding rows */ j_beg = fc_ptr[j]; j_end = j_beg + fc_len[j] - 1; for (j_ptr = j_beg; j_ptr <= j_end; j_ptr++) fr_len[sv_ndx[j_ptr]]++; /* increase total number of non-zeros */ nnz += fc_len[j]; } /* store total number of non-zeros */ luf->nnz_f = nnz; /* check for free locations */ if (luf->sv_end - luf->sv_beg < nnz) { /* overflow of the sparse vector area */ ret = 1; goto done; } /* allocate rows of the matrix F */ for (i = 1; i <= n; i++) { /* set pointer to the end of the i-th row; later this pointer will be set to the beginning of the i-th row */ fr_ptr[i] = luf->sv_end; /* reserve locations for the i-th row */ luf->sv_end -= fr_len[i]; } /* build the matrix F in row-wise format using this matrix in column-wise format */ for (j = 1; j <= n; j++) { /* walk through elements of the j-th column */ j_beg = fc_ptr[j]; j_end = j_beg + fc_len[j] - 1; for (j_ptr = j_beg; j_ptr <= j_end; j_ptr++) { /* get row index */ i = sv_ndx[j_ptr]; /* store element in the i-th row */ ptr = --fr_ptr[i]; sv_ndx[ptr] = j; sv_val[ptr] = sv_val[j_ptr]; } } done: /* return to the factorizing routine */ return ret; } /*---------------------------------------------------------------------- -- luf_decomp - compute LU-factorization. -- -- *Synopsis* -- -- #include "glpluf.h" -- int luf_decomp(LUF *luf, -- void *info, int (*col)(void *info, int j, int rn[], double aj[]), -- LUF_WA *wa); -- -- *Description* -- -- The routine luf_decomp computes LU-factorization of a given square -- matrix A. -- -- The parameter luf specifies LU-factorization data structure built by -- means of the routine luf_create. -- -- The parameter info is a transit pointer passed to the formal routine -- col (see below). -- -- The formal routine col specifies the given matrix A. In order to -- obtain j-th column of the matrix A the routine luf_decomp calls the -- routine col with the parameter j (1 <= j <= n, where n is the order -- of A). In response the routine col should store row indices and -- numerical values of non-zero elements of the j-th column of A to the -- locations rn[1], ..., rn[len] and aj[1], ..., aj[len] respectively, -- where len is number of non-zeros in the j-th column, which should be -- returned on exit. Neiter zero nor duplicate elements are allowed. -- -- The parameter wa is a pointer to the working area (no initialization -- is needed, only pre-allocation). If this parameter is NULL, the area -- is allocated on entry and freed on exit automatically. -- -- *Returns* -- -- The routine luf_decomp returns one of the following codes: -- -- 0 - no errors; -- 1 - the given matrix is singular (on some elimination step the active -- submatrix is zero, due to that the pivot can't be chosen); -- 2 - the given matrix is probably ill-conditioned (on some elimination -- step too intensive growth of elements of the active submatrix has -- been detected). -- -- If the matrix A is well scaled, the return code 2 may also mean that -- the threshold pivoting tolerance piv_tol should be increased. -- -- In case of non-zero return code the factorization becomes invalid. -- It should not be used in other operations until the cause of failure -- has been eliminated and the factorization has been recomputed again -- using the routine luf_decomp. -- -- *Repairing singular matrix* -- -- If the routine luf_decomp returns non-zero code, it provides all -- necessary information that can be used for "repairing" the matrix A, -- where "repairing" means replacing linearly dependent columns of the -- matrix A by appropriate columns of the unity matrix. This feature is -- needed when the routine luf_decomp is used for reinverting the basis -- matrix within the simplex method procedure. -- -- On exit linearly dependent columns of the (partially transformed) -- matrix U have numbers rank+1, rank+2, ..., n, where rank is estimated -- rank of the matrix A stored by the routine to the member luf->rank. -- The correspondence between columns of A and U is the same as between -- columns of V and U. Thus, linearly dependent columns of the matrix A -- have numbers qq_col[rank+1], qq_col[rank+2], ..., qq_col[n], where -- qq_col is the column-like representation of the permutation matrix Q. -- It is understood that each j-th linearly dependent column of the -- matrix U should be replaced by the unity vector, where all elements -- are zero except the unity diagonal element u[j,j]. On the other hand -- j-th row of the matrix U corresponds to the row of the matrix V (and -- therefore of the matrix A) with the number pp_row[j], where pp_row is -- the row-like representation of the permutation matrix P. Thus, each -- j-th linearly dependent column of the matrix U should be replaced by -- column of the unity matrix with the number pp_row[j]. -- -- The code that repairs the matrix A may look like follows: -- -- for (j = rank+1; j <= n; j++) -- { replace the column qq_col[j] of the matrix A by the column -- pp_row[j] of the unity matrix; -- } -- -- where rank, pp_row, and qq_col are members of the structure LUF. */ int luf_decomp(LUF *luf, void *info, int (*col)(void *info, int j, int rn[], double aj[]), LUF_WA *_wa) { int n = luf->n; int *pp_row = luf->pp_row; int *pp_col = luf->pp_col; int *qq_row = luf->qq_row; int *qq_col = luf->qq_col; double piv_tol = luf->piv_tol; int piv_lim = luf->piv_lim; int suhl = luf->suhl; double eps_tol = luf->eps_tol; double max_gro = luf->max_gro; LUF_WA *wa = (_wa == NULL ? luf_alloc_wa(luf) : _wa); int ret = 0; int i, j, k, p, q, t; /* check control parameters for correctness */ if (!(0.0 < piv_tol && piv_tol < 1.0)) fault("luf_decomp: piv_tol = %g; invalid parameter", piv_tol); if (!(piv_lim > 0)) fault("luf_decomp: piv_lim = %d; invalid parameter", piv_lim); if (!(suhl == 0 || suhl == 1)) fault("luf_decomp: suhl = %d; invalid parameter", suhl); if (!(0.0 <= eps_tol && eps_tol <= 1.0)) fault("luf_decomp: eps_tol = %g; invalid_parameter", eps_tol); if (!(max_gro >= 1.0)) fault("luf_decomp: max_gro = %g; invalid parameter", max_gro); /* the factorization is temporarily not valid */ luf->valid = 0; more: /* re-allocate the sparse vector area (if required) */ if (luf->new_sva > 0) { ufree(luf->sv_ndx); ufree(luf->sv_val); luf->sv_size = luf->new_sva; luf->sv_ndx = ucalloc(1+luf->sv_size, sizeof(int)); luf->sv_val = ucalloc(1+luf->sv_size, sizeof(double)); luf->new_sva = 0; } /* initialize LU-factorization data structures */ if (initialize(luf, info, col, wa)) { /* overflow of the sparse vector area */ luf->new_sva = luf->sv_size + luf->sv_size; goto more; } /* main elimination loop */ for (k = 1; k <= n; k++) { /* choose a pivot element v[p,q] */ if (find_pivot(luf, wa, &p, &q)) { /* the pivot can't be chosen, because the active submatrix is zero */ luf->rank = k - 1; ret = 1; goto done; } /* let v[p,q] correspond to u[i',j']; permute k-th and i'-th rows and k-th and j'-th columns of the matrix U = P*V*Q to move the element u[i',j'] to the position u[k,k] */ i = pp_col[p]; j = qq_row[q]; insist(k <= i && i <= n && k <= j && j <= n); /* permute k-th and i-th rows of the matrix U */ t = pp_row[k]; pp_row[i] = t; pp_col[t] = i; pp_row[k] = p; pp_col[p] = k; /* permute k-th and j-th columns of the matrix U */ t = qq_col[k]; qq_col[j] = t; qq_row[t] = j; qq_col[k] = q; qq_row[q] = k; /* eliminate subdiagonal elements of k-th column of the matrix U = P*V*Q using the pivot element u[k,k] = v[p,q] */ if (eliminate(luf, wa, p, q)) { /* overflow of the sparse vector area */ luf->new_sva = luf->sv_size + luf->sv_size; goto more; } /* check relative growth of elements of the matrix V */ if (luf->big_v > max_gro * luf->max_a) { /* the growth is too intensive, therefore most probably the matrix A is ill-conditioned */ luf->rank = k - 1; ret = 2; goto done; } } /* now the matrix U = P*V*Q is upper triangular, the matrix V has been built in row-wise format, and the matrix F has been built in column-wise format */ /* defragment the sparse vector area in order to merge all free locations in one continous extent */ luf_defrag_sva(luf); /* build the matrix V in column-wise format */ if (build_v_cols(luf)) { /* overflow of the sparse vector area */ luf->new_sva = luf->sv_size + luf->sv_size; goto more; } /* build the matrix F in row-wise format */ if (build_f_rows(luf)) { /* overflow of the sparse vector area */ luf->new_sva = luf->sv_size + luf->sv_size; goto more; } /* the LU-factorization has been successfully computed */ luf->valid = 1; luf->rank = n; /* if there are few free locations in the sparse vector area, try to increase SVA size in the future */ t = 3 * (n + luf->nnz_v) + 2 * luf->nnz_f; if (luf->sv_size < t) { luf->new_sva = luf->sv_size; while (luf->new_sva < t) luf->new_sva += luf->new_sva; } done: /* free the working area (if necessary) */ if (_wa == NULL) luf_free_wa(wa); /* return to the calling program */ return ret; } /*---------------------------------------------------------------------- -- luf_f_solve - solve system F*x = b or F'*x = b. -- -- *Synopsis* -- -- #include "glpluf.h" -- void luf_f_solve(LUF *luf, int tr, double x[]); -- -- *Description* -- -- The routine luf_f_solve solves either the system F*x = b (if the -- flag tr is zero) or the system F'*x = b (if the flag tr is non-zero), -- where the matrix F is a component of LU-factorization specified by -- the parameter luf, F' is a matrix transposed to F. -- -- On entry the array x should contain elements of the right-hand side -- vector b in locations x[1], ..., x[n], where n is the order of the -- matrix F. On exit this array will contain elements of the solution -- vector x in the same locations. */ void luf_f_solve(LUF *luf, int tr, double x[]) { int n = luf->n; int *fr_ptr = luf->fr_ptr; int *fr_len = luf->fr_len; int *fc_ptr = luf->fc_ptr; int *fc_len = luf->fc_len; int *pp_row = luf->pp_row; int *sv_ndx = luf->sv_ndx; double *sv_val = luf->sv_val; int i, j, k, beg, end, ptr; double xk; if (!luf->valid) fault("luf_f_solve: LU-factorization is not valid"); if (!tr) { /* solve the system F*x = b */ for (j = 1; j <= n; j++) { k = pp_row[j]; xk = x[k]; if (xk != 0.0) { beg = fc_ptr[k]; end = beg + fc_len[k] - 1; for (ptr = beg; ptr <= end; ptr++) x[sv_ndx[ptr]] -= sv_val[ptr] * xk; } } } else { /* solve the system F'*x = b */ for (i = n; i >= 1; i--) { k = pp_row[i]; xk = x[k]; if (xk != 0.0) { beg = fr_ptr[k]; end = beg + fr_len[k] - 1; for (ptr = beg; ptr <= end; ptr++) x[sv_ndx[ptr]] -= sv_val[ptr] * xk; } } } return; } /*---------------------------------------------------------------------- -- luf_v_solve - solve system V*x = b or V'*x = b. -- -- *Synopsis* -- -- #include "glpluf.h" -- void luf_v_solve(LUF *luf, int tr, double x[]); -- -- *Description* -- -- The routine luf_v_solve solves either the system V*x = b (if the -- flag tr is zero) or the system V'*x = b (if the flag tr is non-zero), -- where the matrix V is a component of LU-factorization specified by -- the parameter luf, V' is a matrix transposed to V. -- -- On entry the array x should contain elements of the right-hand side -- vector b in locations x[1], ..., x[n], where n is the order of the -- matrix V. On exit this array will contain elements of the solution -- vector x in the same locations. */ void luf_v_solve(LUF *luf, int tr, double x[]) { int n = luf->n; int *vr_ptr = luf->vr_ptr; int *vr_len = luf->vr_len; double *vr_piv = luf->vr_piv; int *vc_ptr = luf->vc_ptr; int *vc_len = luf->vc_len; int *pp_row = luf->pp_row; int *qq_col = luf->qq_col; int *sv_ndx = luf->sv_ndx; double *sv_val = luf->sv_val; double *b = luf->work; int i, j, k, beg, end, ptr; double temp; if (!luf->valid) fault("luf_v_solve: LU-factorization is not valid"); for (k = 1; k <= n; k++) b[k] = x[k], x[k] = 0.0; if (!tr) { /* solve the system V*x = b */ for (k = n; k >= 1; k--) { i = pp_row[k], j = qq_col[k]; temp = b[i]; if (temp != 0.0) { x[j] = (temp /= vr_piv[i]); beg = vc_ptr[j]; end = beg + vc_len[j] - 1; for (ptr = beg; ptr <= end; ptr++) b[sv_ndx[ptr]] -= sv_val[ptr] * temp; } } } else { /* solve the system V'*x = b */ for (k = 1; k <= n; k++) { i = pp_row[k], j = qq_col[k]; temp = b[j]; if (temp != 0.0) { x[i] = (temp /= vr_piv[i]); beg = vr_ptr[i]; end = beg + vr_len[i] - 1; for (ptr = beg; ptr <= end; ptr++) b[sv_ndx[ptr]] -= sv_val[ptr] * temp; } } } return; } /*---------------------------------------------------------------------- -- luf_solve - solve system A*x = b or A'*x = b. -- -- *Synopsis* -- -- #include "glpluf.h" -- void luf_solve(LUF *luf, int tr, double x[]); -- -- *Description* -- -- The routine luf_solve solves either the system A*x = b (if the flag -- tr is zero) or the system A'*x = b (if the flag tr is non-zero), -- where the parameter luf specifies LU-factorization of the matrix A, -- A' is a matrix transposed to A. -- -- On entry the array x should contain elements of the right-hand side -- vector b in locations x[1], ..., x[n], where n is the order of the -- matrix A. On exit this array will contain elements of the solution -- vector x in the same locations. */ void luf_solve(LUF *luf, int tr, double x[]) { if (!luf->valid) fault("luf_solve: LU-factorization is not valid"); if (!tr) { /* A = F*V, therefore inv(A) = inv(V)*inv(F) */ luf_f_solve(luf, 0, x); luf_v_solve(luf, 0, x); } else { /* A' = V'*F', therefore inv(A') = inv(F')*inv(V') */ luf_v_solve(luf, 1, x); luf_f_solve(luf, 1, x); } return; } /*---------------------------------------------------------------------- -- luf_delete - delete LU-factorization. -- -- *Synopsis* -- -- #include "glpluf.h" -- void luf_delete(LUF *luf); -- -- *Description* -- -- The routine luf_delete deletes LU-factorization data structure, -- which the parameter luf points to, freeing all the memory allocated -- to this object. */ void luf_delete(LUF *luf) { ufree(luf->fr_ptr); ufree(luf->fr_len); ufree(luf->fc_ptr); ufree(luf->fc_len); ufree(luf->vr_ptr); ufree(luf->vr_len); ufree(luf->vr_cap); ufree(luf->vr_piv); ufree(luf->vc_ptr); ufree(luf->vc_len); ufree(luf->vc_cap); ufree(luf->pp_row); ufree(luf->pp_col); ufree(luf->qq_row); ufree(luf->qq_col); ufree(luf->sv_ndx); ufree(luf->sv_val); ufree(luf->sv_prev); ufree(luf->sv_next); ufree(luf->flag); ufree(luf->work); ufree(luf); return; } /* eof */ DyLP-1.6.0/DyLP/src/Dylp/dy_force.c0000644000076700007670000012156211033030745013534 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ #define DYLP_INTERNAL #include "dylp.h" static char sccsid[] UNUSED = "@(#)dy_force.c 4.6 10/15/05" ; static char svnid[] UNUSED = "$Id: dy_force.c 243 2008-07-03 01:56:53Z lou $" ; /* This file contains a pair of routines that attempt to force a transition from primal to dual simplex or from dual to primal simplex, and a final routine which loads the full constraint system. These routines are used as part of dylp's error recovery strategy. When one simplex encounters pivoting difficulties which cannot be easily resolved within that simplex, a possible solution is to force a transition to the other simplex. If this can't be achieved in a way that guarantees some progress toward the optimal solution, the last ditch fall-back position is to load the entire constraint system. A specific example will help. Suppose that primal phase II is running, and it detects that all desireable entering variables have been rejected because the pivot results in a singular basis. In this case, it will return a punt. One way to resolve the problem would be to find some other entering variable. This is easy: it's the standard activate variable step. We can resume pivoting without changing simplex algorithms. But suppose we can't find any variables to activate? A second way to resolve the problem would be to change the basis matrix by adding constraints. There's no sense adding loose constraints, however, and adding violated constraints will cost us primal feasibility. But there's a way out of this bind: force dual feasibility. Then we can add as many violated constraints as we like and resume pivoting in dual simplex. Note that we really do need to find violated constraints. If we're primal feasible, and force dual feasibility, we're optimal and done! But because we're working with a partial system, it can happen that there are no violated constraints. We need to add both constraints and variables in order to make progress. (Trust me. It's happened.) One can think of lots of clever things to try, but the computational cost to determine an intelligent action is generally high. Not so clever, but guaranteed to work if anything will, is to load the full constraint system. (All the above works in primal phase I, with the observation that infeasible means we're `optimal' under the phase I objective but haven't attained feasibility.) How do we force dual feasibility? By removing nonbasic variables with favourable (hence dual infeasible) reduced costs. For architecturals, this is trivial. For logicals, it's a nightmare. Deleting a nonbasic logical implies deleting a (tight) constraint which has an associated nonzero (basic) dual. In general, this changes the values of all dual variables, so our current notion of dual feasibility/infeasibility goes out the window. Further, there's a dangling basic variable to be dealt with. If it's feasible, we can set it to superbasic status. But if it's infeasible, we can only set it to the nearest bound, and that'll change our primal feasibility status. Forcing primal feasibility has the same feel. Deactivating a violated explicit constraint is trivial. Deactivating a violated bound constraint is impossible, because bounds on variables are enforced as part of the primal simplex algorithm, and deactivated variables are assumed to be at bound. Experience during code development says that if the dual <-> primal transition cannot be accomplished by trivial deactivations, it's not worth the attempt. If you want to allow dylp to try, set the heroics option to TRUE. In the absence of heroics, dylp loads the full constraint system. Failure of a transition attempt can occur in two places: * During the first half of the transition, in forcePrimal2Dual (forceDual2Primal), because heroics are forbidden or because they were tried and didn't work. * During the second half of the transition, in gen/add constraints (gen/add variables), when it is determined that there are no violated constraints (variables with favourable reduced costs) to add to the active system. I.e., we're optimal in this subproblem and need to add both constraints and variables to make progress. */ /* Structure to hold candidates for deactivation or flipping when attempting to force dual feasibility. Field Description ----- ----------- ndx variable index flippable TRUE if the variable can be flipped to the opposite bound delta delta for a bound to bound flip */ typedef struct { int ndx ; bool flippable ; double delta ; } fdcand_struct ; static int fdcandcompare (const void *p_fdcand1, const void *p_fdcand2) /* Comparison function to sort an array of fdcand_struct into nonincreasing order of indices. Returns: < 0 if i > j 0 if i = j > 0 if i < j */ { int i,j ; const fdcand_struct *fdcand1,*fdcand2 ; fdcand1 = (const fdcand_struct *) p_fdcand1 ; fdcand2 = (const fdcand_struct *) p_fdcand2 ; i = fdcand1->ndx ; j = fdcand2->ndx ; return ((j)-(i)) ; } static int intcompare (const void *p_i, const void *p_j) /* Reverse integer comparison so we can sort arrays of indices in nonincreasing order. Returns: < 0 if i > j 0 if i = j > 0 if i < j */ { int i = *((const int *) p_i) ; int j = *((const int *) p_j) ; return ((j)-(i)) ; } static int scanPrimVarDualInfeas (fdcand_struct **p_fdcands) /* This routine scans the active constraint system for variables that are dual infeasible and thus must be deactivated or flipped in order to force dual feasibility. Put another way, it looks for nonbasic variables with favourable reduced costs: status NBLB and cbar < 0 and status NBUB and cbar > 0. Parameters: p_fdcands: (i) empty vector to hold candidates; assumed to be sufficiently large; will be allocated if NULL (o) information on variables to be flipped or deactivated; fdcands[0].flippable is set TRUE/FALSE to indicate if any variables can be flipped; may be NULL if no candidates are found. Returns: number of variables to be deactivated/flipped, -1 if there's an error during scanning (error is possible only when paranoid) */ { int j,n,purgecnt,flipcnt ; fdcand_struct *fdcands ; double cbarj,lbj,ubj ; double *vlb,*vub ; flags statj ; bool purge ; # ifdef DYLP_PARANOIA const char *rtnnme = "scanPrimVarDualInfeas" ; if (p_fdcands == NULL) { errmsg(2,rtnnme,"fdcands") ; return (-1) ; } # endif /* Scan preparation. If the user hasn't supplied a vector to hold the indices, allocate one now. */ n = dy_sys->varcnt ; vlb = dy_sys->vlb ; vub = dy_sys->vub ; purgecnt = 0 ; if (*p_fdcands == NULL) { fdcands = (fdcand_struct *) MALLOC((dy_sys->archvcnt+1)*sizeof(fdcand_struct)) ; } else { fdcands = *p_fdcands ; } /* Scan the variables to collect the list of variables to be deactivated or flipped: NBLB status with cbarj < 0 or NBUB status with cbarj > 0. */ flipcnt = 0 ; for (j = 1 ; j <= n ; j++) { purge = FALSE ; statj = dy_status[j] ; cbarj = dy_cbar[j] ; if ((flgon(statj,vstatNBLB) && cbarj < -dy_tols->dfeas) || (flgon(statj,vstatNBUB) && cbarj > dy_tols->dfeas)) { fdcands[++purgecnt].ndx = j ; fdcands[purgecnt].flippable = FALSE ; lbj = vlb[j] ; ubj = vub[j] ; if (flgon(statj,vstatNBLB)) { if (ubj < dy_tols->inf) { fdcands[purgecnt].flippable = TRUE ; flipcnt++ ; fdcands[purgecnt].delta = ubj-lbj ; } } else { if (lbj > -dy_tols->inf) { fdcands[purgecnt].flippable = TRUE ; flipcnt++ ; fdcands[purgecnt].delta = lbj-ubj ; } } # ifndef DYLP_NDEBUG if (dy_opts->print.force >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n queuing %s (%d) for %s, %s, cbar<%d> = %g", consys_nme(dy_sys,'v',j,TRUE,NULL),j, (fdcands[purgecnt].flippable == TRUE)?"flip":"deactivation", dy_prtvstat(statj),j,cbarj) ; } # endif } } /* Prepare for return. If we found candidates, set fdcands[0] and return the vector. If we found none, and we allocated the candidate vector, then free it. */ if (purgecnt == 0) { if (*p_fdcands == NULL) { FREE(fdcands) ; } } else { if (flipcnt > 0) fdcands[0].flippable = TRUE ; else fdcands[0].flippable = FALSE ; if (*p_fdcands == NULL) *p_fdcands = fdcands ; } # ifndef DYLP_NDEBUG if (dy_opts->print.force >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n queued %d variables, %d deactivate, %d flip.", purgecnt,purgecnt-flipcnt,flipcnt) ; } # endif return (purgecnt) ; } dyphase_enum dy_forcePrimal2Dual (consys_struct *orig_sys) /* This routine attempts to force dual feasibility. The approach is to deactivate or repair violated dual constraints (i.e., nonbasic primal variables with favourable reduced costs). By `repair', we mean flipping the variable to its opposite bound, thus restoring dual feasibility. Variables can be flipped only if both bounds are finite. Deactivating or flipping nonbasic architectural variables with favourable reduced costs is trivial. Flipping nonbasic primal logicals associated with range constraints (hence lower and upper bounded) is no different than flipping nonbasic architecturals. Deactivating nonbasic primal logicals, which are associated with tight constraints, which are associated with basic dual architecturals, is a can of worms. In general, the associated dual will be nonzero. The primal constraint and logical must be deactivated together, which amounts to forcing the dual to zero, which has the potential to change the feasibility of every dual constraint. Plus, there's a dangling basic variable to be dealt with. If we're in primal II, we can make it superbasic (guaranteeing we won't achieve dual feasibility, but also not losing primal feasibility). If we're in primal I, well, who cares, just force the variable to the nearest bound. The best we can do is deactivate the constraint and, at the end, refactor, recalculate primals and duals, check for primal and dual feasibility, and go with the flow. So, what to do? Experience says that forcing deactivation of nonbasic logicals is at best a crap shoot, and often wasted effort. It's controllable. If the heroics.p2d option is set to TRUE, tight constraints will be deactivated. Experience also says that flipping nonbasic variables tends to result in cycling. Flipping is also controllable (heroics.flip); if disallowed, a flippable variable will be deactivated instead. What's the result? If we're converting from primal to dual and deactivated only nonbasic architecturals, then we'll have dual feasibility, hence primal optimality, at the end of the routine. In this case, we can reset the lp result to dyOPTIMAL and head for dyGENCON, the normal route to dual simplex. If we suppressed deactivation of tight constraints, then we won't have dual feasibility. Moreover, we haven't dealt with all the problem pivot candidates, so there's no sense simply returning to primal simplex --- we need to do something to change the situation. No sense wasting time on half measures. We're in trouble, so force the full system. If we deactivated tight constraints, we've certainly changed the basis, and anything is possible. We'll need to refactor and do feasibility checks, and go with the flow. This routine is also used to attempt to restore dual feasibility while running dual simplex. In this case, if we're successful we'll head back to dual simplex, detouring via dyADDVARS in an attempt to add some dual constraints to balance the ones we've just deactivated. If we've failed to restore dual feasibility, we can't return to dual simplex. We already have primal infeasibility, so we head for dyPRIMAL1, again detouring via ADDVARS, this time with the objective of adding some variables to help us gain feasibility. The result of processing is communicated in dy_lp->simplex.next, which will be set to dyDUAL or dyPRIMAL[1|2] as appropriate, and in the returned phase code. Parameters: orig_sys: The original constraint system Returns: appropriate next phase (see end of routine), or dyINV if an error occurs. */ { int j,m ; int cand_cnt,ndx,varcnt,concnt,suppressed ; fdcand_struct *candidates ; double *vlb,*vub ; dyret_enum factorresult ; flags calcflgs,statj ; bool retval ; dyret_enum upd_retval ; dyphase_enum next_phase ; const char *rtnnme = "dy_forcePrimal2Dual" ; next_phase = dyINV ; # ifdef DYLP_PARANOIA retval = FALSE ; if (dy_lp->simplex.active == dyDUAL && dy_lp->lpret == lpLOSTFEAS) retval = TRUE ; if ((dy_lp->simplex.active == dyPRIMAL1 || dy_lp->simplex.active == dyPRIMAL2) && (dy_lp->lpret == lpPUNT || dy_lp->lpret == lpSTALLED)) retval = TRUE ; if (retval == FALSE) { errmsg(441,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, dy_prtlpphase(dy_lp->simplex.active,TRUE), dy_prtlpret(dy_lp->lpret)) ; return (dyINV) ; } # endif /* If the primal phase I objective is installed, boot it out and reinstall the phase II objective. */ if (dy_lp->p1obj.installed == TRUE) { if (dy_swapobjs(dyPRIMAL2) == FALSE) { errmsg(318,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "remove") ; return (dyINV) ; } dy_calcduals() ; if (dy_calccbar() == FALSE) { errmsg(384,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters) ; return (dyINV) ; } } /* Call scanPrimVarDualInfeas to return a list of candidates for deactivation. */ candidates = NULL ; cand_cnt = scanPrimVarDualInfeas(&candidates) ; if (cand_cnt < 0) { errmsg(434,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "variable","forced primal -> dual transition") ; if (candidates != NULL) FREE(candidates) ; return (dyINV) ; } # ifdef DYLP_PARANOIA /* We should always find candidates, otherwise why are we here? */ if (cand_cnt == 0) { errmsg(1,rtnnme,__LINE__) ; if (candidates != NULL) FREE(candidates) ; return (dyINV) ; } # endif /* We have candidates. Sort the list and then open a loop to do the deactivations. In the case of logicals, that entails deactivating the constraint. */ qsort(&candidates[1],cand_cnt,sizeof(fdcand_struct),fdcandcompare) ; m = dy_sys->concnt ; vlb = dy_sys->vlb ; vub = dy_sys->vub ; varcnt = 0 ; concnt = 0 ; suppressed = 0 ; retval = TRUE ; for (ndx = 1 ; ndx <= cand_cnt && retval == TRUE ; ndx++) { j = candidates[ndx].ndx ; # ifdef DYLP_PARANOIA if (j < 1 || j > dy_sys->varcnt) { errmsg(102,rtnnme,dy_sys->nme,"variable",j,1,dy_sys->varcnt) ; retval = FALSE ; break ; } # endif /* The easiest case: we can just flip the variable. dy_updateprimals can return dyrOK, dyrREQCHK, dyrSWING, or dyrFATAL. Only dyrFATAL is of concern, as we'll be refactoring, etc., on our way back from forcing dual feasibility. */ if (candidates[ndx].flippable == TRUE && dy_opts->heroics.flips == TRUE) { varcnt++ ; # ifndef DYLP_NDEBUG if (dy_opts->print.force >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n flipping variable %s (%d)", consys_nme(dy_sys,'v',j,TRUE,NULL),j) ; } # endif upd_retval = dy_updateprimals(j,candidates[ndx].delta,NULL) ; if (upd_retval == dyrFATAL) { retval = FALSE ; break ; } statj = dy_status[j] ; if (flgon(statj,vstatNBLB)) { dy_x[j] = vub[j] ; } else { dy_x[j] = vlb[j] ; } comflg(dy_status[j],vstatNBLB|vstatNBUB) ; } /* The easy case: we have a nonbasic architectural. Just call dy_deactNBPrimArch to deal with it. */ else if (j > m) { varcnt++ ; # ifndef DYLP_NDEBUG if (dy_opts->print.force >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n deactivating variable %s (%d)", consys_nme(dy_sys,'v',j,TRUE,NULL),j) ; } # endif retval = dy_deactNBPrimArch(orig_sys,j) ; if (retval == FALSE) { errmsg(430,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "deactivate","variable", consys_nme(dy_sys,'v',j,TRUE,NULL),j) ; } } /* The hard case: we have a nonbasic logical. Not that it looks any more difficult from here. If we're primal feasible, this call will create superbasic variables when it forces the dangling basic variable into the nonbasic partition. */ else if (dy_opts->heroics.p2d == TRUE) { concnt++ ; # ifndef DYLP_NDEBUG if (dy_opts->print.force >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n deactivating constraint %s (%d)", consys_nme(dy_sys,'c',j,TRUE,NULL),j) ; } # endif retval = dy_deactNBLogPrimCon(orig_sys,j) ; if (retval == FALSE) { errmsg(430,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "deactivate","constraint", consys_nme(dy_sys,'c',j,TRUE,NULL),j) ; } } else { suppressed++ ; } } FREE(candidates) ; if (retval == FALSE) return (dyINV) ; # ifndef DYLP_NDEBUG if (dy_opts->print.force >= 1) { if (dy_opts->print.force >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n ") ; } dyio_outfmt(dy_logchn,dy_gtxecho," %d+%d deletions.",concnt,varcnt) ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n constraint system %s now %d x %d (%d + %d).", dy_sys->nme,dy_sys->concnt,dy_sys->varcnt,dy_sys->archvcnt, dy_sys->logvcnt) ; } # endif # ifdef DYLP_PARANOIA if (dy_chkdysys(orig_sys) == FALSE) return (dyINV) ; # endif /* Time to clean up a bit. Keeping in mind that we got here because we were in trouble (lpPUNT or lpLOSTFEAS), it isn't going to hurt to refactor and do accuracy and feasibility checks whether we need it or not. */ # ifndef DYLP_NDEBUG if (dy_opts->print.force >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n factoring, checking accuracy and feasibility ...") ; } # endif calcflgs = ladFACTOR|ladPRIMALCHK|ladDUALCHK| ladPRIMFEAS|ladPFQUIET|ladDUALFEAS|ladDFQUIET ; factorresult = dy_accchk(&calcflgs) ; switch (factorresult) { case dyrOK: case dyrPATCHED: { # ifndef DYLP_NDEBUG if (dy_opts->print.force >= 2) { if (factorresult == dyrOK) dyio_outfmt(dy_logchn,dy_gtxecho,"\n done.") ; else dyio_outfmt(dy_logchn,dy_gtxecho,"\n patched.") ; dyio_outfmt(dy_logchn,dy_gtxecho," Feasibility:") ; if (flgoff(calcflgs,ladPRIMFEAS)) { dyio_outfmt(dy_logchn,dy_gtxecho," primal") ; } if (flgoff(calcflgs,ladDUALFEAS)) { dyio_outfmt(dy_logchn,dy_gtxecho," dual") ; } if (flgall(calcflgs,ladPRIMFEAS|ladDUALFEAS)) { dyio_outfmt(dy_logchn,dy_gtxecho," none") ; } } # endif break ; } default: { next_phase = dyINV ; # ifndef DYLP_NDEBUG if (dy_opts->print.force >= 2) dyio_outfmt(dy_logchn,dy_gtxecho,"\n failed.") ; # endif break ; } } # ifdef DYLP_PARANOIA /* The crucial question is whether we have dual feasibility. See the long explanation at the head of the routine for the detailed reasons behind the phase transitions and associated actions. Here on the front line, the truth of the matter is that we've refactored and numerical wierdness could put us anywhere. If we're feeling paranoid, check that feasibility is what we expect. */ if (suppressed == 0) { if (concnt == 0 && flgon(calcflgs,ladDUALFEAS)) { warn(439,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "absence","dual") ; } } else { if (flgoff(calcflgs,ladDUALFEAS)) { warn(439,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "presence","dual") ; } } if (dy_lp->simplex.active == dyDUAL && flgoff(calcflgs,ladPRIMFEAS)) { warn(439,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "presence","primal") ; } # endif /* We're here in an attempt to restore dual feasibility. If we've changed the basis, we need to reinitialise the DSE norms. I can't conceive of why we'd suddenly acquire primal feasibility, but it won't hurt to code for it. Leave the lp return code as lpLOSTFEAS. The expectation is that dyADDVAR will determine if the correct primal objective is installed and take action if needed. */ if (dy_lp->simplex.active == dyDUAL) { if (flgoff(calcflgs,ladDUALFEAS)) { dy_lp->simplex.next = dyDUAL ; if (concnt != 0) dy_lp->simplex.init_dse = TRUE ; next_phase = dyADDVAR ; } else { dy_lp->simplex.init_pse = TRUE ; if (flgoff(calcflgs,ladPRIMFEAS)) { dy_lp->simplex.next = dyPRIMAL2 ; } else { dy_lp->simplex.next = dyPRIMAL1 ; } next_phase = dyADDVAR ; } } /* We're attempting a primal -> dual transition. Dual feasibility says we were successful in forcing dual feasibility, the first step of the transition. Otherwise, we're in deep trouble; might as well force the full system. */ else { dy_lp->lpret = lpFORCEDUAL ; if (flgoff(calcflgs,ladDUALFEAS)) { dy_lp->simplex.next = dyDUAL ; dy_lp->simplex.init_dse = TRUE ; next_phase = dyGENCON ; } else { next_phase = dyFORCEFULL ; } } # ifndef DYLP_NDEBUG if (dy_opts->print.force >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n next phase %s, next simplex %s.", dy_prtlpphase(next_phase,FALSE), dy_prtlpphase(dy_lp->simplex.next,FALSE)) ; } # endif return (next_phase) ; } static int scanPrimConForceDeact (int **p_acndxs) /* This routine scans the active constraint system for constraints (including implicit bound constraints) that are violated and thus must be deactivated in order to force primal feasibility. Put another way, it looks for basic variables that are outside of bounds. Parameters: p_acndxs: (i) empty vector to hold constraint indices; assumed to be sufficiently large; will be allocated if NULL (o) indices of constraint to be deactivated; may not be allocated if no candidates are identified Returns: number of constraint to be deactivated, -1 if there's an error during scanning (error is possible only when paranoid) */ { int bpos,j,m,purgecnt ; int *acndxs ; flags statj ; # ifdef DYLP_PARANOIA const char *rtnnme = "scanPrimConForceDeact" ; if (p_acndxs == NULL) { errmsg(2,rtnnme,"&acndxs") ; return (-1) ; } # endif m = dy_sys->concnt ; if (*p_acndxs == NULL) { acndxs = (int *) MALLOC(m*sizeof(int)) ; } else { acndxs = *p_acndxs ; } /* Open a loop to search for candidates for deactivation. It's pretty straightforward, as all we need to do is examine the status of the basic variable. */ purgecnt = 0 ; for (bpos = 1 ; bpos <= m ; bpos++) { j = dy_basis[bpos] ; statj = dy_status[j] ; if (flgon(statj,vstatBLLB|vstatBUUB)) { acndxs[purgecnt++] = j ; # ifndef DYLP_NDEBUG if (dy_opts->print.force >= 3) { if (j <= m) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n queued %s %s (%d) for deactivation, ", consys_prtcontyp(dy_sys->ctyp[j]), consys_nme(dy_sys,'c',j,TRUE,NULL),j) ; dyio_outfmt(dy_logchn,dy_gtxecho, "%s (%d) = %g, status %s, basis pos'n %d.", consys_nme(dy_sys,'v',j,TRUE,NULL),j, dy_x[j],dy_prtvstat(statj),bpos) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho, "\n queued %s (%d) = %g for deactivation, ", consys_nme(dy_sys,'v',j,TRUE,NULL),j,dy_x[j]) ; dyio_outfmt(dy_logchn,dy_gtxecho,"status %s, basis pos'n %d.", dy_prtvstat(statj),bpos) ; } } # endif } } if (*p_acndxs == NULL) { if (purgecnt <= 0) { FREE(acndxs) ; } else { *p_acndxs = acndxs ; } } # ifndef DYLP_NDEBUG if (dy_opts->print.force >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n queued %d constraints for deactivation.",purgecnt) ; } # endif return (purgecnt) ; } dyphase_enum dy_forceDual2Primal (consys_struct *orig_sys) /* This routine attempts to force primal feasibility. The approach is to deactivate violated primal constraints with basic logicals (i.e., nonbasic dual architectural variables with favourable reduced costs). There's one major fly in the ointment: basic primal architecturals which violate one of their (implicit) bound constraints. If this bound were an explicit constraint, we'd have a basic logical and life would be simple. But it isn't, and we don't, and life is complicated. We don't want to shoot the messenger (the explicit constraint in this basis pos'n). The real problem is that the implicit bound constraint is wired into the simplex algorithm and it's not possible to deactivate it. Pushing the variable into the nonbasic partition, or going further and deactivating it, simply enforces the bound constraint. Still, there's little else we can do if we want to deactivate them. So, what to do? Experience says that forcing deactivation of basic architecturals is wasted effort, but it's controllable. If the heroics.d2p option is set to TRUE, basic architecturals are forced out. What's the result? If the only violated constraints are explicit constraints, we'll have primal feasibility at the end of the routine. If there are violated implicit bound constraints, and heroics is FALSE, we won't have primal feasibility, and there's no point in returning to dual simplex because we haven't dealt with all the problem pivot candidates. If there are violated implicit bound constraints and heroics is TRUE, anything is possible and we just have to check. The result of processing is communicated in dy_lp->simplex.next, which will be set to dyDUAL or dyPRIMAL[1|2] as appropriate, and the returned phase code. Parameters: orig_sys: The original constraint system Returns: appropriate next phase, or dyINV if an error occurs */ { int j,m ; int *candidates,cand_cnt,ndx,varcnt,concnt,suppressed ; dyret_enum factorresult ; flags calcflgs ; bool retval ; dyphase_enum next_phase ; const char *rtnnme = "dy_forceDual2Primal" ; # ifdef DYLP_PARANOIA retval = FALSE ; if (dy_lp->simplex.active == dyDUAL && (dy_lp->lpret == lpPUNT || dy_lp->lpret == lpSTALLED)) retval = TRUE ; if (retval == FALSE) { errmsg(441,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, dy_prtlpphase(dy_lp->simplex.active,TRUE), dy_prtlpret(dy_lp->lpret)) ; } # endif next_phase = dyINV ; /* Have we made any progress since the last time we were here? If not, we're quite possibly looping through constraint deactivation/activation. Just head for primal phase I. */ if (dy_lp->z-dy_lp->lastz.fp < dy_tols->purge*(1.0+fabs(dy_lp->z))) { dy_lp->simplex.next = dyPRIMAL1 ; dy_lp->simplex.init_pse = TRUE ; return (dyPRIMAL1) ; } dy_lp->lastz.fp = dy_lp->z ; /* Call scanPrimConForceDeact to return a list of candidates for deactivation. */ candidates = NULL ; cand_cnt = scanPrimConForceDeact(&candidates) ; if (cand_cnt < 0) { errmsg(434,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "constraint","forced dual -> primal transition") ; if (candidates != NULL) FREE(candidates) ; return (dyINV) ; } # ifdef DYLP_PARANOIA /* We should always find candidates, otherwise why are we here? */ if (cand_cnt == 0) { errmsg(1,rtnnme,__LINE__) ; if (candidates != NULL) FREE(candidates) ; return (dyINV) ; } # endif /* We have candidates. Sort the list and then open a loop to do the deactivations. In the case of explicit constraints with basic logicals, it's easy: we just deactivate the constraint. If the violated constraint is an implicit bound, we proceed as discussed in the comments at the head of the routine. */ qsort(&candidates[0],cand_cnt,sizeof(int),intcompare) ; m = dy_sys->concnt ; varcnt = 0 ; concnt = 0 ; suppressed = 0 ; retval = TRUE ; for (ndx = 0 ; ndx < cand_cnt && retval == TRUE ; ndx++) { j = candidates[ndx] ; # ifdef DYLP_PARANOIA if (j < 1 || j > dy_sys->varcnt) { errmsg(102,rtnnme,dy_sys->nme,"variable",j,1,dy_sys->varcnt) ; retval = FALSE ; break ; } # endif /* The easy case: we have a basic logical. dy_deactBLogPrimCon will deal with this neatly. */ if (j <= m) { concnt++ ; # ifndef DYLP_NDEBUG if (dy_opts->print.force >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n deactivating constraint %s (%d)", consys_nme(dy_sys,'c',j,TRUE,NULL),j) ; } # endif retval = dy_deactBLogPrimCon(orig_sys,j) ; if (retval == FALSE) { errmsg(430,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "deactivate","constraint", consys_nme(dy_sys,'c',j,TRUE,NULL),j) ; } } /* The hard case: we have a basic architectural. The ugliness is hidden in dy_deactBPrimArch. */ else if (dy_opts->heroics.d2p == TRUE) { varcnt++ ; # ifndef DYLP_NDEBUG if (dy_opts->print.force >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n deactivating variable %s (%d)", consys_nme(dy_sys,'v',j,TRUE,NULL),j) ; } # endif retval = dy_deactBPrimArch(orig_sys,j) ; if (retval == FALSE) { errmsg(430,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "deactivate","variable", consys_nme(dy_sys,'v',j,TRUE,NULL),j) ; } } else { suppressed++ ; } } FREE(candidates) ; if (retval == FALSE) return (dyINV) ; # ifndef DYLP_NDEBUG if (dy_opts->print.force >= 1) { if (dy_opts->print.conmgmt >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n ") ; } dyio_outfmt(dy_logchn,dy_gtxecho," %d+%d deletions.",concnt,varcnt) ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n constraint system %s now %d x %d (%d + %d).", dy_sys->nme,dy_sys->concnt,dy_sys->varcnt,dy_sys->archvcnt, dy_sys->logvcnt) ; } # endif # ifdef DYLP_PARANOIA if (dy_chkdysys(orig_sys) == FALSE) return (dyINV) ; # endif /* Time to clean up a bit. Whatever we've done, it's changed the basis, so we might as well refactor now. While we're there, might as well do accuracy and feasibility checks. */ # ifndef DYLP_NDEBUG if (dy_opts->print.force >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n factoring, checking accuracy and feasibility.") ; } # endif calcflgs = ladFACTOR|ladPRIMALCHK|ladDUALCHK| ladPRIMFEAS|ladPFQUIET|ladDUALFEAS|ladDFQUIET ; factorresult = dy_accchk(&calcflgs) ; switch (factorresult) { case dyrOK: case dyrPATCHED: { # ifndef DYLP_NDEBUG if (dy_opts->print.force >= 2) { if (factorresult == dyrOK) dyio_outfmt(dy_logchn,dy_gtxecho,"\n done.") ; else dyio_outfmt(dy_logchn,dy_gtxecho,"\n patched.") ; dyio_outfmt(dy_logchn,dy_gtxecho," Feasibility:") ; if (flgoff(calcflgs,ladPRIMFEAS)) { dyio_outfmt(dy_logchn,dy_gtxecho," primal") ; } if (flgoff(calcflgs,ladDUALFEAS)) { dyio_outfmt(dy_logchn,dy_gtxecho," dual") ; } if (flgall(calcflgs,ladPRIMFEAS|ladDUALFEAS)) { dyio_outfmt(dy_logchn,dy_gtxecho," none") ; } } # endif break ; } default: { # ifndef DYLP_NDEBUG if (dy_opts->print.force >= 2) dyio_outfmt(dy_logchn,dy_gtxecho,"\n failed.") ; # endif return (dyINV) ; } } /* We've successfully refactored & calculated primal and dual feasibility. The crucial question is whether we have primal feasibility. If we're primal feasible, we've completed the first half of the dual -> primal transition. We can set simplex.next = dyPRIMAL2 and head for dyADDVAR to look for variables with favourable reduced cost. If we failed to gain primal feasibility, well, specify primal phase I instead and see how it goes. If we're paranoid, we check that the feasibility is what we expect. */ # ifdef DYLP_PARANOIA if (suppressed == 0) { if (varcnt == 0 && flgon(calcflgs,ladPRIMFEAS)) { warn(439,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "absence","primal") ; } } else { if (flgoff(calcflgs,ladPRIMFEAS)) { warn(439,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "presence","primal") ; } } # endif dy_lp->lpret = lpFORCEPRIMAL ; if (flgoff(calcflgs,ladPRIMFEAS)) { dy_lp->simplex.next = dyPRIMAL2 ; next_phase = dyADDVAR ; } else { dy_lp->simplex.next = dyPRIMAL1 ; next_phase = dyADDVAR ; } dy_lp->simplex.init_pse = TRUE ; # ifndef DYLP_NDEBUG if (dy_opts->print.force >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n next phase %s, next simplex %s.", dy_prtlpphase(next_phase,FALSE), dy_prtlpphase(dy_lp->simplex.next,FALSE)) ; } # endif return (next_phase) ; } static int scanPrimVarForceAct (consys_struct *orig_sys, int **p_ovndxs) /* This routine scans the original constraint system looking for inactive variables to add to the active system. Parameters: orig_sys: The original constraint system p_ovndxs: (i) empty vector to hold constraint indices; assumed sufficiently large if non-NULL; if NULL, allocated if necessary (o) indices of constraints to be activated; may not be allocated if no constraints are identified Returns: number of candidates for activation, -1 if error. */ { int j,n,actcnt ; int *ovndxs ; # ifdef DYLP_PARANOIA const char *rtnnme = "scanPrimVarForceAct" ; if (orig_sys == NULL) { errmsg(2,rtnnme,"orig_sys") ; return (-1) ; } if (p_ovndxs == NULL) { errmsg(2,rtnnme,"&ovndxs") ; return (-1) ; } # endif n = orig_sys->varcnt ; /* Did the client supply a vector for candidate indices? If not, make one. */ actcnt = n-dy_sys->archvcnt ; if (*p_ovndxs == NULL) { ovndxs = (int *) MALLOC(actcnt*sizeof(int)) ; } else { ovndxs = *p_ovndxs ; } /* Now step through the variables, remembering the inactive ones. As always, we never activate fixed variables. */ actcnt = 0 ; for (j = 1 ; j <= n ; j++) { if (!LOADABLE_VAR(j)) continue ; ovndxs[actcnt++] = j ; # ifndef DYLP_NDEBUG if (dy_opts->print.force >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n queued %s variable %s (%d),", consys_prtvartyp(orig_sys->vtyp[j]), consys_nme(orig_sys,'v',j,FALSE,NULL),j) ; } # endif } /* If we supplied ovndxs and found no candidates to activate, free it. */ if (*p_ovndxs == NULL) { if (actcnt == 0) { FREE(ovndxs) ; } else { *p_ovndxs = ovndxs ; } } # ifndef DYLP_NDEBUG if (dy_opts->print.force >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n queued %d variables for activation.",actcnt) ; } # endif return (actcnt) ; } static int scanPrimConForceAct (consys_struct *orig_sys, int **p_ocndxs) /* This routine scans the original constraint system looking for inactive constraints to add to the active system. Parameters: orig_sys: The original constraint system p_ocndxs: (i) empty vector to hold constraint indices; assumed sufficiently large if non-NULL; if NULL, allocated if necessary (o) indices of constraints to be activated; may not be allocated if no constraints are identified Returns: number of candidates for activation, -1 if error. */ { int i,m,actcnt ; int *ocndxs ; # ifdef DYLP_PARANOIA const char *rtnnme = "scanPrimConForceAct" ; if (orig_sys == NULL) { errmsg(2,rtnnme,"orig_sys") ; return (-1) ; } if (p_ocndxs == NULL) { errmsg(2,rtnnme,"&ocndxs") ; return (-1) ; } # endif m = orig_sys->concnt ; /* Did the client supply a vector for candidate indices? If not, make one. */ actcnt = m-dy_sys->concnt ; if (*p_ocndxs == NULL) { ocndxs = (int *) MALLOC(actcnt*sizeof(int)) ; } else { ocndxs = *p_ocndxs ; } /* Now step through the constraints, remembering the loadable ones. */ actcnt = 0 ; for (i = 1 ; i <= m ; i++) { if (!LOADABLE_CON(i)) continue ; ocndxs[actcnt++] = i ; # ifndef DYLP_NDEBUG if (dy_opts->print.force >= 3) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n queued %s constraint %s (%d),", consys_prtcontyp(orig_sys->ctyp[i]), consys_nme(orig_sys,'c',i,FALSE,NULL),i) ; } # endif } /* If we supplied ocndxs and found no candidates to activate, free it. */ if (*p_ocndxs == NULL) { if (actcnt == 0) { FREE(ocndxs) ; } else { *p_ocndxs = ocndxs ; } } # ifndef DYLP_NDEBUG if (dy_opts->print.force >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n queued %d constraints for activation.",actcnt) ; } # endif return (actcnt) ; } dyphase_enum dy_forceFull (consys_struct *orig_sys) /* This routine activates all inactive variables and constraints. It's the last resort for error recovery by constraint sytem modification. It's also used as a utility to force the full constraint system following a hot start. In this case, dy_hotstart will make it look like lpFORCEPRIMAL. Parameters: orig_sys: The original constraint system Returns: appropriate next phase (see end of routine), or dyINV if an error occurs. */ { int *candidates,varcnt,concnt ; dyret_enum factorresult ; flags calcflgs ; bool retval ; dyphase_enum next_phase ; const char *rtnnme = "dy_forceFull" ; next_phase = dyINV ; # ifdef DYLP_PARANOIA if (!(dy_lp->lpret == lpFORCEDUAL || dy_lp->lpret == lpFORCEPRIMAL || dy_lp->lpret == lpPUNT || dy_lp->lpret == lpACCCHK)) { errmsg(4,rtnnme,"simplex return code",dy_prtlpret(dy_lp->lpret)) ; return (dyINV) ; } # endif /* Call scanPrimConForceAct to return a list of candidates for activation, then call dy_actBLogPrimConList to activate them. */ candidates = NULL ; concnt = scanPrimConForceAct(orig_sys,&candidates) ; if (concnt < 0) { errmsg(434,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "constraint","forced full activation") ; retval = FALSE ; } else if (concnt > 0) { retval = dy_actBLogPrimConList(orig_sys,concnt,candidates,NULL) ; } else { retval = TRUE ; } if (candidates != NULL) FREE(candidates) ; if (retval == FALSE) { return (dyINV) ; } /* And repeat for inactive variables. */ candidates = NULL ; varcnt = scanPrimVarForceAct(orig_sys,&candidates) ; if (varcnt < 0) { errmsg(434,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "variable","forced full activation") ; } else if (varcnt > 0) { retval = dy_actNBPrimArchList(orig_sys,varcnt,candidates) ; } else { retval = TRUE ; } if (candidates != NULL) FREE(candidates) ; if (concnt < 0 || retval == FALSE) { return (dyINV) ; } # ifdef DYLP_PARANOIA /* We should have activated at least one constraint or variable. Check the constraint system while we're here. */ if (concnt+varcnt == 0) { errmsg(1,rtnnme,__LINE__) ; return (dyINV) ; } if (dy_chkdysys(orig_sys) == FALSE) return (dyINV) ; # endif # ifndef DYLP_NDEBUG if (dy_opts->print.force >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n %d+%d activations.",concnt,varcnt) ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n constraint system %s now %d x %d (%d + %d).", dy_sys->nme,dy_sys->concnt,dy_sys->varcnt,dy_sys->archvcnt, dy_sys->logvcnt) ; } # endif /* Time to clean up a bit. Refactor and do accuracy and feasibility checks whether we need it or not. */ # ifndef DYLP_NDEBUG if (dy_opts->print.force >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n factoring, checking accuracy and feasibility ...") ; } # endif calcflgs = ladFACTOR|ladPRIMALCHK|ladDUALCHK| ladPRIMFEAS|ladPFQUIET|ladDUALFEAS|ladDFQUIET ; factorresult = dy_accchk(&calcflgs) ; switch (factorresult) { case dyrOK: case dyrPATCHED: { # ifndef DYLP_NDEBUG if (dy_opts->print.force >= 2) { if (factorresult == dyrOK) dyio_outfmt(dy_logchn,dy_gtxecho,"\n done.") ; else dyio_outfmt(dy_logchn,dy_gtxecho,"\n patched.") ; dyio_outfmt(dy_logchn,dy_gtxecho," Feasibility:") ; if (flgoff(calcflgs,ladPRIMFEAS)) { dyio_outfmt(dy_logchn,dy_gtxecho," primal") ; } if (flgoff(calcflgs,ladDUALFEAS)) { dyio_outfmt(dy_logchn,dy_gtxecho," dual") ; } if (flgall(calcflgs,ladPRIMFEAS|ladDUALFEAS)) { dyio_outfmt(dy_logchn,dy_gtxecho," none") ; } } # endif break ; } default: { next_phase = dyINV ; # ifndef DYLP_NDEBUG if (dy_opts->print.force >= 2) dyio_outfmt(dy_logchn,dy_gtxecho,"\n failed.") ; # endif break ; } } /* Where we go next should depend on our feasibility status. Basically, we want to head for the appropriate simplex phase. */ dy_lp->lpret = lpFORCEFULL ; if (flgoff(calcflgs,ladPRIMFEAS)) { dy_lp->simplex.next = dyPRIMAL2 ; dy_lp->simplex.init_pse = TRUE ; next_phase = dyPRIMAL2 ; } else if (flgoff(calcflgs,ladDUALFEAS) && dy_opts->usedual == TRUE) { dy_lp->simplex.next = dyDUAL ; dy_lp->simplex.init_dse = TRUE ; next_phase = dyDUAL ; } else { dy_lp->simplex.next = dyPRIMAL1 ; dy_lp->simplex.init_pse = TRUE ; next_phase = dyPRIMAL1 ; } # ifndef DYLP_NDEBUG if (dy_opts->print.force >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n next phase %s, next simplex %s.", dy_prtlpphase(next_phase,FALSE), dy_prtlpphase(dy_lp->simplex.next,FALSE)) ; } # endif return (next_phase) ; } DyLP-1.6.0/DyLP/src/Dylp/dy_vector_utils.c0000644000076700007670000002373311026315405015162 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains utility routines for the packed vector structure, as well as a few utilities for general expanded vectors. */ #include "dylib_errs.h" #include "dylib_std.h" #include "dylib_strrtns.h" #include "dy_vector.h" static char sccsid[] UNUSED = "@(#)vector_utils.c 4.5 11/06/04" ; static char svnid[] UNUSED = "$Id: dy_vector_utils.c 240 2008-06-18 23:32:21Z lou $" ; static const char *noname = "<>" ; pkvec_struct *pkvec_new (int sze) /* This routine allocates a new packed vector structure. Parameters: sze: the allocated size of the coeffs array Returns: pointer to the packed vector, or null if allocation fails */ { pkvec_struct *pkvec ; const char *rtnnme = "pkvec_new" ; if (sze < 0) sze = 0 ; pkvec = (pkvec_struct *) CALLOC(1,sizeof(pkvec_struct)) ; pkvec->sze = sze ; pkvec->nme = noname ; if (sze == 0) { pkvec->coeffs = NULL ; } else { pkvec->coeffs = (pkcoeff_struct *) MALLOC(sizeof(pkcoeff_struct)*sze) ; if (pkvec->coeffs == NULL) { errmsg(8,rtnnme,__LINE__,sizeof(pkcoeff_struct)*sze) ; return (NULL) ; } } return (pkvec) ; } bool pkvec_resize (pkvec_struct *pkvec, int sze) /* This routine resizes a packed vector as specified by sze. If sze is 0, the default is to expand by 10% of the current size, with a minimum expansion of 10. It's an error if the new size is less than the current number of coefficients in the vector. Parameters: sze: the new allocated size of the vector pkvec: the packed vector Returns: TRUE if the expansion succeeds, FALSE otherwise. */ { pkcoeff_struct *coeffs ; const char *rtnnme = "pkvec_resize" ; # ifdef DYLP_PARANOIA if (pkvec == NULL) { errmsg(2,rtnnme,"pkvec") ; return (FALSE) ; } if ((pkvec->coeffs == NULL && (pkvec->sze > 0 || pkvec->cnt > 0)) || (pkvec->cnt > pkvec->sze)) { errmsg(90,rtnnme,(pkvec->nme == NULL)?"<>":pkvec->nme, pkvec->ndx,pkvec->sze,pkvec->cnt,(pkvec->coeffs == NULL)?"un":"") ; return (FALSE) ; } #endif if (sze == 0) sze = minn((int)(pkvec->sze*1.1),pkvec->sze+10) ; if (sze < pkvec->cnt) { errmsg(91,rtnnme,(pkvec->nme == NULL)?"<>":pkvec->nme, pkvec->ndx,pkvec->cnt,sze) ; return (FALSE) ; } coeffs = pkvec->coeffs ; pkvec->coeffs = (pkcoeff_struct *) REALLOC(pkvec->coeffs,sizeof(pkcoeff_struct)*sze) ; if (pkvec->coeffs == NULL) { errmsg(8,rtnnme,__LINE__,sizeof(pkcoeff_struct)*sze) ; pkvec->coeffs = coeffs ; return (FALSE) ; } pkvec->sze = sze ; return (TRUE) ; } void pkvec_free (pkvec_struct *pkvec) /* This routine frees a packed vector. Parameters: pkvec: packed vector Returns: undefined. */ { # ifdef DYLP_PARANOIA const char *rtnnme = "pkvec_free" ; if (pkvec == NULL) { errmsg(2,rtnnme,"pkvec") ; return ; } # endif if (pkvec->coeffs != NULL) FREE(pkvec->coeffs) ; FREE(pkvec) ; return ; } bool pkvec_check (pkvec_struct *pkvec, const char *caller) /* This routine goes over pkvec and decides if it's consistent, according to the following rules: * nme != NULL (this is a sort of sanity check -- failure here likely means that the vector has been corrupted somewhere along the way, or was sloppily crafted without calling pkvec_new) * sze >= 0 * sze == 0 iff coeffs == NULL * ndx >= 0 and isnan(dflt) == FALSE A vector can have sze == 0 and cnt > 0 in the case where it's used to acquire header information without reading the coefficients of the row or column. The allowance for ndx == 0 is made with reluctance, but it's necessary when loading a new matrix -- the index is filled in once the row/column is installed in the matrix. If sze > 0, the coeffs array is assumed to be valid, and the following two checks are also applied: * 0 <= cnt <= sze * coeffs[*].ndx > 0 and isnan(coeffs[*].val) == FALSE If any problems are found, the pkvec_check issues an error message on behalf of its calling routine. Parameters: pkvec: packed vector caller: name of calling routine Returns: TRUE if the vector checks out, FALSE otherwise. */ { int ndx ; const char *rtnnme = "pkvec_check" ; # ifdef DYLP_PARANOIA if (pkvec == NULL) { errmsg(2,rtnnme,"pkvec") ; return (FALSE) ; } # endif if (caller == NULL) caller = rtnnme ; if (pkvec->nme == NULL) { errmsg(95,caller,pkvec) ; return (FALSE) ; } if (pkvec->sze < 0 || (pkvec->sze == 0 && pkvec->coeffs != NULL) || (pkvec->sze != 0 && pkvec->coeffs == NULL)) { errmsg(90,caller,pkvec->nme,pkvec->ndx, pkvec->sze,pkvec->cnt,(pkvec->coeffs == NULL)?"un":"") ; return (FALSE) ; } if (pkvec->ndx < 0 || isnan(pkvec->dflt)) { errmsg(93,caller,pkvec->nme,pkvec->ndx,pkvec->dflt) ; return (FALSE) ; } if (pkvec->sze == 0) return (TRUE) ; if (pkvec->cnt < 0 || pkvec->cnt > pkvec->sze) { errmsg(90,caller,pkvec->nme,pkvec->ndx, pkvec->sze,pkvec->cnt,(pkvec->coeffs == NULL)?"un":"") ; return (FALSE) ; } for (ndx = 0 ; ndx < pkvec->cnt ; ndx++) { if (pkvec->coeffs[ndx].ndx < 0 || isnan(pkvec->coeffs[ndx].val)) { errmsg(94,caller,pkvec->nme,pkvec->ndx,ndx,pkvec->coeffs[ndx].ndx, ndx,pkvec->coeffs[ndx].val) ; return (FALSE) ; } } return (TRUE) ; } double exvec_1norm (double *vec, int len) /* Simple utility routine to calculate the 1-norm SUM{j} |vec| of an expanded vector. The vector is assumed to be indexed from 1 to len. Parameters: vec: expanded vector len: length of the vector Returns: the 1-norm of the vector, or NaN if there's a problem. */ { int ndx ; double norm ; # ifdef DYLP_PARANOIA const char *rtnnme = "exvec_1norm" ; if (vec == NULL) { errmsg(2,rtnnme,"vec") ; return (quiet_nan(0)) ; } # endif norm = 0 ; for (ndx = 1 ; ndx <= len ; ndx++) norm += fabs(vec[ndx]) ; return (norm) ; } double exvec_ssq (double *vec, int len) /* Simple utility routine to calculate the sum of squares SUM{j} vec**2 of an expanded vector. It's often more useful to have this than the actual 2-norm. The vector is assumed to be indexed from 1 to len. Parameters: vec: expanded vector len: length of the vector Returns: the sum of squares of the vector, or NaN if there's a problem. */ { int ndx ; double norm ; # ifdef DYLP_PARANOIA const char *rtnnme = "exvec_ssq" ; if (vec == NULL) { errmsg(2,rtnnme,"vec") ; return (quiet_nan(0)) ; } # endif norm = 0 ; for (ndx = 1 ; ndx <= len ; ndx++) norm += vec[ndx]*vec[ndx] ; return (norm) ; } double exvec_2norm (double *vec, int len) /* Simple utility routine to calculate the 2-norm sqrt(SUM{j} vec**2) of an expanded vector. The vector is assumed to be indexed from 1 to len. Parameters: vec: expanded vector len: length of the vector Returns: the 2-norm of the vector, or NaN if there's a problem. */ { int ndx ; double norm ; # ifdef DYLP_PARANOIA const char *rtnnme = "exvec_2norm" ; if (vec == NULL) { errmsg(2,rtnnme,"vec") ; return (quiet_nan(0)) ; } # endif norm = 0 ; for (ndx = 1 ; ndx <= len ; ndx++) norm += vec[ndx]*vec[ndx] ; return (sqrt(norm)) ; } double pkvec_2norm (pkvec_struct *vec) /* Simple utility routine to calculate the 2-norm sqrt(SUM{j} vec**2) of a packed vector. Parameters: vec: packed vector Returns: the 2-norm of the vector, or NaN if there's a problem. */ { int ndx ; pkcoeff_struct *coeffs ; double norm ; # ifdef DYLP_PARANOIA const char *rtnnme = "pkvec_2norm" ; if (vec == NULL) { errmsg(2,rtnnme,"pkvec") ; return (quiet_nan(0)) ; } if (vec->coeffs == NULL) { errmsg(2,rtnnme,"pkvec coeffs") ; return (quiet_nan(0)) ; } # endif norm = 0 ; coeffs = vec->coeffs ; for (ndx = 0 ; ndx < vec->cnt ; ndx++) norm += coeffs[ndx].val*coeffs[ndx].val ; return (sqrt(norm)) ; } double exvec_infnorm (double *vec, int len, int *p_jmax) /* Simple utility routine to calculate the infinity-norm MAX{j} |vec| of an expanded vector. The vector is assumed to be indexed from 1 to len. Parameters: vec: expanded vector len: length of the vector p_jmax: (o) if non-null, will be set to index of max value Returns: the inf-norm (max) of the vector, or NaN if there's a problem. */ { int j,jmax ; double norm ; # ifdef DYLP_PARANOIA const char *rtnnme = "exvec_infnorm" ; if (vec == NULL) { errmsg(2,rtnnme,"vec") ; if (p_jmax != NULL) *p_jmax = -1 ; return (quiet_nan(0)) ; } # endif /* Initialising (norm, jmax) to (0.0, len) will give the proper result for a vector of length 0, and also suppresses a compiler `possible rui' warning for jmax. */ norm = 0.0 ; if (p_jmax != NULL) { jmax = len ; for (j = 1 ; j <= len ; j++) { if (fabs(vec[j]) > norm) { norm = fabs(vec[j]) ; jmax = j ; } } *p_jmax = jmax ; } else { for (j = 1 ; j <= len ; j++) norm = maxx(fabs(vec[j]),norm) ; } return (norm) ; } double pkvec_dotexvec (pkvec_struct *pkvec, double *exvec) /* Utility routine to calculate the dot product SUM{j} pkvec*exvec of a packed vector and an expanded vector. Parameters: pkvec: packed vector exvec: expanded vector Returns: the dot product of the two vectors, or NaN if there's a problem */ { int pkndx ; double dot ; pkcoeff_struct *coeffs ; # ifdef DYLP_PARANOIA const char *rtnnme = "pkvec_dotexvec" ; if (pkvec == NULL) { errmsg(2,rtnnme,"pkvec") ; return (quiet_nan(0)) ; } if (pkvec->coeffs == NULL) { errmsg(2,rtnnme,"pkvec coeffs") ; return (quiet_nan(0)) ; } if (exvec == NULL) { errmsg(2,rtnnme,"exvec") ; return (quiet_nan(0)) ; } # endif dot = 0 ; coeffs = pkvec->coeffs ; for (pkndx = 0 ; pkndx < pkvec->cnt ; pkndx++) dot += coeffs[pkndx].val*exvec[coeffs[pkndx].ndx] ; return (dot) ; } DyLP-1.6.0/DyLP/src/Dylp/Makefile.am0000644000076700007670000000515111040016063013620 0ustar # Copyright (C) 2006 International Business Machines and others. # All Rights Reserved. # This file is distributed under the Common Public License. ## $Id: Makefile.am 491 2006-05-19 20:37:52Z andreasw $ # Author: Andreas Waechter IBM 2006-04-13 AUTOMAKE_OPTIONS = foreign EXTRA_DIST = dy_errmsgs.txt ######################################################################## # libDylp # ######################################################################## # Name of the library compiled in this directory. We want it to be installed # in the 'lib' directory lib_LTLIBRARIES = libDylp.la # List all source files for this library, including headers libDylp_la_SOURCES = \ dy_consys.h \ dy_consys_io.c \ dy_consys_mathutils.c \ dy_consys_scaling.c \ dy_consys_utils.c \ dy_basis.c \ dy_bound.c \ dy_cmdint.c dy_cmdint.h \ dy_coldstart.c \ dy_conmgmt.c \ dy_dual.c \ dy_dualmultipivot.c \ dy_dualpivot.c \ dy_duenna.c \ dy_force.c \ dy_hotstart.c \ dylp.c dylp.h \ dylp_io.c \ dylp_utils.c \ dy_options.c \ dy_penalty.c \ dy_pivreject.c \ dy_primal.c \ dy_primalmultipivot.c \ dy_primalpivot.c \ dy_rays.c \ dy_scaling.c \ dy_setup.c \ dy_solutions.c \ dy_statistics.c \ dy_tableau.c \ dy_varmgmt.c \ dy_warmstart.c \ glpinv.c glpinv.h \ glplib1.c \ glplib2.c \ glplib3.c \ glplib4.c \ glplib.h \ glpluf.c glpluf.h \ dy_vector.h \ dy_vector_utils.c # This is for libtool (on Windows) libDylp_la_LDFLAGS = $(LT_LDFLAGS) # We want to have also the objects from the DylpStdLib in this library libDylp_la_LIBADD = ../DylpStdLib/libDylpStdLib.la # Since automake is not doing this on its own, we need to declare the # dependencies to the subdirectory libraries here libDylp_la_DEPENDENCIES = $(libDylp_la_LIBADD) # Here list all include flags, relative to this "srcdir" directory. This # "cygpath" stuff is necessary to compile with native compilers on Windows AM_CPPFLAGS = -I`$(CYGPATH_W) $(srcdir)/../DylpStdLib` # This line is necessary to allow VPATH compilation with MS compilers # on Cygwin DEFAULT_INCLUDES = -I. -I`$(CYGPATH_W) $(srcdir)` -I$(top_builddir)/inc ######################################################################## # Headers that need to be installed # ######################################################################## # Here list all the header files that are required by a user of the library, # and that therefore should be installed in 'install/coin' includecoindir = $(includedir)/coin includecoin_HEADERS = \ dy_cmdint.h \ dy_consys.h \ dylp.h \ dy_vector.h DyLP-1.6.0/DyLP/src/Dylp/dylp.h0000644000076700007670000022425411245632140012723 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ #ifndef _DYLP_H #define _DYLP_H /* @(#)dylp.h 4.6 10/15/05 svn/cvs: $Id: dylp.h 299 2009-08-28 01:35:28Z lou $ This file contains definitions related to dylp, a subroutine library which implements a dynamic (primal-dual) linear programming algorithm based on the algorithm described by Padberg in Linear Optimisation & Extensions, Springer-Verlag, 1995. dylp also owes a debt to previous and contemporary codes the author has worked with --- la05, bandbx, zoom/xmp, ylp, and glpk. At minimum, dylp requires only a constraint system. Since it manages a dynamically sized private copy of the constraint system while solving the LP, there's no point in having the client attach logical variables (they'd just get in the way, really). dylp will accept a basis specification. This takes the form of a status vector giving the status of all variables, and a basis vector specifying the active constraints and their associated basic variables. From this dylp will construct an initial active problem which consists of exactly the given constraints and basic variables, with the logicals for the constraints making up the nonbasic partition. dylp returns as a solution the simplex termination code, the objective value (or related value, appropriate for the termination code), status for all variables, the active constraints, and the associated primal and dual variables (put a little differently, a basis, the values of the basic variables, and the dual variables associated with the active constraints). The conditional compilation symbol DYLP_INTERNAL is used to delimit definitions that should be considered internal to dylp. Don't define this symbol in a client. */ #include "dylib_errs.h" #include "dylib_io.h" #include "dy_consys.h" /* A few words on notation. Traditional matrix and vector notation for LP suffers a bit when limited to ascii text, but it's readable if you're familiar with the original. The notation in the comments and code is loosely based on Chvatal, "Linear Programming", W.H. Freeman, 1983, which the author happens to like. A matrix is represented with a capital letter, e.g., B. A vector is represented with a small letter, e.g., x. A subscript is given in angle brackets, e.g., x for the jth coefficient of x. An individual element of a matrix has two subscripts, e.g., a for the element in row i, column j. Column and row vectors are shown with one subscript, e.g., a for the jth column (or row). Whether the vector is supposed to be a column or a row should generally be clear from context. A capital letter in the subscript position indicates a set of elements, e.g., x is the non-basic variables. The inverse of a matrix is denoted inv(*), e.g., the basis inverse, inv(B). The dot product of two vectors is denoted dot(*,*), e.g., dot(c,x), or sometimes just written directly, e.g., cx. The system of constraints is assumed to be Ax <= b, with m rows and n columns. Once the logical variables (aka slacks and artificials) have been added, it becomes Ax = b. A is the constraint matrix, x is the vector of primal variables, and b is the right-hand-side (rhs). NOTE that the convention for indices is NOT the usual one. Logical variables are assigned indices 1..m and architectural variables are assigned indices m+1..m+n. It makes for more efficient addition/deletion of variables; see dy_consys.h for a little more explanation. There is an objective function z = cx, where z is the objective value and c is the vector of coefficients. dylp minimises the objective. The matrix A is partitioned into the set of basic columns B, and the set of non-basic columns N (sometimes A). The corresponding partitions of c and x are c, x, and c, x. Premultiplication by the basis inverse (e.g., inv(B)a) is referred to as an `ftran'; postmultiplication (e.g., cinv(B)) as a `btran'. Quantities that have been transformed using the basis inverse are often (but not always) renamed as 'barred' quantities. The basic primal variables are x = inv(B)b. The dual variables are y = cinv(B). The jth column of A, premultiplied by inv(B), is abar = inv(B)a. The reduced costs are cbar = c - cinv(B)N = c-yN. The variable i is used as a row index, j as a column index. Often they will represent the entering primal variable (j) and the leaving primal variable (i). Be aware that comments are often written as if the leaving primal variable x occupies row i of the basis. This simplifies the writing. But keep in mind that variable x can occupy an arbitrary row k of the basis. */ /* Termination codes for dy_primal and dy_dual, the top level routines of the dylp simplex algorithms. Also used by various internal routines. Codes marked with (*) will never be returned to the client unless dylp has failed. lpINV The code is not valid (i.e., not set by an execution of dy_primal or dy_dual). lpOPTIMAL The problem has an optimal solution. lpUNBOUNDED The problem is unbounded. lpSWING(*) The problem is pseudo-unbounded: Some primal variable grew excessively in a single pivot. lpINFEAS The problem is infeasible. lpACCCHK An accuracy check failed and dylp's internal recovery algorithms could not recover the situation. lpSTALLED The problem has been abandoned due to stalling. (We could in fact actually be cycling, but that's too much trouble to prove.) lpITERLIM The problem has been abandoned because it has exceeded an absolute iteration limit. lpNOSPACE The problem has been abandoned because the basis package did not have sufficient space to maintain the basis. lpLOSTFEAS Feasibility was lost during simplex execution. lpPUNT The lp has punted because it ran into a pivoting problem. The next three codes indicate that we're in the middle of attempting a forced transition for error recovery purposes. lpFORCEDUAL(*) Force a primal to dual transition. lpFORCEPRIMAL(*) Force a dual to primal transition. lpFORCEFULL(*) Force all inactive constraints and variables to be loaded. lpFATAL Fatal confusion or error of some sort; covers a multitude of sins. The dual simplex routine does not have a phase I routine equivalent to dy_primal1 for the primal simplex. (In the context of dylp, it expects to run after dy_primal has been used to find an initial optimal solution.) When using the dual simplex method, internal codes reflect the state of the dual problem, but dy_dual makes the usual translation back to the primal problem, as: Dual Primal Rationale ---- ------ --------- lpUNBOUNDED lpINFEAS Standard duality theorem. Note that lpSWING always refers to primal variables. */ typedef enum { lpFATAL = -1, lpINV = 0, lpOPTIMAL, lpUNBOUNDED, lpSWING, lpINFEAS, lpACCCHK, lpSTALLED, lpITERLIM, lpNOSPACE, lpLOSTFEAS, lpPUNT, lpFORCEDUAL, lpFORCEPRIMAL, lpFORCEFULL } lpret_enum ; /* Phase codes for dylp dyINV Invalid phase dyINIT Initialisation and setup, including establishing the initial set of constraints and variables and crashing the first basis. dyPRIMAL1 Primal simplex phase I dyPRIMAL2 Primal simplex phase II dyDUAL Dual simplex dyPURGEVAR Deactivation of variables. dyGENVAR Generation of new variables (not part of original problem). dyADDVAR Activation of variables. dyPURGECON Deactivation of constraints. dyGENCON Generation of new constraints (not part of original problem). dyADDCON Activation of constraints. dyFORCEDUAL Force dual feasibility (error recovery) dyFORCEPRIMAL Force primal feasibility (error recovery) dyFORCEFULL Force activation of the full system (error recovery) dyDONE Execution is finished, for one reason or another. It's true that new variables will be added during dyGENCON -- at the least, each newly generated constraint will bring with it a logical variable. dyGENVAR differs in that it is augmenting some subset of the constraints with new variables (classic column generation, for example). The main loop states (dyPRIMAL1 -- dyFORCEFULL) must remain a contiguous block. dy_dumpstats counts on dyPRIMAL1 and dyFORCEPRIMAL being first and last, respectively, in the block. dyDONE must remain the last code --- it's used to dimension a statistics array that tracks the number of times the main loop states are entered. */ typedef enum { dyINV = 0, dyINIT, dyPRIMAL1, dyPRIMAL2, dyDUAL, dyPURGEVAR, dyGENVAR, dyADDVAR, dyPURGECON, dyGENCON, dyADDCON, dyFORCEDUAL, dyFORCEPRIMAL, dyFORCEFULL, dyDONE } dyphase_enum ; /* General return and error codes. Used by various routines in dylp. No routine uses all of these, but there's enough overlap to make one big enum convenient. dyrINV Invalid code. dyrOK Whatever it was that was being done was done without incident. dyrOPTIMAL The problem is optimal. dyrUNBOUND The problem is unbounded. dyrSWING The problem is pseudo-unbounded: Some variable grew by an excessive amount in a single pivot. dyrINFEAS The problem is infeasible. dyrREQCHK Requests a refactor and accuracy check (triggered by various checks for bogus numbers). dyrACCCHK An accuracy check has failed. dyrLOSTPFEAS Primal feasibility has been lost. dyrLOSTDFEAS Dual feasibility has been lost. dyrDEGEN Degeneracy has been discovered, or a degenerate pivot has been taken. dyrRESELECT Reselect an incoming variable (after an abortive pivot attempt). dyrMADPIV The selected pivot coefficient was (numerically) unstable. dyrPUNT In the context of the dual simplex: the dual simplex has decided to punt to the primal simplex phase I, for any of several reasons. Generally this is indicative of the relative lack of sophistication in the dual simplex. In the context of the primal simplex: this indicates that all candidates to enter the basis were flagged with a NOPIVOT qualifier. dyrPATCHED The basis package managed to factor the basis after patching it. dyrSINGULAR The basis package discovered the basis was singular. (Typically as a consequence of a pivot gone bad.) dyrNUMERIC The basis package detected unacceptable growth in the basis coefficients. dyrBSPACE The basis package ran out of space for the basis representation. dyrSTALLED The LP seems to have stalled (and could possibly be cycling, but that's too much trouble to prove); triggered by too many iterations with no change in the objective. dyrITERLIM The iteration limit has been exceeded. dyrFATAL Fatal confusion; covers a multitude of sins. The specific values assigned to some of the codes in the enum come from earlier use of yla05 as the basis package. It's gone, but there's no incentive to remove the values. */ typedef enum { dyrFATAL = -10, dyrITERLIM, dyrSTALLED, dyrBSPACE = -7, dyrSINGULAR = -6, dyrNUMERIC = -5, dyrLOSTPFEAS, dyrLOSTDFEAS, dyrDEGEN, dyrMADPIV, dyrINV = 0, dyrOK = 1, dyrPATCHED = 2, dyrRESELECT, dyrREQCHK, dyrACCCHK, dyrPUNT, dyrOPTIMAL, dyrUNBOUND, dyrSWING, dyrINFEAS } dyret_enum ; /* Requests and results for checks and recalculations Some symbolic names for requesting and reporting on factoring, accuracy checks and primal and dual variable calculations. These originated with la Duenna, hence the lad prefix. Interpretation varies subtly from routine to routine, so check the parameter notes. ladPRIMALCHK (i) set to request primal accuracy check, Bx = b - Nx, (o) set to indicate failure of check ladDUALCHK (i) set to to request dual accuracy check, yB = c (o) set to indicate failure of check ladPRIMFEAS (i) set to request primal feasibility check (primal variables within bounds) (o) set to indicate loss of primal feasibility ladDUALFEAS (i) set to request dual feasibility check (reduced costs of proper sign) (o) set to indicate loss of dual feasibility ladPFQUIET (i) set to suppress warnings about variables which are not primal feasible ladDFQUIET (i) set to suppress warnings about variables which are not dual feasible ladDUALS (i) set to request calculation of the dual variables and gradient vector (o) set to indicate calculation of the dual variables and gradient vector ladPRIMALS (i) set to request calculation of the primal variables (o) set to indicate calculation of the primal variables ladFACTOR (i) set to indicate the basis should be refactored (o) set to indicate the basis has been factored ladEXPAND (i) set to force expansion of the space allocated for the basis representation (o) set to indicate the space allocated for the basis was increased */ #define ladPRIMFEAS 1<<0 #define ladPRIMALCHK 1<<1 #define ladPFQUIET 1<<2 #define ladDUALFEAS 1<<3 #define ladDUALCHK 1<<4 #define ladDFQUIET 1<<5 #define ladDUALS 1<<6 #define ladPRIMALS 1<<7 #define ladFACTOR 1<<8 #define ladEXPAND 1<<9 /* Variable status codes dylp keeps explicit status for both basic and nonbasic variables. These are set up as flags so that it's easy to test when more than one status will do for a particular action. vstatBFX basic, fixed vstatBUUB basic, above upper bound vstatBUB basic, at upper bound vstatB basic, strictly between bounds (a well-behaved basic variable) vstatBLB basic, at lower bound vstatBLLB basic, below lower bound vstatBFR basic, free (unbounded) vstatNBFX nonbasic, fixed vstatNBUB nonbasic at upper bound vstatNBLB nonbasic at lower bound vstatNBFR nonbasic free vstatSB superbasic, within bounds dylp ensures that superbasic variables are, in fact, always strictly within bounds. Inactive NBFR variables can be created at startup if dylp is working with a partial system and there are free variables that are not selected to be in the initial basis. If the client is forcing a full system, these will be active NBFR variables. Error recovery may also create active NBFR variables. By convention, NBFR variables always have a value of zero. Inactive SB variables should not occur. SB status occurs only as the result of error recovery and is only valid in primal simplex. The value of SB variables is lost when they are reported out as part of a solution. This will only happen if dylp could not find an optimal solution. The following qualifiers can be added to the status: vstatNOPIVOT Prevents the variable from being considered as a candidate for pivoting; used by the pivot rejection machinery. vstatNOPER Prevents the variable from being perturbed during the formation of a restricted subproblem. vstatNOLOAD Prevents the variable from being considered for activation; used by startup and variable activation/deactivation routines. */ #define vstatINV 0 #define vstatBFX 1<<0 #define vstatBUB 1<<1 #define vstatB 1<<2 #define vstatBLB 1<<3 #define vstatBFR 1<<4 #define vstatNBFX 1<<5 #define vstatNBUB 1<<6 #define vstatNBLB 1<<7 #define vstatNBFR 1<<8 #define vstatSB 1<<9 #define vstatBUUB 1<<10 #define vstatBLLB 1<<11 /* TAKE NOTE: Do not use the msb as a qualifier! The status value, with or without qualifiers, must be a positive value when cast to a signed integer. */ #define vstatNOPIVOT ((flags) 1<<(sizeof(flags)*8-2)) #define vstatNOPER ((flags) 1<<(sizeof(flags)*8-3)) #define vstatNOLOAD ((flags) 1<<(sizeof(flags)*8-4)) #define vstatBASIC \ (vstatBFX|vstatBUUB|vstatBUB|vstatB|vstatBLB|vstatBLLB|vstatBFR) #define vstatNONBASIC (vstatNBFX|vstatNBUB|vstatNBLB) #define vstatEXOTIC (vstatSB|vstatNBFR) #define vstatSTATUS (vstatBASIC|vstatNONBASIC|vstatEXOTIC) #define vstatQUALS (vstatNOPIVOT|vstatNOPER|vstatNOLOAD) /* This macro checks (in a simplistic way) that its parameter encodes one and only one status. It's intended for mild error checking. See dylp_utils:dy_chkstatus if you're really feeling paranoid. */ #define VALID_STATUS(zz_status_zz) \ (zz_status_zz == vstatBFX || zz_status_zz == vstatBUB || \ zz_status_zz == vstatB || zz_status_zz == vstatBLB || \ zz_status_zz == vstatBFR || \ zz_status_zz == vstatNBFX || zz_status_zz == vstatNBUB || \ zz_status_zz == vstatNBLB || zz_status_zz == vstatNBFR || \ zz_status_zz == vstatSB) /* Interface structures: lpprob_struct, lptols_struct, lpopts_struct */ /* basis_struct This structure is used to describe a basis to dylp, and to return the final basis at termination. The size of the basis depends on the number of active constraints, which will be a subset of the constraints in the system. The constraint system as supplied to dylp should not have logical variables (dylp will create them automatically). This presents a problem if the final basis contains basic logical variables. In this case, vndx is set to the negative of the index of the constraint which spawned the logical. This same technique can be used on input to, for example, specify the traditional all-logical starting basis. Field Definition ----- ---------- len The number of rows in the basis. el.cndx Index of the constraint in this basis position. el.vndx Index of the variable in this basis position. */ typedef struct { int cndx ; int vndx ; } basisel_struct ; typedef struct { int len ; basisel_struct *el ; } basis_struct ; /* LP problem control and status flags lpctlNOFREE (i) Prevents dylp from freeing the problem structures, in anticipation of a subsequent hot start. If dylp exits with a state that is not suitable for hot start, this flag is ignored and the problem data structures are released. lpctlONLYFREE (i) In conjunction with an initial phase of dyDONE, causes dylp to do nothing except free the problem data structure and return. lpctlUBNDCHG (i) Indicates that the variable upper bounds (vub) have been changed. lpctlLBNDCHG (i) Indicates that the variable lower bounds (lub) have been changed. lpctlRHSCHG (i) Indicates that the right-hand side (rhs) has been changed. Includes the rhslow vector (if it exists). lpctlOBJCHG (i) Indicates that the objective (obj) has been changed. lpctlACTVARSIN (i) Indicates that a valid active variable vector has been supplied. lpctlINITACTVAR (i) Forces dylp to perform variable activation before beginning simplex iterations. lpctlINITACTCON (i) Forces dylp to perform constraint activation before beginning simplex iterations. (If variable activation is also requested, constraint activation occurs first.) lpctlACTVARSOUT (i) Indicates that an active variable vector is to be returned. (o) Indicates that a valid active variable vector has been returned. lpctlDYVALID (o) Indicates that dylp exited in a state which can be restarted with a hot start. */ #define lpctlNOFREE 1<<0 #define lpctlONLYFREE 1<<1 #define lpctlUBNDCHG 1<<2 #define lpctlLBNDCHG 1<<3 #define lpctlRHSCHG 1<<4 #define lpctlOBJCHG 1<<5 #define lpctlACTVARSIN 1<<6 #define lpctlINITACTVAR 1<<7 #define lpctlINITACTCON 1<<8 #define lpctlACTVARSOUT 1<<10 #define lpctlDYVALID 1<<11 /* lpprob_struct This structure is used to pass an LP problem into dylp and convey the results back to the client. The allocated size indicated in colsze and rowsze is assumed to be accurate. If basis, status, x, or y are NULL, they will be allocated as needed. If they are non-NULL, dylp will reallocate them if necessary (i.e., when the actual size of the lp exceeds the allocated size of the vectors). The status vector has the following coding: * for nonbasic variables, the normal dylp status flags are used; * for basic variables, the negative of the basis index is used. There is one unavoidable problem with this scheme -- the status vector provides the only information about the value of nonbasic variables. This is adequate for all but superbasic variables and nonbasic free variables which are not at zero. Both of these cases are transient anomalies, created only when the basis package is forced to patch a singular basis, and they should not persist in the final solution when an optimal solution is found or when the problem is infeasible. They may, however, occur in the solution reported for an unbounded problem if the unbounded condition is discovered before the nonbasic free or superbasic variable is chosen for pivoting. On input, nonbasic free variables are assumed to take the value 0, and specifying a superbasic variable is illegal. Field Definition ----- ---------- ctlopts Control and status flags. phase (i) If set to dyDONE, dylp will free any retained data structures and return. Any other value is ignored. (o) Termination phase of the dynamic simplex algorithm; should be dyDONE unless something screws up, in which case it'll be dyINV. lpret Return code from the simplex routine. obj For lpOPTIMAL, the value of the objective function. For lpINFEAS, the total infeasibility. For lpUNBOUNDED, the index of the unbounded variable, negated if the variable can decrease without bound, positive if it can increase without bound. The logical for constraint i is represented as n+i. Otherwise, undefined. iters The number of simplex iterations. consys The constraint system. basis (i) Initial basis. (o) Final basis. status (i) Initial status vector. (o) Final status vector. x (i) No values used, but a vector can be supplied. (o) The values of the basic variables (indexed by basis position). y (i) No values used, but a vector can be supplied. (o) The values of the dual variables (indexed by basis position). actvars There is one entry for each variable, coded TRUE if the variable is active, FALSE otherwise. The vector supplied on input will be overwritten on output. (i) Variables to be activated at startup. Used only for a warm start. Validity is indicated by the lpctlACTVARSIN flag. A vector can be supplied strictly for output use. (o) The current active variables. Will be returned only if requested by the lpctlACTVARSOUT flag. If the vector is valid on return, lpctlACTVARSOUT will remain set, otherwise it will be reset. colsze Allocated column capacity (length of status vector). rowsze Allocated row capacity (length of basis, x, and y vectors). Note that dylp will reallocate status, basis->el, actvars, x, and y, if the vectors supplied at startup are too small to report the solution. Don't set colsze or rowsze to nonzero values without actually allocating space. */ typedef struct { flags ctlopts ; dyphase_enum phase ; lpret_enum lpret ; double obj ; int iters ; consys_struct *consys ; basis_struct *basis ; flags *status ; double *x ; double *y ; bool *actvars ; int colsze ; int rowsze ; } lpprob_struct ; /* lptols_struct This structure contains phase and tolerance information for the lp algorithm. The philosophy with respect to the separate zero and feasibility tolerances for primal and dual variables is that dylp uses the zero tolerance when calculating primal or dual variables, and the feasibility tolerance when checking for feasibility. This allows us to keep small values for accuracy in computation, but not be so fussy when it comes to feasibility. Field Definition ----- ---------- inf Infinity. dylp uses IEEE FP infinity, but be careful not to pass it to the basis package. zero Zero tolerance for primal variables, and also the generic zero tolerance for constraint coefficients, right-hand-side values, etc. pchk Primal accuracy check tolerance. pfeas Primal feasibility check tolerance; dynamically scaled from zero in proportion to the 1-norm of the primal basic variables. pfeas_scale Primal feasibility check tolerance multiplier. This provides some user-controllable decoupling of zero and pfeas. cost Base zero tolerance for checks involving objective function coefficients, reduced costs, and related values. dchk Dual accuracy check tolerance. Also used by dy_duenna to test for improvement in the objective. dfeas Dual feasbility check tolerance; dynamically scaled from cost in proportion to the 1-norm of the dual variables. Acts as the zero tolerance for reduced costs. dfeas_scale Dual feasibility check tolerance multiplier. This provides some user-controllable decoupling of cost and dfeas. pivot Simplex pivot selection tolerance, expressed as a multiplier for the pivot selection tolerance used by the basis package when factoring the basis. (I.e., the actual pivot selection criteria will be to accept a simplex pivot a if |a| > lptols.pivot*basis.pivot*MAX{i}|a|.) bogus Multiplier used to identify 'bogus' values, in the range tol < |val| < bogus*tol for the appropriate tolerance. swing Ratio used to identify excessive growth in primal variables (pseudo-unboundedness). toobig Absolute value of primal variables which will cause dual multipivoting to consider primal infeasibility when selecting a flip/pivot sequence. purge Percentage change in objective function required before constraint or variable purging is attempted. purgevar Percentage of maximum reduced cost used to determine the variable purge threshold; nonbasic architectural variables at their optimum bound whose reduced cost exceeds purgevar*MAX{j}cbar are purged. reframe Multiplier used to trigger a reference framework reset in PSE pricing; reset occurs if |gamma - ||abar||^2| > reframe*||abar||^2. The check is made in pseupdate. Also used to trigger recalculation of the basis inverse row norms used in DSE pricing; reset occurs if |rho - ||beta||^2| > reframe*||beta||^2. The check is made in dseupdate. */ typedef struct { double inf ; double zero ; double pchk ; double pfeas ; double pfeas_scale ; double cost ; double dchk ; double dfeas ; double dfeas_scale ; double pivot ; double bogus ; double swing ; double toobig ; double purge ; double purgevar ; double reframe ; } lptols_struct ; #if defined(DYLP_INTERNAL) || defined(BONSAIG) /* A few handy macros for testing values against tolerances. */ #ifdef DYLP_INTERNAL # ifdef BND_TOLER # undef BND_TOLER # endif # define BND_TOLER dy_tols->pfeas # ifdef INF_TOLER # undef INF_TOLER # endif # define INF_TOLER dy_tols->inf #endif #define withintol(zz_val_zz,zz_tgt_zz,zz_tol_zz) \ (fabs((zz_val_zz)-(zz_tgt_zz)) <= zz_tol_zz) #define setcleanzero(zz_val_zz,zz_tol_zz) \ if (fabs(zz_val_zz) < zz_tol_zz) zz_val_zz = 0 #define atbnd(zz_val_zz,zz_bnd_zz) \ ((fabs(zz_bnd_zz) < INF_TOLER) && \ (fabs((zz_val_zz)-(zz_bnd_zz)) < BND_TOLER*(1.0+fabs(zz_bnd_zz)))) #define belowbnd(zz_val_zz,zz_bnd_zz) \ ((fabs(zz_bnd_zz) < INF_TOLER) ? \ (((zz_bnd_zz)-(zz_val_zz)) > BND_TOLER*(1.0+fabs(zz_bnd_zz))) : \ (zz_val_zz < zz_bnd_zz)) #define abovebnd(zz_val_zz,zz_bnd_zz) \ ((fabs(zz_bnd_zz) < INF_TOLER) ? \ (((zz_val_zz)-(zz_bnd_zz)) > BND_TOLER*(1.0+fabs(zz_bnd_zz))) : \ (zz_val_zz > zz_bnd_zz)) #define withinbnds(zz_lb_zz,zz_val_zz,zz_ub_zz) \ (!abovebnd(zz_val_zz,zz_ub_zz) && !belowbnd(zz_val_zz,zz_lb_zz)) #endif /* DYLP_INTERNAL || BONSAIG */ #ifdef DYLP_INTERNAL /* Finally, a macro to decide if we should snap to a value. The notion here is that the accuracy with which one can hit a target value depends on both the magnitude of the target and the distance travelled to get there. On a 64-bit machine, IEEE FP has about 15 decimal digits of accuracy. For example, if we're travelling 1.0e7 and trying to hit zero, we only have 8 decimal places of accuracy remaining. If we're within 1.0e-8, might as well snap to 0. In practice, there's already a bit of roundoff in any nontrivial calculation, so we start with the zero tolerance and scale from there. In some cases, we only know the target, so the best we can do is scale to it. The utility of this idea is highly questionable. */ #define snaptol1(zz_tgt_zz) (dy_tols->zero*(1.0+(zz_tgt_zz))) #define snaptol2(zz_tgt_zz,zz_dst_zz) \ (dy_tols->zero*(1.0+maxx((zz_tgt_zz),(zz_dst_zz)))) #define snaptol3(zz_tol_zz,zz_tgt_zz,zz_dst_zz) \ ((zz_tol_zz)*(1.0+maxx((zz_tgt_zz),(zz_dst_zz)))) #endif /* DYLP_INTERNAL */ /* Enum for initial basis type. This determines the criteria used to select the initial set of basic variables during a cold start. ibINV invalid ibLOGICAL Use only logical (slack and artificial) variables ibSLACK Use slack variables for inequalities. Prefer architectural over artificial variables for equalities. ibARCH Prefer architectural variables over logical variables. */ typedef enum { ibINV = 0, ibLOGICAL, ibSLACK, ibARCH } ibtype_enum ; /* Enum for calling context. As dylp evolves, it may well prove useful to know the context of the call. Consider this an experiment. The default context is INITIALLP. cxINV invalid (context is unknown) cxSINGLELP This is a one-off call to solve a single LP from scratch. cxINITIALLP This is a call to solve a single LP from scratch, but will likely be followed by calls to reoptimise. cxBANDC This call is made in the context of a branch-and-cut algorithm. */ typedef enum { cxINV = 0, cxSINGLELP, cxINITIALLP, cxBANDC } cxtype_enum ; /* lpopts_struct This structure is used to pass option settings to dylp. Default values are declared at the beginning of dy_setup.c. Field Definition ----- ---------- context The context in which dylp is being called. See comments above for cxtype_enum. forcecold TRUE to force a cold start, FALSE otherwise. If set to TRUE, dominates warm and hot start. forcewarm TRUE to force a warm start, FALSE otherwise. If set to TRUE, dominates hot start. fullsys Forces the use of the full constraint system at all times. The full constraint system is loaded on startup, and all constraint and variable deactivation/activation is skipped. (But see the finpurge option below.) (Also, this will not prevent dylp from resorting to forced phase transitions, which typically involve deactivation of constraints or variables. Arguably this is a bad thing, and may change in the future.) active Used to estimate the initial size of the dylp constraint system relative to the original system. vars Fraction of original variables expected to be active at any time. cons Fraction of original inequalities expected to be active at any time. initcons Specifies how inequalities will be selected to initialize the active system. See extensive comments in dy_coldstart.c. frac Fraction of inequalities to be used. i1l Lower bound on angle to objective, first interval i1lopen TRUE if the bound is open. i1u Upper bound on angle to objective, first interval i1uopen TRUE if the bound is open. i2valid TRUE if the second interval is specified i2l Lower bound on angle to objective, second interval i2lopen TRUE if the bound is open. i2u Upper bound on angle to objective, second interval i2uopen TRUE if the bound is open. coldbasis Code specifying the kind of basis built for a cold start. See comments for ibtype_enum and comments in dy_coldstart.c finpurge Controls whether dylp does a final deactivation of constraints and/or variables. This will occur only an optimal solution is found, and is not suppressed by fullsys. cons TRUE to purge constraints vars TRUE to purge variables heroics Controls behaviour during forced primal <-> dual transitions d2p TRUE to allow deactivation of basic architecturals, FALSE to disallow. FALSE is recommended, and the default. p2d TRUE to allow deactivation of tight constraints, FALSE to disallow. FALSE is recommended, and the default. flip TRUE to allow flips to regain dual feasibility, FALSE to disallow. Tends to cycle; default is false. coldvars If the number of active variables exceeds this value after a cold start, dylp will attempt to purge variables prior to the initial primal simplex run. con Options related to constraint activation/deactivation actlvl The constraint activation strategy 0: (strict) activate violated constraints, lhs < rhslow or lhs > rhs 1: (tight) activate tight or violated constraints, lhs <= rhslow or lhs >= rhs actlim If non-zero, limits the number of constraints that can be activated in any one call to a constraint activation routine. deactlvl The constraint deactivation strategy: 0: (normal) deactivate only inequalities i which are strictly loose (i.e., slk basic, not at bound). 1: (aggressive) normal plus inequalities which are tight with y = 0. 2: (fanatic) aggressive plus equalities with y = 0 usedual TRUE if dual phase II is to be used to regain feasibility after adding constraints, FALSE to force use of primal phase I. addvar If non-zero, at most this many variables will be added in any one pass through phase dyADDVAR. dualadd Controls the types of activation allowed when adding variables during dual simplex. 0: variable activation is disallowed 1: type 1 activation (variables that will be dual feasible when activated into the nonbasic partition) 2: type 2 activation (variables which can be activated if immediately pivoted into the basis) 3: type 3 activation (activate with bound-to-bound pivot) See dy_dualaddvars for more extensive comments. scan Partial pricing parameter. Controls the number of columns to be scanned for a new candidate entering variable when the candidate selected during PSE update is rejected. iterlim The per phase pivot limit for the code; if set to 0, no limit is enforced. idlelim The number of iterations without change in the objective function before the code declares the problem is stalled or cycling. dpsel Options to control dual pivoting. Selection of the leaving variable is always handled by DSE. strat: The strategy used to select the entering variable: 0: standard ratio test; may use anti-degen lite 1: multipivoting, selecting for maximum dual objective improvement. 2: multipivoting, select for minimum predicted infeasibility. 3: multipivoting, select infeasibility reduction if possible, otherwise maximum dual objective improvement. flex If TRUE, dylp will switch between strategies 1 and 3, using strategy 1 unless primal magnitudes become too large. allownopiv If TRUE, sequences of flips with no finishing pivot will be allowed. Defaults to false, very prone to cycling. ppsel Options to control primal pivoting. Selection of the entering variable is always handled by PSE. strat: The strategy used to select the leaving variable: 0: standard ratio test; may use anti-degen lite 1: multipivoting factor The LP basis will be refactored every factor iterations, in the absence of some compelling reason (typically error recovery) that forces it to occur sooner. check An accuracy check will be forced every check iterations, in the absence of some compelling reason to do it earlier. groom Controls the action taken by the basis grooming routine when it makes a nontrivial status correction: 0: catatonic 1: issue a warning 2: issue an error message and force an abort Numeric codes are related to keywords in dy_setup.c:dy_ctlopt. degen TRUE to allow creation of restricted subproblems to deal with degeneracy, FALSE to disallow it. degenpivlim The number of successive degenerate pivots required before creating a restricted subproblem. degenlite Controls secondary antidegeneracy --- `antidegen lite' 0: (pivotabort) break ties using |abar| and abort when delta = 0 1: (pivot) break ties using |abar| but always scan the full basis 2: (alignobj) break ties by examining the alignment of the hyperplane which will become tight on the pivot; choose so that movement in the direction of the objective most nearly lies in the hyperplane 3: (alignedge) break ties by examining the alignment of the hyperplane which will become tight on the pivot; choose so that the direction of motion defined by the entering variable most nearly lies in the hyperplane. 4: (perpobj) break ties by examining the alignment of the hyperplane which will become tight on the pivot; choose so that the normal of the hyperplane is most nearly aligned with the normal of the objective 5: (perpedge) break ties by examining the alignment of the hyperplane which will become tight on the pivot; choose so that the normal of the hyperplane is most nearly aligned with the direction of motion Numeric codes are related to keywords in dy_setup.c:dy_ctlopt. patch TRUE to allow the code to patch a singular basis, FALSE to prevent patching. copyorigsys Controls whether dylp makes a local copy of the original system. If set to TRUE, dylp will always make a local copy. If set to FALSE, a copy will be made only if necessary. Scaling will trigger a local copy. scaling Controls whether dylp attempts to scale the original constraint system for numeric stability. 0: scaling is forbidden 1: scale the original constraint system using numeric scaling vectors attached to the system 2: evaluate the original constraint system and scale it if necessary Note that even if scaling = 0, dylp may install +/-1.0 scaling vectors in order to flip >= constraints to <= constraints. See comments in dy_scaling.c print Substructure for picky printing control. For all print options, a value of 0 suppresses all information messages. major Controls printing of major phase information. 1: a message at each phase transition. scaling Controls print level during initial evaluation and scaling of the original constraint system. 1: start and finish messages 2: stability measures for original and scaled matrices; adjustments to tolerances. setup Controls print level while creating the initial constraint system for dylp. 1: start and finish messages. 2: summary information about activated constraints 3: messages about each constraint included in the initial system. 4: messages about each constraint processed for the initial system 5: messages about each variable included in the initial system. 6: lists value and status of inactive variables with nonzero values crash Controls print level while crashing the basis. 1: start & finish messages 2: summary counts for logicals, architecturals, artificials 3: a dump of the completed basis 4: detailed info on the selection of each architectural and artificial variable pricing Controls print level for pricing of columns (rows) in primal (dual) simplex. 1: summary messages 2: lists candidate list and primal variable selected for entry (exit) at each pivot 3: lists each variable as it's added to the candidate list and again when reconsidered for pivoting pivoting Controls print level for selection of the leaving (entering) primal variable in primal (dual) simplex and updating of variables. 1: prints result of leaving (entering) variable selection 2: information about the selection of the leaving (entering) variable. 3: more information about the selection of the leaving (entering) variable. 4: prints the pivot column (row) before and after multiplication by the basis inverse, and yet more pivot selection information. 5: prints a line for every candidate evaluated pivreject Controls print level for information related to the operation of the pivot rejection mechanism. 1: Prints a message for each row/column added to the pivot rejection list, plus other major events. 2: Prints a message for each row/column removed from the pivot rejection list. degen Controls print level for information related to the operation of the antidegeneracy mechanism. 1: prints a message each time the antidegeneracy level changes 2: prints a message when a true degenerate pivot is taken under duress 3: prints a message when a degenerate pivot is taken 4: prints anomalies as each degenerate set is formed and backed out 5: prints details of each degenerate set as it's formed and backed out phase1 Controls general print level for phase 1 of primal simplex. 1: messages about extraordinary events -- problem pivots, etc. 2: messages about 'routine' but infrequent events -- termination conditions, refactoring, unboundedness, etc. 3: messages with additional details of problems encountered 4: a one line log message is printed for each pivot 5: summary information about infeasible variables and phase I objective coefficients; information about primal variables updated at each pivot. 6: prints the primal variables after each pivot; prints infeasible variables during phase I objective construction 7: prints the dual variables after each pivot; prints infeasible variables during phase I objective modification phase2 Controls general print level for phase 1 of primal simplex. 1: messages about extraordinary events -- problem pivots, etc. 2: messages about 'routine' but infrequent events -- termination conditions, refactoring, unboundedness, etc. 3: messages with additional details of problems encountered 4: a one line log message is printed for each pivot 5: prints the updated basic primal variables after each pivot 6: prints all basic primal variables after each pivot 7: prints the dual variables after each pivot. dual Controls general print level for the dual simplex. As phase2. basis Controls print level in routines working with the basis. 1: summary warnings about problems: empty rows, singularity, numerical instability, etc. 2: information about factoring failures and recovery actions 3: warnings about individual empty rows, details of column replacement when patching a singular basis, pivot tolerance adjustments; information about pivoting failures and recovery actions 4: basis stability after factoring 5: basis stability after pivoting conmgmt Controls print level while dylp is in the purge/generate/ activate constraint phases. 1: prints the number of constraints purged, generated, & activated, and new size of constraint system. 2: prints a message for each constraint purged or activated. (The cut generation routine is responsible for handling this function when it generates cuts.) 3: additional details about refactoring and new values of primal and dual variables. 4: prints a message about any variables affected as a side effect of constraint changes, constraints processed but not activated, and information about direction of recession and relative angle of constraints when adding constraints to an unbounded problem. 5: prints a running commentary on constraint and variable shifts, inactive variables. varmgmt Controls print level while dylp is in the purge/generate/ activate variable phases. 1: prints the number of variables purged, generated, & activated, and new size of constraint system. 2: prints a message for each variable purged & activated. (The column generation routine is responsible for handling this function when it generates new variables). 3: prints a message about any constraints affected as a side effect of variable changes, variables processed but not activated, and information about direction of recession and relative angle of dual constraints when adding variables to an unbounded dual. 4: prints a running commentary on constraint and variable shifts. force Controls print level when dylp is attempting to force a transition (primal -> dual, dual -> primal) or force the use of the full constraint system. 1: prints a summary message giving the result of the transition attempt 2: prints messages about actions taken for individual constraints and variables. 3: additional information about variables and constraints examined. tableau Controls print level for routines that generate tableau vectors (beta, beta, abar, abar) for use by external clients. 1: prints summary messages about the circumstances 4: prints nonzeros in the final vector. 5: prints nonzeros in intermediate vectors and (dy_betaj, dy_abarj only) inactive rows 6: prints nonzeros of active portion in internal reference frame (dy_betaj only) rays Controls print level for routines that generate primal and dual rays for use by external clients. 1: prints summary messages about vectors found. 3: print information about columns / rows examined. 4: print information about why a column or row was rejected. 5: print nonzeros for each ray soln Controls print level for routines that generate primal and dual solutions for use by external clients. 1: prints summary messages about the circumstances 3: prints nonzeros in the final vector 4: prints nonzeros in intermediate vectors */ typedef struct { cxtype_enum context ; int scan ; int iterlim ; int idlelim ; struct { int strat ; bool flex ; bool allownopiv ; } dpsel ; struct { int strat ; } ppsel ; int factor ; int check ; int groom ; struct { int actlvl ; int actlim ; int deactlvl ; } con ; int addvar ; int dualadd ; int coldvars ; bool forcecold ; bool forcewarm ; bool usedual ; bool degen ; int degenpivlim ; int degenlite ; bool patch ; bool fullsys ; bool copyorigsys ; int scaling ; struct { float vars ; float cons ; } active ; struct { double frac ; bool i1lopen ; double i1l ; bool i1uopen ; double i1u ; bool i2valid ; bool i2lopen ; double i2l ; bool i2uopen ; double i2u ; } initcons ; ibtype_enum coldbasis ; struct { bool cons ; bool vars ; } finpurge ; struct { bool d2p ; bool p2d ; bool flips ; } heroics ; struct { int major ; int scaling ; int setup ; int crash ; int pricing ; int pivoting ; int pivreject ; int degen ; int phase1 ; int phase2 ; int dual ; int basis ; int conmgmt ; int varmgmt ; int force ; int tableau ; int rays ; int soln ; } print ; } lpopts_struct ; /* Statistics structure, used to collect information about aspects of dylp operation beyond simple pivot counts. The data structure definition is always present, but to fill it you have to define DYLP_STATISTICS. Field Definition ----- ---------- phasecnts[dyDONE] Array with counts for number of times each phase is executed. ini_simplex The initial simplex phase cons A set of arrays with data about individual constraints. sze Allocated capacity of the arrays. angle Angle to the objective function. actcnt Number of times constraint is activated. deactcnt Number of times constraint is deactivated. init True if constraint is active in initial system. fin True if constraint is active in final system. vars A set of arrays with data about individual variables. sze Allocated capacity of the arrays. actcnt Number of times variable is activated. deactcnt Number of times variable is deactivated. angle max Maximum angle to the objective function over all constraints. min Minimum angle to the objective function over all constraints. hist[*] Histogram of angles of constraints to the objective function. There are DYSTATS_HISTBINS bins. Currently, 37 bins: 36 bins spanning 5 degrees of angle, and a dedicated 90 degree bin. factor Tracks how well we're doing with respect to refactoring the basis. cnt Number of time the basis has been refactored. prevpiv Pivot count at last refactorisation. avgpivs Average number of pivots between basis refactorisations. maxpivs Maximum number of pivots between basis refactorisations. pivrej Statistics about the pivot rejection list and punts. max maximum number of entries on the pivot rejection list mad total number of entries attributed to mad pivots sing total number of entries attributed to singular pivots pivtol_red total number of times the pivot tolerance was reduced min_pivtol the minimum pivot tolerance used puntcall total number of calls to dealWithPunt puntret total number of dyrPUNT returns recommended dmulti Tracks the dual multipivot algorithm. All fields except cnt are totals; divide by cnt to get averages. flippable Number of flippable variables in the constraint system. cnt Total calls to dualmultiin cands Number of candidates queued for evaluation for entry promote Number of calls that resulted in promoting a sane pivot over an unstable pivot. nontrivial Number of times that the initial scan and sort left multiple candidates for further evaluation. evals Actual number of candidates evaluated (ftran'd column) flips Number of bound-to-bound flips performed pivrnk Index in the list of candidates of the candidate finally selected for pivoting. maxrnk Maximum index selected for pivoting. pmulti Tracks the primal multipivot algorithm. cnt Total calls to primalmultiin cands Number of candidates queued for evaluation to leave nontrivial Number of times that the candidate list was sorted promote Number of calls that resulted in promoting a sane pivot over an unstable pivot. infeas Statistics on resolution of infeasibility in primal phase I. Basically, what we're interested in tracking is the number of infeasible variables and the number of pivots between a change in the number of infeasible variables. We're interested in separating the case of 1 variable from 2 or more, because the latter requires vastly more calculation. A little care is required because phase I can run many times. prevpiv The pivot count (tot.iters) at the previous change. maxcnt The maximum number of infeasible variables encountered (this is not strictly monotonic, as dylp may enter phase I many times due to activating violated constraints). totpivs The total number of pivots expended in phase I. maxpivs The maximum number of pivots with no change in the number of feasible variables. chgcnt1 The number of times that the number of infeasible variables changed and reduced costs did not have to be recalculated (specifically, exactly one variable became feasible, and it left the basis as it did so). chgcnt2 The number of times that the number of infeasible variables changed in such a way as to require recalculation of the reduced costs. [dp]degen[*] Array of stats for each restricted subproblem nesting level, with separate arrays for dual (ddegen) and primal (pdegen). degen[0].cnt is used to hold the maximum nesting level. cnt Number of times this nesting level was entered. avgsiz The average number of variables in a restricted subproblem. Kept by iterative update, as avg = (avg*k+size)/(k+1). Suffers from cumulative loss of accuracy, but it'll do for our purposes. maxsiz The maximum number of variables in a restricted subproblem. totpivs Total number of pivots at or above this nesting level. avgpivs Average number of pivots at or above this nesting level. maxpivs Maximum number of pivots for any one instance at or above this nesting level. tot, p1, p2, d2 Iteration and pivot counts, total and for each individual phase. These are copied over from dy_lp (lp_struct) at the end of the run, so that they can be printed by dumpstats. DYSTATS_MAXDEGEN is the maximum number of levels of nesting accommodated by antidegeneracy statistics and debugging structures. The actual algorithm has no inherent limitation. DYSTATS_HISTBINS is the number of bins for constraint angles. It should be an odd number. Each bin will span 180/(DYSTATS_HISTBINS-1) degrees, with the final bin reserved for constraints at 90 degrees. For example, a value of 37 gives 180/(37-1) = 5 degrees per bin. */ #define DYSTATS_MAXDEGEN 25 #define DYSTATS_HISTBINS 37 typedef struct { int phasecnts[dyDONE+1] ; dyphase_enum ini_simplex ; struct { int sze ; double *angle ; int *actcnt ; int *deactcnt ; bool *init ; bool *fin ; } cons ; struct { int sze ; int *actcnt ; int *deactcnt ; } vars ; struct { float max ; float min ; int hist[DYSTATS_HISTBINS] ; } angle ; struct { int cnt ; int prevpiv ; float avgpivs ; int maxpivs ; } factor ; struct { int max ; int mad ; int sing ; int pivtol_red ; double min_pivtol ; int puntcall ; int puntret ; } pivrej ; struct { int flippable ; int cnt ; int cands ; int promote ; int nontrivial ; int evals ; int flips ; int pivrnks ; int maxrnk ; } dmulti ; struct { int cnt ; int cands ; int nontrivial ; int promote ; } pmulti ; struct { int prevpiv ; int maxcnt ; int totpivs ; int maxpivs ; int chgcnt1 ; int chgcnt2 ; } infeas ; struct { int cnt ; float avgsiz ; int maxsiz ; int totpivs ; float avgpivs ; int maxpivs ; } pdegen[DYSTATS_MAXDEGEN] ; struct { int cnt ; float avgsiz ; int maxsiz ; int totpivs ; float avgpivs ; int maxpivs ; } ddegen[DYSTATS_MAXDEGEN] ; struct { int iters ; int pivs ; } tot ; struct { int iters ; int pivs ; } p1 ; struct { int iters ; int pivs ; } p2 ; struct { int iters ; int pivs ; } d2 ; } lpstats_struct ; #ifdef DYLP_INTERNAL /* Macros to determine whether a constraint or variable is active, and whether it's eligible for activation. Coding is explained below for dy_origcons and dy_origvars. The main purpose served by these macros is to make it easy to find activiation/deactivation points in the code, should the conventions ever change. */ #define ACTIVE_CON(zz_cndx_zz) (dy_origcons[(zz_cndx_zz)] > 0) #define INACTIVE_CON(zz_cndx_zz) (dy_origcons[(zz_cndx_zz)] <= 0) #define LOADABLE_CON(zz_cndx_zz) (dy_origcons[(zz_cndx_zz)] == 0) #define MARK_UNLOADABLE_CON(zz_cndx_zz) (dy_origcons[(zz_cndx_zz)] = -1) #define MARK_INACTIVE_CON(zz_cndx_zz) (dy_origcons[(zz_cndx_zz)] = 0) #define ACTIVE_VAR(zz_vndx_zz) (dy_origvars[(zz_vndx_zz)] > 0) #define INACTIVE_VAR(zz_vndx_zz) (dy_origvars[(zz_vndx_zz)] <= 0) #define LOADABLE_VAR(zz_vndx_zz) \ ((dy_origvars[(zz_vndx_zz)] < 0) && \ flgoff(((flags) -dy_origvars[(zz_vndx_zz)]),vstatNOLOAD|vstatNBFX)) #define MARK_INACTIVE_VAR(zz_vndx_zz,zz_val_zz) \ (dy_origvars[(zz_vndx_zz)] = (zz_val_zz)) /* dy_logchn i/o id for the execution log file dy_gtxecho controls echoing of generated text to stdout */ extern ioid dy_logchn ; extern bool dy_gtxecho ; /* lp_struct This structure is the control structure for an LP problem within dylp. Field Definition ----- ---------- phase Current phase of the dynamic simplex algorithm. lpret Return code from the most recent simplex execution. z Value of the objective function (includes inactzcorr). inactzcorr Correction to the objective function due to inactive variables with non-zero values. simplex Simplex algorithm status and control active currently active or most recently completed next currently active or to be started init_pse TRUE if the PSE structures need to be reinitialised, FALSE otherwise init_dse TRUE if the DSE structures need to be reinitialised, FALSE otherwise These fields are used to determine when to update or reinitialise the PSE and DSE data structures. Active and next must be valid during the purge/gen/add variable/constraint cycles. A word on infeas and infeascnt: They are guaranteed accurate only immediately after initialisation and following a primal feasibility check. infeas Total infeasibility = SUM{j} max(0,x-ub,lb-x) infeascnt The number of infeasible variables; refreshed when dy_accchk is asked to do a primal feasibility check. ubnd Substructure for information on unbounded or pseudo-unbounded problems. ndx The index of the variable fingered for causing unboundedness or pseudo-unboundedness (swing). ratio The growth ratio. p1obj The following fields relate to handling of the phase I objective function. installed TRUE if the phase I objective is currently installed infcnt Tracks the number of variables incorporated in p1obj which remain infeasible. infvars_sze Allocated size of the infvars vector. infvars Vector of indices of infeasible variables incorporated in the phase I objective. p1obj Pointer to the phase I objective (temporary storage while the phase II objective is installed). p2obj Pointer to the phase II objective (temporary storage while the phase I objective is installed). A word on pivot and iteration counts: Iteration counts tally iterations of the pivoting loop, successful or not. Pivot counts tally successful bound-to-bound or change-of-basis pivots. Pretty much all messages will give tot.iters, so that it's possible to track the progress of an LP. Iterf has an entirely different function -- it's tracking the accumulation of eta matrices in the basis representation. sys Substructure for dynamic system modification status. forcedfull Set to TRUE if the full system has been forced in state dyFORCEFULL. This should happen at most once, so if we enter dyFORCEFULL and forcedfull == TRUE, it's fatal. cons loadable Count of constraints which could be activated unloadable Count of constraints which are ineligible for activation (empty constraints and nonbinding rows) vars loadable Count of variables which could be activated unloadable Count of variables which are ineligible for activation (nonbasic fixed) tot Total simplex iterations and pivots, all phases iters pivs p1 Primal phase I iterations and pivots. iters pivs p2 Primal phase II iterations and pivots. iters pivs d2 Dual phase II iterations and pivots. iters pivs pivok Set to TRUE in dy_{primal|dual}pivot if the current iteration is a successful pivot. Cleared to FALSE at the head of dy_duenna. prev_pivok Set to pivok at head of dy_duenna. Provides status of just completed pivot for post-Duenna decisions. basis Various fields related to basis change, refactoring, etc. etas The number of basis changes (hence eta matrices) since the the basis was last factored. Used to schedule periodic factoring of the basis. Reset to 0 each time the basis is factored. pivs The number of basis pivots since entry into a primal or dual simplex phase (excludes bound-to-bound simplex `pivots'). Used when deciding whether to remove variables from the pivot reject list, and whether to pop out of a simplex phase due to excessive swing. dinf Number of successive refactors with dual infeasibility. Cleared at the start of a simplex phase. Incremented/cleared in dy_accchk iff a dual feasibility check is performed. degen Activation level of antidegeneracy algorithm. Held at 0 when the antidegeneracy algorithm is not active. Incremented each time a restricted subproblem is formed, and decremented when the restriction is backed out. (Values > 1 indicate that degeneracy recurred while working on a restricted subproblem, resulting in further restriction.) degenpivcnt The number of successive degenerate pivots. idlecnt The number of cycles since the objective has changed. lastz Previous objective value for various activities; used to detect and suppress loops. piv Objective at last pivot (detects stalling) cd Objective at last entry into constraint deactivation (dyPURGECON) (detects constraint activate/deactivate loops) vd Objective at last entry into variable deactivation (dyPURGEVAR) (detects variable activate/deactivate loops) fp Objective at last entry into force primal (dyFORCEPRIMAL) (detects constraint activate/deactivate loops) fd Objective at last entry into force dual (dyFORCEDUAL) (detects variable activate/deactivate loops) prim Primal variable information norm1 1-norm of basic primal variables inv(B)b norm2 2-norm of basic primal variables max inf-norm (max) of basic primal variables maxndx index of max primal variable dual Dual variable information norm1 1-norm of dual variables cinv(B) norm2 2-norm of dual variables max inf-norm (max) of dual variables maxndx index of max dual variable */ typedef struct { dyphase_enum phase ; lpret_enum lpret ; double z ; double inactzcorr ; struct { dyphase_enum active ; dyphase_enum next ; bool init_pse ; bool init_dse ; } simplex ; double infeas ; int infeascnt ; struct { int ndx ; double ratio ; } ubnd ; struct { bool installed ; int infcnt ; int infvars_sze ; int *infvars ; double *p1obj ; double *p2obj ; } p1obj ; struct { struct { int loadable ; int unloadable ; } cons ; struct { int loadable ; int unloadable ; } vars ; bool forcedfull ; } sys ; struct { int iters ; int pivs ; } tot ; struct { int iters ; int pivs ; } p1 ; struct { int iters ; int pivs ; } p2 ; struct { int iters ; int pivs ; } d2 ; bool pivok ; bool prev_pivok ; struct { int etas ; int pivs ; int dinf ; } basis ; int degen ; int degenpivcnt ; int idlecnt ; struct { double piv ; double cd ; double vd ; double fp ; double fd ; } lastz ; struct { double norm1 ; double norm2 ; double max ; int maxndx ; } prim ; struct { double norm1 ; double norm2 ; double max ; int maxndx ; } dual ; } lp_struct ; /* Declarations global to the dylp implementation but not visible outside of it. With this we can avoid passing huge numbers of parameters and/or unpacking a structure on a regular basis. Unless otherwise indicated, indices are in the dy_sys (active system) frame of reference. dy_retained TRUE if dylp thinks that the structures below are valid, FALSE otherwise. Main structures --------------- dy_lp: The lp control structure for dylp. dy_sys: The active constraint system; initialised in dylp:startup dy_tols: Tolerances in effect for dylp; initialised in dylp:dylp from orig_tols. dy_opts: Options in effect for dylp; initialised in dylp:dylp to point to same structure as orig_opts. dy_stats Statistics structure for dylp; initialised in dylp:dylp to point ot the same structure as orig_stats. Constraint & Variable Management -------------------------------- dy_actvars: The active variables. Indexed in dy_sys frame, contains indices in orig_sys frame. Attached to dy_sys. Entries for logical variables (1 <= j <= concnt) are meaningless. dy_actcons: The active constraints. Indexed in dy_sys frame, contains indices in orig_sys frame. Attached to dy_sys. dy_origvars: Status of the original architectural variables. * A value of 0 indicates the entry hasn't been processed. Should never happen. * If the variable is active, the entry contains the index of the variable in the dy_sys frame. * If the variable is inactive, the coding is the negative of the vstat flags, limited to the nonbasic status values vstatNBFR, vstatNBFX, vstatNBLB, or vstatNBUB, and the qualifier vstatNOLOAD. Indexed in orig_sys frame. Attached to orig_sys. dy_origcons: Status of the original constraints. * If the constraint is active, the entry contains the index of the constraint in the dy_sys frame. * If the constraint is inactive, contains 0. * If the constraint cannot be activated, contains a negative value. Indexed in orig_sys frame. Attached to orig_sys. Note that there are macros defined to test whether a variable or constraint is inactive, and whether it's eligible for activation. Use them! Basis Management ---------------- dy_basis: The basis vector. Indexed by basis position, attached to dy_sys. dy_var2basis: Translates a variable index to a basis pos'n. Indexed by column, attached to dy_sys. Entries for nonbasic variables must be kept at 0. dy_status: The status vector. Indexed by column, attached to dy_sys. Primal and Dual Variables ------------------------- dy_x: The values of all primal variables. Indexed by column, attached to dy_sys. Values of nonbasic variables must always be correct (to allow uniform handling of normal nonbasic variables and superbasic variables). Values of basic variables will retain unperturbed values while the antidegeneracy mechanism is active -- this allows the perturbation to be quickly backed out. dy_xbasic: The values of the basic variables. Indexed by basis pos'n, attached to dy_sys. dy_y: The dual variables. Indexed by basis pos'n, attached to dy_sys. Projected Steepest Edge (PSE) Pricing ------------------------------------- dy_cbar: Iteratively updated vector of reduced costs. Indexed by column, attached to dy_sys. dy_gamma: Iteratively updated vector of column norms ||abar||^2. Indexed by column, attached to dy_sys. dy_frame: Boolean vector which indicates if a given variable is in the current frame of reference. Indexed by column, attached to dy_sys. Dual Steepest Edge (DSE) Pricing -------------------------------- dy_rho: Iteratively updated vector of row norms ||beta||^2. Indexed by basis position, attached to dy_sys. DSE pricing also makes use of dy_xbasic (the reduced costs of the dual variables), and maintains dy_cbar. Antidegeneracy -------------- dy_brkout: Specifies the direction a variable needs to move to escape from a degenerate vertex. Indexed by basis pos'n, attached to dy_sys. dy_degenset: Specifies the set of constraints (equivalently, basic variables) perturbed at each level of the antidegeneracy algorithm. Indexed by basis pos'n, attached to dy_sys. The entry for a constraint is the highest level of degenerate set which includes the constraint. If the entry is 0, the constraint is not involved in degeneracy. dy_ddegenset: Specifies the set of dual constraints (equivalently, reduced costs) perturbed at each level of the antidegeneracy algorithm. Indexed by variable index, attached to dy_sys. The entry for a dual constraint is the highest level of degenerate set which includes the constraint. If the entry is 0, the constraint is not involved in degeneracy. */ extern bool dy_retained ; extern lp_struct *dy_lp ; extern consys_struct *dy_sys ; extern lptols_struct *dy_tols ; extern lpopts_struct *dy_opts ; extern int *dy_actvars,*dy_actcons,*dy_origvars,*dy_origcons, *dy_basis,*dy_var2basis, *dy_brkout,*dy_degenset,*dy_ddegenset ; extern flags *dy_status ; extern double *dy_x,*dy_xbasic,*dy_y,*dy_cbar,*dy_gamma,*dy_rho ; extern bool *dy_frame ; extern lpstats_struct *dy_stats ; /* dy_scaling.c */ extern bool dy_initlclsystem(lpprob_struct *orig_lp, bool hotstart) ; extern void dy_freelclsystem(lpprob_struct *orig_lp, bool freesys) ; extern bool dy_isscaled(void) ; extern void dy_scaling_vectors(const double **rscale, const double **cscale) ; extern consys_struct *dy_scaled_origsys() ; /* dy_coldstart.c */ extern dyret_enum dy_coldstart(consys_struct *orig_sys), dy_crash(void) ; /* dy_warmstart.c */ extern dyret_enum dy_warmstart(lpprob_struct *orig_lp) ; /* dy_hotstart.c */ extern dyret_enum dy_hotstart(lpprob_struct *orig_lp) ; /* dy_basis.c */ extern dyret_enum dy_factor(flags *calcflgs), dy_pivot(int xipos, double abarij, double maxabarj) ; extern double dy_chkpiv(double abarij, double maxabarj) ; extern void dy_btran(double *col), dy_ftran(double *col, bool save) ; extern bool dy_setpivparms(int curdelta, int mindelta) ; extern char *dy_prtpivparms(int lvl) ; /* dy_bound.c */ extern int dy_activateBndCons(consys_struct *orig_sys) ; extern int dy_dualaddvars(consys_struct *orig_sys) ; /* dy_conmgmt.c */ extern bool dy_loadcon(consys_struct *orig_sys, int orig_ndx, bool genvars, int *inactndxs) ; extern bool dy_deactNBLogPrimCon(consys_struct *orig_sys, int i), dy_deactBLogPrimCon(consys_struct *orig_sys, int i), dy_actBLogPrimCon(consys_struct *orig_sys, int i, int *inactvars), dy_actBLogPrimConList(consys_struct *orig_sys, int cnt, int *ocndxs, int **inactvars) ; extern int dy_deactivateCons(consys_struct *orig_sys), dy_activateCons(consys_struct *orig_sys, bool with_vars) ; /* dy_varmgmt.c */ extern bool dy_actNBPrimArch(consys_struct *orig_sys, int ovndx), dy_actNBPrimArchList(consys_struct *orig_sys, int cnt, int *ovndxs), dy_deactBPrimArch(consys_struct *orig_sys, int ovndx), dy_deactNBPrimArch(consys_struct *orig_sys, int ovndx) ; extern int dy_deactivateVars(consys_struct *orig_sys), dy_activateVars(consys_struct *orig_sys, int *candidates) ; /* dy_primalpivot.c */ extern dyret_enum dy_primalin(int initcol, int scan, int *xjndx, int *nextcol), dy_primalpivot(int xjndx, int indir, int *xindx, int *outdir, double *abarij, double *delta, int *xjcand), dy_degenout(int level) ; /* dy_duenna.c */ extern dyret_enum dy_duenna(dyret_enum pivresult, int xjndx, int xindx, int xjcand, int xicand), dy_accchk(flags *checks) ; /* dy_pivreject.c */ extern dyret_enum dy_addtopivrej(int xkndx, dyret_enum why, double abarij, double maxabarij), dy_dealWithPunt(void) ; extern bool dy_clrpivrej(int *entries) ; extern void dy_checkpivtol(void) ; extern void dy_initpivrej(int sze), dy_freepivrej(void) ; /* dy_primal.c */ extern lpret_enum dy_primal(void) ; extern bool dy_initp1obj(void),dy_swapobjs(dyphase_enum phase) ; /* dy_dualpivot.c */ extern dyret_enum dy_dualout(int *xindx), dy_dualpivot(int xindx, int outdir, int *p_xjndx, int *p_indir, double *p_cbarj, double *p_abarij, double *p_delta, int *xicand), dy_dualdegenout(int level) ; /* dy_dual.c */ extern lpret_enum dy_dual(void) ; #endif /* DYLP_INTERNAL */ /* dy_setup.c */ extern void dy_defaults(lpopts_struct **opts, lptols_struct **tols), dy_checkdefaults(consys_struct *sys, lpopts_struct *opts, lptols_struct *tols), dy_setprintopts(int lvl, lpopts_struct *opts) ; /* dylp.c */ extern lpret_enum dylp(lpprob_struct *orig_lp, lpopts_struct *orig_opts, lptols_struct *orig_tols, lpstats_struct *orig_stats) ; /* dylp_utils.c */ #ifdef DYLP_INTERNAL extern lpret_enum dyret2lpret(dyret_enum dyret) ; extern dyret_enum dy_updateprimals(int j, double deltaj, double *p_abarj) ; extern bool dy_reducerhs(double *rhs, bool init), dy_calcprimals(void),dy_calccbar(void) ; extern void dy_calcduals(void),dy_setbasicstatus(void), dy_dseinit(void),dy_pseinit(void) ; extern double dy_calcobj(void),dy_calcdualobj(void),dy_calcpinfeas(void) ; extern void dy_finishup(lpprob_struct *orig_lp, dyphase_enum phase) ; #ifdef DYLP_PARANOIA extern bool dy_chkstatus(int vndx), dy_chkdysys(consys_struct *orig_sys) ; extern void dy_chkdual(int lvl) ; #endif #endif /* DYLP_INTERNAL */ extern bool dy_dupbasis(int dst_basissze, basis_struct **p_dst_basis, basis_struct *src_basis, int dst_statussze, flags **p_dst_status, int src_statuslen, flags *src_status) ; extern void dy_freesoln(lpprob_struct *lpprob) ; /* dy_penalty.c */ extern bool dy_pricenbvars(lpprob_struct *orig_lp, flags priceme, double **p_ocbar, int *p_nbcnt, int **p_nbvars), dy_pricedualpiv(lpprob_struct *orig_lp, int oxindx, double nubi, double xi, double nlbi, int nbcnt, int *nbvars, double *cbar, double *p_upeni, double *p_dpeni) ; /* dy_tableau.c */ extern bool dy_abarj(lpprob_struct *orig_lp, int tgt_j, double **p_abarj) ; extern bool dy_betaj(lpprob_struct *orig_lp, int tgt_j, double **p_betaj) ; extern bool dy_betai(lpprob_struct *orig_lp, int tgt_i, double **p_betai) ; extern bool dy_abari(lpprob_struct *orig_lp, int tgt_i, double **p_abari, double **p_betai) ; /* dy_rays.c */ extern bool dy_primalRays(lpprob_struct *orig_lp, int *p_numRays, double ***p_rays) ; extern bool dy_dualRays(lpprob_struct *orig_lp, bool fullRay, int *p_numRays, double ***p_rays, bool trueDuals) ; /* dy_solutions.c */ extern void dy_colDuals(lpprob_struct *orig_lp, double **p_cbar, bool trueDuals) ; extern void dy_rowDuals(lpprob_struct *orig_lp, double **p_y, bool trueDuals) ; extern void dy_colPrimals(lpprob_struct *orig_lp, double **p_x) ; extern void dy_rowPrimals(lpprob_struct *orig_lp, double **p_xB, int **p_indB) ; extern void dy_logPrimals(lpprob_struct *orig_lp, double **p_logx) ; extern void dy_colStatus(lpprob_struct *orig_lp, flags **p_colstat) ; extern void dy_logStatus(lpprob_struct *orig_lp, flags **p_logstat) ; extern bool dy_expandxopt(lpprob_struct *lp, double **p_xopt) ; /* dylp_io.c */ #include #ifdef DYLP_INTERNAL extern void dy_logpivot(dyret_enum result, int xjndx, int indir, double cbarj, int xindx, int outdir, double abarij, double delta) ; extern const char *dy_prtdyret(dyret_enum retcode) ; #endif /* DYLP_INTERNAL */ extern const char *dy_prtlpret(lpret_enum lpret), *dy_prtlpphase(dyphase_enum phase, bool abbrv) ; extern char *dy_prtvstat(flags status) ; extern bool dy_dumpcompact(ioid chn, bool echo, lpprob_struct *soln, bool nbzeros) ; /* dy_statistics.c These routines are compiled unconditionally, but note that the compile-time symbol DYLP_STATISTICS must be defined before dylp will actually take the time to collect detailed statistics. See dy_statistics.c for additional instructions. */ extern void dy_initstats(lpstats_struct **p_lpstats, consys_struct *orig_sys), dy_dumpstats(ioid chn, bool echo, lpstats_struct *lpstats, consys_struct *orig_sys), dy_freestats(lpstats_struct **p_lpstats) ; #ifdef DYLP_INTERNAL extern void dy_finalstats(lpstats_struct *lpstats) ; #endif /* DYLP_INTERNAL */ #endif /* _DYLP_H */ DyLP-1.6.0/DyLP/src/Dylp/dy_cmdint.c0000644000076700007670000003121611021160525013705 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains a medium strength command interpreter. It's a generic piece of code, also used in the bonsaiG MIP code. For bare dylp, or dylp embedded in a COIN OSI layer, various bits should be excised. The symbol BONSAIG should be defined only if dylp is being built as part of bonsaiG. */ #include "dylib_strrtns.h" #include "dy_cmdint.h" #include "dylib_keytab.h" static char sccsid[] UNUSED = "@(#)cmdint.c 3.12 11/11/04" ; static char svnid[] UNUSED = "$Id: dy_cmdint.c 238 2008-06-03 06:14:45Z lou $" ; /* MAXCMDFILES is pretty much arbitrary. The i/o package enforces the system limit. All we need here is something reasonable for sizing the cmdchns array. */ #define MAXCMDFILES 16 /* cmdchns keeps track of the i/o id and echo status for each command file that's open. level is the current nesting level. */ static int level ; static bool prompt ; static struct { ioid chn ; bool cecho ; bool gecho ; bool prompt ; } cmdchns[MAXCMDFILES-1] ; /* User command table definitions. It is important that the commands be in alphabetic order in the usercmds structure, as the keytab routines use binary search. The various _NDX values can be changed at will. For the dylp OSI layer, only lpcontrol, and lpprint are available. */ #ifdef BONSAIG # define HELP_NDX 1 # define LPPRINT_NDX 2 # define OBJECTIVE_NDX 3 # define MIPPRINT_NDX 5 # define PHIC_NDX 6 # define OBJDELTA_NDX 7 # define INCUMBENT_NDX 8 # define RECOVER_NDX 9 # define PRIORITY_NDX 10 # define TOURCLASS_NDX 11 # define LPCTL_NDX 12 # define MIPCTL_NDX 13 # define MIPLIM_NDX 14 #else # define HELP_NDX 1 # define LPPRINT_NDX 2 # define OBJECTIVE_NDX 255 # define MIPPRINT_NDX 255 # define PHIC_NDX 255 # define OBJDELTA_NDX 255 # define INCUMBENT_NDX 255 # define RECOVER_NDX 255 # define PRIORITY_NDX 255 # define TOURCLASS_NDX 255 # define LPCTL_NDX 12 # define MIPCTL_NDX 255 # define MIPLIM_NDX 255 #endif #define UNIMP_NDX 255 static keytab_entry usercmds[] = { { "help", 1, HELP_NDX }, { "incumbent", 1, INCUMBENT_NDX }, { "lpcontrol", 3, LPCTL_NDX }, { "lpprint", 3, LPPRINT_NDX }, { "mipcontrol", 4, MIPCTL_NDX }, { "miplimit", 4, MIPLIM_NDX }, { "mipprint", 4, MIPPRINT_NDX }, { "objdelta", 4, OBJDELTA_NDX }, { "objective", 4, OBJECTIVE_NDX }, { "phic", 2, PHIC_NDX }, { "priority", 2, PRIORITY_NDX }, { "recovery", 1, RECOVER_NDX }, { "tourclass", 1, TOURCLASS_NDX } } ; #define NUMUSERCMDS (sizeof usercmds/sizeof (keytab_entry)) static cmd_retval docmd (lex_struct *txt) /* This routine is just some prep and cleanup code, plus a big case statement. It figures out what command is requested, echoes it, dispatches to the appropriate routine, and on return cleans off any remaining junk on the command line. Parameter: txt: the command name Returns: cmd_retval code supplied by the command execution routine, or cmdHALTERROR if an error occurs here in docmd. */ { lex_struct *lex ; const char *keywd ; int cmd ; cmd_retval retval ; const char *rtnnme = "docmd" ; /* dy_setup.c */ extern cmd_retval dy_printopt(const char *keywd), dy_ctlopt(const char *keywd) ; #ifdef BONSAIG /* mip_setup.c */ extern cmd_retval mip_objopt(const char *keywd), mip_objdeltaopt(const char *keywd), mip_incumbentopt(const char *keywd), mip_phicopt(const char *keywd), mip_printopt(const char *keywd), mip_ctlopt(const char *keywd), mip_recoveryopt(const char *keywd) ; /* premature.c */ extern cmd_retval mip_limit (const char *keywd) ; /* priority_utils.c */ extern cmd_retval pri_priorityopt(const char *keywd) ; /* tourclass_utils.c */ extern cmd_retval tc_tourclassopt(const char *keywd) ; #endif if (txt == NULL) { errmsg(2,rtnnme,"txt") ; return (cmdHALTERROR) ; } if (txt->class != DY_LCID) { errmsg(5,rtnnme,(int) txt->class) ; return (cmdHALTERROR) ; } /* Look up the command in the command table. Return code of -1 means we can't find the string, -2 that it's ambiguous. */ dyio_outfmt(dy_logchn,dy_cmdecho,txt->string) ; dyio_flushio(dy_logchn,dy_cmdecho) ; cmd = ambig(txt->string,usercmds,NUMUSERCMDS) ; if (cmd < 0) { if (cmd < -1) errmsg(233,rtnnme,txt->string) ; else errmsg(234,rtnnme,txt->string) ; return (cmdHALTERROR) ; } /* Call the appropriate execution routine. Go to free input mode while parsing the command, then revert to line-oriented mode to remove any trailing junk. */ keywd = STRALLOC(txt->string) ; (void) dyio_setmode(dy_cmdchn,'f') ; retval = cmdHALTERROR ; (void) dyio_setmode(dy_cmdchn,'f') ; switch (cmd) { case LPPRINT_NDX: { retval = dy_printopt(keywd) ; break ; } case LPCTL_NDX: { retval = dy_ctlopt(keywd) ; break ; } # ifdef BONSAIG case MIPPRINT_NDX: { retval = mip_printopt(keywd) ; break ; } case MIPCTL_NDX: { retval = mip_ctlopt(keywd) ; break ; } case MIPLIM_NDX: { retval = mip_limit(keywd) ; break ; } case OBJECTIVE_NDX: { retval = mip_objopt(keywd) ; break ; } case OBJDELTA_NDX: { retval = mip_objdeltaopt(keywd) ; break ; } case PHIC_NDX: { retval = mip_phicopt(keywd) ; break ; } case INCUMBENT_NDX: { retval = mip_incumbentopt(keywd) ; break ; } case RECOVER_NDX: { retval = mip_recoveryopt(keywd) ; break ; } case PRIORITY_NDX: { retval = pri_priorityopt(keywd) ; break ; } case TOURCLASS_NDX: { retval = tc_tourclassopt(keywd) ; break ; } # endif case HELP_NDX: { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tHeh heh heh.\t\tSurely you jest?\n") ; retval = cmdOK ; break ; } case UNIMP_NDX: { dyio_outfmt(dy_logchn,dy_gtxecho, "\nThe command \"%s\" is unimplemented in this configuration.\n", keywd) ; retval = cmdOK ; break ; } } STRFREE(keywd) ; (void) dyio_setmode(dy_cmdchn,'l') ; /* Check what happened, and clean up if necessary. Cleanup consists of scanning off whatever is left on the command line and echoing it. */ if (retval != cmdHALTERROR) { lex = dyio_scanstr(dy_cmdchn,DY_LCQS,0,'\0','\n') ; if (!(lex->class == DY_LCNIL || lex->class == DY_LCEOF || lex->class == DY_LCERR)) dyio_outfmt(dy_logchn,dy_cmdecho," %s",lex->string) ; if (lex->class == DY_LCERR) retval = cmdHALTERROR ; } return (retval) ; } static cmd_retval indcmd (bool silent) /* This routine takes care of opening an indirect command file and doing the necessary bookkeeping to change command channels. The form of the command to open an indirect command file is '@ "filename"'. Parameters: silent: TRUE if echoing of commands & responses to ttyout should be suppressed, FALSE otherwise. Returns: TRUE if all goes well, FALSE otherwise */ { lex_struct *file ; const char *rtnnme = "indcmd" ; /* Get the file name. */ file = dyio_scanstr(dy_cmdchn,DY_LCQS,0,'"','"') ; if (file->class != DY_LCQS) { errmsg(236,rtnnme,"file name","parameter","@") ; return (cmdHALTERROR) ; } /* Stash the old command channel, then try to open the new file. */ cmdchns[level].chn = dy_cmdchn ; cmdchns[level].cecho = dy_cmdecho ; cmdchns[level].gecho = dy_gtxecho ; cmdchns[level].prompt = prompt ; dy_cmdchn = dyio_openfile(file->string,"r") ; if (dy_cmdchn < 0) { dy_cmdchn = cmdchns[level].chn ; return (cmdHALTERROR) ; } (void) dyio_setmode(dy_cmdchn,'l') ; /* Acknowledge that the file is successfully opened. */ dyio_outfmt(dy_logchn,dy_cmdecho," \"%s\"\n",file->string) ; dyio_outfmt(dy_logchn,dy_gtxecho, "\tcommand source file now %s\n",file->string) ; /* Set level and echo control variables. dy_gtxecho stays the same, so no action for it. We have to check dy_cmdecho and prompt, in case the input has switched to ttyin. */ level++ ; if (dyio_ttyq(dy_cmdchn) == TRUE || silent == FALSE) prompt = TRUE ; else prompt = FALSE ; if (dyio_ttyq(dy_cmdchn) == FALSE && silent == FALSE) dy_cmdecho = TRUE ; else dy_cmdecho = FALSE ; return (cmdOK) ; } static cmd_retval dobuiltin (lex_struct *txt, bool silent) /* This routine handles the built-in functions of the command interpreter. Not much, really -- disposal of empty lines and comments, opening indirect command files. Parameters: txt: the first lexeme of the command line (a delimiter). silent: TRUE if echoing of commands & responses to ttyout should be suppressed, FALSE otherwise. Returns: the appropriate cmd_retval code. */ { lex_struct *lex ; cmd_retval retval ; const char *rtnnme = "dobuiltin" ; if (txt == NULL) { errmsg(2,rtnnme,"txt") ; return (cmdHALTERROR) ; } if (txt->class != DY_LCDEL) { errmsg(5,rtnnme,(int) txt->class) ; return (cmdHALTERROR) ; } /* Deal with empty lines, comments, and garbage. */ if (*txt->string == '\n') return cmdOK ; if (*txt->string == '!') { dyio_outchr(dy_logchn,dy_cmdecho,'!') ; lex = dyio_scanstr(dy_cmdchn,DY_LCQS,0,'\0','\n') ; if (lex->class != DY_LCNIL) { dyio_outfmt(dy_logchn,dy_gtxecho," %s",lex->string) ; } return (cmdOK) ; } if (*txt->string != '@') { errmsg(230,rtnnme,txt->string) ; return (cmdHALTERROR) ; } /* The various 'built-in' commands. For now, just opening an indirect command file. */ retval = indcmd(silent) ; return (retval) ; } cmd_retval process_cmds (bool silent) /* This routine is a driver routine for processing a command file. dy_cmdchn and dy_logchn must be valid before process_cmds is called. Parameters: silent: TRUE if echoing of commands & responses to ttyout should be suppressed, FALSE otherwise. Returns: cmdOK if eof is reached and the nesting level is 0 cmdHALTNOERROR if the return code from a command execution specified terminate w/o error cmdHALTERROR otherwise */ { lex_struct *txt ; cmd_retval retval ; const char *rtnnme = "process_cmds" ; /* Initialise to level 0 and begin the command interpretation loop. We need to generate a prompt if the command channel is the terminal, or if the user wants commands to be echoed. We want to echo commands if the command channel is not a terminal and the user wants commands to be echoed. We echo generated text if the user wants it. */ level = 0 ; txt = NULL ; retval = cmdOK ; if (dyio_ttyq(dy_cmdchn) == TRUE || silent == FALSE) prompt = TRUE ; else prompt = FALSE ; if (dyio_ttyq(dy_cmdchn) == FALSE && silent == FALSE) dy_cmdecho = TRUE ; else dy_cmdecho = FALSE ; dy_gtxecho = !silent ; /* Open the command interpretation loop. First action is to prompt for a command. Remember that a return value of cmdOK from a command execution is interpreted to mean carry on with command interpretation. */ while (retval == cmdOK) { dyio_outfmt(dy_logchn,prompt,"\n(%d)%% ",level) ; retval = cmdHALTERROR ; /* Read in the first lexeme of the response and act accordingly. With any luck, we'll have an id, which we pass along to docmd to process. A delimiter could be an empty line, comment, or builtin, and they're handled by dobuiltin. EOF means we've finished a command file. Attempt a close and continue at the next level up. If we're at level 0, return. All other possibilities are errors of one sort or another. */ txt = dyio_scanlex(dy_cmdchn) ; switch (txt->class) { case DY_LCID: { retval = docmd(txt) ; break ; } case DY_LCDEL: { retval = dobuiltin(txt,silent) ; break ; } case DY_LCEOF: { if (level == 0) { retval = cmdHALTNOERROR ; } else { if (dyio_closefile(dy_cmdchn) == FALSE) warn(232,rtnnme,dyio_idtopath(dy_cmdchn)) ; dy_cmdchn = cmdchns[--level].chn ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n\treturning to command source file %s\n", dyio_idtopath(dy_cmdchn)) ; dy_cmdecho = cmdchns[level].cecho ; dy_gtxecho = cmdchns[level].gecho ; retval = cmdOK ; } break ; } case DY_LCERR: { break ; } default: /* DY_LCNIL, DY_LCNUM, DY_LCFS, DY_LCQS */ { errmsg(230,rtnnme,(txt->string == NULL)?"<>":txt->string) ; break ; } } dyio_flushio(dy_logchn,dy_cmdecho) ; } /* Command interpretation has been stopped. Fix up the return code and return. */ if (retval == cmdHALTERROR) errmsg(235,rtnnme) ; if (retval == cmdHALTNOERROR && txt->class == DY_LCEOF) retval = cmdOK ; return (retval) ; } DyLP-1.6.0/DyLP/src/Dylp/dylp_io.c0000644000076700007670000003574611033030745013411 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains i/o routines related to the dylp subroutine library. */ #define DYLP_INTERNAL #include "dylp.h" static char sccsid[] UNUSED = "@(#)dylp_io.c 4.5 11/06/04" ; static char svnid[] UNUSED = "$Id: dylp_io.c 243 2008-07-03 01:56:53Z lou $" ; const char *dy_prtlpret (lpret_enum lpret) /* Generates a print string corresponding to the dylp return codes. Parameters: lpret: lp return code Returns: print string */ { const char *rtnnme = "dy_prtlpret" ; switch (lpret) { case lpINV: { return ("invalid") ; } case lpOPTIMAL: { return ("optimal") ; } case lpUNBOUNDED: { return ("unbounded") ; } case lpSWING: { return ("pseudo-unbounded") ; } case lpINFEAS: { return ("infeasible") ; } case lpACCCHK: { return ("accuracy check") ; } case lpSTALLED: { return ("stalled") ; } case lpITERLIM: { return ("iteration limit exceeded") ; } case lpNOSPACE: { return ("insufficient memory") ; } case lpLOSTFEAS: { return ("lost feasibility") ; } case lpPUNT: { return ("punt!") ; } case lpFORCEDUAL: { return ("force primal -> dual") ; } case lpFORCEPRIMAL: { return ("force dual -> primal") ; } case lpFORCEFULL: { return ("force full activation") ; } case lpFATAL: { return ("unspecified fatal error") ; } default: { errmsg(5,rtnnme,"lpret",(int) lpret) ; return ("nonsense") ; } } } char *dy_prtvstat (flags status) /* This routine returns a print string corresponding to the status code passed as a parameter. Parameter: status: variable status code Returns: print string */ { flags mystatus ; static char buffer[100] ; const char *rtnnme = "dy_prtvstat" ; /* If we've been passed a completely empty status, return invalid. But we could be asked to print just a qualifier, so be prepared for mystatus to be vstatINV once the qualifiers are cleared. */ buffer[0] = '\0' ; if (status != vstatINV) { mystatus = status ; clrflg(mystatus,vstatQUALS) ; } else { strcpy(buffer,"INV") ; return (buffer) ; } if (mystatus != vstatINV) switch (mystatus) { case vstatBFX: { strcpy(buffer,"BFX") ; break ; } case vstatBUUB: { strcpy(buffer,"BUUB") ; break ; } case vstatBUB: { strcpy(buffer,"BUB") ; break ; } case vstatB: { strcpy(buffer,"B") ; break ; } case vstatBLB: { strcpy(buffer,"BLB") ; break ; } case vstatBLLB: { strcpy(buffer,"BLLB") ; break ; } case vstatBFR: { strcpy(buffer,"BFR") ; break ; } case vstatNBFX: { strcpy(buffer,"NBFX") ; break ; } case vstatNBUB: { strcpy(buffer,"NBUB") ; break ; } case vstatNBLB: { strcpy(buffer,"NBLB") ; break ; } case vstatNBFR: { strcpy(buffer,"NBFR") ; break ; } case vstatSB: { strcpy(buffer,"SB") ; break ; } case vstatINV: { strcpy(buffer,"INV") ; break ; } default: { errmsg(6,rtnnme,"status",(int) status) ; strcpy(buffer,"NONSENSE") ; return (buffer) ; } } /* Add any qualifiers. */ if (status != mystatus) { strcat(buffer,"(") ; if (flgon(status,vstatNOPIVOT)) strcat(buffer,"v") ; if (flgon(status,vstatNOPER)) strcat(buffer,"p") ; if (flgon(status,vstatNOLOAD)) strcat(buffer,"l") ; strcat(buffer,")") ; } return (buffer) ; } const char *dy_prtlpphase (dyphase_enum phase, bool abbrv) /* This routine returns a print representation of the lp phase passed as a parameter. Parameter: phase: an lp phase code. abbrv: TRUE to get a two-letter abbreviation, FALSE for the long version Returns: print string */ { const char *rtnnme = "dy_prtlpphase" ; switch (phase) { case dyINIT: { return ((abbrv == TRUE)?"IN":"initialisation") ; } case dyPURGEVAR: { return ((abbrv == TRUE)?"VD":"variable deactivation") ; } case dyGENVAR: { return ((abbrv == TRUE)?"VG":"variable generation") ; } case dyADDVAR: { return ((abbrv == TRUE)?"VA":"variable activation") ; } case dyPRIMAL1: { return ((abbrv == TRUE)?"P1":"primal phase I") ; } case dyPRIMAL2: { return ((abbrv == TRUE)?"P2":"primal phase II") ; } case dyPURGECON: { return ((abbrv == TRUE)?"CD":"constraint deactivation") ; } case dyGENCON: { return ((abbrv == TRUE)?"CG":"constraint generation") ; } case dyADDCON: { return ((abbrv == TRUE)?"CA":"constraint activation") ; } case dyDUAL: { return ((abbrv == TRUE)?"D2":"dual") ; } case dyFORCEDUAL: { return ((abbrv == TRUE)?"FD":"force dual") ; } case dyFORCEPRIMAL: { return ((abbrv == TRUE)?"FP":"force primal") ; } case dyFORCEFULL: { return ((abbrv == TRUE)?"FF":"force full") ; } case dyDONE: { return ((abbrv == TRUE)?"DN":"done") ; } case dyINV: { return ((abbrv == TRUE)?"NV":"invalid") ; } default: { errmsg(6,rtnnme,"lp phase",(int) phase) ; return ((abbrv == TRUE)?"??":"nonsense") ; } } } const char *dy_prtdyret (dyret_enum retcode) /* This routine returns a print representation of the dyret_enum code passed as a parameter. Parameter: retcode: a dyret_enum return code Returns: print string */ { const char *rtnnme = "dy_prtdyret" ; switch (retcode) { case dyrOK: { return ("ok") ; } case dyrOPTIMAL: { return ("optimal") ; } case dyrUNBOUND: { return ("unbounded") ; } case dyrSWING: { return ("pseudo-unbounded") ; } case dyrINFEAS: { return ("infeasible") ; } case dyrREQCHK: { return ("request accuracy check") ; } case dyrACCCHK: { return ("accuracy check failure") ; } case dyrLOSTPFEAS: { return ("loss of primal feasibility") ; } case dyrLOSTDFEAS: { return ("loss of dual feasibility") ; } case dyrDEGEN: { return ("degenerate pivot") ; } case dyrRESELECT: { if (dy_lp->phase == dyDUAL) return ("reselect leaving variable") ; else return ("reselect entering variable") ; } case dyrMADPIV: { return ("numerically unstable pivot") ; } case dyrPUNT: { return ("punt!") ; } case dyrPATCHED: { return ("basis patched") ; } case dyrSINGULAR: { return ("basis singular") ; } case dyrNUMERIC: { return ("ill-conditioned basis") ; } case dyrBSPACE: { return ("no space for basis") ; } case dyrSTALLED: { return ("stalled") ; } case dyrITERLIM: { return ("iteration limit") ; } case dyrFATAL: { return ("fatal error") ; } case dyINV: { return ("invalid") ; } default: { errmsg(6,rtnnme,"dyret_enum code",(int) retcode) ; return ("nonsense") ; } } } void dy_logpivot (dyret_enum result, int xjndx, int indir, double cbarj, int xindx, int outdir, double abarij, double delta) /* This routine prints a standard log line for a pivot. Parameters: result: the return code resulting from attempting the pivot xjndx: index of the entering variable x indir: direction of movement of x (1 to increase, -1 to decrease) cbarj: reduced cost cbar for the entering variable xindx: index of the leaving variable x outdir: direction of motion of x abarij: pivot element abar delta: amount of change in x Returns: undefined */ { bool validin,validout ; const char *resstr ; /* logpivot is called from within the dual simplex routine, so we have to convert dual unboundedness to primal infeasibility. Pseudo-unboundedness (swing) always refers to primal variables. */ validin = TRUE ; validout = TRUE ; switch (result) { case dyrOK: { resstr = "(ok)" ; break ; } case dyrDEGEN: { resstr = "(degen)" ; break ; } case dyrUNBOUND: { if (dy_lp->phase == dyDUAL) { resstr = "(infea)" ; validin = FALSE ; } else { resstr = "(unbnd)" ; validout = FALSE ; } break ; } case dyrSWING: { resstr = "(swing)" ; break ; } case dyrLOSTPFEAS: { resstr = "(!pfea)" ; break ; } case dyrLOSTDFEAS: { resstr = "(!dfea)" ; break ; } case dyrOPTIMAL: { if (dy_lp->phase == dyPRIMAL1) resstr = "(infea)" ; else resstr = "(opt)" ; break ; } case dyrPUNT: { resstr = "(punt!)" ; if (xjndx <= 0) validin = FALSE ; break ; } case dyrREQCHK: { if (dy_lp->pivok == FALSE) resstr = "(chkab)" ; else resstr = "(chkrq)" ; break ; } case dyrMADPIV: { resstr = "(mad)" ; if (xjndx <= 0) validin = FALSE ; break ; } case dyrSINGULAR: { resstr = "(sing)" ; break ; } case dyrBSPACE: { resstr = "(nosp)" ; break ; } case dyrFATAL: { resstr = "(fatal)" ; break ; } case dyrRESELECT: { resstr = "(resel)" ; if (dy_lp->phase == dyDUAL) validout = TRUE ; break ; } default: { resstr = "(huh?)" ; result = dyrINV ; break ; } } dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s%6d %-7s ",dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters+1,resstr) ; if (result == dyrINV) return ; if (validin == TRUE && xjndx > 0) { dyio_outfmt(dy_logchn,dy_gtxecho,"In: %s (%d) %s cbarj = %g ;", consys_nme(dy_sys,'v',xjndx,FALSE,NULL),xjndx, (indir == 1)?"inc":"dec",cbarj) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho,"In: ") ; } if (result == dyrFATAL) return ; if (result == dyrLOSTPFEAS) { dyio_outfmt(dy_logchn,dy_gtxecho, " Infeas: %s (%d) = %g, lb = %g, ub = %g", consys_nme(dy_sys,'v',xindx,FALSE,NULL),xindx, dy_xbasic[dy_var2basis[xindx]], dy_sys->vlb[xindx],dy_sys->vub[xindx]) ; return ; } if (validout == TRUE && xindx > 0) { dyio_outfmt(dy_logchn,dy_gtxecho," Out: %s (%d) %s", consys_nme(dy_sys,'v',xindx,FALSE,NULL),xindx, (outdir == 1)?"inc":"dec") ; } else { dyio_outfmt(dy_logchn,dy_gtxecho," Out: ") ; } if (validin == TRUE && validout == TRUE) { dyio_outfmt(dy_logchn,dy_gtxecho,", abarij = %g, delta = %g", abarij,(indir == 1)?delta:-delta) ; } if (dy_lp->phase == dyDUAL) { dyio_outfmt(dy_logchn,dy_gtxecho,", yb = %g.",dy_calcdualobj()) ; } else if (dy_lp->phase == dyPRIMAL1) { dyio_outfmt(dy_logchn,dy_gtxecho,", infeas = %g.",dy_calcpinfeas()) ; } else if (dy_lp->phase == dyPRIMAL2) { dyio_outfmt(dy_logchn,dy_gtxecho,", cx = %g.",dy_calcobj()) ; } else { dyio_outchr(dy_logchn,dy_gtxecho,'.') ; } return ; } bool dy_dumpcompact (ioid chn, bool echo, lpprob_struct *soln, bool nbzeros) /* This routine prints the compact version of the solution, as returned by dylp. The layout of the solution is basic information, followed by nonbasic information. For each active constraint, we print the basis position; the constraint index and name; the basic variable name, index, status and value; and the dual variable and value. For each nonbasic variable, we print the variable name, index, status, and value, and reduced cost. The caller can optionally suppress `common' zeros --- e.g., variables with status NBLB, NBFX, or NBUB and value of 0. Note that unscaling is not required here. soln->x and soln->y were unscaled when the solution was generated, and the client's constraint system (soln->consys) is not touched when dylp scales. Parameters: chn: file channnel for output echo: TRUE to echo to stdout, FALSE otherwise soln: an lpprob structure, containing a solution as returned by dylp. nbzeros: TRUE to print all nonbasic variables with a value of 0, FALSE to print only nonbasic variables with nonzero value or with status NBFR or SB. Returns: TRUE if the solution could be printed without error, FALSE otherwise. */ { int vndx,cndx,bpos ; double val ; bool nononbasic ; consys_struct *sys ; basis_struct *basis ; const char *rtnnme = "dy_dumpcompact" ; # ifdef DYLP_PARANOIA if (soln == NULL) { errmsg(2,rtnnme,"solution") ; return (FALSE) ; } sys = soln->consys ; if (sys == NULL) { errmsg(2,rtnnme,"constraint system") ; return (FALSE) ; } # else sys = soln->consys ; # endif /* Begin by printing identifying information about the system and the solution. If the phase is anything but dyDONE, we're done too. */ dyio_outfmt(chn,echo, "\n\nSystem: %s\t\t\tfinal status: %s after %d iterations.", sys->nme,dy_prtlpphase(soln->phase,FALSE),soln->iters) ; if (soln->phase != dyDONE) { dyio_outchr(chn,echo,'\n') ; return (TRUE) ; } /* Consider the lp return code. If it's optimal, infeasible, or unbounded, we'll continue on to print the solution, otherwise we're done. */ dyio_outfmt(chn,echo,"\n lp status: %s",dy_prtlpret(soln->lpret)) ; switch (soln->lpret) { case lpOPTIMAL: { dyio_outfmt(chn,echo,"\t\tobjective: %.9g",soln->obj) ; break ; } case lpINFEAS: { dyio_outfmt(chn,echo,"\t\tinfeasibility: %.9g",soln->obj) ; break ; } case lpUNBOUNDED: { if (soln->obj != 0) { if (soln->obj < 0) { vndx = abs((int) soln->obj) ; bpos = -1 ; } else { vndx = (int) soln->obj ; bpos = 1 ; } dyio_outfmt(chn,echo,"\t\tunbounded variable %s (%d) (%s)", consys_nme(sys,'v',vndx,FALSE,NULL),vndx, (bpos < 0)?"decreasing":"increasing") ; } break ; } default: { dyio_outchr(chn,echo,'\n') ; return (TRUE) ; } } /* There's a solution to be dumped. Do the basis, duals, and basic variables first. */ dyio_outfmt(chn,echo,"\n\nPosn\tConstraint\tDual\t\tPrimal\n") ; basis = soln->basis ; for (bpos = 1 ; bpos <= basis->len ; bpos++) { cndx = basis->el[bpos].cndx ; vndx = basis->el[bpos].vndx ; if (vndx < 0) vndx = sys->varcnt-vndx ; dyio_outfmt(chn,echo,"\n%5d\t(%4d) %-8s\t%12.4g\t(%4d) %-8s %12.7g", bpos,cndx,consys_nme(sys,'c',cndx,FALSE,NULL),soln->y[bpos], vndx,consys_nme(sys,'v',vndx,FALSE,NULL),soln->x[bpos]) ; } /* Now the nonbasic variables. Nonzero values only. */ nononbasic = TRUE ; for (vndx = 1 ; vndx <= sys->varcnt ; vndx++) if ((int) soln->status[vndx] > 0) { if (nononbasic == TRUE) { dyio_outfmt(chn,echo,"\n\nNonbasic Primal\n") ; nononbasic = FALSE ; } switch (soln->status[vndx]) { case vstatNBLB: case vstatNBFX: { val = sys->vlb[vndx] ; if (nbzeros == FALSE && val == 0) continue ; break ; } case vstatNBUB: { val = sys->vub[vndx] ; if (nbzeros == FALSE && val == 0) continue ; break ; } case vstatNBFR: case vstatSB: { val = 0 ; break ; } default: { val = quiet_nan(0) ; errmsg(1,rtnnme,__LINE__) ; break ; } } dyio_outfmt(chn,echo,"\n(%4d) %-8s %3s %12.7g",vndx, consys_nme(sys,'v',vndx,FALSE,NULL), dy_prtvstat(soln->status[vndx]),val) ; } if (nononbasic == TRUE) dyio_outfmt(chn,echo,"\n\nNo nonbasic architectural variables.\n") ; else dyio_outchr(chn,echo,'\n') ; return (TRUE) ; } DyLP-1.6.0/DyLP/src/Dylp/dy_dual.c0000644000076700007670000007433711245632140013374 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains the routines specific to dylp's dual simplex algorithm. It began life as a pretty straightforward implementation of dual phase II, with dual steepest edge (DSE) pricing. Subsequently, it's been augmented with perturbation-based antidegeneracy and multipivoting. It's difficult to give good, clear explanations for this code from the viewpoint of running a simplex algorithm on the dual problem. The root of the difficulty lies with the handling of bounded primal variables. Suppose we have m constraints and n variables in the problem. If you follow the usual logic of dual simplex, you see that what's happening is something like this: When a bounded variable is tight against an upper or lower bound constraint, we really need the dual variable that should be associated with that constraint, because it's nonzero, basic, and contributes a term y(-l) or yu to the objective function. But the constraints (either -x <= -l or x <= u) are not explicitly present in the constraint system, so we'll never see y or y in y = cinv(B). If you look in a text, they all assume 0 <= x <= +inf when explaining the dual algorithm. Hence the contribution for y is 0, all y don't exist, and the whole problem is conveniently swept under the rug. Just try and find a detailed explanation for bounded variables, l <= x <= u, where some l != 0 or some u != +inf. So, why does revised dual simplex work at all running off the primal tableaux? Let's start with the standard dual pair max cx min yb Ax <= b <=> yA >= c l <= x <= u y >= 0 The first point to make is that straightforward calculation of the dual objective will, in fact, be wrong if primal architectural variables are nonbasic at a nonzero bound. The necessary dual variables are missing from y = cinv(B), which contains only those duals associated with the constraints present in the primal matrix, A. And the necessary lower and upper bounds are missing from the rhs vector, b. The values of the missing duals can be found in the reduced costs cbar, since the reduced costs are the negative of the values of (all) the basic dual variables. From this the dual objective can be calculated correctly. If you slog through the algebra, what you eventually find is that the dual surplus variable, call it sigma, associated with column j in the dual constraint dot(y,a) - sigma = c, gets pressed into service as a surrogate for y and y. The dual simplex algorithm decides which role it will play, as part of the rules of the algorithm. In the case of sigma acting as surrogate for y, there's the added complication that the sign is wrong in the primal tableau, so that where we would have y >= 0 if the upper bound constraint was explicit, we have sigma <= 0 when it's handled implicitly. This works out rather neatly (if coincidentally), in the sense that (for a max primal) we want a positive reduced cost at optimality for a variable at upper bound. Generally speaking, one gets a negative dual for variables out at an upper bound. The other place where this can occur is when a range constraint results in an upper-bounded slack. To really understand dual simplex with bounded variables as simplex working on the dual problem, you should work the math. When you're done, you'll appreciate why texts never get into details. And with that in mind, I'm going to (mostly) comment the code in terms of the results that are required in the primal problem. One more very important point -- dylp runs a min cx primal simplex. The proper way to handle the conversion is to ask what would happen if the primal was max -cx. max (-c)x min yb Ax <= b yA >= (-c) l <= x <= u y >= 0 The result, once you work the linear algebra, is that the primal reduced costs calculated for min cx are in fact the correct duals (no sign inversion required) for min yb. But they are *not* the correct duals for the min cx problem -- we still need y = cinv(B) there. Put another way, the correct duals for min cx are the negative of the correct duals for min yb. (Has to be that way --- we did negate the objective, after all!) You'll notice that dy_y holds cinv(B). When doing calculations here in the dual simplex, we don't use them! Instead, we consult dy_cbar for dual variable values. Keep in mind also that (dualN)inv(dualB) = - inv(B)N. We're working the dual off the primal structures, so we have inv(B)N available to work with. When we're hunting for the leaving dual variable, we're working on finding the minimum delta_y using y = ybar - delta_y(betadualN), where ybar is a reduced cost, beta is row k of inv(dualB). Taking all the above into consideration, this becomes y = cbar + delta_y(betaN) where beta is a row of inv(B). The value of the entering dual will be -cbar/abar = cbar. The comments in dy_dualin sort of gloss over why we're looking for the minimum delta_y and concentrate on explaining the operation in terms of getting the correct sign for cbar. In the context of dylp, the dual algorithm is strictly subordinate, used to reoptimise after the addition of constraints. More, the assumption is that if the primal simplex uncovers unboundedness, we'll add constraints there and return to primal phase I if necessary. The dual algorithm therefore assumes that a primal optimal but infeasible solution is available. This simplifies things, in that we don't need a stage I for the dual. Anti-degeneracy in the dual works as the primal. The heavyweight tactic is to form a perturbed subproblem incorporating those columns where the unperturbed cbar = 0. There's also an implementation of the `anti-degen lite' heuristic, using alignment of the dual constraints (columns of the constraint matrix) with the rhs vector. When numeric ill-conditioning is uncovered, we attempt to deal with it by boosting the minimum pivot tolerances. This can happen if groombasis has to correct a major status error, or if dual2 thinks it's reached optimality and then unexpectedly looses dual or primal feasibility. We keep trying with the dual if only primal feasibility is lost. If we've lost dual feasibility, we revert to the primal simplex, as there's no dual phase I. */ #define DYLP_INTERNAL #include "dylp.h" static char sccsid[] UNUSED = "@(#)dy_dual.c 4.7 10/15/05" ; static char svnid[] UNUSED = "$Id: dy_dual.c 299 2009-08-28 01:35:28Z lou $" ; static dyret_enum preoptimality (dyret_enum lpretval, flags *result) /* This routine does the prep work so that we can have confidence in a report of optimality by the dual simplex routines. It clears the pivot reject list, refactors, recalculates the primal and dual variables, and performs primal and dual accuracy and feasibility checks. No heroic measures are taken, on loss of primal or dual feasibility, as the overlying algorithms will deal with it. Parameters: lpretval: the lp return code assigned by dual2 result: (o) loaded with the result flags from dy_accchk Returns: dyrOK: if all goes smoothly dyrPATCHED: if the only bump is that the basis was patched by dy_factor dyrLOSTDFEAS: if the dual feasibility check by dy_accchk fails dyrLOSTPFEAS: if the primal feasibility check by dy_accchk fails. dyrFATAL: if anything else goes wrong Also can relay error codes from dy_accchk (dyrACCCHK, and various basis factoring errors). Loss of dual feasibility dominates loss of primal feasibility. */ { flags checkflags ; dyret_enum retval ; # if defined(DYLP_PARANOIA) || !defined(DYLP_NDEBUG) const char *rtnnme = "preoptimality" ; # endif # ifdef DYLP_PARANOIA if (!(lpretval == dyrOPTIMAL || lpretval == dyrUNBOUND || lpretval == dyrPUNT)) { errmsg(4,rtnnme,"lp return code",dy_prtdyret(lpretval)) ; return (dyrFATAL) ; } # endif # ifndef DYLP_NDEBUG if (dy_opts->print.dual >= 4) dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: validating optimality at iteration %d.", rtnnme,dy_lp->tot.iters) ; # endif /* A little prep work. If the dual simplex has returned lpUNBOUNDED (primal infeasible) or lpPUNT, we still want the primal feasibility check to calculate total infeasibility. We don't want heroic measures taken to try and deal with the problem. Don't ask for a refactor if this looks like uncomplicated optimality. */ *result = 0 ; checkflags = 0 ; setflg(checkflags,ladFACTOR|ladPRIMALCHK|ladPRIMFEAS|ladPFQUIET| ladDUALCHK|ladDUALFEAS|ladDFQUIET) ; if (lpretval == dyrOPTIMAL && dy_lp->basis.etas == 0) clrflg(checkflags,ladFACTOR) ; /* Start with the easy stuff -- clear the pivot reject list and back out any restricted subproblem. If dualdegenout notes accuracy loss, request a refactor. */ # ifndef DYLP_NDEBUG if (dy_opts->print.dual >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tclearing pivot rejection machinery ... ") ; } # endif if (dy_clrpivrej(NULL) != TRUE) return (dyrFATAL) ; if (dy_lp->degen > 0) { if (dy_dualdegenout(0) == dyrREQCHK) setflg(checkflags,ladFACTOR) ; } /* And now the accuracy checks. */ # ifndef DYLP_NDEBUG if (dy_opts->print.dual >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho,"done.\n\t%schecking accuracy ... ", flgon(checkflags,ladFACTOR)?"refactoring and ":"") ; } # endif retval = dy_accchk(&checkflags) ; *result = checkflags ; if (!(retval == dyrOK || retval == dyrPATCHED)) { # ifndef DYLP_NDEBUG if (dy_opts->print.dual >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho,"%sfailed.", (dy_opts->print.dual >= 5)?"\n\t":" ") ; } # endif return (retval) ; } else if (flgon(checkflags,ladPRIMALCHK|ladDUALCHK)) { # ifndef DYLP_NDEBUG if (dy_opts->print.dual >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho,"%sfailed", (dy_opts->print.dual >= 5)?"\n\t":" ") ; if (flgon(checkflags,ladPRIMALCHK)) dyio_outfmt(dy_logchn,dy_gtxecho," primal") ; if (flgon(checkflags,ladDUALCHK)) dyio_outfmt(dy_logchn,dy_gtxecho," dual") ; dyio_outfmt(dy_logchn,dy_gtxecho," check(s).") ; } # endif retval = dyrACCCHK ; } else if (flgon(checkflags,ladPRIMFEAS|ladDUALFEAS)) { # ifndef DYLP_NDEBUG if (dy_opts->print.dual >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho,"lost") ; if (flgon(checkflags,ladPRIMFEAS)) dyio_outfmt(dy_logchn,dy_gtxecho," primal") ; if (flgon(checkflags,ladDUALFEAS)) dyio_outfmt(dy_logchn,dy_gtxecho," dual") ; dyio_outfmt(dy_logchn,dy_gtxecho," feasibility.") ; } # endif if (flgon(checkflags,ladDUALFEAS)) retval = dyrLOSTDFEAS ; else retval = dyrLOSTPFEAS ; } # ifndef DYLP_NDEBUG else { if (dy_opts->print.dual >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho,"%s%s.", (dy_opts->print.dual >= 5)?"\n\t":" ", (retval == dyrOK)?"done":"patched") ; } } # endif return (retval) ; } static dyret_enum dual2 (void) /* Phase 2 of the dual simplex. The basic action is a simple loop: pivot (dy_dualpivot), then see what went wrong (dy_duenna). As a side effect of the pivot, dy_dualpivot returns the index of the preferred candidate, xicand, to leave on the next pivot. The work in this routine goes into trying to deal with problems of pivot rejection. If the preferred candidate is rejected, dy_dualout is called to select a new leaving variable. As long as a leaving variable can be selected, and nothing fatal goes wrong, the inner pivoting loop continues. Exit from the inner loop occurs due to optimality (which occurs when we achieve primal feasibility), (dual) unboundedness (primal infeasibility), a punt, or a fatal error (of which there are many). Optimality and unboundedness are self-explanatory. We run a preoptimality check (refactor plus primal and dual feasibility checks) to confirm. Loss of primal feasibility causes a return to the pivoting loop. Loss of dual feasibility causes a reversion to the primal simplex. A punt indicates that no leaving variable could be selected but there are infeasible variables flagged with the NOPIVOT qualifier. This can be indicated by dy_dualpivot or by dy_dualout. If preoptimality indicates loss of primal feasibility (it ignores NOPIVOT qualifiers when doing the check), we'll relax the pivot selection tolerance and try again to select a pivot. The tolerance is progressively relaxed until a successful pivot occurs, at which point it snaps back to the original tolerance. If we relax to the bogus number tolerance before managing a successful pivot, we abort. Parameters: none Returns: appropriate dual lpret_enum code. */ { int candxi,xindx,outdir,xjndx,indir,optcnt ; double cbarj,abarij,delta ; flags xistatus,checks ; bool do_pivots ; dyret_enum lpretval,outresult,pivresult,duennaresult,preopresult ; const int successiveDinf = 40 ; const char *rtnnme = "dual2" ; # ifndef DYLP_NDEBUG int xipos ; bool uxpfeas,uxnpfeas,uxndfeas ; dyret_enum tmpretval ; # endif # ifdef DYLP_PARANOIA if (dy_lp->degen != 0) { errmsg(317,rtnnme,dy_sys->nme,dy_lp->degen) ; return (dyrFATAL) ; } if (dy_lp->d2.iters != 0) { errmsg(5,rtnnme,"dual iteration count",dy_lp->d2.iters) ; return (dyrFATAL) ; } # endif dy_lp->d2.pivs = 0 ; dy_lp->pivok = FALSE ; dy_lp->prev_pivok = FALSE ; lpretval = dyrINV ; dy_lp->basis.dinf = 0 ; /* Do a little initialisation, then open the outer loop. It's purpose is to recover from false terminations (optimality or unboundedness which disappeared on refactoring) and pivot selection problems. All the action occurs at the bottom of the loop, after we fall out of the inner pivoting loop. */ if (dy_clrpivrej(NULL) != TRUE) return(dyrFATAL) ; optcnt = 0 ; while (lpretval == dyrINV) { /* Call dy_dualout to locate a leaving variable x using DSE pricing. From a primal viewpoint, we're looking for a variable x with the greatest normalised infeasibility. If there are no infeasible variables, we have optimality. The other possibility is that all infeasible variables are on the pivot reject list; this is indicated by a return value of dyrPUNT. Optimality falls into the default case. Call dy_dealWithPunt to free up any potential candidates on the pivot rejection list and iterate to try again. */ outresult = dy_dualout(&candxi) ; switch (outresult) { case dyrOK: { do_pivots = TRUE ; break ; } case dyrPUNT: { outresult = dy_dealWithPunt() ; if (outresult == dyrRESELECT) { continue ; } else { do_pivots = FALSE ; lpretval = outresult ; } break ; } default: { do_pivots = FALSE ; lpretval = outresult ; break ; } } # ifdef DYLP_PARANOIA if (candxi <= 0 && outresult == dyrOK) { dyio_outfmt(dy_logchn,TRUE, "\ndualout: %s(%d) INVALID LEAVING VAR = %d, outresult = %s", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, xindx,dy_prtdyret(outresult)) ; } # endif /* Open the loop that executes pivots. While we have a candidate x to leave, we do a two-step: attempt the pivot with x (dy_dualpivot), then check that everything went off ok (dy_duenna). As part of updating the DSE pricing information, a new x will be selected, and we repeat the loop. There are two valid escapes from this loop: * We find optimality (no candidates to leave) or unboundedness (a direction of recession). * la Duenna aborts the problem (due to a problem it's not able to fix). The first action in the loop is to decide which way the leaving variable is moving, based on its status. Arguably this should move into dy_dualpivot. */ for (xindx = candxi ; do_pivots == TRUE ; xindx = candxi) { # ifdef DYLP_PARANOIA if (xindx <= 0) { dyio_outfmt(dy_logchn,TRUE, "\nloop: %s(%d) INVALID LEAVING VAR = %d, outresult = %s", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, xindx,dy_prtdyret(outresult)) ; errmsg(386,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,"leaving") ; return (dyrFATAL) ; } # endif xistatus = dy_status[xindx] ; if (flgon(xistatus,vstatBLLB)) outdir = 1 ; else outdir = -1 ; # ifndef DYLP_NDEBUG if (dy_opts->print.pricing >= 2) { xipos = dy_var2basis[xindx] ; dyio_outfmt(dy_logchn,dy_gtxecho,"\n (%s)%d: %s (%d) = %g, ", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, consys_nme(dy_sys,'v',xindx,TRUE,NULL),xindx, dy_xbasic[xipos]) ; if (outdir < 0) { dyio_outfmt(dy_logchn,dy_gtxecho, "decreasing and leaving at ub = %g, price = %g.", dy_sys->vub[xindx], (dy_xbasic[xipos]-dy_sys->vub[xindx])/sqrt(dy_rho[xipos])) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho, "increasing and leaving at lb = %g, price = %g.", dy_sys->vlb[xindx], (dy_sys->vlb[xindx]-dy_xbasic[xipos])/sqrt(dy_rho[xipos])) ; } } # endif /* So far so good. Call dy_dualpivot to do the heavy lifting. It will select an incoming variable x, pivot the basis representation, update the primal and dual variables, the DSE information, and related data structures. As a side effect of the DSE updates, a new leaving variable x should be selected. We're hoping for a return code of dyrOK or dyrDEGEN, indicating a successful (perhaps degenerate) pivot and selection of a new leaving variable. dyrOPTIMAL or dyrPUNT indicate a successful pivot but failure to select a new x. Other possibilities are dyrUNBOUND (primal infeasible), dyrREQCHK (suspected accuracy problems), dyrMADPIV (numerically unstable pivot), and various errors, including dyrLOSTDFEAS, dyrSINGULAR, dyrBSPACE, and dyrFATAL. */ xjndx = -1 ; pivresult = dy_dualpivot(xindx,outdir, &xjndx,&indir,&cbarj,&abarij,&delta,&candxi) ; # ifndef DYLP_NDEBUG if (dy_opts->print.dual >= 4) dy_logpivot(pivresult,xjndx,indir,cbarj,xindx,outdir,abarij,delta) ; # endif /* La Duenna makes sure the proprieties are observed and deals with any scandals. In the end, there are four cases to distinguish: * dyrOK: The pivot went through without a problem, or whatever went wrong has been fixed transparently from La Duenna's point of view. It may be that no candidate was selected because dualin returned REQCHK, and in this case we need to force a reselect. * dyrOPTIMAL, dyrUNBOUND, dyrPUNT: We'll want to end the pivoting loop and run preoptimality. Depending on what it has to say, we'll either return or resume pivoting. Unbounded gets its own case so we can remember the unbounded row. Punt means that there are potential pivots, but they're flagged with the NOPIVOT qualifier. * dyrRESELECT: Whatever happened requires that we select a new leaving variable. Most commonly, this indicates that dualin couldn't find a numerically stable pivot. Less commonly, new pivot candidates have been released from the pivot rejection list in response to a punt. Occasionally, something more exotic has happened (e.g., the basis has been patched due to singularity). Escape to the outer loop to reselect. * dyrSWING: The primal variables are moving too far, too fast. dyrSWING is a recommendation that we pop out of simplex and try to add constraints. But we won't do this unless we've completed a minimum number of basis changes (currently hardwired to 10). * dyrLOSTDFEAS: The dual simplex has a reasonable tolerance for slight loss of feasibility. But if the infeasibility persists through N successive refactors, better give it up. Currently, N is hardwired to ten. * Anything else: errors too severe to handle here. Kick back and let the caller deal with it. The reason for enumerating return values here is to make sure that we haven't overlooked some return value. This way, it triggers an error. */ duennaresult = dy_duenna(pivresult,xjndx,xindx,-1,candxi) ; switch (duennaresult) { case dyrOK: { if (candxi <= 0) do_pivots = FALSE ; break ; } case dyrRESELECT: { do_pivots = FALSE ; break ; } case dyrOPTIMAL: case dyrPUNT: { lpretval = duennaresult ; do_pivots = FALSE ; break ; } case dyrUNBOUND: { lpretval = dyrUNBOUND ; dy_lp->ubnd.ndx = xindx*outdir ; dy_lp->ubnd.ratio = 0 ; do_pivots = FALSE ; break ; } case dyrSWING: { if (dy_lp->basis.pivs >= 10) { lpretval = duennaresult ; do_pivots = FALSE ; } else if (candxi <= 0) { do_pivots = FALSE ; } break ; } case dyrLOSTDFEAS: { # ifndef DYLP_NDEBUG if (dy_opts->print.dual >= 3 && dy_lp->basis.dinf < successiveDinf) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n(%s)%d: dual infeasible for %d successive refactors.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, dy_lp->basis.dinf) ; } if (dy_opts->print.dual >= 1 && dy_lp->basis.dinf >= successiveDinf) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: dual infeasibility for %d successive", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, successiveDinf) ; dyio_outfmt(dy_logchn,dy_gtxecho," refactors; aborting.") ; } # endif if (dy_lp->basis.dinf >= successiveDinf) { lpretval = duennaresult ; do_pivots = FALSE ; } else if (candxi <= 0) { do_pivots = FALSE ; } break ; } case dyrACCCHK: case dyrSINGULAR: case dyrBSPACE: case dyrSTALLED: case dyrITERLIM: case dyrNUMERIC: case dyrFATAL: { lpretval = duennaresult ; do_pivots = FALSE ; break ; } default: { errmsg(7,rtnnme,__LINE__,"La Duenna return code", (int) duennaresult) ; do_pivots = FALSE ; lpretval = dyrFATAL ; break ; } } } /* End of the pivoting loop. Why are we here? The simplest case is that we just need to select a new leaving variable --- head back to the top of the loop from here. */ if (lpretval == dyrINV) continue ; /* Do we think we're optimal or (dual) unbounded? (I.e., we're reporting dyrOPTIMAL, dyrPUNT, or dyrUNBOUND.) If so, the first thing to do is call preoptimality to refactor and do accuracy and feasibility checks. If the feasibility status agrees with what we're expecting, we can return. Optimal should be primal and dual feasible, while unbounded will be dual feasible only. If preoptimality reports primal and dual feasibility for dyrUNBOUND or dyrPUNT, well, unexpected primal feasibility is always a pleasure. dyrLOSTPFEAS with dyrPUNT says that there are variables on the pivot rejection list, but dy_dealWithPunt has already concluded nothing can be done to make them useable. Return dyrPUNT. Anything else means that the feasibility status has taken an unexpected turn. The working hypothesis is that we need to be more careful in selecting pivots for both factoring and pivoting, which we do by tightening the current value and lower bound for the pivot selection parameters. If we've lost dual feasibility, bail out (eventually we'll revert to primal phase I). If we've only lost primal feasibility, head back to the top of the loop to resume pivoting. */ if (lpretval == dyrOPTIMAL || lpretval == dyrUNBOUND || lpretval == dyrPUNT) { optcnt++ ; # ifndef DYLP_NDEBUG uxpfeas = FALSE ; uxnpfeas = FALSE ; uxndfeas = FALSE ; tmpretval = lpretval ; # endif preopresult = preoptimality(lpretval,&checks) ; switch (preopresult) { case dyrOK: case dyrPATCHED: { # ifndef DYLP_NDEBUG if (lpretval == dyrUNBOUND || lpretval == dyrPUNT) uxpfeas = TRUE ; # endif lpretval = dyrOPTIMAL ; break ; } case dyrLOSTDFEAS: { # ifndef DYLP_NDEBUG if (dy_opts->print.dual >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: lost dual feasibility.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; } uxndfeas = TRUE ; if (flgon(checks,ladPRIMFEAS)) { if (lpretval == dyrOPTIMAL) uxnpfeas = TRUE ; } else { if (lpretval != dyrOPTIMAL) uxpfeas = TRUE ; } # endif lpretval = dyrLOSTDFEAS ; break ; } case dyrLOSTPFEAS: { if (lpretval == dyrUNBOUND || lpretval == dyrPUNT) { /* nothing to be done */ } else if (lpretval == dyrOPTIMAL) { lpretval = dyrINV ; (void) dy_setpivparms(+1,+1) ; # ifndef DYLP_NDEBUG uxnpfeas = TRUE ; # endif } break ; } default: { lpretval = preopresult ; break ; } } /* Ok, we've done the necessary processing. There are two things to deal with now. If DYLP_NDEBUG permits, check for warnings about unexpected primal/dual (in)feasibility. If we're going to repeat (dyrINV), check that we haven't exceeded the repetition count. The warnings could be compacted, but this way we also get to see if the four variables have been set to a nonsense pattern. */ # ifndef DYLP_NDEBUG if (dy_opts->print.dual >= 2) { if (uxndfeas == TRUE) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tunexpected loss of dual feasibility at iteration (%s)%d.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; } if (uxpfeas == TRUE) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tunexpected primal feasibility at iteration (%s)%d.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; } if (uxnpfeas == TRUE) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tunexpected loss of primal feasibility at iteration (%s)%d.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; } } # endif if (lpretval == dyrINV) { if (optcnt > 15) { errmsg(387,rtnnme,dy_sys->nme, dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters,optcnt) ; lpretval = dyrFATAL ; } # ifndef DYLP_NDEBUG else { if (dy_opts->print.dual >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tfalse termination (%s) at (%s)%d; resuming pivoting.", dy_prtdyret(tmpretval),dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters) ; } } # endif } } } /* We've finished the outer loop. Clean up before we leave. */ if (dy_clrpivrej(NULL) != TRUE) lpretval = dyrFATAL ; if (dy_lp->degen > 0) (void) dy_dualdegenout(0) ; # ifndef DYLP_NDEBUG if (lpretval == dyrUNBOUND && dy_opts->print.dual >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n%s: system %s is (dual) unbounded.", rtnnme,dy_sys->nme) ; } # endif # ifdef DYLP_STATISTICS if (dy_stats != NULL) { dy_stats->d2.iters += dy_lp->d2.iters ; dy_stats->d2.pivs += dy_lp->d2.pivs ; } # endif return (lpretval) ; } lpret_enum dy_dual (void) /* This is the driver routine for the dual simplex algorithm. It expects that the problem will arrive with an initial dual feasible basis and solution (primal and dual variables). Since there's no provision for a phase I in this dual simplex implementation, dy_dual is simpler than its counterpart dy_primal. Parameters: none Returns: lpret_enum code */ { lpret_enum retval ; dyret_enum dyret ; # if defined(DYLP_PARANOIA) || !defined(DYLP_NDEBUG) const char *rtnnme = "dy_dual" ; # endif retval = lpINV ; dy_lp->phase = dyDUAL ; dy_lp->lpret = lpINV ; (void) dy_setpivparms(-100,-100) ; (void) dy_setpivparms(+1,+1) ; dy_lp->basis.pivs = 0 ; /* Call dual2 to take us to optimality. We'll also make the usual conversion of dual unbounded => primal infeasible at this point. (Remember that we don't have to worry about dual infeasible => primal unbounded.) */ dy_lp->z = dy_calcobj() ; # ifndef DYLP_NDEBUG if (dy_opts->print.dual >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n%s: entering dual phase II, z = %g", rtnnme,dy_lp->z) ; if (dy_opts->print.dual >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho, ", dual active yb = %g",dy_calcdualobj()) ; } dyio_outchr(dy_logchn,dy_gtxecho,'.') ; } # endif dy_lp->d2.iters = 0 ; dyret = dual2() ; if (dyret == dyrUNBOUND) dyret = dyrINFEAS ; /* What do we have? Optimality is best, but infeasibility or a punt are also possible. Anything else is regarded as a fatal error. (But dylp will try primal I in the event of stalling or loss of dual feasibility.) */ retval = dyret2lpret(dyret) ; # ifndef DYLP_NDEBUG if (retval == lpOPTIMAL || retval == lpINFEAS || retval == lpSWING) { if (dy_opts->print.dual >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: dual phase II ended, %d pivots, ", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, dy_lp->d2.pivs) ; if (retval == lpOPTIMAL) dyio_outfmt(dy_logchn,dy_gtxecho,"optimal z = %g.",dy_lp->z) ; else if (retval == lpINFEAS) dyio_outfmt(dy_logchn,dy_gtxecho,"infeas = %g.",dy_lp->infeas) ; else dyio_outfmt(dy_logchn,dy_gtxecho,"swing %e for %s (%d).", dy_lp->ubnd.ratio, consys_nme(dy_sys,'v',dy_lp->ubnd.ndx,FALSE,NULL), dy_lp->ubnd.ndx) ; } } else if (retval == lpITERLIM) { if (dy_opts->print.dual >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: dual simplex terminated; iteration limit (%d).", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, dy_opts->iterlim) ; } } else { if (dy_opts->print.dual >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: dual phase II failed, status %s after %d pivots.", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, dy_prtlpret(retval),dy_lp->d2.pivs) ; } } /* For curiousity's sake, try the traditional certificate of optimality: dual objective == yb == cx == primal objective. */ if (dy_opts->print.dual >= 4 && retval == lpOPTIMAL) { double dualobj,primalobj ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n%s: comparing dual and primal objectives.",rtnnme) ; dualobj = dy_calcdualobj() ; dyio_outfmt(dy_logchn,dy_gtxecho,"\n\tdual objective yb = %g.",dualobj) ; primalobj = dy_calcobj() ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tprimal objective cx = %g.",primalobj) ; if (!withintol(dualobj,primalobj,dy_tols->dchk)) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tWHOOPS! yb - cx = %g - %g = %g > %g.", dualobj,primalobj,dualobj-primalobj,dy_tols->dchk) ; } else dyio_outfmt(dy_logchn,dy_gtxecho,"\n\tobjectives match.") ; } # endif dy_lp->lpret = retval ; return (retval) ; } DyLP-1.6.0/DyLP/src/Dylp/glplib1.c0000644000076700007670000000411210632415522013267 0ustar /* glplib1.c */ /*---------------------------------------------------------------------- -- Copyright (C) 2000, 2001, 2002 Andrew Makhorin , -- Department for Applied Informatics, Moscow Aviation -- Institute, Moscow, Russia. All rights reserved. -- -- This file is a part of GLPK (GNU Linear Programming Kit). -- -- Licensed under the Common Public License (CPL) by permission of the -- author for inclusion in the DyLP LP distribution. ----------------------------------------------------------------------*/ #ifndef UNUSED # if defined(_GNU_SOURCE) || defined(__GNUC__) # define UNUSED __attribute__((unused)) # else # define UNUSED # endif #endif static char sccsid[] UNUSED = "@(#)glplib1.c 1.2 09/25/04" ; static char svnid[] UNUSED = "$Id: glplib1.c 148 2007-06-09 03:15:30Z lou $" ; #include #include "glplib.h" static void *pointer = NULL; /* a secret place to save a pointer */ /*---------------------------------------------------------------------- -- save_pointer - save a pointer. -- -- *Synopsis* -- -- #include "glplib.h" -- void save_pointer(void *ptr); -- -- *Description* -- -- The routine save_pointer saves a pointer ptr in some secret place. -- -- This routine is intended for internal needs and should not be used -- directly by the application program. */ void save_pointer(void *ptr) { pointer = ptr; return; } /*---------------------------------------------------------------------- -- read_pointer - obtain a pointer. -- -- *Synopsis* -- -- #include "glplib.h" -- void *read_pointer(void); -- -- *Description* -- -- The routine read_pointer obtains the pointer, which was previously -- saved by the routine save_pointer in some secret place. -- -- This routine is intended for internal needs and should not be used -- directly by the application program. -- -- *Returns* -- -- The routine read_pointer returns the pointer saved by the routine -- save_pointer. If the latter routine has not been called yet, NULL is -- returned. */ void *read_pointer(void) { void *ptr = pointer; return ptr; } /* eof */ DyLP-1.6.0/DyLP/src/Dylp/dy_tableau.c0000644000076700007670000011517711263231135014061 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2005 -- 2008 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains routines which implement `tableau' functions. They will calculate: * a column of the basis inverse, beta = inv(B)e * a row of the basis inverse, beta = einv(B) * a column of inv(B)A, abar = inv(B)Ae = inv(B)a * a row of inv(B)A, abar = einv(B)A The requested column or row should be given in the context of the original system, and the result will be returned in this context. Since dylp's active system is not always the full original system, we need to take some care. Let B be the basic partition of the active system, and N the inactive partition. Let G be the matrix composed of coefficients of inactive rows and basic columns, and let H be the matrix composed of coefficients of inactive rows and nonbasic columns. Now, if we activate the inactive rows G and declare the logical variable for each row to be basic, the basic component of the full system will be the matrix [[ B 0 ] [ G I ]] The full basis inverse can be calculated as [[ inv(B) 0 ] [ -Ginv(B) I ]]. See the typeset documentation for a decent presentation of all this. Dylp deletes its pointer to the original system when it returns --- this is the only safe course, because we have no control over it. Following that logic, the routines here require the client to pass an lpprob_struct as a parameter and a pointer to the unscaled original system is taken from it. Clearly, though, things will go badly wrong if there have been changes from the original system used on the last call to dylp. */ #define DYLP_INTERNAL #include "dylp.h" static char svnid[] UNUSED = "$Id: dy_tableau.c 302 2009-10-08 00:29:17Z lou $" ; #if DYLP_PARANOIA > 0 bool dy_std_paranoia (const lpprob_struct *orig_lp, const char *rtnnme) /* Some standard paranoid checks for a call from outside, collected into one place. Parameters: orig_lp: lp problem structure rtnnme: the client routine Returns: FALSE if the paranoid checks fail, TRUE otherwise. */ { consys_struct *orig_sys ; /* Check for presence. */ if (orig_lp == NULL) { errmsg(2,rtnnme,"orig_lp") ; return (FALSE) ; } orig_sys = orig_lp->consys ; if (orig_sys == NULL) { errmsg(2,rtnnme,"orig_sys") ; return (FALSE) ; } /* Check for a corrupt constraint system. */ if (flgon(orig_sys->opts,CONSYS_CORRUPT)) { errmsg(115,rtnnme,orig_lp->consys->nme) ; return (FALSE) ; } /* Check that dylp and the lpprob_struct agree on whether dylp retains valid data structures. */ if ((flgoff(orig_lp->ctlopts,lpctlDYVALID) && dy_retained == TRUE) || (flgon(orig_lp->ctlopts,lpctlDYVALID) && dy_retained == FALSE)) { errmsg(1,rtnnme,__LINE__) ; return (FALSE) ; } return (TRUE) ; } #endif /* DYLP_PARANOIA */ bool dy_betaj (lpprob_struct *orig_lp, int tgt_j, double **p_betaj) /* Given a basic variable x, this routine returns the corresponding unscaled column of the basis inverse, beta. Of course, it's not quite that simple. The client only knows about the original system, so tgt_j is the index of x in the original system. We need to: 1) Find the index j in the active system, determine the basis pos'n k, and retrieve the portion of beta (really, column k of the basis) that corresponds to the scaled active system. 2) Unscale beta and translate it to the original system frame of reference. 3) Calculate the remaining coefficients of beta due to inactive rows. It is assumed that orig_sys is unscaled. It's an error if tgt_j is not a basic variable. As pointed out at the head of the file, there are two components to be calculated: The part of beta that's drawn from the active basis B, and the part that's drawn from the inactive matrix G. Clearly, things will go wrong if the constraint system passed in through orig_lp has been modified and no longer matches dylp's idea of the original system. In particular, note that dy_origvars and dy_origcons may well be attached to the scaled local copy of the original system. They WILL NOT be updated by changes to the client's unscaled copy. Suppose that x is basic in pos'n k, which corresponds to row i_orig. The approach is to calculate the partially unscaled basis column sc_beta as inv(B)Re, then finish unscaling with S as we drop the coefficients into their proper positions in a vector indexed in the orig_sys frame of reference. Then we add the coefficients due to -G inv(B) Parameters: orig_lp: lp problem structure tgt_j: column index in original system; negative values are assumed to specify logicals as the negative of the index of the associated constraint. p_betaj: (i) vector to hold beta; if NULL, one will be allocated; if non-NULL, will be cleared to zero. (o) inv(B)e, unscaled Returns: TRUE if the calculation is successful, FALSE otherwise. */ { int m_orig,n_orig,i_orig,j_orig,k_orig ; int m,n,i,j,k,j_bpos,v ; bool scaled,active,logical,natural ; double *sc_betaj,*betaj ; const double *rscale, *cscale ; double betaij ; pkvec_struct *ai ; consys_struct *orig_sys ; char *rtnnme = "dy_betaj" ; # if DYLP_PARANOIA > 0 if (dy_std_paranoia(orig_lp,rtnnme) == FALSE) { return (FALSE) ; } if (p_betaj == NULL) { errmsg(2,rtnnme,"betaj") ; return (FALSE) ; } # endif /* Always check for valid data structures. */ if (flgoff(orig_lp->ctlopts,lpctlDYVALID)) { errmsg(396,rtnnme,orig_lp->consys->nme, "calculate column of basis inverse") ; return (FALSE) ; } orig_sys = orig_lp->consys ; m_orig = orig_sys->concnt ; n_orig = orig_sys->varcnt ; m = dy_sys->concnt ; n = dy_sys->varcnt ; # ifndef DYLP_NDEBUG if (dy_opts->print.tableau >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n generating column beta<%d>",tgt_j) ; } # endif /* Determine what sort of variable we're looking at, and do some validity checks appropriate for the type. */ j = 0 ; if (tgt_j < 0) { i_orig = -tgt_j ; if (i_orig > m_orig) { errmsg(102,rtnnme,orig_sys->nme,"row",i_orig,1,m_orig) ; return (FALSE) ; } logical = TRUE ; if (ACTIVE_CON(i_orig)) { active = TRUE ; j = dy_origcons[i_orig] ; } else { active = FALSE ; } } else if (tgt_j > 0) { j_orig = tgt_j ; if (j_orig > n_orig) { errmsg(102,rtnnme,orig_sys->nme,"column",j_orig,1,n_orig) ; return (FALSE) ; } logical = FALSE ; if (ACTIVE_VAR(j_orig)) { active = TRUE ; j = dy_origvars[j_orig] ; } else { active = FALSE ; } } else { errmsg(102,rtnnme,orig_sys->nme,"column",tgt_j,1,n_orig) ; return (FALSE) ; } /* If the variable is active, it better be basic. For a logical, check if it's in the natural basis position. Note that an architectural will automatically fail the `natural position' test. Inactive architecturals are by definition nonbasic, hence an error here. Inactive logicals are by definition basic in the natural positon and we can synthesize the column. */ natural = FALSE ; if (active == TRUE) { j_bpos = dy_var2basis[j] ; if (j_bpos == 0) { errmsg(951,rtnnme,dy_sys->nme,consys_nme(dy_sys,'v',j,FALSE,NULL),j, "calculate column of basis inverse") ; return (FALSE) ; } i_orig = dy_actcons[j_bpos] ; if (j == j_bpos) { natural = TRUE ; } } else { if (logical == TRUE) { j_bpos = i_orig ; natural = TRUE ; } else { errmsg(950,rtnnme,"architectural variable", consys_nme(orig_sys,'v',j_orig,FALSE,NULL),j_orig, "calculate column of basis inverse") ; return (FALSE) ; } } /* Special case: The basis inverse column for a logical is simply a unit vector with 1.0 in the appropriate position, *if* the logical is in its `natural' position as the basic variable for the associated constraint. This holds whether the logical is active or inactive. After the analysis above, i_orig holds the correct position. */ if (logical == TRUE && natural == TRUE) { if (*p_betaj == NULL) { *p_betaj = (double *) CALLOC((m_orig+1),sizeof(double)) ; } else { memset(*p_betaj,0.0,((size_t) (m_orig+1)*sizeof(double))) ; } (*p_betaj)[i_orig] = 1.0 ; # ifndef DYLP_NDEBUG if (dy_opts->print.tableau >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho,", logical for ") ; if (active == FALSE) { dyio_outfmt(dy_logchn,dy_gtxecho,"inactive ") ; } dyio_outfmt(dy_logchn,dy_gtxecho,"constraint %s (%d)", consys_nme(orig_sys,'c',i_orig,FALSE,NULL),i_orig) ; if (active == TRUE) { dyio_outfmt(dy_logchn,dy_gtxecho, ", basis pos'n %d, constraint %s (%d)",j_bpos, consys_nme(orig_sys,'c',i_orig,FALSE,NULL),i_orig) ; } dyio_outfmt(dy_logchn,dy_gtxecho,".") ; if (dy_opts->print.tableau >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n non-zeros: (%d, %g)", i_orig,(*p_betaj)[i_orig]) ; } } # endif return (TRUE) ; } /* We have an architectural variable or an unnatural logical. In either case, the variable is active with index j and basic in basis position j_bpos. i_orig is the index of the corresponding row in orig_sys. */ # ifndef DYLP_NDEBUG if (dy_opts->print.tableau >= 1) { if (logical == TRUE) { dyio_outfmt(dy_logchn,dy_gtxecho, ", logical for active constraint %s (%d)", consys_nme(dy_sys,'c',j,FALSE,NULL),j) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho,", architectural %s (%d)", consys_nme(dy_sys,'v',j,FALSE,NULL),j) ; } dyio_outfmt(dy_logchn,dy_gtxecho, ", basis pos'n %d, constraint %s (%d).",j_bpos, consys_nme(orig_sys,'c',i_orig,FALSE,NULL),i_orig) ; } # endif /* Set up and retrieve the portion of beta corresponding to the active matrix. The actual unscaling looks like inv(B) = S sc_inv(B) R, and then we're extracting the column at pos'n j_bpos (which corresponds to some row i_orig). It's convenient to fold R into the unit vector and get half of the unscaling done as we extract beta. */ sc_betaj = (double *) CALLOC((m+1),sizeof(double)) ; scaled = dy_isscaled() ; if (scaled == TRUE) { dy_scaling_vectors(&rscale,&cscale) ; sc_betaj[j_bpos] = rscale[i_orig] ; } else { sc_betaj[j_bpos] = 1.0 ; } dy_ftran(sc_betaj,FALSE) ; # ifndef DYLP_NDEBUG /* Still in dy_sys reference frame. */ if (dy_opts->print.tableau >= 6) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n dy_sys nonzeros:") ; k = 0 ; for (i = 1 ; i <= m ; i++) { if (sc_betaj[i] != 0) { j = dy_basis[i] ; dyio_outfmt(dy_logchn,dy_gtxecho," (%s %d", consys_nme(dy_sys,'c',i,FALSE,NULL),i) ; dyio_outfmt(dy_logchn,dy_gtxecho," %s %d %g)", consys_nme(dy_sys,'v',j,FALSE,NULL),j,sc_betaj[i]) ; k++ ; if (k%3 == 0) dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t\t ") ; } } } # endif /* Change reference frame, and complete the unscaling, if necessary. Recall that for the logical for row k, the column scaling factor is 1/R[k]. Be careful with unnatural logicals! The correct column scaling factor is 1/R[k] where k is the natural row for the logical, which may not be the row i where it's currently basic. So that we're not testing for scaling in the loop body, replicate the loop. */ if (*p_betaj == NULL) { betaj = (double *) CALLOC((m_orig+1),sizeof(double)) ; *p_betaj = betaj ; } else { memset(*p_betaj,0.0,((size_t) (m_orig+1)*sizeof(double))) ; betaj = *p_betaj ; } if (scaled == TRUE) { for (i = 1 ; i <= m ; i++) { i_orig = dy_actcons[i] ; k = dy_basis[i] ; if (k <= m) { k_orig = dy_actcons[k] ; betaj[i_orig] = sc_betaj[i]/rscale[k_orig] ; setcleanzero(betaj[i_orig],dy_tols->zero) ; } else { j_orig = dy_actvars[k] ; betaj[i_orig] = sc_betaj[i]*cscale[j_orig] ; } } } else { for (i = 1 ; i <= m ; i++) { i_orig = dy_actcons[i] ; betaj[i_orig] = sc_betaj[i] ; } } # ifndef DYLP_NDEBUG /* Now in orig_sys frame of reference. */ if (dy_opts->print.tableau >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n active nonzeros:") ; k = 0 ; for (i_orig = 1 ; i_orig <= m_orig ; i_orig++) { if (betaj[i_orig] != 0) { dyio_outfmt(dy_logchn,dy_gtxecho," (%s %d %g)", consys_nme(orig_sys,'c',i_orig,FALSE,NULL),i_orig, betaj[i_orig]) ; k++ ; if (k%3 == 0) dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t\t ") ; } } } # endif if (sc_betaj != NULL) FREE(sc_betaj) ; /* Ok, that was the easy part. Now we need to fill in the portions of beta contributed by inactive constraints --- the G submatrix. In some respects this is straightforward. We have the unscaled portion of beta contributed by the active system, and we need to calculate -G beta. Note that we are now working completely in the original frame of reference, except for a quick excursion to determine if a variable is basic in the active system. Of course, if there are no loadable constraints, we can skip all this. The trek between reference frames is arduous. Given a, to find the appropriate row of beta, we do j_orig -> j -> j_bpos -> k_orig. In words, column in original system to column in active system to basis position (row) in active system to row in original system, which is the element we want in beta. At least we don't have to unscale at the same time. */ if (dy_lp->sys.cons.loadable > 0) { ai = pkvec_new(orig_sys->maxrowlen) ; for (i_orig = 1 ; i_orig <= m_orig ; i_orig++) { if (ACTIVE_CON(i_orig)) continue ; # ifndef DYLP_NDEBUG if (dy_opts->print.tableau >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n Processing inactive row %s (%d)", consys_nme(orig_sys,'c',i_orig,FALSE,NULL),i_orig) ; } # endif if (consys_getrow_pk(orig_sys,i_orig,&ai) == FALSE) { errmsg(122,rtnnme,orig_sys->nme,"row", consys_nme(orig_sys,'c',i_orig,TRUE,NULL),i_orig) ; if (ai != NULL) pkvec_free(ai) ; if (betaj != NULL) FREE(betaj) ; return (FALSE) ; } betaij = 0 ; for (v = 0 ; v < ai->cnt ; v++) { j_orig = ai->coeffs[v].ndx ; if (INACTIVE_VAR(j_orig)) continue ; j = dy_origvars[j_orig] ; j_bpos = dy_var2basis[j] ; if (j_bpos > 0) { k_orig = dy_actcons[j_bpos] ; # ifndef DYLP_NDEBUG if (dy_opts->print.tableau >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho," (%s %d %d %g)", consys_nme(orig_sys,'v',j_orig,FALSE,NULL), j_orig,k_orig,ai->coeffs[v].val) ; } # endif betaij += ai->coeffs[v].val*betaj[k_orig] ; } } setcleanzero(betaij,dy_tols->zero) ; betaj[i_orig] = -betaij ; } if (ai != NULL) pkvec_free(ai) ; } # ifndef DYLP_NDEBUG if (dy_opts->print.tableau >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n nonzeros:") ; k = 0 ; for (i = 1 ; i <= m_orig ; i++) { if (betaj[i] != 0) { dyio_outfmt(dy_logchn,dy_gtxecho," (%d, %g)",i,betaj[i]) ; k++ ; if (k%5 == 0) dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t ") ; } } } # endif /* That should do it. */ return (TRUE) ; } bool dy_abarj (lpprob_struct *orig_lp, int tgt_j, double **p_abarj) /* This routine returns the unscaled ftran'd column inv(B)a. Of course, it's not quite that simple. The client only knows about the original system, so j_orig is the index of x in the original system. We need to: 1) Find the index j in the active system, retrieve a, and calculate the portion of abar that corresponds to the scaled active system. It's entirely possible that x is not active, in which case we need to do a fair bit more work to cobble up something that looks like a scaled active column. 2) Unscale abar and translate it to the original system frame of reference. 3) Calculate the remaining coefficients of abar due to inactive rows. It is assumed that orig_sys is unscaled. Check the written documentation to get a good handle on the math. The relevant outer unscaling is: x architectural basic in pos'n i: abar = S sc_abar (1/S) s logical basic in pos'n i: abar = (1/R) sc_abar (1/S) To cancel a factor of inv(R) attached to the scaled basis inverse, it'll be convenient to apply row scaling to an unscaled column prior to doing the ftran. Finally, we'll need to calculate the coefficients of abar that belong to inactive constraints. Recall that we could extend the basis as [[B 0] [G I]] with an inverse of [[inv(B) 0] [-Ginv(B) I]]. Then for a full column a = [a a], the value of abar will be [ inv(B)a a - G inv(B)a ] = [ abarj a - G abarj ]. Parameters: orig_lp: lp problem structure tgt_j: column index in original system; negative values are assumed to specify logicals as the negative of the index of the associated constraint. p_abarj: (i) vector to hold abar; if NULL, one will be allocated (o) inv(B)a, unscaled Returns: TRUE if the calculation is successful, FALSE otherwise. */ { int n,m,i,j,k,j_bpos,n_orig,m_orig,i_orig = 0,j_orig = 0,k_orig,v ; double *sc_abarj,*abarj ; const double *rscale,*cscale ; double Sj,abarij,agj ; pkvec_struct *aj_pk ; bool scaled,active,logical ; pkvec_struct *ai ; consys_struct *orig_sys ; const char *rtnnme = "dy_abarj" ; # if DYLP_PARANOIA > 0 if (dy_std_paranoia(orig_lp,rtnnme) == FALSE) { return (FALSE) ; } if (p_abarj == NULL) { errmsg(2,rtnnme,"abarj") ; return (FALSE) ; } # endif /* Always check for valid data structures. */ if (flgoff(orig_lp->ctlopts,lpctlDYVALID)) { errmsg(396,rtnnme,orig_lp->consys->nme, "calculate column of basis inverse") ; return (FALSE) ; } orig_sys = orig_lp->consys ; m_orig = orig_sys->concnt ; n_orig = orig_sys->varcnt ; m = dy_sys->concnt ; n = dy_sys->varcnt ; # ifndef DYLP_NDEBUG if (dy_opts->print.tableau >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n generating column abar<%d>, ",tgt_j) ; } # endif /* If we're scaled, grab the scaling vectors. */ scaled = dy_isscaled() ; if (scaled == TRUE) { dy_scaling_vectors(&rscale,&cscale) ; } /* Is the column active? Remember, the client can point us at logicals with a negative index, so we have to consider the question of active rows. An active logical has the same index as its associated row. */ j = 0 ; if (tgt_j < 0) { i_orig = -tgt_j ; if (i_orig > m_orig) { errmsg(102,rtnnme,orig_sys->nme,"row",i_orig,1,m_orig) ; return (FALSE) ; } logical = TRUE ; if (ACTIVE_CON(i_orig)) { active = TRUE ; j = dy_origcons[i_orig] ; } else { active = FALSE ; } } else if (tgt_j > 0) { j_orig = tgt_j ; if (j_orig > n_orig) { errmsg(102,rtnnme,orig_sys->nme,"column",j_orig,1,n_orig) ; return (FALSE) ; } logical = FALSE ; if (ACTIVE_VAR(j_orig)) { active = TRUE ; j = dy_origvars[j_orig] ; } else { active = FALSE ; } } else { errmsg(102,rtnnme,orig_sys->nme,"column",tgt_j,1,n_orig) ; return (FALSE) ; } # ifndef DYLP_NDEBUG if (dy_opts->print.tableau >= 1) { if (logical == TRUE) { dyio_outfmt(dy_logchn,dy_gtxecho,"logical %s (%d) for ", consys_nme(orig_sys,'v',n_orig+i_orig,FALSE,NULL),i_orig) ; if (active == FALSE) { dyio_outfmt(dy_logchn,dy_gtxecho,"inactive ") ; } dyio_outfmt(dy_logchn,dy_gtxecho,"constraint %s (%d)", consys_nme(orig_sys,'c',i_orig,FALSE,NULL),i_orig) ; } else { if (active == FALSE) { dyio_outfmt(dy_logchn,dy_gtxecho,"inactive ") ; } dyio_outfmt(dy_logchn,dy_gtxecho,"variable %s (%d)", consys_nme(orig_sys,'v',j_orig,FALSE,NULL),j_orig) ; } } # endif /* Special case: If the specified column represents the logical for an inactive constraint, the algebra says the answer is a unit vector. Arguably we should handle a column corresponding to any active basic variable here, but hey, the client should *think* a moment before calling this routine. */ if (active == FALSE && logical == TRUE) { if (*p_abarj == NULL) { abarj = (double *) CALLOC((m_orig+1),sizeof(double)) ; *p_abarj = abarj ; } else { abarj = *p_abarj ; memset(abarj,0,((size_t) (m_orig+1)*sizeof(double))) ; } abarj[i_orig] = 1.0 ; # ifndef DYLP_NDEBUG if (dy_opts->print.tableau >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n nonzeros: (%d, %g)", i_orig,abarj[i_orig]) ; } # endif return (TRUE) ; } /* Set up a working vector for abar. */ sc_abarj = (double *) CALLOC((m+1),sizeof(double)) ; /* If the column is active, we can get sc_abarj with little effort. Do half the outer unscaling (the final 1/S) to get to the same point as the else case, where we start with an inactive and unscaled column. */ if (active == TRUE) { if (logical == TRUE) { sc_abarj[j] = 1.0 ; } else if (consys_getcol_ex(dy_sys,j,&sc_abarj) == FALSE) { errmsg(122,rtnnme,dy_sys->nme,"column", consys_nme(dy_sys,'v',j,TRUE,NULL),j) ; if (sc_abarj != NULL) FREE(sc_abarj) ; return (FALSE) ; } dy_ftran(sc_abarj,FALSE) ; if (scaled == TRUE) { if (logical == TRUE) { Sj = rscale[i_orig] ; } else { Sj = 1/cscale[j_orig] ; } for (k = 1 ; k <= m ; k++) { sc_abarj[k] *= Sj ; } } } /* An inactive column. This is an architectural (we disposed of inactive logicals above). We need to acquire the unscaled column from orig_sys and filter for the active coefficients. Because orig_sys is unscaled, we need to premultiply with R (i.e., make the column look scaled) to cancel the 1/R attached to the basis inverse. On the other side, we don't need to multiply by 1/S to nullify column scaling because the column is unscaled to start with. Once we've prepped the column, do the ftran. */ else { aj_pk = NULL ; if (consys_getcol_pk(orig_sys,j_orig,&aj_pk) == FALSE) { errmsg(122,rtnnme,orig_sys->nme,"column", consys_nme(orig_sys,'v',j_orig,TRUE,NULL),j_orig) ; if (aj_pk != NULL) pkvec_free(aj_pk) ; return (FALSE) ; } if (scaled == TRUE) { for (k = 0 ; k < aj_pk->cnt ; k++) { i_orig = aj_pk->coeffs[k].ndx ; if (ACTIVE_CON(i_orig)) { i = dy_origcons[i_orig] ; sc_abarj[i] = rscale[i_orig]*aj_pk->coeffs[k].val ; } } } else { for (k = 0 ; k < aj_pk->cnt ; k++) { i_orig = aj_pk->coeffs[k].ndx ; if (ACTIVE_CON(i_orig)) { i = dy_origcons[i_orig] ; sc_abarj[i] = aj_pk->coeffs[k].val ; } } } pkvec_free(aj_pk) ; dy_ftran(sc_abarj,FALSE) ; } /* We've reached a common point for active and inactive columns. abar is mostly unscaled and still in the active system frame of reference. Allocate a vector to hold the final values in the original system's frame of reference. */ if (*p_abarj == NULL) { abarj = (double *) CALLOC((m_orig+1),sizeof(double)) ; *p_abarj = abarj ; } else { abarj = *p_abarj ; memset(abarj,0,((size_t) (m_orig+1)*sizeof(double))) ; } /* Copy over the values, doing the final unscaling if needed. This cancels a scaling factor (1/S) attached to the scaled basis inverse. The only trick here is that we need to account for logicals out of natural position. The correct scaling factor is 1/R[k], where k is the natural row for the logical, which may not be the row i where it's currently basic. */ if (scaled == TRUE) { for (i = 1 ; i <= m ; i++) { if (sc_abarj[i] == 0) continue ; j = dy_basis[i] ; i_orig = dy_actcons[i] ; if (j <= dy_sys->concnt) { j_orig = dy_actcons[j] ; abarj[i_orig] = sc_abarj[i]/rscale[j_orig] ; } else { j_orig = dy_actvars[j] ; abarj[i_orig] = sc_abarj[i]*cscale[j_orig] ; } setcleanzero(abarj[i_orig],dy_tols->zero) ; } } else { for (i = 1 ; i <= m ; i++) { if (sc_abarj[i] == 0) continue ; i_orig = dy_actcons[i] ; abarj[i_orig] = sc_abarj[i] ; setcleanzero(abarj[i_orig],dy_tols->zero) ; } } # ifndef DYLP_NDEBUG /* Now in orig_sys frame of reference. */ if (dy_opts->print.tableau >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n active nonzeros:") ; k = 0 ; for (i_orig = 1 ; i_orig <= m_orig ; i_orig++) { if (abarj[i_orig] != 0) { dyio_outfmt(dy_logchn,dy_gtxecho," (%s %d %g)", consys_nme(orig_sys,'c',i_orig,FALSE,NULL),i_orig, abarj[i_orig]) ; k++ ; if (k%3 == 0) dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t\t ") ; } } } # endif if (sc_abarj != NULL) FREE(sc_abarj) ; /* Ok, that was the easy part. Now we need to fill in the portion of abar contributed by inactive constraints --- the G matrix. In some respects this is straightforward. We have the unscaled portion of abarj contributed by the active system, and we need to calculate a - G abarj. Note that we are now working completely in the original frame of reference, except for a quick excursion to determine if a variable is basic in the active system. Of course, if there are no loadable constraints, we can skip all this. The translation here is pretty ugly. Given a, to find the appropriate row of abar, we do j_orig -> j -> j_bpos -> k_orig. In words, column in original system to column in active system to basis position in active position (row) to row in original system, which is the element we want in abarj. Nonbasic variables are not of interest except that we need the coefficient for our target column, tgt_j. */ if (dy_lp->sys.cons.loadable > 0) { ai = pkvec_new(orig_sys->maxrowlen) ; for (i_orig = 1 ; i_orig <= m_orig ; i_orig++) { if (ACTIVE_CON(i_orig)) continue ; # ifndef DYLP_NDEBUG if (dy_opts->print.tableau >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n Processing inactive row %s (%d)", consys_nme(orig_sys,'c',i_orig,FALSE,NULL),i_orig) ; } # endif if (consys_getrow_pk(orig_sys,i_orig,&ai) == FALSE) { errmsg(122,rtnnme,orig_sys->nme,"row", consys_nme(orig_sys,'c',i_orig,TRUE,NULL),i_orig) ; if (ai != NULL) pkvec_free(ai) ; if (abarj != NULL) FREE(abarj) ; return (FALSE) ; } abarij = 0 ; agj = 0 ; for (v = 0 ; v < ai->cnt ; v++) { j_orig = ai->coeffs[v].ndx ; if (j_orig == tgt_j) { agj = ai->coeffs[v].val ; } if (INACTIVE_VAR(j_orig)) { continue ; } j = dy_origvars[j_orig] ; j_bpos = dy_var2basis[j] ; if (j_bpos > 0) { k_orig = dy_actcons[j_bpos] ; # ifndef DYLP_NDEBUG if (dy_opts->print.tableau >= 5) { dyio_outfmt(dy_logchn,dy_gtxecho," (%s %d %d %g)", consys_nme(orig_sys,'v',j_orig,FALSE,NULL), j_orig,k_orig,ai->coeffs[v].val) ; } # endif abarij += ai->coeffs[v].val*abarj[k_orig] ; } } abarj[i_orig] = agj-abarij ; } if (ai != NULL) pkvec_free(ai) ; } # ifndef DYLP_NDEBUG if (dy_opts->print.tableau >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n nonzeros:") ; k = 0 ; for (i = 1 ; i <= m_orig ; i++) { if (abarj[i] != 0) { dyio_outfmt(dy_logchn,dy_gtxecho," (%d, %g)",i,abarj[i]) ; k++ ; if (k%5 == 0) dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t ") ; } } } # endif /* That should do it. */ return (TRUE) ; } bool dy_betai (lpprob_struct *orig_lp, int tgt_i, double **p_betai) /* Given a row i, this routine returns the corresponding unscaled row of the basis inverse, beta. Of course, it's not quite that simple. The client only knows about the original system, so tgt_i is the index of i in the original system. There are two cases: 1) If tgt_i is active, we need to determine its position in the active system and extract the corresponding row of the basis inverse, e inv(B). Then we need to translate this row into the original system frame of reference, padding it out with zeros. 2) If tgt_i is inactive, we need to synthesize the row that would result if the constraint were activated, g inv(B). The logical for the constraint is used as the basic variable. This is accomplished by translating g into the active frame of reference, executing the btran, and then translating back to the original system frame of reference, adding padding and a coefficient for the slack. It is assumed that orig_sys is unscaled. Clearly, things will go wrong if the constraint system passed in through orig_lp has been modified and no longer matches dylp's idea of the original system. In particular, note that dy_origvars and dy_origcons may well be attached to the scaled local copy of the original system. They WILL NOT be updated by changes to the client's unscaled copy. Parameters: orig_lp: lp problem structure tgt_i: constraint (row) index in original system p_betai: (i) vector to hold beta; if NULL, one will be allocated; if non-NULL, will be cleared to zero. (o) e inv(B), unscaled Returns: TRUE if the calculation is successful, FALSE otherwise. */ { int m_orig,n_orig,i_orig,j_orig ; int m,n,i,j,j_bpos,v ; bool scaled,active ; double *sc_betai,*betai ; const double *rscale, *cscale ; double Sj,gij ; pkvec_struct *ai ; consys_struct *orig_sys ; char *rtnnme = "dy_betai" ; # ifndef DYLP_NDEBUG int k_orig ; # endif # if DYLP_PARANOIA > 0 if (dy_std_paranoia(orig_lp,rtnnme) == FALSE) { return (FALSE) ; } if (p_betai == NULL) { errmsg(2,rtnnme,"betai") ; return (FALSE) ; } # endif /* Always check for valid data structures. */ if (flgoff(orig_lp->ctlopts,lpctlDYVALID)) { errmsg(396,rtnnme,orig_lp->consys->nme,"calculate row of basis inverse") ; return (FALSE) ; } /* Do a bit of setup. Pull constraint system sizes for convenient use. Grab the scaling vectors if we're scaled. */ orig_sys = orig_lp->consys ; m_orig = orig_sys->concnt ; n_orig = orig_sys->varcnt ; m = dy_sys->concnt ; n = dy_sys->varcnt ; scaled = dy_isscaled() ; if (scaled == TRUE) { dy_scaling_vectors(&rscale,&cscale) ; } # ifndef DYLP_NDEBUG if (dy_opts->print.tableau >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n generating row beta<%d>,",tgt_i) ; } # endif /* What sort of constraint do we have? */ if (ACTIVE_CON(tgt_i)) { active = TRUE ; i = dy_origcons[tgt_i] ; } else { active = FALSE ; i = -1 ; } # ifndef DYLP_NDEBUG if (dy_opts->print.tableau >= 1) { if (active == FALSE) { dyio_outfmt(dy_logchn,dy_gtxecho," inactive") ; } dyio_outfmt(dy_logchn,dy_gtxecho," constraint %s (%d)", consys_nme(orig_sys,'c',tgt_i,FALSE,NULL),tgt_i) ; if (active == TRUE) { dyio_outfmt(dy_logchn,dy_gtxecho,", basis pos'n %d",i) ; } dyio_outfmt(dy_logchn,dy_gtxecho,".") ; } # endif /* For an active constraint, we can retrieve the row as einv(B). But, we really have the scaled basis inverse inv(S)inv(B)inv(R). Hence it's convenient to use a vector with S in place of a unit coefficient to cancel the leading scale factor. We have to be careful to get the right scale factor --- the column scale factor for the logical for constraint i is 1/R, and this is true even if the logical is basic for some other constraint k. */ sc_betai = (double *) CALLOC((m+1),sizeof(double)) ; if (active == TRUE) { if (scaled == TRUE) { j = dy_basis[i] ; if (j > m) { j_orig = dy_actvars[j] ; Sj = cscale[j_orig] ; } else { i_orig = dy_actcons[j] ; Sj = 1/rscale[i_orig] ; } sc_betai[i] = Sj ; } else { sc_betai[i] = 1.0 ; } dy_btran(sc_betai) ; } /* For an inactive constraint, we have more work to do. We need to pull the row from orig_sys, apply column scaling, and drop the coefficients into the vector in basis order so that we can use btran. But since this is an inactive constraint, we don't have to worry about logicals. */ else { ai = NULL ; if (consys_getrow_pk(orig_sys,tgt_i,&ai) == FALSE) { errmsg(122,rtnnme,orig_sys->nme,"row", consys_nme(orig_sys,'c',tgt_i,FALSE,NULL),tgt_i) ; if (ai != NULL) pkvec_free(ai) ; if (sc_betai != NULL) FREE(sc_betai) ; return (FALSE) ; } if (scaled == TRUE) { for (v = 0 ; v < ai->cnt ; v++) { j_orig = ai->coeffs[v].ndx ; if (ACTIVE_VAR(j_orig)) { j = dy_origvars[j_orig] ; j_bpos = dy_var2basis[j] ; if (j_bpos > 0) { gij = cscale[j_orig]*ai->coeffs[v].val ; sc_betai[j_bpos] = -gij ; } } } } else { for (v = 0 ; v < ai->cnt ; v++) { j_orig = ai->coeffs[v].ndx ; if (ACTIVE_VAR(j_orig)) { j = dy_origvars[j_orig] ; j_bpos = dy_var2basis[j] ; if (j_bpos > 0) { sc_betai[j_bpos] = -ai->coeffs[v].val ; } } } } if (ai != NULL) { pkvec_free(ai) ; } dy_btran(sc_betai) ; } /* At this point, we have a row beta which is partially unscaled and in basis order. First order of business is to allocate a working array for the final product. */ if (*p_betai == NULL) { betai = (double *) CALLOC((m_orig+1),sizeof(double)) ; *p_betai = betai ; } else { betai = *p_betai ; memset(betai,0,((size_t) (m_orig+1)*sizeof(double))) ; } /* To complete the unscaling, we need to postmultiply by R. The array is in basis order, which is correct, but we need to reposition so that the row order matches the original system. */ if (scaled == TRUE) { for (i = 0 ; i <= m ; i++) { i_orig = dy_actcons[i] ; betai[i_orig] = sc_betai[i]*rscale[i_orig] ; } } else { for (i = 0 ; i <= m ; i++) { i_orig = dy_actcons[i] ; betai[i_orig] = sc_betai[i] ; } } if (active == FALSE) { betai[tgt_i] = 1.0 ; } if (sc_betai != NULL) FREE(sc_betai) ; # ifndef DYLP_NDEBUG if (dy_opts->print.tableau >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n nonzeros:") ; v = 0 ; for (i_orig = 1 ; i_orig <= m_orig ; i_orig++) { if (betai[i_orig] != 0) { if (ACTIVE_CON(i_orig)) { i = dy_origcons[i_orig] ; j = dy_basis[i] ; if (j <= m) { k_orig = dy_actcons[j] ; dyio_outfmt(dy_logchn,dy_gtxecho," (%s %d %g)", consys_nme(orig_sys,'v',n_orig+k_orig,FALSE,NULL), k_orig,betai[i_orig]) ; } else { j_orig = dy_actvars[j] ; dyio_outfmt(dy_logchn,dy_gtxecho," (%s %d %g)", consys_nme(orig_sys,'v',j_orig,FALSE,NULL),j_orig, betai[i_orig]) ; } } else { dyio_outfmt(dy_logchn,dy_gtxecho, " (%s %d %g)", consys_nme(orig_sys,'v',n_orig+i_orig,FALSE,NULL), i_orig,betai[i_orig]) ; } v++ ; if (v%3 == 0) dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t\t ") ; } } } # endif /* That's it, we're done. */ return (TRUE) ; } bool dy_abari (lpprob_struct *orig_lp, int tgt_i, double **p_abari, double **p_betai) /* This routine returns the value of row i of inv(B)A = inv(B) [ B N ] in p_abari. If p_betai is non-NULL, the routine returns row i of inv(B) [ A I ] where I is the identity matrix of coefficients of logicals. Row i of inv(B)A is still returned in p_abari, and e inv(B) I = beta is returned in p_betai. Given the primitives we have available (ftran, btran), the best we can do here is extract the relevant row of the basis inverse and calculate dot(beta,a) for j in N. Fortunately, we have a handy routine to calculate beta. Parameters: orig_lp: lp problem structure tgt_i: constraint (row) index in original system p_abari: (i) vector to hold abar; if NULL, one will be allocated; if non-NULL, will be cleared to zero. (o) e inv(B) A, unscaled p_betai: (i) vector to hold beta; if NULL, one will be allocated; if non-NULL, will be cleared to zero. (o) e inv(B), unscaled Returns: TRUE if the calculation is successful, FALSE otherwise. */ { int m_orig,n_orig,j_orig ; int i,j,j_bpos ; bool active,dologicals,retval ; double *betai,*abari ; consys_struct *orig_sys ; char *rtnnme = "dy_abari" ; # ifndef DYLP_NDEBUG int save_printlvl = dy_opts->print.tableau ; int v ; # endif # if DYLP_PARANOIA > 0 if (dy_std_paranoia(orig_lp,rtnnme) == FALSE) { return (FALSE) ; } if (p_abari == NULL) { errmsg(2,rtnnme,"abari") ; return (FALSE) ; } # endif if (p_betai != NULL) { dologicals = TRUE ; } /* Always check for valid data structures. */ if (flgoff(orig_lp->ctlopts,lpctlDYVALID)) { errmsg(396,rtnnme,orig_lp->consys->nme,"calculate row of basis inverse") ; return (FALSE) ; } /* Do a bit of setup. Pull constraint system sizes for convenient use. */ orig_sys = orig_lp->consys ; m_orig = orig_sys->concnt ; n_orig = orig_sys->varcnt ; # ifndef DYLP_NDEBUG if (dy_opts->print.tableau >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n generating row abar<%d>,",tgt_i) ; } # endif /* What sort of constraint do we have? */ if (ACTIVE_CON(tgt_i)) { active = TRUE ; i = dy_origcons[tgt_i] ; } else { active = FALSE ; i = -1 ; } # ifndef DYLP_NDEBUG if (dy_opts->print.tableau >= 1) { if (active == FALSE) { dyio_outfmt(dy_logchn,dy_gtxecho," inactive") ; } dyio_outfmt(dy_logchn,dy_gtxecho," constraint %s (%d)", consys_nme(orig_sys,'c',tgt_i,FALSE,NULL),tgt_i) ; if (active == TRUE) { dyio_outfmt(dy_logchn,dy_gtxecho,", basis pos'n %d",i) ; } dyio_outfmt(dy_logchn,dy_gtxecho,".") ; } # endif /* Call dy_betai to get row beta of the basis inverse. */ betai = *p_betai ; # ifndef DYLP_NDEBUG dy_opts->print.tableau = 0 ; retval = dy_betai(orig_lp,tgt_i,&betai) ; dy_opts->print.tableau = save_printlvl ; # else retval = dy_betai(orig_lp,tgt_i,&betai) ; # endif if (retval == FALSE) { errmsg(952,rtnnme,orig_sys->nme,"row",tgt_i,"constraint", consys_nme(orig_sys,'c',tgt_i,FALSE,NULL),tgt_i) ; if (betai != NULL) FREE(betai) ; return (FALSE) ; } /* Get a vector to return abar. */ if (*p_abari == NULL) { abari = (double *) CALLOC((n_orig+1),sizeof(double)) ; *p_abari = abari ; } else { abari = *p_abari ; memset(abari,0,((size_t) (n_orig+1)*sizeof(double))) ; } /* Now walk the columns of orig_sys calculating abar = dot(beta,a). We can help ourselves a bit here by recognising basic columns, which will resolve to 0 or 1, depending on whether the variable is basic for this row. Other than that, however, active or inactive is irrelevant. */ for (j_orig = 1 ; j_orig <= n_orig ; j_orig++) { if (ACTIVE_VAR(j_orig)) { j = dy_origvars[j_orig] ; j_bpos = dy_var2basis[j] ; if (j_bpos > 0) { if (j_bpos == i) { abari[j_orig] = 1.0 ; } else { abari[j_orig] = 0.0 ; } continue ; } } abari[j_orig] = consys_dotcol(orig_sys,j_orig,betai) ; } # ifndef DYLP_NDEBUG if (dy_opts->print.tableau >= 4) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n nonzeros:") ; v = 0 ; for (j_orig = 1 ; j_orig <= n_orig ; j_orig++) { if (abari[j_orig] != 0) { dyio_outfmt(dy_logchn,dy_gtxecho," (%s %d %g)", consys_nme(orig_sys,'v',j_orig,FALSE,NULL),j_orig, abari[j_orig]) ; v++ ; if (v%3 == 0) dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t\t ") ; } } } # endif /* Did the client ask for the columns corresponding to logicals? If so, hand back beta. Otherwise, we're done with it. */ if (dologicals == TRUE) { *p_betai = betai ; } else { if (betai != NULL) FREE(betai) ; } /* That's it, we're done. */ return (TRUE) ; } DyLP-1.6.0/DyLP/src/Dylp/dy_consys_scaling.c0000644000076700007670000004120611026315405015451 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains utility routines for scaling a constraint matrix A. There are routines to calculate scaling matrices using geometric mean and equilibration scaling. Let a = max{j} |a|, a = min{j s.t. a != 0} |a|. Geometric mean scaling scales a row (column) by dividing all coefficients by sqrt(a*a). The process iterates until the change in sqrt(a/a) for the matrix as a whole is less than the tolerance or exceeds the maximum allowable number of iterations. << Interestingly, in glpk the scaling is sqrt(a/a)! Clp uses a fixed iteration limit of 3, no tolerance on change from iteration to iteration. >> Equilibration scaling scales the row (column) by dividing all coefficients by a, so that the largest element in the row (column) is 1. The overall scaling algorithm is iterated geometric scaling followed by a final equilibration scaling. The result is a pair of scaling vectors R and S which can be treated as diagonal matrices to produce the scaled matrix scaled(A) = R*A*S. */ #include "dylib_errs.h" #include "dylib_std.h" #include "dy_consys.h" #define CONSYS_SCALING_DEBUG 0 #if (CONSYS_SCALING_DEBUG > 0) extern ioid dy_logchn ; extern bool dy_gtxecho ; #endif static char sccsid[] UNUSED = "@(#)dy_consys_scaling.c 4.8 10/15/05" ; static char svnid[] UNUSED = "$Id: dy_consys_scaling.c 240 2008-06-18 23:32:21Z lou $" ; bool consys_evalsys (consys_struct *consys, double *p_scm, int *p_gecnt) /* This routine evaluates the constraint system given as a parameter, determining the minimum and maximum coefficients and calculating an initial value for the geometric mean figure of merit. The maximum coefficient is defined as amax = max{i,j} |a|. The minimum coefficient is defined as amin = min{i,j, a != 0} |a|. The figure of merit is sqrt(amax/amin). Parameters: consys: constraint system to be evaluated scm: (o) sqrt(amax/amin) gecnt: (o) the number of >= inequalities in the constraint system Returns: TRUE if the evaluation concludes without error, FALSE otherwise. A FALSE return is possible only when we're paranoid. */ { int i,gecnt ; double amax,amin,aij ; double *rsc,*csc ; rowhdr_struct *rowi ; coeff_struct *coeffij ; # ifdef DYLP_PARANOIA char *rtnnme = "consys_evalsys" ; if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (FALSE) ; } if (consys->mtx.rows == NULL) { errmsg(2,rtnnme,"row header") ; return (FALSE) ; } if (consys->mtx.cols == NULL) { errmsg(2,rtnnme,"column header") ; return (FALSE) ; } if (consys->ctyp == NULL) { errmsg(101,rtnnme,consys->nme,"constraint type vector") ; return (FALSE) ; } if (p_scm == NULL) { errmsg(2,rtnnme,"scm") ; return (FALSE) ; } if (p_gecnt == NULL) { errmsg(2,rtnnme,"gecnt") ; return (FALSE) ; } # endif *p_scm = quiet_nan(0) ; *p_gecnt = -1 ; rsc = consys->rowscale ; csc = consys->colscale ; amax = 0.0 ; amin = consys->inf ; gecnt = 0 ; /* Open a loop and scan the rows of the constraint matrix. */ for (i = 1 ; i <= consys->concnt ; i++) { rowi = consys->mtx.rows[i] ; # ifdef DYLP_PARANOIA if (rowi == NULL) { errmsg(103,rtnnme,consys->nme,"row",i) ; return (FALSE) ; } if (rowi->ndx != i) { errmsg(126,rtnnme,consys->nme,"row",rowi,rowi->ndx,i,rowi) ; return (FALSE) ; } if ((rowi->coeffs == NULL && rowi->len != 0) || (rowi->coeffs != NULL && rowi->len == 0)) { errmsg(134,rtnnme,consys->nme,"row",rowi->nme,i,rowi->len, (rowi->coeffs == NULL)?"null":"non-null") ; return (FALSE) ; } # endif if (consys->ctyp[i] == contypGE) { gecnt++ ; } for (coeffij = rowi->coeffs ; coeffij != NULL ; coeffij = coeffij->rownxt) { # ifdef DYLP_PARANOIA if (coeffij->rowhdr != rowi) { errmsg(125,rtnnme,"rowhdr",coeffij,"row",rowi->nme,i) ; return (FALSE) ; } if (coeffij->colhdr == NULL) { errmsg(125,rtnnme,"colhdr",coeffij,"row",rowi->nme,i) ; return (FALSE) ; } if (coeffij->colhdr->ndx <= 0 || coeffij->colhdr->ndx > consys->varcnt) { errmsg(102,rtnnme,consys->nme,"column",coeffij->colhdr->ndx,1, consys->varcnt) ; return (FALSE) ; } # endif aij = coeffij->val ; if (aij == 0.0) continue ; aij = fabs(aij) ; if (rsc != NULL) aij *= rsc[i] ; if (csc != NULL) aij *= csc[coeffij->colhdr->ndx] ; if (aij > amax) amax = aij ; if (aij < amin) amin = aij ; } } /* Record the results and return. Allow for 0x0 systems; they happen for (more or less) legitimate reasons. */ if (consys->concnt == 0) { *p_gecnt = 0 ; *p_scm = 1.0 ; consys->maxaij = 0 ; consys->minaij = 0 ; } else { *p_gecnt = gecnt ; *p_scm = sqrt(amax/amin) ; consys->maxaij = amax ; consys->minaij = amin ; } return (TRUE) ; } bool consys_geomscale (consys_struct *consys, double **p_rowscale, double **p_colscale) /* Given the constraint matrix A (consys), this routine will calculate diagonal scaling matrices R (rowscale) and S (colscale) using geometric mean scaling. The routine assumes it is scaling the matrix R*A*S, and the parameters rowscale and colscale are updated with new scaling coefficients. The constraint system is >> not << scaled. This routine is light on paranoia, on the assumption that the matrix has just been scanned with consys_evalsys, which is heavy on paranoia. Parameters: consys: constraint system p_rowscale: (i) initial row scaling coefficients; created if null (o) revised row scaling coefficients p_colscale: (i) initial column scaling coefficients; created if null (o) revised column scaling coefficients Returns: TRUE if no errors occurred while calculating the scaling coefficients, FALSE otherwise. */ { int i,j,iter ; double sqm,sqm_old,eps,aij,rcmax,rcmin,maxaij,minaij ; double *rowscale,*colscale ; coeff_struct *coeffij ; # if defined(DYLP_PARANOIA) || CONSYS_SCALING_DEBUG >= 1 char *rtnnme = "consys_geomscale" ; if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (FALSE) ; } if (consys->mtx.rows == NULL) { errmsg(2,rtnnme,"row header") ; return (FALSE) ; } if (consys->mtx.cols == NULL) { errmsg(2,rtnnme,"column header") ; return (FALSE) ; } if (p_rowscale == NULL) { errmsg(2,rtnnme,"&rowscale") ; return (FALSE) ; } if (p_colscale == NULL) { errmsg(2,rtnnme,"&colscale") ; return (FALSE) ; } # endif /* If the client didn't supply initial scaling matrices, create them now and initialise them to 1. */ if (*p_rowscale == NULL) { rowscale = (double *) MALLOC((consys->concnt+1)*sizeof(double)) ; rowscale[0] = 0 ; for (i = 1 ; i <= consys->concnt ; i++) rowscale[i] = 1.0 ; } else { rowscale = *p_rowscale ; } if (*p_colscale == NULL) { colscale = (double *) MALLOC((consys->varcnt+1)*sizeof(double)) ; colscale[0] = 0 ; for (j = 1 ; j <= consys->varcnt ; j++) colscale[j] = 1.0 ; } else { colscale = *p_colscale ; } sqm_old = sqrt(consys->maxaij/consys->minaij) ; eps = 1.0 ; /* Open up the outer loop to control the number of scaling iterations. For each scaling iteration, scale by row, then by column. */ for (iter = 1 ; iter <= 20 && eps > .05 ; iter++) { maxaij = 0.0 ; minaij = consys->inf ; for (i = 1 ; i <= consys->concnt ; i++) { coeffij = consys->mtx.rows[i]->coeffs ; if (coeffij == NULL) continue ; rcmax = 0.0 ; rcmin = consys->inf ; for ( ; coeffij != NULL ; coeffij = coeffij->rownxt) { aij = fabs(coeffij->val) ; if (aij == 0) continue ; j = coeffij->colhdr->ndx ; aij *= colscale[j] ; if (aij > rcmax) rcmax = aij ; if (aij < rcmin) rcmin = aij ; } rowscale[i] = 1/sqrt(rcmax*rcmin) ; if (rowscale[i]*rcmax > maxaij) maxaij = rowscale[i]*rcmax ; if (rowscale[i]*rcmin < minaij) minaij = rowscale[i]*rcmin ; } # if (CONSYS_SCALING_DEBUG >= 1) dyio_outfmt(dy_logchn,dy_gtxecho, "\n %s: iter %d: %g <= a <= %g, geom = %g", rtnnme,iter,minaij,maxaij,sqrt(maxaij/minaij)) ; # endif maxaij = 0.0 ; minaij = consys->inf ; for (j = 1 ; j <= consys->varcnt ; j++) { coeffij = consys->mtx.cols[j]->coeffs ; if (coeffij == NULL) continue ; rcmax = 0.0 ; rcmin = consys->inf ; for ( ; coeffij != NULL ; coeffij = coeffij->colnxt) { aij = fabs(coeffij->val) ; if (aij == 0) continue ; i = coeffij->rowhdr->ndx ; aij *= rowscale[i] ; if (aij > rcmax) rcmax = aij ; if (aij < rcmin) rcmin = aij ; } colscale[j] = 1/sqrt(rcmax*rcmin) ; if (colscale[j]*rcmax > maxaij) maxaij = colscale[j]*rcmax ; if (colscale[j]*rcmin < minaij) minaij = colscale[j]*rcmin ; } sqm = sqrt(maxaij/minaij) ; eps = (sqm_old-sqm)/sqm_old ; # if (CONSYS_SCALING_DEBUG >= 1) dyio_outfmt(dy_logchn,dy_gtxecho, "\n %s: iter %d: %g <= a <= %g, geom = %g, eps = %g", rtnnme,iter,minaij,maxaij,sqm,eps) ; # endif sqm_old = sqm ; } consys->maxaij = maxaij ; consys->minaij = minaij ; *p_rowscale = rowscale ; *p_colscale = colscale ; return (TRUE) ; } bool consys_equiscale (consys_struct *consys, double **p_rowscale, double **p_colscale) /* Given the constraint matrix A (consys), this routine will calculate diagonal scaling matrices R (rowscale) and S (colscale) using equilibration scaling. The routine assumes it is scaling the matrix R*A*S, and the parameters rowscale and colscale are updated with new scaling coefficients. The constraint system is >> not << scaled. This routine is light on paranoia, on the assumption that the matrix has just been scanned with consys_evalsys, which is heavy on paranoia. Parameters: consys: constraint system p_rowscale: (i) initial row scaling coefficients; created if null (o) revised row scaling coefficients p_colscale: (i) initial column scaling coefficients; created if null (o) revised column scaling coefficients Returns: TRUE if no errors occurred while calculating the scaling coefficients, FALSE otherwise. */ { int i,j ; double sqm,sqm_old,eps,aij,rcmax,rcmin,maxaij,minaij ; double *rowscale,*colscale ; coeff_struct *coeffij ; # if defined(DYLP_PARANOIA) || CONSYS_SCALING_DEBUG >= 1 char *rtnnme = "consys_equiscale" ; if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (FALSE) ; } if (consys->mtx.rows == NULL) { errmsg(2,rtnnme,"row header") ; return (FALSE) ; } if (consys->mtx.cols == NULL) { errmsg(2,rtnnme,"column header") ; return (FALSE) ; } if (p_rowscale == NULL) { errmsg(2,rtnnme,"&rowscale") ; return (FALSE) ; } if (p_colscale == NULL) { errmsg(2,rtnnme,"&colscale") ; return (FALSE) ; } # endif /* If the client didn't supply initial scaling matrices, create them now and initialise them to 1. */ if (*p_rowscale == NULL) { rowscale = (double *) MALLOC((consys->concnt+1)*sizeof(double)) ; rowscale[0] = 0 ; for (i = 1 ; i <= consys->concnt ; i++) rowscale[i] = 1.0 ; } else { rowscale = *p_rowscale ; } if (*p_colscale == NULL) { colscale = (double *) MALLOC((consys->varcnt+1)*sizeof(double)) ; colscale[0] = 0 ; for (j = 1 ; j <= consys->varcnt ; j++) colscale[j] = 1.0 ; } else { colscale = *p_colscale ; } sqm_old = sqrt(consys->maxaij/consys->minaij) ; eps = 1.0 ; /* Update the column scaling vector. */ maxaij = 0.0 ; minaij = consys->inf ; for (j = 1 ; j <= consys->varcnt ; j++) { coeffij = consys->mtx.cols[j]->coeffs ; if (coeffij == NULL) continue ; rcmax = 0.0 ; rcmin = consys->inf ; for ( ; coeffij != NULL ; coeffij = coeffij->colnxt) { aij = fabs(coeffij->val) ; if (aij == 0) continue ; i = coeffij->rowhdr->ndx ; aij *= rowscale[i] ; if (aij > rcmax) rcmax = aij ; if (aij < rcmin) rcmin = aij ; } colscale[j] = 1/rcmax ; if (colscale[j]*rcmax > maxaij) maxaij = colscale[j]*rcmax ; if (colscale[j]*rcmin < minaij) minaij = colscale[j]*rcmin ; } sqm = sqrt(maxaij/minaij) ; eps = (sqm_old-sqm)/sqm_old ; # if (CONSYS_SCALING_DEBUG >= 1) dyio_outfmt(dy_logchn,dy_gtxecho, "\n %s: %g <= a <= %g, geom = %g, eps = %g", rtnnme,minaij,maxaij,sqm,eps) ; # endif consys->maxaij = maxaij ; consys->minaij = minaij ; *p_rowscale = rowscale ; *p_colscale = colscale ; return (TRUE) ; } bool consys_applyscale (consys_struct *consys, bool convctyp, double *rowscale, double *colscale) /* This routine applies the scaling matrices rowscale and colscale to the constraint system in consys. In addition to the coefficient matrix, the scaling is applied to the objective, right-hand-side, and bounds, if they are attached. Note that constraint upper and lower bounds are NOT scaled. They should be recalculated. Note that dylp uses negative rowscale values to convert >= constraints to <= constraints. If this is occuring, convctyp should be TRUE for exactly one call. Arguably, this routine could be made more efficient in the case where we're scaling for the sole purpose of flipping >= constraints to <= constraints. Just scan rowscale and change constraint system values only for values that are -1.0. It's not clear that this case occurs often enough to be worth the trouble. Binary coefficient matrices, maybe. Parameters: consys: constraint system to be scaled convctyp: TRUE if the routine should scan rowscale for negative values and convert >= constraints to <= constraints; FALSE otherwise rowscale: row scaling matrix colscale: column scaling matrix (may be NULL under the special condition explained above) Returns: TRUE if the system is successfully scaled, FALSE otherwise. */ { int i,j ; double aij,maxaij,minaij ; coeff_struct *coeffij ; # ifdef DYLP_PARANOIA char *rtnnme = "consys_applyscale" ; if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (FALSE) ; } if (consys->mtx.rows == NULL) { errmsg(2,rtnnme,"row header") ; return (FALSE) ; } if (consys->mtx.cols == NULL) { errmsg(2,rtnnme,"column header") ; return (FALSE) ; } if (rowscale == NULL) { errmsg(2,rtnnme,"rowscale") ; return (FALSE) ; } if (colscale == NULL) { errmsg(2,rtnnme,"colscale") ; return (FALSE) ; } # endif /* Perform row scaling on the coefficient matrix and right-hand-side vectors. */ for (i = 1 ; i <= consys->concnt ; i++) { coeffij = consys->mtx.rows[i]->coeffs ; for ( ; coeffij != NULL ; coeffij = coeffij->rownxt) coeffij->val *= rowscale[i] ; } if (consys->rhs != NULL) { for (i = 1 ; i <= consys->concnt ; i++) consys->rhs[i] *= rowscale[i] ; } if (consys->rhslow != NULL) { for (i = 1 ; i <= consys->concnt ; i++) consys->rhslow[i] *= rowscale[i] ; } if (convctyp == TRUE && consys->ctyp != NULL) { for (i = 1 ; i <= consys->concnt ; i++) { if (rowscale[i] < 0) { # ifdef DYLP_PARANOIA if (consys->ctyp[i] != contypGE) { errmsg(1,rtnnme,__LINE__) ; return (FALSE) ; } # endif consys->ctyp[i] = contypLE ; } } } /* Perform column scaling on the coefficient matrix, objective coefficients, and bounds. The bounds are scaled by 1/S so that the implicit coefficients remain 1.0. Finite infinity is a pain here: We have to test for it in bounds vectors and avoid scaling, because after scaling, it won't be infinity any more. */ maxaij = 0.0 ; minaij = consys->inf ; for (j = 1 ; j <= consys->varcnt ; j++) { coeffij = consys->mtx.cols[j]->coeffs ; for ( ; coeffij != NULL ; coeffij = coeffij->colnxt) { coeffij->val *= colscale[j] ; if (coeffij->val != 0.0) { aij = fabs(coeffij->val) ; if (aij < minaij) minaij = aij ; if (aij > maxaij) maxaij = aij ; } } } if (consys->obj != NULL) { for (j = 1 ; j <= consys->varcnt ; j++) consys->obj[j] *= colscale[j] ; } if (flgoff(consys->opts,CONSYS_FININF)) { if (consys->vlb != NULL) { for (j = 1 ; j <= consys->varcnt ; j++) consys->vlb[j] /= colscale[j] ; } if (consys->vub != NULL) { for (j = 1 ; j <= consys->varcnt ; j++) consys->vub[j] /= colscale[j] ; } } else { if (consys->vlb != NULL) { for (j = 1 ; j <= consys->varcnt ; j++) { if (consys->vlb[j] > -consys->inf) consys->vlb[j] /= colscale[j] ; } } if (consys->vub != NULL) { for (j = 1 ; j <= consys->varcnt ; j++) { if (consys->vub[j] < consys->inf) consys->vub[j] /= colscale[j] ; } } } consys->maxaij = maxaij ; consys->minaij = minaij ; return (TRUE) ; } DyLP-1.6.0/DyLP/src/Dylp/glplib.h0000644000076700007670000001172110643314772013226 0ustar /* glplib.h */ /*---------------------------------------------------------------------- -- Copyright (C) 2000, 2001, 2002 Andrew Makhorin , -- Department for Applied Informatics, Moscow Aviation -- Institute, Moscow, Russia. All rights reserved. -- -- This file is a part of GLPK (GNU Linear Programming Kit). -- -- Licensed under the Common Public License (CPL) by permission of the -- author for inclusion in the DyLP LP distribution. ----------------------------------------------------------------------*/ /* @(#)glplib.h 1.1 10/18/02 svn/cvs: $Id: glplib.h 158 2007-07-06 01:25:14Z lou $ */ #ifndef _GLPLIB_H #define _GLPLIB_H #define save_pointer dy_glp_save_pointer #define read_pointer dy_glp_read_pointer #define init_lib_env dy_glp_init_lib_env #define get_env_ptr dy_glp_get_env_ptr #define free_lib_env dy_glp_free_lib_env #define print dy_glp_print #define fault dy_glp_fault #define _insist dy_glp_insist #define watch dy_glp_watch #define umalloc dy_glp_umalloc #define ucalloc dy_glp_ucalloc #define ufree dy_glp_ufree #define create_pool dy_glp_create_pool #define get_atom dy_glp_get_atom #define free_atom dy_glp_free_atom #define get_atomv dy_glp_get_atomv #define clear_pool dy_glp_clear_pool #define delete_pool dy_glp_delete_pool extern void save_pointer(void *ptr); /* save a pointer */ extern void *read_pointer(void); /* obtain a pointer */ typedef struct ENV ENV; typedef struct MEM MEM; struct ENV { /* library environmental block */ MEM *mem_ptr; /* pointer to the linked list of allocated memory blocks */ int mem_limit; /* maximal amount of memory (in bytes) available for dynamic allocation */ int mem_total; /* total amount of currently allocated memory (in bytes; is the sum of the size fields over all memory block descriptors) */ int mem_tpeak; /* peak value of mem_total */ int mem_count; /* total number of currently allocated memory blocks */ int mem_cpeak; /* peak value of mem_count */ }; extern int init_lib_env(void); /* initialize library environment */ extern ENV *get_env_ptr(void); /* obtain a pointer to the environmental block */ extern int free_lib_env(void); /* deinitialize library environment */ extern void print(const char *fmt, ...); /* print informative message */ extern void fault(const char *fmt, ...); /* print error message and terminate program execution */ #define insist(expr) \ ((void)((expr) || (_insist(#expr, __FILE__, __LINE__), 1))) extern void _insist(const char *expr, const char *file, int line); /* check for logical condition */ extern double watch(void); /* take reading of stop-watch */ /* some processors need data to be properly aligned; the align_boundary macro defines the boundary which should fit for all data types; the align_datasize macro allows enlarging size of data item in order the immediately following data of any type should be properly aligned */ #define align_boundary sizeof(double) #define align_datasize(size) \ ((((size) + (align_boundary - 1)) / align_boundary) * align_boundary) struct MEM { /* memory block descriptor */ int size; /* size of block (in bytes, including descriptor) */ int flag; /* descriptor flag */ MEM *prev; /* pointer to descriptor of the previous block */ MEM *next; /* pointer to descriptor of the next block */ /* actual data start here (there may be a "hole" between the next field and actual data because of data alignment) */ }; extern void *umalloc(int size); /* allocate memory block */ extern void *ucalloc(int nmemb, int size); /* allocate memory block */ extern void ufree(void *ptr); /* free memory block */ typedef struct POOL POOL; struct POOL { /* memory pool (a set of atoms) */ int size; /* size of each atom in bytes (1 <= size <= 256); if size = 0, different atoms may have different sizes */ void *avail; /* pointer to the linked list of free atoms */ void *link; /* pointer to the linked list of allocated blocks (it points to the last recently allocated block) */ int used; /* number of bytes used in the last allocated block */ void *stock; /* pointer to the linked list of free blocks */ int count; /* total number of allocated atoms */ }; extern POOL *create_pool(int size); /* create memory pool */ extern void *get_atom(POOL *pool); /* allocate atom of fixed size */ extern void free_atom(POOL *pool, void *ptr); /* free an atom */ extern void *get_atomv(POOL *pool, int size); /* allocate atom of variable size */ extern void clear_pool(POOL *pool); /* free all atoms */ extern void delete_pool(POOL *pool); /* delete memory pool */ #endif /* eof */ DyLP-1.6.0/DyLP/src/Dylp/dy_duenna.c0000644000076700007670000015510711262455613013723 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2005 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains la Duenna, which fusses after each pivot. A spin doctor might have been better, but I tend toward anachronism. There are also routines that handle refactoring and primal and dual accuracy checks. */ #define DYLP_INTERNAL #include "dylp.h" static char sccsid[] UNUSED = "@(#)dy_duenna.c 4.6 10/15/05" ; static char svnid[] UNUSED = "$Id: dy_duenna.c 301 2009-10-05 20:48:11Z lou $" ; static bool groombasis () /* This routine runs after direct recalculation of the primal variables to make sure no basic variables were misclassified due to accumulated numeric inaccuracy in the course of iterative updates. If it finds a misclassified variable, it resets the status to the appropriate value. The intent of the routine is to roll with minor corruption due to accumulated numeric inaccuracy. Deciding whether corruption is minor, however, is not entirely simple. We no longer have the previous variable values, so we're just guessing by comparing the old status with what the status ought to be. From experience, having the old values wouldn't improve things much. The grooming tolerance (i.e., the amount of error we'll tolerate before considering an abort) is large: 1.0e05*(bogus multiplier)*(pfeas tolerance). The rules for considering an abort are pretty simple: * If we started at a bound, we have to remain within the grooming tolerance for the bound value. * If we move over a bound, we have to remain within the grooming tolerance for the bound value. * Anything else is grounds for an error. In the end, though, it seems to require informed human judgement. When you're debugging, aborts are often useful. When you're doing production runs, well, might as well let the accuracy maintenance algorithms earn their keep. dylp provides an option, which you can set to silent, warn, or abort. Status codes BFX and BFR are assigned initially based on the lower and upper bounds. BFR should never change, but BFX can change to BLLB or BUUB if somewhere the variable goes infeasible. Groombasis may need to set BFX when a variable moves from out-of-bound (BLLB, BUUB) to at-bound (BLB, BUB), and the bounds are equal. One more complication: If the primal antidegeneracy mechanism is active, the true value (dy_x) of variables in the degenerate set (dy_degenset[bpos] > 0) must be at bound. For variables not in the degenerate set, the value in dy_x should match the value in dy_xbasic. If either of these assertions fails, inaccuracy has accumulated as we pivoted the permuted values. The only way to restore accuracy is to back out the antidegeneracy mechanism, begin the basis scan again, fix whatever's necessary, and request a refactor. The routine always checks the full basis (even if we're going to fail, might as well know the extent of the damage). Parameters: none Returns: TRUE if the basis is correct or only correctable errors were encountered; FALSE otherwise. */ { int i,ipos,staterrs ; double xi,*vlb,vlbi,*vub,vubi,tol ; flags stati,newstati,quali ; char statbuf[32] ; bool retval,statok,backout ; const char *rtnnme = "groombasis" ; # ifndef DYLP_NDEBUG int print ; # endif # ifndef DYLP_NDEBUG switch (dy_lp->phase) { case dyPRIMAL1: { print = dy_opts->print.phase1 ; break ; } case dyPRIMAL2: { print = dy_opts->print.phase2 ; break ; } case dyDUAL: { print = dy_opts->print.phase2 ; break ; } case dyADDCON: { print = dy_opts->print.conmgmt ; break ; } case dyFORCEDUAL: case dyFORCEPRIMAL: case dyFORCEFULL: { print = maxx(dy_opts->print.conmgmt,dy_opts->print.varmgmt) ; break ; } default: { errmsg(1,rtnnme,__LINE__) ; return (FALSE) ; } } # endif vlb = dy_sys->vlb ; vub = dy_sys->vub ; tol = dy_tols->pfeas*dy_tols->bogus*1.0e05 ; backout = FALSE ; retval = TRUE ; /* The outer loop is here to allow us to restart the grooming operation after backing out the antidegeneracy mechanism. If things go well, we won't need it. The inner loop walks the basis, checking the variables. */ while (TRUE) { staterrs = 0 ; for (ipos = 1 ; ipos <= dy_sys->concnt ; ipos++) { i = dy_basis[ipos] ; stati = getflg(dy_status[i],vstatSTATUS) ; quali = getflg(dy_status[i],vstatQUALS) ; vlbi = vlb[i] ; vubi = vub[i] ; statok = TRUE ; /* If the antidegeneracy mechanism is active in primal simplex, check that the true value is as it should be. Variables in the degenerate set should be at bound (but allow for the fact we might have pivoted a free variable into the slot); variables not in the degenerate set should be unchanged and thus should agree with the values held in xbasic. If we've lost accuracy, call dy_degenout to back out the antidegeneracy perturbations and start grooming the basis from the beginning. We can ignore the return value from dy_degenout --- it'll be REQCHK, and once we're done grooming the basis we'll be doing just that. */ if (dy_lp->degen > 0 && (dy_lp->phase == dyPRIMAL1 || dy_lp->phase == dyPRIMAL2)) { xi = dy_x[i] ; if (dy_degenset[ipos] > 0) { # ifdef DYLP_PARANOIA if (dy_lp->degen < dy_degenset[ipos]) { errmsg(390,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,ipos,dy_degenset[ipos], consys_nme(dy_sys,'v',i,FALSE,NULL),i,dy_prtvstat(stati), dy_lp->degen) ; retval = FALSE ; continue ; } # endif if (atbnd(xi,vlbi)) { /* dy_x[i] = vlbi ; */ } else if (atbnd(xi,vubi)) { /* dy_x[i] = vubi ; */ } else if (flgoff(stati,vstatBFR)) { backout = TRUE ; } } else { if (atbnd(dy_xbasic[ipos],xi)) { /* dy_xbasic[ipos] = xi ; */ } else { backout = TRUE ; } } if (backout == TRUE) { # ifndef DYLP_NDEBUG if (print >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tbacking out antidegeneracy at (%s)%d due to accumulated", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; dyio_outfmt(dy_logchn,dy_gtxecho," error;\n\ttrue %s (%d) = %g ;", consys_nme(dy_sys,'v',i,FALSE,NULL),i,xi) ; if (dy_degenset[ipos] > 0) { if (fabs(xi-vlbi) < fabs(xi-vubi)) { dyio_outfmt(dy_logchn,dy_gtxecho, " lb = %g ; |x-lb| = %g, tol %g.", vlbi,fabs(xi-vlbi), dy_tols->zero*(1+fabs(vlbi))) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho, " ub = %g ; |x-ub| = %g, tol %g.", vubi,fabs(xi-vubi), dy_tols->zero*(1+fabs(vubi))) ; } } else { dyio_outfmt(dy_logchn,dy_gtxecho, "xbasic = %g ; |x-xbasic| = %g, tol %g.", dy_xbasic[ipos],fabs(xi-dy_xbasic[ipos]), dy_tols->zero*(1+fabs(xi))) ; } } # endif (void) dy_degenout(0) ; break ; } } /* Do the case checking. Nothing complicated here, just a lot of cases. */ xi = dy_xbasic[ipos] ; newstati = stati ; switch (stati) { case vstatBLLB: { if (!belowbnd(xi,vlbi)) { if (!withintol(xi,vlbi,tol*(1.0+fabs(vlbi)))) statok = FALSE ; if (atbnd(xi,vlbi)) { if (atbnd(vlbi,vubi)) newstati = vstatBFX ; else newstati = vstatBLB ; /* xi = vlbi ; */ } else if (belowbnd(xi,vubi)) { newstati = vstatB ; } else if (atbnd(xi,vubi)) { newstati = vstatBUB ; /* xi = vubi ; */ } else { newstati = vstatBUUB ; } } break ; } case vstatBLB: { if (!atbnd(xi,vlbi)) { if (!withintol(xi,vlbi,tol*(1.0+fabs(vlbi)))) statok = FALSE ; if (xi < vlbi) { newstati = vstatBLLB ; } else if (belowbnd(xi,vubi)) { newstati = vstatB ; } else if (atbnd(xi,vubi)) { newstati = vstatBUB ; /* xi = vubi ; */ } else { newstati = vstatBUUB ; } } else { /* xi = vlbi ; */ } break ; } case vstatB: { if (!(abovebnd(xi,vlbi) && belowbnd(xi,vubi))) { if (atbnd(xi,vlbi)) { newstati = vstatBLB ; /* xi = vlbi ; */ } else if (atbnd(xi,vubi)) { newstati = vstatBUB ; /* xi = vubi ; */ } else if (xi > vubi) { if (!withintol(xi,vubi,tol*(1.0+fabs(vlbi)))) statok = FALSE ; newstati = vstatBUUB ; } else { if (!withintol(xi,vlbi,tol*(1.0+fabs(vlbi)))) statok = FALSE ; newstati = vstatBLLB ; } } break ; } case vstatBUB: { if (!atbnd(xi,vubi)) { if (!withintol(xi,vubi,tol*(1.0+fabs(vubi)))) statok = FALSE ; if (xi > vubi) { newstati = vstatBUUB ; } else if (abovebnd(xi,vlbi)) { newstati = vstatB ; } else if (atbnd(xi,vlbi)) { newstati = vstatBLB ; /* xi = vlbi ; */ } else { newstati = vstatBLLB ; } } else { /* xi = vubi ; */ } break ; } case vstatBUUB: { if (!abovebnd(xi,vubi)) { if (!withintol(xi,vubi,tol*(1.0+fabs(vubi)))) statok = FALSE ; if (atbnd(xi,vubi)) { if (atbnd(vlbi,vubi)) newstati = vstatBFX ; else newstati = vstatBUB ; /* xi = vubi ; */ } else if (abovebnd(xi,vlbi)) { newstati = vstatB ; } else if (atbnd(xi,vlbi)) { newstati = vstatBLB ; /* xi = vlbi ; */ } else { newstati = vstatBLLB ; } } break ; } case vstatBFX: { if (!atbnd(xi,vubi)) { if (!withintol(xi,vubi,tol*(1.0+fabs(vubi)))) statok = FALSE ; if (xi > vubi) newstati = vstatBUUB ; else newstati = vstatBLLB ; } else { /* xi = vubi ; */ } break ; } case vstatBFR: { break ; } # ifdef DYLP_PARANOIA default: { errmsg(1,rtnnme,__LINE__) ; return (FALSE) ; } # endif } /* We've checked and corrected the status. Reset the status vector and (if appropriate) dy_x and dy_xbasic. Then decide how to react, depending on the user's choice and whether this was a minor correction (according to the rules at the head of the routine). */ setflg(newstati,quali) ; dy_status[i] = newstati ; # ifndef DYLP_NDEBUG if (statok == TRUE && print >= 3 && stati != getflg(newstati,vstatSTATUS)) { setflg(stati,quali) ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n status of %s (%d) corrected from %s", consys_nme(dy_sys,'v',i,TRUE,NULL),i,dy_prtvstat(stati)) ; dyio_outfmt(dy_logchn,dy_gtxecho," to %s.",dy_prtvstat(newstati)) ; } # endif if (statok == FALSE) { staterrs++ ; setflg(stati,quali) ; strcpy(statbuf,dy_prtvstat(stati)) ; switch (dy_opts->groom) { case 0: { break ; } case 1: { if (fabs(vubi-xi) < fabs(vlbi-xi)) { warn(372,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,consys_nme(dy_sys,'v',i,FALSE,NULL),i, statbuf,dy_prtvstat(newstati), vlbi,xi,vubi,"ub",xi-vubi,tol*(1+fabs(vubi))) ; } else { warn(372,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,consys_nme(dy_sys,'v',i,FALSE,NULL),i, statbuf,dy_prtvstat(newstati), vlbi,xi,vubi,"lb",xi-vlbi,tol*(1+fabs(vlbi))) ; } break ; } default: { if (fabs(vubi-xi) < fabs(vlbi-xi)) { errmsg(372,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,consys_nme(dy_sys,'v',i,FALSE,NULL),i, statbuf,dy_prtvstat(newstati), vlbi,xi,vubi,"ub",xi-vubi,tol*(1+fabs(vubi))) ; } else { errmsg(372,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,consys_nme(dy_sys,'v',i,FALSE,NULL),i, statbuf,dy_prtvstat(newstati), vlbi,xi,vubi,"lb",xi-vlbi,tol*(1+fabs(vlbi))) ; } break ; } } } } /* If we made it the whole way through the basis, we're done. Otherwise, go up and try again. */ if (ipos > dy_sys->concnt) break ; } /* What to do, what to do? If there are no errors, fine. If there are errors, force an abort, if that's what the user wants. Otherwise, boost the minimum pivot ratio, then use the return value set earlier (it'll be TRUE, unless we're in paranoid mode). The current pivot ratio is automatically raised to match the minimum. The reason for only raising the minimum here is that it's likely we've already failed an accuracy check back in dy_accchk, so that the current pivot ratio is already boosted. */ # ifndef DYLP_NDEBUG if (print >= 1 && staterrs > 0) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: %d major status corrections", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters,staterrs) ; } # endif if (staterrs > 0) { if (dy_opts->groom >= 2) { retval = FALSE ; } else { (void) dy_setpivparms(+1,0) ; } } return (retval) ; } dyret_enum dy_accchk (flags *checks) /* This routine performs refactoring, accuracy, and feasibility checks, as indicated by the flags in the checks parameter. The flags are set on return to reflect the results of the checks. Refactoring implies that the primal and dual variables are recalculated. If an accuracy check fails, and the basis has not been refactored, the routine will call for a refactor and try again. If the check fails again, the routine will boost the current pivot selection ratio one step and try again. It'll repeat this loop until the pivot ratio is at its maximum. Failure of an accuracy check at maximum pivot selection ratio is fatal. If we manage to pass the accuracy check(s), but take more than one refactor to do it, boost the current pivot selection ratio on the way out. If a feasibility check fails, and the checks don't anticipate this, the same refactor-and-retry sequence is followed. Anticipation is taken to be the presence of the PFQUIET flag for primal feasibility, DFQUIET for dual feasibility. On the flip side, if we pass all requested checks on the first try, we'll relax the current pivot selection tolerance before returning. Since pretty much any call except a scheduled accuracy check will force an initial refactor, this means we'll only back off the pivot selection tolerances if we make it to an accuracy check interval, and pass without refactoring. If we refactor, and subsequently pass any requested accuracy checks, groombasis is called to make sure the status vector is correct. It's purpose is to deal with any changes that need to be made now that we've (presumably) corrected numerical inaccuracy in the basis factorisation. It also checks that we aren't drifting while the primal antidegeneracy mechanism is active. If it is forced to do major status correction, it will boost both the minimum and current pivot selection ratio. The primal checks are performed on dy_x, which will be equal to dy_xbasic except when the primal antidegeneracy mechanism is active. While it's active, dy_xbasic is incrementally updated, but dy_x is not (dy_x is holding the values which will be used to back out the perturbation). To make a meaningful accuracy check under these circumstances, we make a call to dy_calcprimals to refresh dy_x before doing the accuracy checks. If we're going to refactor first, this isn't necessary because dy_factor will do the recalculation. Unfortunately, the dual situation is not so clean. We don't have separate vectors for all duals and basic duals. In large part this is a consequence of faking dual simplex on the primal basis. The portions of dy_accchk that perform dual accuracy and feasibility checks compensate on the fly by carefully ignoring perturbed values. The primal accuracy check is Bx = b - Nx. The primal feasibility check is lb <= x <= ub for all k. The dual accuracy check is yB = c. The dual feasibility check is cbar = c-dot(y,a) > 0 for variables at lower bound and cbar < 0 for variables at upper bound (primal optimality). We take the opportunity to reset dy_cbar (which has been iteratively updated) with a fresh value. Parameter: checks: (i) ladFACTOR to request refactoring prior to accuracy or feasibility checks ladEXPAND will force expansion of the basis prior to refactoring ladPRIMALCHK to request a primal accuracy check ladPRIMFEAS to request a primal feasibility check ladPFQUIET to suppress actions to recover primal feasibility ladDUALCHK to request a dual accuracy check ladDUALFEAS to request a dual feasibility check ladDFQUIET to suppress actions to recover dual feasibility (o) failure of a test will set the flag for that test. ladFACTOR will be set if the basis was refactored, ladEXPAND if it was expanded, and ladPRIMALS and ladDUALS will be set if they were calculated. Returns: dyrOK if the accuracy check calculations are complete, dyrPATCHED if the only bump was a refactor resulting in a patched basis, otherwise the return code from dy_factor or dyrFATAL for problems originating here. */ { int xkpos,xkndx,pkndx,cndx,pfeascnt,refactorcnt ; double *primalerrs,normb,normc,dualresid,primalresid,cbarj,pinfeas ; pkvec_struct *pkcol ; flags results,vstat,factorflags ; bool dorefactor,tryagain,dualDegen ; dyret_enum factorresult ; const char *rtnnme = "dy_accchk" ; # ifndef DYLP_NDEBUG int print,dfeascnt ; double *dualerrs,avgerr,*dfeaserrs,dinfeas ; dualerrs = NULL ; dfeaserrs = NULL ; dfeascnt = -1 ; dinfeas = quiet_nan(0) ; # endif # ifndef DYLP_NDEBUG switch (dy_lp->phase) { case dyPRIMAL1: { print = dy_opts->print.phase1 ; break ; } case dyPRIMAL2: { print = dy_opts->print.phase2 ; break ; } case dyDUAL: { print = dy_opts->print.dual ; break ; } case dyADDCON: { print = dy_opts->print.conmgmt ; break ; } case dyADDVAR: { print = dy_opts->print.varmgmt ; break ; } case dyINIT: { print = dy_opts->print.crash ; break ; } case dyFORCEDUAL: case dyFORCEPRIMAL: case dyFORCEFULL: { print = maxx(dy_opts->print.conmgmt,dy_opts->print.varmgmt) ; break ; } default: { errmsg(1,rtnnme,__LINE__) ; return (dyrFATAL) ; } } if (print >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n dy_accchk: ") ; if (flgon(*checks,ladFACTOR)) { dyio_outfmt(dy_logchn,dy_gtxecho,"factor") ; if (flgon(*checks,ladEXPAND)) dyio_outchr(dy_logchn,dy_gtxecho,'*') ; dyio_outchr(dy_logchn,dy_gtxecho,' ') ; } if (flgon(*checks,ladPRIMALCHK)) dyio_outfmt(dy_logchn,dy_gtxecho,"pchk ") ; if (flgon(*checks,ladDUALCHK)) dyio_outfmt(dy_logchn,dy_gtxecho,"dchk ") ; if (flgon(*checks,ladPRIMFEAS)) { dyio_outfmt(dy_logchn,dy_gtxecho,"pfeas") ; if (flgon(*checks,ladPFQUIET)) dyio_outchr(dy_logchn,dy_gtxecho,'q') ; dyio_outchr(dy_logchn,dy_gtxecho,' ') ; } if (flgon(*checks,ladDUALFEAS)) { dyio_outfmt(dy_logchn,dy_gtxecho,"dfeas") ; if (flgon(*checks,ladDFQUIET)) dyio_outchr(dy_logchn,dy_gtxecho,'q') ; dyio_outchr(dy_logchn,dy_gtxecho,' ') ; } } if (flgon(*checks,ladDUALCHK)) dualerrs = (double *) MALLOC((dy_sys->concnt+1)*sizeof(double)) ; if (flgon(*checks,ladDUALFEAS)) dfeaserrs = (double *) CALLOC((dy_sys->varcnt+1),sizeof(double)) ; pfeascnt = -1 ; pinfeas = quiet_nan(0) ; # endif if (dy_lp->degen > 0 && dy_lp->phase == dyDUAL) { dualDegen = TRUE ; } else { dualDegen = FALSE ; } /* Grab a work vector to do the primal accuracy check, and do a little prep work. We need to recalculate the primal variables if the antidegeneracy mechanism is active; refactoring will do that. */ primalerrs = (double *) MALLOC((dy_sys->concnt+1)*sizeof(double)) ; tryagain = TRUE ; dorefactor = FALSE ; results = 0 ; pkcol = NULL ; refactorcnt = 0 ; factorresult = dyrINV ; if (flgon(*checks,ladFACTOR) && dy_sys->concnt > 0) { dorefactor = TRUE ; } else { if (dy_lp->degen > 0 && (dy_lp->phase == dyPRIMAL1 || dy_lp->phase == dyPRIMAL2)) { if (dy_calcprimals() == FALSE) { errmsg(316,rtnnme,dy_sys->nme) ; return (dyrFATAL) ; } } } /* Open the check loop and do the tests. Each time we fail a test, we'll come back here, tighten the pivot selection tolerance, and try again. If we try to tighten, and we're already at the top, then we fail. */ while (tryagain == TRUE) { tryagain = FALSE ; /* Refactor? If the user is forcing the initial refactor, use whatever pivot selection regime is currently in force. Additional attempts mean that we've failed an accuracy or feasibility check further down. Boost the current pivot selection ratio one step. If we're already at the tightest setting, dy_setpivparms will return FALSE and we'll escape the loop. */ if (dorefactor == TRUE) { if (refactorcnt != 0 || flgoff(*checks,ladFACTOR)) { if (dy_setpivparms(+1,0) == FALSE) continue ; } # ifndef DYLP_NDEBUG if (print >= 2 || (print >= 1 && results != 0)) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n [%s] refactoring at (%s)%d, %s, ", dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,dy_prtpivparms(-1)) ; dyio_outfmt(dy_logchn,dy_gtxecho,"%d pivots since last refactor.", dy_lp->basis.etas) ; } # endif factorflags = ladPRIMALS|ladDUALS ; if (refactorcnt == 0 && flgon(*checks,ladEXPAND)) setflg(factorflags,ladEXPAND) ; factorresult = dy_factor(&factorflags) ; refactorcnt++ ; if (!(factorresult == dyrOK || factorresult == dyrPATCHED)) { # ifndef DYLP_NDEBUG if ((print >= 2) || (print >= 1 && flgon(results,ladPRIMALCHK|ladDUALCHK))) dyio_outfmt(dy_logchn,dy_gtxecho, "%sfailed.",(print >= 6)?"\n\t":" ") ; # endif return (factorresult) ; } # ifndef DYLP_NDEBUG if ((print >= 2) || (print >= 1 && flgon(results,ladPRIMALCHK|ladDUALCHK))) dyio_outfmt(dy_logchn,dy_gtxecho,"%s%s.",(print >= 6)?"\n\t":" ", (factorresult == dyrOK)?"done":"patched") ; # endif setflg(results,ladFACTOR|factorflags) ; } /* Do the accuracy checks. Calculate (b - x) - Bx and/or c - yB, as requested, as well as the relevant 1-norms and residuals. By definition, when dual degeneracy is active the real value of the duals involved in the degeneracy is zero. */ normb = 0 ; primalresid = 0 ; normc = 0 ; dualresid = 0 ; clrflg(results,ladPRIMALCHK|ladPRIMFEAS|ladDUALCHK|ladDUALFEAS) ; if (dy_reducerhs(primalerrs,TRUE) != TRUE) { errmsg(340,rtnnme,dy_sys->nme) ; return (dyrFATAL) ; } if (flgon(*checks,ladPRIMALCHK|ladDUALCHK)) { for (xkpos = 1 ; xkpos <= dy_sys->concnt ; xkpos++) { xkndx = dy_basis[xkpos] ; if (consys_getcol_pk(dy_sys,xkndx,&pkcol) == FALSE) { errmsg(112,rtnnme,dy_sys->nme,"retrieve","column", consys_nme(dy_sys,'v',xkndx,FALSE,NULL),xkndx) ; return (dyrFATAL) ; } if (flgon(*checks,ladPRIMALCHK)) { normb += fabs(dy_sys->rhs[xkpos]) ; for (pkndx = 0 ; pkndx < pkcol->cnt ; pkndx++) { cndx = pkcol->coeffs[pkndx].ndx ; primalerrs[cndx] -= pkcol->coeffs[pkndx].val*dy_x[xkndx] ; } } if (flgon(*checks,ladDUALCHK)) { cbarj = dy_sys->obj[xkndx] ; normc += fabs(cbarj) ; for (pkndx = 0 ; pkndx < pkcol->cnt ; pkndx++) { cndx = pkcol->coeffs[pkndx].ndx ; if (dualDegen == TRUE && dy_ddegenset[cndx] > 0) { /* do nothing --- dy_y[cndx] == 0 */ } else { cbarj -= pkcol->coeffs[pkndx].val*dy_y[cndx] ; } } dualresid += fabs(cbarj) ; # ifndef DYLP_NDEBUG dualerrs[xkpos] = fabs(cbarj) ; # endif } } if (flgon(*checks,ladPRIMALCHK)) for (xkpos = 1 ; xkpos <= dy_sys->concnt ; xkpos++) primalresid += fabs(primalerrs[xkpos]) ; /* And the results? */ normb = maxx(normb,dy_lp->prim.norm1) ; if (!withintol(primalresid,0.0,dy_tols->pchk*(1+normb))) { warn(341,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,"primal",'b',normb,primalresid, dy_tols->pchk*(1+normb)) ; setflg(results,ladPRIMALCHK) ; } normc = maxx(normc,dy_lp->dual.norm1) ; normc *= 2 ; if (!withintol(dualresid,0.0,dy_tols->dchk*(1+normc))) { warn(341,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,"dual",'c',normc,dualresid, dy_tols->dchk*(1+normc)) ; setflg(results,ladDUALCHK) ; } } # ifndef DYLP_NDEBUG /* Information prints on the results of the accuracy checks. */ if ((print >= 3 && flgon(results,ladPRIMALCHK)) || (print >= 3 && flgon(*checks, ladPRIMALCHK))) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t%s primal accuracy check, ", (flgon(results,ladPRIMALCHK))?"failed":"passed") ; dyio_outfmt(dy_logchn,dy_gtxecho, "residual/(1+normb) = %g/%g = %g %c %g.", primalresid,(1+normb),primalresid/(1+normb), (flgon(results,ladPRIMALCHK))?'>':'<',dy_tols->pchk) ; dyio_outfmt(dy_logchn,dy_gtxecho," (%.2f%%)", primalresid/(dy_tols->pchk*(1+normb))*100) ; } if ((print >= 3 && flgon(results,ladDUALCHK)) || (print >= 3 && flgon(*checks, ladDUALCHK))) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t%s dual accuracy check, ", (flgon(results,ladDUALCHK))?"failed":"passed") ; dyio_outfmt(dy_logchn,dy_gtxecho, "residual/(1+normc) = %g/%g = %g %c %g.", dualresid,(1+normc),dualresid/(1+normc), (flgon(results,ladDUALCHK))?'>':'<',dy_tols->dchk) ; dyio_outfmt(dy_logchn,dy_gtxecho," (%.2f%%)", dualresid/(dy_tols->dchk*(1+normc))*100) ; } if (print >= 3) { if (flgon(results,ladPRIMALCHK)) { avgerr = (dy_tols->pchk*(1+normb))/dy_sys->concnt ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n rows exceeding scaled average tolerance %g:", avgerr) ; for (xkpos = 1 ; xkpos <= dy_sys->concnt ; xkpos++) if (fabs(primalerrs[xkpos]) > avgerr) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n\trow %s (%d), residual %g.", consys_nme(dy_sys,'c',xkpos,FALSE,NULL),xkpos, primalerrs[xkpos]) ; } } if (flgon(results,ladDUALCHK)) { avgerr = (dy_tols->dchk*(1+normc))/dy_sys->concnt ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n columns exceeding scaled average tolerance %g:", avgerr) ; for (xkpos = 1 ; xkpos <= dy_sys->concnt ; xkpos++) if (fabs(dualerrs[xkpos]) > avgerr) { xkndx = dy_basis[xkpos] ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tpos'n %d, column %s (%d), residual %g.", xkpos,consys_nme(dy_sys,'v',xkndx,FALSE,NULL),xkndx, dualerrs[xkpos]) ; } } } # endif /* If we didn't pass the accuracy checks, go back and try refactoring to see if it will improve the accuracy. */ if (flgon(results,ladPRIMALCHK|ladDUALCHK)) { tryagain = TRUE ; dorefactor = TRUE ; continue ; } /* We've passed the accuracy check; if we did a refactor, groom the basis. */ if (factorresult != dyrINV) { if (groombasis() == FALSE) { errmsg(373,rtnnme,dy_sys->nme) ; return (dyrFATAL) ; } } /* The primal feasibility check. There are two entirely separate iterations here. The nonparanoid one checks the basic variables by iterating over the basis. The paranoid one checks all variables. Since we don't need the column for this check, separating it out seems a good idea. If we fail the check, go up and try to refactor. */ if (flgon(*checks,ladPRIMFEAS)) { pinfeas = 0 ; pfeascnt = 0 ; # ifdef DYLP_PARANOIA for (xkndx = 1 ; xkndx <= dy_sys->varcnt ; xkndx++) { if (!withinbnds(dy_sys->vlb[xkndx],dy_x[xkndx],dy_sys->vub[xkndx])) { if (belowbnd(dy_x[xkndx],dy_sys->vlb[xkndx])) { pinfeas += dy_sys->vlb[xkndx]-dy_x[xkndx] ; if (flgoff(*checks,ladPFQUIET)) warn(323,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters, consys_nme(dy_sys,'v',xkndx,FALSE,NULL),xkndx, dy_prtvstat(dy_status[xkndx]), dy_sys->vlb[xkndx],dy_x[xkndx],dy_sys->vub[xkndx], dy_sys->vlb[xkndx]-dy_x[xkndx], dy_tols->pfeas*(1+fabs(dy_sys->vlb[xkndx]))) ; } else { pinfeas += dy_x[xkndx]-dy_sys->vub[xkndx] ; if (flgoff(*checks,ladPFQUIET)) warn(323,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters, consys_nme(dy_sys,'v',xkndx,FALSE,NULL),xkndx, dy_prtvstat(dy_status[xkndx]), dy_sys->vlb[xkndx],dy_x[xkndx],dy_sys->vub[xkndx], dy_x[xkndx]-dy_sys->vub[xkndx], dy_tols->pfeas*(1+fabs(dy_sys->vub[xkndx]))) ; } pfeascnt++ ; setflg(results,ladPRIMFEAS) ; } } # else for (xkpos = 1 ; xkpos <= dy_sys->concnt ; xkpos++) { xkndx = dy_basis[xkpos] ; if (!withinbnds(dy_sys->vlb[xkndx],dy_x[xkndx],dy_sys->vub[xkndx])) { if (belowbnd(dy_x[xkndx],dy_sys->vlb[xkndx])) { pinfeas += dy_sys->vlb[xkndx]-dy_x[xkndx] ; if (flgoff(*checks,ladPFQUIET)) warn(323,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters, consys_nme(dy_sys,'v',xkndx,FALSE,NULL),xkndx, dy_prtvstat(dy_status[xkndx]), dy_sys->vlb[xkndx],dy_x[xkndx],dy_sys->vub[xkndx], dy_sys->vlb[xkndx]-dy_x[xkndx], dy_tols->pfeas*(1+fabs(dy_sys->vlb[xkndx]))) ; } else { pinfeas += dy_x[xkndx]-dy_sys->vub[xkndx] ; if (flgoff(*checks,ladPFQUIET)) warn(323,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters, consys_nme(dy_sys,'v',xkndx,FALSE,NULL),xkndx, dy_prtvstat(dy_status[xkndx]), dy_sys->vlb[xkndx],dy_x[xkndx],dy_sys->vub[xkndx], dy_x[xkndx]-dy_sys->vub[xkndx], dy_tols->pfeas*(1+fabs(dy_sys->vub[xkndx]))) ; } pfeascnt++ ; setflg(results,ladPRIMFEAS) ; } } # endif dy_lp->infeas = pinfeas ; dy_lp->infeascnt = pfeascnt ; } # ifndef DYLP_NDEBUG /* Information prints on the results of the primal feasibility check. */ if (print >= 5) { if (flgon(*checks,ladPRIMFEAS) && flgoff(results,ladPRIMFEAS)) dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tpassed primal feasibility check.") ; } if (print >= 3) { if (flgon(results,ladPRIMFEAS)) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: %d variables primal infeasible, pinfeas = %g:", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, pfeascnt,pinfeas) ; for (xkndx = 1 ; xkndx <= dy_sys->varcnt ; xkndx++) if (!withinbnds(dy_sys->vlb[xkndx],dy_x[xkndx],dy_sys->vub[xkndx])) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t%s (%d) = %g, status %s, lb = %g, ub = %g, ", consys_nme(dy_sys,'v',xkndx,FALSE,NULL),xkndx, dy_x[xkndx],dy_prtvstat(dy_status[xkndx]), dy_sys->vlb[xkndx],dy_sys->vub[xkndx]) ; if (dy_x[xkndx] < dy_sys->vlb[xkndx]) dyio_outfmt(dy_logchn,dy_gtxecho,"lb-x = %g, tol = %g", dy_sys->vlb[xkndx]-dy_x[xkndx], dy_tols->pfeas*(1+fabs(dy_sys->vlb[xkndx]))) ; else dyio_outfmt(dy_logchn,dy_gtxecho,"x-ub = %g, tol = %g", dy_x[xkndx]-dy_sys->vub[xkndx], dy_tols->pfeas*(1+fabs(dy_sys->vub[xkndx]))) ; } } } # endif if (flgon(results,ladPRIMFEAS) && flgoff(*checks,ladPFQUIET)) { tryagain = TRUE ; dorefactor = TRUE ; continue ; } /* The dual feasibility check. Also separate, as we're interested in checking the nonbasic columns. If we're running a perturbed, restricted subproblem for dual antidegeneracy, the action deserves some explanation. Even though perturbed cbar values are propagated to duals during iterative update, the original perturbation was applied directly to cbar, so in general a perturbed cbar != c - dot(a,y). Still, dual feasibility should be preserved for the perturbed values. We just need to be careful not to erase the perturbed cbar. */ if (flgon(*checks,ladDUALFEAS)) { # ifndef DYLP_NDEBUG dfeascnt = 0 ; dinfeas = 0 ; # endif for (xkndx = 1 ; xkndx <= dy_sys->varcnt ; xkndx++) { vstat = dy_status[xkndx] ; # ifdef DYLP_PARANOIA if (flgon(vstat,vstatBASIC)) continue ; # else if (flgon(vstat,vstatBASIC|vstatNBFX)) continue ; # endif cbarj = consys_dotcol(dy_sys,xkndx,dy_y) ; # ifdef DYLP_PARANOIA if (isnan(cbarj) == TRUE) { errmsg(320,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,"y",xkndx,"dual feasibility check") ; return (dyrFATAL) ; } # endif if (dualDegen == TRUE && dy_ddegenset[xkndx] > 0) { cbarj = dy_cbar[xkndx] ; } else { cbarj = dy_sys->obj[xkndx]-cbarj ; setcleanzero(cbarj,dy_tols->cost) ; dy_cbar[xkndx] = cbarj ; } if ((flgon(vstat,vstatNBLB) && cbarj < -dy_tols->dfeas) || (flgon(vstat,vstatNBUB) && cbarj > dy_tols->dfeas) || (flgon(vstat,vstatNBFR) && cbarj != 0) || flgon(vstat,vstatSB)) { if (flgoff(*checks,ladDFQUIET)) warn(347,rtnnme,dy_sys->nme, dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, consys_nme(dy_sys,'v',xkndx,FALSE,NULL),xkndx, dy_prtvstat(vstat),xkndx,cbarj,dy_tols->dfeas) ; # ifndef DYLP_NDEBUG /* Note that we depend on CALLOC to set dfeaserrs = 0 on allocation, so that nonzero entries represent dual feasibility violations. */ dinfeas += fabs(cbarj) ; dfeascnt++ ; dfeaserrs[xkndx] = cbarj ; # endif setflg(results,ladDUALFEAS) ; } } if (flgon(results,ladDUALFEAS)) dy_lp->basis.dinf++ ; else dy_lp->basis.dinf = 0 ; } # ifndef DYLP_NDEBUG /* Information prints on the results of the dual feasibility check. */ if (print >= 5) { if (flgon(*checks,ladDUALFEAS) && flgoff(results,ladDUALFEAS)) dyio_outfmt(dy_logchn,dy_gtxecho, "\n\tpassed dual feasibility check.") ; } if (print >= 3) { if (flgon(results,ladDUALFEAS)) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n (%s)%d: %d variables dual infeasible, dinfeas = %g:", dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, dfeascnt,dinfeas) ; for (xkndx = 1 ; xkndx <= dy_sys->varcnt ; xkndx++) { if (dfeaserrs[xkndx] != 0.0) { vstat = dy_status[xkndx] ; dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t%s (%d) = %g, status %s, cbarj = %g, tol %g.", consys_nme(dy_sys,'v',xkndx,FALSE,NULL),xkndx, (vstat == vstatNBLB)?dy_sys->vlb[xkndx]:dy_sys->vub[xkndx], dy_prtvstat(vstat),dfeaserrs[xkndx], dy_tols->dfeas) ; } } } } # endif if (flgon(results,ladDUALFEAS) && flgoff(*checks,ladDFQUIET)) { tryagain = TRUE ; dorefactor = TRUE ; continue ; } } /* End of the accuracy check loop, for good or ill. If we've managed to pass all checks on the first try, with no problems, back off the pivot selection tolerances. (This implies we actually performed accuracy checks.) Free the work vectors, set the return value for checks and we're done. */ if (refactorcnt == 0 && flgon(*checks,ladPRIMALCHK|ladDUALCHK)) (void) dy_setpivparms(-1,0) ; FREE(primalerrs) ; if (pkcol != NULL) pkvec_free(pkcol) ; # ifndef DYLP_NDEBUG if (flgon(*checks,ladDUALCHK)) FREE(dualerrs) ; if (flgon(*checks,ladDUALFEAS)) FREE(dfeaserrs) ; # endif *checks = results ; return (dyrOK) ; } dyret_enum dy_duenna (dyret_enum pivresult, int xjndx, int xindx, int xjcand, int xicand) /* This routine is the Duenna for dylp's primal and dual simplex algorithms. It is called after each pivot, checks that all the right things are being done, and deals with major scandal as best it can. The `right things' are the mundane precautions of regular accuracy checks and refactorisation. These are applied if the pivot result is dyrOK or dyrDEGEN. (If the pivot result is dyrOPTIMAL, the simplex routines will do their own preoptimality checks.) Pivoting scandals understood by the Duenna, and possible actions taken here, include: * Unbounded problem -- action depends on whether we have primal I, II, or dual unboundedness. + Primal I unbounded -- flag the variable as NOPIVOT, and force a reselect. What can happen here is we get moving in a space of free variables that's orthogonal to feasibility. + Primal II unbounded -- no remedy here, but in dylp this will often occur in the early stages of solving an LP, when only a subset of the constraints are active, and is handled by activating more constraints. + Dual unbounded -- indicates primal infeasibility, and no action is taken here. * Loss of feasibility -- really shouldn't occur, and indicates loss of accuracy or algorithmic error. + primal phase I -- serious internal confusion, converted to a fatal error. + primal phase II -- refactor is forced, in anticipation that it was an accuracy problem. If infeasibility remains, return loss of feasibility so we can revert to primal phase I. + dual phase II -- refactor is forced, in anticipation that it was an accuracy problem. If infeasibility remains, return loss of feasibility in hopes dy_dual will do something (currently it punts to primal I). * Suspected loss of accuracy (dyrREQCHK) -- force a refactor. * Mad pivot -- the pivoting routines may reject a pivot if they judge it (numerically) unstable. The pivot column (row) is added to the list of rejected pivots, and la Duenna returns dyrRESELECT to request that the primal (dual) simplex algorithm reselect the entering (leaving) variable. Two pivoting problems originate with dy_pivot and the underlying basis package: * Singular basis -- this occurs when the basis package attempted the recommended pivot and discovered that it resulted in a singular basis. The basic remedy is to refactor. It could be the basis was already singular, but accumulated inaccuracy masked it until now. dy_factor and the basis package will patch it unless the user has disabled that option. Or it could be that this choice of pivot is indeed the problem. If the refactor completes without problem, blame the pivot and mark the column (row) with the NOPIVOT qualifier. In any event, successful recovery implies that la Duenna should request the primal (dual) simplex algorithm to reselect. * Out of space -- this occurs when the basis package ran out of space. The remedy is to refactor, recovering the space occupied by eta matrices. This will trigger the allocation of additional space, if that's what's required. When dy_pivot attempts a pivot and fails the basis is corrupted and refactoring is mandatory. A pivresult of dyrFATAL is fatal, period. La Duenna detects a three fatal conditions based on pivot counts: * Iteration limit exceeded -- no remedy, dylp has done as much work as its client authorised. * Stalling (possibly actual cycling) -- no remedy. This is a heuristic, based on the number of pivots that have occurred with no improvement in the objective function. * Too many rejected pivots -- no remedy, there have been too many consecutive rejected pivots. Refactoring is handled inside dy_accchk, which see for additional comments. Where refactoring is attempted (either for error recovery or simply because basis.etas says it's time) and dy_factor reports that it has discovered and patched a singular basis, la Duenna will return dyrRESELECT to force the calling simplex algorithm to reselect the entering (leaving) variable. Refactoring can fail; again, see dy_accchk and dy_factor for comments. If the basis is refactored, La Duenna will check that the preselected entering (leaving) variable is still legal according to primal (dual) pivoting rules. If it isn't, dyrRESELECT is returned to request selection of a new candidate. Pivots where a nonbasic variable swings from one bound to the other don't add an eta matrix in the basis representation and are not counted for purposes of determining if it's time to do an accuracy check or refactor. Parameters: pivresult: The return code from the pivoting routine. xjndx: The entering variable for this pivot. xindx: The leaving variable for this pivot. xjcand: The candidate entering variable for the next pivot (primal) xicand: The candidate entering variable for the next pivot (dual) Returns: any of dyrOK, dyrOPTIMAL, dyrRESELECT, dyrPUNT, dyrACCCHK, dyrUNBOUND, dyrSWING, dyrLOSTPFEAS, dyrLOSTDFEAS, dyrSINGULAR, dyrNUMERIC, dyrBSPACE, dyrSTALLED, dyrITERLIM, or dyrFATAL under normal circumstances. dyrINV is possible if a paranoid check fails. */ { dyret_enum retval,accchk ; double cbarcand ; bool pivok ; flags checkflags,outflags,statcand ; const char *rtnnme = "La Duenna" ; # ifndef DYLP_NDEBUG int print ; # endif # ifndef DYLP_NDEBUG switch (dy_lp->phase) { case dyPRIMAL1: { print = dy_opts->print.phase1 ; break ; } case dyPRIMAL2: { print = dy_opts->print.phase2 ; break ; } case dyDUAL: { print = dy_opts->print.dual ; break ; } default: { errmsg(1,rtnnme,__LINE__) ; return (dyrFATAL) ; } } # endif retval = dyrINV ; outflags = 0 ; checkflags = 0 ; /* Bump the various pivot and iteration counts, and see if we're in trouble because of the total pivot limit. It's important to get basis.etas and basis.pivs correct --- they come into the control of basis factorisation and the pivot reject list, and should not change unless we successfully pivoted the basis. The others are less critical. */ pivok = dy_lp->pivok ; dy_lp->prev_pivok = pivok ; dy_lp->pivok = FALSE ; if (pivok == TRUE && xindx != xjndx) { dy_lp->basis.etas++ ; dy_lp->basis.pivs++ ; } if (dy_lp->phase == dyPRIMAL1) { dy_lp->p1.iters++ ; if (pivok == TRUE) dy_lp->p1.pivs++ ; if (dy_opts->iterlim > 0 && dy_lp->p1.pivs > dy_opts->iterlim) retval = dyrITERLIM ; } else if (dy_lp->phase == dyPRIMAL2) { dy_lp->p2.iters++ ; if (pivok == TRUE) dy_lp->p2.pivs++ ; if (dy_opts->iterlim > 0 && dy_lp->p2.pivs > dy_opts->iterlim) retval = dyrITERLIM ; } else { dy_lp->d2.iters++ ; if (pivok == TRUE) dy_lp->d2.pivs++ ; if (dy_opts->iterlim > 0 && dy_lp->d2.pivs > dy_opts->iterlim) retval = dyrITERLIM ; } if (retval == dyrITERLIM) { if (dy_opts->context != cxBANDC) { errmsg(328,rtnnme,dy_sys->nme,dy_opts->iterlim) ; } return (retval) ; } dy_lp->tot.iters++ ; if (pivok == TRUE) dy_lp->tot.pivs++ ; if (dy_opts->iterlim > 0 && dy_lp->tot.pivs > 3*dy_opts->iterlim) { retval = dyrITERLIM ; if (dy_opts->context != cxBANDC) { errmsg(328,rtnnme,dy_sys->nme,3*dy_opts->iterlim) ; } return (retval) ; } /* Deal with the result returned by the pivoting routine. If there's a problem we can't fix, we'll return to the caller from whatever case we're in. If there's no problem, or the problem can possibly be fixed or papered over, we'll fall past the bottom of the switch and do repair and periodic checks. Put the cases that are essentially successful pivots (dyrOK, dyrDEGEN, and dyrOPTIMAL) first, so we don't waste time. If the pivot has been rejected as unstable (dyrMADPIV), it was added to the pivot reject list by dy_primalpivot or dy_dualpivot. All we need to do here is return dyrRESELECT to trigger selection of a new candidate. Similarly, if the pivot routine has directly requested a reselect. A punt indicates that the pivot selection routines dualout/dseupdate (primalin/pseupdate) couldn't select a leaving (entering) variable, but some potentially promising variables were on the pivot rejection list. dy_dealWithPunt() will examine the list to see if any variables should be released for pivoting and return one of dyrRESELECT, dyrPUNT, or dyrFATAL, depending on how it goes. There's nothing we can do here about primal unboundedness or pseudo- unboundedness, but it may not be a big problem a few levels up (could be because only a subset of constraints are active, could be an accuracy problem curable by more frequent refactoring). Return quietly. dyrSWING typically indicates a successful pivot in which some variable(s) moved a little too far. If the code has requested an accuracy check (because it saw a bogus number) we'll go ahead and do it but won't necessarily reject the current pivot. Loss of primal or dual feasibility also indicates accuracy problems. We'll refactor and do an accuracy check. If the pivot attempt resulted in a singular basis, we definitely need to refactor (the present basis representation is corrupt until a successful factorization). Assume that the indication of singularity is genuine and reject the pivot. If the basis was already singular (and accumulated numerical error was masking this) then we've shot the messenger, but the code that cleans up after a patch clears the pivot reject list, among other actions. Out of space entails the same repair actions as singular basis, but without the complication of rejecting the pivot element. The notion is that refactoring will eliminate all the eta matrices and reclaim space, but if we've just refactored, that won't happen, and we need to force expansion. In either case, abort the minor iteration, as the pivot attempt has failed. Finally, fatal is fatal, and so is anything we don't recognise. */ switch (pivresult) { case dyrOK: case dyrOPTIMAL: case dyrDEGEN: { retval = dyrOK ; break ; } case dyrMADPIV: case dyrRESELECT: { return (dyrRESELECT) ; } case dyrPUNT: { retval = dy_dealWithPunt() ; return (retval) ; } case dyrUNBOUND: { return (dyrUNBOUND) ; } case dyrSWING: { return (dyrSWING) ; } case dyrREQCHK: { setflg(checkflags,ladFACTOR) ; # ifndef DYLP_NDEBUG if (print >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n [%s] refactor requested at (%s)%d, ", dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters) ; dyio_outfmt(dy_logchn,dy_gtxecho,"%d pivots since last refactor.", dy_lp->basis.etas) ; } # endif retval = dyrREQCHK ; break ; } case dyrLOSTPFEAS: case dyrLOSTDFEAS: { setflg(checkflags,ladFACTOR) ; # ifdef DYLP_PARANOIA if (dy_lp->phase == dyPRIMAL1) { errmsg(338,rtnnme,dy_sys->nme, (pivresult == dyrLOSTPFEAS)?"primal":"dual") ; return (dyrFATAL) ; } # endif # ifndef DYLP_NDEBUG if (print >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n [%s] loss of %s feasibility at iteration %d.", dy_sys->nme,(pivresult == dyrLOSTPFEAS)?"primal":"dual", dy_lp->tot.iters) ; } # endif retval = dyrREQCHK ; break ; } case dyrSINGULAR: { setflg(checkflags,ladFACTOR) ; # ifndef DYLP_NDEBUG if (print >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n [%s](%s)%d: pivot attempt produced ", dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters) ; dyio_outfmt(dy_logchn,dy_gtxecho, "singular basis; attempting recovery.") ; } # endif if (dy_lp->phase == dyDUAL) retval = dy_addtopivrej(xindx,dyrSINGULAR,0.0,0.0) ; else retval = dy_addtopivrej(xjndx,dyrSINGULAR,0.0,0.0) ; if (retval != dyrOK) return (retval) ; retval = dyrRESELECT ; break ; } case dyrBSPACE: { setflg(checkflags,ladFACTOR) ; if (dy_lp->basis.etas == 0) setflg(checkflags,ladEXPAND) ; # ifndef DYLP_NDEBUG if (print >= 1) { if (flgoff(checkflags,ladEXPAND)) dyio_outfmt(dy_logchn,dy_gtxecho, "\n [%s]: (%s)%d: attempting to compress basis.", dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters) ; else dyio_outfmt(dy_logchn,dy_gtxecho, "\n [%s]: (%s)%d: forcing basis expansion.",dy_sys->nme, dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters) ; } # endif retval = dyrOK ; break ; } case dyrFATAL: { errmsg(343,rtnnme,dy_sys->nme,dy_lp->tot.iters) ; return (dyrFATAL) ; } default: { errmsg(1,rtnnme,__LINE__) ; return (dyrFATAL) ; } } # ifdef DYLP_PARANOIA /* retval should be one of dyrOK, dyrREQCHK, or dyrRESELECT, dyrOK means that we may refactor, but have no particular accuracy problems nor do we need to reselect if the refactor succeeds. dyrREQCHK should be interpreted to mean that we want to refactor and that there is some question of accuracy to boot. dyrRESELECT means that we want to refactor and that we'll need to reselect the entering/leaving variable once we return to the calling simplex algorithm. */ if (!(retval == dyrOK || retval == dyrREQCHK || retval == dyrRESELECT)) { errmsg(1,rtnnme,__LINE__) ; return (dyrFATAL) ; } # endif /* To get here, either the pivot was uneventful, or there's a hope that refactoring will solve whatever problem we ran into. Check whether it's time for a regularly scheduled refactorisation or accuracy check. Refactoring always implies an accuracy check (but not vice versa), so it's actually buried in dy_accchk, we just have to request it. It'll occasionally happen that an accuracy check will repeat because it's had the misfortune to fall on a pivot which is followed by pivots which don't count toward basis.etas (nonbasic moving from bound to bound is the most common cause). Something to think about fixing up --- either a a separate count, iterc, for accuracy checks, or remember the basis.etas value of the most recent accuracy check. While we're here, check on the pivot tolerance. If we've been running with reduced tolerance for a while, we should boost it back to normal. */ if (dy_lp->basis.etas >= dy_opts->factor) { setflg(checkflags,ladFACTOR) ; dy_checkpivtol() ; # ifndef DYLP_NDEBUG if (print >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n [%s] (%s)%d: scheduled refactor, interval %d, ", dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, dy_opts->factor) ; dyio_outfmt(dy_logchn,dy_gtxecho,"%d pivots since last refactor,", dy_lp->basis.etas) ; if (dy_lp->phase == dyDUAL) { dyio_outfmt(dy_logchn,dy_gtxecho,"yb = %g.",dy_calcdualobj()) ; } else if (dy_lp->phase == dyPRIMAL1) { dyio_outfmt(dy_logchn,dy_gtxecho,"infeas = %g.",dy_calcpinfeas()) ; } else { dyio_outfmt(dy_logchn,dy_gtxecho,"cx = %g.",dy_calcobj()) ; } } # endif } if ((dy_lp->basis.etas%dy_opts->check == 0 && dy_lp->basis.etas != 0) || flgon(checkflags,ladFACTOR)) { if (dy_lp->phase == dyPRIMAL1) { setflg(checkflags,ladPRIMALCHK) ; } else if (dy_lp->phase == dyPRIMAL2) { setflg(checkflags,ladPRIMALCHK|ladPRIMFEAS|ladPFQUIET|ladDUALCHK) ; } else if (dy_lp->phase == dyDUAL) { setflg(checkflags,ladPRIMALCHK|ladDUALCHK|ladDUALFEAS|ladDFQUIET) ; } # ifndef DYLP_NDEBUG if (dy_lp->basis.etas%dy_opts->check == 0 && dy_lp->basis.etas != 0 && print >= 2) { dyio_outfmt(dy_logchn,dy_gtxecho, "\n [%s] (%s)%d: scheduled check, interval %d, ", dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, dy_opts->check) ; dyio_outfmt(dy_logchn,dy_gtxecho,"%d pivots since last refactor.", dy_lp->basis.etas) ; } # endif } /* Do an accuracy check, possibly accompanied by a refactorisation. Any code other than dyrOK or dyrPATCHED is a problem; return it to the caller. If we've failed any of the accuracy checks, return dyrACCCHK, since dy_accchk has tried everthing dylp knows for dealing with the problem. Assuming we pass the accuracy check, clear the pivot rejection list. Limiting this to the accuracy check frequency gives a little bit of persistence to the list. But ... don't clear the list if the reason we're here is because the last pivot resulted in a singular basis! */ if (flgon(checkflags,ladFACTOR|ladPRIMALCHK|ladDUALCHK)) { accchk = dy_accchk(&checkflags) ; if (!(accchk == dyrOK || accchk == dyrPATCHED)) return (accchk) ; if (flgon(checkflags,ladPRIMALCHK|ladDUALCHK)) return (dyrACCCHK) ; if (pivresult != dyrSINGULAR) if (dy_clrpivrej(NULL) != TRUE) return (dyrFATAL) ; /* If the return code is dyrPATCHED, we'll want to select a new pivot candidate before attempting another simplex iteration. If we refactored, check that the candidate entering (leaving) variable still meets primal (dual) criteria. */ if (flgon(checkflags,ladFACTOR) && retval != dyrRESELECT) { if (accchk == dyrPATCHED) { retval = dyrRESELECT ; # ifndef DYLP_NDEBUG if (print >= 1) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n [%s] (%s)%d: ", dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters) ; dyio_outfmt(dy_logchn,dy_gtxecho, "forcing reselect after basis patch.") ; } # endif } else { if ((dy_lp->phase == dyPRIMAL1 || dy_lp->phase == dyPRIMAL2) && xjcand > 0) { statcand = dy_status[xjcand] ; cbarcand = dy_cbar[xjcand] ; if (!((cbarcand+dy_tols->dfeas < 0 && flgon(statcand,vstatNBLB|vstatNBFR|vstatSB)) || (cbarcand-dy_tols->dfeas > 0 && flgon(statcand,vstatNBUB|vstatNBFR|vstatSB)))) { retval = dyrRESELECT ; } } else if (dy_lp->phase == dyDUAL && xicand > 0) { statcand = dy_status[xicand] ; if (flgoff(statcand,vstatBLLB|vstatBUUB)) { retval = dyrRESELECT ; } } # ifndef DYLP_NDEBUG if (print >= 1 && retval == dyrRESELECT) { dyio_outfmt(dy_logchn,dy_gtxecho,"\n [%s] (%s)%d: ", dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters) ; dyio_outfmt(dy_logchn,dy_gtxecho, "candidate %s (%d) no longer suitable; ", consys_nme(dy_sys,'v', (dy_lp->phase == dyDUAL)?xicand:xjcand,FALSE,NULL), (dy_lp->phase == dyDUAL)?xicand:xjcand) ; dyio_outfmt(dy_logchn,dy_gtxecho, "forcing reselect after refactor.") ; } # endif } } /* What's the story on feasibility? Check the possible outcomes on the accuracy test. If we're here because an accuracy check was requested, or because we lost feasibility, and all is now ok, set the return value to dyrOK. If we've lost primal or dual feasibility, the proper one to report depends on the phase (proper, that is, in the sense of which one dominates when we've lost both). */ if (flgon(checkflags,ladPRIMFEAS|ladDUALFEAS)) { if (dy_lp->phase == dyDUAL) { if (flgon(checkflags,ladDUALFEAS)) return (dyrLOSTDFEAS) ; else if (flgon(checkflags,ladPRIMFEAS)) return (dyrLOSTPFEAS) ; } else { if (flgon(checkflags,ladPRIMFEAS)) return (dyrLOSTPFEAS) ; else if (flgon(checkflags,ladDUALFEAS)) return (dyrLOSTDFEAS) ; } } if (retval == dyrREQCHK) retval = dyrOK ; } # ifdef DYLP_PARANOIA /* At this point, return values should be one of dyrOK or dyrRESELECT. */ if (!(retval == dyrOK || retval == dyrRESELECT)) { errmsg(1,rtnnme,__LINE__) ; return (dyrFATAL) ; } # endif /* Not much left. Now that we're as accurate as we're going to get, see if the objective's been improving. If it hasn't, we're stalled (and might be cycling). Note that the cycling count is not 100% precise --- in particular, La Duenna does not reach here for the case of a successful pivot flagged dyrPUNT. */ if (pivok == TRUE) { if (withintol(dy_lp->z,dy_lp->lastz.piv,dy_tols->dchk)) { dy_lp->idlecnt++ ; if (dy_lp->idlecnt > dy_opts->idlelim) { errmsg(339,rtnnme,dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE), dy_lp->tot.iters,dy_lp->idlecnt) ; return (dyrSTALLED) ; } } else { dy_lp->lastz.piv = dy_lp->z ; dy_lp->idlecnt = 0 ; } } /* If, after all the above, we're still at dyrOK, and the original pivresult was dyrOPTIMAL, go with that. */ if (pivresult == dyrOPTIMAL && retval == dyrOK) retval = dyrOPTIMAL ; /* That's it. */ return (retval) ; } DyLP-1.6.0/DyLP/src/Dylp/dy_penalty.c0000644000076700007670000006045611037243540014121 0ustar /* This file is a part of the Dylp LP distribution. Copyright (C) 2005 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains routines for pricing columns and for calculating up and down penalties associated with forcing basic variables to new bounds. They're useful in the context of using dylp in an lp-based branch-and-bound MILP code. These routines shield the client from the the problems of translating between the original system and the active system (selection of active constraints and variables, and scaling). To state the obvious, these routines are useable only when dylp's data structures have been left intact after solving the lp. */ /* In penalty calculations, the core calculation is the cost of the first dual pivot back toward feasibility after imposing new bounds on the variable. Typically we're trying to estimate the result of branching on x, and we're evaluating the mutually exclusive cases of x >= ub and x <= lb. The nonbasic variables x are scanned to find the variable x which can drive x to bound with minimum degradation of the objective. For the common case where x is an integer variable and we want to know the standard up/down penalties, ub = ceil(x and lb = floor(x). If x is an integer variable, it will most likely end up with a non-integral value. One can make the argument that x really needs to move all the way to its next integral value in order to be a feasible solution to the ILP, hence we should calculate the penalty as if we moved to the next integral value. The problem, of course, is that abar might not really be the best direction to move in order to achieve this. Moreover, the penalty calculated in this way may well be more than the actual cost of regaining optimality for the lp relaxation. More often, however, the first dual pivot is an underestimate of the real degradation and the strengthened penalty only partially corrects this. dylp can go either way. If the compile-time constant STRONG_PENALTIES is defined, you get penalties strengthened as described for x integer. Otherwise, the basic penalty is calculated. */ #define DYLP_INTERNAL #include "dylp.h" static char sccsid[] UNUSED = "@(#)dy_penalty.c 4.5 11/06/04" ; static char svnid[] UNUSED = "$Id: dy_penalty.c 246 2008-07-16 00:57:04Z lou $" ; /* This is a dummy stub routine for the benefit of optimised builds. It'll do until I rewrite the original. */ static bool dy_unscale_betai(consys_struct *orig_sys, int oxindx, double **betai, double **ai) { return (FALSE) ; } /* This routine has been rewritten to provide the the full unscaled vector of reduced costs. I've moved the original code over here and renamed it for future reference. */ static void dy_orig_cbarLocal (int nbcnt, double *cbar, int *vndx) /* This is a special purpose routine which unscales the vector of selected reduced costs produced by dy_pricenbvars. All we do here is walk the vectors and apply the unscaling. sc_cbar = sc_c - sc_csc_inv(B)sc_a = cS - cSinv(S)inv(B)inv(R)RaS = cS - cinv(B)aS = cbarS To unscale sc_cbar, we simply multiply by 1/S, keeping in mind that if x is a logical for row i, the appropriate factor is R. Parameters: nbcnt: number of entries in cbar, nbvars cbar: vector of reduced costs vndx: corresponding variable indices Note that cbar and vndx are indexed from 0, and the indices specified in vndx are in the frame of the original constraint system, which is what we need for accesses to the scaling vectors. Returns: undefined */ { int j,k ; double cbarj ; const double *rscale,*cscale ; /* Is unscaling required? If so, acquire the vectors and go to it. */ if (dy_isscaled() == FALSE) return ; dy_scaling_vectors(&rscale,&cscale) ; /* Get on with the calculation. Recall that vndx encodes the index of a logical as -i. */ for (k = 0 ; k < nbcnt ; k++) { j = vndx[k] ; cbarj = cbar[k] ; if (j > 0) { cbarj /= cscale[j] ; } else { cbarj *= rscale[-j] ; } setcleanzero(cbarj,dy_tols->dfeas) ; cbar[k] = cbarj ; } return ; } bool dy_pricenbvars (lpprob_struct *orig_lp, flags priceme, double **p_ocbar, int *p_nbcnt, int **p_nbvars) /* This routine will calculate the reduced costs of nonbasic variables in the original constraint system, using the information available in the dylp data structures. For active variables, the value from dy_cbar is used. For inactive variables, the column is priced. The set of variables priced is all variables whose status is specified with priceme. On return, nbcnt has the number of columns actually priced, nbvars holds the indices, and ocbar holds the corresponding reduced costs. E.g., if x is the ith variable priced, nbvars[i] = j and ocbar[i] = cbar. Variable indices returned in nbvars are in the orig_sys frame, which does not include logicals. Priced logicals are indicated by the negative of the index of their associated constraint. The overall flow of the routine is to calculate the scaled cbar's, then unscale them as a final step. Parameters: orig_lp: the lp problem structure priceme: variables with a status included in priceme will be priced p_ocbar: (i) a vector to hold the reduced costs; if NULL, one will be allocated (o) the reduced costs for priced nonbasic variables; only entries for the indices in nbvars are valid p_nbcnt: (o) the number of variables priced p_nbvars (i) a vector to hold the indices of the variables which are priced; if NULL, one will be allocated (o) the indices of the priced variables Returns: TRUE if there are no problems with pricing, FALSE otherwise. */ { int oxjndx,xjndx,pkndx,cndx,nbcnt,*nbvars ; double cbarj,*ocbar ; flags statj ; bool retval ; consys_struct *orig_sys ; pkvec_struct *aj ; pkcoeff_struct *aij ; const char *rtnnme = "dy_pricenbvars" ; /* dy_unscaling.c */ extern void dy_orig_cbarLocal (int nbcnt, double *cbar, int *vndx) ; # ifdef DYLP_PARANOIA if (p_ocbar == NULL) { errmsg(2,rtnnme,"&cbar") ; return (FALSE) ; } if (p_nbcnt == NULL) { errmsg(2,rtnnme,"&nbcnt") ; return (FALSE) ; } if (p_nbvars == NULL) { errmsg(2,rtnnme,"&nbvars") ; return (FALSE) ; } if (orig_lp == NULL) { errmsg(2,rtnnme,"orig_lp") ; return (FALSE) ; } if (orig_lp->consys == NULL) { errmsg(2,rtnnme,"orig_lp->consys") ; return (FALSE) ; } # endif /* Check for valid data structures, then pull out the constraint system. The call to initlclsystem will replace the client's copy of the original constraint system with the local scaled copy, if it exists. */ if (flgoff(orig_lp->ctlopts,lpctlDYVALID)) { errmsg(396,rtnnme,orig_lp->consys->nme,"price nonbasic columns") ; return (FALSE) ; } (void) dy_initlclsystem(orig_lp,TRUE) ; orig_sys = orig_lp->consys ; /* Did the client give us vectors, or do we need to allocate them? There can be at most varcnt nonbasic variables. */ if (*p_ocbar == NULL) *p_ocbar = (double *) CALLOC(orig_sys->varcnt,sizeof(double)) ; ocbar = *p_ocbar ; if (*p_nbvars == NULL) *p_nbvars = (int *) CALLOC(orig_sys->varcnt,sizeof(int)) ; nbvars = *p_nbvars ; /* Open a loop to walk the columns of orig_sys. Active variables have a valid dy_sys index (> 0) in dy_origvars. We simply check dy_status and grab the entry in dy_cbar. To simplify later use, set cbar to 0 if it's less than the dual feasibility tolerance. */ retval = TRUE ; aj = NULL ; nbcnt = 0 ; for (oxjndx = 1 ; oxjndx <= orig_sys->varcnt ; oxjndx++) { if (ACTIVE_VAR(oxjndx)) { xjndx = dy_origvars[oxjndx] ; statj = dy_status[xjndx] ; if (flgon(statj,priceme)) { cbarj = dy_cbar[xjndx] ; setcleanzero(cbarj,dy_tols->dfeas) ; # ifdef DYLP_PARANOIA if ((flgon(statj,vstatNBUB) && cbarj > 0) || (flgon(statj,vstatNBLB) && cbarj < 0)) { errmsg(739,rtnnme,dy_sys->nme,"active", consys_nme(orig_sys,'v',oxjndx,TRUE,NULL),oxjndx, dy_prtvstat(statj),cbarj) ; retval = FALSE ; break ; } # endif ocbar[nbcnt] = cbarj ; nbvars[nbcnt++] = oxjndx ; } } /* Inactive variables have the negative of their status (nonbasic at upper or lower bound, or fixed) in dy_origvars. We have to price the column in this case. Calculate cbar = c - ya, using only the active rows of the column. */ else { statj = (flags) -dy_origvars[oxjndx] ; # ifdef DYLP_PARANOIA if (flgoff(statj,vstatNBFX|vstatNBUB|vstatNBLB|vstatNBFR)) { errmsg(433,rtnnme, dy_sys->nme,dy_prtlpphase(dy_lp->phase,TRUE),dy_lp->tot.iters, "inactive",consys_nme(orig_sys,'v',oxjndx,TRUE,NULL), oxjndx,dy_prtvstat(statj)) ; retval = FALSE ; break ; } # endif if (flgon(statj,priceme)) { cbarj = orig_sys->obj[oxjndx] ; if (consys_getcol_pk(orig_sys,oxjndx,&aj) == FALSE) { errmsg(122,rtnnme,orig_sys->nme,"column", consys_nme(orig_sys,'v',oxjndx,TRUE,NULL),oxjndx) ; retval = FALSE ; break ; } for (pkndx = 0,aij = aj->coeffs ; pkndx < aj->cnt ; pkndx++,aij++) { if (ACTIVE_CON(aij->ndx)) { cndx = dy_origcons[aij->ndx] ; cbarj -= dy_y[cndx]*aij->val ; } } setcleanzero(cbarj,dy_tols->dfeas) ; # ifdef DYLP_PARANOIA if ((flgon(statj,vstatNBUB) && cbarj > 0) || (flgon(statj,vstatNBLB) && cbarj < 0)) { errmsg(739,rtnnme,dy_sys->nme,"inactive", consys_nme(orig_sys,'v',oxjndx,TRUE,NULL),oxjndx, dy_prtvstat(statj),cbarj) ; retval = FALSE ; break ; } # endif ocbar[nbcnt] = cbarj ; nbvars[nbcnt++] = oxjndx ; } } } /* Last but not least, step through the logicals (in the dy_sys frame) and add them, using the negative of their associated constraint (in the orig_sys frame) as the index. */ for (xjndx = 1 ; xjndx <= dy_sys->concnt ; xjndx++) { statj = dy_status[xjndx] ; if (flgon(statj,priceme)) { cbarj = dy_cbar[xjndx] ; setcleanzero(cbarj,dy_tols->dfeas) ; # ifdef DYLP_PARANOIA if ((flgon(statj,vstatNBUB) && cbarj > 0) || (flgon(statj,vstatNBLB) && cbarj < 0)) { errmsg(739,rtnnme,dy_sys->nme,"logical", consys_nme(dy_sys,'v',xjndx,TRUE,NULL),xjndx, dy_prtvstat(statj),cbarj) ; retval = FALSE ; break ; } # endif ocbar[nbcnt] = cbarj ; nbvars[nbcnt++] = -dy_actcons[xjndx] ; } } *p_nbcnt = nbcnt ; /* Unscale the reduced costs. */ (void) dy_orig_cbarLocal(nbcnt,ocbar,nbvars) ; /* And we're done. Clean up and return. */ dy_freelclsystem(orig_lp,FALSE) ; if (aj != NULL) pkvec_free(aj) ; return (retval) ; } static bool pricedualpiv (consys_struct *orig_sys, double *betai, double *ai, int oxindx, double nubi, double xi, double nlbi, int nbcnt, int *nbvars, double *nbcbar, double *p_upeni, double *p_dpeni) /* This routine performs the core pricing calculation for the up and down penalties associated with the dual pivot that will force x to decrease and leave the basis at nub or increase and leave the basis at nlb. The assumption is that we're pricing a prospective disjunction. If x is a logical, and the associated constraint is inactive (i.e., not part of the current basis), a must contain the coefficients of the constraint. (Note that this will also work in the case that we want to price a new constraint, not currently in orig_sys.) It is expected that any necessary setup for the calculation has been taken care of by a front-end routine (at present, only dy_pricedualpiv). The most likely source of a scaled copy of the original constraint system is the local copy maintained by dy_scaling.c The most likely source of an unscaled copy is the client's copy of the original constraint system. Neither system is likely to have explicit logicals, hence this routine handles the columns for logicals implicitly, to avoid any problems. Here's the computation. For convenience, assume that x is basic in basis position i, and this row is constraint i. dpen = MIN{j}(-(nlb(i) - x)cbar/abar) for j in nbvars s.t. abar > 0 and x < u or abar < 0 and x > l upen = MIN{j}(-(nub(i) - x)cbar/abar) for j in nbvars s.t. abar < 0 and x < u or abar > 0 and x > l See the written documentation for development of the formulas. Briefly, the penalty calculation gives the deterioration in the objective for the first dual pivot back toward feasibility. The routine calculates abar = dot(beta,a) for each j in nbvars. It will keep going until dpen = upen = 0, or all variables in nbvars have been scanned. nbvars is assumed to contain the indices of the nonbasic variables `of interest', meaning that they're not fixed. nbcbar is in correspondence, so that if nbvars[i] = j, nbcbar[i] = cbar. Logicals (which don't exist in the orig_sys frame of reference) are expected to be coded as the negative of the index of their associated constraint. (See dy_pricenbvars.) nbvars and nbcbar are indexed from 0. Parameters: orig_sys: the unscaled original constraint system betai: unscaled row i of the basis inverse ai: unscaled coefficients of constraint i, if it is not active oxindx: index of x in orig_sys; negative values are assumed to specify logicals (as the negative of the index of the associated constraint); 0 means a holds a new row. nubi: unscaled new upper bound for x xi: current value of x in optimal solution nlbi: unscaled new lower bound for x nbcnt: the number of variable indices in nbvars nbvars: indices of the nonbasic variables of interest (indices in the orig_sys frame) nbcbar: the reduced costs, in correspondence with nbvars p_upeni: (o) the up penalty when x is forced up to nlb p_dpeni: (o) the down penalty when x is forced down to nub Returns: TRUE if the calculation proceeds without error, FALSE otherwise */ { #if 0 int oxjndx,nbndx,pkndx,cndx,vndx ; double abarij,upenij,dpenij,upeni,dpeni,cbarj ; flags statj ; vartyp_enum *vtyp ; pkvec_struct *aj ; pkcoeff_struct *aij ; bool activexi,retval ; const char *rtnnme = "pricedualpiv" ; # ifdef DYLP_PARANOIA int i,ipos ; double *abarj ; /* dy_tableau.c */ bool dy_abarj(consys_struct *orig_sys, int j_orig, double **p_abarj) ; abarj = NULL ; # endif vtyp = orig_sys->vtyp ; /* Do we have an active variable or an inactive variable? If oxindx < 0 it's a logical, so we need to ask whether or not the constraint is active. We don't deal with inactive architectural variables. */ activexi = TRUE ; if (oxindx == 0) { activexi = FALSE ; } else if (oxindx < 0) { if (INACTIVE_CON(-oxindx)) activexi = FALSE ; } else { if (INACTIVE_VAR(oxindx)) { errmsg(737,rtnnme,orig_sys->nme, consys_nme(orig_sys,'v',oxindx,FALSE,NULL),oxindx) ; return (FALSE) ; } } # ifdef DYLP_PARANOIA if (activexi == FALSE && ai == NULL) { errmsg(2,rtnnme,"a (inactive)") ; return (FALSE) ; } # endif /* Now open a loop to walk nbvars. Architectural variables are specified with their index in orig_sys, and may or may not be active. For each architectural variable, pull the unscaled column, calculate abar = dot(beta,a), and acquire the status. Logicals are specified with the index of their associated constraint in orig_sys, negated, and will certainly be active, but we deal with them implicitly. (This is important, because orig_sys might well be the client's copy and logicals may not be explicitly represented.) If we're dealing with an inactive row, remember that it may also contain a coefficient for the variable in this column. If abar is 0, that's all the further we need to go with this x, because we can't use it to move x. The escape comes after the paranoid check. */ dpeni = dy_tols->inf ; upeni = dy_tols->inf ; aj = NULL ; retval = TRUE ; for (nbndx = 0 ; nbndx < nbcnt ; nbndx++) { oxjndx = nbvars[nbndx] ; if (oxjndx < 0) { cndx = dy_origcons[-oxjndx] ; if (dy_sys->ctyp[cndx] == contypGE) { abarij = -betai[cndx] ; } else { abarij = betai[cndx] ; } statj = dy_status[cndx] ; } else { if (consys_getcol_pk(orig_sys,oxjndx,&aj) == FALSE) { errmsg(122,rtnnme,orig_sys->nme,"column", consys_nme(orig_sys,'v',oxjndx,TRUE,NULL),oxjndx) ; retval = FALSE ; break ; } abarij = 0 ; for (pkndx = 0,aij = aj->coeffs ; pkndx < aj->cnt ; pkndx++,aij++) { if (ACTIVE_CON(aij->ndx)) { cndx = dy_origcons[aij->ndx] ; abarij += betai[cndx]*aij->val ; } } vndx = dy_origvars[oxjndx] ; if (vndx > 0) { statj = dy_status[vndx] ; } else { statj = (flags) -vndx ; } if (activexi == FALSE && oxjndx > 0) abarij += betai[dy_sys->concnt+1]*ai[oxjndx] ; } setcleanzero(abarij,dy_tols->zero) ; # ifdef DYLP_PARANOIA /* We can do a check if the row is active, by ftran'ing the column and checking that we get the same value for abar with both calculations. The tolerance on the check --- 1000*dy_tols.zero --- is pretty loose, but remember that the original system is unscaled and could be pretty ugly. This code is broken at the moment, because I'm changing the semantics of dy_abarj to return the full abar in the context of the original system. See dy_tableau.c. -- lh, 080515 -- */ if (activexi) { if (dy_abarj(orig_sys,oxjndx,&abarj) == FALSE) { if (oxjndx < 0) { vndx = orig_sys->varcnt-oxjndx ; } else { vndx = oxjndx ; } errmsg(740,rtnnme,orig_sys->nme,"ftran'd column", consys_nme(orig_sys,'v',vndx,TRUE,NULL),oxjndx) ; retval = FALSE ; break ; } if (oxindx < 0) { i = dy_origcons[-oxindx] ; } else { i = dy_origvars[oxindx] ; } ipos = dy_var2basis[i] ; if (!withintol(abarj[ipos],abarij,1000*dy_tols->zero)) { errmsg(741,rtnnme,orig_sys->nme,oxindx,oxjndx,abarij,ipos,abarj[ipos], abarj[ipos]-abarij,1000*dy_tols->zero) ; retval = FALSE ; break ; } } # endif if (abarij == 0) continue ; /* Calculate the penalty dpen for using x to force x to nub. We can use x only if abar has the right sign to match the status of x (dual pivoting rules, essentially). dpen becomes min(dpen,dpen). If dpen is already 0, it can't get worse, so there's no need to do the calculation. The drill is the same for upen, using nlb. */ cbarj = nbcbar[nbndx] ; # ifdef DYLP_PARANOIA if (cbarj != 0 && fabs(cbarj) < dy_tols->dfeas) { int tmpndx ; if (oxjndx < 0) tmpndx = -oxjndx ; else tmpndx = oxjndx ; errmsg(738,rtnnme,orig_sys->nme,tmpndx,cbarj,dy_prtvstat(statj), consys_nme(orig_sys,'v',tmpndx+orig_sys->varcnt,FALSE,NULL), tmpndx,dy_tols->dfeas,dy_tols->dfeas-fabs(cbarj)) ; retval = FALSE ; break ; } # endif if (dpeni > 0) { if ((abarij > 0 && flgoff(statj,vstatNBUB)) || (abarij < 0 && flgoff(statj,vstatNBLB))) { dpenij = (nubi-xi)*cbarj/(-abarij) ; setcleanzero(dpenij,dy_tols->zero) ; # ifdef STRONG_PENALTIES if (oxjndx > 0) { if (INT_VARTYPE(vtyp[oxjndx]) && dpenij < fabs(cbarj)) dpenij = fabs(cbarj) ; } # endif # ifdef DYLP_PARANOIA if (dpenij < 0) { errmsg(736,rtnnme,orig_sys->nme,"dpen",oxindx,oxjndx,dpenij) ; retval = FALSE ; break ; } # endif if (dpenij < dpeni) dpeni = dpenij ; } } if (upeni > 0) { if ((abarij < 0 && flgoff(statj,vstatNBUB)) || (abarij > 0 && flgoff(statj,vstatNBLB))) { upenij = (nlbi-xi)*cbarj/(-abarij) ; setcleanzero(upenij,dy_tols->zero) ; # ifdef STRONG_PENALTIES if (oxjndx > 0) { if (INT_VARTYPE(vtyp[oxjndx]) && upenij < fabs(cbarj)) upenij = fabs(cbarj) ; } # endif # ifdef DYLP_PARANOIA if (upenij < 0) { errmsg(736,rtnnme,orig_sys->nme,"upen",oxindx,oxjndx,upenij) ; retval = FALSE ; break ; } # endif if (upenij < upeni) upeni = upenij ; } } /* If both upeni and dpeni have been reduced to 0, we can quit. */ if (upeni == 0 && dpeni == 0) break ; } /* We've finished the penalty calculation loop. Clean up, set the return values, and return. */ if (aj != NULL) pkvec_free(aj) ; # ifdef DYLP_PARANOIA if (abarj != NULL) FREE(abarj) ; # endif *p_upeni = upeni ; *p_dpeni = dpeni ; return (retval) ; #endif return (FALSE) ; } bool dy_pricedualpiv (lpprob_struct *orig_lp, int oxindx, double nubi, double xi, double nlbi, int nbcnt, int *nbvars, double *nbcbar, double *p_upeni, double *p_dpeni) /* This routine is a generalised pricing routine that calculates the up and down penalties associated with the dual pivot that will force x (basic, infeasible) to either rise to nlb and leave the basis, or fall to nub and leave the basis. It's generalised (e.g., with respect to a standard up/down penalty calculation) in the sense that it doesn't assume floor and ceiling for nub and nlb, respectively, and it can handle the calculation when x is the slack associated with an inactive constraint. (This is handy for evaluating candidates for branch-on-hyperplane.) dpen = MIN{j}(-(nlb(i) - x)cbar/abar) for j in nbvars s.t. abar > 0 and x < u or abar < 0 and x > l upen = MIN{j}(-(nub(i) - x)cbar/abar) for j in nbvars s.t. abar < 0 and x < u or abar > 0 and x > l Each abar is calculated as dot(beta,a). See the written documentation for development of the formulas. Briefly, the penalty calculation gives the deterioration in the objective for the first dual pivot back toward feasibility. The calculation of an unscaled basis inverse row beta is handled by dy_unscale_betai. The remainder of the heavy lifting is handled by pricedualpiv. nbvars is assumed to contain the nonbasic variables `of interest', meaning that they're not fixed. nbcbar is in correspondence, so that if nbvars[i] = j, nbcbar[i] = cbar. Logicals (which don't exist in the orig_sys frame of reference) are expected to be coded as the negative of the index of their associated constraint. (See dy_pricenbvars.) Parameters: orig_lp: the lp problem structure; contains a pointer to the unscaled original constraint system oxindx: index of x in orig_sys; negative values are assumed to specify logicals (as the negative of the index of the associated constraint) nubi: new upper bound for x xi: current value for x nlbi: new lower bound for x nbcnt: the number of variable indices in nbvars nbvars: indices of the nonbasic variables of interest (indices in the orig_sys frame) nbcbar: the reduced costs, in correspondence with nbvars p_upeni: (o) the up penalty for x p_dpeni: (o) the down penalty for x Returns: TRUE if the calculation proceeds without error, FALSE otherwise */ { double *betai,*ai ; consys_struct *orig_sys ; bool retval ; const char *rtnnme = "dy_pricedualpiv" ; /* dy_scaling.c */ extern bool dy_unscale_betai(consys_struct *orig_sys, int oxindx, double **betai, double **ai) ; # ifdef DYLP_PARANOIA if (p_upeni == NULL) { errmsg(2,rtnnme,"&upen") ; return (FALSE) ; } if (p_dpeni == NULL) { errmsg(2,rtnnme,"&dpen") ; return (FALSE) ; } if (orig_lp == NULL) { errmsg(2,rtnnme,"orig_lp") ; return (FALSE) ; } if (orig_lp->consys == NULL) { errmsg(2,rtnnme,"orig_lp->consys") ; return (FALSE) ; } # endif /* Check for valid data structures, then pull out the constraint system. We want the client's (unscaled) copy, so we don't swap in the scaled local copy. */ if (flgoff(orig_lp->ctlopts,lpctlDYVALID)) { errmsg(396,rtnnme,orig_lp->consys->nme,"calculate penalty") ; return (FALSE) ; } orig_sys = orig_lp->consys ; /* Get the unscaled row of the basis inverse. */ betai = NULL ; ai = NULL ; if (dy_unscale_betai(orig_sys,oxindx,&betai,&ai) == FALSE) { return (FALSE) ; } /* Call pricedualpiv to do the rest of the heavy lifting. */ retval = pricedualpiv(orig_sys,betai,ai,oxindx,nubi,xi,nlbi, nbcnt,nbvars,nbcbar,p_upeni,p_dpeni) ; /* Clean up and return. */ if (ai != NULL) FREE(ai) ; if (betai != NULL) FREE(betai) ; return (retval) ; } DyLP-1.6.0/DyLP/configure.ac0000644000076700007670000002075111414231451012363 0ustar # Copyright (C) 2006 International Business Machines. # All Rights Reserved. # This file is distributed under the Common Public License. ## $Id: configure.ac,v 1.1.2.1 2006/04/19 23:25:12 andreasw Exp $ # Author: Andreas Waechter IBM 2006-04-13 # Lou Hafer SFU many mods since then ############################################################################# # Names and other basic things # ############################################################################# AC_PREREQ(2.59) AC_INIT([DyLP],[1.6.0],[coin-dylp@list.coin-or.org]) AC_COPYRIGHT([ Copyright 2006 International Business Machines and others. All Rights Reserved. This file is part of the open source package Coin which is distributed under the Common Public License.]) AC_REVISION(0.9) # List one file in the package so that the configure script can test # whether the package is actually there AC_CONFIG_SRCDIR(src/Dylp/dy_vector.h) # Where should everything be installed by default? Here, we want it # to be installed directly in 'bin', 'lib', 'include' subdirectories # of the directory where configure is run. The default would be # /usr/local. AC_PREFIX_DEFAULT([`pwd`]) ############################################################################# # Standard build tool stuff # ############################################################################# # Get the system type AC_CANONICAL_BUILD # Various handy bits of initialisation. AC_COIN_PROJECTDIR_INIT(DyLP,6:0:6) # Check if user wants to produce debugging code AC_COIN_DEBUG_COMPILE(DyLP) # Get the name of the C compiler and appropriate compiler options AC_COIN_PROG_CC # Get the name of the C++ compiler and appropriate compiler options AC_COIN_PROG_CXX # Initialize automake and libtool AC_COIN_INIT_AUTO_TOOLS ############################################################################# # COIN components # ############################################################################# AC_COIN_HAS_PROJECT(DyLP) AC_COIN_HAS_PROJECT(CoinUtils) AC_COIN_HAS_PROJECT(Osi) ############################################################################# # Doing project specific tests # ############################################################################# # Tweak compilation flags. AC_DYLP_FIX_CPPFLAGS # Determine the C type that corresponds to the C++ bool type in size AC_DYLP_EQUIV_FOR_CPP_BOOL ######################################################################## # The floating point functions we'll be looking for seem to live in one of # the following headers: math.h, ieeefp.h, float.h, and sunmath.h. Check # for presence. We'll use the results to limit the work below. The coin # macro COIN_PROJECTDIR_INIT should deal with presence/absence of -lm # (for libmath) in ADDLIBS. Don't overrule it here. AC_CHECK_HEADER([math.h], [AC_DEFINE([HAVE_MATH_H],[1],[Define to 1 if math.h exists.]) fp_header_list="math.h" AC_C_ADD_TO_INCLUDES([math.h])], [AC_MSG_WARN([It appears that math.h is missing.]) AC_MSG_WARN([There is no hope of building dylp on this system.])]) AC_CHECK_HEADER([ieeefp.h], [AC_DEFINE([HAVE_IEEEFP_H],[1],[Define to 1 if ieeefp.h exists.]) fp_header_list="ieeefp.h $fp_header_list" AC_C_ADD_TO_INCLUDES([ieeefp.h])], []) AC_CHECK_HEADER([float.h], [AC_DEFINE([HAVE_FLOAT_H],[1],[Define to 1 if float.h exists.]) fp_header_list="float.h $fp_header_list" AC_C_ADD_TO_INCLUDES([float.h])], []) AC_CHECK_HEADER([sunmath.h], [AC_DEFINE([HAVE_SUNMATH_H],[1],[Define to 1 if sunmath.h exists.]) fp_header_list="sunmath.h $fp_header_list" AC_C_ADD_TO_INCLUDES([sunmath.h]) AC_DYLP_GET_SUNSTUDIO_LIBDIRS LIBS="$SUNSTUDIO_LIBDIRS -lsunmath $LIBS" ADDLIBS="-lsunmath $ADDLIBS"], []) AC_MSG_NOTICE([Found floating point header files $fp_header_list.]) # AC_MSG_NOTICE([includes are now:]) # AC_MSG_NOTICE([$ac_includes_default]) # Now determine the names in this environment for isfinite() and isnan(). The # most common variants are finite() and isnan(). We check for others. After # these macros finish, DYLP_ISFINITE has the name for isfinite(), and # DYLP_ISNAN has the name for isnan(). AC_DYLP_FIND_ISFINITE AC_DYLP_FIND_ISNAN # Check for the presence of a quiet_nan function. To my knowledge, this will # exist only if sunmath is present, but hey, who knows what lurks out there. AC_CHECK_FUNC([quiet_nan], [AC_DEFINE([DYLP_HAS_QUIET_NAN],[1], [Define this symbol if the quiet_nan function exists. This function should return the bit pattern for IEEE quiet NaN.])]) # And determine whether we're big-endian or little-endian. This is necessary to # define the correct patterns for IEEE infinity and quiet_nan, in the event # that we can't get them any other way. This will define WORDS_BIGENDIAN if # we're on a big-endian machine, and do nothing otherwise. AC_C_BIGENDIAN # Finally, dylp needs to know where its error message text file is located. # This is made horribly complicated by Windows, which uses drive letters and # backslash in the native path format, and by the variation between faked unix # environments on Windows. Cygwin isn't too bad --- it provides cygpath to # translate a unix path into native Windows format. Mingw/Msys can't be # bothered, so we need to work harder. # Keep in mind the sed expressions are interpreted by the shell and then by # sed; the backslashes are halved each time. In the end we're left with # s,/,\\,g or s,\,\\,g as the actual substitutions. This gets us a double # backslash in DYLP_ERRMSGDIR, which the various compilers can strip down to # one. Sheesh. AC_ARG_VAR(DYLP_ERRMSGDIR, [Directory containing the DyLP error message text file (dy_errmsgs.txt). Should be set to /absolute/path/to/srcdir/DyLP/src/Dylp, using native path syntax (i.e., drive letters and backslashes on Windows).]) if test x"$DYLP_ERRMSGDIR" = x; then case $build in *-mingw*|*-msys*) DYLP_ERRMSGDIR="`(cd "$abs_source_dir";pwd -W)`/src/Dylp/" DYLP_ERRMSGDIR=`echo $DYLP_ERRMSGDIR | sed -e 's,/,\\\\\\\\,g'` ;; *-cygwin*) DYLP_ERRMSGDIR="`$CYGPATH_W $abs_source_dir/src/Dylp/`" DYLP_ERRMSGDIR=`echo $DYLP_ERRMSGDIR | sed -e 's,\\\\,\\\\\\\\,g'` ;; *) DYLP_ERRMSGDIR="$abs_source_dir/src/Dylp/" ;; esac fi AC_DEFINE_UNQUOTED([DYLP_ERRMSGDIR], ["$DYLP_ERRMSGDIR"], [Directory containing the DyLP error message text file (dy_errmsgs.txt). Should be set to /absolute/path/to/srcdir/DyLP/src/Dylp, using native path syntax (i.e., drive letters and backslashes on Windows).]) ############################################################################## # Dylp configuration options # ############################################################################## AC_DYLP_PARANOIA([no]) AC_DYLP_STATISTICS([no]) AC_DYLP_INFO([yes]) ############################################################################## # VPATH links for example input files # ############################################################################## # In case this is a VPATH configuration we need to make sure that the # input files for the examples are available in the VPATH directory. AC_COIN_VPATH_LINK(examples/plain) ############################################################################## # Finishing up by writing all the output # ############################################################################## # Here list all the files that configure should create (except for the # configuration header file). First the usual stuff: DyLP's top-level Makefile, # the code Makefiles (src/*/Makefile), and the test Makefile. AC_CONFIG_FILES([Makefile examples/Makefile src/DylpStdLib/Makefile src/Dylp/Makefile test/Makefile dylp_addlibs.txt]) # And all the stuff that goes into building the documentation. See the note in # Makefile.am with respect to CONFIG_CLEAN_FILES and the distclean and # distclean-local targets. AC_CONFIG_FILES([doc/Makefile doc/dylpabsdir.tex doc/makefile.dylpdoc doc/Figures/Makefile doc/TexMF/Makefile]) AC_CONFIG_FILES([doc/build_dylpdoc],[chmod +x doc/build_dylpdoc]) # Here put the location and name of the configuration header file AC_CONFIG_HEADERS([inc/config_dylp.h]) # Finally, we let configure write all the output... AC_COIN_FINALIZE DyLP-1.6.0/DyLP/inc/0000755000076700007670000000000011414302677010652 5ustar DyLP-1.6.0/DyLP/inc/config_dylp.h.in0000644000076700007670000000641111406161225013720 0ustar /* inc/config_dylp.h.in. Generated from configure.ac by autoheader. */ /* Define to the C type whose size in bytes matches the size in bytes of the the C++ bool type. */ #undef BOOL /* Define to the debug sanity check level (0 is no test) */ #undef COIN_DYLP_CHECKLEVEL /* Define to the debug verbosity level (0 is no output) */ #undef COIN_DYLP_VERBOSITY /* Define to 1 if the CoinUtils package is used */ #undef COIN_HAS_COINUTILS /* Define to 1 if the DyLP package is used */ #undef COIN_HAS_DYLP /* Define to 1 if the Osi package is used */ #undef COIN_HAS_OSI /* Directory containing the DyLP error message text file (dy_errmsgs.txt). Should be set to /absolute/path/to/srcdir/DyLP/src/Dylp, using native path syntax (i.e., drive letters and backslashes on Windows). */ #undef DYLP_ERRMSGDIR /* Define this symbol if the quiet_nan function exists. This function should return the bit pattern for IEEE quiet NaN. */ #undef DYLP_HAS_QUIET_NAN /* Define to be the name of the C function used to check that an IEEE floating point value is finite. */ #undef DYLP_ISFINITE /* Define to be the name of the C function used to check that an IEEE floating point value is NaN. */ #undef DYLP_ISNAN /* Define this variable to disable dylp's informational printing features. */ #undef DYLP_NDEBUG /* Define this variable to enable dylp's paranoid checks. */ #undef DYLP_PARANOIA /* Define this variable to enable dylp's statistics collection features. */ #undef DYLP_STATISTICS /* Version number of project */ #undef DYLP_VERSION /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if float.h exists. */ #undef HAVE_FLOAT_H /* Define to 1 if ieeefp.h exists. */ #undef HAVE_IEEEFP_H /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if math.h exists. */ #undef HAVE_MATH_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if sunmath.h exists. */ #undef HAVE_SUNMATH_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Version number of package */ #undef VERSION /* Define to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel and VAX). */ #undef WORDS_BIGENDIAN DyLP-1.6.0/DyLP/Makefile.am0000644000076700007670000001010611267165330012132 0ustar # Copyright (C) 2006 International Business Machines and others. # All Rights Reserved. # This file is distributed under the Common Public License. ## $Id: Makefile.am 34 2006-05-15 19:22:07Z andreasw $ # Author: Andreas Waechter IBM 2006-04-13 AUTOMAKE_OPTIONS = foreign ######################################################################## # Subdirectories # ######################################################################## SUBDIRS = src/DylpStdLib src/Dylp examples # We don't want to compile the test subdirectory, unless the test target is # specified. But we need to list it as subdirectory to make sure that it is # included in the tarball. Similarly, we don't want to attempt to build the # documentation unless specifically requested. if ALWAYS_FALSE SUBDIRS += test SUBDIRS += doc doc/Figures doc/TexMF endif ######################################################################## # Additional files to be included in tarball # ######################################################################## # Here we need include all files that are not mentioned in other Makefiles EXTRA_DIST = \ AUTHORS LICENSE README NEWS \ examples/generic.spc \ examples/greenbeb.spc \ examples/Makefile.in \ examples/mpsio.c \ examples/odsi+dylp.cpp \ examples/osi_dylp.c \ examples/osi+dylp.cpp \ examples/plain \ examples/README ######################################################################## # Extra Targets # ######################################################################## test: all @echo "Building and running dylp unit test." @cd test ; $(MAKE) test @if test -r ../Osi/test/Makefile; then \ echo "Building and running OsiDylp unit test." ; \ cd ../Osi/test; \ $(MAKE) test; \ else \ echo "Osi not present; skipping Osi unit test."; \ fi # Autotools does a good job on code, but it doesn't deal well with LaTeX # documentation. A few rules to help it along. Note that we don't delete # dylp.ps and dylp.pdf until maintainer-clean; these come prebuilt with the # distribution. .PHONY: doc mostlyclean-local clean-local distclean-local \ maintainer-clean-local doc: @echo "Attempting to build dylp typeset documentation." @cd doc ; ./build_dylpdoc --ps --pdf dylp mostlyclean-local: @cd doc ; if test -x build_dylpdoc ; then ./build_dylpdoc --clean || make; fi clean-local: mostlyclean-local # Normally, automake would remove build_dylpdoc, dylpabsdir.tex, and # makefile.dylpdoc as part of distclean, because they're generated during # configuration. But we can't allow that --- distclean-local runs *after* # distclean, and it needs build_dylpdoc and makefile.dylpdoc. Down in # doc/Makefile.am, the variable CONFIG_CLEAN_FILES is cleared to prevent # distclean from removing these files. That means that if ever I generate new # files from configure.ac, they need to be listed here. distclean-local: clean-local @cd doc ; rm -f build_dylpdoc dylpabsdir.tex makefile.dylpdoc @cd doc ; rm -f Makefile Figures/Makefile TexMF/Makefile maintainer-clean-local: distclean-local @cd doc ; rm -f dylp.pdf dylp.ps ######################################################################## # Installation of the addlibs file # ######################################################################## addlibsfile = dylp_addlibs.txt addlibsdir = $(prefix)/share/doc/coin/$(PACKAGE_NAME)/ install-exec-local: install-doc $(install_sh_DATA) $(addlibsfile) $(DESTDIR)$(addlibsdir)/$(addlibsfile) uninstall-local: uninstall-doc rm -f $(DESTDIR)$(addlibsdir)/$(addlibsfile) ######################################################################## # Maintainer Stuff # ######################################################################## # So aclocal will find the local macros in the m4 directory ACLOCAL_AMFLAGS = -I m4 # Files that are generated and should be cleaned with make distclean DISTCLEANFILES = include ../BuildTools/Makemain.inc DyLP-1.6.0/DyLP/examples/0000755000076700007670000000000011414302700011702 5ustar DyLP-1.6.0/DyLP/examples/README0000644000076700007670000000555511266200573012606 0ustar svn/cvs: $Id: README 305 2009-10-16 23:27:55Z lou $ `make examples' will build the dylp wrapper programs osi_dylp and odsi+dylp. You must have Dylp, OSI and OsiDylp built and installed before the makefile in this directory will work properly. Be sure to execute `make install' in the top level directory of the Dylp distribution before trying to build the examples. After building the sample wrapper programs, you should have two wrappers: * osi_dylp, a simple native interface to dylp, written in C. This wrapper has no dependence on COIN code. osi+dylp is essentially the same thing, but C++. It's not built by default, you'll need to edit Makefile.in to build it. * odsi+dylp, a simple wrapper that runs dylp through the OsiDylp OSI layer. The shell script `plain' provides a convenient way to supply the needed command line parameters for the wrappers. Typing `plain' will get you a usage message. `plain ' will search in the current directory and in COIN/Mps/Netlib for the specified problem file (Note 1). By default, plain will run the odsi+dylp wrapper; you can change the default by editing the script. You can also select the wrapper you want as a command line parameter. Once it locates the problem file, plain will look around for a dylp options file, by default .spc. If it doesn't find one, it will look for a file named generic.spc. This distribution comes with generic.spc and greenbeb.spc, just to give you an idea of how options files look. E.g., `plain adlittle' will use osi_dylp to solve the Netlib example problem adlittle, with the generic.spc options file. Expected results, for the default build (info printing and statistics enabled, optimised compile), for two Netlib problems: Problem Objective Run time adlittle 225494.963 .02 sec. osi_dylp, odsi+dylp greenbeb -4302260.26 12.04 sec. odsi+dylp 27.84 sec. osi_dylp adlittle is tiny, and a fast test. greenbeb makes dylp work harder, and shows the improvement due to CoinPresolve, which is used by OsiDylp. The run times given above are for a SunBlade 1500, 1GB RAM, 1MB L2 cache. Your mileage will assuredly vary, but at least you have an idea of roughly how long to wait. --------------------------- Note 1: Compressed (.gz) files will be unzipped into this directory. Dylp's native mps reader doesn't support compressed files, nor does it support files that take full advantage of MPS fixed format and use spaces in the row and column names. Since the OsiDylp interface layer makes use of the COIN MPS i/o facilities, which support the full MPS specification and compressed files, there's no particular motivation to upgrade dylp's mps reader. Dylp's MPS reader, on the other hand, does support some extensions that may be useful in other contexts. --------------------------- DyLP-1.6.0/DyLP/examples/greenbeb.spc0000644000076700007670000000051410442173473014177 0ustar ! A trivial example of a .spc file for dylp. This tells dylp to always work ! with the full constraint system. Generally this is more efficient if an lp ! will only be solved once. ! svn/cvs: $Id: greenbeb.spc 71 2006-06-09 04:21:15Z andreasw $ lpcontrol fullsys true ; ! Information print for current phase. lpprint major 1 ; DyLP-1.6.0/DyLP/examples/osi+dylp.cpp0000644000076700007670000006217410770315704014172 0ustar /* This file is a portion of the Dylp LP distribution. Copyright (C) 2001 Lou Hafer, Stephen Tse Copyright (C) 2002 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains a main program and support routines sufficient to build a stand-alone lp solver using the version of dylp as modified for COIN/OSI. It's not necessarily pretty, but it should work adequately well. This code is just osi_dylp.c, minimally converted to compile as C++. After processing any command line options, the program establishes basic facilities, reads and processes the options file, reads and processes the problem specification, calls dylp via a wrapper to solve the problem, prints the result and shuts down. The command line is expected to be of the form osi_dylp [] [] The options presently in place are: -s Run silent: turns off echo of all generated text to stdout. The default output-file path is changed from stdout to NULL. Silent overpowers terse, in the event both are specified. -t Terse output on stdout. Behaviour is as for silent, but allows an opening title and closing message giving the result of the LP. -p Set overall print level to , [0..5]. -e Source text for error messages (defaults to dy_errmsgs.txt). -E A logging file for error messages (default is to direct error messages to stderr and the log file). -o Control ('.spc') options for dylp. Default is to not look for an options file. Disabled on Windows. -m The problem ('.mps') specification. Defaults to stdin. -L A log of dylp's execution (default is no execution logging). -O The output file. Defaults to stdout unless the -s option is present, in which case the default is no output. -h Print this help message and exit. -v Print version and exit. The -m option is just an alternate way to specify the . The error log file is a duplicate of the error messages printed on stderr; the execution log file is a duplicate of output on stdout unless -s is specified to suppress output to stdout. */ #include #include #include #include extern "C" { #include "dy_cmdint.h" #include "dylp.h" extern bool dy_mpsin(const char *filename, consys_struct **consys, double infinity) ; extern void dy_initbasis(int concnt, int factor_freq, double zero_tol) ; extern void dy_freebasis() ; /* From time.h, but not, apparently, ctime */ extern struct tm *localtime_r(const time_t *clock, struct tm *res) ; } namespace { char sccsid[] UNUSED = "@(#)osi+dylp.cpp 1.4 09/25/04" ; char svnid[] UNUSED = "$Id: osi+dylp.cpp 216 2008-03-19 23:03:32Z lou $" ; } const char *osidylp_version = "1.4" ; /* sccs! */ const char *osidylp_time ; /* Variables which control i/o operations. ttyout i/o id for output to the user's terminal ttyin i/o id for input from the user's terminal dy_cmdchn i/o id for input from the command file dy_logchn i/o id for the execution log file dy_cmdecho controls echoing of command input to stdout dy_gtxecho controls echoing of generated text to stdout */ ioid dy_cmdchn,dy_logchn ; bool dy_cmdecho,dy_gtxecho ; /* File paths used elsewhere in osi_dylp. outpath: Output file; the optimal solution is written here, as well as intermediate incumbent solutions (if requested). Intermediate incumbent solutions are solutions which improve on the previous solution (hence become the incumbent). Used in fathom:check_incumbent */ const char *outpath ; int lponly_print_level; /* stephent */ consys_struct *main_sys ; lpprob_struct *main_lp ; lpopts_struct *main_lpopts ; lptols_struct *main_lptols ; namespace { /* Routines to produce the version and help messages. The code looks better if these are off to the side. */ void print_version (ioid chn, bool echo, const char *cmd, const char *nme, const char *ver) /* Print version, copyright, and free software disclaimer. */ { const char *disc1 = "This is free software; see the source for copying" " conditions. There is NO" ; const char *disc2 = "warranty; not even for MERCHANTABILITY or FITNESS FOR A" " PARTICULAR PURPOSE." ; outfmt(dy_logchn,dy_gtxecho,"\n%s (%s) V %s",cmd,nme,ver) ; outfmt(dy_logchn,dy_gtxecho,"\nCopyright (C) 2004 Lou Hafer") ; outfmt(dy_logchn,dy_gtxecho,"\n%s\n%s\n",disc1,disc2) ; return ; } void print_help (ioid chn, bool echo, const char *name) /* Print help message. */ { outfmt(chn,echo,"\nusage: %s [] []",name) ; outfmt(chn,echo,"\n\nThe options presently in place are:\n") ; outfmt(chn,echo,"\n %s\t\t\t%s","-s", "Run silent: turns off echo of all generated text to") ; outfmt(chn,echo,"\n\t\t\t%s", "stdout. The default output-file path is changed") ; outfmt(chn,echo,"\n\t\t\t%s", "from stdout to NULL. Silent overpowers terse, in") ; outfmt(chn,echo,"\n\t\t\t%s","the event both are specified.") ; outfmt(chn,echo,"\n %s\t\t\t%s","-t", "Terse output on stdout. Behaviour is as for silent,") ; outfmt(chn,echo,"\n\t\t\t%s", "but allows an opening title and closing message") ; outfmt(chn,echo,"\n\t\t\t%s","giving the result of the LP.") ; outfmt(chn,echo,"\n %s\t\t\t%s","-p ", "Set overall print level to , [0..5].") ; outfmt(chn,echo,"\n %s\t%s","-e ", "Source text for error messages (defaults to") ; outfmt(chn,echo,"\n\t\t\t%s","dy_errmsgs.txt).") ; outfmt(chn,echo,"\n %s\t%s","-E ", "A logging file for error messages (default is to") ; outfmt(chn,echo,"\n\t\t\t%s","direct error messages to the log file).") ; outfmt(chn,echo,"\n %s\t%s","-o ", # if defined(_MSC_VER) || defined(__MSVCRT__) "Disabled on Windows.") ; # else "Control ('.spc') options file (default is no file).") ; # endif outfmt(chn,echo,"\n %s\t%s","-m ", "The problem ('.mps') specification. Defaults to stdin.") ; outfmt(chn,echo,"\n %s\t\t%s","-L ", "A log of execution (default is no execution") ; outfmt(chn,echo,"\n\t\t\t%s","logging).") ; outfmt(chn,echo,"\n %s\t%s","-O ", "The output file. Defaults to stdout unless the -s") ; outfmt(chn,echo,"\n\t\t\t%s", "option is present, in which case the default is no") ; outfmt(chn,echo,"\n\t\t\t%s","output.") ; outfmt(chn,echo,"\n %s\t\t\t%s","-h", "Print this help message and exit.") ; outfmt(chn,echo,"\n %s\t\t\t%s","-v", "Print version and exit.") ; outfmt(chn,echo,"\n\n%s%s", "The -m option is just an alternate way to specify the", ".") ; outfmt(chn,echo,"\n\n%s\n%s\n%s\n", "The error log file is a duplicate of the error messages printed on", "stderr; the execution log file is a duplicate of output on stdout unless", "-s is specified to suppress output to stdout.") ; return ; } /* A few utility routines to produce run time information. */ void get_timeval (struct timeval *tv) /* Call getrusage to retrieve the user and system time, sum them, and return the lot as a timeval. Parameters: tv: (i/o) timeval structure, will be filled with the current time Returns: undefined */ { struct rusage ruse ; /* Retrieve the current time. */ if (getrusage(RUSAGE_SELF,&ruse) < 0) { tv->tv_sec = 0 ; tv->tv_usec = 0 ; return ; } /* Sum up the user and system time and return it. I'm assuming that the number of usecs. in the tv_usec field is always less than 1e6 (i.e., less than 1 sec.) and therefore it's safe to simply add user and system values without worrying about integer overflow. */ tv->tv_usec = ruse.ru_utime.tv_usec+ruse.ru_stime.tv_usec ; tv->tv_sec = tv->tv_usec/((int) 1e6) ; tv->tv_usec = tv->tv_usec%((int) 1e6) ; tv->tv_sec += ruse.ru_utime.tv_sec ; tv->tv_sec += ruse.ru_stime.tv_sec ; return ; } void add_timevals (struct timeval *sum, struct timeval *end, struct timeval *start) /* Calculate sum = end-start in timeval's. Parameters: start,end: start and end timevals. sum: (o) timeval to be filled in with the sum Returns: undefined */ { /* Normalise the start and end timevals. */ if (start->tv_usec > 1e6) { start->tv_sec += start->tv_usec/((int) 1e6) ; start->tv_usec = start->tv_usec%((int) 1e6) ; } if (end->tv_usec > 1e6) { end->tv_sec += end->tv_usec/((int) 1e6) ; end->tv_usec = end->tv_usec%((int) 1e6) ; } /* Do the addition, then normalise the result. */ sum->tv_usec = end->tv_usec+start->tv_usec ; sum->tv_sec = end->tv_sec+start->tv_sec ; if (sum->tv_usec >= 1e6) { sum->tv_sec += sum->tv_usec/((int) 1e6) ; sum->tv_usec = sum->tv_usec%((int) 1e6) ; } return ; } void sub_timevals (struct timeval *diff, struct timeval *end, struct timeval *start) /* Calculate diff = end-start in timeval's. Parameters: start,end: start and end timevals. diff: (o) timeval to be filled in with the difference Returns: undefined */ { /* Normalise the start and end timevals. */ if (start->tv_usec > 1e6) { start->tv_sec += start->tv_usec/((int) 1e6) ; start->tv_usec = start->tv_usec%((int) 1e6) ; } if (end->tv_usec > 1e6) { end->tv_sec += end->tv_usec/((int) 1e6) ; end->tv_usec = end->tv_usec%((int) 1e6) ; } /* Do the subtraction. We may have to borrow a few usecs. */ if (end->tv_usec < start->tv_usec) { end->tv_usec += (int) 1e6 ; end->tv_sec-- ; } diff->tv_usec = end->tv_usec-start->tv_usec ; diff->tv_sec = end->tv_sec-start->tv_sec ; return ; } void prt_timeval (ioid chn, bool echo, struct timeval *tv) /* A little local utility to print a timeval as hh:mm:ss.ss. Parameters: chn: output channel id echo: controls echo to stdout tv: timeval to be printed Returns: undefined */ { int hrs, mins, secs, csecs ; hrs = tv->tv_sec/3600 ; mins = tv->tv_sec%3600 ; secs = mins%60 ; mins = mins/60 ; csecs = tv->tv_usec/1e4 ; outfmt(chn,echo,"%d:%02d:%02d.%02d",hrs,mins,secs,csecs) ; return ; } void stats_lp (const char *outpath, bool echo, lpprob_struct *lp, struct timeval *lptime, lpstats_struct *lpstats) /* A little shell routine to handle writing detailed statistics on an LP to the output file. Parameters: outpath: the output file path name. echo: TRUE to echo to stdout, FALSE otherwise lp: lp problem structure lptime: elapsed time for call to do_lp lpstats: lp statistics structure Returns : undefined */ { ioid chn ; int vndx,bpos ; const char *rtnnme = "stats_lp" ; /* Set up the output. Don't echo this to stdout twice. */ if (outpath == NULL) { warn(2,rtnnme,"file name") ; chn = IOID_NOSTRM ; } else { chn = pathtoid(outpath,NULL) ; if (chn == IOID_INV) chn = openfile(outpath,"w") ; if (chn == IOID_INV) { warn(10,rtnnme,outpath,"w") ; chn = IOID_NOSTRM ; } if (strcmp(outpath,"stdout") == 0) echo = FALSE ; } /* Print a few items from the lp structure --- name, status, pivot count, and lp return code. */ if (lp == NULL) { outfmt(chn,echo, "\n\n<< %s: LP problem structure is NULL! >>\n", rtnnme) ; } else { outfmt(chn,echo,"\n\nSystem: %s\t\t\tfinal status: %s after %d iterations.", lp->consys->nme,dy_prtlpphase(lp->phase,FALSE),lp->iters) ; if (lp->phase == dyDONE) { outfmt(chn,echo,"\n lp status: %s",dy_prtlpret(lp->lpret)) ; switch (lp->lpret) { case lpOPTIMAL: { outfmt(chn,echo,"\t\tobjective: %.9g",lp->obj) ; break ; } case lpINFEAS: { outfmt(chn,echo,"\t\tinfeasibility: %.9g",lp->obj) ; break ; } case lpUNBOUNDED: { if (lp->obj != 0) { if (lp->obj < 0) { vndx = abs((int) lp->obj) ; bpos = -1 ; } else { vndx = (int) lp->obj ; bpos = 1 ; } outfmt(chn,echo,"\t\tunbounded variable %s (%d) (%s)", consys_nme(lp->consys,'v',vndx,FALSE,NULL),vndx, (bpos < 0)?"decreasing":"increasing") ; } break ; } default: { break ; } } } if (lptime != NULL) { outfmt(chn,echo,"\n lp time: ") ; prt_timeval(chn,echo,lptime) ; outfmt(chn,echo," (%.2f)",lptime->tv_sec+lptime->tv_usec/1e6) ; } } # ifdef DYLP_STATISTICS if (lpstats != NULL) dy_dumpstats(chn,echo,lpstats,lp->consys) ; # endif outfmt(chn,echo,"\n") ; flushio(chn,echo) ; return ; } lpret_enum do_lp_all (struct timeval *elapsed) /* This routine is a wrapper which makes up the difference between the setup completed in the main program and the setup expected by dylp_dolp. Structures are created for the lp problem, options, tolerances, and statistics, and passed to dylp_dolp. Once the lp completes, the stats are printed and the statistics structure is released. Other cleanup is handled in main. Returns: lp status code; lpINV is used in the event of a fatal error that's not really dylp's fault. */ { int ndx,i,flips ; bool *flipped ; lpret_enum lpret ; lpopts_struct *initial_lpopts ; lpstats_struct *initial_lpstats ; basis_struct *basis ; struct timeval diff,before,after ; const char *rtnnme = "do_lp_all" ; lpret = lpINV ; /* Create and initialise the main_lp structure to pass the problem in to dylp. */ main_lp = (lpprob_struct *) CALLOC(1,sizeof(lpprob_struct)) ; main_lp->phase = dyINV ; main_lp->consys = main_sys ; main_lp->rowsze = main_sys->rowsze ; main_lp->colsze = main_sys->colsze ; /* Step through the constraints and replace ax >= b constraints with (-a)x <= -b constraints. consys_mulrow will take care of the necessary modifications. Normally this would be handled in mpsin, along with the deletion of empty constraints, but the OSI test suite isn't tolerant of changing the sense of constraints, let alone removing a few. Arguably a good thing. */ flipped = (bool *) CALLOC(main_sys->concnt+1,sizeof(bool)) ; flips = 0 ; for (ndx = main_sys->concnt ; ndx > 0 ; ndx--) { if (main_sys->ctyp[ndx] == contypGE) { if (consys_mulrow(main_sys,ndx,-1) == FALSE) { errmsg(112,rtnnme,main_sys->nme,"scalar multiply","row", consys_nme(main_sys,'c',ndx,FALSE,NULL),ndx) ; FREE(flipped) ; return (lpFATAL) ; } flipped[ndx] = TRUE ; flips++ ; } } /* Set up options, statistics, and solve the lp. After we're done, dump the statistics and free the dylp statistics structure. */ initial_lpopts = (lpopts_struct *) MALLOC(sizeof(lpopts_struct)) ; memcpy(initial_lpopts,main_lpopts,sizeof(lpopts_struct)) ; initial_lpopts->forcecold = TRUE ; dy_setprintopts(lponly_print_level,initial_lpopts) ; # ifdef DYLP_STATISTICS initial_lpstats = NULL ; dy_initstats(&initial_lpstats,main_sys) ; # else initial_lpstats = NULL ; # endif get_timeval(&before) ; lpret = dylp(main_lp,initial_lpopts,main_lptols,initial_lpstats) ; get_timeval(&after) ; sub_timevals(&diff,&after,&before) ; if (elapsed != NULL) (*elapsed) = diff ; stats_lp(outpath,FALSE,main_lp,&diff,initial_lpstats) ; # ifdef DYLP_STATISTICS dy_freestats(&initial_lpstats) ; # endif /* Time to undo any constraint flips. We also have to tweak the corresponding duals --- flipping the sign of a row in the basis corresponds to flipping the sign of a column in the basis inverse, which means that the sign of the corresponding dual is flipped. This requires a little care --- if we're in dynamic mode, some constraints may be inactive. */ if (flips > 0) { for (ndx = main_sys->concnt ; ndx > 0 ; ndx--) { if (flipped[ndx] == TRUE) { if (consys_mulrow(main_sys,ndx,-1) == FALSE) { errmsg(112,rtnnme,main_sys->nme,"scalar multiply","row", consys_nme(main_sys,'c',ndx,FALSE,NULL),ndx) ; FREE(flipped) ; return (lpFATAL) ; } } } if (main_lp->y != NULL) { basis = main_lp->basis ; for (ndx = 0 ; ndx < basis->len ; ndx++) { i = basis->el[ndx].cndx ; if (flipped[i] == TRUE) main_lp->y[ndx] = -main_lp->y[ndx] ; } } } FREE(flipped) ; if (initial_lpopts != NULL) FREE(initial_lpopts) ; return (lpret) ; } } /* End unnamed namespace declaration block */ int main (int argc, char *argv[]) { time_t timeval ; struct tm tm ; char runtime[50] ; ioid ttyin,ttyout,outchn ; int optlett,printlvl ; bool silent,terse,swaperrs,errecho,doversion,dohelp ; const char *errmsgpath ; const char *errlogpath ; const char *optpath ; const char *mpspath ; const char *logpath ; struct timeval lptime ; const char *rtnnme = argv[0] ; /* For getopt() */ const char *optstring = "e:stpE:o:m:L:O:hv"; /* Set up some defaults, then process the command line options. This is all very specific to Unix and SunOS. */ errmsgpath = "dy_errmsgs.txt" ; errlogpath = NULL ; optpath = NULL ; mpspath = NULL ; outpath = NULL ; logpath = NULL ; ttyout = IOID_INV ; ttyin = IOID_INV ; dy_logchn = IOID_INV ; outchn = IOID_INV ; silent = FALSE ; terse = FALSE ; dy_gtxecho = TRUE ; dy_cmdecho = FALSE ; doversion = FALSE ; dohelp = FALSE ; printlvl = -1 ; opterr = 0 ; for (optlett = getopt(argc,argv,optstring) ; optlett != -1 ; optlett = getopt(argc,argv,optstring)) switch (optlett) { case 'e': { errmsgpath = optarg ; break ; } case 'E': { errlogpath = optarg ; break ; } case 'o': { optpath = optarg ; break ; } case 'm': { mpspath = optarg ; break ; } case 'L': { logpath = optarg ; break ; } case 'O': { outpath = optarg ; break ; } case 's': { silent = TRUE ; dy_gtxecho = FALSE ; break ; } case 't': { terse = TRUE ; dy_gtxecho = FALSE ; break ; } case 'p': { printlvl = atoi(optarg) ; break ; } case 'v': { doversion = TRUE ; break ; } case 'h': { dohelp = TRUE ; break ; } case '?': { errinit(errmsgpath,errlogpath,TRUE) ; ioinit() ; errmsg(3,rtnnme,"command line option",optopt) ; exit (1) ; } } /* If there's still a parameter left, it must be the mps file, specified without using the -m option. There should not be more than one parameter remaining. */ if (optind < argc) { mpspath = argv[optind] ; optind++ ; } if (optind < argc) { dohelp = TRUE ; } /* LP-only setup. */ if (silent == TRUE) lponly_print_level = 0 ; else if (terse == TRUE) lponly_print_level = 1 ; else lponly_print_level = 2 ; if (printlvl >= 0) lponly_print_level = printlvl ; /* Output file name: if the user hasn't specified one, and we're not running silent, default to stdout. */ if (outpath == NULL && silent == FALSE) outpath = "stdout" ; /* Grab the time and format it nicely. */ if (time(&timeval) == (time_t)(-1)) { warn(19,rtnnme) ; osidylp_time = "n/a" ; } else { (void) localtime_r(&timeval,&tm) ; strftime(runtime,sizeof(runtime),"%A, %B %d, %Y, %I:%M:%S %p",&tm) ; osidylp_time = runtime ; } /* Figure out the appropriate settings for silent and terse. silent is set to (silent || terse), and is passed to process_cmds so that it can properly handle dy_cmdecho and dy_gtxecho. terse is set for ease of controlling the output specifically mentioned in conjunction with terse mode (which is controlled from this routine). The proper value is (terse || !silent). The cryptic little if statement below accomplishes this (try a decision tree to convince yourself). */ if (terse == TRUE) { if (silent == TRUE) terse = FALSE ; else silent = TRUE ; } else { if (silent == FALSE) terse = TRUE ; } /* Execute initialization routines for the i/o and error reporting packages. */ if (silent == TRUE) errecho = FALSE ; else errecho = TRUE ; errinit(errmsgpath,errlogpath,errecho) ; if (ioinit() != TRUE) { errmsg(1,rtnnme,__LINE__) ; exit (2) ; } /* Connect ttyout to the standard output. Initialize ttyin, setting the mode to line-oriented. Serious internal confusion if we can't manage these. Set the initial command input channel to stdin. */ ttyout = openfile("stdout","w") ; if (ttyout == IOID_INV) { errmsg(1,rtnnme,__LINE__) ; exit(3) ; } ttyin = openfile("stdin","r") ; if (ttyin == IOID_INV) { errmsg(1,rtnnme,__LINE__) ; exit(4) ; } (void) setmode(ttyin,'l') ; dy_cmdchn = ttyin ; /* Initialize logging. */ if (logpath != NULL) { dy_logchn = openfile(logpath,"w") ; if (dy_logchn == IOID_INV) { warn(201,rtnnme,logpath) ; dy_logchn = IOID_NOSTRM ; } } else { dy_logchn = IOID_NOSTRM ; } /* Are we supposed to merge the error messages with the log stream? (Note that errors will be echoed to stderr unless we're running silent. If the user's turned off logging too, well, it's their business.) swaperrs just tells the code that it should reset the error logging channel if it ever resets the main logging channel. */ if (errlogpath == NULL && dy_logchn != IOID_NOSTRM) { swaperrs = TRUE ; errlogpath = logpath ; if (chgerrlog(errlogpath,errecho) == FALSE) { warn(18,rtnnme,"",errlogpath) ; } } /* Ok, after all that work, check if we've been asked for the version or usage messages. If so, do it and head for the exit. Version preempts help. */ if (doversion == TRUE) { print_version(dy_logchn,dy_gtxecho,argv[0],rtnnme,osidylp_version) ; goto NOOUTFILE_CLEANUP ; } if (dohelp == TRUE) { print_help(dy_logchn,dy_gtxecho,argv[0]) ; goto NOOUTFILE_CLEANUP ; } /* We're up! Banners to the appropriate places. */ outfmt(dy_logchn,terse,"\n\t\t %s\tV %s\n",rtnnme,osidylp_version) ; outfmt(dy_logchn,terse,"\n\t\t%s",runtime) ; outfmt(dy_logchn,terse,"\n\n") ; if (outpath != NULL && strcmp(outpath,"stdout") != 0) { outchn = pathtoid(outpath,NULL) ; if (outchn == IOID_INV) outchn = openfile(outpath,"w") ; if (outchn == IOID_INV) { warn(10,rtnnme,outpath,"w") ; } else { outfmt(outchn,FALSE,"\n\t\t %s\tV %s\n",rtnnme,osidylp_version) ; outfmt(outchn,FALSE,"\n\t\t%s",runtime) ; outfmt(outchn,FALSE,"\n\n") ; } } /* Time to set up the lp options. Establish a set of defaults, then read the options file to see what the user has in mind. For reasons that escape me at the moment, the parser fails on Windows. This may get fixed eventually. For now, disabled by the simple expedient of forcing optpath to NULL. */ dy_defaults(&main_lpopts,&main_lptols) ; # if defined(_MSC_VER) || defined(__MSVCRT__) optpath = NULL ; # endif if (optpath != NULL) { dy_cmdchn = openfile(optpath,"r") ; if (dy_cmdchn == IOID_INV) exit (1) ; (void) setmode(dy_cmdchn,'l') ; switch (process_cmds(silent)) { case cmdOK: { break ; } case cmdHALTERROR: { exit (1) ; } case cmdHALTNOERROR: { exit (0) ; } default: { exit (1) ; } } if (dy_cmdchn != ttyin) { (void) closefile(dy_cmdchn) ; dy_cmdchn = IOID_INV ; } } /* Make an attempt to read the mps input file. */ if (dy_mpsin(mpspath,&main_sys,main_lptols->inf) == FALSE) { exit (10) ;} /* Check over the option settings, now that we know how big the constraint system will be. */ dy_checkdefaults(main_sys,main_lpopts,main_lptols) ; /* Initialise the basis maintenance package. The second parameter controls how many basis updates the basis can hold before it requires refactoring. Adding 5 to dylp's refactor interval should give a safety margin. */ dy_initbasis(2*main_sys->concnt,main_lpopts->factor+5,0) ; /* Run the lp. */ if (do_lp_all(&lptime) == FALSE) { errmsg(202,rtnnme,main_sys->nme) ; exit (20) ; } /* Should we produce any output? Print to a file, if requested. */ if (outchn != IOID_INV && outchn != ttyout) { dy_dumpcompact(outchn,FALSE,main_lp,FALSE) ; } /* Any final terminal output we should do? */ if (lponly_print_level >= 1) { if (lponly_print_level >= 2) { dy_dumpcompact(dy_logchn,(dy_logchn == IOID_INV)?TRUE:FALSE,main_lp,FALSE) ; } outfmt(dy_logchn,TRUE,"\nReturn code %s",dy_prtlpret(main_lp->lpret)) ; if (main_lp->phase == dyDONE) outfmt(dy_logchn,TRUE," after %d pivots",main_lp->iters) ; if (main_lp->lpret == lpOPTIMAL) { outfmt(dy_logchn,TRUE,"; objective %.8g",main_lp->obj) ; } outfmt(dy_logchn,TRUE," (%.2f sec.)",lptime.tv_sec+lptime.tv_usec/1e6) ; outfmt(dy_logchn,TRUE,".\n") ; flushio(dy_logchn,dy_gtxecho) ; } /* Final cleanup. Free space used by the remaining main_* structures. */ dy_freebasis() ; if (main_lp != NULL) { dy_freesoln(main_lp) ; if (main_lp->consys != NULL) consys_free(main_lp->consys) ; FREE(main_lp) ; } if (main_lpopts != NULL) FREE(main_lpopts) ; if (main_lptols != NULL) FREE(main_lptols) ; /* Leap to here for shutdown when we opened the output file but didn't solve an LP. */ NOLP_CLEANUP: if (outchn != IOID_INV && outchn != ttyout) { (void) closefile(outchn) ; } /* Leap to here for shutdown in cases where we never get as far as opening an output file. We still need to close the log file and shut down the i/o subsystem. */ NOOUTFILE_CLEANUP: if (dy_logchn != IOID_INV && dy_logchn != IOID_NOSTRM) { (void) closefile(dy_logchn) ; } ioterm() ; errterm() ; exit(0) ; /* Just to suppress the silly warning from the compiler, which isn't satisfied with the immediately preceding `exit'. */ return (0) ; } DyLP-1.6.0/DyLP/examples/generic.spc0000644000076700007670000000174710442173473014053 0ustar ! Generic options file specifying copious printing and a few other random ! options. (Comments in an options file start with an `!'.) See the dylp ! printed documentation (Dylp/Doc) for a thorough explanation of options. ! If you're wondering where this comes from, it's an accretion of various ! options that I find handy while debugging -- lh -- ! lpcontrol scaling 0 ; ! lpcontrol dualacttype 3 ; lpcontrol infinity DBL_MAX ; lpprint major 1 ; lpprint phase1 4 ; lpprint phase2 4 : ; lpprint dual 4 ; lpprint pricing 0 ; lpprint pivoting 1 ; lpprint pivreject 2 ; lpprint degen 1 ; lpprint scaling 2 ; lpprint basis 5 ; lpprint crash 1 ; lpprint setup 2 ; lpprint conmgmt 1 ; lpprint varmgmt 1 ; ! lpcontrol antidegen false ; ! lpcontrol iter 550 ; ! lpcontrol idle 100 ; ! lpcontrol final purge variables false, constraints false ; ! lpcontrol load 1.0 [180 90), (90 0] ; lpcontrol fullsys true ; lpcontrol coldbasis logical ; ! lpcontrol usedual false ; ! lpcontrol dualmultipiv 0 ; DyLP-1.6.0/DyLP/examples/mpsio.c0000644000076700007670000015440111021636556013217 0ustar /* This file is a portion of the Dylp LP distribution. Copyright (C) 2004 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* There are two conditional compilation symbols in this file, BONSAIG and COIN_HAS_DYLP. BONSAIG should be defined only if you're building BonsaiG. COIN_HAS_DYLP should be defined only if you're trying to use this MPS reader instead of the COIN MPS i/o routines. Almost certainly, you don't want to define BONSAIG, and COIN_HAS_DYLP will be defined as appropriate in DylpConfig.h. */ /* This file contains C subroutines to parse MPS format problem files. The capabilities are compatible with the 'Free Format' MPS format. But ... this parser won't handle some of the strange things that are legal in MPS `fixed' format (column names with spaces in them, for instance). The general format of an MPS file is NAME name_of_model ROWS row data COLUMNS column data RHS right-hand-side data RANGES range data BOUNDS bounds data ENDATA where the RHS, RANGES, and BOUNDS sections are optional. Data lines consist of 6 fields. The number of fields actually used varies. The general format is: sense, nam0, nam1, val1, nam2, val2 (2-3) (5-12) (15-22) (25-36) (40-47) (50-61) where sense is a character code, or blank; nam0, nam1, and nam2 are names, and val1 and val2 are numbers. The column numbers for fixed-format input are shown in ()'s below the field name. See the MPS documentation for more details. Fine points that're ignored here: * In the NAME section, nam1 should be FREE for free format input; mpsin doesn't require it. Just the opposite --- we always work in free format. * The standard interprets a '$' at the beginning of nam1 or nam2 to mean the rest of the line is a comment. mpsin will see the '$' anywhere in the line. Taking our lead from OSL, this code does not support Dx codes in the rows section or 'SCALE' markers. Just cause it's a pain and we don't need it, mpsin doesn't support multiple RHS, RANGE, or BOUNDS vectors. Nor does it support 'no constraint' rows, except for a single row which is taken as the objective function. Markers of the form: 'MARKER' 'INTORG' 'MARKER' 'INTEND' in the COLUMNS section are used to bracket blocks of integer variables. The code will recognise binary variables as integer variables with bounds of 0 and 1, or the BV code can be used in the BOUNDS section. SOS Type 3 variables (clique constraints) are also supported by mpsin. The MPS 'MARKER' statement is used, with the keywords 'SOSORG' and 'SOSEND'. An equality constraint must be defined in the ROWS section of the MPS file; coefficients of 1 and a rhs of 1 will be generated by default. For example, if there are two SOS Type 3 sets, as follows: Variables Constraints --------- ----------- SOS set 1 sos1var1 sosname1,someeq1,someeq2, sos1var2 sosname1,someeq4 SOS set 2 sos2var1 sosname2,someeq2,someeq3,someeq4 sos2var2 sosname2,someeq1,someeq3 Then the input would look like: ROWS .... E sosname1 L someeq1 G someeq2 .... E sosname2 .... E someeq3 L someeq4 .... COLUMNS sosname1 'MARKER' 'SOSORG' sos1var1 someeq1 6.25 someeq2 245 sos1var2 someeq4 15 'MARKER' 'SOSEND' sosname2 'MARKER' 'SOSORG' sos2var1 someeq2 102.5 someeq4 5.388 sos2var1 someeq3 24.8 sos2var2 someeq1 76.5 someeq3 82.55 'MARKER' 'SOSEND' */ #include "dy_cmdint.h" #include "dylp.h" #include "dylib_hash.h" #include "dylib_strrtns.h" #include #include #ifndef BONSAIG /* We need to provide a definition for mipopts_struct in the OsiDylp configuration. Usually this comes in with bonsaiG's milp.h. */ typedef struct { int minmax ; int objcon ; double zinit ; const char *objnme ; } mipopts_struct ; #else # include "milp.h" #endif static char sccsid[] UNUSED = "@(#)mpsio.c 4.4 11/06/04" ; static char svnid[] UNUSED = "$Id: mpsio.c 239 2008-06-05 01:12:14Z lou $" ; /* A bunch of definitions and declarations for mpsin and its slave routines. Separator characters -- these are used by mpsin and slave routines as the separator set for strtok. The exotics (\n, \r, \f, \v) aren't mentioned. They just shouldn't show up in a valid mps file. */ static const char *sepchars = " \t" ; /* State codes -- these define where we're at in processing the mps input file. */ typedef enum { mpsinINV = 0, mpsinNAME, mpsinROWS, mpsinCOLUMNS, mpsinRHS, mpsinRANGES, mpsinBOUNDS, mpsinENDDATA } mpsinstate_enum ; /* Hash tables -- used to translate row and column names to indices. */ static hel **conhash,**varhash ; static int conhashsze,varhashsze ; #define CONHASHSZE_DFLT 211 #define VARHASHSZE_DFLT 211 /* Linked list head for Type 3 Special Ordered Sets (the only kind that bonsai supports just now. */ static lnk_struct *sos3lst ; static lex_struct *getmpsline (ioid mpschn) /* This routine scans lines from the the file specified by mpschn. Blank lines and comments (lines starting with "*") are discarded. In-line comments (from the occurrence of "$" to the end of the line) are also stripped. Parameters: mpschn: stream for the MPS input Returns: a pointer to a lex_struct; on normal return, the type will be DY_LCQS; other possibilities are DY_LCEOF (end-of-file) and DY_LCERR (i/o error) NOTE: The lex_struct returned by getmpsline is owned by dyio_scanstr. The string buffer it contains is allocated by scanstr and will be freed by scanstr on the next call unless lex.string is set to NULL. The mps input routines make copies of the pieces they need and allow scanstr to handle allocating and freeing the buffer. */ { lex_struct *lex ; char *cptr ; bool empty ; /* Fire up a loop to read lines. A line that's all white space will come back from dyio_scanstr as DY_LCNIL. If there's something in the line, check for comments. If there's still a line left after peeling off the comment, we've got something. */ empty = TRUE ; while (empty == TRUE) { lex = dyio_scanstr(mpschn,DY_LCQS,0,'\0','\n') ; if (lex->class == DY_LCEOF || lex->class == DY_LCERR) break ; if (lex->class == DY_LCNIL) continue ; /* If the last character is ^M (carriage return), strip it. Likely we're looking at a file produced on a system where ends a line. */ cptr = &lex->string[strlen(lex->string)-1] ; if (*cptr == '\r') *cptr = '\0' ; /* Check for full line or partial line comments. */ if (*lex->string == '*') continue ; cptr = strchr(lex->string,'$') ; if (cptr != NULL) *cptr = '\0' ; if ((int) strlen(lex->string) > 0) empty = FALSE ; } return (lex) ; } static mpsinstate_enum mpsin_name (ioid mpschn, consys_struct **consys, double infinity) /* This routine handles the NAME section of the MPS file. It should have the form name FREE and it should be the first line of the file (blank lines & comments excepted, of course). Parameters: mpschn: input stream consys: (o) the newly created constraint system infinity: the value to be used for infinity Returns: mpsinROWS unless there's a problem, in which case it returns mpsinINV */ { lex_struct *lex ; char *tok ; const char *rtnnme = "mpsin_name", *mysection = "name" ; # ifndef NDEBUG /* Paranoia */ if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (mpsinINV) ; } # endif /* Find the "name" keyword. */ lex = getmpsline(mpschn) ; if (lex->class == DY_LCERR) { errmsg(168,rtnnme,mysection) ; return (mpsinINV) ; } if (lex->class == DY_LCEOF) { errmsg(169,rtnnme,mysection) ; return (mpsinINV) ; } tok = strtok(lex->string,sepchars) ; if (tok == NULL || cistrcmp(tok,"name") != 0) { errmsg(150,rtnnme,mysection,(tok == NULL)?"":tok) ; return (mpsinINV) ; } /* And now the name itself. If we get a name, create the constraint system. */ tok = strtok(NULL,sepchars) ; if (tok == NULL) { errmsg(151,rtnnme,mysection,"indicator") ; return (mpsinINV) ; } *consys = consys_create(tok,0,CONSYS_WRNATT,10,10,infinity) ; if (*consys == NULL) { errmsg(152,rtnnme,tok) ; return (mpsinINV) ; } # ifndef NDEBUG dyio_outfmt(dy_logchn,dy_gtxecho,"\n\treading model %s.\n",(*consys)->nme) ; # endif /* Check for the keyword "free", which should follow the name, and issue a warning if it isn't there. This is such a common error that it's not worth complaining about unless we're paranoid. [May 28, 2001] Warning about the absence of the keyword "free" becomes annoying in the testing of osi-bonsai. We disable the warning permanently. */ tok = strtok(NULL,sepchars) ; # if 0 if (tok == NULL || cistrcmp(tok,"free") != 0) warn(150,rtnnme,"free",(tok == NULL)?"":tok) ; # endif /* Now check for the "rows" keyword that marks the start of the rows section. It's an error to see anything else. */ lex = getmpsline(mpschn) ; if (lex->class == DY_LCERR) { errmsg(168,rtnnme,mysection) ; return (mpsinINV) ; } if (lex->class == DY_LCEOF) { errmsg(169,rtnnme,mysection) ; return (mpsinINV) ; } tok = strtok(lex->string,sepchars) ; if (tok == NULL || cistrcmp(tok,"rows") != 0) { errmsg(150,rtnnme,"rows",(tok == NULL)?"":tok) ; return (mpsinINV) ; } return (mpsinROWS) ; } static mpsinstate_enum mpsin_rows (ioid mpschn, consys_struct *consys) /* This routine is responsible for processing the "rows" section, which provides the names and types for all constraints (the constraint stub, so to speak). If a name is passed in consys->objnme, the routine will look for this row and make it the objective. If consys->objnme is null, the routine will choose the first non-binding constraint to be the objective, placing the name in consys->objnme. In either case, the index is returned in consys->objndx. Non-binding constraints are discarded, with a warning to the user (with the exception that the first one may be chosen as the objective). Parameters: mpschn: input stream consys: (i) newly minted constraint system (o) constraint system with constraint stubs and constraint type array. Returns: mpsinCOLUMNS if all goes well, mpsinINV otherwise. */ { lex_struct *lex ; char typelett,*tok ; contyp_enum typecode ; bool seen_cols,keep_row ; pkvec_struct *pkrow ; const char *rtnnme = "mpsin_rows", *mysection = "rows" ; /* Set up to process the rows. Create a hash table for the row names, associate a constraint type vector with the system, and make a trivial vector to use as a parameter to consys_addrow_pk. */ conhashsze = CONHASHSZE_DFLT ; conhash = (hel **) CALLOC(conhashsze,sizeof(hel *)) ; pkrow = pkvec_new(0) ; if (consys_attach(consys,CONSYS_CTYP, sizeof(contyp_enum),(void **) &consys->ctyp) == FALSE) { errmsg(100,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_CTYP)) ; return (mpsinINV) ; } setflg(consys->parts,CONSYS_CTYP) ; /* Now start up a loop and process the row entries. Each entry is of the form , where the legal constraint types are n,e,l, or g. The various dx codes are not recognized. The correct escape from the loop is spotting the "columns" indicator. */ seen_cols = FALSE ; consys->objndx = -1 ; for (lex = getmpsline(mpschn) ; lex->class == DY_LCQS ; lex = getmpsline(mpschn)) { tok = strtok(lex->string,sepchars) ; if (cistrcmp(tok,"columns") == 0) { seen_cols = TRUE ; break ; } /* Keep the type letter and get the name of the constraint. Check that each is valid. Skip a non-binding constraint unless it'll be used as the objective, and warn the user that we're skipping it. (But we'll need to put the name in the hash table, so we'll be able to identify and skip coefficients of the constraint when we process the COLUMNS section.) */ typelett = *tok ; tok = strtok(NULL,sepchars) ; if (tok == NULL) { errmsg(153,rtnnme,"constraint",mysection) ; return (mpsinINV) ; } keep_row = TRUE ; switch (typelett) { case 'N': case 'n': { typecode = contypNB ; if (!(consys->objndx <= 0 && (consys->objnme == NULL || strcmp(tok,consys->objnme) == 0))) { warn(172,rtnnme,consys->nme,tok) ; keep_row = FALSE ; } break ; } case 'E': case 'e': { typecode = contypEQ ; break ; } case 'L': case 'l': { typecode = contypLE ; break ; } case 'G': case 'g': { typecode = contypGE ; break ; } case 'D': case 'd': { errmsg(171,rtnnme,tok) ; return (mpsinINV) ; } default: { errmsg(154,rtnnme,consys->nme,(unsigned) typelett,typelett,tok) ; return (mpsinINV) ; } } /* Install the constraint (unless it's a superfluous contypNB). The objective goes in like any other constraint, and will be postprocessed into the objective vector (but remember that we've found it). */ pkrow->nme = tok ; if (keep_row == TRUE) { if (consys_addrow_pk(consys, 'a',typecode,pkrow,0.0,0.0,NULL,NULL) == FALSE) { errmsg(156,rtnnme,"constraint",consys->nme,pkrow->nme) ; return (mpsinINV) ; } if (typecode == contypNB) { consys->objndx = pkrow->ndx ; if (consys->objnme == NULL) consys->objnme = STRALLOC(pkrow->nme) ; } } else { pkrow->ndx = -1 ; } if ((void *) pkrow->ndx != enter(STRALLOC(pkrow->nme),conhash,conhashsze,(void *) pkrow->ndx)) { errmsg(155,rtnnme,"constraint", consys_nme(consys,'c',pkrow->ndx,TRUE,NULL)) ; return (mpsinINV) ; } /* Check for garbage at the end of the line, and complain if there is any. */ tok = strtok(NULL,sepchars) ; if (tok != NULL) warn(157,rtnnme,tok,"constraint",pkrow->nme) ; } /* This is the end of the loop which parses the rows section. Check that we got here because we saw the "columns" indicator, and fail if things are otherwise. Also make sure we've found an objective function. */ pkrow->nme = NULL ; pkvec_free(pkrow) ; # ifndef NDEBUG dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t(%s) read %d constraints from the MPS file.", rtnnme,consys->archccnt) ; # endif if (seen_cols == FALSE) { if (lex->class == DY_LCERR) errmsg(168,rtnnme,mysection) ; else if (lex->class == DY_LCEOF) errmsg(169,rtnnme,mysection) ; else errmsg(1,rtnnme,__LINE__) ; return (mpsinINV) ; } if (consys->objndx < 0) { errmsg(177,rtnnme,consys->nme, (consys->objnme == NULL)?"":consys->objnme) ; return (mpsinINV) ; } return (mpsinCOLUMNS) ; } static mpsinstate_enum mpsin_columns (ioid mpschn, consys_struct *consys) /* This routine is responsible for processing the columns section, which provides names and types for variables and the coefficients of the constraint matrix, in column-major order. It also deals with the various markers that can appear in the columns section. Parameters: mpschn: input stream consys: (i) constraint system with constraint stubs and constraint type array (o) constraint system with coefficient matrix, constraint and variable type arrays Returns: successful returns will be one of mpsinRHS, mpsinBOUNDS, mpsinRANGES, or mpsinENDDATA, depending on the presence (absence) of optional sections; in the event of an error, mpsinINV */ { bool marker, sosset, intblk ; double aij ; int rowndx,sosndx ; mpsinstate_enum nxtstate ; vartyp_enum vartype ; lex_struct *lex ; lnk_struct *sos3 ; pkvec_struct *pkcol ; char *rownam,*tok,*chkptr ; char colnam[50] ; /* grossly oversized, but safe */ const char *rtnnme = "mpsin_columns", *mysection = "columns" ; /* Set up to process the columns. Create a hash table for the variable names, a vector to hold the column coefficients, and associate a variable type vector with the constraint system. Note the use of colnam as the buffer for pkcol->nme. pkcol->nme is `const char *' so we'll always write to colnam, but we'll use pkcol->nme in other places. */ varhashsze = VARHASHSZE_DFLT ; varhash = (hel **) CALLOC(varhashsze,sizeof(hel *)) ; pkcol = pkvec_new(maxx(10,((int) .2*consys->concnt))) ; pkcol->nme = colnam ; colnam[0] = '\0' ; if (consys_attach(consys,CONSYS_VTYP, sizeof(vartyp_enum),(void **) &consys->vtyp) == FALSE) { errmsg(100,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_VTYP)) ; return (mpsinINV) ; } setflg(consys->parts,CONSYS_VTYP) ; sos3lst = NULL ; nxtstate = mpsinINV ; /* Now try to parse the coefficients of the constraint matrix. The general idea is to collect a column, then install it. Note that MPS requires all elements of a column to be given together. Each line is of the form where the second row name and coeff are optional. The name of the column being processed is held in pkcol->nme. We pretend we've just processed a marker to force the start of a new column without installing the (non- existent) previous column. */ marker = TRUE ; sosset = FALSE ; sosndx = -1 ; intblk = FALSE ; pkcol->cnt = 0 ; vartype = vartypCON ; for (lex = getmpsline(mpschn) ; lex->class == DY_LCQS ; lex = getmpsline(mpschn)) { /* Scan the first token and see if it matches the current column name. If it doesn't, there are two possibilities: * We've just finished collecting the coefficients of a column (marker == FALSE) and are about to move to something new. * We've just finished processing a marker (marker == TRUE) and we're about to move to something new. Markers require no residual action. But in the first case, we have to install the column in the constraint system and reset the vector to 0 length. */ tok = strtok(lex->string,sepchars) ; if (cistrcmp(pkcol->nme,tok) != 0) { if (marker == FALSE) { if (consys_addcol_pk(consys,vartype,pkcol,0.0,0.0,0.0) == FALSE) { errmsg(156,rtnnme,"column",consys->nme,pkcol->nme) ; return (mpsinINV) ; } if ((void *) pkcol->ndx != enter(STRALLOC(pkcol->nme),varhash,varhashsze,(void *) pkcol->ndx)) { errmsg(155,rtnnme,"variable", consys_nme(consys,'v',pkcol->ndx,TRUE,NULL)) ; return (mpsinINV) ; } pkcol->cnt = 0 ; pkcol->nme = colnam ; colnam[0] = '\0' ; } /* Just what is 'something new'? First check for any of the section keywords: rhs, ranges, bounds, or enddata. Any of them are valid escapes out of the columns section. Change the state and exit the loop. */ if (cistrcmp(tok,"rhs") == 0 || cistrcmp(tok,"rhs'") == 0) nxtstate = mpsinRHS ; else if (cistrcmp(tok,"ranges") == 0) nxtstate = mpsinRANGES ; else if (cistrcmp(tok,"bounds") == 0) nxtstate = mpsinBOUNDS ; else if (cistrcmp(tok,"enddata") == 0) nxtstate = mpsinENDDATA ; if (nxtstate != mpsinINV) break ; /* Perhaps 'something new' is a marker. Check for one of the markers that we recognise. The token we've already parsed becomes the new 'column name'. The next token should be 'marker' (quotes included), and the one after that will tell us what sort of marker. Possibilities are sosorg, sosend, intorg, intend. At the end of if (marker), we'll continue to force the next iteration of the loop. */ strcpy(colnam,tok) ; tok = strtok(NULL,sepchars) ; if (tok == NULL) { errmsg(158,rtnnme,consys->nme,pkcol->nme) ; return (mpsinINV) ; } if (cistrcmp(tok,"'marker'") == 0) { marker = TRUE ; tok = strtok(NULL,sepchars) ; if (tok == NULL) { errmsg(159,rtnnme,consys->nme,pkcol->nme) ; return (mpsinINV) ; } /* sosorg/sosend bracket groups of variables which are SOS3. There is no limit on the number of groups. For a SOS3 group, the coefficients of the constraint (and, later, the rhs) are generated automatically. The 'column name' for the line is the name of the SOS constraint. The name with the sosend marker is not important. */ if (cistrcmp(tok,"'sosorg'") == 0) { if (sosset == TRUE) { errmsg(161,rtnnme,"sosorg",pkcol->nme,"sosend") ; return (mpsinINV) ; } sosndx = (int) lookup(pkcol->nme,conhash,conhashsze) ; if (sosndx == 0) { errmsg(162,rtnnme,"SOS constraint",pkcol->nme,"marker","sosorg") ; return (mpsinINV) ; } sosset = TRUE ; vartype = vartypBIN ; pkcol->coeffs[0].val = 1.0 ; pkcol->coeffs[0].ndx = sosndx ; pkcol->cnt++ ; sos3 = (lnk_struct *) MALLOC(sizeof(lnk_struct)) ; sos3->llnxt = sos3lst ; sos3lst = sos3 ; lnk_in(sos3,sosndx) ; } else if (cistrcmp(tok,"'sosend'") == 0) { if (sosset != TRUE) { errmsg(161,rtnnme,"sosend",pkcol->nme,"sosorg") ; return (mpsinINV) ; } sosset = FALSE ; vartype = vartypCON ; } /* intorg/intend bracket a group of integer variables. (Note that variables can also be specified as binary using the BV code in the bounds section). Nothing is done with the name assigned to intorg and intend markers. */ else if (cistrcmp(tok,"'intorg'") == 0) { if (intblk == TRUE) { errmsg(161,rtnnme,"intorg",pkcol->nme,"intend") ; return (mpsinINV) ; } intblk = TRUE ; vartype = vartypINT ; } else if (cistrcmp(tok,"'intend'") == 0) { if (intblk != TRUE) { errmsg(161,rtnnme,"intend",pkcol->nme,"intorg") ; return (mpsinINV) ; } intblk = FALSE ; vartype = vartypCON ; } else { errmsg(163,rtnnme,tok,pkcol->nme) ; return (mpsinINV) ; } continue ; } /* 'Something new' wasn't a keyword or marker; it must be the start of a new column. Reset the marker flag and drop through to the code that collects coefficients for a column. */ else { marker = FALSE ; } } else { tok = strtok(NULL,sepchars) ; } /* To get here, either the first token on this line matched, and we're in the middle of collecting a column, or 'something new' turned out to be a new column and we've fallen through from the previous code. The line contains one or two (row,coefficient) pairs. Parse them and stash them in the vector we're collecting. Note that the coefficients of the SOS equality for a SOS3 set are supplied by default, so suppress an explicit one if we see it. Also suppress explicit 0's, and any coefficients that belong to superfluous contypNB constraints. */ for ( ; tok != NULL ; tok = strtok(NULL,sepchars)) { rownam = tok ; tok = strtok(NULL,sepchars) ; if (tok == NULL) { errmsg(164,rtnnme,consys->nme,pkcol->nme,rownam) ; return (mpsinINV) ; } aij = strtod(tok,&chkptr) ; if (chkptr == tok || errno == ERANGE) { errmsg(165,rtnnme,tok,consys->nme,pkcol->nme,rownam) ; return (mpsinINV) ; } rowndx = (int) lookup(rownam,conhash,conhashsze) ; if (rowndx == 0) { errmsg(166,rtnnme,"constraint",rownam,"column",consys->nme,pkcol->nme) ; return (mpsinINV) ; } if (rowndx != -1) { if (aij != 0.0 && !(sosset == TRUE && rowndx == sosndx)) { if (pkcol->cnt >= pkcol->sze) if (pkvec_resize(pkcol,0) == FALSE) { errmsg(174,rtnnme,consys->nme,pkcol->nme) ; return (mpsinINV) ; } pkcol->coeffs[pkcol->cnt].val = aij ; pkcol->coeffs[pkcol->cnt].ndx = rowndx ; pkcol->cnt++ ; } } } } /* We've broken out of the loop -- if it isn't i/o error, clean up and return the next state code. */ if (nxtstate == mpsinINV) { if (lex->class == DY_LCERR) errmsg(168,rtnnme,mysection) ; else if (lex->class == DY_LCEOF) errmsg(169,rtnnme,mysection) ; else errmsg(1,rtnnme,__LINE__) ; return (mpsinINV) ; } pkcol->nme = NULL ; pkvec_free(pkcol) ; return (nxtstate) ; } static mpsinstate_enum mpsin_rhs (ioid mpschn, consys_struct *consys) /* This routine is responsible for processing the rhs section, which provides values for the right-hand-sides of the the constraints. Data lines in the rhs section are of the form: Basically, we're specifying a column vector of right-hand-side values, named rhs_vec_name, in the same way we specified column vectors for the coefficients. The pair is optional. Note that this code does not support multiple rhs vectors. Unfortunately, it seems we do need to entertain the possibility that is null. Parameters: mpschn: input stream consys: (i) constraint system with coefficient matrix, constraint and variable type arrays. (o) constraint system with coefficient matrix, rhs vector, constraint and variable type arrays Returns: successful returns will be one of mpsinRANGES, mpsinBOUNDS, or mpsinENDDATA, depending on the presence (absence) of optional sections; in the event of an error, mpsinINV */ { int rowndx ; double *rhs,aij ; bool named_vec ; mpsinstate_enum nxtstate ; lex_struct *lex ; char *tok,*rownme,*chkptr ; const char *rhsnme ; const char *rtnnme = "mpsin_rhs", *mysection = "rhs" ; /* Associate a rhs vector with the constraint system. */ if (consys_attach(consys,CONSYS_RHS, sizeof(double),(void **) &consys->rhs) == FALSE) { errmsg(100,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_RHS)) ; return (mpsinINV) ; } setflg(consys->parts,CONSYS_RHS) ; rhs = consys->rhs ; /* Check the first line to decide if this is a named vector or not. Given that the string scanner will insist on removing leading whitespace, the only way to tell is to count the number of tokens. An odd number indicates a named vector. An even number indicates the name is null. */ lex = getmpsline(mpschn) ; if (lex->class == DY_LCQS) { rowndx = 1 ; for (tok = strpbrk(lex->string,sepchars) ; tok != NULL ; tok = strpbrk(tok,sepchars)) { tok += strspn(tok,sepchars) ; if (*tok != '\0') rowndx++ ; } if (rowndx%2 != 0) { named_vec = TRUE ; rhsnme = NULL ; } else { named_vec = FALSE ; rhsnme = "" ; } } else { named_vec = FALSE ; rhsnme = "" ; } /* Now start to parse the rhs values. There are three possible escapes from this section: a ranges indicator, a bounds indicator, or an endata indicator. Ranges and bounds are optional sections, so we look for all three. */ nxtstate = mpsinINV ; for ( ; lex->class == DY_LCQS ; lex = getmpsline(mpschn)) { tok = strtok(lex->string,sepchars) ; if (cistrcmp(tok,"bounds") == 0) nxtstate = mpsinBOUNDS ; else if (cistrcmp(tok,"ranges") == 0) nxtstate = mpsinRANGES ; else if (cistrcmp(tok,"endata") == 0) nxtstate = mpsinENDDATA ; if (nxtstate != mpsinINV) break ; /* If this is the vector name, save it and parse the first row name. */ if (named_vec == TRUE) { rhsnme = tok ; tok = strtok(NULL,sepchars) ; } /* Start a loop to parse off the pairs. Hash the row name to get the row index, then try for the coefficient. If there are no errors, install the coefficient in the rhs vector. */ for ( ; tok != NULL ; tok = strtok(NULL,sepchars)) { rowndx = (int) lookup(tok,conhash,conhashsze) ; if (rowndx == 0) { errmsg(166,rtnnme,"constraint",tok,consys_assocnme(NULL,CONSYS_RHS), consys->nme,rhsnme) ; return (mpsinINV) ; } rownme = tok ; tok = strtok(NULL,sepchars) ; if (tok == NULL) { errmsg(164,rtnnme,consys->nme,rhsnme, consys_nme(consys,'c',rowndx,TRUE,NULL)) ; return (mpsinINV) ; } aij = strtod(tok,&chkptr) ; if (chkptr == tok || errno == ERANGE) { errmsg(165,rtnnme,tok,consys->nme,rhsnme,rownme) ; return (mpsinINV) ; } rhs[rowndx] = aij ; } } /* See if we're out of the loop due to an i/o error. */ if (nxtstate == mpsinINV) { if (lex->class == DY_LCERR) errmsg(168,rtnnme,mysection) ; else if (lex->class == DY_LCEOF) errmsg(169,rtnnme,mysection) ; else errmsg(1,rtnnme,__LINE__) ; return (mpsinINV) ; } return (nxtstate) ; } static mpsinstate_enum mpsin_ranges (ioid mpschn, consys_struct *consys) /* This routine is responsible for processing the ranges section, which provides a rhs range to establish constraints of the form blow < ax < b. The rules for incorporating range information are as follows: Constraint Type Range sign blow b --------------- ---------- ---------- ------- contypGE irrelevant b b+|range| contypLE irrelevant b-|range| b contypEQ + b b+|range| - b-|range| b In all cases, the constraint type becomes contypRNG. Data lines in the ranges section are identical in form and interpretation to rhs lines. Note that this code does not support multiple range vectors. Parameters: mpschn: input stream consys: (i) constraint system with coefficient matrix, rhs vector, constraint and variable type arrays (o) constraint system with coefficient matrix, rhs vector, constraint and variable type arrays Returns: successful returns will be one of mpsinBOUNDS or mpsinENDDATA, depending on the presence (absence) of optional sections; in the event of an error, mpsinINV */ { int rowndx ; double aij ; double *rhs,*rhslow ; bool named_vec ; contyp_enum *contyp ; mpsinstate_enum nxtstate ; lex_struct *lex ; const char *rngnme ; char *rownme,*tok,*chkptr ; const char *rtnnme = "mpsin_ranges", *mysection = "ranges" ; /* Associate a rhslow vector with the constraint system. Pick up the rhs and constraint type vectors. */ if (consys_attach(consys,CONSYS_RHSLOW, sizeof(double),(void **) &consys->rhslow) == FALSE) { errmsg(100,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_RHSLOW)) ; return (mpsinINV) ; } setflg(consys->parts,CONSYS_RHSLOW) ; rhslow = consys->rhslow ; rhs = consys->rhs ; contyp = consys->ctyp ; # ifndef NDEBUG if (rhs == NULL) { errmsg(160,rtnnme,mysection,consys_assocnme(consys,CONSYS_RHS)) ; return (mpsinINV) ; } if (contyp == NULL) { errmsg(160,rtnnme,mysection,consys_assocnme(consys,CONSYS_CTYP)) ; return (mpsinINV) ; } # endif /* Check the first line to decide if this is a named vector or not. Given that the string scanner will insist on removing leading whitespace, the only way to tell is to count the number of tokens. An odd number indicates a named vector. An even number indicates the name is null. */ lex = getmpsline(mpschn) ; if (lex->class == DY_LCQS) { rowndx = 1 ; for (tok = strpbrk(lex->string,sepchars) ; tok != NULL ; tok = strpbrk(tok,sepchars)) { tok += strspn(tok,sepchars) ; if (*tok != '\0') rowndx++ ; } if (rowndx%2 != 0) { named_vec = TRUE ; rngnme = NULL ; } else { named_vec = FALSE ; rngnme = "" ; } } else { named_vec = FALSE ; rngnme = "" ; } /* Now start to parse the range values. There are two possible escapes from this section: a bounds indicator or an endata indicator. Bounds is an optional section, so we look for both. */ nxtstate = mpsinINV ; for ( ; lex->class == DY_LCQS ; lex = getmpsline(mpschn)) { tok = strtok(lex->string,sepchars) ; if (cistrcmp(tok,"bounds") == 0) nxtstate = mpsinBOUNDS ; else if (cistrcmp(tok,"endata") == 0) nxtstate = mpsinENDDATA ; if (nxtstate != mpsinINV) break ; /* If this is the vector name, discard it and parse the first row name. */ if (named_vec == TRUE) { rngnme = tok ; tok = strtok(NULL,sepchars) ; } /* Start a loop to parse off the pairs. Hash the row name to get the row index, then try for the coefficient. */ for ( ; tok != NULL ; tok = strtok(NULL,sepchars)) { rowndx = (int) lookup(tok,conhash,conhashsze) ; if (rowndx == 0) { errmsg(166,rtnnme,"constraint",tok,"range vector",consys->nme,rngnme) ; return (mpsinINV) ; } rownme = tok ; tok = strtok(NULL,sepchars) ; if (tok == NULL) { errmsg(164,rtnnme,consys->nme,rngnme, consys_nme(consys,'c',rowndx,TRUE,NULL)) ; return (mpsinINV) ; } aij = strtod(tok,&chkptr) ; if (chkptr == tok || errno == ERANGE) { errmsg(165,rtnnme,tok,consys->nme,rngnme,rownme) ; return (mpsinINV) ; } /* We've got the row index and coefficient, so install the range. rhs, rhslow, and contyp may have to be modified, as described in the header comments. */ switch (contyp[rowndx]) { case contypEQ: { if (aij < 0) { rhslow[rowndx] = rhs[rowndx]+aij ; } else { rhslow[rowndx] = rhs[rowndx] ; rhs[rowndx] += aij ; } break ; } case contypGE: { rhslow[rowndx] = rhs[rowndx] ; rhs[rowndx] += fabs(aij) ; break ; } case contypLE: { rhslow[rowndx] = rhs[rowndx]-fabs(aij) ; break ; } case contypNB: { errmsg(175,rtnnme,consys_nme(consys,'c',rowndx,TRUE,NULL),rowndx) ; return (mpsinINV) ; } default: { errmsg(1,rtnnme,__LINE__) ; break ; } } contyp[rowndx] = contypRNG ; } } /* See if we're out of the loop due to an i/o error. */ if (nxtstate == mpsinINV) { if (lex->class == DY_LCERR) errmsg(168,rtnnme,mysection) ; else if (lex->class == DY_LCEOF) errmsg(169,rtnnme,mysection) ; else errmsg(1,rtnnme,__LINE__) ; return (mpsinINV) ; } return (nxtstate) ; } static mpsinstate_enum mpsin_bounds (ioid mpschn, consys_struct *consys) /* This routine is responsible for processing the bounds section, which specifies upper and lower bounds for variables. All variables start from the following default values: continous variables 0 -- +inf integer variables 0 -- 1 (i.e., assumed binary) These bounds are modified as follows by the bound type codes: LO sets the lower bound to the given value UP sets the upper bound to the given value UI sets the upper bound to the floor of the given value MI sets the lower bound to -inf PL sets the upper bound to +inf FR sets the lower bound to -inf and the upper bound to +inf (free) FX sets the lower and upper bounds to the given value (fixed) BV sets the lower bound to 0 and the upper bound to 1 Note that UI and BV have the side effect of converting the variable type to general integer and binary, respectively. Data lines in the bounds section have the format: The coeff is not needed for types MI, PL, FR, and BV. Note that this code does not support multiple bounds vectors. For this routine, the test for a null vector name is based on the MPS fixed field specification. We take the attitude that the only way we can reliably detect a blank name is if the user is obeying the strict fixed-field format rules and leaves all of nam0 blank. Parameters: mpschn: input stream consys: (i) constraint system with coefficient matrix, rhs vector, constraint and variable type arrays; rhslow optional. (o) constraint system with coefficient matrix, rhs vector, variable upper and lower bound vectors, constraint and variable type arrays; rhslow optional. Returns: mpsinENDDATA if all goes well; mpsinINV in the event of an error */ { int colndx ; double *vlb,*vub,aij,infinity ; vartyp_enum *vartyp ; bool seen_end,named_vec ; lex_struct *lex ; const char *bndnme ; char *varnme,*bndcode,*tok,*chkptr ; const char *rtnnme = "mpsin_bounds", *mysection = "bounds" ; /* Associate upper and lower bound vectors with the constraint system. These will be initialised to 0 and +inf, respectively, as they are allocated and attached. Pick up the variable type vector. */ if (consys_attach(consys,CONSYS_VUB, sizeof(double),(void **) &consys->vub) == FALSE) { errmsg(100,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_VUB)) ; return (mpsinINV) ; } setflg(consys->parts,CONSYS_VUB) ; vub = consys->vub ; infinity = consys->inf ; if (consys_attach(consys,CONSYS_VLB, sizeof(double),(void **) &consys->vlb) == FALSE) { errmsg(100,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_VLB)) ; return (mpsinINV) ; } setflg(consys->parts,CONSYS_VLB) ; vlb = consys->vlb ; /* Pick up the variable type vector. Walk the variables and reset the upper bound on any integer variables to 1. */ vartyp = consys->vtyp ; # ifndef NDEBUG if (vartyp == NULL) { errmsg(160,rtnnme,mysection,consys_assocnme(consys,CONSYS_VTYP)) ; return (mpsinINV) ; } # endif for (colndx = 1 ; colndx <= consys->archvcnt ; colndx++) { if (vartyp[colndx] == vartypINT || vartyp[colndx] == vartypBIN) vub[colndx] = 1 ; } /* Grab the first line and decide if this is a named vector or not. The only way we can have a null name is if the user is using fixed format. In this case, the bound code will occupy columns 2-3, the vector name columns 5-12, and the first variable name columns 15- 22. If the vector name is blank, we'll see 10 characters worth of space. */ lex = getmpsline(mpschn) ; if (lex->class == DY_LCQS) { tok = (lex->string)+3 ; if (strspn(tok,sepchars) == 10) { named_vec = FALSE ; bndnme = "" ; } else { named_vec = TRUE ; } } else { named_vec = FALSE ; bndnme = "" ; } /* Now start to parse the bound values. The only correct way out of the loop is to see the enddata indicator line. Guess that this is a named vector, and correct it below if we're wrong. */ seen_end = FALSE ; for ( ; lex->class == DY_LCQS ; lex = getmpsline(mpschn)) { tok = strtok(lex->string,sepchars) ; if (cistrcmp(tok,"endata") == 0) { seen_end = TRUE ; break ; } /* The first token on the line is the bound code. Then parse off the bound vector name, the variable name, and (if we need it) the bound value. */ bndcode = tok ; if (named_vec == TRUE) { bndnme = strtok(NULL,sepchars) ; if (bndnme == NULL) { errmsg(153,rtnnme,"bound vector name",mysection) ; return (mpsinINV) ; } } varnme = strtok(NULL,sepchars) ; if (varnme == NULL) { errmsg(153,rtnnme,"variable",mysection) ; return (mpsinINV) ; } colndx = (int) lookup(varnme,varhash,varhashsze) ; if (colndx == 0) { errmsg(162,rtnnme,"variable",varnme,consys->nme,mysection) ; return (mpsinINV) ; } aij = quiet_nan(0) ; if (cistrcmp(bndcode,"lo") == 0 || cistrcmp(bndcode,"up") == 0 || cistrcmp(bndcode,"fx") == 0 || cistrcmp(bndcode,"ui") == 0) { tok = strtok(NULL,sepchars) ; if (tok == NULL) { errmsg(164,rtnnme,consys->nme,varnme,mysection) ; return (mpsinINV) ; } aij = strtod(tok,&chkptr) ; if (chkptr == tok || errno == ERANGE) { errmsg(165,rtnnme,tok,consys->nme,varnme,mysection) ; return (mpsinINV) ; } } /* Begin a series of if statements, to see if we recognise the bound type. Adjust the bound(s) according to the bound specification. Various bound types require a few additional actions. For garden-variety upper & lower bounds, we just enter the bound in the appropriate vector. */ if (cistrcmp(bndcode,"lo") == 0) vlb[colndx] = aij ; else if (cistrcmp(bndcode,"up") == 0) { vub[colndx] = aij ; } /* For the ui code, we have to round aij down to the nearest integer. Force an integral variable type as well. */ else if (cistrcmp(bndcode,"ui") == 0) { vub[colndx] = floor(aij) ; if (vartyp[colndx] == vartypCON) { vartyp[colndx] = vartypINT ; consys->intvcnt++ ; } } /* For binary variables, we need to make sure the integer and binary counts are correct. */ else if (cistrcmp(bndcode,"bv") == 0) { if (vartyp[colndx] == vartypINT) consys->intvcnt-- ; vartyp[colndx] = vartypBIN ; consys->binvcnt++ ; vub[colndx] = 1.0 ; vlb[colndx] = 0.0 ; } /* The rest of these are straightforward. */ else if (cistrcmp(bndcode,"fx") == 0) { vub[colndx] = vlb[colndx] = aij ; } else if (cistrcmp(bndcode,"fr") == 0) { vub[colndx] = infinity ; vlb[colndx] = -infinity ; } else if (cistrcmp(bndcode,"pl") == 0) { vub[colndx] = infinity ; } else if (cistrcmp(bndcode,"mi") == 0) { vlb[colndx] = -infinity ; } /* Lastly, the error case, for a bound type we don't recognise. */ else { errmsg(167,rtnnme,bndcode,consys_nme(consys,'v',colndx,TRUE,NULL), colndx) ; return (mpsinINV) ; } } /* Check to see if we escaped the loop due to i/o error. */ if (seen_end == FALSE) { if (lex->class == DY_LCERR) errmsg(168,rtnnme,mysection) ; else if (lex->class == DY_LCEOF) errmsg(169,rtnnme,mysection) ; else errmsg(1,rtnnme,__LINE__) ; return (mpsinINV) ; } /* Otherwise, scan the bounds vectors and see if there are any integer variables that could be converted to binary, then return. */ for (colndx = 1 ; colndx <= consys->archvcnt ; colndx++) if (vartyp[colndx] == vartypINT && vub[colndx] == 1.0 && vlb[colndx] == 0.0) { vartyp[colndx] = vartypBIN ; consys->intvcnt-- ; consys->binvcnt++ ; } return (mpsinENDDATA) ; } static mpsinstate_enum mpsin_enddata (ioid mpschn, consys_struct *consys, mipopts_struct *mipopts) /* This routine does the cleanup. We copy the objective function from the constraint matrix to the objective vector, and delete the row. We go through the list of SOS3 sets and set the rhs value to 1 for each constraint. We convert all >= constraints to <= constraints (this results in considerable simplification at various places further along in the code). Finally, we free the hash tables and the string buffer used by dyio_scanstr. Parameters: consys: (i) complete constraint system (o) complete constraint system, with the objective function installed, and generally tidied up a bit. Returns: mpsinENDDATA if all goes well; mpsinINV in the event of an error (currently no errors are possible unless NDEBUG is undefined). */ { int ndx ; lnk_struct *sos3 ; pkvec_struct *pkvec ; hel *entry ; lex_struct *lex ; const char *rtnnme = "mpsin_enddata" ; #ifdef BONSAIG /* bonsaiG uses this; it's not present in the OsiDylp configuration. */ /* tourclass_utils.c */ extern bool tourclass_init(consys_struct *consys, hel **hashtab, int hashsize) ; #endif # ifdef PARANOIA if (consys->ctyp == NULL) { errmsg(101,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_CTYP)) ; return (mpsinINV) ; } if (consys->rhs == NULL) { errmsg(101,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_RHS)) ; return (mpsinINV) ; } if (consys->objndx <= 0 || consys->objndx > consys->archccnt) { errmsg(102,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_OBJ), 1,consys->archccnt) ; return (mpsinINV) ; } # endif /* Copy the objective function from the constraint matrix into the objective vector. If the user has specified a maximisation problem, we deal with it here by multiplying through by -1, so that the rest of the code always sees minimisation. If the objective function is to be used as a constraint, the form will be cx - x = 0, where x is installed as a free or upper-bounded variable. The initial value for the lower bound is -inf (later tightened to the value of the objective of the root LP relaxation). The initial value for the upper bound is mipopts.zinit, which defaults to +inf unless the user supplies a different value. The bound is tightened each time the incumbent solution is replaced. */ consys->obj = NULL ; if (consys_attach(consys,CONSYS_OBJ, sizeof(double),(void **) &consys->obj) == FALSE) { errmsg(100,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_OBJ)) ; return (mpsinINV) ; } setflg(consys->parts,CONSYS_OBJ) ; if (mipopts->minmax == -1) { if (consys_mulrow(consys,consys->objndx,-1.0) == FALSE) { errmsg(173,rtnnme,consys->nme, consys_nme(consys,'c',consys->objndx,FALSE,NULL),consys->objndx) ; return (mpsinINV) ; } } if (consys_getrow_ex(consys,consys->objndx,&consys->obj) == FALSE) { errmsg(112,rtnnme,"retrieve","row", consys_nme(consys,'c',consys->objndx,FALSE,NULL),consys->objndx) ; return (mpsinINV) ; } /* The OSI test suite doesn't take kindly to reordering the constraint system. consys_delrow_stable performs O(m) deletion, shifting all constraints down to fill a hole. */ if (mipopts->objcon == FALSE) #ifdef COIN_HAS_DYLP { if (consys_delrow_stable(consys,consys->objndx) == FALSE) #else { if (consys_delrow(consys,consys->objndx) == FALSE) #endif { errmsg(112,rtnnme,consys->nme,"delete","row", consys_nme(consys,'c',consys->objndx,FALSE,NULL),consys->objndx) ; return (mpsinINV) ; } } else { consys->ctyp[consys->objndx] = contypEQ ; pkvec = pkvec_new(1) ; pkvec->nme = STRALLOC("x") ; pkvec->dim = consys->concnt ; pkvec->dflt = 0 ; pkvec->cnt = 1 ; pkvec->coeffs[0].ndx = consys->objndx ; pkvec->coeffs[0].val = -1.0 ; if (consys_addcol_pk(consys,vartypCON, pkvec,0.0,-consys->inf,mipopts->zinit) == FALSE) { errmsg(156,rtnnme,"column",consys->nme,pkvec->nme) ; return (mpsinINV) ; } consys->xzndx = pkvec->ndx ; (void) STRFREE(pkvec->nme) ; pkvec_free(pkvec) ; pkvec = NULL ; } /* Walk the list of SOS3 sets, get the row index, and set the rhs entry to 1. Do some integrity checks while we're at it, provided debugging is enabled. */ for (sos3 = sos3lst ; sos3 != NULL ; sos3 = sos3->llnxt) { ndx = lnk_out(sos3,int) ; # ifndef NDEBUG if (ndx < 1 || ndx > consys->archccnt) { errmsg(102,rtnnme,consys->nme,"constraint",ndx,1,consys->archccnt) ; return (mpsinINV) ; } if (consys->ctyp[ndx] != contypEQ) { errmsg(176,rtnnme,consys_nme(consys,'c',ndx,TRUE,NULL),ndx, consys_prtcontyp(consys->ctyp[ndx])) ; return (mpsinINV) ; } # endif consys->rhs[ndx] = 1.0 ; } #ifndef COIN_HAS_DYLP /* Step through the constraints and replace ax >= b constraints with (-a)x <= -b constraints. consys_mulrow will take care of the necessary modifications. While we're at it, look for and delete rows with no coefficients. (Yes, it happens.) The OSI test suite does not like re-arrangement of constraints, or the removal of constraints, so disable this for OSI. We can do (and undo) the contypGE => contypLE conversion around the call to dylp. Fortunately, dylp can tolerate empty constraints. */ for (ndx = consys->archccnt ; ndx > 0 ; ndx--) { if (consys_infnormrow(consys,ndx) == 0) { warn(179,rtnnme,consys->nme,consys_nme(consys,'c',ndx,FALSE,NULL),ndx) ; if (consys_delrow(consys,ndx) == FALSE) { errmsg(112,rtnnme,consys->nme,"delete","row", consys_nme(consys,'c',ndx,FALSE,NULL),ndx) ; return (mpsinINV) ; } continue ; } if (consys->ctyp[ndx] == contypGE) { if (consys_mulrow(consys,ndx,-1.0) == FALSE) { errmsg(112,rtnnme,consys->nme,"scalar multiply","row", consys_nme(consys,'c',ndx,FALSE,NULL),ndx) ; return (mpsinINV) ; } } } #endif /* !COIN_HAS_DYLP */ #ifdef BONSAIG /* Convert the temporary data structure from the parse of tour class specifications into the permanent run-time structure. */ if (tourclass_init(consys,varhash,varhashsze) == FALSE) { errmsg(761,rtnnme) ; return (mpsinINV) ; } #endif /* Free the hash tables! */ for (ndx = 0 ; ndx < conhashsze ; ndx++) for (entry = conhash[ndx] ; entry != NULL ; entry = conhash[ndx]) { conhash[ndx] = entry->next ; STRFREE(entry->key) ; (void) FREE((char *) entry) ; } (void) FREE((char *) conhash) ; for (ndx = 0 ; ndx < varhashsze ; ndx++) for (entry = varhash[ndx] ; entry != NULL ; entry = varhash[ndx]) { varhash[ndx] = entry->next ; STRFREE(entry->key) ; (void) FREE((char *) entry) ; } (void) FREE((char *) varhash) ; /* Clean up after dyio_scanstr. */ lex = dyio_scanstr(mpschn,DY_LCQS,0,'\0','\0') ; if (lex->class == DY_LCQS && lex->string != NULL) { FREE(lex->string) ; lex->string = NULL ; } # ifndef NDEBUG dyio_outfmt(dy_logchn,dy_gtxecho,"\n\t(%s) read %d variables", rtnnme,consys->archvcnt) ; if (consys->intvcnt > 0 || consys->binvcnt > 0) dyio_outfmt(dy_logchn,dy_gtxecho, " (%d continuous, %d integer, %d binary)", consys->archvcnt-(consys->intvcnt+consys->binvcnt), consys->intvcnt,consys->binvcnt) ; dyio_outfmt(dy_logchn,dy_gtxecho, ".\n\t\tread %d non-zero coefficients from the MPS file.", consys->mtx.coeffcnt) ; if (consys->maxcolndx > 0) dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t\tthe longest column is %s, with %d entries.", consys_nme(consys,'v',consys->maxcolndx,FALSE,NULL), consys->maxcollen) ; if (consys->maxrowndx > 0) dyio_outfmt(dy_logchn,dy_gtxecho, "\n\t\tthe longest row is %s, with %d entries.\n", consys_nme(consys,'c',consys->maxrowndx,FALSE,NULL), consys->maxrowlen) ; # endif return (mpsinENDDATA) ; } static mpsinstate_enum mpsin_force (consys_struct *consys, mpsinstate_enum fromstate, mpsinstate_enum tostate) /* This routine installs default vectors when optional sections of the mps file are missing. It handles the rhs, range (rhslow), and variable bounds (vlb and vub). The operation of the routine is based on the requirement that optional sections of the mps file must occur in a fixed order: rhs, ranges, bounds. For example, a call with fromstate == mpsinRHS and tostate == mpsinRANGES will fill in a default for the rhs vector only. A call with fromstate == mpsinRANGES and tostate == mpsinENDDATA will fill in defaults for rhslow (ranges), and vlb and vub (bounds). Note that the default for rhslow is nothing -- if there are no range constraints in the mps file, we'll never need this vector. Parameters: consys: constraint system fromstate: the first section missing from the mps file. tostate: the next section actually present in the mps file. Returns: tostate, or mpsinINV if something goes wrong. */ { const char *rtnnme = "mpsin_force" ; /* The strategy here is that fromstate takes us to the appropriate starting state in the switch, and then we fall through the cases until we break out based on tostate. If we fall through to the final default case, we're in deep trouble. */ switch (fromstate) { case mpsinRHS: { if (consys_attach(consys,CONSYS_RHS, sizeof(double),(void **) &consys->rhs) == FALSE) { errmsg(100,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_RHS)) ; return (mpsinINV) ; } setflg(consys->parts,CONSYS_RHS) ; if (tostate == mpsinRANGES) break ; } case mpsinRANGES: { if (tostate == mpsinBOUNDS) break ; } case mpsinBOUNDS: { if (consys_attach(consys,CONSYS_VUB, sizeof(double),(void **) &consys->vub) == FALSE) { errmsg(100,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_VUB)) ; return (mpsinINV) ; } setflg(consys->parts,CONSYS_VUB) ; if (consys_attach(consys,CONSYS_VLB, sizeof(double),(void **) &consys->vlb) == FALSE) { errmsg(100,rtnnme,consys->nme,consys_assocnme(NULL,CONSYS_VLB)) ; return (mpsinINV) ; } setflg(consys->parts,CONSYS_VLB) ; if (tostate == mpsinENDDATA) break ; } default: { errmsg(1,rtnnme,__LINE__) ; return (mpsinINV) ; } } return (tostate) ; } bool mpsin (const char *mpspath, consys_struct **consys, mipopts_struct *mipopts, double infinity) /* This routine reads an MPS format input file and creates a constraint system structure to hold it. See the comments at the beginning of the file for info about the MPS standard. The overall organisation is a state machine, with one state for each section of the MPS file, plus a start state. If objnme is NULL, the default action defined by the MPS standard is to use the first non-binding constraint in the file as the objective function. Parameters: mpspath: file name of the MPS input file consys: (o) the constraint system objnme: the name of the objective function, or NULL infinity: the value to be used for infinity Returns: TRUE if the MPS file is successfully read into the internal data structures, FALSE otherwise. */ { ioid mpschn ; mpsinstate_enum nxtstate ; const char *rtnnme = "mpsin" ; /* Paranoia & initialisation. */ # ifndef NDEBUG if (consys == NULL) { errmsg(2,rtnnme,"consys") ; return (FALSE) ; } if (mpspath == NULL) { errmsg(2,rtnnme,"mpspath") ; return (FALSE) ; } if (mipopts == NULL) { errmsg(2,rtnnme,"mipopts") ; return (FALSE) ; } # endif /* Open the MPS input file. */ mpschn = dyio_openfile(mpspath,"r") ; if (mpschn == IOID_INV) return (FALSE) ; /* The main state machine for working through the file. Legal transitions are listed beside each case. */ nxtstate = mpsinNAME ; while (nxtstate != mpsinINV) switch (nxtstate) { case mpsinNAME: /* mpsinROWS */ { nxtstate = mpsin_name(mpschn,consys,infinity) ; if (nxtstate != mpsinINV) { if (mipopts->objnme == NULL) (*consys)->objnme = NULL ; else (*consys)->objnme = STRALLOC(mipopts->objnme) ; } break ; } case mpsinROWS: /* mpsinCOLUMNS */ { nxtstate = mpsin_rows(mpschn,*consys) ; break ; } case mpsinCOLUMNS: /* mpsinRHS, mpsinRANGES, mpsinBOUNDS, mpsinENDDATA */ { nxtstate = mpsin_columns(mpschn,*consys) ; if (nxtstate != mpsinRHS && nxtstate != mpsinINV) nxtstate = mpsin_force(*consys,mpsinRHS,nxtstate) ; break ; } case mpsinRHS: /* mpsinRANGES, mpsinBOUNDS, mpsinENDDATA */ { nxtstate = mpsin_rhs(mpschn,*consys) ; if (nxtstate != mpsinRANGES && nxtstate != mpsinINV) nxtstate = mpsin_force(*consys,mpsinRANGES,nxtstate) ; break ; } case mpsinRANGES: /* mpsinBOUNDS, mpsinENDDATA */ { nxtstate = mpsin_ranges(mpschn,*consys) ; if (nxtstate != mpsinBOUNDS && nxtstate != mpsinINV) nxtstate = mpsin_force(*consys,mpsinBOUNDS,nxtstate) ; break ; } case mpsinBOUNDS: /* mpsinENDDATA */ { nxtstate = mpsin_bounds(mpschn,*consys) ; break ; } case mpsinENDDATA: { nxtstate = mpsin_enddata(mpschn,*consys,mipopts) ; (void) dyio_closefile(mpschn) ; if (nxtstate == mpsinENDDATA) { if (mipopts->objnme == NULL) mipopts->objnme = STRALLOC((*consys)->objnme) ; return (TRUE) ; } break ; } default: { errmsg(1,rtnnme,__LINE__) ; nxtstate = mpsinINV ; break ; } } /* Something's screwed up if we reach here. */ errmsg(170,rtnnme,mpspath) ; return (FALSE) ; } #ifndef BONSAIG bool dy_mpsin (const char *mpspath, consys_struct **consys, double infinity) /* A wrapper routine to get from OsiDylp to mpsin. No need to bother OsiDylp with the bits of information that need to be present in mipopts. */ { bool retval ; mipopts_struct mipopts ; mipopts.minmax = 1 ; mipopts.objcon = FALSE ; mipopts.objnme = NULL ; retval = mpsin(mpspath,consys,&mipopts,infinity) ; if (mipopts.objnme != NULL) STRFREE(mipopts.objnme) ; return (retval) ; } #endif DyLP-1.6.0/DyLP/examples/osi_dylp.c0000644000076700007670000006361311266200573013713 0ustar /* This file is a portion of the Dylp LP distribution. Copyright (C) 2004 Lou Hafer, Stephen Tse Copyright (C) 2005 -- 2009 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains a main program and support routines sufficient to build a stand-alone lp solver using the version of dylp as modified for COIN/OSI. It's not necessarily pretty, but it should work adequately well. After processing any command line options, the program establishes basic facilities, reads and processes the options file, reads and processes the problem specification, calls dylp via a wrapper to solve the problem, prints the result and shuts down. The command line is expected to be of the form osi_dylp [] [] The options presently in place are: -s Run silent: turns off echo of all generated text to stdout. The default output-file path is changed from stdout to NULL. Silent overpowers terse, in the event both are specified. -t Terse output on stdout. Behaviour is as for silent, but allows an opening title and closing message giving the result of the LP. -p Set overall print level to , [0..5]. -e Source text for error messages (defaults to dy_errmsgs.txt). -E A logging file for error messages (default is to direct error messages to stderr and the log file). -o Control ('.spc') options for dylp. Default is to not look for an options file. Disabled on Windows. -m The problem ('.mps') specification. Defaults to stdin. -L A log of dylp's execution (default is no execution logging). -O The output file. Defaults to stdout unless the -s option is present, in which case the default is no output. -h Print this help message and exit. -v Print version and exit. The -m option is just an alternate way to specify the . The error log file is a duplicate of the error messages printed on stderr; the execution log file is a duplicate of output on stdout unless -s is specified to suppress output to stdout. */ #include /* We're getting close to the O/S here. Microsoft does it differently, of course. There's some disagreement in the unix community about what goes where, but I'm hoping that sys/time.h and sys/resource.h together will cover it. */ #include #if defined(_MSC_VER) || defined(__MSVCRT__) /* Nothing to do here. */ #else # include # include #endif #include "dy_cmdint.h" #include "dylp.h" static char sccsid[] UNUSED = "@(#)osi_dylp.c 1.10 09/25/04" ; static char svnid[] UNUSED = "$Id: osi_dylp.c 305 2009-10-16 23:27:55Z lou $" ; const char *osidylp_version = "1.10" ; /* sccs! */ const char *osidylp_time ; /* Macro cleverness to specify a default error message file. Depends on ANSI C merge of consecutive string constants. DYLP_ERRMSGDIR should have the form "path/to/distribution/DyLP/src/Dylp/", including the quotes. See DyLP/src/DylpStdLib/DylpConfig.h for further information. */ #ifdef DYLP_ERRMSGDIR # define DYLP_ERRMSGPATH DYLP_ERRMSGDIR "dy_errmsgs.txt" #else # define DYLP_ERRMSGPATH "dy_errmsgs.txt" #endif /* Variables which control i/o operations. ttyout i/o id for output to the user's terminal ttyin i/o id for input from the user's terminal dy_cmdchn i/o id for input from the command file dy_logchn i/o id for the execution log file dy_cmdecho controls echoing of command input to stdout dy_gtxecho controls echoing of generated text to stdout */ ioid dy_cmdchn,dy_logchn ; bool dy_cmdecho, dy_gtxecho ; /* File paths used elsewhere in osi_dylp. outpath: Output file; the optimal solution is written here, as well as intermediate incumbent solutions (if requested). Intermediate incumbent solutions are solutions which improve on the previous solution (hence become the incumbent). Used in fathom:check_incumbent */ const char *outpath ; consys_struct *main_sys ; lpprob_struct *main_lp ; lpopts_struct *main_lpopts ; lptols_struct *main_lptols ; /* Routines to produce the version and help messages. The code looks better if these are off to the side. */ static void print_version (ioid chn, bool echo, const char *cmd, const char *nme, const char *ver) /* Print version, copyright, and free software disclaimer. */ { const char *disc1 = "This is free software; see the source for copying" " conditions. There is NO" ; const char *disc2 = "warranty; not even for MERCHANTABILITY or FITNESS FOR A" " PARTICULAR PURPOSE." ; dyio_outfmt(dy_logchn,dy_gtxecho,"\n%s (%s) V %s",cmd,nme,ver) ; dyio_outfmt(dy_logchn,dy_gtxecho,"\nCopyright (C) 2004 Lou Hafer") ; dyio_outfmt(dy_logchn,dy_gtxecho,"\n%s\n%s\n",disc1,disc2) ; return ; } static void print_help (ioid chn, bool echo, const char *name) /* Print help message. */ { dyio_outfmt(chn,echo,"\nusage: %s [] []",name) ; dyio_outfmt(chn,echo,"\n\nThe options presently in place are:\n") ; dyio_outfmt(chn,echo,"\n %s\t\t\t%s","-s", "Run silent: turns off echo of all generated text to") ; dyio_outfmt(chn,echo,"\n\t\t\t%s", "stdout. The default output-file path is changed") ; dyio_outfmt(chn,echo,"\n\t\t\t%s", "from stdout to NULL. Silent overpowers terse, in") ; dyio_outfmt(chn,echo,"\n\t\t\t%s","the event both are specified.") ; dyio_outfmt(chn,echo,"\n %s\t\t\t%s","-t", "Terse output on stdout. Behaviour is as for silent,") ; dyio_outfmt(chn,echo,"\n\t\t\t%s", "but allows an opening title and closing message") ; dyio_outfmt(chn,echo,"\n\t\t\t%s","giving the result of the LP.") ; dyio_outfmt(chn,echo,"\n %s\t\t%s","-p ", "Set overall print level to , [0..5].") ; dyio_outfmt(chn,echo,"\n %s\t%s","-e ", "Source text for error messages (defaults to") ; dyio_outfmt(chn,echo,"\n\t\t\t%s","dy_errmsgs.txt).") ; dyio_outfmt(chn,echo,"\n %s\t%s","-E ", "A logging file for error messages (default is to") ; dyio_outfmt(chn,echo, "\n\t\t\t%s","direct error messages to the log file).") ; dyio_outfmt(chn,echo,"\n %s\t%s","-o ", # if defined(_MSC_VER) || defined(__MSVCRT__) "Disabled on Windows.") ; # else "Control ('.spc') options file (default is no file).") ; # endif dyio_outfmt(chn,echo,"\n %s\t%s","-m ", "The problem ('.mps') specification (no default).") ; dyio_outfmt(chn,echo,"\n %s\t\t%s","-L ", "A log of execution (default is no execution") ; dyio_outfmt(chn,echo,"\n\t\t\t%s","logging).") ; dyio_outfmt(chn,echo,"\n %s\t%s","-O ", "The output file. Defaults to stdout unless the -s or -t") ; dyio_outfmt(chn,echo,"\n\t\t\t%s", "options are present, in which case the default is no") ; dyio_outfmt(chn,echo,"\n\t\t\t%s","output.") ; dyio_outfmt(chn,echo,"\n %s\t\t\t%s","-h", "Print this help message and exit.") ; dyio_outfmt(chn,echo,"\n %s\t\t\t%s","-v", "Print version and exit.") ; dyio_outfmt(chn,echo,"\n\n%s %s", "The -m option is just an alternate way to specify the", ".") ; dyio_outfmt(chn,echo,"\n\n%s\n%s\n%s\n", "The error log file is a duplicate of the error messages printed on", "stderr; the execution log file is a duplicate of output on stdout unless", "-s is specified to suppress output to stdout.") ; return ; } /* A few utility routines to produce run time information. We're close to the O/S here, everyone has their own idea. `struct timeval' is the unix side of life. Microsoft just uses ticks. Microsecond timing is questionable at best, so maybe Microsoft has it right here. Easiest way to finesse this (coming from the Linux side) is to define a timeval structure. Then the only routine we need is get_timeval. */ #if defined(_MSC_VER) || defined(__MSVCRT__) typedef long int __time_t ; typedef long int __suseconds_t ; struct timeval { __time_t tv_sec ; __suseconds_t tv_usec ; } ; static void get_timeval (struct timeval *tv) /* Call the clock function to get time in ticks, and convert to seconds and microseconds. Parameter: tv: (i/o) timeval structure, will be filled with the current time Returns: undefined */ { double temp ; temp = (double) clock() ; temp /= CLOCKS_PER_SEC ; tv->tv_sec = (__time_t) temp ; temp -= tv->tv_sec ; tv->tv_usec = (__suseconds_t) (temp*(1e6)) ; return ; } #else /* end Microsoft (_MSC_VER, __MSVCRT__), start Linux version */ static void get_timeval (struct timeval *tv) /* Call getrusage to retrieve the user and system time, sum them, and return the lot as a timeval. Parameter: tv: (i/o) timeval structure, will be filled with the current time Returns: undefined */ { struct rusage ruse ; # ifndef NDEBUG /* Avoid a `read from unitialised' error. */ memset(&ruse,0,sizeof(struct rusage)) ; # endif /* Retrieve the current time. */ if (getrusage(RUSAGE_SELF,&ruse) < 0) { tv->tv_sec = 0 ; tv->tv_usec = 0 ; return ; } /* Sum up the user and system time and return it. I'm assuming that the number of usecs. in the tv_usec field is always less than 1e6 (i.e., less than 1 sec.) and therefore it's safe to simply add user and system values without worrying about integer overflow. */ tv->tv_usec = ruse.ru_utime.tv_usec+ruse.ru_stime.tv_usec ; tv->tv_sec = tv->tv_usec/((int) 1e6) ; tv->tv_usec = tv->tv_usec%((int) 1e6) ; tv->tv_sec += ruse.ru_utime.tv_sec ; tv->tv_sec += ruse.ru_stime.tv_sec ; return ; } # endif /* Microsoft/Linux time function */ static void sub_timevals (struct timeval *diff, struct timeval *end, struct timeval *start) /* Calculate diff = end-start in timeval's. Parameters: start,end: start and end timevals. diff: (o) timeval to be filled in with the difference Returns: undefined */ { /* Normalise the start and end timevals. */ if (start->tv_usec > 1e6) { start->tv_sec += start->tv_usec/((int) 1e6) ; start->tv_usec = start->tv_usec%((int) 1e6) ; } if (end->tv_usec > 1e6) { end->tv_sec += end->tv_usec/((int) 1e6) ; end->tv_usec = end->tv_usec%((int) 1e6) ; } /* Do the subtraction. We may have to borrow a few usecs. */ if (end->tv_usec < start->tv_usec) { end->tv_usec += (int) 1e6 ; end->tv_sec-- ; } diff->tv_usec = end->tv_usec-start->tv_usec ; diff->tv_sec = end->tv_sec-start->tv_sec ; return ; } static void prt_timeval (ioid chn, bool echo, struct timeval *tv) /* A little local utility to print a timeval as hh:mm:ss.ss. Parameters: chn: output channel id echo: controls echo to stdout tv: timeval to be printed Returns: undefined */ { int hrs, mins, secs, csecs ; hrs = tv->tv_sec/3600 ; mins = tv->tv_sec%3600 ; secs = mins%60 ; mins = mins/60 ; csecs = tv->tv_usec/1e4 ; dyio_outfmt(chn,echo,"%d:%02d:%02d.%02d",hrs,mins,secs,csecs) ; return ; } static void stats_lp (const char *outpath, bool echo, lpprob_struct *lp, struct timeval *lptime, lpstats_struct *lpstats) /* A little shell routine to handle writing detailed statistics on an LP to the output file. Parameters: outpath: the output file path name. echo: TRUE to echo to stdout, FALSE otherwise lp: lp problem structure lptime: elapsed time for call to do_lp lpstats: lp statistics structure Returns : undefined */ { ioid chn ; int vndx,bpos ; const char *rtnnme = "stats_lp" ; /* Set up the output. Don't echo this to stdout twice. */ if (outpath == NULL) { warn(2,rtnnme,"file name") ; chn = IOID_NOSTRM ; } else { chn = dyio_pathtoid(outpath,NULL) ; if (chn == IOID_INV) chn = dyio_openfile(outpath,"w") ; if (chn == IOID_INV) { warn(10,rtnnme,outpath,"w") ; chn = IOID_NOSTRM ; } if (strcmp(outpath,"stdout") == 0) echo = FALSE ; } /* Print a few items from the lp structure --- name, status, pivot count, and lp return code. */ if (lp == NULL) { dyio_outfmt(chn,echo, "\n\n<< %s: LP problem structure is NULL! >>\n", rtnnme) ; } else { dyio_outfmt(chn,echo, "\n\nSystem: %s\t\t\tfinal status: %s after %d iterations.", lp->consys->nme,dy_prtlpphase(lp->phase,FALSE),lp->iters) ; if (lp->phase == dyDONE) { dyio_outfmt(chn,echo,"\n lp status: %s",dy_prtlpret(lp->lpret)) ; switch (lp->lpret) { case lpOPTIMAL: { dyio_outfmt(chn,echo,"\t\tobjective: %.9g",lp->obj) ; break ; } case lpINFEAS: { dyio_outfmt(chn,echo,"\t\tinfeasibility: %.9g",lp->obj) ; break ; } case lpUNBOUNDED: { if (lp->obj != 0) { if (lp->obj < 0) { vndx = abs((int) lp->obj) ; bpos = -1 ; } else { vndx = (int) lp->obj ; bpos = 1 ; } dyio_outfmt(chn,echo,"\t\tunbounded variable %s (%d) (%s)", consys_nme(lp->consys,'v',vndx,FALSE,NULL),vndx, (bpos < 0)?"decreasing":"increasing") ; } break ; } default: { break ; } } } if (lptime != NULL) { dyio_outfmt(chn,echo,"\n lp time: ") ; prt_timeval(chn,echo,lptime) ; dyio_outfmt(chn,echo," (%.2f)",lptime->tv_sec+lptime->tv_usec/1e6) ; } } # ifdef DYLP_STATISTICS if (lpstats != NULL) dy_dumpstats(chn,echo,lpstats,lp->consys) ; # endif dyio_outfmt(chn,echo,"\n") ; dyio_flushio(chn,echo) ; return ; } static lpret_enum do_lp (struct timeval *elapsed, int printlvl) /* This routine is a wrapper which makes up the difference between the setup completed in the main program and the setup expected by dylp. Structures are created for the lp problem, options, tolerances, and statistics, and passed to dylp. Once the lp completes, the stats are printed and the statistics structure is released. Other cleanup is handled in main. Returns: lp status code; lpINV is used in the event of a fatal error that's not really dylp's fault. */ { int ndx,i,flips ; bool *flipped ; lpret_enum lpret ; lpopts_struct *initial_lpopts ; lpstats_struct *initial_lpstats ; basis_struct *basis ; struct timeval diff,before,after ; const char *rtnnme = "do_lp" ; lpret = lpINV ; /* Create and initialise the main_lp structure to pass the problem in to dylp. */ main_lp = (lpprob_struct *) CALLOC(1,sizeof(lpprob_struct)) ; main_lp->phase = dyINV ; main_lp->consys = main_sys ; main_lp->rowsze = main_sys->rowsze ; main_lp->colsze = main_sys->colsze ; /* Set up options, statistics, and solve the lp. After we're done, dump the statistics and free the dylp statistics structure. The options specified in the main routine (cold start using a logical basis and the full constraint system) are appropriate for the initial solution of an LP. In particular, if you're modifying this driver to do more than just solve the LP (for example, if you want access to tableau information after dylp returns with an answer) you really want to set the lpctlNOFREE flag in main_lp->ctlopts. See the comments in dylp.h for the available flags. */ initial_lpopts = (lpopts_struct *) MALLOC(sizeof(lpopts_struct)) ; memcpy(initial_lpopts,main_lpopts,sizeof(lpopts_struct)) ; dy_setprintopts(printlvl,initial_lpopts) ; # ifdef DYLP_STATISTICS initial_lpstats = NULL ; dy_initstats(&initial_lpstats,main_sys) ; # else initial_lpstats = NULL ; # endif get_timeval(&before) ; lpret = dylp(main_lp,initial_lpopts,main_lptols,initial_lpstats) ; get_timeval(&after) ; sub_timevals(&diff,&after,&before) ; if (elapsed != NULL) (*elapsed) = diff ; stats_lp(outpath,FALSE,main_lp,&diff,initial_lpstats) ; # ifdef DYLP_STATISTICS dy_freestats(&initial_lpstats) ; # endif if (initial_lpopts != NULL) FREE(initial_lpopts) ; return (lpret) ; } int main (int argc, char *argv[]) { time_t timeval ; struct tm *tm ; char runtime[50] ; ioid ttyin,ttyout,outchn ; int optlett,printlvl ; bool silent,terse,swaperrs,errecho,doversion,dohelp ; const char *errmsgpath,*errlogpath,*optpath,*mpspath,*logpath ; struct timeval lptime ; const char *rtnnme = argv[0] ; /* getopt() --- we need explicit declarations under strict ANSI compliance mode. This function seems to be quite common, however. Present in GCC. */ int getopt(int argc, char*const *argv, const char *optstring) ; extern char *optarg ; extern int opterr,optind,optopt ; const char *optstring = "e:stp:E:o:m:L:O:hv"; extern struct tm *localtime(const time_t *clock) ; /* mpsio.c */ extern bool dy_mpsin(const char *mpspath, consys_struct **consys, double infinity); /* dy_basis.c */ extern void dy_initbasis(int concnt, int factor_freq, double zero_tol), dy_freebasis(void) ; /* Set up some defaults, then process the command line options. This is all very specific to Unix and SunOS. */ errmsgpath = DYLP_ERRMSGPATH ; errlogpath = NULL ; optpath = NULL ; mpspath = NULL ; outpath = NULL ; logpath = NULL ; ttyout = IOID_INV ; ttyin = IOID_INV ; dy_logchn = IOID_INV ; outchn = IOID_INV ; silent = FALSE ; terse = FALSE ; dy_gtxecho = TRUE ; dy_cmdecho = FALSE ; doversion = FALSE ; dohelp = FALSE ; printlvl = -1 ; opterr = 0 ; for (optlett = getopt(argc,argv,optstring) ; optlett != -1 ; optlett = getopt(argc,argv,optstring)) switch (optlett) { case 'e': { errmsgpath = optarg ; break ; } case 'E': { errlogpath = optarg ; break ; } case 'o': { optpath = optarg ; break ; } case 'm': { mpspath = optarg ; break ; } case 'L': { logpath = optarg ; break ; } case 'O': { outpath = optarg ; break ; } case 's': { silent = TRUE ; dy_gtxecho = FALSE ; break ; } case 't': { terse = TRUE ; dy_gtxecho = FALSE ; break ; } case 'p': { printlvl = atoi(optarg) ; break ; } case 'v': { doversion = TRUE ; break ; } case 'h': { dohelp = TRUE ; break ; } case '?': { errinit(errmsgpath,errlogpath,TRUE) ; dyio_ioinit() ; errmsg(3,rtnnme,"command line option",optopt) ; exit (1) ; } } /* If there's still a parameter left, it must be the mps file, specified without using the -m option. There should not be more than one parameter remaining. */ if (optind < argc) { mpspath = argv[optind] ; optind++ ; } if (optind < argc) { dohelp = TRUE ; } /* What's our output level? If the user has specified a print level, go with it. Otherwise, take a cue from any -s or -t flags. Default to print level 2. */ if (printlvl < 0) { if (silent == TRUE) printlvl = 0 ; else if (terse == TRUE) printlvl = 1 ; else printlvl = 2 ; } /* Output file name: if the user hasn't specified one, and we're not running silent, default to stdout. */ if (outpath == NULL && silent == FALSE) outpath = "stdout" ; /* Grab the time and format it nicely. */ if (time(&timeval) == (time_t)(-1)) { warn(19,rtnnme) ; osidylp_time = "n/a" ; } else { tm = localtime(&timeval) ; if (tm != NULL) { strftime(runtime,sizeof(runtime),"%A, %B %d, %Y, %I:%M:%S %p",tm) ; osidylp_time = runtime ; } else { osidylp_time = "n/a" ; } } /* Figure out the appropriate settings for silent and terse. silent is set to (silent || terse), and is passed to process_cmds so that it can properly handle dy_cmdecho and dy_gtxecho. terse is set for ease of controlling the output specifically mentioned in conjunction with terse mode (which is controlled from this routine). The proper value is (terse || !silent). The cryptic little if statement below accomplishes this (try a decision tree to convince yourself). */ if (terse == TRUE) { if (silent == TRUE) terse = FALSE ; else silent = TRUE ; } else { if (silent == FALSE) terse = TRUE ; } /* Execute initialization routines for the i/o and error reporting packages. */ if (silent == TRUE) errecho = FALSE ; else errecho = TRUE ; errinit(errmsgpath,errlogpath,errecho) ; if (dyio_ioinit() != TRUE) { errmsg(1,rtnnme,__LINE__) ; exit (2) ; } /* Connect ttyout to the standard output. Initialize ttyin, setting the mode to line-oriented. Serious internal confusion if we can't manage these. Set the initial command input channel to stdin. */ ttyout = dyio_openfile("stdout","w") ; if (ttyout == IOID_INV) { errmsg(1,rtnnme,__LINE__) ; exit(3) ; } ttyin = dyio_openfile("stdin","r") ; if (ttyin == IOID_INV) { errmsg(1,rtnnme,__LINE__) ; exit(4) ; } (void) dyio_setmode(ttyin,'l') ; dy_cmdchn = ttyin ; /* Initialize logging. */ if (logpath != NULL) { dy_logchn = dyio_openfile(logpath,"w") ; if (dy_logchn == IOID_INV) { warn(201,rtnnme,logpath) ; dy_logchn = IOID_NOSTRM ; } } else { dy_logchn = IOID_NOSTRM ; } /* Are we supposed to merge the error messages with the log stream? (Note that errors will be echoed to stderr unless we're running silent. If the user's turned off logging too, well, it's their business.) swaperrs just tells the code that it should reset the error logging channel if it ever resets the main logging channel. */ if (errlogpath == NULL && dy_logchn != IOID_NOSTRM) { swaperrs = TRUE ; errlogpath = logpath ; if (dyio_chgerrlog(errlogpath,errecho) == FALSE) { warn(18,rtnnme,"",errlogpath) ; } } /* Ok, after all that work, check if we've been asked for the version or usage messages. If so, do it and head for the exit. Version preempts help. */ if (doversion == TRUE) { print_version(dy_logchn,dy_gtxecho,argv[0],rtnnme,osidylp_version) ; goto NOOUTFILE_CLEANUP ; } if (dohelp == TRUE) { print_help(dy_logchn,dy_gtxecho,argv[0]) ; goto NOOUTFILE_CLEANUP ; } /* We're up! Banners to the appropriate places. */ dyio_outfmt(dy_logchn,terse,"\n\t\t %s\tV %s\n",rtnnme,osidylp_version) ; dyio_outfmt(dy_logchn,terse,"\n\t\t%s",runtime) ; dyio_outfmt(dy_logchn,terse,"\n\n") ; if (outpath != NULL && strcmp(outpath,"stdout") != 0) { outchn = dyio_pathtoid(outpath,NULL) ; if (outchn == IOID_INV) outchn = dyio_openfile(outpath,"w") ; if (outchn == IOID_INV) { warn(10,rtnnme,outpath,"w") ; } else { dyio_outfmt(outchn,FALSE,"\n\t\t %s\tV %s\n",rtnnme,osidylp_version) ; dyio_outfmt(outchn,FALSE,"\n\t\t%s",runtime) ; dyio_outfmt(outchn,FALSE,"\n\n") ; } } /* Time to set up the lp options. Establish a set of defaults, then read the options file to see what the user has in mind. Because this is a standalone shell, doing a one-time solution for an LP, set up a default of cold start using the full system and a logical basis. This can be overridden in a .spc file if desired. For reasons that escape me at the moment, the parser fails on Windows. This may get fixed eventually. For now, disabled by the simple expedient of forcing optpath to NULL. */ dy_defaults(&main_lpopts,&main_lptols) ; main_lpopts->forcecold = TRUE ; main_lpopts->fullsys = TRUE ; main_lpopts->coldbasis = ibLOGICAL ; # if defined(_MSC_VER) || defined(__MSVCRT__) optpath = NULL ; # endif if (optpath != NULL) { dy_cmdchn = dyio_openfile(optpath,"r") ; if (dy_cmdchn == IOID_INV) exit (1) ; (void) dyio_setmode(dy_cmdchn,'l') ; switch (process_cmds(silent)) { case cmdOK: { break ; } case cmdHALTERROR: { exit (1) ; } case cmdHALTNOERROR: { exit (0) ; } default: { exit (1) ; } } if (dy_cmdchn != ttyin) { (void) dyio_closefile(dy_cmdchn) ; dy_cmdchn = IOID_INV ; } } /* Make an attempt to read the mps input file. */ if (dy_mpsin(mpspath,&main_sys,main_lptols->inf) == FALSE) { exit (10) ;} /* Check over the option settings, now that we know how big the constraint system will be. */ dy_checkdefaults(main_sys,main_lpopts,main_lptols) ; /* Initialise the basis maintenance package. The second parameter controls how many basis updates the basis can hold before it requires refactoring. Adding 5 to dylp's refactor interval should give a safety margin. */ dy_initbasis(2*main_sys->concnt,main_lpopts->factor+5,0.0) ; /* Run the lp. */ if (do_lp(&lptime,printlvl) == FALSE) { errmsg(443,rtnnme,main_sys->nme,dy_prtlpphase(main_lp->phase,TRUE), main_lp->iters) ; } /* Should we produce any output? Print to a file, if requested. */ if (outchn != IOID_INV && outchn != ttyout) { dy_dumpcompact(outchn,FALSE,main_lp,FALSE) ; } /* Any final terminal output we should do? */ if (printlvl >= 1) { if (printlvl >= 2) { dy_dumpcompact(dy_logchn, (dy_logchn == IOID_INV)?TRUE:FALSE,main_lp,FALSE) ; } dyio_outfmt(dy_logchn,TRUE,"\nReturn code %s",dy_prtlpret(main_lp->lpret)) ; if (main_lp->phase == dyDONE) dyio_outfmt(dy_logchn,TRUE," after %d pivots",main_lp->iters) ; if (main_lp->lpret == lpOPTIMAL) { dyio_outfmt(dy_logchn,TRUE,"; objective %.8g",main_lp->obj) ; } dyio_outfmt(dy_logchn,TRUE, " (%.2f sec.)",lptime.tv_sec+lptime.tv_usec/1e6) ; dyio_outfmt(dy_logchn,TRUE,".\n") ; dyio_flushio(dy_logchn,dy_gtxecho) ; } /* Final cleanup. Free space used by the remaining main_* structures. */ dy_freebasis() ; if (main_lp != NULL) { dy_freesoln(main_lp) ; if (main_lp->consys != NULL) consys_free(main_lp->consys) ; FREE(main_lp) ; } if (main_lpopts != NULL) FREE(main_lpopts) ; if (main_lptols != NULL) FREE(main_lptols) ; /* Leap to here for shutdown when we opened the output file but didn't solve an LP. */ if (outchn != IOID_INV && outchn != ttyout) { (void) dyio_closefile(outchn) ; } /* Leap to here for shutdown in cases where we never get as far as opening an output file. We still need to close the log file and shut down the i/o subsystem. */ NOOUTFILE_CLEANUP: if (dy_logchn != IOID_INV && dy_logchn != IOID_NOSTRM) { (void) dyio_closefile(dy_logchn) ; } dyio_ioterm() ; errterm() ; exit(0) ; /* Just to suppress the silly warning from the compiler, which isn't satisfied with the immediately preceding `exit'. */ return (0) ; } DyLP-1.6.0/DyLP/examples/Makefile.in0000644000076700007670000001364110751771556014002 0ustar # Copyright (C) 2006 International Business Machines and others. # All Rights Reserved. # This file is distributed under the Common Public License. # $Id: Makefile.in 726 2006-04-17 04:16:00Z andreasw $ ########################################################################## # !! IMPORTANT !! # Makefile.in is the template used to produce the Makefile for the examples. # Makefile.in is processed when you run configure. Variables bracketed by `@' # characters, e.g., @EXEEXT@, will be replaced with a value that is correct for # your specific installation and the choices you make when running configure. # If you write your own main program, or need to customise the Makefile for # some other reason, modify Makefile.in, not Makefile! Makefile is regenerated # every time you run configure, and your changes will be lost. If you don't see # variables like @EXEEXT@ below, you're looking at Makefile. You want # Makefile.in. # For those familiar with GNU autotools, who are asking ``What about # Makefile.am?'', stop looking. Makefile.in is the starting point in example # directories in a COIN distribution. Knowledge of make is all that's required # to work with Makefile.in, a more reasonable assumption for most users. ########################################################################## # Blocks prefixed with CHANGEME will probably need some adjustment if you write # a custom main program. # As distributed, this makefile will build two sample main programs: # * osi_dylp is a bare C driver for dylp; it makes no use of COIN software # * odsi+dylp is a driver to exercise dylp via the OsiDylp OSI layer; it # uses dylp as you should use it in the context of COIN. # Have a look at the README for more information about each of them. # # If you're customising this file for your own code, choose one of DRIVER_CXX # or DRIVER_C based on whether the main program is C or C++. The remainder of # the source files can be any mix of C or C++. (Adding other languages to the # mix will probably require more extensive modifications.) # CHANGEME: The name of your main program. DRIVER_CXX = odsi+dylp DRIVER_C = osi_dylp # CHANGEME: This should be the name of your executable. You won't need to edit # these lines unless you want the final executable to have a name that's # different from the name you gave for DRIVER_CXX / DRIVER_C just above. EXE_CXX = $(DRIVER_CXX)@EXEEXT@ EXE_C = $(DRIVER_C)@EXEEXT@ # CHANGEME: OBJS* should specify the files required to build the executable. OBJS_CXX = $(DRIVER_CXX).@OBJEXT@ OBJS_C = $(DRIVER_C).@OBJEXT@ \ mpsio.@OBJEXT@ # CHANGEME: Additional libraries ADDLIBS = # CHANGEME: Additional flags for compilation (e.g., include flags) ADDINCFLAGS = # CHANGEME: Directory to the sources for the (example) problem definition # files SRCDIR = @srcdir@ VPATH = @srcdir@ ########################################################################## # Usually, you don't have to change anything below. Note that if you # # change certain compiler options, you might have to recompile the # # COIN package. # ########################################################################## # C++ Compiler command CXX = @CXX@ # C++ Compiler options CXXFLAGS = @CXXFLAGS@ CPPFLAGS = @CPPFLAGS@ # additional C++ Compiler options for linking CXXLINKFLAGS = @LDFLAGS@ @RPATH_FLAGS@ # C Compiler command CC = @CC@ # C Compiler options CFLAGS = @CFLAGS@ # Directory with COIN header files COININCDIR = @abs_include_dir@/coin # Directory with COIN libraries COINLIBDIR = @abs_lib_dir@ # Libraries necessary to link with odsi+dylp. Order is important. LIBS_CXX = -L$(COINLIBDIR) -lOsiDylp -lDylp -lOsi -lCoinUtils \ `cat @COINUTILSDOCDIR@/coinutils_addlibs.txt` \ `cat @DYLPDOCDIR@/dylp_addlibs.txt` \ `cat @OSIDOCDIR@/osi_addlibs.txt` # Libraries necessary to link with osi_dylp LIBS_C = -L$(COINLIBDIR) -lDylp \ @ADDLIBS@ \ `cat @DYLPDOCDIR@/dylp_addlibs.txt` # Necessary Include dirs (we use the CYGPATH_W variables to allow # compilation with Windows compilers) INCL = -I`$(CYGPATH_W) $(COININCDIR)` $(ADDINCFLAGS) # The following is necessary under cygwin, if native compilers are used CYGPATH_W = @CYGPATH_W@ # check and installcheck are standard automake targets. The sample main # programs osi_dylp and odsi+dylp are included as simple checks for the # package, so it makes some sense to build them under these rules. But the # main test for dylp is to build and run the OSI unitTest with ODSI in the # build. examples: $(EXE_C) $(EXE_CXX) .SUFFIXES: .cpp .c .o .obj $(EXE_CXX): $(OBJS_CXX) bla=;\ for file in $(OBJS_CXX); do bla="$$bla `$(CYGPATH_W) $$file`"; done; \ $(CXX) $(CXXLINKFLAGS) $(CXXFLAGS) \ -o $@ $$bla $(ADDLIBS) $(LIBS_CXX) $(EXE_C): $(OBJS_C) bla=;\ for file in $(OBJS_C); do bla="$$bla `$(CYGPATH_W) $$file`"; done; \ $(CC) $(CXXLINKFLAGS) $(CFLAGS) \ -o $@ $$bla $(ADDLIBS) $(LIBS_C) # Standard automake clean targets, so that this directory gets properly # cleaned. mostlyclean clean: rm -rf $(EXE_CXX) $(EXE_C) $(OBJS_CXX) $(OBJS_C) rm -rf afiro.log afiro.out greenbeb.log greenbeb.out distclean maintainer-clean: clean rm -rf Makefile .cpp.o: $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(INCL) -c -o $@ `test -f '$<' || echo '$(SRCDIR)/'`$< .cpp.obj: $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(INCL) -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(SRCDIR)/$<'; fi` .c.o: $(CC) $(CPPFLAGS) $(CFLAGS) $(INCL) -c -o $@ `test -f '$<' || echo '$(SRCDIR)/'`$< .c.obj: $(CC) $(CPPFLAGS) $(CFLAGS) $(INCL) -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(SRCDIR)/$<'; fi` # These are standard automake targets that are not implemented. As per # recommendation in the automake manual for third-party makefiles. EMPTY_AUTOMAKE_TARGETS = \ all install install-data install-exec uninstall install-info installdirs \ check installcheck dvi pdf ps info html tags ctags .PHONY: $(EMPTY_AUTOMAKE_TARGETS) $(EMPTY_AUTOMAKE_TARGETS): DyLP-1.6.0/DyLP/examples/odsi+dylp.cpp0000644000076700007670000003347510632415522014334 0ustar /* This file is a portion of the Dylp LP distribution. Copyright (C) 2004 -- 2007 Lou Hafer School of Computing Science Simon Fraser University Burnaby, B.C., V5A 1S6, Canada lou@cs.sfu.ca This code is licensed under the terms of the Common Public License (CPL). */ /* This file contains a main program and support routines sufficient to build a stand-alone lp solver using dylp working through OsiDylpSolverInterface. After processing any command line options, the program will deal with the .spc file, if specified, then call ODSI::readMps to read the MPS file. ODSI::initialSolve is called to solve the LP, and then the results are printed. The command line is expected to be of the form osi_dylp [] [] The options presently in place are: -s Run silent: turns off echo of all generated text to stdout. The default output-file path is changed from stdout to NULL. Silent overpowers terse, in the event both are specified. -t Terse output on stdout. Behaviour is as for silent, but allows an opening title and closing message giving the result of the LP. -p Set overall print level to , [0..5]. -o Control ('.spc') options for dylp. Disabled on Windows. -m The problem ('.mps') specification. -L A log of dylp's execution (default is no execution logging). -O The output file. Defaults to stdout unless the -s option is present, in which case the default is no output. -h Print this help message and exit. -v Print version and exit. The -m option is just an alternate way to specify the . The error log file is a duplicate of the error messages printed on stderr; the execution log file is a duplicate of output on stdout unless -s is specified to suppress output to stdout. */ /*! \file odsi+dylp.cpp \brief An alternate main program for running dylp by way of the OsiDylpSolverInterface. No frills. Good for testing when you suspect the problem lies not in dylp but in the OsiDylpSolverInterface. Requires that the COIN libraries be available. */ #include #include #include "dylib_std.h" #include "OsiDylpSolverInterface.hpp" #include "CoinTime.hpp" #include "CoinError.hpp" /* Begin unnamed local namespace */ namespace { char sccsid[] UNUSED = "@(#)odsi+dylp.cpp 1.5 11/06/04" ; char svnid[] UNUSED = "$Id: odsi+dylp.cpp 148 2007-06-09 03:15:30Z lou $" ; const char *osidylp_version = static_cast("1.10") ; using std::string ; /*! \brief Print the version message. */ void print_version (const char *cmd, const char *nme, const char *ver) /* Print version, copyright, and free software disclaimer. */ { std::cout << std::endl << cmd << " (" << nme << ") V " << ver ; std::cout << std::endl << "Copyright (C) 2004 Lou Hafer" ; std::cout << std::endl << "This is free software; see the source for copying" << " conditions. There is NO" << std::endl << "warranty; not even for MERCHANTABILITY or FITNESS FOR A" << " PARTICULAR PURPOSE." << std::endl ; return ; } /*! \brief Print the help message */ void print_help (const char *pgm) /* Print help message. */ { std::cout << "\nusage: " << pgm << " [] []" ; std::cout << "\n\nThe options presently in place are:\n" ; std::cout << "\n -s\t\t\t" << "Run silent: turns off echo of all generated text to" << "\n\t\t\t" << "stdout. The default output-file path is changed" << "\n\t\t\t" << "from stdout to NULL. Silent overpowers terse, in" << "\n\t\t\t" << "the event both are specified." ; std::cout << "\n -t\t\t\t" << "Terse output on stdout. Behaviour is as for silent," << "\n\t\t\t" << "but allows an opening title and closing message" << "\n\t\t\t" << "giving the result of the LP." ; std::cout << "\n -p \t\t" << "Set overall print level to , [0..5]." ; std::cout << "\n -o \t" #if defined(_MSC_VER) || defined(__MSVCRT__) << "Disabled on Windows." ; #else << "Control ('.spc') options file for dylp (default is" << "\n\t\t\t" << "no file)." ; #endif std::cout << "\n -m \t" << "The problem ('.mps') specification (no default)." ; std::cout << "\n -L \t\t" << "A log of dylp's execution (default is no execution" << "\n\t\t\t" << "log)." ; std::cout << "\n -O \t" << "The output file. Defaults to stdout unless the -s or" << "\n\t\t\t" << "-t options are present, in which case the default is" << "\n\t\t\t" << "no output." ; std::cout << "\n -h\t\t\t" << "Print this help message and exit." ; std::cout << "\n -v\t\t\t" << "Print version and exit." ; std::cout << "\n\n" << "The -m option is just an alternate way to specify the" << " ." << std::endl << "The execution log file is a duplicate of output to stdout" << std::endl << "unless -s or -t were specified to suppress output to stdout." << std::endl ; return ; } /*! \brief Routine to dissect a file name. Given a path name in the form [path/prefix/]base[.suffix][.gz], the routine will return the prefix, base, and suffix, along with a boolean that tells whether the file name indicates compression (.gz suffix). */ void dissectPath (const string fullPath, string &prefix, string &base, string &ext, bool &compressed) /* This routine extracts the base file name from a path of the form [path/prefix/]base[.suffix][.gz] where all parts are optional except the base name. */ { bool gzSeen = false ; string::size_type pathpos,sfxpos,gzpos ; /* std::cout << std::endl << "Starting with \"" << fullPath << "\" (" << fullPath.length() << ")\n" ; */ /* Locate end of leading path prefix, if any. pathpos will point to the start of the base name. */ pathpos = fullPath.rfind('/') ; if (pathpos == string::npos) { pathpos = 0 ; prefix = "" ; } else { prefix = fullPath.substr(0,pathpos) ; pathpos++ ; } /* Check for .gz and/or other suffix. */ sfxpos = fullPath.rfind('.') ; gzpos = fullPath.length() ; /* We have a valid suffix if sfxpos ends up strictly between pathpos (start of base name) and gzpos (end of string). If it's .gz, note we've seen it and try again for a standard suffix. */ if (sfxpos > pathpos && sfxpos < gzpos) { ext = fullPath.substr(sfxpos) ; if (ext == ".gz") { gzpos = sfxpos ; gzSeen = true ; sfxpos = fullPath.rfind('.',gzpos-1) ; } } if (sfxpos > pathpos && sfxpos < gzpos) { ext = fullPath.substr(sfxpos+1,gzpos-sfxpos-1) ; } else { ext = "" ; sfxpos = gzpos ; } /* The basename should lie between pathpos and sfxpos. Set a last few return values and we're done. */ base = fullPath.substr(pathpos,sfxpos-pathpos) ; compressed = gzSeen ; /* std::cout << "Parsed \"" << fullPath <<"\" to \"" << prefix << "\", \"" << base << "\", \"" << ext << "\"" ; if (gzSeen == true) std::cout << " (compressed)" ; std::cout << "." << std::endl ; */ return ; } /*! \brief Run an individual problem This routine will run a single problem, using an options file if one is specified. The routine will create a log file for the run. */ void test_user (const char* mpspath, const char* spcpath, const char *logpath, const char *outpath, bool silent, bool terse, int printlvl) { OsiDylpSolverInterface* osi = new OsiDylpSolverInterface ; string fullPath ; string prefix,base,ext,prefixAndBase ; bool compressed ; /* Open thelog file and output file, if requested. */ if (logpath != 0) { fullPath = logpath ; dissectPath(fullPath,prefix,base,ext,compressed) ; if (prefix != "") prefixAndBase = prefix+'/' ; else prefixAndBase = "" ; prefixAndBase += base ; if (silent == false) { std::cout << std::endl << "Logging to " << prefixAndBase << ".log." ; } osi->dylp_logfile(prefixAndBase.c_str(),false) ; } if (outpath != 0) { fullPath = outpath ; dissectPath(fullPath,prefix,base,ext,compressed) ; if (prefix != "") prefixAndBase = prefix+'/' ; else prefixAndBase = "" ; prefixAndBase += base ; if (silent == false) { std::cout << std::endl << "Output file is " << prefixAndBase << ".out." ; } osi->dylp_outfile(prefixAndBase.c_str()) ; } /* Establish output levels. Bits <2:0> of info (info&0x7) are interpreted as an integer which is passed to dy_setprintopts. Bit <3> (0x8) will turn on CoinMpsIO messages. Bit <4> (0x10) will cause dylp to send output to the terminal in addition to any log file. So, for example, info = 0x11 will set print level 1 and enable terminal output. At print level 1 and higher, you can override individual settings with an options file, processed via dylp_controlfile. */ int info = printlvl ; if (silent == false && terse == false) info |= 0x10 ; osi->setHintParam(OsiDoReducePrint,false,OsiHintTry,&info) ; /* Process the aforementioned options file, if specified. */ if (spcpath != 0) { if (silent == false) { std::cout << std::endl << "Processing options file " << spcpath << "." ; } osi->dylp_controlfile(spcpath,false,true) ; } /* Process the mps file. */ if (silent == false) { std::cout << std::endl << "Reading problem file " << mpspath << "." ; } fullPath = mpspath ; dissectPath(fullPath,prefix,base,ext,compressed) ; if (prefix != "") prefixAndBase = prefix+'/' ; else prefixAndBase = "" ; prefixAndBase += base ; int errs = osi->readMps(prefixAndBase.c_str(),ext.c_str()) ; if (errs != 0) { std::cout << errs << " errors while reading " << fullPath << "\n" ; throw CoinError("MPS input error","test_user","odsi+dylp.cpp") ; } /* And try to solve the LP. */ if (silent == false) { std::cout << std::endl << "Starting LP." << std::endl ; } try { double startTime = CoinCpuTime(); osi->setHintParam(OsiDoPresolveInInitial,true,OsiHintTry) ; osi->initialSolve() ; double timeOfSolution = CoinCpuTime()-startTime; if (silent == false) { std::cout << std::endl << "Finished." ; } double val = osi->getObjValue() ; int iters = osi->getIterationCount() ; std::cout << " obj = " << val << ", iters = " << iters << ", " << timeOfSolution << "secs." << std::endl ; osi->dylp_printsoln(true,true) ; } catch (CoinError &err) { std::cout << std::endl << err.className() << "::" << err.methodName() << " (throw) " << err.message() << std::endl ; std::cout.flush() ; } delete osi ; exit(0) ; } } /* End unnamed local namespace */ /*! \brief An alternate main program for testing This is an alternate program for testing dylp and the COIN/OSI layer. Given an mps file and (optional) options file on the command line, it will run the problem and exit. */ int main (int argc, const char* argv[]) { const char *rtnnme = static_cast("dylp") ; std::ios::sync_with_stdio() ; /* Process command line options, if any. The user can specify a single, unadorned file name as the only argument. The working assumption is that if we're looking for the `-' that starts an option, and we don't see it, then we're looking at the file name. */ int argNum ; bool silent,terse,doversion,dohelp ; int printlvl ; const char *optpath,*mpspath,*logpath,*outpath ; silent = false ; terse = false ; doversion = false ; dohelp = false ; printlvl = 1 ; optpath = 0 ; mpspath = 0 ; logpath = 0 ; outpath = 0 ; for (argNum = 1 ; argNum < argc ; argNum++) { char argLett = argv[argNum][0] ; if (argLett != '-') break ; argLett = argv[argNum][1] ; /* Handle `--' option prefix for the Gnu-ish. */ if (argLett == '-') argLett = argv[argNum][2] ; switch (argLett) { case 'o': { optpath = argv[++argNum] ; #if defined(_MSC_VER) || defined(__MSVCRT__) /* Disabled on Windows --- parser fails. */ optpath = NULL ; #endif break ; } case 'm': { mpspath = argv[++argNum] ; break ; } case 'L': { logpath = argv[++argNum] ; break ; } case 'O': { outpath = argv[++argNum] ; break ; } case 's': { silent = TRUE ; dy_gtxecho = FALSE ; break ; } case 't': { terse = TRUE ; dy_gtxecho = FALSE ; break ; } case 'p': { printlvl = atoi(argv[++argNum]) ; break ; } case 'v': { doversion = true ; break ; } case 'h': { dohelp = true ; doversion = true ; break ; } default: { std::cout << argv[0] << ": unrecognized option \"-" << argLett << "\"." << std::endl ; print_help(argv[0]) ; exit (1) ; } } if (doversion == true || dohelp == true) break ; } /* If there's exactly one parameter left, it must be the mps file, specified without using the -m option. There should be at most one parameter left at this point. If we have parameters left, the user is confused. If we don't have an mps file, the user is confused. */ if (argNum == argc-1) { mpspath = argv[argNum++] ; } if (argNum < argc || mpspath == 0) { dohelp = TRUE ; } /* Have we been asked to print help or the version? If so, do it and exit. */ if (doversion == true || dohelp == true) { if (doversion == true) print_version(argv[0],rtnnme,osidylp_version) ; if (dohelp == true) print_help(argv[0]) ; exit (0) ; } /* What's our output level? If the user has specified a print level, go with it. Otherwise, take a cue from any -s or -t flags. Default to print level 2. */ if (printlvl < 0) { if (silent == true) printlvl = 0 ; else if (terse == true) printlvl = 1 ; else printlvl = 2 ; } /* Call test_user to do all the work. */ try { test_user(mpspath,optpath,logpath,outpath,silent,terse,printlvl) ; } catch (CoinError &err) { std::cout << std::endl << err.className() << "::" << err.methodName() << " (throw) " << err.message() << std::endl ; std::cout.flush() ; } return (0) ; } DyLP-1.6.0/DyLP/examples/plain0000755000076700007670000001011411266200573012742 0ustar #!/bin/csh -f # svn/cvs: $Id: plain 305 2009-10-16 23:27:55Z lou $ # Simple csh script to run the osi_dylp main program. Mainly to make it a bit # easier to find MPS files and get the parameters right. Also, the script # will look for a dylp options (.spc) file and add it to the osi_dylp command # line. # Edit here to choose the C interface (osi_dylp) or the OSI interface # (odsi+dylp) as the default. set wrapper = (./osi_dylp) # set wrapper = (./odsi+dylp) # Check for MPS file directories under ../../Data set mpsSearchDirs foreach dir (`ls ../../Data`) set dir = "../../Data/$dir" if (-d $dir && -x $dir) then set mpsSearchDirs = ($mpsSearchDirs $dir) endif end set mpsSearchDirs = (. $mpsSearchDirs) # Usage message set usage = "plain [-odsi|-dylp] [additional parameters] " set usage1 = " Where -odsi selects the odsi+dylp (OsiDylp/C++) wrapper" set usage2 = " -dylp selects the osi_dylp (native/C) wrapper" set usage3 = " and [additional parameters] should be appropriate" set usage4 = " for the specified wrapper." set usage5 = " The default wrapper is $wrapper[1]" set usage5 = " The default wrapper is $wrapper[1]" set usage6 = " -h anywhere in the command line gets this help message." set usage7 = " MPS file search directories are $mpsSearchDirs" if ($#argv < 1) then set argv = "--help" endif # Does the user want help? if ("$argv[*]" =~ *-h*) then echo "Usage: $usage" echo $usage1:q echo $usage2:q echo $usage3:q echo $usage4:q echo $usage5:q echo $usage6:q echo $usage7:q if (-x $wrapper) then $wrapper -h else echo "Execute $wrapper -h to see the help text for $wrapper." endif exit endif # See if the user has specified a front-end on the command line. switch ($argv[1]) case -odsi: set wrapper = "./odsi+dylp" shift breaksw case -dylp: set wrapper = "./osi_dylp" shift breaksw endsw # MPS file should be the last parameter set example = $argv[$#argv] set mpsdir set mpsfile set mpsext # Search for an mps file. The reason for putting the loop with suffixes on the # outside is so that we'll find the shortest suffix, whereever it might reside. foreach ext ("" ".mps" ".gz" ".mps.gz") set candidate = ${example}${ext} foreach dir ($mpsSearchDirs) if (-e $dir/$candidate) then set mpsfile = $dir/$candidate set mpsdir = $dir set mpsext = $ext break ; break endif end end if ("$mpsfile" == "") then echo "Can't"' locate mps file for "'$example'".' echo "Usage: $usage" echo $usage1:q echo $usage2:q echo $usage3:q echo $usage4:q echo $usage5:q echo $usage6:q $wrapper -h exit endif if ("$mpsext" == "") then set example = $example:r endif # Dylp's native mps reader does not read from compressed files. Unzip if # necessary. if ($wrapper =~ *osi_dylp && $mpsfile =~ *.gz) then set lclext = `echo $mpsext | sed -e 's/\.gz//'` set unzipmpsfile = ./${example}${lclext} gunzip -c $mpsfile > $unzipmpsfile echo "Created uncompressed copy of $mpsfile as $unzipmpsfile." else set unzipmpsfile = $mpsfile endif # Check for example.spc in the directory where the mps file was located, and in # the current directory. Failing that, look for generic.spc in the same # places. if (-e $mpsdir/${example}.spc) then set spcfile = "-o $mpsdir/${example}.spc" else if (-e ${example}.spc) then set spcfile = "-o ${example}.spc" else if (-e $mpsdir/generic.spc) then set spcfile = "-o generic.spc" else if (-e generic.spc) then set spcfile = "-o generic.spc" else set spcfile endif # If there are two or more arguments, the rest are assumed to be # command line parameters. if ($#argv > 1) then @ flagcnt = $#argv - 1 set flags = "$argv[1-$flagcnt]" else set flags = "" endif # Go to it. echo -n "Processing $mpsfile" if ("$spcfile" != "") then echo -n ", spc = $spcfile" endif if ("$flags" != "") then echo -n ", flags = $flags" endif echo "." echo "$wrapper $spcfile -m ${unzipmpsfile} -L ${example}.log -O ${example}.out $flags" $wrapper $spcfile \ -m ${unzipmpsfile} -L ${example}.log \ -O ${example}.out $flags DyLP-1.6.0/BuildTools/0000755000076700007670000000000011414302701011335 5ustar DyLP-1.6.0/BuildTools/prepare_new_release0000755000076700007670000005341611213002121015271 0ustar #!/bin/sh # Copyright (C) 2007 International Business Machines. # All Rights Reserved. # This file is distributed under the Common Public License. # It is part of the BuildTools project in COIN-OR (www.coin-or.org) # ## $Id: prepare_new_release 1302 2009-06-07 18:17:53Z stefan $ # # Author: Andreas Waechter IBM 2007-06-21 # Modified: Lou Hafer SFU 2008-01-20 # Accommodate simultaneous creation of releases with circular # dependencies. #set -x -v set -e # You can think of this script as having three sections: first, the following # function definition, then parameter parsing and validation, and finally the # actual generation of the release candidate. See the help message for a good # description of the actions taken to generate the release candidate. # Utility function to determine current or next release for a given stable # branch. Call is determine_release(stableURL,next). Replace next with 1 for # the next release, 0 for the current release. This code is needed in three # separate places, so it really deserves to be a function. We can hope that # maintainers will have a reasonably modern version of standard sh. # Data is a real pain in the **** and should be converted to the standard # nomenclature. determine_release () { if test $isData = no ; then drtmp_stableBranch=`echo $1 | sed -e 's|.*/stable/||'` drtmp_baseURL=`echo $1 | sed -e 's|/stable/[0-9.]*||'` drtmp_returnVal= # List the existing releases and screen for releases matching stableBranch. drtmp_svnlst=`svn list $drtmp_baseURL/releases/` drtmp_release_vers= for drtmp_i in $drtmp_svnlst ; do case $drtmp_i in $drtmp_stableBranch.*) drtmp_i=`echo $drtmp_i | sed -e 's|/$||'` drtmp_release_vers="$drtmp_release_vers $drtmp_i";; esac; done # Are there any existing releases? If not, and the user didn't ask for the # next release, we have an error. if test -z "$drtmp_release_vers" ; then if test $2 = 1 ; then drtmp_returnVal="$drtmp_stableBranch.0" else drtmp_returnVal="Error" fi else # There are releases. If we don't have one after the loop, we're confused. drtmp_new_rel=-10000 for drtmp_i in $drtmp_release_vers; do drtmp_rel=`echo $drtmp_i | sed -e "s|^$drtmp_stableBranch.||"` if test $drtmp_rel -gt $drtmp_new_rel; then drtmp_new_rel=$drtmp_rel fi done if test $drtmp_new_rel = -10000; then drtmp_new_rel="Error" elif test $2 = 1 ; then drtmp_new_rel=`expr $drtmp_new_rel + 1` fi drtmp_returnVal="$drtmp_stableBranch.$drtmp_new_rel" fi else # end normal and ThirdParty, begin Data drtmp_stableBranch=`echo $1 | sed -e 's|.*/stable/\([0-9.]*\)/.*|\1|'` drtmp_baseURL=`echo $1 | sed -e 's|\(.*\)/stable/[0-9.]*/.*|\1|'` drtmp_proj=`echo $1 | sed -e 's|.*/stable/[0-9.]*/||'` # Screen for releases that match the stable branch and contain the project # of interest. First, check for releases that match the stable branch. If # there are none, we're release 0 for this stable branch. It's an error if # there are no releases and the user did not ask for the next release. Sort # by release number here, while we have newlines in the list from svn. drtmp_svnlst=`svn list $drtmp_baseURL/releases | sort -nr -t. -k3,3` drtmp_release_vers= for drtmp_i in $drtmp_svnlst ; do case $drtmp_i in $drtmp_stableBranch.*) drtmp_i=`echo $drtmp_i | sed -e 's|/$||'` drtmp_release_vers="$drtmp_release_vers $drtmp_i";; esac; done # Do we have releases that match the stable branch? if test -z "$drtmp_release_vers" ; then if test $2 = 1 ; then drtmp_returnVal="$drtmp_stableBranch.0" else drtmp_returnVal="Error" fi else # Releases exist that match stable; do any contain our project? Because # we presorted by release, we can break here at the first success. drtmp_svnlst=`echo $drtmp_release_vers` drtmp_release_vers= for drtmp_i in $drtmp_svnlst ; do case $drtmp_i in $drtmp_stableBranch.*) drtmp_i=`echo $drtmp_i | sed -e 's|/$||'` drtmp_projlst=`2>&1 svn list $drtmp_baseURL/releases/$drtmp_i/$drtmp_proj` if expr "$drtmp_projlst" : '.*non-existent.*' 2>&1 >/dev/null ; then : else drtmp_release_vers="$drtmp_i" break fi ;; esac; done # Are there any existing releases? If no, and the user didn't ask for # the next release, it's an error. Otherwise, go for release 0 of # proj in the current stable branch. If there are existing releases, # return either the current or +1. if test -z "$drtmp_release_vers" ; then if test $2 = 0 ; then drtmp_returnVal="$drtmp_stableBranch.Error" else drtmp_returnVal="$drtmp_stableBranch.0" fi else drtmp_new_rel=-10000 for drtmp_i in $drtmp_release_vers; do drtmp_rel=`echo $drtmp_i | sed -e "s|^$drtmp_stableBranch.||"` if test $drtmp_rel -gt $drtmp_new_rel; then drtmp_new_rel=$drtmp_rel fi done drtmp_new_rel=`expr $drtmp_new_rel + 1` drtmp_returnVal="$drtmp_stableBranch.$drtmp_new_rel" fi fi # for releases matching stable branch fi # for normal/Data echo $drtmp_returnVal } # Specify the COIN URL base for convenience. coinURL="https://projects.coin-or.org/svn" # Begin parameter processing. printHelp=0 exitValue=0 ignoreBuildToolsMismatch=0 # stableURL will be the stable branch that is the parent for the release we # are building. We'll need to be able to distinguish ThirdParty and Data # builds; they require special handling. # buildToolsURL is required when stableURL specifies a ThirdParty or Data # project --- we'll need to assemble a temporary package while creating the # release candidate. stableURL= isThirdParty=no isData=no buildToolsURL= # stableExternals, on the other hand, specifies externals for which we are # doing simultaneous releases. We will use the stable branch of the external # while preparing and testing this release candidate, changing the Externals # file to specify a (nonexistent) release of the external at the last moment. stableExternals= # We need at least one parameter. if test "$#" -eq 0; then printHelp=1 else # Process the parameters. A parameter without an opening `-' is assumed to be # the spec for the stable branch. while test $# -gt 0 && test $exitValue = 0 && test $printHelp = 0 ; do case "$1" in -h* | --h*) printHelp=1 ;; -i* | --i*) ignoreBuildToolsMismatch=1 ;; -s* | --s*) if expr "$1" : '.*-s.*=.*' 2>&1 >/dev/null ; then stableExternals=`echo $1 | sed -n -e 's/[^=]*=\(.*\)/\1/p'` else shift stableExternals=$1 fi ;; -b* | --b*) if expr "$1" : '.*-b.*=.*' 2>&1 >/dev/null ; then buildToolsURL=`echo $1 | sed -n -e 's/[^=]*=\(.*\)/\1/p'` else shift buildToolsURL=$1 fi if expr "$buildToolsURL" : '.*BuildTools.*' 2>&1 >/dev/null ; then case $buildToolsURL in http*) ;; *) buildToolsURL=${coinURL}/$buildToolsURL ;; esac else echo '' echo "URL $buildToolsURL does not point to BuildTools." echo '' printHelp=1 exitValue=-3 fi ;; -*) echo "$0: unrecognised command line switch '"$1"'." printHelp=1 exitValue=-1 ;; *) stableURL=$1 if expr "$stableURL" : '.*/stable/.*' 2>&1 >/dev/null ; then case $stableURL in http*) ;; *) stableURL=${coinURL}/$stableURL ;; esac else echo '' echo "URL $stableURL does not specify a stable release." echo '' printHelp=1 exitValue=-2 fi ;; esac shift done # Consistency checks: Make sure that the stable URL exists. If we're building # a ThirdParty or Data release, we need a BuildTools URL. if test $printHelp = 0 && test $exitValue = 0 ; then if svn list $stableURL 2>&1 >/dev/null ; then : else echo "Stable URL $stableURL does not seem to exist." printHelp=1 exitValue=-5 fi fi if test $printHelp = 0 && test $exitValue = 0 ; then case $stableURL in *ThirdParty/* ) isThirdParty=yes ;; *Data/* ) isData=yes ;; *) ;; esac if test $isThirdParty = yes || test $isData = yes ; then if test -z $buildToolsURL ; then echo "You must provide a BuildTools URL to build a ThirdParty or Data project." printHelp=1 exitValue=-4 else if svn list $buildToolsURL 2>&1 >/dev/null ; then : else echo "BuildTools URL $buildToolsURL does not seem to exist." printHelp=1 exitValue=-6 fi fi fi fi fi if test $printHelp = 1 ; then cat < [options] COIN standard practice is to generate periodic releases by taking a snapshot of the stable branch of the project. You can use this script to prepare a new release based on the specified stable branch. Stable_branch specifies the stable branch of your project to be used to create the new release. You can specify the entire URL, or you just enter what comes after "https://projects.coin-or.org/svn". A typical example is prepare_new_release Ipopt/stable/3.3 Options: -b URL for BuildTools; required to generate a release for a ThirdParty or Data project. -s Comma-separated list of projects with circular dependencies on this project. The stable branch of projects in this list will be used while testing, on the assumption that simultaneous releases will be created as the release candidates are committed. -i Ignore BuildTools version mismatches in externals. This script will do the following: - Automatically determine the next release number (X.Y.0 if this is the first release for stable/X.Y, otherwise one greater than any existing release) - Check out a clean copy of the specified stable branch, without externals - Read the Externals file and create a new Externals file for the release by converting references to stable branches to references to the most recent release for that stable branch. - Create a new package configure.ac file with the release version number specified in the AC_INIT macro. - Set the svn:externals property for the release package and check out the code for the externals. - Use the "get.*" scripts to download any ThirdParty code. - Execute run_autotools to update configure, Makefile.in, etc., to reflect the most recent release of BuildTools. - Check that all dependencies are using the same version of the BuildTools - Run the configure script, compile the code, and run the unit test. - Replace any stable references in Externals (specified with -s) with the appropriate (yet to be committed) release. If there is any error during these tasks the script will stop and you should examine the output. If the script completes without error, examine the output, particularly the output of the unit test ('make test') and the set of externals specified in the Externals file. This script does not make any changes to the repository. If you want to commit the new release, run the "commit_new_release" script, as described at the end of the output. EOF fi if test $exitValue != 0 || test $printHelp = 1 ; then exit $exitValue fi # End of parameter parsing. We have a stable URL to work with. Tell the # user what we've seen. stableURL=`echo $stableURL | sed -e 's|/$||'` if test $isData = yes ; then stableProj=`echo $stableURL | sed -n -e 's|.*/[^/]*/stable/[0-9.]*/\(.*\)|\1|p'` baseURL=`echo $stableURL | sed -e 's|\(.*\)/stable/[0-9.]*/\(.*\)|\1/_BB_/_RR_/\2|'` stableBranch=`echo $stableURL | sed -e 's|.*/stable/\([0-9.]*\)/.*|\1|'` else stableProj=`echo $stableURL | sed -n -e 's|.*/\([^/]*\)/stable/.*|\1|p'` baseURL=`echo $stableURL | sed -e 's|/stable/[0-9.]*||'` stableBranch=`echo $stableURL | sed -e 's|.*/stable/||'` fi echo "StableProj: $stableProj" echo "Base URL..........: $baseURL" echo "Stable URL........: $stableURL" echo "Stable branch.....: $stableBranch" if test -n "$stableExternals" ; then echo "Stable externals..: $stableExternals." fi # Find out the most recent release (if any) for the stable branch. List the # existing releases and screen for releases matching stableBranch. The new # release should be one greater than any existing release, or 0 if the stable # branch has no releases. echo '' echo "===> Checking releases for stable branch $stableBranch ..." new_ver=`determine_release "$stableURL" 1` echo '' echo "New release.......: $new_ver" buildBase="${stableProj}-$new_ver" echo "Build directory...: $buildBase" if test $isData = yes ; then releaseURL=`echo $baseURL | sed -e s/_BB_/releases/ -e s/_RR_/$new_ver/` else releaseURL="$baseURL/releases/$new_ver" fi echo "Release URL.......: $releaseURL" # Check out the stable branch that'll be the base of the new release. No # externals at this point. Creating a release of a ThirdParty or Data project # requires a bit of work, as we need to assemble a temporary package with a # BuildTools external. echo '' echo "===> Checking out stable release $stableBranch without externals..." echo '' if test $isThirdParty = yes; then coDir=$buildBase/a/b elif test $isData = yes; then coDir=$buildBase/a/b else coDir=$buildBase fi echo "Checkout directory: $coDir" rm -rf $buildBase cmd="svn co --ignore-externals $stableURL $coDir" echo $cmd eval $cmd if test $isThirdParty = yes || test $isData = yes; then echo '' echo '===> Checking out BuildTools for ThirdParty project...' echo '' cmd="svn co $buildToolsURL $buildBase/BuildTools" echo $cmd eval $cmd fi coDir=`cd $coDir; pwd` buildBase=`cd $buildBase; pwd` cd $coDir # Find configure.ac files for the package and project and update the version. # We have no externals at this point, so there will be two files for a # standard project, one for a ThirdParty project, and none for a Data project. echo '' conf_ac_files=`find . -name 'configure.ac' | grep -v -E 'ThirdParty/.*/.*/configure.ac'` echo "===> Creating backup (.bak) for configure.ac files..." for i in $conf_ac_files; do cp $i $i.bak done echo '' echo "===> Updating version number ($new_ver) in configure.ac files" for i in $conf_ac_files; do sed -e "s|AC_INIT\(.*\)\[[0-9A-Za-z\.]*\],\(.*\)|AC_INIT\1[$new_ver],\2|" $i > bla mv bla $i svn di $i done # Now fix up the Externals file, if it exists. References to stable branches # will be converted to references to releases unless the reference is to a # project in the stableExternals list. Each line in an Externals file has the # format . The reference must be to a stable branch. if test -r Externals; then echo '' echo '===> Creating new Externals file with pointers to releases...' echo '' rm -f Externals.releases ext_name= ext_url= for i in `cat Externals`; do if test "$ext_name" = ""; then ext_name="$i" else ext_url=$i if (echo $ext_name | grep -E '^#' >/dev/null); then echo "Skip $ext_name $ext_url." ext_name= continue fi if (echo $ext_url | grep -E 'stable/|releases/' >/dev/null); then :; else echo '' echo "The external URL $ext_url is not a stable branch or release. Exiting." echo '' exit -2 fi ext_base_front=`echo $ext_url | sed -e 's|/stable/.*||'` ext_proj=`echo $ext_base_front | sed -e 's|.*/\([^/]*\)|\1|'` if expr "$stableExternals" : '.*'"$ext_proj"'.*' 2>&1 >/dev/null ; then echo "Using stable reference for $ext_name." ext_rel_url=$ext_url elif expr "$ext_url" : '.*releases/.*' 2>&1 >/dev/null ; then echo "Using specified release for $ext_name." ext_rel_url=$ext_url else ext_stable=`echo $ext_url | sed -e 's|\(.*/stable/[0-9\.]*\).*|\1|'` ext_base_end=`echo $ext_url | sed -e 's|.*/stable/[0-9\.]*||'` echo "Determining release replacement for $ext_name:" ext_latest=`determine_release $ext_stable 0` if test "$ext_base_end" = ""; then ext_rel_url=$ext_base_front/releases/$ext_latest else ext_rel_url=$ext_base_front/releases/$ext_latest$ext_base_end fi fi echo " $ext_rel_url" echo "$ext_name $ext_rel_url" >>Externals.releases ext_name= fi done echo '' echo '===> Creating backup (.bak) for Externals' mv Externals Externals.bak mv Externals.releases Externals echo '' echo '===> Updating svn:externals properties, and checking out externals...' echo '' svn pset svn:externals -F Externals . svn update echo '' echo '===> If there are ThirdParty externals, run the download scripts...' echo '' ext_name= ext_url= for i in `cat Externals`; do if test "$ext_name" = ""; then ext_name="$i" else ext_url=$i case $ext_name in ThirdParty/*) pkg=`echo $ext_name | sed -e 's|ThirdParty/||' -e 's|/||g'` getfile=get.$pkg if test -r $ext_name/$getfile; then curdir=`pwd` cd $ext_name echo "Running $getfile -patch in `pwd`" eval ./$getfile -patch cd "$curdir" fi ;; esac ext_name= fi done fi # if test -r Externals if test $isThirdParty = yes; then pkg=`echo $baseURL | sed -e 's|.*/||g'` if test -r get.$pkg; then echo '' echo '===> Download third party code...' echo '' ./get.$pkg fi fi echo '' echo '===> Running the autotools...' echo '' if test $isThirdParty = yes; then curdir=`pwd` cd ../.. BuildTools/run_autotools cd "$curdir" elif test $isData = yes; then curdir=`pwd` cd ../.. BuildTools/run_autotools cd "$curdir" else BuildTools/run_autotools fi if test -r Externals; then echo '===> Verifying consistency of the BuildTools versions...' echo '' ext_name= ext_url= rm -f problems.ext for i in `cat Externals`; do if test "$ext_name" = ""; then ext_name="$i" else ext_url=$i echo " checking $ext_name" num_M=`svn status $ext_name | grep -E '^M' | wc -l` if test $num_M -ne 0; then echo $ext_name >>problems.ext echo ' ... BuildTools not consistent!' else echo ' ... Ok' fi ext_name= fi done if test -r problems.ext; then echo '' echo 'PROBLEM DURING CONSISTENCY CHECK:' echo '' echo 'Please contact the project manager(s) for the following project(s).' echo 'A new release needs to be made with your stable branch of BuildTools.' echo '' cat problems.ext echo '' rm -f problems.ext if test $ignoreBuildToolsMismatch = 0 ; then exit -2 else echo "Continuing in spite of BuildTools mismatch." fi fi rm -f problems.ext fi # if test -r Externals if test $isThirdParty != yes && test $isData != yes; then (set -e echo '' echo '===> Creating build directory and running the configuration script...' echo '' mkdir build cd build cmd="$coDir/configure -C --enable-maintainer-mode" echo $cmd eval $cmd echo '' echo '===> Compiling code...' echo '' cmd='make install' echo $cmd eval $cmd echo '' echo '===> Running the unit test...' echo '' echo '*******************************************************************************' echo '*** ***' echo '*** BEGIN OUTPUT OF MAKE TEST ***' echo '*** ***' echo '*******************************************************************************' echo '' cmd='make test' echo $cmd eval $cmd echo '' echo '*******************************************************************************' echo '*** ***' echo '*** END OUTPUT OF MAKE TEST ***' echo '*** ***' echo '*******************************************************************************' ) if test $? != 0; then echo '' echo 'Error during build or test' echo '' exit -3 fi fi echo '' echo '===> ALL TESTS PASSED' if test $isThirdParty != yes && test $isData != yes; then echo '' echo 'Please review the output above, particularly the one of make test' fi # Do we need to plug in nonexistent releases for circular dependencies tested # with the stable versions? If so, generate a new Externals.release. This is # the only reason stable references should appear in the Externals file for a # release, so we don't need to check further before removing them. if test -n "$stableExternals" ; then echo "Grooming Externals to remove stable references used for testing." rm -rf Externals.releases ext_name= ext_url= for i in `cat Externals`; do if test "$ext_name" = ""; then ext_name="$i" else ext_url=$i if (echo $ext_url | grep -E 'stable/' >/dev/null); then echo "Determining release replacement for $ext_name:" ext_stable=`echo $ext_url | sed -e 's|\(.*/stable/[0-9\.]*\).*|\1|'` ext_latest=`determine_release $ext_stable 1` ext_rel_url=`echo $ext_url | sed -e "s|stable/[0-9.]*|releases/$ext_latest|"` echo " $ext_rel_url" else ext_rel_url=$ext_url fi echo "$ext_name $ext_rel_url" >>Externals.releases ext_name= fi done mv Externals.releases Externals svn propset -F Externals svn:externals . fi if test -r Externals; then echo '' echo 'Also, please confirm the Externals are correct:' svn propget svn:externals fi echo '' echo 'After reviewing the output above, you can create a new release by going into' echo 'the directory' echo '' echo " $coDir" echo '' echo "and run the commit_new_release script" cat >.new_release_data < confauto.out 2>&1 if $EGREP $grep_version confauto.out >/dev/null 2>&1; then :; else echo You are not using the correct version of autoconf rm -f confauto.out exit -2 fi rm -f confauto.out autoconf_dir=`which autoconf | sed -e 's=/autoconf=='` autoconf_dir=`cd $autoconf_dir; pwd` if test $autoconf_dir = `cd $AUTOTOOLS_DIR/bin; pwd`; then :; else echo autoconf is not picked up from the correct location exit -2 fi grep_version=`echo $ver_automake | sed -e 's/\\./\\\\\\./g'` automake --version > confauto.out 2>&1 if $EGREP $grep_version confauto.out >/dev/null 2>&1; then :; else echo You are not using the correct version of automake rm -f confauto.out exit -2 fi rm -f confauto.out autoconf_dir=`which automake | sed -e 's=/automake=='` autoconf_dir=`cd $autoconf_dir; pwd` if test $autoconf_dir = `cd $AUTOTOOLS_DIR/bin; pwd`; then :; else echo automake is not picked up from the correct location exit -2 fi grep_version=`echo $ver_libtool | sed -e 's/\\./\\\\\\./g'` ltfile=$AUTOTOOLS_DIR/share/libtool/ltmain.sh if test -r $ltfile; then :; else echo Cannot file $ltfile fi if $EGREP $grep_version $ltfile >/dev/null 2>&1; then :; else echo You are not using the correct verion of libtool fi # Find directories which contain a file configure.ac. When all is said and # done, each entry in dirs will be of the form `./path/to/directory' if test $# != 0; then dirs="$*" else pos_dirs=`find . -name configure.ac | sed -e s%/configure.ac%%g | grep -v 'ThirdParty/[^/]*/[^/]*'` dirs= for dir in $pos_dirs; do if test -r $dir/configure.ac; then dirs="$dirs $dir" else echo "$dir/configure.ac doesn't appear to be a regular file; skipping." fi done fi # Now compare against the skip entries in COIN_SKIP_PROJECTS. To match the # entries we just collected, add `./' to the front of each skip entry. pos_dirs=$dirs if test x${COIN_SKIP_PROJECTS+set} = xset ; then dirs= for dir in $COIN_SKIP_PROJECTS ; do skip_dirs="$skip_dirs ./$dir" done for dir in $pos_dirs ; do skip=0 for skipdir in $skip_dirs ; do if test $dir = $skipdir ; then skip=1 break fi done if test $skip = 0 ; then dirs="$dirs $dir" else echo "$dir listed in COIN_SKIP_PROJECTS; skipping." fi done fi echo Running autotools in $dirs currdir=`pwd` if test -r $currdir/BuildTools/coin.m4; then toolsdir=$currdir/BuildTools else echo Cannot find BuildTools directory. exit fi echo Copying autotools scripts into this directory cp $toolsdir/config.guess $toolsdir/config.sub $toolsdir/depcomp $toolsdir/install-sh $toolsdir/ltmain.sh $toolsdir/missing . if test x$AUTOTOOLS_DIR = x; then AUTOTOOLS_DIR=$HOME fi for dir in $dirs; do (if test -r $dir/configure.ac; then cd $dir echo creating acinclude.m4 in $dir cat $AUTOTOOLS_DIR/share/aclocal/libtool.m4 $toolsdir/coin.m4> acinclude.m4 echo running aclocal in $dir if test -d m4; then aclocal -I m4 || exit -1 else aclocal || exit -1 fi if grep AC_CONFIG_HEADER configure.ac >/dev/null 2>&1; then echo running autoheader in $dir autoheader || exit -1 fi echo running automake in $dir automake || exit -1 echo running autoconf in $dir autoconf || exit -1 else echo "*** No configure.ac file in $dir - SKIPPING! ***" fi ) if test $? -ne 0; then exit -2; fi done DyLP-1.6.0/BuildTools/compile_f2c/0000755000076700007670000000000011414302700013516 5ustar DyLP-1.6.0/BuildTools/compile_f2c/README0000644000076700007670000000132610634045143014410 0ustar The files in this directory are intended to allow the compilation of Fortran 77 source files by combining the Fortran to C translator f2c (from netlib) and the Microsoft 'cl' C compiler under Cygwin and MSys. Please read the INSTALL file for instructions how to use this tool. After you installed this tool, you can use the script "compile_f2c" to compile Fortran 77 code. If you specify the flag "--enable-doscompile=msvc" for the configure script in COIN projects, it will automatically be used (unless a native Fortran compiler is found). The files in this directory are part of the BuildTools project of COIN-OR, https://projects.coin-or.org/BuildTools. The files are made available under the Common Public License. DyLP-1.6.0/BuildTools/compile_f2c/INSTALL0000644000076700007670000000411411053565660014566 0ustar The following instructions assume that you already set up Cygwin/Msys to know about the Microsoft 'cl' compiler and 'nmake'. 1. Download the f2c.exe Fortran to C compiler from netlib from http://www.netlib.org/f2c/mswin/f2c.exe.gz uncompress it, and put it somewhere in your PATH (e.g. into /usr/local/bin). Make sure it is executable. 2. Download the source code for the f2c runtime library from http://www.netlib.org/f2c/libf2c.zip and put it into a directory in which you want to have a subdirectory where you want to have the subdirectory "libf2c" containing the runtime library, e.g., into /usr/local/lib. Uncompress this file, for example by "unzip libf2c.zip" in a Cygwin or MSys window. 3. Compile the Fortran runtime library: In the source directory (libf2c), type 'nmake -f makefile.vc all' If you encounter an error during the compilation of "err.c" due to a missing unistd.h, edit the makefile.vc file and add -DNO_ISATTY to the CFLAGS (line 9). If you encounter an error during the compilation of "arithchk.c" (involving the "comptry.bat" file), edit the makefile.vc file and delete the word "comptry.bat" in the 4th from last line. NOTE: If you want to generate debug code (using --enable-debug with configure), you need to change the makefile.vc file: Change the definition of CFLAGS so that it no longer contains '-Ot1' but '-MTd' instead. 4. Edit the script "compile_f2c" in this directory so that the variable "f2clibdir" at the beginning is set to the directory containing the libf2c runtime library. (If you installed it in /usr/local/lib as suggested above, it is already defined correctly.) 5. Put the compile_f2c script somewhere into your path, e.g., into /usr/local/bin - make sure it is executable. 6. To test it, copy the lines at the end of this file into a Fortran source file (say, bla.f), and type compile_f2c -o f2ctest bla.f Running the executable f2ctest.exe hopefully makes you happy. ---------------------- 8< ---------------- program test write (*,*) "It works!" end DyLP-1.6.0/BuildTools/compile_f2c/compile_f2c0000755000076700007670000000526310772274553015660 0ustar #!/bin/sh # Copyright (C) 2007 International Business Machines. # All Rights Reserved. # This file is distributed under the Common Public License. # It is part of the BuildTools project in COIN-OR (www.coin-or.org) # ## $Id: compile_f2c 964 2008-03-25 22:15:07Z andreasw $ # # Author: Andreas Waechter IBM 2007-06-09 ######################################################################## # Replace the following to the location of your vcf2c.lib library # Note that there must be no space before and after "=" f2clibdir=/usr/local/lib/libf2c #You should not have to change anything below this line ######################################################################## #Find out what the if test `which cygpath | wc -l` -eq 0; then CYGPATH_W=echo else CYGPATH_W='cygpath -w' fi if test "$F2C_CC" = ""; then F2C_CC=cl fi f2clib=`$CYGPATH_W $f2clibdir/vcf2c.lib` mainobj=`$CYGPATH_W $f2clibdir/main.obj` # Get rid of the \ f2clib=`echo $f2clib | sed -e s'!\\\\!/!g'` mainobj=`echo $mainobj | sed -e s'!\\\\!/!g'` if test "$#" -eq 1 && test "$1" = "-FLIBS"; then echo $f2clib exit 0 fi cincs="-I`$CYGPATH_W $f2clibdir`" options= makedll= linkflags= incs= fsrc= objs= outfile= while test "$#" -gt 0 do arg="$1" shift if test "$outfile" = next; then outfile="$arg" else case "$arg" in -I*) incs="$incs $arg" ;; -o) if test "$outfile" != ""; then echo "There are more than two -o options" exit 1 fi outfile=next ;; -c) options="$options $arg" f2clib= mainobj= ;; -shared) makedll=yes linkflags="$linkflags -dll" ;; -def:*) linkflags="$linkflags $arg" ;; -*) options="$options $arg" ;; *.[fF]) fsrc="$fsrc $arg" ;; *) objs="$objs $arg" ;; esac fi done if test "$fsrc" = "" && test "$objs" = "" ; then echo "No source or object files given" exit 1 fi csrc= if test "$fsrc" != ""; then for f in $fsrc; do cf=`echo $f | sed -e 's|.[fF]$|.c|' -e 's|.*/||'` csrc="$csrc $cf" done echo f2c $incs $fsrc f2c $incs $fsrc f2c_status=$? if test $f2c_status != 0; then rm -f $csrc exit $f2c_status fi fi if test "$outfile"; then cout="-o `$CYGPATH_W $outfile`" fi if test x$makedll = xyes; then echo $F2C_CC $options $cincs $csrc $objs $cout $f2clib -link $linkflags $F2C_CC $options $cincs $csrc $objs $cout $f2clib -link $linkflags else echo $F2C_CC $options $cincs $csrc $objs $cout $mainobj $f2clib $F2C_CC $options $cincs $csrc $objs $cout $mainobj $f2clib fi cl_status=$? rm -f $csrc exit $cl_status DyLP-1.6.0/BuildTools/depcomp0000755000076700007670000003710010430173037012720 0ustar #! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2005-07-09.11 # Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by `PROGRAMS ARGS'. object Object file output by `PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputing dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> $depfile echo >> $depfile # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> $depfile else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts `$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'` tmpdepfile="$stripped.u" if test "$libtool" = yes; then "$@" -Wc,-M else "$@" -M fi stat=$? if test -f "$tmpdepfile"; then : else stripped=`echo "$stripped" | sed 's,^.*/,,'` tmpdepfile="$stripped.u" fi if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi if test -f "$tmpdepfile"; then outname="$stripped.o" # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mecanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for `:' # in the target name. This is to cope with DOS-style filenames: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # X makedepend shift cleared=no for arg in "$@"; do case $cleared in no) set ""; shift cleared=yes ;; esac case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix="`echo $object | sed 's/^.*\././'`" touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. "$@" || exit $? IFS=" " for arg do case "$arg" in "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: DyLP-1.6.0/BuildTools/install-sh0000755000076700007670000002202110430173037013343 0ustar #!/bin/sh # install - install a program, script, or datafile scriptversion=2005-05-14.22 # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" chmodcmd="$chmodprog 0755" chowncmd= chgrpcmd= stripcmd= rmcmd="$rmprog -f" mvcmd="$mvprog" src= dst= dir_arg= dstarg= no_target_directory= usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: -c (ignored) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. --help display this help and exit. --version display version info and exit. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test -n "$1"; do case $1 in -c) shift continue;; -d) dir_arg=true shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; --help) echo "$usage"; exit $?;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -s) stripcmd=$stripprog shift continue;; -t) dstarg=$2 shift shift continue;; -T) no_target_directory=true shift continue;; --version) echo "$0 $scriptversion"; exit $?;; *) # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. test -n "$dir_arg$dstarg" && break # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dstarg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dstarg" shift # fnord fi shift # arg dstarg=$arg done break;; esac done if test -z "$1"; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi for src do # Protect names starting with `-'. case $src in -*) src=./$src ;; esac if test -n "$dir_arg"; then dst=$src src= if test -d "$dst"; then mkdircmd=: chmodcmd= else mkdircmd=$mkdirprog fi else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dstarg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dstarg # Protect names starting with `-'. case $dst in -*) dst=./$dst ;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dstarg: Is a directory" >&2 exit 1 fi dst=$dst/`basename "$src"` fi fi # This sed command emulates the dirname command. dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'` # Make sure that the destination directory exists. # Skip lots of stat calls in the usual case. if test ! -d "$dstdir"; then defaultIFS=' ' IFS="${IFS-$defaultIFS}" oIFS=$IFS # Some sh's can't handle IFS=/ for some reason. IFS='%' set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` shift IFS=$oIFS pathcomp= while test $# -ne 0 ; do pathcomp=$pathcomp$1 shift if test ! -d "$pathcomp"; then $mkdirprog "$pathcomp" # mkdir can fail with a `File exist' error in case several # install-sh are creating the directory concurrently. This # is OK. test -d "$pathcomp" || exit fi pathcomp=$pathcomp/ done fi if test -n "$dir_arg"; then $doit $mkdircmd "$dst" \ && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } else dstfile=`basename "$dst"` # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 trap '(exit $?); exit' 1 2 13 15 # Copy the file name to the temp name. $doit $cpprog "$src" "$dsttmp" && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && # Now rename the file to the real destination. { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \ || { # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { if test -f "$dstdir/$dstfile"; then $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ || { echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 (exit 1); exit 1 } else : fi } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" } } fi || { (exit 1); exit 1; } done # The final little trick to "correctly" pass the exit status to the exit trap. { (exit 0); exit 0 } # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: DyLP-1.6.0/BuildTools/share/0000755000076700007670000000000011414302701012437 5ustar DyLP-1.6.0/BuildTools/share/config.site0000644000076700007670000003046110606712157014612 0ustar # This file contains site-specific settings for the configure scripts. # It can be used to specify options that are otherwise given to the # configure script as command line arguments or environment variables. # # This file must be located either in $prefix/share or $prefix/etc, where # prefix is the installation location. For the COIN packages, this is # by default the directory where the configure of the main package is run, # unless the --prefix option was given to the configure script. # Alternatively, one can set the environment variable CONFIG_SITE to the full # path to this file. # # This template file also serves as documentation for many available # configure options for COIN-OR projects. Please be aware of the following # conventions that translate the command line format into the one for the # config.site file: # # Command line version config.site version # # --with-NAME1-NAME2 with_NAME1_NAME2=yes # --with-NAME1-NAME2="VALUE" with_NAME1_NAME2="VALUE" # --without-NAME1-NAME2 with_NAME1_NAME2=no # --enable-NAME1-NAME2 enable_NAME1_NAME2=yes # --enable-NAME1-NAME2="VALUE" enable_NAME1_NAME2="VALUE" # --disable-NAME1-NAME2 enable_NAME1_NAME2=no # # Here, "NAME1-NAME2" is some string corresponding to a particular option; # note that dashes (-) are converted into underscores(_). VALUE is the # string that is the actual argument to an option. # Other variables that are directly assigned in the configure command line, # such as CXX=g++, are also written in this way in the config.site file. # # Note: This is a /bin/sh script, setting variables. There must be no # space between "=" and the value, and if required, a quotation must be # used. # # In the following we show some arguments for configure that can be used # for the COIN configure scripts. ########################################################################## # C++ compiler choice and options # ########################################################################## # C++ compiler name #CXX=g++ # C++ compiler options, overwriting configure's default choice #CXXFLAGS='-O3 -pipe' # Additional C++ compiler options that are added to configure's default # choice #ADD_CXXFLAGS='-pg' # Additional preprocessor definitions for the C++ compiler #CXXDEFS='-DZEROFAULT' # Sometimes it is desirable to compile some projects in debug mode, # and some in default optimized mode (see also enable_debug_compile # below). In those cases, you can set the separate C++ compiler # options for optimized and debug compilation using the following # variables: #OPT_CXXFLAGS='-O3 -pipe' #DBG_CXXFLAGS='-g -pipe' # If you are using MPI, it is best to specify the underlying C++ # compiler for the configure script in CXX (so that it can figure out # the default compiler options and test them), but then to tell the # configure script the actual MPI compiler (wrapper) using the # following variable #MPICXX='mpiCC' # If a project's library is generated from C++, but the compilers used # for linking is a C or Fortran compiler, one has to provide this # compilers with the C++ runtime libraries. This is done with the # following variable: #CXXLIBS='-lstdc++ -lm' ########################################################################## # C compiler choice and options # ########################################################################## # C compiler name #CC=gcc # C compiler options, overwriting configure's default choice #CFLAGS='-O3 -pipe' # Additional C compiler options that are added to configure's default choice #ADD_CFLAGS='-pg' # Additional preprocessor definitions for the C compiler #CDEFS='-DZEROFAULT' # Sometimes it is desirable to compile some projects in debug mode, # and some in default optimized mode (see also enable_debug_compile # below). In those cases, you can set the separate C compiler # options for optimized and debug compilation using the following # variables: #OPT_CFLAGS='-O3 -pipe' #DBG_CFLAGS='-g -pipe' # If you are using MPI, it is best to specify the underlying C # compiler for the configure script in CC (so that it can figure out # the default compiler options and test them), but then to tell the # configure script the actual MPI compiler (wrapper) using the # following variable #MPICC='mpicc' ########################################################################## # Fortran compiler choice and options # ########################################################################## # Fortran compiler name #F77=gfortran # Fortran compiler options, overwriting configure's default choice #FFLAGS='-O3 -pipe' # Additional Fortran compiler options that are added to configure's default # choice #ADD_FFLAGS='-pg' # Sometimes it is desirable to compile some projects in debug mode, # and some in default optimized mode (see also enable_debug_compile # below). In those cases, you can set the separate Fortran compiler # options for optimized and debug compilation using the following # variables: #OPT_FFLAGS='-O3 -pipe' #DBG_FFLAGS='-g -pipe' # If you are using MPI, it is best to specify the underlying Fortran # compiler for the configure script in F77 (so that it can figure out # the default compiler options and test them), but then to tell the # configure script the actual MPI compiler (wrapper) using the # following variable #MPIF77='mpif77' ########################################################################## # Utility programs and their options # ########################################################################## # Program for creating and extracting archives #AR=ar # Program for listing symbols in a binary #NM=nm ########################################################################## # Flags for setting compilation and configuration modes # ########################################################################## ##### INSTALLATION LOCATION # This --prefix flag determines where the binaries etc. are going to # be installed. By default, this is equal to the directory where # 'configure' is run, so that the 'bin/', 'lib/' etc. directories are # created as subdirectories there. One could also choose other # destinations, but keep in mind that some COIN packages use the same # COIN "sub-projects", but possibly different and conflicting # versions. #prefix=$HOME/MyCOIN ##### COMPILATION MODE UNDER CYGWIN # This options can only be used under Cygwin, and it has the following # possible choices: # - mingw (default): Use the GNU compilers to compile binaries that # can be run independently of Cygwin (particularly without # Cygwin1.dll) # - msvc: Use the "native" Windows compilers, such as cl, ifort # - no: Use GNU compilers to generate Cygwin-specific binaries. #enable_doscompile=msvc ##### SKIPPING CONFIGURATION AND COMPILATION OF SUBPROJECTS # It is possible to skip the configuration and compilation of COIN # projects in a package, even when the source code for the subproject # is there. For this, list the directory names that are supposed to # be skipped in the variable #COIN_SKIP_PROJECTS="Bcp Couenne" ##### DEBUG COMPILATION # Switch on debug compilation for all projects. (Note that this will also # switch to the usage of static instead of shared libraries, see # enable_shared below) #enable_debug=yes # Switch on debug compilation only for a specific project is done with # the command line flag enable-debug-project, where "project" is the string # with the project name (say, Clp, for the example). #enable_debug_clp=yes # Similarly, if the global enable-debug is set, we can switch it off for a # particular project, using #enable_debug_clp=no # Each project can make use of a project-specific "checklevel". It # depends on the project manager, if and how this is used. The level # checklevel is specified with the --with-PROJECT-checklevel, where # PROJECT is the lower-case string of the project name. For Ipopt, # this looks like #with_ipopt_checklevel=1 # Each project can make use of a project-specific "verbosity" level. # It depends on the project manager, if and how this is used. The # level checklevel is specified with the --with-PROJECT-verbosity, # where PROJECT is the lower-case string of the project name. For # Ipopt, this looks like #with_ipopt_verbosity=1 ##### CREATING SHARED VS. STATIC LIBRARIES # By default, projects that are compiled in optimized mode, produce # shared libraries (if supported), and those compiled in debug mode, # produce static libraries. This behavior can be changed using the # following options: # disable shared mode: compile every library as static #enable_shared=no # disable static mode: compile every library as shared #enable_static=no # enable shared mode: compile always a shared library (possibly in # addition to a static one) #enable_shared=yes # enable shared mode: compile always a static library (possibly in # addition to a shared one) #enable_static=yes ##### MAINTAINER MODE # Project developers might want to make changes to the autotools files. # Using --enable-maintainer-mode enables a number of automatic updates, # including: # - regeneration of Makefiles if Makefile.am is changes, # - regeneration and rerunning of configure script if required # - updating the svn externals if the Externals file has changed #enable_maintainer_mode ########################################################################## # Third-Party Codes and Packages # ########################################################################## ##### GENERIC FLAGS # Use the following if we want to have configure check for GNU packages # (such as zlib, bzlib, and readline) #enable_gnu_packages=yes # To use some third-party libraries, such as LP solvers, one needs to # specify both the directory with all header files as well as the # linker flags for linking with the library. This is done with the # --with-LIB-incdir and --with-LIB-lib configure flags, where "LIB" is # replaced by the lower-case short-form of the library. A possibly # incomplete list of choices for LIB in the current COIN projects is: # cplex, glpk, gmpl, fortmp, mosek, mpi, osl, soplex, xpress. # For Cplex, one might set the following: #with_cplex_incdir='/usr/ilog/cplex90/include/ilcplex' #with_cplex_lib='-L/usr/ilog/cplex90/lib/static_pic -lcplex -lpthread' ##### FLAGS FOR SPECIFIC LIBRARIES IN THIRDPARTY # For some third-party dependencies, COIN supports automatic build # procedures, for which the user can download the external source code # into appropriate subdirectories in a "ThirdParty" subdirectory. But # the user might want to specify locations of already precompiled versions # of those dependencies. Those flags are discussed next. ### BLAS # Flag indicating where to find Blas. If --with-blas is not used, # the configure script will try a few default locations of Blas, and # if it doesn't find Blas, it will test if the Blas source files are # in ThirdParty/Blas. If so, those will be compiled, otherwise we # assume that Blas is not available. # # Specify precompiled Blas libraries via linker flags: #with_blas="-lf77blas -latlas /usr/lib64/libg2c.so" # Specify that Blas should be compiled within the #with_blas=BUILD # Specify that Blas should not be used #with_blas=no ### LAPACK # Flag indicating where to find Lapack. If --with-lapack is not used, # the configure script will try a few default locations of Lapack, and # if it doesn't find Lapack, it will test if the Lapack source files are # in ThirdParty/Lapack. If so, those will be compiled, otherwise we # assume that Lapack is not available. # # Specify precompiled Lapack libraries via linker flags: #with_lapack="-L$HOME/lib -lmylapack" # Specify that Lapack should be compiled within the #with_lapack=BUILD # Specify that Lapack should not be used #with_lapack=no ### ASL # Flag indicating where to find the AMPL Solver Library. If --with-asldir # is not used, the configure script will test for the source code for ASL # in ThirdParty/ASL. If this is found there, the ASL will be automatically # compiled and used, otherwise, it is assumed that ASL is unavailable. # If the user already has a precompiled version of the ASL, (s)he can use # this flag to specify the directory will all headers and the library: #with_asldir=$HOME/ampl/solvers DyLP-1.6.0/BuildTools/config.sub0000755000076700007670000007772610637360143013355 0ustar #! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, # Inc. timestamp='2007-04-29' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore | mep \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64vr | mips64vrel \ | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | mt \ | msp430 \ | nios | nios2 \ | ns16k | ns32k \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | score \ | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64vr-* | mips64vrel-* \ | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ | xstormy16-* | xtensa-* \ | ymp-* \ | z8k-*) ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; c90) basic_machine=c90-cray os=-unicos ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16c) basic_machine=cr16c-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: DyLP-1.6.0/BuildTools/missing0000755000076700007670000002540610430173037012750 0ustar #! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2005-06-08.21 # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005 # Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case "$1" in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch] Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). case "$1" in lex|yacc) # Not GNU programs, they don't have --version. ;; tar) if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then exit 1 fi ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case "$1" in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case "$f" in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison|yacc) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.h fi ;; esac fi if [ ! -f y.tab.h ]; then echo >y.tab.h fi if [ ! -f y.tab.c ]; then echo 'main() { return 0; }' >y.tab.c fi ;; lex|flex) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if [ ! -f lex.yy.c ]; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` fi if [ -f "$file" ]; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit 1 fi ;; makeinfo) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; tar) shift # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case "$firstarg" in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case "$firstarg" in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: DyLP-1.6.0/BuildTools/ltmain.sh0000755000076700007670000057753010430173037013206 0ustar # ltmain.sh - Provide generalized library-building support services. # NOTE: Changing this file will not affect anything until you rerun configure. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005 # Free Software Foundation, Inc. # Originally by Gordon Matzigkeit , 1996 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. basename="s,^.*/,,g" # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" # The name of this program: progname=`echo "$progpath" | $SED $basename` modename="$progname" # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 PROGRAM=ltmain.sh PACKAGE=libtool VERSION=1.5.22 TIMESTAMP=" (1.1220.2.365 2005/12/18 22:14:06)" # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Check that we have a working $echo. if test "X$1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X$1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then # Yippee, $echo works! : else # Restart under the correct shell, and then maybe $echo will work. exec $SHELL "$progpath" --no-reexec ${1+"$@"} fi if test "X$1" = X--fallback-echo; then # used as fallback echo shift cat <&2 $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 exit $EXIT_FAILURE fi # Global variables. mode=$default_mode nonopt= prev= prevopt= run= show="$echo" show_help= execute_dlfiles= duplicate_deps=no preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" ##################################### # Shell function definitions: # This seems to be the best place for them # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $mkdir "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || { $echo "cannot create temporary directory \`$my_tmpdir'" 1>&2 exit $EXIT_FAILURE } fi $echo "X$my_tmpdir" | $Xsed } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. func_win32_libid () { win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \ $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then win32_nmres=`eval $NM -f posix -A $1 | \ $SED -n -e '1,100{/ I /{s,.*,import,;p;q;};}'` case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $echo $win32_libid_type } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac CC_quoted="$CC_quoted $arg" done case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac CC_quoted="$CC_quoted $arg" done case "$@ " in " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then $echo "$modename: unable to infer tagged configuration" $echo "$modename: specify a tag with \`--tag'" 1>&2 exit $EXIT_FAILURE # else # $echo "$modename: using $tagname tagged configuration" fi ;; esac fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" $show "(cd $f_ex_an_ar_dir && $AR x $f_ex_an_ar_oldlib)" $run eval "(cd \$f_ex_an_ar_dir && $AR x \$f_ex_an_ar_oldlib)" || exit $? if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else $echo "$modename: ERROR: object name conflicts: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" 1>&2 exit $EXIT_FAILURE fi } # func_extract_archives gentop oldlib ... func_extract_archives () { my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" my_status="" $show "${rm}r $my_gentop" $run ${rm}r "$my_gentop" $show "$mkdir $my_gentop" $run $mkdir "$my_gentop" my_status=$? if test "$my_status" -ne 0 && test ! -d "$my_gentop"; then exit $my_status fi for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'` my_xdir="$my_gentop/$my_xlib" $show "${rm}r $my_xdir" $run ${rm}r "$my_xdir" $show "$mkdir $my_xdir" $run $mkdir "$my_xdir" exit_status=$? if test "$exit_status" -ne 0 && test ! -d "$my_xdir"; then exit $exit_status fi case $host in *-darwin*) $show "Extracting $my_xabs" # Do not bother doing anything if just a dry run if test -z "$run"; then darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`$echo "X$darwin_archive" | $Xsed -e 's%^.*/%%'` darwin_arches=`lipo -info "$darwin_archive" 2>/dev/null | $EGREP Architectures 2>/dev/null` if test -n "$darwin_arches"; then darwin_arches=`echo "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= $show "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do mkdir -p "unfat-$$/${darwin_base_archive}-${darwin_arch}" lipo -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" func_extract_an_archive "`pwd`" "${darwin_base_archive}" cd "$darwin_curdir" $rm "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" done # $darwin_arches ## Okay now we have a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print| xargs basename | sort -u | $NL2SP` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` lipo -create -output "$darwin_file" $darwin_files done # $darwin_filelist ${rm}r unfat-$$ cd "$darwin_orig_dir" else cd "$darwin_orig_dir" func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches fi # $run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # End of Shell function definitions ##################################### # Darwin sucks eval std_shrext=\"$shrext_cmds\" disable_libs=no # Parse our command line options once, thoroughly. while test "$#" -gt 0 do arg="$1" shift case $arg in -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; *) optarg= ;; esac # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in execute_dlfiles) execute_dlfiles="$execute_dlfiles $arg" ;; tag) tagname="$arg" preserve_args="${preserve_args}=$arg" # Check whether tagname contains only valid characters case $tagname in *[!-_A-Za-z0-9,/]*) $echo "$progname: invalid tag name: $tagname" 1>&2 exit $EXIT_FAILURE ;; esac case $tagname in CC) # Don't test for the "default" C tag, as we know, it's there, but # not specially marked. ;; *) if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then taglist="$taglist $tagname" # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`" else $echo "$progname: ignoring unknown tag $tagname" 1>&2 fi ;; esac ;; *) eval "$prev=\$arg" ;; esac prev= prevopt= continue fi # Have we seen a non-optional argument yet? case $arg in --help) show_help=yes ;; --version) $echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP" $echo $echo "Copyright (C) 2005 Free Software Foundation, Inc." $echo "This is free software; see the source for copying conditions. There is NO" $echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." exit $? ;; --config) ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath # Now print the configurations for the tags. for tagname in $taglist; do ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath" done exit $? ;; --debug) $echo "$progname: enabling shell trace mode" set -x preserve_args="$preserve_args $arg" ;; --dry-run | -n) run=: ;; --features) $echo "host: $host" if test "$build_libtool_libs" = yes; then $echo "enable shared libraries" else $echo "disable shared libraries" fi if test "$build_old_libs" = yes; then $echo "enable static libraries" else $echo "disable static libraries" fi exit $? ;; --finish) mode="finish" ;; --mode) prevopt="--mode" prev=mode ;; --mode=*) mode="$optarg" ;; --preserve-dup-deps) duplicate_deps="yes" ;; --quiet | --silent) show=: preserve_args="$preserve_args $arg" ;; --tag) prevopt="--tag" prev=tag preserve_args="$preserve_args --tag" ;; --tag=*) set tag "$optarg" ${1+"$@"} shift prev=tag preserve_args="$preserve_args --tag" ;; -dlopen) prevopt="-dlopen" prev=execute_dlfiles ;; -*) $echo "$modename: unrecognized option \`$arg'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; *) nonopt="$arg" break ;; esac done if test -n "$prevopt"; then $echo "$modename: option \`$prevopt' requires an argument" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi case $disable_libs in no) ;; shared) build_libtool_libs=no build_old_libs=yes ;; static) build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` ;; esac # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= if test -z "$show_help"; then # Infer the operation mode. if test -z "$mode"; then $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2 $echo "*** Future versions of Libtool will require --mode=MODE be specified." 1>&2 case $nonopt in *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*) mode=link for arg do case $arg in -c) mode=compile break ;; esac done ;; *db | *dbx | *strace | *truss) mode=execute ;; *install*|cp|mv) mode=install ;; *rm) mode=uninstall ;; *) # If we have no mode, but dlfiles were specified, then do execute mode. test -n "$execute_dlfiles" && mode=execute # Just use the default operation mode. if test -z "$mode"; then if test -n "$nonopt"; then $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2 else $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 fi fi ;; esac fi # Only execute mode is allowed to have -dlopen flags. if test -n "$execute_dlfiles" && test "$mode" != execute; then $echo "$modename: unrecognized option \`-dlopen'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$modename --help --mode=$mode' for more information." # These modes are in order of execution frequency so that they run quickly. case $mode in # libtool compile mode compile) modename="$modename: compile" # Get the compilation command and the source file. base_compile= srcfile="$nonopt" # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg="$arg" arg_mode=normal ;; target ) libobj="$arg" arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) if test -n "$libobj" ; then $echo "$modename: you cannot specify \`-o' more than once" 1>&2 exit $EXIT_FAILURE fi arg_mode=target continue ;; -static | -prefer-pic | -prefer-non-pic) later="$later $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" # Double-quote args containing other shell metacharacters. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac lastarg="$lastarg $arg" done IFS="$save_ifs" lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` # Add the arguments to base_compile. base_compile="$base_compile $lastarg" continue ;; * ) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg="$srcfile" srcfile="$arg" ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` case $lastarg in # Double-quote args containing other shell metacharacters. # Many Bourne shells cannot handle close brackets correctly # in scan sets, and some SunOS ksh mistreat backslash-escaping # in scan sets (worked around with variable expansion), # and furthermore cannot handle '|' '&' '(' ')' in scan sets # at all, so we specify them separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") lastarg="\"$lastarg\"" ;; esac base_compile="$base_compile $lastarg" done # for arg case $arg_mode in arg) $echo "$modename: you must specify an argument for -Xcompile" exit $EXIT_FAILURE ;; target) $echo "$modename: you must specify a target with \`-o'" 1>&2 exit $EXIT_FAILURE ;; *) # Get the name of the library object. [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo xform='[cCFSifmso]' case $libobj in *.ada) xform=ada ;; *.adb) xform=adb ;; *.ads) xform=ads ;; *.asm) xform=asm ;; *.c++) xform=c++ ;; *.cc) xform=cc ;; *.ii) xform=ii ;; *.class) xform=class ;; *.cpp) xform=cpp ;; *.cxx) xform=cxx ;; *.f90) xform=f90 ;; *.for) xform=for ;; *.java) xform=java ;; esac libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` case $libobj in *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; *) $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 exit $EXIT_FAILURE ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -static) build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done qlibobj=`$echo "X$libobj" | $Xsed -e "$sed_quote_subst"` case $qlibobj in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") qlibobj="\"$qlibobj\"" ;; esac test "X$libobj" != "X$qlibobj" \ && $echo "X$libobj" | grep '[]~#^*{};<>?"'"'"' &()|`$[]' \ && $echo "$modename: libobj name \`$libobj' may not contain shell special characters." objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$obj"; then xdir= else xdir=$xdir/ fi lobj=${xdir}$objdir/$objname if test -z "$base_compile"; then $echo "$modename: you must specify a compilation command" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi $run $rm $removelist trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" removelist="$removelist $output_obj $lockfile" trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $run ln "$progpath" "$lockfile" 2>/dev/null; do $show "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $echo "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $run $rm $removelist exit $EXIT_FAILURE fi $echo "$srcfile" > "$lockfile" fi if test -n "$fix_srcfile_path"; then eval srcfile=\"$fix_srcfile_path\" fi qsrcfile=`$echo "X$srcfile" | $Xsed -e "$sed_quote_subst"` case $qsrcfile in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") qsrcfile="\"$qsrcfile\"" ;; esac $run $rm "$libobj" "${libobj}T" # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. test -z "$run" && cat > ${libobj}T </dev/null`" != "X$srcfile"; then $echo "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $run $rm $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then $show "$mv $output_obj $lobj" if $run $mv $output_obj $lobj; then : else error=$? $run $rm $removelist exit $error fi fi # Append the name of the PIC object to the libtool object file. test -z "$run" && cat >> ${libobj}T <> ${libobj}T </dev/null`" != "X$srcfile"; then $echo "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $run $rm $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then $show "$mv $output_obj $obj" if $run $mv $output_obj $obj; then : else error=$? $run $rm $removelist exit $error fi fi # Append the name of the non-PIC object the libtool object file. # Only append if the libtool object file exists. test -z "$run" && cat >> ${libobj}T <> ${libobj}T <&2 fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes else if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built fi build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test ;; *) qarg=$arg ;; esac libtool_args="$libtool_args $qarg" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) compile_command="$compile_command @OUTPUT@" finalize_command="$finalize_command @OUTPUT@" ;; esac case $prev in dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. compile_command="$compile_command @SYMFILE@" finalize_command="$finalize_command @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then dlfiles="$dlfiles $arg" else dlprefiles="$dlprefiles $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" if test ! -f "$arg"; then $echo "$modename: symbol file \`$arg' does not exist" exit $EXIT_FAILURE fi prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat $save_arg` do # moreargs="$moreargs $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then pic_object= non_pic_object= # Read the .lo file # If there is no directory component, then add one. case $arg in */* | *\\*) . $arg ;; *) . ./$arg ;; esac if test -z "$pic_object" || \ test -z "$non_pic_object" || test "$pic_object" = none && \ test "$non_pic_object" = none; then $echo "$modename: cannot find name of object for \`$arg'" 1>&2 exit $EXIT_FAILURE fi # Extract subdirectory from the argument. xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$arg"; then xdir= else xdir="$xdir/" fi if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then dlfiles="$dlfiles $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. dlprefiles="$dlprefiles $pic_object" prev= fi # A PIC object. libobjs="$libobjs $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object non_pic_objects="$non_pic_objects $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" non_pic_objects="$non_pic_objects $non_pic_object" fi else # Only an error if not doing a dry-run. if test -z "$run"; then $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 exit $EXIT_FAILURE else # Dry-run case. # Extract subdirectory from the argument. xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$arg"; then xdir= else xdir="$xdir/" fi pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` libobjs="$libobjs $pic_object" non_pic_objects="$non_pic_objects $non_pic_object" fi fi done else $echo "$modename: link input file \`$save_arg' does not exist" exit $EXIT_FAILURE fi arg=$save_arg prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) $echo "$modename: only absolute run-paths are allowed" 1>&2 exit $EXIT_FAILURE ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) rpath="$rpath $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) xrpath="$xrpath $arg" ;; esac fi prev= continue ;; xcompiler) compiler_flags="$compiler_flags $qarg" prev= compile_command="$compile_command $qarg" finalize_command="$finalize_command $qarg" continue ;; xlinker) linker_flags="$linker_flags $qarg" compiler_flags="$compiler_flags $wl$qarg" prev= compile_command="$compile_command $wl$qarg" finalize_command="$finalize_command $wl$qarg" continue ;; xcclinker) linker_flags="$linker_flags $qarg" compiler_flags="$compiler_flags $qarg" prev= compile_command="$compile_command $qarg" finalize_command="$finalize_command $qarg" continue ;; shrext) shrext_cmds="$arg" prev= continue ;; darwin_framework|darwin_framework_skip) test "$prev" = "darwin_framework" && compiler_flags="$compiler_flags $arg" compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" prev= continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then compile_command="$compile_command $link_static_flag" finalize_command="$finalize_command $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 continue ;; -avoid-version) avoid_version=yes continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then $echo "$modename: more than one -exported-symbols argument is not allowed" exit $EXIT_FAILURE fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework|-arch|-isysroot) case " $CC " in *" ${arg} ${1} "* | *" ${arg} ${1} "*) prev=darwin_framework_skip ;; *) compiler_flags="$compiler_flags $arg" prev=darwin_framework ;; esac compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" ;; esac continue ;; -L*) dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2 absdir="$dir" notinst_path="$notinst_path $dir" fi dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "*) ;; *) deplibs="$deplibs -L$dir" lib_search_path="$lib_search_path $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) testbindir=`$echo "X$dir" | $Xsed -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; *) dllsearchpath="$dllsearchpath:$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; *) dllsearchpath="$dllsearchpath:$testbindir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework deplibs="$deplibs -framework System" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi deplibs="$deplibs $arg" continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. -model) compile_command="$compile_command $arg" compiler_flags="$compiler_flags $arg" finalize_command="$finalize_command $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe) compiler_flags="$compiler_flags $arg" compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" continue ;; -module) module=yes continue ;; # -64, -mips[0-9] enable 64-bit mode on the SGI compiler # -r[0-9][0-9]* specifies the processor on the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler # +DA*, +DD* enable 64-bit mode on the HP compiler # -q* pass through compiler args for the IBM compiler # -m* pass through architecture-specific compiler args for GCC # -m*, -t[45]*, -txscale* pass through architecture-specific # compiler args for GCC # -pg pass through profiling flag for GCC # @file GCC response files -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*|-pg| \ -t[45]*|-txscale*|@*) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" compiler_flags="$compiler_flags $arg" continue ;; -shrext) prev=shrext continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) # The PATH hackery in wrapper scripts is required on Windows # in order for the loader to find any dlls it needs. $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2 $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2 fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) $echo "$modename: only absolute run-paths are allowed" 1>&2 exit $EXIT_FAILURE ;; esac case "$xrpath " in *" $dir "*) ;; *) xrpath="$xrpath $dir" ;; esac continue ;; -static) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -Wc,*) args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'` arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" case $flag in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") flag="\"$flag\"" ;; esac arg="$arg $wl$flag" compiler_flags="$compiler_flags $flag" done IFS="$save_ifs" arg=`$echo "X$arg" | $Xsed -e "s/^ //"` ;; -Wl,*) args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'` arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" case $flag in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") flag="\"$flag\"" ;; esac arg="$arg $wl$flag" compiler_flags="$compiler_flags $wl$flag" linker_flags="$linker_flags $flag" done IFS="$save_ifs" arg=`$echo "X$arg" | $Xsed -e "s/^ //"` ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # Some other compiler flag. -* | +*) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac ;; *.$objext) # A standard object. objs="$objs $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then pic_object= non_pic_object= # Read the .lo file # If there is no directory component, then add one. case $arg in */* | *\\*) . $arg ;; *) . ./$arg ;; esac if test -z "$pic_object" || \ test -z "$non_pic_object" || test "$pic_object" = none && \ test "$non_pic_object" = none; then $echo "$modename: cannot find name of object for \`$arg'" 1>&2 exit $EXIT_FAILURE fi # Extract subdirectory from the argument. xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$arg"; then xdir= else xdir="$xdir/" fi if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then dlfiles="$dlfiles $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. dlprefiles="$dlprefiles $pic_object" prev= fi # A PIC object. libobjs="$libobjs $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object non_pic_objects="$non_pic_objects $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" non_pic_objects="$non_pic_objects $non_pic_object" fi else # Only an error if not doing a dry-run. if test -z "$run"; then $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 exit $EXIT_FAILURE else # Dry-run case. # Extract subdirectory from the argument. xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$arg"; then xdir= else xdir="$xdir/" fi pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` libobjs="$libobjs $pic_object" non_pic_objects="$non_pic_objects $non_pic_object" fi fi ;; *.$libext) # An archive. deplibs="$deplibs $arg" old_deplibs="$old_deplibs $arg" continue ;; *.la) # A libtool-controlled library. if test "$prev" = dlfiles; then # This library was specified with -dlopen. dlfiles="$dlfiles $arg" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. dlprefiles="$dlprefiles $arg" prev= else deplibs="$deplibs $arg" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" fi done # argument parsing loop if test -n "$prev"; then $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" fi oldlibs= # calculate the name of the file, without its directory outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` if test "X$output_objdir" = "X$output"; then output_objdir="$objdir" else output_objdir="$output_objdir/$objdir" fi # Create the object directory. if test ! -d "$output_objdir"; then $show "$mkdir $output_objdir" $run $mkdir $output_objdir exit_status=$? if test "$exit_status" -ne 0 && test ! -d "$output_objdir"; then exit $exit_status fi fi # Determine the type of output case $output in "") $echo "$modename: you must specify an output file" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac case $host in *cygwin* | *mingw* | *pw32*) # don't eliminate duplications in $postdeps and $predeps duplicate_compiler_generated_deps=yes ;; *) duplicate_compiler_generated_deps=$duplicate_deps ;; esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if test "X$duplicate_deps" = "Xyes" ; then case "$libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi libs="$libs $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; esac pre_post_deps="$pre_post_deps $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries case $linkmode in lib) passes="conv link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2 exit $EXIT_FAILURE ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; esac fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else compiler_flags="$compiler_flags $deplib" fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2 continue fi name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then library_names= old_library= case $lib in */* | *\\*) . $lib ;; *) . ./$lib ;; esac for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` test "X$ladir" = "X$lib" && ladir="." lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` ;; *) $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2 ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'` # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) xrpath="$xrpath $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) lib="$deplib" ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` if eval $echo \"$deplib\" 2>/dev/null \ | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then $echo $echo "*** Warning: Trying to link with static lib archive $deplib." $echo "*** I have the capability to make that library automatically link in when" $echo "*** you link to this library. But I can only do this if you have a" $echo "*** shared version of the library, which you do not appear to have" $echo "*** because the file extensions .$libext of this argument makes me believe" $echo "*** that it is just a static archive that I should not used here." else $echo $echo "*** Warning: Linking the shared library $output against the" $echo "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. newdlprefiles="$newdlprefiles $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else newdlfiles="$newdlfiles $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else $echo "$modename: cannot find the library \`$lib' or unhandled argument \`$deplib'" 1>&2 exit $EXIT_FAILURE fi # Check to see that this really is a libtool archive. if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : else $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` test "X$ladir" = "X$lib" && ladir="." dlname= dlopen= dlpreopen= libdir= library_names= old_library= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file case $lib in */* | *\\*) . $lib ;; *) . ./$lib ;; esac if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && dlfiles="$dlfiles $dlopen" test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 exit $EXIT_FAILURE fi # It is a libtool convenience library, so add in its objects. convenience="$convenience $ladir/$objdir/$old_library" old_convenience="$old_convenience $ladir/$objdir/$old_library" tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if test "X$duplicate_deps" = "Xyes" ; then case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi tmp_libs="$tmp_libs $deplib" done elif test "$linkmode" != prog && test "$linkmode" != lib; then $echo "$modename: \`$lib' is not a convenience library" 1>&2 exit $EXIT_FAILURE fi continue fi # $pass = conv # Get the name of the library we link against. linklib= for l in $old_library $library_names; do linklib="$l" done if test -z "$linklib"; then $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 exit $EXIT_FAILURE fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2 exit $EXIT_FAILURE fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. dlprefiles="$dlprefiles $lib $dependency_libs" else newdlfiles="$newdlfiles $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2 $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 abs_ladir="$ladir" fi ;; esac laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then $echo "$modename: warning: library \`$lib' was moved." 1>&2 dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$libdir" absdir="$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later notinst_path="$notinst_path $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later notinst_path="$notinst_path $abs_ladir" fi fi # $installed = yes name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir"; then $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2 exit $EXIT_FAILURE fi # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then newdlprefiles="$newdlprefiles $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then newdlprefiles="$newdlprefiles $dir/$dlname" else newdlprefiles="$newdlprefiles $dir/$linklib" fi fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then newlib_search_path="$newlib_search_path $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if test "X$duplicate_deps" = "Xyes" ; then case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi tmp_libs="$tmp_libs $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { test "$prefer_static_libs" = no || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. case "$temp_rpath " in *" $dir "*) ;; *" $absdir "*) ;; *) temp_rpath="$temp_rpath $absdir" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) compile_rpath="$compile_rpath $absdir" esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test "$use_static_libs" = built && test "$installed" = yes ; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then if test "$installed" = no; then notinst_deplibs="$notinst_deplibs $lib" need_relink=yes fi # This is a shared library # Warn about portability, can't link against -module's on # some systems (darwin) if test "$shouldnotlink" = yes && test "$pass" = link ; then $echo if test "$linkmode" = prog; then $echo "*** Warning: Linking the executable $output against the loadable module" else $echo "*** Warning: Linking the shared library $output against the loadable module" fi $echo "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) compile_rpath="$compile_rpath $absdir" esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names realname="$2" shift; shift libname=`eval \\$echo \"$libname_spec\"` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw*) major=`expr $current - $age` versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" soname=`$echo $soroot | ${SED} -e 's/^.*\///'` newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a" # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else $show "extracting exported symbol list from \`$soname'" save_ifs="$IFS"; IFS='~' cmds=$extract_expsyms_cmds for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else $show "generating import library for \`$soname'" save_ifs="$IFS"; IFS='~' cmds=$old_archive_from_expsyms_cmds for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; *-*-sysv4*uw2*) add_dir="-L$dir" ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a module then we can not link against # it, someone is ignoring the new warnings I added if /usr/bin/file -L $add 2> /dev/null | $EGREP ": [^:]* bundle" >/dev/null ; then $echo "** Warning, lib $linklib is a module, not a shared library" if test -z "$old_library" ; then $echo $echo "** And there doesn't seem to be a static archive available" $echo "** The link will probably fail, sorry" else add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$dir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) add_dir="$add_dir -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then $echo "$modename: configuration error: unsupported hardcode properties" exit $EXIT_FAILURE fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && \ test "$hardcode_minus_L" != yes && \ test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) add_dir="$add_dir -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. $echo $echo "*** Warning: This system can not link to static lib archive $lib." $echo "*** I have the capability to make that library automatically link in when" $echo "*** you link to this library. But I can only do this if you have a" $echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then $echo "*** But as you try to build a module library, libtool will still create " $echo "*** a static module, that should work as long as the dlopening application" $echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then $echo $echo "*** However, this would only work if libtool was able to extract symbol" $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" $echo "*** not find such a program. So, this module is probably useless." $echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'` case " $xrpath " in *" $temp_xrpath "*) ;; *) xrpath="$xrpath $temp_xrpath";; esac;; *) temp_deplibs="$temp_deplibs $libdir";; esac done dependency_libs="$temp_deplibs" fi newlib_search_path="$newlib_search_path $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" if test "X$duplicate_deps" = "Xyes" ; then case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi tmp_libs="$tmp_libs $deplib" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do case $deplib in -L*) path="$deplib" ;; *.la) dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'` test "X$dir" = "X$deplib" && dir="." # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 absdir="$dir" fi ;; esac if grep "^installed=no" $deplib > /dev/null; then path="$absdir/$objdir" else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` if test -z "$libdir"; then $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi if test "$absdir" != "$libdir"; then $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 fi path="$absdir" fi depdepl= case $host in *-*-darwin*) # we do not want to link against static libs, # but need to link against shared eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$path/$depdepl" ; then depdepl="$path/$depdepl" fi # do not add paths which are already there case " $newlib_search_path " in *" $path "*) ;; *) newlib_search_path="$newlib_search_path $path";; esac fi path="" ;; *) path="-L$path" ;; esac ;; -l*) case $host in *-*-darwin*) # Again, we only want to link against shared libraries eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"` for tmp in $newlib_search_path ; do if test -f "$tmp/lib$tmp_libs.dylib" ; then eval depdepl="$tmp/lib$tmp_libs.dylib" break fi done path="" ;; *) continue ;; esac ;; *) continue ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac case " $deplibs " in *" $depdepl "*) ;; *) deplibs="$depdepl $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) lib_search_path="$lib_search_path $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) tmp_libs="$tmp_libs $deplib" ;; esac ;; *) tmp_libs="$tmp_libs $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then tmp_libs="$tmp_libs $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$deplibs"; then $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 fi if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 fi if test -n "$rpath"; then $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 fi if test -n "$xrpath"; then $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 fi if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2 fi if test -n "$release"; then $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 fi if test -n "$export_symbols" || test -n "$export_symbols_regex"; then $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 fi # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" objs="$objs$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) if test "$module" = no; then $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1 exit $EXIT_FAILURE else $echo $echo "*** Warning: Linking the shared library $output against the non-libtool" $echo "*** objects $objs is not portable!" libobjs="$libobjs $objs" fi fi if test "$dlself" != no; then $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2 fi set dummy $rpath if test "$#" -gt 2; then $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 fi install_libdir="$2" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2 fi if test -n "$release"; then $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 fi else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 IFS="$save_ifs" if test -n "$8"; then $echo "$modename: too many parameters to \`-version-info'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$2" number_minor="$3" number_revision="$4" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in darwin|linux|osf|windows) current=`expr $number_major + $number_minor` age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) current=`expr $number_major + $number_minor - 1` age="$number_minor" revision="$number_minor" ;; esac ;; no) current="$2" revision="$3" age="$4" ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) $echo "$modename: CURRENT \`$current' must be a nonnegative integer" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 exit $EXIT_FAILURE ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) $echo "$modename: REVISION \`$revision' must be a nonnegative integer" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 exit $EXIT_FAILURE ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) $echo "$modename: AGE \`$age' must be a nonnegative integer" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 exit $EXIT_FAILURE ;; esac if test "$age" -gt "$current"; then $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 exit $EXIT_FAILURE fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header major=.`expr $current - $age` versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... minor_current=`expr $current + 1` verstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current"; ;; irix | nonstopux) major=`expr $current - $age + 1` case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do iface=`expr $revision - $loop` loop=`expr $loop - 1` verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) major=.`expr $current - $age` versuffix="$major.$age.$revision" ;; osf) major=.`expr $current - $age` versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do iface=`expr $current - $loop` loop=`expr $loop - 1` verstring="$verstring:${iface}.0" done # Make executables depend on our current version. verstring="$verstring:${current}.0" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. major=`expr $current - $age` versuffix="-$major" ;; *) $echo "$modename: unknown library version type \`$version_type'" 1>&2 $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 exit $EXIT_FAILURE ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi if test "$mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$echo "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi removelist="$removelist $p" ;; *) ;; esac done if test -n "$removelist"; then $show "${rm}r $removelist" $run ${rm}r $removelist fi fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then oldlibs="$oldlibs $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` fi # Eliminate all temporary directories. for path in $notinst_path; do lib_search_path=`$echo "$lib_search_path " | ${SED} -e "s% $path % %g"` deplibs=`$echo "$deplibs " | ${SED} -e "s% -L$path % %g"` dependency_libs=`$echo "$dependency_libs " | ${SED} -e "s% -L$path % %g"` done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do temp_xrpath="$temp_xrpath -R$libdir" case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) dlfiles="$dlfiles $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) dlprefiles="$dlprefiles $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework deplibs="$deplibs -framework System" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then deplibs="$deplibs -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $rm conftest.c cat > conftest.c </dev/null` for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null \ | grep " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ | ${SED} 10q \ | $EGREP "$file_magic_regex" > /dev/null; then newdeplibs="$newdeplibs $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes $echo $echo "*** Warning: linker path does not have real file for library $a_deplib." $echo "*** I have the capability to make that library automatically link in when" $echo "*** you link to this library. But I can only do this if you have a" $echo "*** shared version of the library, which you do not appear to have" $echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $echo "*** with $libname but no candidates were found. (...for file magic test)" else $echo "*** with $libname and none of the candidates passed a file format test" $echo "*** using a file magic. Last file checked: $potlib" fi fi else # Add a -L argument. newdeplibs="$newdeplibs $a_deplib" fi done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` for a_deplib in $deplibs; do name=`expr $a_deplib : '-l\(.*\)'` # If $name is empty we are operating on a -L argument. if test -n "$name" && test "$name" != "0"; then if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) newdeplibs="$newdeplibs $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval \\$echo \"$libname_spec\"` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval $echo \"$potent_lib\" 2>/dev/null \ | ${SED} 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then newdeplibs="$newdeplibs $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes $echo $echo "*** Warning: linker path does not have real file for library $a_deplib." $echo "*** I have the capability to make that library automatically link in when" $echo "*** you link to this library. But I can only do this if you have a" $echo "*** shared version of the library, which you do not appear to have" $echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $echo "*** with $libname but no candidates were found. (...for regex pattern test)" else $echo "*** with $libname and none of the candidates passed a file format test" $echo "*** using a regex pattern. Last file checked: $potlib" fi fi else # Add a -L argument. newdeplibs="$newdeplibs $a_deplib" fi done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ -e 's/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"` done fi if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \ | grep . >/dev/null; then $echo if test "X$deplibs_check_method" = "Xnone"; then $echo "*** Warning: inter-library dependencies are not supported in this platform." else $echo "*** Warning: inter-library dependencies are not known to be supported." fi $echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes fi ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then $echo $echo "*** Warning: libtool could not satisfy all declared inter-library" $echo "*** dependencies of module $libname. Therefore, libtool will create" $echo "*** a static module, that should work as long as the dlopening" $echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then $echo $echo "*** However, this would only work if libtool was able to extract symbol" $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" $echo "*** not find such a program. So, this module is probably useless." $echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else $echo "*** The inter-library dependencies that have been dropped here will be" $echo "*** automatically added whenever a program is linked with this library" $echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then $echo $echo "*** Since this library must not contain undefined symbols," $echo "*** because either the platform does not support them or" $echo "*** it was explicitly requested with -no-undefined," $echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) new_libs="$new_libs -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$new_libs $deplib" ;; esac ;; *) new_libs="$new_libs $deplib" ;; esac done deplibs="$new_libs" # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" dep_rpath="$dep_rpath $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) perm_rpath="$perm_rpath $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" if test -n "$hardcode_libdir_flag_spec_ld"; then eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" else eval dep_rpath=\"$hardcode_libdir_flag_spec\" fi fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do rpath="$rpath$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names realname="$2" shift; shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" linknames= for link do linknames="$linknames $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then $show "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $run $rm $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" if len=`expr "X$cmd" : ".*"` && test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then $show "$cmd" $run eval "$cmd" || exit $? skipped_export=false else # The command line is too long to execute in one step. $show "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" if test -n "$export_symbols_regex"; then $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' $show "$mv \"${export_symbols}T\" \"$export_symbols\"" $run eval '$mv "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) tmp_deplibs="$tmp_deplibs $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" else gentop="$output_objdir/${outputname}x" generated="$generated $gentop" func_extract_archives $gentop $convenience libobjs="$libobjs $func_extract_archives_result" fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" linker_flags="$linker_flags $flag" fi # Make a backup of the uninstalled library when relinking if test "$mode" = relink; then $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && len=`expr "X$test_cmds" : ".*" 2>/dev/null` && test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise. $echo "creating reloadable object files..." # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output output_la=`$echo "X$output" | $Xsed -e "$basename"` # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= delfiles= last_robj= k=1 output=$output_objdir/$output_la-${k}.$objext # Loop over the list of objects to be linked. for obj in $save_libobjs do eval test_cmds=\"$reload_cmds $objlist $last_robj\" if test "X$objlist" = X || { len=`expr "X$test_cmds" : ".*" 2>/dev/null` && test "$len" -le "$max_cmd_len"; }; then objlist="$objlist $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. eval concat_cmds=\"$reload_cmds $objlist $last_robj\" else # All subsequent reloadable object files will link in # the last one created. eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext k=`expr $k + 1` output=$output_objdir/$output_la-${k}.$objext objlist=$obj len=1 fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" if ${skipped_export-false}; then $show "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $run $rm $export_symbols libobjs=$output # Append the command to create the export file. eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\" fi # Set up a command to remove the reloadable object files # after they are used. i=0 while test "$i" -lt "$k" do i=`expr $i + 1` delfiles="$delfiles $output_objdir/$output_la-${i}.$objext" done $echo "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi # Append the command to remove the reloadable object files # to the just-reset $cmds. eval cmds=\"\$cmds~\$rm $delfiles\" fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$mode" = relink; then $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)' fi exit $lt_exit } done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$mode" = relink; then $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then $show "${rm}r $gentop" $run ${rm}r "$gentop" fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$deplibs"; then $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 fi if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 fi if test -n "$rpath"; then $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 fi if test -n "$xrpath"; then $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 fi if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 fi if test -n "$release"; then $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 fi case $output in *.lo) if test -n "$objs$old_deplibs"; then $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 exit $EXIT_FAILURE fi libobj="$output" obj=`$echo "X$output" | $Xsed -e "$lo2o"` ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $run $rm $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\" else gentop="$output_objdir/${obj}x" generated="$generated $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # Create the old-style object. reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" cmds=$reload_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then $show "${rm}r $gentop" $run ${rm}r $gentop fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then $show "${rm}r $gentop" $run ${rm}r $gentop fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $run eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" cmds=$reload_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" fi if test -n "$gentop"; then $show "${rm}r $gentop" $run ${rm}r $gentop fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;; esac if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 fi if test -n "$release"; then $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 fi if test "$preload" = yes; then if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown && test "$dlopen_self_static" = unknown; then $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." fi fi case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'` finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'` ;; esac case $host in *darwin*) # Don't allow lazy linking, it breaks C++ global constructors if test "$tagname" = CXX ; then compile_command="$compile_command ${wl}-bind_at_load" finalize_command="$finalize_command ${wl}-bind_at_load" fi ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) new_libs="$new_libs -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$new_libs $deplib" ;; esac ;; *) new_libs="$new_libs $deplib" ;; esac done compile_deplibs="$new_libs" compile_command="$compile_command $compile_deplibs" finalize_command="$finalize_command $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" rpath="$rpath $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) perm_rpath="$perm_rpath $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) testbindir=`$echo "X$libdir" | $Xsed -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; *) dllsearchpath="$dllsearchpath:$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; *) dllsearchpath="$dllsearchpath:$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" rpath="$rpath $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` fi dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then dlsyms="${outputname}S.c" else $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 fi fi if test -n "$dlsyms"; then case $dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${outputname}.nm" $show "$rm $nlist ${nlist}S ${nlist}T" $run $rm "$nlist" "${nlist}S" "${nlist}T" # Parse the name list into a source file. $show "creating $output_objdir/$dlsyms" test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ /* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ /* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ #ifdef __cplusplus extern \"C\" { #endif /* Prevent the only kind of declaration conflicts we can make. */ #define lt_preloaded_symbols some_other_symbol /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then $show "generating symbol list for \`$output'" test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` for arg in $progfiles; do $show "extracting global C symbols from \`$arg'" $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' $run eval '$mv "$nlist"T "$nlist"' fi if test -n "$export_symbols_regex"; then $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' $run eval '$mv "$nlist"T "$nlist"' fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $run $rm $export_symbols $run eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* ) $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' $run eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac else $run eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' $run eval 'grep -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' $run eval 'mv "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* ) $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' $run eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac fi fi for arg in $dlprefiles; do $show "extracting global C symbols from \`$arg'" name=`$echo "$arg" | ${SED} -e 's%^.*/%%'` $run eval '$echo ": $name " >> "$nlist"' $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" done if test -z "$run"; then # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $mv "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if grep -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else grep -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"' else $echo '/* NONE */' >> "$output_objdir/$dlsyms" fi $echo >> "$output_objdir/$dlsyms" "\ #undef lt_preloaded_symbols #if defined (__STDC__) && __STDC__ # define lt_ptr void * #else # define lt_ptr char * # define const #endif /* The mapping between symbol names and symbols. */ " case $host in *cygwin* | *mingw* ) $echo >> "$output_objdir/$dlsyms" "\ /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs */ struct { " ;; * ) $echo >> "$output_objdir/$dlsyms" "\ const struct { " ;; esac $echo >> "$output_objdir/$dlsyms" "\ const char *name; lt_ptr address; } lt_preloaded_symbols[] = {\ " eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms" $echo >> "$output_objdir/$dlsyms" "\ {0, (lt_ptr) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " fi pic_flag_for_symtable= case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) case "$compile_command " in *" -static "*) ;; *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";; esac;; *-*-hpux*) case "$compile_command " in *" -static "*) ;; *) pic_flag_for_symtable=" $pic_flag";; esac esac # Now compile the dynamic symbol file. $show "(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" $run eval '(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? # Clean up the generated files. $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" # Transform the symbol file into the correct name. case $host in *cygwin* | *mingw* ) if test -f "$output_objdir/${outputname}.def" ; then compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%"` finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%"` else compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` fi ;; * ) compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` ;; esac ;; *) $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 exit $EXIT_FAILURE ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` fi if test "$need_relink" = no || test "$build_libtool_libs" != yes; then # Replace the output file specification. compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. $show "$link_command" $run eval "$link_command" exit_status=$? # Delete the generated files. if test -n "$dlsyms"; then $show "$rm $output_objdir/${outputname}S.${objext}" $run $rm "$output_objdir/${outputname}S.${objext}" fi exit $exit_status fi if test -n "$shlibpath_var"; then # We should set the shlibpath_var rpath= for dir in $temp_rpath; do case $dir in [\\/]* | [A-Za-z]:[\\/]*) # Absolute path. rpath="$rpath$dir:" ;; *) # Relative path: add a thisdir entry. rpath="$rpath\$thisdir/$dir:" ;; esac done temp_rpath="$rpath" fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do rpath="$rpath$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do rpath="$rpath$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $run $rm $output # Link the executable and exit $show "$link_command" $run eval "$link_command" || exit $? exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 $echo "$modename: \`$output' will be relinked during installation" 1>&2 else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname $show "$link_command" $run eval "$link_command" || exit $? # Now create the wrapper script. $show "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` relink_command="$var=\"$var_value\"; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` fi # Quote $echo for shipping. if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then case $progpath in [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; esac qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` else qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` fi # Only actually do things if our run command is non-null. if test -z "$run"; then # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) output_name=`basename $output` output_path=`dirname $output` cwrappersource="$output_path/$objdir/lt-$output_name.c" cwrapper="$output_path/$output_name.exe" $rm $cwrappersource $cwrapper trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 cat > $cwrappersource <> $cwrappersource<<"EOF" #include #include #include #include #include #include #include #include #include #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) # define HAVE_DOS_BASED_FILE_SYSTEM # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) /* -DDEBUG is fairly common in CFLAGS. */ #undef DEBUG #if defined DEBUGWRAPPER # define DEBUG(format, ...) fprintf(stderr, format, __VA_ARGS__) #else # define DEBUG(format, ...) #endif const char *program_name = NULL; void * xmalloc (size_t num); char * xstrdup (const char *string); const char * base_name (const char *name); char * find_executable(const char *wrapper); int check_executable(const char *path); char * strendzap(char *str, const char *pat); void lt_fatal (const char *message, ...); int main (int argc, char *argv[]) { char **newargz; int i; program_name = (char *) xstrdup (base_name (argv[0])); DEBUG("(main) argv[0] : %s\n",argv[0]); DEBUG("(main) program_name : %s\n",program_name); newargz = XMALLOC(char *, argc+2); EOF cat >> $cwrappersource <> $cwrappersource <<"EOF" newargz[1] = find_executable(argv[0]); if (newargz[1] == NULL) lt_fatal("Couldn't find %s", argv[0]); DEBUG("(main) found exe at : %s\n",newargz[1]); /* we know the script has the same name, without the .exe */ /* so make sure newargz[1] doesn't end in .exe */ strendzap(newargz[1],".exe"); for (i = 1; i < argc; i++) newargz[i+1] = xstrdup(argv[i]); newargz[argc+1] = NULL; for (i=0; i> $cwrappersource <> $cwrappersource <> $cwrappersource <<"EOF" return 127; } void * xmalloc (size_t num) { void * p = (void *) malloc (num); if (!p) lt_fatal ("Memory exhausted"); return p; } char * xstrdup (const char *string) { return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL ; } const char * base_name (const char *name) { const char *base; #if defined (HAVE_DOS_BASED_FILE_SYSTEM) /* Skip over the disk name in MSDOS pathnames. */ if (isalpha ((unsigned char)name[0]) && name[1] == ':') name += 2; #endif for (base = name; *name; name++) if (IS_DIR_SEPARATOR (*name)) base = name + 1; return base; } int check_executable(const char * path) { struct stat st; DEBUG("(check_executable) : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!"); if ((!path) || (!*path)) return 0; if ((stat (path, &st) >= 0) && ( /* MinGW & native WIN32 do not support S_IXOTH or S_IXGRP */ #if defined (S_IXOTH) ((st.st_mode & S_IXOTH) == S_IXOTH) || #endif #if defined (S_IXGRP) ((st.st_mode & S_IXGRP) == S_IXGRP) || #endif ((st.st_mode & S_IXUSR) == S_IXUSR)) ) return 1; else return 0; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise */ char * find_executable (const char* wrapper) { int has_slash = 0; const char* p; const char* p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; int tmp_len; char* concat_name; DEBUG("(find_executable) : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha ((unsigned char)wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable(concat_name)) return concat_name; XFREE(concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable(concat_name)) return concat_name; XFREE(concat_name); } #if defined (HAVE_DOS_BASED_FILE_SYSTEM) } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char* path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char* q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR(*q)) break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal ("getcwd failed"); tmp_len = strlen(tmp); concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC(char, p_len + 1 + strlen(wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable(concat_name)) return concat_name; XFREE(concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal ("getcwd failed"); tmp_len = strlen(tmp); concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable(concat_name)) return concat_name; XFREE(concat_name); return NULL; } char * strendzap(char *str, const char *pat) { size_t len, patlen; assert(str != NULL); assert(pat != NULL); len = strlen(str); patlen = strlen(pat); if (patlen <= len) { str += len - patlen; if (strcmp(str, pat) == 0) *str = '\0'; } return str; } static void lt_error_core (int exit_status, const char * mode, const char * message, va_list ap) { fprintf (stderr, "%s: %s: ", program_name, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, "FATAL", message, ap); va_end (ap); } EOF # we should really use a build-platform specific compiler # here, but OTOH, the wrappers (shell script and this C one) # are only useful if you want to execute the "real" binary. # Since the "real" binary is built for $host, then this # wrapper might as well be built for $host, too. $run $LTCC $LTCFLAGS -s -o $cwrapper $cwrappersource ;; esac $rm $output trap "$rm $output; exit $EXIT_FAILURE" 1 2 15 $echo > $output "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed='${SED} -e 1s/^X//' sed_quote_subst='$sed_quote_subst' # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variable: notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$echo are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then echo=\"$qecho\" file=\"\$0\" # Make sure echo works. if test \"X\$1\" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then # Yippee, \$echo works! : else # Restart under the correct shell, and then maybe \$echo will work. exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} fi fi\ " $echo >> $output "\ # Find the directory that this script lives in. thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` done # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $echo >> $output "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || \\ { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $mkdir \"\$progdir\" else $rm \"\$progdir/\$file\" fi" $echo >> $output "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $echo \"\$relink_command_output\" >&2 $rm \"\$progdir/\$file\" exit $EXIT_FAILURE fi fi $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $rm \"\$progdir/\$program\"; $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } $rm \"\$progdir/\$file\" fi" else $echo >> $output "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $echo >> $output "\ if test -f \"\$progdir/\$program\"; then" # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $echo >> $output "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` export $shlibpath_var " fi # fixup the dll searchpath if we need to. if test -n "$dllsearchpath"; then $echo >> $output "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi $echo >> $output "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2*) $echo >> $output "\ exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $echo >> $output "\ exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $echo >> $output "\ \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\" exit $EXIT_FAILURE fi else # The program doesn't exist. \$echo \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$echo \"This script is just a wrapper for \$program.\" 1>&2 $echo \"See the $PACKAGE documentation for more information.\" 1>&2 exit $EXIT_FAILURE fi fi\ " chmod +x $output fi exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" generated="$generated $gentop" func_extract_archives $gentop $addlibs oldobjs="$oldobjs $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do $echo "X$obj" | $Xsed -e 's%^.*/%%' done | sort | sort -uc >/dev/null 2>&1); then : else $echo "copying selected object files to avoid basename conflicts..." if test -z "$gentop"; then gentop="$output_objdir/${outputname}x" generated="$generated $gentop" $show "${rm}r $gentop" $run ${rm}r "$gentop" $show "$mkdir $gentop" $run $mkdir "$gentop" exit_status=$? if test "$exit_status" -ne 0 && test ! -d "$gentop"; then exit $exit_status fi fi save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do objbase=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase counter=`expr $counter + 1` case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done $show "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" $run ln "$obj" "$gentop/$newobj" || $run cp "$obj" "$gentop/$newobj" oldobjs="$oldobjs $gentop/$newobj" ;; *) oldobjs="$oldobjs $obj" ;; esac done fi eval cmds=\"$old_archive_cmds\" if len=`expr "X$cmds" : ".*"` && test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts $echo "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done for obj in $save_oldobjs do oldobjs="$objlist $obj" objlist="$objlist $obj" eval test_cmds=\"$old_archive_cmds\" if len=`expr "X$test_cmds" : ".*" 2>/dev/null` && test "$len" -le "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do eval cmd=\"$cmd\" IFS="$save_ifs" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" done if test -n "$generated"; then $show "${rm}r$generated" $run ${rm}r$generated fi # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" $show "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` relink_command="$var=\"$var_value\"; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. if test -z "$run"; then for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'` eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` if test -z "$libdir"; then $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi newdependency_libs="$newdependency_libs $libdir/$name" ;; *) newdependency_libs="$newdependency_libs $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` if test -z "$libdir"; then $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi newdlfiles="$newdlfiles $libdir/$name" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` if test -z "$libdir"; then $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi newdlprefiles="$newdlprefiles $libdir/$name" done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac newdlfiles="$newdlfiles $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac newdlprefiles="$newdlprefiles $abs" done dlprefiles="$newdlprefiles" fi $rm $output # place dlname in correct position for cygwin tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; esac $echo > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $echo >> $output "\ relink_command=\"$relink_command\"" fi done fi # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? ;; esac exit $EXIT_SUCCESS ;; # libtool install mode install) modename="$modename: install" # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. $echo "X$nonopt" | grep shtool > /dev/null; then # Aesthetically quote it. arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac install_prog="$arg " arg="$1" shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac install_prog="$install_prog$arg" # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= for arg do if test -n "$dest"; then files="$files $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) case " $install_prog " in *[\\\ /]cp\ *) ;; *) prev=$arg ;; esac ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac install_prog="$install_prog $arg" done if test -z "$install_prog"; then $echo "$modename: you must specify an install program" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi if test -n "$prev"; then $echo "$modename: the \`$prev' option requires an argument" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi if test -z "$files"; then if test -z "$dest"; then $echo "$modename: no file or destination specified" 1>&2 else $echo "$modename: you must specify a destination" 1>&2 fi $echo "$help" 1>&2 exit $EXIT_FAILURE fi # Strip any trailing slash from the destination. dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` test "X$destdir" = "X$dest" && destdir=. destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` # Not a directory, so check to see that there is only one file specified. set dummy $files if test "$#" -gt 2; then $echo "$modename: \`$dest' is not a directory" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. staticlibs="$staticlibs $file" ;; *.la) # Check to see that this really is a libtool archive. if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : else $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi library_names= old_library= relink_command= # If there is no directory component, then add one. case $file in */* | *\\*) . $file ;; *) . ./$file ;; esac # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) current_libdirs="$current_libdirs $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) future_libdirs="$future_libdirs $libdir" ;; esac fi dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/ test "X$dir" = "X$file/" && dir= dir="$dir$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. if test "$inst_prefix_dir" = "$destdir"; then $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2 exit $EXIT_FAILURE fi if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi $echo "$modename: warning: relinking \`$file'" 1>&2 $show "$relink_command" if $run eval "$relink_command"; then : else $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 exit $EXIT_FAILURE fi fi # See the names of the shared library. set dummy $library_names if test -n "$2"; then realname="$2" shift shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. $show "$install_prog $dir/$srcname $destdir/$realname" $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $? if test -n "$stripme" && test -n "$striplib"; then $show "$striplib $destdir/$realname" $run eval "$striplib $destdir/$realname" || exit $? fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try `ln -sf' first, because the `ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do if test "$linkname" != "$realname"; then $show "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" $run eval "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" fi done fi # Do each command in the postinstall commands. lib="$destdir/$realname" cmds=$postinstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$mode" = relink; then $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)' fi exit $lt_exit } done IFS="$save_ifs" fi # Install the pseudo-library for information purposes. name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` instname="$dir/$name"i $show "$install_prog $instname $destdir/$name" $run eval "$install_prog $instname $destdir/$name" || exit $? # Maybe install the static library, too. test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` ;; *.$objext) staticdest="$destfile" destfile= ;; *) $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; esac # Install the libtool object if requested. if test -n "$destfile"; then $show "$install_prog $file $destfile" $run eval "$install_prog $file $destfile" || exit $? fi # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` $show "$install_prog $staticobj $staticdest" $run eval "$install_prog \$staticobj \$staticdest" || exit $? fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then file=`$echo $file|${SED} 's,.exe$,,'` stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin*|*mingw*) wrapper=`$echo $file | ${SED} -e 's,.exe$,,'` ;; *) wrapper=$file ;; esac if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then notinst_deplibs= relink_command= # Note that it is not necessary on cygwin/mingw to append a dot to # foo even if both foo and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. # # If there is no directory component, then add one. case $wrapper in */* | *\\*) . ${wrapper} ;; *) . ./${wrapper} ;; esac # Check the variables that should have been set. if test -z "$notinst_deplibs"; then $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2 exit $EXIT_FAILURE fi finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then # If there is no directory component, then add one. case $lib in */* | *\\*) . $lib ;; *) . ./$lib ;; esac fi libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 finalize=no fi done relink_command= # Note that it is not necessary on cygwin/mingw to append a dot to # foo even if both foo and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. # # If there is no directory component, then add one. case $wrapper in */* | *\\*) . ${wrapper} ;; *) . ./${wrapper} ;; esac outputname= if test "$fast_install" = no && test -n "$relink_command"; then if test "$finalize" = yes && test -z "$run"; then tmpdir=`func_mktempdir` file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'` outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` $show "$relink_command" if $run eval "$relink_command"; then : else $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 ${rm}r "$tmpdir" continue fi file="$outputname" else $echo "$modename: warning: cannot relink \`$file'" 1>&2 fi else # Install the binary that we compiled earlier. file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'` ;; esac ;; esac $show "$install_prog$stripme $file $destfile" $run eval "$install_prog\$stripme \$file \$destfile" || exit $? test -n "$outputname" && ${rm}r "$tmpdir" ;; esac done for file in $staticlibs; do name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` # Set up the ranlib parameters. oldlib="$destdir/$name" $show "$install_prog $file $oldlib" $run eval "$install_prog \$file \$oldlib" || exit $? if test -n "$stripme" && test -n "$old_striplib"; then $show "$old_striplib $oldlib" $run eval "$old_striplib $oldlib" || exit $? fi # Do each command in the postinstall commands. cmds=$old_postinstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" done if test -n "$future_libdirs"; then $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 fi if test -n "$current_libdirs"; then # Maybe just do a dry run. test -n "$run" && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi ;; # libtool finish mode finish) modename="$modename: finish" libdirs="$nonopt" admincmds= if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for dir do libdirs="$libdirs $dir" done for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. cmds=$finish_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || admincmds="$admincmds $cmd" done IFS="$save_ifs" fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $run eval "$cmds" || admincmds="$admincmds $cmds" fi done fi # Exit here if they wanted silent mode. test "$show" = : && exit $EXIT_SUCCESS $echo "X----------------------------------------------------------------------" | $Xsed $echo "Libraries have been installed in:" for libdir in $libdirs; do $echo " $libdir" done $echo $echo "If you ever happen to want to link against installed libraries" $echo "in a given directory, LIBDIR, you must either use libtool, and" $echo "specify the full pathname of the library, or use the \`-LLIBDIR'" $echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then $echo " - add LIBDIR to the \`$shlibpath_var' environment variable" $echo " during execution" fi if test -n "$runpath_var"; then $echo " - add LIBDIR to the \`$runpath_var' environment variable" $echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $echo " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $echo " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then $echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi $echo $echo "See any operating system documentation about shared libraries for" $echo "more information, such as the ld(1) and ld.so(8) manual pages." $echo "X----------------------------------------------------------------------" | $Xsed exit $EXIT_SUCCESS ;; # libtool execute mode execute) modename="$modename: execute" # The first argument is the command name. cmd="$nonopt" if test -z "$cmd"; then $echo "$modename: you must specify a COMMAND" 1>&2 $echo "$help" exit $EXIT_FAILURE fi # Handle -dlopen flags immediately. for file in $execute_dlfiles; do if test ! -f "$file"; then $echo "$modename: \`$file' is not a file" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi dir= case $file in *.la) # Check to see that this really is a libtool archive. if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : else $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi # Read the libtool library. dlname= library_names= # If there is no directory component, then add one. case $file in */* | *\\*) . $file ;; *) . ./$file ;; esac # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" continue fi dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` test "X$dir" = "X$file" && dir=. if test -f "$dir/$objdir/$dlname"; then dir="$dir/$objdir" else $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 exit $EXIT_FAILURE fi ;; *.lo) # Just add the directory containing the .lo file. dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` test "X$dir" = "X$file" && dir=. ;; *) $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -*) ;; *) # Do a test to see if this is really a libtool program. if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then # If there is no directory component, then add one. case $file in */* | *\\*) . $file ;; *) . ./$file ;; esac # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` args="$args \"$file\"" done if test -z "$run"; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables if test "${save_LC_ALL+set}" = set; then LC_ALL="$save_LC_ALL"; export LC_ALL fi if test "${save_LANG+set}" = set; then LANG="$save_LANG"; export LANG fi # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" $echo "export $shlibpath_var" fi $echo "$cmd$args" exit $EXIT_SUCCESS fi ;; # libtool clean and uninstall mode clean | uninstall) modename="$modename: $mode" rm="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) rm="$rm $arg"; rmforce=yes ;; -*) rm="$rm $arg" ;; *) files="$files $arg" ;; esac done if test -z "$rm"; then $echo "$modename: you must specify an RM program" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi rmdirs= origobjdir="$objdir" for file in $files; do dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` if test "X$dir" = "X$file"; then dir=. objdir="$origobjdir" else objdir="$dir/$origobjdir" fi name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` test "$mode" = uninstall && objdir="$dir" # Remember objdir for removal later, being careful to avoid duplicates if test "$mode" = clean; then case " $rmdirs " in *" $objdir "*) ;; *) rmdirs="$rmdirs $objdir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if (test -L "$file") >/dev/null 2>&1 \ || (test -h "$file") >/dev/null 2>&1 \ || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then . $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do rmfiles="$rmfiles $objdir/$n" done test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" case "$mode" in clean) case " $library_names " in # " " in the beginning catches empty $dlname *" $dlname "*) ;; *) rmfiles="$rmfiles $objdir/$dlname" ;; esac test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. cmds=$postuninstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" if test "$?" -ne 0 && test "$rmforce" != yes; then exit_status=1 fi done IFS="$save_ifs" fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. cmds=$old_postuninstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" if test "$?" -ne 0 && test "$rmforce" != yes; then exit_status=1 fi done IFS="$save_ifs" fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then # Read the .lo file . $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" \ && test "$pic_object" != none; then rmfiles="$rmfiles $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" \ && test "$non_pic_object" != none; then rmfiles="$rmfiles $dir/$non_pic_object" fi fi ;; *) if test "$mode" = clean ; then noexename=$name case $file in *.exe) file=`$echo $file|${SED} 's,.exe$,,'` noexename=`$echo $name|${SED} 's,.exe$,,'` # $file with .exe has already been added to rmfiles, # add $file without .exe rmfiles="$rmfiles $file" ;; esac # Do a test to see if this is a libtool program. if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then relink_command= . $dir/$noexename # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then rmfiles="$rmfiles $objdir/lt-$name" fi if test "X$noexename" != "X$name" ; then rmfiles="$rmfiles $objdir/lt-${noexename}.c" fi fi fi ;; esac $show "$rm $rmfiles" $run $rm $rmfiles || exit_status=1 done objdir="$origobjdir" # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then $show "rmdir $dir" $run rmdir $dir >/dev/null 2>&1 fi done exit $exit_status ;; "") $echo "$modename: you must specify a MODE" 1>&2 $echo "$generic_help" 1>&2 exit $EXIT_FAILURE ;; esac if test -z "$exec_cmd"; then $echo "$modename: invalid operation mode \`$mode'" 1>&2 $echo "$generic_help" 1>&2 exit $EXIT_FAILURE fi fi # test -z "$show_help" if test -n "$exec_cmd"; then eval exec $exec_cmd exit $EXIT_FAILURE fi # We need to display help for each of the modes. case $mode in "") $echo \ "Usage: $modename [OPTION]... [MODE-ARG]... Provide generalized library-building support services. --config show all configuration variables --debug enable verbose shell tracing -n, --dry-run display commands without modifying any files --features display basic configuration information and exit --finish same as \`--mode=finish' --help display this help message and exit --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] --quiet same as \`--silent' --silent don't print informational messages --tag=TAG use configuration variables from tag TAG --version print version information MODE must be one of the following: clean remove files from the build directory compile compile a source file into a libtool object execute automatically set library path, then run a program finish complete the installation of libtool libraries install install libraries or executables link create a library or an executable uninstall remove libraries from an installed directory MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for a more detailed description of MODE. Report bugs to ." exit $EXIT_SUCCESS ;; clean) $echo \ "Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $echo \ "Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -prefer-pic try to building PIC objects only -prefer-non-pic try to building non-PIC objects only -static always build a \`.o' file suitable for static linking COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $echo \ "Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $echo \ "Usage: $modename [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $echo \ "Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $echo \ "Usage: $modename [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -static do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $echo \ "Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) $echo "$modename: invalid operation mode \`$mode'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; esac $echo $echo "Try \`$modename --help' for more information about other modes." exit $? # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared disable_libs=shared # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static disable_libs=static # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: DyLP-1.6.0/BuildTools/set_externals0000755000076700007670000001336311241054220014147 0ustar #!/bin/sh # Copyright (C) 2007 International Business Machines and # Copyright (c) 2009 Lehigh University # All Rights Reserved. # This file is distributed under the Common Public License. # It is part of the BuildTools project in COIN-OR (www.coin-or.org) # ## $Id: prepare_new_release 1302 2009-06-07 18:17:53Z stefan $ # # This script is based on prepare_new_release, which is authored by # Author: Andreas Waechter IBM 2007-06-21 # Modified: Lou Hafer SFU 2008-01-20 # # The modifications to set_externals were made by # Ted Ralphs Lehigh University 2009-07-07 # #set -x -v set -e determine_release () { drtmp_stableBranch=`echo $1 | sed -e 's|.*/stable/||'` drtmp_baseURL=`echo $1 | sed -e 's|/stable/[0-9.]*||'` drtmp_returnVal= # List the existing releases and screen for releases matching stableBranch. drtmp_svnlst=`svn list $drtmp_baseURL/releases/` drtmp_release_vers= for drtmp_i in $drtmp_svnlst ; do case $drtmp_i in $drtmp_stableBranch.*) drtmp_i=`echo $drtmp_i | sed -e 's|/$||'` drtmp_release_vers="$drtmp_release_vers $drtmp_i";; esac; done # Are there any existing releases? If not, and the user didn't ask for the # next release, we have an error. if test -z "$drtmp_release_vers" ; then if test $2 = 1 ; then drtmp_returnVal="$drtmp_stableBranch.0" else drtmp_returnVal="Error" fi else # There are releases. If we don't have one after the loop, we're confused. drtmp_new_rel=-10000 for drtmp_i in $drtmp_release_vers; do drtmp_rel=`echo $drtmp_i | sed -e "s|^$drtmp_stableBranch.||"` if test $drtmp_rel -gt $drtmp_new_rel; then drtmp_new_rel=$drtmp_rel fi done if test $drtmp_new_rel = -10000; then drtmp_new_rel="Error" elif test $2 = 1 ; then drtmp_new_rel=`expr $drtmp_new_rel + 1` fi drtmp_returnVal="$drtmp_stableBranch.$drtmp_new_rel" fi echo $drtmp_returnVal } printHelp=0 exitValue=0 Dependencies= if test "$#" -eq 0; then printHelp=1 else # Process the parameters. A parameter without an opening `-' is assumed to be # the spec for the stable branch. while test $# -gt 0 && test $exitValue = 0 && test $printHelp = 0 ; do case "$1" in -h* | --h*) printHelp=1 ;; -*) echo "$0: unrecognised command line switch '"$1"'." printHelp=1 exitValue=-1 ;; *) Dependencies=$1 ;; esac shift done fi # End of parameter parsing. We have a stable URL to work with. Tell the # user what we've seen. # Find out the most recent release (if any) for the stable branch. List the # existing releases and screen for releases matching stableBranch. The new # release should be one greater than any existing release, or 0 if the stable # branch has no releases. if test $printHelp = 0 && test $exitValue = 0; then rm -f Externals if test -r $Dependencies; then echo '' echo '===> Creating new externals file with pointers to releases...' echo '' ext_name= ext_url= for i in `cat $Dependencies`; do if test "$ext_name" = ""; then ext_name="$i" else ext_url=$i if (echo $ext_name | grep -E '^#' >/dev/null); then echo "Skip $ext_name." ext_name= continue fi if (echo $ext_url | grep -E 'trunk|stable/|releases/' >/dev/null); then :; else echo '' echo "The external URL $ext_url is not valid. Exiting." echo '' exit -2 fi ext_base_front=`echo $ext_url | sed -e 's|/stable/.*||'` ext_proj=`echo $ext_base_front | sed -e 's|.*/\([^/]*\)|\1|'` if expr "$ext_url" : '.*releases/.*' 2>&1 >/dev/null ; then echo "Using specified release for $ext_name." ext_rel_url=$ext_url elif expr "$ext_url" : '.*trunk.*' 2>&1 >/dev/null; then echo "Using specified trunk for $ext_name." ext_rel_url=$ext_url else ext_stable=`echo $ext_url | sed -e 's|\(.*/stable/[0-9\.]*\).*|\1|'` ext_base_end=`echo $ext_url | sed -e 's|.*/stable/[0-9\.]*||'` echo "Determining release for $ext_name:" ext_latest=`determine_release $ext_stable 0` if test "$ext_base_end" = ""; then ext_rel_url=$ext_base_front/releases/$ext_latest else ext_rel_url=$ext_base_front/releases/$ext_latest$ext_base_end fi fi echo " $ext_rel_url" echo "$ext_name $ext_rel_url" >>Externals ext_name= fi done echo '' echo '===> Updating svn:externals property...' echo '' svn pset svn:externals -F Externals . #Leave the new externals file there for no #rm -f Externals else # if test -r Externals echo "" echo "Dependency file does not exist or is unspecified..." echo "" printHelp=1 exitvalue=-2 fi fi if test $printHelp = 1 ; then cat < This script takes as input a dependency file containing a list of stable versions of COIN projects on separate lines in the form Recommended practice is to keep this list in a file called "Dendencies" in the project's root directory. A temporary file called "Externals" in the same form, but with the URL of each stable version replaced by the URL of the latest associated release is produced. From this file, the script will set the svn:externals variable. It does not do an update or commit the change. After the script runs, do an update and test build, then commit the change if you are happy. EOF else cat </dev/null 2>&1 ; then coin_libversion="$1" else AC_DEFINE_UNQUOTED(m4_toupper($1_VERSION), ["$PACKAGE_VERSION"], [Version number of project]) fi ],[]) ]) # AC_COIN_PROJECTDIR_INIT ########################################################################### # COIN_DEBUG_COMPILE # ########################################################################### # enable the configure flags --enable-debug and --enable-debug-prjct # (where prcjt is the name of the project in lower case) and set the # variable coin_debug_compile to true or false This is used by # COIN_PROG_CXX, COIN_PROG_CC and COIN_PROG_F77 to determine the # compilation flags. This macro also makes the switches # --with-prjct-verbosity and --with-prjct-checklevel available, which # define the preprocessor macros COIN_PRJCT_VERBOSITY and # COIN_PRJCT_CHECKLEVEL to the specified value (default is 0). # # The project specific flags are only made available, if one gives the # name of the project as first argument to this macro. AC_DEFUN([AC_COIN_DEBUG_COMPILE], [AC_BEFORE([$0],[AC_COIN_PROG_CXX])dnl AC_BEFORE([$0],[AC_COIN_PROG_CC])dnl AC_BEFORE([$0],[AC_COIN_PROG_F77])dnl AC_MSG_CHECKING([whether we want to compile in debug mode]) AC_ARG_ENABLE([debug], [AC_HELP_STRING([--enable-debug], [compile all projects with debug options tests])], [case "${enableval}" in yes) coin_debug_compile=true if test "${enable_shared+set}" = set; then :; else enable_shared=no fi ;; no) coin_debug_compile=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;; esac], [coin_debug_compile=false]) m4_ifvaln([$1], [AC_ARG_ENABLE(debug-m4_tolower($1), [AC_HELP_STRING([--enable-debug-m4_tolower($1)], [compile this project ($1) with debug options])], [case "${enableval}" in yes) coin_debug_compile=true enable_shared=no ;; no) coin_debug_compile=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-debug-m4_tolower($1)) ;; esac],[:]) ]) # m4_ifvaln([$1], if test $coin_debug_compile = true; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi m4_ifvaln([$1], [AC_ARG_WITH(m4_tolower($1)-verbosity, AC_HELP_STRING([--with-m4_tolower($1)-verbosity], [specify the debug verbosity level for project $1]), [if test "$withval" = yes; then withval=1 fi m4_tolower(coin_$1_verbosity)=$withval], [m4_tolower(coin_$1_verbosity)=0]) AC_DEFINE_UNQUOTED(m4_toupper(COIN_$1_VERBOSITY), m4_tolower($coin_$1_verbosity), [Define to the debug verbosity level (0 is no output)]) AC_ARG_WITH(m4_tolower($1)-checklevel, AC_HELP_STRING([--with-m4_tolower($1)-checklevel], [specify the sanity check level for project $1]), [if test "$withval" = yes; then withval=1 fi m4_tolower(coin_$1_checklevel)=$withval], [m4_tolower(coin_$1_checklevel)=0]) AC_DEFINE_UNQUOTED(m4_toupper(COIN_$1_CHECKLEVEL), m4_tolower($coin_$1_checklevel), [Define to the debug sanity check level (0 is no test)]) # We use the following variable to have a string with the upper case # version of the project name COIN_PRJCT=m4_toupper($1) ]) # m4_ifvaln([$1], ]) # AC_COIN_DEBUG_COMPILE ########################################################################### # COIN_MINGW_LD_FIX # ########################################################################### # This macro is included by any PROG_compiler macro, to set the LD # environment variable on MinGW to the correct value (link). But note that # if we're building in cygwin with -mno-cygwin, we still want ld! If we're # building from cygwin with MSVC tools (cl/link), then we do want link and # you'd better have your PATH variable straight, else you'll be doing file # links instead of code links! Arguably, LDFLAGS should include -mno-cygwin # but in practice all linking seems to be handled through the compilers, so # CFLAGS and CXXFLAGS suffice. AC_DEFUN([AC_COIN_MINGW_LD_FIX], [case $build in *-mingw*) if test "${LD+set}" = set; then :; else LD=link fi ;; esac case $enable_doscompile in msvc) if test "x${LD+set}" = xset; then :; else LD=link fi ;; esac ]) ########################################################################### # COIN_ENABLE_DOSCOMPILE # ########################################################################### # This macro is invoked by any PROG_compiler macro to establish the # --enable-doscompile option, used when one wants to compile an executable # under Cygwin which also runs directly under DOS (without requiring # Cygwin1.dll). The job of this macro is to make sure the option is correct and # to set enable_doscompile. Legal values are mingw, msvc, and no (disabled). # mingw: Fake mingw under cygwin, using GCC tools and -mno-cygwin. The most # important thing here is that preprocess, compile, and link steps # *all* see -mno-cygwin. # msvc: Assume the presence of cl/link. It's the user's responsibility to # make sure their PATH is correct. In particular, that MSVC link is # found and not cygwin link (we want to do code linking, not file # linking). # It's the responsibility of individual PROG_compiler macros to ensure that # they correctly set the compiler search list and preprocess, compile, and # link flags. This is tied to compiler setup because in practice invocations # of the preprocessor and linker are made through the compiler. AC_DEFUN([AC_COIN_ENABLE_DOSCOMPILE], [AC_REQUIRE([AC_CANONICAL_BUILD]) AC_ARG_ENABLE([doscompile], [AC_HELP_STRING([--enable-doscompile], [Under Cygwin, compile so that executables run under DOS. Set to mingw to use gcc/g++/ld with -mno-cygwin. Set to msvc to use cl/link (or icl/link). Default when mentioned: mingw. Default when not mentioned: disabled.])], [if test "$enable_doscompile" != no; then case $build in *-cygwin* | *-mingw*) ;; *) AC_MSG_ERROR([--enable-doscompile option makes sense only under Cygwin or MinGW]) ;; esac fi], [enable_doscompile=no]) case "$enable_doscompile" in mingw) case $build in *-mingw*) enable_doscompile=no ;; esac ;; msvc|no) ;; yes) enable_doscompile=mingw ;; *) AC_MSG_ERROR([Invalid value $enable_doscompile for --enable-doscompile. Try configure --help=recursive.]) ;; esac if test "$enable_doscompile" != no ; then AC_MSG_NOTICE([DOS compile style is: $enable_doscompile]) fi ]) ########################################################################### # COIN_PROG_CXX # ########################################################################### # Find the compile command by running AC_PROG_CXX (with compiler names for # different operating systems) and put it into CXX (unless it was given by the # user). Then find an appropriate value for CXXFLAGS. If either of CXXFLAGS or # PRJCT_CXXFLAGS is defined, that value is used (replace PRJCT with the upper # case name of this project). It is possible to provide additional -D flags # in the variable CXXDEFS, and additional compilation flags with ADD_CXXFLAGS. AC_DEFUN([AC_COIN_PROG_CXX], [AC_REQUIRE([AC_COIN_PROG_CC]) #Let's try if that overcomes configuration problem with VC++ 6.0 AC_REQUIRE([AC_COIN_ENABLE_DOSCOMPILE]) AC_LANG_PUSH(C++) AC_ARG_VAR(CXXDEFS,[Additional -D flags to be used when compiling C++ code.]) AC_ARG_VAR(ADD_CXXFLAGS,[Additional C++ compiler options]) AC_ARG_VAR(DBG_CXXFLAGS,[Debug C++ compiler options]) AC_ARG_VAR(OPT_CXXFLAGS,[Optimize C++ compiler options]) coin_has_cxx=yes save_cxxflags="$CXXFLAGS" # For *-*-solaris*, promote Studio/Workshop compiler to front of list. case $build in *-cygwin* | *-mingw*) if test "$enable_doscompile" = msvc ; then comps="icl cl" else comps="g++ cl" fi ;; *-*-solaris*) comps="CC xlC_r aCC g++ c++ pgCC icpc gpp cxx cc++ cl FCC KCC RCC" ;; *-darwin*) comps="g++ c++ CC" ;; *) comps="xlC_r aCC CC g++ c++ pgCC icpc gpp cxx cc++ cl FCC KCC RCC" ;; esac # We delete the cached value, since the test might not have been # performed with our choice of compilers earlier $as_unset ac_cv_prog_CXX || test "${ac_cv_prog_CXX+set}" != set || { ac_cv_prog_CXX=; export ac_cv_prog_CXX; } # AC_MSG_NOTICE([C++ compiler candidates: $comps]) AC_PROG_CXX([$comps]) #AC_PROG_CXX sets CXX to g++ if it cannot find a working C++ compiler #thus, we test here whether $CXX is actually working AC_LANG_PUSH(C++) AC_MSG_CHECKING([whether C++ compiler $CXX works]); AC_COMPILE_IFELSE( [AC_LANG_PROGRAM(, [int i=0;])], [AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no) AC_MSG_ERROR(failed to find a C++ compiler or C++ compiler $CXX does not work)] ) AC_LANG_POP(C++) # It seems that we need to cleanup something here for the Windows case "$CXX" in cl* | */cl* | CL* | */CL* | icl* | */icl* | ICL* | */ICL*) sed -e 's/^void exit (int);//' confdefs.h >> confdefs.hh mv confdefs.hh confdefs.h ;; esac # Autoconf incorrectly concludes that cl recognises -g. It doesn't. case "$CXX" in cl* | */cl* | CL* | */CL* ) if test "$ac_cv_prog_cxx_g" = yes ; then ac_cv_prog_cxx_g=no AC_MSG_NOTICE([Overruling autoconf; cl does not recognise -g.]) fi ;; esac CXXFLAGS="$save_cxxflags" # Check if a project specific CXXFLAGS variable has been set if test x$COIN_PRJCT != x; then eval coin_tmp=\${${COIN_PRJCT}_CXXFLAGS+set} if test x$coin_tmp = xset; then eval CXXFLAGS=\${${COIN_PRJCT}_CXXFLAGS} fi fi if test x"$CXXFLAGS" = x; then # ToDo decide whether we want -DNDEBUG for optimization coin_add_cxxflags= coin_opt_cxxflags= coin_dbg_cxxflags= coin_warn_cxxflags= if test "$GXX" = "yes"; then case "$CXX" in icpc* | */icpc*) ;; *) # ToDo decide about unroll-loops coin_opt_cxxflags="-O3 -fomit-frame-pointer" coin_add_cxxflags="-pipe" coin_dbg_cxxflags="-g" coin_warn_cxxflags="-Wimplicit -Wparentheses -Wreturn-type -Wcast-qual -Wall -Wpointer-arith -Wwrite-strings -Wconversion -Wno-unknown-pragmas" case $build in *-darwin*) ;; *) coin_warn_cxxflags="-pedantic-errors $coin_warn_cxxflags" ;; esac case $enable_doscompile in mingw) CXXFLAGS="-mno-cygwin" AC_TRY_LINK(,[int i=0; i++;],[coin_add_cxxflags="-mno-cygwin $coin_add_cxxflags"]) CXXFLAGS= ;; esac esac fi # Note that we do not need to cover GCC in the following tests. if test -z "$coin_opt_cxxflags"; then case $build in *-cygwin* | *-mingw*) case "$CXX" in cl* | */cl* | CL* | */CL*) # The MT and MTd options are mutually exclusive coin_opt_cxxflags='-MT -O2' coin_add_cxxflags='-nologo -EHsc -GR -wd4996 -D_CRT_SECURE_NO_DEPRECATE' coin_dbg_cxxflags='-MTd' ;; icl* | */icl* | ICL* | */ICL*) # The MT and MTd options are mutually exclusive coin_opt_cxxflags='-MT -Ox' coin_add_cxxflags='-nologo -EHsc -GR -D_CRT_SECURE_NO_DEPRECATE' coin_dbg_cxxflags='-MTd -debug' ;; esac ;; *-linux-*) case "$CXX" in icpc* | */icpc*) coin_opt_cxxflags="-O3 -ip -mp1" coin_add_cxxflags="" coin_dbg_cxxflags="-g" # Check if -i_dynamic is necessary (for new glibc library) CXXFLAGS= AC_TRY_LINK(,[int i=0; i++;],[], [coin_add_cxxflags="-i_dynamic $coin_add_cxxflags"]) ;; pgCC* | */pgCC*) coin_opt_cxxflags="-fast" coin_add_cxxflags="-Kieee -pc 64" coin_dbg_cxxflags="-g" ;; esac ;; *-ibm-*) case "$CXX" in xlC* | */xlC* | mpxlC* | */mpxlC*) coin_opt_cxxflags="-O -qarch=auto -qcache=auto -qtune=auto -qmaxmem=-1" coin_add_cxxflags="-bmaxdata:0x80000000 -qrtti=dyna -qsuppress=1500-036 -qsuppress=1500-029 -qsourcetype=c++" coin_dbg_cxxflags="-g" ;; esac ;; *-hp-*) case "$CXX" in aCC* | */aCC* ) coin_opt_cxxflags="-O" coin_add_cxxflags="-AA" coin_dbg_cxxflags="-g" ;; esac ;; *-*-solaris*) coin_opt_cxxflags="-O4" coin_dbg_cxxflags="-g" ;; esac fi # Generic flag settings. If these don't work, add a case above. if test "$ac_cv_prog_cxx_g" = yes && test -z "$coin_dbg_cxxflags" ; then coin_dbg_cxxflags="-g" fi if test -z "$coin_opt_cxxflags"; then # Try if -O option works if nothing else is set CXXFLAGS=-O AC_TRY_LINK([],[int i=0; i++;],[coin_opt_cxxflags="-O"]) fi # if PM doesn't want the warning messages, take them out if test x"$coin_skip_warn_cxxflags" = xyes; then coin_warn_cxxflags= fi # Do final setup of flags based on values determined above. if test x${DBG_CXXFLAGS+set} != xset; then DBG_CXXFLAGS="$coin_dbg_cxxflags $coin_add_cxxflags $coin_warn_cxxflags" fi if test x${OPT_CXXFLAGS+set} != xset; then OPT_CXXFLAGS="$coin_opt_cxxflags $coin_add_cxxflags -DNDEBUG $coin_warn_cxxflags" fi DBG_CXXFLAGS="$DBG_CXXFLAGS $ADD_CXXFLAGS $CXXDEFS" OPT_CXXFLAGS="$OPT_CXXFLAGS $ADD_CXXFLAGS $CXXDEFS" if test "$coin_debug_compile" = "true"; then CXXFLAGS="$DBG_CXXFLAGS" else CXXFLAGS="$OPT_CXXFLAGS" fi # Handle the case where CXXFLAGS was set externally. else CXXFLAGS="$CXXFLAGS $ADD_CXXFLAGS $CXXDEFS" if test x${DBG_CXXFLAGS+set} != xset; then DBG_CXXFLAGS="$CXXFLAGS" fi if test x${OPT_CXXFLAGS+set} != xset; then OPT_CXXFLAGS="$CXXFLAGS" fi fi # If CXXFLAGS contains -mno-cygwin, CPPFLAGS must also have it. case "$CXXFLAGS" in *-mno-cygwin*) if test x${CPPFLAGS+set} != xset ; then CPPFLAGS="-mno-cygwin" else case "$CPPFLAGS" in *-mno-cygwin*) ;; *) CPPFLAGS="$CPPFLAGS -mno-cygwin" ;; esac fi ;; esac # Try if CXXFLAGS works save_CXXFLAGS="$CXXFLAGS" AC_TRY_LINK([],[int i=0; i++;],[],[CXXFLAGS=]) if test -z "$CXXFLAGS"; then AC_MSG_WARN([The flags CXXFLAGS="$save_CXXFLAGS" do not work. I will now just try '-O', but you might want to set CXXFLAGS manually.]) CXXFLAGS='-O' AC_TRY_LINK([],[int i=0; i++;],[],[CXXFLAGS=]) if test -z "$CXXFLAGS"; then AC_MSG_WARN([This value for CXXFLAGS does not work. I will continue with empty CXXFLAGS, but you might want to set CXXFLAGS manually.]) fi fi AC_MSG_NOTICE([C++ compiler options are: $CXXFLAGS]) AC_ARG_VAR(MPICXX,[C++ MPI Compiler]) if test x"$MPICXX" = x; then :; else AC_MSG_NOTICE([Will use MPI C++ compiler $MPICXX]) CXX="$MPICXX" fi case "$CXX" in cl* | */cl* | CL* | */CL* ) AC_COIN_MINGW_LD_FIX ;; esac AC_LANG_POP(C++) ]) # AC_COIN_PROG_CXX ########################################################################### # COIN_CXXLIBS # ########################################################################### # Determine the C++ runtime libraries required for linking a C++ library # with a Fortran or C compiler. The result is available in CXXLIBS. AC_DEFUN([AC_COIN_CXXLIBS], [AC_REQUIRE([AC_PROG_CXX])dnl AC_LANG_PUSH(C++) AC_ARG_VAR(CXXLIBS,[Libraries necessary for linking C++ code with Fortran compiler]) if test -z "$CXXLIBS"; then if test "$GXX" = "yes"; then case "$CXX" in icpc* | */icpc*) CXXLIBS="-lstdc++" ;; *) CXXLIBS="-lstdc++ -lm" # -lgcc" ;; esac else case $build in *-mingw32 | *-cygwin* ) case "$CXX" in cl* | */cl* | CL* | */CL*) CXXLIBS=nothing;; esac;; *-linux-*) case "$CXX" in icpc* | */icpc*) CXXLIBS="-lstdc++" ;; pgCC* | */pgCC*) CXXLIBS="-lstd -lC -lc" ;; esac;; *-ibm-*) CXXLIBS="-lC -lc" ;; *-hp-*) CXXLIBS="-L/opt/aCC/lib -l++ -lstd_v2 -lCsup_v2 -lm -lcl -lc" ;; *-*-solaris*) CXXLIBS="-lCstd -lCrun" esac fi fi if test -z "$CXXLIBS"; then AC_MSG_WARN([Could not automatically determine CXXLIBS (C++ link libraries; necessary if main program is in Fortran or C).]) else AC_MSG_NOTICE([Assuming that CXXLIBS is \"$CXXLIBS\".]) fi if test x"$CXXLIBS" = xnothing; then CXXLIBS= fi AC_LANG_POP(C++) ]) # AC_COIN_CXXLIBS ########################################################################### # COIN_CHECK_HEADER # ########################################################################### # This macro checks for a header file, but it does so without the # standard header. This avoids warning messages like: # # configure: WARNING: dlfcn.h: present but cannot be compiled # configure: WARNING: dlfcn.h: check for missing prerequisite headers? # configure: WARNING: dlfcn.h: see the Autoconf documentation # configure: WARNING: dlfcn.h: section "Present But Cannot Be Compiled" # configure: WARNING: dlfcn.h: proceeding with the preprocessor's result # configure: WARNING: dlfcn.h: in the future, the compiler will take precedence # My guess that the problem lay with CPPFLAGS seems to be correct. With this # macro reduced to a direct call to AC_CHECK_HEADERS, there are no warnings # now that CPPFLAGS contains -mno-cygwin when it needs it. -- lh, 061214 -- # AW 070609: I restored the previous version, since otherwise the warnings # still pop up for the cl compiler AC_DEFUN([AC_COIN_CHECK_HEADER], [#if test x"$4" = x; then # hdr="#include <$1>" #else # hdr="$4" #fi #AC_CHECK_HEADERS([$1],[$2],[$3],[$hdr]) AC_CHECK_HEADERS([$1],[$2],[$3],[$4]) ]) # AC_COIN_CHECK_HEADER ########################################################################### # COIN_CHECK_CXX_CHEADER # ########################################################################### # This macro checks for C header files that are used from C++. For a give # stub (e.g., math), it first checks if the C++ library (cmath) is available. # If it is, it defines HAVE_CMATH (or whatever the stub is). If it is not # available, it checks for the old C head (math.h) and defines HAVE_MATH_H # if that one exists. AC_DEFUN([AC_COIN_CHECK_CXX_CHEADER], [AC_LANG_PUSH(C++) AC_COIN_CHECK_HEADER([c$1],[$2],[$3],[$4]) if test "$ac_cv_header_c$1" != "yes"; then AC_COIN_CHECK_HEADER([$1.h],[$2],[$3],[$4]) fi AC_LANG_POP(C++) ]) # AC_COIN_CHECK_CXX_CHEADER ########################################################################### # COIN_PROG_CC # ########################################################################### # Find the compile command by running AC_PROG_CC (with compiler names # for different operating systems) and put it into CC (unless it was # given my the user), and find an appropriate value for CFLAGS. It is # possible to provide additional -D flags in the variable CDEFS. AC_DEFUN([AC_COIN_PROG_CC], [AC_REQUIRE([AC_COIN_MINGW_LD_FIX]) AC_REQUIRE([AC_COIN_ENABLE_DOSCOMPILE]) AC_LANG_PUSH(C) # For consistency, we set the C compiler to the same value of the C++ # compiler, if the C++ is set, but the C compiler isn't (only for CXX=cl) if test x"$CXX" != x; then case "$CXX" in cl* | */cl* | CL* | */CL* | icl* | */icl* | ICL* | */ICL*) if test x"$CC" = x; then CC="$CXX" AC_MSG_WARN([C++ compiler name provided as $CXX, but CC is unset. Setting CC to $CXX]) fi ;; esac fi AC_ARG_VAR(CDEFS,[Additional -D flags to be used when compiling C code.]) AC_ARG_VAR(ADD_CFLAGS,[Additional C compiler options]) AC_ARG_VAR(DBG_CFLAGS,[Debug C compiler options]) AC_ARG_VAR(OPT_CFLAGS,[Optimize C compiler options]) coin_has_cc=yes save_cflags="$CFLAGS" # For *-*-solaris*, promote Studio/Workshop cc compiler to front of list. # Depending on the user's PATH, when Studio/Workshop cc is not present we may # find /usr/ucb/cc, which is almost certainly not a good choice for the C # compiler. In this case, put cc after gcc. case $build in *-cygwin* | *-mingw*) if test "$enable_doscompile" = msvc ; then comps="icl cl" else comps="gcc cl" fi ;; *-*-solaris*) AC_CHECK_PROG(sol_cc_compiler,cc,cc,[],[],/usr/ucb/cc) if test "$sol_cc_compiler" = "cc" ; then comps="cc xlc gcc pgcc icc" else comps="xlc gcc pgcc icc cc" fi ;; *-linux-*) comps="xlc gcc cc pgcc icc" ;; *) comps="xlc_r xlc cc gcc pgcc icc" ;; esac # We delete the cached value, since the test might not have been # performed with our choice of compilers earlier $as_unset ac_cv_prog_CC || test "${ac_cv_prog_CC+set}" != set || { ac_cv_prog_CC=; export ac_cv_prog_CC; } # AC_MSG_NOTICE([C compiler candidates: $comps]) AC_PROG_CC([$comps]) if test -z "$CC" ; then AC_MSG_ERROR([Failed to find a C compiler!]) fi # Autoconf incorrectly concludes that cl recognises -g. It doesn't. case "$CC" in cl* | */cl* | CL* | */CL* ) if test "$ac_cv_prog_cc_g" = yes ; then ac_cv_prog_cc_g=no AC_MSG_NOTICE([Overruling autoconf; cl does not recognise -g.]) fi ;; esac CFLAGS="$save_cflags" # Check if a project specific CFLAGS variable has been set if test x$COIN_PRJCT != x; then eval coin_tmp=\${${COIN_PRJCT}_CFLAGS+set} if test x$coin_tmp = xset; then eval CFLAGS=\${${COIN_PRJCT}_CFLAGS} fi fi if test x"$CFLAGS" = x; then coin_add_cflags= coin_opt_cflags= coin_dbg_cflags= coin_warn_cflags= if test "$GCC" = "yes"; then case "$CC" in icc* | */icc*) ;; *) coin_opt_cflags="-O3 -fomit-frame-pointer" coin_add_cflags="-pipe" coin_dbg_cflags="-g" coin_warn_cflags="-Wimplicit -Wparentheses -Wsequence-point -Wreturn-type -Wcast-qual -Wall -Wno-unknown-pragmas" case $build in *-darwin*) ;; *) coin_warn_cflags="-pedantic-errors $coin_warn_cflags" ;; esac case $enable_doscompile in mingw) CFLAGS="-mno-cygwin" AC_TRY_LINK([],[int i=0; i++;], [coin_add_cflags="-mno-cygwin $coin_add_cflags"]) CFLAGS= ;; esac esac fi if test -z "$coin_opt_cflags"; then case $build in *-cygwin* | *-mingw*) case "$CC" in cl* | */cl* | CL* | */CL*) coin_opt_cflags='-MT -O2' coin_add_cflags='-nologo -wd4996 -D_CRT_SECURE_NO_DEPRECATE' coin_dbg_cflags='-MTd' ;; icl* | */icl* | ICL* | */ICL*) coin_opt_cflags='-MT -Ox' coin_add_cflags='-nologo -D_CRT_SECURE_NO_DEPRECATE' coin_dbg_cflags='-MTd -debug' ;; esac ;; *-linux-*) case "$CC" in icc* | */icc*) coin_opt_cflags="-O3 -ip -mp1" coin_add_cflags="" coin_dbg_cflags="-g" # Check if -i_dynamic is necessary (for new glibc library) CFLAGS= AC_TRY_LINK([],[int i=0; i++;],[], [coin_add_cflags="-i_dynamic $coin_add_cflags"]) ;; pgcc* | */pgcc*) coin_opt_cflags="-fast" coin_add_cflags="-Kieee -pc 64" coin_dbg_cflags="-g" ;; esac ;; *-ibm-*) case "$CC" in xlc* | */xlc* | mpxlc* | */mpxlc*) coin_opt_cflags="-O -qarch=auto -qcache=auto -qtune=auto -qmaxmem=-1" coin_add_cflags="-bmaxdata:0x80000000 -qsuppress=1500-036 -qsuppress=1500-029" coin_dbg_cflags="-g" ;; esac ;; *-hp-*) coin_opt_cflags="-O" coin_add_cflags="-Ae" coin_dbg_cflags="-g" ;; *-*-solaris*) coin_opt_cflags="-xO4" coin_dbg_cflags="-g" ;; *-sgi-*) coin_opt_cflags="-O -OPT:Olimit=0" coin_dbg_cflags="-g" ;; esac fi if test "$ac_cv_prog_cc_g" = yes && test -z "$coin_dbg_cflags" ; then coin_dbg_cflags="-g" fi if test -z "$coin_opt_cflags"; then # Try if -O option works if nothing else is set CFLAGS="-O" AC_TRY_LINK([],[int i=0; i++;],[coin_opt_cflags="-O"]) fi # if PM doesn't want the warning messages, take them out if test x"$coin_skip_warn_cflags" = xyes; then coin_warn_cflags= fi if test x${DBG_CFLAGS+set} != xset; then DBG_CFLAGS="$coin_dbg_cflags $coin_add_cflags $coin_warn_cflags" fi if test x${OPT_CFLAGS+set} != xset; then OPT_CFLAGS="$coin_opt_cflags $coin_add_cflags -DNDEBUG $coin_warn_cflags" fi DBG_CFLAGS="$DBG_CFLAGS $ADD_CFLAGS $CDEFS" OPT_CFLAGS="$OPT_CFLAGS $ADD_CFLAGS $CDEFS" if test "$coin_debug_compile" = "true"; then CFLAGS="$DBG_CFLAGS" else CFLAGS="$OPT_CFLAGS" fi else CFLAGS="$CFLAGS $ADD_CFLAGS $CDEFS" if test x${DBG_CFLAGS+set} != xset; then DBG_CFLAGS="$CFLAGS" fi if test x${OPT_CFLAGS+set} != xset; then OPT_CFLAGS="$CFLAGS" fi fi # If CFLAGS contains -mno-cygwin, CPPFLAGS must also have it. case "$CFLAGS" in *-mno-cygwin*) if test x${CPPFLAGS+set} != xset ; then CPPFLAGS="-mno-cygwin" else case "$CPPFLAGS" in *-mno-cygwin*) ;; *) CPPFLAGS="$CPPFLAGS -mno-cygwin" ;; esac fi ;; esac # Try if CFLAGS works save_CFLAGS="$CFLAGS" AC_TRY_LINK([],[int i=0; i++;],[],[CFLAGS=]) if test -z "$CFLAGS"; then AC_MSG_WARN([The value CFLAGS="$save_CFLAGS" do not work. I will now just try '-O', but you might want to set CFLAGS manually.]) CFLAGS='-O' AC_TRY_LINK([],[int i=0; i++;],[],[CFLAGS=]) if test -z "$CFLAGS"; then AC_MSG_WARN([This value for CFLAGS does not work. I will continue with empty CFLAGS, but you might want to set CFLAGS manually.]) fi fi AC_MSG_NOTICE([C compiler options are: $CFLAGS]) AC_ARG_VAR(MPICC,[C MPI Compiler]) if test x"$MPICC" = x; then :; else AC_MSG_NOTICE([Will use MPI C compiler $MPICC]) CC="$MPICC" fi # Correct ADDLIBS initialization if we are using the MS compiler case "$CC" in cl* | */cl* | CL* | */CL* | icl* | */icl* | ICL* | */ICL*) ADDLIBS= AC_COIN_MINGW_LD_FIX ;; esac AC_LANG_POP(C) ]) # AC_COIN_PROG_CC ########################################################################### # COIN_PROG_F77 # ########################################################################### # Find the compile command by running AC_PROG_F77 (with compiler names # for different operating systems) and put it into F77 (unless it was # given by the user), and find an appropriate value for FFLAGS AC_DEFUN([AC_COIN_PROG_F77], [AC_REQUIRE([AC_COIN_MINGW_LD_FIX]) AC_REQUIRE([AC_COIN_ENABLE_DOSCOMPILE]) AC_REQUIRE([AC_COIN_PROG_CC]) AC_REQUIRE([AC_COIN_F77_COMPS]) AC_LANG_PUSH([Fortran 77]) AC_ARG_VAR(ADD_FFLAGS,[Additional Fortran compiler options]) AC_ARG_VAR(DBG_FFLAGS,[Debug Fortran compiler options]) AC_ARG_VAR(OPT_FFLAGS,[Optimize Fortran compiler options]) coin_has_f77=yes save_fflags="$FFLAGS" # We delete the cached value, since the test might not have been # performed with our choice of compilers earlier $as_unset ac_cv_prog_F77 || test "${ac_cv_prog_F77+set}" != set || { ac_cv_prog_F77=; export ac_cv_prog_F77; } # This is a real belt-and-suspenders approach. AC_COIN_FIND_F77 will use # coin_f77_comps to see if there's a program that matches one of the names. # If there's no such program, F77 = unavailable. If we match the name, # feed AC_PROG_F77 the same search list, just to be sure it's a functioning # compiler. # AC_MSG_NOTICE([Fortran compiler candidates: $coin_f77_comps]) AC_COIN_FIND_F77 if test "$F77" != "unavailable" ; then AC_PROG_F77($coin_f77_comps) else AC_MSG_WARN([Failed to find a Fortran compiler!]) fi FFLAGS="$save_fflags" # Check if a project specific FFLAGS variable has been set if test x$COIN_PRJCT != x; then eval coin_tmp=\${${COIN_PRJCT}_FFLAGS+set} if test x$coin_tmp = xset; then eval FFLAGS=\${${COIN_PRJCT}_FFLAGS} fi fi if test "$F77" != "unavailable" && test x"$FFLAGS" = x ; then coin_add_fflags= coin_opt_fflags= coin_dbg_fflags= coin_warn_fflags= if test "$G77" = "yes"; then coin_opt_fflags="-O3 -fomit-frame-pointer" coin_add_fflags="-pipe" coin_dbg_fflags="-g" case $enable_doscompile in mingw) FFLAGS="-mno-cygwin" AC_TRY_LINK(,[ write(*,*) 'Hello world'], [coin_add_fflags="-mno-cygwin $coin_add_fflags"]) FFLAGS= ;; esac else case $build in *-cygwin* | *-mingw*) case $F77 in ifort* | */ifort* | IFORT* | */IFORT* ) coin_opt_fflags='-MT -O3' coin_add_fflags='-fpp -nologo' coin_dbg_fflags='-MTd -debug' ;; compile_f2c*) coin_opt_fflags='-MT -O2' coin_add_fflags='-nologo -wd4996' coin_dbg_fflags='-MTd' ;; esac ;; *-linux-*) case $F77 in ifc* | */ifc* | ifort* | */ifort*) coin_opt_fflags="-O3 -ip" coin_add_fflags="-cm -w90 -w95" coin_dbg_fflags="-g -CA -CB -CS" # Check if -i_dynamic is necessary (for new glibc library) FFLAGS= AC_TRY_LINK(,[ write(*,*) 'Hello world'],[], [coin_add_fflags="-i_dynamic $coin_add_fflags"]) ;; pgf77* | */pgf77* | pgf90* | */pgf90*) coin_opt_fflags="-fast" coin_add_fflags="-Kieee -pc 64" coin_dbg_fflags="-g" ;; esac ;; *-ibm-*) case "$F77" in xlf* | */xlf* | mpxlf* | */mpxlf* ) coin_opt_fflags="-O -qarch=auto -qcache=auto -qtune=auto -qmaxmem=-1" coin_add_fflags="-bmaxdata:0x80000000 -qsuppress=1500-036 -qsuppress=1500-029" coin_dbg_fflags="-g -C" ;; esac ;; *-hp-*) coin_opt_fflags="+O3" coin_add_fflags="+U77" coin_dbg_fflags="-C -g" ;; *-*-solaris*) coin_opt_fflags="-O4" coin_dbg_fflags="-g" ;; *-sgi-*) coin_opt_fflags="-O5 -OPT:Olimit=0" coin_dbg_fflags="-g" ;; esac fi if test "$ac_cv_prog_f77_g" = yes && test -z "$coin_dbg_fflags" ; then coin_dbg_fflags="-g" fi if test -z "$coin_opt_fflags"; then # Try if -O option works if nothing else is set FFLAGS=-O AC_TRY_LINK(,[ integer i], [coin_opt_fflags="-O"]) fi # if PM doesn't want the warning messages, take them out if test x"$coin_skip_warn_fflags" = xyes; then coin_warn_fflags= fi if test x${DBG_FFLAGS+set} != xset; then DBG_FFLAGS="$coin_dbg_fflags $coin_add_fflags $coin_warn_fflags" fi if test x${OPT_FFLAGS+set} != xset; then OPT_FFLAGS="$coin_opt_fflags $coin_add_fflags $coin_warn_fflags" fi DBG_FFLAGS="$DBG_FFLAGS $ADD_FFLAGS" OPT_FFLAGS="$OPT_FFLAGS $ADD_FFLAGS" if test "$coin_debug_compile" = "true"; then FFLAGS="$DBG_FFLAGS" else FFLAGS="$OPT_FFLAGS" fi else FFLAGS="$FFLAGS $ADD_FFLAGS" if test x${DBG_FFLAGS+set} != xset; then DBG_FFLAGS="$FFLAGS" fi if test x${OPT_FFLAGS+set} != xset; then OPT_FFLAGS="$FFLAGS" fi fi # If FFLAGS contains -mno-cygwin, CPPFLAGS must have it. case "$FFLAGS" in *-mno-cygwin*) if test x${CPPFLAGS+set} != xset ; then CPPFLAGS="-mno-cygwin" else case "$CPPFLAGS" in *-mno-cygwin*) ;; *) CPPFLAGS="$CPPFLAGS -mno-cygwin" ;; esac fi ;; esac # Try if FFLAGS works if test "$F77" != "unavailable" ; then AC_TRY_LINK(,[ integer i],[],[FFLAGS=]) if test -z "$FFLAGS"; then AC_MSG_WARN([The flags FFLAGS="$FFLAGS" do not work. I will now just try '-O', but you might want to set FFLAGS manually.]) FFLAGS='-O' AC_TRY_LINK(,[ integer i],[],[FFLAGS=]) if test -z "$FFLAGS"; then AC_MSG_WARN([This value for FFLAGS does not work. I will continue with empty FFLAGS, but you might want to set FFLAGS manually.]) fi fi fi AC_MSG_NOTICE([Fortran compiler options are: $FFLAGS]) AC_ARG_VAR(MPIF77,[Fortran MPI Compiler]) if test x"$MPIF77" = x; then :; else AC_MSG_NOTICE([Will use MPI Fortran compiler $MPIF77]) F77="$MPIF77" fi case "$F77" in ifort* | */ifort* | IFORT* | */IFORT*) AC_COIN_MINGW_LD_FIX ;; esac AC_LANG_POP([Fortran 77]) ]) # AC_COIN_PROG_F77 ########################################################################### # COIN_F77_WRAPPERS # ########################################################################### # Calls autoconfs AC_F77_WRAPPERS and does additional corrections to FLIBS AC_DEFUN([AC_COIN_F77_WRAPPERS], [AC_BEFORE([AC_COIN_PROG_F77],[$0])dnl AC_BEFORE([AC_PROG_F77],[$0])dnl AC_LANG_PUSH([Fortran 77]) AC_F77_WRAPPERS # If FLIBS has been set by the user, we just restore its value here if test x"$save_FLIBS" != x; then FLIBS="$save_FLIBS" else # This is to correct a missing exclusion in autoconf 2.59 if test x"$FLIBS" != x; then my_flibs= for flag in $FLIBS; do case $flag in -lcrt*.o) ;; -lcygwin) ;; *) my_flibs="$my_flibs $flag" ;; esac done FLIBS="$my_flibs" fi case $build in # The following is a fix to define FLIBS for ifort on Windows # In its original version, it linked in libifcorert.lib or libifcorertd.lib on Windows/ifort explicitly. # However, this seem to create a dependency on libifcorert.dll (or libifcorertd.dll) in the executables. # This is seem to be unnecessary, libifcorert(d).lib has been removed from the link line. *-cygwin* | *-mingw*) case "$F77" in ifort* | */ifort* | IFORT* | */IFORT*) FLIBS="-link $LIBS /NODEFAULTLIB:libc.lib" # if "$coin_debug_compile" = true ; then # FLIBS="-link $LIBS /NODEFAULTLIB:libc.lib /NODEFAULTLIB:libcmt.lib" # else # FLIBS="-link $LIBS /NODEFAULTLIB:libc.lib /NODEFAULTLIB:libcmtd.lib" # fi ;; compile_f2c*) FLIBS=`$F77 -FLIBS` ;; esac;; *-hp-*) FLIBS="$FLIBS -lm";; *-ibm-*) FLIBS=`echo $FLIBS | sed 's/-lc)/-lc/g'` ;; *-linux-*) case "$F77" in pgf77* | */pgf77* | pgf90* | */pgf90*) # ask linker to go through the archives multiple times # (the Fortran compiler seems to do that automatically... FLIBS="-Wl,--start-group $FLIBS -Wl,--end-group" ;; esac esac ac_cv_f77_libs="$FLIBS" fi AC_LANG_POP([Fortran 77]) ]) # AC_COIN_F77_WRAPPERS ########################################################################### # COIN_FIND_F77 # ########################################################################### # Attempt to preempt autoconf by locating an appropriate F77 program. This # macro will not trigger a fatal error if a suitable compiler cannot be # found. It should be called before COIN_PROG_F77 or COIN_TRY_FLINK. AC_DEFUN([AC_COIN_FIND_F77], [AC_REQUIRE([AC_COIN_ENABLE_DOSCOMPILE]) AC_REQUIRE([AC_COIN_F77_COMPS]) AC_MSG_NOTICE([Trying to determine Fortran compiler name]) AC_CHECK_PROGS([F77],[$coin_f77_comps],[unavailable]) ]) # Auxilliary macro to make sure both COIN_PROG_F77 and COIN_FIND_F77 use # the same search lists for compiler names. # For *-*-solaris*, promote Studio/Workshop compilers to front of list. AC_DEFUN([AC_COIN_F77_COMPS], [case $build in *-cygwin* | *-mingw*) if test "$enable_doscompile" = msvc ; then coin_f77_comps="ifort fl32 compile_f2c" else coin_f77_comps="gfortran g77 ifort fl32 compile_f2c" fi ;; *-*-solaris*) coin_f77_comps="f95 f90 f77 xlf_r fort77 gfortran g77 pgf90 pgf77 ifort ifc frt af77" ;; *) coin_f77_comps="xlf_r fort77 gfortran f77 g77 pgf90 pgf77 ifort ifc frt af77" ;; esac ]) ########################################################################### # COIN_INIT_AUTOMAKE # ########################################################################### # This macro calls the regular INIT_AUTOMAKE and MAINTAINER_MODE # macros, and defines additional variables and makefile conditionals, # that are used in the maintainer parts of the makfile. It also # checks if the correct versions of the autotools are used. # # This also defines the AC_SUBST variables: # abs_source_dir absolute path to source code for this package # abs_bin_dir absolute path to the directory where binaries are # going to be installed (prefix/bin) # abs_lib_dir absolute path to the directory where libraries are # going to be installed (prefix/lib) # abs_include_dir absolute path to the directory where the header files # are installed (prefix/include) AC_DEFUN([AC_COIN_INIT_AUTOMAKE], [AC_REQUIRE([AC_PROG_EGREP]) # AC_MSG_NOTICE([Beginning automake initialisation.]) # Stuff for automake AM_INIT_AUTOMAKE AM_MAINTAINER_MODE coin_have_externals=no if test "$enable_maintainer_mode" = yes; then # If maintainer mode is chosen, we make sure that the correct versions # of the tools are used, and that we know where libtool.m4 is (to # recreate acinclude.m4) AC_SUBST(LIBTOOLM4) LIBTOOLM4= # Normally, $HOME AUTOTOOLS_DFLT=$HOME AC_CACHE_CHECK([whether we are using the correct autotools], [ac_cv_use_correct_autotools], [ac_cv_use_correct_autotools=check]) if test $ac_cv_use_correct_autotools = check; then ac_cv_use_correct_autotools=yes # Check if we have autoconf AC_CHECK_PROG([have_autoconf],[autoconf],[yes],[no]) if test $have_autoconf = no; then AC_MSG_ERROR([You specified you want to use maintainer mode, but I cannot find autoconf in your path.]) fi # Check whether autoconf is the correct version correct_version='2.59' grep_version=`echo $correct_version | sed -e 's/\\./\\\\\\./g'` AC_MSG_CHECKING([whether we are using the correct version ($correct_version) of autoconf]) autoconf --version > confauto.out 2>&1 if $EGREP $grep_version confauto.out >/dev/null 2>&1; then AC_MSG_RESULT([yes]) else rm -f confauto.out AC_MSG_RESULT([no]) AC_MSG_ERROR([You don't have the correct version of autoconf as the first one in your path.]) fi rm -f confauto.out # Check if the executable autoconf is picked up from the correct location AC_MSG_CHECKING([whether autoconf is coming from the correct location]) autoconf_dir=`which autoconf | sed -e 's=/autoconf=='` autoconf_dir=`cd $autoconf_dir; pwd` if test x$AUTOTOOLS_DIR = x; then want_dir=$AUTOTOOLS_DFLT/bin else want_dir=$AUTOTOOLS_DIR/bin fi if test $autoconf_dir = `cd $want_dir; pwd`; then AC_MSG_RESULT([yes]) else rm -f confauto.out AC_MSG_RESULT([no]) AC_MSG_ERROR([The autoconf executable should be picked up from \$AUTOTOOLS_DFLT/bin or \$AUTOTOOLS_DIR/bin.]) fi # Check if we have automake AC_CHECK_PROG([have_automake],[automake],[yes],[no]) if test $have_automake = no; then AC_MSG_ERROR([You specified you want to use maintainer mode, but I cannot find automake in your path.]) fi # Check whether automake is the correct version correct_version='1.9.6' grep_version=`echo $correct_version | sed -e 's/\\./\\\\\\./g'` AC_MSG_CHECKING([whether we are using the correct version ($correct_version) of automake]) automake --version > confauto.out 2>&1 if $EGREP $grep_version confauto.out >/dev/null 2>&1; then AC_MSG_RESULT([yes]) else rm -f confauto.out AC_MSG_RESULT([no]) AC_MSG_ERROR([You don't have the correct version of automake as the first one in your path.]) fi rm -f confauto.out # Check if the executable automake is picked up from the correct location AC_MSG_CHECKING([whether automake is coming from the correct location]) automake_dir=`which automake | sed -e 's=/automake=='` automake_dir=`cd $automake_dir; pwd` if test x$AUTOTOOLS_DIR = x; then want_dir=$AUTOTOOLS_DFLT/bin else want_dir=$AUTOTOOLS_DIR/bin fi if test $automake_dir = `cd $want_dir; pwd`; then AC_MSG_RESULT([yes]) else rm -f confauto.out AC_MSG_RESULT([no]) AC_MSG_ERROR([The automake executable should be picked up from \$AUTOTOOLS_DFLT/bin or \$AUTOTOOLS_DIR/bin.]) fi # Check if this is the correct version of libtool (with escaped dots) if test x$AUTOTOOLS_DIR = x; then want_dir=$AUTOTOOLS_DFLT/share else want_dir=$AUTOTOOLS_DIR/share fi correct_version='1.5.22' grep_version=`echo $correct_version | sed -e 's/\\./\\\\\\./g'` AC_COIN_CHECK_FILE([$want_dir/libtool/ltmain.sh], [have_ltmain=yes], [have_ltmain=no]) AC_MSG_CHECKING([whether we are using the correct version ($correct_version) of libtool.]) if test $have_ltmain = yes; then if $EGREP $grep_version $want_dir/libtool/ltmain.sh >/dev/null 2>&1; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) AC_MSG_ERROR([You don't have the correct version of libtool.]) fi else AC_MSG_RESULT([no]) AC_MSG_ERROR([I cannot find the ltmain.sh file.]) fi fi # Check if we can find the libtool file if test x$AUTOTOOLS_DIR = x; then want_dir=$AUTOTOOLS_DFLT/share else want_dir=$AUTOTOOLS_DIR/share fi AC_COIN_CHECK_FILE([$want_dir/aclocal/libtool.m4], [LIBTOOLM4="$want_dir/aclocal/libtool.m4"], [AC_MSG_ERROR([I cannot find the libtool.m4 file.])]) # Check if we have an Externals file if test -r $srcdir/Externals; then coin_have_externals=yes fi # Check if subversion is installed and understands https AC_CHECK_PROG([have_svn],[svn],[yes],[no]) if test x$have_svn = xyes; then AC_CACHE_CHECK([whether svn understands https], [ac_cv_svn_understands_https], [svn --version > confauto.out 2>&1 if $EGREP https confauto.out >/dev/null 2>&1; then ac_cv_svn_understands_https=yes else ac_cv_svn_understands_https=no have_svn=no ac_cv_prog_have_svn=no fi rm -f confauto.out]) fi # Find the location of the BuildTools directory BUILDTOOLSDIR= if test -r $srcdir/BuildTools/coin.m4; then BUILDTOOLSDIR=$srcdir/BuildTools else if test -r $srcdir/../BuildTools/coin.m4; then BUILDTOOLSDIR=$srcdir/../BuildTools else if test -r $srcdir/../../BuildTools/coin.m4; then BUILDTOOLSDIR=$srcdir/../../BuildTools else AC_MSG_ERROR(Cannot find the BuildTools directory) fi fi fi AC_SUBST(BUILDTOOLSDIR) # The following variable is set to the name of the directory where # the autotool scripts are located AC_SUBST(AUX_DIR) AUX_DIR=$ac_aux_dir fi # helpful variable for the base directory of this package abs_source_dir=`cd $srcdir; pwd` AC_SUBST(abs_source_dir) # Stuff for example Makefiles if test x$prefix = xNONE; then full_prefix=$ac_default_prefix else full_prefix=$prefix fi full_prefix=`cd $full_prefix ; pwd` AC_SUBST(abs_lib_dir) abs_lib_dir=$full_prefix/lib AC_SUBST(abs_include_dir) abs_include_dir=$full_prefix/include AC_SUBST(abs_bin_dir) abs_bin_dir=$full_prefix/bin AM_CONDITIONAL(HAVE_EXTERNALS, test $coin_have_externals = yes && test x$have_svn = xyes) # AC_MSG_NOTICE([End automake initialisation.]) ]) # AC_COIN_INIT_AUTOMAKE ########################################################################### # COIN_CREATE_LIBTOOL # ########################################################################### # This does all the tests necessary to create the libtool script in the # package base directory. If this is used, then the COIN_INIT_AUTO_TOOLS # test in the subdirectories will be able to skip the libtool tests and # just use the one in the package base directory. m4_define([AC_COIN_CREATE_LIBTOOL], [AC_CANONICAL_BUILD # Check if user wants to produce debugging code AC_COIN_DEBUG_COMPILE # Get the name of the C compiler and appropriate compiler options AC_COIN_PROG_CC # Get the name of the C++ compiler and appropriate compiler options AC_COIN_PROG_CXX # Get the name of the Fortran compiler and appropriate compiler options AC_COIN_PROG_F77 # Initialize automake and libtool # AC_MSG_NOTICE([Calling INIT_AUTO_TOOLS from CREATE_LIBTOOL.]) AC_COIN_INIT_AUTO_TOOLS # AC_MSG_NOTICE([Finished INIT_AUTO_TOOLS from CREATE_LIBTOOL.]) ]) ########################################################################### # COIN_INIT_AUTO_TOOLS # ########################################################################### # Initialize the auto tools automake and libtool, with all # modifications we want for COIN packages. # # RPATH_FLAGS link flags for hardcoding path to shared objects # This is a trick to have this code before AC_COIN_PROG_LIBTOOL AC_DEFUN([AC_COIN_DISABLE_STATIC], [ # Test if force_shared has been set if test "x$1" = xforce_shared; then if test x$enable_shared = xno; then AC_MSG_ERROR([Shared libraries are disabled by user, but this is not feasible with the given options]) fi enable_shared=yes; else # On Cygwin and AIX, building DLLs doesn't work case $build in *-cygwin*) coin_disable_shared=yes platform=Cygwin ;; *-aix*) coin_disable_shared=yes platform=AIX ;; *-mingw*) coin_disable_shared=yes platform="Msys" # case "$CXX" in # cl*) # coin_disable_shared=yes # platform="Msys with cl" # ;; # esac ;; esac fi if test x"$coin_disable_shared" = xyes; then if test x"$enable_shared" = xyes; then AC_MSG_WARN([On $platform, shared objects are not supported. I'm disabling your choice.]) fi enable_shared=no fi # By default, we only want the shared objects to be compiled AC_DISABLE_STATIC ]) m4_define([AC_COIN_INIT_AUTO_TOOLS], [{AC_BEFORE([AC_COIN_PROG_CXX],[$0]) AC_BEFORE([AC_COIN_PROG_CC],[$0]) AC_BEFORE([AC_COIN_PROG_F77],[$0]) # START AC_COIN_DISABLE_STATIC([$1]) # Initialize automake AC_COIN_INIT_AUTOMAKE LIBTOOL= if test -r ../libtool; then coin_config_dir=.. LIBTOOL='$(SHELL) $(top_builddir)/../libtool' fi if test "x$LIBTOOL" = x; then if test -r ../../libtool; then coin_config_dir=../.. LIBTOOL='$(SHELL) $(top_builddir)/../../libtool' fi fi if test "x$LIBTOOL" = x; then # AC_MSG_NOTICE([Creating libtool script (calling COIN_PROG_LIBTOOL).]) # Stuff for libtool AC_COIN_PROG_LIBTOOL # AC_MSG_NOTICE([Finished COIN_PROG_LIBTOOL.]) # set RPATH_FLAGS to the compiler link flags required to hardcode location # of the shared objects AC_COIN_RPATH_FLAGS($abs_lib_dir) else AC_MSG_NOTICE([Using libtool script in directory $coin_config_dir]) # get all missing information from the config.log file # output variables and defines as_save_IFS=$IFS IFS=' ' for oneline in `cat $coin_config_dir/config.status`; do case "$oneline" in # First some automake conditionals s,@am__fastdep* | s,@AR@* | s,@CPP@* | s,@CPPFLAGS@* | s,@CXXCPP@* | \ s,@RANLIB@* | s,@STRIP@* | s,@ac_ct_AR@* | s,@ac_ct_RANLIB@* | \ s,@ac_ct_STRIP@* | s,@host* | s,@LN_S@* | s,@RPATH_FLAGS@* | \ s,@ac_c_preproc_warn_flag@* | s,@ac_cxx_preproc_warn_flag@* ) command=`echo $oneline | sed -e 's/^s,@//' -e 's/@,/="/' -e 's/,;t t/"/'` # echo "$command" eval "$command" ;; s,@DEFS@* ) command=`echo $oneline | sed -e 's/^s,@DEFS@,/defsline="/' -e 's/,;t t/"/'` # echo "$command" eval "$command" ;; esac done IFS=$as_save_IFS # And some defines (assuming here that the packages base dir # doesn't have a config.h file for word in $defsline; do # echo word $word case $word in -DHAVE_@<:@A-Z_@:>@*_H=1 | -DSTDC_HEADERS=1 ) i=`echo $word | sed -e 's/-D/#define /' -e 's/=/ /'` # echo dd $i echo $i >>confdefs.h ;; esac done fi # AC_MSG_NOTICE([End of INIT_AUTO_TOOLS.]) # ToDo # For now, don't use the -no-undefined flag, since the Makefiles are # not yet set up that way. But we need to fix this, when we want # to comile DLLs under Windows. LT_LDFLAGS= AC_SUBST(LT_LDFLAGS) #END }]) ########################################################################### # COIN_PATCH_LIBTOOL_CYGWIN # ########################################################################### # Patches to libtool for cygwin. Lots for cl, a few for GCC. # For cl: # - cygpath is not correctly quoted in fix_srcfile_path # - paths generated for .lib files is not run through cygpath -w AC_DEFUN([AC_COIN_PATCH_LIBTOOL_CYGWIN], [ case "$CXX" in cl* | */cl* | CL* | */CL* | icl* | */icl* | ICL* | */ICL*) AC_MSG_NOTICE(Applying patches to libtool for cl compiler) sed -e 's|fix_srcfile_path=\"`cygpath -w \"\$srcfile\"`\"|fix_srcfile_path=\"\\\`'"$CYGPATH_W"' \\\"\\$srcfile\\\"\\\`\"|' \ -e 's|fix_srcfile_path=\"\"|fix_srcfile_path=\"\\\`'"$CYGPATH_W"' \\\"\\$srcfile\\\"\\\`\"|' \ -e 's%compile_deplibs=\"\$dir/\$old_library \$compile_deplibs\"%compile_deplibs="'\`"$CYGPATH_W"' \$dir/\$old_library | sed -e '"'"'sY\\\\\\\\Y/Yg'"'"\`' \$compile_deplibs\"'% \ -e 's%compile_deplibs=\"\$dir/\$linklib \$compile_deplibs\"%compile_deplibs="'\`"$CYGPATH_W"' \$dir/\$linklib | sed -e '"'"'sY\\\\\\\\Y/Yg'"'"\`' \$compile_deplibs\"'% \ -e 's%lib /OUT:%lib -OUT:%' \ -e "s%cygpath -w%$CYGPATH_W%" \ -e 's%$AR x \\$f_ex_an_ar_oldlib%bla=\\`lib -nologo -list \\$f_ex_an_ar_oldlib | xargs echo '"$mydos2unix"'\\`; echo \\$bla; for i in \\$bla; do lib -nologo -extract:\\$i \\$f_ex_an_ar_oldlib; done%' \ -e 's/$AR t/lib -nologo -list/' \ -e 's%f_ex_an_ar_oldlib="\($?*1*\)"%f_ex_an_ar_oldlib='\`"$CYGPATH_W"' \1`%' \ -e 's%^archive_cmds=.*%archive_cmds="\\$CC -o \\$lib \\$libobjs \\$compiler_flags \\\\\\`echo \\\\\\"\\$deplibs\\\\\\" | \\$SED -e '"\'"'s/ -lc\\$//'"\'"'\\\\\\` -link -dll~linknames="%' \ -e 's%old_archive_cmds="lib -OUT:\\$oldlib\\$oldobjs\\$old_deplibs"%old_archive_cmds="if test -r \\$oldlib; then bla=\\"\\$oldlib\\"; else bla=; fi; lib -OUT:\\$oldlib \\\\\\$bla\\$oldobjs\\$old_deplibs"%' \ libtool > conftest.bla mv conftest.bla libtool chmod 755 libtool ;; *) AC_MSG_NOTICE(Applying patches to libtool for GNU compiler) sed -e 's|fix_srcfile_path=\"`cygpath -w \"\$srcfile\"`\"|fix_srcfile_path=\"\\\`'"$CYGPATH_W"' \\\"\\$srcfile\\\"\\\`\"|' \ -e 's|"lib /OUT:\\$oldlib\\$oldobjs\\$old_deplibs"|"\\$AR \\$AR_FLAGS \\$oldlib\\$oldobjs\\$old_deplibs~\\$RANLIB \\$oldlib"|' \ -e 's|libext="lib"|libext="a"|' \ libtool > conftest.bla mv conftest.bla libtool chmod 755 libtool ;; esac ]) # COIN_PATCH_LIBTOOL_CYGWIN ########################################################################### # COIN_PATCH_LIBTOOL_SOLARIS # ########################################################################### # If we want to do a 64-bit build with GCC on Solaris, the system search # libraries need to point to 64-bit subdirectories. If they do not already do # that, fix them. This patch is evolving, as are GCC compilers. GCC 4.2.1 # reports the correct search list, given the correct call. GCC 4.1.1 does not. # `Correct call' means -m64 is specified. `Correct search list' seems to amount # to prepending the list of 64-bit subdirectories to the 32-bit directories. # Both SPARC and x86 have this issue, but a different hardware id string is # required depending on the underlying CPU. The macro executes isainfo to get # the string. This will fail, of course, if we're cross-compiling. The # alternative is to fail on a regular basis each time a new CPU identifier is # needed. This macro will also fail if the search list reported with # -print-search-dirs differs between the C, C++, and Fortran compilers; each # have their own setting in libtool. If GCC reports the correct search list # given the -m64 flag, the best solution is to define CC='gcc -m64', and # similarly for CXX, F77, so that libtool will make the correct call. ########################################################################### AC_DEFUN([AC_COIN_PATCH_LIBTOOL_SOLARIS], [ if test "$GCC" = yes && \ (echo $CXXFLAGS $CFLAGS $FFLAGS | $EGREP 'm64' >/dev/null 2>&1) ; then hdwisa=`isainfo | sed -e 's/\(@<:@^ @:>@*\) .*$/\1/'` if `$EGREP 'sys_lib_search_path_spec=' libtool | $EGREP -v $hdwisa >/dev/null 2>&1` ; then AC_MSG_NOTICE([Applying patches to libtool for 64-bit GCC compilation]) fixlibtmp=`$CC -m64 -print-search-dirs | $EGREP '^libraries:'` fixlibtmp=`echo $fixlibtmp | sed -e 's/libraries: =//' -e 's/:/ /g'` if `echo "$fixlibtmp" | $EGREP -v $hdwisa >/dev/null 2>&1` ; then # AC_MSG_NOTICE(Compensating for broken gcc) for lib in $fixlibtmp ; do if test -d "${lib}${hdwisa}" ; then syslibpath64="$syslibpath64 ${lib}${hdwisa}/" fi done syslibpath64="${syslibpath64} ${fixlibtmp}" else syslibpath64="$fixlibtmp" fi sed -e 's|sys_lib_search_path_spec=".*"|sys_lib_search_path_spec="'"$syslibpath64"'"|' libtool > conftest.bla mv conftest.bla libtool chmod 755 libtool fi # AC_MSG_NOTICE(Result is ) # $EGREP 'sys_lib_search_path_spec=' libtool fi ]) # COIN_PATCH_LIBTOOL_SOLARIS ########################################################################### # COIN_PROG_LIBTOOL # ########################################################################### # Setup the libtool stuff together with any modifications to make it # work on additional platforms AC_DEFUN([AC_COIN_LIBTOOL_WRAPPER], [AC_BEFORE([AC_COIN_BLA],[$0]) AC_PROG_LIBTOOL]) AC_DEFUN([AC_COIN_BLA],[echo bla]) AC_DEFUN([AC_COIN_PROG_LIBTOOL], [# No longer needed now that CPPFLAGS is correctly set -- lh, 061214 -- # AC_REQUIRE([AC_COIN_DLFCN_H]) # NEW: If libtool exists in the directory higher up, we use that one # instead of creating a new one # It turns out that the code for AC_PROG_LIBTOOL is somehow AC_REQUIRED # out in front of this macro body. You'll notice that LIBTOOL is already # defined here. We'll have to count on this macro not being called if libtool # already exists, or at least move the libtool fixes outside the conditional. # AC_MSG_NOTICE([Entering coin_prog_libtool, LIBTOOL = "$LIBTOOL".]) # This test is therefore removed. -- lh, 061214 -- # if test "x$LIBTOOL" = x; then # AC_MSG_NOTICE([Calling PROG_LIBTOOL.]) AC_PROG_LIBTOOL # AC_MSG_NOTICE([Finished PROG_LIBTOOL.]) AC_SUBST(ac_c_preproc_warn_flag) AC_SUBST(ac_cxx_preproc_warn_flag) AC_MSG_NOTICE([Build is "$build".]) mydos2unix='| dos2unix' case $build in *-mingw*) CYGPATH_W=echo mydos2unix= ;; esac case $build in # Here we need to check if -m32 is specified. If so, we need to correct # sys_lib_search_path_spec *x86_64-*) if test "$GCC" = yes && (echo $CXXFLAGS $CFLAGS $FFLAGS | $EGREP 'm32' >& /dev/null); then AC_MSG_NOTICE(Applying patches to libtool for 32bit compilation) sed -e 's|sys_lib_search_path_spec=".*"|sys_lib_search_path_spec="/lib /usr/lib"|' libtool > conftest.bla mv conftest.bla libtool chmod 755 libtool fi ;; *-solaris*) AC_COIN_PATCH_LIBTOOL_SOLARIS ;; # Cygwin. Ah, cygwin. Too big and ugly to inline; see the macro. *-cygwin* | *-mingw*) AC_COIN_PATCH_LIBTOOL_CYGWIN ;; *-darwin*) AC_MSG_NOTICE(Applying patches to libtool for Darwin) sed -e 's/verstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"/verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"/' \ -e 's/ -dynamiclib / -dynamiclib -single_module /g' \ libtool > conftest.bla mv conftest.bla libtool chmod 755 libtool ;; esac # This fi matches the commented `if test "x$LIBTOOL" = x;' up at the head of # the macro. -- lh, 061214 -- # fi # AC_MSG_NOTICE([End libtool initialisation.]) ]) # AC_COIN_PROG_LIBTOOL # This is a trick to force the check for the dlfcn header to be done before # the checks for libtool # No longer needed now that CPPFLAGS is correctly set. -- lh, 061214 -- # ACDEFUN([AC_COIN_DLFCN_H], # [AC_LANG_PUSH(C) # AC_COIN_CHECK_HEADER([dlfcn.h]) # AC_LANG_POP(C) # ]) # AC_COIN_DLFCN_H ########################################################################### # COIN_RPATH_FLAGS # ########################################################################### # This macro, in case shared objects are used, defines a variable # RPATH_FLAGS that can be used by the linker to hardwire the library # search path for the given directories. This is useful for example # Makefiles AC_DEFUN([AC_COIN_RPATH_FLAGS], [RPATH_FLAGS= if test $enable_shared = yes; then case $build in *-linux-*) if test "$GXX" = "yes"; then RPATH_FLAGS= for dir in $1; do RPATH_FLAGS="$RPATH_FLAGS -Wl,--rpath -Wl,$dir" done fi ;; *-darwin*) RPATH_FLAGS=nothing ;; *-ibm-*) case "$CXX" in xlC* | */xlC* | mpxlC* | */mpxlC*) RPATH_FLAGS=nothing ;; esac ;; *-hp-*) RPATH_FLAGS=nothing ;; *-mingw32) RPATH_FLAGS=nothing ;; *-*-solaris*) RPATH_FLAGS= for dir in $1; do RPATH_FLAGS="$RPATH_FLAGS -R$dir" done esac if test "$RPATH_FLAGS" = ""; then AC_MSG_WARN([Could not automatically determine how to tell the linker about automatic inclusion of the path for shared libraries. The test examples might not work if you link against shared objects. You will need to set the LD_LIBRARY_PATH, DYLP_LIBRARY_PATH, or LIBDIR variable manually.]) fi if test "$RPATH_FLAGS" = "nothing"; then RPATH_FLAGS= fi fi AC_SUBST(RPATH_FLAGS) ]) # AC_COIN_RPATH_FLAGS ########################################################################### # COIN_LINK_INPUT_CMD # ########################################################################### # This macro determines which command should be used to "link" files # that are input to the generated executables. On Windows, the codes # using the native Windows system libraries, cannot understand symbolic # links, and a copy should be used instead of 'ln -s'. # The result is stored in coin_link_input_cmd AC_DEFUN([AC_COIN_LINK_INPUT_CMD], [AC_REQUIRE([AC_PROG_LN_S]) AC_BEFORE([AC_COIN_PROG_CC], [$0]) AC_BEFORE([AC_COIN_ENABLE_DOSCOMPILE], [$0]) AC_MSG_CHECKING([which command should be used to link input files]) coin_link_input_cmd="$LN_S" if test "$enable_doscompile" = mingw; then coin_link_input_cmd=cp fi case "$CC" in cl* | */cl* | CL* | */CL* | icl* | */icl* | ICL* | */ICL*) coin_link_input_cmd=cp ;; esac AC_MSG_RESULT($coin_link_input_cmd) ]) ########################################################################### # COIN_FINALIZE # ########################################################################### # This macro should be called at the very end of the configure.ac file. # It creates the output files (by using AC_OUTPUT), and might do some other # things (such as generating links to data files in a VPATH configuration). # It also prints the "success" message. # Note: If the variable coin_skip_ac_output is set to yes, then no output # files are written. AC_DEFUN([AC_COIN_FINALIZE], [ AC_REQUIRE([AC_COIN_LINK_INPUT_CMD]) if test x$coin_skip_ac_output != xyes; then FADDLIBS="$ADDLIBS" if test x"$coin_need_flibs" = xyes; then ADDLIBS="$ADDLIBS $FLIBS" fi # library extension AC_SUBST(LIBEXT) case "$CC" in cl* | */cl* | CL* | */CL* | icl* | */icl* | ICL* | */ICL*) LIBEXT=lib ;; *) LIBEXT=a ;; esac # Define VPATH_DISTCLEANFILES to be everything that needs to be # cleaned for distclean in a vpath configuration AC_SUBST(VPATH_DISTCLEANFILES) VPATH_DISTCLEANFILES="$coin_vpath_link_files" # Take out subdirectories if their configuration concluded that they # don't need to be compiled if test x"$coin_ac_skip_subdirs" != x; then new_subdirs= for i in $subdirs; do skipme=no for j in $coin_ac_skip_subdirs; do if test $i = $j; then skipme=yes; fi done if test $skipme = no; then new_subdirs="$new_subdirs $i" fi done subdirs="$new_subdirs" fi AC_OUTPUT if test x"$coin_vpath_link_files" = x; then : ; else lnkcmd="$coin_link_input_cmd" if test "$lnkcmd" = cp; then AC_MSG_NOTICE(Copying data files for VPATH configuration) else AC_MSG_NOTICE(Creating VPATH links for data files) fi for file in $coin_vpath_link_files; do dir=`AS_DIRNAME(["./$file"])` if test -d $dir; then : ; else AS_MKDIR_P($dir) fi rm -f $file $lnkcmd $abs_source_dir/$file $file done fi if test x$coin_projectdir = xyes; then AC_MSG_NOTICE([Configuration of $PACKAGE_NAME successful]) else AC_MSG_NOTICE([Main configuration of $PACKAGE_NAME successful]) fi else AC_MSG_NOTICE([No configuration of $PACKAGE_NAME necessary]) fi ]) #AC_COIN_FINALIZE ########################################################################### # COIN_VPATH_LINK # ########################################################################### # This macro makes sure that a symbolic link is created to a file in # the source code directory tree if we are in a VPATH compilation, and # if this package is the main package to be installed AC_DEFUN([AC_COIN_VPATH_LINK], [AC_REQUIRE([AC_COIN_CHECK_VPATH]) if test $coin_vpath_config = yes; then coin_vpath_link_files="$coin_vpath_link_files $1" fi ]) #AC_COIN_VPATH_LINK ########################################################################### # COIN_ENABLE_GNU_PACKAGES # ########################################################################### # This macro defined the --enable-gnu-packages flag. This can be used # to check if a user wants to compile GNU packges (such as readline or # zlib) into the executable. By default, GNU packages are disabled. # This also defines the automake conditional COIN_ENABLE_GNU_PACKAGES AC_DEFUN([AC_COIN_ENABLE_GNU_PACKAGES], [AC_ARG_ENABLE([gnu-packages], [AC_HELP_STRING([--enable-gnu-packages], [compile with GNU packages (disabled by default)])], [coin_enable_gnu=$enableval], [coin_enable_gnu=no]) ]) # AC_COIN_ENABLE_GNU_PACKAGES ########################################################################### # COIN_CHECK_GNU_ZLIB # ########################################################################### # This macro checks for the libz library. AC_DEFUN([AC_COIN_CHECK_GNU_ZLIB], [AC_REQUIRE([AC_COIN_ENABLE_GNU_PACKAGES]) AC_BEFORE([AC_COIN_PROG_CXX],[$0]) AC_BEFORE([AC_COIN_PROG_CC],[$0]) AC_BEFORE([AC_COIN_PROG_F77],[$0]) AC_BEFORE([$0],[AC_COIN_FINALIZE]) coin_has_zlib=no if test $coin_enable_gnu = yes; then AC_COIN_CHECK_HEADER([zlib.h],[coin_has_zlib=yes]) if test $coin_has_zlib = yes; then AC_CHECK_LIB([z],[gzopen], [ADDLIBS="-lz $ADDLIBS"], [coin_has_zlib=no]) fi if test $coin_has_zlib = yes; then AC_DEFINE([COIN_HAS_ZLIB],[1],[Define to 1 if zlib is available]) fi fi AM_CONDITIONAL(COIN_HAS_ZLIB,test x$coin_has_zlib = xyes) ]) # AC_COIN_CHECK_GNU_ZLIB ########################################################################### # COIN_CHECK_GNU_BZLIB # ########################################################################### # This macro checks for the libbz2 library. AC_DEFUN([AC_COIN_CHECK_GNU_BZLIB], [AC_REQUIRE([AC_COIN_ENABLE_GNU_PACKAGES]) AC_BEFORE([AC_COIN_PROG_CXX],[$0]) AC_BEFORE([AC_COIN_PROG_CC],[$0]) AC_BEFORE([AC_COIN_PROG_F77],[$0]) AC_BEFORE([$0],[AC_COIN_FINALIZE]) coin_has_bzlib=no if test $coin_enable_gnu = yes; then AC_COIN_CHECK_HEADER([bzlib.h],[coin_has_bzlib=yes]) if test $coin_has_bzlib = yes; then AC_CHECK_LIB([bz2],[BZ2_bzReadOpen], [ADDLIBS="-lbz2 $ADDLIBS"], [coin_has_bzlib=no]) fi if test $coin_has_bzlib = yes; then AC_DEFINE([COIN_HAS_BZLIB],[1],[Define to 1 if bzlib is available]) fi fi ]) # AC_COIN_CHECK_GNU_BZLIB ########################################################################### # COIN_CHECK_GNU_READLINE # ########################################################################### # This macro checks for GNU's readline. It verifies that the header # readline/readline.h is available, and that the -lreadline library # contains "readline". It is assumed that #include is included # in the source file before the #include AC_DEFUN([AC_COIN_CHECK_GNU_READLINE], [AC_REQUIRE([AC_COIN_ENABLE_GNU_PACKAGES]) AC_BEFORE([AC_COIN_PROG_CXX],[$0]) AC_BEFORE([AC_COIN_PROG_CC],[$0]) AC_BEFORE([AC_COIN_PROG_F77],[$0]) AC_BEFORE([$0],[AC_COIN_FINALIZE]) coin_has_readline=no if test $coin_enable_gnu = yes; then AC_COIN_CHECK_HEADER([readline/readline.h], [coin_has_readline=yes],[], [#include ]) coin_save_LIBS="$LIBS" LIBS= # First we check if tputs and friends are available if test $coin_has_readline = yes; then AC_SEARCH_LIBS([tputs],[ncurses termcap curses],[], [coin_has_readline=no]) fi # Now we check for readline if test $coin_has_readline = yes; then AC_CHECK_LIB([readline],[readline], [ADDLIBS="-lreadline $LIBS $ADDLIBS"], [coin_has_readline=no]) fi if test $coin_has_readline = yes; then AC_DEFINE([COIN_HAS_READLINE],[1],[Define to 1 if readline is available]) fi LIBS="$coin_save_LIBS" fi ]) # AC_COIN_CHECK_GNU_READLINE ########################################################################### # COIN_DATA_PATH # ########################################################################### # This macro defines a preprocessor macro with the absolute path to a # subdirectory of Data. The argument of this macro is the name of the # subdirectory (in correct case), and the name of the macro is # COIN_DATA_DIR_PATH, where dir is replaced by the capitalized name of # the directory. The path ends with a separator ("/" for linux and # '\\' for Windows). The default value for this path can be # overwritten with the input variable with the same name # (COIN_DATA_DIR_PATH). At this point we chech only for the # $srcdir/../Data subdirectory. AC_DEFUN([AC_COIN_DATA_PATH], [AC_MSG_CHECKING([absolute path to data directory $1]) AC_ARG_VAR(m4_toupper(COIN_DATA_$1_PATH),[Set to absolute path to Data/$1 subdirectory]) if test x"$m4_toupper(COIN_DATA_$1_PATH)" = x; then m4_toupper(COIN_DATA_$1_PATH)=`cd $srcdir/../Data/$1; pwd` fi # Under Cygwin, use Windows path. Add separator case $build in *-cygwin*) m4_toupper(COIN_DATA_$1_PATH)=`cygwin -w $m4_toupper(COIN_DATA_$1_PATH)`\\ ;; *) m4_toupper(COIN_DATA_$1_PATH)="$m4_toupper(COIN_DATA_$1_PATH)/" ;; esac if test -r $m4_toupper(COIN_DATA_$1_PATH); then AC_DEFINE_UNQUOTED(m4_toupper(COIN_DATA_$1_PATH),["$m4_toupper(COIN_DATA_$1_PATH)"], [Define to absolute path for Data subdirectory $1]) AC_MSG_RESULT($m4_toupper(COIN_DATA_$1_PATH)) else AC_MSG_ERROR(Directory $m4_toupper(COIN_DATA_$1_PATH) does not exist) fi ]) # AC_COIN_HAS_DATA ########################################################################### # COIN_LINK_FROM_FILELIST # ########################################################################### # This macro creates links (or copies, if necessary) to files listed # as content in a text file (second argument) into a target directory # (first argument), which is created if it doesn't exist yet. If s link # already exists, nothing happens. AC_DEFUN([AC_COIN_LINKCOPY_FROM_FILELIST], [cmd="$3" if test -e $srcdir/$2 ; then my_target_dir="$1" my_link_files=`cat $srcdir/$2` my_dirname=`AS_DIRNAME($2)` # if test -e $my_target_dir; then : ; else # AS_MKDIR_P($my_target_dir) # fi for i in $my_link_files; do #rm -rf $my_target_dir/$i if test -e $my_target_dir/$i; then : ; else dirn2=`AS_DIRNAME($my_target_dir/$i)` if test -e $dirn2; then : ; else AS_MKDIR_P($dirn2) fi $cmd $abs_source_dir/$my_dirname/$i $my_target_dir/$i fi done else AC_MSG_WARN([File list file $2 missing!]) fi ]) AC_DEFUN([AC_COIN_LINK_FROM_FILELIST], [ AC_REQUIRE([AC_COIN_LINK_INPUT_CMD]) echo Creating links in $1 ... AC_COIN_LINKCOPY_FROM_FILELIST($1, $2, $coin_link_input_cmd) ]) ########################################################################### # COIN_COPY_FROM_FILELIST # ########################################################################### # Like COIN_LINK_FROM_FILELIST, but copies the files. AC_DEFUN([AC_COIN_COPY_FROM_FILELIST], [ echo Creating copies in $1 ... AC_COIN_LINKCOPY_FROM_FILELIST($1, $2, [cp]) ]) ########################################################################### # COIN_EXAMPLE_FILES # ########################################################################### # This macro determines the names of the example files (using the # argument in an "ls" command) and sets up the variables EXAMPLE_FILES # and EXAMPLE_CLEAN_FILES. If this is a VPATH configuration, it also # creates soft links to the example files. AC_DEFUN([AC_COIN_EXAMPLE_FILES], [AC_REQUIRE([AC_COIN_CHECK_GNU_ZLIB]) AC_REQUIRE([AC_COIN_CHECK_VPATH]) files=`cd $srcdir; ls $1` # We need to do the following loop to make sure that are no newlines # in the variable for file in $files; do EXAMPLE_FILES="$EXAMPLE_FILES $file" done if test $coin_vpath_config = yes; then lnkcmd= if test "$enable_doscompile" != no; then lnkcmd=cp fi case "$CC" in cl* | */cl* | CL* | */CL* | icl* | */icl* | ICL* | */ICL*) lnkcmd=cp ;; esac if test "$lnkcmd" = cp; then AC_MSG_NOTICE([Copying example files ($1)]) else AC_PROG_LN_S AC_MSG_NOTICE([Creating links to the example files ($1)]) lnkcmd="$LN_S" fi for file in $EXAMPLE_FILES; do rm -f $file $lnkcmd $srcdir/$file $file done EXAMPLE_CLEAN_FILES="$EXAMPLE_CLEAN_FILES $1" else EXAMPLE_CLEAN_FILES="$EXAMPLE_CLEAN_FILES" fi # In case there are compressed files, we create a variable with the # uncompressed names EXAMPLE_UNCOMPRESSED_FILES= for file in $EXAMPLE_FILES; do case $file in *.gz) EXAMPLE_UNCOMPRESSED_FILES="$EXAMPLE_UNCOMPRESSED_FILES `echo $file | sed -e s/.gz//`" ;; esac done AC_SUBST(EXAMPLE_UNCOMPRESSED_FILES) AC_SUBST(EXAMPLE_FILES) AC_SUBST(EXAMPLE_CLEAN_FILES) ]) #AC_COIN_EXAMPLE_FILES ########################################################################### # COIN_HAS_PROJECT # ########################################################################### # This macro sets up usage of a Coin package. It defines the # PKGSRCDIR and PKGOBJDIR variables, refering to the main source and # object directory of the package, respectively. It also defines # a COIN_HAS_PKG preprocessor macro and makefile conditional. The # argument should be the name (Pkg) of the project (in correct lower # and upper case) AC_DEFUN([AC_COIN_HAS_PROJECT], [AC_MSG_CHECKING([for COIN project $1]) # First check, if the sub-project is actually available (ToDo: allow # other locations) m4_tolower(coin_has_$1)=unavailable if test x"$COIN_SKIP_PROJECTS" != x; then for dir in $COIN_SKIP_PROJECTS; do if test $dir = $1; then m4_tolower(coin_has_$1)=skipping fi done fi if test $m4_tolower(coin_has_$1) != skipping; then if test $PACKAGE_TARNAME = m4_tolower($1); then m4_tolower(coin_has_$1)=. else if test -d $srcdir/../$1; then m4_tolower(coin_has_$1)=../$1 fi fi fi if test $m4_tolower(coin_has_$1) != unavailable && test $m4_tolower(coin_has_$1) != skipping; then # Set the #define if the component is available AC_DEFINE(m4_toupper(COIN_HAS_$1),[1],[Define to 1 if the $1 package is used]) # Set the variables for source and object code location AC_SUBST(m4_toupper($1SRCDIR)) m4_toupper($1SRCDIR)=`cd $srcdir/$m4_tolower(coin_has_$1); pwd` AC_SUBST(m4_toupper($1OBJDIR)) m4_toupper($1OBJDIR)=`pwd`/$m4_tolower(coin_has_$1) AC_SUBST(m4_toupper($1DOCDIR)) m4_toupper($1DOCDIR)=$abs_lib_dir/../share/doc/coin/$1 fi # Define the Makefile conditional AM_CONDITIONAL(m4_toupper(COIN_HAS_$1), [test $m4_tolower(coin_has_$1) != unavailable && test $m4_tolower(coin_has_$1) != skipping]) AC_MSG_RESULT([$m4_tolower(coin_has_$1)]) ]) # AC_COIN_HAS_PROJECT ########################################################################### # COIN_HAS_USER_LIBRARY # ########################################################################### # This macro sets up usage of a user library with header files. The assumption # is that the header file(s) and library do not reside in standard system # directories, hence both the include directory and link flags must be # specified. There are two mandatory arguments and two optional arguments. # # The first argument (mandatory) should be a name (LibraryName) for the # library. The second argument (mandatory) should be an abbreviation in # upper case letters (LBRY) for the library. Ultimately, the macro will # specify two variables, LBRYINCDIR and LBRYLIB, to be substituted in files # generated during configuration; a preprocessor symbol COIN_HAS_LBRY; and a # matching automake conditional COIN_HAS_LBRY. LBRYINCDIR should specify the # directory containing include files for the library. LBRYLIB should specify # the flags necessary to link to the library. A variable coin_has_lbry will # be set to true or false, as appropriate. A variable lbry_libcheck will be # be set to yes or no; no indicates link checks should not be attempted. # # The macro defines three configure arguments, --with-libraryname-incdir, # --with-libraryname-lib, and --disable-libraryname-libcheck, by converting # LibraryName to lower case. # # LBRYINCDIR and LBRYLIB can be specified as environment variables or as # part of the configure command using --with-libraryname-incdir and # --with-libraryname-lib, respectively. Command line arguments override # environment variables. # # If a third argument is given, it should specify a file in LBRYINCDIR. The # macro will check for the presence of the file. If a fourth argument is given, # it should specify a function name, `fname'. The macro will attempt to link a # trivial program containing a parameterless call to the function, `fname()', # using the LBRYLIB flags. The link check uses C as the language; this has been # adequate to date but has limitations. It is possible to disable the link # check by specifying --disable-libraryname-libcheck. This is a workaround for # instances where the link check does not work properly, for whatever reason. # If you're trying to link to a Fortran library, consider using F77_FUNC or # FC_FUNC to obtain a mangled fname appropriate for use from C code. For a C++ # library, you're on your own unless the library declares some function with # extern "C" linkage. Otherwise, you'll have to somehow find the mangled C++ # name. AC_DEFUN([AC_COIN_HAS_USER_LIBRARY], [ AC_REQUIRE([AC_COIN_PROJECTDIR_INIT]) AC_MSG_CHECKING(if user provides library for $1) # Check for header file directory AC_ARG_WITH(m4_tolower($1)-incdir, AS_HELP_STRING([--with-m4_tolower($1)-incdir], [specify the header file directory for library $1]), [$2INCDIR=`cd $withval; pwd`]) # Check for library directory AC_ARG_WITH(m4_tolower($1)-lib, AS_HELP_STRING([--with-m4_tolower($1)-lib], [specify the flags used to link with the library $1]), [$2LIB=$withval]) # Switch to disable library check if requested AC_ARG_ENABLE(m4_tolower($1)-libcheck, AS_HELP_STRING([--enable-m4_tolower($1)-libcheck], [use disable-m4_tolower($1)-libcheck to skip the link check at configuration time]), [m4_tolower($1)_libcheck=$enableval], [m4_tolower($1)_libcheck=yes]) # At this point, if we're going to use the library, both LBRYINCDIR and # LBRYLIB must be defined and not empty. if test x"$$2INCDIR" != x || test x"$$2LIB" != x; then if test x"$$2INCDIR" = x || test x"$$2LIB" = x; then AC_MSG_ERROR([You need to specify both an include directory and link flags to use library $1. Use --with-m4_tolower($1)-incdir of environment variable $$2INCDIR to specify the include directory. Use --with-m4_tolower($1)-lib or environment variable $$2LIB to specify link flags.]) fi m4_tolower(coin_has_$2)=true AC_MSG_RESULT(yes) else m4_tolower(coin_has_$2)=false AC_MSG_RESULT(no) fi # If we have instructions for use, consider header and link checks. if test $m4_tolower(coin_has_$2) = true; then # If argument 3 (file) is given, check for the file. Typically this will be a # header file, but that's not assumed. m4_ifval([$3], [AC_COIN_CHECK_FILE([$$2INCDIR/$3],[], [AC_MSG_ERROR([Cannot find file $3 in $$2INCDIR])])]) # Now see if we can link the function. There are arguments for and against # assuming argument 3 is a header file declaring the function. A correct # function declaration is the main argument in favour. Having to cope with # possible dependencies or other oddities are the main arguments against. # Force the use of C as the best single choice amongst C++, C, and Fortran. # Obviously, this has limits. m4_ifvaln([$4], [if test x"$m4_tolower($1)_libcheck" != xno; then coin_save_LIBS="$LIBS" LIBS="$$2LIB $ADDLIBS" coin_$2_link=no AC_LANG_PUSH(C) for fnm in $4 ; do AC_MSG_CHECKING([whether symbol $fnm is available with $2]) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[$fnm()]])], [AC_MSG_RESULT(yes) coin_$2_link=yes break], [AC_MSG_RESULT(no)]) done AC_LANG_POP(C) if test x"$coin_$2_link" = xyes ; then LIBS="$coin_save_LIBS" else AC_MSG_ERROR([Cannot find symbol(s) $4 with $2]) fi fi]) # If we make it this far, we've verified the file and linked the function. Add # the necessary link flags to ADDLIBS and define the preprocessor symbol # COIN_HAS_LBRY. ADDLIBS="$$2LIB $ADDLIBS" AC_DEFINE(COIN_HAS_$2,[1],[Define to 1 if the $1 package is available]) fi # Arrange for configure to substitute LBRYINCDIR and LBRYLIB and create the # automake conditional. These actions must occur unconditionally. AC_SUBST($2INCDIR) AC_SUBST($2LIB) AM_CONDITIONAL(COIN_HAS_$2, test $m4_tolower(coin_has_$2) = true) ]) #AC_COIN_HAS_USER_LIBRARY ########################################################################### # COIN_HAS_ASL # ########################################################################### # This macro checks if the user has provide arguments that say where # the precompiled ASL files should be found (with the --with-asldir # flag). If this is not the case, we check if the ThirdParty/ASL # directory has been configured, which indicates that the files will # be in that directory and can be used. AC_DEFUN([AC_COIN_HAS_ASL], [coin_aslobjdir=../ThirdParty/ASL coin_aslsrcdir=$srcdir/$coin_aslobjdir # Determine the name of the ASL library case "$CC" in cl* | */cl* | CL* | */CL* | icl* | */icl* | ICL* | */ICL*) ampllib=amplsolv.lib ;; *) ampllib=amplsolver.a ;; esac AC_ARG_WITH([asldir], AC_HELP_STRING([--with-asldir], [specify path to AMPL solver directory (or BUILD for compilation, or "no" for disabling AMPL)]), [use_asldir=$withval], [use_asldir=]) if test "$use_asldir" = BUILD; then if test "$PACKAGE_NAME" != ThirdPartyASL; then # If we are configuring ThirdParty/ASL, don't check if test -r $coin_aslobjdir/.MakeOk; then :; else AC_MSG_ERROR([option \"BUILD\" specified for asldir, but directory is not configure (sources missing?)]) fi fi elif test -z "$use_asldir"; then # try to find sources - if not given don't compile if test "$PACKAGE_NAME" != ThirdPartyASL; then if test -r $coin_aslobjdir/.MakeOk; then use_asldir=BUILD else use_asldir=no fi else use_asldir=no fi elif test "$use_asldir" != "no"; then AC_COIN_CHECK_FILE([$use_asldir/$ampllib],[], [AC_MSG_ERROR([ASL directory \"$use_asldir\" specified, but library missing])]) AC_COIN_CHECK_FILE([$use_asldir/asl.h],[], [AC_MSG_ERROR([ASL directory \"$use_asldir\" specified, but header files are missing])]) use_asldir=`cd $use_asldir; pwd` case $build in *-cygwin*) use_asldir=`cygpath -w $use_asldir | sed -e sX\\\\\\\\X/Xg` ;; esac fi # Variable containing ASL library (including full path) AC_SUBST(ASLLIB) # Variable containing flags for including ASL header files AC_SUBST(ASL_CPPFLAGS) if test "$use_asldir" = BUILD; then coin_aslobjdir=`cd $coin_aslobjdir; pwd` ASLLIB=`$CYGPATH_W $coin_aslobjdir/$ampllib | sed -e sX\\\\\\\\X/Xg` coin_aslsrcdir=`cd $coin_aslsrcdir; pwd` ASL_CPPFLAGS="-I"`$CYGPATH_W $coin_aslobjdir | sed -e sX\\\\\\\\X/Xg`" -I"`$CYGPATH_W $coin_aslsrcdir/solvers | sed -e sX\\\\\\\\X/Xg` elif test "$use_asldir" != no; then ASLLIB=`$CYGPATH_W $use_asldir/$ampllib | sed -e sX\\\\\\\\X/Xg` ASL_CPPFLAGS="-I"`$CYGPATH_W $use_asldir | sed -e sX\\\\\\\\X/Xg` fi if test "$use_asldir" != no; then AC_LANG_PUSH(C) AC_CHECK_LIB(dl,[dlopen],[ASLLIB="$ASLLIB -ldl"],[]) coin_has_asl=yes AC_DEFINE([COIN_HAS_ASL],[1], [If defined, the Ampl Solver Library is available.]) AC_LANG_POP(C) else coin_has_asl=no fi AM_CONDITIONAL(COIN_HAS_ASL, test $coin_has_asl = yes) ]) # AC_COIN_HAS_ASL ########################################################################### # COIN_TRY_FLINK # ########################################################################### # Auxilliary macro to test if a Fortran function name can be linked, # given the current settings of LIBS. We determine from the context, what # the currently active programming language is, and cast the name accordingly. # The first argument is the name of the function/subroutine, in small letters, # the second argument are the actions taken when the test works, and the # third argument are the actions taken if the test fails. AC_DEFUN([AC_COIN_TRY_FLINK], [case $ac_ext in f) AC_TRY_LINK(,[ call $1],[$2],[$3]) ;; c) AC_F77_FUNC($1,cfunc$1) if test x"$coin_need_flibs" = xyes; then flink_try=no; else AC_TRY_LINK([void $cfunc$1();],[$cfunc$1()], [flink_try=yes],[flink_try=no]) fi if test $flink_try = yes; then $2 else if test x"$FLIBS" != x; then flink_save_libs="$LIBS" LIBS="$LIBS $FLIBS" AC_TRY_LINK([void $cfunc$1();],[$cfunc$1()], [LIBS="$flink_save_libs" $2 coin_need_flibs=yes], [LIBS="$flink_save_libs" $3]) else $3 fi fi ;; cc|cpp) AC_F77_FUNC($1,cfunc$1) if test x"$coin_need_flibs" = xyes; then flink_try=no; else AC_TRY_LINK([extern "C" {void $cfunc$1();}],[$cfunc$1()], [flink_try=yes],[flink_try=no]) fi if test $flink_try = yes; then $2 else if test x"$FLIBS" != x; then flink_save_libs="$LIBS" LIBS="$LIBS $FLIBS" AC_TRY_LINK([extern "C" {void $cfunc$1();}],[$cfunc$1()], [LIBS="$flink_save_libs" $2 coin_need_flibs=yes], [LIBS="$flink_save_libs" $3]) else $3 fi fi ;; esac ]) # AC_COIN_TRY_FLINK ########################################################################### # COIN_HAS_BLAS # ########################################################################### # This macro checks for a library containing the BLAS library. It # tries standard libraries, and if none is found to be working, it # checks whether the BLAS ThirdParty/Blas directory has been configured. # It adds to ADDLIBS any flags required to link with an externally provided # BLAS. It defines the makefile conditional and preprocessor macro # COIN_HAS_BLAS, if blas is available, and it defines the makefile conditional # COIN_BUILD_BLAS, if blas is compiled within COIN. AC_DEFUN([AC_COIN_HAS_BLAS], [if test "$PACKAGE_NAME" = ThirdPartyBlas || test "$PACKAGE_NAME" = ThirdPartyLapack || test "$PACKAGE_NAME" = ThirdPartyMumps; then coin_blasobjdir=../Blas else coin_blasobjdir=../ThirdParty/Blas fi coin_blassrcdir=$srcdir/$coin_blasobjdir AC_ARG_WITH([blas], AC_HELP_STRING([--with-blas], [specify BLAS library (or BUILD for compilation)]), [use_blas=$withval], [use_blas=]) MAKEOKFILE=.MakeOk # Check if user supplied option makes sense if test x"$use_blas" != x; then if test "$use_blas" = "BUILD"; then # Don't check for course code if this is executed in ThirdParty/Blas if test "$PACKAGE_NAME" != ThirdPartyBlas; then if test -r $coin_blasobjdir/.MakeOk; then :; else AC_MSG_ERROR([option \"BUILD\" specified for Blas, but $coin_blasobjdir directory is not properly configured]) fi fi elif test "$use_blas" != no ; then AC_MSG_CHECKING([whether user supplied BLASLIB=\"$use_blas\" works]) LIBS="$use_blas $LIBS" ADDLIBS="$use_blas $ADDLIBS" AC_COIN_TRY_FLINK([daxpy], [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no]) AC_MSG_ERROR([user supplied BLAS library \"$use_blas\" does not work])]) fi else # Try to autodetect the library for blas based on build system #AC_MSG_CHECKING([default locations for BLAS]) skip_lblas_check=no case $build in *-sgi-*) SAVE_LIBS="$LIBS" AC_MSG_CHECKING([whether -lcomplib.sgimath has BLAS]) LIBS="-lcomplib.sgimath $LIBS" AC_COIN_TRY_FLINK([daxpy], [AC_MSG_RESULT([yes]) use_blas=-lcomplib.sgimath; ADDLIBS="-lcomplib.sgimath $ADDLIBS"], [AC_MSG_RESULT([no]) SAVE_LIBS="$LIBS"]) ;; # Ideally, we'd use -library=sunperf, but it's an imperfect world. Studio # cc doesn't recognise -library, it wants -xlic_lib. Studio 12 CC doesn't # recognise -xlic_lib. Libtool doesn't like -xlic_lib anyway. Sun claims # that CC and cc will understand -library in Studio 13. The main extra # function of -xlic_lib and -library is to arrange for the Fortran run-time # libraries to be linked for C++ and C. We can arrange that explicitly. *-*-solaris*) SAVE_LIBS="$LIBS" AC_MSG_CHECKING([for BLAS in libsunperf]) LIBS="-lsunperf $FLIBS $LIBS" AC_COIN_TRY_FLINK([daxpy], [AC_MSG_RESULT([yes]) use_blas='-lsunperf' ADDLIBS="-lsunperf $ADDLIBS" coin_need_flibs=yes], [AC_MSG_RESULT([no]) LIBS="$SAVE_LIBS"]) ;; *-cygwin* | *-mingw*) # On cygwin, consider -lblas only if doscompile is disabled. The prebuilt # library will want to link with cygwin, hence won't run standalone in DOS. if test "$enable_doscompile" = mingw; then skip_lblas_check=yes fi case "$CC" in cl* | */cl* | CL* | */CL* | icl* | */icl* | ICL* | */ICL*) SAVE_LIBS="$LIBS" AC_MSG_CHECKING([for BLAS in MKL]) LIBS="mkl_intel_c.lib mkl_sequential.lib mkl_core.lib $LIBS" AC_COIN_TRY_FLINK([daxpy], [AC_MSG_RESULT([yes]) use_blas='mkl_intel_c.lib mkl_sequential.lib mkl_core.lib' ADDLIBS="mkl_intel_c.lib mkl_sequential.lib mkl_core.lib $ADDLIBS"], [AC_MSG_RESULT([no]) LIBS="$SAVE_LIBS"]) ;; esac ;; esac if test -z "$use_blas" && test $skip_lblas_check = no; then SAVE_LIBS="$LIBS" AC_MSG_CHECKING([whether -lblas has BLAS]) LIBS="-lblas $LIBS" AC_COIN_TRY_FLINK([daxpy], [AC_MSG_RESULT([yes]) ADDLIBS="-lblas $ADDLIBS" use_blas='-lblas'], [AC_MSG_RESULT([no]) LIBS="$SAVE_LIBS"]) fi # If we have no other ideas, consider building BLAS. if test -z "$use_blas"; then if test "$PACKAGE_NAME" != ThirdPartyBlas; then if test -r $coin_blasobjdir/.MakeOk; then use_blas=BUILD fi fi fi fi if test "$use_blas" = BUILD; then coin_need_flibs=yes fi AM_CONDITIONAL([COIN_HAS_BLAS],[test x"$use_blas" != x]) AM_CONDITIONAL([COIN_BUILD_BLAS],[test "$use_blas" = BUILD]) if test x"$use_blas" = x || test "$use_blas" = no; then coin_has_blas=no else coin_has_blas=yes AC_DEFINE([COIN_HAS_BLAS],[1], [If defined, the BLAS Library is available.]) fi ]) # AC_COIN_HAS_BLAS ########################################################################### # COIN_HAS_LAPACK # ########################################################################### # This macro checks for a library containing the LAPACK library. It # tries standard libraries, and if none is found to be working, it # checks whether the LAPACK ThirdParty/Lapack directory has been # configured. It adds to ADDLIBS any flags required to link with an # externally provided LAPACK. It defines the makefile conditional and # preprocessor macro COIN_HAS_LAPACK, if lapack is available, and it # defines the makefile conditional COIN_BUILD_LAPACK, if lapack is # compiled within COIN. AC_DEFUN([AC_COIN_HAS_LAPACK], [coin_lapackobjdir=../ThirdParty/Lapack coin_lapacksrcdir=$srcdir/$coin_lapackobjdir AC_ARG_WITH([lapack], AC_HELP_STRING([--with-lapack], [specify LAPACK library (or BUILD for compilation)]), [use_lapack=$withval], [use_lapack=]) # Check if user supplied option makes sense if test x"$use_lapack" != x; then if test "$use_lapack" = "BUILD"; then # Don't check for course code if this is executed in ThirdParty/Lapack if test "$PACKAGE_NAME" != ThirdPartyLapack; then if test -r $coin_lapackobjdir/.MakeOk; then :; else AC_MSG_ERROR([option \"BUILD\" specified for LAPACK, but $coin_lapackobjdir directory is not configured]) fi fi elif test "$use_lapack" != no; then AC_MSG_CHECKING([whether user supplied LAPACKLIB=\"$use_lapack\" works]) LIBS="$use_lapack $LIBS" ADDLIBS="$use_lapack $ADDLIBS" AC_COIN_TRY_FLINK([dsyev], [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no]) AC_MSG_ERROR([user supplied LAPACK library \"$use_lapack\" does not work])]) fi else if test x$coin_has_blas = xyes; then # First try to see if LAPACK is already available with BLAS library AC_MSG_CHECKING([whether LAPACK is already available with BLAS library]) AC_COIN_TRY_FLINK([dsyev], [AC_MSG_RESULT([yes]); use_lapack=ok], [AC_MSG_RESULT([no])]) fi skip_llapack_check=no if test -z "$use_lapack"; then # Try to autodetect the library for lapack based on build system case $build in *-sgi-*) SAVE_LIBS="$LIBS" AC_MSG_CHECKING([whether -lcomplib.sgimath has LAPACK]) LIBS="-lcomplib.sgimath $LIBS" AC_COIN_TRY_FLINK([dsyev], [AC_MSG_RESULT([yes]) use_lapack=-lcomplib.sgimath; ADDLIBS="-lcomplib.sgimath $ADDLIBS"], [AC_MSG_RESULT([no]) SAVE_LIBS="$LIBS"]) ;; # See comments in COIN_HAS_BLAS. *-*-solaris*) SAVE_LIBS="$LIBS" AC_MSG_CHECKING([for LAPACK in libsunperf]) LIBS="-lsunperf $FLIBS $LIBS" AC_COIN_TRY_FLINK([dsyev], [AC_MSG_RESULT([yes]) use_blas='-lsunperf' ADDLIBS="-lsunperf $ADDLIBS" coin_need_flibs=yes], [AC_MSG_RESULT([no]) LIBS="$SAVE_LIBS"]) ;; # On cygwin, do this check only if doscompile is disabled. The prebuilt library # will want to link with cygwin, hence won't run standalone in DOS. *-cygwin*) if test "$enable_doscompile" = mingw; then skip_llapack_check=yes fi ;; esac fi if test -z "$use_lapack" && test $skip_llapack_check = no; then SAVE_LIBS="$LIBS" AC_MSG_CHECKING([whether -llapack has LAPACK]) LIBS="-llapack $LIBS" AC_COIN_TRY_FLINK([dsyev], [AC_MSG_RESULT([yes]) ADDLIBS="-llapack $ADDLIBS" use_lapack='-llapack'], [AC_MSG_RESULT([no]) LIBS="$SAVE_LIBS"]) fi # If we have no other ideas, consider building LAPACK. if test -z "$use_lapack"; then if test "$PACKAGE_NAME" != ThirdPartyLapack; then if test -r $coin_lapackobjdir/.MakeOk; then use_lapack=BUILD fi fi fi fi if test "$use_lapack" = BUILD; then coin_need_flibs=yes fi AM_CONDITIONAL([COIN_HAS_LAPACK],[test x"$use_lapack" != x]) AM_CONDITIONAL([COIN_BUILD_LAPACK],[test "$use_lapack" = BUILD]) if test x"$use_lapack" = x || test "$use_lapack" = no; then coin_has_lapack=no else coin_has_lapack=yes AC_DEFINE([COIN_HAS_LAPACK],[1], [If defined, the LAPACK Library is available.]) fi ]) # AC_COIN_HAS_LAPACK ########################################################################### # COIN_HAS_MUMPS # ########################################################################### # This macro checks for a library containing the MUMPS library. It # checks if the user has provided an argument for the MUMPS library, # and if not, it checks whether the MUMPS ThirdParty/Mumps directory has # been configured. It adds to ADDLIBS any flags required to link with # an externally provided MUMPS. It defines the makefile conditional # and preprocessor macro COIN_HAS_MUMPS, if MUMPS is available, and it # defines the makefile conditional COIN_BUILD_MUMPS, if MUMPS is # compiled within COIN. AC_DEFUN([AC_COIN_HAS_MUMPS], [ if test "$PACKAGE_NAME" = ThirdPartyMumps; then coin_mumpsobjdir=../Mumps else coin_mumpsobjdir=../ThirdParty/Mumps fi coin_mumpssrcdir=$abs_source_dir/$coin_mumpsobjdir/MUMPS MAKEOKFILE=.MakeOk #check if user provides a MUMPS library (that works) AC_LANG_PUSH(C) SAVE_ADDLIBS="$ADDLIBS" ADDLIBS="$ADDLIBS $FLIBS" AC_COIN_HAS_USER_LIBRARY(mumps, MUMPS, dmumps_c.h, dmumps_c) ADDLIBS="$SAVE_ADDLIBS" AC_LANG_POP(C) if test "$coin_has_mumps" = "true"; then # user provided mumps library use_mumps=yes coin_has_mumps=yes MUMPS_INCFLAGS="-I\`\$(CYGPATH_W) $MUMPSINCDIR\`" ADDLIBS="$MUMPSLIB $ADDLIBS" else # no user provided library, so we try to build our own use_mumps=BUILD # Check if the MUMPS' ThirdParty project has been configured if test "$PACKAGE_NAME" != ThirdPartyMumps; then if test -r $coin_mumpsobjdir/.MakeOk; then use_mumps=BUILD # Mumps needs pthreads AC_LANG_PUSH(C) save_LIBS="$LIBS" LIBS="$LIBS $FLIBS" AC_CHECK_LIB([pthread],[pthread_create],[LIBS="-lpthread $save_LIBS"; ADDLIBS="-lpthread $ADDLIBS"],[LIBS="save_LIBS"]) AC_LANG_POP(C) MUMPS_INCFLAGS="-I\`\$(CYGPATH_W) $coin_mumpssrcdir/libseq\` -I\`\$(CYGPATH_W) $coin_mumpssrcdir/include\`" else use_mumps= fi fi # if a user provided library is used, then COIN_HAS_USER_LIBRARY takes care of the COIN_HAS_MUMPS conditional and preprocessor symbol AM_CONDITIONAL([COIN_HAS_MUMPS],[test x"$use_mumps" != x]) if test x"$use_mumps" != x; then AC_DEFINE([COIN_HAS_MUMPS],[1],[If defined, the MUMPS Library is available.]) coin_has_mumps=yes else coin_has_mumps=no fi AC_MSG_CHECKING([whether MUMPS is available]) AC_MSG_RESULT([$coin_has_mumps]) fi if test x"$use_mumps" != x; then # we need the Fortran runtime libraries if we want to link with C/C++ coin_need_flibs=yes AC_SUBST(MUMPS_INCFLAGS) fi AM_CONDITIONAL([COIN_BUILD_MUMPS],[test "$use_mumps" = BUILD]) ]) # AC_COIN_HAS_MUMPS ########################################################################### # COIN_HAS_METIS # ########################################################################### # This macro checks for a library containing the METIS library. It # checks if the user has provided an argument for the METIS library, # and if not, it checks whether the METIS ThirdParty/Metis directory has # been configured. It adds to ADDLIBS any flags required to link with # an externally provided METIS. It defines the makefile conditional # and preprocessor macro COIN_HAS_METIS, if METIS is available, and it # defines the makefile conditional COIN_BUILD_METIS, if METIS is # compiled within COIN. AC_DEFUN([AC_COIN_HAS_METIS], [ case "$PACKAGE_NAME" in ThirdParty*) coin_metisobjdir=../Metis ;; *) coin_metisobjdir=../ThirdParty/Metis ;; esac MAKEOKFILE=.MakeOk #check if user provides a METIS library (that works) AC_LANG_PUSH(C) AC_ARG_WITH(metis, AS_HELP_STRING([--with-metis], [specify flags to link with METIS library]), [METISLIB="$withval"; coin_has_metis=true], [coin_has_metis=no]) if test $coin_has_metis = true; then coin_save_LIBS="$LIBS" LIBS="$METISLIB $ADDLIBS" AC_MSG_CHECKING([whether symbol metis_nodend is available with ]) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[metis_nodend()]])], [AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no) AC_MSG_ERROR([User-supplied METIS library does not work])]) LIBS="$coin_save_LIBS" fi AC_LANG_POP(C) if test "$coin_has_metis" = "true"; then # user provided metis library use_metis=yes coin_has_metis=yes ADDLIBS="$METISLIB $ADDLIBS" else # no user provided library, so we try to build our own use_metis=BUILD # Check if the METIS' ThirdParty project has been configured if test "$PACKAGE_NAME" != ThirdPartyMetis; then if test -r $coin_metisobjdir/.MakeOk; then use_metis=BUILD else use_metis= fi fi if test x"$use_metis" != x; then coin_has_metis=yes else coin_has_metis=no fi AC_MSG_CHECKING([whether METIS is available]) AC_MSG_RESULT([$coin_has_metis]) fi AM_CONDITIONAL([COIN_HAS_METIS],[test $coin_has_metis = yes]) if test $coin_has_metis = yes; then AC_DEFINE([COIN_HAS_METIS],[1],[If defined, the METIS library is available.]) fi ]) # AC_COIN_HAS_METIS ########################################################################### # COIN_HAS_GLPK # ########################################################################### # # This macro checks for the GLPK package. GLPK provides two capabilities, # an LP and MIP solver (GLPK) and the GNU Mathprog modelling language (GMPL). # The macro checks for either Glpk or Gmpl, according to the value specified as # the parameter. Use one of Glpk or Gmpl. Use *exactly* these strings, eh? # # # The macro first uses COIN_HAS_USER_LIBRARY to see if the user has specified # a preexisting library (this allows the use of any glpk version, if the user # is fussy). The macro then checks for ThirdParty/Glpk. # # This macro will define the following variables for Glpk: # coin_has_glpk true or false # GLPKLIB link flags for GLPK (if user supplied) # GLPKINCDIR location of glpk include files # COIN_HAS_GLPK Preprocessor symbol, defined to 1 # COIN_HAS_GLPK Automake conditional # COIN_BUILD_GLPK Automake conditional, defined only if Glpk is to be # built in ThirdParty/Glpk # # With the exception of COIN_BUILD_GLPK, an identical set of variables is # defined for Gmpl. AC_DEFUN([AC_COIN_HAS_GLPK], [ if test "$PACKAGE_NAME" = ThirdPartyGlpk; then coin_glpkobjdir=../Glpk else coin_glpkobjdir=../ThirdParty/Glpk fi coin_glpksrcdir=$abs_source_dir/$coin_glpkobjdir use_thirdpartyglpk=no # Check for the requested component. If the user specified an external glpk # library don't force a ThirdParty build, let the error propagate. m4_if([$1],[Glpk], [AC_COIN_HAS_USER_LIBRARY([Glpk],[GLPK],[glpk.h], [_glp_lpx_simplex glp_lpx_simplex]) if test x"$coin_has_glpk" = xfalse && test x"$GLPKLIB" = x ; then use_thirdpartyglpk=try fi]) m4_if([$1],[Gmpl], [AC_COIN_HAS_USER_LIBRARY([Gmpl],[GMPL],[glpmpl.h], [_glp_mpl_initialize glp_mpl_initialize]) if test x"$coin_has_gmpl" = xfalse && test x"$GMPLLIB" = x ; then use_thirdpartyglpk=try fi]) # If the user has supplied an external library, use it. Otherwise, consider # a build in ThirdParty/Glpk. If we build, assume we get both glpk and gmpl. if test x"$use_thirdpartyglpk" = xtry ; then MAKEOKFILE=.MakeOk # Check if the Glpk's ThirdParty project has been configured if test "$PACKAGE_NAME" != ThirdPartyGlpk; then if test -r $coin_glpkobjdir/.MakeOk; then use_thirdpartyglpk=build else use_thirdpartyglpk=no fi else use_thirdpartyglpk=build fi # If we're building, set the library and include directory variables, create a # preprocessor symbol, define a variable that says we're using glpk/gmpl, and # another to indicate a link check is a bad idea (hard to do before the library # exists). if test x"$use_thirdpartyglpk" = xbuild ; then m4_toupper($1INCDIR)="$coin_glpksrcdir/glpk/include" AC_SUBST(m4_toupper($1INCDIR)) AC_DEFINE(m4_toupper(COIN_HAS_$1),[1], [Define to 1 if $1 package is available]) m4_tolower(coin_has_$1)=true m4_tolower($1_libcheck)=no m4_toupper($1OBJDIR)=`cd $coin_glpkobjdir; pwd` AC_SUBST(m4_toupper($1OBJDIR)) AC_MSG_NOTICE([Using $1 in ThirdParty/Glpk]) fi fi # Define the necessary automake conditionals. AM_CONDITIONAL(m4_toupper(COIN_HAS_$1), [test x"$m4_tolower(coin_has_$1)" = xtrue]) AM_CONDITIONAL([COIN_BUILD_GLPK],[test x"$use_thirdpartyglpk" = xbuild]) ]) # AC_COIN_HAS_GLPK DyLP-1.6.0/BuildTools/config.guess0000755000076700007670000012706310637360143013700 0ustar #! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, # Inc. timestamp='2007-05-17' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:SunOS:5.*:* | ix86xen:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[45]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) case ${UNAME_MACHINE} in pc98) echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:[3456]*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; EM64T | authenticamd) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo crisv32-axis-linux-gnu exit ;; frv:Linux:*:*) echo frv-unknown-linux-gnu exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo or32-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit ;; xtensa:Linux:*:*) echo xtensa-unknown-linux-gnu exit ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) LIBC=gnu #else LIBC=gnuaout #endif #endif #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^LIBC/{ s: ::g p }'`" test x"${LIBC}" != x && { echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit } test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: DyLP-1.6.0/BuildTools/commit_new_release0000755000076700007670000000704211174364676015155 0ustar #!/bin/sh # Copyright (C) 2007 International Business Machines. # All Rights Reserved. # This file is distributed under the Common Public License. # It is part of the BuildTools project in COIN-OR (www.coin-or.org) # ## $Id: commit_new_release 1272 2009-04-24 16:33:02Z andreasw $ # # Author: Andreas Waechter IBM 2007-06-21 # Modified by: Lou Hafer SFU 2008-04-17 #set -x -v set -e # Remember what was done during release generation. if test -r .new_release_data; then . .new_release_data else echo '' echo 'Error: You need to run prepare_new_release first.' echo '' exit -1; fi # Commit the release to stable so we can do a repository-side copy to create # the release. echo '' echo '===> Temporarily committing changed version of stable...' echo '' rev_num_before=`svn info . | grep -E '^Revision:' | sed -e 's|Revision: ||'` echo "Revision number before commit: $rev_num_before" cmd="svn ci -m \"temporarily committing release candidate to stable\"" echo $cmd eval $cmd # Update to confirm the commit. Avoid pulling in externals --- if we're doing # circular dependencies, they may not exist. As it stands, the main purpose of # this call is to allow us to easily obtain the current revision. It might be # useful to strengthen this and check that the value is what we're expecting # --- one greater than the revision before commit. `--ignore-externals' could # be made provisional on the existence of circular dependency by passing a # boolean through .new_release_data. This would strengthen the update, in that # the update would confirm existence of the externals. cmd='svn update --ignore-externals' echo $cmd eval $cmd rev_num=`svn info . | grep -E '^Revision:' | sed -e 's|Revision: ||'` echo "Current revision number is: $rev_num" # Create the release with a repository-side copy. echo '' echo "===> Creating new release $new_ver from stable $stableBranch (rev $rev_num)..." echo '' cmd="svn copy -m \"creating releases/$new_ver from stable/$stableBranch (rev $rev_num)\" $stableURL $releaseURL" echo $cmd eval $cmd # And restore the stable branch to it's original condition. Start by reverting # to the original externals. if test -r Externals; then echo '' echo '===> Restoring original externals...' echo '' mv Externals.bak Externals svn pset svn:externals -F Externals . fi # Revert the package id in configure.ac and propagate with run_autotools. Note # that this does not exclude configure.ac for externals in the normal place. # But since changes to externals are not swept up by the commit, it doesn't # matter. On the other hand, if this whole checkout is a temporary for the # purpose of release generation, I'm not entirely convinced we need to bother # to exclude configure.ac in the actual ThirdParty code base. Comments from # ThirdParty maintainers welcome. conf_ac_files=`find . -name 'configure.ac' | grep -v -E 'ThirdParty/.*/.*/configure.ac'` echo '' echo "===> Restoring version number (${stableBranch}stable) in configure.ac files" for i in $conf_ac_files; do sed -e "s|AC_INIT\(.*\)\[[0-9\.]*\],\(.*\)|AC_INIT\1[${stableBranch}stable],\2|" $i > bla mv bla $i svn di $i done echo '' echo '===> Running the autotools' echo '' curdir=`pwd` cd $buildBase BuildTools/run_autotools cd "$curdir" # Commit the restored stable branch. echo '' echo '===> Committing restored stable...' echo '' cmd="svn ci -m \"restoring stable/$stableBranch\"" echo $cmd eval $cmd echo '' echo "Done, new release $releaseURL created" echo '' echo "You can now delete the directory $buildBase including subdirectories" rm .new_release_data DyLP-1.6.0/BuildTools/Makemain.inc0000644000076700007670000000432710750163026013567 0ustar # Copyright (C) 2006, 2007 International Business Machines and others. # All Rights Reserved. # This file is distributed under the Common Public License. ## $Id: Makemain.inc 927 2008-01-30 21:03:18Z andreasw $ # Author: Andreas Waechter IBM 2006-04-13 ######################################################################## # Documentation installation # ######################################################################## DocFiles = README AUTHORS LICENSE DocInstallDir = $(prefix)/share/doc/coin/$(PACKAGE_NAME) install-doc: $(DocFiles) test -z "$(DocInstallDir)" || $(mkdir_p) "$(DESTDIR)$(DocInstallDir)" for file in $(DocFiles); do \ if test -f "$$file"; then dir=; else dir="$(srcdir)/"; fi; \ if test -f "$$dir$$file"; then $(INSTALL_DATA) "$$dir$$file" "$(DESTDIR)$(DocInstallDir)/$$file"; fi; \ done uninstall-doc: for file in $(DocFiles); do \ rm -f "$(DESTDIR)$(DocInstallDir)/$$file"; \ done ######################################################################## # Maintainer Stuff # ######################################################################## if MAINTAINER_MODE # Make sure acinclude is using most recent coin.m4 $(srcdir)/acinclude.m4: $(BUILDTOOLSDIR)/coin.m4 cat $(LIBTOOLM4) $< > $@ # Make sure the autotools scripts are up to date $(AUX_DIR)/install-sh: $(BUILDTOOLSDIR)/install-sh cp $< $@ $(AUX_DIR)/missing: $(BUILDTOOLSDIR)/missing cp $< $@ $(AUX_DIR)/config.guess: $(BUILDTOOLSDIR)/config.guess cp $< $@ $(AUX_DIR)/config.sub: $(BUILDTOOLSDIR)/config.sub cp $< $@ $(AUX_DIR)/depcomp: $(BUILDTOOLSDIR)/depcomp cp $< $@ $(AUX_DIR)/ltmain.sh: $(BUILDTOOLSDIR)/ltmain.sh cp $< $@ # Take care of updating externals (if Externals file exists) if HAVE_EXTERNALS $(top_builddir)/Makefile: .Externals-stamp .Externals-stamp: $(srcdir)/Externals cd $(srcdir); svn propset svn:externals -F Externals . touch .Externals-stamp update-externals: .Externals-stamp cd $(srcdir); svn update endif endif if HAVE_EXTERNALS EXTRA_DIST += Externals DISTCLEANFILES += .Externals-stamp endif DISTCLEANFILES += $(VPATH_DISTCLEANFILES) .PHONY: install-doc uninstall-doc update-externals DyLP-1.6.0/BuildTools/headers/0000755000076700007670000000000011414302701012750 5ustar DyLP-1.6.0/BuildTools/headers/configall_system_msc.h0000644000076700007670000001110411150051502017317 0ustar /* This is the header file for the Microsoft compiler, defining all * system and compiler dependent configuration macros */ /* Define to 64bit integer types */ #if _MSC_VER==1200 #define COIN_INT64_T __int64 #define COIN_UINT64_T __uint64 #else #define COIN_INT64_T long long #define COIN_UINT64_T unsigned long long #endif /* Define to integer type capturing pointer */ #define COIN_INTPTR_T long /* Define to dummy `main' function (if any) required to link to the Fortran libraries. */ /* #undef F77_DUMMY_MAIN */ #ifndef COIN_USE_F2C /* Define to a macro mangling the given C identifier (in lower and upper case), which must not contain underscores, for linking with Fortran. */ # define F77_FUNC(name,NAME) NAME /* As F77_FUNC, but for C identifiers containing underscores. */ # define F77_FUNC_(name,NAME) NAME #else /* Define to a macro mangling the given C identifier (in lower and upper case), which must not contain underscores, for linking with Fortran. */ # define F77_FUNC(name,NAME) name ## _ /* As F77_FUNC, but for C identifiers containing underscores. */ # define F77_FUNC_(name,NAME) name ## __ #endif /* Define if F77 and FC dummy `main' functions are identical. */ /* #undef FC_DUMMY_MAIN_EQ_F77 */ /* Define to the C type corresponding to Fortran INTEGER */ #define FORTRAN_INTEGER_TYPE int /* Define to 1 if you have the header file. */ /* #undef HAVE_ASSERT_H */ /* Define to 1 if you have the header file. */ #define HAVE_CASSERT 1 /* Define to 1 if you have the header file. */ #define HAVE_CCTYPE 1 /* Define to 1 if you have the header file. */ #define HAVE_CFLOAT 1 /* Define to 1 if you have the header file. */ /* #undef HAVE_CIEEEFP */ /* Define to 1 if you have the header file. */ #define HAVE_CMATH 1 /* Define to 1 if you have the header file. */ #define HAVE_CSTDARG 1 /* Define to 1 if you have the header file. */ #define HAVE_CSTDIO 1 /* Define to 1 if you have the header file. */ #define HAVE_CSTDLIB 1 /* Define to 1 if you have the header file. */ #define HAVE_CSTRING 1 /* Define to 1 if you have the header file. */ #define HAVE_CTIME 1 /* Define to 1 if you have the header file. */ /* #undef HAVE_CTYPE_H */ /* Define to 1 if you have the header file. */ /* #undef HAVE_DLFCN_H */ /* Define to 1 if function drand48 is available */ /* #undef HAVE_DRAND48 */ /* Define to 1 if you have the header file. */ /* #undef HAVE_FLOAT_H */ /* Define to 1 if you have the header file. */ /* #undef HAVE_IEEEFP_H */ /* Define to 1 if you have the header file. */ /* #define HAVE_INTTYPES_H */ /* Define to 1 if you have the header file. */ /* #undef HAVE_MATH_H */ /* Define to 1 if you have the header file. */ #define HAVE_MEMORY_H 1 /* Define to 1 if function rand is available */ #define HAVE_RAND 1 /* Define to 1 if you have the header file. */ /* #undef HAVE_STDARG_H */ /* Define to 1 if you have the header file. */ /* #undef HAVE_STDINT_H */ /* Define to 1 if you have the header file. */ /* #undef HAVE_STDIO_H */ /* Define to 1 if you have the header file. */ #define HAVE_STDLIB_H 1 /* Define to 1 if function std::rand is available */ #define HAVE_STD__RAND 1 /* Define to 1 if you have the header file. */ /* #define HAVE_STRINGS_H */ /* Define to 1 if you have the header file. */ #define HAVE_STRING_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_STAT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_TYPES_H 1 /* Define to 1 if you have the header file. */ /* #undef HAVE_TIME_H */ /* Define to 1 if you have the header file. */ /* #define HAVE_UNISTD_H */ /* Define to 1 if va_copy is avaliable */ /* #undef HAVE_VA_COPY */ /* Define to 1 if you have the header file. */ /* #undef HAVE_WINDOWS_H */ /* Define to 1 if you have the `_snprintf' function. */ #define HAVE__SNPRINTF 1 /* Define to be the name of C-function for Inf check */ #define MY_C_FINITE _finite /* Define to be the name of C-function for NaN check */ #define MY_C_ISNAN _isnan /* The size of a `double', as computed by sizeof. */ #define SIZEOF_DOUBLE 8 /* The size of a `int', as computed by sizeof. */ #define SIZEOF_INT 4 /* The size of a `int *', as computed by sizeof. */ #define SIZEOF_INT_P 4 /* The size of a `long', as computed by sizeof. */ #define SIZEOF_LONG 4 /* Define to 1 if you have the ANSI C header files. */ #define STDC_HEADERS 1 DyLP-1.6.0/BuildTools/headers/configall_system.h0000644000076700007670000000072411150051502016463 0ustar /* * This header file is included by the *Config.h in the individual * COIN packages when the code is compiled in a setting that doesn't * use the configure script (i.e., HAVE_CONFIG_H is not defined). * This header file includes the system and compile dependent header * file defining macros that depend on what compiler is used. */ #ifdef _MSC_VER # include "configall_system_msc.h" #else # error "Trying to use configall_system for unknown compiler." #endif DyLP-1.6.0/doxydoc/0000755000076700007670000000000011414302700010725 5ustar DyLP-1.6.0/doxydoc/doxygen.conf0000644000076700007670000006672510442173473013306 0ustar # Doxyfile 1.2.2 # This file describes the settings to be used by doxygen for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # General configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = doxydoc # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Dutch, French, Italian, Czech, Swedish, German, Finnish, Japanese, # Korean, Hungarian, Spanish, Romanian, Russian, Croatian, Polish, and # Portuguese. OUTPUT_LANGUAGE = English # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = YES # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these class will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = YES # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. It is allowed to use relative paths in the argument list. STRIP_FROM_PATH = "*/COIN/" # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a class diagram (in Html and LaTeX) for classes with base or # super classes. Setting the tag to NO turns the diagrams off. CLASS_DIAGRAMS = YES # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower case letters. If set to YES upper case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # users are adviced to set this option to NO. CASE_SENSE_NAMES = NO # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the JAVADOC_AUTOBRIEF tag is set to YES (the default) then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the Javadoc-style will # behave just like the Qt-style comments. JAVADOC_AUTOBRIEF = YES # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # reimplements. INHERIT_DOCS = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. #### MAYBE ### SORT_MEMBER_DOCS = NO # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = YES # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # The ENABLE_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. WARN_FORMAT = "$file:$line: $text" #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = . # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. FILE_PATTERNS = *.hpp *.h # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. EXCLUDE_PATTERNS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. INPUT_FILTER = #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 3 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = YES # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = letter # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimised for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using a WORD or other. # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assigments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. Warning: This feature # is still experimental and very incomplete. GENERATE_XML = NO #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = YES # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_PREDEFINED tags. EXPAND_ONLY_PREDEF = YES # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. PREDEFINED = COIN_HAS_DYLP # If the MACRO_EXPANSION and EXPAND_PREDEF_ONLY tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = ODSI #--------------------------------------------------------------------------- # Configuration::addtions related to external references #--------------------------------------------------------------------------- # The TAGFILES tag can be used to specify one or more tagfiles. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the ENABLE_PREPROCESSING, INCLUDE_GRAPH, and HAVE_DOT tags are set to # YES then doxygen will generate a graph for each documented file showing # the direct and indirect include dependencies of the file with other # documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, INCLUDED_BY_GRAPH, and HAVE_DOT tags are set to # YES then doxygen will generate a graph for each documented header file showing # the documented files that directly or indirectly include this file INCLUDED_BY_GRAPH = YES # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found on the path. DOT_PATH = # The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_WIDTH = 1024 # The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_HEIGHT = 1024 #--------------------------------------------------------------------------- # Configuration::addtions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO # The CGI_NAME tag should be the name of the CGI script that # starts the search engine (doxysearch) with the correct parameters. # A script with this name will be generated by doxygen. CGI_NAME = search.cgi # The CGI_URL tag should be the absolute URL to the directory where the # cgi binaries are located. See the documentation of your http daemon for # details. CGI_URL = # The DOC_URL tag should be the absolute URL to the directory where the # documentation is located. If left blank the absolute path to the # documentation, with file:// prepended to it, will be used. DOC_URL = # The DOC_ABSPATH tag should be the absolute path to the directory where the # documentation is located. If left blank the directory on the local machine # will be used. DOC_ABSPATH = # The BIN_ABSPATH tag must point to the directory where the doxysearch binary # is installed. BIN_ABSPATH = /usr/bin/ # The EXT_DOC_PATHS tag can be used to specify one or more paths to # documentation generated for other projects. This allows doxysearch to search # the documentation for these projects as well. EXT_DOC_PATHS = DyLP-1.6.0/install-sh0000755000076700007670000002202110442173473011272 0ustar #!/bin/sh # install - install a program, script, or datafile scriptversion=2005-05-14.22 # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" chmodcmd="$chmodprog 0755" chowncmd= chgrpcmd= stripcmd= rmcmd="$rmprog -f" mvcmd="$mvprog" src= dst= dir_arg= dstarg= no_target_directory= usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: -c (ignored) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. --help display this help and exit. --version display version info and exit. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test -n "$1"; do case $1 in -c) shift continue;; -d) dir_arg=true shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; --help) echo "$usage"; exit $?;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -s) stripcmd=$stripprog shift continue;; -t) dstarg=$2 shift shift continue;; -T) no_target_directory=true shift continue;; --version) echo "$0 $scriptversion"; exit $?;; *) # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. test -n "$dir_arg$dstarg" && break # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dstarg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dstarg" shift # fnord fi shift # arg dstarg=$arg done break;; esac done if test -z "$1"; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi for src do # Protect names starting with `-'. case $src in -*) src=./$src ;; esac if test -n "$dir_arg"; then dst=$src src= if test -d "$dst"; then mkdircmd=: chmodcmd= else mkdircmd=$mkdirprog fi else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dstarg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dstarg # Protect names starting with `-'. case $dst in -*) dst=./$dst ;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dstarg: Is a directory" >&2 exit 1 fi dst=$dst/`basename "$src"` fi fi # This sed command emulates the dirname command. dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'` # Make sure that the destination directory exists. # Skip lots of stat calls in the usual case. if test ! -d "$dstdir"; then defaultIFS=' ' IFS="${IFS-$defaultIFS}" oIFS=$IFS # Some sh's can't handle IFS=/ for some reason. IFS='%' set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` shift IFS=$oIFS pathcomp= while test $# -ne 0 ; do pathcomp=$pathcomp$1 shift if test ! -d "$pathcomp"; then $mkdirprog "$pathcomp" # mkdir can fail with a `File exist' error in case several # install-sh are creating the directory concurrently. This # is OK. test -d "$pathcomp" || exit fi pathcomp=$pathcomp/ done fi if test -n "$dir_arg"; then $doit $mkdircmd "$dst" \ && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } else dstfile=`basename "$dst"` # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 trap '(exit $?); exit' 1 2 13 15 # Copy the file name to the temp name. $doit $cpprog "$src" "$dsttmp" && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && # Now rename the file to the real destination. { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \ || { # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { if test -f "$dstdir/$dstfile"; then $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ || { echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 (exit 1); exit 1 } else : fi } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" } } fi || { (exit 1); exit 1; } done # The final little trick to "correctly" pass the exit status to the exit trap. { (exit 0); exit 0 } # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: DyLP-1.6.0/configure0000755000076700007670000265543211414231451011210 0ustar #! /bin/sh # From configure.ac 0.9. # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.59 for DyLP 1.6.0. # # Report bugs to . # # Copyright (C) 2003 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. # # # Copyright 2006 International Business Machines and others. # All Rights Reserved. # This file is part of the open source package Coin which is distributed # under the Common Public License. ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH # Check that we are running under the correct shell. SHELL=${CONFIG_SHELL-/bin/sh} case X$ECHO in X*--fallback-echo) # Remove one level of quotation (which was required for Make). ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','` ;; esac echo=${ECHO-echo} if test "X$1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X$1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then # Yippee, $echo works! : else # Restart under the correct shell. exec $SHELL "$0" --no-reexec ${1+"$@"} fi if test "X$1" = X--fallback-echo; then # used as fallback echo shift cat </dev/null 2>&1 && unset CDPATH if test -z "$ECHO"; then if test "X${echo_test_string+set}" != Xset; then # find a string as large as possible, as long as the shell can cope with it for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... if (echo_test_string=`eval $cmd`) 2>/dev/null && echo_test_string=`eval $cmd` && (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null then break fi done fi if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then : else # The Solaris, AIX, and Digital Unix default echo programs unquote # backslashes. This makes it impossible to quote backslashes using # echo "$something" | sed 's/\\/\\\\/g' # # So, first we look for a working echo in the user's PATH. lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for dir in $PATH /usr/ucb; do IFS="$lt_save_ifs" if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then echo="$dir/echo" break fi done IFS="$lt_save_ifs" if test "X$echo" = Xecho; then # We didn't find a better echo, so look for alternatives. if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # This shell has a builtin print -r that does the trick. echo='print -r' elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && test "X$CONFIG_SHELL" != X/bin/ksh; then # If we have ksh, try running configure again with it. ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} export ORIGINAL_CONFIG_SHELL CONFIG_SHELL=/bin/ksh export CONFIG_SHELL exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} else # Try using printf. echo='printf %s\n' if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # Cool, printf works : elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL export CONFIG_SHELL SHELL="$CONFIG_SHELL" export SHELL echo="$CONFIG_SHELL $0 --fallback-echo" elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then echo="$CONFIG_SHELL $0 --fallback-echo" else # maybe with a smaller string... prev=: for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null then break fi prev="$cmd" done if test "$prev" != 'sed 50q "$0"'; then echo_test_string=`eval $prev` export echo_test_string exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} else # Oops. We lost completely, so just stick with echo. echo=echo fi fi fi fi fi fi # Copy echo and quote the copy suitably for passing to libtool from # the Makefile, instead of quoting the original, which is used later. ECHO=$echo if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" fi tagnames=${tagnames+${tagnames},}CXX tagnames=${tagnames+${tagnames},}F77 # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` exec 6>&1 # # Initializations. # ac_default_prefix=/usr/local ac_config_libobj_dir=. cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Maximum number of lines to put in a shell here document. # This variable seems obsolete. It should probably be removed, and # only ac_max_sed_lines should be used. : ${ac_max_here_lines=38} # Identity of this package. PACKAGE_NAME='DyLP' PACKAGE_TARNAME='dylp' PACKAGE_VERSION='1.6.0' PACKAGE_STRING='DyLP 1.6.0' PACKAGE_BUGREPORT='coin-dylp@lists.coin-or.org' ac_unique_file="configure.ac" ac_default_prefix=`pwd` # Factoring default headers for most tests. ac_includes_default="\ #include #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_STAT_H # include #endif #if STDC_HEADERS # include # include #else # if HAVE_STDLIB_H # include # endif #endif #if HAVE_STRING_H # if !STDC_HEADERS && HAVE_MEMORY_H # include # endif # include #endif #if HAVE_STRINGS_H # include #endif #if HAVE_INTTYPES_H # include #else # if HAVE_STDINT_H # include # endif #endif #if HAVE_UNISTD_H # include #endif" ac_subdirs_all="$ac_subdirs_all DyLP" ac_subdirs_all="$ac_subdirs_all CoinUtils" ac_subdirs_all="$ac_subdirs_all Osi" ac_subdirs_all="$ac_subdirs_all Data/Netlib" ac_subdirs_all="$ac_subdirs_all Data/Sample" ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os CDEFS ADD_CFLAGS DBG_CFLAGS OPT_CFLAGS sol_cc_compiler CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT MPICC CXXDEFS ADD_CXXFLAGS DBG_CXXFLAGS OPT_CXXFLAGS CXX CXXFLAGS ac_ct_CXX MPICXX ADD_FFLAGS DBG_FFLAGS OPT_FFLAGS F77 FFLAGS ac_ct_F77 MPIF77 EGREP INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT LIBTOOLM4 have_autoconf have_automake have_svn BUILDTOOLSDIR AUX_DIR abs_source_dir abs_lib_dir abs_include_dir abs_bin_dir HAVE_EXTERNALS_TRUE HAVE_EXTERNALS_FALSE host host_cpu host_vendor host_os LN_S ECHO AR ac_ct_AR RANLIB ac_ct_RANLIB CPP CXXCPP LIBTOOL ac_c_preproc_warn_flag ac_cxx_preproc_warn_flag RPATH_FLAGS LT_LDFLAGS COIN_SKIP_PROJECTS subdirs LIBEXT VPATH_DISTCLEANFILES LIBOBJS LTLIBOBJS' ac_subst_files='' # Initialize some variables set by options. ac_init_help= ac_init_version=false # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datadir='${prefix}/share' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' infodir='${prefix}/info' mandir='${prefix}/man' ac_prev= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval "$ac_prev=\$ac_option" ac_prev= continue fi ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_option in -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad | --data | --dat | --da) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ | --da=*) datadir=$ac_optarg ;; -disable-* | --disable-*) ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` eval "enable_$ac_feature=no" ;; -enable-* | --enable-*) ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "enable_$ac_feature='$ac_optarg'" ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst \ | --locals | --local | --loca | --loc | --lo) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* \ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package| sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "with_$ac_package='$ac_optarg'" ;; -without-* | --without-*) ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/-/_/g'` eval "with_$ac_package=no" ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) { echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` eval "$ac_envvar='$ac_optarg'" export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` { echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi # Be sure to have absolute paths. for ac_var in exec_prefix prefix do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* | NONE | '' ) ;; *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac done # Be sure to have absolute paths. for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ localstatedir libdir includedir oldincludedir infodir mandir do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* ) ;; *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then its parent. ac_confdir=`(dirname "$0") 2>/dev/null || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$0" : 'X\(//\)[^/]' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$0" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` srcdir=$ac_confdir if test ! -r $srcdir/$ac_unique_file; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r $srcdir/$ac_unique_file; then if test "$ac_srcdir_defaulted" = yes; then { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 { (exit 1); exit 1; }; } else { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi fi (cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 { (exit 1); exit 1; }; } srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` ac_env_build_alias_set=${build_alias+set} ac_env_build_alias_value=$build_alias ac_cv_env_build_alias_set=${build_alias+set} ac_cv_env_build_alias_value=$build_alias ac_env_host_alias_set=${host_alias+set} ac_env_host_alias_value=$host_alias ac_cv_env_host_alias_set=${host_alias+set} ac_cv_env_host_alias_value=$host_alias ac_env_target_alias_set=${target_alias+set} ac_env_target_alias_value=$target_alias ac_cv_env_target_alias_set=${target_alias+set} ac_cv_env_target_alias_value=$target_alias ac_env_CDEFS_set=${CDEFS+set} ac_env_CDEFS_value=$CDEFS ac_cv_env_CDEFS_set=${CDEFS+set} ac_cv_env_CDEFS_value=$CDEFS ac_env_ADD_CFLAGS_set=${ADD_CFLAGS+set} ac_env_ADD_CFLAGS_value=$ADD_CFLAGS ac_cv_env_ADD_CFLAGS_set=${ADD_CFLAGS+set} ac_cv_env_ADD_CFLAGS_value=$ADD_CFLAGS ac_env_DBG_CFLAGS_set=${DBG_CFLAGS+set} ac_env_DBG_CFLAGS_value=$DBG_CFLAGS ac_cv_env_DBG_CFLAGS_set=${DBG_CFLAGS+set} ac_cv_env_DBG_CFLAGS_value=$DBG_CFLAGS ac_env_OPT_CFLAGS_set=${OPT_CFLAGS+set} ac_env_OPT_CFLAGS_value=$OPT_CFLAGS ac_cv_env_OPT_CFLAGS_set=${OPT_CFLAGS+set} ac_cv_env_OPT_CFLAGS_value=$OPT_CFLAGS ac_env_CC_set=${CC+set} ac_env_CC_value=$CC ac_cv_env_CC_set=${CC+set} ac_cv_env_CC_value=$CC ac_env_CFLAGS_set=${CFLAGS+set} ac_env_CFLAGS_value=$CFLAGS ac_cv_env_CFLAGS_set=${CFLAGS+set} ac_cv_env_CFLAGS_value=$CFLAGS ac_env_LDFLAGS_set=${LDFLAGS+set} ac_env_LDFLAGS_value=$LDFLAGS ac_cv_env_LDFLAGS_set=${LDFLAGS+set} ac_cv_env_LDFLAGS_value=$LDFLAGS ac_env_CPPFLAGS_set=${CPPFLAGS+set} ac_env_CPPFLAGS_value=$CPPFLAGS ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} ac_cv_env_CPPFLAGS_value=$CPPFLAGS ac_env_MPICC_set=${MPICC+set} ac_env_MPICC_value=$MPICC ac_cv_env_MPICC_set=${MPICC+set} ac_cv_env_MPICC_value=$MPICC ac_env_CXXDEFS_set=${CXXDEFS+set} ac_env_CXXDEFS_value=$CXXDEFS ac_cv_env_CXXDEFS_set=${CXXDEFS+set} ac_cv_env_CXXDEFS_value=$CXXDEFS ac_env_ADD_CXXFLAGS_set=${ADD_CXXFLAGS+set} ac_env_ADD_CXXFLAGS_value=$ADD_CXXFLAGS ac_cv_env_ADD_CXXFLAGS_set=${ADD_CXXFLAGS+set} ac_cv_env_ADD_CXXFLAGS_value=$ADD_CXXFLAGS ac_env_DBG_CXXFLAGS_set=${DBG_CXXFLAGS+set} ac_env_DBG_CXXFLAGS_value=$DBG_CXXFLAGS ac_cv_env_DBG_CXXFLAGS_set=${DBG_CXXFLAGS+set} ac_cv_env_DBG_CXXFLAGS_value=$DBG_CXXFLAGS ac_env_OPT_CXXFLAGS_set=${OPT_CXXFLAGS+set} ac_env_OPT_CXXFLAGS_value=$OPT_CXXFLAGS ac_cv_env_OPT_CXXFLAGS_set=${OPT_CXXFLAGS+set} ac_cv_env_OPT_CXXFLAGS_value=$OPT_CXXFLAGS ac_env_CXX_set=${CXX+set} ac_env_CXX_value=$CXX ac_cv_env_CXX_set=${CXX+set} ac_cv_env_CXX_value=$CXX ac_env_CXXFLAGS_set=${CXXFLAGS+set} ac_env_CXXFLAGS_value=$CXXFLAGS ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set} ac_cv_env_CXXFLAGS_value=$CXXFLAGS ac_env_MPICXX_set=${MPICXX+set} ac_env_MPICXX_value=$MPICXX ac_cv_env_MPICXX_set=${MPICXX+set} ac_cv_env_MPICXX_value=$MPICXX ac_env_ADD_FFLAGS_set=${ADD_FFLAGS+set} ac_env_ADD_FFLAGS_value=$ADD_FFLAGS ac_cv_env_ADD_FFLAGS_set=${ADD_FFLAGS+set} ac_cv_env_ADD_FFLAGS_value=$ADD_FFLAGS ac_env_DBG_FFLAGS_set=${DBG_FFLAGS+set} ac_env_DBG_FFLAGS_value=$DBG_FFLAGS ac_cv_env_DBG_FFLAGS_set=${DBG_FFLAGS+set} ac_cv_env_DBG_FFLAGS_value=$DBG_FFLAGS ac_env_OPT_FFLAGS_set=${OPT_FFLAGS+set} ac_env_OPT_FFLAGS_value=$OPT_FFLAGS ac_cv_env_OPT_FFLAGS_set=${OPT_FFLAGS+set} ac_cv_env_OPT_FFLAGS_value=$OPT_FFLAGS ac_env_F77_set=${F77+set} ac_env_F77_value=$F77 ac_cv_env_F77_set=${F77+set} ac_cv_env_F77_value=$F77 ac_env_FFLAGS_set=${FFLAGS+set} ac_env_FFLAGS_value=$FFLAGS ac_cv_env_FFLAGS_set=${FFLAGS+set} ac_cv_env_FFLAGS_value=$FFLAGS ac_env_MPIF77_set=${MPIF77+set} ac_env_MPIF77_value=$MPIF77 ac_cv_env_MPIF77_set=${MPIF77+set} ac_cv_env_MPIF77_value=$MPIF77 ac_env_CPP_set=${CPP+set} ac_env_CPP_value=$CPP ac_cv_env_CPP_set=${CPP+set} ac_cv_env_CPP_value=$CPP ac_env_CXXCPP_set=${CXXCPP+set} ac_env_CXXCPP_value=$CXXCPP ac_cv_env_CXXCPP_set=${CXXCPP+set} ac_cv_env_CXXCPP_value=$CXXCPP ac_env_COIN_SKIP_PROJECTS_set=${COIN_SKIP_PROJECTS+set} ac_env_COIN_SKIP_PROJECTS_value=$COIN_SKIP_PROJECTS ac_cv_env_COIN_SKIP_PROJECTS_set=${COIN_SKIP_PROJECTS+set} ac_cv_env_COIN_SKIP_PROJECTS_value=$COIN_SKIP_PROJECTS # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures DyLP 1.6.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] _ACEOF cat <<_ACEOF Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --datadir=DIR read-only architecture-independent data [PREFIX/share] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --infodir=DIR info documentation [PREFIX/info] --mandir=DIR man documentation [PREFIX/man] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of DyLP 1.6.0:";; esac cat <<\_ACEOF Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-debug compile all projects with debug options tests --enable-doscompile Under Cygwin, compile so that executables run under DOS. Set to mingw to use gcc/g++/ld with -mno-cygwin. Set to msvc to use cl/link (or icl/link). Default when mentioned: mingw. Default when not mentioned: disabled. --enable-static[=PKGS] build static libraries [default=no] --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --enable-shared[=PKGS] build shared libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-pic try to use only PIC/non-PIC objects [default=use both] --with-tags[=TAGS] include additional configurations [automatic] Some influential environment variables: CDEFS Additional -D flags to be used when compiling C code. ADD_CFLAGS Additional C compiler options DBG_CFLAGS Debug C compiler options OPT_CFLAGS Optimize C compiler options CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory MPICC C MPI Compiler CXXDEFS Additional -D flags to be used when compiling C++ code. ADD_CXXFLAGS Additional C++ compiler options DBG_CXXFLAGS Debug C++ compiler options OPT_CXXFLAGS Optimize C++ compiler options CXX C++ compiler command CXXFLAGS C++ compiler flags MPICXX C++ MPI Compiler ADD_FFLAGS Additional Fortran compiler options DBG_FFLAGS Debug Fortran compiler options OPT_FFLAGS Optimize Fortran compiler options F77 Fortran 77 compiler command FFLAGS Fortran 77 compiler flags MPIF77 Fortran MPI Compiler CPP C preprocessor CXXCPP C++ preprocessor COIN_SKIP_PROJECTS Set to the subdirectories of projects that should be skipped in the configuration Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. ac_popdir=`pwd` for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d $ac_dir || continue ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac cd $ac_dir # Check for guested configure; otherwise get Cygnus style configure. if test -f $ac_srcdir/configure.gnu; then echo $SHELL $ac_srcdir/configure.gnu --help=recursive elif test -f $ac_srcdir/configure; then echo $SHELL $ac_srcdir/configure --help=recursive elif test -f $ac_srcdir/configure.ac || test -f $ac_srcdir/configure.in; then echo $ac_configure --help else echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi cd $ac_popdir done fi test -n "$ac_init_help" && exit 0 if $ac_init_version; then cat <<\_ACEOF DyLP configure 1.6.0 generated by GNU Autoconf 2.59 Copyright (C) 2003 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Copyright 2006 International Business Machines and others. All Rights Reserved. This file is part of the open source package Coin which is distributed under the Common Public License. _ACEOF exit 0 fi exec 5>config.log cat >&5 <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by DyLP $as_me 1.6.0, which was generated by GNU Autoconf 2.59. Invocation command line was $ $0 $@ _ACEOF { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` hostinfo = `(hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. echo "PATH: $as_dir" done } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_sep= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$ac_configure_args1 '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" # Get rid of the leading space. ac_sep=" " ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Be sure not to use single quotes in there, as some shells, # such as our DU 5.0 friend, will then `close' the trap. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, { (set) 2>&1 | case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in *ac_space=\ *) sed -n \ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" ;; *) sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=$`echo $ac_var` echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------- ## ## Output files. ## ## ------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=$`echo $ac_var` echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo sed "/^$/d" confdefs.h | sort echo fi test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" echo "$as_me: exit $exit_status" } >&5 rm -f core *.core && rm -rf conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -rf conftest* confdefs.h # AIX cpp loses on an empty file, so make sure it contains at least a newline. echo >confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer explicitly selected file to automatically selected ones. if test -z "$CONFIG_SITE"; then if test "x$prefix" != xNONE; then CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" else CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special # files actually), so we avoid doing that. if test -f "$cache_file"; then { echo "$as_me:$LINENO: loading cache $cache_file" >&5 echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . $cache_file;; *) . ./$cache_file;; esac fi else { echo "$as_me:$LINENO: creating cache $cache_file" >&5 echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in `(set) 2>&1 | sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val="\$ac_cv_env_${ac_var}_value" eval ac_new_val="\$ac_env_${ac_var}_value" case $ac_old_set,$ac_new_set in set,) { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # List one file in the package so that the configure script can test # whether the package is actually there # Where should everything be installed by default? Here, we want it # to be installed directly in 'bin', 'lib', 'include' subdirectories # of the directory where configure is run. The default would be # /usr/local. ############################################################################# # Do the tests necessary to configure compilers and initialise autotools # ############################################################################# ac_aux_dir= for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do if test -f $ac_dir/install-sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f $ac_dir/install.sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f $ac_dir/shtool; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} { (exit 1); exit 1; }; } fi ac_config_guess="$SHELL $ac_aux_dir/config.guess" ac_config_sub="$SHELL $ac_aux_dir/config.sub" ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. # Make sure we can run config.sub. $ac_config_sub sun4 >/dev/null 2>&1 || { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5 echo "$as_me: error: cannot run $ac_config_sub" >&2;} { (exit 1); exit 1; }; } echo "$as_me:$LINENO: checking build system type" >&5 echo $ECHO_N "checking build system type... $ECHO_C" >&6 if test "${ac_cv_build+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_build_alias=$build_alias test -z "$ac_cv_build_alias" && ac_cv_build_alias=`$ac_config_guess` test -z "$ac_cv_build_alias" && { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 echo "$as_me: error: cannot guess build type; you must specify one" >&2;} { (exit 1); exit 1; }; } ac_cv_build=`$ac_config_sub $ac_cv_build_alias` || { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5 echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:$LINENO: result: $ac_cv_build" >&5 echo "${ECHO_T}$ac_cv_build" >&6 build=$ac_cv_build build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` # Check if user wants to produce debugging code echo "$as_me:$LINENO: checking whether we want to compile in debug mode" >&5 echo $ECHO_N "checking whether we want to compile in debug mode... $ECHO_C" >&6 # Check whether --enable-debug or --disable-debug was given. if test "${enable_debug+set}" = set; then enableval="$enable_debug" case "${enableval}" in yes) coin_debug_compile=true if test "${enable_shared+set}" = set; then :; else enable_shared=no fi ;; no) coin_debug_compile=false ;; *) { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-debug" >&5 echo "$as_me: error: bad value ${enableval} for --enable-debug" >&2;} { (exit 1); exit 1; }; } ;; esac else coin_debug_compile=false fi; # m4_ifvaln([], if test $coin_debug_compile = true; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi # m4_ifvaln([], # Get the name of the C compiler and appropriate compiler options case $build in *-mingw*) if test "${LD+set}" = set; then :; else LD=link fi ;; esac case $enable_doscompile in msvc) if test "x${LD+set}" = xset; then :; else LD=link fi ;; esac # Check whether --enable-doscompile or --disable-doscompile was given. if test "${enable_doscompile+set}" = set; then enableval="$enable_doscompile" if test "$enable_doscompile" != no; then case $build in *-cygwin* | *-mingw*) ;; *) { { echo "$as_me:$LINENO: error: --enable-doscompile option makes sense only under Cygwin or MinGW" >&5 echo "$as_me: error: --enable-doscompile option makes sense only under Cygwin or MinGW" >&2;} { (exit 1); exit 1; }; } ;; esac fi else enable_doscompile=no fi; case "$enable_doscompile" in mingw) case $build in *-mingw*) enable_doscompile=no ;; esac ;; msvc|no) ;; yes) enable_doscompile=mingw ;; *) { { echo "$as_me:$LINENO: error: Invalid value $enable_doscompile for --enable-doscompile. Try configure --help=recursive." >&5 echo "$as_me: error: Invalid value $enable_doscompile for --enable-doscompile. Try configure --help=recursive." >&2;} { (exit 1); exit 1; }; } ;; esac if test "$enable_doscompile" != no ; then { echo "$as_me:$LINENO: DOS compile style is: $enable_doscompile" >&5 echo "$as_me: DOS compile style is: $enable_doscompile" >&6;} fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # For consistency, we set the C compiler to the same value of the C++ # compiler, if the C++ is set, but the C compiler isn't (only for CXX=cl) if test x"$CXX" != x; then case "$CXX" in cl* | */cl* | CL* | */CL* | icl* | */icl* | ICL* | */ICL*) if test x"$CC" = x; then CC="$CXX" { echo "$as_me:$LINENO: WARNING: C++ compiler name provided as $CXX, but CC is unset. Setting CC to $CXX" >&5 echo "$as_me: WARNING: C++ compiler name provided as $CXX, but CC is unset. Setting CC to $CXX" >&2;} fi ;; esac fi coin_has_cc=yes save_cflags="$CFLAGS" # For *-*-solaris*, promote Studio/Workshop cc compiler to front of list. # Depending on the user's PATH, when Studio/Workshop cc is not present we may # find /usr/ucb/cc, which is almost certainly not a good choice for the C # compiler. In this case, put cc after gcc. case $build in *-cygwin* | *-mingw*) if test "$enable_doscompile" = msvc ; then comps="icl cl" else comps="gcc cl" fi ;; *-*-solaris*) # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_sol_cc_compiler+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$sol_cc_compiler"; then ac_cv_prog_sol_cc_compiler="$sol_cc_compiler" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_sol_cc_compiler="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_sol_cc_compiler shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set sol_cc_compiler to just the basename; use the full file name. shift ac_cv_prog_sol_cc_compiler="$as_dir/$ac_word${1+' '}$@" fi fi fi fi sol_cc_compiler=$ac_cv_prog_sol_cc_compiler if test -n "$sol_cc_compiler"; then echo "$as_me:$LINENO: result: $sol_cc_compiler" >&5 echo "${ECHO_T}$sol_cc_compiler" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi if test "$sol_cc_compiler" = "cc" ; then comps="cc xlc gcc pgcc icc" else comps="xlc gcc pgcc icc cc" fi ;; *-linux-*) comps="xlc gcc cc pgcc icc" ;; *) comps="xlc_r xlc cc gcc pgcc icc" ;; esac # We delete the cached value, since the test might not have been # performed with our choice of compilers earlier $as_unset ac_cv_prog_CC || test "${ac_cv_prog_CC+set}" != set || { ac_cv_prog_CC=; export ac_cv_prog_CC; } # AC_MSG_NOTICE([C compiler candidates: $comps]) ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in $comps do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in $comps do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$ac_ct_CC" && break done CC=$ac_ct_CC fi test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } # Provide some information about the compiler. echo "$as_me:$LINENO:" \ "checking for C compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 (eval $ac_compiler --version &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 (eval $ac_compiler -v &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 (eval $ac_compiler -V &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 (eval $ac_link_default) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Find the output, starting from the most likely. This scheme is # not robust to junk in `.', hence go to wildcards (a.*) only as a last # resort. # Be careful to initialize this variable, since it used to be cached. # Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. ac_cv_exeext= # b.out is created by i960 compilers. for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; conftest.$ac_ext ) # This is the source file. ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` # FIXME: I believe we export ac_cv_exeext for Libtool, # but it would be cool to find out if it's true. Does anybody # maintain Libtool? --akim. export ac_cv_exeext break;; * ) break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: C compiler cannot create executables See \`config.log' for more details." >&5 echo "$as_me: error: C compiler cannot create executables See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } fi ac_exeext=$ac_cv_exeext echo "$as_me:$LINENO: result: $ac_file" >&5 echo "${ECHO_T}$ac_file" >&6 # Check the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. echo "$as_me:$LINENO: checking whether the C compiler works" >&5 echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 # FIXME: These cross compiler hacks should be removed for Autoconf 3.0 # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { echo "$as_me:$LINENO: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&5 echo "$as_me: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi fi fi echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 rm -f a.out a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save # Check the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 echo "$as_me:$LINENO: result: $cross_compiling" >&5 echo "${ECHO_T}$cross_compiling" >&6 echo "$as_me:$LINENO: checking for suffix of executables" >&5 echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` export ac_cv_exeext break;; * ) break;; esac done else { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest$ac_cv_exeext echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 echo "${ECHO_T}$ac_cv_exeext" >&6 rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT echo "$as_me:$LINENO: checking for suffix of object files" >&5 echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 if test "${ac_cv_objext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 echo "${ECHO_T}$ac_cv_objext" >&6 OBJEXT=$ac_cv_objext ac_objext=$OBJEXT echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 if test "${ac_cv_c_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 GCC=`test $ac_compiler_gnu = yes && echo yes` ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS CFLAGS="-g" echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_prog_cc_g=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 if test "${ac_cv_prog_cc_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_prog_cc_stdc=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std1 is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std1. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF # Don't try gcc -ansi; that turns off useful extensions and # breaks some systems' header files. # AIX -qlanglvl=ansi # Ultrix and OSF/1 -std1 # HP-UX 10.20 and later -Ae # HP-UX older versions -Aa -D_HPUX_SOURCE # SVR4 -Xc -D__EXTENSIONS__ for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_stdc=$ac_arg break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext done rm -f conftest.$ac_ext conftest.$ac_objext CC=$ac_save_CC fi case "x$ac_cv_prog_cc_stdc" in x|xno) echo "$as_me:$LINENO: result: none needed" >&5 echo "${ECHO_T}none needed" >&6 ;; *) echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 CC="$CC $ac_cv_prog_cc_stdc" ;; esac # Some people use a C++ compiler to compile C. Since we use `exit', # in C++ we need to declare it. In case someone uses the same compiler # for both compiling C and C++ we need to have the C++ compiler decide # the declaration of exit, since it's the most demanding environment. cat >conftest.$ac_ext <<_ACEOF #ifndef __cplusplus choke me #endif _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then for ac_declaration in \ '' \ 'extern "C" void std::exit (int) throw (); using std::exit;' \ 'extern "C" void std::exit (int); using std::exit;' \ 'extern "C" void exit (int) throw ();' \ 'extern "C" void exit (int);' \ 'void exit (int);' do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration #include int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 continue fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done rm -f conftest* if test -n "$ac_declaration"; then echo '#ifdef __cplusplus' >>confdefs.h echo $ac_declaration >>confdefs.h echo '#endif' >>confdefs.h fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -z "$CC" ; then { { echo "$as_me:$LINENO: error: Failed to find a C compiler!" >&5 echo "$as_me: error: Failed to find a C compiler!" >&2;} { (exit 1); exit 1; }; } fi # Autoconf incorrectly concludes that cl recognises -g. It doesn't. case "$CC" in cl* | */cl* | CL* | */CL* ) if test "$ac_cv_prog_cc_g" = yes ; then ac_cv_prog_cc_g=no { echo "$as_me:$LINENO: Overruling autoconf; cl does not recognise -g." >&5 echo "$as_me: Overruling autoconf; cl does not recognise -g." >&6;} fi ;; esac CFLAGS="$save_cflags" # Check if a project specific CFLAGS variable has been set if test x$COIN_PRJCT != x; then eval coin_tmp=\${${COIN_PRJCT}_CFLAGS+set} if test x$coin_tmp = xset; then eval CFLAGS=\${${COIN_PRJCT}_CFLAGS} fi fi if test x"$CFLAGS" = x; then coin_add_cflags= coin_opt_cflags= coin_dbg_cflags= coin_warn_cflags= if test "$GCC" = "yes"; then case "$CC" in icc* | */icc*) ;; *) coin_opt_cflags="-O3 -fomit-frame-pointer" coin_add_cflags="-pipe" coin_dbg_cflags="-g" coin_warn_cflags="-Wimplicit -Wparentheses -Wsequence-point -Wreturn-type -Wcast-qual -Wall -Wno-unknown-pragmas" case $build in *-darwin*) ;; *) coin_warn_cflags="-pedantic-errors $coin_warn_cflags" ;; esac case $enable_doscompile in mingw) CFLAGS="-mno-cygwin" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { int i=0; i++; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then coin_add_cflags="-mno-cygwin $coin_add_cflags" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS= ;; esac esac fi if test -z "$coin_opt_cflags"; then case $build in *-cygwin* | *-mingw*) case "$CC" in cl* | */cl* | CL* | */CL*) coin_opt_cflags='-MT -O2' coin_add_cflags='-nologo -wd4996 -D_CRT_SECURE_NO_DEPRECATE' coin_dbg_cflags='-MTd' ;; icl* | */icl* | ICL* | */ICL*) coin_opt_cflags='-MT -Ox' coin_add_cflags='-nologo -D_CRT_SECURE_NO_DEPRECATE' coin_dbg_cflags='-MTd -debug' ;; esac ;; *-linux-*) case "$CC" in icc* | */icc*) coin_opt_cflags="-O3 -ip -mp1" coin_add_cflags="" coin_dbg_cflags="-g" # Check if -i_dynamic is necessary (for new glibc library) CFLAGS= cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { int i=0; i++; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 coin_add_cflags="-i_dynamic $coin_add_cflags" fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ;; pgcc* | */pgcc*) coin_opt_cflags="-fast" coin_add_cflags="-Kieee -pc 64" coin_dbg_cflags="-g" ;; esac ;; *-ibm-*) case "$CC" in xlc* | */xlc* | mpxlc* | */mpxlc*) coin_opt_cflags="-O -qarch=auto -qcache=auto -qtune=auto -qmaxmem=-1" coin_add_cflags="-bmaxdata:0x80000000 -qsuppress=1500-036 -qsuppress=1500-029" coin_dbg_cflags="-g" ;; esac ;; *-hp-*) coin_opt_cflags="-O" coin_add_cflags="-Ae" coin_dbg_cflags="-g" ;; *-*-solaris*) coin_opt_cflags="-xO4" coin_dbg_cflags="-g" ;; *-sgi-*) coin_opt_cflags="-O -OPT:Olimit=0" coin_dbg_cflags="-g" ;; esac fi if test "$ac_cv_prog_cc_g" = yes && test -z "$coin_dbg_cflags" ; then coin_dbg_cflags="-g" fi if test -z "$coin_opt_cflags"; then # Try if -O option works if nothing else is set CFLAGS="-O" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { int i=0; i++; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then coin_opt_cflags="-O" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi # if PM doesn't want the warning messages, take them out if test x"$coin_skip_warn_cflags" = xyes; then coin_warn_cflags= fi if test x${DBG_CFLAGS+set} != xset; then DBG_CFLAGS="$coin_dbg_cflags $coin_add_cflags $coin_warn_cflags" fi if test x${OPT_CFLAGS+set} != xset; then OPT_CFLAGS="$coin_opt_cflags $coin_add_cflags -DNDEBUG $coin_warn_cflags" fi DBG_CFLAGS="$DBG_CFLAGS $ADD_CFLAGS $CDEFS" OPT_CFLAGS="$OPT_CFLAGS $ADD_CFLAGS $CDEFS" if test "$coin_debug_compile" = "true"; then CFLAGS="$DBG_CFLAGS" else CFLAGS="$OPT_CFLAGS" fi else CFLAGS="$CFLAGS $ADD_CFLAGS $CDEFS" if test x${DBG_CFLAGS+set} != xset; then DBG_CFLAGS="$CFLAGS" fi if test x${OPT_CFLAGS+set} != xset; then OPT_CFLAGS="$CFLAGS" fi fi # If CFLAGS contains -mno-cygwin, CPPFLAGS must also have it. case "$CFLAGS" in *-mno-cygwin*) if test x${CPPFLAGS+set} != xset ; then CPPFLAGS="-mno-cygwin" else case "$CPPFLAGS" in *-mno-cygwin*) ;; *) CPPFLAGS="$CPPFLAGS -mno-cygwin" ;; esac fi ;; esac # Try if CFLAGS works save_CFLAGS="$CFLAGS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { int i=0; i++; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CFLAGS= fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$CFLAGS"; then { echo "$as_me:$LINENO: WARNING: The value CFLAGS=\"$save_CFLAGS\" do not work. I will now just try '-O', but you might want to set CFLAGS manually." >&5 echo "$as_me: WARNING: The value CFLAGS=\"$save_CFLAGS\" do not work. I will now just try '-O', but you might want to set CFLAGS manually." >&2;} CFLAGS='-O' cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { int i=0; i++; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CFLAGS= fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$CFLAGS"; then { echo "$as_me:$LINENO: WARNING: This value for CFLAGS does not work. I will continue with empty CFLAGS, but you might want to set CFLAGS manually." >&5 echo "$as_me: WARNING: This value for CFLAGS does not work. I will continue with empty CFLAGS, but you might want to set CFLAGS manually." >&2;} fi fi { echo "$as_me:$LINENO: C compiler options are: $CFLAGS" >&5 echo "$as_me: C compiler options are: $CFLAGS" >&6;} if test x"$MPICC" = x; then :; else { echo "$as_me:$LINENO: Will use MPI C compiler $MPICC" >&5 echo "$as_me: Will use MPI C compiler $MPICC" >&6;} CC="$MPICC" fi # Correct ADDLIBS initialization if we are using the MS compiler case "$CC" in cl* | */cl* | CL* | */CL* | icl* | */icl* | ICL* | */ICL*) ADDLIBS= case $build in *-mingw*) if test "${LD+set}" = set; then :; else LD=link fi ;; esac case $enable_doscompile in msvc) if test "x${LD+set}" = xset; then :; else LD=link fi ;; esac ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Get the name of the C++ compiler and appropriate compiler options #Let's try if that overcomes configuration problem with VC++ 6.0 ac_ext=cc ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu coin_has_cxx=yes save_cxxflags="$CXXFLAGS" # For *-*-solaris*, promote Studio/Workshop compiler to front of list. case $build in *-cygwin* | *-mingw*) if test "$enable_doscompile" = msvc ; then comps="icl cl" else comps="g++ cl" fi ;; *-*-solaris*) comps="CC xlC_r aCC g++ c++ pgCC icpc gpp cxx cc++ cl FCC KCC RCC" ;; *-darwin*) comps="g++ c++ CC" ;; *) comps="xlC_r aCC CC g++ c++ pgCC icpc gpp cxx cc++ cl FCC KCC RCC" ;; esac # We delete the cached value, since the test might not have been # performed with our choice of compilers earlier $as_unset ac_cv_prog_CXX || test "${ac_cv_prog_CXX+set}" != set || { ac_cv_prog_CXX=; export ac_cv_prog_CXX; } # AC_MSG_NOTICE([C++ compiler candidates: $comps]) ac_ext=cc ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in $CCC $comps do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then echo "$as_me:$LINENO: result: $CXX" >&5 echo "${ECHO_T}$CXX" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in $CCC $comps do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 echo "${ECHO_T}$ac_ct_CXX" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$ac_ct_CXX" && break done test -n "$ac_ct_CXX" || ac_ct_CXX="g++" CXX=$ac_ct_CXX fi # Provide some information about the compiler. echo "$as_me:$LINENO:" \ "checking for C++ compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 (eval $ac_compiler --version &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 (eval $ac_compiler -v &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 (eval $ac_compiler -V &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6 if test "${ac_cv_cxx_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6 GXX=`test $ac_compiler_gnu = yes && echo yes` ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS CXXFLAGS="-g" echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6 if test "${ac_cv_prog_cxx_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cxx_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_prog_cxx_g=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6 if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi for ac_declaration in \ '' \ 'extern "C" void std::exit (int) throw (); using std::exit;' \ 'extern "C" void std::exit (int); using std::exit;' \ 'extern "C" void exit (int) throw ();' \ 'extern "C" void exit (int);' \ 'void exit (int);' do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration #include int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 continue fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done rm -f conftest* if test -n "$ac_declaration"; then echo '#ifdef __cplusplus' >>confdefs.h echo $ac_declaration >>confdefs.h echo '#endif' >>confdefs.h fi ac_ext=cc ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu #AC_PROG_CXX sets CXX to g++ if it cannot find a working C++ compiler #thus, we test here whether $CXX is actually working ac_ext=cc ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu echo "$as_me:$LINENO: checking whether C++ compiler $CXX works" >&5 echo $ECHO_N "checking whether C++ compiler $CXX works... $ECHO_C" >&6; cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { int i=0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 { { echo "$as_me:$LINENO: error: failed to find a C++ compiler or C++ compiler $CXX does not work" >&5 echo "$as_me: error: failed to find a C++ compiler or C++ compiler $CXX does not work" >&2;} { (exit 1); exit 1; }; } fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cc ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu # It seems that we need to cleanup something here for the Windows case "$CXX" in cl* | */cl* | CL* | */CL* | icl* | */icl* | ICL* | */ICL*) sed -e 's/^void exit (int);//' confdefs.h >> confdefs.hh mv confdefs.hh confdefs.h ;; esac # Autoconf incorrectly concludes that cl recognises -g. It doesn't. case "$CXX" in cl* | */cl* | CL* | */CL* ) if test "$ac_cv_prog_cxx_g" = yes ; then ac_cv_prog_cxx_g=no { echo "$as_me:$LINENO: Overruling autoconf; cl does not recognise -g." >&5 echo "$as_me: Overruling autoconf; cl does not recognise -g." >&6;} fi ;; esac CXXFLAGS="$save_cxxflags" # Check if a project specific CXXFLAGS variable has been set if test x$COIN_PRJCT != x; then eval coin_tmp=\${${COIN_PRJCT}_CXXFLAGS+set} if test x$coin_tmp = xset; then eval CXXFLAGS=\${${COIN_PRJCT}_CXXFLAGS} fi fi if test x"$CXXFLAGS" = x; then # ToDo decide whether we want -DNDEBUG for optimization coin_add_cxxflags= coin_opt_cxxflags= coin_dbg_cxxflags= coin_warn_cxxflags= if test "$GXX" = "yes"; then case "$CXX" in icpc* | */icpc*) ;; *) # ToDo decide about unroll-loops coin_opt_cxxflags="-O3 -fomit-frame-pointer" coin_add_cxxflags="-pipe" coin_dbg_cxxflags="-g" coin_warn_cxxflags="-Wimplicit -Wparentheses -Wreturn-type -Wcast-qual -Wall -Wpointer-arith -Wwrite-strings -Wconversion -Wno-unknown-pragmas" case $build in *-darwin*) ;; *) coin_warn_cxxflags="-pedantic-errors $coin_warn_cxxflags" ;; esac case $enable_doscompile in mingw) CXXFLAGS="-mno-cygwin" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { int i=0; i++; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then coin_add_cxxflags="-mno-cygwin $coin_add_cxxflags" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CXXFLAGS= ;; esac esac fi # Note that we do not need to cover GCC in the following tests. if test -z "$coin_opt_cxxflags"; then case $build in *-cygwin* | *-mingw*) case "$CXX" in cl* | */cl* | CL* | */CL*) # The MT and MTd options are mutually exclusive coin_opt_cxxflags='-MT -O2' coin_add_cxxflags='-nologo -EHsc -GR -wd4996 -D_CRT_SECURE_NO_DEPRECATE' coin_dbg_cxxflags='-MTd' ;; icl* | */icl* | ICL* | */ICL*) # The MT and MTd options are mutually exclusive coin_opt_cxxflags='-MT -Ox' coin_add_cxxflags='-nologo -EHsc -GR -D_CRT_SECURE_NO_DEPRECATE' coin_dbg_cxxflags='-MTd -debug' ;; esac ;; *-linux-*) case "$CXX" in icpc* | */icpc*) coin_opt_cxxflags="-O3 -ip -mp1" coin_add_cxxflags="" coin_dbg_cxxflags="-g" # Check if -i_dynamic is necessary (for new glibc library) CXXFLAGS= cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { int i=0; i++; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 coin_add_cxxflags="-i_dynamic $coin_add_cxxflags" fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ;; pgCC* | */pgCC*) coin_opt_cxxflags="-fast" coin_add_cxxflags="-Kieee -pc 64" coin_dbg_cxxflags="-g" ;; esac ;; *-ibm-*) case "$CXX" in xlC* | */xlC* | mpxlC* | */mpxlC*) coin_opt_cxxflags="-O -qarch=auto -qcache=auto -qtune=auto -qmaxmem=-1" coin_add_cxxflags="-bmaxdata:0x80000000 -qrtti=dyna -qsuppress=1500-036 -qsuppress=1500-029 -qsourcetype=c++" coin_dbg_cxxflags="-g" ;; esac ;; *-hp-*) case "$CXX" in aCC* | */aCC* ) coin_opt_cxxflags="-O" coin_add_cxxflags="-AA" coin_dbg_cxxflags="-g" ;; esac ;; *-*-solaris*) coin_opt_cxxflags="-O4" coin_dbg_cxxflags="-g" ;; esac fi # Generic flag settings. If these don't work, add a case above. if test "$ac_cv_prog_cxx_g" = yes && test -z "$coin_dbg_cxxflags" ; then coin_dbg_cxxflags="-g" fi if test -z "$coin_opt_cxxflags"; then # Try if -O option works if nothing else is set CXXFLAGS=-O cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { int i=0; i++; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then coin_opt_cxxflags="-O" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi # if PM doesn't want the warning messages, take them out if test x"$coin_skip_warn_cxxflags" = xyes; then coin_warn_cxxflags= fi # Do final setup of flags based on values determined above. if test x${DBG_CXXFLAGS+set} != xset; then DBG_CXXFLAGS="$coin_dbg_cxxflags $coin_add_cxxflags $coin_warn_cxxflags" fi if test x${OPT_CXXFLAGS+set} != xset; then OPT_CXXFLAGS="$coin_opt_cxxflags $coin_add_cxxflags -DNDEBUG $coin_warn_cxxflags" fi DBG_CXXFLAGS="$DBG_CXXFLAGS $ADD_CXXFLAGS $CXXDEFS" OPT_CXXFLAGS="$OPT_CXXFLAGS $ADD_CXXFLAGS $CXXDEFS" if test "$coin_debug_compile" = "true"; then CXXFLAGS="$DBG_CXXFLAGS" else CXXFLAGS="$OPT_CXXFLAGS" fi # Handle the case where CXXFLAGS was set externally. else CXXFLAGS="$CXXFLAGS $ADD_CXXFLAGS $CXXDEFS" if test x${DBG_CXXFLAGS+set} != xset; then DBG_CXXFLAGS="$CXXFLAGS" fi if test x${OPT_CXXFLAGS+set} != xset; then OPT_CXXFLAGS="$CXXFLAGS" fi fi # If CXXFLAGS contains -mno-cygwin, CPPFLAGS must also have it. case "$CXXFLAGS" in *-mno-cygwin*) if test x${CPPFLAGS+set} != xset ; then CPPFLAGS="-mno-cygwin" else case "$CPPFLAGS" in *-mno-cygwin*) ;; *) CPPFLAGS="$CPPFLAGS -mno-cygwin" ;; esac fi ;; esac # Try if CXXFLAGS works save_CXXFLAGS="$CXXFLAGS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { int i=0; i++; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CXXFLAGS= fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$CXXFLAGS"; then { echo "$as_me:$LINENO: WARNING: The flags CXXFLAGS=\"$save_CXXFLAGS\" do not work. I will now just try '-O', but you might want to set CXXFLAGS manually." >&5 echo "$as_me: WARNING: The flags CXXFLAGS=\"$save_CXXFLAGS\" do not work. I will now just try '-O', but you might want to set CXXFLAGS manually." >&2;} CXXFLAGS='-O' cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { int i=0; i++; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CXXFLAGS= fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$CXXFLAGS"; then { echo "$as_me:$LINENO: WARNING: This value for CXXFLAGS does not work. I will continue with empty CXXFLAGS, but you might want to set CXXFLAGS manually." >&5 echo "$as_me: WARNING: This value for CXXFLAGS does not work. I will continue with empty CXXFLAGS, but you might want to set CXXFLAGS manually." >&2;} fi fi { echo "$as_me:$LINENO: C++ compiler options are: $CXXFLAGS" >&5 echo "$as_me: C++ compiler options are: $CXXFLAGS" >&6;} if test x"$MPICXX" = x; then :; else { echo "$as_me:$LINENO: Will use MPI C++ compiler $MPICXX" >&5 echo "$as_me: Will use MPI C++ compiler $MPICXX" >&6;} CXX="$MPICXX" fi case "$CXX" in cl* | */cl* | CL* | */CL* ) case $build in *-mingw*) if test "${LD+set}" = set; then :; else LD=link fi ;; esac case $enable_doscompile in msvc) if test "x${LD+set}" = xset; then :; else LD=link fi ;; esac ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Get the name of the Fortran compiler and appropriate compiler options case $build in *-cygwin* | *-mingw*) if test "$enable_doscompile" = msvc ; then coin_f77_comps="ifort fl32 compile_f2c" else coin_f77_comps="gfortran g77 ifort fl32 compile_f2c" fi ;; *-*-solaris*) coin_f77_comps="f95 f90 f77 xlf_r fort77 gfortran g77 pgf90 pgf77 ifort ifc frt af77" ;; *) coin_f77_comps="xlf_r fort77 gfortran f77 g77 pgf90 pgf77 ifort ifc frt af77" ;; esac ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu coin_has_f77=yes save_fflags="$FFLAGS" # We delete the cached value, since the test might not have been # performed with our choice of compilers earlier $as_unset ac_cv_prog_F77 || test "${ac_cv_prog_F77+set}" != set || { ac_cv_prog_F77=; export ac_cv_prog_F77; } # This is a real belt-and-suspenders approach. AC_COIN_FIND_F77 will use # coin_f77_comps to see if there's a program that matches one of the names. # If there's no such program, F77 = unavailable. If we match the name, # feed AC_PROG_F77 the same search list, just to be sure it's a functioning # compiler. # AC_MSG_NOTICE([Fortran compiler candidates: $coin_f77_comps]) { echo "$as_me:$LINENO: Trying to determine Fortran compiler name" >&5 echo "$as_me: Trying to determine Fortran compiler name" >&6;} for ac_prog in $coin_f77_comps do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$F77"; then ac_cv_prog_F77="$F77" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_F77="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi F77=$ac_cv_prog_F77 if test -n "$F77"; then echo "$as_me:$LINENO: result: $F77" >&5 echo "${ECHO_T}$F77" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$F77" && break done test -n "$F77" || F77="unavailable" if test "$F77" != "unavailable" ; then ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in $coin_f77_comps do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$F77"; then ac_cv_prog_F77="$F77" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_F77="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi F77=$ac_cv_prog_F77 if test -n "$F77"; then echo "$as_me:$LINENO: result: $F77" >&5 echo "${ECHO_T}$F77" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$F77" && break done fi if test -z "$F77"; then ac_ct_F77=$F77 for ac_prog in $coin_f77_comps do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_F77"; then ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_F77="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_F77=$ac_cv_prog_ac_ct_F77 if test -n "$ac_ct_F77"; then echo "$as_me:$LINENO: result: $ac_ct_F77" >&5 echo "${ECHO_T}$ac_ct_F77" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$ac_ct_F77" && break done F77=$ac_ct_F77 fi # Provide some information about the compiler. echo "$as_me:4164:" \ "checking for Fortran 77 compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 (eval $ac_compiler --version &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 (eval $ac_compiler -v &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 (eval $ac_compiler -V &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } rm -f a.out # If we don't use `.F' as extension, the preprocessor is not run on the # input file. (Note that this only needs to work for GNU compilers.) ac_save_ext=$ac_ext ac_ext=F echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5 echo $ECHO_N "checking whether we are using the GNU Fortran 77 compiler... $ECHO_C" >&6 if test "${ac_cv_f77_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF program main #ifndef __GNUC__ choke me #endif end _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_f77_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_f77_compiler_gnu=$ac_compiler_gnu fi echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_f77_compiler_gnu" >&6 ac_ext=$ac_save_ext ac_test_FFLAGS=${FFLAGS+set} ac_save_FFLAGS=$FFLAGS FFLAGS= echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5 echo $ECHO_N "checking whether $F77 accepts -g... $ECHO_C" >&6 if test "${ac_cv_prog_f77_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else FFLAGS=-g cat >conftest.$ac_ext <<_ACEOF program main end _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_f77_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_f77_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_prog_f77_g=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5 echo "${ECHO_T}$ac_cv_prog_f77_g" >&6 if test "$ac_test_FFLAGS" = set; then FFLAGS=$ac_save_FFLAGS elif test $ac_cv_prog_f77_g = yes; then if test "x$ac_cv_f77_compiler_gnu" = xyes; then FFLAGS="-g -O2" else FFLAGS="-g" fi else if test "x$ac_cv_f77_compiler_gnu" = xyes; then FFLAGS="-O2" else FFLAGS= fi fi G77=`test $ac_compiler_gnu = yes && echo yes` ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu else { echo "$as_me:$LINENO: WARNING: Failed to find a Fortran compiler!" >&5 echo "$as_me: WARNING: Failed to find a Fortran compiler!" >&2;} fi FFLAGS="$save_fflags" # Check if a project specific FFLAGS variable has been set if test x$COIN_PRJCT != x; then eval coin_tmp=\${${COIN_PRJCT}_FFLAGS+set} if test x$coin_tmp = xset; then eval FFLAGS=\${${COIN_PRJCT}_FFLAGS} fi fi if test "$F77" != "unavailable" && test x"$FFLAGS" = x ; then coin_add_fflags= coin_opt_fflags= coin_dbg_fflags= coin_warn_fflags= if test "$G77" = "yes"; then coin_opt_fflags="-O3 -fomit-frame-pointer" coin_add_fflags="-pipe" coin_dbg_fflags="-g" case $enable_doscompile in mingw) FFLAGS="-mno-cygwin" cat >conftest.$ac_ext <<_ACEOF program main write(*,*) 'Hello world' end _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_f77_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then coin_add_fflags="-mno-cygwin $coin_add_fflags" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext FFLAGS= ;; esac else case $build in *-cygwin* | *-mingw*) case $F77 in ifort* | */ifort* | IFORT* | */IFORT* ) coin_opt_fflags='-MT -O3' coin_add_fflags='-fpp -nologo' coin_dbg_fflags='-MTd -debug' ;; compile_f2c*) coin_opt_fflags='-MT -O2' coin_add_fflags='-nologo -wd4996' coin_dbg_fflags='-MTd' ;; esac ;; *-linux-*) case $F77 in ifc* | */ifc* | ifort* | */ifort*) coin_opt_fflags="-O3 -ip" coin_add_fflags="-cm -w90 -w95" coin_dbg_fflags="-g -CA -CB -CS" # Check if -i_dynamic is necessary (for new glibc library) FFLAGS= cat >conftest.$ac_ext <<_ACEOF program main write(*,*) 'Hello world' end _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_f77_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 coin_add_fflags="-i_dynamic $coin_add_fflags" fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ;; pgf77* | */pgf77* | pgf90* | */pgf90*) coin_opt_fflags="-fast" coin_add_fflags="-Kieee -pc 64" coin_dbg_fflags="-g" ;; esac ;; *-ibm-*) case "$F77" in xlf* | */xlf* | mpxlf* | */mpxlf* ) coin_opt_fflags="-O -qarch=auto -qcache=auto -qtune=auto -qmaxmem=-1" coin_add_fflags="-bmaxdata:0x80000000 -qsuppress=1500-036 -qsuppress=1500-029" coin_dbg_fflags="-g -C" ;; esac ;; *-hp-*) coin_opt_fflags="+O3" coin_add_fflags="+U77" coin_dbg_fflags="-C -g" ;; *-*-solaris*) coin_opt_fflags="-O4" coin_dbg_fflags="-g" ;; *-sgi-*) coin_opt_fflags="-O5 -OPT:Olimit=0" coin_dbg_fflags="-g" ;; esac fi if test "$ac_cv_prog_f77_g" = yes && test -z "$coin_dbg_fflags" ; then coin_dbg_fflags="-g" fi if test -z "$coin_opt_fflags"; then # Try if -O option works if nothing else is set FFLAGS=-O cat >conftest.$ac_ext <<_ACEOF program main integer i end _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_f77_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then coin_opt_fflags="-O" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi # if PM doesn't want the warning messages, take them out if test x"$coin_skip_warn_fflags" = xyes; then coin_warn_fflags= fi if test x${DBG_FFLAGS+set} != xset; then DBG_FFLAGS="$coin_dbg_fflags $coin_add_fflags $coin_warn_fflags" fi if test x${OPT_FFLAGS+set} != xset; then OPT_FFLAGS="$coin_opt_fflags $coin_add_fflags $coin_warn_fflags" fi DBG_FFLAGS="$DBG_FFLAGS $ADD_FFLAGS" OPT_FFLAGS="$OPT_FFLAGS $ADD_FFLAGS" if test "$coin_debug_compile" = "true"; then FFLAGS="$DBG_FFLAGS" else FFLAGS="$OPT_FFLAGS" fi else FFLAGS="$FFLAGS $ADD_FFLAGS" if test x${DBG_FFLAGS+set} != xset; then DBG_FFLAGS="$FFLAGS" fi if test x${OPT_FFLAGS+set} != xset; then OPT_FFLAGS="$FFLAGS" fi fi # If FFLAGS contains -mno-cygwin, CPPFLAGS must have it. case "$FFLAGS" in *-mno-cygwin*) if test x${CPPFLAGS+set} != xset ; then CPPFLAGS="-mno-cygwin" else case "$CPPFLAGS" in *-mno-cygwin*) ;; *) CPPFLAGS="$CPPFLAGS -mno-cygwin" ;; esac fi ;; esac # Try if FFLAGS works if test "$F77" != "unavailable" ; then cat >conftest.$ac_ext <<_ACEOF program main integer i end _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_f77_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 FFLAGS= fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$FFLAGS"; then { echo "$as_me:$LINENO: WARNING: The flags FFLAGS=\"$FFLAGS\" do not work. I will now just try '-O', but you might want to set FFLAGS manually." >&5 echo "$as_me: WARNING: The flags FFLAGS=\"$FFLAGS\" do not work. I will now just try '-O', but you might want to set FFLAGS manually." >&2;} FFLAGS='-O' cat >conftest.$ac_ext <<_ACEOF program main integer i end _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_f77_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 FFLAGS= fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$FFLAGS"; then { echo "$as_me:$LINENO: WARNING: This value for FFLAGS does not work. I will continue with empty FFLAGS, but you might want to set FFLAGS manually." >&5 echo "$as_me: WARNING: This value for FFLAGS does not work. I will continue with empty FFLAGS, but you might want to set FFLAGS manually." >&2;} fi fi fi { echo "$as_me:$LINENO: Fortran compiler options are: $FFLAGS" >&5 echo "$as_me: Fortran compiler options are: $FFLAGS" >&6;} if test x"$MPIF77" = x; then :; else { echo "$as_me:$LINENO: Will use MPI Fortran compiler $MPIF77" >&5 echo "$as_me: Will use MPI Fortran compiler $MPIF77" >&6;} F77="$MPIF77" fi case "$F77" in ifort* | */ifort* | IFORT* | */IFORT*) case $build in *-mingw*) if test "${LD+set}" = set; then :; else LD=link fi ;; esac case $enable_doscompile in msvc) if test "x${LD+set}" = xset; then :; else LD=link fi ;; esac ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Initialize automake and libtool # AC_MSG_NOTICE([Calling INIT_AUTO_TOOLS from CREATE_LIBTOOL.]) { # START # Test if force_shared has been set if test "x" = xforce_shared; then if test x$enable_shared = xno; then { { echo "$as_me:$LINENO: error: Shared libraries are disabled by user, but this is not feasible with the given options" >&5 echo "$as_me: error: Shared libraries are disabled by user, but this is not feasible with the given options" >&2;} { (exit 1); exit 1; }; } fi enable_shared=yes; else # On Cygwin and AIX, building DLLs doesn't work case $build in *-cygwin*) coin_disable_shared=yes platform=Cygwin ;; *-aix*) coin_disable_shared=yes platform=AIX ;; *-mingw*) coin_disable_shared=yes platform="Msys" # case "$CXX" in # cl*) # coin_disable_shared=yes # platform="Msys with cl" # ;; # esac ;; esac fi if test x"$coin_disable_shared" = xyes; then if test x"$enable_shared" = xyes; then { echo "$as_me:$LINENO: WARNING: On $platform, shared objects are not supported. I'm disabling your choice." >&5 echo "$as_me: WARNING: On $platform, shared objects are not supported. I'm disabling your choice." >&2;} fi enable_shared=no fi # By default, we only want the shared objects to be compiled # Check whether --enable-static or --disable-static was given. if test "${enable_static+set}" = set; then enableval="$enable_static" p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=no fi; # Initialize automake echo "$as_me:$LINENO: checking for egrep" >&5 echo $ECHO_N "checking for egrep... $ECHO_C" >&6 if test "${ac_cv_prog_egrep+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if echo a | (grep -E '(a|b)') >/dev/null 2>&1 then ac_cv_prog_egrep='grep -E' else ac_cv_prog_egrep='egrep' fi fi echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 echo "${ECHO_T}$ac_cv_prog_egrep" >&6 EGREP=$ac_cv_prog_egrep am__api_version="1.9" # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi done done ;; esac done fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. We don't cache a # path for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the path is relative. INSTALL=$ac_install_sh fi fi echo "$as_me:$LINENO: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6 # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo "$as_me:$LINENO: checking whether build environment is sane" >&5 echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6 # Just in case sleep 1 echo timestamp > conftest.file # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&5 echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&2;} { (exit 1); exit 1; }; } fi test "$2" = conftest.file ) then # Ok. : else { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! Check your system clock" >&5 echo "$as_me: error: newly created file is older than distributed files! Check your system clock" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 test "$program_prefix" != NONE && program_transform_name="s,^,$program_prefix,;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s,\$,$program_suffix,;$program_transform_name" # Double any \ or $. echo might interpret backslashes. # By default was `s,x,x', remove it if useless. cat <<\_ACEOF >conftest.sed s/[\\$]/&&/g;s/;s,x,x,$// _ACEOF program_transform_name=`echo $program_transform_name | sed -f conftest.sed` rm conftest.sed # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then # We used to keeping the `.' as first argument, in order to # allow $(mkdir_p) to be used without argument. As in # $(mkdir_p) $(somedir) # where $(somedir) is conditionally defined. However this is wrong # for two reasons: # 1. if the package is installed by a user who cannot write `.' # make install will fail, # 2. the above comment should most certainly read # $(mkdir_p) $(DESTDIR)$(somedir) # so it does not work when $(somedir) is undefined and # $(DESTDIR) is not. # To support the latter case, we have to write # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), # so the `.' trick is pointless. mkdir_p='mkdir -p --' else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. for d in ./-p ./--version; do test -d $d && rmdir $d done # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. if test -f "$ac_aux_dir/mkinstalldirs"; then mkdir_p='$(mkinstalldirs)' else mkdir_p='$(install_sh) -d' fi fi for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_AWK+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then echo "$as_me:$LINENO: result: $AWK" >&5 echo "${ECHO_T}$AWK" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$AWK" && break done echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.make <<\_ACEOF all: @echo 'ac_maketemp="$(MAKE)"' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` if test -n "$ac_maketemp"; then eval ac_cv_prog_make_${ac_make}_set=yes else eval ac_cv_prog_make_${ac_make}_set=no fi rm -f conftest.make fi if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 SET_MAKE= else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo done .PHONY: am__doit END # If we don't find an include directive, just comment out the code. echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6 am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # We grep out `Entering directory' and `Leaving directory' # messages which can occur if `w' ends up in MAKEFLAGS. # In particular we don't look at `^make:' because GNU make might # be invoked under some other name (usually "gmake"), in which # case it prints its new name instead of `make'. if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then am__include=include am__quote= _am_result=GNU fi # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then am__include=.include am__quote="\"" _am_result=BSD fi fi echo "$as_me:$LINENO: result: $_am_result" >&5 echo "${ECHO_T}$_am_result" >&6 rm -f confinc confmf # Check whether --enable-dependency-tracking or --disable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then enableval="$enable_dependency_tracking" fi; if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi # AC_MSG_NOTICE([Beginning automake initialisation.]) # Stuff for automake # test to see if srcdir already configured if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} { (exit 1); exit 1; }; } fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='dylp' VERSION='1.6.0' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} install_sh=${install_sh-"$am_aux_dir/install-sh"} # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then echo "$as_me:$LINENO: result: $STRIP" >&5 echo "${ECHO_T}$STRIP" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 echo "${ECHO_T}$ac_ct_STRIP" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi STRIP=$ac_ct_STRIP else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. AMTAR=${AMTAR-"${am_missing_run}tar"} am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' depcc="$CC" am_compiler_list= echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6 CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi depcc="$CXX" am_compiler_list= echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5 echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6 CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5 echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6 # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then enableval="$enable_maintainer_mode" USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi; echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5 echo "${ECHO_T}$USE_MAINTAINER_MODE" >&6 if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE coin_have_externals=no if test "$enable_maintainer_mode" = yes; then # If maintainer mode is chosen, we make sure that the correct versions # of the tools are used, and that we know where libtool.m4 is (to # recreate acinclude.m4) LIBTOOLM4= # Normally, $HOME AUTOTOOLS_DFLT=$HOME echo "$as_me:$LINENO: checking whether we are using the correct autotools" >&5 echo $ECHO_N "checking whether we are using the correct autotools... $ECHO_C" >&6 if test "${ac_cv_use_correct_autotools+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_use_correct_autotools=check fi echo "$as_me:$LINENO: result: $ac_cv_use_correct_autotools" >&5 echo "${ECHO_T}$ac_cv_use_correct_autotools" >&6 if test $ac_cv_use_correct_autotools = check; then ac_cv_use_correct_autotools=yes # Check if we have autoconf # Extract the first word of "autoconf", so it can be a program name with args. set dummy autoconf; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_have_autoconf+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$have_autoconf"; then ac_cv_prog_have_autoconf="$have_autoconf" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_have_autoconf="yes" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_have_autoconf" && ac_cv_prog_have_autoconf="no" fi fi have_autoconf=$ac_cv_prog_have_autoconf if test -n "$have_autoconf"; then echo "$as_me:$LINENO: result: $have_autoconf" >&5 echo "${ECHO_T}$have_autoconf" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi if test $have_autoconf = no; then { { echo "$as_me:$LINENO: error: You specified you want to use maintainer mode, but I cannot find autoconf in your path." >&5 echo "$as_me: error: You specified you want to use maintainer mode, but I cannot find autoconf in your path." >&2;} { (exit 1); exit 1; }; } fi # Check whether autoconf is the correct version correct_version='2.59' grep_version=`echo $correct_version | sed -e 's/\\./\\\\\\./g'` echo "$as_me:$LINENO: checking whether we are using the correct version ($correct_version) of autoconf" >&5 echo $ECHO_N "checking whether we are using the correct version ($correct_version) of autoconf... $ECHO_C" >&6 autoconf --version > confauto.out 2>&1 if $EGREP $grep_version confauto.out >/dev/null 2>&1; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else rm -f confauto.out echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 { { echo "$as_me:$LINENO: error: You don't have the correct version of autoconf as the first one in your path." >&5 echo "$as_me: error: You don't have the correct version of autoconf as the first one in your path." >&2;} { (exit 1); exit 1; }; } fi rm -f confauto.out # Check if the executable autoconf is picked up from the correct location echo "$as_me:$LINENO: checking whether autoconf is coming from the correct location" >&5 echo $ECHO_N "checking whether autoconf is coming from the correct location... $ECHO_C" >&6 autoconf_dir=`which autoconf | sed -e 's=/autoconf=='` autoconf_dir=`cd $autoconf_dir; pwd` if test x$AUTOTOOLS_DIR = x; then want_dir=$AUTOTOOLS_DFLT/bin else want_dir=$AUTOTOOLS_DIR/bin fi if test $autoconf_dir = `cd $want_dir; pwd`; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else rm -f confauto.out echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 { { echo "$as_me:$LINENO: error: The autoconf executable should be picked up from \$AUTOTOOLS_DFLT/bin or \$AUTOTOOLS_DIR/bin." >&5 echo "$as_me: error: The autoconf executable should be picked up from \$AUTOTOOLS_DFLT/bin or \$AUTOTOOLS_DIR/bin." >&2;} { (exit 1); exit 1; }; } fi # Check if we have automake # Extract the first word of "automake", so it can be a program name with args. set dummy automake; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_have_automake+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$have_automake"; then ac_cv_prog_have_automake="$have_automake" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_have_automake="yes" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_have_automake" && ac_cv_prog_have_automake="no" fi fi have_automake=$ac_cv_prog_have_automake if test -n "$have_automake"; then echo "$as_me:$LINENO: result: $have_automake" >&5 echo "${ECHO_T}$have_automake" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi if test $have_automake = no; then { { echo "$as_me:$LINENO: error: You specified you want to use maintainer mode, but I cannot find automake in your path." >&5 echo "$as_me: error: You specified you want to use maintainer mode, but I cannot find automake in your path." >&2;} { (exit 1); exit 1; }; } fi # Check whether automake is the correct version correct_version='1.9.6' grep_version=`echo $correct_version | sed -e 's/\\./\\\\\\./g'` echo "$as_me:$LINENO: checking whether we are using the correct version ($correct_version) of automake" >&5 echo $ECHO_N "checking whether we are using the correct version ($correct_version) of automake... $ECHO_C" >&6 automake --version > confauto.out 2>&1 if $EGREP $grep_version confauto.out >/dev/null 2>&1; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else rm -f confauto.out echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 { { echo "$as_me:$LINENO: error: You don't have the correct version of automake as the first one in your path." >&5 echo "$as_me: error: You don't have the correct version of automake as the first one in your path." >&2;} { (exit 1); exit 1; }; } fi rm -f confauto.out # Check if the executable automake is picked up from the correct location echo "$as_me:$LINENO: checking whether automake is coming from the correct location" >&5 echo $ECHO_N "checking whether automake is coming from the correct location... $ECHO_C" >&6 automake_dir=`which automake | sed -e 's=/automake=='` automake_dir=`cd $automake_dir; pwd` if test x$AUTOTOOLS_DIR = x; then want_dir=$AUTOTOOLS_DFLT/bin else want_dir=$AUTOTOOLS_DIR/bin fi if test $automake_dir = `cd $want_dir; pwd`; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else rm -f confauto.out echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 { { echo "$as_me:$LINENO: error: The automake executable should be picked up from \$AUTOTOOLS_DFLT/bin or \$AUTOTOOLS_DIR/bin." >&5 echo "$as_me: error: The automake executable should be picked up from \$AUTOTOOLS_DFLT/bin or \$AUTOTOOLS_DIR/bin." >&2;} { (exit 1); exit 1; }; } fi # Check if this is the correct version of libtool (with escaped dots) if test x$AUTOTOOLS_DIR = x; then want_dir=$AUTOTOOLS_DFLT/share else want_dir=$AUTOTOOLS_DIR/share fi correct_version='1.5.22' grep_version=`echo $correct_version | sed -e 's/\\./\\\\\\./g'` if test -r $want_dir/libtool/ltmain.sh; then have_ltmain=yes : else have_ltmain=no : fi echo "$as_me:$LINENO: checking whether we are using the correct version ($correct_version) of libtool." >&5 echo $ECHO_N "checking whether we are using the correct version ($correct_version) of libtool.... $ECHO_C" >&6 if test $have_ltmain = yes; then if $EGREP $grep_version $want_dir/libtool/ltmain.sh >/dev/null 2>&1; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 { { echo "$as_me:$LINENO: error: You don't have the correct version of libtool." >&5 echo "$as_me: error: You don't have the correct version of libtool." >&2;} { (exit 1); exit 1; }; } fi else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 { { echo "$as_me:$LINENO: error: I cannot find the ltmain.sh file." >&5 echo "$as_me: error: I cannot find the ltmain.sh file." >&2;} { (exit 1); exit 1; }; } fi fi # Check if we can find the libtool file if test x$AUTOTOOLS_DIR = x; then want_dir=$AUTOTOOLS_DFLT/share else want_dir=$AUTOTOOLS_DIR/share fi if test -r $want_dir/aclocal/libtool.m4; then LIBTOOLM4="$want_dir/aclocal/libtool.m4" : else { { echo "$as_me:$LINENO: error: I cannot find the libtool.m4 file." >&5 echo "$as_me: error: I cannot find the libtool.m4 file." >&2;} { (exit 1); exit 1; }; } : fi # Check if we have an Externals file if test -r $srcdir/Externals; then coin_have_externals=yes fi # Check if subversion is installed and understands https # Extract the first word of "svn", so it can be a program name with args. set dummy svn; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_have_svn+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$have_svn"; then ac_cv_prog_have_svn="$have_svn" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_have_svn="yes" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_have_svn" && ac_cv_prog_have_svn="no" fi fi have_svn=$ac_cv_prog_have_svn if test -n "$have_svn"; then echo "$as_me:$LINENO: result: $have_svn" >&5 echo "${ECHO_T}$have_svn" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi if test x$have_svn = xyes; then echo "$as_me:$LINENO: checking whether svn understands https" >&5 echo $ECHO_N "checking whether svn understands https... $ECHO_C" >&6 if test "${ac_cv_svn_understands_https+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else svn --version > confauto.out 2>&1 if $EGREP https confauto.out >/dev/null 2>&1; then ac_cv_svn_understands_https=yes else ac_cv_svn_understands_https=no have_svn=no ac_cv_prog_have_svn=no fi rm -f confauto.out fi echo "$as_me:$LINENO: result: $ac_cv_svn_understands_https" >&5 echo "${ECHO_T}$ac_cv_svn_understands_https" >&6 fi # Find the location of the BuildTools directory BUILDTOOLSDIR= if test -r $srcdir/BuildTools/coin.m4; then BUILDTOOLSDIR=$srcdir/BuildTools else if test -r $srcdir/../BuildTools/coin.m4; then BUILDTOOLSDIR=$srcdir/../BuildTools else if test -r $srcdir/../../BuildTools/coin.m4; then BUILDTOOLSDIR=$srcdir/../../BuildTools else { { echo "$as_me:$LINENO: error: Cannot find the BuildTools directory" >&5 echo "$as_me: error: Cannot find the BuildTools directory" >&2;} { (exit 1); exit 1; }; } fi fi fi # The following variable is set to the name of the directory where # the autotool scripts are located AUX_DIR=$ac_aux_dir fi # helpful variable for the base directory of this package abs_source_dir=`cd $srcdir; pwd` # Stuff for example Makefiles if test x$prefix = xNONE; then full_prefix=$ac_default_prefix else full_prefix=$prefix fi full_prefix=`cd $full_prefix ; pwd` abs_lib_dir=$full_prefix/lib abs_include_dir=$full_prefix/include abs_bin_dir=$full_prefix/bin if test $coin_have_externals = yes && test x$have_svn = xyes; then HAVE_EXTERNALS_TRUE= HAVE_EXTERNALS_FALSE='#' else HAVE_EXTERNALS_TRUE='#' HAVE_EXTERNALS_FALSE= fi # AC_MSG_NOTICE([End automake initialisation.]) LIBTOOL= if test -r ../libtool; then coin_config_dir=.. LIBTOOL='$(SHELL) $(top_builddir)/../libtool' fi if test "x$LIBTOOL" = x; then if test -r ../../libtool; then coin_config_dir=../.. LIBTOOL='$(SHELL) $(top_builddir)/../../libtool' fi fi if test "x$LIBTOOL" = x; then # AC_MSG_NOTICE([Creating libtool script (calling COIN_PROG_LIBTOOL).]) # Stuff for libtool # Check whether --enable-shared or --disable-shared was given. if test "${enable_shared+set}" = set; then enableval="$enable_shared" p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi; # Check whether --enable-fast-install or --disable-fast-install was given. if test "${enable_fast_install+set}" = set; then enableval="$enable_fast_install" p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi; echo "$as_me:$LINENO: checking host system type" >&5 echo $ECHO_N "checking host system type... $ECHO_C" >&6 if test "${ac_cv_host+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_host_alias=$host_alias test -z "$ac_cv_host_alias" && ac_cv_host_alias=$ac_cv_build_alias ac_cv_host=`$ac_config_sub $ac_cv_host_alias` || { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5 echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:$LINENO: result: $ac_cv_host" >&5 echo "${ECHO_T}$ac_cv_host" >&6 host=$ac_cv_host host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6 if test "${lt_cv_path_SED+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done fi SED=$lt_cv_path_SED echo "$as_me:$LINENO: result: $SED" >&5 echo "${ECHO_T}$SED" >&6 # Check whether --with-gnu-ld or --without-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then withval="$with_gnu_ld" test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi; ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. echo "$as_me:$LINENO: checking for ld used by $CC" >&5 echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then echo "$as_me:$LINENO: checking for GNU ld" >&5 echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 else echo "$as_me:$LINENO: checking for non-GNU ld" >&5 echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 fi if test "${lt_cv_path_LD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 echo "${ECHO_T}$LD" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} { (exit 1); exit 1; }; } echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 if test "${lt_cv_prog_gnu_ld+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 with_gnu_ld=$lt_cv_prog_gnu_ld echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5 echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6 if test "${lt_cv_ld_reload_flag+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_ld_reload_flag='-r' fi echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5 echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6 reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5 echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6 if test "${lt_cv_path_NM+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm fi fi echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5 echo "${ECHO_T}$lt_cv_path_NM" >&6 NM="$lt_cv_path_NM" echo "$as_me:$LINENO: checking whether ln -s works" >&5 echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6 LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:$LINENO: result: no, using $LN_S" >&5 echo "${ECHO_T}no, using $LN_S" >&6 fi echo "$as_me:$LINENO: checking how to recognise dependent libraries" >&5 echo $ECHO_N "checking how to recognise dependent libraries... $ECHO_C" >&6 if test "${lt_cv_deplibs_check_method+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix4* | aix5*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump'. lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | kfreebsd*-gnu | dragonfly*) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix3*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be Linux ELF. linux*) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; nto-qnx*) lt_cv_deplibs_check_method=unknown ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; esac fi echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5 echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6 file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check whether --enable-libtool-lock or --disable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then enableval="$enable_libtool_lock" fi; test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line 6423 "configure"' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6 if test "${lt_cv_cc_needs_belf+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then lt_cv_cc_needs_belf=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 lt_cv_cc_needs_belf=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6 if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; sparc*-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) LD="${LD-ld} -m elf64_sparc" ;; *) LD="${LD-ld} -64" ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test "${ac_cv_prog_CPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi echo "$as_me:$LINENO: result: $CPP" >&5 echo "${ECHO_T}$CPP" >&6 ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&5 echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu echo "$as_me:$LINENO: checking for ANSI C header files" >&5 echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 if test "${ac_cv_header_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_header_stdc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stdc=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 echo "${ECHO_T}$ac_cv_header_stdc" >&6 if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF #define STDC_HEADERS 1 _ACEOF fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_Header=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_Header=no" fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to coin-dylp@lists.coin-or.org ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then ac_ext=cc ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6 if test -z "$CXXCPP"; then if test "${ac_cv_prog_CXXCPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi echo "$as_me:$LINENO: result: $CXXCPP" >&5 echo "${ECHO_T}$CXXCPP" >&6 ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details." >&5 echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi ac_ext=cc ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi # Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! # find the maximum length of command line arguments echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5 echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6 if test "${lt_cv_sys_max_cmd_len+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} while (test "X"`$SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \ = "XX$teststring") >/dev/null 2>&1 && new_result=`expr "X$teststring" : ".*" 2>&1` && lt_cv_sys_max_cmd_len=$new_result && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done teststring= # Add a significant safety factor because C++ compilers can tack on massive # amounts of additional arguments before passing them to the linker. # It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5 echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6 else echo "$as_me:$LINENO: result: none" >&5 echo "${ECHO_T}none" >&6 fi # Check for command to grab the raw symbol name followed by C symbol from nm. echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5 echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6 if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Transform an extracted symbol line into a proper C declaration lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32*) symcode='[ABCDGISTW]' ;; hpux*) # Its linker distinguishes data from code symbols if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" ;; linux*) if test "$host_cpu" = ia64; then symcode='[ABCDGIRSTW]' lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Try without a prefix undercore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Now try to grab the symbols. nlist=conftest.nm if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5 (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if grep ' nm_test_var$' "$nlist" >/dev/null; then if grep ' nm_test_func$' "$nlist" >/dev/null; then cat < conftest.$ac_ext #ifdef __cplusplus extern "C" { #endif EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' cat <> conftest.$ac_ext #if defined (__STDC__) && __STDC__ # define lt_ptr_t void * #else # define lt_ptr_t char * # define const #endif /* The mapping between symbol names and symbols. */ const struct { const char *name; lt_ptr_t address; } lt_preloaded_symbols[] = { EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext cat <<\EOF >> conftest.$ac_ext {0, (lt_ptr_t) 0} }; #ifdef __cplusplus } #endif EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_save_LIBS="$LIBS" lt_save_CFLAGS="$CFLAGS" LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS="$lt_save_LIBS" CFLAGS="$lt_save_CFLAGS" else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -f conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then echo "$as_me:$LINENO: result: failed" >&5 echo "${ECHO_T}failed" >&6 else echo "$as_me:$LINENO: result: ok" >&5 echo "${ECHO_T}ok" >&6 fi echo "$as_me:$LINENO: checking for objdir" >&5 echo $ECHO_N "checking for objdir... $ECHO_C" >&6 if test "${lt_cv_objdir+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5 echo "${ECHO_T}$lt_cv_objdir" >&6 objdir=$lt_cv_objdir case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed='sed -e 1s/^X//' sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' # Constants: rm="rm -f" # Global variables: default_ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a ltmain="$ac_aux_dir/ltmain.sh" ofile="$default_ofile" with_gnu_ld="$lt_cv_prog_gnu_ld" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_AR+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="${ac_tool_prefix}ar" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then echo "$as_me:$LINENO: result: $AR" >&5 echo "${ECHO_T}$AR" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_AR+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="ar" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="false" fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 echo "${ECHO_T}$ac_ct_AR" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi AR=$ac_ct_AR else AR="$ac_cv_prog_AR" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then echo "$as_me:$LINENO: result: $RANLIB" >&5 echo "${ECHO_T}$RANLIB" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 echo "${ECHO_T}$ac_ct_RANLIB" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi RANLIB=$ac_ct_RANLIB else RANLIB="$ac_cv_prog_RANLIB" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then echo "$as_me:$LINENO: result: $STRIP" >&5 echo "${ECHO_T}$STRIP" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 echo "${ECHO_T}$ac_ct_STRIP" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi STRIP=$ac_ct_STRIP else STRIP="$ac_cv_prog_STRIP" fi old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$AR" && AR=ar test -z "$AR_FLAGS" && AR_FLAGS=cru test -z "$AS" && AS=as test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$LD" && LD=ld test -z "$LN_S" && LN_S="ln -s" test -z "$MAGIC_CMD" && MAGIC_CMD=file test -z "$NM" && NM=nm test -z "$SED" && SED=sed test -z "$OBJDUMP" && OBJDUMP=objdump test -z "$RANLIB" && RANLIB=: test -z "$STRIP" && STRIP=: test -z "$ac_objext" && ac_objext=o # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6 if test "${lt_cv_path_MAGIC_CMD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 echo "${ECHO_T}$MAGIC_CMD" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then echo "$as_me:$LINENO: checking for file" >&5 echo $ECHO_N "checking for file... $ECHO_C" >&6 if test "${lt_cv_path_MAGIC_CMD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 echo "${ECHO_T}$MAGIC_CMD" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi else MAGIC_CMD=: fi fi fi ;; esac enable_dlopen=no enable_win32_dll=no # Check whether --enable-libtool-lock or --disable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then enableval="$enable_libtool_lock" fi; test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Check whether --with-pic or --without-pic was given. if test "${with_pic+set}" = set; then withval="$with_pic" pic_mode="$withval" else pic_mode=default fi; test -z "$pic_mode" && pic_mode=default # Use C for the default configuration in the libtool script tagname= lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;\n" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}\n' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $rm conftest* ac_outfile=conftest.$ac_objext printf "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $rm conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then lt_prog_compiler_no_builtin_flag=' -fno-builtin' echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:8387: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:8391: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6 if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; interix3*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; *) lt_prog_compiler_pic='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case $cc_basename in xlc*) lt_prog_compiler_pic='-qnocommon' lt_prog_compiler_wl='-Wl,' ;; esac ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; linux*) case $cc_basename in icc* | ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; pgcc* | pgf77* | pgf90* | pgf95*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; esac ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5 echo "${ECHO_T}$lt_prog_compiler_pic" >&6 # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6 if test "${lt_prog_compiler_pic_works+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:8655: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:8659: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_prog_compiler_pic_works=yes fi fi $rm conftest* fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6 if test x"$lt_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6 if test "${lt_prog_compiler_static_works+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" printf "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_prog_compiler_static_works=yes fi else lt_prog_compiler_static_works=yes fi fi $rm conftest* LDFLAGS="$save_LDFLAGS" fi echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5 echo "${ECHO_T}$lt_prog_compiler_static_works" >&6 if test x"$lt_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_c_o+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_c_o=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:8759: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:8763: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6 hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no echo "$as_me:$LINENO: result: $hard_links" >&5 echo "${ECHO_T}$hard_links" >&6 if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 runpath_var= allow_undefined_flag= enable_shared_with_static_runtimes=no archive_cmds= archive_expsym_cmds= old_archive_From_new_cmds= old_archive_from_expsyms_cmds= export_dynamic_flag_spec= whole_archive_flag_spec= thread_safe_flag_spec= hardcode_libdir_flag_spec= hardcode_libdir_flag_spec_ld= hardcode_libdir_separator= hardcode_direct=no hardcode_minus_L=no hardcode_shlibpath_var=unsupported link_all_deplibs=unknown hardcode_automatic=no module_cmds= module_expsym_cmds= always_export_symbols=no export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms="_GLOBAL_OFFSET_TABLE_" # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. extract_expsyms_cmds= # Just being paranoid about ensuring that cc_basename is set. for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` case $host_os in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>/dev/null` in *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. EOF fi ;; amigaos*) archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can't use # them. ld_shlibs=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; interix3*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; linux*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_addflag= case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; esac archive_cmds='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test $supports_anon_versioning = yes; then archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ $echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. EOF elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_libdir_separator=':' link_all_deplibs=yes if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 hardcode_direct=yes else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # see comment about different semantics on the GNU ld section ld_shlibs=no ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_From_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs' fix_srcfile_path='`cygpath -w "$srcfile"`' enable_shared_with_static_runtimes=yes ;; darwin* | rhapsody*) case $host_os in rhapsody* | darwin1.[012]) allow_undefined_flag='${wl}-undefined ${wl}suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[012]) allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) allow_undefined_flag='${wl}-undefined ${wl}dynamic_lookup' ;; esac fi ;; esac archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported whole_archive_flag_spec='' link_all_deplibs=yes if test "$GCC" = yes ; then output_verbose_link_cmd='echo' archive_cmds='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else case $cc_basename in xlc*) output_verbose_link_cmd='echo' archive_cmds='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) ld_shlibs=no ;; esac fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; freebsd1*) ld_shlibs=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | kfreebsd*-gnu | dragonfly*) archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_libdir_flag_spec_ld='+b $libdir' hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_ld='-rpath $libdir' fi hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: link_all_deplibs=yes ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; openbsd*) hardcode_direct=yes hardcode_shlibpath_var=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_From_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' fi hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z text' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine linker options so we # cannot just pass the convience library names through # without $wl, iff we do not link with $LD. # Luckily, gcc supports the same syntax we need for Sun Studio. # Supported since Solaris 2.6 (maybe 2.5.1?) case $wlarc in '') whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; *) whole_archive_flag_spec='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; esac ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac fi echo "$as_me:$LINENO: result: $ld_shlibs" >&5 echo "${ECHO_T}$ld_shlibs" >&6 test "$ld_shlibs" = no && can_build_shared=no # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 $rm conftest* printf "$lt_simple_compile_test_code" > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } then archive_cmds_need_lc=no else archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5 echo "${ECHO_T}$archive_cmds_need_lc" >&6 ;; esac fi ;; esac echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix4* | aix5*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` else sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' fi sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; kfreebsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[123]*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; freebsd*) # from 4.6 on shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; interix3*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; knetbsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' shlibpath_overrides_runpath=no else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' shlibpath_overrides_runpath=yes case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac echo "$as_me:$LINENO: result: $dynamic_linker" >&5 echo "${ECHO_T}$dynamic_linker" >&6 test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 hardcode_action= if test -n "$hardcode_libdir_flag_spec" || \ test -n "$runpath_var" || \ test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi echo "$as_me:$LINENO: result: $hardcode_action" >&5 echo "${ECHO_T}$hardcode_action" >&6 if test "$hardcode_action" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi striplib= old_striplib= echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi ;; *) echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 ;; esac fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dl_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dl_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 if test $ac_cv_lib_dl_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) echo "$as_me:$LINENO: checking for shl_load" >&5 echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 if test "${ac_cv_func_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define shl_load to an innocuous variant, in case declares shl_load. For example, HP-UX 11i declares gettimeofday. */ #define shl_load innocuous_shl_load /* System header to define __stub macros and hopefully few prototypes, which can conflict with char shl_load (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef shl_load /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char shl_load (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_shl_load) || defined (__stub___shl_load) choke me #else char (*f) () = shl_load; #endif #ifdef __cplusplus } #endif int main () { return f != shl_load; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_shl_load=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_shl_load=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 echo "${ECHO_T}$ac_cv_func_shl_load" >&6 if test $ac_cv_func_shl_load = yes; then lt_cv_dlopen="shl_load" else echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 if test "${ac_cv_lib_dld_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char shl_load (); int main () { shl_load (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dld_shl_load=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dld_shl_load=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 if test $ac_cv_lib_dld_shl_load = yes; then lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" else echo "$as_me:$LINENO: checking for dlopen" >&5 echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 if test "${ac_cv_func_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define dlopen to an innocuous variant, in case declares dlopen. For example, HP-UX 11i declares gettimeofday. */ #define dlopen innocuous_dlopen /* System header to define __stub macros and hopefully few prototypes, which can conflict with char dlopen (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef dlopen /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_dlopen) || defined (__stub___dlopen) choke me #else char (*f) () = dlopen; #endif #ifdef __cplusplus } #endif int main () { return f != dlopen; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 echo "${ECHO_T}$ac_cv_func_dlopen" >&6 if test $ac_cv_func_dlopen = yes; then lt_cv_dlopen="dlopen" else echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dl_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dl_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 if test $ac_cv_lib_dl_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 if test "${ac_cv_lib_svld_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_svld_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_svld_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 if test $ac_cv_lib_svld_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 if test "${ac_cv_lib_dld_dld_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dld_link (); int main () { dld_link (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dld_dld_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dld_dld_link=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 if test $ac_cv_lib_dld_dld_link = yes; then lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 if test "${lt_cv_dlopen_self+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } else puts (dlerror ()); exit (status); } EOF if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 echo "${ECHO_T}$lt_cv_dlopen_self" >&6 if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 if test "${lt_cv_dlopen_self_static+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } else puts (dlerror ()); exit (status); } EOF if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi # Report which library types will actually be built echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 echo "$as_me:$LINENO: result: $can_build_shared" >&5 echo "${ECHO_T}$can_build_shared" >&6 echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6 test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix4* | aix5*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac echo "$as_me:$LINENO: result: $enable_shared" >&5 echo "${ECHO_T}$enable_shared" >&6 echo "$as_me:$LINENO: checking whether to build static libraries" >&5 echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes echo "$as_me:$LINENO: result: $enable_static" >&5 echo "${ECHO_T}$enable_static" >&6 # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler \ CC \ LD \ lt_prog_compiler_wl \ lt_prog_compiler_pic \ lt_prog_compiler_static \ lt_prog_compiler_no_builtin_flag \ export_dynamic_flag_spec \ thread_safe_flag_spec \ whole_archive_flag_spec \ enable_shared_with_static_runtimes \ old_archive_cmds \ old_archive_from_new_cmds \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ archive_cmds \ archive_expsym_cmds \ postinstall_cmds \ postuninstall_cmds \ old_archive_from_expsyms_cmds \ allow_undefined_flag \ no_undefined_flag \ export_symbols_cmds \ hardcode_libdir_flag_spec \ hardcode_libdir_flag_spec_ld \ hardcode_libdir_separator \ hardcode_automatic \ module_cmds \ module_expsym_cmds \ lt_cv_prog_compiler_c_o \ exclude_expsyms \ include_expsyms; do case $var in old_archive_cmds | \ old_archive_from_new_cmds | \ archive_cmds | \ archive_expsym_cmds | \ module_cmds | \ module_expsym_cmds | \ old_archive_from_expsyms_cmds | \ export_symbols_cmds | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="${ofile}T" trap "$rm \"$cfgfile\"; exit 1" 1 2 15 $rm -f "$cfgfile" { echo "$as_me:$LINENO: creating $ofile" >&5 echo "$as_me: creating $ofile" >&6;} cat <<__EOF__ >> "$cfgfile" #! $SHELL # `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # # This file is part of GNU Libtool: # Originally by Gordon Matzigkeit , 1996 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="$SED -e 1s/^X//" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # The names of the tagged configurations supported by this script. available_tags= # ### BEGIN LIBTOOL CONFIG # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # LTCC compiler flags. LTCFLAGS=$lt_LTCFLAGS # A language-specific compiler. CC=$lt_compiler # Is the compiler the GNU C compiler? with_gcc=$GCC # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Must we lock files when doing compilation? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path="$fix_srcfile_path" # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # ### END LIBTOOL CONFIG __EOF__ case $host_os in aix3*) cat <<\EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi EOF ;; esac # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || \ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" # Check whether --with-tags or --without-tags was given. if test "${with_tags+set}" = set; then withval="$with_tags" tagnames="$withval" fi; if test -f "$ltmain" && test -n "$tagnames"; then if test ! -f "${ofile}"; then { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not exist" >&5 echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;} fi if test -z "$LTCC"; then eval "`$SHELL ${ofile} --config | grep '^LTCC='`" if test -z "$LTCC"; then { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not look like a libtool script" >&5 echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;} else { echo "$as_me:$LINENO: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5 echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;} fi fi if test -z "$LTCFLAGS"; then eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`" fi # Extract list of available tagged configurations in $ofile. # Note that this assumes the entire list is on one line. available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for tagname in $tagnames; do IFS="$lt_save_ifs" # Check whether tagname contains only valid characters case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in "") ;; *) { { echo "$as_me:$LINENO: error: invalid tag name: $tagname" >&5 echo "$as_me: error: invalid tag name: $tagname" >&2;} { (exit 1); exit 1; }; } ;; esac if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null then { { echo "$as_me:$LINENO: error: tag name \"$tagname\" already exists" >&5 echo "$as_me: error: tag name \"$tagname\" already exists" >&2;} { (exit 1); exit 1; }; } fi # Update the list of available tags. if test -n "$tagname"; then echo appending configuration tag \"$tagname\" to $ofile case $tagname in CXX) if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then ac_ext=cc ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_flag_spec_ld_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;\n" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $rm conftest* ac_outfile=conftest.$ac_objext printf "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $rm conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} compiler=$CC compiler_CXX=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` # We don't want -fno-exception wen compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld or --without-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then withval="$with_gnu_ld" test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi; ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. echo "$as_me:$LINENO: checking for ld used by $CC" >&5 echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then echo "$as_me:$LINENO: checking for GNU ld" >&5 echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 else echo "$as_me:$LINENO: checking for non-GNU ld" >&5 echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 fi if test "${lt_cv_path_LD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 echo "${ECHO_T}$LD" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} { (exit 1); exit 1; }; } echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 if test "${lt_cv_prog_gnu_ld+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ grep 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes if test "$GXX" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 hardcode_direct_CXX=yes else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols_CXX=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_CXX='-berok' # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' ${wl}-bernotok' allow_undefined_flag_CXX=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' archive_cmds_need_lc_CXX=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_CXX=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_CXX=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; darwin* | rhapsody*) case $host_os in rhapsody* | darwin1.[012]) allow_undefined_flag_CXX='${wl}-undefined ${wl}suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[012]) allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) allow_undefined_flag_CXX='${wl}-undefined ${wl}dynamic_lookup' ;; esac fi ;; esac archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported whole_archive_flag_spec_CXX='' link_all_deplibs_CXX=yes if test "$GXX" = yes ; then lt_int_apple_cc_single_mod=no output_verbose_link_cmd='echo' if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then lt_int_apple_cc_single_mod=yes fi if test "X$lt_int_apple_cc_single_mod" = Xyes ; then archive_cmds_CXX='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' else archive_cmds_CXX='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' fi module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds if test "X$lt_int_apple_cc_single_mod" = Xyes ; then archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' fi module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else case $cc_basename in xlc*) output_verbose_link_cmd='echo' archive_cmds_CXX='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) ld_shlibs_CXX=no ;; esac fi ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd[12]*) # C++ shared libraries reported to be fairly broken before switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | kfreebsd*-gnu | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; gnu*) ;; hpux9*) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='${wl}-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) archive_cmds_CXX='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes; then archive_cmds_CXX='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: case $host_cpu in hppa*64*|ia64*) hardcode_libdir_flag_spec_ld_CXX='+b $libdir' ;; *) export_dynamic_flag_spec_CXX='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; *) hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; interix3*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: ;; linux*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' hardcode_libdir_flag_spec_CXX='${wl}--rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc*) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC*) # Portland Group C++ compiler archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; openbsd2*) # C++ shared libraries are fairly broken ld_shlibs_CXX=no ;; openbsd*) hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='${wl}-E' whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd='echo' ;; osf3*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~ $rm $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC*) # Sun C++ 4.2, 5.x and Centerline C++ archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The C++ compiler is used as linker so we must use $wl # flag to pass the commands to the underlying system # linker. We must also pass each convience library through # to the system linker between allextract/defaultextract. # The C++ compiler will combine linker options so we # cannot just pass the convience library names through # without $wl. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; esac link_all_deplibs_CXX=yes output_verbose_link_cmd='echo' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then no_undefined_flag_CXX=' ${wl}-z ${wl}defs' if $CC --version | grep -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" fi hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_CXX='${wl}-z,text' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. # So that behaviour is only enabled if SCOABSPATH is set to a # non-empty value in the environment. Most likely only useful for # creating official distributions of packages. # This is a hack until libtool officially supports absolute path # names for shared libraries. no_undefined_flag_CXX='${wl}-z,text' allow_undefined_flag_CXX='${wl}-z,nodefs' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes export_dynamic_flag_spec_CXX='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 echo "${ECHO_T}$ld_shlibs_CXX" >&6 test "$ld_shlibs_CXX" = no && can_build_shared=no GCC_CXX="$GXX" LD_CXX="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... cat > conftest.$ac_ext <&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no # The `*' in the case matches for architectures that use `case' in # $output_verbose_cmd can trigger glob expansion during the loop # eval without this substitution. output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"` for p in `eval $output_verbose_link_cmd`; do case $p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" \ || test $p = "-R"; then prev=$p continue else prev= fi if test "$pre_test_object_deps_done" = no; then case $p in -L* | -R*) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX="${prev}${p}" else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX="${prev}${p}" else postdeps_CXX="${postdeps_CXX} ${prev}${p}" fi fi ;; *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$predep_objects_CXX"; then predep_objects_CXX="$p" else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX="$p" else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $rm -f confest.$objext # PORTME: override above test on systems where it is broken case $host_os in interix3*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. predep_objects_CXX= postdep_objects_CXX= postdeps_CXX= ;; solaris*) case $cc_basename in CC*) # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. postdeps_CXX='-lCstd -lCrun' ;; esac ;; esac case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | os2* | pw32*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; interix3*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix4* | aix5*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_AC_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case $cc_basename in xlc*) lt_prog_compiler_pic_CXX='-qnocommon' lt_prog_compiler_wl_CXX='-Wl,' ;; esac ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | kfreebsd*-gnu | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux*) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; icpc* | ecpc*) # Intel C++ lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC*) # Portland Group C++ compiler. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_CXX" >&6 # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... $ECHO_C" >&6 if test "${lt_prog_compiler_pic_works_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:13548: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:13552: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_prog_compiler_pic_works_CXX=yes fi fi $rm conftest* fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_CXX" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_works_CXX" >&6 if test x"$lt_prog_compiler_pic_works_CXX" = xyes; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6 if test "${lt_prog_compiler_static_works_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_static_works_CXX=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" printf "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_prog_compiler_static_works_CXX=yes fi else lt_prog_compiler_static_works_CXX=yes fi fi $rm conftest* LDFLAGS="$save_LDFLAGS" fi echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_CXX" >&5 echo "${ECHO_T}$lt_prog_compiler_static_works_CXX" >&6 if test x"$lt_prog_compiler_static_works_CXX" = xyes; then : else lt_prog_compiler_static_CXX= fi echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_c_o_CXX=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:13652: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:13656: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6 hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no echo "$as_me:$LINENO: result: $hard_links" >&5 echo "${ECHO_T}$hard_links" >&6 if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' case $host_os in aix4* | aix5*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX="$ltdll_cmds" ;; cygwin* | mingw*) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([^ ]*\) [^ ]*/\1 DATA/;/^I /d;/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 echo "${ECHO_T}$ld_shlibs_CXX" >&6 test "$ld_shlibs_CXX" = no && can_build_shared=no # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 $rm conftest* printf "$lt_simple_compile_test_code" > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { (eval echo "$as_me:$LINENO: \"$archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 (eval $archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } then archive_cmds_need_lc_CXX=no else archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5 echo "${ECHO_T}$archive_cmds_need_lc_CXX" >&6 ;; esac fi ;; esac echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix4* | aix5*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` else sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' fi sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; kfreebsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[123]*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; freebsd*) # from 4.6 on shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; interix3*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; knetbsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' shlibpath_overrides_runpath=no else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' shlibpath_overrides_runpath=yes case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac echo "$as_me:$LINENO: result: $dynamic_linker" >&5 echo "${ECHO_T}$dynamic_linker" >&6 test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || \ test -n "$runpath_var_CXX" || \ test "X$hardcode_automatic_CXX" = "Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct_CXX" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, CXX)" != no && test "$hardcode_minus_L_CXX" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5 echo "${ECHO_T}$hardcode_action_CXX" >&6 if test "$hardcode_action_CXX" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler_CXX \ CC_CXX \ LD_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_static_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ export_dynamic_flag_spec_CXX \ thread_safe_flag_spec_CXX \ whole_archive_flag_spec_CXX \ enable_shared_with_static_runtimes_CXX \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ postinstall_cmds_CXX \ postuninstall_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ export_symbols_cmds_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_flag_spec_ld_CXX \ hardcode_libdir_separator_CXX \ hardcode_automatic_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ lt_cv_prog_compiler_c_o_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX; do case $var in old_archive_cmds_CXX | \ old_archive_from_new_cmds_CXX | \ archive_cmds_CXX | \ archive_expsym_cmds_CXX | \ module_cmds_CXX | \ module_expsym_cmds_CXX | \ old_archive_from_expsyms_cmds_CXX | \ export_symbols_cmds_CXX | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="$ofile" cat <<__EOF__ >> "$cfgfile" # ### BEGIN LIBTOOL TAG CONFIG: $tagname # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # LTCC compiler flags. LTCFLAGS=$lt_LTCFLAGS # A language-specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU C compiler? with_gcc=$GCC_CXX # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD_CXX # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Must we lock files when doing compilation? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds_CXX old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects_CXX # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects_CXX # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps_CXX # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic_CXX # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path="$fix_srcfile_path_CXX" # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # ### END LIBTOOL TAG CONFIG: $tagname __EOF__ else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC=$lt_save_CC LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ldcxx=$with_gnu_ld with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld else tagname="" fi ;; F77) if test -n "$F77" && test "X$F77" != "Xno"; then ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu archive_cmds_need_lc_F77=no allow_undefined_flag_F77= always_export_symbols_F77=no archive_expsym_cmds_F77= export_dynamic_flag_spec_F77= hardcode_direct_F77=no hardcode_libdir_flag_spec_F77= hardcode_libdir_flag_spec_ld_F77= hardcode_libdir_separator_F77= hardcode_minus_L_F77=no hardcode_automatic_F77=no module_cmds_F77= module_expsym_cmds_F77= link_all_deplibs_F77=unknown old_archive_cmds_F77=$old_archive_cmds no_undefined_flag_F77= whole_archive_flag_spec_F77= enable_shared_with_static_runtimes_F77=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o objext_F77=$objext # Code to be used in simple compile tests lt_simple_compile_test_code=" subroutine t\n return\n end\n" # Code to be used in simple link tests lt_simple_link_test_code=" program t\n end\n" # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $rm conftest* ac_outfile=conftest.$ac_objext printf "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $rm conftest* # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${F77-"f77"} compiler=$CC compiler_F77=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 echo "$as_me:$LINENO: result: $can_build_shared" >&5 echo "${ECHO_T}$can_build_shared" >&6 echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6 test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix4* | aix5*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac echo "$as_me:$LINENO: result: $enable_shared" >&5 echo "${ECHO_T}$enable_shared" >&6 echo "$as_me:$LINENO: checking whether to build static libraries" >&5 echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes echo "$as_me:$LINENO: result: $enable_static" >&5 echo "${ECHO_T}$enable_static" >&6 GCC_F77="$G77" LD_F77="$LD" lt_prog_compiler_wl_F77= lt_prog_compiler_pic_F77= lt_prog_compiler_static_F77= echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 if test "$GCC" = yes; then lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_static_F77='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_F77='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4' ;; beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_F77='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_F77='-fno-common' ;; interix3*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared_F77=no enable_shared=no ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_F77=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_F77='-fPIC' ;; esac ;; *) lt_prog_compiler_pic_F77='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl_F77='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_F77='-Bstatic' else lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp' fi ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case $cc_basename in xlc*) lt_prog_compiler_pic_F77='-qnocommon' lt_prog_compiler_wl_F77='-Wl,' ;; esac ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_F77='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl_F77='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_F77='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static_F77='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl_F77='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static_F77='-non_shared' ;; newsos6) lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; linux*) case $cc_basename in icc* | ecc*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-static' ;; pgcc* | pgf77* | pgf90* | pgf95*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-fpic' lt_prog_compiler_static_F77='-Bstatic' ;; ccc*) lt_prog_compiler_wl_F77='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static_F77='-non_shared' ;; esac ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl_F77='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static_F77='-non_shared' ;; solaris*) lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' case $cc_basename in f77* | f90* | f95*) lt_prog_compiler_wl_F77='-Qoption ld ';; *) lt_prog_compiler_wl_F77='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl_F77='-Qoption ld ' lt_prog_compiler_pic_F77='-PIC' lt_prog_compiler_static_F77='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic_F77='-Kconform_pic' lt_prog_compiler_static_F77='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; unicos*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_can_build_shared_F77=no ;; uts4*) lt_prog_compiler_pic_F77='-pic' lt_prog_compiler_static_F77='-Bstatic' ;; *) lt_prog_compiler_can_build_shared_F77=no ;; esac fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_F77" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_F77" >&6 # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_F77"; then echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... $ECHO_C" >&6 if test "${lt_prog_compiler_pic_works_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_pic_works_F77=no ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_F77" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:15222: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:15226: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_prog_compiler_pic_works_F77=yes fi fi $rm conftest* fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_F77" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_works_F77" >&6 if test x"$lt_prog_compiler_pic_works_F77" = xyes; then case $lt_prog_compiler_pic_F77 in "" | " "*) ;; *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;; esac else lt_prog_compiler_pic_F77= lt_prog_compiler_can_build_shared_F77=no fi fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_F77= ;; *) lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77" ;; esac # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_F77 eval lt_tmp_static_flag=\"$lt_prog_compiler_static_F77\" echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6 if test "${lt_prog_compiler_static_works_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_static_works_F77=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" printf "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_prog_compiler_static_works_F77=yes fi else lt_prog_compiler_static_works_F77=yes fi fi $rm conftest* LDFLAGS="$save_LDFLAGS" fi echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_F77" >&5 echo "${ECHO_T}$lt_prog_compiler_static_works_F77" >&6 if test x"$lt_prog_compiler_static_works_F77" = xyes; then : else lt_prog_compiler_static_F77= fi echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_c_o_F77=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:15326: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:15330: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_F77=yes fi fi chmod u+w . 2>&5 $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_F77" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_c_o_F77" >&6 hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no echo "$as_me:$LINENO: result: $hard_links" >&5 echo "${ECHO_T}$hard_links" >&6 if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 runpath_var= allow_undefined_flag_F77= enable_shared_with_static_runtimes_F77=no archive_cmds_F77= archive_expsym_cmds_F77= old_archive_From_new_cmds_F77= old_archive_from_expsyms_cmds_F77= export_dynamic_flag_spec_F77= whole_archive_flag_spec_F77= thread_safe_flag_spec_F77= hardcode_libdir_flag_spec_F77= hardcode_libdir_flag_spec_ld_F77= hardcode_libdir_separator_F77= hardcode_direct_F77=no hardcode_minus_L_F77=no hardcode_shlibpath_var_F77=unsupported link_all_deplibs_F77=unknown hardcode_automatic_F77=no module_cmds_F77= module_expsym_cmds_F77= always_export_symbols_F77=no export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms_F77= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms_F77="_GLOBAL_OFFSET_TABLE_" # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. extract_expsyms_cmds= # Just being paranoid about ensuring that cc_basename is set. for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` case $host_os in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs_F77=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_F77='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_F77='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_F77= fi supports_anon_versioning=no case `$LD -v 2>/dev/null` in *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs_F77=no cat <&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. EOF fi ;; amigaos*) archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can't use # them. ld_shlibs_F77=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_F77=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_F77=no fi ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_F77='-L$libdir' allow_undefined_flag_F77=unsupported always_export_symbols_F77=no enable_shared_with_static_runtimes_F77=yes export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_F77=no fi ;; interix3*) hardcode_direct_F77=no hardcode_shlibpath_var_F77=no hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' export_dynamic_flag_spec_F77='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_F77='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; linux*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_addflag= case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; esac archive_cmds_F77='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test $supports_anon_versioning = yes; then archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ $echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi else ld_shlibs_F77=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs_F77=no cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. EOF elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_F77=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs_F77=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' else ld_shlibs_F77=no fi ;; esac ;; sunos4*) archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_F77=no fi ;; esac if test "$ld_shlibs_F77" = no; then runpath_var= hardcode_libdir_flag_spec_F77= export_dynamic_flag_spec_F77= whole_archive_flag_spec_F77= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag_F77=unsupported always_export_symbols_F77=yes archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L_F77=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct_F77=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_F77='' hardcode_direct_F77=yes hardcode_libdir_separator_F77=':' link_all_deplibs_F77=yes if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 hardcode_direct_F77=yes else # We have old collect2 hardcode_direct_F77=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_F77=yes hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_libdir_separator_F77= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols_F77=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_F77='-berok' # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF program main end _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_f77_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_F77="-z nodefs" archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF program main end _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_f77_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_F77=' ${wl}-bernotok' allow_undefined_flag_F77=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_F77='$convenience' archive_cmds_need_lc_F77=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes # see comment about different semantics on the GNU ld section ld_shlibs_F77=no ;; bsdi[45]*) export_dynamic_flag_spec_F77=-rdynamic ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_F77=' ' allow_undefined_flag_F77=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_From_new_cmds_F77='true' # FIXME: Should let the user specify the lib program. old_archive_cmds_F77='lib /OUT:$oldlib$oldobjs$old_deplibs' fix_srcfile_path_F77='`cygpath -w "$srcfile"`' enable_shared_with_static_runtimes_F77=yes ;; darwin* | rhapsody*) case $host_os in rhapsody* | darwin1.[012]) allow_undefined_flag_F77='${wl}-undefined ${wl}suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[012]) allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) allow_undefined_flag_F77='${wl}-undefined ${wl}dynamic_lookup' ;; esac fi ;; esac archive_cmds_need_lc_F77=no hardcode_direct_F77=no hardcode_automatic_F77=yes hardcode_shlibpath_var_F77=unsupported whole_archive_flag_spec_F77='' link_all_deplibs_F77=yes if test "$GCC" = yes ; then output_verbose_link_cmd='echo' archive_cmds_F77='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else case $cc_basename in xlc*) output_verbose_link_cmd='echo' archive_cmds_F77='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) ld_shlibs_F77=no ;; esac fi ;; dgux*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_shlibpath_var_F77=no ;; freebsd1*) ld_shlibs_F77=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes hardcode_minus_L_F77=yes hardcode_shlibpath_var_F77=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | kfreebsd*-gnu | dragonfly*) archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds_F77='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds_F77='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' hardcode_libdir_separator_F77=: hardcode_direct_F77=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes export_dynamic_flag_spec_F77='${wl}-E' ;; hpux10*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' hardcode_libdir_separator_F77=: hardcode_direct_F77=yes export_dynamic_flag_spec_F77='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes fi ;; hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' hardcode_libdir_separator_F77=: case $host_cpu in hppa*64*|ia64*) hardcode_libdir_flag_spec_ld_F77='+b $libdir' hardcode_direct_F77=no hardcode_shlibpath_var_F77=no ;; *) hardcode_direct_F77=yes export_dynamic_flag_spec_F77='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_ld_F77='-rpath $libdir' fi hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_F77=: link_all_deplibs_F77=yes ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; newsos6) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_F77=: hardcode_shlibpath_var_F77=no ;; openbsd*) hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' export_dynamic_flag_spec_F77='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-R$libdir' ;; *) archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' ;; esac fi ;; os2*) hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes allow_undefined_flag_F77=unsupported archive_cmds_F77='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_From_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag_F77=' -expect_unresolved \*' archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' fi hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_F77=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' else allow_undefined_flag_F77=' -expect_unresolved \*' archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec_F77='-rpath $libdir' fi hardcode_libdir_separator_F77=: ;; solaris*) no_undefined_flag_F77=' -z text' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else wlarc='' archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' fi hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_shlibpath_var_F77=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine linker options so we # cannot just pass the convience library names through # without $wl, iff we do not link with $LD. # Luckily, gcc supports the same syntax we need for Sun Studio. # Supported since Solaris 2.6 (maybe 2.5.1?) case $wlarc in '') whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' ;; *) whole_archive_flag_spec_F77='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; esac ;; esac link_all_deplibs_F77=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_direct_F77=yes hardcode_minus_L_F77=yes hardcode_shlibpath_var_F77=no ;; sysv4) case $host_vendor in sni) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds_F77='$CC -r -o $output$reload_objs' hardcode_direct_F77=no ;; motorola) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var_F77=no ;; sysv4.3*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_F77=no export_dynamic_flag_spec_F77='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_F77=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs_F77=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*) no_undefined_flag_F77='${wl}-z,text' archive_cmds_need_lc_F77=no hardcode_shlibpath_var_F77=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds_F77='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_F77='${wl}-z,text' allow_undefined_flag_F77='${wl}-z,nodefs' archive_cmds_need_lc_F77=no hardcode_shlibpath_var_F77=no hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator_F77=':' link_all_deplibs_F77=yes export_dynamic_flag_spec_F77='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds_F77='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_shlibpath_var_F77=no ;; *) ld_shlibs_F77=no ;; esac fi echo "$as_me:$LINENO: result: $ld_shlibs_F77" >&5 echo "${ECHO_T}$ld_shlibs_F77" >&6 test "$ld_shlibs_F77" = no && can_build_shared=no # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_F77" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_F77=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_F77 in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 $rm conftest* printf "$lt_simple_compile_test_code" > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_F77 pic_flag=$lt_prog_compiler_pic_F77 compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_F77 allow_undefined_flag_F77= if { (eval echo "$as_me:$LINENO: \"$archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 (eval $archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } then archive_cmds_need_lc_F77=no else archive_cmds_need_lc_F77=yes fi allow_undefined_flag_F77=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* echo "$as_me:$LINENO: result: $archive_cmds_need_lc_F77" >&5 echo "${ECHO_T}$archive_cmds_need_lc_F77" >&6 ;; esac fi ;; esac echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix4* | aix5*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` else sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' fi sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; kfreebsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[123]*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; freebsd*) # from 4.6 on shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; interix3*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; knetbsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' shlibpath_overrides_runpath=no else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' shlibpath_overrides_runpath=yes case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac echo "$as_me:$LINENO: result: $dynamic_linker" >&5 echo "${ECHO_T}$dynamic_linker" >&6 test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 hardcode_action_F77= if test -n "$hardcode_libdir_flag_spec_F77" || \ test -n "$runpath_var_F77" || \ test "X$hardcode_automatic_F77" = "Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct_F77" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, F77)" != no && test "$hardcode_minus_L_F77" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_F77=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_F77=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_F77=unsupported fi echo "$as_me:$LINENO: result: $hardcode_action_F77" >&5 echo "${ECHO_T}$hardcode_action_F77" >&6 if test "$hardcode_action_F77" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler_F77 \ CC_F77 \ LD_F77 \ lt_prog_compiler_wl_F77 \ lt_prog_compiler_pic_F77 \ lt_prog_compiler_static_F77 \ lt_prog_compiler_no_builtin_flag_F77 \ export_dynamic_flag_spec_F77 \ thread_safe_flag_spec_F77 \ whole_archive_flag_spec_F77 \ enable_shared_with_static_runtimes_F77 \ old_archive_cmds_F77 \ old_archive_from_new_cmds_F77 \ predep_objects_F77 \ postdep_objects_F77 \ predeps_F77 \ postdeps_F77 \ compiler_lib_search_path_F77 \ archive_cmds_F77 \ archive_expsym_cmds_F77 \ postinstall_cmds_F77 \ postuninstall_cmds_F77 \ old_archive_from_expsyms_cmds_F77 \ allow_undefined_flag_F77 \ no_undefined_flag_F77 \ export_symbols_cmds_F77 \ hardcode_libdir_flag_spec_F77 \ hardcode_libdir_flag_spec_ld_F77 \ hardcode_libdir_separator_F77 \ hardcode_automatic_F77 \ module_cmds_F77 \ module_expsym_cmds_F77 \ lt_cv_prog_compiler_c_o_F77 \ exclude_expsyms_F77 \ include_expsyms_F77; do case $var in old_archive_cmds_F77 | \ old_archive_from_new_cmds_F77 | \ archive_cmds_F77 | \ archive_expsym_cmds_F77 | \ module_cmds_F77 | \ module_expsym_cmds_F77 | \ old_archive_from_expsyms_cmds_F77 | \ export_symbols_cmds_F77 | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="$ofile" cat <<__EOF__ >> "$cfgfile" # ### BEGIN LIBTOOL TAG CONFIG: $tagname # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_F77 # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77 # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # LTCC compiler flags. LTCFLAGS=$lt_LTCFLAGS # A language-specific compiler. CC=$lt_compiler_F77 # Is the compiler the GNU C compiler? with_gcc=$GCC_F77 # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD_F77 # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_F77 # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_F77 pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77 # Must we lock files when doing compilation? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_F77 # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77 # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77 # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77 # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec_F77 # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds_F77 old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77 # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77 # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds_F77 archive_expsym_cmds=$lt_archive_expsym_cmds_F77 postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds_F77 module_expsym_cmds=$lt_module_expsym_cmds_F77 # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects_F77 # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects_F77 # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps_F77 # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps_F77 # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_F77 # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_F77 # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_F77 # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_F77 # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77 # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_F77 # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77 # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct_F77 # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L_F77 # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_F77 # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic_F77 # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_F77 # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path="$fix_srcfile_path_F77" # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols_F77 # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_F77 # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_F77 # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_F77 # ### END LIBTOOL TAG CONFIG: $tagname __EOF__ else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" else tagname="" fi ;; GCJ) if test -n "$GCJ" && test "X$GCJ" != "Xno"; then # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o objext_GCJ=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}\n" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[] argv) {}; }\n' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $rm conftest* ac_outfile=conftest.$ac_objext printf "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $rm conftest* # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${GCJ-"gcj"} compiler=$CC compiler_GCJ=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` # GCJ did not exist at the time GCC didn't implicitly link libc in. archive_cmds_need_lc_GCJ=no old_archive_cmds_GCJ=$old_archive_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... lt_prog_compiler_no_builtin_flag_GCJ= if test "$GCC" = yes; then lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin' echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:17533: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:17537: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6 if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl_GCJ= lt_prog_compiler_pic_GCJ= lt_prog_compiler_static_GCJ= echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 if test "$GCC" = yes; then lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_static_GCJ='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_GCJ='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_GCJ='-m68020 -resident32 -malways-restore-a4' ;; beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_GCJ='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_GCJ='-fno-common' ;; interix3*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared_GCJ=no enable_shared=no ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_GCJ=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_GCJ='-fPIC' ;; esac ;; *) lt_prog_compiler_pic_GCJ='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl_GCJ='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_GCJ='-Bstatic' else lt_prog_compiler_static_GCJ='-bnso -bI:/lib/syscalls.exp' fi ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case $cc_basename in xlc*) lt_prog_compiler_pic_GCJ='-qnocommon' lt_prog_compiler_wl_GCJ='-Wl,' ;; esac ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_GCJ='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl_GCJ='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_GCJ='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static_GCJ='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl_GCJ='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static_GCJ='-non_shared' ;; newsos6) lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' ;; linux*) case $cc_basename in icc* | ecc*) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-static' ;; pgcc* | pgf77* | pgf90* | pgf95*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_pic_GCJ='-fpic' lt_prog_compiler_static_GCJ='-Bstatic' ;; ccc*) lt_prog_compiler_wl_GCJ='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static_GCJ='-non_shared' ;; esac ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl_GCJ='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static_GCJ='-non_shared' ;; solaris*) lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' case $cc_basename in f77* | f90* | f95*) lt_prog_compiler_wl_GCJ='-Qoption ld ';; *) lt_prog_compiler_wl_GCJ='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl_GCJ='-Qoption ld ' lt_prog_compiler_pic_GCJ='-PIC' lt_prog_compiler_static_GCJ='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic_GCJ='-Kconform_pic' lt_prog_compiler_static_GCJ='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' ;; unicos*) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_can_build_shared_GCJ=no ;; uts4*) lt_prog_compiler_pic_GCJ='-pic' lt_prog_compiler_static_GCJ='-Bstatic' ;; *) lt_prog_compiler_can_build_shared_GCJ=no ;; esac fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_GCJ" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_GCJ" >&6 # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_GCJ"; then echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5 echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... $ECHO_C" >&6 if test "${lt_prog_compiler_pic_works_GCJ+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_pic_works_GCJ=no ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_GCJ" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:17801: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:17805: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_prog_compiler_pic_works_GCJ=yes fi fi $rm conftest* fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_GCJ" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_works_GCJ" >&6 if test x"$lt_prog_compiler_pic_works_GCJ" = xyes; then case $lt_prog_compiler_pic_GCJ in "" | " "*) ;; *) lt_prog_compiler_pic_GCJ=" $lt_prog_compiler_pic_GCJ" ;; esac else lt_prog_compiler_pic_GCJ= lt_prog_compiler_can_build_shared_GCJ=no fi fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_GCJ= ;; *) lt_prog_compiler_pic_GCJ="$lt_prog_compiler_pic_GCJ" ;; esac # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_GCJ eval lt_tmp_static_flag=\"$lt_prog_compiler_static_GCJ\" echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6 if test "${lt_prog_compiler_static_works_GCJ+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_static_works_GCJ=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" printf "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_prog_compiler_static_works_GCJ=yes fi else lt_prog_compiler_static_works_GCJ=yes fi fi $rm conftest* LDFLAGS="$save_LDFLAGS" fi echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_GCJ" >&5 echo "${ECHO_T}$lt_prog_compiler_static_works_GCJ" >&6 if test x"$lt_prog_compiler_static_works_GCJ" = xyes; then : else lt_prog_compiler_static_GCJ= fi echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_c_o_GCJ=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:17905: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:17909: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_GCJ=yes fi fi chmod u+w . 2>&5 $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_GCJ" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_c_o_GCJ" >&6 hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no echo "$as_me:$LINENO: result: $hard_links" >&5 echo "${ECHO_T}$hard_links" >&6 if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 runpath_var= allow_undefined_flag_GCJ= enable_shared_with_static_runtimes_GCJ=no archive_cmds_GCJ= archive_expsym_cmds_GCJ= old_archive_From_new_cmds_GCJ= old_archive_from_expsyms_cmds_GCJ= export_dynamic_flag_spec_GCJ= whole_archive_flag_spec_GCJ= thread_safe_flag_spec_GCJ= hardcode_libdir_flag_spec_GCJ= hardcode_libdir_flag_spec_ld_GCJ= hardcode_libdir_separator_GCJ= hardcode_direct_GCJ=no hardcode_minus_L_GCJ=no hardcode_shlibpath_var_GCJ=unsupported link_all_deplibs_GCJ=unknown hardcode_automatic_GCJ=no module_cmds_GCJ= module_expsym_cmds_GCJ= always_export_symbols_GCJ=no export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms_GCJ= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms_GCJ="_GLOBAL_OFFSET_TABLE_" # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. extract_expsyms_cmds= # Just being paranoid about ensuring that cc_basename is set. for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` case $host_os in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs_GCJ=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_GCJ='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_GCJ='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_GCJ= fi supports_anon_versioning=no case `$LD -v 2>/dev/null` in *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs_GCJ=no cat <&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. EOF fi ;; amigaos*) archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_minus_L_GCJ=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can't use # them. ld_shlibs_GCJ=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_GCJ=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_GCJ='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_GCJ=no fi ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, GCJ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_GCJ='-L$libdir' allow_undefined_flag_GCJ=unsupported always_export_symbols_GCJ=no enable_shared_with_static_runtimes_GCJ=yes export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_GCJ='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_GCJ=no fi ;; interix3*) hardcode_direct_GCJ=no hardcode_shlibpath_var_GCJ=no hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' export_dynamic_flag_spec_GCJ='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_GCJ='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_GCJ='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; linux*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_addflag= case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; esac archive_cmds_GCJ='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test $supports_anon_versioning = yes; then archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ $echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi else ld_shlibs_GCJ=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_GCJ='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs_GCJ=no cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. EOF elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_GCJ=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs_GCJ=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' else ld_shlibs_GCJ=no fi ;; esac ;; sunos4*) archive_cmds_GCJ='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_GCJ=no fi ;; esac if test "$ld_shlibs_GCJ" = no; then runpath_var= hardcode_libdir_flag_spec_GCJ= export_dynamic_flag_spec_GCJ= whole_archive_flag_spec_GCJ= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag_GCJ=unsupported always_export_symbols_GCJ=yes archive_expsym_cmds_GCJ='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L_GCJ=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct_GCJ=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then export_symbols_cmds_GCJ='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_GCJ='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_GCJ='' hardcode_direct_GCJ=yes hardcode_libdir_separator_GCJ=':' link_all_deplibs_GCJ=yes if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 hardcode_direct_GCJ=yes else # We have old collect2 hardcode_direct_GCJ=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_GCJ=yes hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_libdir_separator_GCJ= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols_GCJ=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_GCJ='-berok' # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_GCJ='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_GCJ="-z nodefs" archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_GCJ=' ${wl}-bernotok' allow_undefined_flag_GCJ=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_GCJ='$convenience' archive_cmds_need_lc_GCJ=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_minus_L_GCJ=yes # see comment about different semantics on the GNU ld section ld_shlibs_GCJ=no ;; bsdi[45]*) export_dynamic_flag_spec_GCJ=-rdynamic ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_GCJ=' ' allow_undefined_flag_GCJ=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_GCJ='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_From_new_cmds_GCJ='true' # FIXME: Should let the user specify the lib program. old_archive_cmds_GCJ='lib /OUT:$oldlib$oldobjs$old_deplibs' fix_srcfile_path_GCJ='`cygpath -w "$srcfile"`' enable_shared_with_static_runtimes_GCJ=yes ;; darwin* | rhapsody*) case $host_os in rhapsody* | darwin1.[012]) allow_undefined_flag_GCJ='${wl}-undefined ${wl}suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[012]) allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) allow_undefined_flag_GCJ='${wl}-undefined ${wl}dynamic_lookup' ;; esac fi ;; esac archive_cmds_need_lc_GCJ=no hardcode_direct_GCJ=no hardcode_automatic_GCJ=yes hardcode_shlibpath_var_GCJ=unsupported whole_archive_flag_spec_GCJ='' link_all_deplibs_GCJ=yes if test "$GCC" = yes ; then output_verbose_link_cmd='echo' archive_cmds_GCJ='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else case $cc_basename in xlc*) output_verbose_link_cmd='echo' archive_cmds_GCJ='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) ld_shlibs_GCJ=no ;; esac fi ;; dgux*) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_shlibpath_var_GCJ=no ;; freebsd1*) ld_shlibs_GCJ=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec_GCJ='-R$libdir' hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=yes hardcode_minus_L_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | kfreebsd*-gnu | dragonfly*) archive_cmds_GCJ='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_GCJ='-R$libdir' hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds_GCJ='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds_GCJ='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' hardcode_libdir_separator_GCJ=: hardcode_direct_GCJ=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_GCJ=yes export_dynamic_flag_spec_GCJ='${wl}-E' ;; hpux10*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_GCJ='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' hardcode_libdir_separator_GCJ=: hardcode_direct_GCJ=yes export_dynamic_flag_spec_GCJ='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_GCJ=yes fi ;; hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' hardcode_libdir_separator_GCJ=: case $host_cpu in hppa*64*|ia64*) hardcode_libdir_flag_spec_ld_GCJ='+b $libdir' hardcode_direct_GCJ=no hardcode_shlibpath_var_GCJ=no ;; *) hardcode_direct_GCJ=yes export_dynamic_flag_spec_GCJ='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_GCJ=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_GCJ='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_ld_GCJ='-rpath $libdir' fi hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_GCJ=: link_all_deplibs_GCJ=yes ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds_GCJ='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec_GCJ='-R$libdir' hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; newsos6) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=yes hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_GCJ=: hardcode_shlibpath_var_GCJ=no ;; openbsd*) hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' export_dynamic_flag_spec_GCJ='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_GCJ='-R$libdir' ;; *) archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' ;; esac fi ;; os2*) hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_minus_L_GCJ=yes allow_undefined_flag_GCJ=unsupported archive_cmds_GCJ='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_From_new_cmds_GCJ='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag_GCJ=' -expect_unresolved \*' archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' fi hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_GCJ=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' else allow_undefined_flag_GCJ=' -expect_unresolved \*' archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_GCJ='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec_GCJ='-rpath $libdir' fi hardcode_libdir_separator_GCJ=: ;; solaris*) no_undefined_flag_GCJ=' -z text' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else wlarc='' archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' fi hardcode_libdir_flag_spec_GCJ='-R$libdir' hardcode_shlibpath_var_GCJ=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine linker options so we # cannot just pass the convience library names through # without $wl, iff we do not link with $LD. # Luckily, gcc supports the same syntax we need for Sun Studio. # Supported since Solaris 2.6 (maybe 2.5.1?) case $wlarc in '') whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract' ;; *) whole_archive_flag_spec_GCJ='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; esac ;; esac link_all_deplibs_GCJ=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds_GCJ='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_GCJ='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_direct_GCJ=yes hardcode_minus_L_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; sysv4) case $host_vendor in sni) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds_GCJ='$CC -r -o $output$reload_objs' hardcode_direct_GCJ=no ;; motorola) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var_GCJ=no ;; sysv4.3*) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_GCJ=no export_dynamic_flag_spec_GCJ='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_GCJ=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs_GCJ=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*) no_undefined_flag_GCJ='${wl}-z,text' archive_cmds_need_lc_GCJ=no hardcode_shlibpath_var_GCJ=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds_GCJ='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_GCJ='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_GCJ='${wl}-z,text' allow_undefined_flag_GCJ='${wl}-z,nodefs' archive_cmds_need_lc_GCJ=no hardcode_shlibpath_var_GCJ=no hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator_GCJ=':' link_all_deplibs_GCJ=yes export_dynamic_flag_spec_GCJ='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds_GCJ='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_GCJ='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_shlibpath_var_GCJ=no ;; *) ld_shlibs_GCJ=no ;; esac fi echo "$as_me:$LINENO: result: $ld_shlibs_GCJ" >&5 echo "${ECHO_T}$ld_shlibs_GCJ" >&6 test "$ld_shlibs_GCJ" = no && can_build_shared=no # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_GCJ" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_GCJ=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_GCJ in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 $rm conftest* printf "$lt_simple_compile_test_code" > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_GCJ pic_flag=$lt_prog_compiler_pic_GCJ compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_GCJ allow_undefined_flag_GCJ= if { (eval echo "$as_me:$LINENO: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 (eval $archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } then archive_cmds_need_lc_GCJ=no else archive_cmds_need_lc_GCJ=yes fi allow_undefined_flag_GCJ=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* echo "$as_me:$LINENO: result: $archive_cmds_need_lc_GCJ" >&5 echo "${ECHO_T}$archive_cmds_need_lc_GCJ" >&6 ;; esac fi ;; esac echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix4* | aix5*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` else sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' fi sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; kfreebsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[123]*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; freebsd*) # from 4.6 on shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; interix3*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; knetbsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' shlibpath_overrides_runpath=no else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' shlibpath_overrides_runpath=yes case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac echo "$as_me:$LINENO: result: $dynamic_linker" >&5 echo "${ECHO_T}$dynamic_linker" >&6 test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 hardcode_action_GCJ= if test -n "$hardcode_libdir_flag_spec_GCJ" || \ test -n "$runpath_var_GCJ" || \ test "X$hardcode_automatic_GCJ" = "Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct_GCJ" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no && test "$hardcode_minus_L_GCJ" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_GCJ=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_GCJ=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_GCJ=unsupported fi echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5 echo "${ECHO_T}$hardcode_action_GCJ" >&6 if test "$hardcode_action_GCJ" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler_GCJ \ CC_GCJ \ LD_GCJ \ lt_prog_compiler_wl_GCJ \ lt_prog_compiler_pic_GCJ \ lt_prog_compiler_static_GCJ \ lt_prog_compiler_no_builtin_flag_GCJ \ export_dynamic_flag_spec_GCJ \ thread_safe_flag_spec_GCJ \ whole_archive_flag_spec_GCJ \ enable_shared_with_static_runtimes_GCJ \ old_archive_cmds_GCJ \ old_archive_from_new_cmds_GCJ \ predep_objects_GCJ \ postdep_objects_GCJ \ predeps_GCJ \ postdeps_GCJ \ compiler_lib_search_path_GCJ \ archive_cmds_GCJ \ archive_expsym_cmds_GCJ \ postinstall_cmds_GCJ \ postuninstall_cmds_GCJ \ old_archive_from_expsyms_cmds_GCJ \ allow_undefined_flag_GCJ \ no_undefined_flag_GCJ \ export_symbols_cmds_GCJ \ hardcode_libdir_flag_spec_GCJ \ hardcode_libdir_flag_spec_ld_GCJ \ hardcode_libdir_separator_GCJ \ hardcode_automatic_GCJ \ module_cmds_GCJ \ module_expsym_cmds_GCJ \ lt_cv_prog_compiler_c_o_GCJ \ exclude_expsyms_GCJ \ include_expsyms_GCJ; do case $var in old_archive_cmds_GCJ | \ old_archive_from_new_cmds_GCJ | \ archive_cmds_GCJ | \ archive_expsym_cmds_GCJ | \ module_cmds_GCJ | \ module_expsym_cmds_GCJ | \ old_archive_from_expsyms_cmds_GCJ | \ export_symbols_cmds_GCJ | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="$ofile" cat <<__EOF__ >> "$cfgfile" # ### BEGIN LIBTOOL TAG CONFIG: $tagname # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_GCJ # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_GCJ # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # LTCC compiler flags. LTCFLAGS=$lt_LTCFLAGS # A language-specific compiler. CC=$lt_compiler_GCJ # Is the compiler the GNU C compiler? with_gcc=$GCC_GCJ # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD_GCJ # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_GCJ # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_GCJ pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_GCJ # Must we lock files when doing compilation? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_GCJ # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_GCJ # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_GCJ # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_GCJ # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec_GCJ # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds_GCJ old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_GCJ # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_GCJ # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds_GCJ archive_expsym_cmds=$lt_archive_expsym_cmds_GCJ postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds_GCJ module_expsym_cmds=$lt_module_expsym_cmds_GCJ # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects_GCJ # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects_GCJ # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps_GCJ # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps_GCJ # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_GCJ # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_GCJ # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_GCJ # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_GCJ # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_GCJ # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_GCJ # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_GCJ # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct_GCJ # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L_GCJ # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_GCJ # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic_GCJ # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_GCJ # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path="$fix_srcfile_path_GCJ" # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols_GCJ # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_GCJ # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_GCJ # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_GCJ # ### END LIBTOOL TAG CONFIG: $tagname __EOF__ else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" else tagname="" fi ;; RC) # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o objext_RC=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $rm conftest* ac_outfile=conftest.$ac_objext printf "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $rm conftest* # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${RC-"windres"} compiler=$CC compiler_RC=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` lt_cv_prog_compiler_c_o_RC=yes # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler_RC \ CC_RC \ LD_RC \ lt_prog_compiler_wl_RC \ lt_prog_compiler_pic_RC \ lt_prog_compiler_static_RC \ lt_prog_compiler_no_builtin_flag_RC \ export_dynamic_flag_spec_RC \ thread_safe_flag_spec_RC \ whole_archive_flag_spec_RC \ enable_shared_with_static_runtimes_RC \ old_archive_cmds_RC \ old_archive_from_new_cmds_RC \ predep_objects_RC \ postdep_objects_RC \ predeps_RC \ postdeps_RC \ compiler_lib_search_path_RC \ archive_cmds_RC \ archive_expsym_cmds_RC \ postinstall_cmds_RC \ postuninstall_cmds_RC \ old_archive_from_expsyms_cmds_RC \ allow_undefined_flag_RC \ no_undefined_flag_RC \ export_symbols_cmds_RC \ hardcode_libdir_flag_spec_RC \ hardcode_libdir_flag_spec_ld_RC \ hardcode_libdir_separator_RC \ hardcode_automatic_RC \ module_cmds_RC \ module_expsym_cmds_RC \ lt_cv_prog_compiler_c_o_RC \ exclude_expsyms_RC \ include_expsyms_RC; do case $var in old_archive_cmds_RC | \ old_archive_from_new_cmds_RC | \ archive_cmds_RC | \ archive_expsym_cmds_RC | \ module_cmds_RC | \ module_expsym_cmds_RC | \ old_archive_from_expsyms_cmds_RC | \ export_symbols_cmds_RC | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="$ofile" cat <<__EOF__ >> "$cfgfile" # ### BEGIN LIBTOOL TAG CONFIG: $tagname # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_RC # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # LTCC compiler flags. LTCFLAGS=$lt_LTCFLAGS # A language-specific compiler. CC=$lt_compiler_RC # Is the compiler the GNU C compiler? with_gcc=$GCC_RC # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD_RC # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_RC # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_RC pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC # Must we lock files when doing compilation? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_RC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec_RC # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds_RC old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds_RC archive_expsym_cmds=$lt_archive_expsym_cmds_RC postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds_RC module_expsym_cmds=$lt_module_expsym_cmds_RC # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects_RC # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects_RC # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps_RC # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps_RC # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_RC # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_RC # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_RC # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_RC # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_RC # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_RC # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct_RC # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L_RC # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_RC # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic_RC # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_RC # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path="$fix_srcfile_path_RC" # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols_RC # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_RC # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_RC # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_RC # ### END LIBTOOL TAG CONFIG: $tagname __EOF__ else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" ;; *) { { echo "$as_me:$LINENO: error: Unsupported tag name: $tagname" >&5 echo "$as_me: error: Unsupported tag name: $tagname" >&2;} { (exit 1); exit 1; }; } ;; esac # Append the new tag name to the list of available tags. if test -n "$tagname" ; then available_tags="$available_tags $tagname" fi fi done IFS="$lt_save_ifs" # Now substitute the updated list of available tags. if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then mv "${ofile}T" "$ofile" chmod +x "$ofile" else rm -f "${ofile}T" { { echo "$as_me:$LINENO: error: unable to update list of available tagged configurations." >&5 echo "$as_me: error: unable to update list of available tagged configurations." >&2;} { (exit 1); exit 1; }; } fi fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' # Prevent multiple expansion # No longer needed now that CPPFLAGS is correctly set -- lh, 061214 -- # AC_REQUIRE([AC_COIN_DLFCN_H]) # NEW: If libtool exists in the directory higher up, we use that one # instead of creating a new one # It turns out that the code for AC_PROG_LIBTOOL is somehow AC_REQUIRED # out in front of this macro body. You'll notice that LIBTOOL is already # defined here. We'll have to count on this macro not being called if libtool # already exists, or at least move the libtool fixes outside the conditional. # AC_MSG_NOTICE([Entering coin_prog_libtool, LIBTOOL = "$LIBTOOL".]) # This test is therefore removed. -- lh, 061214 -- # if test "x$LIBTOOL" = x; then # AC_MSG_NOTICE([Calling PROG_LIBTOOL.]) # AC_MSG_NOTICE([Finished PROG_LIBTOOL.]) { echo "$as_me:$LINENO: Build is \"$build\"." >&5 echo "$as_me: Build is \"$build\"." >&6;} mydos2unix='| dos2unix' case $build in *-mingw*) CYGPATH_W=echo mydos2unix= ;; esac case $build in # Here we need to check if -m32 is specified. If so, we need to correct # sys_lib_search_path_spec *x86_64-*) if test "$GCC" = yes && (echo $CXXFLAGS $CFLAGS $FFLAGS | $EGREP 'm32' >& /dev/null); then { echo "$as_me:$LINENO: Applying patches to libtool for 32bit compilation" >&5 echo "$as_me: Applying patches to libtool for 32bit compilation" >&6;} sed -e 's|sys_lib_search_path_spec=".*"|sys_lib_search_path_spec="/lib /usr/lib"|' libtool > conftest.bla mv conftest.bla libtool chmod 755 libtool fi ;; *-solaris*) if test "$GCC" = yes && \ (echo $CXXFLAGS $CFLAGS $FFLAGS | $EGREP 'm64' >/dev/null 2>&1) ; then hdwisa=`isainfo | sed -e 's/\([^ ]*\) .*$/\1/'` if `$EGREP 'sys_lib_search_path_spec=' libtool | $EGREP -v $hdwisa >/dev/null 2>&1` ; then { echo "$as_me:$LINENO: Applying patches to libtool for 64-bit GCC compilation" >&5 echo "$as_me: Applying patches to libtool for 64-bit GCC compilation" >&6;} fixlibtmp=`$CC -m64 -print-search-dirs | $EGREP '^libraries:'` fixlibtmp=`echo $fixlibtmp | sed -e 's/libraries: =//' -e 's/:/ /g'` if `echo "$fixlibtmp" | $EGREP -v $hdwisa >/dev/null 2>&1` ; then # AC_MSG_NOTICE(Compensating for broken gcc) for lib in $fixlibtmp ; do if test -d "${lib}${hdwisa}" ; then syslibpath64="$syslibpath64 ${lib}${hdwisa}/" fi done syslibpath64="${syslibpath64} ${fixlibtmp}" else syslibpath64="$fixlibtmp" fi sed -e 's|sys_lib_search_path_spec=".*"|sys_lib_search_path_spec="'"$syslibpath64"'"|' libtool > conftest.bla mv conftest.bla libtool chmod 755 libtool fi # AC_MSG_NOTICE(Result is ) # $EGREP 'sys_lib_search_path_spec=' libtool fi ;; # Cygwin. Ah, cygwin. Too big and ugly to inline; see the macro. *-cygwin* | *-mingw*) case "$CXX" in cl* | */cl* | CL* | */CL* | icl* | */icl* | ICL* | */ICL*) { echo "$as_me:$LINENO: Applying patches to libtool for cl compiler" >&5 echo "$as_me: Applying patches to libtool for cl compiler" >&6;} sed -e 's|fix_srcfile_path=\"`cygpath -w \"\$srcfile\"`\"|fix_srcfile_path=\"\\\`'"$CYGPATH_W"' \\\"\\$srcfile\\\"\\\`\"|' \ -e 's|fix_srcfile_path=\"\"|fix_srcfile_path=\"\\\`'"$CYGPATH_W"' \\\"\\$srcfile\\\"\\\`\"|' \ -e 's%compile_deplibs=\"\$dir/\$old_library \$compile_deplibs\"%compile_deplibs="'\`"$CYGPATH_W"' \$dir/\$old_library | sed -e '"'"'sY\\\\\\\\Y/Yg'"'"\`' \$compile_deplibs\"'% \ -e 's%compile_deplibs=\"\$dir/\$linklib \$compile_deplibs\"%compile_deplibs="'\`"$CYGPATH_W"' \$dir/\$linklib | sed -e '"'"'sY\\\\\\\\Y/Yg'"'"\`' \$compile_deplibs\"'% \ -e 's%lib /OUT:%lib -OUT:%' \ -e "s%cygpath -w%$CYGPATH_W%" \ -e 's%$AR x \\$f_ex_an_ar_oldlib%bla=\\`lib -nologo -list \\$f_ex_an_ar_oldlib | xargs echo '"$mydos2unix"'\\`; echo \\$bla; for i in \\$bla; do lib -nologo -extract:\\$i \\$f_ex_an_ar_oldlib; done%' \ -e 's/$AR t/lib -nologo -list/' \ -e 's%f_ex_an_ar_oldlib="\($?*1*\)"%f_ex_an_ar_oldlib='\`"$CYGPATH_W"' \1`%' \ -e 's%^archive_cmds=.*%archive_cmds="\\$CC -o \\$lib \\$libobjs \\$compiler_flags \\\\\\`echo \\\\\\"\\$deplibs\\\\\\" | \\$SED -e '"\'"'s/ -lc\\$//'"\'"'\\\\\\` -link -dll~linknames="%' \ -e 's%old_archive_cmds="lib -OUT:\\$oldlib\\$oldobjs\\$old_deplibs"%old_archive_cmds="if test -r \\$oldlib; then bla=\\"\\$oldlib\\"; else bla=; fi; lib -OUT:\\$oldlib \\\\\\$bla\\$oldobjs\\$old_deplibs"%' \ libtool > conftest.bla mv conftest.bla libtool chmod 755 libtool ;; *) { echo "$as_me:$LINENO: Applying patches to libtool for GNU compiler" >&5 echo "$as_me: Applying patches to libtool for GNU compiler" >&6;} sed -e 's|fix_srcfile_path=\"`cygpath -w \"\$srcfile\"`\"|fix_srcfile_path=\"\\\`'"$CYGPATH_W"' \\\"\\$srcfile\\\"\\\`\"|' \ -e 's|"lib /OUT:\\$oldlib\\$oldobjs\\$old_deplibs"|"\\$AR \\$AR_FLAGS \\$oldlib\\$oldobjs\\$old_deplibs~\\$RANLIB \\$oldlib"|' \ -e 's|libext="lib"|libext="a"|' \ libtool > conftest.bla mv conftest.bla libtool chmod 755 libtool ;; esac ;; *-darwin*) { echo "$as_me:$LINENO: Applying patches to libtool for Darwin" >&5 echo "$as_me: Applying patches to libtool for Darwin" >&6;} sed -e 's/verstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"/verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"/' \ -e 's/ -dynamiclib / -dynamiclib -single_module /g' \ libtool > conftest.bla mv conftest.bla libtool chmod 755 libtool ;; esac # This fi matches the commented `if test "x$LIBTOOL" = x;' up at the head of # the macro. -- lh, 061214 -- # fi # AC_MSG_NOTICE([End libtool initialisation.]) # AC_MSG_NOTICE([Finished COIN_PROG_LIBTOOL.]) # set RPATH_FLAGS to the compiler link flags required to hardcode location # of the shared objects RPATH_FLAGS= if test $enable_shared = yes; then case $build in *-linux-*) if test "$GXX" = "yes"; then RPATH_FLAGS= for dir in $abs_lib_dir; do RPATH_FLAGS="$RPATH_FLAGS -Wl,--rpath -Wl,$dir" done fi ;; *-darwin*) RPATH_FLAGS=nothing ;; *-ibm-*) case "$CXX" in xlC* | */xlC* | mpxlC* | */mpxlC*) RPATH_FLAGS=nothing ;; esac ;; *-hp-*) RPATH_FLAGS=nothing ;; *-mingw32) RPATH_FLAGS=nothing ;; *-*-solaris*) RPATH_FLAGS= for dir in $abs_lib_dir; do RPATH_FLAGS="$RPATH_FLAGS -R$dir" done esac if test "$RPATH_FLAGS" = ""; then { echo "$as_me:$LINENO: WARNING: Could not automatically determine how to tell the linker about automatic inclusion of the path for shared libraries. The test examples might not work if you link against shared objects. You will need to set the LD_LIBRARY_PATH, DYLP_LIBRARY_PATH, or LIBDIR variable manually." >&5 echo "$as_me: WARNING: Could not automatically determine how to tell the linker about automatic inclusion of the path for shared libraries. The test examples might not work if you link against shared objects. You will need to set the LD_LIBRARY_PATH, DYLP_LIBRARY_PATH, or LIBDIR variable manually." >&2;} fi if test "$RPATH_FLAGS" = "nothing"; then RPATH_FLAGS= fi fi else { echo "$as_me:$LINENO: Using libtool script in directory $coin_config_dir" >&5 echo "$as_me: Using libtool script in directory $coin_config_dir" >&6;} # get all missing information from the config.log file # output variables and defines as_save_IFS=$IFS IFS=' ' for oneline in `cat $coin_config_dir/config.status`; do case "$oneline" in # First some automake conditionals s,@am__fastdep* | s,@AR@* | s,@CPP@* | s,@CPPFLAGS@* | s,@CXXCPP@* | \ s,@RANLIB@* | s,@STRIP@* | s,@ac_ct_AR@* | s,@ac_ct_RANLIB@* | \ s,@ac_ct_STRIP@* | s,@host* | s,@LN_S@* | s,@RPATH_FLAGS@* | \ s,@ac_c_preproc_warn_flag@* | s,@ac_cxx_preproc_warn_flag@* ) command=`echo $oneline | sed -e 's/^s,@//' -e 's/@,/="/' -e 's/,;t t/"/'` # echo "$command" eval "$command" ;; s,@DEFS@* ) command=`echo $oneline | sed -e 's/^s,@DEFS@,/defsline="/' -e 's/,;t t/"/'` # echo "$command" eval "$command" ;; esac done IFS=$as_save_IFS # And some defines (assuming here that the packages base dir # doesn't have a config.h file for word in $defsline; do # echo word $word case $word in -DHAVE_[A-Z_]*_H=1 | -DSTDC_HEADERS=1 ) i=`echo $word | sed -e 's/-D/#define /' -e 's/=/ /'` # echo dd $i echo $i >>confdefs.h ;; esac done fi # AC_MSG_NOTICE([End of INIT_AUTO_TOOLS.]) # ToDo # For now, don't use the -no-undefined flag, since the Makefiles are # not yet set up that way. But we need to fix this, when we want # to comile DLLs under Windows. LT_LDFLAGS= #END } # AC_MSG_NOTICE([Finished INIT_AUTO_TOOLS from CREATE_LIBTOOL.]) ############################################################################# # Check which subprojects are there # ############################################################################# # Osi, CoinUtils, Netlib, and Sample are no longer default externals but can be # checked out manually. If they are present at configuration time, the Osi unit # test will be run wth OsiDylp. echo "$as_me:$LINENO: checking whether directory DyLP is available" >&5 echo $ECHO_N "checking whether directory DyLP is available... $ECHO_C" >&6 coin_skip=no if test x"$COIN_SKIP_PROJECTS" != x; then for dir in $COIN_SKIP_PROJECTS; do if test $dir = DyLP; then coin_skip=yes fi done fi if test $coin_skip = yes; then echo "$as_me:$LINENO: result: skipping" >&5 echo "${ECHO_T}skipping" >&6 elif test -r $srcdir/DyLP/configure; then coin_subdirs="$coin_subdirs DyLP" echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 subdirs="$subdirs DyLP" else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi echo "$as_me:$LINENO: checking whether directory CoinUtils is available" >&5 echo $ECHO_N "checking whether directory CoinUtils is available... $ECHO_C" >&6 coin_skip=no if test x"$COIN_SKIP_PROJECTS" != x; then for dir in $COIN_SKIP_PROJECTS; do if test $dir = CoinUtils; then coin_skip=yes fi done fi if test $coin_skip = yes; then echo "$as_me:$LINENO: result: skipping" >&5 echo "${ECHO_T}skipping" >&6 elif test -r $srcdir/CoinUtils/configure; then coin_subdirs="$coin_subdirs CoinUtils" echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 subdirs="$subdirs CoinUtils" else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi echo "$as_me:$LINENO: checking whether directory Osi is available" >&5 echo $ECHO_N "checking whether directory Osi is available... $ECHO_C" >&6 coin_skip=no if test x"$COIN_SKIP_PROJECTS" != x; then for dir in $COIN_SKIP_PROJECTS; do if test $dir = Osi; then coin_skip=yes fi done fi if test $coin_skip = yes; then echo "$as_me:$LINENO: result: skipping" >&5 echo "${ECHO_T}skipping" >&6 elif test -r $srcdir/Osi/configure; then coin_subdirs="$coin_subdirs Osi" echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 subdirs="$subdirs Osi" else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi echo "$as_me:$LINENO: checking whether directory Data/Netlib is available" >&5 echo $ECHO_N "checking whether directory Data/Netlib is available... $ECHO_C" >&6 coin_skip=no if test x"$COIN_SKIP_PROJECTS" != x; then for dir in $COIN_SKIP_PROJECTS; do if test $dir = Data/Netlib; then coin_skip=yes fi done fi if test $coin_skip = yes; then echo "$as_me:$LINENO: result: skipping" >&5 echo "${ECHO_T}skipping" >&6 elif test -r $srcdir/Data/Netlib/configure; then coin_subdirs="$coin_subdirs Data/Netlib" echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 subdirs="$subdirs Data/Netlib" else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi echo "$as_me:$LINENO: checking whether directory Data/Sample is available" >&5 echo $ECHO_N "checking whether directory Data/Sample is available... $ECHO_C" >&6 coin_skip=no if test x"$COIN_SKIP_PROJECTS" != x; then for dir in $COIN_SKIP_PROJECTS; do if test $dir = Data/Sample; then coin_skip=yes fi done fi if test $coin_skip = yes; then echo "$as_me:$LINENO: result: skipping" >&5 echo "${ECHO_T}skipping" >&6 elif test -r $srcdir/Data/Sample/configure; then coin_subdirs="$coin_subdirs Data/Sample" echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 subdirs="$subdirs Data/Sample" else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi ############################################################################## # Finishing up by writing all the output # ############################################################################## # Here list all the files that configure should create (except for the # configuration header file) ac_config_files="$ac_config_files Makefile" # Finally, we let configure write all the output... echo "$as_me:$LINENO: checking which command should be used to link input files" >&5 echo $ECHO_N "checking which command should be used to link input files... $ECHO_C" >&6 coin_link_input_cmd="$LN_S" if test "$enable_doscompile" = mingw; then coin_link_input_cmd=cp fi case "$CC" in cl* | */cl* | CL* | */CL* | icl* | */icl* | ICL* | */ICL*) coin_link_input_cmd=cp ;; esac echo "$as_me:$LINENO: result: $coin_link_input_cmd" >&5 echo "${ECHO_T}$coin_link_input_cmd" >&6 if test x$coin_skip_ac_output != xyes; then FADDLIBS="$ADDLIBS" if test x"$coin_need_flibs" = xyes; then ADDLIBS="$ADDLIBS $FLIBS" fi # library extension case "$CC" in cl* | */cl* | CL* | */CL* | icl* | */icl* | ICL* | */ICL*) LIBEXT=lib ;; *) LIBEXT=a ;; esac # Define VPATH_DISTCLEANFILES to be everything that needs to be # cleaned for distclean in a vpath configuration VPATH_DISTCLEANFILES="$coin_vpath_link_files" # Take out subdirectories if their configuration concluded that they # don't need to be compiled if test x"$coin_ac_skip_subdirs" != x; then new_subdirs= for i in $subdirs; do skipme=no for j in $coin_ac_skip_subdirs; do if test $i = $j; then skipme=yes; fi done if test $skipme = no; then new_subdirs="$new_subdirs $i" fi done subdirs="$new_subdirs" fi cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, don't put newlines in cache variables' values. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. { (set) 2>&1 | case `(ac_space=' '; set | grep ac_space) 2>&1` in *ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } | sed ' t clear : clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ : end' >>confcache if diff $cache_file confcache >/dev/null 2>&1; then :; else if test -w $cache_file; then test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" cat confcache >$cache_file else echo "not updating unwritable cache $cache_file" fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/; s/:*\${srcdir}:*/:/; s/:*@srcdir@:*/:/; s/^\([^=]*=[ ]*\):*/\1/; s/:*$//; s/^[^=]*=[ ]*$//; }' fi # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then we branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. cat >confdef2opt.sed <<\_ACEOF t clear : clear s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g t quote s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g t quote d : quote s,[ `~#$^&*(){}\\|;'"<>?],\\&,g s,\[,\\&,g s,\],\\&,g s,\$,$$,g p _ACEOF # We use echo to avoid assuming a particular line-breaking character. # The extra dot is to prevent the shell from consuming trailing # line-breaks from the sub-command output. A line-break within # single-quotes doesn't work because, if this script is created in a # platform that uses two characters for line-breaks (e.g., DOS), tr # would break. ac_LF_and_DOT=`echo; echo .` DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'` rm -f confdef2opt.sed ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_i=`echo "$ac_i" | sed 's/\$U\././;s/\.o$//;s/\.obj$//'` # 2. Add them. ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${HAVE_EXTERNALS_TRUE}" && test -z "${HAVE_EXTERNALS_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"HAVE_EXTERNALS\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"HAVE_EXTERNALS\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH exec 6>&1 # Open the log real soon, to keep \$[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. Logging --version etc. is OK. exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX } >&5 cat >&5 <<_CSEOF This file was extended by DyLP $as_me 1.6.0, which was generated by GNU Autoconf 2.59. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ _CSEOF echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 echo >&5 _ACEOF # Files that config.status was made for. if test -n "$ac_config_files"; then echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS fi if test -n "$ac_config_headers"; then echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS fi if test -n "$ac_config_links"; then echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS fi if test -n "$ac_config_commands"; then echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS fi cat >>$CONFIG_STATUS <<\_ACEOF ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ DyLP config.status 1.6.0 configured by $0, generated by GNU Autoconf 2.59, with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2003 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." srcdir=$srcdir INSTALL="$INSTALL" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If no file are specified by the user, then we need to provide default # value. By we need to know if files were specified by the user. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "x$1" : 'x\([^=]*\)='` ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` ac_shift=: ;; -*) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; *) # This is not an option, so the user has probably given explicit # arguments. ac_option=$1 ac_need_defaults=false;; esac case $ac_option in # Handling of the options. _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --vers* | -V ) echo "$ac_cs_version"; exit 0 ;; --he | --h) # Conflict between --help and --header { { echo "$as_me:$LINENO: error: ambiguous option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: ambiguous option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; };; --help | --hel | -h ) echo "$ac_cs_usage"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift CONFIG_FILES="$CONFIG_FILES $ac_optarg" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" ac_need_defaults=false;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; } ;; *) ac_config_targets="$ac_config_targets $1" ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF if \$ac_cs_recheck; then echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # # INIT-COMMANDS section. # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF for ac_config_target in $ac_config_targets do case "$ac_config_target" in # Handling of arguments. "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason to put it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Create a temporary directory, and hook for its removal unless debugging. $debug || { trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./confstat$$-$RANDOM (umask 077 && mkdir $tmp) } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # # CONFIG_FILES section. # # No need to generate the scripts if there are no CONFIG_FILES. # This happens for instance when ./config.status config.h if test -n "\$CONFIG_FILES"; then # Protect against being on the right side of a sed subst in config.status. sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF s,@SHELL@,$SHELL,;t t s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t s,@exec_prefix@,$exec_prefix,;t t s,@prefix@,$prefix,;t t s,@program_transform_name@,$program_transform_name,;t t s,@bindir@,$bindir,;t t s,@sbindir@,$sbindir,;t t s,@libexecdir@,$libexecdir,;t t s,@datadir@,$datadir,;t t s,@sysconfdir@,$sysconfdir,;t t s,@sharedstatedir@,$sharedstatedir,;t t s,@localstatedir@,$localstatedir,;t t s,@libdir@,$libdir,;t t s,@includedir@,$includedir,;t t s,@oldincludedir@,$oldincludedir,;t t s,@infodir@,$infodir,;t t s,@mandir@,$mandir,;t t s,@build_alias@,$build_alias,;t t s,@host_alias@,$host_alias,;t t s,@target_alias@,$target_alias,;t t s,@DEFS@,$DEFS,;t t s,@ECHO_C@,$ECHO_C,;t t s,@ECHO_N@,$ECHO_N,;t t s,@ECHO_T@,$ECHO_T,;t t s,@LIBS@,$LIBS,;t t s,@build@,$build,;t t s,@build_cpu@,$build_cpu,;t t s,@build_vendor@,$build_vendor,;t t s,@build_os@,$build_os,;t t s,@CDEFS@,$CDEFS,;t t s,@ADD_CFLAGS@,$ADD_CFLAGS,;t t s,@DBG_CFLAGS@,$DBG_CFLAGS,;t t s,@OPT_CFLAGS@,$OPT_CFLAGS,;t t s,@sol_cc_compiler@,$sol_cc_compiler,;t t s,@CC@,$CC,;t t s,@CFLAGS@,$CFLAGS,;t t s,@LDFLAGS@,$LDFLAGS,;t t s,@CPPFLAGS@,$CPPFLAGS,;t t s,@ac_ct_CC@,$ac_ct_CC,;t t s,@EXEEXT@,$EXEEXT,;t t s,@OBJEXT@,$OBJEXT,;t t s,@MPICC@,$MPICC,;t t s,@CXXDEFS@,$CXXDEFS,;t t s,@ADD_CXXFLAGS@,$ADD_CXXFLAGS,;t t s,@DBG_CXXFLAGS@,$DBG_CXXFLAGS,;t t s,@OPT_CXXFLAGS@,$OPT_CXXFLAGS,;t t s,@CXX@,$CXX,;t t s,@CXXFLAGS@,$CXXFLAGS,;t t s,@ac_ct_CXX@,$ac_ct_CXX,;t t s,@MPICXX@,$MPICXX,;t t s,@ADD_FFLAGS@,$ADD_FFLAGS,;t t s,@DBG_FFLAGS@,$DBG_FFLAGS,;t t s,@OPT_FFLAGS@,$OPT_FFLAGS,;t t s,@F77@,$F77,;t t s,@FFLAGS@,$FFLAGS,;t t s,@ac_ct_F77@,$ac_ct_F77,;t t s,@MPIF77@,$MPIF77,;t t s,@EGREP@,$EGREP,;t t s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t s,@INSTALL_DATA@,$INSTALL_DATA,;t t s,@CYGPATH_W@,$CYGPATH_W,;t t s,@PACKAGE@,$PACKAGE,;t t s,@VERSION@,$VERSION,;t t s,@ACLOCAL@,$ACLOCAL,;t t s,@AUTOCONF@,$AUTOCONF,;t t s,@AUTOMAKE@,$AUTOMAKE,;t t s,@AUTOHEADER@,$AUTOHEADER,;t t s,@MAKEINFO@,$MAKEINFO,;t t s,@install_sh@,$install_sh,;t t s,@STRIP@,$STRIP,;t t s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t s,@mkdir_p@,$mkdir_p,;t t s,@AWK@,$AWK,;t t s,@SET_MAKE@,$SET_MAKE,;t t s,@am__leading_dot@,$am__leading_dot,;t t s,@AMTAR@,$AMTAR,;t t s,@am__tar@,$am__tar,;t t s,@am__untar@,$am__untar,;t t s,@DEPDIR@,$DEPDIR,;t t s,@am__include@,$am__include,;t t s,@am__quote@,$am__quote,;t t s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t s,@CCDEPMODE@,$CCDEPMODE,;t t s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t s,@CXXDEPMODE@,$CXXDEPMODE,;t t s,@am__fastdepCXX_TRUE@,$am__fastdepCXX_TRUE,;t t s,@am__fastdepCXX_FALSE@,$am__fastdepCXX_FALSE,;t t s,@MAINTAINER_MODE_TRUE@,$MAINTAINER_MODE_TRUE,;t t s,@MAINTAINER_MODE_FALSE@,$MAINTAINER_MODE_FALSE,;t t s,@MAINT@,$MAINT,;t t s,@LIBTOOLM4@,$LIBTOOLM4,;t t s,@have_autoconf@,$have_autoconf,;t t s,@have_automake@,$have_automake,;t t s,@have_svn@,$have_svn,;t t s,@BUILDTOOLSDIR@,$BUILDTOOLSDIR,;t t s,@AUX_DIR@,$AUX_DIR,;t t s,@abs_source_dir@,$abs_source_dir,;t t s,@abs_lib_dir@,$abs_lib_dir,;t t s,@abs_include_dir@,$abs_include_dir,;t t s,@abs_bin_dir@,$abs_bin_dir,;t t s,@HAVE_EXTERNALS_TRUE@,$HAVE_EXTERNALS_TRUE,;t t s,@HAVE_EXTERNALS_FALSE@,$HAVE_EXTERNALS_FALSE,;t t s,@host@,$host,;t t s,@host_cpu@,$host_cpu,;t t s,@host_vendor@,$host_vendor,;t t s,@host_os@,$host_os,;t t s,@LN_S@,$LN_S,;t t s,@ECHO@,$ECHO,;t t s,@AR@,$AR,;t t s,@ac_ct_AR@,$ac_ct_AR,;t t s,@RANLIB@,$RANLIB,;t t s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t s,@CPP@,$CPP,;t t s,@CXXCPP@,$CXXCPP,;t t s,@LIBTOOL@,$LIBTOOL,;t t s,@ac_c_preproc_warn_flag@,$ac_c_preproc_warn_flag,;t t s,@ac_cxx_preproc_warn_flag@,$ac_cxx_preproc_warn_flag,;t t s,@RPATH_FLAGS@,$RPATH_FLAGS,;t t s,@LT_LDFLAGS@,$LT_LDFLAGS,;t t s,@COIN_SKIP_PROJECTS@,$COIN_SKIP_PROJECTS,;t t s,@subdirs@,$subdirs,;t t s,@LIBEXT@,$LIBEXT,;t t s,@VPATH_DISTCLEANFILES@,$VPATH_DISTCLEANFILES,;t t s,@LIBOBJS@,$LIBOBJS,;t t s,@LTLIBOBJS@,$LTLIBOBJS,;t t CEOF _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # Split the substitutions into bite-sized pieces for seds with # small command number limits, like on Digital OSF/1 and HP-UX. ac_max_sed_lines=48 ac_sed_frag=1 # Number of current file. ac_beg=1 # First line for current file. ac_end=$ac_max_sed_lines # Line after last line for current file. ac_more_lines=: ac_sed_cmds= while $ac_more_lines; do if test $ac_beg -gt 1; then sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag else sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag fi if test ! -s $tmp/subs.frag; then ac_more_lines=false else # The purpose of the label and of the branching condition is to # speed up the sed processing (if there are no `@' at all, there # is no need to browse any of the substitutions). # These are the two extra sed commands mentioned above. (echo ':t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed if test -z "$ac_sed_cmds"; then ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" else ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" fi ac_sed_frag=`expr $ac_sed_frag + 1` ac_beg=$ac_end ac_end=`expr $ac_end + $ac_max_sed_lines` fi done if test -z "$ac_sed_cmds"; then ac_sed_cmds=cat fi fi # test -n "$CONFIG_FILES" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin cat >$tmp/stdin ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. ac_dir=`(dirname "$ac_file") 2>/dev/null || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_builddir$INSTALL ;; esac if test x"$ac_file" != x-; then { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} rm -f "$ac_file" fi # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ if test x"$ac_file" = x-; then configure_input= else configure_input="$ac_file. " fi configure_input=$configure_input"Generated from `echo $ac_file_in | sed 's,.*/,,'` by configure." # First look for the input files in the build tree, otherwise in the # src tree. ac_file_inputs=`IFS=: for f in $ac_file_in; do case $f in -) echo $tmp/stdin ;; [\\/$]*) # Absolute (can't be DOS-style, as IFS=:) test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } echo "$f";; *) # Relative if test -f "$f"; then # Build tree echo "$f" elif test -f "$srcdir/$f"; then # Source tree echo "$srcdir/$f" else # /dev/null tree { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } fi;; esac done` || { (exit 1); exit 1; } _ACEOF cat >>$CONFIG_STATUS <<_ACEOF sed "$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s,@configure_input@,$configure_input,;t t s,@srcdir@,$ac_srcdir,;t t s,@abs_srcdir@,$ac_abs_srcdir,;t t s,@top_srcdir@,$ac_top_srcdir,;t t s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t s,@builddir@,$ac_builddir,;t t s,@abs_builddir@,$ac_abs_builddir,;t t s,@top_builddir@,$ac_top_builddir,;t t s,@abs_top_builddir@,$ac_abs_top_builddir,;t t s,@INSTALL@,$ac_INSTALL,;t t " $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out rm -f $tmp/stdin if test x"$ac_file" != x-; then mv $tmp/out $ac_file else cat $tmp/out rm -f $tmp/out fi done _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # # CONFIG_COMMANDS section. # for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue ac_dest=`echo "$ac_file" | sed 's,:.*,,'` ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_dir=`(dirname "$ac_dest") 2>/dev/null || $as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_dest" : 'X\(//\)[^/]' \| \ X"$ac_dest" : 'X\(//\)$' \| \ X"$ac_dest" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_dest" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac { echo "$as_me:$LINENO: executing $ac_dest commands" >&5 echo "$as_me: executing $ac_dest commands" >&6;} case $ac_dest in depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # So let's grep whole file. if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then dirpart=`(dirname "$mf") 2>/dev/null || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`(dirname "$file") 2>/dev/null || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p $dirpart/$fdir else as_dir=$dirpart/$fdir as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5 echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;} { (exit 1); exit 1; }; }; } # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done ;; esac done _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || { (exit 1); exit 1; } fi # # CONFIG_SUBDIRS section. # if test "$no_recursion" != yes; then # Remove --cache-file and --srcdir arguments so they do not pile up. ac_sub_configure_args= ac_prev= for ac_arg in $ac_configure_args; do if test -n "$ac_prev"; then ac_prev= continue fi case $ac_arg in -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \ | --c=*) ;; --config-cache | -C) ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) ;; *) ac_sub_configure_args="$ac_sub_configure_args $ac_arg" ;; esac done # Always prepend --prefix to ensure using the same prefix # in subdir configurations. ac_sub_configure_args="--prefix=$prefix $ac_sub_configure_args" ac_popdir=`pwd` for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue # Do not complain, so a configure script can configure whichever # parts of a large source tree are present. test -d $srcdir/$ac_dir || continue { echo "$as_me:$LINENO: configuring in $ac_dir" >&5 echo "$as_me: configuring in $ac_dir" >&6;} { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac cd $ac_dir # Check for guested configure; otherwise get Cygnus style configure. if test -f $ac_srcdir/configure.gnu; then ac_sub_configure="$SHELL '$ac_srcdir/configure.gnu'" elif test -f $ac_srcdir/configure; then ac_sub_configure="$SHELL '$ac_srcdir/configure'" elif test -f $ac_srcdir/configure.in; then ac_sub_configure=$ac_configure else { echo "$as_me:$LINENO: WARNING: no configuration information is in $ac_dir" >&5 echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;} ac_sub_configure= fi # The recursion is here. if test -n "$ac_sub_configure"; then # Make the cache file name correct relative to the subdirectory. case $cache_file in [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;; *) # Relative path. ac_sub_cache_file=$ac_top_builddir$cache_file ;; esac { echo "$as_me:$LINENO: running $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5 echo "$as_me: running $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;} # The eval makes quoting arguments work. eval $ac_sub_configure $ac_sub_configure_args \ --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir || { { echo "$as_me:$LINENO: error: $ac_sub_configure failed for $ac_dir" >&5 echo "$as_me: error: $ac_sub_configure failed for $ac_dir" >&2;} { (exit 1); exit 1; }; } fi cd $ac_popdir done fi if test x"$coin_vpath_link_files" = x; then : ; else lnkcmd="$coin_link_input_cmd" if test "$lnkcmd" = cp; then { echo "$as_me:$LINENO: Copying data files for VPATH configuration" >&5 echo "$as_me: Copying data files for VPATH configuration" >&6;} else { echo "$as_me:$LINENO: Creating VPATH links for data files" >&5 echo "$as_me: Creating VPATH links for data files" >&6;} fi for file in $coin_vpath_link_files; do dir=`(dirname "./$file") 2>/dev/null || $as_expr X"./$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"./$file" : 'X\(//\)[^/]' \| \ X"./$file" : 'X\(//\)$' \| \ X"./$file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"./$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` if test -d $dir; then : ; else { if $as_mkdir_p; then mkdir -p $dir else as_dir=$dir as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory $dir" >&5 echo "$as_me: error: cannot create directory $dir" >&2;} { (exit 1); exit 1; }; }; } fi rm -f $file $lnkcmd $abs_source_dir/$file $file done fi if test x$coin_projectdir = xyes; then { echo "$as_me:$LINENO: Configuration of $PACKAGE_NAME successful" >&5 echo "$as_me: Configuration of $PACKAGE_NAME successful" >&6;} else { echo "$as_me:$LINENO: Main configuration of $PACKAGE_NAME successful" >&5 echo "$as_me: Main configuration of $PACKAGE_NAME successful" >&6;} fi else { echo "$as_me:$LINENO: No configuration of $PACKAGE_NAME necessary" >&5 echo "$as_me: No configuration of $PACKAGE_NAME necessary" >&6;} fi DyLP-1.6.0/Externals0000644000076700007670000000051010632415522011150 0ustar BuildTools https://projects.coin-or.org/svn/BuildTools/trunk Data/Netlib https://projects.coin-or.org/svn/Data/trunk/Netlib Data/Sample https://projects.coin-or.org/svn/Data/trunk/Sample CoinUtils https://projects.coin-or.org/svn/CoinUtils/trunk/CoinUtils Osi https://projects.coin-or.org/svn/Osi/trunk/Osi DyLP-1.6.0/config.sub0000755000076700007670000007772610643314772011301 0ustar #! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, # Inc. timestamp='2007-04-29' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore | mep \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64vr | mips64vrel \ | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | mt \ | msp430 \ | nios | nios2 \ | ns16k | ns32k \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | score \ | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64vr-* | mips64vrel-* \ | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ | xstormy16-* | xtensa-* \ | ymp-* \ | z8k-*) ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; c90) basic_machine=c90-cray os=-unicos ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16c) basic_machine=cr16c-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: DyLP-1.6.0/configure.ac0000644000076700007670000000460711414231451011555 0ustar # Copyright (C) 2006 International Business Machines. # All Rights Reserved. # This file is distributed under the Common Public License. ## $Id: configure.ac 326 2010-07-05 01:19:37Z lou $ # Author: Andreas Waechter IBM 2006-04-13 ############################################################################# # Names and other basic things # ############################################################################# AC_PREREQ(2.59) AC_INIT([DyLP],[1.6.0],[coin-dylp@lists.coin-or.org]) AC_COPYRIGHT([ Copyright 2006 International Business Machines and others. All Rights Reserved. This file is part of the open source package Coin which is distributed under the Common Public License.]) AC_REVISION(0.9) # List one file in the package so that the configure script can test # whether the package is actually there AC_CONFIG_SRCDIR(configure.ac) # Where should everything be installed by default? Here, we want it # to be installed directly in 'bin', 'lib', 'include' subdirectories # of the directory where configure is run. The default would be # /usr/local. AC_PREFIX_DEFAULT([`pwd`]) ############################################################################# # Do the tests necessary to configure compilers and initialise autotools # ############################################################################# AC_COIN_CREATE_LIBTOOL ############################################################################# # Check which subprojects are there # ############################################################################# # Osi, CoinUtils, Netlib, and Sample are no longer default externals but can be # checked out manually. If they are present at configuration time, the Osi unit # test will be run wth OsiDylp. AC_COIN_MAIN_SUBDIRS(DyLP) AC_COIN_MAIN_SUBDIRS(CoinUtils) AC_COIN_MAIN_SUBDIRS(Osi) AC_COIN_MAIN_SUBDIRS(Data/Netlib) AC_COIN_MAIN_SUBDIRS(Data/Sample) ############################################################################## # Finishing up by writing all the output # ############################################################################## # Here list all the files that configure should create (except for the # configuration header file) AC_CONFIG_FILES([Makefile]) # Finally, we let configure write all the output... AC_COIN_FINALIZE DyLP-1.6.0/missing0000755000076700007670000002540610442173473010677 0ustar #! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2005-06-08.21 # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005 # Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case "$1" in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch] Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). case "$1" in lex|yacc) # Not GNU programs, they don't have --version. ;; tar) if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then exit 1 fi ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case "$1" in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case "$f" in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison|yacc) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.h fi ;; esac fi if [ ! -f y.tab.h ]; then echo >y.tab.h fi if [ ! -f y.tab.c ]; then echo 'main() { return 0; }' >y.tab.c fi ;; lex|flex) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if [ ! -f lex.yy.c ]; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` fi if [ -f "$file" ]; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit 1 fi ;; makeinfo) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; tar) shift # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case "$firstarg" in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case "$firstarg" in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: DyLP-1.6.0/ltmain.sh0000755000076700007670000057753010442173473011135 0ustar # ltmain.sh - Provide generalized library-building support services. # NOTE: Changing this file will not affect anything until you rerun configure. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005 # Free Software Foundation, Inc. # Originally by Gordon Matzigkeit , 1996 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. basename="s,^.*/,,g" # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" # The name of this program: progname=`echo "$progpath" | $SED $basename` modename="$progname" # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 PROGRAM=ltmain.sh PACKAGE=libtool VERSION=1.5.22 TIMESTAMP=" (1.1220.2.365 2005/12/18 22:14:06)" # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Check that we have a working $echo. if test "X$1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X$1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then # Yippee, $echo works! : else # Restart under the correct shell, and then maybe $echo will work. exec $SHELL "$progpath" --no-reexec ${1+"$@"} fi if test "X$1" = X--fallback-echo; then # used as fallback echo shift cat <&2 $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 exit $EXIT_FAILURE fi # Global variables. mode=$default_mode nonopt= prev= prevopt= run= show="$echo" show_help= execute_dlfiles= duplicate_deps=no preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" ##################################### # Shell function definitions: # This seems to be the best place for them # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $mkdir "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || { $echo "cannot create temporary directory \`$my_tmpdir'" 1>&2 exit $EXIT_FAILURE } fi $echo "X$my_tmpdir" | $Xsed } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. func_win32_libid () { win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \ $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then win32_nmres=`eval $NM -f posix -A $1 | \ $SED -n -e '1,100{/ I /{s,.*,import,;p;q;};}'` case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $echo $win32_libid_type } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac CC_quoted="$CC_quoted $arg" done case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac CC_quoted="$CC_quoted $arg" done case "$@ " in " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then $echo "$modename: unable to infer tagged configuration" $echo "$modename: specify a tag with \`--tag'" 1>&2 exit $EXIT_FAILURE # else # $echo "$modename: using $tagname tagged configuration" fi ;; esac fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" $show "(cd $f_ex_an_ar_dir && $AR x $f_ex_an_ar_oldlib)" $run eval "(cd \$f_ex_an_ar_dir && $AR x \$f_ex_an_ar_oldlib)" || exit $? if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else $echo "$modename: ERROR: object name conflicts: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" 1>&2 exit $EXIT_FAILURE fi } # func_extract_archives gentop oldlib ... func_extract_archives () { my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" my_status="" $show "${rm}r $my_gentop" $run ${rm}r "$my_gentop" $show "$mkdir $my_gentop" $run $mkdir "$my_gentop" my_status=$? if test "$my_status" -ne 0 && test ! -d "$my_gentop"; then exit $my_status fi for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'` my_xdir="$my_gentop/$my_xlib" $show "${rm}r $my_xdir" $run ${rm}r "$my_xdir" $show "$mkdir $my_xdir" $run $mkdir "$my_xdir" exit_status=$? if test "$exit_status" -ne 0 && test ! -d "$my_xdir"; then exit $exit_status fi case $host in *-darwin*) $show "Extracting $my_xabs" # Do not bother doing anything if just a dry run if test -z "$run"; then darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`$echo "X$darwin_archive" | $Xsed -e 's%^.*/%%'` darwin_arches=`lipo -info "$darwin_archive" 2>/dev/null | $EGREP Architectures 2>/dev/null` if test -n "$darwin_arches"; then darwin_arches=`echo "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= $show "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do mkdir -p "unfat-$$/${darwin_base_archive}-${darwin_arch}" lipo -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" func_extract_an_archive "`pwd`" "${darwin_base_archive}" cd "$darwin_curdir" $rm "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" done # $darwin_arches ## Okay now we have a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print| xargs basename | sort -u | $NL2SP` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` lipo -create -output "$darwin_file" $darwin_files done # $darwin_filelist ${rm}r unfat-$$ cd "$darwin_orig_dir" else cd "$darwin_orig_dir" func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches fi # $run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # End of Shell function definitions ##################################### # Darwin sucks eval std_shrext=\"$shrext_cmds\" disable_libs=no # Parse our command line options once, thoroughly. while test "$#" -gt 0 do arg="$1" shift case $arg in -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; *) optarg= ;; esac # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in execute_dlfiles) execute_dlfiles="$execute_dlfiles $arg" ;; tag) tagname="$arg" preserve_args="${preserve_args}=$arg" # Check whether tagname contains only valid characters case $tagname in *[!-_A-Za-z0-9,/]*) $echo "$progname: invalid tag name: $tagname" 1>&2 exit $EXIT_FAILURE ;; esac case $tagname in CC) # Don't test for the "default" C tag, as we know, it's there, but # not specially marked. ;; *) if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then taglist="$taglist $tagname" # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`" else $echo "$progname: ignoring unknown tag $tagname" 1>&2 fi ;; esac ;; *) eval "$prev=\$arg" ;; esac prev= prevopt= continue fi # Have we seen a non-optional argument yet? case $arg in --help) show_help=yes ;; --version) $echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP" $echo $echo "Copyright (C) 2005 Free Software Foundation, Inc." $echo "This is free software; see the source for copying conditions. There is NO" $echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." exit $? ;; --config) ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath # Now print the configurations for the tags. for tagname in $taglist; do ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath" done exit $? ;; --debug) $echo "$progname: enabling shell trace mode" set -x preserve_args="$preserve_args $arg" ;; --dry-run | -n) run=: ;; --features) $echo "host: $host" if test "$build_libtool_libs" = yes; then $echo "enable shared libraries" else $echo "disable shared libraries" fi if test "$build_old_libs" = yes; then $echo "enable static libraries" else $echo "disable static libraries" fi exit $? ;; --finish) mode="finish" ;; --mode) prevopt="--mode" prev=mode ;; --mode=*) mode="$optarg" ;; --preserve-dup-deps) duplicate_deps="yes" ;; --quiet | --silent) show=: preserve_args="$preserve_args $arg" ;; --tag) prevopt="--tag" prev=tag preserve_args="$preserve_args --tag" ;; --tag=*) set tag "$optarg" ${1+"$@"} shift prev=tag preserve_args="$preserve_args --tag" ;; -dlopen) prevopt="-dlopen" prev=execute_dlfiles ;; -*) $echo "$modename: unrecognized option \`$arg'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; *) nonopt="$arg" break ;; esac done if test -n "$prevopt"; then $echo "$modename: option \`$prevopt' requires an argument" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi case $disable_libs in no) ;; shared) build_libtool_libs=no build_old_libs=yes ;; static) build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` ;; esac # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= if test -z "$show_help"; then # Infer the operation mode. if test -z "$mode"; then $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2 $echo "*** Future versions of Libtool will require --mode=MODE be specified." 1>&2 case $nonopt in *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*) mode=link for arg do case $arg in -c) mode=compile break ;; esac done ;; *db | *dbx | *strace | *truss) mode=execute ;; *install*|cp|mv) mode=install ;; *rm) mode=uninstall ;; *) # If we have no mode, but dlfiles were specified, then do execute mode. test -n "$execute_dlfiles" && mode=execute # Just use the default operation mode. if test -z "$mode"; then if test -n "$nonopt"; then $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2 else $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 fi fi ;; esac fi # Only execute mode is allowed to have -dlopen flags. if test -n "$execute_dlfiles" && test "$mode" != execute; then $echo "$modename: unrecognized option \`-dlopen'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$modename --help --mode=$mode' for more information." # These modes are in order of execution frequency so that they run quickly. case $mode in # libtool compile mode compile) modename="$modename: compile" # Get the compilation command and the source file. base_compile= srcfile="$nonopt" # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg="$arg" arg_mode=normal ;; target ) libobj="$arg" arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) if test -n "$libobj" ; then $echo "$modename: you cannot specify \`-o' more than once" 1>&2 exit $EXIT_FAILURE fi arg_mode=target continue ;; -static | -prefer-pic | -prefer-non-pic) later="$later $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" # Double-quote args containing other shell metacharacters. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac lastarg="$lastarg $arg" done IFS="$save_ifs" lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` # Add the arguments to base_compile. base_compile="$base_compile $lastarg" continue ;; * ) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg="$srcfile" srcfile="$arg" ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` case $lastarg in # Double-quote args containing other shell metacharacters. # Many Bourne shells cannot handle close brackets correctly # in scan sets, and some SunOS ksh mistreat backslash-escaping # in scan sets (worked around with variable expansion), # and furthermore cannot handle '|' '&' '(' ')' in scan sets # at all, so we specify them separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") lastarg="\"$lastarg\"" ;; esac base_compile="$base_compile $lastarg" done # for arg case $arg_mode in arg) $echo "$modename: you must specify an argument for -Xcompile" exit $EXIT_FAILURE ;; target) $echo "$modename: you must specify a target with \`-o'" 1>&2 exit $EXIT_FAILURE ;; *) # Get the name of the library object. [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo xform='[cCFSifmso]' case $libobj in *.ada) xform=ada ;; *.adb) xform=adb ;; *.ads) xform=ads ;; *.asm) xform=asm ;; *.c++) xform=c++ ;; *.cc) xform=cc ;; *.ii) xform=ii ;; *.class) xform=class ;; *.cpp) xform=cpp ;; *.cxx) xform=cxx ;; *.f90) xform=f90 ;; *.for) xform=for ;; *.java) xform=java ;; esac libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` case $libobj in *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; *) $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 exit $EXIT_FAILURE ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -static) build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done qlibobj=`$echo "X$libobj" | $Xsed -e "$sed_quote_subst"` case $qlibobj in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") qlibobj="\"$qlibobj\"" ;; esac test "X$libobj" != "X$qlibobj" \ && $echo "X$libobj" | grep '[]~#^*{};<>?"'"'"' &()|`$[]' \ && $echo "$modename: libobj name \`$libobj' may not contain shell special characters." objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$obj"; then xdir= else xdir=$xdir/ fi lobj=${xdir}$objdir/$objname if test -z "$base_compile"; then $echo "$modename: you must specify a compilation command" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi $run $rm $removelist trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" removelist="$removelist $output_obj $lockfile" trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $run ln "$progpath" "$lockfile" 2>/dev/null; do $show "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $echo "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $run $rm $removelist exit $EXIT_FAILURE fi $echo "$srcfile" > "$lockfile" fi if test -n "$fix_srcfile_path"; then eval srcfile=\"$fix_srcfile_path\" fi qsrcfile=`$echo "X$srcfile" | $Xsed -e "$sed_quote_subst"` case $qsrcfile in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") qsrcfile="\"$qsrcfile\"" ;; esac $run $rm "$libobj" "${libobj}T" # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. test -z "$run" && cat > ${libobj}T </dev/null`" != "X$srcfile"; then $echo "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $run $rm $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then $show "$mv $output_obj $lobj" if $run $mv $output_obj $lobj; then : else error=$? $run $rm $removelist exit $error fi fi # Append the name of the PIC object to the libtool object file. test -z "$run" && cat >> ${libobj}T <> ${libobj}T </dev/null`" != "X$srcfile"; then $echo "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $run $rm $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then $show "$mv $output_obj $obj" if $run $mv $output_obj $obj; then : else error=$? $run $rm $removelist exit $error fi fi # Append the name of the non-PIC object the libtool object file. # Only append if the libtool object file exists. test -z "$run" && cat >> ${libobj}T <> ${libobj}T <&2 fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes else if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built fi build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test ;; *) qarg=$arg ;; esac libtool_args="$libtool_args $qarg" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) compile_command="$compile_command @OUTPUT@" finalize_command="$finalize_command @OUTPUT@" ;; esac case $prev in dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. compile_command="$compile_command @SYMFILE@" finalize_command="$finalize_command @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then dlfiles="$dlfiles $arg" else dlprefiles="$dlprefiles $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" if test ! -f "$arg"; then $echo "$modename: symbol file \`$arg' does not exist" exit $EXIT_FAILURE fi prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat $save_arg` do # moreargs="$moreargs $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then pic_object= non_pic_object= # Read the .lo file # If there is no directory component, then add one. case $arg in */* | *\\*) . $arg ;; *) . ./$arg ;; esac if test -z "$pic_object" || \ test -z "$non_pic_object" || test "$pic_object" = none && \ test "$non_pic_object" = none; then $echo "$modename: cannot find name of object for \`$arg'" 1>&2 exit $EXIT_FAILURE fi # Extract subdirectory from the argument. xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$arg"; then xdir= else xdir="$xdir/" fi if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then dlfiles="$dlfiles $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. dlprefiles="$dlprefiles $pic_object" prev= fi # A PIC object. libobjs="$libobjs $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object non_pic_objects="$non_pic_objects $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" non_pic_objects="$non_pic_objects $non_pic_object" fi else # Only an error if not doing a dry-run. if test -z "$run"; then $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 exit $EXIT_FAILURE else # Dry-run case. # Extract subdirectory from the argument. xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$arg"; then xdir= else xdir="$xdir/" fi pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` libobjs="$libobjs $pic_object" non_pic_objects="$non_pic_objects $non_pic_object" fi fi done else $echo "$modename: link input file \`$save_arg' does not exist" exit $EXIT_FAILURE fi arg=$save_arg prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) $echo "$modename: only absolute run-paths are allowed" 1>&2 exit $EXIT_FAILURE ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) rpath="$rpath $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) xrpath="$xrpath $arg" ;; esac fi prev= continue ;; xcompiler) compiler_flags="$compiler_flags $qarg" prev= compile_command="$compile_command $qarg" finalize_command="$finalize_command $qarg" continue ;; xlinker) linker_flags="$linker_flags $qarg" compiler_flags="$compiler_flags $wl$qarg" prev= compile_command="$compile_command $wl$qarg" finalize_command="$finalize_command $wl$qarg" continue ;; xcclinker) linker_flags="$linker_flags $qarg" compiler_flags="$compiler_flags $qarg" prev= compile_command="$compile_command $qarg" finalize_command="$finalize_command $qarg" continue ;; shrext) shrext_cmds="$arg" prev= continue ;; darwin_framework|darwin_framework_skip) test "$prev" = "darwin_framework" && compiler_flags="$compiler_flags $arg" compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" prev= continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then compile_command="$compile_command $link_static_flag" finalize_command="$finalize_command $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 continue ;; -avoid-version) avoid_version=yes continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then $echo "$modename: more than one -exported-symbols argument is not allowed" exit $EXIT_FAILURE fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework|-arch|-isysroot) case " $CC " in *" ${arg} ${1} "* | *" ${arg} ${1} "*) prev=darwin_framework_skip ;; *) compiler_flags="$compiler_flags $arg" prev=darwin_framework ;; esac compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" ;; esac continue ;; -L*) dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2 absdir="$dir" notinst_path="$notinst_path $dir" fi dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "*) ;; *) deplibs="$deplibs -L$dir" lib_search_path="$lib_search_path $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) testbindir=`$echo "X$dir" | $Xsed -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; *) dllsearchpath="$dllsearchpath:$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; *) dllsearchpath="$dllsearchpath:$testbindir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework deplibs="$deplibs -framework System" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi deplibs="$deplibs $arg" continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. -model) compile_command="$compile_command $arg" compiler_flags="$compiler_flags $arg" finalize_command="$finalize_command $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe) compiler_flags="$compiler_flags $arg" compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" continue ;; -module) module=yes continue ;; # -64, -mips[0-9] enable 64-bit mode on the SGI compiler # -r[0-9][0-9]* specifies the processor on the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler # +DA*, +DD* enable 64-bit mode on the HP compiler # -q* pass through compiler args for the IBM compiler # -m* pass through architecture-specific compiler args for GCC # -m*, -t[45]*, -txscale* pass through architecture-specific # compiler args for GCC # -pg pass through profiling flag for GCC # @file GCC response files -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*|-pg| \ -t[45]*|-txscale*|@*) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" compiler_flags="$compiler_flags $arg" continue ;; -shrext) prev=shrext continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) # The PATH hackery in wrapper scripts is required on Windows # in order for the loader to find any dlls it needs. $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2 $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2 fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) $echo "$modename: only absolute run-paths are allowed" 1>&2 exit $EXIT_FAILURE ;; esac case "$xrpath " in *" $dir "*) ;; *) xrpath="$xrpath $dir" ;; esac continue ;; -static) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -Wc,*) args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'` arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" case $flag in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") flag="\"$flag\"" ;; esac arg="$arg $wl$flag" compiler_flags="$compiler_flags $flag" done IFS="$save_ifs" arg=`$echo "X$arg" | $Xsed -e "s/^ //"` ;; -Wl,*) args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'` arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" case $flag in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") flag="\"$flag\"" ;; esac arg="$arg $wl$flag" compiler_flags="$compiler_flags $wl$flag" linker_flags="$linker_flags $flag" done IFS="$save_ifs" arg=`$echo "X$arg" | $Xsed -e "s/^ //"` ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # Some other compiler flag. -* | +*) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac ;; *.$objext) # A standard object. objs="$objs $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then pic_object= non_pic_object= # Read the .lo file # If there is no directory component, then add one. case $arg in */* | *\\*) . $arg ;; *) . ./$arg ;; esac if test -z "$pic_object" || \ test -z "$non_pic_object" || test "$pic_object" = none && \ test "$non_pic_object" = none; then $echo "$modename: cannot find name of object for \`$arg'" 1>&2 exit $EXIT_FAILURE fi # Extract subdirectory from the argument. xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$arg"; then xdir= else xdir="$xdir/" fi if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then dlfiles="$dlfiles $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. dlprefiles="$dlprefiles $pic_object" prev= fi # A PIC object. libobjs="$libobjs $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object non_pic_objects="$non_pic_objects $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" non_pic_objects="$non_pic_objects $non_pic_object" fi else # Only an error if not doing a dry-run. if test -z "$run"; then $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 exit $EXIT_FAILURE else # Dry-run case. # Extract subdirectory from the argument. xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$arg"; then xdir= else xdir="$xdir/" fi pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` libobjs="$libobjs $pic_object" non_pic_objects="$non_pic_objects $non_pic_object" fi fi ;; *.$libext) # An archive. deplibs="$deplibs $arg" old_deplibs="$old_deplibs $arg" continue ;; *.la) # A libtool-controlled library. if test "$prev" = dlfiles; then # This library was specified with -dlopen. dlfiles="$dlfiles $arg" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. dlprefiles="$dlprefiles $arg" prev= else deplibs="$deplibs $arg" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" fi done # argument parsing loop if test -n "$prev"; then $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" fi oldlibs= # calculate the name of the file, without its directory outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` if test "X$output_objdir" = "X$output"; then output_objdir="$objdir" else output_objdir="$output_objdir/$objdir" fi # Create the object directory. if test ! -d "$output_objdir"; then $show "$mkdir $output_objdir" $run $mkdir $output_objdir exit_status=$? if test "$exit_status" -ne 0 && test ! -d "$output_objdir"; then exit $exit_status fi fi # Determine the type of output case $output in "") $echo "$modename: you must specify an output file" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac case $host in *cygwin* | *mingw* | *pw32*) # don't eliminate duplications in $postdeps and $predeps duplicate_compiler_generated_deps=yes ;; *) duplicate_compiler_generated_deps=$duplicate_deps ;; esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if test "X$duplicate_deps" = "Xyes" ; then case "$libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi libs="$libs $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; esac pre_post_deps="$pre_post_deps $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries case $linkmode in lib) passes="conv link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2 exit $EXIT_FAILURE ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; esac fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else compiler_flags="$compiler_flags $deplib" fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2 continue fi name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then library_names= old_library= case $lib in */* | *\\*) . $lib ;; *) . ./$lib ;; esac for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` test "X$ladir" = "X$lib" && ladir="." lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` ;; *) $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2 ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'` # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) xrpath="$xrpath $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) lib="$deplib" ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` if eval $echo \"$deplib\" 2>/dev/null \ | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then $echo $echo "*** Warning: Trying to link with static lib archive $deplib." $echo "*** I have the capability to make that library automatically link in when" $echo "*** you link to this library. But I can only do this if you have a" $echo "*** shared version of the library, which you do not appear to have" $echo "*** because the file extensions .$libext of this argument makes me believe" $echo "*** that it is just a static archive that I should not used here." else $echo $echo "*** Warning: Linking the shared library $output against the" $echo "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. newdlprefiles="$newdlprefiles $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else newdlfiles="$newdlfiles $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else $echo "$modename: cannot find the library \`$lib' or unhandled argument \`$deplib'" 1>&2 exit $EXIT_FAILURE fi # Check to see that this really is a libtool archive. if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : else $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` test "X$ladir" = "X$lib" && ladir="." dlname= dlopen= dlpreopen= libdir= library_names= old_library= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file case $lib in */* | *\\*) . $lib ;; *) . ./$lib ;; esac if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && dlfiles="$dlfiles $dlopen" test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 exit $EXIT_FAILURE fi # It is a libtool convenience library, so add in its objects. convenience="$convenience $ladir/$objdir/$old_library" old_convenience="$old_convenience $ladir/$objdir/$old_library" tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if test "X$duplicate_deps" = "Xyes" ; then case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi tmp_libs="$tmp_libs $deplib" done elif test "$linkmode" != prog && test "$linkmode" != lib; then $echo "$modename: \`$lib' is not a convenience library" 1>&2 exit $EXIT_FAILURE fi continue fi # $pass = conv # Get the name of the library we link against. linklib= for l in $old_library $library_names; do linklib="$l" done if test -z "$linklib"; then $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 exit $EXIT_FAILURE fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2 exit $EXIT_FAILURE fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. dlprefiles="$dlprefiles $lib $dependency_libs" else newdlfiles="$newdlfiles $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2 $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 abs_ladir="$ladir" fi ;; esac laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then $echo "$modename: warning: library \`$lib' was moved." 1>&2 dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$libdir" absdir="$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later notinst_path="$notinst_path $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later notinst_path="$notinst_path $abs_ladir" fi fi # $installed = yes name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir"; then $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2 exit $EXIT_FAILURE fi # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then newdlprefiles="$newdlprefiles $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then newdlprefiles="$newdlprefiles $dir/$dlname" else newdlprefiles="$newdlprefiles $dir/$linklib" fi fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then newlib_search_path="$newlib_search_path $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if test "X$duplicate_deps" = "Xyes" ; then case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi tmp_libs="$tmp_libs $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { test "$prefer_static_libs" = no || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. case "$temp_rpath " in *" $dir "*) ;; *" $absdir "*) ;; *) temp_rpath="$temp_rpath $absdir" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) compile_rpath="$compile_rpath $absdir" esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test "$use_static_libs" = built && test "$installed" = yes ; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then if test "$installed" = no; then notinst_deplibs="$notinst_deplibs $lib" need_relink=yes fi # This is a shared library # Warn about portability, can't link against -module's on # some systems (darwin) if test "$shouldnotlink" = yes && test "$pass" = link ; then $echo if test "$linkmode" = prog; then $echo "*** Warning: Linking the executable $output against the loadable module" else $echo "*** Warning: Linking the shared library $output against the loadable module" fi $echo "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) compile_rpath="$compile_rpath $absdir" esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names realname="$2" shift; shift libname=`eval \\$echo \"$libname_spec\"` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw*) major=`expr $current - $age` versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" soname=`$echo $soroot | ${SED} -e 's/^.*\///'` newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a" # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else $show "extracting exported symbol list from \`$soname'" save_ifs="$IFS"; IFS='~' cmds=$extract_expsyms_cmds for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else $show "generating import library for \`$soname'" save_ifs="$IFS"; IFS='~' cmds=$old_archive_from_expsyms_cmds for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; *-*-sysv4*uw2*) add_dir="-L$dir" ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a module then we can not link against # it, someone is ignoring the new warnings I added if /usr/bin/file -L $add 2> /dev/null | $EGREP ": [^:]* bundle" >/dev/null ; then $echo "** Warning, lib $linklib is a module, not a shared library" if test -z "$old_library" ; then $echo $echo "** And there doesn't seem to be a static archive available" $echo "** The link will probably fail, sorry" else add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$dir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) add_dir="$add_dir -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then $echo "$modename: configuration error: unsupported hardcode properties" exit $EXIT_FAILURE fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && \ test "$hardcode_minus_L" != yes && \ test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) add_dir="$add_dir -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. $echo $echo "*** Warning: This system can not link to static lib archive $lib." $echo "*** I have the capability to make that library automatically link in when" $echo "*** you link to this library. But I can only do this if you have a" $echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then $echo "*** But as you try to build a module library, libtool will still create " $echo "*** a static module, that should work as long as the dlopening application" $echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then $echo $echo "*** However, this would only work if libtool was able to extract symbol" $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" $echo "*** not find such a program. So, this module is probably useless." $echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'` case " $xrpath " in *" $temp_xrpath "*) ;; *) xrpath="$xrpath $temp_xrpath";; esac;; *) temp_deplibs="$temp_deplibs $libdir";; esac done dependency_libs="$temp_deplibs" fi newlib_search_path="$newlib_search_path $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" if test "X$duplicate_deps" = "Xyes" ; then case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi tmp_libs="$tmp_libs $deplib" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do case $deplib in -L*) path="$deplib" ;; *.la) dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'` test "X$dir" = "X$deplib" && dir="." # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 absdir="$dir" fi ;; esac if grep "^installed=no" $deplib > /dev/null; then path="$absdir/$objdir" else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` if test -z "$libdir"; then $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi if test "$absdir" != "$libdir"; then $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 fi path="$absdir" fi depdepl= case $host in *-*-darwin*) # we do not want to link against static libs, # but need to link against shared eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$path/$depdepl" ; then depdepl="$path/$depdepl" fi # do not add paths which are already there case " $newlib_search_path " in *" $path "*) ;; *) newlib_search_path="$newlib_search_path $path";; esac fi path="" ;; *) path="-L$path" ;; esac ;; -l*) case $host in *-*-darwin*) # Again, we only want to link against shared libraries eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"` for tmp in $newlib_search_path ; do if test -f "$tmp/lib$tmp_libs.dylib" ; then eval depdepl="$tmp/lib$tmp_libs.dylib" break fi done path="" ;; *) continue ;; esac ;; *) continue ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac case " $deplibs " in *" $depdepl "*) ;; *) deplibs="$depdepl $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) lib_search_path="$lib_search_path $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) tmp_libs="$tmp_libs $deplib" ;; esac ;; *) tmp_libs="$tmp_libs $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then tmp_libs="$tmp_libs $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$deplibs"; then $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 fi if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 fi if test -n "$rpath"; then $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 fi if test -n "$xrpath"; then $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 fi if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2 fi if test -n "$release"; then $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 fi if test -n "$export_symbols" || test -n "$export_symbols_regex"; then $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 fi # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" objs="$objs$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) if test "$module" = no; then $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1 exit $EXIT_FAILURE else $echo $echo "*** Warning: Linking the shared library $output against the non-libtool" $echo "*** objects $objs is not portable!" libobjs="$libobjs $objs" fi fi if test "$dlself" != no; then $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2 fi set dummy $rpath if test "$#" -gt 2; then $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 fi install_libdir="$2" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2 fi if test -n "$release"; then $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 fi else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 IFS="$save_ifs" if test -n "$8"; then $echo "$modename: too many parameters to \`-version-info'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$2" number_minor="$3" number_revision="$4" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in darwin|linux|osf|windows) current=`expr $number_major + $number_minor` age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) current=`expr $number_major + $number_minor - 1` age="$number_minor" revision="$number_minor" ;; esac ;; no) current="$2" revision="$3" age="$4" ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) $echo "$modename: CURRENT \`$current' must be a nonnegative integer" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 exit $EXIT_FAILURE ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) $echo "$modename: REVISION \`$revision' must be a nonnegative integer" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 exit $EXIT_FAILURE ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) $echo "$modename: AGE \`$age' must be a nonnegative integer" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 exit $EXIT_FAILURE ;; esac if test "$age" -gt "$current"; then $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 exit $EXIT_FAILURE fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header major=.`expr $current - $age` versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... minor_current=`expr $current + 1` verstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current"; ;; irix | nonstopux) major=`expr $current - $age + 1` case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do iface=`expr $revision - $loop` loop=`expr $loop - 1` verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) major=.`expr $current - $age` versuffix="$major.$age.$revision" ;; osf) major=.`expr $current - $age` versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do iface=`expr $current - $loop` loop=`expr $loop - 1` verstring="$verstring:${iface}.0" done # Make executables depend on our current version. verstring="$verstring:${current}.0" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. major=`expr $current - $age` versuffix="-$major" ;; *) $echo "$modename: unknown library version type \`$version_type'" 1>&2 $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 exit $EXIT_FAILURE ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi if test "$mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$echo "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi removelist="$removelist $p" ;; *) ;; esac done if test -n "$removelist"; then $show "${rm}r $removelist" $run ${rm}r $removelist fi fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then oldlibs="$oldlibs $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` fi # Eliminate all temporary directories. for path in $notinst_path; do lib_search_path=`$echo "$lib_search_path " | ${SED} -e "s% $path % %g"` deplibs=`$echo "$deplibs " | ${SED} -e "s% -L$path % %g"` dependency_libs=`$echo "$dependency_libs " | ${SED} -e "s% -L$path % %g"` done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do temp_xrpath="$temp_xrpath -R$libdir" case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) dlfiles="$dlfiles $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) dlprefiles="$dlprefiles $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework deplibs="$deplibs -framework System" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then deplibs="$deplibs -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $rm conftest.c cat > conftest.c </dev/null` for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null \ | grep " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ | ${SED} 10q \ | $EGREP "$file_magic_regex" > /dev/null; then newdeplibs="$newdeplibs $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes $echo $echo "*** Warning: linker path does not have real file for library $a_deplib." $echo "*** I have the capability to make that library automatically link in when" $echo "*** you link to this library. But I can only do this if you have a" $echo "*** shared version of the library, which you do not appear to have" $echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $echo "*** with $libname but no candidates were found. (...for file magic test)" else $echo "*** with $libname and none of the candidates passed a file format test" $echo "*** using a file magic. Last file checked: $potlib" fi fi else # Add a -L argument. newdeplibs="$newdeplibs $a_deplib" fi done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` for a_deplib in $deplibs; do name=`expr $a_deplib : '-l\(.*\)'` # If $name is empty we are operating on a -L argument. if test -n "$name" && test "$name" != "0"; then if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) newdeplibs="$newdeplibs $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval \\$echo \"$libname_spec\"` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval $echo \"$potent_lib\" 2>/dev/null \ | ${SED} 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then newdeplibs="$newdeplibs $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes $echo $echo "*** Warning: linker path does not have real file for library $a_deplib." $echo "*** I have the capability to make that library automatically link in when" $echo "*** you link to this library. But I can only do this if you have a" $echo "*** shared version of the library, which you do not appear to have" $echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $echo "*** with $libname but no candidates were found. (...for regex pattern test)" else $echo "*** with $libname and none of the candidates passed a file format test" $echo "*** using a regex pattern. Last file checked: $potlib" fi fi else # Add a -L argument. newdeplibs="$newdeplibs $a_deplib" fi done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ -e 's/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"` done fi if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \ | grep . >/dev/null; then $echo if test "X$deplibs_check_method" = "Xnone"; then $echo "*** Warning: inter-library dependencies are not supported in this platform." else $echo "*** Warning: inter-library dependencies are not known to be supported." fi $echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes fi ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then $echo $echo "*** Warning: libtool could not satisfy all declared inter-library" $echo "*** dependencies of module $libname. Therefore, libtool will create" $echo "*** a static module, that should work as long as the dlopening" $echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then $echo $echo "*** However, this would only work if libtool was able to extract symbol" $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" $echo "*** not find such a program. So, this module is probably useless." $echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else $echo "*** The inter-library dependencies that have been dropped here will be" $echo "*** automatically added whenever a program is linked with this library" $echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then $echo $echo "*** Since this library must not contain undefined symbols," $echo "*** because either the platform does not support them or" $echo "*** it was explicitly requested with -no-undefined," $echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) new_libs="$new_libs -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$new_libs $deplib" ;; esac ;; *) new_libs="$new_libs $deplib" ;; esac done deplibs="$new_libs" # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" dep_rpath="$dep_rpath $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) perm_rpath="$perm_rpath $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" if test -n "$hardcode_libdir_flag_spec_ld"; then eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" else eval dep_rpath=\"$hardcode_libdir_flag_spec\" fi fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do rpath="$rpath$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names realname="$2" shift; shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" linknames= for link do linknames="$linknames $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then $show "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $run $rm $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" if len=`expr "X$cmd" : ".*"` && test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then $show "$cmd" $run eval "$cmd" || exit $? skipped_export=false else # The command line is too long to execute in one step. $show "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" if test -n "$export_symbols_regex"; then $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' $show "$mv \"${export_symbols}T\" \"$export_symbols\"" $run eval '$mv "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) tmp_deplibs="$tmp_deplibs $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" else gentop="$output_objdir/${outputname}x" generated="$generated $gentop" func_extract_archives $gentop $convenience libobjs="$libobjs $func_extract_archives_result" fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" linker_flags="$linker_flags $flag" fi # Make a backup of the uninstalled library when relinking if test "$mode" = relink; then $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && len=`expr "X$test_cmds" : ".*" 2>/dev/null` && test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise. $echo "creating reloadable object files..." # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output output_la=`$echo "X$output" | $Xsed -e "$basename"` # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= delfiles= last_robj= k=1 output=$output_objdir/$output_la-${k}.$objext # Loop over the list of objects to be linked. for obj in $save_libobjs do eval test_cmds=\"$reload_cmds $objlist $last_robj\" if test "X$objlist" = X || { len=`expr "X$test_cmds" : ".*" 2>/dev/null` && test "$len" -le "$max_cmd_len"; }; then objlist="$objlist $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. eval concat_cmds=\"$reload_cmds $objlist $last_robj\" else # All subsequent reloadable object files will link in # the last one created. eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext k=`expr $k + 1` output=$output_objdir/$output_la-${k}.$objext objlist=$obj len=1 fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" if ${skipped_export-false}; then $show "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $run $rm $export_symbols libobjs=$output # Append the command to create the export file. eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\" fi # Set up a command to remove the reloadable object files # after they are used. i=0 while test "$i" -lt "$k" do i=`expr $i + 1` delfiles="$delfiles $output_objdir/$output_la-${i}.$objext" done $echo "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi # Append the command to remove the reloadable object files # to the just-reset $cmds. eval cmds=\"\$cmds~\$rm $delfiles\" fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$mode" = relink; then $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)' fi exit $lt_exit } done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$mode" = relink; then $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then $show "${rm}r $gentop" $run ${rm}r "$gentop" fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$deplibs"; then $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 fi if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 fi if test -n "$rpath"; then $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 fi if test -n "$xrpath"; then $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 fi if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 fi if test -n "$release"; then $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 fi case $output in *.lo) if test -n "$objs$old_deplibs"; then $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 exit $EXIT_FAILURE fi libobj="$output" obj=`$echo "X$output" | $Xsed -e "$lo2o"` ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $run $rm $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\" else gentop="$output_objdir/${obj}x" generated="$generated $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # Create the old-style object. reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" cmds=$reload_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then $show "${rm}r $gentop" $run ${rm}r $gentop fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then $show "${rm}r $gentop" $run ${rm}r $gentop fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $run eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" cmds=$reload_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" fi if test -n "$gentop"; then $show "${rm}r $gentop" $run ${rm}r $gentop fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;; esac if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 fi if test -n "$release"; then $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 fi if test "$preload" = yes; then if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown && test "$dlopen_self_static" = unknown; then $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." fi fi case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'` finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'` ;; esac case $host in *darwin*) # Don't allow lazy linking, it breaks C++ global constructors if test "$tagname" = CXX ; then compile_command="$compile_command ${wl}-bind_at_load" finalize_command="$finalize_command ${wl}-bind_at_load" fi ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) new_libs="$new_libs -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$new_libs $deplib" ;; esac ;; *) new_libs="$new_libs $deplib" ;; esac done compile_deplibs="$new_libs" compile_command="$compile_command $compile_deplibs" finalize_command="$finalize_command $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" rpath="$rpath $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) perm_rpath="$perm_rpath $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) testbindir=`$echo "X$libdir" | $Xsed -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; *) dllsearchpath="$dllsearchpath:$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; *) dllsearchpath="$dllsearchpath:$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" rpath="$rpath $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` fi dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then dlsyms="${outputname}S.c" else $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 fi fi if test -n "$dlsyms"; then case $dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${outputname}.nm" $show "$rm $nlist ${nlist}S ${nlist}T" $run $rm "$nlist" "${nlist}S" "${nlist}T" # Parse the name list into a source file. $show "creating $output_objdir/$dlsyms" test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ /* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ /* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ #ifdef __cplusplus extern \"C\" { #endif /* Prevent the only kind of declaration conflicts we can make. */ #define lt_preloaded_symbols some_other_symbol /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then $show "generating symbol list for \`$output'" test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` for arg in $progfiles; do $show "extracting global C symbols from \`$arg'" $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' $run eval '$mv "$nlist"T "$nlist"' fi if test -n "$export_symbols_regex"; then $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' $run eval '$mv "$nlist"T "$nlist"' fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $run $rm $export_symbols $run eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* ) $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' $run eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac else $run eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' $run eval 'grep -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' $run eval 'mv "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* ) $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' $run eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac fi fi for arg in $dlprefiles; do $show "extracting global C symbols from \`$arg'" name=`$echo "$arg" | ${SED} -e 's%^.*/%%'` $run eval '$echo ": $name " >> "$nlist"' $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" done if test -z "$run"; then # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $mv "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if grep -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else grep -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"' else $echo '/* NONE */' >> "$output_objdir/$dlsyms" fi $echo >> "$output_objdir/$dlsyms" "\ #undef lt_preloaded_symbols #if defined (__STDC__) && __STDC__ # define lt_ptr void * #else # define lt_ptr char * # define const #endif /* The mapping between symbol names and symbols. */ " case $host in *cygwin* | *mingw* ) $echo >> "$output_objdir/$dlsyms" "\ /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs */ struct { " ;; * ) $echo >> "$output_objdir/$dlsyms" "\ const struct { " ;; esac $echo >> "$output_objdir/$dlsyms" "\ const char *name; lt_ptr address; } lt_preloaded_symbols[] = {\ " eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms" $echo >> "$output_objdir/$dlsyms" "\ {0, (lt_ptr) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " fi pic_flag_for_symtable= case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) case "$compile_command " in *" -static "*) ;; *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";; esac;; *-*-hpux*) case "$compile_command " in *" -static "*) ;; *) pic_flag_for_symtable=" $pic_flag";; esac esac # Now compile the dynamic symbol file. $show "(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" $run eval '(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? # Clean up the generated files. $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" # Transform the symbol file into the correct name. case $host in *cygwin* | *mingw* ) if test -f "$output_objdir/${outputname}.def" ; then compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%"` finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%"` else compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` fi ;; * ) compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` ;; esac ;; *) $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 exit $EXIT_FAILURE ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` fi if test "$need_relink" = no || test "$build_libtool_libs" != yes; then # Replace the output file specification. compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. $show "$link_command" $run eval "$link_command" exit_status=$? # Delete the generated files. if test -n "$dlsyms"; then $show "$rm $output_objdir/${outputname}S.${objext}" $run $rm "$output_objdir/${outputname}S.${objext}" fi exit $exit_status fi if test -n "$shlibpath_var"; then # We should set the shlibpath_var rpath= for dir in $temp_rpath; do case $dir in [\\/]* | [A-Za-z]:[\\/]*) # Absolute path. rpath="$rpath$dir:" ;; *) # Relative path: add a thisdir entry. rpath="$rpath\$thisdir/$dir:" ;; esac done temp_rpath="$rpath" fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do rpath="$rpath$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do rpath="$rpath$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $run $rm $output # Link the executable and exit $show "$link_command" $run eval "$link_command" || exit $? exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 $echo "$modename: \`$output' will be relinked during installation" 1>&2 else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname $show "$link_command" $run eval "$link_command" || exit $? # Now create the wrapper script. $show "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` relink_command="$var=\"$var_value\"; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` fi # Quote $echo for shipping. if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then case $progpath in [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; esac qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` else qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` fi # Only actually do things if our run command is non-null. if test -z "$run"; then # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) output_name=`basename $output` output_path=`dirname $output` cwrappersource="$output_path/$objdir/lt-$output_name.c" cwrapper="$output_path/$output_name.exe" $rm $cwrappersource $cwrapper trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 cat > $cwrappersource <> $cwrappersource<<"EOF" #include #include #include #include #include #include #include #include #include #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) # define HAVE_DOS_BASED_FILE_SYSTEM # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) /* -DDEBUG is fairly common in CFLAGS. */ #undef DEBUG #if defined DEBUGWRAPPER # define DEBUG(format, ...) fprintf(stderr, format, __VA_ARGS__) #else # define DEBUG(format, ...) #endif const char *program_name = NULL; void * xmalloc (size_t num); char * xstrdup (const char *string); const char * base_name (const char *name); char * find_executable(const char *wrapper); int check_executable(const char *path); char * strendzap(char *str, const char *pat); void lt_fatal (const char *message, ...); int main (int argc, char *argv[]) { char **newargz; int i; program_name = (char *) xstrdup (base_name (argv[0])); DEBUG("(main) argv[0] : %s\n",argv[0]); DEBUG("(main) program_name : %s\n",program_name); newargz = XMALLOC(char *, argc+2); EOF cat >> $cwrappersource <> $cwrappersource <<"EOF" newargz[1] = find_executable(argv[0]); if (newargz[1] == NULL) lt_fatal("Couldn't find %s", argv[0]); DEBUG("(main) found exe at : %s\n",newargz[1]); /* we know the script has the same name, without the .exe */ /* so make sure newargz[1] doesn't end in .exe */ strendzap(newargz[1],".exe"); for (i = 1; i < argc; i++) newargz[i+1] = xstrdup(argv[i]); newargz[argc+1] = NULL; for (i=0; i> $cwrappersource <> $cwrappersource <> $cwrappersource <<"EOF" return 127; } void * xmalloc (size_t num) { void * p = (void *) malloc (num); if (!p) lt_fatal ("Memory exhausted"); return p; } char * xstrdup (const char *string) { return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL ; } const char * base_name (const char *name) { const char *base; #if defined (HAVE_DOS_BASED_FILE_SYSTEM) /* Skip over the disk name in MSDOS pathnames. */ if (isalpha ((unsigned char)name[0]) && name[1] == ':') name += 2; #endif for (base = name; *name; name++) if (IS_DIR_SEPARATOR (*name)) base = name + 1; return base; } int check_executable(const char * path) { struct stat st; DEBUG("(check_executable) : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!"); if ((!path) || (!*path)) return 0; if ((stat (path, &st) >= 0) && ( /* MinGW & native WIN32 do not support S_IXOTH or S_IXGRP */ #if defined (S_IXOTH) ((st.st_mode & S_IXOTH) == S_IXOTH) || #endif #if defined (S_IXGRP) ((st.st_mode & S_IXGRP) == S_IXGRP) || #endif ((st.st_mode & S_IXUSR) == S_IXUSR)) ) return 1; else return 0; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise */ char * find_executable (const char* wrapper) { int has_slash = 0; const char* p; const char* p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; int tmp_len; char* concat_name; DEBUG("(find_executable) : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha ((unsigned char)wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable(concat_name)) return concat_name; XFREE(concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable(concat_name)) return concat_name; XFREE(concat_name); } #if defined (HAVE_DOS_BASED_FILE_SYSTEM) } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char* path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char* q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR(*q)) break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal ("getcwd failed"); tmp_len = strlen(tmp); concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC(char, p_len + 1 + strlen(wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable(concat_name)) return concat_name; XFREE(concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal ("getcwd failed"); tmp_len = strlen(tmp); concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable(concat_name)) return concat_name; XFREE(concat_name); return NULL; } char * strendzap(char *str, const char *pat) { size_t len, patlen; assert(str != NULL); assert(pat != NULL); len = strlen(str); patlen = strlen(pat); if (patlen <= len) { str += len - patlen; if (strcmp(str, pat) == 0) *str = '\0'; } return str; } static void lt_error_core (int exit_status, const char * mode, const char * message, va_list ap) { fprintf (stderr, "%s: %s: ", program_name, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, "FATAL", message, ap); va_end (ap); } EOF # we should really use a build-platform specific compiler # here, but OTOH, the wrappers (shell script and this C one) # are only useful if you want to execute the "real" binary. # Since the "real" binary is built for $host, then this # wrapper might as well be built for $host, too. $run $LTCC $LTCFLAGS -s -o $cwrapper $cwrappersource ;; esac $rm $output trap "$rm $output; exit $EXIT_FAILURE" 1 2 15 $echo > $output "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed='${SED} -e 1s/^X//' sed_quote_subst='$sed_quote_subst' # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variable: notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$echo are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then echo=\"$qecho\" file=\"\$0\" # Make sure echo works. if test \"X\$1\" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then # Yippee, \$echo works! : else # Restart under the correct shell, and then maybe \$echo will work. exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} fi fi\ " $echo >> $output "\ # Find the directory that this script lives in. thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` done # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $echo >> $output "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || \\ { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $mkdir \"\$progdir\" else $rm \"\$progdir/\$file\" fi" $echo >> $output "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $echo \"\$relink_command_output\" >&2 $rm \"\$progdir/\$file\" exit $EXIT_FAILURE fi fi $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $rm \"\$progdir/\$program\"; $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } $rm \"\$progdir/\$file\" fi" else $echo >> $output "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $echo >> $output "\ if test -f \"\$progdir/\$program\"; then" # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $echo >> $output "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` export $shlibpath_var " fi # fixup the dll searchpath if we need to. if test -n "$dllsearchpath"; then $echo >> $output "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi $echo >> $output "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2*) $echo >> $output "\ exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $echo >> $output "\ exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $echo >> $output "\ \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\" exit $EXIT_FAILURE fi else # The program doesn't exist. \$echo \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$echo \"This script is just a wrapper for \$program.\" 1>&2 $echo \"See the $PACKAGE documentation for more information.\" 1>&2 exit $EXIT_FAILURE fi fi\ " chmod +x $output fi exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" generated="$generated $gentop" func_extract_archives $gentop $addlibs oldobjs="$oldobjs $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do $echo "X$obj" | $Xsed -e 's%^.*/%%' done | sort | sort -uc >/dev/null 2>&1); then : else $echo "copying selected object files to avoid basename conflicts..." if test -z "$gentop"; then gentop="$output_objdir/${outputname}x" generated="$generated $gentop" $show "${rm}r $gentop" $run ${rm}r "$gentop" $show "$mkdir $gentop" $run $mkdir "$gentop" exit_status=$? if test "$exit_status" -ne 0 && test ! -d "$gentop"; then exit $exit_status fi fi save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do objbase=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase counter=`expr $counter + 1` case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done $show "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" $run ln "$obj" "$gentop/$newobj" || $run cp "$obj" "$gentop/$newobj" oldobjs="$oldobjs $gentop/$newobj" ;; *) oldobjs="$oldobjs $obj" ;; esac done fi eval cmds=\"$old_archive_cmds\" if len=`expr "X$cmds" : ".*"` && test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts $echo "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done for obj in $save_oldobjs do oldobjs="$objlist $obj" objlist="$objlist $obj" eval test_cmds=\"$old_archive_cmds\" if len=`expr "X$test_cmds" : ".*" 2>/dev/null` && test "$len" -le "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do eval cmd=\"$cmd\" IFS="$save_ifs" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" done if test -n "$generated"; then $show "${rm}r$generated" $run ${rm}r$generated fi # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" $show "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` relink_command="$var=\"$var_value\"; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. if test -z "$run"; then for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'` eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` if test -z "$libdir"; then $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi newdependency_libs="$newdependency_libs $libdir/$name" ;; *) newdependency_libs="$newdependency_libs $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` if test -z "$libdir"; then $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi newdlfiles="$newdlfiles $libdir/$name" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` if test -z "$libdir"; then $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi newdlprefiles="$newdlprefiles $libdir/$name" done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac newdlfiles="$newdlfiles $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac newdlprefiles="$newdlprefiles $abs" done dlprefiles="$newdlprefiles" fi $rm $output # place dlname in correct position for cygwin tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; esac $echo > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $echo >> $output "\ relink_command=\"$relink_command\"" fi done fi # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? ;; esac exit $EXIT_SUCCESS ;; # libtool install mode install) modename="$modename: install" # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. $echo "X$nonopt" | grep shtool > /dev/null; then # Aesthetically quote it. arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac install_prog="$arg " arg="$1" shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac install_prog="$install_prog$arg" # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= for arg do if test -n "$dest"; then files="$files $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) case " $install_prog " in *[\\\ /]cp\ *) ;; *) prev=$arg ;; esac ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac install_prog="$install_prog $arg" done if test -z "$install_prog"; then $echo "$modename: you must specify an install program" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi if test -n "$prev"; then $echo "$modename: the \`$prev' option requires an argument" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi if test -z "$files"; then if test -z "$dest"; then $echo "$modename: no file or destination specified" 1>&2 else $echo "$modename: you must specify a destination" 1>&2 fi $echo "$help" 1>&2 exit $EXIT_FAILURE fi # Strip any trailing slash from the destination. dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` test "X$destdir" = "X$dest" && destdir=. destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` # Not a directory, so check to see that there is only one file specified. set dummy $files if test "$#" -gt 2; then $echo "$modename: \`$dest' is not a directory" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. staticlibs="$staticlibs $file" ;; *.la) # Check to see that this really is a libtool archive. if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : else $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi library_names= old_library= relink_command= # If there is no directory component, then add one. case $file in */* | *\\*) . $file ;; *) . ./$file ;; esac # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) current_libdirs="$current_libdirs $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) future_libdirs="$future_libdirs $libdir" ;; esac fi dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/ test "X$dir" = "X$file/" && dir= dir="$dir$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. if test "$inst_prefix_dir" = "$destdir"; then $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2 exit $EXIT_FAILURE fi if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi $echo "$modename: warning: relinking \`$file'" 1>&2 $show "$relink_command" if $run eval "$relink_command"; then : else $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 exit $EXIT_FAILURE fi fi # See the names of the shared library. set dummy $library_names if test -n "$2"; then realname="$2" shift shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. $show "$install_prog $dir/$srcname $destdir/$realname" $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $? if test -n "$stripme" && test -n "$striplib"; then $show "$striplib $destdir/$realname" $run eval "$striplib $destdir/$realname" || exit $? fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try `ln -sf' first, because the `ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do if test "$linkname" != "$realname"; then $show "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" $run eval "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" fi done fi # Do each command in the postinstall commands. lib="$destdir/$realname" cmds=$postinstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$mode" = relink; then $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)' fi exit $lt_exit } done IFS="$save_ifs" fi # Install the pseudo-library for information purposes. name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` instname="$dir/$name"i $show "$install_prog $instname $destdir/$name" $run eval "$install_prog $instname $destdir/$name" || exit $? # Maybe install the static library, too. test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` ;; *.$objext) staticdest="$destfile" destfile= ;; *) $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; esac # Install the libtool object if requested. if test -n "$destfile"; then $show "$install_prog $file $destfile" $run eval "$install_prog $file $destfile" || exit $? fi # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` $show "$install_prog $staticobj $staticdest" $run eval "$install_prog \$staticobj \$staticdest" || exit $? fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then file=`$echo $file|${SED} 's,.exe$,,'` stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin*|*mingw*) wrapper=`$echo $file | ${SED} -e 's,.exe$,,'` ;; *) wrapper=$file ;; esac if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then notinst_deplibs= relink_command= # Note that it is not necessary on cygwin/mingw to append a dot to # foo even if both foo and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. # # If there is no directory component, then add one. case $wrapper in */* | *\\*) . ${wrapper} ;; *) . ./${wrapper} ;; esac # Check the variables that should have been set. if test -z "$notinst_deplibs"; then $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2 exit $EXIT_FAILURE fi finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then # If there is no directory component, then add one. case $lib in */* | *\\*) . $lib ;; *) . ./$lib ;; esac fi libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 finalize=no fi done relink_command= # Note that it is not necessary on cygwin/mingw to append a dot to # foo even if both foo and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. # # If there is no directory component, then add one. case $wrapper in */* | *\\*) . ${wrapper} ;; *) . ./${wrapper} ;; esac outputname= if test "$fast_install" = no && test -n "$relink_command"; then if test "$finalize" = yes && test -z "$run"; then tmpdir=`func_mktempdir` file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'` outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` $show "$relink_command" if $run eval "$relink_command"; then : else $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 ${rm}r "$tmpdir" continue fi file="$outputname" else $echo "$modename: warning: cannot relink \`$file'" 1>&2 fi else # Install the binary that we compiled earlier. file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'` ;; esac ;; esac $show "$install_prog$stripme $file $destfile" $run eval "$install_prog\$stripme \$file \$destfile" || exit $? test -n "$outputname" && ${rm}r "$tmpdir" ;; esac done for file in $staticlibs; do name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` # Set up the ranlib parameters. oldlib="$destdir/$name" $show "$install_prog $file $oldlib" $run eval "$install_prog \$file \$oldlib" || exit $? if test -n "$stripme" && test -n "$old_striplib"; then $show "$old_striplib $oldlib" $run eval "$old_striplib $oldlib" || exit $? fi # Do each command in the postinstall commands. cmds=$old_postinstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" done if test -n "$future_libdirs"; then $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 fi if test -n "$current_libdirs"; then # Maybe just do a dry run. test -n "$run" && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi ;; # libtool finish mode finish) modename="$modename: finish" libdirs="$nonopt" admincmds= if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for dir do libdirs="$libdirs $dir" done for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. cmds=$finish_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || admincmds="$admincmds $cmd" done IFS="$save_ifs" fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $run eval "$cmds" || admincmds="$admincmds $cmds" fi done fi # Exit here if they wanted silent mode. test "$show" = : && exit $EXIT_SUCCESS $echo "X----------------------------------------------------------------------" | $Xsed $echo "Libraries have been installed in:" for libdir in $libdirs; do $echo " $libdir" done $echo $echo "If you ever happen to want to link against installed libraries" $echo "in a given directory, LIBDIR, you must either use libtool, and" $echo "specify the full pathname of the library, or use the \`-LLIBDIR'" $echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then $echo " - add LIBDIR to the \`$shlibpath_var' environment variable" $echo " during execution" fi if test -n "$runpath_var"; then $echo " - add LIBDIR to the \`$runpath_var' environment variable" $echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $echo " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $echo " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then $echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi $echo $echo "See any operating system documentation about shared libraries for" $echo "more information, such as the ld(1) and ld.so(8) manual pages." $echo "X----------------------------------------------------------------------" | $Xsed exit $EXIT_SUCCESS ;; # libtool execute mode execute) modename="$modename: execute" # The first argument is the command name. cmd="$nonopt" if test -z "$cmd"; then $echo "$modename: you must specify a COMMAND" 1>&2 $echo "$help" exit $EXIT_FAILURE fi # Handle -dlopen flags immediately. for file in $execute_dlfiles; do if test ! -f "$file"; then $echo "$modename: \`$file' is not a file" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi dir= case $file in *.la) # Check to see that this really is a libtool archive. if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : else $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi # Read the libtool library. dlname= library_names= # If there is no directory component, then add one. case $file in */* | *\\*) . $file ;; *) . ./$file ;; esac # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" continue fi dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` test "X$dir" = "X$file" && dir=. if test -f "$dir/$objdir/$dlname"; then dir="$dir/$objdir" else $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 exit $EXIT_FAILURE fi ;; *.lo) # Just add the directory containing the .lo file. dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` test "X$dir" = "X$file" && dir=. ;; *) $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -*) ;; *) # Do a test to see if this is really a libtool program. if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then # If there is no directory component, then add one. case $file in */* | *\\*) . $file ;; *) . ./$file ;; esac # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` args="$args \"$file\"" done if test -z "$run"; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables if test "${save_LC_ALL+set}" = set; then LC_ALL="$save_LC_ALL"; export LC_ALL fi if test "${save_LANG+set}" = set; then LANG="$save_LANG"; export LANG fi # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" $echo "export $shlibpath_var" fi $echo "$cmd$args" exit $EXIT_SUCCESS fi ;; # libtool clean and uninstall mode clean | uninstall) modename="$modename: $mode" rm="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) rm="$rm $arg"; rmforce=yes ;; -*) rm="$rm $arg" ;; *) files="$files $arg" ;; esac done if test -z "$rm"; then $echo "$modename: you must specify an RM program" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi rmdirs= origobjdir="$objdir" for file in $files; do dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` if test "X$dir" = "X$file"; then dir=. objdir="$origobjdir" else objdir="$dir/$origobjdir" fi name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` test "$mode" = uninstall && objdir="$dir" # Remember objdir for removal later, being careful to avoid duplicates if test "$mode" = clean; then case " $rmdirs " in *" $objdir "*) ;; *) rmdirs="$rmdirs $objdir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if (test -L "$file") >/dev/null 2>&1 \ || (test -h "$file") >/dev/null 2>&1 \ || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then . $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do rmfiles="$rmfiles $objdir/$n" done test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" case "$mode" in clean) case " $library_names " in # " " in the beginning catches empty $dlname *" $dlname "*) ;; *) rmfiles="$rmfiles $objdir/$dlname" ;; esac test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. cmds=$postuninstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" if test "$?" -ne 0 && test "$rmforce" != yes; then exit_status=1 fi done IFS="$save_ifs" fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. cmds=$old_postuninstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" if test "$?" -ne 0 && test "$rmforce" != yes; then exit_status=1 fi done IFS="$save_ifs" fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then # Read the .lo file . $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" \ && test "$pic_object" != none; then rmfiles="$rmfiles $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" \ && test "$non_pic_object" != none; then rmfiles="$rmfiles $dir/$non_pic_object" fi fi ;; *) if test "$mode" = clean ; then noexename=$name case $file in *.exe) file=`$echo $file|${SED} 's,.exe$,,'` noexename=`$echo $name|${SED} 's,.exe$,,'` # $file with .exe has already been added to rmfiles, # add $file without .exe rmfiles="$rmfiles $file" ;; esac # Do a test to see if this is a libtool program. if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then relink_command= . $dir/$noexename # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then rmfiles="$rmfiles $objdir/lt-$name" fi if test "X$noexename" != "X$name" ; then rmfiles="$rmfiles $objdir/lt-${noexename}.c" fi fi fi ;; esac $show "$rm $rmfiles" $run $rm $rmfiles || exit_status=1 done objdir="$origobjdir" # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then $show "rmdir $dir" $run rmdir $dir >/dev/null 2>&1 fi done exit $exit_status ;; "") $echo "$modename: you must specify a MODE" 1>&2 $echo "$generic_help" 1>&2 exit $EXIT_FAILURE ;; esac if test -z "$exec_cmd"; then $echo "$modename: invalid operation mode \`$mode'" 1>&2 $echo "$generic_help" 1>&2 exit $EXIT_FAILURE fi fi # test -z "$show_help" if test -n "$exec_cmd"; then eval exec $exec_cmd exit $EXIT_FAILURE fi # We need to display help for each of the modes. case $mode in "") $echo \ "Usage: $modename [OPTION]... [MODE-ARG]... Provide generalized library-building support services. --config show all configuration variables --debug enable verbose shell tracing -n, --dry-run display commands without modifying any files --features display basic configuration information and exit --finish same as \`--mode=finish' --help display this help message and exit --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] --quiet same as \`--silent' --silent don't print informational messages --tag=TAG use configuration variables from tag TAG --version print version information MODE must be one of the following: clean remove files from the build directory compile compile a source file into a libtool object execute automatically set library path, then run a program finish complete the installation of libtool libraries install install libraries or executables link create a library or an executable uninstall remove libraries from an installed directory MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for a more detailed description of MODE. Report bugs to ." exit $EXIT_SUCCESS ;; clean) $echo \ "Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $echo \ "Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -prefer-pic try to building PIC objects only -prefer-non-pic try to building non-PIC objects only -static always build a \`.o' file suitable for static linking COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $echo \ "Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $echo \ "Usage: $modename [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $echo \ "Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $echo \ "Usage: $modename [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -static do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $echo \ "Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) $echo "$modename: invalid operation mode \`$mode'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; esac $echo $echo "Try \`$modename --help' for more information about other modes." exit $? # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared disable_libs=shared # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static disable_libs=static # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: DyLP-1.6.0/Makefile.am0000644000076700007670000000274011267165330011327 0ustar # Copyright (C) 2006 International Business Machines and others. # All Rights Reserved. # This file is distributed under the Common Public License. ## $Id: Makefile.am 308 2009-10-19 22:40:24Z lou $ # Author: Andreas Waechter IBM 2006-04-13 AUTOMAKE_OPTIONS = foreign EXTRA_DIST = doxydoc/doxygen.conf \ INSTALL LICENSE README ######################################################################## # Subdirectories # ######################################################################## # subdirs is set by configure as the list of all subdirectories to recurse # into SUBDIRS = $(subdirs) ######################################################################## # Extra Targets # ######################################################################## test: all cd DyLP; $(MAKE) test tests: all for dir in $(subdirs); do \ if test -r $$dir/test/Makefile; then \ (cd $$dir; $(MAKE) test) \ fi; \ done unitTests: tests doxydoc: cd $(srcdir); doxygen doxydoc/doxygen.conf .PHONY: tests unitTests doxydoc ######################################################################## # Maintainer Stuff # ######################################################################## # Files that are generated and should be cleaned with make distclean DISTCLEANFILES = include BuildTools/Makemain.inc DyLP-1.6.0/config.guess0000755000076700007670000012706310643314772011624 0ustar #! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, # Inc. timestamp='2007-05-17' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:SunOS:5.*:* | ix86xen:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[45]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) case ${UNAME_MACHINE} in pc98) echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:[3456]*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; EM64T | authenticamd) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo crisv32-axis-linux-gnu exit ;; frv:Linux:*:*) echo frv-unknown-linux-gnu exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo or32-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit ;; xtensa:Linux:*:*) echo xtensa-unknown-linux-gnu exit ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) LIBC=gnu #else LIBC=gnuaout #endif #endif #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^LIBC/{ s: ::g p }'`" test x"${LIBC}" != x && { echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit } test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: