[med-svn] r160 - trunk/packages/kalign/branches/upstream/current

Charles Plessy charles-guest at alioth.debian.org
Wed Nov 29 15:12:32 CET 2006


Author: charles-guest
Date: 2006-11-29 15:12:29 +0100 (Wed, 29 Nov 2006)
New Revision: 160

Added:
   trunk/packages/kalign/branches/upstream/current/Makefile.in
   trunk/packages/kalign/branches/upstream/current/config.h.in
   trunk/packages/kalign/branches/upstream/current/configure
   trunk/packages/kalign/branches/upstream/current/kalign2.h
   trunk/packages/kalign/branches/upstream/current/kalign2_advanced_gaps.c
   trunk/packages/kalign/branches/upstream/current/kalign2_advanced_gaps.h
   trunk/packages/kalign/branches/upstream/current/kalign2_alignment_types.c
   trunk/packages/kalign/branches/upstream/current/kalign2_conservation.c
   trunk/packages/kalign/branches/upstream/current/kalign2_distance_calculation.c
   trunk/packages/kalign/branches/upstream/current/kalign2_dp.c
   trunk/packages/kalign/branches/upstream/current/kalign2_feature.c
   trunk/packages/kalign/branches/upstream/current/kalign2_feature.h
   trunk/packages/kalign/branches/upstream/current/kalign2_hirschberg.c
   trunk/packages/kalign/branches/upstream/current/kalign2_hirschberg.h
   trunk/packages/kalign/branches/upstream/current/kalign2_hirschberg_dna.c
   trunk/packages/kalign/branches/upstream/current/kalign2_hirschberg_dna.h
   trunk/packages/kalign/branches/upstream/current/kalign2_hirschberg_large.c
   trunk/packages/kalign/branches/upstream/current/kalign2_hirschberg_large.h
   trunk/packages/kalign/branches/upstream/current/kalign2_inferface.c
   trunk/packages/kalign/branches/upstream/current/kalign2_input.c
   trunk/packages/kalign/branches/upstream/current/kalign2_input.h
   trunk/packages/kalign/branches/upstream/current/kalign2_main.c
   trunk/packages/kalign/branches/upstream/current/kalign2_mem.c
   trunk/packages/kalign/branches/upstream/current/kalign2_misc.c
   trunk/packages/kalign/branches/upstream/current/kalign2_output.c
   trunk/packages/kalign/branches/upstream/current/kalign2_output.h
   trunk/packages/kalign/branches/upstream/current/kalign2_profile.c
   trunk/packages/kalign/branches/upstream/current/kalign2_profile_alignment.c
   trunk/packages/kalign/branches/upstream/current/kalign2_profile_alignment.h
   trunk/packages/kalign/branches/upstream/current/kalign2_simple_gaps.c
   trunk/packages/kalign/branches/upstream/current/kalign2_stats.c
   trunk/packages/kalign/branches/upstream/current/kalign2_string_matching.c
   trunk/packages/kalign/branches/upstream/current/kalign2_tree.c
   trunk/packages/kalign/branches/upstream/current/kalign2_upgma.c
Removed:
   trunk/packages/kalign/branches/upstream/current/Makefile
   trunk/packages/kalign/branches/upstream/current/kalign.c
Modified:
   trunk/packages/kalign/branches/upstream/current/README
Log:
Load /tmp/tmp.ib8k70/kalign-2.03 into
trunk/packages/kalign/branches/upstream/current.


Deleted: trunk/packages/kalign/branches/upstream/current/Makefile
===================================================================
--- trunk/packages/kalign/branches/upstream/current/Makefile	2006-11-19 13:38:57 UTC (rev 159)
+++ trunk/packages/kalign/branches/upstream/current/Makefile	2006-11-29 14:12:29 UTC (rev 160)
@@ -1,30 +0,0 @@
-PREFIX		= /usr/local/bin
-CC				= gcc  
-CFLAGS		= -O9 -funroll-loops -fomit-frame-pointer -pipe  -Wall 
-DEBUGFLAGS	= -ggdb -Wall -m32
-
-SOURCES		= kalign.c
-PROGS			= kalign
-OBJECTS		= $(SOURCES:.c=.o)
-DEBUGPROGS	= kalign_debug
-DEBUGOBJECTS	= $(SOURCES:.c=_debug.o)
-
-kalign: $(OBJECTS)
-	$(CC) $(CFLAGS) $(OBJECTS) -o $(PROGS)
-kalign.o: kalign.c
-	$(CC) $(CFLAGS) -c kalign.c
-
-debug: $(DEBUGOBJECTS)
-	$(CC) $(DEBUGFLAGS) $(DEBUGOBJECTS) -o $(DEBUGPROGS)	
-
-%_debug.o:	%.c
-	$(CC) $(DEBUGFLAGS) -c $< -o $@
-
-install : 
-	mkdir -p $(PREFIX)
-	cp $(PROGS)  $(PREFIX)
-	chmod 755 $(PREFIX)/$(PROGS)
-
-clean: 
-	rm -f $(PROGS) $(OBJECTS)
-	rm -f *~

Added: trunk/packages/kalign/branches/upstream/current/Makefile.in
===================================================================
--- trunk/packages/kalign/branches/upstream/current/Makefile.in	2006-11-19 13:38:57 UTC (rev 159)
+++ trunk/packages/kalign/branches/upstream/current/Makefile.in	2006-11-29 14:12:29 UTC (rev 160)
@@ -0,0 +1,40 @@
+PREFIX			= /usr/local/bin
+TEST				= test/
+CC					= gcc  
+CFLAGS			= -O9  -Wall 
+DEBUGFLAGS		= -ggdb -Wall 
+
+SOURCES			= kalign2_distance_calculation.c kalign2_dp.c kalign2_input.c kalign2_main.c kalign2_mem.c kalign2_inferface.c kalign2_misc.c kalign2_tree.c  kalign2_profile.c kalign2_alignment_types.c kalign2_feature.c kalign2_hirschberg.c  kalign2_advanced_gaps.c kalign2_hirschberg_dna.c  kalign2_output.c kalign2_string_matching.c kalign2_profile_alignment.c 
+PROGS				= kalign
+DEBUGPROGS	= kalign_debug
+
+
+OBJECTS			= $(SOURCES:.c=.o)
+DEBUGOBJECTS	= $(SOURCES:.c=_debug.o)
+
+
+.PHONY: clean
+
+all: $(OBJECTS)
+	$(CC) $(CFLAGS) $(OBJECTS) -o $(PROGS)
+	
+%.o:	%.c
+	$(CC) $(CFLAGS) -c $<
+	
+debug: $(DEBUGOBJECTS)
+	$(CC) $(DEBUGFLAGS) $(DEBUGOBJECTS) -o $(DEBUGPROGS)	
+
+%_debug.o:	%.c
+	$(CC) $(DEBUGFLAGS) -c $< -o $@
+
+
+install:
+	cp $(PROGS) /usr/local/bin/
+	
+clean: 
+	rm -f $(PROGS) $(OBJECTS)
+	rm -f $(DEBUGPROGS) $(DEBUGOBJECTS)
+	rm -f config.status config.log config.h Makefile
+	rm -f test*
+	rm -f *~
+	

Modified: trunk/packages/kalign/branches/upstream/current/README
===================================================================
--- trunk/packages/kalign/branches/upstream/current/README	2006-11-19 13:38:57 UTC (rev 159)
+++ trunk/packages/kalign/branches/upstream/current/README	2006-11-29 14:12:29 UTC (rev 160)
@@ -1,8 +1,8 @@
 -----------------------------------------------------------------------
-  Kalign version 1.03, Copyright (C) 2004, 2005 Timo Lassmann
+  Kalign version 2.03, Copyright (C) 2006 Timo Lassmann
 
   http://msa.cgb.ki.se/
-  timo.lassmann at cgb.ki.se
+  timolassmann at gmail.com
 
 	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
@@ -22,51 +22,27 @@
 -----------------------------------------------------------------------
 Installation:
 
-%make
+% ./configure 
+% make
 
 and as root:
 
-%make install
+% make install
 
 
 Usage:
+
         kalign [Options]  infile.fasta outfile.fasta
+        
         or:
+        
         kalign [Options] -i infile.fasta -o outfile.fasta
+        
         or:
+        
         kalign [Options] < infile.fasta > outfile.fasta
 
         Options:
-        -i/-input       Name of input file.
-        -o/-output      Name of output file.
-        -gpo/-gap_open  Gap open penalty (default 6.0).
-        -gpe/gap_ext    Gap extension penalty (default 0.9).
-        -p/-points      Wu-Manber algorithm used in both distance calculation and dynamic programming
-        -w              Wu-Manber algorithm not used at all
-        -f/-fast        fast heuristic alignment
-                        ( - recommended for >500 sequences)
-
-        -q              'quiet' - no messages are sent to standard error
-
-        Without an option specified Kalign will use the Wu-Manber algorithm for distance calculation only.
-                ( - recommended for < 500 sequences)
-
-Revision History:
-
-Kalign 1.02:
-
-	- introduced -q (for 'quiet') option -> nothing is written to stderr
-	 
-Kalign 1.01: 
-
-	- input alignment can be read from stdin and output printed to stdout
-	
-	i.e. to run kalign:
-		
-	kalign < input_alignment.fasta > output_alignment.fasta [options]
-	
-Kalign 1.0:
-
-	initial release of Kalign
-	
+        
+	type: kalign -h 
 	
\ No newline at end of file

Added: trunk/packages/kalign/branches/upstream/current/config.h.in
===================================================================
--- trunk/packages/kalign/branches/upstream/current/config.h.in	2006-11-19 13:38:57 UTC (rev 159)
+++ trunk/packages/kalign/branches/upstream/current/config.h.in	2006-11-29 14:12:29 UTC (rev 160)
@@ -0,0 +1,66 @@
+/* config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Define to 1 if you have the <getopt.h> header file. */
+#undef HAVE_GETOPT_H
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if your system has a GNU libc compatible `malloc' function, and
+   to 0 otherwise. */
+#undef HAVE_MALLOC
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if your system has a GNU libc compatible `realloc' function,
+   and to 0 otherwise. */
+#undef HAVE_REALLOC
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* 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
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#undef const
+
+/* Define to rpl_malloc if the replacement function should be used. */
+#undef malloc
+
+/* Define to rpl_realloc if the replacement function should be used. */
+#undef realloc

Added: trunk/packages/kalign/branches/upstream/current/configure
===================================================================
--- trunk/packages/kalign/branches/upstream/current/configure	2006-11-19 13:38:57 UTC (rev 159)
+++ trunk/packages/kalign/branches/upstream/current/configure	2006-11-29 14:12:29 UTC (rev 160)
@@ -0,0 +1,4565 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.59 for FULL-PACKAGE-NAME VERSION.
+#
+# Report bugs to <BUG-REPORT-ADDRESS>.
+#
+# 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.
+## --------------------- ##
+## 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
+
+
+# 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='FULL-PACKAGE-NAME'
+PACKAGE_TARNAME='full-package-name'
+PACKAGE_VERSION='VERSION'
+PACKAGE_STRING='FULL-PACKAGE-NAME VERSION'
+PACKAGE_BUGREPORT='BUG-REPORT-ADDRESS'
+
+ac_unique_file="kalign2_hirschberg.h"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#if STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# if HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#if HAVE_STRING_H
+# if !STDC_HEADERS && HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#if HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+#  include <stdint.h>
+# endif
+#endif
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#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 CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP EGREP 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_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_CPP_set=${CPP+set}
+ac_env_CPP_value=$CPP
+ac_cv_env_CPP_set=${CPP+set}
+ac_cv_env_CPP_value=$CPP
+
+#
+# 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 FULL-PACKAGE-NAME VERSION 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
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of FULL-PACKAGE-NAME VERSION:";;
+   esac
+  cat <<\_ACEOF
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have
+              headers in a nonstandard directory <include dir>
+  CPP         C preprocessor
+
+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 <BUG-REPORT-ADDRESS>.
+_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
+FULL-PACKAGE-NAME configure VERSION
+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.
+_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 FULL-PACKAGE-NAME $as_me VERSION, 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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+          ac_config_headers="$ac_config_headers config.h"
+
+
+# Checks for programs.
+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
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; 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}gcc"
+    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
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; 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="gcc"
+    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
+
+  CC=$ac_ct_CC
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}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_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}cc"
+    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
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # 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_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="cc"
+    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
+
+  CC=$ac_ct_CC
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+fi
+if test -z "$CC"; then
+  # 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_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
+  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_CC="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_CC
+  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 CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+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
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl
+  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 cl
+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
+
+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 </dev/null >&5\"") >&5
+  (eval $ac_compiler --version </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+  (eval $ac_compiler -v </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+  (eval $ac_compiler -V </dev/null >&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 <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* 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 <stdlib.h>
+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
+
+
+# Checks for libraries.
+
+# Checks for header files.
+
+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 <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> 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 <limits.h>
+#else
+# include <assert.h>
+#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 <ac_nonexistent.h>
+_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 <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> 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 <limits.h>
+#else
+# include <assert.h>
+#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 <ac_nonexistent.h>
+_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 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
+
+
+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 <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.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_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 <string.h>
+
+_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 <stdlib.h>
+
+_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 <ctype.h>
+#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 stdlib.h string.h unistd.h getopt.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 BUG-REPORT-ADDRESS ##
+## --------------------------------- ##
+_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
+
+
+# Checks for typedefs, structures, and compiler characteristics.
+echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5
+echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6
+if test "${ac_cv_c_const+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 ()
+{
+/* FIXME: Include the comments suggested by Paul. */
+#ifndef __cplusplus
+  /* Ultrix mips cc rejects this.  */
+  typedef int charset[2];
+  const charset x;
+  /* SunOS 4.1.1 cc rejects this.  */
+  char const *const *ccp;
+  char **p;
+  /* NEC SVR4.0.2 mips cc rejects this.  */
+  struct point {int x, y;};
+  static struct point const zero = {0,0};
+  /* AIX XL C 1.02.0.0 rejects this.
+     It does not let you subtract one const X* pointer from another in
+     an arm of an if-expression whose if-part is not a constant
+     expression */
+  const char *g = "string";
+  ccp = &g + (g ? g-g : 0);
+  /* HPUX 7.0 cc rejects these. */
+  ++ccp;
+  p = (char**) ccp;
+  ccp = (char const *const *) p;
+  { /* SCO 3.2v4 cc rejects this.  */
+    char *t;
+    char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+    *t++ = 0;
+  }
+  { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
+    int x[] = {25, 17};
+    const int *foo = &x[0];
+    ++foo;
+  }
+  { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+    typedef const int *iptr;
+    iptr p = 0;
+    ++p;
+  }
+  { /* AIX XL C 1.02.0.0 rejects this saying
+       "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+    struct s { int j; const int *ap[3]; };
+    struct s *b; b->j = 5;
+  }
+  { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+    const int foo = 10;
+  }
+#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_const=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_c_const=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5
+echo "${ECHO_T}$ac_cv_c_const" >&6
+if test $ac_cv_c_const = no; then
+
+cat >>confdefs.h <<\_ACEOF
+#define const
+_ACEOF
+
+fi
+
+
+# Checks for library functions.
+
+for ac_header in stdlib.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 BUG-REPORT-ADDRESS ##
+## --------------------------------- ##
+_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
+
+echo "$as_me:$LINENO: checking for GNU libc compatible malloc" >&5
+echo $ECHO_N "checking for GNU libc compatible malloc... $ECHO_C" >&6
+if test "${ac_cv_func_malloc_0_nonnull+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$cross_compiling" = yes; then
+  ac_cv_func_malloc_0_nonnull=no
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#if STDC_HEADERS || HAVE_STDLIB_H
+# include <stdlib.h>
+#else
+char *malloc ();
+#endif
+
+int
+main ()
+{
+exit (malloc (0) ? 0 : 1);
+  ;
+  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_func_malloc_0_nonnull=yes
+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_func_malloc_0_nonnull=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_malloc_0_nonnull" >&5
+echo "${ECHO_T}$ac_cv_func_malloc_0_nonnull" >&6
+if test $ac_cv_func_malloc_0_nonnull = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_MALLOC 1
+_ACEOF
+
+else
+  cat >>confdefs.h <<\_ACEOF
+#define HAVE_MALLOC 0
+_ACEOF
+
+   case $LIBOBJS in
+    "malloc.$ac_objext"   | \
+  *" malloc.$ac_objext"   | \
+    "malloc.$ac_objext "* | \
+  *" malloc.$ac_objext "* ) ;;
+  *) LIBOBJS="$LIBOBJS malloc.$ac_objext" ;;
+esac
+
+
+cat >>confdefs.h <<\_ACEOF
+#define malloc rpl_malloc
+_ACEOF
+
+fi
+
+
+
+
+for ac_header in stdlib.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 BUG-REPORT-ADDRESS ##
+## --------------------------------- ##
+_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
+
+echo "$as_me:$LINENO: checking for GNU libc compatible realloc" >&5
+echo $ECHO_N "checking for GNU libc compatible realloc... $ECHO_C" >&6
+if test "${ac_cv_func_realloc_0_nonnull+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$cross_compiling" = yes; then
+  ac_cv_func_realloc_0_nonnull=no
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#if STDC_HEADERS || HAVE_STDLIB_H
+# include <stdlib.h>
+#else
+char *realloc ();
+#endif
+
+int
+main ()
+{
+exit (realloc (0, 0) ? 0 : 1);
+  ;
+  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_func_realloc_0_nonnull=yes
+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_func_realloc_0_nonnull=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_realloc_0_nonnull" >&5
+echo "${ECHO_T}$ac_cv_func_realloc_0_nonnull" >&6
+if test $ac_cv_func_realloc_0_nonnull = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_REALLOC 1
+_ACEOF
+
+else
+  cat >>confdefs.h <<\_ACEOF
+#define HAVE_REALLOC 0
+_ACEOF
+
+   case $LIBOBJS in
+    "realloc.$ac_objext"   | \
+  *" realloc.$ac_objext"   | \
+    "realloc.$ac_objext "* | \
+  *" realloc.$ac_objext "* ) ;;
+  *) LIBOBJS="$LIBOBJS realloc.$ac_objext" ;;
+esac
+
+
+cat >>confdefs.h <<\_ACEOF
+#define realloc rpl_realloc
+_ACEOF
+
+fi
+
+
+
+
+          ac_config_files="$ac_config_files Makefile"
+
+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
+
+
+
+: ${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 FULL-PACKAGE-NAME $as_me VERSION, 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
+
+Report bugs to <bug-autoconf at gnu.org>."
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+FULL-PACKAGE-NAME config.status VERSION
+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
+_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
+for ac_config_target in $ac_config_targets
+do
+  case "$ac_config_target" in
+  # Handling of arguments.
+  "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+  "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.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
+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, at SHELL@,$SHELL,;t t
+s, at PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s, at PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s, at PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s, at PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s, at PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s, at PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s, at exec_prefix@,$exec_prefix,;t t
+s, at prefix@,$prefix,;t t
+s, at program_transform_name@,$program_transform_name,;t t
+s, at bindir@,$bindir,;t t
+s, at sbindir@,$sbindir,;t t
+s, at libexecdir@,$libexecdir,;t t
+s, at datadir@,$datadir,;t t
+s, at sysconfdir@,$sysconfdir,;t t
+s, at sharedstatedir@,$sharedstatedir,;t t
+s, at localstatedir@,$localstatedir,;t t
+s, at libdir@,$libdir,;t t
+s, at includedir@,$includedir,;t t
+s, at oldincludedir@,$oldincludedir,;t t
+s, at infodir@,$infodir,;t t
+s, at mandir@,$mandir,;t t
+s, at build_alias@,$build_alias,;t t
+s, at host_alias@,$host_alias,;t t
+s, at target_alias@,$target_alias,;t t
+s, at DEFS@,$DEFS,;t t
+s, at ECHO_C@,$ECHO_C,;t t
+s, at ECHO_N@,$ECHO_N,;t t
+s, at ECHO_T@,$ECHO_T,;t t
+s, at LIBS@,$LIBS,;t t
+s, at CC@,$CC,;t t
+s, at CFLAGS@,$CFLAGS,;t t
+s, at LDFLAGS@,$LDFLAGS,;t t
+s, at CPPFLAGS@,$CPPFLAGS,;t t
+s, at ac_ct_CC@,$ac_ct_CC,;t t
+s, at EXEEXT@,$EXEEXT,;t t
+s, at OBJEXT@,$OBJEXT,;t t
+s, at CPP@,$CPP,;t t
+s, at EGREP@,$EGREP,;t t
+s, at LIBOBJS@,$LIBOBJS,;t t
+s, at 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
+
+
+
+  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, at configure_input@,$configure_input,;t t
+s, at srcdir@,$ac_srcdir,;t t
+s, at abs_srcdir@,$ac_abs_srcdir,;t t
+s, at top_srcdir@,$ac_top_srcdir,;t t
+s, at abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s, at builddir@,$ac_builddir,;t t
+s, at abs_builddir@,$ac_abs_builddir,;t t
+s, at top_builddir@,$ac_top_builddir,;t t
+s, at abs_top_builddir@,$ac_abs_top_builddir,;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_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 <<CEOF' >>$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 <<CEOF' >>$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
+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
+


Property changes on: trunk/packages/kalign/branches/upstream/current/configure
___________________________________________________________________
Name: svn:executable
   + *

Deleted: trunk/packages/kalign/branches/upstream/current/kalign.c
===================================================================
--- trunk/packages/kalign/branches/upstream/current/kalign.c	2006-11-19 13:38:57 UTC (rev 159)
+++ trunk/packages/kalign/branches/upstream/current/kalign.c	2006-11-29 14:12:29 UTC (rev 160)
@@ -1,2413 +0,0 @@
-/*
-	Kalign.c
-
-	Released under GPL
-	Copyright (C) 2004, 2005 Timo Lassmann <timo.lassmann at cgb.ki.se>
-	
-	This program is free software; you can redistribute it and/or modify
-	it under the terms of the GNU General Public License as published by
-	the Free Software Foundation; either version 2 of the License, or
-	(at your option) any later version.
-
-	This program is distributed in the hope that it will be useful,
-	but WITHOUT ANY WARRANTY; without even the implied warranty of
-	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-	GNU General Public License for more details.
-
-	You should have received a copy of the GNU General Public License
-	along with this program; if not, write to the Free Software
-	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-    
-	Kalign - version 1.0 (Aug. 2004)
-	
-	Please send bug reports, comments etc. to:
-	timolassmann at gmail.com
-
-*/
-
-
-#include <unistd.h>
-#include <stdio.h>
-#include<ctype.h>
-#include <string.h>
-#include <stdlib.h>
-#include <getopt.h>
-#define SEEK_START 0
-#define SEEK_END 2
-#define INFTY 0x8000000
-
-void* tmalloc(int size);
-
-short gon250mt[]={
-  24,
-   0,   0,
-   5,   0, 115,
-  -3,   0, -32,  47,
-   0,   0, -30,  27,  36,
- -23,   0,  -8, -45, -39,  70,
-   5,   0, -20,   1,  -8, -52,  66,
-  -8,   0, -13,   4,   4,  -1, -14,  60,
-  -8,   0, -11, -38, -27,  10, -45, -22,  40,
-  -4,   0, -28,   5,  12, -33, -11,   6, -21,  32,
- -12,   0, -15, -40, -28,  20, -44, -19,  28, -21,  40,
-  -7,   0,  -9, -30, -20,  16, -35, -13,  25, -14,  28,  43,
-  -3,   0, -18,  22,   9, -31,   4,  12, -28,   8, -30, -22,  38,
-   3,   0, -31,  -7,  -5, -38, -16, -11, -26,  -6, -23, -24,  -9,  76,
-  -2,   0, -24,   9,  17, -26, -10,  12, -19,  15, -16, -10,   7,  -2,  27,
-  -6,   0, -22,  -3,   4, -32, -10,   6, -24,  27, -22, -17,   3,  -9,  15,  47,
-  11,   0,   1,   5,   2, -28,   4,  -2, -18,   1, -21, -14,   9,   4,   2,  -2,  22,
-   6,   0,  -5,   0,  -1, -22, -11,  -3,  -6,   1, -13,  -6,   5,   1,   0,  -2,  15,  25,
-   1,   0,   0, -29, -19,   1, -33, -20,  31, -17,  18,  16, -22, -18, -15, -20, -10,   0,  34,
- -36,   0, -10, -52, -43,  36, -40,  -8, -18, -35,  -7, -10, -36, -50, -27, -16, -33, -35, -26, 142,
-   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
- -22,   0,  -5, -28, -27,  51, -40,  22,  -7, -21,   0,  -2, -14, -31, -17, -18, -19, -19, -11,  41,   0,  78,
-   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
-
-struct sequence_info{
-	int** s;
-	int* sl;
-	int** sn;
-	int* lsn;
-	int** gis;
-	int** relpos;
-	int** sip;
-	int* nsip;
-};
-
-struct dp_matrix{
-	int** tb;
-	int** m;
-	int* a;
-	int* ga;
-	int* gb;
-	int* true_x;
-	int* true_y;
-	void* tb_mem;
-	void* m_mem;
-	int x;
-	int y;
-};
-
-struct dp_matrix* dp_matrix_alloc(struct dp_matrix *dp,int x,int y,int p);
-struct dp_matrix* dp_matrix_realloc(struct dp_matrix *dp,int x,int y,int p);
-struct dp_matrix* dp_matrix_init(struct dp_matrix *dp,int x,int y);
-void dp_matrix_free(struct dp_matrix *dp,int p);
-
-
-int numseq = 0;
-int numprofiles = 0;
-
-int** ten_wu_manber(int* seq,int len,int p[]);
-
-struct sequence_info* read_sequences(struct sequence_info* si,char* infile);
-double distance_calculation(int** matches[],int len_a,int len_b,int a,int b);
-double distance_calculation2(int** matches[],int len_a,int len_b,int a,int b);
-
-void fill_hash(struct sequence_info* si,int** matches[],int nowu);
-int* upgma(double **dm,int* tree);
-void add_ptm(int** matches[],int** matrix,int a,int b);
-struct dp_matrix* consistency_check(struct dp_matrix *dp,int len_a,int len_b,int dia);
-int* make_profile(int* prof,int* seq,int len,int** subm);
-int** read_matrix(short *matrix_pointer,int** subm,int gpo);
-int* main_fast_dyn(int* path,struct dp_matrix *dp,int* prof1,int* prof2,int len_a,int len_b);
-
-int** make_new_profile(int**newp,int** profa,int** profb,int* path);
-
-void print_alignment(struct sequence_info* si,char* outfile);
-struct sequence_info* update(struct sequence_info* si,int** profile,int a,int b,int newnode,int* path);
-
-void set_gap_penalties(int* prof,int len,int nsip);
-void update_gaps(int old_len,int*gis,int new_len,int *newgaps);
-void update_hash(struct sequence_info* si,int** matches[],int a,int b,int new);
-int gpo = 0;
-void add_ptm2(int** matches[],struct dp_matrix *dp,int a,int b);
-struct dp_matrix* consistency_check2(struct dp_matrix *dp,int len_a,int len_b,int dia);
-char* get_input_into_string(char* string,char* infile);
-
-
-int main(int argc,char **argv)
-{
-	char *infile = 0;
-	char *outfile = 0;
-	int i,j,c;
-	int dia = 24;
-	static int help_flag = 0;
-	static int gpe = 0;
-	static int df = 0;
-	static int quiet = 0;
-	static int nowu = 0;
-	int* tree = 0;
-	static int points = 0;
-	int a,b;
-	int len_a;
-	int len_b;
-	int newnode = 0;
-	int* path = 0;
-	int** matches[8000];
-	double** dm = 0;
-	
-	static short *matrix_pointer;
-	int** submatrix = 0;
-
-	int** profile = 0;
-	int* profa = 0;
-	int* profb = 0;
-
-	struct sequence_info *si = 0;
-	
-	struct dp_matrix *dp = 0;
-
-	static char  license[] = "\n\
-Kalign version 1.04, Copyright (C) 2004, 2005, 2006 Timo Lassmann\n\n\
-	Kalign is free software. You can redistribute it and/or modify\n\
-	it under the terms of the GNU General Public License as\n\
-	published by the Free Software Foundation.\n\n";
-	
-	
-	static char  usage[] = "\n\
-Usage:\n\
- 	kalign [Options]  infile.fasta outfile.fasta\n\
- 	or:\n\
-	kalign [Options] -i infile.fasta -o outfile.fasta \n\
-	or:\n\
-	kalign [Options] < infile.fasta > outfile.fasta \n\
-	\n\
-	Options:\n\
-	-i/-input	Name of input file.\n\
-	-o/-output	Name of output file.\n\
-	-g/-gpo/-gap_open	Gap open penalty (default 6.0).\n\
-	-e/-gpe/gap_ext	Gap extension penalty (default 0.9).\n\
-	-p/-points	Wu-Manber algorithm used in both distance calculation and dynamic programming\n\
-	-w		Wu-Manber algorithm not used at all\n\
-	-f/-fast	fast heuristic alignment\n\
-			( - recommended for >500 sequences)\n\
-	\n\
-	-q		'quiet' - no messages are sent to standard error\n\
-	\n\
-	In default mode Kalign will use the Wu-Manber algorithm for distance calculation only.\n\
-		( - recommended for < 500 sequences)\n\n\
-Please cite:\n\n\
-	Timo Lassmann and Erik L.L. Sonnhammer (2005)\n\
-	Kalign - an accurate and fast multiple sequence alignment algorithm.\n\
-	BMC Bioinformatics 6:298\n\
-	\n\
-	";
-
-	while (1){
-		static struct option long_options[] ={
-		{"help",   no_argument,0,'h'},//-h
-		{"points",  no_argument, 0, 'p'},//-n
-		{"fast",  no_argument, 0, 'f'},//-n
-		{"input",  required_argument, 0, 'i'},
-          	{"output",  required_argument, 0, 'o'},
-		{"gap_open",  required_argument, 0, 0},
-		{"gpo",  required_argument, 0, 0},
-		{"gap_ext",  required_argument, 0, 0},
-		
-		{"gpe",  required_argument, 0, 0},
-          	{0, 0, 0, 0}
-        	};
-		int option_index = 0;
-		c = getopt_long_only (argc, argv, "hi:o:fnqpw",long_options, &option_index);
-		//c = getopt (argc, argv, "hi:o:fnqg:e:pw");
-		/* Detect the end of the options. */
-		if (c == -1){
-			break;
-		}
-		switch (c){
-		case 0:
-			if (long_options[option_index].flag != 0){
-// 				fprintf(stderr,"option %s\n",long_options[option_index].name);
-				break;
-			}
-// 			fprintf (stderr,"option %s", long_options[option_index].name);
-			if (optarg){
-				if (option_index == 5){
-					gpo = atof(optarg)*10;
-				}
-				if (option_index == 6){
-					gpo = atof(optarg)*10;
-				}
-				if(option_index == 7){
-					gpe = atof(optarg)*10;
-				}
-				
-				if(option_index == 8){
-					gpe = atof(optarg)*10;
-				}
-			}
-// 			fprintf (stderr,"\n");
-			break;
-		case 'q':
-			quiet = 1;
-			break;
-		case 'h':
-			help_flag = 1;
-			quiet = 0;
-			break;
-		case 'g':
-			gpo = atof(optarg)*10;
-			break;
-		case 'e':
-			gpe = atof(optarg)*10;
-			break;
-  		case 'i':
-			infile = optarg;
-        		break;
-		case 'o':
-			outfile = optarg;
- 			break;
-		case 'p':
-			points = 1;
-			break;
-		case 'w':
-			nowu = 1;
-			break;
-		case 'f':
-			df = 1;
-			points = 0;
-			//nowu = 1;
-			break;
-		case '?':
-		exit(1);
-		break;
-		default:
-  		abort ();
-		}
-	}
-	if (optind < argc){
-                c = 0;
-                while (optind < argc){
-                        switch(c){
-                                case 0:
-                                        infile =  argv[optind++];
-                                        break;
-                                case 1:
-                                        outfile =  argv[optind++];
-                                        break;
-                                default:
-                                        fprintf(stderr,"Unrecognised option:%s\n",argv[optind++]);
-                                        break;
-                        }
-                        c++;
-		}
-        }
-	
-	
-	if(!quiet)fprintf(stderr,"%s", license);
-	
-	if (help_flag){
-		fprintf(stderr,"%s\n", usage);
-		exit(1);
-	}
-	
-	char *string = 0;
-	string = get_input_into_string(string,infile);
-	if(string){
-		//printf("%s\n",string);
-		si = read_sequences(si,string);
-		/*for (i = 0;i < numseq;i++){
-			for(j = 0;j < si->sl[i];j++){
-			printf("%c",(char)si->s[i][j]+65);
-			}
-		}*/
-		//exit(0);
-	}else{
-		if(!quiet) fprintf(stderr,"%s\n", usage);
-		exit(1);
-	}
-	
-	
-	
-	//if (infile){
-	//	si = read_sequences(si,infile);
-	//}else{
-	//	fprintf(stderr,"No input file!\n");
-	//	exit(1);
-	//}
-	//Got sequences;
-
-	
-	tree = tmalloc (sizeof(int)*(numseq-1)*2);
-	if(!df){
-		
-		for (i = 8000;i--;){
-			matches[i] = 0;
-		}
-		fill_hash(si,matches,nowu);
-		//fast distance calculation;
-		dm = tmalloc (sizeof(double*)*numprofiles);
-		for (i = numprofiles;i--;){
-			dm[i] = tmalloc (sizeof (double)*numprofiles);
-			for (j = numprofiles;j--;){
-				dm[i][j] = 0;
-			}
-		}
-		if(!quiet)fprintf(stderr,"Distance Calculation:\n");
-		b = (numseq*(numseq-1))/2;
-		a = 1;
-		if (!nowu){
-		for (i = 0; i < numseq;i++){
-			for (j = i+1; j < numseq;j++){
-				dm[i][j] = distance_calculation(matches,si->sl[i],si->sl[j],i,j);
-				if(!quiet)fprintf(stderr,"\r%8.0f percent done",(double)a /(double)b * 100);
-				a++;
-			}
-		}
-		}else{
-		for (i = 0; i < numseq;i++){
-			for (j = i+1; j < numseq;j++){
-				dm[i][j] = distance_calculation2(matches,si->sl[i],si->sl[j],i,j);
-				if(!quiet)fprintf(stderr,"\r%8.0f percent done",(double)a /(double)b * 100);
-				a++;
-			}
-		}
-		}
-		for (i = 8000;i--;){
-			if (matches[i]){
-			for (j = numseq;j--;){
-				if (matches[i][j]){
-					matches[i][j][0] &= 0x0000ffff;
-				}
-			}
-			}
-		}		
-		tree = upgma(dm,tree);
-	}
-	if(df){
-		newnode = numseq;
-		c = 2;
-		tree[0] = 0;
-		tree[1] = 1;
-		for (i = 2;i < numseq;i++){
-			tree[c] = i;
-			tree[c+1] = newnode;
-			newnode++;
-			c += 2;
-		}
-			
-	}
-	//Alignment
-	//read in substitution matrix;
-	
-
-	matrix_pointer = gon250mt;
-	if(!gpo)gpo = 61;
-	if(gpe)gpe = gpe << 1;
-	if(!gpe)gpe = 18;
-
-	submatrix = tmalloc(sizeof (int*) * 32);
-	for (i = 32;i--;){
-		submatrix[i] = tmalloc(sizeof(int)*32);
-		for (j = 32;j--;){
-			submatrix[i][j] = gpe;
-		}
-	}
-	submatrix = read_matrix(matrix_pointer,submatrix,gpo);
-
-	//fprintf(stderr,"%d\n",numprofiles);
-	profile = tmalloc (sizeof(int*)*numprofiles);
-	for ( i = numprofiles;i--;){
-		profile[i] = 0;
-	}
-	//dynamic programming matrix
-	
-	dp = dp_matrix_alloc(dp,511,511,points);
-
-	newnode = numseq;
-	if(!quiet)fprintf(stderr,"\nAlignment:\n");
-	for (i = 0; i < (numseq-1)*2;i +=2){
- 		//fprintf(stderr,"Aligning:%d and %d ->%d\n",tree[i],tree[i+1],newnode);
-		if(!quiet)fprintf(stderr,"\r%8.0f percent done",(double)(newnode-numseq) /(double)numseq * 100);
-		a = tree[i];
-		b = tree[i+1];
-		len_a = si->sl[a];
-		len_b = si->sl[b];
-		if (len_a < len_b){
-			j = a;
-			a = b;
-			b = j;
-			j = len_a;
-			len_a = len_b;
-			len_b = j;
-		}
-		dp = dp_matrix_realloc(dp,len_a,len_b,points);
-		if (points){
-		//add_poits_to_matrix
-			dp = dp_matrix_init(dp,len_a,len_b);
-			add_ptm(matches,dp->m,a,b);
-			dp = consistency_check(dp,len_a,len_b,dia);
-			//add_ptm2(matches,dp,a,b);
-			//dp = consistency_check2(dp,len_a,len_b,dia);
-		}
-
-		// no points
-		if (!points){
-			for (j = 1; j <= si->sl[a];j++){
-				dp->true_x[j] = 0;
-			}
-			for (j = 1; j <= si->sl[b];j++){
-				dp->true_y[j] = 0;
-			}
-			dp->true_x[0] = 2;
-			dp->true_y[0] = 2;
-		}
-		/*for (j = 1; j < si->sl[a];j++){
-			fprintf(stderr,"%d",dp->true_x[j]);
-		}
-		fprintf(stderr,"\n");
-		for (j = 1; j < si->sl[b];j++){
-			fprintf(stderr,"%d",dp->true_y[j]);
-		}
-		fprintf(stderr,"\n");*/
-
-		path = tmalloc(sizeof(int)*(len_a+len_b+2));
-		for (j = len_a+len_b+2;j--;){
-			path[j] = 0;
-		}
-		if (a < numseq){
-			profile[a] = make_profile(profile[a],si->s[a],len_a,submatrix);
-		}
-		if (b < numseq){
-			profile[b] = make_profile(profile[b],si->s[b],len_b,submatrix);
-		}
-		profa = profile[a];
-		profb = profile[b];
-
-		set_gap_penalties(profa,len_a,si->nsip[b]);
-		set_gap_penalties(profb,len_b,si->nsip[a]);
-		path = main_fast_dyn(path,dp,profa,profb,len_a,len_b);
-		
-		profile[newnode] = tmalloc(sizeof(int)*64*(path[0]+1));
-		si = update(si,profile,a,b,newnode,path);
-		if (points){
-			update_hash(si,matches,a,b,newnode);
-		}
-		free(profa);
-		free(profb);
-		newnode++;
-	}
-	if(!quiet)fprintf(stderr,"\r%8.0f percent done",100.0);
-	if(!quiet)fprintf(stderr,"\n");
-	print_alignment(si,outfile);
-	if (!df){
-	for (i = numprofiles;i--;){
-		free(dm[i]);
-	}
-	free(dm);
-	}
-	
-
-
-	dp_matrix_free(dp,points);
-	/*for (i = 8000;i--;){
-		if (matches[i]){
-		for (j = numprofiles;j--;){
-			if (matches[i][j]){
-			free(matches[i][j]);
-			}
-		}
-		free(matches[i]);
-		}
-	}*/
-	for (i = 0; i < numprofiles;i++){
-		free(si->sip[i]);
-	//	si->relpos[i] = 0;
-	}
-	free(si->sip);
-	free(si->nsip);
-	//
-	for (i = 32;i--;){
-		free(submatrix[i]);
-	}
-	free(submatrix);
-	free(profile[numprofiles-1]);
-	free(profile);
-	free(tree);
-
-	for (i = numseq;i--;){
-		free(si->s[i]);
-		free(si->sn[i]);
-		free(si->gis[i]);
-		//free(si->relpos[i]);
-	}
-	for (i = numprofiles;i--;){
-		free(si->relpos[i]);
-	}
-	free(si->s);
-	free(si->sn);
-	free(si->gis);
-	free(si->relpos);
-	free(si->sl);
-	free(si->lsn);
-	free(si);
-	return 1;
-}
-
-void set_gap_penalties(int* prof,int len,int nsip)
-{
-	int i;
-	prof +=  (64 *(len));
-	i = len;
-	while(i--){
-		prof -= 64;
-		prof[26] = prof[41]*nsip;
-		prof[27] = prof[46]*nsip;
-	}
-}
-
-struct sequence_info* update(struct sequence_info* si,int** profile,int a,int b,int newnode,int* path)
-{
-	int i,c;
-	int posa = 0;
-	int posb = 0;
-	int adda = 0;
-	int addb = 0;
-	int* gap_a = 0;
-	int* gap_b = 0;
-	int len_a;
-	int len_b;
-	int* newp = 0;
-	int* profa = 0;
-	int* profb = 0;
-	len_a = si->sl[a];
-	len_b = si->sl[b];
-
-	newp = profile[newnode];
-	profa = profile[a];
-	profb = profile[b];
-	si->sl[newnode] = path[0];
-	si->relpos[newnode] = tmalloc(sizeof(int) * (si->sl[newnode]+1));
-	for (i = si->sl[newnode]+1;i--;){
-		si->relpos[newnode][i] = i;
-	}
-	gap_a = tmalloc ((len_a+1)*sizeof(int));
-	gap_b = tmalloc ((len_b+1)*sizeof(int));
-
-	for (i = len_a+1;i--;){
-		gap_a[i] = 0;
-	}
-	for (i = len_b+1;i--;){
-		gap_b[i] = 0;
-	}
-
-	c = 1;
-	while(path[c] != 3){
-		if (!path[c]){
-	//		fprintf(stderr,"Align	%d\n",c);
-			for (i = 64; i--;){
-				newp[i] = profa[i] + profb[i];
-			}
-			si->relpos[a][posa] += adda;
-			si->relpos[b][posb] += addb;
-			profa += 64;
-			profb += 64;
-			posa++;
-			posb++;
-		}
-		if (path[c] & 1){
-	//		fprintf(stderr,"Gap_A:%d\n",c);
-			for (i = 64; i--;){
-				newp[i] = profb[i];
-			}
-			si->relpos[b][posb] += addb;
-			adda += 1;
-			gap_a[posa] += 1;
-			profb += 64;
-			posb++;
-			if (path[c] & 4){
-	//			fprintf(stderr,"Gap_open");
-				newp[9] += si->nsip[a];//1;
-				i = si->nsip[a] *gpo;
-				newp[32] -=  i;//a
-				newp[33] -=  i;//b
-				newp[34] -=  i;//c
-				newp[35] -=  i;//d
-				newp[36] -=  i;//e
-				newp[37] -=  i;//f
-				newp[38] -=  i;//g
-				newp[39] -=  i;//h
-				newp[40] -=  i;//i
-				//newp[41] -=  i;//j
-				newp[42] -=  i;//k
-				newp[43] -=  i;//l
-				newp[44] -=  i;//m
-				newp[45] -=  i;//n
-				//newp[46] -=  i;//o
-				newp[47] -=  i;//p
-				newp[48] -=  i;//q
-				newp[49] -=  i;//r
-				newp[50] -=  i;//s
-				newp[51] -=  i;//t
-				//newp[52] -=  i;//u
-				newp[53] -=  i;//v
-				newp[54] -=  i;//w
-				newp[52] -=  i;//x
-				newp[53] -=  i;//y
-				newp[54] -=  i;//z
-			}
-			if (path[c] & 16){
-				newp[9] += si->nsip[a];//1;
-				i = si->nsip[a] *gpo;
-				newp[32] -=  i;//a
-				newp[33] -=  i;//b
-				newp[34] -=  i;//c
-				newp[35] -=  i;//d
-				newp[36] -=  i;//e
-				newp[37] -=  i;//f
-				newp[38] -=  i;//g
-				newp[39] -=  i;//h
-				newp[40] -=  i;//i
-				//newp[41] -=  i;//j
-				newp[42] -=  i;//k
-				newp[43] -=  i;//l
-				newp[44] -=  i;//m
-				newp[45] -=  i;//n
-				//newp[46] -=  i;//o
-				newp[47] -=  i;//p
-				newp[48] -=  i;//q
-				newp[49] -=  i;//r
-				newp[50] -=  i;//s
-				newp[51] -=  i;//t
-				//newp[52] -=  i;//u
-				newp[53] -=  i;//v
-				newp[54] -=  i;//w
-				newp[52] -=  i;//x
-				newp[53] -=  i;//y
-				newp[54] -=  i;//z
-			}
-		}
-		if (path[c] & 2){
-	//		fprintf(stderr,"Gap_B:%d\n",c);
-			for (i = 64; i--;){
-				newp[i] = profa[i];
-			}
-			si->relpos[a][posa] += adda;
-			addb += 1;
-			gap_b[posb] += 1;
-			posa++;
-			profa+=64;
-			if (path[c] & 4){
-	//			fprintf(stderr,"Gap_open");
-				newp[9] += si->nsip[b];//1;
-				i = si->nsip[b] *gpo;
-				newp[32] -=  i;//a
-				newp[33] -=  i;//b
-				newp[34] -=  i;//c
-				newp[35] -=  i;//d
-				newp[36] -=  i;//e
-				newp[37] -=  i;//f
-				newp[38] -=  i;//g
-				newp[39] -=  i;//h
-				newp[40] -=  i;//i
-				//newp[41] -=  i;//j
-				newp[42] -=  i;//k
-				newp[43] -=  i;//l
-				newp[44] -=  i;//m
-				newp[45] -=  i;//n
-				//newp[46] -=  i;//o
-				newp[47] -=  i;//p
-				newp[48] -=  i;//q
-				newp[49] -=  i;//r
-				newp[50] -=  i;//s
-				newp[51] -=  i;//t
-				//newp[52] -=  i;//u
-				newp[53] -=  i;//v
-				newp[54] -=  i;//w
-				newp[52] -=  i;//x
-				newp[53] -=  i;//y
-				newp[54] -=  i;//z
-			}
-			if (path[c] & 16){
-	//			fprintf(stderr,"Gap_close");
-				newp[9] += si->nsip[b];//1;
-				i = si->nsip[b] *gpo;
-				newp[32] -=  i;//a
-				newp[33] -=  i;//b
-				newp[34] -=  i;//c
-				newp[35] -=  i;//d
-				newp[36] -=  i;//e
-				newp[37] -=  i;//f
-				newp[38] -=  i;//g
-				newp[39] -=  i;//h
-				newp[40] -=  i;//i
-				//newp[41] -=  i;//j
-				newp[42] -=  i;//k
-				newp[43] -=  i;//l
-				newp[44] -=  i;//m
-				newp[45] -=  i;//n
-				//newp[46] -=  i;//o
-				newp[47] -=  i;//p
-				newp[48] -=  i;//q
-				newp[49] -=  i;//r
-				newp[50] -=  i;//s
-				newp[51] -=  i;//t
-				//newp[52] -=  i;//u
-				newp[53] -=  i;//v
-				newp[54] -=  i;//w
-				newp[52] -=  i;//x
-				newp[53] -=  i;//y
-				newp[54] -=  i;//z
-			}
-		}
-		newp += 64;
-		c++;
-	}
-	for (i = 64; i--;){
-		newp[i] = 0;
-	}
-	
-	//fprintf(stderr,"%d-%d	%d	%d\n",c,path[0],len_a,len_b);
-	si->nsip[newnode] = si->nsip[a] + si->nsip[b];
-	si->sip[newnode] = tmalloc(sizeof(int)*si->nsip[newnode]);
-	c =0;
-	for (i = si->nsip[a];i--;){
-		si->sip[newnode][c] = si->sip[a][i];
-		update_gaps(si->sl[si->sip[a][i]],si->gis[si->sip[a][i]],si->sl[newnode],gap_a);
-		c++;
-	}
-	for (i = si->nsip[b];i--;){
-		si->sip[newnode][c] = si->sip[b][i];
-		update_gaps(si->sl[si->sip[b][i]],si->gis[si->sip[b][i]],si->sl[newnode],gap_b);
-		c++;
-	}
-	free(gap_a);
-	free(gap_b);
-	free(path);
-	return si;
-}
-
-
-void update_gaps(int old_len,int*gis,int new_len,int *newgaps)
-{
-	unsigned int i,j;
-	int add = 0;
-	int rel_pos = 0;
-	for (i = 0; i <= old_len;i++){
-		add = 0;
-		for (j = rel_pos;j <= rel_pos + gis[i];j++){
-			if (newgaps[j] != 0){
-				add += newgaps[j];
-			}
-		}
-		rel_pos += gis[i]+1;
-		gis[i] += add;
-	}
-}
-
-void print_alignment(struct sequence_info* si,char* outfile)
-{
-	int i,j,c;
-	int tmp;
-	FILE *output_file = NULL;
-	if(outfile){
-		if ((output_file = fopen(outfile, "w")) == NULL){
-			fprintf(stderr,"can't open output\n");
-		}else{
-			for (i = 0; i < numseq;i++){
-				for (j =0; j < si->lsn[i];j++){
-					putc(si->sn[i][j],output_file);
-				}
-				putc('\n',output_file);
-				c = 0;
-				for (j = 0; j < si->sl[i];j++){
-					tmp =si->gis[i][j];
-					while (tmp){
-						putc('-',output_file);
-						c++;
-						if(c == 60){
-							putc('\n',output_file);
-							c = 0;
-						}
-						tmp--;
-					}
-					putc((char)si->s[i][j]+65,output_file);
-					c++;
-					if(c == 60){
-						putc('\n',output_file);
-						c = 0;
-					}
-				}
-				tmp =si->gis[i][si->sl[i]];
-				while (tmp){
-					putc('-',output_file);
-					c++;
-					if(c == 60){
-						putc('\n',output_file);
-						c = 0;
-					}
-					tmp--;
-				}
-				putc('\n',output_file);
-			}
-		}
-	}else{
-		for (i = 0; i < numseq;i++){
-			for (j =0; j < si->lsn[i];j++){
-				printf("%c",si->sn[i][j]);
-			}
-			printf("\n");
-			c = 0;
-			for (j = 0; j < si->sl[i];j++){
-				tmp =si->gis[i][j];
-				while (tmp){
-					printf("-");
-					c++;
-					if(c == 60){
-						printf("\n");
-						c = 0;
-					}
-					tmp--;
-				}
-				printf("%c",(char)si->s[i][j]+65);
-				c++;
-				if(c == 60){
-					printf("\n");
-					c = 0;
-				}
-			}
-			tmp =si->gis[i][si->sl[i]];
-			while (tmp){
-				printf("-");
-				c++;
-				if(c == 60){
-					printf("\n");
-					c = 0;
-				}
-				tmp--;
-			}
-			printf("\n");
-		}
-	}
-}
-
-int* main_fast_dyn(int* path,struct dp_matrix *dp,int* prof1,int* prof2,int len_a,int len_b)
-{
-	register int i,j,c;
-	int i_limit = 0;
-	int j_limit = 0;
-	int startx = 0;
-	int starty = 0;
-	int endx = 0;
-	int endy = 0;
-	int* tx = 0;
-	int* ty = 0;
-	int** trace = 0;
-	int* gap_a = 0;
-	int* gap_b = 0;
-	int* align = 0;
-	int* tracep = 0;
-	int pa = 0;
-	int pga = 0;
-	int pgb = 0;
-	int ca = 0;
-	int cga = 0;
-	int cgb = 0;
-	int ipos;
-	int jpos;
-	unsigned int* freq = 0;
-
-	tx = dp->true_x;
-	ty = dp->true_y;
-	
-
-	freq = tmalloc((len_a+1) * 26 * sizeof(unsigned int));
-	prof1 +=  len_a << 6;
-	freq += len_a *26; 
-	for (i = len_a;i--;){
-		prof1 -= 64;
-		freq -= 26;
-		c = 1;
-		for (j = 26; j--;){
-			if(prof1[j]){
-				freq[c] = j;
-				c++;	
-			}
-		}
-		freq[0] = c;
-	}
-
-	align = dp->a;
-	gap_a = dp->ga;
-	gap_b = dp->gb;
-	align[0] = 0;
-	gap_a[0] = -INFTY;
-	gap_b[0] = -INFTY;
-	trace = dp->tb;
-	endx = len_a;
-	startx = len_a;
-	endy = len_b;
-	starty = len_b;
-
-	trace[len_a][len_b] = 32;
-
-	prof1 +=  len_a << 6;
-	
-	freq += len_a *26; 
-
-	do{
-		while(tx[startx] != 2){
-			startx--;
-		}
-		while(ty[starty] != 2){
-			starty--;
-		}
-		i_limit = endx-startx;
-		j_limit = endy-starty;
-		//copy last cell;
-		align[j_limit] = align[0];
-		gap_a[j_limit] = gap_a[0];
-		gap_b[j_limit] = gap_b[0];
-		//init of first row;
-		tracep = trace[endx];
-		j = j_limit;
-		if (endx == len_a){
-			while(--j){
-				align[j] = -INFTY;
-				gap_a[j] = 0;
-				gap_b[j] = -INFTY;
-				tracep[starty+j] = 8;
-			}
-		}else{
-			prof2 +=  endy << 6;
-			while(--j){
-				prof2 -= 64;
-				tracep[starty+j] = 0;
-				align[j] = -INFTY;
-				gap_a[j] = align[j+1] + prof2[26];
-				if (gap_a[j+1] > gap_a[j]){
-					gap_a[j] = gap_a[j+1];
-					tracep[starty+j] |= 8;
-				}
-				gap_b[j] = -INFTY;
-			}
-			prof2 -= (starty+1) << 6;//+1 cos while(--j) stops at 1;(1-1 = 0 stop!!!)
-		}
-		align[0] = -INFTY;
-		gap_a[0] = -INFTY;
-		gap_b[0] = -INFTY;
-		prof2 += starty << 6;
-		i = i_limit;
-		while(--i){
-			prof1 -= 64;
-			
-			freq -= 26;
-			
-			ipos = startx+i;
-			tracep = trace[ipos];
-
-			pa = align[j_limit];
-			pga = gap_a[j_limit];
-			pgb = gap_b[j_limit];
-
-			align[j_limit] = -INFTY;
-			gap_a[j_limit] = -INFTY;
-
-			tracep[endy] = 0;
-
-			if (endy == len_b){
-				gap_b[j_limit] = 0;
-				tracep[endy] |= 16;
-			}else{
-				gap_b[j_limit] = pa+prof1[26];
-				if(pgb > gap_b[j_limit]){
-					gap_b[j_limit] = pgb;//pgb+prof2[endy][27];
-					tracep[endy] |= 16;
-				}
-			}
-			j = j_limit;
-			prof2 += j_limit << 6;
-			while(--j){
-				prof2 -= 64;
-				jpos = starty+j;
-				ca = align[j];
-				cga = gap_a[j];
-				cgb = gap_b[j];
-				align[j] = pa;
-				tracep[jpos] = 1;
-				if((c = pga+(prof2+ 64)[26]) > align[j]){
-					align[j] = c;//pga+prof1[ipos+1][26];
-					tracep[jpos] = 2;
-				}
-				if((c = pgb+(prof1+ 64)[26]) > align[j]){
-					align[j] = c;//pgb+prof2[jpos+1][26];
-					tracep[jpos] = 4;
-				}
-				for (c = freq[0];--c;){
-					align[j] += prof1[freq[c]]*prof2[freq[c] | 32];
-				}
-				gap_a[j] = align[j+1]+prof2[26];
-				if (gap_a[j+1] > gap_a[j]){
-					gap_a[j] = gap_a[j+1];//gap_a[j+1]+prof1[ipos][27];
-					tracep[jpos] |= 8;
-				}
-				gap_b[j] = ca+prof1[26];// prof2[jpos][26];
-				if(cgb > gap_b[j]){
-					gap_b[j] = cgb;//cgb+prof2[jpos][27];
-					tracep[jpos] |= 16;
-				}
-				pa = ca;
-				pga = cga;
-				pgb = cgb;
-			}
-			prof2 -= 64;
-			//LAST CELL (0)
-			ca = align[0];
-			cga = gap_a[0];
-			cgb = gap_b[0];
-
-			align[0] = pa;
-			tracep[starty] = 1;
-			if((c = pga+(prof2+ 64)[26]) > align[0]){
-				align[0] = c;//pga+prof1[ipos+1][26];
-				tracep[starty] = 2;
-			}
-			if((c = pgb+(prof1+ 64)[26]) > align[0]){
-				align[0] = c;//pgb+prof2[jpos+1][26];
-				tracep[starty] = 4;
-			}
-			for (c = freq[0];--c;){
-				align[j] += prof1[freq[c]]*prof2[freq[c] | 32];
-			}
-			
-			gap_a[j] = -INFTY;
-			
-			gap_b[0] = ca+prof1[26];
- 			if(cgb > gap_b[0]){
-				gap_b[0] = cgb;
-				tracep[starty] |= 16;
-			}
-		}
-		prof1 -= 64;
-		
-		freq -= 26;
-		tracep = trace[startx];
-		j = j_limit;
-
-		prof2 += j_limit << 6;
-		pa = align[j];
-		pga = gap_a[j];
-		pgb = gap_b[j];
-
-		align[j] = -INFTY;
-		gap_a[j] = -INFTY;
-		gap_b[j_limit] = -INFTY;
-		while(--j){
-			prof2 -= 64;
-			
-			jpos = starty+j;
-
-			ca = align[j];
-			cga = gap_a[j];
-			cgb = gap_b[j];
-
-			align[j] = pa;
-			tracep[jpos] = 1;
-			if((c = pga+(prof2+ 64)[26]) > align[j]){
-				align[j] = c;//pga+prof1[ipos+1][26];
-				tracep[jpos] = 2;
-			}
-			//Gap_b->Align
-			if((c = pgb+(prof1+ 64)[26]) > align[j]){
-				align[j] = c;//pgb+prof2[jpos+1][26];
-				tracep[jpos] = 4;
-			}
-			
-			for (c = freq[0];--c;){
-				align[j] += prof1[freq[c]]*prof2[freq[c] | 32];
-			}
-			gap_a[j] = align[j+1]+prof2[26];
-			if (gap_a[j+1] > gap_a[j]){
-				gap_a[j] = gap_a[j+1];//gap_a[j+1]+prof1[ipos][27];
-				tracep[jpos] |= 8;
-			}
-			gap_b[j] = -INFTY;
-			pa = ca;
-			pga = cga;
-			pgb = cgb;
-		}
-
-		prof2 -= 64;
-
-		ca = align[0];
-		cga = gap_a[0];
-		cgb = gap_b[0];
-		align[0] = pa;
-		tracep[starty] = 1;
-		if((c = pga+(prof2+ 64)[26]) > align[0]){
-			align[0] = c;//pga+prof1[ipos+1][26];
-			tracep[starty] = 2;
-		}
-		if((c = pgb+(prof1+ 64)[26]) > align[0]){
-			align[0] = c;//pgb+prof2[jpos+1][26];
-			tracep[starty] = 4;
-		}
-		
-		for (c = freq[0];--c;){	
-			align[j] += prof1[freq[c]]*prof2[freq[c] | 32];
-		}
-		gap_a[j] = align[j+1]+prof2[26];
-		//fprintf(stderr,"Gap-a:%d\n",prof2[26]);
-		//Gap_a->Gap_a
-		if (gap_a[j+1] > gap_a[j]){
-			gap_a[j] = gap_a[j+1];//gap_a[j+1]+prof1[ipos][27];
-			tracep[starty] |= 8;
-		}
-		gap_b[0] = ca+prof1[26];// prof2[jpos][26];
-		//fprintf(stderr,"Gap-b:%d\n",prof1[26]);
-		//Gap_b->Gap_b
-		if(cgb > gap_b[0]){
-			gap_b[0] = cgb;
-			tracep[starty] |= 16;
-		}
-		prof2 -= starty<<6;
-		//fprintf(stderr,"\nMOVED-::%d\n",(starty) << 6);
-		endx = startx;
-		endy = starty;
-		startx--;
-		starty--;
-	}while (startx >= 0 || starty >= 0);
-
-	free(freq);
-
-	ca = gap_b[0];
-	c = 2;
-	if(gap_a[0] > ca){
-		ca = gap_a[0];
-		c = 1;
-	}
-	if(align[0] >= ca){
-		//ca = align[0];
-		c = 0;
-	}
-	//fprintf(stderr,"STATE:%d	%d\n",c,ca);
-	ca = c;
-	
-	i = 0;
-	j = 0;
-	c = 1;
-	while(trace[i][j] < 32){
-	//	fprintf(stderr,"%d->%d	%d:%d	%d:%d\n",c,trace[i][j],i,j,len_a,len_b);
-		switch(ca){
-			case 0:
-				if (trace[i][j] & 2){
-					ca = 1;
-					if(i+1!= len_a){
-						path[c+1] |= 16;
-	//					fprintf(stderr,"GAP_CLOSE\n");
-					}
-				}else if (trace[i][j] & 4){
-					ca = 2;
-					if(j+1!= len_b){
-						path[c+1] |= 16;
-	//					fprintf(stderr,"GAP_CLOSE\n");
-					}
-				}
-
-				//path[c] = 0;
-				i++;
-				j++;
-			break;
-			case 1:
-				if(trace[i][j] & 8){
-					ca = 1;
-					if(i!=0 && i!= len_a){
-	//					fprintf(stderr,"GAP_EXT\n");
-						if(!(path[c]&16)){
-							path[c] |= 8;
-						}
-					}
-				}else{
-					ca = 0;
-					if(i!=0 && i!= len_a){
-	//					fprintf(stderr,"GAP_OPEN\n");
-						path[c] |= 4;
-					}
-
-				}
-				path[c] |= 1;
-				j++;
-			break;
-			case  2:
-				if(trace[i][j] & 16){
-					ca = 2;
-					if(j !=0 && j != len_b){
-	//					fprintf(stderr,"GAP_EXT\n");
-						if(!(path[c]&16)){
-							path[c] |= 8;
-						}
-					}
-				}else{
-					ca = 0;
-					if(j!=0 && j != len_b){
-	//					fprintf(stderr,"GAP_OPEN\n");
-						path[c] |= 4;
-					}
-				}
-				path[c] |= 2;
-				i++;
-			break;
-		}
-		c++;
-	}
-	path[0] = c-1;
-	path[c] = 3;
-	return path;
-}
-
-int* make_profile(int* prof,int* seq,int len,int** subm)
-{
-	int i,j,c;
-	prof = tmalloc(sizeof(int)*(len+1)*64);
-	prof +=  (64 *len);
-	//fprintf(stderr,"Len:%d	%d\n",len,64*len);
-	for (i = 64;i--;){
-		prof[i] = 0;
-	}
-	prof[9+32] = subm[0][9];
-	prof[14+32] = subm[0][14];
-	i = len;
-	while(i--){
-		prof -= 64;
-		//fprintf(stderr,"-64\n");
-		for (j = 26; j--;){
-			prof[j] = 0;
-		}
-		c = seq[i];
-		prof[c] +=1;
-		prof += 32;
-		for(j = 32;j--;){
-			prof[j] = subm[c][j];
-		}
-		prof -= 32;
-
-	}
-	return prof;
-}
-
-struct dp_matrix* consistency_check(struct dp_matrix *dp,int len_a,int len_b,int dia)
-{
-	int** mx = 0;
-	int* mxp = 0;
-	int* mxop = 0;
-	int* tx = 0;
-	int* ty = 0;
-	int** tb = 0;
-	int* tbp = 0;
-	int* tbop = 0;
-	register int i,j;
-	register int c = 0;
-	mx = dp->m;
-	tx = dp->true_x;
-	ty = dp->true_y;
-	tb = dp->tb;
-	mxop = mx[len_a];
-	/*for (i = 0;i <= len_a;i++){
-		for (j = 0;j <= len_b;j++){
-			printf("%3d",dp->m[i][j]);
-		}
-		printf("\n");
-	}
-	printf("\n");*/
-	
-	
-	tbop = tb[len_a];
-	for (j = len_b;j--;){
-		tbop[j] = 0;
-	}
-	tbop[len_b] = 0;
-	for (i = len_a;i--;){
-		mxp = mx[i];
-		tbp = tb[i];
-		tbp[len_b] = 0;
-		for (j = len_b;j--;){
-			tbp[j] = 0;
-			if (mxp[j]){
-				tbp[j] = tbop[j+1] + 1;
-			}
-			mxp[j] += mxop[j+1];
-			if (mxp[j+1] > mxp[j]){
-				mxp[j] = mxp[j+1];
-				tbp[j] = -1;
-			}
-			if (mxop[j] > mxp[j]){
-				mxp[j] = mxop[j];
-				tbp[j] = -2;
-			}
-		}
-		mxop = mxp;
-		tbop = tbp;
-	}
-	/*for (i = 0;i <= len_a;i++){
-		for (j = 0;j <= len_b;j++){
-			printf("%3d",dp->m[i][j]);
-		}
-		printf("\n");
-	}
-	printf("\n");
-	printf("\n");
-	for (i = 0;i <= len_a;i++){
-		for (j = 0;j <= len_b;j++){
-			printf("%2d",tb[i][j]);
-		}
-		printf("\n");
-	}
-	printf("\n");*/
-	
-	
-	c = 0;
-	i = 0;
-	j = 0;
-	while (i < len_a && j < len_b){
-		//fprintf(stderr,"%d	%d\n",tb[i][j] & 0x0000ffff,c);
-		switch (tb[i][j]){
-			case -1:
-				//printf("%d:%d	%d\n",i,j,c);
-				c = 0;
-				j++;
-				break;
-			case -2:
-				//printf("%d:%d	%d\n",i,j,c);
-				c = 0;
-				i++;
-				break;
-			default:
-				if (!c){
-					c = tb[i][j];
-					if (c < dia){
-						c = 0;
-					}else{
-						c -= 1;
-						while (--c){
-							tx[i+c] = 2;
-							ty[j+c] = 2;
-						}
-					}
-				}
-			//	tx[i] = 2;
-			//	ty[j] = 2;
-				i++;
-				j++;
-				break;
-			
-		}
-	}
-	//exit(0);
-	tx[0] = 2;
-	ty[0] = 2;
-
-	return dp;
-}
-
-struct dp_matrix* consistency_check2(struct dp_matrix *dp,int len_a,int len_b,int dia)
-{
-	int** mx = 0;
-	int* mxp = 0;
-	int* mxop = 0;
-	int* tx = 0;
-	int* ty = 0;
-	int** tb = 0;
-	int* tbp = 0;
-	int* tbop = 0;
-	register int i,j;
-	int old_j = 0;
-	register int c = 0;
-	mx = dp->m;
-	tx = dp->true_x;
-	ty = dp->true_y;
-	tb = dp->tb;
-	mxop = mx[len_a];
-	/*printf("%1d ",0);
-	for (j = 0;j <= len_b;j++){
-		printf("%1d",dp->true_y[j]);
-	}
-	printf("\n\n");
-	
-	for (i = 0;i <= len_a;i++){
-		printf("%1d ",dp->true_x[i]);
-		for (j = 0;j <= len_b;j++){
-			printf("%1d",dp->m[i][j]);
-		}
-		printf("\n");
-	}
-	printf("\n\n");*/
-	
-	tbop = tb[len_a];
-	for (j = len_b;j--;){
-		tbop[j] = 0;
-	}
-	tbop[len_b] = 0;
-	for (i = len_a;i--;){
-		if (tx[i]){
-		old_j = len_b;
-		mxp = mx[i];
-		tbp = tb[i];
-		tbp[len_b] = 0;
-		for (j = len_b;j--;){
-			if (ty[j]){
-			tbp[j] = 0;
-			//if (mxp[j]){
-			//	tbp[j] = tbop[j+1] + 1;
-			//}
-		//	mxp[j] += mxop[j+1];
-			
-			mxp[j] += mxop[old_j];
-			if (mxp[old_j] > mxp[j]){
-				mxp[j] = mxp[old_j];
-				tbp[j] = -1;
-			}
-			if (mxop[old_j] > mxp[j]){
-				mxp[j] = mxop[old_j];
-				tbp[j] = -2;
-			}
-			old_j = j;
-			}
-		}
-		mxop = mxp;
-		tbop = tbp;
-		}
-	}
-	/*printf("\n\n");
-	printf("%3d ",0);
-	for (j = 0;j <= len_b;j++){
-		printf("%3d",dp->true_y[j]);
-	}
-	printf("\n\n");
-	
-	for (i = 0;i <= len_a;i++){
-		printf("%3d ",dp->true_x[i]);
-		for (j = 0;j <= len_b;j++){
-			printf("%3d",dp->m[i][j]);
-		}
-		printf("\n");
-	}
-	printf("\n\n");*/
-	c = 0;
-	i = 1;
-	j = 1;
-	while (i < len_a && j < len_b){
-		//fprintf(stderr,"%d	%d	%d	%d\n",i,j,tb[i][j],c);
-		switch (tb[i][j]){
-			case 0:
-				/*if (c > dia){
-					c -= 1;
-					while (--c){
-						tx[i-c] = 2;
-						ty[j-c] = 2;
-					}
-					
-				}
-				c = 0;*/
-				tx[i] = 2;
-				ty[j] = 2;
-				i++;
-				j++;
-				break;
-			case -1:		
-				/*if (c > dia){
-					c -= 1;
-					while (--c){
-						tx[i-c] = 2;
-						ty[j-c] = 2;
-					}
-				}
-				c = 0;*/
-				j++;
-				break;
-			case -2:
-				/*if (c > dia){
-					c -= 1;
-					while (--c){
-						tx[i-c] = 2;
-						ty[j-c] = 2;
-					}
-				}
-				c = 0;*/
-				i++;
-				break;
-			/*default:	
-			//	fprintf(stderr,"ALIGN\n");
-				if (!c){
-					c = tb[i][j];
-					if (c < dia){
-						c = 0;
-					}else{
-						
-						c -= 1;
-						while (--c){
-							tx[i+c] = 2;
-							ty[j+c] = 2;
-						}
-					}
-				}
-				i++;
-				j++;
-				break;*/
-			
-		}
-		while (!tx[i]){
-			i++;
-		}
-		while (!ty[j]){
-			j++;
-		}
-	}
-	/*printf("\n\n");
-	printf("%2d	",0);
-	for (j = 0;j <= len_b;j++){
-		printf("%2d	",dp->true_y[j]);
-	}
-	printf("\n\n");
-	
-	for (i = 0;i <= len_a;i++){
-		printf("%2d	",dp->true_x[i]);
-		for (j = 0;j <= len_b;j++){
-			printf("%2d	",dp->tb[i][j]);
-		}
-		printf("\n");
-	}
-	printf("\n\n");*/
-	
-	tx[0] = 2;
-	ty[0] = 2;
-	/*i = 0;
-	for (j = 0;j <= len_a;j++){
-		fprintf(stderr,"%d",dp->true_x[j]);
-		if (dp->true_x[j] == 2){
-			i++;
-		}
-	}
-	fprintf(stderr,"\n%d\n",i);
-	
-	i = 0;
-	for (j = 0;j <= len_b;j++){
-		fprintf(stderr,"%d",dp->true_y[j]);
-		if (dp->true_y[j] == 2){
-			i++;
-		}
-	}
-	fprintf(stderr,"\n%d\n",i);*/
-	//exit(0);
-
-	return dp;
-}
-
-void add_ptm2(int** matches[],struct dp_matrix *dp,int a,int b)
-{
-	register int i,j,c;
-	int* posa = 0;
-	int* posb = 0;
-	int* mc = 0;
-	int *tx = 0;
-	int *ty = 0;
-	int** matrix = 0;
-	matrix = dp->m;
-	tx = dp->true_x;
-	ty = dp->true_y;
-	for (c =8000;c--;){
-		if (matches[c]){
-			if (matches[c][a][0]!= 1){
-			if (matches[c][b][0]!= 1){
-			posa = matches[c][a];
-			posb = matches[c][b];
-			for (i = posa[0];--i;){
-				mc = matrix[posa[i]];
-				tx[posa[i]] = 1;
-				for (j = posb[0];--j;){
-					mc[posb[j]] += 1;
-					
-					ty[posb[j]] = 1;
-				}
-			}
-			}
-			}
-		}
-	}
-}
-
-void add_ptm(int** matches[],int** matrix,int a,int b)
-{
-	register int i,j,c;
-	int* posa = 0;
-	int* posb = 0;
-	int* mc = 0;
-	for (c =8000;c--;){
-		if (matches[c]){
-			if (matches[c][a][0]!= 1){
-			if (matches[c][b][0]!= 1){
-			posa = matches[c][a];
-			posb = matches[c][b];
-			for (i = posa[0];--i;){
-				mc = matrix[posa[i]];
-				for (j = posb[0];--j;){
-					mc[posb[j]] += 1;
-				}
-			}
-			}
-			}
-		}
-	}
-}
-
-int** read_matrix(short *matrix_pointer,int** subm,int gpo)
-{
-	char *amino_acid_order = "ABCDEFGHIKLMNPQRSTVWXYZ";
-	int i,j;
-	int m_pos = 0;
-	m_pos = 0;
-	for (i = 0;i < 23;i++){
-		for (j = 0;j <= i;j++){
-			if (i == j){
-				subm[amino_acid_order[i]-65][amino_acid_order[j]-65] += matrix_pointer[m_pos];
-			}else{
-				subm[amino_acid_order[i]-65][amino_acid_order[j]-65] += matrix_pointer[m_pos];
-				subm[amino_acid_order[j]-65][amino_acid_order[i]-65] += matrix_pointer[m_pos];
-			}
-			m_pos++;
-		}
-	}
-	for (i = 26;i--;){
-		subm[i][9] = -gpo;
-	}
-	return subm;
-}
-
-int* upgma(double **dm,int* tree)
-{
-	int i,j,t;
-	int *as = 0;
-	double max;
-	int node_a = 0;
-	int node_b = 0;
-	int cnode = 0;
-	cnode = numseq;
-	as = tmalloc (sizeof(int)*numprofiles);
-	for (i = numseq; i--;){
-		as[i] = 1;
-	}
-	for (i = numseq; i < numprofiles;i++){
-		as[i] = 0;
-	}
-	t = 0;
-	while (cnode != numprofiles){
-		max = -INFTY;
-		for (i = 0;i < numprofiles; i++){
-			if (as[i]){
-			for ( j = i +1;j < numprofiles;j++){
-				if (as[j]){
-				if (dm[i][j] > max){
-					max = dm[i][j];
-					node_a = i;
-					node_b = j;
-				}
-				}
-			}
-			}
-		}
-		/*deactivate  sequences to be joined*/
-		as[node_a] = 0;
-		as[node_b] = 0;
-		tree[t] = node_a;
-		tree[t+1] = node_b;
-		/*calculate new distances*/
-		for (i = numprofiles;i--;){
-			if (as[i]){
-				dm[i][cnode] = (node_a < i)?dm[node_a][i]:dm[i][node_a];
-				dm[i][cnode] += (node_b < i)?dm[node_b][i]:dm[i][node_b];
-				dm[i][cnode] /= 2;
-			}
-		}
-		as[cnode] = 1;
-		cnode++;
-		t += 2;
-	}
-	free(as);
-	return tree;
-}
-
-double distance_calculation2(int** matches[],int len_a,int len_b,int a,int b)//,int size)
-{
-	double d = 0;
-	register int c;
-	for (c = 8000;c--;){
-		if (matches[c]){
-			if ((matches[c][a][0]&0x0000ffff)-1){
-				if ((matches[c][b][0]&0x0000ffff)-1){
-					d++;
-				}
-			}
-		}
-	}
-	if (len_a > len_b){
-		d /= (double)len_b;
-	}else{
-		d /= (double)len_a;
-	}
-	return d;
-}
-
-
-double distance_calculation(int** matches[],int len_a,int len_b,int a,int b)//,int size)
-{
-	double d = 0;
-	register int i,j,c,tmp1,tmp2;
-	int* diagonal = 0;
-	int* p1 = 0;
-	int* p2 = 0;
-	int *p = 0;
-	diagonal = tmalloc(sizeof(int)*(len_a+len_b));
-	for(i = len_a + len_b;i--;){
-		diagonal[i] = 0;
-	}
-	diagonal += len_a;
-	for (c = 8000;c--;){
-		if (matches[c]){
-			if ((matches[c][a][0]&0x0000ffff)-1){
-				p1 = matches[c][a];
-				tmp1 = (p1[0] >> 16);
-				if ((matches[c][b][0]&0x0000ffff)-1){
-					p2 = matches[c][b];
-					tmp2 = tmp1 * (p2[0]>>16);
-					for (i = p1[0] & 0x0000ffff;--i;){
-						p = diagonal - p1[i];
-						for (j = p2[0] & 0x0000ffff;--j;){
-							p[p2[j]] += tmp2;
-						}
-					}
-				}
-			}
-		}
-	}
-	
-	diagonal -= len_a;
-	c = 0; //min
-	for (i = 3;i--;){
-		for(j = len_a+len_b;j--;){
-			//fprintf(stdout,"	%d	c:%d\n",diagonal[j],c);
-			if (diagonal[j]){
-			if(diagonal[j] > (c & 0x0000ffff)){
-				c = diagonal[j]| (j<<16);
-				//fprintf(stderr,"c:%d	%d\n",c &0x0000ffff, c >>16);
-			}
-			}
-		}
-		if (c){
-			d += c & 0x0000ffff;
-			diagonal[c>>16] = 0;
-			c = 0;
-		}
-	}
-	free(diagonal); 
-	return d;
-}
-
-void fill_hash(struct sequence_info* si,int** matches[],int nowu)
-{
-	int i,j,c,f;
-	int key = 0;
-	int *sp = 0;
-	int aacode[26] = {0,0,1,2,3,4,5,6,7,-1,8,9,10,11,-1,12,13,14,15,16,-1,17,18,0,19,0};
-	int aadecode[20] = {0,2,3,4,5,6,7,8,10,11,12,13,15,16,17,18,19,21,22,24};
-	int patterns[30] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
-	int **out = 0;
-	int map[10] = {0,0,0,0,0,0,0,0,0,0};
-	for (i = numseq;i--;){
-		sp = si->s[i];
-		for(j = si->sl[i]-2;j--;){
-			key = ((aacode[sp[j]]*20)+aacode[sp[j+1]])*20+aacode[sp[j+2]];		
-			//fprintf(stderr,"Pattern:%c%c%c matches in %d at %d\n",sp[j]+65,sp[j+1]+65,sp[j+2]+65,i,j);
-			if (!matches[key]){
-				matches[key] = tmalloc(sizeof(int*)*numprofiles);
-				for (c = numprofiles;c--;){
-					matches[key][c] = 0;
-				}
-			}
-			if (!matches[key][i]){
-				matches[key][i] = tmalloc(sizeof(int)*10);
-				matches[key][i][0] = 1;
-			}
-			if (!(matches[key][i][0] %10)){
-				matches[key][i] = realloc(matches[key][i],(matches[key][i][0]+10) * sizeof(int));
-			}
-			matches[key][i][matches[key][i][0]] = j;
-			matches[key][i][0] += 1;
-		}
-	}
-	for (i = 8000;i--;){
-		if (matches[i]){
-		for (j = numseq;j--;){
-			if (matches[i][j]){
-				matches[i][j][0] |= 0x00040000;
-			}
-		}
-		}
-	}
-	if(nowu){
-	for (i = 8000;i--;){
-		if (matches[i]){
-		for (j = numseq;j--;){
-			if (!matches[i][j]){
-				matches[i][j] = tmalloc(sizeof(int)*1);
-				matches[i][j][0] = 1;
-			}
-		}
-		}
-	}
-	}else{
-
-	c = 0;
-	for (i = numseq;i--;){
-		for (j = 8000;j--;){
-			if (matches[j]){
-			if(!matches[j][i]){
-				map[c] = j;
-				key = j;
-				patterns[c*3 + 2] = aadecode[key / 400];
-				key %= 400;
-				patterns[c*3 + 1] = aadecode[key /20];
-				key %= 20;
-				patterns[c*3 + 0] = aadecode[key]; 
-				c++;
-			}
-			if(c == 10){
-				//start of 10x Wu-Manber;
-				out = ten_wu_manber(si->s[i],si->sl[i],patterns);
-				for (f = 0;f < 10;f++){
-					matches[map[f]][i] = out[f];
-					matches[map[f]][i][0] |= 0x00010000;
-				}
-				//free(out);
-				c = 0;
-			}
-		}
-		}
-		if (c){
-			for (f = c*3;f < 30;f++){
-				patterns[f] = 9;
-			}
-			out = ten_wu_manber(si->s[i],si->sl[i],patterns);
-			for (f = 0;f < c;f++){
-				matches[map[f]][i] = out[f];
-				matches[map[f]][i][0] |= 0x00010000;
-			}
-			//free(out);
-			c = 0;
-		}
-	}
-	}
-}
-
-void* tmalloc(int size){
-	void* p;
-	p = (void*)malloc(size);
-	if (!p){
-		fprintf(stderr,"Out of memory!\n- try running Kalign with the -f option enabled\n");
-		exit(0);
-	}
-	return p;
-}
-
-int** ten_wu_manber(int* seq,int len,int p[])
-{
-	unsigned int Tc = 0;
-	unsigned int Tc2 = 0;
-	register unsigned int R0 = 0;
-	register unsigned int R1= 153391689;//1;
-	register unsigned int S0 = 0;
-	register unsigned int S1 = 0;
-	unsigned int T[26] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
-	unsigned int T2[26] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
-	int **out = 0;
-	out = tmalloc(sizeof(int*)*10);
-	for (Tc = 10;Tc--;){
-		out[Tc] = tmalloc(sizeof(int)*10);
-		out[Tc][0] = 1;
-	}
-
-	for (Tc = 0; Tc < 30;Tc++){
-		T[p[Tc]] |= 1 << Tc;
-		T2[p[Tc]] = T[p[Tc]]&153391689;//MASK;
-	}
-	while(--len){
-		//fprintf(stderr,"%d\n",len);
-		Tc = T[seq[len]];
-		Tc2 = T2[seq[len]];
-		S0 <<= 1;
-		S0 |= 153391689;//MASK;
-		S0 &= Tc;
-		S0 |= Tc2;
-		//S1 = ((R1 << 1) & Tc) | ((R0 | S0) << 1) | R0;//| 1;
-		S1 = (R1 << 1) & Tc;//| 1;
-		S1 |= (R0 | S0) << 1;
-		S1 |= R0;
-		S1 |= 153391689;
-		
-		//S1 = (R1 << 1) & (Tc) | ((R0 | S0) << 1) | (R0) | (153391689);
-		
-		if (S1 & 0x24924924){
-			if (S1 & 0x00004924){
-				if (S1 & 0x00000024){
-					if (S1 & 4){
-						if (!(out[0][0] %10)){
-							out[0] = realloc(out[0],(out[0][0]+10) * sizeof(int));
-						}
-						out[0][out[0][0]] = len;
-						out[0][0]++;
-					}
-					if (S1 & 32){
-						if (!(out[1][0] %10)){
-							out[1] = realloc(out[1],(out[1][0]+10) * sizeof(int));
-						}
-						out[1][out[1][0]] = len;
-						out[1][0]++;
-					}	
-				}
-				if (S1 & 0x00004900){
-					if (S1 & 256){
-						if (!(out[2][0] %10)){
-							out[2] = realloc(out[2],(out[2][0]+10) * sizeof(int));
-						}
-						out[2][out[2][0]] = len;
-						out[2][0]++;
-					}
-					if (S1 & 2048){
-						if (!(out[3][0] %10)){
-							out[3] = realloc(out[3],(out[3][0]+10) * sizeof(int));
-						}
-						out[3][out[3][0]] = len;
-						out[3][0]++;
-					}
-					if (S1 & 16384){
-						if (!(out[4][0] %10)){
-							out[4] = realloc(out[4],(out[4][0]+10) * sizeof(int));
-						}
-						out[4][out[4][0]] = len;
-						out[4][0]++;
-					}
-				}
-			}
-			
-			
-			
-			if (S1 & 0x24920000){
-				if (S1 & 0x00920000){
-					if (S1 & 131072){
-						if (!(out[5][0] %10)){
-							out[5] = realloc(out[5],(out[5][0]+10) * sizeof(int));
-						}
-						out[5][out[5][0]] = len;
-						out[5][0]++;
-					}
-					if (S1 & 1048576){
-						if (!(out[6][0] %10)){
-							out[6] = realloc(out[6],(out[6][0]+10) * sizeof(int));
-						}
-						out[6][out[6][0]] = len;
-						out[6][0]++;
-					}
-					if (S1 & 8388608){
-						if (!(out[7][0] %10)){
-							out[7] = realloc(out[7],(out[7][0]+10) * sizeof(int));
-						}
-						out[7][out[7][0]] = len;
-						out[7][0]++;
-					}
-				}
-				
-				if (S1 & 0x24000000){
-					if (S1 & 67108864){
-						if (!(out[8][0] %10)){
-							out[8] = realloc(out[8],(out[8][0]+10) * sizeof(int));
-						}
-						out[8][out[8][0]] = len;
-						out[8][0]++;
-					}
-					if (S1 & 536870912){
-						if (!(out[9][0] %10)){
-							out[9] = realloc(out[9],(out[9][0]+10) * sizeof(int));
-						}
-						out[9][out[9][0]] = len;
-						out[9][0]++;
-					}
-				}
-			}
-		}
-		R0 = S0;
-		R1 = S1;
-	}
-	return out;
-}
-
-void update_hash(struct sequence_info* si,int** matches[],int a,int b,int new)
-{
-	int n,i,j,c;
-	int nma;
-	int nmb;
-	int ma = 0;
-	int mb = 0;
-	int comp;
-	int* rela = 0;
-	int* relb = 0;
-	rela = si->relpos[a];
-	relb = si->relpos[b];
-	/*fprintf(stderr,"LEN%d:%d\n",a,si->sl[a]);
-	for (i = 0; i < si->sl[a]-1;i++){
-		fprintf(stderr,"%d ",si->relpos[a][i]);
-		//if (si->relpos[a][i] > si->relpos[a][i+1]){
-		//	exit(0);
-		//}
-	}
-	fprintf(stderr,"\n");*/
-	//exit(0);
-	for (n = 8000;n--;){
-		if(matches[n]){
-			if ((nma = matches[n][a][0]-1)){
-				if((nmb = matches[n][b][0]-1)){
-					//fprintf(stderr,"UPDATING:\n");
-					//fprintf(stderr,"nma:%d	nmb:%d\n",nma,nmb);
-					matches[n][new] = tmalloc(sizeof(int) * (nma+nmb+1));
-					//matches[n][new][0] = nma+nmb+1;
-					/*fprintf(stderr,"A:");
-					for (i = 1;i <= nma;i++){
-						fprintf(stderr,"%d:%d	",rela[matches[n][a][i] & 0x0000ffff],matches[n][a][i]>>16);
-					}
-					fprintf(stderr,"\n");
-					fprintf(stderr,"B:");
-					for (i = 1;i <= nmb;i++){
-						fprintf(stderr,"%d:%d	",relb[matches[n][b][i]& 0x0000ffff],matches[n][b][i]>>16);
-					}
-					fprintf(stderr,"\n");*/
-
-					i = 1;
-					j = 1;
-					c = 1;
-					while (i <= nma && j <= nmb ){
-						ma = matches[n][a][i];
-						mb = matches[n][b][j];
-						comp = (rela[ma] > relb[mb]) - (rela[ma] < relb[mb]);
-						switch(comp){
-							case 0:
-							matches[n][new][c] = rela[ma];
-							i++;
-							j++;
-						//	c++;
-							break;
-							case 1:
-							matches[n][new][c] = rela[ma];
-							i++;
-							break;
-							case -1:
-							matches[n][new][c] = relb[mb];
-							j++;
-							break;
-						}
-						c++;
-					}
-					ma = matches[n][a][i];
-					mb = matches[n][b][j];
-					//fprintf(stderr,"c:%d	i:%d	j:%d\n",c,i,j);
-					while (i <= nma){
-						ma = matches[n][a][i];
-						//matches[n][new][c] =rela[ma & 0x0000ffff] | (ma & 0xffff0000);
-						matches[n][new][c] =rela[ma];// | (ma & 0xffff0000);
-						i++;
-						c++;
-					}
-					while (j <= nmb){
-						mb = matches[n][b][j];
-						//matches[n][new][c] =relb[mb & 0x0000ffff] | (mb & 0xffff0000);
-						matches[n][new][c] =relb[mb];// | (mb & 0xffff0000);
-						j++;
-						c++;
-					}
-					matches[n][new][0] = c;
-					/*fprintf(stderr,"N:");
-					for (i = 0;i < c;i++){
-						fprintf(stderr,"%d:%d	",matches[n][new][i]& 0x0000ffff,matches[n][new][i]>>16);
-					}
-					fprintf(stderr,"\n");*/
-					//exit(0);
-					free(matches[n][a]);
-					free(matches[n][b]);
-
-
-				}
-			}
-			if(!matches[n][new]){
-				//fprintf(stderr,"SHIT\n");
-				matches[n][new] = tmalloc (sizeof(int)*1);
-				matches[n][new][0] = 1;
-			}
-
-		}
-	}
-}
-
-char* get_input_into_string(char* string,char* infile)
-{
-	int i = 0;     
-	int string_length = 2;
-	char c = 0;    
-	FILE *file = 0;
-	if(infile){
-		if (!(file = fopen( infile, "r" ))){
- 			fprintf(stderr,"Cannot open file '%s'\n", infile);
-			exit(1);
-		}
-		if (fseek(file,0,SEEK_END) != 0){
-			(void)fprintf(stderr, "ERROR: fseek failed\n");
-			(void)exit(EXIT_FAILURE);
-		}
-		i= ftell (file);
-		if (fseek(file,0,SEEK_START) != 0){
-			(void)fprintf(stderr, "ERROR: fseek failed\n");
-			(void)exit(EXIT_FAILURE);
-		}
-		string = tmalloc ((i+1)* sizeof(char));
-		fread(string,sizeof(char), i, file);
-		string[i] = 0;
-	}else{
-		if (!isatty(0)){
-			string = malloc(sizeof(char*)*string_length);
-			while (!feof (stdin)){
-			c = getc(stdin);
-			if (i == string_length){
-				string_length <<=1;
-				string = realloc(string,sizeof(char)*string_length);
-			}
-			string[i] = c;
-			i++;
-			}
-			string[i] = 0;
-		}else{
-			return 0;
-		}
-	}
-	return string;
-}
-
-struct sequence_info* read_sequences(struct sequence_info* si,char* string)
-{
-	int c = 0;
-	int n = 0;
-	int i = 0;
-	int j = 0;
-	int stop = 0;
-	int nbytes;
-	nbytes = strlen(string);
-
-	si = (struct sequence_info *) tmalloc(sizeof(struct sequence_info));
-	for (i =0;i < nbytes;i++){
-		if (string[i] == '>'&& stop == 0){
-			stop = 1;
-			numseq++;
-		}
-		if (string[i] == '\n'){
-			stop = 0;
-		}
-	}
-
-	numprofiles = (numseq << 1) - 1;
-	si->s = tmalloc(sizeof(int*) * numseq);
-	si->sl = tmalloc(sizeof(int) * numprofiles);
-	si->sip = tmalloc(sizeof(int*)* numprofiles);
-	si->nsip = tmalloc(sizeof(int)* numprofiles);
-	si->sn = tmalloc(sizeof(int*) * numseq);
-	si->lsn = tmalloc(sizeof(int) * numseq);
-	si->gis = tmalloc(sizeof(int*) * numprofiles);
-	si->relpos = tmalloc(sizeof(int*) * numprofiles);
-	j = 0;
-	for (i =0;i < nbytes;i++){
-		if (string[i] == '>' && stop == 0){
-			stop = 1;
-			si->sl[j] =c;
-			j++;
-			c = 0;
-		}
-		if (string[i] == '\n'){
-			if(stop == 1){
-				si->lsn[j-1] = n;
-				n = 0;
-			}
-			stop = 0;
-
-		}
-		if (stop == 1 && string[i] != '\n' && string[i] != 0 ){
-			n++;
-		}
-		if (stop == 0 && string[i] != '\n' && string[i] != 0 ){
-			//if (string[i] >64){
-			if (isalpha((int)string[i])){
-			c++;
-			}
-		}
-	}
-	si->sl[j] = c;
-	for (i =1;i < numseq+1;i++){si->sl[i-1] = si->sl[i];}
-	for (i = numseq;i--;){
-		si->s[i] = tmalloc(sizeof(int)*(si->sl[i]+1));
-		si->sn[i] = tmalloc(sizeof(int)*(si->lsn[i]+1));
-		si->gis[i] = tmalloc(sizeof(int)*(si->sl[i]+1));
-		si->relpos[i] = tmalloc(sizeof(int)*(si->sl[i]+1));
-		si->sip[i] = tmalloc(1* sizeof(int));
-		si->nsip[i] = 1;
-		si->sip[i][0] = i;
-		for(j = si->sl[i]+1;j--;){
-			si->gis[i][j] = 0;
-			si->relpos[i][j] = j;
-		}
-	}
-	j =0;
-	for (i =0;i < nbytes;i++){
-		if (string[i] == '>'&& stop == 0 ){
-			stop = 1;
-			j++;
-			c = 0;
-		}
-		if (string[i] == '\n'){
-			if(stop == 1){
-				n = 0;
-			}
-			stop = 0;
-		}
-		if (stop == 1 &&string[i] != '\n' && string[i] != 0 ){
-			si->sn[j-1][n] = string[i];
-			n++;
-		}
-		if (stop == 0 && string[i] != '\n' && string[i] != 0 ){
-			//if(string[i] > 64){
-			if(isalpha((int)string[i])){
-			si->s[j-1][c] = toupper(string[i])-65;
-			c++;
-			}
-		}
-	}
-	for (i =0;i< numseq;i++){
-		si->s[i][si->sl[i]] = 0;
-		si->sn[i][si->lsn[i]] = 0;
-	}
-	free(string);
-	return si;
-}
-
-struct dp_matrix* dp_matrix_init(struct dp_matrix *dp,int x,int y)
-{
-	int** mx = 0;
-	//int** tb = 0;
-	int* mxp = 0;
-	//int* tbp = 0;
-	int* tx = 0;
-	int* ty = 0;
-	register int i,j;
-	
-	tx = dp->true_x;
-	ty = dp->true_y;
-	//tb = dp->tb;
-	mx = dp->m;
-	for (i = x+1;i--;){
-		//tbp = tb[i];
-		mxp = mx[i];
-		tx[i] = 0;
-		for (j = y+1;j--;){
-		//	tbp[j] = 0;
-			mxp[j] = 0;
-		}
-	}
-	for (j = y+1;j--;){
-		ty[j] = 0;
-	}
-	return dp;
-}
-
-struct dp_matrix* dp_matrix_realloc(struct dp_matrix *dp,int x,int y,int p)
-{
-	int i;
-	if ( x > dp->x || y > dp->y){
-		//printf("REALLOCING:%d-%d	%d-%d\n",x,y,dp->x,dp->y);
-		i = 1;
-		while (i <= y){
-			i <<= 1;
-		//	printf("i:%d	y:%d\n",i,y);
-		}
-		y = i-1;
-		i = 1;
-		while (i <= x){
-			i <<= 1;
-			//printf("i:%d	y:%d\n",i,y);
-		}
-		x = i-1;
-		//printf("NEWX:%d	NEWY:%d\n",x,y);
-		dp->a = (int*) realloc(dp->a,sizeof(int) * (y+1));
-		dp->ga = (int*) realloc(dp->ga,sizeof(int) * (y+1));
-		dp->gb = (int*) realloc(dp->gb,sizeof(int) * (y+1));
-		dp->tb  = (int**) realloc (dp->tb,sizeof (int*)*(x+1));
-		dp->tb_mem = (void*) realloc(dp->tb_mem,sizeof(int) * (x+1) * (y+1));
-		if(p){
-			dp->m  = (int**) realloc (dp->m,sizeof (int*) * (x+1));
-			dp->m_mem = (void*) realloc(dp->m_mem,sizeof(int) * (x+1) * (y+1));
-			dp->tb[0] = (int*) dp->tb_mem;
-			dp->m[0] = (int *) dp->m_mem;
-	  		for (i = 1; i <= x; i++){
-				dp->tb[i] = dp->tb[0] +(i*(y+1));
-				dp->m[i] = dp->m[0] +(i*(y+1));
-			}
-		}else{
-			dp->tb[0] = (int*) dp->tb_mem;
-  			for (i = 1; i <= x; i++){
-				dp->tb[i] = dp->tb[0] +(i*(y+1));
-			}
-		}
-		dp->true_x = realloc(dp->true_x,sizeof(int) * (x+1));
-		dp->true_y = realloc(dp->true_y,sizeof(int) * (y+1));
-		dp->x = x;
-		dp->y = y;
-	}
-	return dp;
-}
-
-struct dp_matrix* dp_matrix_alloc(struct dp_matrix *dp,int x,int y,int p)
-{
-	int i;
-	dp = (struct dp_matrix *) tmalloc(sizeof(struct dp_matrix));
-	dp->x = x;
-	dp->y = y;
-	dp->a = (int*) tmalloc(sizeof(int)* (y+1));
-	dp->ga = (int*) tmalloc(sizeof(int)* (y+1));
-	dp->gb = (int*) tmalloc(sizeof(int)* (y+1));
-	dp->true_x = (int*) tmalloc(sizeof(int) * (x+1));
-	dp->true_y = (int*) tmalloc(sizeof(int) * (y+1));
-	dp->tb = (int**) tmalloc(sizeof(int*) * (x+1));
-	dp->tb_mem = (void *) tmalloc(sizeof(int) * (x+1) * (y+1));
-	if (p){
-		dp->m = (int**) tmalloc(sizeof(int*) * (x+1));
-		dp->m_mem = (void *) tmalloc(sizeof(int) * (x+1) * (y+1));
-		dp->tb[0] = (int*) dp->tb_mem;
-		dp->m[0] = (int*) dp->m_mem;
-		for ( i = 1; i <= x;i++){
-			dp->tb[i] = dp->tb[0] +(i*(y+1));
-			dp->m[i] = dp->m[0] +(i*(y+1));
-		}
-	}else{
-		dp->tb[0] = (int*) dp->tb_mem;
-		for ( i = 1; i <= x;i++){
-			dp->tb[i] = dp->tb[0] +(i*(y+1));
-		}
-	}
-	return dp;
-}
-
-void dp_matrix_free(struct dp_matrix *dp,int p )
-{
-	free(dp->a);
-	free(dp->ga);
-	free(dp->gb);
-	free(dp->true_x);
-	free(dp->true_y);
-	free(dp->tb);
-	free(dp->tb_mem);
-	if (p){
-		free(dp->m);
-		free(dp->m_mem);
-	}
-	free(dp);
-}

Added: trunk/packages/kalign/branches/upstream/current/kalign2.h
===================================================================
--- trunk/packages/kalign/branches/upstream/current/kalign2.h	2006-11-19 13:38:57 UTC (rev 159)
+++ trunk/packages/kalign/branches/upstream/current/kalign2.h	2006-11-29 14:12:29 UTC (rev 160)
@@ -0,0 +1,410 @@
+/*
+	kalign2.h
+	
+	Released under GPL - see the 'COPYING' file   
+	
+	Copyright (C) 2006 Timo Lassmann <timolassmann at gmail.com>
+	
+	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
+	any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+    
+	Please send bug reports, comments etc. to:
+	timolassmann at gmail.com
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#define INFTY 936870912
+#define FLOATINFTY 100000000000000000000.0
+
+#define NODESIZE 16
+
+
+#ifdef MEMORY 
+#define tmalloc malloc
+#endif
+
+
+extern unsigned int numseq;
+extern unsigned int numprofiles;
+extern float gpo;
+extern float gpe;
+extern float tgpe;
+
+struct feature_matrix{
+	float** m;
+	int mdim;
+	int stride;
+};
+
+struct utype_ufeat{
+	struct feature *t;
+	struct feature *f;
+};
+
+struct parameters{
+	char **infile;
+	char *input;
+	char *outfile;
+	char* format;
+	//int reformat;
+	char* feature_type;
+	char* alignment_type;
+	char* feature_mode;
+	char* distance;
+	char* tree;
+	char* sort;
+	char* sub_matrix;
+	char* print_tree;
+	char* print_svg_tree;
+	float gpo;
+	float gpe;
+	float tgpe;
+	float secret;
+	float zlevel;
+	
+	int reformat;
+	int id;
+	int aa;
+	int alter_gaps;
+	int ntree;
+	int help_flag;
+	int quiet;
+	
+	int dna;
+	float alter_range;
+	int alter_weight;
+	float internal_gap_weight;
+	int smooth_window;
+	float smooth_strength;
+};
+
+struct node{
+	struct node *next;
+        int pos;
+};
+
+struct names{
+	int* start;
+	int* end;
+	int* len; 
+};
+
+struct bignode{
+	struct bignode *next;
+	unsigned int pos[NODESIZE];
+	unsigned int num;
+};
+
+struct bignode* big_insert_hash(struct bignode *n,const unsigned int pos);
+void big_remove_nodes(struct bignode *n);
+void big_print_nodes(struct bignode *n);
+
+
+
+struct alignment{
+	//struct node** seq;
+	struct feature** ft;
+	struct sequence_info** si;
+	unsigned int** sip;
+	unsigned int* nsip;
+	unsigned int* sl;
+	unsigned int* lsn;
+	int** s;
+	char**seq;
+	char** sn;
+};
+
+struct sequence_info{
+	struct sequence_info* next;
+	char* name;
+	char* value;
+};
+
+struct feature{
+	struct feature *next;
+	char* type;
+	char* note;
+	int start;
+	int end;
+	int color;
+};
+
+struct hirsch_mem{
+	struct states* f;
+	struct states* b;
+	int starta;
+	int startb;
+	int enda;
+	int endb;
+	int size;
+	int len_a;
+	int len_b;
+};
+
+struct dp_matrix{
+	struct states* s;
+	void* tb_mem;
+	char** tb;
+	int x;
+	int y;
+};
+
+struct states{
+	float a;
+	float ga;
+	float gb;
+	float x;
+};
+
+struct aln_tree_node{
+	struct aln_tree_node** links;
+	int* internal_lables;
+	int* path;
+	int* profile;
+	int* seq;
+	int len;
+	int done;
+	int num;
+};
+
+struct tree_node{
+	struct tree_node* left;
+	struct tree_node*right;
+ 	int label;
+ 	int edge;
+};
+
+struct ntree_data{
+	struct aln_tree_node* realtree;
+	struct alignment* aln;
+	float** profile;
+	int** map;
+	float**submatrix;
+	int* tree;
+	int ntree;
+};
+
+struct alignment* sort_sequences(struct alignment* aln,int* tree,char* sort);
+
+struct aln_tree_node* real_upgma(float **dm,int ntree);
+
+int* readtree(struct aln_tree_node* p,int* tree);
+
+struct parameters* interface(struct parameters* param,int argc,char **argv);
+void parameter_message(struct parameters* param);
+
+struct dp_matrix* dp_matrix_alloc(struct dp_matrix *dp,int x,int y);
+struct dp_matrix* dp_matrix_realloc(struct dp_matrix *dp,int x,int y);
+void dp_matrix_free(struct dp_matrix *dp);
+
+struct alignment* detect_and_read_sequences(struct alignment* aln,struct parameters* param);
+void output(struct alignment* aln,struct parameters* param);
+
+int* upgma(float **dm,int* tree);
+int* nj(float **dm,int* tree);
+void print_simple_phylip_tree(struct aln_tree_node* p);
+
+
+struct alignment* make_dna(struct alignment* aln);
+
+float** read_matrix(float** subm,struct parameters* param);
+
+int* f_only_pp_dyn(int* path, struct dp_matrix *dp,const float* fprof1,const float* fprof2,const int len_a,const int len_b,int fdim,int stride);
+
+int* fpp_dyn(int* path, struct dp_matrix *dp,const float* prof1,const float* prof2,const float* fprof1,const float* fprof2,const int len_a,const int len_b,int fdim,int stride);
+
+int* dna_pp_dyn(int* path, struct dp_matrix *dp,const int* prof1,const int* prof2,const int len_a,const int len_b);
+
+int* pp_dyn(int* path, struct dp_matrix *dp,const float* prof1,const float* prof2,const int len_a,const int len_b);
+int* ps_dyn(int* path, struct dp_matrix *dp,const float* prof1,const int* seq2,const int len_a,const int len_b,int sip);
+int* ss_dyn(float**subm,int* path, struct dp_matrix *dp,const int* seq1,const int* seq2,const int len_a,const int len_b);
+
+int* mirror_path(int* path);
+
+float* make_profile(float* prof,int* seq,int len, float** subm);
+float* dna_make_profile(float* prof,int* seq,int len, float** subm);
+
+float* update(const float*profa, const float* profb,float* newp,int* path,int sipa,int sipb);
+float* dna_update(const float*profa,const float* profb,float* newp,int* path,int sipa,int sipb);
+
+void set_gap_penalties(float* prof,int len,int nsip);
+void dna_set_gap_penalties(float* prof,int len,int nsip);
+
+float** protein_pairwise_alignment_distance(struct alignment* aln,float** dm,struct parameters* param,float**subm, int nj);
+float get_distance_from_pairwise_alignment(int* path,int* seq1,int* seq2);
+
+float** protein_wu_distance2(struct alignment* si,float** dm,struct parameters* param);
+float protein_wu_distance_calculation2(struct node* hash[],int* seq,int seqlen,int diagonals,int mode);
+
+float** protein_wu_distance(struct alignment* si,float** dm,struct parameters* param, int nj);
+//float protein_wu_distance_calculation(struct node* hash[],int* seq,int seqlen,int diagonals,int mode);
+
+float protein_wu_distance_calculation(struct bignode* hash[], const int* seq, const int seqlen,const int diagonals, const float mode);
+
+float** dna_distance(struct alignment* si,float** dm,struct parameters* param,int nj);
+float dna_distance_calculation(struct bignode* hash[],int* p,int seqlen,int diagonals,float mode);
+
+
+int byg_detect(int* text,int n);
+
+int check_identity(char* n,char*m);
+
+int byg_count(char* pattern,char*text);
+int byg_start(char* pattern,char*text);
+int byg_end(char* pattern,char*text);
+
+struct node* insert(struct node *n, int pos);
+struct node* insert_hash(struct node *n, int pos);
+
+void remove_nodes(struct node *n);
+
+#ifndef MEMORY 
+void* tmalloc(int size);
+#endif
+
+
+struct alignment* aln_alloc(struct alignment* aln);
+void free_aln(struct alignment* aln);
+void free_param(struct parameters* param);
+void free_ft(struct feature* n);
+
+int* pp_dyn2(int* path, struct dp_matrix *dp,const int* prof1,const int* prof2,const int len_a,const int len_b);
+int* ps_dyn2(int* path, struct dp_matrix *dp,const int* prof1,const int* seq2,const int len_a,const int len_b,int sip);
+int* ss_dyn2(int**subm,int* path, struct dp_matrix *dp,const int* seq1,const int* seq2,const int len_a,const int len_b);
+
+
+float* make_profile2(float* prof, int* seq,int len, float** subm);
+void set_gap_penalties2(float* prof,int len,int nsip,int window,float strength);
+float* update2(const float* profa,const float* profb,float* newp,int* path,int sipa,int sipb,float internal_gap_weight);
+
+struct feature_matrix* get_feature_matrix(struct feature_matrix* fm, struct alignment* aln,char* requested_feature);
+void free_utf(struct utype_ufeat* utf);
+void free_feature_matrix(struct feature_matrix* fm);
+
+struct utype_ufeat* get_unique_features(struct alignment* aln,struct utype_ufeat* utf);
+struct utype_ufeat* traverse_ft(struct utype_ufeat* utf,struct feature* n);
+struct feature* add_unique_feature(struct feature *n, struct feature *toadd);
+struct feature* add_unique_type(struct feature *n, struct feature *toadd);
+
+int** default_alignment(struct alignment* aln,int* tree, float**submatrix, int** map);
+int** feature_alignment(struct alignment* aln,int* tree,float**submatrix, int** map,struct feature_matrix* fm);
+int** test_alignment(struct alignment* aln,int* tree,float**submatrix, int** map,float internal_gap_weight,int window,float strength);
+
+
+
+struct ntree_data* ntree_alignment(struct ntree_data* ntree_data);
+struct ntree_data* ntree_sub_alignment(struct ntree_data* ntree_data,int* tree,int num);
+
+float* make_feature_profile(float* prof,struct feature* f,int len,struct feature_matrix* fm);
+float*  feature_update(const float* profa, const float* profb,float* newp,int* path,int stride);
+
+void printtree(struct aln_tree_node* p);
+
+struct ntree_data* alignntree(struct ntree_data* ntree_data,struct aln_tree_node* p);
+
+//int** alignntree(struct alignment* aln,int** submatrix, struct aln_tree_node* p,int** map,int ntree);
+void ntreeify(struct aln_tree_node* p,int ntree);
+
+struct tree_node* simpleinsert(struct tree_node* p,int target, int new_edge,int leaf_label);
+void printsimpleTree(struct tree_node* p);
+int* ticker(int* milometer,int elements);
+int* readsimpletree(struct tree_node* p,int* tree);
+int add_label_simpletree(struct tree_node* p,int* nodes,int i);
+//int** find_best_topology(struct alignment* aln,int**submatrix,int** map,int* leaves,int* nodes,int ntree);
+void free_real_tree(struct aln_tree_node* p);
+struct ntree_data* find_best_topology(struct ntree_data* ntree_data,int* leaves,int* nodes);
+void freesimpletree(struct tree_node* p);
+
+struct aln_tree_node* real_nj(float **dm,int ntree);
+
+//int** alter_gaps_alignment(struct alignment* aln,int* tree,int**submatrix, int** map,int n,float range,int weight);
+//void add_feature_information_from_alignment(int* path,int* fprof1,int* fprof2,int weight);
+
+struct alignment* protein_wu_sw(struct node* hash[],struct alignment* aln,int a,int b);
+float protein_wu_distance_calculation3(struct node* hash[],int* seq,int seqlen,int diagonals,int mode);
+float* make_wu_profile(float* prof,float* wu,int len);
+
+//int** aa_alignment(struct alignment* aln,int* tree,int**submatrix, int** map,int mmbonus);
+//int* aapp_dyn(int* path, struct dp_matrix *dp,const int* prof1,const int* prof2,const int len_a,const int len_b,const int mmbonus);
+
+
+
+
+int** hirschberg_alignment(struct alignment* aln,int* tree,float**submatrix, int** map,int window,float strength);
+//int* foward_pp_dyn(int* path, struct dp_matrix *dp,const float* prof1,const float* prof2,const int len_a,const int len_b);
+//int* backward_pp_dyn(int* path, struct dp_matrix *dp,const float* prof1,const float* prof2,const int len_a,const int len_b);
+
+
+
+
+struct hirsch_mem* hirsch_mem_alloc(struct hirsch_mem* hm,int x);
+struct hirsch_mem* hirsch_mem_realloc(struct hirsch_mem* hm,int x);
+void hirsch_mem_free(struct hirsch_mem* hm);
+
+int* mirror_hirsch_path(int* hirsch_path,int len_a,int len_b);
+int* add_gap_info_to_hirsch_path(int* hirsch_path,int len_a,int len_b);
+
+//DNA alignment via hirsch/Myer Miller
+
+int** dna_alignment(struct alignment* aln,int* tree,float**submatrix, int** map);
+
+
+struct alignment* make_seq(struct alignment* aln,int a,int b,int* path);
+void update_gaps(int old_len,int*gis,int new_len,int *newgaps);
+//void print_alignment(struct alignment* aln);
+
+struct alignment* sort_in_relation(struct alignment* aln,char* sort);
+void quickSort(struct alignment* aln, int array_size);
+void q_sort(struct alignment* aln, int left, int right);
+
+void smooth_gaps(float* prof,int len,int window,float strength);
+
+
+
+int** advanced_hirschberg_alignment(struct alignment* aln,int* tree,float**submatrix, int** map,int window,float strength,float internal_gap_weight);
+
+int** simple_hirschberg_alignment(struct alignment* aln,int* tree,float**submatrix, int** map);
+
+float* simple_make_profile(float* prof, int* seq,int len, float** subm);
+float* simple_update(float* profa,float* profb, float* newp,int* path);
+
+int* simple_hirsch_pp_dyn(const float* prof1,const float* prof2,struct hirsch_mem* hm, int* hirsch_path);
+int* simple_hirsch_align_two_pp_vector(const float* prof1,const float* prof2,struct hirsch_mem* hm,int* hirsch_path,float input_states[],int old_cor[]);
+struct states* simple_foward_hirsch_pp_dyn(const float* prof1,const float* prof2,struct hirsch_mem* hm);
+struct states* simple_backward_hirsch_pp_dyn(const float* prof1,const float* prof2,struct hirsch_mem* hm);
+
+int** feature_hirschberg_alignment(struct alignment* aln,int* tree,float**submatrix, int** map,struct feature_matrix* fm);
+
+void profile_alignment_main(struct alignment* aln,struct parameters* param,float** submatrix);
+
+
+void increase_gaps(float* prof,int len,int window,float strength);
+
+
+struct names* names_alloc(struct names* n);
+void names_free(struct names* n);
+
+
+void print_tree(struct aln_tree_node* p,struct alignment* aln,char* outfile);
+void print_newick_tree(struct aln_tree_node* p,struct alignment* aln, FILE *fout);
+void print_phyloxml_tree(struct aln_tree_node* p,struct alignment* aln,FILE *fout);
+
+
+struct alignment* phylo (struct alignment* aln,char* outfile);
+
+
+
+

Added: trunk/packages/kalign/branches/upstream/current/kalign2_advanced_gaps.c
===================================================================
--- trunk/packages/kalign/branches/upstream/current/kalign2_advanced_gaps.c	2006-11-19 13:38:57 UTC (rev 159)
+++ trunk/packages/kalign/branches/upstream/current/kalign2_advanced_gaps.c	2006-11-29 14:12:29 UTC (rev 160)
@@ -0,0 +1,1010 @@
+/*
+	kalign2_advanced_gaps.c
+	
+	Released under GPL - see the 'COPYING' file   
+	
+	Copyright (C) 2006 Timo Lassmann <timolassmann at gmail.com>
+	
+	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
+	any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+    
+	Please send bug reports, comments etc. to:
+	timolassmann at gmail.com
+*/
+
+#include "kalign2.h"
+#include "kalign2_advanced_gaps.h"
+
+int** advanced_hirschberg_alignment(struct alignment* aln,int* tree,float**submatrix, int** map,int window,float strength,float internal_gap_weight)
+{
+	struct hirsch_mem* hm = 0;
+	int i,j,g,a,b,c;
+	int len_a;
+	int len_b;
+	float** profile = 0;
+
+	profile = malloc(sizeof(float*)*numprofiles);
+	for ( i = 0;i< numprofiles;i++){
+		profile[i] = 0;
+	}
+
+	map = malloc(sizeof(int*)*numprofiles);
+	for ( i = 0;i < numprofiles;i++){
+		map[i] = 0;
+	}
+	
+	hm = hirsch_mem_alloc(hm,1024);
+
+	fprintf(stderr,"\nAlignment:\n");
+
+	for (i = 0; i < (numseq-1);i++){
+		a = tree[i*3];
+		b = tree[i*3+1];
+		c = tree[i*3+2];
+		fprintf(stderr,"\r%8.0f percent done",(float)(i) /(float)numseq * 100);
+	//	fprintf(stderr,"Aligning:%d %d->%d	done:%f\n",a,b,c,((float)(i+1)/(float)numseq)*100);
+		len_a = aln->sl[a];
+		len_b = aln->sl[b];
+
+		
+		g = (len_a > len_b)? len_a:len_b;
+		map[c] = malloc(sizeof(int) * (g+2));
+		if(g > hm->size){
+			hm = hirsch_mem_realloc(hm,g);
+		}
+
+		for (j = 0; j < (g+2);j++){
+		//	hirsch_path[j] = -1;
+			map[c][j] = -1;
+		//	map[c][j] = 0;
+		}
+	//	map[c][0] = len_a;
+		//map[c][len_a+len_b+1] = 3;
+
+		if (a < numseq){
+			profile[a] = advanced_make_profile(profile[a],aln->s[a],len_a,submatrix);
+		}
+		if (b < numseq){
+			profile[b] = advanced_make_profile(profile[b],aln->s[b],len_b,submatrix);
+		}
+		
+	
+		//set_gap_penalties(profile[a],len_a,aln->nsip[b]);
+		
+		advanced_smooth_gaps(profile[a],len_a,window,strength);
+		
+		//set_gap_penalties(profile[b],len_b,aln->nsip[a]);
+		
+		advanced_smooth_gaps(profile[b],len_b,window,strength);
+		
+		hm->starta = 0;
+		hm->startb = 0;
+		hm->enda = len_a;
+		hm->endb = len_b;
+		hm->len_a = len_a;
+		hm->len_b = len_b;
+		
+		hm->f[0].a = 0.0;
+		hm->f[0].ga =  -FLOATINFTY;
+		hm->f[0].gb = -FLOATINFTY;
+		hm->b[0].a = 0.0;
+		hm->b[0].ga =  -FLOATINFTY;
+		hm->b[0].gb =  -FLOATINFTY;
+	//	fprintf(stderr,"LENA:%d	LENB:%d	numseq:%d\n",len_a,len_b,numseq);
+		if(len_a < len_b){
+			map[c] = advanced_hirsch_pp_dyn(profile[a],profile[b],hm,map[c]);
+		}else{
+			hm->enda = len_b;
+			hm->endb = len_a;
+			hm->len_a = len_b;
+			hm->len_b = len_a;
+			map[c] = advanced_hirsch_pp_dyn(profile[b],profile[a],hm,map[c]);
+			map[c] = mirror_hirsch_path(map[c],len_a,len_b);
+		}
+					
+		map[c] = add_gap_info_to_hirsch_path(map[c],len_a,len_b);
+
+		if(i != numseq-2){
+			profile[c] = malloc(sizeof(float)*64*(map[c][0]+2));
+			profile[c] = advanced_update(profile[a],profile[b],profile[c],map[c],aln->nsip[a],aln->nsip[b],internal_gap_weight);
+		}
+			
+		aln->sl[c] = map[c][0];
+	
+		aln->nsip[c] = aln->nsip[a] + aln->nsip[b];
+		aln->sip[c] = malloc(sizeof(int)*(aln->nsip[a] + aln->nsip[b]));
+		g =0;
+		for (j = aln->nsip[a];j--;){
+			aln->sip[c][g] = aln->sip[a][j];
+			g++;
+		}
+		for (j = aln->nsip[b];j--;){
+			aln->sip[c][g] = aln->sip[b][j];
+			g++;
+		}
+
+		free(profile[a]);
+		free(profile[b]);
+	}
+	fprintf(stderr,"\r%8.0f percent done\n",100.0);
+	free(profile);
+	hirsch_mem_free(hm);
+	for (i = 32;i--;){
+		free(submatrix[i]);
+	}
+	free(submatrix);
+	return map;
+}
+
+
+float* advanced_make_profile(float* prof, int* seq,int len,float** subm)
+{
+	int i,j,c;	
+	prof = malloc(sizeof(float)*(len+2)*64);
+	prof +=  (64 *(len+1));
+
+	for (i = 0;i < 64;i++){
+		prof[i] = 0;
+	}
+	prof[23+32] = -gpo;
+	prof[24+32] = -gpe;
+	prof[25+32] = -tgpe;
+	prof[26] = 1;
+
+	
+	i = len;
+	while(i--){
+		prof -= 64;
+
+		for (j = 0;j < 64;j++){
+			prof[j] = 0;
+		}
+		prof[26] = 1;//number of residues // both additive
+		c = seq[i];
+		
+		prof[c] += 1.0;
+		
+		prof += 32;
+		
+		for(j = 23;j--;){
+			prof[j] = subm[c][j];
+		}
+		prof[23] = -gpo;
+		prof[24] = -gpe;
+		prof[25] = -tgpe;
+		
+		prof -= 32;
+	}
+	prof -= 64;
+	for (i = 0;i < 64;i++){
+		prof[i] = 0;
+	}
+
+	prof[23+32] = -gpo;
+	prof[24+32] = -gpe;
+	prof[25+32] = -tgpe;
+	prof[26] = 1;
+	return prof;
+}
+
+
+
+void advanced_smooth_gaps(float* prof,int len,int window,float strength)
+{
+	float tmp_gpo;
+	float tmp_gpe;
+	float tmp_tgpe;
+	int i,j;
+	if(!(window &1)){
+		window--;
+	}
+	for ( i = (window/2); i < len - (window/2);i++){
+		tmp_gpo = 0.0;
+		tmp_gpe = 0.0;
+		tmp_tgpe = 0.0;
+		for (j = -(window/2); j < (window/2);j++){
+			tmp_gpo += (float)prof[55+((i+j)*64)]*strength;
+			tmp_gpe += (float) prof[56+((i+j)*64)]*strength;
+			tmp_tgpe += (float) prof[57+((i+j)*64)]*strength;
+		}
+		tmp_gpo /= window;
+		tmp_gpe /= window;
+		tmp_tgpe /= window;
+		prof[27+(i*64)] =  prof[55+(i*64)]*(1.0-strength) + tmp_gpo;
+		prof[28+(i*64)] =  prof[56+(i*64)]*(1.0-strength) + tmp_gpe;
+		prof[29+(i*64)] =  prof[57+(i*64)]*(1.0-strength) + tmp_tgpe;
+	}
+}
+
+
+
+float* advanced_update(const float* profa,const float* profb,float* newp,int* path,int sipa,int sipb,float internal_gap_weight)
+{
+	int i,j,c;
+	for (i = 64; i--;){
+		newp[i] = profa[i] + profb[i];
+	}
+	
+	profa += 64;
+	profb += 64;
+	newp += 64;
+
+	c = 1;
+	
+	while(path[c] != 3){
+		//Idea: limit the 'virtual' number of residues of one type to x.
+		// i.e. only allow a maximum of 10 alanines to be registered in each column
+		// the penalty for aligning a 'G' to this column will stay stable even when many (>10) alanines are present.
+		// the difference in score between the 'correct' (all alanine) and incorrect (alanines + glycine) will not increase 
+		// with the number of sequences. -> see Durbin pp 140
+		
+		if (!path[c]){
+			//fprintf(stderr,"Align	%d\n",c);
+			for (i = 64; i--;){
+				newp[i] = profa[i] + profb[i];
+			}
+				
+			
+			profa += 64;
+			profb += 64;
+		}
+		if (path[c] & 1){
+			//fprintf(stderr,"Gap_A:%d\n",c);
+			//printf("open:%d	ext:%d	%d	%d\n",si->nsip[a] * gpo,si->nsip[a] * gpe,si->nsip[a] * profb[41],si->nsip[a] * profb[46]);
+			for (i = 64; i--;){
+				newp[i] = profb[i];
+			}
+			profb += 64;
+			if(!(path[c] & 20)){
+				if(path[c] & 32){
+					newp[25] += (profa[26] + ((sipa-  profa[26]) * internal_gap_weight));
+					i = tgpe* (profa[26] + ((sipa-  profa[26]) * internal_gap_weight));
+				}else{
+					newp[24] +=  (profa[26] + ((sipa-  profa[26]) * internal_gap_weight));//1;
+					i = gpe* (profa[26] + ((sipa-  profa[26]) * internal_gap_weight));
+				}
+				
+				for (j = 32; j < 55;j++){
+					newp[j] -=i;
+				}
+			}else{
+			if (path[c] & 16){ 
+	//			fprintf(stderr,"close_open");
+				if(path[c] & 32){
+					newp[25] +=  (profa[26] + ((sipa-  profa[26]) * internal_gap_weight));//1;
+					i = tgpe* (profa[26] + ((sipa-  profa[26]) * internal_gap_weight));
+					newp[23] +=  (profa[26] + ((sipa-  profa[26]) * internal_gap_weight));//1;
+					i += gpo* (profa[26] + ((sipa-  profa[26]) * internal_gap_weight));
+				}else{
+					newp[23] +=  (profa[26] + ((sipa-  profa[26]) * internal_gap_weight));
+					i = gpo* (profa[26] + ((sipa-  profa[26]) * internal_gap_weight));
+				}
+								
+				for (j = 32; j < 55;j++){
+					newp[j] -=i;
+				}
+			}
+			if (path[c] & 4){ 
+	//			fprintf(stderr,"Gap_open");
+				if(path[c] & 32){
+					newp[25] +=  (profa[26] + ((sipa-  profa[26]) * internal_gap_weight));
+					i = tgpe* (profa[26] + ((sipa-  profa[26]) * internal_gap_weight));
+					newp[23] +=  (profa[26] + ((sipa-  profa[26]) * internal_gap_weight));
+					i += gpo* (profa[26] + ((sipa-  profa[26]) * internal_gap_weight));
+				}else{
+					newp[23] +=  (profa[26] + ((sipa-  profa[26]) * internal_gap_weight));
+					i = gpo* (profa[26] + ((sipa-  profa[26]) * internal_gap_weight));
+				}
+				for (j = 32; j < 55;j++){
+					newp[j] -=i;
+				}
+			}
+			}
+			
+			
+		}
+		if (path[c] & 2){
+			//fprintf(stderr,"Gap_B:%d\n",c);
+			//printf("open:%d	ext:%d	%d	%d\n",si->nsip[b] * gpo,si->nsip[b] * gpe,profa[26],profa[27]);
+			for (i = 64; i--;){
+				newp[i] = profa[i];
+			}
+			profa+=64;
+			if(!(path[c] & 20)){
+				if(path[c] & 32){
+					newp[25] +=  (profb[26] + ((sipb-  profb[26]) * internal_gap_weight));
+					i = tgpe*(profb[26] + ((sipb-  profb[26]) * internal_gap_weight));
+				}else{
+					newp[24] += (profb[26] + ((sipb-  profb[26]) * internal_gap_weight));//1;
+					i = gpe*(profb[26] + ((sipb-  profb[26]) * internal_gap_weight));
+				}
+				for (j = 32; j < 55;j++){
+					newp[j] -=i;
+				}
+			}else{
+			if (path[c] & 16){
+	//			fprintf(stderr,"close_open");
+				if(path[c] & 32){
+					newp[25] += (profb[26] + ((sipb-  profb[26]) * internal_gap_weight));//1;
+					i =  tgpe*(profb[26] + ((sipb-  profb[26]) * internal_gap_weight));
+					newp[23] += (profb[26] + ((sipb-  profb[26]) * internal_gap_weight));//1;
+					i +=  gpo*(profb[26] + ((sipb-  profb[26]) * internal_gap_weight));
+				}else{
+					newp[23] += (profb[26] + ((sipb-  profb[26]) * internal_gap_weight));//1;
+					i =  gpo*(profb[26] + ((sipb-  profb[26]) * internal_gap_weight));
+				}
+				for (j = 32; j < 55;j++){
+					newp[j] -=i;
+				}
+			}
+			if (path[c] & 4){
+	//			fprintf(stderr,"Gap_open");
+				if(path[c] & 32){
+					newp[25] +=(profb[26] + ((sipb-  profb[26]) * internal_gap_weight));//1;
+					i = tgpe*(profb[26] + ((sipb-  profb[26]) * internal_gap_weight));
+					newp[23] += (profb[26] + ((sipb-  profb[26]) * internal_gap_weight));//1;
+					i += gpo*(profb[26] + ((sipb-  profb[26]) * internal_gap_weight));
+				}else{
+					newp[23] += (profb[26] + ((sipb-  profb[26]) * internal_gap_weight));//1;
+					i = gpo*(profb[26] + ((sipb-  profb[26]) * internal_gap_weight));
+				}
+				
+				for (j = 32; j < 55;j++){
+					newp[j] -=i;
+				}
+			}
+			}
+			
+		}
+		newp += 64;
+		c++;
+	}
+	for (i = 64; i--;){
+		newp[i] =  profa[i] + profb[i];
+	}	
+	newp -= (path[0]+1) *64;
+	return newp;
+}
+
+
+
+int* advanced_hirsch_pp_dyn(const float* prof1,const float* prof2,struct hirsch_mem* hm, int* hirsch_path)
+{
+	int mid = ((hm->enda - hm->starta) / 2)+ hm->starta;
+	float input_states[6] = {hm->f[0].a,hm->f[0].ga,hm->f[0].gb,hm->b[0].a,hm->b[0].ga,hm->b[0].gb};
+	int old_cor[5] = {hm->starta,hm->enda,hm->startb,hm->endb,mid};
+
+	
+	//fprintf(stderr,"starta:%d enda:%d startb:%d endb:%d mid:%d\n",hm->starta,hm->enda,hm->startb,hm->endb,mid);
+	
+	
+	if(hm->starta  >= hm->enda){
+		return hirsch_path;
+	}
+	if(hm->startb  >= hm->endb){
+		return hirsch_path;
+	}
+
+	hm->enda = mid;
+	hm->f = advanced_foward_hirsch_pp_dyn(prof1,prof2,hm);
+	/*int i;
+	fprintf(stderr,"FOWARD\n");
+	for (i = hm->startb; i <= hm->endb;i++){
+		fprintf(stderr,"%d	%d	%d\n",hm->f[i].a,hm->f[i].ga,hm->f[i].gb);
+	}*/
+
+	hm->starta = mid;
+	hm->enda = old_cor[1];
+	hm->b = advanced_backward_hirsch_pp_dyn(prof1,prof2,hm);
+	/*fprintf(stderr,"BaCKWARD\n");
+
+	for (i = hm->startb; i <= hm->endb;i++){
+		fprintf(stderr,"%d	%d	%d\n",hm->b[i].a,hm->b[i].ga,hm->b[i].gb);
+	}*/
+
+	hirsch_path = advanced_hirsch_align_two_pp_vector(prof1,prof2,hm,hirsch_path,input_states,old_cor);
+	return hirsch_path;
+}
+
+
+
+int* advanced_hirsch_align_two_pp_vector(const float* prof1,const float* prof2,struct hirsch_mem* hm,int* hirsch_path,float input_states[],int old_cor[])
+{
+	struct states* f = hm->f;
+ 	struct states* b = hm->b;
+	int i,j,c;
+	int transition = -1;
+	
+	
+	//code:
+	// a -> a = 1
+	// a -> ga = 2
+	// a -> gb = 3
+	// ga ->ga = 4
+	// ga -> a = 5
+	//gb->gb = 6;
+	//gb->a = 7;
+	
+	//int max = -INFTY;
+	float max = -INFTY;	
+	float middle =  (hm->endb - hm->startb)/2 + hm->startb;
+	float sub = 0.0;
+	
+
+	prof1+= (64 * (old_cor[4]+1));
+	prof2 += 64 * (hm->startb);
+	i = hm->startb;
+	c = -1;
+	for(i = hm->startb; i < hm->endb;i++){
+		sub = abs(middle -i);
+		sub /= 1000; 
+		prof2 += 64;
+		//fprintf(stderr,"%d	%d	%d \n",f[i].a,b[i].a,max);
+		if(f[i].a+b[i].a-sub > max){
+			max = f[i].a+b[i].a-sub;
+	//		fprintf(stderr,"aligned->aligned:%d + %d = %d\n",f[i].a,b[i].a,f[i].a+b[i].a);
+			transition = 1;
+			c = i;
+		}
+		if(f[i].a+b[i].ga+prof2[27]*prof1[26]-sub > max){
+			max = f[i].a+b[i].ga+prof2[27]*prof1[26]-sub;
+	//		fprintf(stderr,"aligned->gap_a:%d + %d +%d = %d\n",f[i].a,b[i].ga,prof1[27],f[i].a+b[i].ga+prof2[27]);
+			transition = 2;
+			c = i;
+		}
+		if(f[i].a+b[i].gb+prof1[27]*prof2[26] -sub> max){
+			max = f[i].a+b[i].gb+prof1[27]*prof2[26]-sub;
+	//		fprintf(stderr,"aligned->gap_b:%d + %d +%d = %d\n",f[i].a,b[i].gb,prof1[27],f[i].a+b[i].gb+prof1[27]);
+			transition = 3;
+			c = i;
+		}
+		if(f[i].ga+b[i].a+prof2[27]*prof1[26]-sub > max){
+			max = f[i].ga+b[i].a+prof2[27]*prof1[26]-sub;
+	//		fprintf(stderr,"gap_a->aligned:%d + %d + %d(gpo) = %d\n",f[i].ga,b[i].a,prof2[27],f[i].ga+b[i].a+prof2[27]);
+			transition = 5;
+			c = i;
+		}
+
+
+		if(hm->startb == 0){
+			if(f[i].gb+b[i].gb+prof1[29]*prof2[26]-sub > max){
+				max = f[i].gb+b[i].gb+prof1[29]*prof2[26]-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+				transition = 6;
+				c = i;
+			}
+		}else{
+			if(f[i].gb+b[i].gb+prof1[28]*prof2[26]-sub > max){
+				max = f[i].gb+b[i].gb+prof1[28]*prof2[26]-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+				transition = 6;
+				c = i;
+			}
+		}
+		if(f[i].gb+b[i].a+prof1[27]*prof2[26]-sub > max){
+			max = f[i].gb+b[i].a+prof1[27]*prof2[26]-sub;
+	//		fprintf(stderr,"gap_b->aligned:%d + %d + %d(gpo) = %d\n",f[i].gb,b[i].a,prof1[27],f[i].gb+b[i].a+prof1[27]);
+			transition = 7;
+			c = i;
+		}
+	}
+	i = hm->endb;
+	sub = abs(middle -i);
+	sub /= 1000; 
+	if(f[i].a+b[i].gb+prof1[27]*prof2[26]-sub > max){
+		max = f[i].a+b[i].gb+prof1[27]*prof2[26]-sub;
+	//		fprintf(stderr,"aligned->gap_b:%d + %d +%d = %d\n",f[i].a,b[i].gb,prof1[27],f[i].a+b[i].gb+prof1[27]);
+		transition = 3;
+		c = i;
+	}
+	if(hm->endb == hm->len_b){
+		if(f[i].gb+b[i].gb+prof1[29]*prof2[26]-sub > max){
+			max = f[i].gb+b[i].gb+prof1[29]*prof2[26]-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+			transition = 6;
+			c = i;
+		}	
+	}else{
+		if(f[i].gb+b[i].gb+prof1[28]*prof2[26]-sub > max){
+			max = f[i].gb+b[i].gb+prof1[28]*prof2[26]-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+			transition = 6;
+			c = i;
+		}
+	}
+	
+	
+	
+	prof1-= (64 * (old_cor[4]+1));
+	prof2 -= hm->endb << 6;
+	
+	//fprintf(stderr,"Transition:%d	at:%d\n",transition,c);
+	//if(transition == -1){
+	//	exit(0);
+	//}
+	
+	j = hirsch_path[0];
+	switch(transition){
+		case 1: //a -> a = 1
+			
+			hirsch_path[old_cor[4]] = c;
+			hirsch_path[old_cor[4]+1] = c+1;
+			
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4],c);
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4]+1,c+1);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = 0.0;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = -FLOATINFTY;
+	//		fprintf(stderr,"Using this for start:%d	%d	%d\n",hm->f[0].a,hm->f[0].ga,hm->f[0].gb);
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = advanced_hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = 0.0;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d  what:%d-%d	%d-%d\n",c+1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = advanced_hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+			break;
+		case 2:// a -> ga = 2
+			
+			hirsch_path[old_cor[4]] = c;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4],c);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = 0.0;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = -FLOATINFTY;
+			
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = advanced_hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4];
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = -INFTY;
+			hm->f[0].ga = 0.0;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d  what:%d-%d	%d-%d\n",c+1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = advanced_hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+			break;
+		case 3:// a -> gb = 3
+			
+			hirsch_path[old_cor[4]] = c;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4],c);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = 0.0;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = -FLOATINFTY;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = advanced_hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c;
+			hm->endb = old_cor[3];
+			hm->f[0].a = -FLOATINFTY;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = 0.0;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = advanced_hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+			break;
+		case 5://ga -> a = 5
+			hirsch_path[old_cor[4]+1] = c+1;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4]+1,c+1);
+
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = -FLOATINFTY;
+			hm->b[0].ga = 0.0;
+			hm->b[0].gb = -FLOATINFTY;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4];
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = advanced_hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = 0.0;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = advanced_hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+			break;
+		case 6://gb->gb = 6;
+			
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = -FLOATINFTY;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = 0.0;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			hm->startb = old_cor[2];
+			hm->endb = c;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = advanced_hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c;
+			hm->endb = old_cor[3];
+			hm->f[0].a = -FLOATINFTY;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = 0.0;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = advanced_hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+			break;
+		case 7://gb->a = 7;
+			
+			hirsch_path[old_cor[4]+1] = c+1;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4]+1,c+1);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = -FLOATINFTY;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = 0.0;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			hm->startb = old_cor[2];
+			hm->endb = c;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = advanced_hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = 0.0;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = advanced_hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+			break;
+	}
+		
+	return hirsch_path;
+}
+
+
+
+struct states* advanced_foward_hirsch_pp_dyn(const float* prof1,const float* prof2,struct hirsch_mem* hm)
+{
+	unsigned int freq[26];
+	struct states* s = hm->f;
+
+	register float pa = 0;
+	register float pga = 0;
+	register float pgb = 0;
+	register float ca = 0;
+	register int i = 0;
+	register int j = 0;
+	register int c = 0;
+	
+	
+	
+	prof1 += (hm->starta) << 6;
+	prof2 +=  (hm->startb) << 6;
+	s[hm->startb].a = s[0].a;
+	s[hm->startb].ga = s[0].ga;
+	s[hm->startb].gb = s[0].gb;
+	if(hm->startb == 0){
+		for (j = hm->startb+1; j < hm->endb;j++){
+			prof2+=64;
+			s[j].a = -FLOATINFTY;
+			
+			s[j].ga = s[j-1].a+prof2[29]*prof1[26];
+			if (s[j-1].ga+prof2[29]*prof1[26] > s[j].ga){
+				s[j].ga = s[j-1].ga+prof2[29]*prof1[26];
+			}
+			s[j].gb = -FLOATINFTY;
+		}	
+		prof2+=64;	
+	}else{
+
+		for (j = hm->startb+1; j < hm->endb;j++){
+			prof2+=64;
+			s[j].a = -FLOATINFTY;
+			
+			s[j].ga = s[j-1].a+prof2[27]*prof1[26];
+			if (s[j-1].ga+prof2[28]*prof1[26] > s[j].ga){
+				s[j].ga = s[j-1].ga+prof2[28]*prof1[26];
+			}
+			s[j].gb = -FLOATINFTY;
+		//	prof2+=64;
+		}
+		prof2+=64;
+	}
+	
+	prof2 -= (hm->endb-hm->startb) << 6;
+	
+	s[hm->endb].a = -FLOATINFTY;
+	s[hm->endb].ga = -FLOATINFTY;
+	s[hm->endb].gb = -FLOATINFTY;
+
+
+	for (i = hm->starta;i < hm->enda;i++){
+		prof1 += 64;
+		c = 1;
+		for (j = 26; j--;){
+			if(prof1[j]){
+				freq[c] = j;
+				c++;
+			}
+		}
+		freq[0] = c;
+			
+		pa = s[hm->startb].a;
+		pga = s[hm->startb].ga;
+		pgb = s[hm->startb].gb;
+		if(hm->startb == 0){
+			s[hm->startb].a = -FLOATINFTY;
+			s[hm->startb].ga = -FLOATINFTY;
+		
+			s[hm->startb].gb = pa+prof1[29] * prof2[26];
+				if(pgb+prof1[29] * prof2[26] > s[hm->startb].gb){
+				s[hm->startb].gb = pgb+prof1[29] * prof2[26];
+			}
+		}else{
+			s[hm->startb].a = -FLOATINFTY;
+			s[hm->startb].ga = -FLOATINFTY;
+		
+			s[hm->startb].gb = pa+prof1[27]*prof2[26];
+			if(pgb+prof1[28]*prof2[26] > s[hm->startb].gb){
+				s[hm->startb].gb = pgb+prof1[28]*prof2[26];
+			}
+		}
+		for (j = hm->startb+1; j <= hm->endb;j++){
+			prof2 += 64;
+			ca = s[j].a;
+			
+			if((pga += prof2[27-64]*prof1[26-64]) > pa){ 
+				pa = pga;
+			}
+
+			if((pgb += prof1[27-64]*prof2[26-64]) > pa){
+				pa = pgb;
+			}
+			
+			prof2 += 32;
+			for (c = freq[0];--c;){
+				pa += prof1[freq[c]]*prof2[freq[c]];
+			}
+			prof2 -= 32;	
+
+			s[j].a = pa;
+			
+			pga = s[j].ga;
+			
+			s[j].ga = s[j-1].a+prof2[27]*prof1[26];
+			if (s[j-1].ga+prof2[28]*prof1[26] > s[j].ga){
+				s[j].ga = s[j-1].ga+prof2[28]*prof1[26];
+			}
+			
+			pgb = s[j].gb;
+			
+			s[j].gb = ca+prof1[27]*prof2[26];
+			if(pgb+prof1[28]*prof2[26] > s[j].gb){
+				s[j].gb = pgb+prof1[28]*prof2[26];
+			}
+			pa = ca;
+		}
+		prof2 -= (hm->endb-hm->startb) << 6;
+		
+	}
+	prof1 -= 64 * (hm->enda);
+	return s;
+}
+
+struct states* advanced_backward_hirsch_pp_dyn(const float* prof1,const float* prof2,struct hirsch_mem* hm)
+{
+	unsigned int freq[26];
+	struct states* s = hm->b;
+	
+	register float pa = 0;
+	register float pga = 0;
+	register float pgb = 0;
+	register float ca = 0;
+	register int i = 0;
+	register int j = 0;
+	register int c = 0;
+
+	prof1 += (hm->enda+1) << 6;
+	prof2 += (hm->endb+1) << 6;
+	s[hm->endb].a = s[0].a;
+	s[hm->endb].ga = s[0].ga;
+	s[hm->endb].gb = s[0].gb;
+	
+	
+	//init of first row;
+	//j = endb-startb;
+	if(hm->endb == hm->len_b){
+		
+		for(j = hm->endb-1;j > hm->startb;j--){
+			prof2 -= 64;
+			s[j].a = -FLOATINFTY;
+			
+			s[j].ga = s[j+1].a+prof2[29]*prof1[26];
+			if (s[j+1].ga+prof2[29]*prof1[26] > s[j].ga){
+				s[j].ga = s[j+1].ga+prof2[29]*prof1[26];
+			}
+			s[j].gb = -FLOATINFTY;
+		}
+		prof2 -= 64;
+	}else{
+		for(j = hm->endb-1;j > hm->startb;j--){
+			prof2 -= 64;
+			s[j].a = -FLOATINFTY;
+			
+			s[j].ga = s[j+1].a+prof2[27]*prof1[26];
+			if (s[j+1].ga+prof2[28]*prof1[26] > s[j].ga){
+				s[j].ga = s[j+1].ga+prof2[28]*prof1[26];
+			}
+			s[j].gb = -FLOATINFTY;
+		//	prof2 -= 64;
+		}
+		prof2 -= 64;
+	}
+	
+	s[hm->startb].a = -FLOATINFTY;
+	s[hm->startb].ga = -FLOATINFTY;
+	s[hm->startb].gb = -FLOATINFTY;
+//	prof2 -= (endb -startb) << 6;
+
+	i = hm->enda-hm->starta;
+	while(i--){
+		prof1 -= 64;
+
+		c = 1;
+		for (j = 26; j--;){
+			if(prof1[j]){
+				freq[c] = j;
+				c++;
+			}
+		}
+		freq[0] = c;
+		
+		pa = s[hm->endb].a;
+		pga = s[hm->endb].ga;
+		pgb = s[hm->endb].gb;
+		s[hm->endb].a = -FLOATINFTY;
+		s[hm->endb].ga = -FLOATINFTY;
+
+		if(hm->endb == hm->len_b){
+			s[hm->endb].gb = pa+prof1[29]*prof2[26];
+			if(pgb+prof1[29]*prof2[26] > s[hm->endb].gb){
+				s[hm->endb].gb = pgb+prof1[29]*prof2[26];
+			}
+		}else{
+			s[hm->endb].gb = pa+prof1[27]*prof2[26];
+			if(pgb+prof1[28]*prof2[26] > s[hm->endb].gb){
+				s[hm->endb].gb = pgb+prof1[28]*prof2[26];
+			}
+		}
+		//j = endb-startb;
+		prof2 += (hm->endb-hm->startb) << 6;
+		//while(j--){
+		for(j = hm->endb-1;j >= hm->startb;j--){
+			prof2 -= 64;
+			ca = s[j].a;
+			if((pga += prof2[64+27]*prof1[26]) > pa){
+				pa = pga;
+			}
+			if((pgb += prof1[64+27]*prof2[26]) > pa){
+				pa = pgb;
+			}
+			
+			prof2 += 32;
+			for (c = freq[0];--c;){
+				pa += prof1[freq[c]]*prof2[freq[c]];
+			}
+			prof2 -= 32;
+
+			s[j].a = pa;
+			
+			pga = s[j].ga;
+			
+			s[j].ga = s[j+1].a+prof2[27]*prof1[26];
+			if (s[j+1].ga+prof2[28]*prof1[26] > s[j].ga){
+				s[j].ga = s[j+1].ga+prof2[28]*prof1[26];
+			}
+			
+			pgb = s[j].gb;
+			
+			s[j].gb = ca+prof1[27]*prof2[26];
+			if(pgb+prof1[28]*prof2[26] > s[j].gb){
+				s[j].gb = pgb+prof1[28]*prof2[26];
+			}
+			pa = ca;
+		}
+	}		
+	return s;
+}
+
+

Added: trunk/packages/kalign/branches/upstream/current/kalign2_advanced_gaps.h
===================================================================
--- trunk/packages/kalign/branches/upstream/current/kalign2_advanced_gaps.h	2006-11-19 13:38:57 UTC (rev 159)
+++ trunk/packages/kalign/branches/upstream/current/kalign2_advanced_gaps.h	2006-11-29 14:12:29 UTC (rev 160)
@@ -0,0 +1,34 @@
+/*
+	kalign2_advanced_gaps.h
+	
+	Released under GPL - see the 'COPYING' file   
+	
+	Copyright (C) 2006 Timo Lassmann <timolassmann at gmail.com>
+	
+	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
+	any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+    
+	Please send bug reports, comments etc. to:
+	timolassmann at gmail.com
+*/
+
+void advanced_smooth_gaps(float* prof,int len,int window,float strength);
+float* advanced_make_profile(float* prof, int* seq,int len,float** subm);
+float* advanced_update(const float* profa,const float* profb,float* newp,int* path,int sipa,int sipb,float internal_gap_weight);
+
+
+int* advanced_hirsch_pp_dyn(const float* prof1,const float* prof2,struct hirsch_mem* hm, int* hirsch_path);
+int* advanced_hirsch_align_two_pp_vector(const float* prof1,const float* prof2,struct hirsch_mem* hm,int* hirsch_path,float input_states[],int old_cor[]);
+struct states* advanced_foward_hirsch_pp_dyn(const float* prof1,const float* prof2,struct hirsch_mem* hm);
+struct states* advanced_backward_hirsch_pp_dyn(const float* prof1,const float* prof2,struct hirsch_mem* hm);

Added: trunk/packages/kalign/branches/upstream/current/kalign2_alignment_types.c
===================================================================
--- trunk/packages/kalign/branches/upstream/current/kalign2_alignment_types.c	2006-11-19 13:38:57 UTC (rev 159)
+++ trunk/packages/kalign/branches/upstream/current/kalign2_alignment_types.c	2006-11-29 14:12:29 UTC (rev 160)
@@ -0,0 +1,888 @@
+/*
+	kalign2_alignment_types.c 
+	
+	Released under GPL - see the 'COPYING' file   
+	
+	Copyright (C) 2006 Timo Lassmann <timolassmann at gmail.com>
+	
+	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
+	any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+    
+	Please send bug reports, comments etc. to:
+	timolassmann at gmail.com
+*/
+
+#include "kalign2.h"
+
+int** default_alignment(struct alignment* aln,int* tree,float**submatrix, int** map)
+{
+	struct dp_matrix *dp = 0;
+	int i,j,g,a,b,c;
+	int len_a;
+	int len_b;
+	float** profile = 0;
+	float* profa = 0;
+	float* profb = 0;
+	
+	profile = malloc(sizeof(float*)*numprofiles);
+	for ( i = 0;i< numprofiles;i++){
+		profile[i] = 0;
+	}
+
+	map = malloc(sizeof(int*)*numprofiles);
+	for ( i = 0;i < numprofiles;i++){
+		map[i] = 0;
+	}
+	
+	
+	dp = dp_matrix_alloc(dp,511,511);
+	
+	fprintf(stderr,"\nAlignment:\n");
+	
+	//c = numseq;
+	for (i = 0; i < (numseq-1);i++){
+		a = tree[i*3];
+		b = tree[i*3+1];
+		c = tree[i*3+2];
+		fprintf(stderr,"\r%8.0f percent done",(float)(i) /(float)numseq * 100);
+		//fprintf(stderr,"Aligning:%d %d->%d	%d	%d\n",a,b,c,numseq,i);
+		len_a = aln->sl[a];
+		len_b = aln->sl[b];
+		dp = dp_matrix_realloc(dp,len_a,len_b);
+	
+		map[c] = malloc(sizeof(int) * (len_a+len_b+2));
+		for (j = len_a+len_b+2;j--;){
+			map[c][j] = 0;
+		}
+		if (a < numseq){
+			profile[a] = make_profile(profile[a],aln->s[a],len_a,submatrix);
+		}
+		if (b < numseq){
+			profile[b] = make_profile(profile[b],aln->s[b],len_b,submatrix);
+		}
+		profa = profile[a]+64;
+		profb = profile[b]+64;
+	
+		set_gap_penalties(profile[a],len_a,aln->nsip[b]);
+		set_gap_penalties(profile[b],len_b,aln->nsip[a]);
+		if(aln->nsip[a] == 1){
+			if(aln->nsip[b] == 1){
+				map[c] = ss_dyn(submatrix,map[c],dp,aln->s[a],aln->s[b],len_a,len_b);
+			}else{
+				map[c] = ps_dyn(map[c],dp,profb,aln->s[a],len_b,len_a,aln->nsip[b]);
+				map[c] = mirror_path(map[c]);
+			}
+		}else{
+			if(aln->nsip[b] == 1){
+				map[c] = ps_dyn(map[c],dp,profa,aln->s[b],len_a,len_b,aln->nsip[a]);
+			}else{
+				if (len_a > len_b){			
+					map[c] = pp_dyn(map[c],dp,profa,profb,len_a,len_b);
+				}else{
+					map[c] = pp_dyn(map[c],dp,profb,profa,len_b,len_a);
+					map[c] = mirror_path(map[c]);
+				}
+			}
+		}
+			
+		profile[c] = malloc(sizeof(float)*64*(len_a+len_b+2));
+
+		profile[c] = update(profile[a],profile[b],profile[c],map[c],aln->nsip[a],aln->nsip[b]);
+
+	
+		aln->sl[c] = map[c][0];
+	
+		aln->nsip[c] = aln->nsip[a] + aln->nsip[b];
+		aln->sip[c] = malloc(sizeof(int)*(aln->nsip[a] + aln->nsip[b]));
+		g =0;
+		for (j = aln->nsip[a];j--;){
+			aln->sip[c][g] = aln->sip[a][j];
+			g++;
+		}
+		for (j = aln->nsip[b];j--;){
+			aln->sip[c][g] = aln->sip[b][j];
+			g++;
+		}
+		free(profile[a]);
+		free(profile[b]);
+	}
+	fprintf(stderr,"\r%8.0f percent done\n",100.0);
+	free(profile[numprofiles-1]);
+	free(profile);
+	
+	dp_matrix_free(dp);
+	for (i = 32;i--;){
+		free(submatrix[i]);
+	}
+	free(submatrix);
+	return map;
+}
+
+/*
+int** aa_alignment(struct alignment* aln,int* tree,int**submatrix, int** map,int mmbonus)
+{
+	struct dp_matrix *dp = 0;
+	int i,j,g,a,b,c;
+	int len_a;
+	int len_b;
+	int** profile = 0;
+	int* profa = 0;
+	int* profb = 0;
+	
+	int pbonus = 0;
+	
+	profile = malloc(sizeof(int*)*numprofiles);
+	for ( i = 0;i< numprofiles;i++){
+		profile[i] = 0;
+	}
+
+	map = malloc(sizeof(int*)*numprofiles);
+	for ( i = 0;i < numprofiles;i++){
+		map[i] = 0;
+	}
+	
+	
+	dp = dp_matrix_alloc(dp,511,511);
+	c = numseq;
+	for (i = 0; i < (numseq-1);i++){
+		a = tree[i*3];
+		b = tree[i*3+1];
+		c = tree[i*3+2];
+		fprintf(stderr,"Aligning:%d %d->%d\n",a,b,c);
+		len_a = aln->sl[a];
+		len_b = aln->sl[b];
+		dp = dp_matrix_realloc(dp,len_a,len_b);
+	
+		map[c] = malloc(sizeof(int) * (len_a+len_b+2));
+		for (j = len_a+len_b+2;j--;){
+			map[c][j] = 0;
+		}
+		if (a < numseq){
+			profile[a] = make_profile(profile[a],aln->s[a],len_a,submatrix);
+		}
+		if (b < numseq){
+			profile[b] = make_profile(profile[b],aln->s[b],len_b,submatrix);
+		}
+		profa = profile[a];
+		profb = profile[b];
+	
+		set_gap_penalties(profa,len_a,aln->nsip[b]);
+		set_gap_penalties(profb,len_b,aln->nsip[a]);
+		
+		pbonus = mmbonus * aln->nsip[a] * aln->nsip[b];
+		
+		if (len_a > len_b){
+			map[c] = aapp_dyn(map[c],dp,profa,profb,len_a,len_b,pbonus);
+		}else{
+			map[c] = aapp_dyn(map[c],dp,profb,profa,len_b,len_a,pbonus);
+			map[c] = mirror_path(map[c]);
+		}
+			
+		profile[c] = malloc(sizeof(int)*64*(len_a+len_b+2));
+		profile[c] = update(profa,profb,profile[c],map[c],aln->nsip[a],aln->nsip[b]);
+	
+		aln->sl[c] = map[c][0];
+	
+		aln->nsip[c] = aln->nsip[a] + aln->nsip[b];
+		aln->sip[c] = malloc(sizeof(int)*(aln->nsip[a] + aln->nsip[b]));
+		g =0;
+		for (j = aln->nsip[a];j--;){
+			aln->sip[c][g] = aln->sip[a][j];
+			g++;
+		}
+		for (j = aln->nsip[b];j--;){
+			aln->sip[c][g] = aln->sip[b][j];
+			g++;
+		}
+		free(profa);
+		free(profb);
+	}
+	
+	free(profile[numprofiles-1]);
+	free(profile);
+	
+	dp_matrix_free(dp);
+	for (i = 32;i--;){
+		free(submatrix[i]);
+	}
+	free(submatrix);
+	return map;
+}*/
+
+/*
+int** alter_gaps_alignment(struct alignment* aln,int* tree,int**submatrix, int** map,int n,float range,int weight)
+{
+	struct dp_matrix *dp = 0;
+	int i,j,g,a,b,c;
+	
+	int org_gpo = gpo;
+	int org_gpe = gpe;
+	int org_tgpe = tgpe;
+	
+	float gpo_step = 0;
+	float gpe_step = 0;
+	float tgpe_step = 0;
+	
+	int len_a;
+	int len_b;
+	int** profile = 0;
+	int* profa = 0;
+	int* profb = 0;
+	int* path = 0;
+	
+	int* fprofa = 0;
+	int* fprofb = 0;
+	
+	if(!(n &1)){
+		n--;
+	}
+	
+	float per = 0.0;
+	
+	per =(float) range*2/(n+1);
+
+	gpo_step = (float)gpo * per;
+	gpe_step = (float)gpe * per;
+	tgpe_step = (float)tgpe * per;
+	
+	
+	profile = malloc(sizeof(int*)*numprofiles);
+	for ( i = 0;i< numprofiles;i++){
+		profile[i] = 0;
+	}
+	
+	map = malloc(sizeof(int*)*numprofiles);
+	for ( i = 0;i < numprofiles;i++){
+		map[i] = 0;
+	}
+	
+	dp = dp_matrix_alloc(dp,511,511);
+	c = numseq;
+	
+	for (i = 0; i < (numseq-1);i++){
+		a = tree[i*3];
+		b = tree[i*3+1];
+		c = tree[i*3+2];
+		fprintf(stderr,"Aligning:%d %d->%d\n",a,b,c);
+		len_a = aln->sl[a];
+		len_b = aln->sl[b];
+		dp = dp_matrix_realloc(dp,len_a,len_b);
+	
+		map[c] = malloc(sizeof(int) * (len_a+len_b+2));
+		for (j = len_a+len_b+2;j--;){
+			map[c][j] = 0;
+		}
+		if (a < numseq){
+			profile[a] = make_profile(profile[a],aln->s[a],len_a,submatrix);
+		}
+		if (b < numseq){
+			profile[b] = make_profile(profile[b],aln->s[b],len_b,submatrix);
+		}
+		profa = profile[a];
+		profb = profile[b];
+		
+		fprofa = malloc(sizeof(int)*(len_a+1)*2);
+		for (j = 0;j < (len_a+1)*2;j++){
+			fprofa[j] = 0;
+		}
+		fprofb = malloc(sizeof(int)*(len_b+1)*2);
+		for (j = 0;j < (len_b+1)*2;j++){
+			fprofb[j] = 0;
+		}
+		
+		gpo = org_gpo - ((int)gpo_step* (n/2));
+		gpe = org_gpe - ((int)gpe_step* (n/2));
+		tgpe = org_tgpe - ((int)tgpe_step* (n/2));
+		
+		for (j = 0; j < n;j++){
+			set_gap_penalties(profa,len_a,aln->nsip[b]);
+			set_gap_penalties(profb,len_b,aln->nsip[a]);
+			
+			path = malloc(sizeof(int) * (len_a+len_b+2));
+			for (g = len_a+len_b+2;g--;){
+				path[g] = 0;
+			}
+			
+			if(aln->nsip[a] == 1){
+				if(aln->nsip[b] == 1){
+					path = ss_dyn(submatrix,path,dp,aln->s[a],aln->s[b],len_a,len_b);
+				}else{
+					path = ps_dyn(path,dp,profb,aln->s[a],len_b,len_a,aln->nsip[b]);
+					path = mirror_path(path);
+				}
+			}else{
+				if(aln->nsip[b] == 1){
+					path = ps_dyn(path,dp,profa,aln->s[b],len_a,len_b,aln->nsip[a]);
+				}else{
+					if (len_a > len_b){
+						path = pp_dyn(path,dp,profa,profb,len_a,len_b);
+					}else{
+						path = pp_dyn(path,dp,profb,profa,len_b,len_a);
+						path = mirror_path(path);
+					}
+				}
+			}
+			fprintf(stderr,"Test alignment with gpo:%d	gpe:%d	tgpe:%d\n",gpo,gpe,tgpe);
+			
+			
+			add_feature_information_from_alignment(path,fprofa,fprofb,weight/n);
+			
+
+			gpo += 	(int)gpo_step;
+			gpe +=  (int)gpe_step;
+			tgpe += (int)tgpe_step;
+		}
+		gpo = org_gpo;
+		gpe = org_gpe;
+		tgpe = org_tgpe;
+	
+		set_gap_penalties(profa,len_a,aln->nsip[b]);
+		set_gap_penalties(profb,len_b,aln->nsip[a]);
+		
+
+		
+		if (len_a > len_b){
+		//	map[c] = f_only_pp_dyn(map[c],dp,fprofa,fprofb,len_a,len_b,1,2);
+			map[c] = fpp_dyn(map[c],dp,profa,profb,fprofa,fprofb,len_a,len_b,1,2);
+		}else{
+		//	map[c] = f_only_pp_dyn(map[c],dp,fprofb,fprofa,len_b,len_a,1,2);
+			map[c] = fpp_dyn(map[c],dp,profb,profa,fprofb,fprofa,len_b,len_a,1,2);
+			map[c] = mirror_path(map[c]);
+		}
+					
+		profile[c] = malloc(sizeof(int)*64*(len_a+len_b+2));
+		profile[c] = update(profa,profb,profile[c],map[c],aln->nsip[a],aln->nsip[b]);
+		
+		
+		aln->sl[c] = map[c][0];
+	
+		aln->nsip[c] = aln->nsip[a] + aln->nsip[b];
+		aln->sip[c] = malloc(sizeof(int)*(aln->nsip[a] + aln->nsip[b]));
+		g =0;
+		for (j = aln->nsip[a];j--;){
+			aln->sip[c][g] = aln->sip[a][j];
+			g++;
+		}
+		for (j = aln->nsip[b];j--;){
+			aln->sip[c][g] = aln->sip[b][j];
+			g++;
+		}
+		free(profa);
+		free(profb);
+		
+		free(fprofa);
+		free(fprofb);
+	}
+	
+	free(profile[numprofiles-1]);
+	free(profile);
+		
+	dp_matrix_free(dp);
+	for (i = 32;i--;){
+		free(submatrix[i]);
+	}
+	free(submatrix);
+	return map;
+}*/
+
+/*
+int** test_alignment(struct alignment* aln,int* tree,float **submatrix, int** map,float internal_gap_weight,int window,float strength)
+{
+	struct dp_matrix *dp = 0;
+	int i,j,g,a,b,c;
+	int len_a;
+	int len_b;
+	float** profile = 0;
+	float* profa = 0;
+	float* profb = 0;
+	
+	profile = malloc(sizeof(float*)*numprofiles);
+	for ( i = 0;i< numprofiles;i++){
+		profile[i] = 0;
+	}
+
+	map = malloc(sizeof(int*)*numprofiles);
+	for ( i = 0;i < numprofiles;i++){
+		map[i] = 0;
+	}
+	
+	
+	dp = dp_matrix_alloc(dp,511,511);
+	c = numseq;
+	for (i = 0; i < (numseq-1);i++){
+		a = tree[i*3];
+		b = tree[i*3+1];
+		c = tree[i*3+2];
+		fprintf(stderr,"Aligning:%d %d->%d\n",a,b,c);
+		len_a = aln->sl[a];
+		len_b = aln->sl[b];
+		dp = dp_matrix_realloc(dp,len_a,len_b);
+	
+		map[c] = malloc(sizeof(int) * (len_a+len_b+2));
+		for (j = len_a+len_b+2;j--;){
+			map[c][j] = 0;
+		}
+		if (a < numseq){
+			profile[a] = make_profile2(profile[a],aln->s[a],len_a,submatrix);
+		}
+		if (b < numseq){
+			profile[b] = make_profile2(profile[b],aln->s[b],len_b,submatrix);
+		}
+		profa = profile[a];
+		profb = profile[b];
+	
+		set_gap_penalties2(profa,len_a,aln->nsip[b],window,strength);
+		set_gap_penalties2(profb,len_b,aln->nsip[a],window,strength);
+
+		if(aln->nsip[a] == 1){
+			if(aln->nsip[b] == 1){
+				map[c] = ss_dyn2(submatrix,map[c],dp,aln->s[a],aln->s[b],len_a,len_b);
+			}else{
+			//	map[c] = ps_dyn2(map[c],dp,profb,aln->s[a],len_b,len_a,aln->nsip[b]);
+				
+				map[c] = pp_dyn2(map[c],dp,profb,profa,len_b,len_a);
+				map[c] = mirror_path(map[c]);
+			}
+		}else{
+			if(aln->nsip[b] == 1){
+			//	map[c] = ps_dyn2(map[c],dp,profa,aln->s[b],len_a,len_b,aln->nsip[a]);
+				map[c] = pp_dyn2(map[c],dp,profa,profb,len_a,len_b);
+			}else{
+				if (len_a > len_b){
+					map[c] = pp_dyn2(map[c],dp,profa,profb,len_a,len_b);
+				}else{
+					map[c] = pp_dyn2(map[c],dp,profb,profa,len_b,len_a);
+					map[c] = mirror_path(map[c]);
+				}
+			}
+		}
+					
+		profile[c] = malloc(sizeof(float)*64*(len_a+len_b+2));
+		profile[c] = update2(profa,profb,profile[c],map[c],aln->nsip[a],aln->nsip[b],internal_gap_weight);
+		
+		
+		aln->sl[c] = map[c][0];
+	
+		aln->nsip[c] = aln->nsip[a] + aln->nsip[b];
+		aln->sip[c] = malloc(sizeof(int)*(aln->nsip[a] + aln->nsip[b]));
+		g =0;
+		for (j = aln->nsip[a];j--;){
+			aln->sip[c][g] = aln->sip[a][j];
+			g++;
+		}
+		for (j = aln->nsip[b];j--;){
+			aln->sip[c][g] = aln->sip[b][j];
+			g++;
+		}
+		free(profa);
+		free(profb);
+	}
+	
+	free(profile[numprofiles-1]);
+	free(profile);
+	
+	dp_matrix_free(dp);
+	for (i = 32;i--;){
+		free(submatrix[i]);
+	}
+	free(submatrix);
+	return map;
+}*/
+/*
+int** feature_alignment(struct alignment* aln,int* tree,int**submatrix, int** map,struct feature_matrix* fm)
+{
+	struct dp_matrix *dp = 0;
+	int i,j,g,a,b,c;
+	int len_a;
+	int len_b;
+	int** profile = 0;
+	int* profa = 0;
+	int* profb = 0;
+	
+	int** fprofile = 0;
+	int* fprofa = 0;
+	int* fprofb = 0;
+	
+	profile = malloc(sizeof(int*)*numprofiles);
+	for ( i = 0;i< numprofiles;i++){
+		profile[i] = 0;
+	}
+	
+	fprofile = malloc(sizeof(int*)*numprofiles);
+	for ( i = 0;i< numprofiles;i++){
+		fprofile[i] = 0;
+	}
+
+	map = malloc(sizeof(int*)*numprofiles);
+	for ( i = 0;i < numprofiles;i++){
+		map[i] = 0;
+	}
+	
+	dp = dp_matrix_alloc(dp,511,511);
+	c = numseq;
+	//if(!param->dna){
+	for (i = 0; i < (numseq-1);i++){
+		a = tree[i*3];
+		b = tree[i*3+1];
+		c = tree[i*3+2];
+		fprintf(stderr,"Aligning:%d %d->%d\n",a,b,c);
+		len_a = aln->sl[a];
+		len_b = aln->sl[b];
+		dp = dp_matrix_realloc(dp,len_a,len_b);
+	
+		map[c] = malloc(sizeof(int) * (len_a+len_b+2));
+		for (j = len_a+len_b+2;j--;){
+			map[c][j] = 0;
+		}
+		if (a < numseq){
+			profile[a] = make_profile(profile[a],aln->s[a],len_a,submatrix);
+		//	fprintf(stderr,"Making feature profile for %d	(%s)\n",a,aln->sn[a]);
+			fprofile[a] = make_feature_profile(fprofile[a],aln->ft[a],len_a,fm);		
+		}
+		if (b < numseq){
+			profile[b] = make_profile(profile[b],aln->s[b],len_b,submatrix);
+		//	fprintf(stderr,"Making feature profile for %d	(%s)\n",b,aln->sn[b]);
+			fprofile[b] = make_feature_profile(fprofile[b],aln->ft[b],len_b,fm);
+		}
+		//profa = profile[a];
+		//profb = profile[b];
+		profa = profile[a]+64;
+		profb = profile[b]+64;
+	
+		fprofa = fprofile[a];
+		fprofb = fprofile[b];
+	
+		set_gap_penalties(profile[a],len_a,aln->nsip[b]);
+		set_gap_penalties(profile[b],len_b,aln->nsip[a]);
+
+		if (len_a > len_b){
+			map[c] = fpp_dyn(map[c],dp,profa,profb,fprofa,fprofb,len_a,len_b,fm->mdim,fm->stride);
+		}else{
+			map[c] = fpp_dyn(map[c],dp,profb,profa,fprofb,fprofa,len_b,len_a,fm->mdim,fm->stride);
+			map[c] = mirror_path(map[c]);
+		}
+					
+		profile[c] = malloc(sizeof(int)*64*(len_a+len_b+2));
+		profile[c] = update(profile[a],profile[b],profile[c],map[c],aln->nsip[a],aln->nsip[b]);
+		
+		fprofile[c] = malloc(sizeof(int)*fm->stride*(len_a+len_b+2));
+		fprofile[c] = feature_update(fprofa,fprofb,fprofile[c],map[c],fm->stride); 
+		
+		aln->sl[c] = map[c][0];
+	
+		aln->nsip[c] = aln->nsip[a] + aln->nsip[b];
+		aln->sip[c] = malloc(sizeof(int)*(aln->nsip[a] + aln->nsip[b]));
+		g =0;
+		for (j = aln->nsip[a];j--;){
+			aln->sip[c][g] = aln->sip[a][j];
+			g++;
+		}
+		for (j = aln->nsip[b];j--;){
+			aln->sip[c][g] = aln->sip[b][j];
+			g++;
+		}
+		free(profile[a]);
+		free(profile[b]);
+		
+		free(fprofa);
+		free(fprofb);
+		
+	}
+	
+	free(profile[numprofiles-1]);
+	free(profile);
+	
+	free(fprofile[numprofiles-1]);
+	free(fprofile );
+	
+	dp_matrix_free(dp);
+	for (i = 32;i--;){
+		free(submatrix[i]);
+	}
+	free(submatrix);
+	free_feature_matrix(fm);
+	return map;
+}*/
+
+struct ntree_data* ntree_sub_alignment(struct ntree_data* ntree_data,int* tree,int num)
+{
+	struct dp_matrix *dp = 0;
+	struct alignment* aln = 0;
+	int i,j,g,a,b,c;
+	int len_a;
+	int len_b;
+	float** local_profile = 0;
+	float* profa = 0;
+	float* profb = 0;
+
+	int** local_map = 0;
+	int* local_sl = 0;
+	int* local_nsip = 0;
+	int** local_sip = 0;
+	
+	int* which_to_alloc = 0;
+	
+	aln = ntree_data->aln;
+	
+	which_to_alloc = malloc(sizeof(int*)*numprofiles);
+	for ( i = 0;i< numprofiles;i++){
+		which_to_alloc[i] = 0;
+	}
+	
+	local_profile = malloc(sizeof(float*)*numprofiles);
+	local_sl = malloc(sizeof(int)*numprofiles);
+	local_nsip = malloc(sizeof(int)*numprofiles);
+	local_sip = malloc(sizeof(int*)*numprofiles);
+	
+	
+	for (i = 0; i < num-1;i++){
+		a = tree[i*3+1];
+		if(!which_to_alloc[a]){
+			which_to_alloc[a] = 1;
+		}
+		b = tree[i*3+2];
+		if(!which_to_alloc[b]){
+			which_to_alloc[b] = 1;
+		}
+		c = tree[i*3+3];
+		if(!which_to_alloc[c]){
+			which_to_alloc[c] = 2;
+		}
+	}
+	//for ( i = 0;i< numprofiles;i++){
+	//	fprintf(stderr,"alloc?:%d	%d\n",i,which_to_alloc[i]);
+	//}
+	
+//	exit(0);
+	for ( i = 0;i< numprofiles;i++){
+		if(which_to_alloc[i] == 1){
+			local_profile[i] = ntree_data->profile[i];
+			local_sl[i] = aln->sl[i];
+			local_nsip[i] = aln->nsip[i];
+			local_sip[i] =  malloc(sizeof(int*)*aln->nsip[i]);
+			for(j = 0;j < aln->nsip[i];j++){
+				local_sip[i][j] = aln->sip[i][j];
+			}
+		}else{
+			local_profile[i] = 0;
+			local_sl[i] = 0;
+			local_nsip[i] = 0;
+			local_sip[i] = 0;
+		}
+	}
+	/*
+	for ( i = 0;i< numprofiles;i++){
+		local_profile[i] = ntree_data->profile[i];
+		local_sl[i] = aln->sl[i];
+		local_nsip[i] = aln->nsip[i];
+		if(aln->sip[i]){
+			fprintf(stderr,"Allocing..:%d\n",aln->nsip[i]);
+			local_sip[i] =  malloc(sizeof(int*)*aln->nsip[i]);
+			for(j = 0;j < aln->nsip[i];j++){
+				local_sip[i][j] = aln->sip[i][j];
+			}
+		}else{
+			local_sip[i] = 0;
+		}
+	}*/
+
+	local_map = malloc(sizeof(int*)*numprofiles);
+	for ( i = 0;i < numprofiles;i++){
+		local_map[i] = 0;
+	}
+	
+	
+	dp = dp_matrix_alloc(dp,511,511);
+	c = numseq;
+	for (i = 0; i < num-1;i++){
+		a = tree[i*3+1];
+		b = tree[i*3+2];
+		c = tree[i*3+3];
+	//	fprintf(stderr,"Aligning:%d %d->%d\n",a,b,c);
+		len_a = local_sl[a];
+		len_b = local_sl[b];
+		dp = dp_matrix_realloc(dp,len_a,len_b);
+	
+		local_map[c] = malloc(sizeof(int) * (len_a+len_b+2));
+		for (j = len_a+len_b+2;j--;){
+			local_map[c][j] = 0;
+		}
+		if (a < numseq){
+			local_profile[a] = make_profile(local_profile[a],aln->s[a],len_a,ntree_data->submatrix);
+		}
+		if (b < numseq){
+			local_profile[b] = make_profile(local_profile[b],aln->s[b],len_b,ntree_data->submatrix);
+		}
+		profa = local_profile[a];
+		profb = local_profile[b];
+	
+		set_gap_penalties(profa,len_a,local_nsip[b]);
+		set_gap_penalties(profb,len_b,local_nsip[a]);
+
+		if(local_nsip[a] == 1){
+			if(local_nsip[b] == 1){
+				local_map[c] = ss_dyn(ntree_data->submatrix,local_map[c],dp,aln->s[a],aln->s[b],len_a,len_b);
+			}else{
+				local_map[c] = ps_dyn(local_map[c],dp,profb,aln->s[a],len_b,len_a,local_nsip[b]);
+				local_map[c] = mirror_path(local_map[c]);
+			}
+		}else{
+			if(local_nsip[b] == 1){
+				local_map[c] = ps_dyn(local_map[c],dp,profa,aln->s[b],len_a,len_b,local_nsip[a]);
+			}else{
+				if (len_a > len_b){
+					local_map[c] = pp_dyn(local_map[c],dp,profa,profb,len_a,len_b);
+				}else{
+					local_map[c] = pp_dyn(local_map[c],dp,profb,profa,len_b,len_a);
+					local_map[c] = mirror_path(local_map[c]);
+				}
+			}
+		}
+			
+		local_profile[c] = malloc(sizeof(float)*64*(len_a+len_b+2));
+		local_profile[c] = update(profa,profb,local_profile[c],local_map[c],local_nsip[a],local_nsip[b]);
+	
+		local_sl[c] = local_map[c][0];
+	
+		local_nsip[c] = local_nsip[a] + local_nsip[b];
+		local_sip[c] = malloc(sizeof(int)*(local_nsip[a] + local_nsip[b]));
+		g =0;
+		for (j = local_nsip[a];j--;){
+			local_sip[c][g] = local_sip[a][j];
+			g++;
+		}
+		for (j = local_nsip[b];j--;){
+			local_sip[c][g] = local_sip[b][j];
+			g++;
+		}
+	//	free(profa);
+	//	free(profb);
+	}
+	
+	if(ntree_data->profile[c]){
+		if(ntree_data->map[c][ntree_data->map[c][0]+2]  < local_map[c][local_map[c][0]+2]){
+			fprintf(stderr,"%d\n",local_map[c][local_map[c][0]+2]);
+			//remove old map,profile,etc..
+			for (i = 0; i < num-1;i++){
+				c = tree[i*3+3];
+				free(ntree_data->map[c]);
+				free(ntree_data->profile[c]);
+				free(aln->sip[c]);
+				ntree_data->map[c] = malloc(sizeof(int)*(local_map[c][0]+3));
+				for (j = 0; j < local_map[c][0]+3;j++){
+					ntree_data->map[c][j] = local_map[c][j];
+				}
+				aln->sip[c] = malloc(sizeof(int)*local_nsip[c]);
+				aln->nsip[c] = local_nsip[c];
+				for (j = 0; j < local_nsip[c];j++){
+					aln->sip[c][j] = local_sip[c][j];
+				}
+				aln->sl[c] = local_sl[c];
+				
+			}
+			ntree_data->profile[c] = malloc(sizeof(int)*64*(aln->sl[c]+1));
+			for (i = 0; i < (64*(aln->sl[c]+1));i++){
+				ntree_data->profile[c][i] = local_profile[c][i];
+			}
+			ntree_data->tree[0] -= (tree[0]-1);
+			for (j = 1; j < tree[0];j++){
+				ntree_data->tree[ntree_data->tree[0]+j-1] = tree[j];
+			}
+			ntree_data->tree[0] += (tree[0]-1);
+
+		}else{
+			fprintf(stderr,"no improvement\n");
+		}
+	}else{
+		fprintf(stderr,"%d\n",local_map[c][local_map[c][0]+2]);
+		for (i = 0; i < num-1;i++){
+			c = tree[i*3+3];
+			ntree_data->map[c] = malloc(sizeof(int)*(local_map[c][0]+3));
+			for (j = 0; j < local_map[c][0]+3;j++){
+				ntree_data->map[c][j] = local_map[c][j];
+			}
+
+			aln->sip[c] = malloc(sizeof(int)*local_nsip[c]);
+			aln->nsip[c] = local_nsip[c];
+			for (j = 0; j < local_nsip[c];j++){
+				aln->sip[c][j] = local_sip[c][j];
+			}
+			aln->sl[c] = local_sl[c];
+		}
+		ntree_data->profile[c] = malloc(sizeof(int)*64*(aln->sl[c]+1));
+		for (i = 0; i < (64*(aln->sl[c]+1));i++){
+			ntree_data->profile[c][i] = local_profile[c][i];
+		}
+		for (j = 1; j < tree[0];j++){
+			ntree_data->tree[ntree_data->tree[0]+j-1] = tree[j];
+		}
+		ntree_data->tree[0] += tree[0]-1;
+	}
+
+	for ( i = 0;i< numprofiles;i++){
+		if(which_to_alloc[i] == 1){
+			free(local_sip[i]);
+			if(i < numseq){
+				free(local_profile[i]);	
+			}
+		}
+		if(which_to_alloc[i] == 2){
+			free(local_profile[i]);
+			free(local_map[i]);
+			free(local_sip[i]);
+		}
+		
+	}
+
+	free(which_to_alloc);
+	free(local_map);
+	free(local_sip);
+	free(local_nsip);
+	free(local_profile);
+	free(local_sl);
+	
+	dp_matrix_free(dp);
+	return ntree_data;
+}
+
+struct ntree_data* ntree_alignment(struct ntree_data* ntree_data)
+{
+	int i;
+	ntree_data->profile = malloc(sizeof(float*)*numprofiles);
+	for ( i = 0;i< numprofiles;i++){
+		ntree_data->profile[i] = 0;
+	}
+	
+	ntree_data->map = malloc(sizeof(int*)*numprofiles);
+	for ( i = 0;i < numprofiles;i++){
+		ntree_data->map[i] = 0;
+	}
+
+	ntree_data =  alignntree(ntree_data,ntree_data->realtree);
+	
+	for ( i = 0;i< numprofiles;i++){
+		if(ntree_data->profile[i]){
+			free(ntree_data->profile[i]);
+		}
+	}
+	free(ntree_data->profile);
+	
+	for (i = 32;i--;){
+		free(ntree_data->submatrix[i]);
+	}
+	free(ntree_data->submatrix);
+	free_real_tree(ntree_data->realtree);
+	return ntree_data;
+}
+

Added: trunk/packages/kalign/branches/upstream/current/kalign2_conservation.c
===================================================================
--- trunk/packages/kalign/branches/upstream/current/kalign2_conservation.c	2006-11-19 13:38:57 UTC (rev 159)
+++ trunk/packages/kalign/branches/upstream/current/kalign2_conservation.c	2006-11-29 14:12:29 UTC (rev 160)
@@ -0,0 +1,57 @@
+/*
+	kalign2_conservation.c
+	
+	Released under GPL - see the 'COPYING' file   
+	
+	Copyright (C) 2006 Timo Lassmann <timolassmann at gmail.com>
+	
+	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
+	any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+    
+	Please send bug reports, comments etc. to:
+	timolassmann at gmail.com
+*/
+
+#include <math.h>
+
+#include "kalign2.h"
+
+void entrophy(int* prof,int len)
+{
+	int i,j;
+	float shannon = 0.0;
+	float log_two = log(2);
+	fprintf(stderr,"%f\n",log_two);
+	for ( i = 0; i < len; i++){
+		shannon = 0.0;
+		//prof[3] = 10;
+		//prof[23] += 10;
+		for ( j = 0; j < 23;j++){
+			if(prof[j]){
+			shannon += (float)prof[j]* log((float)prof[j]/(float)prof[23])/log_two;
+		
+		//	fprintf(stderr,"%f += %d/%d * %f\n",shannon,prof[j],prof[23],log((float)prof[j]/(float)prof[23])/log_two);
+			}
+		}
+		fprintf(stderr,"%f	",shannon);
+		
+		if (prof[23] < 23){
+			shannon = -shannon / (log((float)prof[23])/log_two);
+		}else{
+			shannon = -shannon / (log((float)23)/log_two);
+		}
+		fprintf(stderr,"%f\n",shannon);
+		prof+=64;
+	}
+}

Added: trunk/packages/kalign/branches/upstream/current/kalign2_distance_calculation.c
===================================================================
--- trunk/packages/kalign/branches/upstream/current/kalign2_distance_calculation.c	2006-11-19 13:38:57 UTC (rev 159)
+++ trunk/packages/kalign/branches/upstream/current/kalign2_distance_calculation.c	2006-11-29 14:12:29 UTC (rev 160)
@@ -0,0 +1,992 @@
+/*
+	kalign2_distance_calculation.c 
+	
+	Released under GPL - see the 'COPYING' file   
+	
+	Copyright (C) 2006 Timo Lassmann <timolassmann at gmail.com>
+	
+	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
+	any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+    
+	Please send bug reports, comments etc. to:
+	timolassmann at gmail.com
+*/
+
+#include "kalign2.h"
+
+float** protein_pairwise_alignment_distance(struct alignment* aln,float** dm,struct parameters* param,float**subm, int nj)
+{
+	int i,j,c;
+	int * path = 0;
+	int len_a = 0;
+	int len_b = 0;
+	struct dp_matrix *dp = 0;
+	int a,b;
+	
+	
+	fprintf(stderr,"Distance Calculation:\n");
+	
+	b = (numseq*(numseq-1))/2;
+	a = 1;	
+	
+	
+	
+	dp = dp_matrix_alloc(dp,511,511);
+	
+	if (nj){
+		dm = malloc (sizeof(float*)*numprofiles);
+		for (i = numprofiles;i--;){
+			dm[i] = malloc (sizeof (float)*(numprofiles));
+			for (j = numprofiles;j--;){
+				dm[i][j] = 0.0f;
+			}
+		}
+	}else{
+		dm = malloc (sizeof(float*)*numseq);
+		for (i = numseq;i--;){
+			dm[i] = malloc (sizeof (float)*(numseq));
+			for (j = numseq;j--;){
+				dm[i][j] = 0.0f;
+			}
+		}
+	}
+	
+	/*dm = malloc (sizeof(float*)*numprofiles);
+	for (i = numprofiles;i--;){
+		dm[i] = malloc (sizeof (float)*(numprofiles));
+		for (j = numprofiles;j--;){
+			dm[i][j] = 0.0f;
+		}
+	}*/
+	for (i = 0; i < numseq-1;i++){
+		len_a = aln->sl[i];
+		for(j = i+1; j < numseq;j++){
+			
+			len_b = aln->sl[j];
+			path = malloc(sizeof(int) * (len_a+len_b+2));
+			for (c = len_a+len_b+2;c--;){
+				path[c] = 0;
+			}
+			dp = dp_matrix_realloc(dp,len_a,len_b);
+			path = ss_dyn(subm,path,dp,aln->s[i],aln->s[j],len_a,len_b);
+			dm[i][j] = get_distance_from_pairwise_alignment(path,aln->s[i],aln->s[j]);
+			dm[j][i] = dm[i][j];
+			fprintf(stderr,"\r%8.0f percent done",(float)a /(float)b * 100);
+			a++;
+			
+			free(path);
+		}
+	}
+	dp_matrix_free(dp);
+	return dm;
+}
+
+float get_distance_from_pairwise_alignment(int* path,int* seq1,int* seq2)
+{
+	float dist = 0;
+ 	int i,j,c;
+ 	int pairs = 0;
+ 	int identical = 0;
+ 	i = 0;
+ 	j = 0;
+ 	c = 1;
+	while(path[c] != 3){		
+		if (!path[c]){
+			if (seq1[i] == seq2[j]){
+				identical++;
+			}
+			pairs++;
+			i++;
+			j++;	
+		}
+		if (path[c] & 1){
+			j++;
+		}
+		if (path[c] & 2){
+			i++;		
+		}
+		c++;
+	}
+	dist = (float)identical/(float)pairs*100;
+	return dist; 
+}
+
+
+float** protein_wu_distance2(struct alignment* aln,float** dm,struct parameters* param)
+{
+	struct node* hash[1024];
+	int i,j;
+	unsigned int hv;
+	int*p =0;
+	for (i = 0;i < 1024;i++){
+		hash[i] = 0;
+	}	
+	
+	if(!aln->ft){
+		aln->ft =  malloc(sizeof(struct feature* ) * (numseq));
+
+		for(i =0;i < numseq;i++){
+			aln->ft[i] = 0;
+		}
+	}
+	dm = malloc (sizeof(float*)*numprofiles);
+	for (i = numprofiles;i--;){
+		dm[i] = malloc (sizeof (float)*(numprofiles));
+		for (j = numprofiles;j--;){
+			dm[i][j] = 0.0f;
+		}
+	}
+
+	
+	for (i = 0; i < numseq-1;i++){
+		p = aln->s[i];
+				
+		for (j = aln->sl[i]-2;j--;){
+			hv = (p[j] << 5) + p[j+1];
+			hash[hv] = insert_hash(hash[hv],j+1);
+		//	hash[hv] = insert_hash(hash[hv],j+1);
+			hv = (p[j] << 5) + p[j+2];
+			hash[hv] = insert_hash(hash[hv],j+1);
+			hv = (p[j+1] << 5) + p[j+2];
+			hash[hv] = insert_hash(hash[hv],j+1);
+		}
+
+		for (j = i+1; j < numseq;j++){
+			dm[i][j] = protein_wu_distance_calculation3(hash,aln->s[j],aln->sl[j],aln->sl[j]+aln->sl[i],param->zlevel);
+		//	aln = protein_wu_sw2(hash,aln,i,j);
+			dm[i][j] /= (aln->sl[i] > aln->sl[j]) ? aln->sl[j] : aln->sl[i];
+			dm[j][i] = dm[i][j];
+		}
+		
+		for (j = 1024;j--;){
+			if (hash[j]){
+				remove_nodes(hash[j]);
+				hash[j] = 0;
+			}
+		}	
+	}
+	return dm;
+}
+
+
+float protein_wu_distance_calculation2(struct node* hash[],int* seq,int seqlen,int diagonals,int mode)
+{
+
+	struct node* node_p;
+	int* d = 0;
+	float out = 0.0;
+	int i;
+	unsigned int hv;
+
+	d = malloc(sizeof(int)*diagonals);
+	//for (i = diagonals;i--;){
+	for (i = 0;i < diagonals;i++){
+		d[i] = 0;
+	}
+	for (i = seqlen-2;i--;){
+
+		hv = (seq[i] << 5) + seq[i+1];
+		//printf("3:%d\n",hv);
+		if (hash[hv]){
+			node_p = hash[hv];
+			while(node_p){
+				d[node_p->pos]++;
+		//		d[node_p->pos+1]++;
+				node_p = node_p->next;
+			}
+		}
+
+
+		hv = (seq[i] << 5) + seq[i+2];
+		//printf("3:%d\n",hv);
+		if (hash[hv]){
+			node_p = hash[hv];
+			while(node_p){
+				d[node_p->pos]++;
+		//		d[node_p->pos+1]++;
+				node_p = node_p->next;
+			}
+		}
+		hv = (seq[i+1] << 5) + seq[i+2];
+		if (hash[hv]){
+			node_p = hash[hv];
+			while(node_p){
+				d[node_p->pos]++;
+				node_p = node_p->next;
+			}
+		}	
+		d++;
+	}
+
+	//exit(0);
+	d -= (seqlen-2);
+
+	for (i = diagonals;i--;){
+		//printf("%d ",d[i]);
+		if(d[i] > mode){
+			out += d[i];
+		}
+	}
+	free(d);
+	return out;
+}
+
+
+
+struct alignment* protein_wu_sw(struct node* hash[],struct alignment* aln,int a,int b)
+{
+	int*seq = aln->s[b];
+	int len_a = aln->sl[b];
+	int len_b = aln->sl[a];
+	struct node* node_p = 0;
+	int i,c;
+	unsigned int hv;
+	//int notel = aln->lsn[a] + aln->lsn[b];
+	
+	
+	
+	struct feature *n = 0;
+	
+	//float counta[1024];
+	//float countb[1024];
+
+	int *weight = 0;
+	int *len = 0;
+	int* added = 0;
+	
+	weight = malloc(sizeof(int*)*(len_a+len_b-1));
+	len = malloc(sizeof(int*)*(len_a+len_b-1));
+	added = malloc(sizeof(int*)*(len_a+len_b-1));
+	for (i = 0; i <(len_a+len_b-1);i++){
+		weight[i] = 0;
+		len[i] = 0;
+		added[i] = 0;
+	}
+	
+
+	
+	//for (i = 0; i <1024;i++){
+	//	counta[i] = 0;
+	//	countb[i] = 0;
+	//	if(hash[i]){
+	//		node_p = hash[i];
+	//		while(node_p){
+	//			countb[i]++;
+	//			node_p = node_p->next;
+	//		}
+	//		fprintf(stderr,"COUNT:%d	%f\n",i,countb[i]);
+	//	}
+		
+	//}
+	//for (i = len_a-2;i--;){
+	//	hv = (seq[i+1] << 5) + seq[i+2];
+	//	counta[hv]++;
+	//	hv = (seq[i] << 5) + seq[i+1];
+	//	counta[hv]++;
+	//	hv = (seq[i] << 5) + seq[i+2];
+	//	counta[hv]++;
+	//}
+
+	c = 1;
+	for (i =  len_a-2;i--;){
+		for (hv = 0; hv <(len_a+len_b-1);hv++){
+		added[hv] = 0;
+		}
+	
+		hv = (seq[i] << 5) + seq[i+1];
+		//printf("3:%d\n",hv);
+		if (hash[hv]){
+			node_p = hash[hv];
+			while(node_p){
+				added[node_p->pos+c] = 1; 
+				weight[node_p->pos+c]++;
+	//			len[node_p->pos+c] = 1 + len[node_p->pos+c];
+				node_p = node_p->next;
+			}
+		}
+
+
+		hv = (seq[i] << 5) + seq[i+2];
+		//printf("3:%d\n",hv);
+		if (hash[hv]){
+			node_p = hash[hv];
+			while(node_p){
+				added[node_p->pos+c] = 1; 
+				weight[node_p->pos+c]++;
+	//			len[node_p->pos+c] = 1 + len[node_p->pos+c];
+				node_p = node_p->next;
+			}
+		}
+		hv = (seq[i+1] << 5) + seq[i+2];
+		//printf("3:%d\n",hv);
+		if (hash[hv]){
+			node_p = hash[hv];
+			while(node_p){
+				added[node_p->pos+c] = 1; 
+				weight[node_p->pos+c]++;
+	//			len[node_p->pos+c] = 1 + len[node_p->pos+c];
+				node_p = node_p->next;
+			}
+		}
+	//	fprintf(stderr,"pos_a:%d	",i+1);
+		
+		for (hv = 0; hv <(len_a+len_b-1);hv++){
+			len[hv] += added[hv];
+			if(!added[hv] && len[hv]){
+				if(len[hv] > 10){
+					n = malloc(sizeof(struct feature));
+					n->next = 0;
+					n->color = 0;
+					n->type = malloc(sizeof(char)*8);
+					n->type[0] = 'w';
+					n->type[1] = 'u';
+					n->type[2] = 'm';
+					n->type[3] = 'a';
+					n->type[4] = 'n';
+					n->type[5] = 'b';
+					n->type[6] = 'e';
+					n->type[7] = 'r';
+					n->type[8] = 0;
+					
+					n->start = i+2;
+					n->end = len[hv]+n->start -1;
+					
+					n->note = malloc(sizeof(char)*(2));
+					n->note[0] = 'w';
+					n->note[1] = 0;
+					
+					/*n->note = malloc(sizeof(char)*(notel+1));
+					for (j = 0;j < aln->lsn[a];j++){
+						n->note[j] = aln->sn[a][j];
+					}
+					while(j < notel){
+						n->note[j] = aln->sn[b][j-aln->lsn[a]];
+						j++;
+					}
+					n->note[notel] = 0;*/
+					//n->note[0] = 'w';
+					//n->note[1] = 0;
+					
+					
+					if(! aln->ft[b]){
+						 aln->ft[b] = n;
+					}else{
+						n->next = aln->ft[b];
+						aln->ft[b] = n;
+					}
+					//if((old_n =  aln->ft[b])!= 0){
+					//	while(old_n->next!=0){
+					//		old_n = old_n->next;
+					//	}
+					//	old_n->next = n;
+					//}else{
+					//	 aln->ft[b] = n;
+					//}
+					n = 0;
+					n = malloc(sizeof(struct feature));
+					n->next = 0;
+					n->color = 0;
+					
+					n->type = malloc(sizeof(char)*8);
+					n->type[0] = 'w';
+					n->type[1] = 'u';
+					n->type[2] = 'm';
+					n->type[3] = 'a';
+					n->type[4] = 'n';
+					n->type[5] = 'b';
+					n->type[6] = 'e';
+					n->type[7] = 'r';
+					n->type[8] = 0;
+					
+
+					n->start = (hv - (len_a))+i+3;
+					n->end = len[hv]+n->start -1;
+					
+					n->note = malloc(sizeof(char)*(2));
+					n->note[0] = 'w';
+					n->note[1] = 0;
+					
+					/*n->note = malloc(sizeof(char)*(notel+1));
+					for (j = 0;j < aln->lsn[a];j++){
+						n->note[j] = aln->sn[a][j];
+					}
+					while(j < notel){
+						n->note[j] = aln->sn[b][j-aln->lsn[a]];
+						j++;
+					}
+					n->note[notel] = 0;*/
+
+					
+					if(! aln->ft[a]){
+						 aln->ft[a] = n;
+					}else{
+						n->next = aln->ft[a];
+						aln->ft[a] = n;
+					}
+					
+					//if((old_n =  aln->ft[a])!= 0){
+					//	while(old_n->next!=0){
+					//		old_n = old_n->next;
+					//	}
+					//	old_n->next = n;
+					//}else{
+					//	 aln->ft[a] = n;
+					//}
+					n = 0;
+	//				fprintf(stderr,"\nDiagonal found A:%d	%d\n",i+2,len[hv]);
+	//				fprintf(stderr,"Diagonal found	B:%d	%d\n",(hv - (len_a))+i+3,len[hv]);
+				}
+				len[hv] = 0;
+				weight[hv] = 0;
+			}
+	//		fprintf(stderr,"%d,%d	",hv,(hv - (len_a))+i+3);
+		}
+	//	fprintf(stderr,"\n");
+		c++;
+	}
+	i++;
+	
+	//fprintf(stderr,"pos_a:%d	",i);
+	for (hv = 0; hv <(len_a+len_b-1);hv++){
+		if(len[hv]){
+			if(len[hv] > 10){
+				n = malloc(sizeof(struct feature));
+				n->next = 0;
+				n->color = 0;
+				
+				n->type = malloc(sizeof(char)*8);
+				n->type[0] = 'w';
+				n->type[1] = 'u';
+				n->type[2] = 'm';
+				n->type[3] = 'a';
+				n->type[4] = 'n';
+				n->type[5] = 'b';
+				n->type[6] = 'e';
+				n->type[7] = 'r';
+				n->type[8] = 0;
+
+				n->start = i+1;
+				n->end = len[hv]+n->start-1;
+				/*
+				n->note = malloc(sizeof(char)*(notel+1));
+				for (j = 0;j < aln->lsn[a];j++){
+					n->note[j] = aln->sn[a][j];
+				}
+				while(j < notel){
+					n->note[j] = aln->sn[b][j-aln->lsn[a]];
+					j++;
+				}
+				n->note[notel] = 0;*/
+				
+				n->note = malloc(sizeof(char)*(2));
+				n->note[0] = 'w';
+				n->note[1] = 0;
+				
+				if(! aln->ft[b]){
+					 aln->ft[b] = n;
+				}else{
+					n->next = aln->ft[b];
+					aln->ft[b] = n;
+				}
+				
+				/*
+				if((old_n =  aln->ft[b])!= 0){
+					while(old_n->next!=0){
+						old_n = old_n->next;
+					}
+					old_n->next = n;
+				}else{
+					 aln->ft[b] = n;
+				}*/
+				n = 0;
+				n = malloc(sizeof(struct feature));
+				n->next = 0;
+				n->color = 0;
+				
+				n->type = malloc(sizeof(char)*8);
+				n->type[0] = 'w';
+				n->type[1] = 'u';
+				n->type[2] = 'm';
+				n->type[3] = 'a';
+				n->type[4] = 'n';
+				n->type[5] = 'b';
+				n->type[6] = 'e';
+				n->type[7] = 'r';
+				n->type[8] = 0;
+
+				n->start = hv - len_a+i+2;
+				n->end = len[hv]+n->start-1;
+				
+				n->note = malloc(sizeof(char)*(2));
+				n->note[0] = 'w';
+				n->note[1] = 0;
+				/*
+				n->note = malloc(sizeof(char)*(notel+1));
+				for (j = 0;j < aln->lsn[a];j++){
+					n->note[j] = aln->sn[a][j];
+				}
+				while(j < notel){
+					n->note[j] = aln->sn[b][j-aln->lsn[a]];
+					j++;
+				}
+				n->note[notel] = 0;*/
+
+				if(! aln->ft[a]){
+					 aln->ft[a] = n;
+				}else{
+					n->next = aln->ft[a];
+					aln->ft[a] = n;
+				}
+				
+				/*if((old_n = aln->ft[a])!= 0){
+					while(old_n->next!=0){
+						old_n = old_n->next;
+					}
+					old_n->next = n;
+				}else{
+					 aln->ft[a] = n;
+				}*/
+				n = 0;			
+			
+	//			fprintf(stderr,"\nDiagonal found A:%d	%d\n",i+1,len[hv]);
+	//			fprintf(stderr,"Diagonal found	B:%d	%d\n",hv - len_a+i+2,len[hv]);
+		
+			}
+			len[hv] = 0;
+			weight[hv] = 0;
+		}
+	//	fprintf(stderr,"%d,%d	",hv,hv - len_a+i+2);
+	}
+	//fprintf(stderr,"\n");
+	free(weight);
+	free(len);
+	free(added);
+
+	//n =aln->ft[a];
+	//while(n){
+	//	fprintf(stderr,"%s	%s	%d-%d\n",n->type,n->note,n->start,n->end);
+	//	n = n->next;
+	//}
+	
+	
+	
+	
+	//exit(0);
+	return aln;
+}
+
+
+
+float protein_wu_distance_calculation3(struct node* hash[],int* seq,int seqlen,int diagonals,int mode)
+{
+	struct node* node_p = 0;
+	int i,c;
+	unsigned int hv;
+	int dlen = 0;
+	
+	
+	int *weight = 0;
+	int *len = 0;
+	int* added = 0;
+	
+	weight = malloc(sizeof(int*)*diagonals);
+	len = malloc(sizeof(int*)*diagonals);
+	added = malloc(sizeof(int*)*diagonals);
+	for (i = 0; i < diagonals;i++){
+		weight[i] = 0;
+		len[i] = 0;
+		added[i] = 0;
+	}
+
+	c = 1;
+	for (i =  seqlen-2;i--;){
+		for (hv = 0; hv < diagonals;hv++){
+			added[hv] = 0;
+		}
+	
+		hv = (seq[i] << 5) + seq[i+1];
+		//printf("3:%d\n",hv);
+		if (hash[hv]){
+			node_p = hash[hv];
+			while(node_p){
+				added[node_p->pos+c] = 1; 
+				weight[node_p->pos+c]++;
+	//			len[node_p->pos+c] = 1 + len[node_p->pos+c];
+				node_p = node_p->next;
+			}
+		}
+
+
+		hv = (seq[i] << 5) + seq[i+2];
+		//printf("3:%d\n",hv);
+		if (hash[hv]){
+			node_p = hash[hv];
+			while(node_p){
+				added[node_p->pos+c] = 1; 
+				weight[node_p->pos+c]++;
+	//			len[node_p->pos+c] = 1 + len[node_p->pos+c];
+				node_p = node_p->next;
+			}
+		}
+		hv = (seq[i+1] << 5) + seq[i+2];
+		//printf("3:%d\n",hv);
+		if (hash[hv]){
+			node_p = hash[hv];
+			while(node_p){
+				added[node_p->pos+c] = 1; 
+				weight[node_p->pos+c]++;
+	//			len[node_p->pos+c] = 1 + len[node_p->pos+c];
+				node_p = node_p->next;
+			}
+		}
+	//	fprintf(stderr,"pos_a:%d	",i+1);
+		
+		for (hv = 0; hv < diagonals ;hv++){
+			len[hv] += added[hv];
+			if(!added[hv] && len[hv]){
+				if (len[hv] > dlen){
+					dlen = len[hv];
+				}
+				len[hv] = 0;
+				weight[hv] = 0;
+			}
+	//		fprintf(stderr,"%d,%d	",hv,(hv - (len_a))+i+3);
+		}
+	//	fprintf(stderr,"\n");
+		c++;
+	}
+	i++;
+	
+	//fprintf(stderr,"pos_a:%d	",i);
+	for (hv = 0; hv < diagonals;hv++){
+		if(len[hv]){
+			if (len[hv] > dlen){
+				dlen = len[hv];
+			}
+			len[hv] = 0;
+			weight[hv] = 0;
+		}
+
+	}
+	free(weight);
+	free(len);
+	free(added);
+	return dlen;
+}
+
+float** protein_wu_distance(struct alignment* si,float** dm,struct parameters* param, int nj)
+{
+	struct bignode* hash[1024];
+	int*p =0;
+	int i,j,a,b;
+	unsigned int hv;
+	float min;
+	float cutoff;
+	
+	for (i = 0;i < 1024;i++){
+		hash[i] = 0;
+	}	
+
+	if (nj){
+		dm = malloc (sizeof(float*)*numprofiles);
+		for (i = numprofiles;i--;){
+			dm[i] = malloc (sizeof (float)*(numprofiles));
+			for (j = numprofiles;j--;){
+				dm[i][j] = 0.0f;
+			}
+		}
+	}else{
+		dm = malloc (sizeof(float*)*numseq);
+		for (i = numseq;i--;){
+			dm[i] = malloc (sizeof (float)*(numseq));
+			for (j = numseq;j--;){
+				dm[i][j] = 0.0f;
+			}
+		}
+	}
+	fprintf(stderr,"Distance Calculation:\n");
+	b = (numseq*(numseq-1))/2;
+	a = 1;	
+	
+	for (i = 0; i < numseq-1;i++){
+		p = si->s[i];
+				
+		for (j = si->sl[i]-2;j--;){
+			//hv = (p[j+1] << 5) + p[j+2];
+			//hash[hv] = big_insert_hash(hash[hv],j);
+			hv = (p[j] << 5) + p[j+1];
+			hash[hv] = big_insert_hash(hash[hv],j);
+			hv = (p[j] << 5) + p[j+2];
+			hash[hv] = big_insert_hash(hash[hv],j);
+		}
+		for (j = i+1; j < numseq;j++){
+			min =  (si->sl[i] > si->sl[j]) ? si->sl[j] :si->sl[i];
+			cutoff = param->internal_gap_weight *min + param->zlevel;
+			//cutoff = param->zlevel;
+			p = si->s[j];
+			dm[i][j] = protein_wu_distance_calculation(hash,p,si->sl[j],si->sl[j]+si->sl[i],cutoff);
+			//fprintf(stderr,"%d-%d:%f\n",i,j,dm[i][j]);
+			//exit(0);
+			//dm[i][j] /= min;
+			//dm[i][j] /= (si->sl[i] > si->sl[j]) ? si->sl[j] :si->sl[i];
+			dm[j][i] = dm[i][j];
+			fprintf(stderr,"\r%8.0f percent done",(float)a /(float)b * 100);
+			a++;
+		}
+		
+		
+		for (j = 1024;j--;){
+			if (hash[j]){
+				big_remove_nodes(hash[j]);
+				hash[j] = 0;
+			}
+		}	
+	}
+	return dm;
+}
+
+
+float protein_wu_distance_calculation(struct bignode* hash[],const int* seq,const int seqlen,const int diagonals,const float mode)
+{
+
+	struct bignode* node_p;
+	unsigned int* d = 0;
+	unsigned int* tmp = 0;
+	float out = 0.0;
+	register int i,j;
+	register unsigned int hv;
+
+	d = malloc(sizeof(unsigned int)*diagonals);
+	//for (i = diagonals;i--;){
+	for (i = 0;i < diagonals;i++){
+		d[i] = 0;
+	}
+	for (i = seqlen-2;i--;){
+
+		/*hv = (seq[i+1] << 5) + seq[i+2];
+		
+		node_p = hash[hv];
+		while(node_p){
+			tmp = node_p->pos;
+			for(j = 0;j < node_p->num;j++){
+				d[tmp[j]]++;
+			}
+			node_p = node_p->next;
+		}*/
+		hv = (seq[i] << 5) + seq[i+1];
+		//printf("3:%d\n",hv);
+		node_p = hash[hv];
+		while(node_p){
+			tmp = node_p->pos;
+			for(j = 0;j < node_p->num;j++){
+				d[tmp[j]]++;
+				d[tmp[j]+1]++;
+			}
+			node_p = node_p->next;
+		}
+		hv = (seq[i] << 5) + seq[i+2];
+
+		node_p = hash[hv];
+					
+		while(node_p){
+			tmp = node_p->pos;
+			for(j = 0;j < node_p->num;j++){
+				d[tmp[j]]++;
+			}
+			node_p = node_p->next;
+		}		
+		d++;
+	}
+	//exit(0);
+	d -= (seqlen-2);
+
+	for (i = diagonals;i--;){
+		//d[i] /= minlen;
+		
+		//fprintf(stderr,"%d ",d[i]);
+		if(d[i] > mode){
+			out += d[i];
+		//	printf("%f	%d\n",d[i]/ minlen,d[i]);
+		}
+	}
+	free(d);
+	return out;
+}
+
+float** dna_distance(struct alignment* si,float** dm,struct parameters* param, int nj)
+{
+	struct bignode* hash[1024];
+	
+	int *p = 0;
+	int i,j,a,b;
+	unsigned int hv;
+	
+	
+	fprintf(stderr,"Distance Calculation:\n");
+	
+	
+	for (i = 0;i < 1024;i++){
+		hash[i] = 0;
+	}	
+
+	if (nj){
+		dm = malloc (sizeof(float*)*numprofiles);
+		for (i = numprofiles;i--;){
+			dm[i] = malloc (sizeof (float)*(numprofiles));
+			for (j = numprofiles;j--;){
+				dm[i][j] = 0.0f;
+			}
+		}
+	}else{
+		dm = malloc (sizeof(float*)*numseq);
+		for (i = numseq;i--;){
+			dm[i] = malloc (sizeof (float)*(numseq));
+			for (j = numseq;j--;){
+				dm[i][j] = 0.0f;
+			}
+		}
+	}
+
+	b = (numseq*(numseq-1))/2;
+	a = 1;	
+	
+	for (i = 0; i < numseq-1;i++){
+		p = si->s[i];
+		for (j = si->sl[i]-5;j--;){
+			hv = ((p[j]&3)<<8) + ((p[j+1]&3)<<6) + ((p[j+2]&3)<<4)  + ((p[j+3]&3)<<2) + (p[j+4]&3);//ABCDE
+			hash[hv] = big_insert_hash(hash[hv],j);
+			hv = ((p[j]&3)<<8) + ((p[j+1]&3)<<6) + ((p[j+2]&3)<<4)  + ((p[j+3]&3)<<2) + (p[j+5]&3);//ABCDF
+			hash[hv] = big_insert_hash(hash[hv],j);
+			hv = ((p[j]&3)<<8) + ((p[j+1]&3)<<6) + ((p[j+2]&3)<<4)  + ((p[j+4]&3)<<2) + (p[j+5]&3);//ABCEF
+			hash[hv] = big_insert_hash(hash[hv],j);
+			hv = ((p[j]&3)<<8) + ((p[j+1]&3)<<6) + ((p[j+3]&3)<<4)  + ((p[j+4]&3)<<2) + (p[j+5]&3);//ABDEF
+			hash[hv] = big_insert_hash(hash[hv],j);
+			hv = ((p[j]&3)<<8) + ((p[j+2]&3)<<6) + ((p[j+3]&3)<<4) + ((p[j+4]&3)<<2) + (p[j+5]&3);//ACDEF
+			hash[hv] = big_insert_hash(hash[hv],j);
+		}
+		for (j = i+1; j < numseq;j++){
+		
+		
+			//min =  (si->sl[i] > si->sl[j]) ?si->sl[j] :si->sl[i];
+			dm[i][j] = dna_distance_calculation(hash,si->s[j],si->sl[j],si->sl[j]+si->sl[i],param->zlevel);
+			dm[i][j] /= (si->sl[i] > si->sl[j]) ?si->sl[j] :si->sl[i];
+			dm[j][i] = dm[i][j];
+			fprintf(stderr,"\r%8.0f percent done",(float)a /(float)b * 100);
+			a++;
+		}
+		
+		for (j = 1024;j--;){
+			if (hash[j]){
+				big_remove_nodes(hash[j]);
+				hash[j] = 0;
+			}
+		}
+	}
+	return dm;
+}
+
+float dna_distance_calculation(struct bignode* hash[],int* p,int seqlen,int diagonals,float mode)
+{
+
+	struct bignode* node_p;
+	float out = 0.0;
+	unsigned int* tmp = 0;
+	unsigned int* d = 0;
+	int i,j;
+	unsigned int hv;
+	
+	d = malloc(sizeof(int)*diagonals);
+	for (i = 0;i < diagonals;i++){
+		d[i] = 0;
+	}
+	for (i = seqlen-5;i--;){
+	
+		hv = ((p[i]&3)<<8) + ((p[i+1]&3)<<6) + ((p[i+2]&3)<<4)  + ((p[i+3]&3)<<2) + (p[i+4]&3);//ABCDE
+		if (hash[hv]){
+			node_p = hash[hv];		
+			while(node_p){
+				tmp = node_p->pos;
+				for(j = 0;j < node_p->num;j++){
+					d[tmp[j]]++;
+				}
+				node_p = node_p->next;
+			}
+		}	
+			
+
+		hv = ((p[i]&3)<<8) + ((p[i+1]&3)<<6) + ((p[i+2]&3)<<4)  + ((p[i+3]&3)<<2) + (p[i+5]&3);//ABCDF
+		if (hash[hv]){
+			node_p = hash[hv];		
+			while(node_p){
+				tmp = node_p->pos;
+				for(j = 0;j < node_p->num;j++){
+					d[tmp[j]]++;
+				}
+				node_p = node_p->next;
+			}
+		}	
+		hv = ((p[i]&3)<<8) + ((p[i+1]&3)<<6) + ((p[i+2]&3)<<4)  + ((p[i+4]&3)<<2) + (p[i+5]&3);//ABCEF
+		if (hash[hv]){
+			node_p = hash[hv];		
+			while(node_p){
+				tmp = node_p->pos;
+				for(j = 0;j < node_p->num;j++){
+					d[tmp[j]]++;
+				}
+				node_p = node_p->next;
+			}
+		}	
+		hv = ((p[i]&3)<<8) + ((p[i+1]&3)<<6) + ((p[i+3]&3)<<4)  + ((p[i+4]&3)<<2) + (p[i+5]&3);//ABDEF
+		if (hash[hv]){
+			node_p = hash[hv];		
+			while(node_p){
+				tmp = node_p->pos;
+				for(j = 0;j < node_p->num;j++){
+					d[tmp[j]]++;
+				}
+				node_p = node_p->next;
+			}
+		}	
+		hv = ((p[i]&3)<<8) + ((p[i+2]&3)<<6) + ((p[i+3]&3)<<4) + ((p[i+4]&3)<<2) + (p[i+5]&3);//ACDEF
+		if (hash[hv]){
+			node_p = hash[hv];		
+			while(node_p){
+				tmp = node_p->pos;
+				for(j = 0;j < node_p->num;j++){
+					d[tmp[j]]++;
+				}
+				node_p = node_p->next;
+			}
+		}	
+	
+		d++;
+	}
+	//exit(0);
+	d -= (seqlen-5);
+	
+	for (i = diagonals;i--;){
+		//d[i] /= minlen;
+		
+		//printf("%d ",d[i]);
+		
+		if(d[i] > mode){
+		//fprintf(stderr,"%f	%d\n",d[i]/ minlen,d[i]);
+			out += d[i];
+		}
+	}
+	free(d);
+	return out;
+}
+
+

Added: trunk/packages/kalign/branches/upstream/current/kalign2_dp.c
===================================================================
--- trunk/packages/kalign/branches/upstream/current/kalign2_dp.c	2006-11-19 13:38:57 UTC (rev 159)
+++ trunk/packages/kalign/branches/upstream/current/kalign2_dp.c	2006-11-29 14:12:29 UTC (rev 160)
@@ -0,0 +1,3347 @@
+/*
+	kalign2_dp.c 
+	
+	Released under GPL - see the 'COPYING' file   
+	
+	Copyright (C) 2006 Timo Lassmann <timolassmann at gmail.com>
+	
+	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
+	any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+    
+	Please send bug reports, comments etc. to:
+	timolassmann at gmail.com
+*/
+
+#include "kalign2.h"
+
+int* f_only_pp_dyn(int* path, struct dp_matrix *dp,const float* fprof1,const float* fprof2,const int len_a,const int len_b,int fdim,int stride)
+{
+//	unsigned int freq[26];
+	
+	struct states* s = 0;
+	char** trace = 0;
+	char* tracep = 0;
+	register float pa = 0;
+	register float pga = 0;
+	register float pgb = 0;
+	register float ca = 0;
+	register int i = 0;
+	register int j = 0;
+	register int c = 0;
+	register int f = 0;
+
+	s = dp->s;
+	
+	trace = dp->tb;
+
+	trace[len_a][len_b] = 32;
+
+	fprof1 += len_a * stride;
+	
+
+	s[len_b].a = 0.0;
+	s[len_b].ga = -FLOATINFTY;
+	s[len_b].gb = -FLOATINFTY;
+	//init of first row;
+	tracep = trace[len_a];
+	
+	j = len_b;
+	while(--j){
+		s[j].a = -FLOATINFTY;
+		//s[j].ga = 0;	
+
+		s[j].ga = s[j+1].a;//+prof2[29];
+		if (s[j+1].ga > s[j].ga){
+			s[j].ga = s[j+1].ga ;
+		}
+		s[j].gb = -FLOATINFTY;
+		tracep[j] = 8;
+	}
+	
+	s[0].a = -FLOATINFTY;
+	s[0].ga = -FLOATINFTY;
+	s[0].gb = -FLOATINFTY;
+	i = len_a;
+	while(--i){
+		
+		fprof1 -= stride;
+		
+		tracep = trace[i];
+  		pa = s[len_b].a;
+		pga = s[len_b].ga;
+		pgb = s[len_b].gb;
+		s[len_b].a = -FLOATINFTY;
+		s[len_b].ga = -FLOATINFTY;
+		//s[len_b].gb = 0;
+
+		s[len_b].gb = pa;//+prof1[29];
+		if(pgb > s[len_b].gb){
+			s[len_b].gb = pgb;
+		}
+	
+		tracep[len_b] = 16;
+		
+		j = len_b;
+		
+		fprof2 += len_b * stride;
+		
+		while(--j){
+			
+			fprof2 -= stride;
+			ca = s[j].a;
+
+			c = 1;
+			if((pga) > pa){
+				pa = pga;
+				c = 2;
+			}
+			if((pgb) > pa){
+				pa = pgb;
+				c = 4;
+			}
+					
+			for (f = 0; f < fdim;f++){
+//				fprintf(stderr,"%d	%d:	%d\n",i,j,fprof1[pga] * fprof2[pga+fdim]);
+				pa += fprof1[f] * fprof2[f+fdim];
+			}
+
+			s[j].a = pa;
+			
+			pga = s[j].ga;
+			
+			s[j].ga = s[j+1].a;
+			if (s[j+1].ga > s[j].ga){
+				s[j].ga = s[j+1].ga;
+				c |= 8;
+			}
+			
+			pgb = s[j].gb;
+			
+			s[j].gb = ca;
+			if(pgb > s[j].gb){
+				s[j].gb = pgb;
+				c |= 16;
+			}
+			tracep[j] = c;
+			pa = ca;
+
+		}
+			
+		fprof2 -= stride;
+		//LAST CELL (0)
+		ca = s[0].a;
+
+		c = 1;
+		if((pga) > pa){
+			pa = pga;
+			c = 2;
+		}
+		if((pgb) > pa){
+			pa = pgb;
+			c = 4;
+		}
+				
+		for (f = 0; f < fdim;f++){
+//			fprintf(stderr,"%d	%d:	%d\n",i,j,fprof1[pga] * fprof2[pga+fdim]);
+			pa += fprof1[f] * fprof2[f+fdim];
+		}
+		
+		s[0].a = pa;
+		
+		s[0].ga = -FLOATINFTY;
+		
+		pgb = s[0].gb;
+		s[0].gb = ca;
+ 		if(pgb> s[0].gb){
+			s[0].gb = pgb;
+			c |= 16;
+		}
+		tracep[0] = c;
+		
+	}
+	
+	fprof1 -= stride;
+
+	tracep = trace[0];
+	j = len_b;
+
+	fprof2 += len_b * stride;
+
+	pa = s[j].a;
+	pga = s[j].ga;
+	pgb = s[j].gb;
+	s[j].a = -FLOATINFTY;
+	s[j].ga = -FLOATINFTY;
+	//s[j].gb = -INFTY;
+	s[len_b].gb = pa;//+prof1[29];
+	if(pgb > s[len_b].gb){
+		s[len_b].gb = pgb;
+	}
+
+
+
+	while(--j){
+
+		fprof2 -= stride;
+
+		ca = s[j].a;
+
+		c = 1;
+
+		if((pga) > pa){
+			pa = pga;
+			c = 2;
+		}
+
+		if((pgb) > pa){
+			pa = pgb;
+			c = 4;
+		}
+
+		for (f = 0; f < fdim;f++){
+			pa += fprof1[f] * fprof2[f+fdim];
+//			fprintf(stderr,"%d	%d:	%d\n",i,j,fprof1[pga] * fprof2[pga+fdim]);
+		}
+
+
+		s[j].a = pa;
+		pga = s[j].ga;
+		s[j].ga = s[j+1].a;
+		if (s[j+1].ga > s[j].ga){
+			s[j].ga = s[j+1].ga;
+			c |= 8;
+		}
+		pgb = s[j].gb;
+		s[j].gb = -FLOATINFTY;
+
+		tracep[j] = c;
+		pa = ca;
+	}
+
+	fprof2 -= stride;
+
+	ca = s[0].a;
+
+	c = 1;
+
+	if((pga) > pa){
+		pa = pga;
+		c = 2;
+	}
+	if((pgb) > pa){
+		pa = pgb;
+		c = 4;
+	}
+
+	for (f = 0; f < fdim;f++){
+		pa += fprof1[f] * fprof2[f+fdim];
+//		fprintf(stderr,"%d	%d:	%d\n",i,j,fprof1[pga] * fprof2[pga+fdim]);
+	}
+
+	s[0].a = pa;
+
+	s[0].ga = s[1].a;
+	if (s[1].ga > s[0].ga){
+		s[0].ga = s[1].ga;
+		c |= 8;
+	}
+
+	pgb = s[0].gb;
+	s[0].gb = ca;
+	if(pgb> s[0].gb){
+		s[0].gb = pgb;
+		c |= 16;
+	}
+	tracep[0] = c;
+
+	pgb = s[0].gb;
+	c = 2;
+	if(s[0].ga > pgb){
+		pgb = s[0].ga;
+		c = 1;
+	}
+	if(s[0].a >= pgb){
+		pgb = s[0].a;
+		c = 0;
+	}
+
+	//fprintf(stderr,"SCORE:%d\n",ca);
+	ca = c;
+	
+	i = 0;
+	j = 0;
+	f = 1;
+	while(trace[i][j] < 32){
+	//	fprintf(stderr,"%d->%d	%d:%d	%d:%d\n",c,trace[i][j],i,j,len_a,len_b);
+		switch(f){
+			case 0:
+				if (trace[i][j] & 2){
+					f = 1;
+					if(i+1!= len_a){
+						path[c+1] |= 16;
+	//					fprintf(stderr,"GAP_CLOSE\n");
+					}else{
+						path[c+1] |= 32+16;
+					}
+				}else if (trace[i][j] & 4){
+					f = 2;
+					if(j+1!= len_b){
+						path[c+1] |= 16;
+	//					fprintf(stderr,"GAP_CLOSE\n");
+					}else{
+						path[c+1] |= 32+16;
+					}
+				}
+
+				//path[c] = 0;
+				i++;
+				j++;
+			break;
+			case 1:
+				if(trace[i][j] & 8){
+					f = 1;
+					if(i!=0 && i!= len_a){
+	//				/	fprintf(stderr,"GAP_EXT\n");
+						if(!(path[c]&16)){
+							path[c] |= 8;
+						}
+					}else{
+						if(!(path[c]&16)){
+							path[c] |= 32+8;
+						}
+					}
+				}else{
+					f = 0;
+					if(i!=0 && i!= len_a){
+	//					fprintf(stderr,"GAP_OPEN\n");
+						path[c] |= 4;
+					}else{
+						path[c] |= 32+4;
+					}
+				}
+				path[c] |= 1;
+				j++;
+			break;
+			case  2:
+				if(trace[i][j] & 16){
+					f = 2;
+					if(j !=0 && j != len_b){
+	//					fprintf(stderr,"GAP_EXT\n");
+						if(!(path[c]&16)){
+							path[c] |= 8;
+						}
+					}else{
+						if(!(path[c]&16)){
+							path[c] |= 32+8;
+						}
+					}
+				}else{
+					f = 0;
+					if(j!=0 && j != len_b){
+	//					fprintf(stderr,"GAP_OPEN\n");
+						path[c] |= 4;
+					}else{
+						path[c] |= 32+4;
+					}
+					
+				}
+				path[c] |= 2;
+				i++;
+			break;
+		}
+		c++;
+	}
+	path[0] = c-1;
+	path[c] = 3;
+	path[c+1] = pgb;
+	return path;
+}
+
+
+
+int* fpp_dyn(int* path, struct dp_matrix *dp,const float* prof1,const float* prof2,const float* fprof1,const float* fprof2,const int len_a,const int len_b,int fdim,int stride)
+{
+	unsigned int freq[26];
+	
+	struct states* s = 0;
+	char** trace = 0;
+	char* tracep = 0;
+	register float pa = 0;
+	register float pga = 0;
+	register float pgb = 0;
+	register float ca = 0;
+	register int i = 0;
+	register int j = 0;
+	register int c = 0;
+	register int f = 0;
+	
+
+	s = dp->s;
+	
+	trace = dp->tb;
+
+	trace[len_a][len_b] = 32;
+
+	prof1 +=  len_a << 6;
+	
+	fprof1 += len_a * stride;
+	
+
+	s[len_b].a = 0;
+	s[len_b].ga = -FLOATINFTY;
+	s[len_b].gb = -FLOATINFTY;
+	//init of first row;
+	tracep = trace[len_a];
+	
+	j = len_b;
+	while(--j){
+		s[j].a = -FLOATINFTY;
+		//s[j].ga = 0;	
+		
+		s[j].ga = s[j+1].a+prof2[29];//+prof2[29];
+		if (s[j+1].ga+prof2[29] > s[j].ga){
+			s[j].ga = s[j+1].ga+prof2[29];
+		}
+		s[j].gb = -FLOATINFTY;
+		tracep[j] = 8;
+	}
+	
+	s[0].a = -FLOATINFTY;
+	s[0].ga = -FLOATINFTY;
+	s[0].gb = -FLOATINFTY;
+	i = len_a;
+	while(--i){
+		prof1 -= 64;
+		
+		fprof1 -= stride;
+
+		c = 1;
+		for (j = 26; j--;){
+			if(prof1[j]){
+				freq[c] = j;
+				c++;	
+			}
+		}
+		freq[0] = c;
+		
+		tracep = trace[i];
+		pa = s[len_b].a;
+		pga = s[len_b].ga;
+		pgb = s[len_b].gb;
+		s[len_b].a = -FLOATINFTY;
+		s[len_b].ga = -FLOATINFTY;
+		//s[len_b].gb = 0;
+		
+		s[len_b].gb = pa+prof1[29];//+prof1[29];
+		if(pgb+prof1[29] > s[len_b].gb){
+			s[len_b].gb = pgb+prof1[29];
+		}
+	
+		tracep[len_b] = 16;
+		
+		j = len_b;
+		prof2 += len_b << 6;
+		
+		fprof2 += len_b * stride;
+		
+		while(--j){
+			prof2 -= 64;
+			
+			fprof2 -= stride;
+			ca = s[j].a;
+
+			c = 1;
+			if((pga += prof2[91]) > pa){
+				pa = pga;
+				c = 2;
+			}
+			if((pgb += prof1[91]) > pa){
+				pa = pgb;
+				c = 4;
+			}
+			
+			prof2 += 32;
+			for (f = freq[0];--f;){
+				pa += prof1[freq[f]]*prof2[freq[f]];
+			}
+			prof2 -= 32;
+			
+			for (f = 0; f < fdim;f++){
+			//	fprintf(stderr,"%d	%d:	%d\n",i,j,fprof1[pga] * fprof2[pga+fdim]);
+				pa += fprof1[f] * fprof2[f+fdim];
+			}
+
+			s[j].a = pa;
+			
+			pga = s[j].ga;
+			
+			s[j].ga = s[j+1].a+prof2[27];
+			if (s[j+1].ga+prof2[28] > s[j].ga){
+				s[j].ga = s[j+1].ga+prof2[28];
+				c |= 8;
+			}
+			
+			pgb = s[j].gb;
+			
+			s[j].gb = ca+prof1[27];
+			if(pgb+prof1[28] > s[j].gb){
+				s[j].gb = pgb+prof1[28];
+				c |= 16;
+			}
+			tracep[j] = c;
+			pa = ca;
+
+		}
+	
+		prof2 -= 64;
+		
+		fprof2 -= stride;
+		//LAST CELL (0)
+		ca = s[0].a;
+
+		c = 1;
+		if((pga+=prof2[91]) > pa){
+			pa = pga;
+			c = 2;
+		}
+		if((pgb+=prof1[91]) > pa){
+			pa = pgb;
+			c = 4;
+		}
+		
+		prof2 += 32;
+		for (f = freq[0];--f;){
+			pa += prof1[freq[f]]*prof2[freq[f]];
+		}
+		prof2 -= 32;
+		
+		for (f = 0; f < fdim;f++){
+		//	fprintf(stderr,"%d	%d:	%d\n",i,j,fprof1[pga] * fprof2[pga+fdim]);
+			pa += fprof1[f] * fprof2[f+fdim];
+		}
+		
+		s[0].a = pa;
+		
+		s[0].ga = -FLOATINFTY;
+		
+		pgb = s[0].gb;
+		s[0].gb = ca+prof1[27]+prof1[29];
+ 		if(pgb+prof1[29] > s[0].gb){
+			s[0].gb = pgb+prof1[29];
+			c |= 16;
+		}
+		tracep[0] = c;	
+		
+	}
+	prof1 -= 64;
+	
+	fprof1 -= stride;
+	
+	c = 1;
+	for (j = 26; j--;){
+		if(prof1[j]){
+			freq[c] = j;
+			c++;	
+		}
+	}
+	freq[0] = c;
+	
+	tracep = trace[0];
+	j = len_b;
+	prof2 += len_b << 6;
+	
+	fprof2 += len_b * stride;
+	
+	pa = s[j].a;
+	pga = s[j].ga;
+	pgb = s[j].gb;
+	s[j].a = -FLOATINFTY;
+	s[j].ga = -FLOATINFTY;
+	//s[j].gb = -INFTY;
+	s[len_b].gb = pa+prof1[29];//+prof1[29];
+	if(pgb+prof1[29] > s[len_b].gb){
+		s[len_b].gb = pgb+prof1[29];
+	}
+
+
+	
+	while(--j){
+		prof2 -= 64;
+		
+		fprof2 -= stride;
+		
+		ca = s[j].a;
+
+		c = 1;
+
+		if((pga+=prof2[91]) > pa){
+			pa = pga;
+			c = 2;
+		}
+
+		if((pgb+=prof1[91]) > pa){
+			pa = pgb;
+			c = 4;
+		}
+		
+		prof2+=32;
+		for (f = freq[0];--f;){
+			pa += prof1[freq[f]]*prof2[freq[f]];
+		}
+		prof2-=32;
+		
+		
+		for (f = 0; f < fdim;f++){
+			pa += fprof1[f] * fprof2[f+fdim];
+//			fprintf(stderr,"%d	%d:	%d\n",i,j,fprof1[pga] * fprof2[pga+fdim]);
+		}
+		
+		
+		s[j].a = pa;
+		pga = s[j].ga;
+		s[j].ga = s[j+1].a+prof2[27]+prof2[29];
+		if (s[j+1].ga+prof2[29] > s[j].ga){
+			s[j].ga = s[j+1].ga+prof2[29];
+			c |= 8;
+		}	
+		pgb = s[j].gb;
+		s[j].gb = -FLOATINFTY;	
+		
+		tracep[j] = c;
+		pa = ca;
+	}
+	prof2 -= 64;
+	
+	fprof2 -= stride;
+
+	ca = s[0].a;
+	
+	c = 1;
+	
+	if((pga+=prof2[91]) > pa){
+		pa = pga;
+		c = 2;
+	}
+	if((pgb+=prof1[91]) > pa){
+		pa = pgb;
+		c = 4;
+	}
+	prof2+=32;
+	for (f = freq[0];--f;){
+		pa += prof1[freq[f]]*prof2[freq[f]];
+	}
+	prof2-=32;
+			
+	for (f = 0; f < fdim;f++){
+		pa += fprof1[f] * fprof2[f+fdim];
+//		fprintf(stderr,"%d	%d:	%d\n",i,j,fprof1[pga] * fprof2[pga+fdim]);
+	}
+	
+	s[0].a = pa;
+	
+	s[0].ga = s[1].a+prof2[27]+prof2[29];
+	if (s[1].ga+prof2[29] > s[0].ga){
+		s[0].ga = s[1].ga+prof2[29];
+		c |= 8;
+	}
+	
+	pgb = s[0].gb;
+	s[0].gb = ca+prof1[27]+prof1[29];
+	if(pgb +prof1[29]> s[0].gb){
+		s[0].gb = pgb+prof1[29];
+		c |= 16;
+	}	
+	tracep[0] = c;
+
+	pgb = s[0].gb;
+	c = 2;
+	if(s[0].ga > pgb){
+		pgb = s[0].ga;
+		c = 1;
+	}
+	if(s[0].a >= pgb){
+		pgb = s[0].a;
+		c = 0;
+	}
+	
+	//fprintf(stderr,"SCORE:%d\n",ca);
+	f = c;
+	
+	i = 0;
+	j = 0;
+	c = 1;
+	while(trace[i][j] < 32){
+	//	fprintf(stderr,"%d->%d	%d:%d	%d:%d\n",c,trace[i][j],i,j,len_a,len_b);
+		switch(f){
+			case 0:
+				if (trace[i][j] & 2){
+					f = 1;
+					if(i+1!= len_a){
+						path[c+1] |= 16;
+	//					fprintf(stderr,"GAP_CLOSE\n");
+					}else{
+						path[c+1] |= 32+16;
+					}
+				}else if (trace[i][j] & 4){
+					f = 2;
+					if(j+1!= len_b){
+						path[c+1] |= 16;
+	//					fprintf(stderr,"GAP_CLOSE\n");
+					}else{
+						path[c+1] |= 32+16;
+					}
+				}
+
+				//path[c] = 0;
+				i++;
+				j++;
+			break;
+			case 1:
+				if(trace[i][j] & 8){
+					f = 1;
+					if(i!=0 && i!= len_a){
+	//				/	fprintf(stderr,"GAP_EXT\n");
+						if(!(path[c]&16)){
+							path[c] |= 8;
+						}
+					}else{
+						if(!(path[c]&16)){
+							path[c] |= 32+8;
+						}
+					}
+				}else{
+					f = 0;
+					if(i!=0 && i!= len_a){
+	//					fprintf(stderr,"GAP_OPEN\n");
+						path[c] |= 4;
+					}else{
+						path[c] |= 32+4;
+					}
+				}
+				path[c] |= 1;
+				j++;
+			break;
+			case  2:
+				if(trace[i][j] & 16){
+					f = 2;
+					if(j !=0 && j != len_b){
+	//					fprintf(stderr,"GAP_EXT\n");
+						if(!(path[c]&16)){
+							path[c] |= 8;
+						}
+					}else{
+						if(!(path[c]&16)){
+							path[c] |= 32+8;
+						}
+					}
+				}else{
+					f = 0;
+					if(j!=0 && j != len_b){
+	//					fprintf(stderr,"GAP_OPEN\n");
+						path[c] |= 4;
+					}else{
+						path[c] |= 32+4;
+					}
+					
+				}
+				path[c] |= 2;
+				i++;
+			break;
+		}
+		c++;
+	}
+	path[0] = c-1;
+	path[c] = 3;
+	path[c+1] = pgb;
+	return path;
+}
+/*
+int* dna_pp_dyn(int* path, struct dp_matrix *dp,const int* prof1,const int* prof2,const int len_a,const int len_b)
+{
+
+	struct states* s = 0;
+	char** trace = 0;
+	char* tracep = 0;
+	register int pa = 0;
+	register int pga = 0;
+	register int pgb = 0;
+	register int ca = 0;
+	register int i = 0;
+	register int j = 0;
+	register int c = 0;
+
+	s = dp->s;
+	
+	trace = dp->tb;
+
+	trace[len_a][len_b] = 32;
+
+	prof1 +=  len_a * 22;
+
+	s[len_b].a = 0;
+	s[len_b].ga = -INFTY;
+	s[len_b].gb = -INFTY;
+	//init of first row;
+	tracep = trace[len_a];
+	
+	j = len_b;
+	while(--j){
+		s[j].a = -INFTY;
+		//s[j].ga = 0;	
+		
+		s[j].ga = s[j+1].a+prof2[10];//+prof2[29];
+		if (s[j+1].ga+prof2[10] > s[j].ga){
+			s[j].ga = s[j+1].ga+prof2[10];
+		}
+		s[j].gb = -INFTY;
+		tracep[j] = 8;
+	}
+	
+	s[0].a = -INFTY;
+	s[0].ga = -INFTY;
+	s[0].gb = -INFTY;
+	i = len_a;
+	while(--i){
+		prof1 -= 22;
+
+		tracep = trace[i];
+		pa = s[len_b].a;
+		pga = s[len_b].ga;
+		pgb = s[len_b].gb;
+		s[len_b].a = -INFTY;
+		s[len_b].ga = -INFTY;
+		//s[len_b].gb = 0;
+		
+		s[len_b].gb = pa+prof1[10];//+prof1[29];
+		if(pgb+prof1[10] > s[len_b].gb){
+			s[len_b].gb = pgb+prof1[10];
+		}
+	
+		tracep[len_b] = 16;
+		
+		j = len_b;
+		prof2 += len_b *22;
+		while(--j){
+			prof2 -= 22;
+			ca = s[j].a;
+
+			c = 1;
+			if((pga += prof2[30]) > pa){
+				pa = pga;
+				c = 2;
+			}
+			if((pgb += prof1[30]) > pa){
+				pa = pgb;
+				c = 4;
+			}
+			
+			prof2 += 11;
+			for (pga = 8;pga--;){
+				pa += prof1[pga]*prof2[pga];
+			}
+			prof2 -= 11;
+
+			s[j].a = pa;
+			
+			pga = s[j].ga;
+			
+			s[j].ga = s[j+1].a+prof2[8];
+			if (s[j+1].ga+prof2[9] > s[j].ga){
+				s[j].ga = s[j+1].ga+prof2[9];
+				c |= 8;
+			}
+			
+			pgb = s[j].gb;
+			
+			s[j].gb = ca+prof1[8];
+			if(pgb+prof1[9] > s[j].gb){
+				s[j].gb = pgb+prof1[9];
+				c |= 16;
+			}
+			tracep[j] = c;
+			pa = ca;
+
+		}
+	
+		prof2 -= 22;
+		//LAST CELL (0)
+		ca = s[0].a;
+
+		c = 1;
+		if((pga+=prof2[30]) > pa){
+			pa = pga;
+			c = 2;
+		}
+		if((pgb+=prof1[30]) > pa){
+			pa = pgb;
+			c = 4;
+		}
+		
+		prof2 += 11;
+		for (pga = 8;pga--;){
+			pa += prof1[pga]*prof2[pga];
+		}
+		prof2 -= 11;
+		
+		s[0].a = pa;
+		
+		s[0].ga = -INFTY;
+		
+		pgb = s[0].gb;
+		s[0].gb = ca+prof1[8]+prof1[10];
+ 		if(pgb+prof1[10] > s[0].gb){
+			s[0].gb = pgb+prof1[10];
+			c |= 16;
+		}
+		tracep[0] = c;	
+		
+	}
+	prof1 -= 22;
+	
+	tracep = trace[0];
+	j = len_b;
+	prof2 += len_b *22;
+	pa = s[j].a;
+	pga = s[j].ga;
+	pgb = s[j].gb;
+	s[j].a = -INFTY;
+	s[j].ga = -INFTY;
+	//s[j].gb = -INFTY;
+	s[len_b].gb = pa+prof1[10];//+prof1[29];
+	if(pgb+prof1[10] > s[len_b].gb){
+		s[len_b].gb = pgb+prof1[10];
+	}
+
+
+	
+	while(--j){
+		prof2 -= 22;
+		ca = s[j].a;
+
+		c = 1;
+
+		if((pga+=prof2[30]) > pa){
+			pa = pga;
+			c = 2;
+		}
+
+		if((pgb+=prof1[30]) > pa){
+			pa = pgb;
+			c = 4;
+		}
+		
+		prof2+=11;
+		
+		for (pga = 8;pga--;){
+			pa += prof1[pga]*prof2[pga];
+		}
+		prof2-=11;
+		
+		s[j].a = pa;
+		pga = s[j].ga;
+		s[j].ga = s[j+1].a+prof2[2]+prof2[10];
+		if (s[j+1].ga+prof2[10] > s[j].ga){
+			s[j].ga = s[j+1].ga+prof2[10];
+			c |= 8;
+		}	
+		pgb = s[j].gb;
+		s[j].gb = -INFTY;	
+		
+		tracep[j] = c;
+		pa = ca;
+	}
+	prof2 -= 22;
+
+	ca = s[0].a;
+	
+	c = 1;
+	
+	if((pga+=prof2[30]) > pa){
+		pa = pga;
+		c = 2;
+	}
+	if((pgb+=prof1[30]) > pa){
+		pa = pgb;
+		c = 4;
+	}
+	prof2+=11;
+	for (pga = 8;pga--;){
+		pa += prof1[pga]*prof2[pga];
+	}
+	prof2-=11;
+	
+	s[0].a = pa;
+	
+	s[0].ga = s[1].a+prof2[8]+prof2[10];
+	if (s[1].ga+prof2[10] > s[0].ga){
+		s[0].ga = s[1].ga+prof2[10];
+		c |= 8;
+	}
+	
+	pgb = s[0].gb;
+	s[0].gb = ca+prof1[8]+prof1[10];
+	if(pgb +prof1[10]> s[0].gb){
+		s[0].gb = pgb+prof1[10];
+		c |= 16;
+	}	
+	tracep[0] = c;
+
+	pgb = s[0].gb;
+	c = 2;
+	if(s[0].ga > pgb){
+		pgb = s[0].ga;
+		c = 1;
+	}
+	if(s[0].a >= pgb){
+		pgb = s[0].a;
+		c = 0;
+	}
+	
+	//fprintf(stderr,"SCORE:%d\n",ca);
+	ca = c;
+	
+	i = 0;
+	j = 0;
+	c = 1;
+	while(trace[i][j] < 32){
+	//	fprintf(stderr,"%d->%d	%d:%d	%d:%d\n",c,trace[i][j],i,j,len_a,len_b);
+		switch(ca){
+			case 0:
+				if (trace[i][j] & 2){
+					ca = 1;
+					if(i+1!= len_a){
+						path[c+1] |= 16;
+	//					fprintf(stderr,"GAP_CLOSE\n");
+					}else{
+						path[c+1] |= 32+16;
+					}
+				}else if (trace[i][j] & 4){
+					ca = 2;
+					if(j+1!= len_b){
+						path[c+1] |= 16;
+	//					fprintf(stderr,"GAP_CLOSE\n");
+					}else{
+						path[c+1] |= 32+16;
+					}
+				}
+
+				//path[c] = 0;
+				i++;
+				j++;
+			break;
+			case 1:
+				if(trace[i][j] & 8){
+					ca = 1;
+					if(i!=0 && i!= len_a){
+	//				/	fprintf(stderr,"GAP_EXT\n");
+						if(!(path[c]&16)){
+							path[c] |= 8;
+						}
+					}else{
+						if(!(path[c]&16)){
+							path[c] |= 32+8;
+						}
+					}
+				}else{
+					ca = 0;
+					if(i!=0 && i!= len_a){
+	//					fprintf(stderr,"GAP_OPEN\n");
+						path[c] |= 4;
+					}else{
+						path[c] |= 32+4;
+					}
+				}
+				path[c] |= 1;
+				j++;
+			break;
+			case  2:
+				if(trace[i][j] & 16){
+					ca = 2;
+					if(j !=0 && j != len_b){
+	//					fprintf(stderr,"GAP_EXT\n");
+						if(!(path[c]&16)){
+							path[c] |= 8;
+						}
+					}else{
+						if(!(path[c]&16)){
+							path[c] |= 32+8;
+						}
+					}
+				}else{
+					ca = 0;
+					if(j!=0 && j != len_b){
+	//					fprintf(stderr,"GAP_OPEN\n");
+						path[c] |= 4;
+					}else{
+						path[c] |= 32+4;
+					}
+					
+				}
+				path[c] |= 2;
+				i++;
+			break;
+		}
+		c++;
+	}
+	path[0] = c-1;
+	path[c] = 3;
+	path[c+1] = pgb;
+	return path;
+}
+
+
+int* pp_dyn2(int* path, struct dp_matrix *dp,const int* prof1,const int* prof2,const int len_a,const int len_b)
+{
+	unsigned int freq[26];
+	
+	struct states* s = 0;
+	char** trace = 0;
+	char* tracep = 0;
+	register int pa = 0;
+	register int pga = 0;
+	register int pgb = 0;
+	register int ca = 0;
+	register int i = 0;
+	register int j = 0;
+	register int c = 0;
+
+	s = dp->s;
+	
+	trace = dp->tb;
+
+	trace[len_a][len_b] = 32;
+
+	prof1 +=  len_a << 6;
+
+	s[len_b].a = 0;
+	s[len_b].ga = -INFTY;
+	s[len_b].gb = -INFTY;
+	//init of first row;
+	tracep = trace[len_a];
+	
+	j = len_b;
+	while(--j){
+		s[j].a = -INFTY;
+	
+		s[j].ga = s[j+1].a+prof2[29];//+prof2[29];
+		if (s[j+1].ga+prof2[29] > s[j].ga){
+			s[j].ga = s[j+1].ga+prof2[29];
+		}
+		s[j].gb = -INFTY;
+		tracep[j] = 8;
+	}
+	
+	s[0].a = -INFTY;
+	s[0].ga = -INFTY;
+	s[0].gb = -INFTY;
+	i = len_a;
+	while(--i){
+		prof1 -= 64;
+
+		c = 1;
+		for (j = 23; j--;){
+			if(prof1[j]){
+				freq[c] = j;
+				c++;	
+			}
+		}
+		freq[0] = c;
+		
+		tracep = trace[i];
+		pa = s[len_b].a;
+		pga = s[len_b].ga;
+		pgb = s[len_b].gb;
+		s[len_b].a = -INFTY;
+		s[len_b].ga = -INFTY;
+		
+		s[len_b].gb = pa+prof1[29];
+		if(pgb+prof1[29] > s[len_b].gb){
+			s[len_b].gb = pgb+prof1[29];
+		}
+	
+		tracep[len_b] = 16;
+		
+		j = len_b;
+		prof2 += len_b << 6;
+		while(--j){
+			prof2 -= 64;
+			ca = s[j].a;
+
+			c = 1;
+			if((pga += prof2[91]) > pa){
+				pa = pga;
+				c = 2;
+			}
+			if((pgb += prof1[91]) > pa){
+				pa = pgb;
+				c = 4;
+			}
+			
+			prof2 += 32;
+			for (pga = freq[0];--pga;){
+				pgb = freq[pga];
+				pa += prof1[pgb]*prof2[pgb];
+			}
+			prof2 -= 32;
+
+			s[j].a = pa;
+
+			pga = s[j].ga;
+			
+			s[j].ga = s[j+1].a+prof2[27];
+			if (s[j+1].ga+prof2[28] > s[j].ga){
+				s[j].ga = s[j+1].ga+prof2[28];
+				c |= 8;
+			}
+			
+			pgb = s[j].gb;
+			
+			s[j].gb = ca+prof1[27];
+			if(pgb+prof1[28] > s[j].gb){
+				s[j].gb = pgb+prof1[28];
+				c |= 16;
+			}
+			tracep[j] = c;
+			pa = ca;
+
+		}
+	
+		prof2 -= 64;
+		//LAST CELL (0)
+		ca = s[0].a;
+
+		c = 1;
+		if((pga+=prof2[91]) > pa){
+			pa = pga;
+			c = 2;
+		}
+		if((pgb+=prof1[91]) > pa){
+			pa = pgb;
+			c = 4;
+		}
+		
+		prof2 += 32;
+		for (pga = freq[0];--pga;){
+			pgb = freq[pga];
+			pa += prof1[pgb]*prof2[pgb];
+		}
+		prof2 -= 32;
+		
+		s[0].a = pa;
+		
+		s[0].ga = -INFTY;
+		
+		pgb = s[0].gb;
+		s[0].gb = ca+prof1[27]+prof1[29];
+ 		if(pgb+prof1[29] > s[0].gb){
+			s[0].gb = pgb+prof1[29];
+			c |= 16;
+		}
+		tracep[0] = c;	
+		
+	}
+	prof1 -= 64;
+	
+	c = 1;
+	for (j = 23; j--;){
+		if(prof1[j]){
+			freq[c] = j;
+			c++;	
+		}
+	}
+	freq[0] = c;
+	
+	tracep = trace[0];
+	j = len_b;
+	prof2 += len_b << 6;
+	pa = s[j].a;
+	pga = s[j].ga;
+	pgb = s[j].gb;
+	s[j].a = -INFTY;
+	s[j].ga = -INFTY;
+	
+	s[len_b].gb = pa+prof1[29];
+	if(pgb+prof1[29] > s[len_b].gb){
+		s[len_b].gb = pgb+prof1[29];
+	}
+
+
+	
+	while(--j){
+		prof2 -= 64;
+		ca = s[j].a;
+
+		c = 1;
+
+		if((pga+=prof2[91]) > pa){
+			pa = pga;
+			c = 2;
+		}
+
+		if((pgb+=prof1[91]) > pa){
+			pa = pgb;
+			c = 4;
+		}
+		
+		prof2+=32;
+		
+		for (pga = freq[0];--pga;){
+			pgb = freq[pga];
+			pa += prof1[pgb]*prof2[pgb];
+		}
+		prof2-=32;
+		
+		s[j].a = pa;
+		pga = s[j].ga;
+		s[j].ga = s[j+1].a+prof2[27]+prof2[29];
+		if (s[j+1].ga+prof2[29] > s[j].ga){
+			s[j].ga = s[j+1].ga+prof2[29];
+			c |= 8;
+		}	
+		pgb = s[j].gb;
+		s[j].gb = -INFTY;	
+		
+		tracep[j] = c;
+		pa = ca;
+	}
+	prof2 -= 64;
+
+	ca = s[0].a;
+	
+	c = 1;
+	
+	if((pga+=prof2[91]) > pa){
+		pa = pga;
+		c = 2;
+	}
+	if((pgb+=prof1[91]) > pa){
+		pa = pgb;
+		c = 4;
+	}
+	prof2+=32;
+	for (pga = freq[0];--pga;){	
+		pgb = freq[pga];
+		pa += prof1[pgb]*prof2[pgb];
+	}
+	prof2-=32;
+	
+	s[0].a = pa;
+	
+	s[0].ga = s[1].a+prof2[27]+prof2[29];
+	if (s[1].ga+prof2[29] > s[0].ga){
+		s[0].ga = s[1].ga+prof2[29];
+		c |= 8;
+	}
+	
+	pgb = s[0].gb;
+	s[0].gb = ca+prof1[27]+prof1[29];
+	if(pgb +prof1[29]> s[0].gb){
+		s[0].gb = pgb+prof1[29];
+		c |= 16;
+	}	
+	tracep[0] = c;
+
+	pgb = s[0].gb;
+	c = 2;
+	if(s[0].ga > pgb){
+		pgb = s[0].ga;
+		c = 1;
+	}
+	if(s[0].a >= pgb){
+		pgb = s[0].a;
+		c = 0;
+	}
+
+	ca = c;
+	
+	int ga = 1; 
+	int gb = 1;
+	i = 0;
+	j = 0;
+	c = 1;
+	while(trace[i][j] < 32){
+		if(i ==0 || j == 0){
+			path[c] |= 128;
+		}
+		if(i ==len_a || j == len_b){
+			path[c] |= 64;
+		}
+	
+		switch(ca){
+			case 0:
+				if (trace[i][j] & 2){
+					ca = 1;
+				}else if (trace[i][j] & 4){
+					ca = 2;
+				}
+				path[c] = 0;
+				i++;
+				j++;
+			break;
+			case 1:
+				if(trace[i][j] & 8){
+					ca = 1;
+				}else{
+					path[c-(gb-1)] |= gb << 16;
+					gb = 0;
+					ca = 0;
+				}
+				path[c] |= 1;
+				j++;
+				gb++;
+			break;
+			case  2:
+				if(trace[i][j] & 16){
+					ca = 2;
+				}else{
+					path[c-(ga-1)] |= ga << 16;
+					ga = 0;
+					ca = 0;
+				}
+				path[c] |= 2;
+				i++;
+				ga++;
+			break;
+		}
+		c++;
+	}
+	if (ca == 1){
+		path[c-(gb-1)] |= (gb-1) << 16;	
+	}
+	if(ca == 2){
+		path[c-(ga-1)] |= (ga-1) << 16;	
+	}
+	path[0] = c-1;
+	path[c] = 3;
+	path[c+1] = pgb;
+	return path;
+}
+
+int* ps_dyn2(int* path, struct dp_matrix *dp,const int* prof1,const int* seq2,const int len_a,const int len_b,int sip)
+{
+	
+	struct states* s = 0;
+	char** trace = 0;
+	char* tracep = 0;
+	register int pa = 0;
+	register int pga = 0;
+	register int pgb = 0;
+	register int ca = 0;
+	register int i = 0;
+	register int j = 0;
+	register int c = 0;
+	
+	const int open = gpo * sip;
+	const int ext = gpe *sip; 
+
+	
+
+	s = dp->s;
+	
+	trace = dp->tb;
+
+	trace[len_a][len_b] = 32;
+
+	prof1 +=  len_a << 6;
+
+	s[len_b].a = 0;
+	s[len_b].ga = -INFTY;
+	s[len_b].gb = -INFTY;
+	tracep = trace[len_a];
+	j = len_b;
+	
+
+	while(--j){
+		s[j].a = -INFTY;
+		s[j].ga = s[j+1].a-tgpe;
+		if (s[j+1].ga-tgpe > s[j].ga){
+			s[j].ga = s[j+1].ga-tgpe;
+		}
+		
+		
+		
+		s[j].gb = -INFTY;
+		tracep[j] = 8;
+	}
+	
+	s[0].a = -INFTY;
+	s[0].ga = -INFTY;
+	s[0].gb = -INFTY;
+	i = len_a;
+	while(--i){
+		prof1 -= 64;
+		
+		tracep = trace[i];
+		pa = s[len_b].a;
+		pga = s[len_b].ga;
+		pgb = s[len_b].gb;
+		s[len_b].a = -INFTY;
+		s[len_b].ga = -INFTY;
+
+		s[len_b].gb = pa+prof1[29];
+		if(pgb+prof1[29] > s[len_b].gb){
+			s[len_b].gb = pgb+prof1[29];
+		}
+		
+		
+		
+		
+		tracep[len_b] = 16;
+		
+		j = len_b;
+		
+		while(--j){
+
+			ca = s[j].a;
+
+			c = 1;
+			if((pga -= open) > pa){
+				pa = pga;
+				c = 2;
+			}
+			if((pgb += prof1[91]) > pa){
+				pa = pgb;
+				c = 4;
+			}
+			
+			pa += prof1[32 + seq2[j]];
+
+			s[j].a = pa;
+			
+			pga = s[j].ga;
+			
+			s[j].ga = s[j+1].a-open;
+			if (s[j+1].ga-ext > s[j].ga){
+				s[j].ga = s[j+1].ga-ext;
+				c |= 8;
+			}
+			
+			pgb = s[j].gb;
+			
+			s[j].gb = ca+prof1[27];
+			if(pgb+prof1[28] > s[j].gb){
+				s[j].gb = pgb+prof1[28];
+				c |= 16;
+			}
+			tracep[j] = c;
+			pa = ca;
+
+		}
+	
+		ca = s[0].a;
+
+		c = 1;
+		if((pga-=open) > pa){
+			pa = pga;
+			c = 2;
+		}
+		if((pgb+=prof1[91]) > pa){
+			pa = pgb;
+			c = 4;
+		}
+		pa += prof1[32+seq2[0]];
+		s[0].a = pa;
+		
+		s[0].ga = -INFTY;
+		
+		pgb = s[0].gb;
+		s[0].gb = ca+prof1[27]+prof1[29];
+ 		if(pgb+prof1[29] > s[0].gb){
+			s[0].gb = pgb+prof1[29];
+			c |= 16;
+		}
+		tracep[0] = c;	
+		
+	}
+	prof1 -= 64;
+	
+
+	
+	tracep = trace[0];
+	j = len_b;
+	pa = s[j].a;
+	pga = s[j].ga;
+	pgb = s[j].gb;
+	s[j].a = -INFTY;
+	s[j].ga = -INFTY;
+
+	s[len_b].gb = pa+prof1[29];
+	if(pgb+prof1[29] > s[len_b].gb){
+		s[len_b].gb = pgb+prof1[29];
+	}
+
+	
+	while(--j){
+
+		ca = s[j].a;
+
+		c = 1;
+
+		if((pga-=open) > pa){
+			pa = pga;
+			c = 2;
+		}
+
+		if((pgb+=prof1[91]) > pa){
+			pa = pgb;
+			c = 4;
+		}
+		pa += prof1[32+seq2[j]];		
+		s[j].a = pa;
+		pga = s[j].ga;
+		s[j].ga = s[j+1].a-(open+tgpe);
+		if (s[j+1].ga-tgpe > s[j].ga){
+			s[j].ga = s[j+1].ga-tgpe;
+			c |= 8;
+		}	
+		pgb = s[j].gb;
+		s[j].gb = -INFTY;	
+		
+		tracep[j] = c;
+		pa = ca;
+	}
+
+
+	ca = s[0].a;
+	
+	c = 1;
+	
+	if((pga-=open) > pa){
+		pa = pga;
+		c = 2;
+	}
+	if((pgb+=prof1[91]) > pa){
+		pa = pgb;
+		c = 4;
+	}
+	pa += prof1[32+seq2[0]];	
+	s[0].a = pa;
+	
+	s[0].ga = s[1].a-(open+tgpe);
+	if (s[1].ga-tgpe > s[0].ga){
+		s[0].ga = s[1].ga-tgpe;
+		c |= 8;
+	}
+	
+	pgb = s[0].gb;
+	s[0].gb = ca+prof1[27]+prof1[29];
+	if(pgb+prof1[29] > s[0].gb){
+		s[0].gb = pgb+prof1[29];
+		c |= 16;
+	}	
+	tracep[0] = c;
+
+
+	pgb = s[0].gb;
+	c = 2;
+	if(s[0].ga > pgb){
+		pgb = s[0].ga;
+		c = 1;
+	}
+	if(s[0].a >= pgb){
+		pgb = s[0].a;
+		c = 0;
+	}
+	
+	ca = c;
+	int ga = 1; 
+	int gb = 1;
+	i = 0;
+	j = 0;
+	c = 1;
+	while(trace[i][j] < 32){
+		if(i ==0 || j == 0){
+			path[c] |= 128;
+		}
+		if(i ==len_a || j == len_b){
+			path[c] |= 64;
+		}
+	
+		switch(ca){
+			case 0:
+				if (trace[i][j] & 2){
+					ca = 1;
+				}else if (trace[i][j] & 4){
+					ca = 2;
+				}
+				path[c] = 0;
+				i++;
+				j++;
+			break;
+			case 1:
+				if(trace[i][j] & 8){
+					ca = 1;
+				}else{
+					path[c-(gb-1)] |= gb << 16;
+					gb = 0;
+					ca = 0;
+				}
+				path[c] |= 1;
+				j++;
+				gb++;
+			break;
+			case  2:
+				if(trace[i][j] & 16){
+					ca = 2;
+				}else{
+					path[c-(ga-1)] |= ga << 16;
+					ga = 0;
+					ca = 0;
+				}
+				path[c] |= 2;
+				i++;
+				ga++;
+			break;
+		}
+		c++;
+	}
+	if (ca == 1){
+		path[c-(gb-1)] |= (gb-1) << 16;	
+	}
+	if(ca == 2){
+		path[c-(ga-1)] |= (ga-1) << 16;	
+	}
+	path[0] = c-1;
+	path[c] = 3;
+	path[c+1] = pgb;
+	return path;
+}
+
+int* ss_dyn2(int**subm,int* path, struct dp_matrix *dp,const int* seq1,const int* seq2,const int len_a,const int len_b)
+{
+	struct states* s = 0;
+	int *subp = 0;
+	char** trace = 0;
+	char* tracep = 0;
+	register int pa = 0;
+	register int pga = 0;
+	register int pgb = 0;
+	register int ca = 0;
+	register int i = 0;
+	register int j = 0;
+	register int c = 0;
+	
+	s = dp->s;
+	
+	trace = dp->tb;
+
+	trace[len_a][len_b] = 32;
+
+	s[len_b].a = 0;
+	s[len_b].ga = -INFTY;
+	s[len_b].gb = -INFTY;
+	
+
+	tracep = trace[len_a];
+	j = len_b;
+	
+
+	while(--j){
+		s[j].a = -INFTY;
+
+		s[j].ga = s[j+1].a-tgpe;
+		if (s[j+1].ga-tgpe > s[j].ga){
+			s[j].ga = s[j+1].ga-tgpe;
+		}
+				
+		s[j].gb = -INFTY;
+		tracep[j] = 8;
+	}
+	
+	s[0].a = -INFTY;
+	s[0].ga = -INFTY;
+	s[0].gb = -INFTY;
+	
+	i = len_a;
+	while(--i){
+		
+		tracep = trace[i];
+		pa = s[len_b].a;
+		pga = s[len_b].ga;
+		pgb = s[len_b].gb;
+		
+		s[len_b].a = -INFTY;
+		s[len_b].ga = -INFTY;
+		
+		s[len_b].gb = pa-tgpe;
+		if(pgb-tgpe > s[len_b].gb){
+			s[len_b].gb = pgb-tgpe;
+		}
+		
+		
+		tracep[len_b] = 16;
+		j = len_b;
+		subp = subm[seq1[i]];
+		while(--j){
+			ca = s[j].a;
+			
+			c = 1;
+			if((pga -= gpo) > pa){
+				pa = pga;
+				c = 2;
+			}
+			if((pgb -= gpo) > pa){
+				pa = pgb;
+				c = 4;
+			}
+
+			pa += subp[seq2[j]];
+
+			s[j].a = pa;
+			
+			pga = s[j].ga;
+			
+			s[j].ga = s[j+1].a-gpo;
+			if (s[j+1].ga-gpe > s[j].ga){
+				s[j].ga = s[j+1].ga-gpe;
+				c |= 8;
+			}
+			
+			pgb = s[j].gb;
+			
+			s[j].gb = ca-gpo;
+			if(pgb-gpe > s[j].gb){
+				s[j].gb = pgb-gpe;
+				c |= 16;
+			}
+			tracep[j] = c;
+			pa = ca;
+
+		}
+	
+		ca = s[0].a;
+
+		c = 1;
+		if((pga-=gpo) > pa){
+			pa = pga;
+			c = 2;
+		}
+		if((pgb-=gpo) > pa){
+			pa = pgb;
+			c = 4;
+		}
+		
+		pa += subp[seq2[0]];
+		
+		s[0].a = pa;
+		
+		s[0].ga = -INFTY;
+		
+		pgb = s[0].gb;
+		s[0].gb = ca-(gpo+tgpe);
+ 		if(pgb-tgpe > s[0].gb){
+			s[0].gb = pgb-tgpe;
+			c |= 16;
+		}
+		tracep[0] = c;			
+	}
+
+	subp = subm[seq1[0]];
+	tracep = trace[0];
+	j = len_b;
+	pa = s[j].a;
+	pga = s[j].ga;
+	pgb = s[j].gb;
+	s[j].a = -INFTY;
+	s[j].ga = -INFTY;
+	
+	s[j].gb = pa-tgpe;
+	if(pgb-tgpe > s[j].gb){
+		s[j].gb = pgb-tgpe;
+	}
+
+	while(--j){
+
+		ca = s[j].a;
+
+		c = 1;
+
+		if((pga-=gpo) > pa){
+			pa = pga;
+			c = 2;
+		}
+
+		if((pgb-=gpo) > pa){
+			pa = pgb;
+			c = 4;
+		}
+		
+		pa += subp[seq2[j]];
+		
+		s[j].a = pa;
+		
+		pga = s[j].ga;
+		s[j].ga = s[j+1].a-(gpo+tgpe);
+		if (s[j+1].ga-tgpe > s[j].ga){
+			s[j].ga = s[j+1].ga-tgpe;
+			c |= 8;
+		}	
+		pgb = s[j].gb;
+		s[j].gb = -INFTY;	
+		tracep[j] = c;
+		pa = ca;
+	}
+	
+	ca = s[0].a;
+	
+	c = 1;
+	
+	if((pga-=gpo) > pa){
+		pa = pga;
+		c = 2;
+	}
+	if((pgb-=gpo) > pa){
+		pa = pgb;
+		c = 4;
+	}
+
+	pa += subp[seq2[0]];
+	
+	s[0].a = pa;
+	
+	
+	s[0].ga = s[1].a-(gpo+tgpe);
+	if (s[1].ga-tgpe > s[0].ga){
+		s[0].ga = s[1].ga-tgpe;
+		c |= 8;
+	}
+	
+	pgb = s[0].gb;
+	s[0].gb = ca-(gpo+tgpe);
+	if(pgb-tgpe > s[0].gb){
+		s[0].gb = pgb-tgpe;
+		c |= 16;
+	}	
+	tracep[0] = c;
+
+
+	pgb = s[0].gb;
+	c = 2;
+	if(s[0].ga > pgb){
+		pgb = s[0].ga;
+		c = 1;
+	}
+	if(s[0].a >= pgb){
+		pgb = s[0].a;
+		c = 0;
+	}
+	
+	ca = c;
+	
+	int ga = 1; 
+	int gb = 1;
+	i = 0;
+	j = 0;
+	c = 1;
+	while(trace[i][j] < 32){
+		if(i ==0 || j == 0){
+			path[c] |= 128;
+		}
+		if(i ==len_a || j == len_b){
+			path[c] |= 64;
+		}
+	
+		switch(ca){
+			case 0:
+				if (trace[i][j] & 2){
+					ca = 1;
+				}else if (trace[i][j] & 4){
+					ca = 2;
+				}
+				path[c] = 0;
+				i++;
+				j++;
+			break;
+			case 1:
+				if(trace[i][j] & 8){
+					ca = 1;
+				}else{
+					path[c-(gb-1)] |= gb << 16;
+					gb = 0;
+					ca = 0;
+				}
+				path[c] |= 1;
+				j++;
+				gb++;
+			break;
+			case  2:
+				if(trace[i][j] & 16){
+					ca = 2;
+				}else{
+					path[c-(ga-1)] |= ga << 16;
+					ga = 0;
+					ca = 0;
+				}
+				path[c] |= 2;
+				i++;
+				ga++;
+			break;
+		}
+		c++;
+	}
+	if (ca == 1){
+		path[c-(gb-1)] |= (gb-1) << 16;	
+	}
+	if(ca == 2){
+		path[c-(ga-1)] |= (ga-1) << 16;	
+	}
+	path[0] = c-1;
+	path[c] = 3;
+	path[c+1] = pgb;
+	return path;
+}
+
+
+
+int* aapp_dyn(int* path, struct dp_matrix *dp,const int* prof1,const int* prof2,const int len_a,const int len_b,const int mmbonus)
+{
+	unsigned int freq[26];
+	
+	struct states* s = 0;
+	char** trace = 0;
+	char* tracep = 0;
+	register int pa = 0;
+	register int pga = 0;
+	register int pgb = 0;
+	register int ca = 0;
+	register int i = 0;
+	register int j = 0;
+	register int c = 0;
+
+	s = dp->s;
+	
+	trace = dp->tb;
+
+	trace[len_a][len_b] = 32;
+
+	prof1 +=  len_a << 6;
+
+	s[len_b].a = 0;
+	s[len_b].ga = -INFTY;
+	s[len_b].gb = -INFTY;
+	//init of first row;
+	tracep = trace[len_a];
+	
+	j = len_b;
+	while(--j){
+		s[j].a = -INFTY;
+		
+		s[j].ga = s[j+1].a+prof2[29];
+		if (s[j+1].ga+prof2[29] > s[j].ga){
+			s[j].ga = s[j+1].ga+prof2[29];
+		}
+		s[j].gb = -INFTY;
+		tracep[j] = 8;
+	}
+	
+	s[0].a = -INFTY;
+	s[0].ga = -INFTY;
+	s[0].gb = -INFTY;
+	i = len_a;
+	while(--i){
+		prof1 -= 64;
+
+		c = 1;
+		for (j = 26; j--;){
+			if(prof1[j]){
+				freq[c] = j;
+				c++;	
+			}
+		}
+		freq[0] = c;
+		
+		tracep = trace[i];
+		pa = s[len_b].a + mmbonus;
+		pga = s[len_b].ga;
+		pgb = s[len_b].gb;
+		s[len_b].a = -INFTY;
+		s[len_b].ga = -INFTY;
+		
+		s[len_b].gb = pa+prof1[29];
+		if(pgb+prof1[29] > s[len_b].gb){
+			s[len_b].gb = pgb+prof1[29];
+		}
+	
+		tracep[len_b] = 16;
+		
+		j = len_b;
+		prof2 += len_b << 6;
+		while(--j){
+			prof2 -= 64;
+			ca = s[j].a;
+
+			c = 1;
+			if((pga += prof2[91]) > pa){
+				pa = pga;
+				c = 2;
+			}
+			if((pgb += prof1[91]) > pa){
+				pa = pgb;
+				c = 4;
+			}
+
+			prof2 += 32;
+			for (pga = freq[0];--pga;){
+				pgb = freq[pga];
+				pa += prof1[pgb]*prof2[pgb];
+			}
+			prof2 -= 32;
+
+			s[j].a = pa;
+			
+			pga = s[j].ga;
+			
+			s[j].ga = s[j+1].a+prof2[27];
+			if (s[j+1].ga+prof2[28] > s[j].ga){
+				s[j].ga = s[j+1].ga+prof2[28];
+				c |= 8;
+			}
+			
+			pgb = s[j].gb;
+			
+			s[j].gb = ca+prof1[27];
+			if(pgb+prof1[28] > s[j].gb){
+				s[j].gb = pgb+prof1[28];
+				c |= 16;
+			}
+			tracep[j] = c;
+			pa = ca+ mmbonus;
+
+		}
+	
+		prof2 -= 64;
+		//LAST CELL (0)
+		ca = s[0].a;
+
+		c = 1;
+		if((pga+=prof2[91]) > pa){
+			pa = pga;
+			c = 2;
+		}
+		if((pgb+=prof1[91]) > pa){
+			pa = pgb;
+			c = 4;
+		}
+		
+		prof2 += 32;
+		for (pga = freq[0];--pga;){
+			pgb = freq[pga];
+			pa += prof1[pgb]*prof2[pgb];
+		}
+		prof2 -= 32;
+		
+		s[0].a = pa;
+		
+		s[0].ga = -INFTY;
+		
+		pgb = s[0].gb;
+		s[0].gb = ca+prof1[27]+prof1[29];
+ 		if(pgb+prof1[29] > s[0].gb){
+			s[0].gb = pgb+prof1[29];
+			c |= 16;
+		}
+		tracep[0] = c;	
+		
+	}
+	prof1 -= 64;
+	
+	c = 1;
+	for (j = 26; j--;){
+		if(prof1[j]){
+			freq[c] = j;
+			c++;	
+		}
+	}
+	freq[0] = c;
+	
+	tracep = trace[0];
+	j = len_b;
+	prof2 += len_b << 6;
+	pa = s[j].a+ mmbonus;
+	pga = s[j].ga;
+	pgb = s[j].gb;
+	s[j].a = -INFTY;
+	s[j].ga = -INFTY;
+
+	s[len_b].gb = pa+prof1[29];
+	if(pgb+prof1[29] > s[len_b].gb){
+		s[len_b].gb = pgb+prof1[29];
+	}
+
+
+	
+	while(--j){
+		prof2 -= 64;
+		ca = s[j].a;
+
+		c = 1;
+
+		if((pga+=prof2[91]) > pa){
+			pa = pga;
+			c = 2;
+		}
+
+		if((pgb+=prof1[91]) > pa){
+			pa = pgb;
+			c = 4;
+		}	
+		prof2+=32;
+		
+		for (pga = freq[0];--pga;){
+			pgb = freq[pga];
+			pa += prof1[pgb]*prof2[pgb];
+		}
+		prof2-=32;
+		
+		s[j].a = pa;
+		pga = s[j].ga;
+		s[j].ga = s[j+1].a+prof2[27]+prof2[29];
+		if (s[j+1].ga+prof2[29] > s[j].ga){
+			s[j].ga = s[j+1].ga+prof2[29];
+			c |= 8;
+		}	
+		pgb = s[j].gb;
+		s[j].gb = -INFTY;	
+		
+		tracep[j] = c;
+		pa = ca+ mmbonus;
+	}
+	prof2 -= 64;
+
+	ca = s[0].a;
+	
+	c = 1;
+	
+	if((pga+=prof2[91]) > pa){
+		pa = pga;
+		c = 2;
+	}
+	if((pgb+=prof1[91]) > pa){
+		pa = pgb;
+		c = 4;
+	}
+		
+	prof2+=32;
+	for (pga = freq[0];--pga;){	
+		pgb = freq[pga];
+		pa += prof1[pgb]*prof2[pgb];
+	}
+	prof2-=32;
+	
+	s[0].a = pa;
+	
+	s[0].ga = s[1].a+prof2[27]+prof2[29];
+	if (s[1].ga+prof2[29] > s[0].ga){
+		s[0].ga = s[1].ga+prof2[29];
+		c |= 8;
+	}
+	
+	pgb = s[0].gb;
+	s[0].gb = ca+prof1[27]+prof1[29];
+	if(pgb +prof1[29]> s[0].gb){
+		s[0].gb = pgb+prof1[29];
+		c |= 16;
+	}	
+	tracep[0] = c;
+
+	pgb = s[0].gb;
+	c = 2;
+	if(s[0].ga > pgb){
+		pgb = s[0].ga;
+		c = 1;
+	}
+	if(s[0].a >= pgb){
+		pgb = s[0].a;
+		c = 0;
+	}
+	
+	//fprintf(stderr,"SCORE:%d\n",ca);
+	ca = c;
+	
+	i = 0;
+	j = 0;
+	c = 1;
+	while(trace[i][j] < 32){
+	//	fprintf(stderr,"%d->%d	%d:%d	%d:%d\n",c,trace[i][j],i,j,len_a,len_b);
+		switch(ca){
+			case 0:
+				if (trace[i][j] & 2){
+					ca = 1;
+					if(i+1!= len_a){
+						path[c+1] |= 16;
+	//					fprintf(stderr,"GAP_CLOSE\n");
+					}else{
+						path[c+1] |= 32+16;
+					}
+				}else if (trace[i][j] & 4){
+					ca = 2;
+					if(j+1!= len_b){
+						path[c+1] |= 16;
+	//					fprintf(stderr,"GAP_CLOSE\n");
+					}else{
+						path[c+1] |= 32+16;
+					}
+				}
+
+				//path[c] = 0;
+				i++;
+				j++;
+			break;
+			case 1:
+				if(trace[i][j] & 8){
+					ca = 1;
+					if(i!=0 && i!= len_a){
+	//				/	fprintf(stderr,"GAP_EXT\n");
+						if(!(path[c]&16)){
+							path[c] |= 8;
+						}
+					}else{
+						if(!(path[c]&16)){
+							path[c] |= 32+8;
+						}
+					}
+				}else{
+					ca = 0;
+					if(i!=0 && i!= len_a){
+	//					fprintf(stderr,"GAP_OPEN\n");
+						path[c] |= 4;
+					}else{
+						path[c] |= 32+4;
+					}
+				}
+				path[c] |= 1;
+				j++;
+			break;
+			case  2:
+				if(trace[i][j] & 16){
+					ca = 2;
+					if(j !=0 && j != len_b){
+	//					fprintf(stderr,"GAP_EXT\n");
+						if(!(path[c]&16)){
+							path[c] |= 8;
+						}
+					}else{
+						if(!(path[c]&16)){
+							path[c] |= 32+8;
+						}
+					}
+				}else{
+					ca = 0;
+					if(j!=0 && j != len_b){
+	//					fprintf(stderr,"GAP_OPEN\n");
+						path[c] |= 4;
+					}else{
+						path[c] |= 32+4;
+					}
+					
+				}
+				path[c] |= 2;
+				i++;
+			break;
+		}
+		c++;
+	}
+	path[0] = c-1;
+	path[c] = 3;
+	path[c+1] = pgb;
+	
+	return path;
+}*/
+
+
+
+
+
+int* pp_dyn(int* path, struct dp_matrix *dp,const float* prof1,const float* prof2,const int len_a,const int len_b)
+{
+	unsigned int freq[26];
+	
+	struct states* s = 0;
+	char** trace = 0;
+	char* tracep = 0;
+	register float pa = 0;
+	register float pga = 0;
+	register float pgb = 0;
+	register float ca = 0;
+	register int i = 0;
+	register int j = 0;
+	register int c = 0;
+	register int f = 0;
+
+	s = dp->s;
+	
+	trace = dp->tb;
+
+	trace[len_a][len_b] = 32;
+
+	prof1 +=  len_a << 6;
+
+	s[len_b].a = 0.0;
+	s[len_b].ga = -FLOATINFTY;
+	s[len_b].gb = -FLOATINFTY;
+	//init of first row;
+	tracep = trace[len_a];
+	
+	j = len_b;
+	while(--j){
+		s[j].a = -FLOATINFTY;
+		
+		s[j].ga = s[j+1].a+prof2[29];
+		if (s[j+1].ga+prof2[29] > s[j].ga){
+			s[j].ga = s[j+1].ga+prof2[29];
+		}
+		s[j].gb = -INFTY;
+		tracep[j] = 8;
+	}
+	
+	s[0].a = -FLOATINFTY;
+	s[0].ga = -FLOATINFTY;
+	s[0].gb = -FLOATINFTY;
+	i = len_a;
+	while(--i){
+		prof1 -= 64;
+
+		c = 1;
+		for (j = 26; j--;){
+			if(prof1[j]){
+				freq[c] = j;
+				c++;	
+			}
+		}
+		freq[0] = c;
+		
+		tracep = trace[i];
+		pa = s[len_b].a;
+		pga = s[len_b].ga;
+		pgb = s[len_b].gb;
+		s[len_b].a = -FLOATINFTY;
+		s[len_b].ga = -FLOATINFTY;
+		
+		s[len_b].gb = pa+prof1[29];
+		if(pgb+prof1[29] > s[len_b].gb){
+			s[len_b].gb = pgb+prof1[29];
+		}
+	
+		tracep[len_b] = 16;
+		
+		j = len_b;
+		prof2 += len_b << 6;
+		while(--j){
+			prof2 -= 64;
+			ca = s[j].a;
+
+			c = 1;
+			if((pga += prof2[91]) > pa){
+				pa = pga;
+				c = 2;
+			}
+			if((pgb += prof1[91]) > pa){
+				pa = pgb;
+				c = 4;
+			}
+			
+			prof2 += 32;
+			for (f = freq[0];--f;){
+				pa += prof1[freq[f]]*prof2[freq[f]];
+			}
+			prof2 -= 32;
+
+			s[j].a = pa;
+			
+			pga = s[j].ga;
+			
+			s[j].ga = s[j+1].a+prof2[27];
+			if (s[j+1].ga+prof2[28] > s[j].ga){
+				s[j].ga = s[j+1].ga+prof2[28];
+				c |= 8;
+			}
+			
+			pgb = s[j].gb;
+			
+			s[j].gb = ca+prof1[27];
+			if(pgb+prof1[28] > s[j].gb){
+				s[j].gb = pgb+prof1[28];
+				c |= 16;
+			}
+			tracep[j] = c;
+			pa = ca;
+
+		}
+	
+		prof2 -= 64;
+		//LAST CELL (0)
+		ca = s[0].a;
+
+		c = 1;
+		if((pga+=prof2[91]) > pa){
+			pa = pga;
+			c = 2;
+		}
+		if((pgb+=prof1[91]) > pa){
+			pa = pgb;
+			c = 4;
+		}
+		
+		prof2 += 32;
+		for (f = freq[0];--f;){
+			pa += prof1[freq[f]]*prof2[freq[f]];
+		}
+		prof2 -= 32;
+		
+		s[0].a = pa;
+		
+		s[0].ga = -FLOATINFTY;
+		
+		pgb = s[0].gb;
+		s[0].gb = ca+prof1[27]+prof1[29];
+ 		if(pgb+prof1[29] > s[0].gb){
+			s[0].gb = pgb+prof1[29];
+			c |= 16;
+		}
+		tracep[0] = c;	
+		
+	}
+	prof1 -= 64;
+	
+	c = 1;
+	for (j = 26; j--;){
+		if(prof1[j]){
+			freq[c] = j;
+			c++;	
+		}
+	}
+	freq[0] = c;
+	
+	tracep = trace[0];
+	j = len_b;
+	prof2 += len_b << 6;
+	pa = s[j].a;
+	pga = s[j].ga;
+	pgb = s[j].gb;
+	s[j].a = -FLOATINFTY;
+	s[j].ga = -FLOATINFTY;
+
+	s[len_b].gb = pa+prof1[29];
+	if(pgb+prof1[29] > s[len_b].gb){
+		s[len_b].gb = pgb+prof1[29];
+	}
+
+
+	
+	while(--j){
+		prof2 -= 64;
+		ca = s[j].a;
+
+		c = 1;
+
+		if((pga+=prof2[91]) > pa){
+			pa = pga;
+			c = 2;
+		}
+
+		if((pgb+=prof1[91]) > pa){
+			pa = pgb;
+			c = 4;
+		}
+		
+		prof2+=32;
+		
+		for (f = freq[0];--f;){
+			pa += prof1[freq[f]]*prof2[freq[f]];
+		}
+		prof2-=32;
+		
+		s[j].a = pa;
+		pga = s[j].ga;
+		s[j].ga = s[j+1].a+prof2[27]+prof2[29];
+		if (s[j+1].ga+prof2[29] > s[j].ga){
+			s[j].ga = s[j+1].ga+prof2[29];
+			c |= 8;
+		}	
+		pgb = s[j].gb;
+		s[j].gb = -FLOATINFTY;	
+		
+		tracep[j] = c;
+		pa = ca;
+	}
+	prof2 -= 64;
+
+	ca = s[0].a;
+	
+	c = 1;
+	
+	if((pga+=prof2[91]) > pa){
+		pa = pga;
+		c = 2;
+	}
+	if((pgb+=prof1[91]) > pa){
+		pa = pgb;
+		c = 4;
+	}
+	prof2+=32;
+	for (f = freq[0];--f;){
+		pa += prof1[freq[f]]*prof2[freq[f]];
+	}
+	prof2-=32;
+	
+	s[0].a = pa;
+	
+	s[0].ga = s[1].a+prof2[27]+prof2[29];
+	if (s[1].ga+prof2[29] > s[0].ga){
+		s[0].ga = s[1].ga+prof2[29];
+		c |= 8;
+	}
+	
+	pgb = s[0].gb;
+	s[0].gb = ca+prof1[27]+prof1[29];
+	if(pgb +prof1[29]> s[0].gb){
+		s[0].gb = pgb+prof1[29];
+		c |= 16;
+	}	
+	tracep[0] = c;
+
+	pgb = s[0].gb;
+	c = 2;
+	if(s[0].ga > pgb){
+		pgb = s[0].ga;
+		c = 1;
+	}
+	if(s[0].a >= pgb){
+		pgb = s[0].a;
+		c = 0;
+	}
+	
+	//fprintf(stderr,"SCORE:%d\n",ca);
+	f = c;
+	
+	i = 0;
+	j = 0;
+	c = 1;
+	while(trace[i][j] < 32){
+	//	fprintf(stderr,"%d->%d	%d:%d	%d:%d\n",c,trace[i][j],i,j,len_a,len_b);
+		switch(f){
+			case 0:
+				if (trace[i][j] & 2){
+					f = 1;
+					if(i+1!= len_a){
+						path[c+1] |= 16;
+	//					fprintf(stderr,"GAP_CLOSE\n");
+					}else{
+						path[c+1] |= 32+16;
+					}
+				}else if (trace[i][j] & 4){
+					f = 2;
+					if(j+1!= len_b){
+						path[c+1] |= 16;
+	//					fprintf(stderr,"GAP_CLOSE\n");
+					}else{
+						path[c+1] |= 32+16;
+					}
+				}
+
+				//path[c] = 0;
+				i++;
+				j++;
+			break;
+			case 1:
+				if(trace[i][j] & 8){
+					f = 1;
+					if(i!=0 && i!= len_a){
+	//				/	fprintf(stderr,"GAP_EXT\n");
+						if(!(path[c]&16)){
+							path[c] |= 8;
+						}
+					}else{
+						if(!(path[c]&16)){
+							path[c] |= 32+8;
+						}
+					}
+				}else{
+					f = 0;
+					if(i!=0 && i!= len_a){
+	//					fprintf(stderr,"GAP_OPEN\n");
+						path[c] |= 4;
+					}else{
+						path[c] |= 32+4;
+					}
+				}
+				path[c] |= 1;
+				j++;
+			break;
+			case  2:
+				if(trace[i][j] & 16){
+					f = 2;
+					if(j !=0 && j != len_b){
+	//					fprintf(stderr,"GAP_EXT\n");
+						if(!(path[c]&16)){
+							path[c] |= 8;
+						}
+					}else{
+						if(!(path[c]&16)){
+							path[c] |= 32+8;
+						}
+					}
+				}else{
+					f = 0;
+					if(j!=0 && j != len_b){
+	//					fprintf(stderr,"GAP_OPEN\n");
+						path[c] |= 4;
+					}else{
+						path[c] |= 32+4;
+					}
+					
+				}
+				path[c] |= 2;
+				i++;
+			break;
+		}
+		c++;
+	}
+	path[0] = c-1;
+	path[c] = 3;
+	path[c+1] = pgb;
+	return path;
+}
+
+
+int* ps_dyn(int* path, struct dp_matrix *dp,const float* prof1,const int* seq2,const int len_a,const int len_b,int sip)
+{
+	struct states* s = 0;
+	char** trace = 0;
+	char* tracep = 0;
+	register float pa = 0;
+	register float pga = 0;
+	register float pgb = 0;
+	register float ca = 0;
+	register int i = 0;
+	register int j = 0;
+	register int c = 0;
+	register int f = 0;
+	
+	const float open = gpo * sip;
+	const float ext = gpe *sip;
+
+	s = dp->s;
+	
+	trace = dp->tb;
+
+	trace[len_a][len_b] = 32;
+
+	prof1 +=  len_a << 6;
+
+	s[len_b].a = 0.0;
+	s[len_b].ga = -FLOATINFTY;
+	s[len_b].gb = -FLOATINFTY;
+	//init of first row;
+	tracep = trace[len_a];
+	j = len_b;
+	
+
+	while(--j){
+		s[j].a = -FLOATINFTY;
+		//s[j].ga = 0;	
+		
+		s[j].ga = s[j+1].a-tgpe;//-topen;
+		if (s[j+1].ga-tgpe > s[j].ga){
+			s[j].ga = s[j+1].ga-tgpe;
+		}
+		
+		s[j].gb = -FLOATINFTY;
+		tracep[j] = 8;
+	}
+	
+	s[0].a = -FLOATINFTY;
+	s[0].ga = -FLOATINFTY;
+	s[0].gb = -FLOATINFTY;
+	i = len_a;
+	while(--i){
+		prof1 -= 64;
+		
+		tracep = trace[i];
+		pa = s[len_b].a;
+		pga = s[len_b].ga;
+		pgb = s[len_b].gb;
+		s[len_b].a = -FLOATINFTY;
+		s[len_b].ga = -FLOATINFTY;
+		//s[len_b].gb = 0;
+		s[len_b].gb = pa+prof1[29];//+prof1[29];
+		if(pgb+prof1[29] > s[len_b].gb){
+			s[len_b].gb = pgb+prof1[29];
+		}
+
+		tracep[len_b] = 16;
+		
+		j = len_b;
+		
+		while(--j){
+
+			ca = s[j].a;
+
+			c = 1;
+			if((pga -= open) > pa){
+				pa = pga;
+				c = 2;
+			}
+			if((pgb += prof1[91]) > pa){
+				pa = pgb;
+				c = 4;
+			}
+			
+			pa += prof1[32 + seq2[j]];
+
+			s[j].a = pa;
+			
+			pga = s[j].ga;
+			
+			s[j].ga = s[j+1].a-open;
+			if (s[j+1].ga-ext > s[j].ga){
+				s[j].ga = s[j+1].ga-ext;
+				c |= 8;
+			}
+			
+			pgb = s[j].gb;
+			
+			s[j].gb = ca+prof1[27];
+			if(pgb+prof1[28] > s[j].gb){
+				s[j].gb = pgb+prof1[28];
+				c |= 16;
+			}
+			tracep[j] = c;
+			pa = ca;
+
+		}
+	
+		//LAST CELL (0)
+		ca = s[0].a;
+
+		c = 1;
+		if((pga-=open) > pa){
+			pa = pga;
+			c = 2;
+		}
+		if((pgb+=prof1[91]) > pa){
+			pa = pgb;
+			c = 4;
+		}
+		pa += prof1[32+seq2[0]];
+		s[0].a = pa;
+		
+		s[0].ga = -FLOATINFTY;
+		
+		pgb = s[0].gb;
+		s[0].gb = ca+prof1[27]+prof1[29];
+ 		if(pgb+prof1[29] > s[0].gb){
+			s[0].gb = pgb+prof1[29];
+			c |= 16;
+		}
+		tracep[0] = c;	
+		
+	}
+	prof1 -= 64;
+	
+
+	
+	tracep = trace[0];
+	j = len_b;
+	pa = s[j].a;
+	pga = s[j].ga;
+	pgb = s[j].gb;
+	s[j].a = -FLOATINFTY;
+	s[j].ga = -FLOATINFTY;
+	//s[j].gb = -INFTY;
+	s[len_b].gb = pa+prof1[29];//+prof1[29];
+	if(pgb+prof1[29] > s[len_b].gb){
+		s[len_b].gb = pgb+prof1[29];
+	}
+
+	
+	while(--j){
+
+		ca = s[j].a;
+
+		c = 1;
+
+		if((pga-=open) > pa){
+			pa = pga;
+			c = 2;
+		}
+
+		if((pgb+=prof1[91]) > pa){
+			pa = pgb;
+			c = 4;
+		}
+		pa += prof1[32+seq2[j]];		
+		s[j].a = pa;
+		pga = s[j].ga;
+		s[j].ga = s[j+1].a-(open+tgpe);
+		if (s[j+1].ga-tgpe > s[j].ga){
+			s[j].ga = s[j+1].ga-tgpe;
+			c |= 8;
+		}	
+		pgb = s[j].gb;
+		s[j].gb = -INFTY;	
+		
+		tracep[j] = c;
+		pa = ca;
+	}
+
+
+	ca = s[0].a;
+	
+	c = 1;
+	
+	if((pga-=open) > pa){
+		pa = pga;
+		c = 2;
+	}
+	if((pgb+=prof1[91]) > pa){
+		pa = pgb;
+		c = 4;
+	}
+	pa += prof1[32+seq2[0]];	
+	s[0].a = pa;
+	
+	s[0].ga = s[1].a-(open+tgpe);
+	if (s[1].ga-tgpe > s[0].ga){
+		s[0].ga = s[1].ga-tgpe;
+		c |= 8;
+	}
+	
+	pgb = s[0].gb;
+	s[0].gb = ca+prof1[27]+prof1[29];
+	if(pgb+prof1[29] > s[0].gb){
+		s[0].gb = pgb+prof1[29];
+		c |= 16;
+	}	
+	tracep[0] = c;
+
+
+	pgb = s[0].gb;
+	c = 2;
+	if(s[0].ga > pgb){
+		pgb = s[0].ga;
+		c = 1;
+	}
+	if(s[0].a >= pgb){
+		pgb = s[0].a;
+		c = 0;
+	}
+	
+	//fprintf(stderr,"SCORE:%d\n",ca);
+	f = c;
+	
+	i = 0;
+	j = 0;
+	c = 1;
+	while(trace[i][j] < 32){
+	//	fprintf(stderr,"%d->%d	%d:%d	%d:%d\n",c,trace[i][j],i,j,len_a,len_b);
+		switch(f){
+			case 0:
+				if (trace[i][j] & 2){
+					f = 1;
+					if(i+1!= len_a){
+						path[c+1] |= 16;
+	//					fprintf(stderr,"GAP_CLOSE\n");
+					}else{
+						path[c+1] |= 32+16;
+					}
+				}else if (trace[i][j] & 4){
+					f = 2;
+					if(j+1!= len_b){
+						path[c+1] |= 16;
+	//					fprintf(stderr,"GAP_CLOSE\n");
+					}else{
+						path[c+1] |= 32+16;
+					}
+				}
+
+				//path[c] = 0;
+				i++;
+				j++;
+			break;
+			case 1:
+				if(trace[i][j] & 8){
+					f = 1;
+					if(i!=0 && i!= len_a){
+	//				/	fprintf(stderr,"GAP_EXT\n");
+						if(!(path[c]&16)){
+							path[c] |= 8;
+						}
+					}else{
+						if(!(path[c]&16)){
+							path[c] |= 32+8;
+						}
+					}
+				}else{
+					f = 0;
+					if(i!=0 && i!= len_a){
+	//					fprintf(stderr,"GAP_OPEN\n");
+						path[c] |= 4;
+					}else{
+						path[c] |= 32+4;
+					}
+				}
+				path[c] |= 1;
+				j++;
+			break;
+			case  2:
+				if(trace[i][j] & 16){
+					f = 2;
+					if(j !=0 && j != len_b){
+	//					fprintf(stderr,"GAP_EXT\n");
+						if(!(path[c]&16)){
+							path[c] |= 8;
+						}
+					}else{
+						if(!(path[c]&16)){
+							path[c] |= 32+8;
+						}
+					}
+				}else{
+					f = 0;
+					if(j!=0 && j != len_b){
+	//					fprintf(stderr,"GAP_OPEN\n");
+						path[c] |= 4;
+					}else{
+						path[c] |= 32+4;
+					}
+					
+				}
+				path[c] |= 2;
+				i++;
+			break;
+		}
+		c++;
+	}
+	path[0] = c-1;
+	path[c] = 3;
+	path[c+1] = pgb;
+	return path;
+}
+
+int* ss_dyn(float**subm,int* path, struct dp_matrix *dp,const int* seq1,const int* seq2,const int len_a,const int len_b)
+{
+	struct states* s = 0;
+	const float *subp = 0;
+	char** trace = 0;
+	char* tracep = 0;
+	register float pa = 0;
+	register float pga = 0;
+	register float pgb = 0;
+	register float ca = 0;
+	register int i = 0;
+	register int j = 0;
+	register int c = 0;
+	register int f = 0;
+	
+	s = dp->s;
+	
+	trace = dp->tb;
+
+	trace[len_a][len_b] = 32;
+
+	s[len_b].a = 0.0;
+	s[len_b].ga = -FLOATINFTY;
+	s[len_b].gb = -FLOATINFTY;
+	
+	//init of first row;
+	tracep = trace[len_a];
+	j = len_b;
+	
+
+	while(--j){
+		s[j].a = -FLOATINFTY;
+		//s[j].ga = 0;	
+		s[j].ga = s[j+1].a-tgpe;//-gpo;
+		if (s[j+1].ga-tgpe > s[j].ga){
+			s[j].ga = s[j+1].ga-tgpe;
+		}
+		
+		
+		
+		s[j].gb = -FLOATINFTY;
+		tracep[j] = 8;
+	}
+	
+	s[0].a = -FLOATINFTY;
+	s[0].ga = -FLOATINFTY;
+	s[0].gb = -FLOATINFTY;
+	
+	i = len_a;
+	while(--i){
+		
+		tracep = trace[i];
+		pa = s[len_b].a;
+		pga = s[len_b].ga;
+		pgb = s[len_b].gb;
+		
+		s[len_b].a = -FLOATINFTY;
+		s[len_b].ga = -FLOATINFTY;
+		//s[len_b].gb = 0;
+		
+		s[len_b].gb = pa-tgpe;//-gpo;
+		if(pgb-tgpe > s[len_b].gb){
+			s[len_b].gb = pgb-tgpe;
+		}
+		
+		
+		tracep[len_b] = 16;
+		j = len_b;
+		subp = subm[seq1[i]];
+		while(--j){
+			ca = s[j].a;
+			
+			c = 1;
+			if((pga -= gpo) > pa){
+				pa = pga;
+				c = 2;
+			}
+			if((pgb -= gpo) > pa){
+				pa = pgb;
+				c = 4;
+			}
+
+			pa += subp[seq2[j]];
+
+			s[j].a = pa;
+			
+			pga = s[j].ga;
+			
+			s[j].ga = s[j+1].a-gpo;
+			if (s[j+1].ga-gpe > s[j].ga){
+				s[j].ga = s[j+1].ga-gpe;
+				c |= 8;
+			}
+			
+			pgb = s[j].gb;
+			
+			s[j].gb = ca-gpo;
+			if(pgb-gpe > s[j].gb){
+				s[j].gb = pgb-gpe;
+				c |= 16;
+			}
+			tracep[j] = c;
+			pa = ca;
+
+		}
+	
+		//LAST CELL (0)
+		ca = s[0].a;
+
+		c = 1;
+		if((pga-=gpo) > pa){
+			pa = pga;
+			c = 2;
+		}
+		if((pgb-=gpo) > pa){
+			pa = pgb;
+			c = 4;
+		}
+		
+		pa += subp[seq2[0]];
+		
+		s[0].a = pa;
+		
+		s[0].ga = -FLOATINFTY;
+		
+		pgb = s[0].gb;
+		s[0].gb = ca-(gpo+tgpe);
+ 		if(pgb-tgpe > s[0].gb){
+			s[0].gb = pgb-tgpe;
+			c |= 16;
+		}
+		tracep[0] = c;			
+	}
+
+	subp = subm[seq1[0]];
+	tracep = trace[0];
+	j = len_b;
+	pa = s[j].a;
+	pga = s[j].ga;
+	pgb = s[j].gb;
+	s[j].a = -FLOATINFTY;
+	s[j].ga = -FLOATINFTY;
+	
+	s[j].gb = pa-tgpe;//-gpo;
+	if(pgb-tgpe > s[j].gb){
+		s[j].gb = pgb-tgpe;
+	}
+	
+	//s[j].gb = -INFTY;
+	while(--j){
+
+		ca = s[j].a;
+
+		c = 1;
+
+		if((pga-=gpo) > pa){
+			pa = pga;
+			c = 2;
+		}
+
+		if((pgb-=gpo) > pa){
+			pa = pgb;
+			c = 4;
+		}
+		
+		pa += subp[seq2[j]];
+		
+		s[j].a = pa;
+		
+		pga = s[j].ga;
+		s[j].ga = s[j+1].a-(gpo+tgpe);
+		if (s[j+1].ga-tgpe > s[j].ga){
+			s[j].ga = s[j+1].ga-tgpe;
+			c |= 8;
+		}	
+		pgb = s[j].gb;
+		s[j].gb = -FLOATINFTY;	
+		tracep[j] = c;
+		pa = ca;
+	}
+	
+	ca = s[0].a;
+	
+	c = 1;
+	
+	if((pga-=gpo) > pa){
+		pa = pga;
+		c = 2;
+	}
+	if((pgb-=gpo) > pa){
+		pa = pgb;
+		c = 4;
+	}
+
+	pa += subp[seq2[0]];
+	
+	s[0].a = pa;
+	
+	
+	s[0].ga = s[1].a-(gpo+tgpe);
+	if (s[1].ga-tgpe > s[0].ga){
+		s[0].ga = s[1].ga-tgpe;
+		c |= 8;
+	}
+	
+	pgb = s[0].gb;
+	s[0].gb = ca-(gpo+tgpe);
+	if(pgb-tgpe > s[0].gb){
+		s[0].gb = pgb-tgpe;
+		c |= 16;
+	}	
+	tracep[0] = c;
+
+
+	pgb = s[0].gb;
+	c = 2;
+	if(s[0].ga > pgb){
+		pgb = s[0].ga;
+		c = 1;
+	}
+	if(s[0].a >= pgb){
+		pgb = s[0].a;
+		c = 0;
+	}
+	
+	f = c;
+	
+	i = 0;
+	j = 0;
+	c = 1;
+	while(trace[i][j] < 32){
+	//	fprintf(stderr,"%d->%d	%d:%d	%d:%d\n",c,trace[i][j],i,j,len_a,len_b);
+		switch(f){
+			case 0:
+				if (trace[i][j] & 2){
+					f = 1;
+					if(i+1!= len_a){
+						path[c+1] |= 16;
+	//					fprintf(stderr,"GAP_CLOSE\n");
+					}else{
+						path[c+1] |= 32+16;
+					}
+				}else if (trace[i][j] & 4){
+					f = 2;
+					if(j+1!= len_b){
+						path[c+1] |= 16;
+	//					fprintf(stderr,"GAP_CLOSE\n");
+					}else{
+						path[c+1] |= 32+16;
+					}
+				}
+
+				//path[c] = 0;
+				i++;
+				j++;
+			break;
+			case 1:
+				if(trace[i][j] & 8){
+					f = 1;
+					if(i!=0 && i!= len_a){
+	//				/	fprintf(stderr,"GAP_EXT\n");
+						if(!(path[c]&16)){
+							path[c] |= 8;
+						}
+					}else{
+						if(!(path[c]&16)){
+							path[c] |= 32+8;
+						}
+					}
+				}else{
+					f = 0;
+					if(i!=0 && i!= len_a){
+	//					fprintf(stderr,"GAP_OPEN\n");
+						path[c] |= 4;
+					}else{
+						path[c] |= 32+4;
+					}
+				}
+				path[c] |= 1;
+				j++;
+			break;
+			case  2:
+				if(trace[i][j] & 16){
+					f = 2;
+					if(j !=0 && j != len_b){
+	//					fprintf(stderr,"GAP_EXT\n");
+						if(!(path[c]&16)){
+							path[c] |= 8;
+						}
+					}else{
+						if(!(path[c]&16)){
+							path[c] |= 32+8;
+						}
+					}
+				}else{
+					f = 0;
+					if(j!=0 && j != len_b){
+	//					fprintf(stderr,"GAP_OPEN\n");
+						path[c] |= 4;
+					}else{
+						path[c] |= 32+4;
+					}
+					
+				}
+				path[c] |= 2;
+				i++;
+			break;
+		}
+		c++;
+	}
+	path[0] = c-1;
+	path[c] = 3;
+	path[c+1] = pgb;
+	return path;
+}

Added: trunk/packages/kalign/branches/upstream/current/kalign2_feature.c
===================================================================
--- trunk/packages/kalign/branches/upstream/current/kalign2_feature.c	2006-11-19 13:38:57 UTC (rev 159)
+++ trunk/packages/kalign/branches/upstream/current/kalign2_feature.c	2006-11-29 14:12:29 UTC (rev 160)
@@ -0,0 +1,1394 @@
+/*
+	kalign2_feature.c 
+	
+	Released under GPL - see the 'COPYING' file   
+	
+	Copyright (C) 2006 Timo Lassmann <timolassmann at gmail.com>
+	
+	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
+	any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+    
+	Please send bug reports, comments etc. to:
+	timolassmann at gmail.com
+*/
+
+#include "kalign2.h"
+#include "kalign2_feature.h"
+
+static int stride;
+static int dim;
+static int gpo_pos;
+static int gpe_pos;
+static int tgpe_pos;
+
+int** feature_hirschberg_alignment(struct alignment* aln,int* tree,float**submatrix, int** map,struct feature_matrix* fm)
+{
+	struct hirsch_mem* hm = 0;
+	int i,j,g,a,b,c;
+	int len_a;
+	int len_b;
+	float** profile = 0;
+	
+	stride = (26+fm->mdim)*2 + 3; 
+	dim = 26+fm->mdim;
+	gpo_pos = (dim << 1) + 0;
+	gpe_pos = (dim << 1) + 1;
+	tgpe_pos = (dim << 1) + 2;
+
+	profile = malloc(sizeof(float*)*numprofiles);
+	for ( i = 0;i< numprofiles;i++){
+		profile[i] = 0;
+	}
+
+	map = malloc(sizeof(int*)*numprofiles);
+	for ( i = 0;i < numprofiles;i++){
+		map[i] = 0;
+	}
+	
+	hm = hirsch_mem_alloc(hm,1024);
+
+	fprintf(stderr,"\nAlignment:\n");
+
+	for (i = 0; i < (numseq-1);i++){
+		a = tree[i*3];
+		b = tree[i*3+1];
+		c = tree[i*3+2];
+		fprintf(stderr,"\r%8.0f percent done",(float)(i) /(float)numseq * 100);
+		//fprintf(stderr,"Aligning:%d %d->%d	done:%f\n",a,b,c,((float)(i+1)/(float)numseq)*100);
+		len_a = aln->sl[a];
+		len_b = aln->sl[b];
+
+		
+		g = (len_a > len_b)? len_a:len_b;
+		map[c] = malloc(sizeof(int) * (g+2));
+		if(g > hm->size){
+			hm = hirsch_mem_realloc(hm,g);
+		}
+
+		for (j = 0; j < (g+2);j++){
+			map[c][j] = -1;
+		}
+
+		if (a < numseq){
+			profile[a] = make_unified_profile(profile[a],aln,a,submatrix,fm);
+		}
+		set_unified_gap_penalties(profile[a],len_a,aln->nsip[b]);
+		
+		if (b < numseq){
+			profile[b] = make_unified_profile(profile[b],aln,b,submatrix,fm);
+		}
+		set_unified_gap_penalties(profile[b],len_b,aln->nsip[a]);
+		
+		hm->starta = 0;
+		hm->startb = 0;
+		hm->enda = len_a;
+		hm->endb = len_b;
+		hm->len_a = len_a;
+		hm->len_b = len_b;
+		
+		hm->f[0].a = 0.0;
+		hm->f[0].ga =  -FLOATINFTY;
+		hm->f[0].gb = -FLOATINFTY;
+		hm->b[0].a = 0.0;
+		hm->b[0].ga =  -FLOATINFTY;
+		hm->b[0].gb =  -FLOATINFTY;
+		//dim = 26;
+	//	fprintf(stderr,"LENA:%d	LENB:%d	numseq:%d\n",len_a,len_b,numseq);
+		if(len_a < len_b){
+		//	fprintf(stderr,"normal\n");
+			map[c] = feature_hirsch_pp_dyn(profile[a],profile[b],hm,map[c]);
+		}else{
+		//	fprintf(stderr,"goofy\n");
+			hm->enda = len_b;
+			hm->endb = len_a;
+			hm->len_a = len_b;
+			hm->len_b = len_a;
+			map[c] = feature_hirsch_pp_dyn(profile[b],profile[a],hm,map[c]);
+			map[c] = mirror_hirsch_path(map[c],len_a,len_b);
+		}
+		map[c] = add_gap_info_to_hirsch_path(map[c],len_a,len_b);
+
+		if(i != numseq-2){
+			profile[c] = malloc(sizeof(float)*stride*(map[c][0]+2));
+			profile[c] = feature_hirschberg_update(profile[a],profile[b],profile[c],map[c],aln->nsip[a],aln->nsip[b]);
+		}
+		aln->sl[c] = map[c][0];
+	
+		aln->nsip[c] = aln->nsip[a] + aln->nsip[b];
+		aln->sip[c] = malloc(sizeof(int)*(aln->nsip[a] + aln->nsip[b]));
+		g =0;
+		for (j = aln->nsip[a];j--;){
+			aln->sip[c][g] = aln->sip[a][j];
+			g++;
+		}
+		for (j = aln->nsip[b];j--;){
+			aln->sip[c][g] = aln->sip[b][j];
+			g++;
+		}
+
+		free(profile[a]);
+		free(profile[b]);
+	}
+	fprintf(stderr,"\r%8.0f percent done\n",100.0);
+	free(profile);
+	hirsch_mem_free(hm);
+	for (i = 32;i--;){
+		free(submatrix[i]);
+	}
+	free(submatrix);
+	free_feature_matrix(fm);
+	return map;
+}
+
+
+float* feature_hirschberg_update(const float* profa,const float* profb,float* newp,int* path,int sipa,int sipb)
+{
+	int i,j,c;
+	for (i = stride; i--;){
+		newp[i] = profa[i] + profb[i];
+	}
+	
+	profa += stride;
+	profb += stride;
+	newp += stride;
+
+	c = 1;
+	
+	while(path[c] != 3){
+		//Idea: limit the 'virtual' number of residues of one type to x.
+		// i.e. only allow a maximum of 10 alanines to be registered in each column
+		// the penalty for aligning a 'G' to this column will stay stable even when many (>10) alanines are present.
+		// the difference in score between the 'correct' (all alanine) and incorrect (alanines + glycine) will not increase 
+		// with the number of sequences. -> see Durbin pp 140
+		
+		if (!path[c]){
+			//fprintf(stderr,"Align	%d\n",c);
+			for (i = stride; i--;){
+				newp[i] = profa[i] + profb[i];
+			}
+				
+			
+			profa += stride;
+			profb += stride;
+		}
+		
+		if (path[c] & 1){
+			//fprintf(stderr,"Gap_A:%d\n",c);
+			//printf("open:%d	ext:%d	%d	%d\n",si->nsip[a] * gpo,si->nsip[a] * gpe,si->nsip[a] * profb[41],si->nsip[a] * profb[46]);
+			for (i = stride; i--;){
+				newp[i] = profb[i];
+			}
+			profb += stride;
+			if(!(path[c] & 20)){
+				if(path[c] & 32){
+					newp[25] += sipa;//1;
+					i = tgpe*sipa;
+				}else{
+					newp[24] += sipa;//1;
+					i = gpe*sipa;
+				}
+				
+				for (j = dim; j < dim+23;j++){
+					newp[j] -=i;
+				}
+			}else{
+			if (path[c] & 16){ 
+	//			fprintf(stderr,"close_open");
+				if(path[c] & 32){
+					newp[25] += sipa;//1;
+					i = tgpe*sipa;
+					newp[23] += sipa;//1;
+					i += gpo*sipa;
+				}else{
+					newp[23] += sipa;//1;
+					i = gpo*sipa;
+				}
+								
+				for (j = dim; j < dim+23;j++){
+					newp[j] -=i;
+				}
+			}
+			if (path[c] & 4){ 
+	//			fprintf(stderr,"Gap_open");
+				if(path[c] & 32){
+					newp[25] += sipa;//1;
+					i = tgpe*sipa;
+					newp[23] += sipa;//1;
+					i += gpo*sipa;
+				}else{
+					newp[23] += sipa;//1;
+					i = gpo*sipa;
+				}
+				for (j = dim; j < dim+23;j++){
+					newp[j] -=i;
+				}
+			}
+			}		
+			
+		}
+		if (path[c] & 2){
+			//fprintf(stderr,"Gap_B:%d\n",c);
+			//printf("open:%d	ext:%d	%d	%d\n",si->nsip[b] * gpo,si->nsip[b] * gpe,profa[26],profa[27]);
+			for (i = stride; i--;){
+				newp[i] = profa[i];
+			}
+			profa+=stride;
+			if(!(path[c] & 20)){
+				if(path[c] & 32){
+					newp[25] += sipb;//1;
+					i = tgpe*sipb;
+				}else{
+					newp[24] += sipb;//1;
+					i = gpe*sipb;
+				}
+				for (j = dim; j < dim+23;j++){
+					newp[j] -=i;
+				}
+			}else{
+			if (path[c] & 16){
+	//			fprintf(stderr,"close_open");
+				if(path[c] & 32){
+					newp[25] += sipb;//1;
+					i =  tgpe*sipb;
+					newp[23] += sipb;//1;
+					i +=  gpo*sipb;
+				}else{
+					newp[23] += sipb;//1;
+					i =  gpo*sipb;
+				}
+				for (j = dim; j < dim+23;j++){
+					newp[j] -=i;
+				}
+			}
+			if (path[c] & 4){
+	//			fprintf(stderr,"Gap_open");
+				if(path[c] & 32){
+					newp[25] += sipb;//1;
+					i = tgpe*sipb;
+					newp[23] += sipb;//1;
+					i += gpo*sipb;
+				}else{
+					newp[23] += sipb;//1;
+					i = gpo*sipb;
+				}
+				
+				for (j = dim; j < dim+23;j++){
+					newp[j] -=i;
+				}
+			}
+			}		
+		}
+		newp += stride;
+		c++;
+	}
+	for (i = stride; i--;){
+		newp[i] =  profa[i] + profb[i];
+	}	
+	newp -= (path[0]+1) * stride;
+	return newp;
+}
+
+
+
+float* make_unified_profile(float* prof,struct alignment* aln, int num,float** subm,struct feature_matrix* fm)
+{
+	struct feature* f = aln->ft[num];
+	int i,j,c;
+	int* seq = aln->s[num];
+	//detemine minimim width of profile... 
+	//stride = (26+fm->mdim)*2 + 3; 
+	
+	int len = aln->sl[num];
+	prof = malloc(sizeof(float)*(len+2)*stride);
+	prof +=  (stride *(len+1));
+	for (i = 0;i < stride;i++){
+		prof[i] = 0;
+	}
+	prof[23+dim] = -gpo;
+	prof[24+dim] = -gpe;
+	prof[25+dim] = -tgpe;
+
+	
+	i = len;
+	while(i--){
+		prof -= stride;
+
+		for (j = 0;j < stride;j++){
+			prof[j] = 0;
+		}
+		c = seq[i];
+		
+		prof[c] += 1;
+		
+		prof += dim;
+		
+		for(j = 0; j < 23;j++){
+			prof[j] = subm[c][j];
+		}
+		prof[23] = -gpo;
+		prof[24] = -gpe;
+		prof[25] = -tgpe;
+		prof -= dim;
+	}
+	prof -= stride;
+	for (i = 0;i < stride;i++){
+		prof[i] = 0;
+	}
+	prof[23+dim] = -gpo;
+	prof[24+dim] = -gpe;
+	prof[25+dim] = -tgpe;	
+
+	while(f){
+		if(f->color != -1){
+			if(f->start < len && f->end < len){
+				for (i = f->start;i <= f->end;i++){
+					prof[i*stride+26 + f->color] += 1;
+					//prof[i*stride+dim+26 + f->color] += 75;
+					//fprintf(stderr,"FOUND on  %d : %s	%s\n",num,f->type,f->note);
+					for ( j = 0 ; j < fm->mdim ;j++){
+						prof[i*stride+dim+26+j] += fm->m[f->color][j];
+					}
+				}
+			}
+		}
+		f = f->next;
+	}	
+
+	//exit(0);
+ 	return prof;
+}
+
+
+void set_unified_gap_penalties(float* prof,int len,int nsip)
+{
+	int i;
+	
+	prof +=  (stride *(len+1));
+	prof[gpo_pos] = prof[dim+23]*nsip;
+	prof[gpe_pos] = prof[dim+24]*nsip;
+	prof[tgpe_pos] = prof[dim+25]*nsip;
+	i = len+1;
+	while(i--){
+		prof -= stride;
+		prof[gpo_pos] = prof[dim+23]*nsip;
+		prof[gpe_pos] = prof[dim+24]*nsip;
+		prof[tgpe_pos] = prof[dim+25]*nsip;
+	}
+}
+
+
+
+int* feature_hirsch_pp_dyn(const float* prof1,const float* prof2,struct hirsch_mem* hm, int* hirsch_path)
+{
+	int mid = ((hm->enda - hm->starta) / 2)+ hm->starta;
+	float input_states[6] = {hm->f[0].a,hm->f[0].ga,hm->f[0].gb,hm->b[0].a,hm->b[0].ga,hm->b[0].gb};
+	int old_cor[5] = {hm->starta,hm->enda,hm->startb,hm->endb,mid};
+
+	
+	//fprintf(stderr,"starta:%d enda:%d startb:%d endb:%d mid:%d\n",hm->starta,hm->enda,hm->startb,hm->endb,mid);
+	
+	
+	if(hm->starta  >= hm->enda){
+		return hirsch_path;
+	}
+	if(hm->startb  >= hm->endb){
+		return hirsch_path;
+	}
+
+	hm->enda = mid;
+	hm->f = feature_foward_hirsch_pp_dyn(prof1,prof2,hm);
+	/*int i;
+	fprintf(stderr,"FOWARD\n");
+	for (i = hm->startb; i <= hm->endb;i++){
+		fprintf(stderr,"%d	%d	%d\n",hm->f[i].a,hm->f[i].ga,hm->f[i].gb);
+	}*/
+
+	hm->starta = mid;
+	hm->enda = old_cor[1];
+	hm->b = feature_backward_hirsch_pp_dyn(prof1,prof2,hm);
+	/*fprintf(stderr,"BaCKWARD\n");
+
+	for (i = hm->startb; i <= hm->endb;i++){
+		fprintf(stderr,"%d	%d	%d\n",hm->b[i].a,hm->b[i].ga,hm->b[i].gb);
+	}*/
+
+	hirsch_path = feature_hirsch_align_two_pp_vector(prof1,prof2,hm,hirsch_path,input_states,old_cor);
+	return hirsch_path;
+}
+
+
+
+int* feature_hirsch_align_two_pp_vector(const float* prof1,const float* prof2,struct hirsch_mem* hm,int* hirsch_path, float input_states[],int old_cor[])
+{
+	struct states* f = hm->f;
+ 	struct states* b = hm->b;
+	int i,j,c;
+	int transition = -1;
+	
+	
+	//code:
+	// a -> a = 1
+	// a -> ga = 2
+	// a -> gb = 3
+	// ga ->ga = 4
+	// ga -> a = 5
+	//gb->gb = 6;
+	//gb->a = 7;
+	
+	//int max = -INFTY;
+	float max = -FLOATINFTY;	
+	//float middle =  (hm->endb - hm->startb)/2 + hm->startb;
+	float middle =  (old_cor[3] - old_cor[2])/2 + old_cor[2];
+	float sub = 0.0;
+	
+
+	prof1+= (stride * (old_cor[4]+1));
+	//prof2 += stride * (hm->startb);
+	//i = hm->startb;
+	prof2 += stride * (old_cor[2]);
+	i = old_cor[2];
+	c = -1;
+	//for(i = hm->startb; i < hm->endb;i++){
+	for(i = old_cor[2]; i < old_cor[3];i++){
+		sub = abs(middle -i);
+		sub /= 1000; 
+		prof2 += stride;
+		//fprintf(stderr,"%d	%d	%d \n",f[i].a,b[i].a,max);
+		if(f[i].a+b[i].a-sub > max){
+			max = f[i].a+b[i].a-sub;
+	//		fprintf(stderr,"aligned->aligned:%d + %d = %d\n",f[i].a,b[i].a,f[i].a+b[i].a);
+			transition = 1;
+			c = i;
+		}
+		if(f[i].a+b[i].ga+prof2[gpo_pos]-sub > max){
+			max = f[i].a+b[i].ga+prof2[gpo_pos]-sub;
+	//		fprintf(stderr,"aligned->gap_a:%d + %d +%d = %d\n",f[i].a,b[i].ga,prof1[27],f[i].a+b[i].ga+prof2[27]);
+			transition = 2;
+			c = i;
+		}
+		if(f[i].a+b[i].gb+prof1[gpo_pos] -sub> max){
+			max = f[i].a+b[i].gb+prof1[gpo_pos]-sub;
+	//		fprintf(stderr,"aligned->gap_b:%d + %d +%d = %d\n",f[i].a,b[i].gb,prof1[27],f[i].a+b[i].gb+prof1[27]);
+			transition = 3;
+			c = i;
+		}
+		if(f[i].ga+b[i].a+prof2[gpo_pos]-sub > max){
+			max = f[i].ga+b[i].a+prof2[gpo_pos]-sub;
+	//		fprintf(stderr,"gap_a->aligned:%d + %d + %d(gpo) = %d\n",f[i].ga,b[i].a,prof2[27],f[i].ga+b[i].a+prof2[27]);
+			transition = 5;
+			c = i;
+		}
+
+
+		if(hm->startb == 0){
+			if(f[i].gb+b[i].gb+prof1[tgpe_pos]-sub > max){
+				max = f[i].gb+b[i].gb+prof1[tgpe_pos]-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+				transition = 6;
+				c = i;
+			}
+		}else{
+			if(f[i].gb+b[i].gb+prof1[gpe_pos]-sub > max){
+				max = f[i].gb+b[i].gb+prof1[gpe_pos]-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+				transition = 6;
+				c = i;
+			}
+		}
+		if(f[i].gb+b[i].a+prof1[gpo_pos]-sub > max){
+			max = f[i].gb+b[i].a+prof1[gpo_pos]-sub;
+	//		fprintf(stderr,"gap_b->aligned:%d + %d + %d(gpo) = %d\n",f[i].gb,b[i].a,prof1[27],f[i].gb+b[i].a+prof1[27]);
+			transition = 7;
+			c = i;
+		}
+	}
+	//i = hm->endb;
+	i = old_cor[3];
+	sub = abs(middle -i);
+	sub /= 1000; 
+	if(f[i].a+b[i].gb+prof1[gpo_pos]-sub > max){
+		max = f[i].a+b[i].gb+prof1[gpo_pos]-sub;
+	//		fprintf(stderr,"aligned->gap_b:%d + %d +%d = %d\n",f[i].a,b[i].gb,prof1[27],f[i].a+b[i].gb+prof1[27]);
+		transition = 3;
+		c = i;
+	}
+	if(hm->endb == hm->len_b){
+		if(f[i].gb+b[i].gb+prof1[tgpe_pos]-sub > max){
+			max = f[i].gb+b[i].gb+prof1[tgpe_pos]-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+			transition = 6;
+			c = i;
+		}	
+	}else{
+		if(f[i].gb+b[i].gb+prof1[gpe_pos]-sub > max){
+			max = f[i].gb+b[i].gb+prof1[gpe_pos]-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+			transition = 6;
+			c = i;
+		}
+	}
+	
+	
+	
+	prof1-= (stride * (old_cor[4]+1));
+	//prof2 -= hm->endb << 6;
+	prof2 -= old_cor[3] * stride;
+	
+	//fprintf(stderr,"Transition:%d	at:%d\n",transition,c);
+	//if(transition == -1){
+	//	exit(0);
+	//}
+	
+	j = hirsch_path[0];
+	switch(transition){
+		case 1: //a -> a = 1
+			
+			hirsch_path[old_cor[4]] = c;
+			hirsch_path[old_cor[4]+1] = c+1;
+			
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4],c);
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4]+1,c+1);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = 0.0;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = -FLOATINFTY;
+	//		fprintf(stderr,"Using this for start:%d	%d	%d\n",hm->f[0].a,hm->f[0].ga,hm->f[0].gb);
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = feature_hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = 0.0;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d  what:%d-%d	%d-%d\n",c+1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = feature_hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+			break;
+		case 2:// a -> ga = 2
+			
+			hirsch_path[old_cor[4]] = c;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4],c);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = 0.0;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = -FLOATINFTY;
+			
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = feature_hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4];
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = -FLOATINFTY;
+			hm->f[0].ga = 0.0;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d  what:%d-%d	%d-%d\n",c+1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = feature_hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+			break;
+		case 3:// a -> gb = 3
+			
+			hirsch_path[old_cor[4]] = c;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4],c);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = 0.0;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = -FLOATINFTY;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = feature_hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c;
+			hm->endb = old_cor[3];
+			hm->f[0].a = -FLOATINFTY;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = 0.0;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = feature_hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+			break;
+		case 5://ga -> a = 5
+			hirsch_path[old_cor[4]+1] = c+1;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4]+1,c+1);
+
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = -FLOATINFTY;
+			hm->b[0].ga = 0.0;
+			hm->b[0].gb = -FLOATINFTY;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4];
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = feature_hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = 0.0;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = feature_hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+			break;
+		case 6://gb->gb = 6;
+			
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = -FLOATINFTY;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = 0.0;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			hm->startb = old_cor[2];
+			hm->endb = c;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = feature_hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c;
+			hm->endb = old_cor[3];
+			hm->f[0].a = -FLOATINFTY;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = 0.0;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = feature_hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+			break;
+		case 7://gb->a = 7;
+			
+			hirsch_path[old_cor[4]+1] = c+1;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4]+1,c+1);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = -FLOATINFTY;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = 0.0;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			hm->startb = old_cor[2];
+			hm->endb = c;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = feature_hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = 0.0;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = feature_hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+			break;
+	}
+		
+	return hirsch_path;
+}
+
+struct states* feature_foward_hirsch_pp_dyn(const float* prof1,const float* prof2,struct hirsch_mem* hm)
+{
+	unsigned int freq[dim];
+	struct states* s = hm->f;
+	//const int starta = hm->starta;
+	//const int enda = hm->enda;
+	//const int startb = hm->startb;
+	//const int endb = hm->endb;
+	
+	register float pa = 0;
+	register float pga = 0;
+	register float pgb = 0;
+	register float ca = 0;
+	register int i = 0;
+	register int j = 0;
+	register int c = 0;
+	
+	
+	
+	prof1 += (hm->starta) * stride;
+	prof2 +=  (hm->startb) * stride;
+	s[hm->startb].a = s[0].a;
+	s[hm->startb].ga = s[0].ga;
+	s[hm->startb].gb = s[0].gb;
+	if(hm->startb == 0){
+		for (j = hm->startb+1; j < hm->endb;j++){
+			prof2+=stride;
+			s[j].a = -FLOATINFTY;
+			
+			//s[j].ga = s[j-1].a+prof2[tgpe_pos];
+			//if (s[j-1].ga+prof2[tgpe_pos] > s[j].ga){
+			//	s[j].ga = s[j-1].ga+prof2[tgpe_pos];
+			//}
+			if(s[j-1].ga > s[j-1].a){
+				s[j].ga = s[j-1].ga+prof2[tgpe_pos];
+			}else{
+				s[j].ga = s[j-1].a+prof2[tgpe_pos];
+			}
+
+			
+			s[j].gb = -FLOATINFTY;
+		}	
+		prof2+=stride;	
+	}else{
+
+		for (j = hm->startb+1; j < hm->endb;j++){
+			prof2+=stride;
+			s[j].a = -FLOATINFTY;
+			
+			//s[j].ga = s[j-1].a+prof2[gpo_pos];
+			//if (s[j-1].ga+prof2[gpe_pos] > s[j].ga){
+			//	s[j].ga = s[j-1].ga+prof2[gpe_pos];
+			//}
+
+			if(s[j-1].ga+prof2[gpe_pos] > s[j-1].a+prof2[gpo_pos]){
+				s[j].ga = s[j-1].ga+prof2[gpe_pos];
+			}else{
+				s[j].ga = s[j-1].a+prof2[gpo_pos];
+			}
+			
+			s[j].gb = -FLOATINFTY;
+		//	prof2+=64;
+		}
+		prof2+=stride;
+	}
+	
+	prof2 -= (hm->endb-hm->startb) * stride;
+	
+	s[hm->endb].a = -FLOATINFTY;
+	s[hm->endb].ga = -FLOATINFTY;
+	s[hm->endb].gb = -FLOATINFTY;
+
+
+	for (i = hm->starta;i < hm->enda;i++){
+		prof1 += stride;
+		c = 1;
+		for (j = 0;j < dim; j++){
+			if(prof1[j]){
+				freq[c] = j;
+				c++;
+			}
+		}
+		freq[0] = c;
+			
+		pa = s[hm->startb].a;
+		pga = s[hm->startb].ga;
+		pgb = s[hm->startb].gb;
+		if(hm->startb == 0){
+			s[hm->startb].a = -FLOATINFTY;
+			s[hm->startb].ga = -FLOATINFTY;
+		
+			//s[hm->startb].gb = pa+prof1[tgpe_pos];
+			//if(pgb+prof1[tgpe_pos] > s[hm->startb].gb){
+			//	s[hm->startb].gb = pgb+prof1[tgpe_pos];
+			//}
+			if(pgb > pa){
+				s[hm->startb].gb = pgb+prof1[tgpe_pos];
+			}else{
+				s[hm->startb].gb = pa+prof1[tgpe_pos];
+			}
+			
+		}else{
+			s[hm->startb].a = -FLOATINFTY;
+			s[hm->startb].ga = -FLOATINFTY;
+		
+			//s[hm->startb].gb = pa+prof1[gpo_pos];
+			//if(pgb+prof1[gpe_pos] > s[hm->startb].gb){
+			//	s[hm->startb].gb = pgb+prof1[gpe_pos];
+			//}
+			if(pgb+prof1[gpe_pos] > pa+prof1[gpo_pos]){
+				s[hm->startb].gb = pgb+prof1[gpe_pos];
+			}else{
+				s[hm->startb].gb = pa+prof1[gpo_pos];
+			}
+			
+		}
+		for (j = hm->startb+1; j <= hm->endb;j++){
+			prof2 += stride;
+			ca = s[j].a;
+			
+			/*pga += prof2[-37];
+			pga = pa - pga;
+			pa = pa -((pga>>31)&pga);
+			
+			pgb += prof1[-37];
+			pa = pa -(((pa - pgb)>>31)&(pa -pgb));*/
+			//fprintf(stderr,"%d	%d	%d	%p	%d\n",i,j,gpo_pos-stride,prof2);
+			if((pga += prof2[gpo_pos-stride]) > pa){
+				pa = pga;
+			}
+
+			if((pgb += prof1[gpo_pos-stride]) > pa){
+				pa = pgb;
+			}
+			
+			prof2 += dim;
+			for (c = 1;c < freq[0];c++){
+				pa += prof1[freq[c]]*prof2[freq[c]];
+			}
+			prof2 -= dim;	
+
+			s[j].a = pa;
+			
+			pga = s[j].ga;
+			
+			//s[j].ga = s[j-1].a+prof2[gpo_pos];
+			//if (s[j-1].ga+prof2[gpe_pos] > s[j].ga){
+			//	s[j].ga = s[j-1].ga+prof2[gpe_pos];
+			//}
+			if(s[j-1].ga+prof2[gpe_pos] > s[j-1].a+prof2[gpo_pos]){
+				s[j].ga = s[j-1].ga+prof2[gpe_pos];
+			}else{
+				s[j].ga = s[j-1].a+prof2[gpo_pos];
+			}
+			
+			
+			pgb = s[j].gb;
+			
+			//s[j].gb = ca+prof1[gpo_pos];
+			//if(pgb+prof1[gpe_pos] > s[j].gb){
+			//	s[j].gb = pgb+prof1[gpe_pos];
+			//}
+			if(pgb+prof1[gpe_pos] > ca+prof1[gpo_pos]){
+				s[j].gb = pgb+prof1[gpe_pos];
+			}else{
+				s[j].gb = ca+prof1[gpo_pos];
+			}
+			
+			pa = ca;
+		}
+		prof2 -= (hm->endb-hm->startb) * stride;
+		
+	}
+	prof1 -= stride * (hm->enda);
+	return s;
+}
+
+struct states* feature_backward_hirsch_pp_dyn(const float* prof1,const float* prof2,struct hirsch_mem* hm)
+{
+	unsigned int freq[dim];
+	struct states* s = hm->b;
+	//const int starta = hm->starta;
+	//const int enda = hm->enda;
+	//const int startb = hm->startb;
+	//const int endb = hm->endb;
+	
+	register float pa = 0;
+	register float pga = 0;
+	register float pgb = 0;
+	register float ca = 0;
+	register int i = 0;
+	register int j = 0;
+	register int c = 0;
+
+	prof1 += (hm->enda+1) * stride;
+	prof2 += (hm->endb+1) * stride;
+	s[hm->endb].a = s[0].a;
+	s[hm->endb].ga = s[0].ga;
+	s[hm->endb].gb = s[0].gb;
+	
+	
+	//init of first row;
+	//j = endb-startb;
+	if(hm->endb == hm->len_b){
+		
+		for(j = hm->endb-1;j > hm->startb;j--){
+			prof2 -= stride;
+			s[j].a = -FLOATINFTY;
+			
+			//s[j].ga = s[j+1].a+prof2[tgpe_pos];
+			//if (s[j+1].ga+prof2[tgpe_pos] > s[j].ga){
+			//	s[j].ga = s[j+1].ga+prof2[tgpe_pos];
+			//}
+			if(s[j+1].ga > s[j+1].a){
+				s[j].ga = s[j+1].ga+prof2[tgpe_pos];
+			}else{
+				s[j].ga = s[j+1].a+prof2[tgpe_pos];
+			}
+			
+			s[j].gb = -FLOATINFTY;
+		}
+		prof2 -= stride;
+	}else{
+		for(j = hm->endb-1;j > hm->startb;j--){
+			prof2 -= stride;
+			s[j].a = -FLOATINFTY;
+			
+			//s[j].ga = s[j+1].a+prof2[gpo_pos];
+			//if (s[j+1].ga+prof2[gpe_pos] > s[j].ga){
+			//	s[j].ga = s[j+1].ga+prof2[gpe_pos];
+			//}
+			if(s[j+1].ga+prof2[gpe_pos] > s[j+1].a+prof2[gpo_pos]){
+				s[j].ga = s[j+1].ga+prof2[gpe_pos];
+			}else{
+				s[j].ga = s[j+1].a+prof2[gpo_pos];
+			}
+			s[j].gb = -FLOATINFTY;
+		//	prof2 -= 64;
+		}
+		prof2 -= stride;
+	}
+	
+	s[hm->startb].a = -FLOATINFTY;
+	s[hm->startb].ga = -FLOATINFTY;
+	s[hm->startb].gb = -FLOATINFTY;
+//	prof2 -= (endb -startb) << 6;
+
+	i = hm->enda-hm->starta;
+	while(i--){
+		prof1 -= stride;
+
+		c = 1;
+		for (j = 0;j < dim; j++){
+			if(prof1[j]){
+				freq[c] = j;
+				c++;
+			}
+		}
+		freq[0] = c;
+		
+		pa = s[hm->endb].a;
+		pga = s[hm->endb].ga;
+		pgb = s[hm->endb].gb;
+		s[hm->endb].a = -FLOATINFTY;
+		s[hm->endb].ga = -FLOATINFTY;
+
+		if(hm->endb == hm->len_b){
+			//s[hm->endb].gb = pa+prof1[tgpe_pos];
+			//if(pgb+prof1[tgpe_pos] > s[hm->endb].gb){
+			//	s[hm->endb].gb = pgb+prof1[tgpe_pos];
+			//}
+			if(pgb > pa){
+				s[hm->endb].gb = pgb+prof1[tgpe_pos];
+			}else{
+				s[hm->endb].gb = pa+prof1[tgpe_pos];
+			}
+		}else{
+			//s[hm->endb].gb = pa+prof1[gpo_pos];
+			//if(pgb+prof1[gpe_pos] > s[hm->endb].gb){
+			//	s[hm->endb].gb = pgb+prof1[gpe_pos];
+			//}
+			if(pgb+prof1[gpe_pos] > pa+prof1[gpo_pos]){
+				s[hm->endb].gb = pgb+prof1[gpe_pos];
+			}else{
+				s[hm->endb].gb = pa+prof1[gpo_pos];
+			}
+		}
+		//j = endb-startb;
+		prof2 += (hm->endb-hm->startb) * stride;
+		//while(j--){
+		for(j = hm->endb-1;j >= hm->startb;j--){
+			prof2 -= stride;
+			ca = s[j].a;
+			if((pga += prof2[stride+ gpo_pos]) > pa){
+				pa = pga;
+			}
+			if((pgb += prof1[stride+gpo_pos]) > pa){
+				pa = pgb;
+			}
+			
+			prof2 += dim;
+			for (c = 1;c < freq[0];c++){
+				pa += prof1[freq[c]]*prof2[freq[c]];
+			}
+			prof2 -= dim;
+
+			s[j].a = pa;
+			
+			pga = s[j].ga;
+			
+			//s[j].ga = s[j+1].a+prof2[gpo_pos];
+			//if (s[j+1].ga+prof2[gpe_pos] > s[j].ga){
+			//	s[j].ga = s[j+1].ga+prof2[gpe_pos];
+			//}
+			if(s[j+1].ga+prof2[gpe_pos] > s[j+1].a+prof2[gpo_pos]){
+				s[j].ga = s[j+1].ga+prof2[gpe_pos];
+			}else{
+				s[j].ga = s[j+1].a+prof2[gpo_pos];
+			}
+			
+			pgb = s[j].gb;
+			
+			//s[j].gb = ca+prof1[gpo_pos];
+			//if(pgb+prof1[gpe_pos] > s[j].gb){
+			//	s[j].gb = pgb+prof1[gpe_pos];
+			//}
+			if(pgb+prof1[gpe_pos] > ca+prof1[gpo_pos]){
+				s[j].gb = pgb+prof1[gpe_pos];
+			}else{
+				s[j].gb = ca+prof1[gpo_pos];
+			}
+			pa = ca;
+		}
+	}		
+	return s;
+}
+
+
+
+
+struct feature_matrix* get_feature_matrix(struct feature_matrix* fm, struct alignment* aln,char* requested_feature)
+{
+	struct utype_ufeat* utf = 0;
+	struct feature* n = 0;
+	struct feature* p = 0;
+	
+	int i = 0;
+	int j = 0;
+	
+	utf = get_unique_features(aln,utf);
+	
+	fm = malloc(sizeof(struct feature_matrix));
+	
+	
+	
+	
+	if (byg_start(requested_feature,"allALL")!= -1){
+		n = utf->f;
+		i = 0;
+		while(n){
+			n->color = i;
+			i++;
+			n = n->next;
+		}
+	}else if(byg_start(requested_feature,"maxplpMAXPLP")!= -1){
+		n = utf->f;
+		i = 0;
+		while(n){
+			if(byg_start("SIGNAL PEPTIDE",n->note)!= -1){
+				n->color = 0;
+			}
+			if(byg_start("TRANSMEMBRANE",n->note)!= -1){
+				n->color = 1;
+			}
+			if(byg_start("TRANSLOCATED LOOP",n->note)!= -1){
+				n->color = 2;
+			}
+			if(byg_start("CYTOPLASMIC LOOP",n->note)!= -1){
+				n->color = 3;
+			}
+			n = n->next;
+		}
+		i = 4;
+	}else{
+		n = utf->f;
+		i = 0;
+		while(n){
+			if(check_identity(requested_feature,n->type)!= -1){
+				//fprintf(stderr,"%s	%s\n",requested_feature,n->type);
+				n->color = i;
+				i++;
+			}else{
+				n->color = -1;
+			}
+			n = n->next;
+		}
+	}
+	/*if(!i){
+		fprintf(stderr,"WARNING: no feature of type '%s' was found in the input file.\n",requested_feature);
+		fprintf(stderr,"	\nAvailable features are:\n\n");
+		fprintf(stderr,"	Type		Feature\n");
+		fprintf(stderr,"	-----------------------------\n");
+		n = utf->f;
+		while(n){
+			fprintf(stderr,"	%s		%s\n",n->type,n->note);
+			n = n->next;
+		}
+		
+		free_utf(utf);
+		free_aln(aln);
+		free(fm);
+		return 0;
+	}*/
+	
+	if(byg_start(requested_feature,"maxplp")!= -1){
+		fm->mdim = 4;
+		fm->stride = fm->mdim << 1;
+		fm->m = malloc(sizeof(float*)*fm->mdim);
+		for (i = 0;i < fm->mdim;i++){
+			fm->m[i] = malloc(sizeof(float)*fm->mdim);
+		}
+	/*1: 0.60 0.20 0.15 0.05
+	2: 0.20 0.60 0.10 0.10
+	3: 0.15 0.10 0.50 0.25
+	4: 0.05 0.10 0.25 0.60*/
+
+		fm->m[0][0] = 60;
+		fm->m[0][1] = 20;
+		fm->m[0][2] = 15;
+		fm->m[0][3] = 5;
+		fm->m[1][0] = 20;
+		fm->m[1][1] = 60;
+		fm->m[1][2] = 10;
+		fm->m[1][3] = 10;
+		fm->m[2][0] = 15;
+		fm->m[2][1] = 10;
+		fm->m[2][2] = 50;
+		fm->m[2][3] = 25;
+		fm->m[3][0] = 5;
+		fm->m[3][1] = 10;
+		fm->m[3][2] = 25;
+		fm->m[3][3] = 60;
+		
+	}else if(byg_start(requested_feature,"wumanber")!= -1){
+		fm->mdim = i;
+		fm->stride = fm->mdim << 1;
+		fm->m = malloc(sizeof(float*)*fm->mdim);
+		for (i = 0;i < fm->mdim;i++){
+			fm->m[i] = malloc(sizeof(float)*fm->mdim);
+			for (j = 0;j < fm->mdim;j++){
+				fm->m[i][j] = 0;
+			}
+		}
+		for (i = 0;i < fm->mdim;i++){
+			fm->m[i][i] = 100;
+		}	
+	//	fprintf(stderr,"WU	%d	\n",fm->mdim);
+	}else{
+		fm->mdim = i;
+		fm->stride = fm->mdim << 1;
+		fm->m = malloc(sizeof(float*)*fm->mdim);
+		for (i = 0;i < fm->mdim;i++){
+			fm->m[i] = malloc(sizeof(float)*fm->mdim);
+			for (j = 0;j < fm->mdim;j++){
+				fm->m[i][j] = -5;
+			}
+		}
+		for (i = 0;i < fm->mdim;i++){
+			fm->m[i][i] = 75;
+		}	
+	}
+	//float fr = 0.0;
+	for (i = numseq;i--;){
+                n = aln->ft[i];
+	//	fprintf(stderr,"SEQUENCE %d\n",i);
+                while(n){
+                        p = utf->f;
+                        while(p){
+                        	if(check_identity(requested_feature,n->type)!= -1){
+                                if(check_identity(n->note,p->note)!= -1){
+					n->color = p->color;
+             //                           fr += n->end - n->start+1;
+            //                           fprintf(stderr,"SEQ:%d	FEATURE FOUND:%s	%s	%d-%d	 color:%d	\n",i,n->note,p->note,n->start,n->end,n->color);
+                                        break;
+                                }
+                                }
+                                p = p->next;
+                        }
+                        n = n->next;
+                }
+        }
+//	fprintf(stderr,"%f\n",fr);
+	
+	//float res = 0.0;
+	
+	//for (i = 0; i < numseq;i++){
+	//	res += aln->sl[i];
+	//}
+	//fprintf(stdout,"%f	%f	%f\n",fr,res,fr/res);
+	//exit(0);
+	
+	/*
+	n = utf->t;
+	fprintf(stderr,"TYPES:	we use:%d\n",i);
+	while(n){
+		fprintf(stderr,"%s\n",n->type);
+		n = n->next;
+	}
+	
+	n = utf->f;
+	fprintf(stderr,"Features:\n");
+	i = 0;
+	while(n){
+		fprintf(stderr,"%d:	%s:%s	col:%d\n",i,n->type,n->note,n->color);
+		i++;
+		n = n->next;
+	}
+	fprintf(stderr,"REQUESTED FEATURE:%s\n",requested_feature);
+
+	for (i = 0;i < fm->mdim;i++){
+		for (j = 0;j < fm->mdim;j++){
+			fprintf(stderr,"%d ",fm->m[i][j]);
+		}
+		fprintf(stderr,"\n");
+	}	
+	fprintf(stderr,"\n");*/
+	
+	
+	free_utf(utf);
+	return fm; 
+}
+
+struct utype_ufeat* get_unique_features(struct alignment* aln,struct utype_ufeat* utf)
+{
+	int i;
+	utf = malloc(sizeof(struct utype_ufeat)*1);
+	utf->t = 0;
+	utf->f = 0;
+	for (i =0; i < numseq;i++){
+		utf = traverse_ft(utf,aln->ft[i]);
+	}
+	return utf;
+}
+
+
+struct utype_ufeat* traverse_ft(struct utype_ufeat* utf,struct feature* n)
+{
+	if (n != NULL){
+		utf->t = add_unique_type(utf->t,n);
+		utf->f = add_unique_feature(utf->f,n);
+		traverse_ft(utf,n->next);
+	}
+	return utf;
+}
+
+
+struct feature* add_unique_feature(struct feature *n, struct feature *toadd)
+{
+	int i;
+		
+        if (n == NULL){
+		n = (struct feature*) malloc(sizeof(struct feature));
+		n->type = malloc(sizeof(char)* (strlen(toadd->type)+1));
+		for ( i= 0;i < strlen(toadd->type);i++){
+			n->type[i] = toadd->type[i];
+		}
+		n->type[i] = 0;
+		
+		n->note = malloc(sizeof(char)* (strlen(toadd->note)+1));
+		for ( i= 0;i < strlen(toadd->note);i++){
+			n->note[i] = toadd->note[i];
+		}
+		n->note[i] = 0;
+		
+		n->start = toadd->end - toadd->start;
+		n->end = 0;
+		
+		n->next = 0;
+	}else{
+	
+		if((check_identity(toadd->note,n->note)== -1)){
+			n->next = add_unique_feature(n->next,toadd);
+		}else{
+			n->start += toadd->end - toadd->start;
+		}
+	}
+        return n;
+}
+
+struct feature* add_unique_type(struct feature *n, struct feature *toadd)
+{
+	int i;
+		
+        if (n == NULL){
+		n = (struct feature*) malloc(sizeof(struct feature));
+		n->type = malloc(sizeof(char)* (strlen(toadd->type)+1));
+		for ( i= 0;i < strlen(toadd->type);i++){
+			n->type[i] = toadd->type[i];
+		}
+		n->type[i] = 0;
+		
+		n->note = malloc(sizeof(char)* (strlen(toadd->note)+1));
+		for ( i= 0;i < strlen(toadd->note);i++){
+			n->note[i] = toadd->note[i];
+		}
+		n->note[i] = 0;
+		
+		n->start = 0;
+		n->end = 0;
+		
+		n->next = 0;
+	}else{
+		if((check_identity(toadd->type,n->type)== -1)){
+			n->next = add_unique_type(n->next,toadd);
+		}
+	}
+        return n;
+}
+
+
+
+
+
+

Added: trunk/packages/kalign/branches/upstream/current/kalign2_feature.h
===================================================================
--- trunk/packages/kalign/branches/upstream/current/kalign2_feature.h	2006-11-19 13:38:57 UTC (rev 159)
+++ trunk/packages/kalign/branches/upstream/current/kalign2_feature.h	2006-11-29 14:12:29 UTC (rev 160)
@@ -0,0 +1,36 @@
+/*
+	feature.h
+	
+	Released under GPL - see the 'COPYING' file   
+	
+	Copyright (C) 2006 Timo Lassmann <timolassmann at gmail.com>
+	
+	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
+	any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+    
+	Please send bug reports, comments etc. to:
+	timolassmann at gmail.com
+*/
+
+#include <string.h>
+
+float* feature_hirschberg_update(const float* profa,const float* profb,float* newp,int* path,int sipa,int sipb);
+float* make_unified_profile(float* prof,struct alignment* aln, int num,float** subm,struct feature_matrix* fm);
+void set_unified_gap_penalties(float* prof,int len,int nsip);
+
+int* feature_hirsch_pp_dyn(const float* prof1,const float* prof2,struct hirsch_mem* hm, int* hirsch_path);
+int* feature_hirsch_align_two_pp_vector(const float* prof1,const float* prof2,struct hirsch_mem* hm,int* hirsch_path, float input_states[],int old_cor[]);
+struct states* feature_foward_hirsch_pp_dyn(const float* prof1,const float* prof2,struct hirsch_mem* hm);
+struct states* feature_backward_hirsch_pp_dyn(const float* prof1,const float* prof2,struct hirsch_mem* hm);
+

Added: trunk/packages/kalign/branches/upstream/current/kalign2_hirschberg.c
===================================================================
--- trunk/packages/kalign/branches/upstream/current/kalign2_hirschberg.c	2006-11-19 13:38:57 UTC (rev 159)
+++ trunk/packages/kalign/branches/upstream/current/kalign2_hirschberg.c	2006-11-29 14:12:29 UTC (rev 160)
@@ -0,0 +1,2741 @@
+/*
+	kalign2_hirschberg.c
+	
+	Released under GPL - see the 'COPYING' file   
+	
+	Copyright (C) 2006 Timo Lassmann <timolassmann at gmail.com>
+	
+	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
+	any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+    
+	Please send bug reports, comments etc. to:
+	timolassmann at gmail.com
+*/
+
+#include "kalign2.h"
+#include "kalign2_hirschberg.h"
+#define MAX(a, b) (a > b ? a : b)
+#define MAX3(a,b,c) MAX(MAX(a,b),c)
+//#include <emmintrin.h>
+
+int** hirschberg_alignment(struct alignment* aln,int* tree,float**submatrix, int** map,int window,float strength)
+{
+	struct hirsch_mem* hm = 0;
+	int i,j,g,a,b,c;
+	int len_a;
+	int len_b;
+	float** profile = 0;
+
+	profile = malloc(sizeof(float*)*numprofiles);
+	for ( i = 0;i< numprofiles;i++){
+		profile[i] = 0;
+	}
+
+	map = malloc(sizeof(int*)*numprofiles);
+	for ( i = 0;i < numprofiles;i++){
+		map[i] = 0;
+	}
+	
+	hm = hirsch_mem_alloc(hm,1024);
+
+	fprintf(stderr,"\nAlignment:\n");
+
+	for (i = 0; i < (numseq-1);i++){
+		a = tree[i*3];
+		b = tree[i*3+1];
+		c = tree[i*3+2];
+		fprintf(stderr,"\r%8.0f percent done",(float)(i) /(float)numseq * 100);
+		//fprintf(stderr,"Aligning:%d %d->%d	done:%f\n",a,b,c,((float)(i+1)/(float)numseq)*100);
+		len_a = aln->sl[a];
+		len_b = aln->sl[b];
+
+		
+		g = (len_a > len_b)? len_a:len_b;
+		map[c] = malloc(sizeof(int) * (g+2));
+		if(g > hm->size){
+			hm = hirsch_mem_realloc(hm,g);
+		}
+
+		for (j = 0; j < (g+2);j++){
+			map[c][j] = -1;
+		}
+
+		if (a < numseq){
+			profile[a] = make_profile(profile[a],aln->s[a],len_a,submatrix);
+		}else{
+			set_gap_penalties(profile[a],len_a,aln->nsip[b]);
+			//smooth_gaps(profile[a],len_a,window,strength);
+			
+			//increase_gaps(profile[a],len_a,window,strength);
+		}
+		if (b < numseq){
+			profile[b] = make_profile(profile[b],aln->s[b],len_b,submatrix);
+		}else{		
+			set_gap_penalties(profile[b],len_b,aln->nsip[a]);
+			//smooth_gaps(profile[b],len_b,window,strength);
+			//increase_gaps(profile[b],len_b,window,strength);
+		}
+		
+		hm->starta = 0;
+		hm->startb = 0;
+		hm->enda = len_a;
+		hm->endb = len_b;
+		hm->len_a = len_a;
+		hm->len_b = len_b;
+		
+		hm->f[0].a = 0.0;
+		hm->f[0].ga =  -FLOATINFTY;
+		hm->f[0].gb = -FLOATINFTY;
+		hm->b[0].a = 0.0;
+		hm->b[0].ga =  -FLOATINFTY;
+		hm->b[0].gb =  -FLOATINFTY;
+	//	fprintf(stderr,"LENA:%d	LENB:%d	numseq:%d\n",len_a,len_b,numseq);
+		if(a < numseq){
+			if(b < numseq){
+				map[c] = hirsch_ss_dyn(submatrix,aln->s[a],aln->s[b],hm,map[c]);
+			}else{
+				hm->enda = len_b;
+				hm->endb = len_a;
+				hm->len_a = len_b;
+				hm->len_b = len_a;
+				map[c] = hirsch_ps_dyn(profile[b],aln->s[a],hm,map[c],aln->nsip[b]);
+				map[c] = mirror_hirsch_path(map[c],len_a,len_b);
+			}
+		}else{
+			if(b < numseq){
+				map[c] = hirsch_ps_dyn(profile[a],aln->s[b],hm,map[c],aln->nsip[a]);
+			}else{
+				if(len_a < len_b){
+					map[c] = hirsch_pp_dyn(profile[a],profile[b],hm,map[c]);
+				}else{
+					hm->enda = len_b;
+					hm->endb = len_a;
+					hm->len_a = len_b;
+					hm->len_b = len_a;
+					map[c] = hirsch_pp_dyn(profile[b],profile[a],hm,map[c]);
+					map[c] = mirror_hirsch_path(map[c],len_a,len_b);
+				}
+			}
+		}
+		
+		map[c] = add_gap_info_to_hirsch_path(map[c],len_a,len_b);
+
+		if(i != numseq-2){
+			profile[c] = malloc(sizeof(float)*64*(map[c][0]+2));
+			profile[c] = update(profile[a],profile[b],profile[c],map[c],aln->nsip[a],aln->nsip[b]);
+		}
+			
+		aln->sl[c] = map[c][0];
+	
+		aln->nsip[c] = aln->nsip[a] + aln->nsip[b];
+		aln->sip[c] = malloc(sizeof(int)*(aln->nsip[a] + aln->nsip[b]));
+		g =0;
+		for (j = aln->nsip[a];j--;){
+			aln->sip[c][g] = aln->sip[a][j];
+			g++;
+		}
+		for (j = aln->nsip[b];j--;){
+			aln->sip[c][g] = aln->sip[b][j];
+			g++;
+		}
+
+		free(profile[a]);
+		free(profile[b]);
+	}
+	fprintf(stderr,"\r%8.0f percent done\n",100.0);
+	free(profile);
+	hirsch_mem_free(hm);
+	for (i = 32;i--;){
+		free(submatrix[i]);
+	}
+	free(submatrix);
+	return map;
+}
+
+
+int* hirsch_ss_dyn(float**subm, const int* seq1,const int* seq2,struct hirsch_mem* hm, int* hirsch_path)
+{
+	int mid = ((hm->enda - hm->starta) / 2)+ hm->starta;
+	float input_states[6] = {hm->f[0].a,hm->f[0].ga,hm->f[0].gb,hm->b[0].a,hm->b[0].ga,hm->b[0].gb};
+	int old_cor[5] = {hm->starta,hm->enda,hm->startb,hm->endb,mid};
+
+	if(hm->starta  >= hm->enda){
+		return hirsch_path;
+	}
+	if(hm->startb  >= hm->endb){
+		return hirsch_path;
+	}
+
+
+	hm->enda = mid;
+
+	//fprintf(stderr,"Forward:%d-%d	%d-%d\n",hm->starta,hm->enda,hm->startb,hm->endb);
+	hm->f = foward_hirsch_ss_dyn(subm,seq1,seq2,hm);
+
+	hm->starta = mid;
+	hm->enda = old_cor[1];
+	//fprintf(stderr,"Backward:%d-%d	%d-%d\n",hm->starta,hm->enda,hm->startb,hm->endb);
+	hm->b = backward_hirsch_ss_dyn(subm,seq1,seq2,hm);
+
+
+	hirsch_path = hirsch_align_two_ss_vector(subm,seq1,seq2,hm,hirsch_path,input_states,old_cor);
+	return hirsch_path;
+}
+
+int* hirsch_align_two_ss_vector(float**subm,const int* seq1,const int* seq2,struct hirsch_mem* hm,int* hirsch_path,float input_states[],int old_cor[])
+{
+	struct states* f = hm->f;
+ 	struct states* b = hm->b;
+	int i,j,c;
+	int transition = -1;
+	
+	
+	//code:
+	// a -> a = 1
+	// a -> ga = 2
+	// a -> gb = 3
+	// ga ->ga = 4
+	// ga -> a = 5
+	//gb->gb = 6;
+	//gb->a = 7;
+	
+	//int max = -INFTY;
+	float max = -INFTY;
+	//float middle =  (hm->endb - hm->startb)/2 + hm->startb;
+	float middle =  (old_cor[3] - old_cor[2])/2 + old_cor[2];
+	float sub = 0.0;
+	
+	//i = hm->startb;
+	i = old_cor[2];
+	c = -1;
+	//for(i = hm->startb; i < hm->endb;i++){
+	for(i = old_cor[2]; i < old_cor[3];i++){
+	
+		sub = abs(middle -i);
+		sub /= 1000; 
+	//	fprintf(stderr,"%d-%d	%f\n",hm->startb,hm->endb,sub);
+		if(f[i].a+b[i].a-sub > max){
+			max = f[i].a+b[i].a-sub;
+	//		fprintf(stderr,"aligned->aligned:%d + %d = %d\n",f[i].a,b[i].a,f[i].a+b[i].a);
+			transition = 1;
+			c = i;
+		}
+		if(f[i].a+b[i].ga-gpo-sub > max){
+			max = f[i].a+b[i].ga-gpo-sub;
+	//		fprintf(stderr,"aligned->gap_a:%d + %d +%d = %d\n",f[i].a,b[i].ga,prof1[27],f[i].a+b[i].ga+prof2[27]);
+			transition = 2;
+			c = i;
+		}
+		if(f[i].a+b[i].gb -gpo-sub > max){
+			max = f[i].a+b[i].gb - gpo-sub;
+	//		fprintf(stderr,"aligned->gap_b:%d + %d +%d = %d\n",f[i].a,b[i].gb,prof1[27],f[i].a+b[i].gb+prof1[27]);
+			transition = 3;
+			c = i;
+		}
+		if(f[i].ga+b[i].a - gpo-sub > max){
+			max = f[i].ga+b[i].a - gpo-sub;
+	//		fprintf(stderr,"gap_a->aligned:%d + %d + %d(gpo) = %d\n",f[i].ga,b[i].a,prof2[27],f[i].ga+b[i].a+prof2[27]);
+			transition = 5;
+			c = i;
+		}
+
+
+		if(hm->startb == 0){
+			if(f[i].gb+b[i].gb - tgpe-sub > max){
+				max = f[i].gb+b[i].gb -tgpe-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+				transition = 6;
+				c = i;
+			}
+		}else{
+			if(f[i].gb+b[i].gb - gpe -sub> max){
+				max = f[i].gb+b[i].gb - gpe-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+				transition = 6;
+				c = i;
+			}
+		}
+		if(f[i].gb+b[i].a - gpo-sub > max){
+			max = f[i].gb+b[i].a - gpo-sub;
+	//		fprintf(stderr,"gap_b->aligned:%d + %d + %d(gpo) = %d\n",f[i].gb,b[i].a,prof1[27],f[i].gb+b[i].a+prof1[27]);
+			transition = 7;
+			c = i;
+		}
+	}
+	//i = hm->endb;
+	i = old_cor[3];
+	sub = abs(middle -i);
+	sub /= 1000; 
+	
+	if(f[i].a+b[i].gb-gpo-sub > max){
+		max = f[i].a+b[i].gb - gpo-sub;
+	//		fprintf(stderr,"aligned->gap_b:%d + %d +%d = %d\n",f[i].a,b[i].gb,prof1[27],f[i].a+b[i].gb+prof1[27]);
+		transition = 3;
+		c = i;
+	}
+	if(hm->endb == hm->len_b){
+		if(f[i].gb+b[i].gb -tgpe-sub > max){
+			max = f[i].gb+b[i].gb - tgpe-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+			transition = 6;
+			c = i;
+		}	
+	}else{
+		if(f[i].gb+b[i].gb - gpe-sub > max){
+			max = f[i].gb+b[i].gb - gpe-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+			transition = 6;
+			c = i;
+		}
+	}
+	
+	
+	//fprintf(stderr,"Transition:%d	at:%d\n",transition,c);
+	
+	j = hirsch_path[0];
+	switch(transition){
+		case 1: //a -> a = 1
+			
+			hirsch_path[old_cor[4]] = c;
+			hirsch_path[old_cor[4]+1] = c+1;
+			
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4],c);
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4]+1,c+1);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = 0.0;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = -FLOATINFTY;
+	//		fprintf(stderr,"Using this for start:%d	%d	%d\n",hm->f[0].a,hm->f[0].ga,hm->f[0].gb);
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_ss_dyn(subm,seq1,seq2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = 0.0;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d  what:%d-%d	%d-%d\n",c+1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_ss_dyn(subm,seq1,seq2,hm,hirsch_path);
+			break;
+		case 2:// a -> ga = 2
+			
+			hirsch_path[old_cor[4]] = c;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4],c);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = 0.0;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = -FLOATINFTY;
+			
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_ss_dyn(subm,seq1,seq2,hm,hirsch_path);
+			
+
+			//backward:
+			hm->starta = old_cor[4];
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = -FLOATINFTY;
+			hm->f[0].ga = 0.0;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d  what:%d-%d	%d-%d\n",c+1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_ss_dyn(subm,seq1,seq2,hm,hirsch_path);
+			break;
+		case 3:// a -> gb = 3
+			
+			hirsch_path[old_cor[4]] = c;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4],c);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = 0.0;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = -FLOATINFTY;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_ss_dyn(subm,seq1,seq2,hm,hirsch_path);
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c;
+			hm->endb = old_cor[3];
+			hm->f[0].a = -FLOATINFTY;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = 0.0;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = hirsch_ss_dyn(subm,seq1,seq2,hm,hirsch_path);
+			break;
+		case 5://ga -> a = 5
+			hirsch_path[old_cor[4]+1] = c+1;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4]+1,c+1);
+
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = -FLOATINFTY;
+			hm->b[0].ga = 0.0;
+			hm->b[0].gb = -FLOATINFTY;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4];
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_ss_dyn(subm,seq1,seq2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = 0.0;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = hirsch_ss_dyn(subm,seq1,seq2,hm,hirsch_path);
+			break;
+		case 6://gb->gb = 6;
+			
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = -FLOATINFTY;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = 0.0;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			hm->startb = old_cor[2];
+			hm->endb = c;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_ss_dyn(subm,seq1,seq2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c;
+			hm->endb = old_cor[3];
+			hm->f[0].a = -FLOATINFTY;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = 0.0;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = hirsch_ss_dyn(subm,seq1,seq2,hm,hirsch_path);
+			break;
+		case 7://gb->a = 7;
+			
+			hirsch_path[old_cor[4]+1] = c+1;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4]+1,c+1);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = -FLOATINFTY;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = 0.0;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			hm->startb = old_cor[2];
+			hm->endb = c;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_ss_dyn(subm,seq1,seq2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = 0.0;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = hirsch_ss_dyn(subm,seq1,seq2,hm,hirsch_path);
+			break;
+	}
+		
+	return hirsch_path;
+}
+
+
+
+struct states* foward_hirsch_ss_dyn(float**subm,const int* seq1,const int* seq2,struct hirsch_mem* hm)
+{
+	struct states* s = hm->f;
+	float *subp = 0;
+	const int starta = hm->starta;
+	const int enda = hm->enda;
+	const int startb =hm->startb;
+	const int endb = hm->endb;
+	register float pa = 0;
+	register float pga = 0;
+	register float pgb = 0;
+	register float ca = 0;
+	register int i = 0;
+	register int j = 0;
+	
+
+	s[startb].a = s[0].a;
+	s[startb].ga = s[0].ga;
+	s[startb].gb = s[0].gb;
+	if(startb){
+		for (j = startb+1; j < endb;j++){
+			s[j].a = -FLOATINFTY;
+			s[j].ga = MAX(s[j-1].ga - gpe,s[j-1].a-gpo);
+			s[j].gb = -FLOATINFTY;
+		}
+	}else{
+		for (j = startb+1; j < endb;j++){
+			s[j].a = -FLOATINFTY;
+			s[j].ga = MAX(s[j-1].ga,s[j-1].a)-tgpe;
+			s[j].gb = -FLOATINFTY;
+		}
+	}
+	s[endb].a = -FLOATINFTY;
+	s[endb].ga = -FLOATINFTY;
+	s[endb].gb = -FLOATINFTY;
+
+	seq2--;
+	for (i = starta;i < enda;i++){
+		subp = subm[seq1[i]];
+
+		pa = s[startb].a;
+		pga = s[startb].ga;
+		pgb = s[startb].gb;
+		s[startb].a = -FLOATINFTY;
+		s[startb].ga = -FLOATINFTY;
+		if(startb){
+			s[startb].gb = MAX(pgb - gpe,pa - gpo);
+		}else{
+			s[startb].gb = MAX(pgb,pa) - tgpe;
+		}
+		for (j = startb+1; j < endb;j++){
+			ca = s[j].a;
+			pa = MAX3(pa,pga-gpo,pgb-gpo);
+			pa += subp[seq2[j]];
+			
+			s[j].a = pa;
+			
+			pga = s[j].ga;
+			s[j].ga = MAX(s[j-1].ga-gpe,s[j-1].a-gpo);
+			
+			pgb = s[j].gb;
+			s[j].gb = MAX(pgb-gpe ,ca-gpo);
+			
+			pa = ca;
+		}
+		ca = s[j].a;
+		pa = MAX3(pa,pga-gpo,pgb-gpo);
+		pa += subp[seq2[j]];
+			
+		s[j].a = pa;
+			
+		s[j].ga = -FLOATINFTY;//MAX(s[j-1].ga-gpe,s[j-1].a-gpo);
+		if (endb != hm->len_b){
+			s[j].gb = MAX(s[j].gb-gpe ,ca-gpo);
+		}else{
+			s[j].gb = MAX(s[j].gb,ca)-tgpe;
+		}
+
+	}
+	return s;
+}
+
+struct states* backward_hirsch_ss_dyn(float**subm,const int* seq1,const int* seq2,struct hirsch_mem* hm)
+{
+
+	struct states* s = hm->b;
+	float *subp = 0;
+	const int starta = hm->starta;
+	const int enda = hm->enda;
+	const int startb =hm->startb;
+	const int endb = hm->endb;
+	
+	register float pa = 0;
+	register float pga = 0;
+	register float pgb = 0;
+	register float ca = 0;
+	register int i = 0;
+	register int j = 0;
+
+	s[endb].a = s[0].a ;
+	s[endb].ga = s[0].ga;
+	s[endb].gb = s[0].gb;
+	
+	
+	//init of first row;
+	
+	//j = endb-startb;
+	if(endb != hm->len_b){
+		for(j = endb-1;j > startb;j--){
+			s[j].a = -FLOATINFTY;
+			s[j].ga = MAX(s[j+1].ga-gpe,s[j+1].a-gpo);	
+			s[j].gb = -FLOATINFTY;
+		}
+	}else{
+		for(j = endb-1;j > startb;j--){
+			s[j].a = -FLOATINFTY;
+			s[j].ga = MAX(s[j+1].ga,s[j+1].a)-tgpe;
+			s[j].gb = -FLOATINFTY;
+		}
+	}
+
+	
+	s[startb].a = -FLOATINFTY;
+	s[startb].ga = -FLOATINFTY;
+	s[startb].gb = -FLOATINFTY;
+
+	i = enda-starta;
+	seq1+= starta;
+	while(i--){
+		subp = subm[seq1[i]];
+		pa = s[endb].a;
+		pga = s[endb].ga;
+		pgb = s[endb].gb;
+		s[endb].a = -FLOATINFTY;
+		s[endb].ga = -FLOATINFTY;
+
+		if(endb != hm->len_b){
+			s[endb].gb = MAX(pgb-gpe,pa-gpo);
+		}else{
+			s[endb].gb = MAX(pgb,pa)-tgpe;
+		}
+
+		for(j = endb-1;j > startb;j--){
+
+			ca = s[j].a;
+
+			pa = MAX3(pa,pga - gpo,pgb-gpo);
+			
+			pa += subp[seq2[j]];
+
+			s[j].a = pa;
+			
+			pga = s[j].ga;
+
+			s[j].ga = MAX(s[j+1].ga-gpe,s[j+1].a-gpo);
+			
+			pgb = s[j].gb;
+
+			s[j].gb = MAX(pgb-gpe,ca-gpo);
+			
+			pa = ca;
+		}
+		ca = s[j].a;
+
+		pa = MAX3(pa,pga - gpo,pgb-gpo);
+			
+		pa += subp[seq2[j]];
+
+		s[j].a = pa;
+		
+		s[j].ga = -FLOATINFTY;//MAX(s[j+1].ga-gpe,s[j+1].a-gpo);
+		
+		if(startb){
+			s[j].gb = MAX(s[j].gb-gpe,ca-gpo);
+		}else{
+			s[j].gb = MAX(s[j].gb,ca)-tgpe;
+		}
+
+		
+	}		
+	return s;
+}
+
+
+int* hirsch_ps_dyn(const float* prof1,const int* seq2,struct hirsch_mem* hm, int* hirsch_path,int sip)
+{
+	int mid = ((hm->enda - hm->starta) / 2)+ hm->starta;
+	float input_states[6] = {hm->f[0].a,hm->f[0].ga,hm->f[0].gb,hm->b[0].a,hm->b[0].ga,hm->b[0].gb};
+	int old_cor[5] = {hm->starta,hm->enda,hm->startb,hm->endb,mid};
+
+
+	if(hm->starta  >= hm->enda){
+		return hirsch_path;
+	}
+	if(hm->startb  >= hm->endb){
+		return hirsch_path;
+	}
+
+	hm->enda = mid;
+	hm->f = foward_hirsch_ps_dyn(prof1,seq2,hm,sip);
+	
+	/*int i;
+	fprintf(stderr,"FOWARD\n");
+	for (i = hm->startb; i <= hm->endb;i++){
+		fprintf(stderr,"%d	%d	%d\n",hm->f[i].a,hm->f[i].ga,hm->f[i].gb);
+	}*/
+
+	hm->starta = mid;
+	hm->enda = old_cor[1];
+	hm->b = backward_hirsch_ps_dyn(prof1,seq2,hm,sip);
+	
+	/*fprintf(stderr,"BaCKWARD\n");
+	for (i = hm->startb; i <= hm->endb;i++){
+		fprintf(stderr,"%d	%d	%d\n",hm->b[i].a,hm->b[i].ga,hm->b[i].gb);
+	}*/
+
+	hirsch_path = hirsch_align_two_ps_vector(prof1,seq2,hm,hirsch_path,input_states,old_cor,sip);
+	return hirsch_path;
+}
+
+
+
+int* hirsch_align_two_ps_vector(const float* prof1,const int* seq2,struct hirsch_mem* hm,int* hirsch_path,float input_states[],int old_cor[],int sip)
+{
+	struct states* f = hm->f;
+ 	struct states* b = hm->b;
+	int i,j,c;
+	int transition = -1;
+	
+	const float open = gpo * sip;
+	
+	
+	//code:
+	// a -> a = 1
+	// a -> ga = 2
+	// a -> gb = 3
+	// ga ->ga = 4
+	// ga -> a = 5
+	//gb->gb = 6;
+	//gb->a = 7;
+	
+	//int max = -INFTY;
+	float max = -INFTY;
+	//float middle =  (hm->endb - hm->startb)/2 + hm->startb;
+	float middle =  (old_cor[3] - old_cor[2])/2 + old_cor[2];
+	float sub = 0.0;
+	
+	
+	prof1+= ((old_cor[4]+1)<<6);
+	
+	//i = hm->startb;
+	i = old_cor[2];
+	c = -1;
+	//for(i = hm->startb; i < hm->endb;i++){
+	for(i = old_cor[2]; i < old_cor[3];i++){
+		sub = abs(middle -i);
+		sub /= 1000; 
+		if(f[i].a+b[i].a-sub> max){
+			max = f[i].a+b[i].a-sub;
+	//		fprintf(stderr,"aligned->aligned:%d + %d = %d\n",f[i].a,b[i].a,f[i].a+b[i].a);
+			transition = 1;
+			c = i;
+		}
+		if(f[i].a+b[i].ga-open-sub > max){
+			max = f[i].a+b[i].ga-open-sub;
+	//		fprintf(stderr,"aligned->gap_a:%d + %d +%d = %d\n",f[i].a,b[i].ga,prof1[27],f[i].a+b[i].ga+prof2[27]);
+			transition = 2;
+			c = i;
+		}
+		if(f[i].a+b[i].gb+prof1[27]-sub > max){
+			max = f[i].a+b[i].gb+prof1[27]-sub;
+	//		fprintf(stderr,"aligned->gap_b:%d + %d +%d = %d\n",f[i].a,b[i].gb,prof1[27],f[i].a+b[i].gb+prof1[27]);
+			transition = 3;
+			c = i;
+		}
+		if(f[i].ga+b[i].a-open-sub > max){
+			max = f[i].ga+b[i].a-open-sub;
+	//		fprintf(stderr,"gap_a->aligned:%d + %d + %d(gpo) = %d\n",f[i].ga,b[i].a,prof2[27],f[i].ga+b[i].a+prof2[27]);
+			transition = 5;
+			c = i;
+		}
+
+
+		if(hm->startb == 0){
+			if(f[i].gb+b[i].gb+prof1[29]-sub > max){
+				max = f[i].gb+b[i].gb+prof1[29]-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+				transition = 6;
+				c = i;
+			}
+		}else{
+			if(f[i].gb+b[i].gb+prof1[28]-sub > max){
+				max = f[i].gb+b[i].gb+prof1[28]-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+				transition = 6;
+				c = i;
+			}
+		}
+		if(f[i].gb+b[i].a+prof1[-37]-sub > max){
+			max = f[i].gb+b[i].a+prof1[-37]-sub;
+	//		fprintf(stderr,"gap_b->aligned:%d + %d + %d(gpo) = %d\n",f[i].gb,b[i].a,prof1[27],f[i].gb+b[i].a+prof1[27]);
+			transition = 7;
+			c = i;
+		}
+	}
+	//i = hm->endb;
+	i = old_cor[3];
+	
+	sub = abs(middle -i);
+	sub /= 1000; 
+	if(f[i].a+b[i].gb+prof1[27]-sub > max){
+		max = f[i].a+b[i].gb+prof1[27]-sub;
+	//		fprintf(stderr,"aligned->gap_b:%d + %d +%d = %d\n",f[i].a,b[i].gb,prof1[27],f[i].a+b[i].gb+prof1[27]);
+		transition = 3;
+		c = i;
+	}
+	if(hm->endb == hm->len_b){
+		if(f[i].gb+b[i].gb+prof1[29]-sub > max){
+			max = f[i].gb+b[i].gb+prof1[29]-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+			transition = 6;
+			c = i;
+		}	
+	}else{
+		if(f[i].gb+b[i].gb+prof1[28]-sub > max){
+			max = f[i].gb+b[i].gb+prof1[28]-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+			transition = 6;
+			c = i;
+		}
+	}
+	
+	
+	
+	prof1-= ((old_cor[4]+1)<<6);
+	
+	//fprintf(stderr,"Transition:%d	at:%d\n",transition,c);
+	
+	j = hirsch_path[0];
+	switch(transition){
+		case 1: //a -> a = 1
+			
+			hirsch_path[old_cor[4]] = c;
+			hirsch_path[old_cor[4]+1] = c+1;
+			
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4],c);
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4]+1,c+1);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = 0.0;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = -FLOATINFTY;
+	//		fprintf(stderr,"Using this for start:%d	%d	%d\n",hm->f[0].a,hm->f[0].ga,hm->f[0].gb);
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_ps_dyn(prof1,seq2,hm,hirsch_path,sip);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = 0.0;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d  what:%d-%d	%d-%d\n",c+1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_ps_dyn(prof1,seq2,hm,hirsch_path,sip);
+			break;
+		case 2:// a -> ga = 2
+			
+			hirsch_path[old_cor[4]] = c;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4],c);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = 0.0;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = -FLOATINFTY;
+			
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_ps_dyn(prof1,seq2,hm,hirsch_path,sip);
+
+			//backward:
+			hm->starta = old_cor[4];
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = -FLOATINFTY;
+			hm->f[0].ga = 0.0;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d  what:%d-%d	%d-%d\n",c+1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_ps_dyn(prof1,seq2,hm,hirsch_path,sip);
+			break;
+		case 3:// a -> gb = 3
+			
+			hirsch_path[old_cor[4]] = c;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4],c);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = 0.0;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = -FLOATINFTY;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_ps_dyn(prof1,seq2,hm,hirsch_path,sip);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c;
+			hm->endb = old_cor[3];
+			hm->f[0].a = -FLOATINFTY;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = 0.0;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = hirsch_ps_dyn(prof1,seq2,hm,hirsch_path,sip);
+			break;
+		case 5://ga -> a = 5
+			hirsch_path[old_cor[4]+1] = c+1;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4]+1,c+1);
+
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = -FLOATINFTY;
+			hm->b[0].ga = 0.0;
+			hm->b[0].gb = -FLOATINFTY;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4];
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_ps_dyn(prof1,seq2,hm,hirsch_path,sip);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = 0.0;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = hirsch_ps_dyn(prof1,seq2,hm,hirsch_path,sip);
+			break;
+		case 6://gb->gb = 6;
+			
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = -FLOATINFTY;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = 0.0;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			hm->startb = old_cor[2];
+			hm->endb = c;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_ps_dyn(prof1,seq2,hm,hirsch_path,sip);			
+
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c;
+			hm->endb = old_cor[3];
+			hm->f[0].a = -FLOATINFTY;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = 0.0;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = hirsch_ps_dyn(prof1,seq2,hm,hirsch_path,sip);
+			break;
+		case 7://gb->a = 7;
+			
+			hirsch_path[old_cor[4]+1] = c+1;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4]+1,c+1);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = -FLOATINFTY;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = 0.0;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			hm->startb = old_cor[2];
+			hm->endb = c;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_ps_dyn(prof1,seq2,hm,hirsch_path,sip);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = 0.0;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = hirsch_ps_dyn(prof1,seq2,hm,hirsch_path,sip);
+			break;
+	}
+		
+	return hirsch_path;
+}
+
+struct states* foward_hirsch_ps_dyn(const float* prof1,const int* seq2,struct hirsch_mem* hm,int sip)
+{
+	struct states* s = hm->f;
+
+	register float pa = 0;
+	register float pga = 0;
+	register float pgb = 0;
+	register float ca = 0;
+	register int i = 0;
+	register int j = 0;
+	
+	const float open = gpo * sip;
+	const float ext = gpe *sip;
+	const float text = tgpe * sip;
+	
+	
+	
+	prof1 += (hm->starta)<< 6;
+	s[hm->startb].a = s[0].a;
+	s[hm->startb].ga = s[0].ga;
+	s[hm->startb].gb = s[0].gb;
+	if(hm->startb){
+		for (j = hm->startb+1; j < hm->endb;j++){
+			s[j].a = -FLOATINFTY;
+			s[j].ga = MAX(s[j-1].ga-ext,s[j-1].a-open);	
+			s[j].gb = -FLOATINFTY;
+		}
+	}else{
+		for (j = hm->startb+1; j < hm->endb;j++){
+			s[j].a = -FLOATINFTY;
+			s[j].ga = MAX(s[j-1].ga,s[j-1].a) - text;
+			s[j].gb = -FLOATINFTY;
+		}
+
+	}
+	
+	
+	s[hm->endb].a = -FLOATINFTY;
+	s[hm->endb].ga = -FLOATINFTY;
+	s[hm->endb].gb = -FLOATINFTY;
+	seq2--;
+
+	for (i = hm->starta;i < hm->enda;i++){
+		prof1 += 64;
+
+		pa = s[hm->startb].a;
+		pga = s[hm->startb].ga;
+		pgb = s[hm->startb].gb;
+		s[hm->startb].a = -FLOATINFTY;
+		s[hm->startb].ga = -FLOATINFTY;
+		if(hm->startb){
+			s[hm->startb].gb = MAX(pgb+prof1[28],pa+prof1[27]);
+		}else{
+			s[hm->startb].gb = MAX(pgb,pa)+prof1[29];
+		}
+		for (j = hm->startb+1; j < hm->endb;j++){
+			ca = s[j].a;
+
+			pa = MAX3(pa,pga -open,pgb + prof1[-37]);
+			
+			pa += prof1[32 + seq2[j]];
+
+
+			s[j].a = pa;
+			
+			pga = s[j].ga;
+			
+			s[j].ga = MAX(s[j-1].ga-ext,s[j-1].a-open);
+				
+			pgb = s[j].gb;
+			
+			s[j].gb = MAX(pgb+prof1[28],ca+prof1[27]);
+				
+			pa = ca;
+		}
+		ca = s[j].a;
+
+		pa = MAX3(pa,pga -open,pgb + prof1[-37]);
+			
+		pa += prof1[32 + seq2[j]];
+
+
+		s[j].a = pa;
+
+		s[j].ga = -FLOATINFTY;//MAX(s[j-1].ga-ext,s[j-1].a-open);
+				
+		if (hm->endb != hm->len_b){
+			s[j].gb = MAX(s[j].gb+prof1[28] ,ca+prof1[27]);
+		}else{
+			s[j].gb = MAX(s[j].gb,ca)+ prof1[29];
+		}
+		
+	}
+	prof1 -= hm->enda << 6;
+	return s;
+}
+
+struct states* backward_hirsch_ps_dyn(const float* prof1,const int* seq2,struct hirsch_mem* hm,int sip)
+{
+	struct states* s = hm->b;
+	register float pa = 0;
+	register float pga = 0;
+	register float pgb = 0;
+	register float ca = 0;
+	register int i = 0;
+	register int j = 0;
+	
+	const float open = gpo * sip;
+	const float ext = gpe *sip;
+	const float text = tgpe * sip;
+	
+
+	prof1 += (hm->enda+1) << 6;
+
+	s[hm->endb].a = s[0].a;
+	s[hm->endb].ga = s[0].ga;
+	s[hm->endb].gb = s[0].gb;
+	
+	if(hm->endb != hm->len_b){
+		for(j = hm->endb-1;j > hm->startb;j--){
+			s[j].a = -FLOATINFTY;
+			s[j].ga = MAX(s[j+1].ga-ext,s[j+1].a-open);
+			s[j].gb = -FLOATINFTY;
+		}
+	}else{
+		for(j = hm->endb-1;j > hm->startb;j--){
+			s[j].a = -FLOATINFTY;
+			s[j].ga = MAX(s[j+1].ga,s[j+1].a)-text;
+			s[j].gb = -FLOATINFTY;
+		}
+	}
+	
+	s[hm->startb].a = -FLOATINFTY;
+	s[hm->startb].ga = -FLOATINFTY;
+	s[hm->startb].gb = -FLOATINFTY;
+
+	i = hm->enda-hm->starta;
+	while(i--){
+		prof1 -= 64;
+		pa = s[hm->endb].a;
+		pga = s[hm->endb].ga;
+		pgb = s[hm->endb].gb;
+		s[hm->endb].a = -FLOATINFTY;
+		s[hm->endb].ga = -FLOATINFTY;
+
+		if(hm->endb != hm->len_b){
+			s[hm->endb].gb = MAX(pgb+prof1[28],pa+prof1[27]);
+		}else{
+			s[hm->endb].gb = MAX(pgb,pa) +prof1[29];
+		}
+
+		for(j = hm->endb-1;j > hm->startb;j--){
+			ca = s[j].a;
+
+			pa = MAX3(pa,pga - open,pgb +prof1[91]);
+			pa += prof1[32 + seq2[j]];
+
+			s[j].a = pa;
+			
+			pga = s[j].ga;
+
+			s[j].ga = MAX(s[j+1].ga-ext,s[j+1].a-open);
+				
+			pgb = s[j].gb;
+
+			s[j].gb = MAX(pgb+prof1[28],ca+prof1[27]);
+			
+			pa = ca;
+		}
+		ca = s[j].a;
+
+		pa = MAX3(pa,pga - open,pgb +prof1[91]);
+		pa += prof1[32 + seq2[j]];
+
+		s[j].a = pa;
+			
+
+		s[j].ga = -FLOATINFTY;//MAX(s[j+1].ga-ext,s[j+1].a-open);
+		if(hm->startb){
+			s[j].gb = MAX(s[j].gb+prof1[28], ca+prof1[27]);
+		}else{
+			s[j].gb = MAX(s[j].gb,ca)+prof1[29];
+		}
+
+	}		
+	return s;
+}
+
+
+
+
+int* hirsch_pp_dyn(const float* prof1,const float* prof2,struct hirsch_mem* hm, int* hirsch_path)
+{
+	int mid = ((hm->enda - hm->starta) / 2)+ hm->starta;
+	float input_states[6] = {hm->f[0].a,hm->f[0].ga,hm->f[0].gb,hm->b[0].a,hm->b[0].ga,hm->b[0].gb};
+	int old_cor[5] = {hm->starta,hm->enda,hm->startb,hm->endb,mid};
+
+	
+	//fprintf(stderr,"starta:%d enda:%d startb:%d endb:%d mid:%d\n",hm->starta,hm->enda,hm->startb,hm->endb,mid);
+	
+	
+	if(hm->starta  >= hm->enda){
+		return hirsch_path;
+	}
+	if(hm->startb  >= hm->endb){
+		return hirsch_path;
+	}
+
+	hm->enda = mid;
+	hm->f = foward_hirsch_pp_dyn(prof1,prof2,hm);
+	/*int i;
+	fprintf(stderr,"FOWARD\n");
+	for (i = hm->startb; i <= hm->endb;i++){
+		fprintf(stderr,"%d	%d	%d\n",hm->f[i].a,hm->f[i].ga,hm->f[i].gb);
+	}*/
+
+	hm->starta = mid;
+	hm->enda = old_cor[1];
+	hm->b = backward_hirsch_pp_dyn(prof1,prof2,hm);
+	/*fprintf(stderr,"BaCKWARD\n");
+
+	for (i = hm->startb; i <= hm->endb;i++){
+		fprintf(stderr,"%d	%d	%d\n",hm->b[i].a,hm->b[i].ga,hm->b[i].gb);
+	}*/
+
+	hirsch_path = hirsch_align_two_pp_vector(prof1,prof2,hm,hirsch_path,input_states,old_cor);
+	return hirsch_path;
+}
+
+
+
+int* hirsch_align_two_pp_vector(const float* prof1,const float* prof2,struct hirsch_mem* hm,int* hirsch_path,float input_states[],int old_cor[])
+{
+	struct states* f = hm->f;
+ 	struct states* b = hm->b;
+	int i,j,c;
+	int transition = -1;
+	
+	
+	//code:
+	// a -> a = 1
+	// a -> ga = 2
+	// a -> gb = 3
+	// ga ->ga = 4
+	// ga -> a = 5
+	//gb->gb = 6;
+	//gb->a = 7;
+	
+	//int max = -INFTY;
+	float max = -INFTY;	
+	//float middle =  (hm->endb - hm->startb)/2 + hm->startb;
+	float middle =  (old_cor[3] - old_cor[2])/2 + old_cor[2];
+	float sub = 0.0;
+	
+
+	prof1+= ((old_cor[4]+1) << 6);
+	//prof2 += 64 * (hm->startb);
+	//i = hm->startb;
+	prof2 += old_cor[2] << 6;
+	i = old_cor[2];
+	c = -1;
+	//for(i = hm->startb; i < hm->endb;i++){
+	for(i = old_cor[2]; i < old_cor[3];i++){
+		sub = abs(middle -i);
+		sub /= 1000; 
+		prof2 += 64;
+		//fprintf(stderr,"%d	%d	%d \n",f[i].a,b[i].a,max);
+		if(f[i].a+b[i].a-sub > max){
+			max = f[i].a+b[i].a-sub;
+	//		fprintf(stderr,"aligned->aligned:%d + %d = %d\n",f[i].a,b[i].a,f[i].a+b[i].a);
+			transition = 1;
+			c = i;
+		}
+		if(f[i].a+b[i].ga+prof2[27]-sub > max){
+			max = f[i].a+b[i].ga+prof2[27]-sub;
+	//		fprintf(stderr,"aligned->gap_a:%d + %d +%d = %d\n",f[i].a,b[i].ga,prof1[27],f[i].a+b[i].ga+prof2[27]);
+			transition = 2;
+			c = i;
+		}
+		if(f[i].a+b[i].gb+prof1[27] -sub> max){
+			max = f[i].a+b[i].gb+prof1[27]-sub;
+	//		fprintf(stderr,"aligned->gap_b:%d + %d +%d = %d\n",f[i].a,b[i].gb,prof1[27],f[i].a+b[i].gb+prof1[27]);
+			transition = 3;
+			c = i;
+		}
+		if(f[i].ga+b[i].a+prof2[-37]-sub > max){
+			max = f[i].ga+b[i].a+prof2[-37]-sub;
+	//		fprintf(stderr,"gap_a->aligned:%d + %d + %d(gpo) = %d\n",f[i].ga,b[i].a,prof2[27],f[i].ga+b[i].a+prof2[27]);
+			transition = 5;
+			c = i;
+		}
+
+
+		if(hm->startb == 0){
+			if(f[i].gb+b[i].gb+prof1[29]-sub > max){
+				max = f[i].gb+b[i].gb+prof1[29]-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+				transition = 6;
+				c = i;
+			}
+		}else{
+			if(f[i].gb+b[i].gb+prof1[28]-sub > max){
+				max = f[i].gb+b[i].gb+prof1[28]-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+				transition = 6;
+				c = i;
+			}
+		}
+		if(f[i].gb+b[i].a+prof1[-37]-sub > max){
+			max = f[i].gb+b[i].a+prof1[-37]-sub;
+	//		fprintf(stderr,"gap_b->aligned:%d + %d + %d(gpo) = %d\n",f[i].gb,b[i].a,prof1[27],f[i].gb+b[i].a+prof1[27]);
+			transition = 7;
+			c = i;
+		}
+	}
+	//i = hm->endb;
+	i = old_cor[3];
+	sub = abs(middle -i);
+	sub /= 1000; 
+	if(f[i].a+b[i].gb+prof1[27]-sub > max){
+		max = f[i].a+b[i].gb+prof1[27]-sub;
+	//		fprintf(stderr,"aligned->gap_b:%d + %d +%d = %d\n",f[i].a,b[i].gb,prof1[27],f[i].a+b[i].gb+prof1[27]);
+		transition = 3;
+		c = i;
+	}
+	if(hm->endb == hm->len_b){
+		if(f[i].gb+b[i].gb+prof1[29]-sub > max){
+			max = f[i].gb+b[i].gb+prof1[29]-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+			transition = 6;
+			c = i;
+		}	
+	}else{
+		if(f[i].gb+b[i].gb+prof1[28]-sub > max){
+			max = f[i].gb+b[i].gb+prof1[28]-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+			transition = 6;
+			c = i;
+		}
+	}
+	
+	
+	
+	prof1-= (old_cor[4]+1)<<6;
+	//prof2 -= hm->endb << 6;
+	prof2 -= old_cor[3] << 6;
+	
+	//fprintf(stderr,"Transition:%d	at:%d\n",transition,c);
+	//if(transition == -1){
+	//	exit(0);
+	//}
+	
+	j = hirsch_path[0];
+	switch(transition){
+		case 1: //a -> a = 1
+			
+			hirsch_path[old_cor[4]] = c;
+			hirsch_path[old_cor[4]+1] = c+1;
+			
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4],c);
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4]+1,c+1);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = 0.0;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = -FLOATINFTY;
+			//fprintf(stderr,"Using this for start:%ld	%ld	%ld\n",hm->f[0].a,hm->f[0].ga,hm->f[0].gb);
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = 0.0;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d  what:%d-%d	%d-%d\n",c+1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+			break;
+		case 2:// a -> ga = 2
+			
+			hirsch_path[old_cor[4]] = c;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4],c);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = 0.0;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = -FLOATINFTY;
+			
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4];
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = -FLOATINFTY;
+			hm->f[0].ga = 0.0;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d  what:%d-%d	%d-%d\n",c+1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+			break;
+		case 3:// a -> gb = 3
+			
+			hirsch_path[old_cor[4]] = c;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4],c);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = 0.0;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = -FLOATINFTY;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c;
+			hm->endb = old_cor[3];
+			hm->f[0].a = -FLOATINFTY;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = 0.0;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+			break;
+		case 5://ga -> a = 5
+			hirsch_path[old_cor[4]+1] = c+1;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4]+1,c+1);
+
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = -FLOATINFTY;
+			hm->b[0].ga = 0.0;
+			hm->b[0].gb = -FLOATINFTY;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4];
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = 0.0;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+			break;
+		case 6://gb->gb = 6;
+			
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = -FLOATINFTY;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = 0.0;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			hm->startb = old_cor[2];
+			hm->endb = c;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c;
+			hm->endb = old_cor[3];
+			hm->f[0].a = -FLOATINFTY;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = 0.0;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+			break;
+		case 7://gb->a = 7;
+			
+			hirsch_path[old_cor[4]+1] = c+1;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4]+1,c+1);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = -FLOATINFTY;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = 0.0;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			hm->startb = old_cor[2];
+			hm->endb = c;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = 0.0;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+			break;
+	}
+		
+	return hirsch_path;
+}
+
+struct states* foward_hirsch_pp_dyn(const float* prof1,const float* prof2,struct hirsch_mem* hm)
+{
+	unsigned int freq[26];
+
+	struct states* s = hm->f;
+	register float pa = 0;
+	register float pga = 0;
+	register float pgb = 0;
+	register float ca = 0;
+	register int i = 0;
+	register int j = 0;
+	register int c = 0;
+	
+	prof1 += (hm->starta) << 6;
+	prof2 +=  (hm->startb) << 6;
+	s[hm->startb].a = s[0].a;
+	s[hm->startb].ga = s[0].ga;
+	s[hm->startb].gb = s[0].gb;
+	if(hm->startb){
+		for (j = hm->startb+1; j < hm->endb;j++){
+			prof2+=64;
+			s[j].a = -FLOATINFTY;
+			s[j].ga = MAX(s[j-1].ga+prof2[28],s[j-1].a+prof2[27]);
+			s[j].gb = -FLOATINFTY;
+		}
+		prof2+=64;
+	}else{
+		for (j = hm->startb+1; j < hm->endb;j++){
+			prof2+=64;
+			s[j].a = -FLOATINFTY;
+			s[j].ga = MAX(s[j-1].ga,s[j-1].a)+prof2[29];
+			s[j].gb = -FLOATINFTY;
+		}	
+		prof2+=64;	
+	}
+
+	prof2 -= (hm->endb-hm->startb) << 6;
+	
+	s[hm->endb].a = -FLOATINFTY;
+	s[hm->endb].ga = -FLOATINFTY;
+	s[hm->endb].gb = -FLOATINFTY;
+
+
+	for (i = hm->starta;i < hm->enda;i++){
+		prof1 += 64;
+		c = 1;
+		for (j = 0;j < 26; j++){
+			if(prof1[j]){
+				freq[c] = j;
+				c++;
+			}
+		}
+		freq[0] = c;
+			
+		pa = s[hm->startb].a;
+		pga = s[hm->startb].ga;
+		pgb = s[hm->startb].gb;
+		s[hm->startb].a = -FLOATINFTY;
+		s[hm->startb].ga = -FLOATINFTY;
+
+		if(hm->startb){
+			s[hm->startb].gb = MAX(pgb+prof1[28],pa+prof1[27]);
+		}else{
+			s[hm->startb].gb = MAX(pgb,pa)+ prof1[29];
+		}
+		for (j = hm->startb+1; j < hm->endb;j++){
+			prof2 += 64;
+			ca = s[j].a;
+			
+			pa = MAX3(pa,pga + prof2[-37],pgb + prof1[-37]);
+			
+			prof2 += 32;
+			for (c = 1;c < freq[0];c++){
+				pa += prof1[freq[c]]*prof2[freq[c]];
+			}
+			prof2 -= 32;
+
+			s[j].a = pa;
+			
+			pga = s[j].ga;
+			
+			s[j].ga = MAX(s[j-1].ga+prof2[28],s[j-1].a+prof2[27]);
+				
+			pgb = s[j].gb;
+
+			s[j].gb = MAX(pgb+prof1[28] ,ca+prof1[27]);
+
+			pa = ca;
+		}
+		prof2 += 64;
+		ca = s[j].a;
+			
+		pa = MAX3(pa,pga + prof2[-37],pgb + prof1[-37]);
+
+		prof2 += 32;
+		for (c = 1;c < freq[0];c++){
+			pa += prof1[freq[c]]*prof2[freq[c]];
+		}
+		prof2 -= 32;
+
+		s[j].a = pa;
+
+		s[j].ga = -FLOATINFTY;
+
+		if (hm->endb != hm->len_b){
+			s[j].gb = MAX(s[j].gb+prof1[28] ,ca+prof1[27]);
+		}else{
+			s[j].gb = MAX(s[j].gb,ca)+ prof1[29];
+		}
+		prof2 -= (hm->endb-hm->startb) << 6;
+		
+	}
+	prof1 -=  (hm->enda) << 6;
+	return s;
+}
+
+struct states* backward_hirsch_pp_dyn(const float* prof1,const float* prof2,struct hirsch_mem* hm)
+{
+	unsigned int freq[26];
+	struct states* s = hm->b;
+	register float pa = 0;
+	register float pga = 0;
+	register float pgb = 0;
+	register float ca = 0;
+	register int i = 0;
+	register int j = 0;
+	register int c = 0;
+
+	prof1 += (hm->enda+1) << 6;
+	prof2 += (hm->endb+1) << 6;
+	s[hm->endb].a = s[0].a;
+	s[hm->endb].ga = s[0].ga;
+	s[hm->endb].gb = s[0].gb;
+	if(hm->endb != hm->len_b){
+		for(j = hm->endb-1;j > hm->startb;j--){
+			prof2 -= 64;
+			s[j].a = -FLOATINFTY;
+			s[j].ga = MAX(s[j+1].ga+prof2[28],s[j+1].a+prof2[27]);
+			s[j].gb = -FLOATINFTY;
+		}
+		prof2 -= 64;
+	}else{
+		for(j = hm->endb-1;j > hm->startb;j--){
+			prof2 -= 64;
+			s[j].a = -FLOATINFTY;
+			s[j].ga = MAX(s[j+1].ga,s[j+1].a)+prof2[29];
+			s[j].gb = -FLOATINFTY;
+		}
+		prof2 -= 64;
+	}
+
+	s[hm->startb].a = -FLOATINFTY;
+	s[hm->startb].ga = -FLOATINFTY;
+	s[hm->startb].gb = -FLOATINFTY;
+	
+	i = hm->enda-hm->starta;
+	while(i--){
+		prof1 -= 64;
+
+		c = 1;
+		for (j = 0;j < 26; j++){
+			if(prof1[j]){
+				freq[c] = j;
+				c++;
+			}
+		}
+		freq[0] = c;
+		
+		pa = s[hm->endb].a;
+		pga = s[hm->endb].ga;
+		pgb = s[hm->endb].gb;
+		s[hm->endb].a = -FLOATINFTY;
+		s[hm->endb].ga = -FLOATINFTY;
+		if(hm->endb != hm->len_b){
+			s[hm->endb].gb = MAX(pgb+prof1[28] ,pa+prof1[27]);
+		}else{
+			s[hm->endb].gb = MAX(pgb,pa)+prof1[29];
+		}
+
+		prof2 += (hm->endb-hm->startb) << 6;
+		for(j = hm->endb-1;j > hm->startb;j--){
+			prof2 -= 64;
+			ca = s[j].a;
+
+			pa = MAX3(pa,pga + prof2[91],pgb + prof1[91]);
+
+			prof2 += 32;
+			for (c = 1;c < freq[0];c++){
+				pa += prof1[freq[c]]*prof2[freq[c]];
+			}
+			prof2 -= 32;
+
+			s[j].a = pa;
+			
+			pga = s[j].ga;
+
+			s[j].ga = MAX(s[j+1].ga+prof2[28], s[j+1].a+prof2[27]);
+
+			pgb = s[j].gb;
+
+			s[j].gb = MAX(pgb+prof1[28], ca+prof1[27]);
+
+			pa = ca;
+		}
+		prof2 -= 64;
+		ca = s[j].a;
+
+		pa = MAX3(pa,pga + prof2[91],pgb + prof1[91]);
+		prof2 += 32;
+		for (c = 1;c < freq[0];c++){
+			pa += prof1[freq[c]]*prof2[freq[c]];
+		}
+		prof2 -= 32;
+		s[j].a = pa;
+		
+		//pga = s[j].ga;
+		s[j].ga = -FLOATINFTY;//MAX(s[j+1].ga+prof2[28], s[j+1].a+prof2[27]);
+
+		//pgb = s[j].gb;
+		if(hm->startb){
+			s[j].gb = MAX(s[j].gb+prof1[28], ca+prof1[27]);
+		}else{
+			s[j].gb = MAX(s[j].gb,ca)+prof1[29];
+		}
+
+		//pa = ca;
+	}		
+	return s;
+}
+
+
+int* mirror_hirsch_path(int* hirsch_path,int len_a,int len_b)
+{
+	int* np = 0;
+	
+	int i;
+	np =malloc(sizeof(int)*(len_a+2));
+	for(i =0; i < len_a+2;i++){
+		np[i] = -1;
+	}
+
+	for(i = 1; i <= len_b;i++){
+		if(hirsch_path[i] != -1){
+			np[hirsch_path[i]] = i;
+		}
+	}
+
+	free(hirsch_path);
+	return np;
+}
+
+int* add_gap_info_to_hirsch_path(int* hirsch_path,int len_a,int len_b)
+{
+	int i,j;
+	int a = 0;
+	int b = 0;
+
+	int* np = 0;
+	np =malloc(sizeof(int)*(len_a+len_b+2));
+	for(i =0; i < len_a+len_b+2;i++){
+		np[i] = 0;
+	}
+
+	j = 1;
+	b = -1;
+	if(hirsch_path[1] == -1){
+		np[j] = 2;
+		j++;
+	}else{
+		if(hirsch_path[1] != 1){
+			for ( a = 0;a < hirsch_path[1] -1;a++){
+				np[j] = 1;
+				j++;
+			}
+			np[j] = 0;
+			j++;
+		}else{
+			np[j] = 0;
+			j++;
+		}
+	}
+	b = hirsch_path[1];
+	
+	/*for ( i= 0;i <= len_a;i++){
+		fprintf(stderr,"%d,",hirsch_path[i]);
+	} 
+	fprintf(stderr,"\n");*/
+	
+	for(i = 2; i <= len_a;i++){
+	
+		if(hirsch_path[i] == -1){
+			np[j] = 2;
+			j++;
+		}else{
+			if(hirsch_path[i]-1 != b && b != -1){
+				for ( a = 0;a < hirsch_path[i] - b-1;a++){
+					np[j] = 1;
+					j++;
+				}
+				np[j] = 0;
+				j++;
+			}else{
+				np[j] = 0;
+				j++;
+			}
+		}
+		b = hirsch_path[i];
+	}
+	
+	
+	
+	
+	
+	if(hirsch_path[len_a] < len_b && hirsch_path[len_a] != -1){
+	//	fprintf(stderr,"WARNING:%d	%d\n",hirsch_path[len_a],len_b);
+		for ( a = 0;a < len_b - hirsch_path[len_a];a++){
+			np[j] = 1;
+			j++;
+		}
+	} 
+	np[0] = j-1;
+	np[j] = 3;
+	np = realloc(np,sizeof(int)* (np[0]+2));
+	//for ( i= 0;i <= np[0];i++){
+	//	fprintf(stderr,"%d,",np[i]);
+	//} 
+	//fprintf(stderr,"\n");
+
+	free(hirsch_path);
+
+	//add gap info..
+	i = 2;
+	while(np[i] != 3){
+		if ((np[i-1] &3) && !(np[i] & 3)){
+			if(np[i-1] & 8){
+				np[i-1] += 8;
+			}else{
+				np[i-1] |= 16;
+			}
+		}else if (!(np[i-1] & 3) &&(np[i] &3)){
+			np[i] |= 4;
+		}else if ((np[i-1] & 1) && (np[i] & 1)){
+			np[i] |= 8;
+		}else if ((np[i-1] & 2) && (np[i] & 2)){
+			np[i] |= 8;
+		}
+		i++;
+	}
+	//add terminal gap...
+	i = 1;
+	while(np[i] != 0){
+		np[i] |= 32;
+		i++;
+	}
+	j = i;
+	i = np[0];
+	while(np[i] != 0){
+		np[i] |= 32;
+		i--;
+	}
+	//for ( i= 0;i <= np[0];i++){
+	//	fprintf(stderr,"%d,",np[i]);
+	//} 
+	//fprintf(stderr,"\n");
+	return np;
+}
+
+/*
+int* foward_pp_dyn(int* path, struct dp_matrix *dp,const int* prof1,const int* prof2,const int len_a,const int len_b)
+{
+	unsigned int freq[26];
+	
+	struct states* s = 0;
+	char** trace = 0;
+	char* tracep = 0;
+	register int pa = 0;
+	register int pga = 0;
+	register int pgb = 0;
+	register int ca = 0;
+	register int i = 0;
+	register int j = 0;
+	register int c = 0;
+
+	s = dp->s;
+	
+	trace = dp->tb;
+
+	trace[0][0] = 32;
+
+
+	s[0].a = 0;
+	s[0].ga = -INFTY;
+	s[0].gb = -INFTY;
+	//init of first row;
+	tracep = trace[0];
+
+	for (j = 1; j < len_b;j++){
+		s[j].a = -INFTY;
+		
+		s[j].ga = s[j-1].a+prof2[29];
+		if (s[j-1].ga+prof2[29] > s[j].ga){
+			s[j].ga = s[j-1].ga+prof2[29];
+		}
+		s[j].gb = -INFTY;
+		tracep[j] = 8;
+	}
+	
+	s[len_b].a = -INFTY;
+	s[len_b].ga = -INFTY;
+	s[len_b].gb = -INFTY;
+	
+	for ( i = 1;i <len_a;i++){
+		prof1 += 64;
+
+		c = 1;
+		for (j = 26; j--;){
+			if(prof1[j]){
+				freq[c] = j;
+				c++;	
+			}
+		}
+		freq[0] = c;
+		
+		tracep = trace[i];
+		pa = s[0].a;
+		pga = s[0].ga;
+		pgb = s[0].gb;
+		s[0].a = -INFTY;
+		s[0].ga = -INFTY;
+		
+		s[0].gb = pa+prof1[29];
+		if(pgb+prof1[29] > s[0].gb){
+			s[0].gb = pgb+prof1[29];
+		}
+	
+		tracep[0] = 16;
+
+		for (j = 1; j < len_b;j++){
+			prof2 += 64;
+			ca = s[j].a;
+
+			c = 1;
+			if((pga += prof2[-37]) > pa){
+				pa = pga;
+				c = 2;
+			}
+			if((pgb += prof1[-37]) > pa){
+				pa = pgb;
+				c = 4;
+			}
+			
+			prof2 += 32;
+			for (pga = freq[0];--pga;){
+				pgb = freq[pga];
+				pa += prof1[pgb]*prof2[pgb];
+			}
+			prof2 -= 32;
+
+			s[j].a = pa;
+			
+			pga = s[j].ga;
+			
+			s[j].ga = s[j-1].a+prof2[27];
+			if (s[j-1].ga+prof2[28] > s[j].ga){
+				s[j].ga = s[j-1].ga+prof2[28];
+				c |= 8;
+			}
+			
+			pgb = s[j].gb;
+			
+			s[j].gb = ca+prof1[27];
+			if(pgb+prof1[28] > s[j].gb){
+				s[j].gb = pgb+prof1[28];
+				c |= 16;
+			}
+			tracep[j] = c;
+			pa = ca;
+
+		}
+		
+	
+		prof2 += 64;
+		//LAST CELL (0)
+		ca = s[len_b].a;
+
+		c = 1;
+		if((pga+=prof2[-37]) > pa){
+			pa = pga;
+			c = 2;
+		}
+		if((pgb+=prof1[-37]) > pa){
+			pa = pgb;
+			c = 4;
+		}
+		
+		prof2 += 32;
+		for (pga = freq[0];--pga;){
+			pgb = freq[pga];
+			pa += prof1[pgb]*prof2[pgb];
+		}
+		prof2 -= 32;
+		
+		s[len_b].a = pa;
+		
+		s[len_b].ga = -INFTY;
+		
+		pgb = s[len_b].gb;
+		s[len_b].gb = ca+prof1[27]+prof1[29];
+ 		if(pgb+prof1[29] > s[len_b].gb){
+			s[len_b].gb = pgb+prof1[29];
+			c |= 16;
+		}
+		tracep[len_b] = c;	
+		prof2 -= len_b << 6;
+		
+	}
+	prof1 += 64;
+	
+	c = 1;
+	for (j = 26; j--;){
+		if(prof1[j]){
+			freq[c] = j;
+			c++;	
+		}
+	}
+	freq[0] = c;
+	
+	tracep = trace[len_a];
+
+	pa = s[0].a;
+	pga = s[0].ga;
+	pgb = s[0].gb;
+	s[0].a = -INFTY;
+	s[0].ga = -INFTY;
+
+	s[0].gb = pa+prof1[29];
+	if(pgb+prof1[29] > s[0].gb){
+		s[0].gb = pgb+prof1[29];
+	}
+	tracep[0] = 16;
+
+	for (j = 1;j< len_b;j++){	
+
+		prof2 += 64;
+		ca = s[j].a;
+
+		c = 1;
+
+		if((pga+=prof2[-37]) > pa){
+			pa = pga;
+			c = 2;
+		}
+
+		if((pgb+=prof1[-37]) > pa){
+			pa = pgb;
+			c = 4;
+		}
+		
+		prof2+=32;
+		
+		for (pga = freq[0];--pga;){
+			pgb = freq[pga];
+			pa += prof1[pgb]*prof2[pgb];
+		}
+		prof2-=32;
+		
+		s[j].a = pa;
+		pga = s[j].ga;
+		s[j].ga = s[j-1].a+prof2[27]+prof2[29];
+		if (s[j-1].ga+prof2[29] > s[j].ga){
+			s[j].ga = s[j-1].ga+prof2[29];
+			c |= 8;
+		}	
+		pgb = s[j].gb;
+		s[j].gb = -INFTY;	
+		
+		tracep[j] = c;
+		pa = ca;
+	}
+	prof2 += 64;
+
+	ca = s[len_b].a;
+	
+	c = 1;
+	
+	if((pga+=prof2[-37]) > pa){
+		pa = pga;
+		c = 2;
+	}
+	if((pgb+=prof1[-37]) > pa){
+		pa = pgb;
+		c = 4;
+	}
+	prof2+=32;
+	for (pga = freq[0];--pga;){	
+		pgb = freq[pga];
+		pa += prof1[pgb]*prof2[pgb];
+	}
+	prof2-=32;
+	
+	s[len_b].a = pa;
+	
+	s[len_b].ga = s[len_b-1].a+prof2[27]+prof2[29];
+	if (s[len_b-1].ga+prof2[29] > s[len_b].ga){
+		s[len_b].ga = s[len_b-1].ga+prof2[29];
+		c |= 8;
+	}
+	
+	pgb = s[len_b].gb;
+	s[len_b].gb = ca+prof1[27]+prof1[29];
+	if(pgb +prof1[29]> s[len_b].gb){
+		s[len_b].gb = pgb+prof1[29];
+		c |= 16;
+	}	
+	tracep[len_b] = c;
+
+	pgb = s[len_b].gb;
+	c = 2;
+	if(s[len_b].ga > pgb){
+		pgb = s[len_b].ga;
+		c = 1;
+	}
+	if(s[len_b].a >= pgb){
+		pgb = s[len_b].a;
+		c = 0;
+	}
+	
+	ca = c;
+	
+	i = len_a;
+	j = len_b;
+	c = 1;
+	while(trace[i][j] < 32){
+	//	fprintf(stderr,"%d->%d	%d:%d	%d:%d\n",c,trace[i][j],i,j,len_a,len_b);
+		switch(ca){
+			case 0:
+				if (trace[i][j] & 2){
+					ca = 1;
+					if(i-1!= 0){
+						path[c+1] |= 16;
+	//					fprintf(stderr,"GAP_CLOSE\n");
+					}else{
+						path[c+1] |= 32+16;
+					}
+				}else if (trace[i][j] & 4){
+					ca = 2;
+					if(j-1!= 0){
+						path[c+1] |= 16;
+	//					fprintf(stderr,"GAP_CLOSE\n");
+					}else{
+						path[c+1] |= 32+16;
+					}
+				}
+
+				//path[c] = 0;
+				i--;
+				j--;
+			break;
+			case 1:
+				if(trace[i][j] & 8){
+					ca = 1;
+					if(i!=0 && i!= len_a){
+	//				/	fprintf(stderr,"GAP_EXT\n");
+						if(!(path[c]&16)){
+							path[c] |= 8;
+						}
+					}else{
+						if(!(path[c]&16)){
+							path[c] |= 32+8;
+						}
+					}
+				}else{
+					ca = 0;
+					if(i!=0 && i!= len_a){
+	//					fprintf(stderr,"GAP_OPEN\n");
+						path[c] |= 4;
+					}else{
+						path[c] |= 32+4;
+					}
+				}
+				path[c] |= 1;
+				j--;
+			break;
+			case  2:
+				if(trace[i][j] & 16){
+					ca = 2;
+					if(j !=0 && j != len_b){
+	//					fprintf(stderr,"GAP_EXT\n");
+						if(!(path[c]&16)){
+							path[c] |= 8;
+						}
+					}else{
+						if(!(path[c]&16)){
+							path[c] |= 32+8;
+						}
+					}
+				}else{
+					ca = 0;
+					if(j !=0 && j != len_b){
+	//					fprintf(stderr,"GAP_OPEN\n");
+						path[c] |= 4;
+					}else{
+						path[c] |= 32+4;
+					}
+					
+				}
+				path[c] |= 2;
+				i--;
+			break;
+		}
+		c++;
+	}
+	
+	
+	
+	path[0] = c-1;
+	path[c] = 3;
+	path[c+1] = pgb;
+	
+	j = path[0];
+	for(i =0 ;i < path[0]/2;i++){
+		c = path[i+1];
+		path[i+1] = path[j-i];
+		path[j -i] = c;
+	}
+	return path;
+}
+
+int* backward_pp_dyn(int* path, struct dp_matrix *dp,const int* prof1,const int* prof2,const int len_a,const int len_b)
+{
+	unsigned int freq[26];
+	
+	struct states* s = 0;
+	char** trace = 0;
+	char* tracep = 0;
+	register int pa = 0;
+	register int pga = 0;
+	register int pgb = 0;
+	register int ca = 0;
+	register int i = 0;
+	register int j = 0;
+	register int c = 0;
+
+	prof1+= 64;
+	prof2 += 64;
+
+
+	s = dp->s;
+	
+	trace = dp->tb;
+
+	trace[len_a][len_b] = 32;
+
+	prof1 +=  len_a << 6;
+
+	s[len_b].a = 0;
+	s[len_b].ga = -INFTY;
+	s[len_b].gb = -INFTY;
+	//init of first row;
+	tracep = trace[len_a];
+	
+	j = len_b;
+	while(--j){
+		s[j].a = -INFTY;
+		
+		s[j].ga = s[j+1].a+prof2[29];
+		if (s[j+1].ga+prof2[29] > s[j].ga){
+			s[j].ga = s[j+1].ga+prof2[29];
+		}
+		s[j].gb = -INFTY;
+		tracep[j] = 8;
+	}
+	
+	s[0].a = -INFTY;
+	s[0].ga = -INFTY;
+	s[0].gb = -INFTY;
+	i = len_a;
+	while(--i){
+		prof1 -= 64;
+
+		c = 1;
+		for (j = 26; j--;){
+			if(prof1[j]){
+				freq[c] = j;
+				c++;	
+			}
+		}
+		freq[0] = c;
+		
+		tracep = trace[i];
+		pa = s[len_b].a;
+		pga = s[len_b].ga;
+		pgb = s[len_b].gb;
+		s[len_b].a = -INFTY;
+		s[len_b].ga = -INFTY;
+		
+		s[len_b].gb = pa+prof1[29];
+		if(pgb+prof1[29] > s[len_b].gb){
+			s[len_b].gb = pgb+prof1[29];
+		}
+	
+		tracep[len_b] = 16;
+		
+		j = len_b;
+		prof2 += len_b << 6;
+		while(--j){
+			prof2 -= 64;
+			ca = s[j].a;
+
+			c = 1;
+			if((pga += prof2[91]) > pa){
+				pa = pga;
+				c = 2;
+			}
+			if((pgb += prof1[91]) > pa){
+				pa = pgb;
+				c = 4;
+			}
+			
+			prof2 += 32;
+			for (pga = freq[0];--pga;){
+				pgb = freq[pga];
+				pa += prof1[pgb]*prof2[pgb];
+			}
+			prof2 -= 32;
+
+			s[j].a = pa;
+			
+			pga = s[j].ga;
+			
+			s[j].ga = s[j+1].a+prof2[27];
+			if (s[j+1].ga+prof2[28] > s[j].ga){
+				s[j].ga = s[j+1].ga+prof2[28];
+				c |= 8;
+			}
+			
+			pgb = s[j].gb;
+			
+			s[j].gb = ca+prof1[27];
+			if(pgb+prof1[28] > s[j].gb){
+				s[j].gb = pgb+prof1[28];
+				c |= 16;
+			}
+			tracep[j] = c;
+			pa = ca;
+
+		}
+	
+		prof2 -= 64;
+		//LAST CELL (0)
+		ca = s[0].a;
+
+		c = 1;
+		if((pga+=prof2[91]) > pa){
+			pa = pga;
+			c = 2;
+		}
+		if((pgb+=prof1[91]) > pa){
+			pa = pgb;
+			c = 4;
+		}
+		
+		prof2 += 32;
+		for (pga = freq[0];--pga;){
+			pgb = freq[pga];
+			pa += prof1[pgb]*prof2[pgb];
+		}
+		prof2 -= 32;
+		
+		s[0].a = pa;
+		
+		s[0].ga = -INFTY;
+		
+		pgb = s[0].gb;
+		s[0].gb = ca+prof1[27]+prof1[29];
+ 		if(pgb+prof1[29] > s[0].gb){
+			s[0].gb = pgb+prof1[29];
+			c |= 16;
+		}
+		tracep[0] = c;	
+		
+	}
+	prof1 -= 64;
+	
+	c = 1;
+	for (j = 26; j--;){
+		if(prof1[j]){
+			freq[c] = j;
+			c++;	
+		}
+	}
+	freq[0] = c;
+	
+	tracep = trace[0];
+	j = len_b;
+	prof2 += len_b << 6;
+	pa = s[j].a;
+	pga = s[j].ga;
+	pgb = s[j].gb;
+	s[j].a = -INFTY;
+	s[j].ga = -INFTY;
+
+	s[len_b].gb = pa+prof1[29];
+	if(pgb+prof1[29] > s[len_b].gb){
+		s[len_b].gb = pgb+prof1[29];
+	}
+
+
+	
+	while(--j){
+		prof2 -= 64;
+		ca = s[j].a;
+
+		c = 1;
+
+		if((pga+=prof2[91]) > pa){
+			pa = pga;
+			c = 2;
+		}
+
+		if((pgb+=prof1[91]) > pa){
+			pa = pgb;
+			c = 4;
+		}
+		
+		prof2+=32;
+		
+		for (pga = freq[0];--pga;){
+			pgb = freq[pga];
+			pa += prof1[pgb]*prof2[pgb];
+		}
+		prof2-=32;
+		
+		s[j].a = pa;
+		pga = s[j].ga;
+		s[j].ga = s[j+1].a+prof2[27]+prof2[29];
+		if (s[j+1].ga+prof2[29] > s[j].ga){
+			s[j].ga = s[j+1].ga+prof2[29];
+			c |= 8;
+		}	
+		pgb = s[j].gb;
+		s[j].gb = -INFTY;	
+		
+		tracep[j] = c;
+		pa = ca;
+	}
+	prof2 -= 64;
+
+	ca = s[0].a;
+	
+	c = 1;
+	
+	if((pga+=prof2[91]) > pa){
+		pa = pga;
+		c = 2;
+	}
+	if((pgb+=prof1[91]) > pa){
+		pa = pgb;
+		c = 4;
+	}
+	prof2+=32;
+	for (pga = freq[0];--pga;){	
+		pgb = freq[pga];
+		pa += prof1[pgb]*prof2[pgb];
+	}
+	prof2-=32;
+	
+	s[0].a = pa;
+	
+	s[0].ga = s[1].a+prof2[27]+prof2[29];
+	if (s[1].ga+prof2[29] > s[0].ga){
+		s[0].ga = s[1].ga+prof2[29];
+		c |= 8;
+	}
+	
+	pgb = s[0].gb;
+	s[0].gb = ca+prof1[27]+prof1[29];
+	if(pgb +prof1[29]> s[0].gb){
+		s[0].gb = pgb+prof1[29];
+		c |= 16;
+	}	
+	tracep[0] = c;
+
+	pgb = s[0].gb;
+	c = 2;
+	if(s[0].ga > pgb){
+		pgb = s[0].ga;
+		c = 1;
+	}
+	if(s[0].a >= pgb){
+		pgb = s[0].a;
+		c = 0;
+	}
+	
+	//fprintf(stderr,"SCORE:%d\n",ca);
+	ca = c;
+	
+	i = 0;
+	j = 0;
+	c = 1;
+	while(trace[i][j] < 32){
+	//	fprintf(stderr,"%d->%d	%d:%d	%d:%d\n",c,trace[i][j],i,j,len_a,len_b);
+		switch(ca){
+			case 0:
+				if (trace[i][j] & 2){
+					ca = 1;
+					if(i+1!= len_a){
+						path[c+1] |= 16;
+	//					fprintf(stderr,"GAP_CLOSE\n");
+					}else{
+						path[c+1] |= 32+16;
+					}
+				}else if (trace[i][j] & 4){
+					ca = 2;
+					if(j+1!= len_b){
+						path[c+1] |= 16;
+	//					fprintf(stderr,"GAP_CLOSE\n");
+					}else{
+						path[c+1] |= 32+16;
+					}
+				}
+
+				//path[c] = 0;
+				i++;
+				j++;
+			break;
+			case 1:
+				if(trace[i][j] & 8){
+					ca = 1;
+					if(i!=0 && i!= len_a){
+	//				/	fprintf(stderr,"GAP_EXT\n");
+						if(!(path[c]&16)){
+							path[c] |= 8;
+						}
+					}else{
+						if(!(path[c]&16)){
+							path[c] |= 32+8;
+						}
+					}
+				}else{
+					ca = 0;
+					if(i!=0 && i!= len_a){
+	//					fprintf(stderr,"GAP_OPEN\n");
+						path[c] |= 4;
+					}else{
+						path[c] |= 32+4;
+					}
+				}
+				path[c] |= 1;
+				j++;
+			break;
+			case  2:
+				if(trace[i][j] & 16){
+					ca = 2;
+					if(j !=0 && j != len_b){
+	//					fprintf(stderr,"GAP_EXT\n");
+						if(!(path[c]&16)){
+							path[c] |= 8;
+						}
+					}else{
+						if(!(path[c]&16)){
+							path[c] |= 32+8;
+						}
+					}
+				}else{
+					ca = 0;
+					if(j!=0 && j != len_b){
+	//					fprintf(stderr,"GAP_OPEN\n");
+						path[c] |= 4;
+					}else{
+						path[c] |= 32+4;
+					}
+					
+				}
+				path[c] |= 2;
+				i++;
+			break;
+		}
+		c++;
+	}
+	path[0] = c-1;
+	path[c] = 3;
+	path[c+1] = pgb;
+	
+	
+	return path;
+}
+
+*/

Added: trunk/packages/kalign/branches/upstream/current/kalign2_hirschberg.h
===================================================================
--- trunk/packages/kalign/branches/upstream/current/kalign2_hirschberg.h	2006-11-19 13:38:57 UTC (rev 159)
+++ trunk/packages/kalign/branches/upstream/current/kalign2_hirschberg.h	2006-11-29 14:12:29 UTC (rev 160)
@@ -0,0 +1,44 @@
+/*
+	kalign2_hirschberg.h
+	
+	Released under GPL - see the 'COPYING' file   
+	
+	Copyright (C) 2006 Timo Lassmann <timolassmann at gmail.com>
+	
+	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
+	any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+    
+	Please send bug reports, comments etc. to:
+	timolassmann at gmail.com
+*/
+
+int* hirsch_pp_dyn(const float* prof1,const float* prof2,struct hirsch_mem* hm, int* hirsch_path);
+struct states* foward_hirsch_pp_dyn(const float* prof1,const float* prof2,struct hirsch_mem* hm);
+struct states* backward_hirsch_pp_dyn(const float* prof1,const float* prof2,struct hirsch_mem* hm);
+int* hirsch_align_two_pp_vector(const float* prof1,const float* prof2,struct hirsch_mem* hm,int* hirsch_path,float input_states[],int old_cor[]);
+
+struct states* backward_hirsch_pp_dynm(const float* prof1,const float* prof2,struct hirsch_mem* hm);
+
+struct states* backward_hirsch_pp_dyn0(const float* prof1,const float* prof2,struct hirsch_mem* hm);
+
+int* hirsch_ps_dyn(const float* prof1,const int* seq2,struct hirsch_mem* hm, int* hirsch_path,int sip);
+struct states* foward_hirsch_ps_dyn(const float* prof1,const int* seq2,struct hirsch_mem* hm,int sip);
+struct states* backward_hirsch_ps_dyn(const float* prof1,const int* seq2,struct hirsch_mem* hm,int sip);
+int* hirsch_align_two_ps_vector(const float* prof1,const int* seq2,struct hirsch_mem* hm,int* hirsch_path,float input_states[],int old_cor[],int sip);
+
+
+int* hirsch_ss_dyn(float**subm, const int* seq1,const int* seq2,struct hirsch_mem* hm, int* hirsch_path);
+struct states* foward_hirsch_ss_dyn(float**subm,const int* seq1,const int* seq2,struct hirsch_mem* hm);
+struct states* backward_hirsch_ss_dyn(float**subm,const int* seq1,const int* seq2,struct hirsch_mem* hm);
+int* hirsch_align_two_ss_vector(float**subm,const int* seq1,const int* seq2,struct hirsch_mem* hm,int* hirsch_path,float input_states[],int old_cor[]);

Added: trunk/packages/kalign/branches/upstream/current/kalign2_hirschberg_dna.c
===================================================================
--- trunk/packages/kalign/branches/upstream/current/kalign2_hirschberg_dna.c	2006-11-19 13:38:57 UTC (rev 159)
+++ trunk/packages/kalign/branches/upstream/current/kalign2_hirschberg_dna.c	2006-11-29 14:12:29 UTC (rev 160)
@@ -0,0 +1,1881 @@
+/*
+	kalign2_hirschberg_dna.c
+	
+	Released under GPL - see the 'COPYING' file   
+	
+	Copyright (C) 2006 Timo Lassmann <timolassmann at gmail.com>
+	
+	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
+	any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+    
+	Please send bug reports, comments etc. to:
+	timolassmann at gmail.com
+*/
+
+
+#include "kalign2.h"
+#include "kalign2_hirschberg_dna.h"
+#define MAX(a, b) (a > b ? a : b)
+#define MAX3(a,b,c) MAX(MAX(a,b),c)
+
+
+int** dna_alignment(struct alignment* aln,int* tree,float**submatrix, int** map)
+{
+	struct hirsch_mem* hm = 0;
+	int i,j,g,a,b,c;
+	int len_a;
+	int len_b;
+	float** profile = 0;
+
+	profile = malloc(sizeof(float*)*numprofiles);
+	for ( i = 0;i< numprofiles;i++){
+		profile[i] = 0;
+	}
+
+	map = malloc(sizeof(int*)*numprofiles);
+	for ( i = 0;i < numprofiles;i++){
+		map[i] = 0;
+	}
+	
+	hm = hirsch_mem_alloc(hm,1024);
+	fprintf(stderr,"\nAlignment:\n");
+	for (i = 0; i < (numseq-1);i++){
+		a = tree[i*3];
+		b = tree[i*3+1];
+		c = tree[i*3+2];
+		fprintf(stderr,"\r%8.0f percent done",(float)(i) /(float)numseq * 100);
+		//fprintf(stderr,"Aligning:%d %d->%d	done:%0.2f\n",a,b,c,((float)(i+1)/(float)numseq)*100);
+		len_a = aln->sl[a];
+		len_b = aln->sl[b];
+
+		
+		g = (len_a > len_b)? len_a:len_b;
+		map[c] = malloc(sizeof(int) * (g+2));
+		if(g > hm->size){
+			hm = hirsch_mem_realloc(hm,g);
+		}
+
+		for (j = 0; j < (g+2);j++){
+			map[c][j] = -1;
+		}
+
+		if (a < numseq){
+			profile[a] = dna_make_profile(profile[a],aln->s[a],len_a,submatrix);
+		}
+		if (b < numseq){
+			profile[b] = dna_make_profile(profile[b],aln->s[b],len_b,submatrix);
+		}
+		
+	
+		dna_set_gap_penalties(profile[a],len_a,aln->nsip[b]);
+		dna_set_gap_penalties(profile[b],len_b,aln->nsip[a]);
+
+		hm->starta = 0;
+		hm->startb = 0;
+		hm->enda = len_a;
+		hm->endb = len_b;
+		hm->len_a = len_a;
+		hm->len_b = len_b;
+		
+		hm->f[0].a = 0.0;
+		hm->f[0].ga =  -FLOATINFTY;
+		hm->f[0].gb = -FLOATINFTY;
+		hm->b[0].a = 0.0;
+		hm->b[0].ga =  -FLOATINFTY;
+		hm->b[0].gb =  -FLOATINFTY;
+	//	fprintf(stderr,"LENA:%d	LENB:%d	numseq:%d\n",len_a,len_b,numseq);
+		if(a < numseq){
+			if(b < numseq){
+				map[c] = hirsch_dna_ss_dyn(submatrix,aln->s[a],aln->s[b],hm,map[c]);
+			}else{
+				hm->enda = len_b;
+				hm->endb = len_a;
+				hm->len_a = len_b;
+				hm->len_b = len_a;
+				map[c] = hirsch_dna_ps_dyn(profile[b],aln->s[a],hm,map[c],aln->nsip[b]);
+				map[c] = mirror_hirsch_path(map[c],len_a,len_b);
+			}
+		}else{
+			if(b < numseq){
+				map[c] = hirsch_dna_ps_dyn(profile[a],aln->s[b],hm,map[c],aln->nsip[a]);
+			}else{
+				if(len_a < len_b){
+					map[c] = hirsch_dna_pp_dyn(profile[a],profile[b],hm,map[c]);
+				}else{
+					hm->enda = len_b;
+					hm->endb = len_a;
+					hm->len_a = len_b;
+					hm->len_b = len_a;
+					map[c] = hirsch_dna_pp_dyn(profile[b],profile[a],hm,map[c]);
+					map[c] = mirror_hirsch_path(map[c],len_a,len_b);
+				}
+			}
+		}
+
+		
+		map[c] = add_gap_info_to_hirsch_path(map[c],len_a,len_b);
+
+		if(i != numseq-2){
+			profile[c] = malloc(sizeof(float)*22*(map[c][0]+2));
+			profile[c] = dna_update(profile[a],profile[b],profile[c],map[c],aln->nsip[a],aln->nsip[b]);
+		}
+			
+		aln->sl[c] = map[c][0];
+	
+		aln->nsip[c] = aln->nsip[a] + aln->nsip[b];
+		aln->sip[c] = malloc(sizeof(int)*(aln->nsip[a] + aln->nsip[b]));
+		g =0;
+		for (j = aln->nsip[a];j--;){
+			aln->sip[c][g] = aln->sip[a][j];
+			g++;
+		}
+		for (j = aln->nsip[b];j--;){
+			aln->sip[c][g] = aln->sip[b][j];
+			g++;
+		}
+
+		free(profile[a]);
+		free(profile[b]);
+	}
+	
+	fprintf(stderr,"\r%8.0f percent done\n",100.0);
+	//free(profile[numprofiles-1]);
+	free(profile);
+	hirsch_mem_free(hm);
+	for (i = 32;i--;){
+		free(submatrix[i]);
+	}
+	free(submatrix);
+	return map;
+}
+
+
+int* hirsch_dna_ss_dyn(float**subm, const int* seq1,const int* seq2,struct hirsch_mem* hm, int* hirsch_path)
+{
+	int mid = ((hm->enda - hm->starta) / 2)+ hm->starta;
+	float input_states[6] = {hm->f[0].a,hm->f[0].ga,hm->f[0].gb,hm->b[0].a,hm->b[0].ga,hm->b[0].gb};
+	int old_cor[5] = {hm->starta,hm->enda,hm->startb,hm->endb,mid};
+
+	if(hm->starta  >= hm->enda){
+		return hirsch_path;
+	}
+	if(hm->startb  >= hm->endb){
+		return hirsch_path;
+	}
+
+
+	hm->enda = mid;
+
+	//fprintf(stderr,"Forward:%d-%d	%d-%d\n",hm->starta,hm->enda,hm->startb,hm->endb);
+	hm->f = foward_hirsch_dna_ss_dyn(subm,seq1,seq2,hm);
+
+	hm->starta = mid;
+	hm->enda = old_cor[1];
+	//fprintf(stderr,"Backward:%d-%d	%d-%d\n",hm->starta,hm->enda,hm->startb,hm->endb);
+	hm->b = backward_hirsch_dna_ss_dyn(subm,seq1,seq2,hm);
+
+
+	hirsch_path = hirsch_align_two_dna_ss_vector(subm,seq1,seq2,hm,hirsch_path,input_states,old_cor);
+	return hirsch_path;
+}
+
+int* hirsch_align_two_dna_ss_vector(float**subm,const int* seq1,const int* seq2,struct hirsch_mem* hm,int* hirsch_path,float input_states[],int old_cor[])
+{
+	struct states* f = hm->f;
+ 	struct states* b = hm->b;
+	int i,j,c;
+	int transition = -1;
+	
+	
+	//code:
+	// a -> a = 1
+	// a -> ga = 2
+	// a -> gb = 3
+	// ga ->ga = 4
+	// ga -> a = 5
+	//gb->gb = 6;
+	//gb->a = 7;
+	
+	//int max = -INFTY;
+	float max = -INFTY;	
+	float middle =  (hm->endb - hm->startb)/2 + hm->startb;
+	float sub = 0.0;
+	
+	i = hm->startb;
+	c = -1;
+	for(i = hm->startb; i < hm->endb;i++){
+		sub = abs(middle -i);
+		sub /= 1000; 
+	//	fprintf(stderr,"%d-%d	%f\n",hm->startb,hm->endb,sub);
+		if(f[i].a+b[i].a-sub > max){
+			max = f[i].a+b[i].a-sub;
+	//		fprintf(stderr,"aligned->aligned:%d + %d = %d\n",f[i].a,b[i].a,f[i].a+b[i].a);
+			transition = 1;
+			c = i;
+		}
+		if(f[i].a+b[i].ga-gpo-sub > max){
+			max = f[i].a+b[i].ga-gpo-sub;
+	//		fprintf(stderr,"aligned->gap_a:%d + %d +%d = %d\n",f[i].a,b[i].ga,prof1[27],f[i].a+b[i].ga+prof2[27]);
+			transition = 2;
+			c = i;
+		}
+		if(f[i].a+b[i].gb -gpo-sub > max){
+			max = f[i].a+b[i].gb - gpo-sub;
+	//		fprintf(stderr,"aligned->gap_b:%d + %d +%d = %d\n",f[i].a,b[i].gb,prof1[27],f[i].a+b[i].gb+prof1[27]);
+			transition = 3;
+			c = i;
+		}
+		if(f[i].ga+b[i].a - gpo-sub > max){
+			max = f[i].ga+b[i].a - gpo-sub;
+	//		fprintf(stderr,"gap_a->aligned:%d + %d + %d(gpo) = %d\n",f[i].ga,b[i].a,prof2[27],f[i].ga+b[i].a+prof2[27]);
+			transition = 5;
+			c = i;
+		}
+
+
+		if(hm->startb == 0){
+			if(f[i].gb+b[i].gb - tgpe-sub > max){
+				max = f[i].gb+b[i].gb -tgpe-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+				transition = 6;
+				c = i;
+			}
+		}else{
+			if(f[i].gb+b[i].gb - gpe -sub> max){
+				max = f[i].gb+b[i].gb - gpe-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+				transition = 6;
+				c = i;
+			}
+		}
+		if(f[i].gb+b[i].a - gpo-sub > max){
+			max = f[i].gb+b[i].a - gpo-sub;
+	//		fprintf(stderr,"gap_b->aligned:%d + %d + %d(gpo) = %d\n",f[i].gb,b[i].a,prof1[27],f[i].gb+b[i].a+prof1[27]);
+			transition = 7;
+			c = i;
+		}
+	}
+	i = hm->endb;
+	sub = abs(middle -i);
+	sub /= 1000; 
+	
+	if(f[i].a+b[i].gb-gpo-sub > max){
+		max = f[i].a+b[i].gb - gpo-sub;
+	//		fprintf(stderr,"aligned->gap_b:%d + %d +%d = %d\n",f[i].a,b[i].gb,prof1[27],f[i].a+b[i].gb+prof1[27]);
+		transition = 3;
+		c = i;
+	}
+	if(hm->endb == hm->len_b){
+		if(f[i].gb+b[i].gb -tgpe-sub > max){
+			max = f[i].gb+b[i].gb - tgpe-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+			transition = 6;
+			c = i;
+		}	
+	}else{
+		if(f[i].gb+b[i].gb - gpe-sub > max){
+			max = f[i].gb+b[i].gb - tgpe-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+			transition = 6;
+			c = i;
+		}
+	}
+	
+	
+	//fprintf(stderr,"Transition:%d	at:%d\n",transition,c);
+	
+	j = hirsch_path[0];
+	switch(transition){
+		case 1: //a -> a = 1
+			
+			hirsch_path[old_cor[4]] = c;
+			hirsch_path[old_cor[4]+1] = c+1;
+			
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4],c);
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4]+1,c+1);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = 0.0;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = -FLOATINFTY;
+	//		fprintf(stderr,"Using this for start:%d	%d	%d\n",hm->f[0].a,hm->f[0].ga,hm->f[0].gb);
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_dna_ss_dyn(subm,seq1,seq2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = 0.0;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d  what:%d-%d	%d-%d\n",c+1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_dna_ss_dyn(subm,seq1,seq2,hm,hirsch_path);
+			break;
+		case 2:// a -> ga = 2
+			
+			hirsch_path[old_cor[4]] = c;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4],c);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = 0.0;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = -FLOATINFTY;
+			
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_dna_ss_dyn(subm,seq1,seq2,hm,hirsch_path);
+			
+
+			//backward:
+			hm->starta = old_cor[4];
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = -FLOATINFTY;
+			hm->f[0].ga = 0.0;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d  what:%d-%d	%d-%d\n",c+1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_dna_ss_dyn(subm,seq1,seq2,hm,hirsch_path);
+			break;
+		case 3:// a -> gb = 3
+			
+			hirsch_path[old_cor[4]] = c;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4],c);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = 0.0;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = -FLOATINFTY;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_dna_ss_dyn(subm,seq1,seq2,hm,hirsch_path);
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c;
+			hm->endb = old_cor[3];
+			hm->f[0].a = -FLOATINFTY;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = 0.0;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = hirsch_dna_ss_dyn(subm,seq1,seq2,hm,hirsch_path);
+			break;
+		case 5://ga -> a = 5
+			hirsch_path[old_cor[4]+1] = c+1;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4]+1,c+1);
+
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = -FLOATINFTY;
+			hm->b[0].ga = 0.0;
+			hm->b[0].gb = -FLOATINFTY;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4];
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_dna_ss_dyn(subm,seq1,seq2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = 0.0;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = hirsch_dna_ss_dyn(subm,seq1,seq2,hm,hirsch_path);
+			break;
+		case 6://gb->gb = 6;
+			
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = -FLOATINFTY;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = 0.0;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			hm->startb = old_cor[2];
+			hm->endb = c;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_dna_ss_dyn(subm,seq1,seq2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c;
+			hm->endb = old_cor[3];
+			hm->f[0].a = -FLOATINFTY;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = 0.0;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = hirsch_dna_ss_dyn(subm,seq1,seq2,hm,hirsch_path);
+			break;
+		case 7://gb->a = 7;
+			
+			hirsch_path[old_cor[4]+1] = c+1;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4]+1,c+1);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = -FLOATINFTY;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = 0.0;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			hm->startb = old_cor[2];
+			hm->endb = c;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_dna_ss_dyn(subm,seq1,seq2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = 0.0;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = hirsch_dna_ss_dyn(subm,seq1,seq2,hm,hirsch_path);
+			break;
+	}
+		
+	return hirsch_path;
+}
+
+
+
+struct states* foward_hirsch_dna_ss_dyn(float**subm,const int* seq1,const int* seq2,struct hirsch_mem* hm)
+{
+	struct states* s = hm->f;
+	float *subp = 0;
+	const int starta = hm->starta;
+	const int enda = hm->enda;
+	const int startb = hm->startb;
+	const int endb = hm->endb;
+	
+	register float pa = 0;
+	register float pga = 0;
+	register float pgb = 0;
+	register float ca = 0;
+	register int i = 0;
+	register int j = 0;
+	
+
+	s[startb].a = s[0].a;
+	s[startb].ga = s[0].ga;
+	s[startb].gb = s[0].gb;
+	if(startb == 0){
+		for (j = startb+1; j < endb;j++){
+
+			s[j].a = -FLOATINFTY;
+			s[j].ga = MAX(s[j-1].ga,s[j-1].a)-tgpe;
+			
+			s[j].gb = -FLOATINFTY;
+		}		
+	}else{
+
+		for (j = startb+1; j < endb;j++){
+			s[j].a = -FLOATINFTY;
+			s[j].ga = MAX(s[j-1].ga - gpe,s[j-1].a-gpo);
+			s[j].gb = -FLOATINFTY;
+		}
+	}
+	s[endb].a = -FLOATINFTY;
+	s[endb].ga = -FLOATINFTY;
+	s[endb].gb = -FLOATINFTY;
+	seq2--;
+
+	for (i = starta;i < enda;i++){
+		subp = subm[seq1[i]];
+
+		pa = s[startb].a;
+		pga = s[startb].ga;
+		pgb = s[startb].gb;
+		s[startb].a = -FLOATINFTY;
+		s[startb].ga = -FLOATINFTY;
+		if(startb == 0){
+			s[startb].gb = MAX(pgb,pa) - tgpe;
+		}else{
+			s[startb].gb = MAX(pgb - gpe,pa - gpo);
+		}
+		for (j = startb+1; j < endb;j++){
+			ca = s[j].a;
+			pa = MAX3(pa,pga-gpo,pgb-gpo);	
+			pa += subp[seq2[j]];
+			
+			s[j].a = pa;
+			
+			pga = s[j].ga;
+			
+			s[j].ga = MAX(s[j-1].ga-gpe,s[j-1].a-gpo);
+			
+			pgb = s[j].gb;
+			
+			s[j].gb = MAX(pgb-gpe ,ca-gpo);
+			
+			pa = ca;
+		}
+		ca = s[j].a;
+		pa = MAX3(pa,pga-gpo,pgb-gpo);
+		pa += subp[seq2[j]];
+			
+		s[j].a = pa;
+			
+		s[j].ga = -FLOATINFTY;//MAX(s[j-1].ga-gpe,s[j-1].a-gpo);
+		if (endb != hm->len_b){
+			s[j].gb = MAX(s[j].gb-gpe ,ca-gpo);
+		}else{
+			s[j].gb = MAX(s[j].gb,ca)-tgpe;
+		}
+	}
+	return s;
+}
+
+struct states* backward_hirsch_dna_ss_dyn(float**subm,const int* seq1,const int* seq2,struct hirsch_mem* hm)
+{
+
+	struct states* s = hm->b;
+	float *subp = 0;
+	const int starta = hm->starta;
+	const int enda = hm->enda;
+	const int startb = hm->startb;
+	const int endb = hm->endb;
+	register float pa = 0;
+	register float pga = 0;
+	register float pgb = 0;
+	register float ca = 0;
+	register int i = 0;
+	register int j = 0;
+
+	s[endb].a = s[0].a ;
+	s[endb].ga = s[0].ga;
+	s[endb].gb = s[0].gb;
+	
+	
+	//init of first row;
+	
+	//j = endb-startb;
+	if(endb == hm->len_b){
+		for(j = endb-1;j > startb;j--){
+			s[j].a = -FLOATINFTY;
+			s[j].ga = MAX(s[j+1].ga,s[j+1].a)-tgpe;
+			s[j].gb = -FLOATINFTY;
+		}
+	}else{
+		for(j = endb-1;j > startb;j--){
+			s[j].a = -FLOATINFTY;
+			s[j].ga = MAX(s[j+1].ga-gpe,s[j+1].a-gpo);	
+			s[j].gb = -FLOATINFTY;
+		}
+	}
+
+	
+	s[startb].a = -FLOATINFTY;
+	s[startb].ga = -FLOATINFTY;
+	s[startb].gb = -FLOATINFTY;
+
+	i = enda-starta;
+	seq1+= starta;
+	while(i--){
+		subp = subm[seq1[i]];
+		pa = s[endb].a;
+		pga = s[endb].ga;
+		pgb = s[endb].gb;
+		s[endb].a = -FLOATINFTY;
+		s[endb].ga = -FLOATINFTY;
+
+		if(endb == hm->len_b){
+			s[endb].gb = MAX(pgb,pa)-tgpe;
+		}else{
+			s[endb].gb = MAX(pgb-gpe,pa-gpo);
+		}
+
+		for(j = endb-1;j > startb;j--){
+
+			ca = s[j].a;
+			pa = MAX3(pa,pga - gpo,pgb-gpo);
+			
+			pa += subp[seq2[j]];
+
+			s[j].a = pa;
+			
+			pga = s[j].ga;
+			
+			s[j].ga = MAX(s[j+1].ga-gpe,s[j+1].a-gpo);
+			
+			pgb = s[j].gb;
+
+			s[j].gb = MAX(pgb-gpe,ca-gpo);
+			
+			pa = ca;
+		}
+		ca = s[j].a;
+
+		pa = MAX3(pa,pga - gpo,pgb-gpo);
+			
+		pa += subp[seq2[j]];
+
+		s[j].a = pa;
+		
+		s[j].ga = -FLOATINFTY;//MAX(s[j+1].ga-gpe,s[j+1].a-gpo);
+		
+		if(startb){
+			s[j].gb = MAX(s[j].gb-gpe,ca-gpo);
+		}else{
+			s[j].gb = MAX(s[j].gb,ca)-tgpe;
+		}
+	}		
+	return s;
+}
+
+
+int* hirsch_dna_ps_dyn(const float* prof1,const int* seq2,struct hirsch_mem* hm, int* hirsch_path,int sip)
+{
+	int mid = ((hm->enda - hm->starta) / 2)+ hm->starta;
+	float input_states[6] = {hm->f[0].a,hm->f[0].ga,hm->f[0].gb,hm->b[0].a,hm->b[0].ga,hm->b[0].gb};
+	int old_cor[5] = {hm->starta,hm->enda,hm->startb,hm->endb,mid};
+
+
+	if(hm->starta  >= hm->enda){
+		return hirsch_path;
+	}
+	if(hm->startb  >= hm->endb){
+		return hirsch_path;
+	}
+
+	hm->enda = mid;
+	hm->f = foward_hirsch_dna_ps_dyn(prof1,seq2,hm,sip);
+	
+	/*int i;
+	fprintf(stderr,"FOWARD\n");
+	for (i = hm->startb; i <= hm->endb;i++){
+		fprintf(stderr,"%d	%d	%d\n",hm->f[i].a,hm->f[i].ga,hm->f[i].gb);
+	}*/
+
+	hm->starta = mid;
+	hm->enda = old_cor[1];
+	hm->b = backward_hirsch_dna_ps_dyn(prof1,seq2,hm,sip);
+	
+	/*fprintf(stderr,"BaCKWARD\n");
+	for (i = hm->startb; i <= hm->endb;i++){
+		fprintf(stderr,"%d	%d	%d\n",hm->b[i].a,hm->b[i].ga,hm->b[i].gb);
+	}*/
+
+	hirsch_path = hirsch_align_two_dna_ps_vector(prof1,seq2,hm,hirsch_path,input_states,old_cor,sip);
+	return hirsch_path;
+}
+
+
+
+int* hirsch_align_two_dna_ps_vector(const float* prof1,const int* seq2,struct hirsch_mem* hm,int* hirsch_path,float input_states[],int old_cor[],int sip)
+{
+	struct states* f = hm->f;
+ 	struct states* b = hm->b;
+	int i,j,c;
+	int transition = -1;
+	
+	const int open = gpo * sip;
+	
+	
+	//code:
+	// a -> a = 1
+	// a -> ga = 2
+	// a -> gb = 3
+	// ga ->ga = 4
+	// ga -> a = 5
+	//gb->gb = 6;
+	//gb->a = 7;
+	
+	//int max = -INFTY;
+	float max = -INFTY;	
+	float middle =  (hm->endb - hm->startb)/2 + hm->startb;
+	float sub = 0.0;
+	
+	
+	prof1+= (22 * (old_cor[4]+1));
+	
+	i = hm->startb;
+	c = -1;
+	for(i = hm->startb; i < hm->endb;i++){
+		sub = abs(middle -i);
+		sub /= 1000; 
+		if(f[i].a+b[i].a-sub> max){
+			max = f[i].a+b[i].a-sub;
+	//		fprintf(stderr,"aligned->aligned:%d + %d = %d\n",f[i].a,b[i].a,f[i].a+b[i].a);
+			transition = 1;
+			c = i;
+		}
+		if(f[i].a+b[i].ga-open-sub > max){
+			max = f[i].a+b[i].ga-open-sub;
+	//		fprintf(stderr,"aligned->gap_a:%d + %d +%d = %d\n",f[i].a,b[i].ga,prof1[27],f[i].a+b[i].ga+prof2[27]);
+			transition = 2;
+			c = i;
+		}
+		if(f[i].a+b[i].gb+prof1[8]-sub > max){
+			max = f[i].a+b[i].gb+prof1[8]-sub;
+	//		fprintf(stderr,"aligned->gap_b:%d + %d +%d = %d\n",f[i].a,b[i].gb,prof1[27],f[i].a+b[i].gb+prof1[27]);
+			transition = 3;
+			c = i;
+		}
+		if(f[i].ga+b[i].a-open-sub > max){
+			max = f[i].ga+b[i].a-open-sub;
+	//		fprintf(stderr,"gap_a->aligned:%d + %d + %d(gpo) = %d\n",f[i].ga,b[i].a,prof2[27],f[i].ga+b[i].a+prof2[27]);
+			transition = 5;
+			c = i;
+		}
+
+
+		if(hm->startb == 0){
+			if(f[i].gb+b[i].gb+prof1[10]-sub > max){
+				max = f[i].gb+b[i].gb+prof1[10]-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+				transition = 6;
+				c = i;
+			}
+		}else{
+			if(f[i].gb+b[i].gb+prof1[9]-sub > max){
+				max = f[i].gb+b[i].gb+prof1[9]-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+				transition = 6;
+				c = i;
+			}
+		}
+		if(f[i].gb+b[i].a+prof1[8-22]-sub > max){
+			max = f[i].gb+b[i].a+prof1[8-22]-sub;
+	//		fprintf(stderr,"gap_b->aligned:%d + %d + %d(gpo) = %d\n",f[i].gb,b[i].a,prof1[27],f[i].gb+b[i].a+prof1[27]);
+			transition = 7;
+			c = i;
+		}
+	}
+	i = hm->endb;
+	sub = abs(middle -i);
+	sub /= 1000; 
+	if(f[i].a+b[i].gb+prof1[8]-sub > max){
+		max = f[i].a+b[i].gb+prof1[8]-sub;
+	//		fprintf(stderr,"aligned->gap_b:%d + %d +%d = %d\n",f[i].a,b[i].gb,prof1[27],f[i].a+b[i].gb+prof1[27]);
+		transition = 3;
+		c = i;
+	}
+	if(hm->endb == hm->len_b){
+		if(f[i].gb+b[i].gb+prof1[10]-sub > max){
+			max = f[i].gb+b[i].gb+prof1[10]-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+			transition = 6;
+			c = i;
+		}	
+	}else{
+		if(f[i].gb+b[i].gb+prof1[9]-sub > max){
+			max = f[i].gb+b[i].gb+prof1[0]-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+			transition = 6;
+			c = i;
+		}
+	}
+	
+	
+	
+	prof1-= (22 * (old_cor[4]+1));
+	
+	//fprintf(stderr,"Transition:%d	at:%d\n",transition,c);
+	
+	j = hirsch_path[0];
+	switch(transition){
+		case 1: //a -> a = 1
+			
+			hirsch_path[old_cor[4]] = c;
+			hirsch_path[old_cor[4]+1] = c+1;
+			
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4],c);
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4]+1,c+1);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = 0.0;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = -FLOATINFTY;
+	//		fprintf(stderr,"Using this for start:%d	%d	%d\n",hm->f[0].a,hm->f[0].ga,hm->f[0].gb);
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_dna_ps_dyn(prof1,seq2,hm,hirsch_path,sip);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = 0.0;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d  what:%d-%d	%d-%d\n",c+1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_dna_ps_dyn(prof1,seq2,hm,hirsch_path,sip);
+			break;
+		case 2:// a -> ga = 2
+			
+			hirsch_path[old_cor[4]] = c;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4],c);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = 0.0;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = -FLOATINFTY;
+			
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_dna_ps_dyn(prof1,seq2,hm,hirsch_path,sip);
+
+			//backward:
+			hm->starta = old_cor[4];
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = -FLOATINFTY;
+			hm->f[0].ga = 0.0;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d  what:%d-%d	%d-%d\n",c+1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_dna_ps_dyn(prof1,seq2,hm,hirsch_path,sip);
+			break;
+		case 3:// a -> gb = 3
+			
+			hirsch_path[old_cor[4]] = c;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4],c);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = 0.0;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = -FLOATINFTY;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_dna_ps_dyn(prof1,seq2,hm,hirsch_path,sip);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c;
+			hm->endb = old_cor[3];
+			hm->f[0].a = -FLOATINFTY;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = 0.0;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = hirsch_dna_ps_dyn(prof1,seq2,hm,hirsch_path,sip);
+			break;
+		case 5://ga -> a = 5
+			hirsch_path[old_cor[4]+1] = c+1;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4]+1,c+1);
+
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = -FLOATINFTY;
+			hm->b[0].ga = 0.0;
+			hm->b[0].gb = -FLOATINFTY;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4];
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_dna_ps_dyn(prof1,seq2,hm,hirsch_path,sip);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = 0.0;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = hirsch_dna_ps_dyn(prof1,seq2,hm,hirsch_path,sip);
+			break;
+		case 6://gb->gb = 6;
+			
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = -FLOATINFTY;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = 0.0;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			hm->startb = old_cor[2];
+			hm->endb = c;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_dna_ps_dyn(prof1,seq2,hm,hirsch_path,sip);			
+
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c;
+			hm->endb = old_cor[3];
+			hm->f[0].a = -FLOATINFTY;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = 0.0;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = hirsch_dna_ps_dyn(prof1,seq2,hm,hirsch_path,sip);
+			break;
+		case 7://gb->a = 7;
+			
+			hirsch_path[old_cor[4]+1] = c+1;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4]+1,c+1);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = -FLOATINFTY;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = 0.0;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			hm->startb = old_cor[2];
+			hm->endb = c;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_dna_ps_dyn(prof1,seq2,hm,hirsch_path,sip);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = 0.0;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = hirsch_dna_ps_dyn(prof1,seq2,hm,hirsch_path,sip);
+			break;
+	}
+		
+	return hirsch_path;
+}
+
+struct states* foward_hirsch_dna_ps_dyn(const float* prof1,const int* seq2,struct hirsch_mem* hm,int sip)
+{
+	//unsigned int freq[26];
+	struct states* s = hm->f;
+	const int starta = hm->starta;
+	const int enda = hm->enda;
+	const int startb = hm->startb;
+	const int endb = hm->endb;
+	
+	register float pa = 0;
+	register float pga = 0;
+	register float pgb = 0;
+	register float ca = 0;
+	register int i = 0;
+	register int j = 0;
+	
+	const float open = gpo * sip;
+	const float ext = gpe *sip;
+	const float text = tgpe * sip;
+	
+	
+	
+	prof1 += (starta) * 22;
+	s[startb].a = s[0].a;
+	s[startb].ga = s[0].ga;
+	s[startb].gb = s[0].gb;
+	if(startb == 0){
+		for (j = startb+1; j < endb;j++){
+			s[j].a = -FLOATINFTY;
+			s[j].ga = MAX(s[j-1].ga,s[j-1].a) - text;
+			s[j].gb = -FLOATINFTY;
+		}	
+	}else{
+		for (j = startb+1; j < endb;j++){
+			s[j].a = -FLOATINFTY;
+			s[j].ga = MAX(s[j-1].ga-ext,s[j-1].a-open);	
+			s[j].gb = -FLOATINFTY;
+		}
+	}
+	
+	
+	s[endb].a = -FLOATINFTY;
+	s[endb].ga = -FLOATINFTY;
+	s[endb].gb = -FLOATINFTY;
+	seq2--;
+
+	for (i = starta;i < enda;i++){
+		prof1 += 22;
+		pa = s[startb].a;
+		pga = s[startb].ga;
+		pgb = s[startb].gb;
+		s[startb].a = -FLOATINFTY;
+		s[startb].ga = -FLOATINFTY;
+		if(startb == 0){
+			s[startb].gb = MAX(pgb,pa)+prof1[10];
+		}else{
+			s[startb].gb = MAX(pgb+prof1[9],pa+prof1[8]);
+		}
+		for (j = startb+1; j < endb;j++){
+			ca = s[j].a;
+			pa = MAX3(pa,pga -open,pgb + prof1[-14]);
+			pa += prof1[11 + seq2[j]];
+
+
+			s[j].a = pa;
+			
+			pga = s[j].ga;
+			
+			s[j].ga = MAX(s[j-1].ga-ext,s[j-1].a-open);
+			
+			pgb = s[j].gb;
+
+			s[j].gb = MAX(pgb+prof1[9],ca+prof1[8]);
+
+			pa = ca;
+		}	
+		ca = s[j].a;
+
+		pa = MAX3(pa,pga -open,pgb + prof1[-14]);
+			
+		pa += prof1[11 + seq2[j]];
+
+
+		s[j].a = pa;
+
+		s[j].ga = -FLOATINFTY;//MAX(s[j-1].ga-ext,s[j-1].a-open);
+				
+		if (hm->endb != hm->len_b){
+			s[j].gb = MAX(s[j].gb+prof1[9] ,ca+prof1[8]);
+		}else{
+			s[j].gb = MAX(s[j].gb,ca)+ prof1[10];
+		}
+	}
+	prof1 -= 22 * (enda);
+	return s;
+}
+
+struct states* backward_hirsch_dna_ps_dyn(const float* prof1,const int* seq2,struct hirsch_mem* hm,int sip)
+{
+	//unsigned int freq[26];
+	struct states* s = hm->b;
+	const int starta = hm->starta;
+	const int enda = hm->enda;
+	const int startb = hm->startb;
+	const int endb = hm->endb;
+	
+	register float pa = 0;
+	register float pga = 0;
+	register float pgb = 0;
+	register float ca = 0;
+	register int i = 0;
+	register int j = 0;
+	
+	const float open = gpo * sip;
+	const float ext = gpe *sip;
+	const float text = tgpe * sip;
+	
+
+	prof1 += (enda+1) * 22;
+
+	s[endb].a = s[0].a;
+	s[endb].ga = s[0].ga;
+	s[endb].gb = s[0].gb;
+	
+	
+	//init of first row;
+	//j = endb-startb;
+	if(endb == hm->len_b){
+		for(j = endb-1;j > startb;j--){
+			s[j].a = -FLOATINFTY;
+			s[j].ga = MAX(s[j+1].ga,s[j+1].a)-text;	
+			s[j].gb = -FLOATINFTY;
+		}
+	}else{
+		for(j = endb-1;j > startb;j--){
+			s[j].a = -FLOATINFTY;
+			s[j].ga = MAX(s[j+1].ga-ext,s[j+1].a-open);
+			s[j].gb = -FLOATINFTY;
+		}
+	}
+	
+	s[startb].a = -FLOATINFTY;
+	s[startb].ga = -FLOATINFTY;
+	s[startb].gb = -FLOATINFTY;
+
+	i = enda-starta;
+	while(i--){
+		prof1 -= 22;
+
+		pa = s[endb].a;
+		pga = s[endb].ga;
+		pgb = s[endb].gb;
+		s[endb].a = -FLOATINFTY;
+		s[endb].ga = -FLOATINFTY;
+
+		if(endb == hm->len_b){
+			s[endb].gb = MAX(pgb,pa) +prof1[10];
+		}else{
+			s[endb].gb = MAX(pgb+prof1[9],pa+prof1[8]);
+		}
+
+		for(j = endb-1;j > startb;j--){
+			ca = s[j].a;
+			pa = MAX3(pa,pga - open,pgb +prof1[30]);
+			pa += prof1[11 + seq2[j]];
+
+			s[j].a = pa;
+			
+			pga = s[j].ga;
+			
+			s[j].ga = MAX(s[j+1].ga-ext,s[j+1].a-open);
+
+			pgb = s[j].gb;
+
+			s[j].gb = MAX(pgb+prof1[9],ca+prof1[8]);
+			
+			pa = ca;
+		}
+		ca = s[j].a;
+
+		pa = MAX3(pa,pga - open,pgb +prof1[30]);
+		pa += prof1[11 + seq2[j]];
+
+		s[j].a = pa;
+			
+
+		s[j].ga = -FLOATINFTY;//MAX(s[j+1].ga-ext,s[j+1].a-open);
+		if(hm->startb){
+			s[j].gb = MAX(s[j].gb+prof1[9], ca+prof1[8]);
+		}else{
+			s[j].gb = MAX(s[j].gb,ca)+prof1[10];
+		}
+	}		
+	return s;
+}
+
+
+
+
+int* hirsch_dna_pp_dyn(const float* prof1,const float* prof2,struct hirsch_mem* hm, int* hirsch_path)
+{
+	int mid = ((hm->enda - hm->starta) / 2)+ hm->starta;
+	float input_states[6] = {hm->f[0].a,hm->f[0].ga,hm->f[0].gb,hm->b[0].a,hm->b[0].ga,hm->b[0].gb};
+	int old_cor[5] = {hm->starta,hm->enda,hm->startb,hm->endb,mid};
+
+	
+	//fprintf(stderr,"starta:%d enda:%d startb:%d endb:%d mid:%d\n",hm->starta,hm->enda,hm->startb,hm->endb,mid);
+	
+	
+	if(hm->starta  >= hm->enda){
+		return hirsch_path;
+	}
+	if(hm->startb  >= hm->endb){
+		return hirsch_path;
+	}
+
+	hm->enda = mid;
+	hm->f = foward_hirsch_dna_pp_dyn(prof1,prof2,hm);
+	/*int i;
+	fprintf(stderr,"FOWARD\n");
+	for (i = hm->startb; i <= hm->endb;i++){
+		fprintf(stderr,"%d	%d	%d\n",hm->f[i].a,hm->f[i].ga,hm->f[i].gb);
+	}*/
+
+	hm->starta = mid;
+	hm->enda = old_cor[1];
+	hm->b = backward_hirsch_dna_pp_dyn(prof1,prof2,hm);
+	/*fprintf(stderr,"BaCKWARD\n");
+
+	for (i = hm->startb; i <= hm->endb;i++){
+		fprintf(stderr,"%d	%d	%d\n",hm->b[i].a,hm->b[i].ga,hm->b[i].gb);
+	}*/
+
+	hirsch_path = hirsch_align_two_dna_pp_vector(prof1,prof2,hm,hirsch_path,input_states,old_cor);
+	return hirsch_path;
+}
+
+
+
+int* hirsch_align_two_dna_pp_vector(const float* prof1,const float* prof2,struct hirsch_mem* hm,int* hirsch_path, float input_states[],int old_cor[])
+{
+	struct states* f = hm->f;
+ 	struct states* b = hm->b;
+	int i,j,c;
+	int transition = -1;
+	
+	
+	//code:
+	// a -> a = 1
+	// a -> ga = 2
+	// a -> gb = 3
+	// ga ->ga = 4
+	// ga -> a = 5
+	//gb->gb = 6;
+	//gb->a = 7;
+	
+	//int max = -INFTY;
+	float max = -INFTY;	
+	float middle =  (hm->endb - hm->startb)/2 + hm->startb;
+	float sub = 0.0;
+	
+	
+	prof1+= (22 * (old_cor[4]+1));
+	prof2 += (22 * (hm->startb));
+	
+	i = hm->startb;
+	c = -1;
+	for(i = hm->startb; i < hm->endb;i++){
+		sub = abs(middle -i);
+		sub /= 1000; 
+		prof2 += 22;
+		if(f[i].a+b[i].a-sub > max){
+			max = f[i].a+b[i].a-sub;
+	//		fprintf(stderr,"aligned->aligned:%d + %d = %d\n",f[i].a,b[i].a,f[i].a+b[i].a);
+			transition = 1;
+			c = i;
+		}
+		if(f[i].a+b[i].ga+prof2[8]-sub > max){
+			max = f[i].a+b[i].ga+prof2[8]-sub;
+	//		fprintf(stderr,"aligned->gap_a:%d + %d +%d = %d\n",f[i].a,b[i].ga,prof1[27],f[i].a+b[i].ga+prof2[27]);
+			transition = 2;
+			c = i;
+		}
+		if(f[i].a+b[i].gb+prof1[8]-sub > max){
+			max = f[i].a+b[i].gb+prof1[8]-sub;
+	//		fprintf(stderr,"aligned->gap_b:%d + %d +%d = %d\n",f[i].a,b[i].gb,prof1[27],f[i].a+b[i].gb+prof1[27]);
+			transition = 3;
+			c = i;
+		}
+		if(f[i].ga+b[i].a+prof2[-14]-sub > max){
+			max = f[i].ga+b[i].a+prof2[-14]-sub;
+	//		fprintf(stderr,"gap_a->aligned:%d + %d + %d(gpo) = %d\n",f[i].ga,b[i].a,prof2[27],f[i].ga+b[i].a+prof2[27]);
+			transition = 5;
+			c = i;
+		}
+
+
+		if(hm->startb == 0){
+			if(f[i].gb+b[i].gb+prof1[10]-sub > max){
+				max = f[i].gb+b[i].gb+prof1[10]-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+				transition = 6;
+				c = i;
+			}
+		}else{
+			if(f[i].gb+b[i].gb+prof1[9]-sub > max){
+				max = f[i].gb+b[i].gb+prof1[9]-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+				transition = 6;
+				c = i;
+			}
+		}
+		if(f[i].gb+b[i].a+prof1[-14]-sub > max){
+			max = f[i].gb+b[i].a+prof1[-14]-sub;
+	//		fprintf(stderr,"gap_b->aligned:%d + %d + %d(gpo) = %d\n",f[i].gb,b[i].a,prof1[27],f[i].gb+b[i].a+prof1[27]);
+			transition = 7;
+			c = i;
+		}
+	}
+	i = hm->endb;
+	sub = abs(middle -i);
+	sub /= 1000; 
+	if(f[i].a+b[i].gb+prof1[8]-sub > max){
+		max = f[i].a+b[i].gb+prof1[8]-sub;
+	//		fprintf(stderr,"aligned->gap_b:%d + %d +%d = %d\n",f[i].a,b[i].gb,prof1[27],f[i].a+b[i].gb+prof1[27]);
+		transition = 3;
+		c = i;
+	}
+	if(hm->endb == hm->len_b){
+		if(f[i].gb+b[i].gb+prof1[10]-sub > max){
+			max = f[i].gb+b[i].gb+prof1[10]-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+			transition = 6;
+			c = i;
+		}	
+	}else{
+		if(f[i].gb+b[i].gb+prof1[9]-sub > max){
+			max = f[i].gb+b[i].gb+prof1[9]-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+			transition = 6;
+			c = i;
+		}
+	}
+	
+	
+	
+	prof1-= (22 * (old_cor[4]+1));
+	prof2 -= (hm->endb *22);
+	
+	//fprintf(stderr,"Transition:%d	at:%d\n",transition,c);
+	
+	j = hirsch_path[0];
+	switch(transition){
+		case 1: //a -> a = 1
+			
+			hirsch_path[old_cor[4]] = c;
+			hirsch_path[old_cor[4]+1] = c+1;
+			
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4],c);
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4]+1,c+1);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = 0.0;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = -FLOATINFTY;
+	//		fprintf(stderr,"Using this for start:%d	%d	%d\n",hm->f[0].a,hm->f[0].ga,hm->f[0].gb);
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_dna_pp_dyn(prof1,prof2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = 0.0;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d  what:%d-%d	%d-%d\n",c+1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_dna_pp_dyn(prof1,prof2,hm,hirsch_path);
+			break;
+		case 2:// a -> ga = 2
+			
+			hirsch_path[old_cor[4]] = c;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4],c);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = 0.0;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = -FLOATINFTY;
+			
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_dna_pp_dyn(prof1,prof2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4];
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = -FLOATINFTY;
+			hm->f[0].ga = 0.0;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d  what:%d-%d	%d-%d\n",c+1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_dna_pp_dyn(prof1,prof2,hm,hirsch_path);
+			break;
+		case 3:// a -> gb = 3
+			
+			hirsch_path[old_cor[4]] = c;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4],c);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = 0.0;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = -FLOATINFTY;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_dna_pp_dyn(prof1,prof2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c;
+			hm->endb = old_cor[3];
+			hm->f[0].a = -FLOATINFTY;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = 0.0;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = hirsch_dna_pp_dyn(prof1,prof2,hm,hirsch_path);
+			break;
+		case 5://ga -> a = 5
+			hirsch_path[old_cor[4]+1] = c+1;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4]+1,c+1);
+
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = -FLOATINFTY;
+			hm->b[0].ga = 0.0;
+			hm->b[0].gb = -FLOATINFTY;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4];
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_dna_pp_dyn(prof1,prof2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = 0.0;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = hirsch_dna_pp_dyn(prof1,prof2,hm,hirsch_path);
+			break;
+		case 6://gb->gb = 6;
+			
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = -FLOATINFTY;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = 0.0;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			hm->startb = old_cor[2];
+			hm->endb = c;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_dna_pp_dyn(prof1,prof2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c;
+			hm->endb = old_cor[3];
+			hm->f[0].a = -FLOATINFTY;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = 0.0;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = hirsch_dna_pp_dyn(prof1,prof2,hm,hirsch_path);
+			break;
+		case 7://gb->a = 7;
+			
+			hirsch_path[old_cor[4]+1] = c+1;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4]+1,c+1);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = -FLOATINFTY;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = 0.0;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			hm->startb = old_cor[2];
+			hm->endb = c;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_dna_pp_dyn(prof1,prof2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = 0.0;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = hirsch_dna_pp_dyn(prof1,prof2,hm,hirsch_path);
+			break;
+	}
+		
+	return hirsch_path;
+}
+
+struct states* foward_hirsch_dna_pp_dyn(const float* prof1,const float* prof2,struct hirsch_mem* hm)
+{
+	struct states* s = hm->f;
+
+	register float pa = 0;
+	register float pga = 0;
+	register float pgb = 0;
+	register float ca = 0;
+	register int i = 0;
+	register int j = 0;
+	
+	
+	
+	prof1 += (hm->starta) * 22;
+	prof2 +=  (hm->startb) * 22;
+	s[hm->startb].a = s[0].a;
+	s[hm->startb].ga = s[0].ga;
+	s[hm->startb].gb = s[0].gb;
+	if(hm->startb == 0){
+		for (j = hm->startb+1; j < hm->endb;j++){
+			prof2+=22;
+			s[j].a = -FLOATINFTY;
+			s[j].ga = MAX(s[j-1].ga,s[j-1].a)+prof2[10];
+			s[j].gb = -FLOATINFTY;
+		}	
+		prof2 += 22;	
+	}else{
+
+		for (j = hm->startb+1; j < hm->endb;j++){
+			prof2+=22;
+			s[j].a = -FLOATINFTY;
+			s[j].ga = MAX(s[j-1].ga+prof2[9],s[j-1].a+prof2[8]);
+			s[j].gb = -FLOATINFTY;
+		}
+		prof2 += 22;
+	}
+	
+	prof2 -= (hm->endb-hm->startb) * 22;
+	
+	s[hm->endb].a = -FLOATINFTY;
+	s[hm->endb].ga = -FLOATINFTY;
+	s[hm->endb].gb = -FLOATINFTY;
+
+
+	for (i = hm->starta;i < hm->enda;i++){
+		prof1 += 22;
+
+		pa = s[hm->startb].a;
+		pga = s[hm->startb].ga;
+		pgb = s[hm->startb].gb;
+		s[hm->startb].a = -FLOATINFTY;
+		s[hm->startb].ga = -FLOATINFTY;
+		if(hm->startb == 0){
+			s[hm->startb].gb = MAX(pgb,pa)+ prof1[10];
+		}else{
+			s[hm->startb].gb = MAX(pgb+prof1[9],pa+prof1[8]);
+		}
+		for (j = hm->startb+1; j < hm->endb;j++){
+			prof2 += 22;
+			ca = s[j].a;
+			pa = MAX3(pa,pga + prof2[-14],pgb + prof1[-14]);
+
+			prof2 += 11;
+
+			pa += prof1[0]*prof2[0];
+			pa += prof1[1]*prof2[1];
+			pa += prof1[2]*prof2[2];
+			pa += prof1[3]*prof2[3];
+			pa += prof1[4]*prof2[4];
+			pa += prof1[5]*prof2[5];
+			pa += prof1[6]*prof2[6];
+			pa += prof1[7]*prof2[7];
+			
+			
+			prof2 -= 11;	
+
+			s[j].a = pa;
+			
+			pga = s[j].ga;
+			
+			s[j].ga = MAX(s[j-1].ga+prof2[9],s[j-1].a+prof2[8]);
+			
+			pgb = s[j].gb;
+
+			s[j].gb = MAX(pgb+prof1[9] ,ca+prof1[8]);
+
+			pa = ca;
+		}
+		prof2 += 22;
+		ca = s[j].a;
+			
+		pa = MAX3(pa,pga + prof2[-14],pgb + prof1[-14]);
+		prof2 += 11;
+
+		pa += prof1[0]*prof2[0];
+		pa += prof1[1]*prof2[1];
+		pa += prof1[2]*prof2[2];
+		pa += prof1[3]*prof2[3];
+		pa += prof1[4]*prof2[4];
+		pa += prof1[5]*prof2[5];
+		pa += prof1[6]*prof2[6];
+		pa += prof1[7]*prof2[7];
+		
+		prof2 -= 11;	
+
+		s[j].a = pa;
+
+		s[j].ga = -FLOATINFTY;
+
+		if (hm->endb != hm->len_b){
+			s[j].gb = MAX(s[j].gb+prof1[9] ,ca+prof1[8]);
+		}else{
+			s[j].gb = MAX(s[j].gb,ca)+ prof1[10];
+		}
+		
+		
+		prof2 -= (hm->endb-hm->startb) * 22;
+		
+	}
+	prof1 -= 22 * (hm->enda);
+	return s;
+}
+
+struct states* backward_hirsch_dna_pp_dyn(const float* prof1,const float* prof2,struct hirsch_mem* hm)
+{
+	struct states* s = hm->b;
+	register float pa = 0;
+	register float pga = 0;
+	register float pgb = 0;
+	register float ca = 0;
+	register int i = 0;
+	register int j = 0;
+
+	prof1 += (hm->enda+1) * 22;
+	prof2 += (hm->endb+1) * 22;
+	s[hm->endb].a = s[0].a;
+	s[hm->endb].ga = s[0].ga;
+	s[hm->endb].gb = s[0].gb;
+	
+	
+	//init of first row;
+	//j = endb-startb;
+	if(hm->endb == hm->len_b){
+		
+		for(j = hm->endb-1;j > hm->startb;j--){
+			prof2 -= 22;
+			s[j].a = -FLOATINFTY;
+			s[j].ga = MAX(s[j+1].ga,s[j+1].a)+prof2[10];
+			s[j].gb = -FLOATINFTY;
+		}
+		prof2 -= 22;
+	}else{
+		for(j = hm->endb-1;j > hm->startb;j--){
+			prof2 -= 22;
+			s[j].a = -FLOATINFTY;
+			s[j].ga = MAX(s[j+1].ga+prof2[9],s[j+1].a+prof2[8]);
+			s[j].gb = -FLOATINFTY;
+		}
+		prof2 -= 22;
+	}
+	
+	s[hm->startb].a = -FLOATINFTY;
+	s[hm->startb].ga = -FLOATINFTY;
+	s[hm->startb].gb = -FLOATINFTY;
+
+	i = hm->enda-hm->starta;
+	while(i--){
+		prof1 -= 22;
+
+		pa = s[hm->endb].a;
+		pga = s[hm->endb].ga;
+		pgb = s[hm->endb].gb;
+		s[hm->endb].a = -FLOATINFTY;
+		s[hm->endb].ga = -FLOATINFTY;
+
+		if(hm->endb == hm->len_b){
+			s[hm->endb].gb = MAX(pgb,pa)+prof1[10];
+		}else{
+			s[hm->endb].gb = MAX(pgb+prof1[9] ,pa+prof1[8]);
+		}
+		//j = endb-startb;
+		prof2 += (hm->endb-hm->startb) *22;
+		//while(j--){
+		for(j = hm->endb-1;j > hm->startb;j--){
+			prof2 -= 22;
+			ca = s[j].a;
+
+			pa = MAX3(pa,pga + prof2[30],pgb + prof1[30]);
+
+			prof2 += 11;
+			pa += prof1[0]*prof2[0];
+			pa += prof1[1]*prof2[1];
+			pa += prof1[2]*prof2[2];
+			pa += prof1[3]*prof2[3];
+			pa += prof1[4]*prof2[4];
+			pa += prof1[5]*prof2[5];
+			pa += prof1[6]*prof2[6];
+			pa += prof1[7]*prof2[7];
+			prof2 -= 11;
+
+			s[j].a = pa;
+			
+			pga = s[j].ga;
+			
+			s[j].ga = MAX(s[j+1].ga+prof2[9], s[j+1].a+prof2[8]);
+			
+			pgb = s[j].gb;
+
+			s[j].gb = MAX(pgb+prof1[9], ca+prof1[8]);
+
+			pa = ca;
+		}
+		prof2 -= 22;
+		ca = s[j].a;
+
+		pa = MAX3(pa,pga + prof2[30],pgb + prof1[30]);
+		
+		prof2 += 11;
+		pa += prof1[0]*prof2[0];
+		pa += prof1[1]*prof2[1];
+		pa += prof1[2]*prof2[2];
+		pa += prof1[3]*prof2[3];
+		pa += prof1[4]*prof2[4];
+		pa += prof1[5]*prof2[5];
+		pa += prof1[6]*prof2[6];
+		pa += prof1[7]*prof2[7];
+		prof2 -= 11;
+
+		s[j].a = pa;
+		
+		//pga = s[j].ga;
+		s[j].ga = -FLOATINFTY;//MAX(s[j+1].ga+prof2[28], s[j+1].a+prof2[27]);
+
+		//pgb = s[j].gb;
+		if(hm->startb){
+			s[j].gb = MAX(s[j].gb+prof1[9], ca+prof1[8]);
+		}else{
+			s[j].gb = MAX(s[j].gb,ca)+prof1[10];
+		}
+	}		
+	return s;
+}

Added: trunk/packages/kalign/branches/upstream/current/kalign2_hirschberg_dna.h
===================================================================
--- trunk/packages/kalign/branches/upstream/current/kalign2_hirschberg_dna.h	2006-11-19 13:38:57 UTC (rev 159)
+++ trunk/packages/kalign/branches/upstream/current/kalign2_hirschberg_dna.h	2006-11-29 14:12:29 UTC (rev 160)
@@ -0,0 +1,39 @@
+/*
+	kalign2_hirschberg_dna.h
+	
+	Released under GPL - see the 'COPYING' file   
+	
+	Copyright (C) 2006 Timo Lassmann <timolassmann at gmail.com>
+	
+	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
+	any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+    
+	Please send bug reports, comments etc. to:
+	timolassmann at gmail.com
+*/
+
+int* hirsch_dna_ss_dyn(float**subm, const int* seq1,const int* seq2,struct hirsch_mem* hm, int* hirsch_path);
+int* hirsch_align_two_dna_ss_vector(float**subm,const int* seq1,const int* seq2,struct hirsch_mem* hm,int* hirsch_path,float input_states[],int old_cor[]);
+struct states* foward_hirsch_dna_ss_dyn(float**subm,const int* seq1,const int* seq2,struct hirsch_mem* hm);
+struct states* backward_hirsch_dna_ss_dyn(float**subm,const int* seq1,const int* seq2,struct hirsch_mem* hm);
+
+int* hirsch_dna_ps_dyn(const float* prof1,const int* seq2,struct hirsch_mem* hm, int* hirsch_path,int sip);
+int* hirsch_align_two_dna_ps_vector(const float* prof1,const int* seq2,struct hirsch_mem* hm,int* hirsch_path,float input_states[],int old_cor[],int sip);
+struct states* foward_hirsch_dna_ps_dyn(const float* prof1,const int* seq2,struct hirsch_mem* hm,int sip);
+struct states* backward_hirsch_dna_ps_dyn(const float* prof1,const int* seq2,struct hirsch_mem* hm,int sip);
+
+int* hirsch_dna_pp_dyn(const float* prof1,const float* prof2,struct hirsch_mem* hm, int* hirsch_path);
+int* hirsch_align_two_dna_pp_vector(const float* prof1,const float* prof2,struct hirsch_mem* hm,int* hirsch_path,float input_states[],int old_cor[]);
+struct states* foward_hirsch_dna_pp_dyn(const float* prof1,const float* prof2,struct hirsch_mem* hm);
+struct states* backward_hirsch_dna_pp_dyn(const float* prof1,const float* prof2,struct hirsch_mem* hm);

Added: trunk/packages/kalign/branches/upstream/current/kalign2_hirschberg_large.c
===================================================================
--- trunk/packages/kalign/branches/upstream/current/kalign2_hirschberg_large.c	2006-11-19 13:38:57 UTC (rev 159)
+++ trunk/packages/kalign/branches/upstream/current/kalign2_hirschberg_large.c	2006-11-29 14:12:29 UTC (rev 160)
@@ -0,0 +1,2508 @@
+/*
+	kalign2_hirschberg_large.c
+	
+	Released under GPL - see the 'COPYING' file   
+	
+	Copyright (C) 2006 Timo Lassmann <timolassmann at gmail.com>
+	
+	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
+	any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+    
+	Please send bug reports, comments etc. to:
+	timolassmann at gmail.com
+*/
+
+#include "kalign2.h"
+#include "kalign2_hirschberg_large.h"
+#define MAX(a, b) (a > b ? a : b)
+#define MAX3(a,b,c) MAX(MAX(a,b),c)
+//#include <emmintrin.h>
+
+float local_gpo;
+float local_gpe;
+float local_tgpe;
+
+int** hirschberg_large_alignment(struct alignment* aln,int* tree,float**submatrix, int** map,int window,float strength)
+{
+	struct hirsch_large_mem* hm = 0;
+	int i,j,g,a,b,c;
+	int len_a;
+	int len_b;
+	
+
+	
+	float** profile = 0;
+	
+	float** subm = 0;
+	subm = malloc(sizeof(float*)*32);
+	for(i = 0; i < 32;i++){
+		subm[i] = malloc(sizeof(float)*32);
+		for (j = 0; j < 32;j++){
+			subm[i][j] = (float)submatrix[i][j];
+		}
+	}
+	local_gpo = (float)gpo;
+	local_gpe = (float)gpe;
+	local_tgpe = (float)tgpe;
+	
+
+	profile = malloc(sizeof(float*)*numprofiles);
+	for ( i = 0;i< numprofiles;i++){
+		profile[i] = 0;
+	}
+
+	map = malloc(sizeof(int*)*numprofiles);
+	for ( i = 0;i < numprofiles;i++){
+		map[i] = 0;
+	}
+	
+	hm = hirsch_large_mem_alloc(hm,1024);
+
+	fprintf(stderr,"\nAlignment:\n");
+
+	for (i = 0; i < (numseq-1);i++){
+		a = tree[i*3];
+		b = tree[i*3+1];
+		c = tree[i*3+2];
+		fprintf(stderr,"\r%8.0f percent done",(float)(i) /(float)numseq * 100);
+		//fprintf(stderr,"Aligning:%d %d->%d	done:%f\n",a,b,c,((float)(i+1)/(float)numseq)*100);
+		len_a = aln->sl[a];
+		len_b = aln->sl[b];
+
+		
+		g = (len_a > len_b)? len_a:len_b;
+		map[c] = malloc(sizeof(int) * (g+2));
+		if(g > hm->size){
+			hm = hirsch_large_mem_realloc(hm,g);
+		}
+
+		for (j = 0; j < (g+2);j++){
+			map[c][j] = -1;
+		}
+
+		if (a < numseq){
+			profile[a] = make_large_profile(profile[a],aln->s[a],len_a,subm);
+		}else{
+			set_large_gap_penalties(profile[a],len_a,aln->nsip[b]);
+		}
+		if (b < numseq){
+			profile[b] = make_large_profile(profile[b],aln->s[b],len_b,subm);
+		}else{		
+			set_large_gap_penalties(profile[b],len_b,aln->nsip[a]);
+		}
+		
+		hm->starta = 0;
+		hm->startb = 0;
+		hm->enda = len_a;
+		hm->endb = len_b;
+		hm->len_a = len_a;
+		hm->len_b = len_b;
+		
+		hm->f[0].a = 0.0;
+		hm->f[0].ga =  -FLOATINFTY;
+		hm->f[0].gb = -FLOATINFTY;
+		hm->b[0].a = 0.0;
+		hm->b[0].ga =  -FLOATINFTY;
+		hm->b[0].gb =  -FLOATINFTY;
+	//	fprintf(stderr,"LENA:%d	LENB:%d	numseq:%d\n",len_a,len_b,numseq);
+		if(a < numseq){
+			if(b < numseq){
+				map[c] = hirsch_large_ss_dyn(subm,aln->s[a],aln->s[b],hm,map[c]);
+			}else{
+				hm->enda = len_b;
+				hm->endb = len_a;
+				hm->len_a = len_b;
+				hm->len_b = len_a;
+				map[c] = hirsch_large_ps_dyn(profile[b],aln->s[a],hm,map[c],aln->nsip[b]);
+				map[c] = mirror_hirsch_path(map[c],len_a,len_b);
+			}
+		}else{
+			if(b < numseq){
+				map[c] = hirsch_large_ps_dyn(profile[a],aln->s[b],hm,map[c],aln->nsip[a]);
+			}else{
+				if(len_a < len_b){
+					map[c] = hirsch_large_pp_dyn(profile[a],profile[b],hm,map[c]);
+				}else{
+					hm->enda = len_b;
+					hm->endb = len_a;
+					hm->len_a = len_b;
+					hm->len_b = len_a;
+					map[c] = hirsch_large_pp_dyn(profile[b],profile[a],hm,map[c]);
+					map[c] = mirror_hirsch_path(map[c],len_a,len_b);
+				}
+			}
+		}
+		
+		map[c] = add_gap_info_to_hirsch_path(map[c],len_a,len_b);
+
+		if(i != numseq-2){
+			profile[c] = malloc(sizeof(float)*64*(map[c][0]+2));
+			profile[c] = large_update(profile[a],profile[b],profile[c],map[c],aln->nsip[a],aln->nsip[b]);
+		}
+			
+		aln->sl[c] = map[c][0];
+	
+		aln->nsip[c] = aln->nsip[a] + aln->nsip[b];
+		aln->sip[c] = malloc(sizeof(int)*(aln->nsip[a] + aln->nsip[b]));
+		g =0;
+		for (j = aln->nsip[a];j--;){
+			aln->sip[c][g] = aln->sip[a][j];
+			g++;
+		}
+		for (j = aln->nsip[b];j--;){
+			aln->sip[c][g] = aln->sip[b][j];
+			g++;
+		}
+
+		free(profile[a]);
+		free(profile[b]);
+	}
+	fprintf(stderr,"\r%8.0f percent done\n",100.0);
+	free(profile);
+	hirsch_large_mem_free(hm);
+	for (i = 32;i--;){
+		free(subm[i]);
+		free(submatrix[i]);
+	}
+	free(subm);
+	free(submatrix);
+	return map;
+}
+
+
+int* hirsch_large_ss_dyn(float**subm, const int* seq1,const int* seq2,struct hirsch_large_mem* hm, int* hirsch_path)
+{
+	int mid = ((hm->enda - hm->starta) / 2)+ hm->starta;
+	float input_states[6] = {hm->f[0].a,hm->f[0].ga,hm->f[0].gb,hm->b[0].a,hm->b[0].ga,hm->b[0].gb};
+	int old_cor[5] = {hm->starta,hm->enda,hm->startb,hm->endb,mid};
+
+	if(hm->starta  >= hm->enda){
+		return hirsch_path;
+	}
+	if(hm->startb  >= hm->endb){
+		return hirsch_path;
+	}
+
+
+	hm->enda = mid;
+
+	//fprintf(stderr,"Forward:%d-%d	%d-%d\n",hm->starta,hm->enda,hm->startb,hm->endb);
+	hm->f = foward_large_hirsch_ss_dyn(subm,seq1,seq2,hm);
+
+	hm->starta = mid;
+	hm->enda = old_cor[1];
+	//fprintf(stderr,"Backward:%d-%d	%d-%d\n",hm->starta,hm->enda,hm->startb,hm->endb);
+	hm->b = backward_large_hirsch_ss_dyn(subm,seq1,seq2,hm);
+
+
+	hirsch_path = hirsch_large_align_two_ss_vector(subm,seq1,seq2,hm,hirsch_path,input_states,old_cor);
+	return hirsch_path;
+}
+
+int* hirsch_large_align_two_ss_vector(float**subm,const int* seq1,const int* seq2,struct hirsch_large_mem* hm,int* hirsch_path,float input_states[],int old_cor[])
+{
+	struct large_states* f = hm->f;
+ 	struct large_states* b = hm->b;
+	int i,j,c;
+	int transition = -1;
+	
+	
+	//code:
+	// a -> a = 1
+	// a -> ga = 2
+	// a -> gb = 3
+	// ga ->ga = 4
+	// ga -> a = 5
+	//gb->gb = 6;
+	//gb->a = 7;
+	
+	//int max = -FLOATINFTY;
+	float max = -FLOATINFTY;	
+	//float middle =  (hm->endb - hm->startb)/2 + hm->startb;
+	float middle =  (old_cor[3] - old_cor[2])/2 + old_cor[2];
+	float sub = 0.0;
+	
+	//i = hm->startb;
+	i = old_cor[2];
+	c = -1;
+	//for(i = hm->startb; i < hm->endb;i++){
+	for(i = old_cor[2]; i < old_cor[3];i++){
+	
+		sub = abs(middle -i);
+		sub /= 1000; 
+	//	fprintf(stderr,"%d-%d	%f\n",hm->startb,hm->endb,sub);
+		if(f[i].a+b[i].a-sub > max){
+			max = f[i].a+b[i].a-sub;
+	//		fprintf(stderr,"aligned->aligned:%d + %d = %d\n",f[i].a,b[i].a,f[i].a+b[i].a);
+			transition = 1;
+			c = i;
+		}
+		if(f[i].a+b[i].ga-local_gpo-sub > max){
+			max = f[i].a+b[i].ga-local_gpo-sub;
+	//		fprintf(stderr,"aligned->gap_a:%d + %d +%d = %d\n",f[i].a,b[i].ga,prof1[27],f[i].a+b[i].ga+prof2[27]);
+			transition = 2;
+			c = i;
+		}
+		if(f[i].a+b[i].gb -local_gpo -sub > max){
+			max = f[i].a+b[i].gb - local_gpo-sub;
+	//		fprintf(stderr,"aligned->gap_b:%d + %d +%d = %d\n",f[i].a,b[i].gb,prof1[27],f[i].a+b[i].gb+prof1[27]);
+			transition = 3;
+			c = i;
+		}
+		if(f[i].ga+b[i].a - local_gpo-sub > max){
+			max = f[i].ga+b[i].a - local_gpo-sub;
+	//		fprintf(stderr,"gap_a->aligned:%d + %d + %d(local_gpo) = %d\n",f[i].ga,b[i].a,prof2[27],f[i].ga+b[i].a+prof2[27]);
+			transition = 5;
+			c = i;
+		}
+
+
+		if(hm->startb == 0){
+			if(f[i].gb+b[i].gb - local_tgpe-sub > max){
+				max = f[i].gb+b[i].gb -local_tgpe-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+				transition = 6;
+				c = i;
+			}
+		}else{
+			if(f[i].gb+b[i].gb - local_gpe -sub> max){
+				max = f[i].gb+b[i].gb - local_gpe-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+				transition = 6;
+				c = i;
+			}
+		}
+		if(f[i].gb+b[i].a - local_gpo-sub > max){
+			max = f[i].gb+b[i].a - local_gpo-sub;
+	//		fprintf(stderr,"gap_b->aligned:%d + %d + %d(local_gpo) = %d\n",f[i].gb,b[i].a,prof1[27],f[i].gb+b[i].a+prof1[27]);
+			transition = 7;
+			c = i;
+		}
+	}
+	//i = hm->endb;
+	i = old_cor[3];
+	sub = abs(middle -i);
+	sub /= 1000; 
+	
+	if(f[i].a+b[i].gb-local_gpo-sub > max){
+		max = f[i].a+b[i].gb - local_gpo-sub;
+	//		fprintf(stderr,"aligned->gap_b:%d + %d +%d = %d\n",f[i].a,b[i].gb,prof1[27],f[i].a+b[i].gb+prof1[27]);
+		transition = 3;
+		c = i;
+	}
+	if(hm->endb == hm->len_b){
+		if(f[i].gb+b[i].gb -local_tgpe-sub > max){
+			max = f[i].gb+b[i].gb - local_tgpe-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+			transition = 6;
+			c = i;
+		}	
+	}else{
+		if(f[i].gb+b[i].gb - gpe-sub > max){
+			max = f[i].gb+b[i].gb - gpe-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(local_gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+			transition = 6;
+			c = i;
+		}
+	}
+	
+	
+	//fprintf(stderr,"Transition:%d	at:%d\n",transition,c);
+	
+	j = hirsch_path[0];
+	switch(transition){
+		case 1: //a -> a = 1
+			
+			hirsch_path[old_cor[4]] = c;
+			hirsch_path[old_cor[4]+1] = c+1;
+			
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4],c);
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4]+1,c+1);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = 0;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = -FLOATINFTY;
+	//		fprintf(stderr,"Using this for start:%d	%d	%d\n",hm->f[0].a,hm->f[0].ga,hm->f[0].gb);
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_large_ss_dyn(subm,seq1,seq2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = 0;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d  what:%d-%d	%d-%d\n",c+1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_large_ss_dyn(subm,seq1,seq2,hm,hirsch_path);
+			break;
+		case 2:// a -> ga = 2
+			
+			hirsch_path[old_cor[4]] = c;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4],c);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = 0;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = -FLOATINFTY;
+			
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_large_ss_dyn(subm,seq1,seq2,hm,hirsch_path);
+			
+
+			//backward:
+			hm->starta = old_cor[4];
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = -FLOATINFTY;
+			hm->f[0].ga = 0;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d  what:%d-%d	%d-%d\n",c+1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_large_ss_dyn(subm,seq1,seq2,hm,hirsch_path);
+			break;
+		case 3:// a -> gb = 3
+			
+			hirsch_path[old_cor[4]] = c;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4],c);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = 0;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = -FLOATINFTY;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_large_ss_dyn(subm,seq1,seq2,hm,hirsch_path);
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c;
+			hm->endb = old_cor[3];
+			hm->f[0].a = -FLOATINFTY;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = 0;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = hirsch_large_ss_dyn(subm,seq1,seq2,hm,hirsch_path);
+			break;
+		case 5://ga -> a = 5
+			hirsch_path[old_cor[4]+1] = c+1;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4]+1,c+1);
+
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = -FLOATINFTY;
+			hm->b[0].ga = 0;
+			hm->b[0].gb = -FLOATINFTY;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4];
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_large_ss_dyn(subm,seq1,seq2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = 0;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = hirsch_large_ss_dyn(subm,seq1,seq2,hm,hirsch_path);
+			break;
+		case 6://gb->gb = 6;
+			
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = -FLOATINFTY;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = 0;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			hm->startb = old_cor[2];
+			hm->endb = c;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_large_ss_dyn(subm,seq1,seq2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c;
+			hm->endb = old_cor[3];
+			hm->f[0].a = -FLOATINFTY;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = 0;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = hirsch_large_ss_dyn(subm,seq1,seq2,hm,hirsch_path);
+			break;
+		case 7://gb->a = 7;
+			
+			hirsch_path[old_cor[4]+1] = c+1;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4]+1,c+1);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = -FLOATINFTY;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = 0;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			hm->startb = old_cor[2];
+			hm->endb = c;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_large_ss_dyn(subm,seq1,seq2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = 0;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = hirsch_large_ss_dyn(subm,seq1,seq2,hm,hirsch_path);
+			break;
+	}
+		
+	return hirsch_path;
+}
+
+
+
+struct large_states* foward_large_hirsch_ss_dyn(float**subm,const int* seq1,const int* seq2,struct hirsch_large_mem* hm)
+{
+	struct large_states* s = hm->f;
+	float *subp = 0;
+	const int starta = hm->starta;
+	const int enda = hm->enda;
+	const int startb = hm->startb;
+	const int endb = hm->endb;
+	
+	register float pa = 0;
+	register float pga = 0;
+	register float pgb = 0;
+	register float ca = 0;
+	register int i = 0;
+	register int j = 0;
+	
+
+	s[startb].a = s[0].a;
+	s[startb].ga = s[0].ga;
+	s[startb].gb = s[0].gb;
+	if(startb == 0){
+		for (j = startb+1; j < endb;j++){
+
+			s[j].a = -FLOATINFTY;
+			
+			//s[j].ga = s[j-1].a-local_tgpe;
+			//if (s[j-1].ga-local_tgpe > s[j].ga){
+			//	s[j].ga = s[j-1].ga-local_tgpe;
+			//}
+			//if(s[j-1].ga > s[j-1].a){
+			//	s[j].ga = s[j-1].ga-local_tgpe;
+			//}else{
+			//	s[j].ga = s[j-1].a-local_tgpe;
+			//}
+			s[j].ga = MAX(s[j-1].ga,s[j-1].a)-local_tgpe;
+			
+			s[j].gb = -FLOATINFTY;
+		}		
+	}else{
+
+		for (j = startb+1; j < endb;j++){
+			s[j].a = -FLOATINFTY;
+			
+			//s[j].ga = s[j-1].a-local_gpo;
+			//if (s[j-1].ga - gpe > s[j].ga){
+			//	s[j].ga = s[j-1].ga-gpe;
+			//}
+			//if(s[j-1].ga - gpe >s[j-1].a-local_gpo){
+			//	s[j].ga = s[j-1].ga-gpe;
+			//}else{
+			//	s[j].ga = s[j-1].a-local_gpo;
+			//}
+			s[j].ga = MAX(s[j-1].ga - local_gpe,s[j-1].a-local_gpo);
+			
+			s[j].gb = -FLOATINFTY;
+		}
+	}
+	s[endb].a = -FLOATINFTY;
+	s[endb].ga = -FLOATINFTY;
+	s[endb].gb = -FLOATINFTY;
+
+	seq2--;
+	for (i = starta;i < enda;i++){
+		subp = subm[seq1[i]];
+
+		pa = s[startb].a;
+		pga = s[startb].ga;
+		pgb = s[startb].gb;
+		if(startb == 0){
+			s[startb].a = -FLOATINFTY;
+			s[startb].ga = -FLOATINFTY;
+		
+			//s[startb].gb = pa-local_tgpe;
+			//if(pgb - local_tgpe > s[startb].gb){
+			//	s[startb].gb = pgb-local_tgpe;
+			//}
+			//if(pgb > pa){
+			//	s[startb].gb = pgb-local_tgpe;
+			//}else{
+			//	s[startb].gb = pa-local_tgpe;
+			//}
+			s[startb].gb = MAX(pgb,pa) - local_tgpe;
+		}else{
+			s[startb].a = -FLOATINFTY;
+			s[startb].ga = -FLOATINFTY;
+		
+			//s[startb].gb = pa-local_gpo;
+			//if(pgb -gpe > s[startb].gb){
+			//	s[startb].gb = pgb -gpe;
+			//}
+			//if(pgb - gpe > pa - local_gpo){
+			//	s[startb].gb = pgb - gpe;
+			//}else{
+			//	s[startb].gb = pa - local_gpo;
+			//}
+			s[startb].gb = MAX(pgb - local_gpe,pa - local_gpo);
+			
+		}
+		for (j = startb+1; j <= endb;j++){
+			ca = s[j].a;
+			//if((pga -= local_gpo) > pa){
+			//	pa = pga;
+			//}
+			//if((pgb -= local_gpo) > pa){
+			//	pa = pgb;
+			//}
+			pa = MAX3(pa,pga-local_gpo,pgb-local_gpo);
+			
+			pa += subp[seq2[j]];
+			
+			s[j].a = pa;
+			
+			pga = s[j].ga;
+			
+			//s[j].ga = s[j-1].a-local_gpo;
+			//if (s[j-1].ga-gpe > s[j].ga){
+			//	s[j].ga = s[j-1].ga-gpe;
+			//}
+			
+			//if(s[j-1].ga-gpe >s[j-1].a-local_gpo){
+			//	s[j].ga = s[j-1].ga-gpe;
+			//}else{
+			//	s[j].ga = s[j-1].a-local_gpo;
+			//}
+			s[j].ga = MAX(s[j-1].ga-local_gpe,s[j-1].a-local_gpo);
+			
+			pgb = s[j].gb;
+			
+			//s[j].gb = ca-local_gpo;
+			//if(pgb-gpe > s[j].gb){
+			//	s[j].gb = pgb-gpe;
+			//}
+			
+			//if(pgb-gpe >  ca-local_gpo){
+			//	s[j].gb = pgb-gpe;
+			//}else{
+			//	s[j].gb = ca-local_gpo;
+			//}
+			s[j].gb = MAX(pgb-local_gpe ,ca-local_gpo);
+			
+			pa = ca;
+		}
+	}
+	return s;
+}
+
+struct large_states* backward_large_hirsch_ss_dyn(float**subm,const int* seq1,const int* seq2,struct hirsch_large_mem* hm)
+{
+
+	struct large_states* s = hm->b;
+	float *subp = 0;
+	const int starta = hm->starta;
+	const int enda = hm->enda;
+	const int startb = hm->startb;
+	const int endb = hm->endb;
+	register float pa = 0;
+	register float pga = 0;
+	register float pgb = 0;
+	register float ca = 0;
+	register int i = 0;
+	register int j = 0;
+
+	s[endb].a = s[0].a ;
+	s[endb].ga = s[0].ga;
+	s[endb].gb = s[0].gb;
+	
+	
+	//init of first row;
+	
+	//j = endb-startb;
+	if(endb == hm->len_b){
+		for(j = endb-1;j > startb;j--){
+			s[j].a = -FLOATINFTY;
+			
+			//s[j].ga = s[j+1].a-local_tgpe;
+			//if (s[j+1].ga-local_tgpe > s[j].ga){
+			//	s[j].ga = s[j+1].ga-local_tgpe;
+			//}
+			//if(s[j+1].ga > s[j+1].a){
+			//	s[j].ga = s[j+1].ga-local_tgpe;
+			//}else{
+			//	s[j].ga = s[j+1].a-local_tgpe;
+			//}
+			s[j].ga = MAX(s[j+1].ga,s[j+1].a)-local_tgpe;
+			
+			s[j].gb = -FLOATINFTY;
+		}
+	}else{
+		for(j = endb-1;j > startb;j--){
+			s[j].a = -FLOATINFTY;
+			
+			//s[j].ga = s[j+1].a-local_gpo;
+			//if (s[j+1].ga-gpe > s[j].ga){
+			//	s[j].ga = s[j+1].ga-gpe;
+			//}
+			//if(s[j+1].ga-gpe > s[j+1].a-local_gpo){
+			//	s[j].ga = s[j+1].ga-gpe;
+			//}else{
+			//	s[j].ga = s[j+1].a-local_gpo;
+			//}
+			s[j].ga = MAX(s[j+1].ga-local_gpe,s[j+1].a-local_gpo);
+			
+			s[j].gb = -FLOATINFTY;
+		}
+	}
+
+	
+	s[startb].a = -FLOATINFTY;
+	s[startb].ga = -FLOATINFTY;
+	s[startb].gb = -FLOATINFTY;
+
+	i = enda-starta;
+	seq1+= starta;
+	while(i--){
+		subp = subm[seq1[i]];
+		pa = s[endb].a;
+		pga = s[endb].ga;
+		pgb = s[endb].gb;
+		s[endb].a = -FLOATINFTY;
+		s[endb].ga = -FLOATINFTY;
+
+		if(endb == hm->len_b){
+			//s[endb].gb = pa-local_tgpe;
+			//if(pgb-local_tgpe > s[endb].gb){
+			//	s[endb].gb = pgb-local_tgpe;
+			//}
+			//if(pgb > pa){
+			//	s[endb].gb = pgb-local_tgpe;
+			//}else{
+			//	s[endb].gb = pa-local_tgpe;
+			//}
+			s[endb].gb = MAX(pgb,pa)-local_tgpe;
+			
+			
+		}else{
+			//s[endb].gb = pa-local_gpo;
+			//if(pgb-gpe > s[endb].gb){
+			//	s[endb].gb = pgb-gpe;
+			//}
+			//if(pgb-gpe  > pa-local_gpo){
+			//	s[endb].gb = pgb-gpe;
+			//}else{
+			//	s[endb].gb = pa-local_gpo;
+			//}
+			s[endb].gb = MAX(pgb-local_gpe,pa-local_gpo);
+			
+		}
+
+		for(j = endb-1;j >= startb;j--){
+
+			ca = s[j].a;
+			//if((pga -= local_gpo) > pa){
+			//	pa = pga;
+			//}
+			//if((pgb -= local_gpo) > pa){
+			//	pa = pgb;
+			//}
+			pa = MAX3(pa,pga - local_gpo,pgb-local_gpo);
+			
+			pa += subp[seq2[j]];
+
+			s[j].a = pa;
+			
+			pga = s[j].ga;
+			
+			//s[j].ga = s[j+1].a-local_gpo;
+			//if (s[j+1].ga-gpe > s[j].ga){
+			//	s[j].ga = s[j+1].ga-gpe;
+			//}
+			
+			
+			//if(s[j+1].ga-gpe >s[j+1].a-local_gpo){
+			//	s[j].ga = s[j+1].ga-gpe;
+			//}else{
+			//	s[j].ga = s[j+1].a-local_gpo;
+			//}
+			s[j].ga = MAX(s[j+1].ga-local_gpe,s[j+1].a-local_gpo);
+			
+			pgb = s[j].gb;
+			
+			//s[j].gb = ca-local_gpo;
+			//if(pgb-gpe > s[j].gb){
+			//	s[j].gb = pgb-gpe;
+			//}
+			//if(pgb-gpe >  ca-local_gpo){
+			//	s[j].gb = pgb-gpe;
+			//}else{
+			//	s[j].gb = ca-local_gpo;
+			//}
+			s[j].gb = MAX(pgb-local_gpe,ca-local_gpo);
+			
+			pa = ca;
+		}
+	}		
+	return s;
+}
+
+
+int* hirsch_large_ps_dyn(const float* prof1,const int* seq2,struct hirsch_large_mem* hm, int* hirsch_path,int sip)
+{
+	int mid = ((hm->enda - hm->starta) / 2)+ hm->starta;
+	float input_states[6] = {hm->f[0].a,hm->f[0].ga,hm->f[0].gb,hm->b[0].a,hm->b[0].ga,hm->b[0].gb};
+	int old_cor[5] = {hm->starta,hm->enda,hm->startb,hm->endb,mid};
+
+
+	if(hm->starta  >= hm->enda){
+		return hirsch_path;
+	}
+	if(hm->startb  >= hm->endb){
+		return hirsch_path;
+	}
+
+	hm->enda = mid;
+	hm->f = foward_large_hirsch_ps_dyn(prof1,seq2,hm,sip);
+	
+	/*int i;
+	fprintf(stderr,"FOWARD\n");
+	for (i = hm->startb; i <= hm->endb;i++){
+		fprintf(stderr,"%d	%d	%d\n",hm->f[i].a,hm->f[i].ga,hm->f[i].gb);
+	}*/
+
+	hm->starta = mid;
+	hm->enda = old_cor[1];
+	hm->b = backward_large_hirsch_ps_dyn(prof1,seq2,hm,sip);
+	
+	/*fprintf(stderr,"BaCKWARD\n");
+	for (i = hm->startb; i <= hm->endb;i++){
+		fprintf(stderr,"%d	%d	%d\n",hm->b[i].a,hm->b[i].ga,hm->b[i].gb);
+	}*/
+
+	hirsch_path = hirsch_large_align_two_ps_vector(prof1,seq2,hm,hirsch_path,input_states,old_cor,sip);
+	return hirsch_path;
+}
+
+
+
+int* hirsch_large_align_two_ps_vector(const float* prof1,const int* seq2,struct hirsch_large_mem* hm,int* hirsch_path,float input_states[],int old_cor[],int sip)
+{
+	struct large_states* f = hm->f;
+ 	struct large_states* b = hm->b;
+	int i,j,c;
+	int transition = -1;
+	
+	const float open = local_gpo * sip;
+	
+	
+	//code:
+	// a -> a = 1
+	// a -> ga = 2
+	// a -> gb = 3
+	// ga ->ga = 4
+	// ga -> a = 5
+	//gb->gb = 6;
+	//gb->a = 7;
+	
+	//int max = -FLOATINFTY;
+	float max = -FLOATINFTY;	
+	//float middle =  (hm->endb - hm->startb)/2 + hm->startb;
+	float middle =  (old_cor[3] - old_cor[2])/2 + old_cor[2];
+	float sub = 0.0;
+	
+	
+	prof1+= ((old_cor[4]+1)<<6);
+	
+	//i = hm->startb;
+	i = old_cor[2];
+	c = -1;
+	//for(i = hm->startb; i < hm->endb;i++){
+	for(i = old_cor[2]; i < old_cor[3];i++){
+		sub = abs(middle -i);
+		sub /= 1000;		
+		if(f[i].a+b[i].a-sub> max){
+			max = f[i].a+b[i].a-sub;
+	//		fprintf(stderr,"aligned->aligned:%d + %d = %d\n",f[i].a,b[i].a,f[i].a+b[i].a);
+			transition = 1;
+			c = i;
+		}
+		if(f[i].a+b[i].ga-open-sub > max){
+			max = f[i].a+b[i].ga-open-sub;
+	//		fprintf(stderr,"aligned->gap_a:%d + %d +%d = %d\n",f[i].a,b[i].ga,prof1[27],f[i].a+b[i].ga+prof2[27]);
+			transition = 2;
+			c = i;
+		}
+		if(f[i].a+b[i].gb+prof1[27]-sub > max){
+			max = f[i].a+b[i].gb+prof1[27]-sub;
+	//		fprintf(stderr,"aligned->gap_b:%d + %d +%d = %d\n",f[i].a,b[i].gb,prof1[27],f[i].a+b[i].gb+prof1[27]);
+			transition = 3;
+			c = i;
+		}
+		if(f[i].ga+b[i].a-open-sub > max){
+			max = f[i].ga+b[i].a-open-sub;
+	//		fprintf(stderr,"gap_a->aligned:%d + %d + %d(local_gpo) = %d\n",f[i].ga,b[i].a,prof2[27],f[i].ga+b[i].a+prof2[27]);
+			transition = 5;
+			c = i;
+		}
+
+
+		if(hm->startb == 0){
+			if(f[i].gb+b[i].gb+prof1[29]-sub > max){
+				max = f[i].gb+b[i].gb+prof1[29]-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+				transition = 6;
+				c = i;
+			}
+		}else{
+			if(f[i].gb+b[i].gb+prof1[28]-sub > max){
+				max = f[i].gb+b[i].gb+prof1[28]-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+				transition = 6;
+				c = i;
+			}
+		}
+		if(f[i].gb+b[i].a+prof1[27]-sub > max){
+			max = f[i].gb+b[i].a+prof1[27]-sub;
+	//		fprintf(stderr,"gap_b->aligned:%d + %d + %d(local_gpo) = %d\n",f[i].gb,b[i].a,prof1[27],f[i].gb+b[i].a+prof1[27]);
+			transition = 7;
+			c = i;
+		}
+	}
+	//i = hm->endb;
+	i = old_cor[3];
+	
+	sub = abs(middle -i);
+	sub /= 1000; 
+	if(f[i].a+b[i].gb+prof1[27]-sub > max){
+		max = f[i].a+b[i].gb+prof1[27]-sub;
+	//		fprintf(stderr,"aligned->gap_b:%d + %d +%d = %d\n",f[i].a,b[i].gb,prof1[27],f[i].a+b[i].gb+prof1[27]);
+		transition = 3;
+		c = i;
+	}
+	if(hm->endb == hm->len_b){
+		if(f[i].gb+b[i].gb+prof1[29]-sub > max){
+			max = f[i].gb+b[i].gb+prof1[29]-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+			transition = 6;
+			c = i;
+		}	
+	}else{
+		if(f[i].gb+b[i].gb+prof1[28]-sub > max){
+			max = f[i].gb+b[i].gb+prof1[28]-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+			transition = 6;
+			c = i;
+		}
+	}
+	
+	
+	
+	prof1-= ((old_cor[4]+1)<<6);
+	
+	//fprintf(stderr,"Transition:%d	at:%d\n",transition,c);
+	
+	j = hirsch_path[0];
+	switch(transition){
+		case 1: //a -> a = 1
+			
+			hirsch_path[old_cor[4]] = c;
+			hirsch_path[old_cor[4]+1] = c+1;
+			
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4],c);
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4]+1,c+1);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = 0;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = -FLOATINFTY;
+	//		fprintf(stderr,"Using this for start:%d	%d	%d\n",hm->f[0].a,hm->f[0].ga,hm->f[0].gb);
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_large_ps_dyn(prof1,seq2,hm,hirsch_path,sip);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = 0;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d  what:%d-%d	%d-%d\n",c+1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_large_ps_dyn(prof1,seq2,hm,hirsch_path,sip);
+			break;
+		case 2:// a -> ga = 2
+			
+			hirsch_path[old_cor[4]] = c;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4],c);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = 0;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = -FLOATINFTY;
+			
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_large_ps_dyn(prof1,seq2,hm,hirsch_path,sip);
+
+			//backward:
+			hm->starta = old_cor[4];
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = -FLOATINFTY;
+			hm->f[0].ga = 0;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d  what:%d-%d	%d-%d\n",c+1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_large_ps_dyn(prof1,seq2,hm,hirsch_path,sip);
+			break;
+		case 3:// a -> gb = 3
+			
+			hirsch_path[old_cor[4]] = c;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4],c);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = 0;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = -FLOATINFTY;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_large_ps_dyn(prof1,seq2,hm,hirsch_path,sip);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c;
+			hm->endb = old_cor[3];
+			hm->f[0].a = -FLOATINFTY;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = 0;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = hirsch_large_ps_dyn(prof1,seq2,hm,hirsch_path,sip);
+			break;
+		case 5://ga -> a = 5
+			hirsch_path[old_cor[4]+1] = c+1;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4]+1,c+1);
+
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = -FLOATINFTY;
+			hm->b[0].ga = 0;
+			hm->b[0].gb = -FLOATINFTY;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4];
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_large_ps_dyn(prof1,seq2,hm,hirsch_path,sip);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = 0;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = hirsch_large_ps_dyn(prof1,seq2,hm,hirsch_path,sip);
+			break;
+		case 6://gb->gb = 6;
+			
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = -FLOATINFTY;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = 0;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			hm->startb = old_cor[2];
+			hm->endb = c;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_large_ps_dyn(prof1,seq2,hm,hirsch_path,sip);			
+
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c;
+			hm->endb = old_cor[3];
+			hm->f[0].a = -FLOATINFTY;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = 0;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = hirsch_large_ps_dyn(prof1,seq2,hm,hirsch_path,sip);
+			break;
+		case 7://gb->a = 7;
+			
+			hirsch_path[old_cor[4]+1] = c+1;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4]+1,c+1);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = -FLOATINFTY;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = 0;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			hm->startb = old_cor[2];
+			hm->endb = c;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_large_ps_dyn(prof1,seq2,hm,hirsch_path,sip);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = 0;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = hirsch_large_ps_dyn(prof1,seq2,hm,hirsch_path,sip);
+			break;
+	}
+		
+	return hirsch_path;
+}
+
+struct large_states* foward_large_hirsch_ps_dyn(const float* prof1,const int* seq2,struct hirsch_large_mem* hm,int sip)
+{
+//	unsigned int freq[26];
+	struct large_states* s = hm->f;
+	const int starta = hm->starta;
+	const int enda = hm->enda;
+	const int startb = hm->startb;
+	const int endb = hm->endb;
+	
+	register float pa = 0;
+	register float pga = 0;
+	register float pgb = 0;
+	register float ca = 0;
+	register int i = 0;
+	register int j = 0;
+	
+	const float open = local_gpo * sip;
+	const float ext = local_gpe *sip; 
+	const float text = local_tgpe * sip;
+	
+	
+	
+	prof1 += (starta)<< 6;
+	s[startb].a = s[0].a;
+	s[startb].ga = s[0].ga;
+	s[startb].gb = s[0].gb;
+	if(startb == 0){
+		for (j = startb+1; j < endb;j++){
+			s[j].a = -FLOATINFTY;
+			
+			//s[j].ga = s[j-1].a-text;
+			//if (s[j-1].ga-text > s[j].ga){
+			//	s[j].ga = s[j-1].ga-text;
+			//}
+			//if(s[j-1].ga > s[j-1].a){
+			//	s[j].ga = s[j-1].ga-text;
+			//}else{
+			//	s[j].ga = s[j-1].a-text;
+			//}
+			s[j].ga = MAX(s[j-1].ga,s[j-1].a) - text;
+			s[j].gb = -FLOATINFTY;
+		}	
+	}else{
+
+		for (j = startb+1; j < endb;j++){
+			s[j].a = -FLOATINFTY;
+			
+			//s[j].ga = s[j-1].a-open;
+			//if (s[j-1].ga-ext > s[j].ga){
+			//	s[j].ga = s[j-1].ga-ext;
+			//}
+			//if(s[j-1].ga-ext > s[j-1].a-open){
+			//	s[j].ga = s[j-1].ga-ext;
+			//}else{
+			//	s[j].ga = s[j-1].a-open;
+			//}	
+			s[j].ga = MAX(s[j-1].ga-ext,s[j-1].a-open);
+			
+			s[j].gb = -FLOATINFTY;
+		}
+	}
+	
+	
+	s[endb].a = -FLOATINFTY;
+	s[endb].ga = -FLOATINFTY;
+	s[endb].gb = -FLOATINFTY;
+	seq2--;
+
+	for (i = starta;i < enda;i++){
+		prof1 += 64;
+		//pa = 1;
+		//for (j = 26; j--;){
+		//	if(prof1[j]){
+		//		freq[pa] = j;
+		//		pa++;	
+		//	}
+		//}
+		//freq[0] = pa;
+		pa = s[startb].a;
+		pga = s[startb].ga;
+		pgb = s[startb].gb;
+		if(startb == 0){
+			s[startb].a = -FLOATINFTY;
+			s[startb].ga = -FLOATINFTY;
+		
+			//s[startb].gb = pa+prof1[29];
+			//if(pgb+prof1[29] > s[startb].gb){
+			//	s[startb].gb = pgb+prof1[29];
+			//}
+			//if(pgb > pa){
+			//	s[startb].gb = pgb+prof1[29];
+			//}else{
+			//	s[startb].gb = pa+prof1[29];
+			//}
+			s[startb].gb = MAX(pgb,pa)+prof1[29];
+		}else{
+			s[startb].a = -FLOATINFTY;
+			s[startb].ga = -FLOATINFTY;
+		
+			//s[startb].gb = pa+prof1[27];
+			//if(pgb+prof1[28] > s[startb].gb){
+			//	s[startb].gb = pgb+prof1[28];
+			//}
+			//if(pgb+prof1[28] > pa+prof1[27]){
+			//	s[startb].gb = pgb+prof1[28];
+			//}else{
+			//	s[startb].gb = pa+prof1[27];
+			//}
+			s[startb].gb = MAX(pgb+prof1[28],pa+prof1[27]);
+		}
+		for (j = startb+1; j <= endb;j++){
+			ca = s[j].a;
+			
+			//if((pga -= open) > pa){
+			//	pa = pga;
+			//}
+
+			//if((pgb += prof1[-37]) > pa){
+			//	pa = pgb;
+			//}
+			pa = MAX3(pa,pga -open,pgb + prof1[-37]);
+			
+			pa += prof1[32 + seq2[j]];
+
+
+			s[j].a = pa;
+			
+			pga = s[j].ga;
+			
+			//s[j].ga = s[j-1].a-open;
+			//if (s[j-1].ga-ext > s[j].ga){
+			//	s[j].ga = s[j-1].ga-ext;
+			//}
+			
+			//if (s[j-1].ga-ext  > s[j-1].a-open){
+			//	s[j].ga = s[j-1].ga-ext;
+			//}else{
+			//	s[j].ga = s[j-1].a-open;
+			//}
+			s[j].ga = MAX(s[j-1].ga-ext,s[j-1].a-open);
+			
+			
+			pgb = s[j].gb;
+			
+			//s[j].gb = ca+prof1[27];
+			//if(pgb+prof1[28] > s[j].gb){
+			//	s[j].gb = pgb+prof1[28];
+			//}
+			//if(pgb+prof1[28] > ca+prof1[27]){
+			//	s[j].gb = pgb+prof1[28];
+			//}else{
+			//	s[j].gb = ca+prof1[27];
+			//}
+			s[j].gb = MAX(pgb+prof1[28],ca+prof1[27]);
+			
+			
+			pa = ca;
+		}	
+	}
+	prof1 -= enda << 6;
+	return s;
+}
+
+struct large_states* backward_large_hirsch_ps_dyn(const float* prof1,const int* seq2,struct hirsch_large_mem* hm,int sip)
+{
+	//unsigned int freq[26];
+	struct large_states* s = hm->b;
+	const int starta = hm->starta;
+	const int enda = hm->enda;
+	const int startb = hm->startb;
+	const int endb = hm->endb;
+	
+	register float pa = 0;
+	register float pga = 0;
+	register float pgb = 0;
+	register float ca = 0;
+	register int i = 0;
+	register int j = 0;
+	
+	const float open = local_gpo * sip;
+	const float ext = local_gpe *sip; 
+	const float text = local_tgpe * sip;
+	
+
+	prof1 += (enda+1) << 6;
+
+	s[endb].a = s[0].a;
+	s[endb].ga = s[0].ga;
+	s[endb].gb = s[0].gb;
+	
+	
+	//init of first row;
+	//j = endb-startb;
+	if(endb == hm->len_b){
+		for(j = endb-1;j > startb;j--){
+			s[j].a = -FLOATINFTY;
+			//s[j].ga = s[j+1].a-text;
+			//if (s[j+1].ga-text > s[j].ga){
+			//	s[j].ga = s[j+1].ga-text;
+			//}
+			//if(s[j+1].ga > s[j+1].a){
+			//	s[j].ga = s[j+1].ga-text;
+			//}else{
+			//	s[j].ga = s[j+1].a-text;
+			//}
+			s[j].ga = MAX(s[j+1].ga,s[j+1].a)-text;
+			
+			s[j].gb = -FLOATINFTY;
+		}
+	}else{
+		for(j = endb-1;j > startb;j--){
+			s[j].a = -FLOATINFTY;
+			
+			//s[j].ga = s[j+1].a-open;
+			//if (s[j+1].ga-ext > s[j].ga){
+			//	s[j].ga = s[j+1].ga-ext;
+			//}
+			//if(s[j+1].ga-ext > s[j+1].a-open){
+			//	s[j].ga = s[j+1].ga-ext;
+			//}else{
+			//	s[j].ga = s[j+1].a-open;
+			//}
+			s[j].ga = MAX(s[j+1].ga-ext,s[j+1].a-open);
+			s[j].gb = -FLOATINFTY;
+		}
+	}
+	
+	s[startb].a = -FLOATINFTY;
+	s[startb].ga = -FLOATINFTY;
+	s[startb].gb = -FLOATINFTY;
+
+	i = enda-starta;
+	while(i--){
+		prof1 -= 64;
+
+		//pa = 1;
+		//for (j = 26; j--;){
+		//	if(prof1[j]){
+		//		freq[pa] = j;
+		//		pa++;	
+		//	}
+		//}
+		//freq[0] = pa;
+		
+		pa = s[endb].a;
+		pga = s[endb].ga;
+		pgb = s[endb].gb;
+		s[endb].a = -FLOATINFTY;
+		s[endb].ga = -FLOATINFTY;
+
+		if(endb == hm->len_b){
+			//s[endb].gb = pa+prof1[29];
+			//if(pgb+prof1[29] > s[endb].gb){
+			//	s[endb].gb = pgb+prof1[29];
+			//}
+			//if(pgb > pa){
+			//	s[endb].gb = pgb+prof1[29];
+			//}else{
+			//	s[endb].gb = pa+prof1[29];
+			//}
+			s[endb].gb = MAX(pgb,pa) +prof1[29];
+		}else{
+			//s[endb].gb = pa+prof1[27];
+			//if(pgb+prof1[28] > s[endb].gb){
+			//	s[endb].gb = pgb+prof1[28];
+			//}
+			//if(pgb+prof1[28] > pa+prof1[27]){
+			//	s[endb].gb = pgb+prof1[28];
+			//}else{
+			//	s[endb].gb = pa+prof1[27];
+			//}
+			s[endb].gb = MAX(pgb+prof1[28],pa+prof1[27]);
+			
+			
+		}
+
+		for(j = endb-1;j >= startb;j--){
+			ca = s[j].a;
+			//if((pga -= open) > pa){
+			//	pa = pga;
+			//}
+			//if((pgb += prof1[91]) > pa){
+			//	pa = pgb;
+			//}
+
+			pa = MAX3(pa,pga - open,pgb +prof1[91]);
+			pa += prof1[32 + seq2[j]];
+
+			s[j].a = pa;
+			
+			pga = s[j].ga;
+			
+			//s[j].ga = s[j+1].a-open;
+			//if (s[j+1].ga-ext > s[j].ga){
+			//	s[j].ga = s[j+1].ga-ext;
+			//}
+			//if (s[j+1].ga-ext  > s[j+1].a-open){
+			//	s[j].ga = s[j+1].ga-ext;
+			//}else{
+			//	s[j].ga = s[j+1].a-open;
+			//}
+			s[j].ga = MAX(s[j+1].ga-ext,s[j+1].a-open);
+			
+			
+			pgb = s[j].gb;
+			
+			//s[j].gb = ca+prof1[27];
+			//if(pgb+prof1[28] > s[j].gb){
+			//	s[j].gb = pgb+prof1[28];
+			//}
+			//if(pgb+prof1[28] > ca+prof1[27]){
+			//	s[j].gb = pgb+prof1[28];
+			//}else{
+			//	s[j].gb = ca+prof1[27];
+			//}
+			s[j].gb = MAX(pgb+prof1[28],ca+prof1[27]);
+			
+			pa = ca;
+		}
+	}		
+	return s;
+}
+
+
+
+
+int* hirsch_large_pp_dyn(const float* prof1,const float* prof2,struct hirsch_large_mem* hm, int* hirsch_path)
+{
+	int mid = ((hm->enda - hm->starta) / 2)+ hm->starta;
+	float input_states[6] = {hm->f[0].a,hm->f[0].ga,hm->f[0].gb,hm->b[0].a,hm->b[0].ga,hm->b[0].gb};
+	int old_cor[5] = {hm->starta,hm->enda,hm->startb,hm->endb,mid};
+
+	
+	//fprintf(stderr,"starta:%d enda:%d startb:%d endb:%d mid:%d\n",hm->starta,hm->enda,hm->startb,hm->endb,mid);
+	
+	
+	if(hm->starta  >= hm->enda){
+		return hirsch_path;
+	}
+	if(hm->startb  >= hm->endb){
+		return hirsch_path;
+	}
+
+	hm->enda = mid;
+	hm->f = foward_large_hirsch_pp_dyn(prof1,prof2,hm);
+	/*int i;
+	fprintf(stderr,"FOWARD\n");
+	for (i = hm->startb; i <= hm->endb;i++){
+		fprintf(stderr,"%d	%d	%d\n",hm->f[i].a,hm->f[i].ga,hm->f[i].gb);
+	}*/
+
+	hm->starta = mid;
+	hm->enda = old_cor[1];
+	hm->b = backward_large_hirsch_pp_dyn(prof1,prof2,hm);
+	/*fprintf(stderr,"BaCKWARD\n");
+
+	for (i = hm->startb; i <= hm->endb;i++){
+		fprintf(stderr,"%d	%d	%d\n",hm->b[i].a,hm->b[i].ga,hm->b[i].gb);
+	}*/
+
+	hirsch_path = hirsch_large_align_two_pp_vector(prof1,prof2,hm,hirsch_path,input_states,old_cor);
+	return hirsch_path;
+}
+
+
+
+int* hirsch_large_align_two_pp_vector(const float* prof1,const float* prof2,struct hirsch_large_mem* hm,int* hirsch_path,float input_states[],int old_cor[])
+{
+	struct large_states* f = hm->f;
+ 	struct large_states* b = hm->b;
+	int i,j,c;
+	int transition = -1;
+	
+	
+	//code:
+	// a -> a = 1
+	// a -> ga = 2
+	// a -> gb = 3
+	// ga ->ga = 4
+	// ga -> a = 5
+	//gb->gb = 6;
+	//gb->a = 7;
+	
+	//int max = -FLOATINFTY;
+	float max = -FLOATINFTY;	
+	//float middle =  (hm->endb - hm->startb)/2 + hm->startb;
+	float middle =  (old_cor[3] - old_cor[2])/2 + old_cor[2];
+	float sub = 0.0;
+	
+
+	prof1+= ((old_cor[4]+1) << 6);
+	//prof2 += 64 * (hm->startb);
+	//i = hm->startb;
+	prof2 += old_cor[2] << 6;
+	i = old_cor[2];
+	c = -1;
+	//for(i = hm->startb; i < hm->endb;i++){
+	for(i = old_cor[2]; i < old_cor[3];i++){
+		sub = abs(middle -i);
+		sub /= 1000; 
+		prof2 += 64;
+		//fprintf(stderr,"%d	%d	%d \n",f[i].a,b[i].a,max);
+		if(f[i].a+b[i].a-sub > max){
+			max = f[i].a+b[i].a-sub;
+	//		fprintf(stderr,"aligned->aligned:%d + %d = %d\n",f[i].a,b[i].a,f[i].a+b[i].a);
+			transition = 1;
+			c = i;
+		}
+		if(f[i].a+b[i].ga+prof2[27]-sub > max){
+			max = f[i].a+b[i].ga+prof2[27]-sub;
+	//		fprintf(stderr,"aligned->gap_a:%d + %d +%d = %d\n",f[i].a,b[i].ga,prof1[27],f[i].a+b[i].ga+prof2[27]);
+			transition = 2;
+			c = i;
+		}
+		if(f[i].a+b[i].gb+prof1[27] -sub> max){
+			max = f[i].a+b[i].gb+prof1[27]-sub;
+	//		fprintf(stderr,"aligned->gap_b:%d + %d +%d = %d\n",f[i].a,b[i].gb,prof1[27],f[i].a+b[i].gb+prof1[27]);
+			transition = 3;
+			c = i;
+		}
+		if(f[i].ga+b[i].a+prof2[27]-sub > max){
+			max = f[i].ga+b[i].a+prof2[27]-sub;
+	//		fprintf(stderr,"gap_a->aligned:%d + %d + %d(local_gpo) = %d\n",f[i].ga,b[i].a,prof2[27],f[i].ga+b[i].a+prof2[27]);
+			transition = 5;
+			c = i;
+		}
+
+
+		if(hm->startb == 0){
+			if(f[i].gb+b[i].gb+prof1[29]-sub > max){
+				max = f[i].gb+b[i].gb+prof1[29]-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+				transition = 6;
+				c = i;
+			}
+		}else{
+			if(f[i].gb+b[i].gb+prof1[28]-sub > max){
+				max = f[i].gb+b[i].gb+prof1[28]-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+				transition = 6;
+				c = i;
+			}
+		}
+		if(f[i].gb+b[i].a+prof1[27]-sub > max){
+			max = f[i].gb+b[i].a+prof1[27]-sub;
+	//		fprintf(stderr,"gap_b->aligned:%d + %d + %d(local_gpo) = %d\n",f[i].gb,b[i].a,prof1[27],f[i].gb+b[i].a+prof1[27]);
+			transition = 7;
+			c = i;
+		}
+	}
+	//i = hm->endb;
+	i = old_cor[3];
+	sub = abs(middle -i);
+	sub /= 1000; 
+	if(f[i].a+b[i].gb+prof1[27]-sub > max){
+		max = f[i].a+b[i].gb+prof1[27]-sub;
+	//		fprintf(stderr,"aligned->gap_b:%d + %d +%d = %d\n",f[i].a,b[i].gb,prof1[27],f[i].a+b[i].gb+prof1[27]);
+		transition = 3;
+		c = i;
+	}
+	if(hm->endb == hm->len_b){
+		if(f[i].gb+b[i].gb+prof1[29]-sub > max){
+			max = f[i].gb+b[i].gb+prof1[29]-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+			transition = 6;
+			c = i;
+		}	
+	}else{
+		if(f[i].gb+b[i].gb+prof1[28]-sub > max){
+			max = f[i].gb+b[i].gb+prof1[28]-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+			transition = 6;
+			c = i;
+		}
+	}
+	
+	
+	
+	prof1-= (old_cor[4]+1)<<6;
+	//prof2 -= hm->endb << 6;
+	prof2 -= old_cor[3] << 6;
+	
+	//fprintf(stderr,"Transition:%d	at:%d\n",transition,c);
+	//if(transition == -1){
+	//	exit(0);
+	//}
+	
+	j = hirsch_path[0];
+	switch(transition){
+		case 1: //a -> a = 1
+			
+			hirsch_path[old_cor[4]] = c;
+			hirsch_path[old_cor[4]+1] = c+1;
+			
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4],c);
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4]+1,c+1);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = 0;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = -FLOATINFTY;
+			//fprintf(stderr,"Using this for start:%ld	%ld	%ld\n",hm->f[0].a,hm->f[0].ga,hm->f[0].gb);
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_large_pp_dyn(prof1,prof2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = 0;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d  what:%d-%d	%d-%d\n",c+1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_large_pp_dyn(prof1,prof2,hm,hirsch_path);
+			break;
+		case 2:// a -> ga = 2
+			
+			hirsch_path[old_cor[4]] = c;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4],c);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = 0;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = -FLOATINFTY;
+			
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_large_pp_dyn(prof1,prof2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4];
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = -FLOATINFTY;
+			hm->f[0].ga = 0;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d  what:%d-%d	%d-%d\n",c+1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_large_pp_dyn(prof1,prof2,hm,hirsch_path);
+			break;
+		case 3:// a -> gb = 3
+			
+			hirsch_path[old_cor[4]] = c;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4],c);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = 0;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = -FLOATINFTY;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_large_pp_dyn(prof1,prof2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c;
+			hm->endb = old_cor[3];
+			hm->f[0].a = -FLOATINFTY;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = 0;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = hirsch_large_pp_dyn(prof1,prof2,hm,hirsch_path);
+			break;
+		case 5://ga -> a = 5
+			hirsch_path[old_cor[4]+1] = c+1;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4]+1,c+1);
+
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = -FLOATINFTY;
+			hm->b[0].ga = 0;
+			hm->b[0].gb = -FLOATINFTY;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4];
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_large_pp_dyn(prof1,prof2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = 0;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = hirsch_large_pp_dyn(prof1,prof2,hm,hirsch_path);
+			break;
+		case 6://gb->gb = 6;
+			
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = -FLOATINFTY;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = 0;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			hm->startb = old_cor[2];
+			hm->endb = c;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_large_pp_dyn(prof1,prof2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c;
+			hm->endb = old_cor[3];
+			hm->f[0].a = -FLOATINFTY;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = 0;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = hirsch_large_pp_dyn(prof1,prof2,hm,hirsch_path);
+			break;
+		case 7://gb->a = 7;
+			
+			hirsch_path[old_cor[4]+1] = c+1;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4]+1,c+1);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = -FLOATINFTY;
+			hm->b[0].ga = -FLOATINFTY;
+			hm->b[0].gb = 0;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			hm->startb = old_cor[2];
+			hm->endb = c;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = hirsch_large_pp_dyn(prof1,prof2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = 0;
+			hm->f[0].ga = -FLOATINFTY;
+			hm->f[0].gb = -FLOATINFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = hirsch_large_pp_dyn(prof1,prof2,hm,hirsch_path);
+			break;
+	}
+		
+	return hirsch_path;
+}
+
+struct large_states* foward_large_hirsch_pp_dyn(const float* prof1,const float* prof2,struct hirsch_large_mem* hm)
+{
+	int freq[26];
+
+	/*union print{
+		__m128i m;
+		int tmp[4];
+	} output;
+	
+	__m128i xmm1;
+	__m128i xmm2;*/
+
+	
+	struct large_states* s = hm->f;
+	register float pa = 0;
+	register float pga = 0;
+	register float pgb = 0;
+	register float ca = 0;
+	register int i = 0;
+	register int j = 0;
+	register int c = 0;
+	
+	prof1 += (hm->starta) << 6;
+	prof2 +=  (hm->startb) << 6;
+	s[hm->startb].a = s[0].a;
+	s[hm->startb].ga = s[0].ga;
+	s[hm->startb].gb = s[0].gb;
+	/*if(s[hm->startb].ga == -FLOATINFTY && s[hm->startb].a == -FLOATINFTY){
+		for (j = hm->startb+1; j < hm->endb;j++){
+			prof2+=64;
+			s[j].a = -FLOATINFTY;
+			s[j].ga = -FLOATINFTY;
+			s[j].gb = -FLOATINFTY;
+		}	
+		prof2+=64;	
+	}else{
+	*/
+	if(hm->startb == 0){
+		for (j = hm->startb+1; j < hm->endb;j++){
+			prof2+=64;
+			s[j].a = -FLOATINFTY;
+			//if (s[j-1].ga > s[j-1].a){
+			//	s[j].ga = s[j-1].ga+prof2[29];
+			//}else{
+			//	s[j].ga = s[j-1].a+prof2[29];
+			//}
+			s[j].ga = MAX(s[j-1].ga,s[j-1].a)+prof2[29];
+			s[j].gb = -FLOATINFTY;
+		}	
+		prof2+=64;	
+	}else{
+
+		for (j = hm->startb+1; j < hm->endb;j++){
+			prof2+=64;
+			s[j].a = -FLOATINFTY;
+			//if(s[j-1].ga+prof2[28] > s[j-1].a+prof2[27]){
+			//	s[j].ga = s[j-1].ga+prof2[28];
+			//}else{
+			//	s[j].ga = s[j-1].a+prof2[27];
+			//}
+			s[j].ga = MAX(s[j-1].ga+prof2[28],s[j-1].a+prof2[27]);
+			
+			
+			s[j].gb = -FLOATINFTY;
+		}
+		prof2+=64;
+	}
+	//}
+	
+	prof2 -= (hm->endb-hm->startb) << 6;
+	
+	s[hm->endb].a = -FLOATINFTY;
+	s[hm->endb].ga = -FLOATINFTY;
+	s[hm->endb].gb = -FLOATINFTY;
+
+
+	for (i = hm->starta;i < hm->enda;i++){
+		prof1 += 64;
+		c = 1;
+		for (j = 0;j < 26; j++){
+			if(prof1[j]){
+				freq[c] = j;
+				c++;	
+			}
+		}
+		freq[0] = c;
+			
+		pa = s[hm->startb].a;
+		pga = s[hm->startb].ga;
+		pgb = s[hm->startb].gb;
+		s[hm->startb].a = -FLOATINFTY;
+		s[hm->startb].ga = -FLOATINFTY;
+		
+		//if(pgb == -FLOATINFTY && pa == -FLOATINFTY){
+		//	s[hm->startb].gb = -FLOATINFTY;
+		//}else{
+		if(hm->startb == 0){
+			//if(pgb > pa ){
+			//	s[hm->startb].gb = pgb+prof1[29];
+			//}else{
+			//	s[hm->startb].gb = pa+prof1[29];
+			//}
+			s[hm->startb].gb = MAX(pgb,pa)+ prof1[29];
+		}else{
+			//if(pgb+prof1[28] >  pa+prof1[27]){
+			//	s[hm->startb].gb = pgb+prof1[28];
+			//}else{
+			//	s[hm->startb].gb = pa+prof1[27];
+			//}
+			s[hm->startb].gb = MAX(pgb+prof1[28],pa+prof1[27]);
+		}
+		//}
+		for (j = hm->startb+1; j <= hm->endb;j++){
+			prof2 += 64;
+			ca = s[j].a;
+			
+
+			//if((pga += prof2[-37]) > pa){
+			//	pa = pga;
+			//}
+		
+
+			//if((pgb += prof1[-37]) > pa){
+			//	pa = pgb;
+			//}
+			//pa = MAX(pgb + prof1[-37],pa);
+			//pa = MAX(pga + prof2[-37],pa);
+
+			pa = MAX3(pa,pga + prof2[-37],pgb + prof1[-37]);
+			
+			
+			prof2 += 32;
+			for (c = 1;c < freq[0];c++){
+				pa += prof1[freq[c]]*prof2[freq[c]];
+			}
+			prof2 -= 32;
+
+			s[j].a = pa;
+			
+			pga = s[j].ga;
+			
+			//if (s[j-1].ga+prof2[28] > s[j-1].a+prof2[27]){
+			//	s[j].ga = s[j-1].ga+prof2[28];
+			//}else{
+			//	s[j].ga = s[j-1].a+prof2[27];
+			//}
+			
+			
+			/*xmm1 =  _mm_set_epi32 (ca,s[j-1].a,pgb,s[j-1].ga);
+			xmm2 = _mm_set_epi32 (prof1[27],prof2[27],prof1[28],prof2[28]);
+			xmm1 = _mm_add_epi32 (xmm1,xmm2);
+			xmm2 =  _mm_srli_si128(xmm1, 8);
+			output.m = _mm_cmpgt_epi32(xmm1,xmm2);
+			output.m = _mm_or_si128( _mm_andnot_si128(output.m,xmm2),_mm_and_si128(output.m,xmm1));
+			
+			s[j].ga =output.tmp[0];
+			s[j].gb = output.tmp[1];*/
+			//output.m = _mm_add_epi32 (xmm1,xmm2);
+			//_mm_store_si128(dst_ptr, xmm3);
+			//fprintf(stderr,"%d	%d	%d	%d	%d	%d	%d	%d\n",output.tmp[0],output.tmp[1],output.tmp[2],output.tmp[3],s[j-1].ga+prof2[28],s[j-1].a+prof2[27],pgb+prof1[28] ,ca+prof1[27]);
+			
+			
+			s[j].ga = MAX(s[j-1].ga+prof2[28],s[j-1].a+prof2[27]);
+			
+			
+			
+			pgb = s[j].gb;
+			
+
+			//if(pgb+prof1[28] > ca+prof1[27]){
+			//	s[j].gb = pgb+prof1[28];
+			//}else{
+			//	s[j].gb = ca+prof1[27];
+			//}
+			s[j].gb = MAX(pgb+prof1[28] ,ca+prof1[27]);
+			//fprintf(stderr,"%d	%d	%d	%d\n",output.tmp[0],output.tmp[1],s[j].ga,s[j].gb );
+			pa = ca;
+		}
+		prof2 -= (hm->endb-hm->startb) << 6;
+		
+	}
+	prof1 -=  (hm->enda) << 6;
+	return s;
+}
+
+struct large_states* backward_large_hirsch_pp_dyn(const float* prof1,const float* prof2,struct hirsch_large_mem* hm)
+{
+	int freq[26];
+	struct large_states* s = hm->b;
+	register float pa = 0;
+	register float pga = 0;
+	register float pgb = 0;
+	register float ca = 0;
+	register int i = 0;
+	register int j = 0;
+	register int c = 0;
+	
+	prof1 += (hm->enda+1) << 6;
+	prof2 += (hm->endb+1) << 6;
+	s[hm->endb].a = s[0].a;
+	s[hm->endb].ga = s[0].ga;
+	s[hm->endb].gb = s[0].gb;
+	
+	
+	//init of first row;
+	//j = endb-startb;
+
+	/*if(s[hm->endb].ga == -FLOATINFTY && s[hm->endb].a == -FLOATINFTY){
+		for(j = hm->endb-1;j > hm->startb;j--){
+			prof2 -= 64;
+			s[j].a = -FLOATINFTY;
+			s[j].ga = -FLOATINFTY;
+			s[j].gb = -FLOATINFTY;
+		}
+		prof2 -= 64;
+	}else{*/
+	
+	if(hm->endb == hm->len_b){
+		
+		for(j = hm->endb-1;j > hm->startb;j--){
+			prof2 -= 64;
+			s[j].a = -FLOATINFTY;
+			//if(s[j+1].ga > s[j+1].a){
+			//	s[j].ga = s[j+1].ga+prof2[29];
+			//}else{
+			//	s[j].ga = s[j+1].a+prof2[29];
+			//}
+			s[j].ga = MAX(s[j+1].ga,s[j+1].a)+prof2[29];
+			s[j].gb = -FLOATINFTY;
+		}
+		prof2 -= 64;
+	}else{
+		for(j = hm->endb-1;j > hm->startb;j--){
+			prof2 -= 64;
+			s[j].a = -FLOATINFTY;
+			//if(s[j+1].ga+prof2[28] > s[j+1].a+prof2[27]){
+			//	s[j].ga = s[j+1].ga+prof2[28];
+			//}else{
+			//	s[j].ga = s[j+1].a+prof2[27];
+			//}
+			s[j].ga = MAX(s[j+1].ga+prof2[28],s[j+1].a+prof2[27]);
+			s[j].gb = -FLOATINFTY;
+		}
+		prof2 -= 64;
+	}
+	//}
+	
+	s[hm->startb].a = -FLOATINFTY;
+	s[hm->startb].ga = -FLOATINFTY;
+	s[hm->startb].gb = -FLOATINFTY;
+	
+	i = hm->enda-hm->starta;
+	while(i--){
+		prof1 -= 64;
+
+		c = 1;
+		for (j = 0;j < 26; j++){
+			if(prof1[j]){
+				freq[c] = j;
+				c++;	
+			}
+		}
+		freq[0] = c;
+		
+		pa = s[hm->endb].a;
+		pga = s[hm->endb].ga;
+		pgb = s[hm->endb].gb;
+		s[hm->endb].a = -FLOATINFTY;
+		s[hm->endb].ga = -FLOATINFTY;
+		//if(pgb == -FLOATINFTY && pa == -FLOATINFTY){
+		//	s[hm->endb].gb = -FLOATINFTY;
+		//}else{
+		if(hm->endb == hm->len_b){
+			//if(pgb > pa){
+			//	s[hm->endb].gb = pgb+prof1[29];
+			//}else{
+			//	s[hm->endb].gb = pa+prof1[29];
+			//}	
+			s[hm->endb].gb = MAX(pgb,pa)+prof1[29];
+		}else{
+			//if(pgb+prof1[28] > pa+prof1[27]){
+			//	s[hm->endb].gb = pgb+prof1[28];
+			//}else{
+			//	s[hm->endb].gb = pa+prof1[27];
+			//}
+			s[hm->endb].gb = MAX(pgb+prof1[28] ,pa+prof1[27]);
+		}
+		//}
+		//j = endb-startb;
+		prof2 += (hm->endb-hm->startb) << 6;
+		//while(j--){
+		for(j = hm->endb-1;j >= hm->startb;j--){
+			prof2 -= 64;
+			ca = s[j].a;
+			
+			//pa = MAX(pga + prof2[91],pa);
+			//pa = MAX(pgb + prof1[91],pa);
+			pa = MAX3(pa,pga + prof2[91],pgb + prof1[91]);
+			
+			//if((pga += prof2[91]) > pa){
+			//	pa = pga;
+			//}
+			//if((pgb += prof1[91]) > pa){
+			//	pa = pgb;
+			//}
+
+			prof2 += 32;
+			for (c = 1;c < freq[0];c++){
+				pa += prof1[freq[c]]*prof2[freq[c]];
+			}
+			prof2 -= 32;
+
+			s[j].a = pa;
+			
+			pga = s[j].ga;
+
+			//if (s[j+1].ga+prof2[28] > s[j+1].a+prof2[27]){
+			//	s[j].ga = s[j+1].ga+prof2[28];
+			//}else{
+			//	s[j].ga = s[j+1].a+prof2[27];
+			//}
+			s[j].ga = MAX(s[j+1].ga+prof2[28], s[j+1].a+prof2[27]);
+
+			pgb = s[j].gb;
+
+			s[j].gb = MAX(pgb+prof1[28], ca+prof1[27]);
+			//if(pgb+prof1[28] > ca+prof1[27]){
+			//	s[j].gb = pgb+prof1[28];
+			//}else{
+			//	s[j].gb = ca+prof1[27];
+			//}
+
+			pa = ca;
+		}
+	}		
+	return s;
+}
+
+float* make_large_profile(float* prof, int* seq,int len,float** subm)
+{
+	int i,j,c;	
+	prof = malloc(sizeof(float)*(len+2)*64);
+	prof +=  (64 *(len+1));
+
+	for (i = 0;i < 64;i++){
+		prof[i] = 0.0;
+	}
+	prof[23+32] = -local_gpo;
+	prof[24+32] = -local_gpe;
+	prof[25+32] = -local_tgpe;
+
+	
+	i = len;
+	while(i--){
+		prof -= 64;
+
+		for (j = 0;j < 64;j++){
+			prof[j] = 0.0;
+		}
+		c = seq[i];
+		
+		prof[c] += 1.0;
+		
+		prof += 32;
+		
+		for(j = 23;j--;){
+			prof[j] = subm[c][j];
+		}
+		prof[23] = -local_gpo;
+		prof[24] = -local_gpe;
+		prof[25] = -local_tgpe;
+		
+		prof -= 32;
+	}
+	prof -= 64;
+	for (i = 0;i < 64;i++){
+		prof[i] = 0.0;
+	}
+	prof[23+32] = -local_gpo;
+	prof[24+32] = -local_gpe;
+	prof[25+32] = -local_tgpe;	
+	return prof;
+}
+
+void set_large_gap_penalties(float* prof,int len,int nsip)
+{
+	int i;
+	
+	prof +=  (64 *(len+1));
+	prof[27] = prof[55]*nsip;//gap open or close
+	prof[28] = prof[56]*nsip;//gap extention
+		
+	prof[29] = prof[57]*nsip;//gap open or close
+	i = len+1;
+	while(i--){
+		prof -= 64;
+		prof[27] = prof[55]*nsip;//gap open or close
+		prof[28] = prof[56]*nsip;//gap extention
+		
+		prof[29] = prof[57]*nsip;//gap open or close
+	}
+}
+
+
+float* large_update(float* profa,float* profb,float* newp,int* path,int sipa,int sipb)
+{
+	int i,j,c;
+	for (i = 64; i--;){
+		newp[i] = profa[i] + profb[i];
+	}
+	
+	profa += 64;
+	profb += 64;
+	newp += 64;
+
+	c = 1;
+	
+	while(path[c] != 3){
+		//Idea: limit the 'virtual' number of residues of one type to x.
+		// i.e. only allow a maximum of 10 alanines to be registered in each column
+		// the penalty for aligning a 'G' to this column will stay stable even when many (>10) alanines are present.
+		// the difference in score between the 'correct' (all alanine) and incorrect (alanines + glycine) will not increase 
+		// with the number of sequences. -> see Durbin pp 140
+		
+		if (!path[c]){
+			//fprintf(stderr,"Align	%d\n",c);
+			for (i = 64; i--;){
+				newp[i] = profa[i] + profb[i];
+			}
+				
+			
+			profa += 64;
+			profb += 64;
+		}
+		
+		if (path[c] & 1){
+			//fprintf(stderr,"Gap_A:%d\n",c);
+			//printf("open:%d	ext:%d	%d	%d\n",si->nsip[a] * local_gpo,si->nsip[a] * gpe,si->nsip[a] * profb[41],si->nsip[a] * profb[46]);
+			for (i = 64; i--;){
+				newp[i] = profb[i];
+			}
+			profb += 64;
+			if(!(path[c] & 20)){
+				if(path[c] & 32){
+					newp[25] += sipa;//1;
+					i = local_tgpe*sipa;
+				}else{
+					newp[24] += sipa;//1;
+					i = local_gpe*sipa;
+				}
+				
+				for (j = 32; j < 55;j++){
+					newp[j] -=i;
+				}
+			}else{
+			if (path[c] & 16){ 
+	//			fprintf(stderr,"close_open");
+				if(path[c] & 32){
+					newp[25] += sipa;//1;
+					i = local_tgpe*sipa;
+					newp[23] += sipa;//1;
+					i += local_gpo*sipa;
+				}else{
+					newp[23] += sipa;//1;
+					i = local_gpo*sipa;
+				}
+								
+				for (j = 32; j < 55;j++){
+					newp[j] -=i;
+				}
+			}
+			if (path[c] & 4){ 
+	//			fprintf(stderr,"Gap_open");
+				if(path[c] & 32){
+					newp[25] += sipa;//1;
+					i = local_tgpe*sipa;
+					newp[23] += sipa;//1;
+					i += local_gpo*sipa;
+				}else{
+					newp[23] += sipa;//1;
+					i = local_gpo*sipa;
+				}
+				for (j = 32; j < 55;j++){
+					newp[j] -=i;
+				}
+			}
+			}	
+		}
+		if (path[c] & 2){
+			//fprintf(stderr,"Gap_B:%d\n",c);
+			//printf("open:%d	ext:%d	%d	%d\n",si->nsip[b] * local_gpo,si->nsip[b] * gpe,profa[26],profa[27]);
+			for (i = 64; i--;){
+				newp[i] = profa[i];
+			}
+			profa+=64;
+			if(!(path[c] & 20)){
+				if(path[c] & 32){
+					newp[25] += sipb;//1;
+					i = local_tgpe*sipb;
+				}else{
+					newp[24] += sipb;//1;
+					i = local_gpe*sipb;
+				}
+				for (j = 32; j < 55;j++){
+					newp[j] -=i;
+				}
+			}else{
+			if (path[c] & 16){
+	//			fprintf(stderr,"close_open");
+				if(path[c] & 32){
+					newp[25] += sipb;//1;
+					i =  local_tgpe*sipb;
+					newp[23] += sipb;//1;
+					i +=  local_gpo*sipb;
+				}else{
+					newp[23] += sipb;//1;
+					i =  local_gpo*sipb;
+				}
+				for (j = 32; j < 55;j++){
+					newp[j] -=i;
+				}
+			}
+			if (path[c] & 4){
+	//			fprintf(stderr,"Gap_open");
+				if(path[c] & 32){
+					newp[25] += sipb;//1;
+					i = local_tgpe*sipb;
+					newp[23] += sipb;//1;
+					i += local_gpo*sipb;
+				}else{
+					newp[23] += sipb;//1;
+					i = local_gpo*sipb;
+				}
+				
+				for (j = 32; j < 55;j++){
+					newp[j] -=i;
+				}
+			}
+			}		
+		}
+		newp += 64;
+		c++;
+	}
+	for (i = 64; i--;){
+		newp[i] =  profa[i] + profb[i];
+	}	
+	newp -= (path[0]+1) *64;
+	return newp;
+}
+
+
+struct hirsch_large_mem* hirsch_large_mem_alloc(struct hirsch_large_mem* hm,int x)
+{
+
+	// a=((typeof(a))(((int)(((void *)malloc(c+15))+15))&-16)). 
+	hm = (struct hirsch_large_mem *) malloc(sizeof(struct hirsch_large_mem));
+	hm->starta = 0;
+	hm->startb = 0;
+	hm->enda = 0;
+	hm->endb = 0;
+	hm->size = x;
+	hm->len_a = 0;
+	hm->len_b = 0;
+	hm->f = malloc(sizeof(struct large_states)* (x+1));
+	hm->b = malloc(sizeof(struct large_states)* (x+1));
+	return hm;
+}
+
+struct hirsch_large_mem* hirsch_large_mem_realloc(struct hirsch_large_mem* hm,int x)
+{
+	hm->starta = 0;
+	hm->startb = 0;
+	hm->enda = 0;
+	hm->endb = 0;
+	hm->len_a = 0;
+	hm->len_b = 0;
+	hm->size = x;
+	hm->f = realloc(hm->f,sizeof(struct large_states)* (x+1));
+	hm->b = realloc(hm->b,sizeof(struct large_states)* (x+1));
+	return hm;
+}
+
+void hirsch_large_mem_free(struct hirsch_large_mem* hm)
+{
+	free(hm->f);
+	free(hm->b);
+	free(hm);
+}
+
+

Added: trunk/packages/kalign/branches/upstream/current/kalign2_hirschberg_large.h
===================================================================
--- trunk/packages/kalign/branches/upstream/current/kalign2_hirschberg_large.h	2006-11-19 13:38:57 UTC (rev 159)
+++ trunk/packages/kalign/branches/upstream/current/kalign2_hirschberg_large.h	2006-11-29 14:12:29 UTC (rev 160)
@@ -0,0 +1,71 @@
+/*
+	kalign2_hirschberg_large.h
+	
+	Released under GPL - see the 'COPYING' file   
+	
+	Copyright (C) 2006 Timo Lassmann <timolassmann at gmail.com>
+	
+	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
+	any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+    
+	Please send bug reports, comments etc. to:
+	timolassmann at gmail.com
+*/
+
+struct large_states{
+	float a;
+	float ga;
+	float gb;
+	float x;
+};
+
+
+
+struct hirsch_large_mem{
+	struct large_states* f;
+	struct large_states* b;
+	int starta;
+	int startb;
+	int enda;
+	int endb;
+	int size;
+	int len_a;
+	int len_b;
+};
+
+int* hirsch_large_pp_dyn(const float* prof1,const float* prof2,struct hirsch_large_mem* hm, int* hirsch_path);
+struct large_states* foward_large_hirsch_pp_dyn(const float* prof1,const float* prof2,struct hirsch_large_mem* hm);
+struct large_states* backward_large_hirsch_pp_dyn(const float* prof1,const float* prof2,struct hirsch_large_mem* hm);
+int* hirsch_large_align_two_pp_vector(const float* prof1,const float* prof2,struct hirsch_large_mem* hm,int* hirsch_path,float input_states[],int old_cor[]);
+
+int* hirsch_large_ps_dyn(const float* prof1,const int* seq2,struct hirsch_large_mem* hm, int* hirsch_path,int sip);
+struct large_states* foward_large_hirsch_ps_dyn(const float* prof1,const int* seq2,struct hirsch_large_mem* hm,int sip);
+struct large_states* backward_large_hirsch_ps_dyn(const float* prof1,const int* seq2,struct hirsch_large_mem* hm,int sip);
+int* hirsch_large_align_two_ps_vector(const float* prof1,const int* seq2,struct hirsch_large_mem* hm,int* hirsch_path,float input_states[],int old_cor[],int sip);
+
+
+int* hirsch_large_ss_dyn(float**subm, const int* seq1,const int* seq2,struct hirsch_large_mem* hm, int* hirsch_path);
+struct large_states* foward_large_hirsch_ss_dyn(float**subm,const int* seq1,const int* seq2,struct hirsch_large_mem* hm);
+struct large_states* backward_large_hirsch_ss_dyn(float**subm,const int* seq1,const int* seq2,struct hirsch_large_mem* hm);
+int* hirsch_large_align_two_ss_vector(float**subm,const int* seq1,const int* seq2,struct hirsch_large_mem* hm,int* hirsch_path,float input_states[],int old_cor[]);
+
+float* make_large_profile(float* prof, int* seq,int len,float** subm);
+void set_large_gap_penalties(float* prof,int len,int nsip);
+float* large_update(float* profa,float* profb,float* newp,int* path,int sipa,int sipb);
+
+struct hirsch_large_mem* hirsch_large_mem_alloc(struct hirsch_large_mem* hm,int x);
+struct hirsch_large_mem* hirsch_large_mem_realloc(struct hirsch_large_mem* hm,int x);
+void hirsch_large_mem_free(struct hirsch_large_mem* hm);
+
+

Added: trunk/packages/kalign/branches/upstream/current/kalign2_inferface.c
===================================================================
--- trunk/packages/kalign/branches/upstream/current/kalign2_inferface.c	2006-11-19 13:38:57 UTC (rev 159)
+++ trunk/packages/kalign/branches/upstream/current/kalign2_inferface.c	2006-11-29 14:12:29 UTC (rev 160)
@@ -0,0 +1,394 @@
+/*
+	kalign2_interface.c 
+	
+	Released under GPL - see the 'COPYING' file   
+	
+	Copyright (C) 2006 Timo Lassmann <timolassmann at gmail.com>
+	
+	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
+	any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+    
+	Please send bug reports, comments etc. to:
+	timolassmann at gmail.com
+*/
+
+#include <string.h>
+
+#include <getopt.h>
+
+//#include <unistd.h>
+#include "kalign2.h"
+#include "kalign2_input.h"
+
+void parameter_message(struct parameters* param)
+{
+        if(param->infile[0]){
+                if(param->dna){
+                        fprintf(stderr,"Aligning %d RNA/DNA sequences from file %s with these parameters:\n",numseq,param->infile[0]);
+                }else{
+                        fprintf(stderr,"Aligning %d protein sequences from file %s with these parameters:\n",numseq,param->infile[0]);
+                }
+        }else{
+                if(param->dna){
+                        fprintf(stderr,"Aligning %d RNA/DNA sequences with these parameters:\n",numseq);
+                }else{
+                        fprintf(stderr,"Aligning %d protein sequences with these parameters:\n",numseq);
+                }
+                
+        }
+       // fprintf(stderr,"	Distance estimation method:   %s\n",param->distance);
+	//fprintf(stderr,"	Tree building method:         %s\n",param->tree);
+	//fprintf(stderr,"	Ntree:                        %d\n",param->ntree);
+        fprintf(stderr,"        %0.8f	gap open penalty\n",(float)gpo/5);
+        fprintf(stderr,"        %0.8f	gap extension\n",(float)gpe/10);
+        fprintf(stderr,"        %0.8f	terminal gap penalty\n",(float)tgpe/10);
+        fprintf(stderr,"        %0.8f	bonus\n",param->secret/10);
+        /*fprintf(stderr,"        %0.2f	zlevel\n",param->zlevel);
+	fprintf(stderr,"        %0.2f	igw\n",param->internal_gap_weight);
+	fprintf(stderr,"        %d	sw\n",param->smooth_window);
+        fprintf(stderr,"        %0.2f	smo\n", param->smooth_strength);*/
+     
+	if(param->outfile){
+		fprintf(stderr,"Alignment will be written to file:'%s'.\n\n",param->outfile);
+	}else{
+		fprintf(stderr,"Alignment will be written to stdout.\n\n");
+	}
+}
+
+struct parameters* interface(struct parameters* param,int argc,char **argv)
+{
+	int i,c;
+	param->gpo = -1.0;
+	param->gpe = -1.0;
+	param->tgpe = -1.0;
+	param->secret = -1.0;
+	param->zlevel = 58.8;
+	param->sub_matrix = 0;
+	param->aa = 0;
+	
+	param->infile = malloc(sizeof(char*)*3);
+	param->infile[0] = 0;
+	param->infile[1] = 0;
+	param->infile[2] = 0;
+	param->input = 0;
+	param->outfile = 0;
+	param->format = 0;
+	param->help_flag = 0;
+	param->quiet = 0;
+	param->id = -1;
+	param->distance = "wu";
+	param->reformat = 0;
+	param->sort = 0;
+	
+	param->print_svg_tree = 0;
+	
+	param->dna = -1;
+	 
+	param->feature_type = 0;
+	param->alignment_type = "default";
+	param->tree = "upgma";
+	param->ntree = 2;
+	param->print_tree = 0;
+	param->alter_gaps = 0;
+	param->alter_range = 0.5;
+	param->alter_weight = 100;
+	
+        param->internal_gap_weight = 0;
+	param->smooth_window = 1;
+        param->smooth_strength = 0;
+        
+        
+        static char  license[] = "\n\
+Kalign version 2.03, Copyright (C) 2004, 2005, 2006 Timo Lassmann\n\n\
+        Kalign is free software. You can redistribute it and/or modify\n\
+        it under the terms of the GNU General Public License as\n\
+        published by the Free Software Foundation.\n\n";
+
+        
+
+	while (1){
+        	static struct option long_options[] ={
+		{"gapopen",  required_argument, 0,'s'},
+		{"gpo",  required_argument, 0, 's'},
+		{"gapextension",  required_argument, 0, 'e'},
+		{"gpe",  required_argument, 0, 'e'},
+                {"secret",  required_argument, 0, 'm'},
+                {"bonus",  required_argument, 0, 'm'},
+		{"terminalgapextension",  required_argument, 0, 't'},
+                {"tgpe",  required_argument, 0, 't'},
+                {"zcutoff",  required_argument, 0, 0},
+                {"distance",  required_argument, 0, 'd'},
+                {"ntree",  required_argument, 0, 0},
+                {"tree",  required_argument, 0, 0},
+                {"format",  required_argument, 0, 'f'},
+                {"reformat",  0, 0, 'r'},
+                {"sort",required_argument,0,'c'},
+                {"feature",  required_argument, 0, 0},
+		{"type",  required_argument, 0, 0},
+		{"alter_gaps",  required_argument, 0, 0},
+		{"altergaps",  required_argument, 0, 0},
+		{"alter_range",  required_argument, 0, 0},
+		{"alter_weight",  required_argument, 0, 0},
+		{"internal_gap_weight",  required_argument, 0, 0},
+		{"smooth_window",  required_argument, 0, 0},
+		{"smooth_strength",  required_argument, 0, 0},
+		{"matrix",  required_argument, 0, 0},
+		{"mmbonus",  required_argument, 0, 0},
+		{"nuc",  0, 0, 0},
+		{"dna",  0, 0, 0},
+		{"rna",  0, 0, 0},
+		{"protein",  0, 0, 0},
+		{"profile", 0, 0, 0},
+		{"prof", 0, 0, 0},
+		{"id", required_argument, 0, 0},
+		{"printtree", required_argument, 0, 0},
+		{"svgtree", required_argument, 0, 0},
+		{"svg_tree", required_argument, 0, 0},
+		
+                {"input",  required_argument, 0, 'i'},
+                {"infile",  required_argument, 0, 'i'},
+                {"in",  required_argument, 0, 'i'},
+                {"output",  required_argument, 0, 'o'},
+                {"outfile",  required_argument, 0, 'o'},
+                {"out",  required_argument, 0, 'o'},
+                {"help",   no_argument,0,'h'},
+                {"quiet",  0, 0, 'q'},
+                
+
+                {0, 0, 0, 0}
+                };
+                
+                int option_index = 0;
+                c = getopt_long_only (argc, argv,"i:o:hqs:e:m:t:z:c:f:d:b:r",long_options, &option_index);
+                //c = getopt (argc, argv, "hi:o:");
+                /* Detect the end of the options. */
+                if (c == -1){
+                        break;
+                }
+                switch (c){
+			case 0:
+				if (long_options[option_index].flag != 0){
+					break;
+				}
+				switch (option_index){
+					case 0:
+					case 1:
+						fprintf(stderr,"GAGAGA\n");
+						param->gpo = atof(optarg);
+						break;
+					case 2:
+					case 3:
+						param->gpe = atof(optarg);
+						break;
+					case 4:
+					case 5:
+						param->secret = atof(optarg);
+						break;
+					case 6:
+					case 7:
+						param->tgpe = atof(optarg);
+						break;
+					case 8:
+						param->zlevel = atof(optarg);
+						break;
+					case 9:
+						param->distance = optarg;
+						break;	
+					case 10:
+						param->ntree = atoi(optarg);
+						break;
+					case 11:
+						param->tree = optarg;
+						break;
+					case 12:
+						param->format = optarg;
+						break;
+					case 13:
+						param->reformat = 1;
+						break;
+					case 14:
+						param->sort = optarg;
+						break;
+					case 15:
+						param->feature_type = optarg;
+						break;
+					case 16:
+						param->alignment_type = optarg;
+						break;
+					case 17:
+					case 18:
+						param->alter_gaps = atoi(optarg);
+						break;	
+					case 19:
+						param->alter_range = atof(optarg);
+						break;	
+					case 20:
+						param->alter_weight = atoi(optarg);
+						break;	
+					case 21:
+						param->internal_gap_weight = atof(optarg);
+						break;	
+					case 22:
+						param->smooth_window = atoi(optarg);
+						break;	
+					case 23:
+						param->smooth_strength = atof(optarg);
+						break;	
+					case 24:
+						param->sub_matrix = optarg;
+						break;	
+					case 25:
+						param->aa = atoi(optarg);
+						break;	
+					case 26:
+					case 27:
+					case 28:
+						param->dna = 1;
+						break;
+					case 29:
+						param->dna = 0;
+						break;
+					case 30:
+					case 31:
+						param->alignment_type = "profile";
+						break;	
+					case 32:
+						param->id = atoi(optarg);
+						break;
+					case 33:
+						param->print_tree = optarg;
+						break;
+					case 34:
+					case 35:
+						param->print_svg_tree = optarg;
+						break;
+					
+						
+					default:
+						break;
+				}
+				//printf ("option%d %s",option_index,long_options[option_index].name);
+				//if (optarg){
+				//	printf (" with arg %s\n", optarg);
+				//}
+				break;
+			 case 's':
+			 	param->gpo = atof(optarg);
+                        	//param->help_flag = 1;
+				break;
+			case 'e':
+				param->gpe = atof(optarg);
+				break;
+			case 'm':
+				param->secret = atof(optarg);
+				break;
+			case 't':	
+				param->tgpe = atof(optarg);
+				break;
+			case 'z':	
+				param->zlevel = atof(optarg);
+				break;
+				
+			case 'c':
+				param->sort = optarg;
+				break;
+			case 'f':
+				param->format = optarg;
+				break;
+			case 'r':
+				param->reformat = 1;
+				break;
+				
+			case 'd':
+				param->distance = optarg;
+				break;	
+			case 'b':
+				param->tree = optarg;
+				break;	
+				
+				
+				
+                        case 'h':
+                        	param->help_flag = 1;
+				break;
+                        case 'i':
+                                param->infile[1] = optarg;
+                                break;
+                        case 'o':
+                                param->outfile = optarg;
+                                break;
+                        case 'q':
+                                param->quiet = 1;
+                                break;
+                        case '?':
+                                free_param(param);
+                                exit(1);
+                        break;
+                                default:
+                                abort ();
+                }
+        }
+      
+
+
+        if (optind < argc){
+                c = 0;
+                
+                
+                if(param->infile[1]){
+                	i = 3;
+                }else{
+                	i = 2;
+                }
+           //     fprintf(stderr,"EXTRA :%d\n",argc - optind); 
+                param->infile = realloc(param->infile,(sizeof(char*) * (argc - optind+i)));
+                for (c = i-1 ; c < (argc - optind+i);c++){
+                	param->infile[c] = 0;
+                }
+                c = i-1;
+                while (optind < argc){
+                        /*switch(c){
+                                case 0:
+                                        param->infile[c] =  argv[optind++];
+                                        break;
+                                case 1:
+                                        param->outfile =  argv[optind++];
+                                        break;
+                                default:
+                                        fprintf(stderr,"Unrecognised junk:%s\n",argv[optind++]);
+                                        break;
+                        }*/
+                        
+                        param->infile[c] =  argv[optind++];
+                        c++;
+		}
+        }
+	//exit(0);
+	if(param->quiet){
+		fclose(stderr);
+	}
+	fprintf(stderr,"%s", license);
+        if (param->help_flag){
+                fprintf(stderr,"%s\n", usage);
+                exit(1);
+        }
+	//exit(0);
+	
+        
+        /*if (!param->infile[1]){
+                fprintf(stderr,"%s\n", usage);
+                exit(1);
+        }*/
+        return param;
+}

Added: trunk/packages/kalign/branches/upstream/current/kalign2_input.c
===================================================================
--- trunk/packages/kalign/branches/upstream/current/kalign2_input.c	2006-11-19 13:38:57 UTC (rev 159)
+++ trunk/packages/kalign/branches/upstream/current/kalign2_input.c	2006-11-29 14:12:29 UTC (rev 160)
@@ -0,0 +1,1827 @@
+/*
+	kalign2_input.c 
+	
+	Released under GPL - see the 'COPYING' file   
+	
+	Copyright (C) 2006 Timo Lassmann <timolassmann at gmail.com>
+	
+	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
+	any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+    
+	Please send bug reports, comments etc. to:
+	timolassmann at gmail.com
+*/
+
+#include "kalign2.h"
+#include "kalign2_input.h"
+
+struct alignment* detect_and_read_sequences(struct alignment* aln,struct parameters* param)
+{
+	
+	int feature = 0;
+	char **input = 0;
+	unsigned short int* input_type = 0;
+	unsigned short int* input_numseq = 0;
+	
+	int num_input = 0;
+	int i = 0;
+	int j = 0;
+	int c = 0;
+	int free_read = 1;
+	while(free_read == 1 || param->infile[i]){
+		num_input++;
+		i++;
+		free_read = 0;
+	}
+	numseq = 0;
+
+	
+	input = malloc(sizeof(char*) * num_input);
+	input_type = malloc(sizeof(unsigned short int) * num_input);
+	input_numseq = malloc(sizeof(unsigned short int) * num_input);
+	
+	for (i = 0; i < num_input;i++){
+		input[i] = 0;
+		input_type[i] = 0;
+		input_numseq[i] = 0;
+	}
+
+	free_read = 0;
+	
+	if(param->quiet){
+		c = 1;
+	}else{
+		c = 0;
+	}
+	
+	
+	for (i = c; i < num_input;i++){
+		if(!param->infile[i]){
+			fprintf(stderr,"reading from STDIN: ");
+		}else{
+			fprintf(stderr,"reading from %s: ",param->infile[i]);
+		}
+		input[i] = get_input_into_string(input[i],param->infile[i]);
+		if(input[i]){
+			free_read++;
+			if (byg_start("<macsim>",input[i]) != -1){
+				input_numseq[i] = count_sequences_macsim(input[i]);
+				feature = 1;
+				input_type[i] = 1;
+			}else if (byg_start("<uniprot",input[i]) != -1){
+				input_numseq[i] = count_sequences_uniprot(input[i]);
+				input_type[i] = 2;
+			}else if(byg_start("This SWISS-PROT",input[i]) != -1){
+				input_numseq[i] = count_sequences_swissprot(input[i]);
+				input_type[i] = 3;
+			}else if (byg_start("This Swiss-Prot",input[i]) != -1){
+				input_numseq[i] = count_sequences_swissprot(input[i]);
+				input_type[i] = 3;
+			}else if (byg_start("CLUSTAL W",input[i]) != -1){
+				input_numseq[i] = count_sequences_clustalw(input[i]);
+				input_type[i] = 4;
+			}else if (byg_start("PileUp",input[i]) != -1){
+				input_numseq[i] = count_sequences_clustalw(input[i]);
+				input_type[i] = 4;
+			}else if (byg_start("MSF:",input[i]) != -1){
+				input_numseq[i] = count_sequences_clustalw(input[i]);
+				input_type[i] = 4;
+			}else if (byg_start("STOCKHOLM",input[i]) != -1){
+				input_numseq[i] = count_sequences_stockholm(input[i]);
+				input_type[i] = 5;
+			}else{
+				input_numseq[i]  = count_sequences_fasta(input[i]);
+				input_type[i] = 0;
+			}
+			fprintf(stderr,"found %d sequences\n",input_numseq[i]);
+			
+			if(input_numseq[i] < 2){
+				free(input[i]);
+				input[i] = 0;
+			}else{
+				numseq += input_numseq[i];
+			}
+		}else{
+			fprintf(stderr,"found no sequences.\n");
+			if(!param->outfile && i){
+				param->outfile = param->infile[i];
+				fprintf(stderr,"-> output file, in ");
+				//try to set format.... 
+				if(!param->format){
+					if (byg_start("msf",param->outfile) != -1){
+						param->format = "msf";
+					}else if (byg_start("clustal",param->outfile) != -1){
+						param->format = "clustal";
+					}else if (byg_start("aln",param->outfile) != -1){
+						param->format = "clustal";
+					}else if (byg_start("macsim",param->outfile) != -1){
+						param->format = "macsim";
+					}else{
+						param->format = "fasta";
+					}
+					if(param->reformat){
+						fprintf(stderr,"unaligned fasta format\n");
+					}else if(param->format){
+						fprintf(stderr,"%s format\n",param->format);
+					}else{
+						fprintf(stderr,"fasta format\n");
+					}
+				}
+			}
+			fprintf(stderr,"\n");
+		}
+	}
+
+	
+	if(!numseq){
+		fprintf(stderr,"%s\n", usage);
+		fprintf(stderr,"\nWARNING: No sequences found.\n\n");
+		for (i = 0; i < num_input;i++){
+			free(input[i]);
+		}
+		free(input_numseq);
+		free(input_type);
+		free(input);
+		free_param(param);
+		exit(0);
+	}
+
+	if(byg_start(param->alignment_type,"profPROFprofilePROFILE") != -1){
+		if( free_read  < 2){
+			fprintf(stderr,"\nWARNING: You are trying to perform a profile - profile alignment but ony one input file was detected.\n\n");
+			param->alignment_type = "default";
+		}
+	}
+
+	
+	if (param->feature_type && !feature){
+		fprintf(stderr,"\nWARNING: You are trying to perform a feature alignment but the input format(s) do not contain feature information.\n");
+		for (i = 0; i < num_input;i++){
+			free(input[i]);
+		}
+		free(input_numseq);
+		free(input_type);
+		free(input);
+		free_param(param);
+		exit(0);
+	}
+	
+	numprofiles = (numseq << 1) - 1;
+	aln = aln_alloc(aln);
+	//numseq = 0;
+	if(byg_start(param->alignment_type,"profPROFprofilePROFILE") != -1){
+		j = 0;
+		for (i = 0; i < num_input;i++){
+			if(input[i]){
+				switch(input_type[i]){
+					case 0:
+						aln = read_alignment(aln,input[i]);
+						break;
+					case 1:
+						aln = read_alignment_macsim_xml(aln,input[i]);
+						break;
+					case 2:
+						aln = read_alignment_uniprot_xml(aln,input[i]);
+						break;
+					case 3:
+						aln = read_alignment_from_swissprot(aln, input[i]);
+						break;
+					case 4:
+						aln = read_alignment_clustal(aln,input[i]);
+						break;
+					case 5:
+						aln = read_alignment_stockholm(aln,input[i]);
+						break;
+					
+					default:
+						aln = read_alignment(aln,input[i]);
+						break;
+				}
+				input[i] = 0;
+				//create partial profile....
+				aln->nsip[numseq+j] = input_numseq[i];
+				aln->sip[numseq+j] = malloc(sizeof(int)*aln->nsip[numseq+j]);
+				
+				//fprintf(stderr,"%d	%d\n",numseq+j,aln->sl[numseq+j]);
+				j++;
+			}
+		}
+		num_input = j;
+		c = 0;
+		for (i = 0;i < num_input;i++){
+		//	
+			for ( j = 0; j < aln->nsip[numseq+i];j++){
+				aln->sip[numseq+i][j] = c;
+				c++;
+		//		fprintf(stderr,"%d ",aln->sip[numseq+i][j]);
+			}
+			aln->sl[numseq+i] = aln->sl[aln->sip[numseq+i][0]];
+		//	fprintf(stderr,"PROFILE:%d	contains: %d long:%d\n",i+numseq,aln->nsip[numseq+i],aln->sl[numseq+i]);
+	//		fprintf(stderr,"\n");
+		}
+		
+		//sanity check -are all input 
+		int a,b;
+		for (i = 0;i < num_input;i++){
+			for ( j = 0; j < aln->nsip[numseq+i]-1;j++){
+				a = aln->sip[numseq+i][j];
+				a = aln->sl[a];
+				for (c =  j+1; j < aln->nsip[numseq+i];j++){
+					b = aln->sip[numseq+i][c];
+					b = aln->sl[b];
+					if(a != b){
+						fprintf(stderr,"Unaligned sequences in input %s.\n",param->infile[i]);
+						for (i = 0; i < num_input;i++){
+							free(input[i]);
+						}
+						free(input_numseq);
+						free(input_type);
+						free(input);
+						free_aln(aln);
+						free_param(param);
+						exit(0);
+					}
+				}
+				
+			}
+
+		}
+		
+		//exit(0);
+		
+		/*for (i = 0; i < numseq;i++){
+			fprintf(stderr,"len%d:%d\n",i,aln->sl[i]);	
+			for ( j =0 ; j < aln->sl[i];j++){
+				//if(aln->s[i][j]> 23 || aln->s[i][j] < 0){
+				//	 aln->s[i][j] = -1;
+				//}
+				fprintf(stderr,"%d ",aln->s[i][j]);
+			}
+		//	fprintf(stderr,"\n");
+		}
+		exit(0);*/
+	}else{
+		for (i = 0; i < num_input;i++){
+			if(input[i]){
+				switch(input_type[i]){
+					case 0:
+						aln = read_sequences(aln,input[i]);
+						break;
+					case 1:
+						aln = read_sequences_macsim_xml(aln,input[i]);
+						break;
+					case 2:
+						aln = read_sequences_uniprot_xml(aln,input[i]);
+						break;
+					case 3:
+						aln = read_sequences_from_swissprot(aln, input[i]);
+						break;
+					case 4:
+						aln = read_sequences_clustal(aln,input[i]);
+						break;
+					case 5:
+						aln = read_sequences_stockholm(aln,input[i]);
+						break;
+					
+					default:
+						aln = read_sequences(aln,input[i]);
+						break;
+				}
+				/*if (byg_start("<macsim>",input[i]) != -1){
+					aln = read_sequences_macsim_xml(aln,input[i]);
+				}else if (byg_start("<uniprot",input[i]) != -1){
+					aln = read_sequences_uniprot_xml(aln,input[i]);
+				}else if(byg_start("This SWISS-PROT entry is copyright.",input[i]) != -1){
+					aln = read_sequences_from_swissprot(aln, input[i]);
+				}else if (byg_start("This Swiss-Prot entry is copyright.",input[i]) != -1){
+					aln = read_sequences_from_swissprot(aln, input[i]);
+				}else if (byg_start("CLUSTAL W",input[i]) != -1){
+					aln = read_sequences_clustal(aln,input[i]);
+				}else if (byg_start("PileUp",input[i]) != -1){
+					aln = read_sequences_clustal(aln,input[i]);
+				}else if (byg_start("MSF:",input[i]) != -1){
+					aln = read_sequences_clustal(aln,input[i]);
+				}else if (byg_start("STOCKHOLM",input[i]) != -1){
+					aln = read_sequences_stockholm(aln,input[i]);
+				}else{
+					aln = read_sequences(aln,input[i]);
+				}*/
+				input[i] = 0;
+			}
+		}
+	}
+	if(numseq < 2){
+		fprintf(stderr,"\nNo sequences could be read.\n");
+		free_param(param);
+		exit(0);
+	}
+	if(!param->format && param->outfile){
+			if (byg_start("msf",param->outfile) != -1){
+				param->format = "msf";
+			}else if (byg_start("clustal",param->outfile) != -1){
+				param->format = "clustal";
+			}else if (byg_start("aln",param->outfile) != -1){
+				param->format = "clustal";
+			}else if (byg_start("macsim",param->outfile) != -1){
+				param->format = "macsim";
+			}
+			fprintf(stderr,"Output file: %s, in %s format.\n",param->outfile,param->format);
+	}
+	
+	
+	free(input);
+	free(input_type);
+	free(input_numseq);
+	return aln;
+}
+
+int count_sequences_macsim(char* string)
+{
+	int n = 0;
+	n = byg_count("<seq-name>",string);
+	if(!n){
+		return -1;
+	}
+	return n;
+}
+
+int count_sequences_swissprot(char* string)
+{
+	int n = 0;
+	n = byg_count("ID   ",string);
+	if(!n){
+		return 0;
+	}
+	return n;
+}
+
+int count_sequences_uniprot(char* string)
+{
+	int n = 0;
+	n = byg_count("<entry",string);
+	if(!n){
+		return 0;
+	}
+	return n;
+}
+
+int count_sequences_stockholm(char* string)
+{
+	char* p1 = string;
+	int i = 0;
+	int j = 0;
+	int n = 0;
+	while((i = byg_end("\n",p1))!=-1){
+		p1+=i;
+		if (!(byg_start("//",p1))){
+			break;
+		}	
+		j = byg_end("#",p1);
+		if(j != 1){
+			n++;
+		}
+	}
+	if(!n){
+		return 0;
+	}
+	return n;
+}
+
+int count_sequences_clustalw(char* string)
+{
+	char* p1 = string;
+	int i = 0;
+	int j = 0;
+	int c = 0;
+	int n = 0;
+	int f = 0;
+	
+
+	while((i = byg_end("\n",p1))!=-1){
+		p1+=i;
+		j = byg_end(" ",p1);
+		f = byg_end("\n",p1);
+		if(f > 2 && f>j && j!= 1){
+			if(c ==0){
+				i = j;
+				while(p1[i] != '\n'){
+					//if (!isspace((int)p1[i])){
+					//	len++;
+					//}
+					i++;
+				}		
+			}
+			c++;
+		}else{
+			if (c){
+				if(c > n){
+					n = c;
+				}
+				c =0;
+			}
+		}
+	}
+	if(!n){
+		return 0;
+	}
+	return n;
+}
+
+int count_sequences_fasta(char* string)
+{
+	int nbytes;
+	int i; 
+	int n = 0;
+	int stop = 0;
+	nbytes = strlen(string);
+	for (i =0;i < nbytes;i++){
+		if (string[i] == '>'&& stop == 0){
+			stop = 1;
+			n++;
+		}
+		if (string[i] == '\n'){
+			stop = 0;
+		}
+	}
+	if(!n){
+		return 0;
+	}
+	return n;
+}
+
+
+
+
+char* get_input_into_string(char* string,char* infile)
+{
+	int i = 0;   
+	int string_length = 2;
+	char c = 0;    
+	FILE *file = 0;
+	if(infile){
+		if (!(file = fopen( infile, "r" ))){
+			return 0;
+ 			fprintf(stderr,"Cannot open file '%s'\n", infile);
+			exit(1);
+		}
+		if (fseek(file,0,SEEK_END) != 0){
+			(void)fprintf(stderr, "ERROR: fseek failed\n");
+			(void)exit(EXIT_FAILURE);
+		}
+		i= ftell (file);
+		if (fseek(file,0,SEEK_START) != 0){
+			(void)fprintf(stderr, "ERROR: fseek failed\n");
+			(void)exit(EXIT_FAILURE);
+		}
+		string = malloc ((i+1)* sizeof(char));
+		fread(string,sizeof(char), i, file);
+		string[i] = 0;
+		fclose(file);
+	}else{
+		if (!isatty(0)){
+			string = malloc(sizeof(char*)*string_length);
+			while (!feof (stdin)){
+				c = getc(stdin);
+				if (i == string_length){
+					string_length <<=1;
+					string = realloc(string,sizeof(char)*string_length);
+				}
+				string[i] = c;
+				i++;
+			}
+			string[i-1] = 0;
+		}else{
+			return 0;
+		}
+	}
+	return string;
+}
+
+struct alignment* read_sequences_from_swissprot(struct alignment* aln,char* string)
+{
+	//int aacode[26] = {0,1,2,3,4,5,6,7,8,-1,9,10,11,12,-1,13,14,15,16,17,-1,18,19,20,21,22};
+	int aacode[26] = {0,1,2,3,4,5,6,7,8,-1,9,10,11,12,23,13,14,15,16,17,17,18,19,20,21,22};
+	int i,j,c,n;
+	char* p = 0;
+	p = string;
+	/*numseq = byg_count("ID   ",p);
+	if(!numseq){
+		fprintf(stderr,"No sequences found!\n");
+		exit(1);
+	}
+	aln = (struct alignment *) malloc(sizeof(struct alignment));
+	numprofiles = (numseq << 1) - 1;
+	aln->ft = 0;
+	aln->si = 0;
+	aln->s = malloc(sizeof(int*) * (numseq ));
+	aln->seq = malloc(sizeof(char*) * (numseq ));
+	aln->sl = malloc(sizeof(int) * (numprofiles));
+	aln->sip = malloc(sizeof(int*)* numprofiles);	
+	aln->nsip = malloc(sizeof(int)* numprofiles);
+	aln->sn = malloc(sizeof(char*) * numseq);
+	aln->lsn = malloc(sizeof(int) * numseq);
+	for (i =0;i < numprofiles;i++){
+		aln->sip[i] = 0;
+		aln->nsip[i] = 0;
+	}
+
+	for (i = numseq;i--;){
+		aln->sip[i] = malloc(sizeof(int)*1);
+		aln->nsip[i] = 1;
+		aln->sip[i][0] = i;
+	}*/
+	c = 0;
+	while(aln->sl[c]){
+		c++;
+	}
+
+	
+	while ((i = byg_end("ID   ",p)) != -1){
+		p+=i;
+		j = byg_start(" ",p);
+		aln->lsn[c] = j;
+		aln->sn[c] = malloc(sizeof(char)*(j+1));
+		for (i = 0;i < j;i++){
+			aln->sn[c][i] = p[i];
+		}
+		aln->sn[c][j] = 0;
+		p+= j;
+		j = byg_end("SQ   ",p);
+		p+= j;
+		j = byg_end("\n",p);
+		p+= j;
+		j = byg_start("//",p);
+
+		aln->s[c] = malloc(sizeof(int)*(j+1));
+		aln->seq[c] = malloc(sizeof(char)*(j+1));
+		n = 0;
+		for (i = 0;i < j;i++){
+			if(isalpha((int)p[i])){
+				aln->s[c][n] = aacode[toupper(p[i])-65];
+				aln->seq[c][n] = p[i];
+				n++;
+			}
+		}
+		aln->s[c][n] = 0;
+		aln->seq[c][n] = 0;
+		aln->sl[c] = n;
+		c++;
+	}
+	free(string);
+	return aln;
+}
+
+
+struct alignment* read_alignment_from_swissprot(struct alignment* aln,char* string)
+{
+	//int aacode[26] = {0,1,2,3,4,5,6,7,8,-1,9,10,11,12,-1,13,14,15,16,17,-1,18,19,20,21,22};
+	int aacode[26] = {0,1,2,3,4,5,6,7,8,-1,9,10,11,12,23,13,14,15,16,17,17,18,19,20,21,22};
+	int i,j,c,n;
+	char* p = 0;
+	p = string;
+	/*numseq = byg_count("ID   ",p);
+	if(!numseq){
+		fprintf(stderr,"No sequences found!\n");
+		exit(1);
+	}
+	aln = (struct alignment *) malloc(sizeof(struct alignment));
+	numprofiles = (numseq << 1) - 1;
+	aln->ft = 0;
+	aln->si = 0;
+	aln->s = malloc(sizeof(int*) * (numseq ));
+	aln->seq = malloc(sizeof(char*) * (numseq ));
+	aln->sl = malloc(sizeof(int) * (numprofiles));
+	aln->sip = malloc(sizeof(int*)* numprofiles);	
+	aln->nsip = malloc(sizeof(int)* numprofiles);
+	aln->sn = malloc(sizeof(char*) * numseq);
+	aln->lsn = malloc(sizeof(int) * numseq);
+	for (i =0;i < numprofiles;i++){
+		aln->sip[i] = 0;
+		aln->nsip[i] = 0;
+	}
+
+	for (i = numseq;i--;){
+		aln->sip[i] = malloc(sizeof(int)*1);
+		aln->nsip[i] = 1;
+		aln->sip[i][0] = i;
+	}*/
+	c = 0;
+	while(aln->sl[c]){
+		c++;
+	}
+
+	
+	while ((i = byg_end("ID   ",p)) != -1){
+		p+=i;
+		j = byg_start(" ",p);
+		aln->lsn[c] = j;
+		aln->sn[c] = malloc(sizeof(char)*(j+1));
+		for (i = 0;i < j;i++){
+			aln->sn[c][i] = p[i];
+		}
+		aln->sn[c][j] = 0;
+		p+= j;
+		j = byg_end("SQ   ",p);
+		p+= j;
+		j = byg_end("\n",p);
+		p+= j;
+		j = byg_start("//",p);
+
+		aln->s[c] = malloc(sizeof(int)*(j+1));
+		aln->seq[c] = malloc(sizeof(char)*(j+1));
+		n = 0;
+		for (i = 0;i < j;i++){
+			if((int)p[i] > 32){
+				if(isalpha((int)p[i])){
+					aln->s[c][n] = aacode[toupper(p[i])-65];
+				}else{
+					aln->s[c][n] = -1;
+				}
+				aln->seq[c][n] = p[i];
+				n++;
+			}
+		}
+		aln->s[c][n] = 0;
+		aln->seq[c][n] = 0;
+		aln->sl[c] = n;
+		c++;
+	}
+	free(string);
+	return aln;
+}
+
+struct alignment* read_sequences_macsim_xml(struct alignment* aln,char* string)
+{
+	int c = 0;
+	int n = 0;
+	int i = 0;
+	int j = 0;
+	char *p = 0;
+	int max = 0;
+	
+	int aacode[26] = {0,1,2,3,4,5,6,7,8,-1,9,10,11,12,23,13,14,15,16,17,17,18,19,20,21,22};
+	//int aacode[26] = {0,1,2,3,4,5,6,7,8,-1,9,10,11,12,-1,13,14,15,16,17,-1,18,19,20,21,22};
+
+	/*aln = (struct alignment*) malloc(sizeof(struct alignment));
+	numseq = byg_count("<seq-name>",string);
+	if(!numseq){
+		fprintf(stderr,"No sequences found!\n");
+		exit(1);
+	}
+	
+	numprofiles = (numseq << 1) - 1;
+	aln->s = malloc(sizeof(int*) * (numseq ));
+	aln->seq = malloc(sizeof(char*) * (numseq ));
+	aln->ft =  malloc(sizeof(struct feature* ) * (numseq));
+	aln->si  =  malloc(sizeof(struct sequence_information* ) * (numseq));
+	
+	aln->sl = malloc(sizeof(int) * (numprofiles));
+	aln->sip = malloc(sizeof(int*)* numprofiles);
+	aln->nsip = malloc(sizeof(int)* numprofiles);
+	aln->sn = malloc(sizeof(char*) * numseq);
+	aln->lsn = malloc(sizeof(int) * numseq);
+	
+	for (i =0;i < numprofiles;i++){
+		aln->sip[i] = 0;
+		aln->nsip[i] = 0;
+	}
+	for(i =0;i < numseq;i++){
+		aln->ft[i] = 0;
+		aln->si[i] = 0;
+		aln->sip[i] = malloc(sizeof(int)*1);
+		aln->nsip[i] = 1;
+		aln->sip[i][0] = i;
+	}*/
+		
+	p = string;
+	
+	if(byg_count("<g>",p)){
+		while((i = byg_start("<g>",p))!=-1){
+			p+=i;
+			j = byg_end("<r>",p);
+			for(i = 0; i< j;i++){
+				p[i] = ' ';
+			}
+			i = byg_start("</r>",p);
+			p+=i;
+			
+			j = byg_end("</g>",p);
+			for(i = 0; i< j;i++){
+				p[i] = ' ';
+			}
+			
+		}
+	}
+	p = string;
+
+	c = 0;
+	while(aln->sl[c]){
+		c++;
+	}
+	
+
+	
+	while((i = byg_end("<sequence",p))!=-1){	
+		p+=i;// p1 is at start of entry;
+		max = byg_end("</sequence>",p);
+			
+		i = byg_end("<seq-name>",p);
+		if(i < max){
+			p +=i; //p1 is at the end of the sequence name tag
+			j = byg_start("</seq-name>",p);
+		
+			aln->lsn[c] = j;
+			aln->sn[c] = malloc(sizeof(char)*(j+1));
+			for (i = 0;i < j;i++){
+				aln->sn[c][i] = p[i];
+			}
+			aln->sn[c][j] = 0;
+			
+		}
+		i = byg_end("<ftable>",p);
+		if(i < max){
+			aln->ft[c] = read_ft(aln->ft[c],p);
+		}
+		i = byg_end("<seq-data>",p);
+		if(i < max){
+			p+= i;
+			j = byg_start("</seq-data>",p);
+			aln->s[c] = malloc(sizeof(int)*(j+1));
+			aln->seq[c] = malloc(sizeof(char)*(j+1));
+			n = 0;
+			for (i = 0;i < j;i++){
+				if(isalpha((int)p[i])){
+					aln->s[c][n] = aacode[toupper(p[i])-65];
+					aln->seq[c][n] = p[i];
+					n++;
+				}
+			}
+			aln->s[c][n] = 0;
+			aln->seq[c][n] = 0;
+			aln->sl[c] = n;
+		}
+		
+		c++;
+	}
+	free(string);
+	return aln;
+}
+
+
+struct alignment* read_alignment_macsim_xml(struct alignment* aln,char* string)
+{
+	int c = 0;
+	int n = 0;
+	int i = 0;
+	int j = 0;
+	char *p = 0;
+	int max = 0;
+	
+	int aacode[26] = {0,1,2,3,4,5,6,7,8,-1,9,10,11,12,23,13,14,15,16,17,17,18,19,20,21,22};
+	//int aacode[26] = {0,1,2,3,4,5,6,7,8,-1,9,10,11,12,-1,13,14,15,16,17,-1,18,19,20,21,22};
+
+	/*aln = (struct alignment*) malloc(sizeof(struct alignment));
+	numseq = byg_count("<seq-name>",string);
+	if(!numseq){
+		fprintf(stderr,"No sequences found!\n");
+		exit(1);
+	}
+	
+	numprofiles = (numseq << 1) - 1;
+	aln->s = malloc(sizeof(int*) * (numseq ));
+	aln->seq = malloc(sizeof(char*) * (numseq ));
+	aln->ft =  malloc(sizeof(struct feature* ) * (numseq));
+	aln->si  =  malloc(sizeof(struct sequence_information* ) * (numseq));
+	
+	aln->sl = malloc(sizeof(int) * (numprofiles));
+	aln->sip = malloc(sizeof(int*)* numprofiles);
+	aln->nsip = malloc(sizeof(int)* numprofiles);
+	aln->sn = malloc(sizeof(char*) * numseq);
+	aln->lsn = malloc(sizeof(int) * numseq);
+	
+	for (i =0;i < numprofiles;i++){
+		aln->sip[i] = 0;
+		aln->nsip[i] = 0;
+	}
+	for(i =0;i < numseq;i++){
+		aln->ft[i] = 0;
+		aln->si[i] = 0;
+		aln->sip[i] = malloc(sizeof(int)*1);
+		aln->nsip[i] = 1;
+		aln->sip[i][0] = i;
+	}*/
+		
+	p = string;
+	
+	if(byg_count("<g>",p)){
+		while((i = byg_start("<g>",p))!=-1){
+			p+=i;
+			j = byg_end("<r>",p);
+			for(i = 0; i< j;i++){
+				p[i] = ' ';
+			}
+			i = byg_start("</r>",p);
+			p+=i;
+			
+			j = byg_end("</g>",p);
+			for(i = 0; i< j;i++){
+				p[i] = ' ';
+			}
+			
+		}
+	}
+	p = string;
+
+	c = 0;
+	while(aln->sl[c]){
+		c++;
+	}
+	
+
+	
+	while((i = byg_end("<sequence",p))!=-1){	
+		p+=i;// p1 is at start of entry;
+		max = byg_end("</sequence>",p);
+			
+		i = byg_end("<seq-name>",p);
+		if(i < max){
+			p +=i; //p1 is at the end of the sequence name tag
+			j = byg_start("</seq-name>",p);
+		
+			aln->lsn[c] = j;
+			aln->sn[c] = malloc(sizeof(char)*(j+1));
+			for (i = 0;i < j;i++){
+				aln->sn[c][i] = p[i];
+			}
+			aln->sn[c][j] = 0;
+			
+		}
+		i = byg_end("<ftable>",p);
+		if(i < max){
+			aln->ft[c] = read_ft(aln->ft[c],p);
+		}
+		i = byg_end("<seq-data>",p);
+		if(i < max){
+			p+= i;
+			j = byg_start("</seq-data>",p);
+			aln->s[c] = malloc(sizeof(int)*(j+1));
+			aln->seq[c] = malloc(sizeof(char)*(j+1));
+			n = 0;
+			for (i = 0;i < j;i++){
+				if((int)p[i]>32){
+					if(isalpha((int)p[i])){
+						aln->s[c][n] = aacode[toupper(p[i])-65];
+					}else{
+						aln->s[c][n] = -1;
+					}
+					aln->seq[c][n] = p[i];
+					n++;
+				}
+			}
+			aln->s[c][n] = 0;
+			aln->seq[c][n] = 0;
+			aln->sl[c] = n;
+		}
+		
+		c++;
+	}
+	free(string);
+	return aln;
+}
+
+
+struct feature* read_ft(struct feature* ft,char* p)
+{
+
+	int i,j;
+	struct feature *n = 0;
+	struct feature *old_n = 0;
+	char tmp[10];
+	char* p1 = 0;
+	p1 = p;
+	while((j = byg_end("<fitem>",p1))!= -1){
+		i = byg_end("</seq-info>",p1);
+		
+		if(j >i){
+			break;
+		}
+
+		n = malloc(sizeof(struct feature));
+		n->next = 0;
+		n->color = -1;
+
+		p1+=j;// p1 is at start of entry;
+		i = byg_end("<ftype>",p1);
+		p1 +=i; //p1 is at the end of the sequence name tag
+		j = byg_start("</ftype>",p1);
+
+		n->type = malloc(sizeof(char*)*(j+1));
+		for (i = 0; i < j;i++){
+			n->type[i] = p1[i];
+		}
+		n->type[j] = 0;
+		
+		i = byg_end("<fstart>",p1);
+		p1+= i;
+		j = byg_start("</fstart>",p1);
+		
+		for (i = 0; i < j;i++){
+			tmp[i] = p1[i];
+		}
+		tmp[j] = 0;
+		n->start = atoi(tmp);
+		i = byg_end("<fstop>",p1);
+		p1+= i;
+		j = byg_start("</fstop>",p1);
+		for (i = 0; i < j;i++){
+			tmp[i] = p1[i];
+		}
+		tmp[j] = 0;
+		n->end = atoi(tmp);
+
+		i = byg_end("<fnote>",p1);
+		p1+= i;
+		j = byg_start("</fnote>",p1);
+		n->note = malloc(sizeof(char*)*(j+1));
+		for (i = 0; i < j;i++){
+			n->note[i] = p1[i];
+		}
+		
+		n->note[j] = 0;
+
+		
+		if((old_n = ft)!= 0){
+			while(old_n->next!=0){
+				old_n = old_n->next;
+			}
+			old_n->next = n;
+		}else{
+			ft = n;
+		}
+		n = 0;
+	}
+	return ft;
+}
+
+struct alignment* read_sequences_uniprot_xml(struct alignment* aln,char* string)
+{
+	int c = 0;
+	int n = 0;
+	int i = 0;
+	int j = 0;
+	char *p1 = 0;
+
+	int aacode[26] = {0,1,2,3,4,5,6,7,8,-1,9,10,11,12,23,13,14,15,16,17,17,18,19,20,21,22};
+	//int aacode[26] = {0,1,2,3,4,5,6,7,8,-1,9,10,11,12,-1,13,14,15,16,17,-1,18,19,20,21,22};
+
+	/*aln = (struct alignment *) malloc(sizeof(struct alignment));
+	numseq = byg_count("<entry",string);
+	if(!numseq){
+		fprintf(stderr,"No sequences found!\n");
+		exit(1);
+	}
+	
+	numprofiles = (numseq << 1) - 1;
+	aln->s = malloc(sizeof(int*) * (numseq ));
+	aln->seq = malloc(sizeof(char*) * (numseq ));
+	aln->si = 0;
+	aln->ft = 0;
+	aln->sl = malloc(sizeof(int) * (numprofiles));
+	aln->sip = malloc(sizeof(int*)* numprofiles);
+	aln->nsip = malloc(sizeof(int)* numprofiles);
+	aln->sn = malloc(sizeof(char*) * numseq);
+	aln->lsn = malloc(sizeof(int) * numseq);
+	for (i =0;i < numprofiles;i++){
+		aln->sip[i] = 0;
+		aln->nsip[i] = 0;
+	}
+	for(i =0;i < numseq;i++){
+		aln->sip[i] = malloc(sizeof(int)*1);
+		aln->nsip[i] = 1;
+		aln->sip[i][0] = i;
+	}*/
+
+	p1 = string;
+
+	
+	c = 0;
+	while(aln->sl[c]){
+		c++;
+	}
+	
+	while((i = byg_end("<entry",p1))!=-1){
+		p1+=i;// p1 is at start of entry;
+		i = byg_end("<name>",p1);
+		p1 +=i; //p1 is at the end of the sequence name tag
+		j = byg_start("</name>",p1);
+		aln->lsn[c] = j;
+		aln->sn[c] = malloc(sizeof(char)*(j+1));
+		for (i = 0;i < j;i++){
+			aln->sn[c][i] = p1[i];
+		}
+		aln->sn[c][j] = 0;
+		i = byg_end("<sequence",p1);
+		p1+= i;
+		i = byg_end(">",p1);
+		p1 +=i;
+		j = byg_start("</sequence>",p1);
+		aln->s[c] = malloc(sizeof(int)*(j+1));
+		aln->seq[c] = malloc(sizeof(char)*(j+1));
+		n = 0;
+		for (i = 0;i < j;i++){
+			if(isalpha((int)p1[i])){
+				aln->s[c][n] = aacode[toupper(p1[i])-65];
+				aln->seq[c][n] = p1[i];
+				n++;
+			}
+		}
+		aln->s[c][n] = 0;
+		aln->seq[c][n] = 0;
+		aln->sl[c] = n;
+		c++;
+	}
+	free(string);
+	return aln;
+}
+
+
+
+struct alignment* read_alignment_uniprot_xml(struct alignment* aln,char* string)
+{
+	int c = 0;
+	int n = 0;
+	int i = 0;
+	int j = 0;
+	char *p1 = 0;
+
+	int aacode[26] = {0,1,2,3,4,5,6,7,8,-1,9,10,11,12,23,13,14,15,16,17,17,18,19,20,21,22};
+	//int aacode[26] = {0,1,2,3,4,5,6,7,8,-1,9,10,11,12,-1,13,14,15,16,17,-1,18,19,20,21,22};
+
+	/*aln = (struct alignment *) malloc(sizeof(struct alignment));
+	numseq = byg_count("<entry",string);
+	if(!numseq){
+		fprintf(stderr,"No sequences found!\n");
+		exit(1);
+	}
+	
+	numprofiles = (numseq << 1) - 1;
+	aln->s = malloc(sizeof(int*) * (numseq ));
+	aln->seq = malloc(sizeof(char*) * (numseq ));
+	aln->si = 0;
+	aln->ft = 0;
+	aln->sl = malloc(sizeof(int) * (numprofiles));
+	aln->sip = malloc(sizeof(int*)* numprofiles);
+	aln->nsip = malloc(sizeof(int)* numprofiles);
+	aln->sn = malloc(sizeof(char*) * numseq);
+	aln->lsn = malloc(sizeof(int) * numseq);
+	for (i =0;i < numprofiles;i++){
+		aln->sip[i] = 0;
+		aln->nsip[i] = 0;
+	}
+	for(i =0;i < numseq;i++){
+		aln->sip[i] = malloc(sizeof(int)*1);
+		aln->nsip[i] = 1;
+		aln->sip[i][0] = i;
+	}*/
+
+	p1 = string;
+
+	
+	c = 0;
+	while(aln->sl[c]){
+		c++;
+	}
+	
+	while((i = byg_end("<entry",p1))!=-1){
+		p1+=i;// p1 is at start of entry;
+		i = byg_end("<name>",p1);
+		p1 +=i; //p1 is at the end of the sequence name tag
+		j = byg_start("</name>",p1);
+		aln->lsn[c] = j;
+		aln->sn[c] = malloc(sizeof(char)*(j+1));
+		for (i = 0;i < j;i++){
+			aln->sn[c][i] = p1[i];
+		}
+		aln->sn[c][j] = 0;
+		i = byg_end("<sequence",p1);
+		p1+= i;
+		i = byg_end(">",p1);
+		p1 +=i;
+		j = byg_start("</sequence>",p1);
+		aln->s[c] = malloc(sizeof(int)*(j+1));
+		aln->seq[c] = malloc(sizeof(char)*(j+1));
+		n = 0;
+		for (i = 0;i < j;i++){
+			if((int)p1[i] > 32){
+				if(isalpha((int)p1[i])){
+					aln->s[c][n] = aacode[toupper(p1[i])-65];
+				}else{
+					aln->s[c][n] = -1;
+				}
+				aln->seq[c][n] = p1[i];
+				n++;
+			}
+		}
+		aln->s[c][n] = 0;
+		aln->seq[c][n] = 0;
+		aln->sl[c] = n;
+		c++;
+	}
+	free(string);
+	return aln;
+}
+
+struct alignment* read_sequences_stockholm(struct alignment* aln,char* string)
+{
+	int c = 0;
+	int n = 0;
+	int i = 0;
+	int j = 0;
+	char *p1 = 0;
+
+	int aacode[26] = {0,1,2,3,4,5,6,7,8,-1,9,10,11,12,23,13,14,15,16,17,17,18,19,20,21,22};
+	//int aacode[26] = {0,1,2,3,4,5,6,7,8,-1,9,10,11,12,-1,13,14,15,16,17,-1,18,19,20,21,22};
+
+	/*aln = (struct alignment*) malloc(sizeof(struct alignment));
+	p1 = string;
+	while((i = byg_end("\n",p1))!=-1){
+		p1+=i;
+		if (!(byg_start("//",p1))){
+			break;
+		}	
+		j = byg_end("#",p1);
+		if(j != 1){
+			numseq++;
+		}
+	}
+
+	numprofiles = (numseq << 1) - 1;
+	aln->s = malloc(sizeof(int*) * (numseq ));
+	aln->seq = malloc(sizeof(char*) * (numseq ));
+	aln->ft = 0;
+	aln->si = 0;
+	aln->sl = malloc(sizeof(int) * (numprofiles));
+	aln->sip = malloc(sizeof(int*)* numprofiles);
+	
+	aln->nsip = malloc(sizeof(int)* numprofiles);
+	aln->sn = malloc(sizeof(char*) * numseq);
+	aln->lsn = malloc(sizeof(int) * numseq);
+	for (i =0;i < numprofiles;i++){
+		aln->sip[i] = 0;
+		aln->nsip[i] = 0;
+	}
+	for(i =0;i < numseq;i++){
+		aln->sip[i] = malloc(sizeof(int)*1);
+		aln->nsip[i] = 1;
+		aln->sip[i][0] = i;
+	}*/
+
+	c = 0;
+	while(aln->sl[c]){
+		c++;
+	}
+
+	p1 = string;
+	while((i = byg_end("\n",p1))!=-1){
+		p1+=i;
+		if (!(byg_start("//",p1))){
+			break;
+		}	
+		j = byg_end("#",p1);
+		if(j != 1){
+			j = byg_start(" ",p1);
+			aln->lsn[c] = j;
+			aln->sn[c] = malloc(sizeof(char)*(j+1));
+			for (i = 0;i < j;i++){
+				aln->sn[c][i] = p1[i];
+			}
+			aln->sn[c][j] = 0;
+
+			
+			p1+=j;
+			j = byg_start("\n",p1);
+
+			aln->s[c] = malloc(sizeof(int)*(j+1));
+			aln->seq[c] = malloc(sizeof(char)*(j+1));
+			n = 0;
+			for (i = 0;i < j;i++){
+				if(isalpha((int)p1[i])){
+					aln->s[c][n] = aacode[toupper(p1[i])-65];
+					aln->seq[c][n] = p1[i];
+					n++;
+				}
+			}
+			aln->s[c][n] = 0;
+			aln->seq[c][n] = 0;
+			aln->sl[c] = n;
+			c++;
+		}
+	}
+
+	free(string);
+	return aln;
+}
+
+struct alignment* read_alignment_stockholm(struct alignment* aln,char* string)
+{
+	int c = 0;
+	int n = 0;
+	int i = 0;
+	int j = 0;
+	char *p1 = 0;
+
+	int aacode[26] = {0,1,2,3,4,5,6,7,8,-1,9,10,11,12,23,13,14,15,16,17,17,18,19,20,21,22};
+	//int aacode[26] = {0,1,2,3,4,5,6,7,8,-1,9,10,11,12,-1,13,14,15,16,17,-1,18,19,20,21,22};
+
+	/*aln = (struct alignment*) malloc(sizeof(struct alignment));
+	p1 = string;
+	while((i = byg_end("\n",p1))!=-1){
+		p1+=i;
+		if (!(byg_start("//",p1))){
+			break;
+		}	
+		j = byg_end("#",p1);
+		if(j != 1){
+			numseq++;
+		}
+	}
+
+	numprofiles = (numseq << 1) - 1;
+	aln->s = malloc(sizeof(int*) * (numseq ));
+	aln->seq = malloc(sizeof(char*) * (numseq ));
+	aln->ft = 0;
+	aln->si = 0;
+	aln->sl = malloc(sizeof(int) * (numprofiles));
+	aln->sip = malloc(sizeof(int*)* numprofiles);
+	
+	aln->nsip = malloc(sizeof(int)* numprofiles);
+	aln->sn = malloc(sizeof(char*) * numseq);
+	aln->lsn = malloc(sizeof(int) * numseq);
+	for (i =0;i < numprofiles;i++){
+		aln->sip[i] = 0;
+		aln->nsip[i] = 0;
+	}
+	for(i =0;i < numseq;i++){
+		aln->sip[i] = malloc(sizeof(int)*1);
+		aln->nsip[i] = 1;
+		aln->sip[i][0] = i;
+	}*/
+
+	c = 0;
+	while(aln->sl[c]){
+		c++;
+	}
+
+	p1 = string;
+	while((i = byg_end("\n",p1))!=-1){
+		p1+=i;
+		if (!(byg_start("//",p1))){
+			break;
+		}	
+		j = byg_end("#",p1);
+		if(j != 1){
+			j = byg_start(" ",p1);
+			aln->lsn[c] = j;
+			aln->sn[c] = malloc(sizeof(char)*(j+1));
+			for (i = 0;i < j;i++){
+				aln->sn[c][i] = p1[i];
+			}
+			aln->sn[c][j] = 0;
+
+			
+			p1+=j;
+			j = byg_start("\n",p1);
+
+			aln->s[c] = malloc(sizeof(int)*(j+1));
+			aln->seq[c] = malloc(sizeof(char)*(j+1));
+			n = 0;
+			for (i = 0;i < j;i++){
+				if((int)p1[i] > 32){
+					if(isalpha((int)p1[i])){
+						aln->s[c][n] = aacode[toupper(p1[i])-65];
+					}else{
+						aln->s[c][n] = -1;
+					}
+					aln->seq[c][n] = p1[i];
+					n++;
+				}
+			}
+			aln->s[c][n] = 0;
+			aln->seq[c][n] = 0;
+			aln->sl[c] = n;
+			c++;
+		}
+	}
+
+	free(string);
+	return aln;
+}
+
+
+struct alignment* read_sequences_clustal(struct alignment* aln,char* string)
+{
+	int c = 0;
+	int n = 0;
+	int len = 0;
+	int i = 0;
+	int j = 0;
+	int start = 0;
+	char *p1 = 0;
+	int local_numseq = 0;
+
+	int aacode[26] = {0,1,2,3,4,5,6,7,8,-1,9,10,11,12,23,13,14,15,16,17,17,18,19,20,21,22};
+	//int aacode[26] = {0,1,2,3,4,5,6,7,8,-1,9,10,11,12,-1,13,14,15,16,17,-1,18,19,20,21,22};
+
+
+	//aln = (struct alignment*) malloc(sizeof(struct alignment));
+	p1 = string;
+
+	while((i = byg_end("\n",p1))!=-1){
+		p1+=i;
+		j = byg_end(" ",p1);
+		n = byg_end("\n",p1);
+		if(n > 2 && n>j && j!= 1){
+			if(c ==0){
+				i = j;
+				while(p1[i] != '\n'){
+					if (!isspace((int)p1[i])){
+						len++;
+					}
+					i++;
+				}		
+			}
+			c++;
+		}else{
+			if (c){
+				if(c > local_numseq){
+					local_numseq = c;
+				}
+				c =0;
+			}
+		}
+	}
+
+	/*numprofiles = (numseq << 1) - 1;
+	aln->s = malloc(sizeof(int*) * (numseq ));
+	aln->seq = malloc(sizeof(char*) * (numseq ));
+	aln->ft = 0;
+	aln->si = 0;
+	aln->sl = malloc(sizeof(int) * (numprofiles));
+	aln->sip = malloc(sizeof(int*)* numprofiles);
+	aln->nsip = malloc(sizeof(int)* numprofiles);
+	aln->sn = malloc(sizeof(char*) * numseq);
+	aln->lsn = malloc(sizeof(int) * numseq);
+
+	for (i =0;i < numprofiles;i++){
+		aln->sip[i] = 0;
+		aln->nsip[i] = 0;
+	}
+
+	for(i =0;i < numseq;i++){
+		aln->lsn[i] = 0;
+		aln->sip[i] = malloc(sizeof(int)*1);
+		aln->nsip[i] = 1;
+		aln->sip[i][0] = i;
+		aln->sl[i] = 0;*/
+	start = 0;
+	while(aln->sl[start]){
+		start++;
+	}
+
+	for(i =start;i < local_numseq+start;i++){
+		aln->s[i] = malloc(sizeof(int)*(len+1));
+		aln->seq[i] = malloc(sizeof(char)*(len+1));
+	}
+
+	p1 = string;
+	c = start;
+	while((i = byg_end("\n",p1))!=-1){
+		p1+=i;
+		j = byg_end(" ",p1);
+		n = byg_end("\n",p1);
+		if(n > 2 && n>j && j!= 1){
+			if(aln->lsn[c] == 0){
+				aln->lsn[c] = j;
+				aln->sn[c] = malloc(sizeof(char)*(j+1));
+				for (i = 0;i < j;i++){
+					aln->sn[c][i] = p1[i];
+				}
+				aln->sn[c][j] = 0;
+			}
+			for (i = j;i < n;i++){
+				if(isalpha((int)p1[i])){
+					aln->s[c][aln->sl[c]] = aacode[toupper(p1[i])-65];
+					aln->seq[c][aln->sl[c]] = p1[i];
+					aln->sl[c]++;
+				}		
+			}		
+			c++;
+		}else{
+ 			if (c != start){
+				//c =0;
+				c = start;
+			}	
+		}
+	}
+	for (i = start; i < local_numseq+start;i++){
+		aln->s[i][aln->sl[i]] = 0;
+	}
+	free(string);
+	return aln;
+}
+
+
+struct alignment* read_alignment_clustal(struct alignment* aln,char* string)
+{
+	int c = 0;
+	int n = 0;
+	int len = 0;
+	int i = 0;
+	int j = 0;
+	int start = 0;
+	char *p1 = 0;
+	int local_numseq = 0;
+
+	int aacode[26] = {0,1,2,3,4,5,6,7,8,-1,9,10,11,12,23,13,14,15,16,17,17,18,19,20,21,22};
+	//int aacode[26] = {0,1,2,3,4,5,6,7,8,-1,9,10,11,12,-1,13,14,15,16,17,-1,18,19,20,21,22};
+
+
+	//aln = (struct alignment*) malloc(sizeof(struct alignment));
+	p1 = string;
+
+	while((i = byg_end("\n",p1))!=-1){
+		p1+=i;
+		j = byg_end(" ",p1);
+		n = byg_end("\n",p1);
+		if(n > 2 && n>j && j!= 1){
+			if(c ==0){
+				i = j;
+				while(p1[i] != '\n'){
+					if ((int)p1[i] > 32){
+						len++;
+					}
+					i++;
+				}		
+			}
+			c++;
+		}else{
+			if (c){
+				if(c > local_numseq){
+					local_numseq = c;
+				}
+				c =0;
+			}
+		}
+	}
+
+	/*numprofiles = (numseq << 1) - 1;
+	aln->s = malloc(sizeof(int*) * (numseq ));
+	aln->seq = malloc(sizeof(char*) * (numseq ));
+	aln->ft = 0;
+	aln->si = 0;
+	aln->sl = malloc(sizeof(int) * (numprofiles));
+	aln->sip = malloc(sizeof(int*)* numprofiles);
+	aln->nsip = malloc(sizeof(int)* numprofiles);
+	aln->sn = malloc(sizeof(char*) * numseq);
+	aln->lsn = malloc(sizeof(int) * numseq);
+
+	for (i =0;i < numprofiles;i++){
+		aln->sip[i] = 0;
+		aln->nsip[i] = 0;
+	}
+
+	for(i =0;i < numseq;i++){
+		aln->lsn[i] = 0;
+		aln->sip[i] = malloc(sizeof(int)*1);
+		aln->nsip[i] = 1;
+		aln->sip[i][0] = i;
+		aln->sl[i] = 0;*/
+	start = 0;
+	while(aln->sl[start]){
+		start++;
+	}
+
+	for(i =start;i < local_numseq+start;i++){
+		aln->s[i] = malloc(sizeof(int)*(len+1));
+		aln->seq[i] = malloc(sizeof(char)*(len+1));
+	}
+
+	p1 = string;
+	c = start;
+	while((i = byg_end("\n",p1))!=-1){
+		p1+=i;
+		j = byg_end(" ",p1);
+		n = byg_end("\n",p1);
+		if(n > 2 && n>j && j!= 1){
+			if(aln->lsn[c] == 0){
+				aln->lsn[c] = j;
+				aln->sn[c] = malloc(sizeof(char)*(j+1));
+				for (i = 0;i < j;i++){
+					aln->sn[c][i] = p1[i];
+				}
+				aln->sn[c][j] = 0;
+			}
+			for (i = j;i < n;i++){
+				if((int)p1[i] > 32){
+					if(isalpha((int)p1[i])){
+						aln->s[c][aln->sl[c]] = aacode[toupper(p1[i])-65];
+					}else{
+						aln->s[c][aln->sl[c]] = -1;
+					}
+					aln->seq[c][aln->sl[c]] = p1[i];
+					aln->sl[c]++;
+				}		
+			}		
+			c++;
+		}else{
+ 			if (c != start){
+				//c =0;
+				c = start;
+			}	
+		}
+	}
+	for (i = start; i < local_numseq+start;i++){
+		aln->s[i][aln->sl[i]] = 0;
+		aln->seq[i][aln->sl[i]] = 0;
+	}
+	free(string);
+	return aln;
+}
+
+struct alignment* read_sequences(struct alignment* aln,char* string)
+{
+	int c = 0;
+	int n = 0;
+	int i = 0;
+	int j = 0;
+	int stop = 0;
+	int start = 0;
+	int nbytes;
+	int local_numseq = 0;				// O	12				//U17
+	int aacode[26] = {0,1,2,3,4,5,6,7,8,-1,9,10,11,12,23,13,14,15,16,17,17,18,19,20,21,22};
+	nbytes = strlen(string);
+
+	//aln = (struct alignment*) malloc(sizeof(struct alignment));
+	for (i =0;i < nbytes;i++){
+		if (string[i] == '>'&& stop == 0){
+			stop = 1;
+			local_numseq++;
+		}
+		if (string[i] == '\n'){
+			stop = 0;
+		}
+	}
+	/*
+	if(!numseq){
+		fprintf(stderr,"No sequences found!\n");
+		exit(1);
+	}
+	numprofiles = (numseq << 1) - 1;
+	aln->s = malloc(sizeof(int*) * (numseq));
+	aln->seq = malloc(sizeof(char*) * (numseq));
+	aln->ft = 0;
+	aln->si = 0;
+	aln->sl = malloc(sizeof(int) * (numprofiles));
+	aln->sip = malloc(sizeof(int*)* numprofiles);
+	aln->nsip = malloc(sizeof(int)* numprofiles);
+	aln->sn = malloc(sizeof(char*) * numseq);
+	aln->lsn = malloc(sizeof(int) * numseq);
+	
+	for (i =0;i < numprofiles;i++){
+		aln->sip[i] = 0;
+		aln->nsip[i] = 0;
+	}*/
+	start = 0;
+	while(aln->sl[start]){
+		start++;
+	}
+	j = start;
+
+	for (i =0;i < nbytes;i++){
+		if (string[i] == '>' && stop == 0){
+			stop = 1;
+			aln->sl[j] =c;
+			j++;
+			c = 0;
+		}
+		if (string[i] == '\n'){
+			if(stop == 1){
+				aln->lsn[j-1] = n;
+				n = 0;
+			}
+			stop = 0;
+		}
+		if (stop == 1 && string[i] != '\n' && string[i] != 0 && string[i] != '>' ){
+			n++;
+		}
+		if (stop == 0 && string[i] != '\n' && string[i] != 0 ){
+			if (isalpha((int)string[i])){
+				c++;
+			}
+		}
+	}
+	aln->sl[j] = c;
+
+	for (i =1+start;i < local_numseq+1+start;i++){
+		if(!aln->sl[i]){
+			fprintf(stderr,"Sequence %d has a length of 0!!\n",i-1);
+			exit(1);
+		}
+		aln->sl[i-1] = aln->sl[i];
+	}
+	aln->sl[start+local_numseq] = 0;
+
+	//for (i = numseq;i--;){
+	for (i = start; i < local_numseq+start;i++){
+		aln->s[i] = malloc(sizeof(int)*(aln->sl[i]+1));
+		aln->seq[i] = malloc(sizeof(char)*(aln->sl[i]+1));
+		aln->sn[i] = malloc(sizeof(char)*(aln->lsn[i]+1));
+		//aln->sip[i] = malloc(sizeof(int)*1);
+		//aln->nsip[i] = 1;
+		//aln->sip[i][0] = i;
+	}
+
+	stop = 0;
+	j = start;
+	for (i =0;i < nbytes;i++){
+		if (string[i] == '>' && stop == 0 ){
+			stop = 1;
+			j++;
+			c = 0;
+		}
+		if (string[i] == '\n'){
+			if(stop == 1){
+				n = 0;
+			}
+			stop = 0;
+		}
+		if (stop == 1 &&string[i] != '\n' && string[i] != 0 && string[i] != '>' ){
+			aln->sn[j-1][n] = string[i];
+			n++;
+		}
+		if (stop == 0 && string[i] != '\n' && string[i] != 0 ){
+			if(isalpha((int)string[i])){
+				aln->s[j-1][c] = aacode[toupper(string[i])-65];
+				aln->seq[j-1][c] = string[i];
+				c++;
+			}
+		}
+	}
+
+	for (i = start;i< local_numseq+start;i++){
+		aln->s[i][aln->sl[i]] = 0;
+		aln->seq[i][aln->sl[i]] = 0;
+		aln->sn[i][aln->lsn[i]] = 0;
+	}	
+
+	free(string);
+	return aln;
+}
+
+
+struct alignment* read_alignment(struct alignment* aln,char* string)
+{
+	int c = 0;
+	int n = 0;
+	int i = 0;
+	int j = 0;
+	int stop = 0;
+	int start = 0;
+	int nbytes;
+	int local_numseq = 0;				// O	12				//U17
+	int aacode[26] = {0,1,2,3,4,5,6,7,8,-1,9,10,11,12,23,13,14,15,16,17,17,18,19,20,21,22};
+	nbytes = strlen(string);
+
+	//aln = (struct alignment*) malloc(sizeof(struct alignment));
+	for (i =0;i < nbytes;i++){
+		if (string[i] == '>'&& stop == 0){
+			stop = 1;
+			local_numseq++;
+		}
+		if (string[i] == '\n'){
+			stop = 0;
+		}
+	}
+	/*
+	if(!numseq){
+		fprintf(stderr,"No sequences found!\n");
+		exit(1);
+	}
+	numprofiles = (numseq << 1) - 1;
+	aln->s = malloc(sizeof(int*) * (numseq));
+	aln->seq = malloc(sizeof(char*) * (numseq));
+	aln->ft = 0;
+	aln->si = 0;
+	aln->sl = malloc(sizeof(int) * (numprofiles));
+	aln->sip = malloc(sizeof(int*)* numprofiles);
+	aln->nsip = malloc(sizeof(int)* numprofiles);
+	aln->sn = malloc(sizeof(char*) * numseq);
+	aln->lsn = malloc(sizeof(int) * numseq);
+	
+	for (i =0;i < numprofiles;i++){
+		aln->sip[i] = 0;
+		aln->nsip[i] = 0;
+	}*/
+	start = 0;
+	while(aln->sl[start]){
+		start++;
+	}
+	j = start;
+
+	for (i =0;i < nbytes;i++){
+		if (string[i] == '>' && stop == 0){
+			stop = 1;
+			aln->sl[j] =c;
+			j++;
+			c = 0;
+		}
+		if (string[i] == '\n'){
+			if(stop == 1){
+				aln->lsn[j-1] = n;
+				n = 0;
+			}
+			stop = 0;
+		}
+		if (stop == 1 && string[i] != '\n' && string[i] != 0 && string[i] != '>' ){
+			n++;
+		}
+		if (stop == 0 && string[i] != '\n' && string[i] != 0 ){
+			if ((int)string[i] > 32){
+				c++;
+			}
+		}
+	}
+	aln->sl[j] = c;
+
+	for (i =1+start;i < local_numseq+1+start;i++){
+		if(!aln->sl[i]){
+			fprintf(stderr,"Sequence %d has a length of 0!!\n",i-1);
+			exit(1);
+		}
+		aln->sl[i-1] = aln->sl[i];
+	}
+	aln->sl[start+local_numseq] = 0;
+	//fprintf(stderr,"set to 0 : %d\n",start+local_numseq);
+	//for (i = numseq;i--;){
+	for (i = start; i < local_numseq+start;i++){
+	//	fprintf(stderr,"len:%d %d\n",i,aln->sl[i]);
+		aln->s[i] = malloc(sizeof(int)*(aln->sl[i]+1));
+		aln->seq[i] = malloc(sizeof(char)*(aln->sl[i]+1));
+		aln->sn[i] = malloc(sizeof(char)*(aln->lsn[i]+1));
+		//aln->sip[i] = malloc(sizeof(int)*1);
+		//aln->nsip[i] = 1;
+		//aln->sip[i][0] = i;
+	}
+
+	stop = 0;
+	j = start;
+	for (i =0;i < nbytes;i++){
+		if (string[i] == '>' && stop == 0 ){
+			stop = 1;
+			j++;
+			c = 0;
+		}
+		if (string[i] == '\n'){
+			if(stop == 1){
+				n = 0;
+			}
+			stop = 0;
+		}
+		if (stop == 1 &&string[i] != '\n' && string[i] != 0 && string[i] != '>' ){
+			aln->sn[j-1][n] = string[i];
+			n++;
+		}
+		if (stop == 0 && string[i] != '\n' && string[i] != 0 ){
+			if((int) string[i] > 32 ){
+				if(isalpha((int)string[i])){
+					aln->s[j-1][c] = aacode[toupper(string[i])-65];
+				}else{
+					aln->s[j-1][c] = -1;
+				}
+				aln->seq[j-1][c] = string[i];
+				c++;
+			}
+		}
+	}
+
+	for (i = start;i< local_numseq+start;i++){
+		aln->s[i][aln->sl[i]] = 0;
+		aln->seq[i][aln->sl[i]] = 0;
+		aln->sn[i][aln->lsn[i]] = 0;
+	}	
+
+	free(string);
+	return aln;
+}
+

Added: trunk/packages/kalign/branches/upstream/current/kalign2_input.h
===================================================================
--- trunk/packages/kalign/branches/upstream/current/kalign2_input.h	2006-11-19 13:38:57 UTC (rev 159)
+++ trunk/packages/kalign/branches/upstream/current/kalign2_input.h	2006-11-29 14:12:29 UTC (rev 160)
@@ -0,0 +1,119 @@
+/*
+	kalign2_input.h 
+	
+	Released under GPL - see the 'COPYING' file   
+	
+	Copyright (C) 2006 Timo Lassmann <timolassmann at gmail.com>
+	
+	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
+	any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+    
+	Please send bug reports, comments etc. to:
+	timolassmann at gmail.com
+*/
+
+
+#include <unistd.h>
+#include <string.h>
+#include <ctype.h>
+
+#define SEEK_START 0
+#define SEEK_END 2
+
+struct alignment* read_sequences(struct alignment* aln,char* string);
+struct alignment* read_sequences_from_swissprot(struct alignment* aln,char* string);
+struct alignment* read_sequences_uniprot_xml(struct alignment* aln,char* string);
+struct alignment* read_sequences_macsim_xml(struct alignment* aln,char* string);
+struct feature* read_ft(struct feature* ft,char* p);
+struct alignment* read_sequences_clustal(struct alignment* aln,char* string);
+struct alignment* read_sequences_stockholm(struct alignment* aln,char* string);
+
+struct alignment* read_alignment(struct alignment* aln,char* string);
+struct alignment* read_alignment_from_swissprot(struct alignment* aln,char* string);
+struct alignment* read_alignment_uniprot_xml(struct alignment* aln,char* string);
+struct alignment* read_alignment_macsim_xml(struct alignment* aln,char* string);
+struct feature* read_ft(struct feature* ft,char* p);
+struct alignment* read_alignment_clustal(struct alignment* aln,char* string);
+struct alignment* read_alignment_stockholm(struct alignment* aln,char* string);
+
+char* get_input_into_string(char* string,char* infile);
+
+
+
+int count_sequences_macsim(char* string);
+int count_sequences_swissprot(char* string);
+int count_sequences_uniprot(char* string);
+int count_sequences_stockholm(char* string);
+int count_sequences_clustalw(char* string);
+int count_sequences_fasta(char* string);
+
+static char  usage[] = "\n\
+        Usage: kalign2   [INFILE] [OUTFILE] [OPTIONS]\n\
+        \n\
+	Options:\n\n\
+        -s,	-gapopen          Gap open penalty\n\
+        	-gap_open\n\
+        	-gpo\n\
+        	\n\
+        -e,	-gapextension     Gap extension penalty\n\
+        	-gap_ext\n\
+        	-gpe\n\
+        	\n\
+        -t,	-terminal_gap_extension_penalty	Terminal gap penalties\n\
+        	-tgpe\n\
+        	\n\
+        -m,	-matrix_bonus     A constant added to the substitution matrix.\n\
+        	-bonus\n\
+        	\n\
+        -c,	-sort            The order in which the sequences appear in the output alignment.\n\
+		                   <input, tree, gaps.>\n\
+		\n\
+        -g,	-feature          Selects feature mode and specifies which features are to be used:\n\
+		                   e.g. all, maxplp, STRUCT, PFAM-A....\n\
+        	\n\
+        -d,	-distance         Distance method.\n\
+		                   <wu,pair>\n\
+		\n\
+        -b,	-guide-tree       Guide tree method.\n\
+		-tree             <nj,upgma>\n\
+		\n\
+	-z,	-zcutoff         Parameter used in the wu-manber based distance calculation\n\
+		\n\
+        -i,	-input            The input file.\n\
+        	-infile\n\
+        	-in\n\
+        	\n\
+        -o,	-output           The output file.\n\
+        	-outfile\n\
+        	-out\n\
+        	\n\
+        -f,	-format           The output format:\n\
+		                   <fasta, msf, aln, clu, macsim>\n\
+		\n\
+	-q,	-quiet            Print nothing to STDERR.\n\
+		                  Read nothing from STDIN\n\
+	\n\
+	Examples:\n\n\
+	Using pipes:\n\
+		kalign2 [OPTIONS] < [INFILE]   > [OUTFILE]\n\
+		more [INFILE] |  kalign2 [OPTIONS] > [OUTFILE]\n\
+         \n\
+	Relaxed gap penalties:\n\
+		kalign2 -gpo 60 -gpe 9 -tgpe 0 -bonus 0 < [INFILE]   > [OUTFILE]\n\
+         \n\
+        Feature alignment with pairwise alignment based distance method and NJ guide tree:\n\
+        	kalign2 -in test.xml -distance pair -tree nj -sort gaps -feature STRUCT -format macsim -out test.macsim\n\
+        ";
+
+

Added: trunk/packages/kalign/branches/upstream/current/kalign2_main.c
===================================================================
--- trunk/packages/kalign/branches/upstream/current/kalign2_main.c	2006-11-19 13:38:57 UTC (rev 159)
+++ trunk/packages/kalign/branches/upstream/current/kalign2_main.c	2006-11-29 14:12:29 UTC (rev 160)
@@ -0,0 +1,303 @@
+/*
+	kalign2_main.c 
+	
+	Released under GPL - see the 'COPYING' file   
+	
+	Copyright (C) 2006 Timo Lassmann <timolassmann at gmail.com>
+	
+	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
+	any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+    
+	Please send bug reports, comments etc. to:
+	timolassmann at gmail.com
+*/
+
+
+#include "kalign2.h"
+
+
+
+unsigned int numseq = 0;
+unsigned int numprofiles = 0;
+float gpo = 0;
+float gpe = 0;
+float tgpe = 0;
+
+int main(int argc,char **argv)
+{
+	int i;
+	int* tree = 0;
+	int a, b, c;
+	
+	struct alignment* aln = 0;
+	struct parameters* param = 0;
+	struct aln_tree_node* tree2 = 0;
+	
+	param = malloc(sizeof(struct parameters));
+	
+	param =  interface(param,argc,argv);
+	
+	aln = detect_and_read_sequences(aln,param);
+	
+	if(param->ntree > numseq){
+		param->ntree = numseq;
+	}
+
+	//DETECT DNA
+	if(param->dna == -1){
+		for (i = 0; i < numseq;i++){
+			param->dna = byg_detect(aln->s[i],aln->sl[i]);
+			if(param->dna){
+				break;
+			}
+		}
+	}
+	//param->dna = 0;
+	//fprintf(stderr,"DNA:%d\n",param->dna);
+	//exit(0);
+	
+	if(param->dna == 1){
+		//brief sanity check...
+		for (i = 0; i < numseq;i++){
+			if(aln->sl[i] < 6){
+				fprintf(stderr,"Dna/Rna alignments are only supported for sequences longer than 6.");
+				free(param);
+				free_aln(aln);
+				exit(0);
+			}
+		}
+		aln =  make_dna(aln);
+	}
+
+	int j;
+	
+	if(param->reformat){
+		for (i = 0 ;i < numseq;i++){
+			aln->nsip[i] = i;
+			for (j = 0; j < aln->sl[i];j++){
+				aln->s[i][j] = 0;
+			}
+		}
+		param->format = "fasta";//param->reformat;
+		output(aln,param);
+		exit(1);
+	}
+	
+	
+	
+	//fast distance calculation;
+	float** submatrix = 0;
+	submatrix = read_matrix(submatrix,param); // sets gap penalties as well.....
+	
+	if(!param->quiet){
+		parameter_message(param);
+	}
+	
+	if(byg_start(param->alignment_type,"profPROFprofilePROFILE") != -1){
+		profile_alignment_main(aln,param,submatrix);
+	}
+	
+	float** dm = 0;
+	if(param->ntree > 1){
+		if(byg_start(param->distance,"pairclustalPAIRCLUSTAL") != -1){
+			if(byg_start(param->tree,"njNJ") != -1){
+				dm = protein_pairwise_alignment_distance(aln,dm,param,submatrix,1);
+			}else{
+				dm = protein_pairwise_alignment_distance(aln,dm,param,submatrix,0);
+			}
+		}else if(byg_start("wu",param->alignment_type) != -1){
+			dm =  protein_wu_distance2(aln,dm,param);
+		//	param->feature_type = "wumanber";
+		}else if(param->dna == 1){
+			if(byg_start(param->tree,"njNJ") != -1){
+				dm =  dna_distance(aln,dm,param,1);
+			}else{
+				dm =  dna_distance(aln,dm,param,0);
+			}
+		}else{
+			if(byg_start(param->tree,"njNJ") != -1){
+				dm =  protein_wu_distance(aln,dm,param,1);
+			}else{
+				dm =  protein_wu_distance(aln,dm,param,0);
+			}
+		}
+		/*int j; 
+		for (i = 0; i< numseq;i++){
+			for (j = 0; j< numseq;j++){
+				fprintf(stderr,"%f	",dm[i][j]);
+			}
+			fprintf(stderr,"\n");
+		}*/
+
+		if(byg_start(param->tree,"njNJ") != -1){
+			tree2 = real_nj(dm,param->ntree);
+		}else{
+			tree2 = real_upgma(dm,param->ntree);
+		}
+		if(param->print_tree){
+			print_tree(tree2,aln,param->print_tree);
+		}
+	}
+
+	tree = malloc(sizeof(int)*(numseq*3+1));
+	for ( i = 1; i < (numseq*3)+1;i++){
+		tree[i] = 0;
+	}
+	tree[0] = 1; 
+	
+	if(param->ntree < 2){
+		tree[0] = 0;
+		tree[1] = 1;
+		
+		c = numseq;
+		tree[2] = c;
+		a = 2;
+		for ( i = 3; i < (numseq-1)*3;i+=3){
+			tree[i] = a;
+			tree[i+1] = c;
+			c++;
+			tree[i+2] = c;
+			a++;
+		}
+	}else if(param->ntree > 2){
+		ntreeify(tree2,param->ntree);
+	}else{
+		tree = readtree(tree2,tree);
+		for (i = 0; i < (numseq*3);i++){
+			tree[i] = tree[i+1];
+		}
+		free(tree2->links);
+		free(tree2->internal_lables);
+		free(tree2);
+	}
+
+	
+
+
+	//get matrices... 
+	struct feature_matrix* fm = 0;
+	
+	struct ntree_data* ntree_data = 0;
+	
+	int** map = 0;
+	if(param->ntree > 2){
+		ntree_data = malloc(sizeof(struct ntree_data));
+		ntree_data->realtree = tree2;
+		ntree_data->aln = aln;
+		ntree_data->profile = 0;
+		ntree_data->map = 0;
+		ntree_data->ntree = param->ntree;
+		ntree_data->submatrix = submatrix;
+		ntree_data->tree = tree; 
+		
+		ntree_data = ntree_alignment(ntree_data);
+		map = ntree_data->map;
+		tree = ntree_data->tree;
+		for (i = 0; i < (numseq*3);i++){
+			tree[i] = tree[i+1];
+		}
+		free(ntree_data);
+	}else if (param->feature_type){
+		fm = get_feature_matrix(fm,aln,param->feature_type);
+		if(!fm){
+			for (i = 32;i--;){
+				free(submatrix[i]);
+			}
+			free(submatrix);
+			free_param(param);
+			free(map);
+			free(tree);
+			exit(0);
+		}
+		
+		map = feature_hirschberg_alignment(aln,tree,submatrix,map,fm);
+		//exit(0);
+		//map =  feature_alignment(aln,tree,submatrix, map,fm);
+		
+	}else if (byg_start("fast",param->alignment_type) != -1){
+		map =  default_alignment(aln,tree,submatrix, map);
+	}else if(param->dna == 1){
+		map =  dna_alignment(aln,tree,submatrix, map);
+	/*}else if (byg_start("test",param->alignment_type) != -1){
+		map =  test_alignment(aln,tree,submatrix, map,param->internal_gap_weight,param->smooth_window,param->smooth_strength);
+	}else if (param->aa){
+		map =  aa_alignment(aln,tree,submatrix, map,param->aa);
+	}else if (param->alter_gaps){
+		map = alter_gaps_alignment(aln,tree,submatrix,map,param->alter_gaps,param->alter_range,param->alter_weight);
+	}else if (byg_start("altergaps",param->alignment_type) != -1){
+		map = alter_gaps_alignment(aln,tree,submatrix,map,param->alter_gaps,param->alter_range,param->alter_weight);
+	}else if(byg_start("simple",param->alignment_type) != -1){
+		map =  simple_hirschberg_alignment(aln,tree,submatrix, map);*/
+	}else if(byg_start("advanced",param->alignment_type) != -1){
+		map =  advanced_hirschberg_alignment(aln,tree,submatrix, map,param->smooth_window,param->smooth_strength,param->internal_gap_weight);
+	}else{
+		map =  hirschberg_alignment(aln,tree,submatrix, map,param->smooth_window,param->smooth_strength);
+	}
+	
+	
+	//clear up sequence array to be reused as gap array....
+	int *p = 0;
+	for (i = 0; i < numseq;i++){
+		p = aln->s[i];
+		for (a = 0; a < aln->sl[i];a++){
+			p[a] = 0;
+		}
+	}
+	//clear up
+	
+	for (i = 0; i < (numseq-1)*3;i +=3){
+		a = tree[i];
+		b = tree[i+1];
+		aln = make_seq(aln,a,b,map[tree[i+2]]);
+	}
+	
+	//for (i = 0; i < numseq;i++){
+	//	fprintf(stderr,"%s	%d\n",aln->sn[i],aln->nsip[i]);
+	//}
+
+	
+	for (i = 0; i < numseq;i++){
+		aln->nsip[i] = 0;
+	}
+	
+	
+	
+	aln =  sort_sequences(aln,tree,param->sort);
+
+	//for (i = 0; i < numseq;i++){
+	//	fprintf(stderr,"%d	%d	%d\n",i,aln->nsip[i],aln->sip[i][0]);
+	//}
+	
+	
+	output(aln,param);
+/*	if(!param->format){
+		fasta_output(aln,param->outfile);
+	}else{
+		if (byg_start("msf",param->format) != -1){
+			msf_output(aln,param->outfile);
+		}else if (byg_start("clustal",param->format) != -1){
+			clustal_output(aln,param->outfile);
+		}else if (byg_start("macsim",param->format) != -1){
+			macsim_output(aln,param->outfile,param->infile[0]);
+		}
+	}
+	free_param(param);*/
+	
+	free(map);
+	free(tree);
+	return 0;
+}
+
+
+

Added: trunk/packages/kalign/branches/upstream/current/kalign2_mem.c
===================================================================
--- trunk/packages/kalign/branches/upstream/current/kalign2_mem.c	2006-11-19 13:38:57 UTC (rev 159)
+++ trunk/packages/kalign/branches/upstream/current/kalign2_mem.c	2006-11-29 14:12:29 UTC (rev 160)
@@ -0,0 +1,291 @@
+/*
+	kalign2_mem.c 
+	
+	Released under GPL - see the 'COPYING' file   
+	
+	Copyright (C) 2006 Timo Lassmann <timolassmann at gmail.com>
+	
+	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
+	any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+    
+	Please send bug reports, comments etc. to:
+	timolassmann at gmail.com
+*/
+
+#include "kalign2.h"
+
+void freesimpletree(struct tree_node* p)
+{
+	if(p->left){
+		freesimpletree(p->left);
+	}
+	if(p->right){
+		freesimpletree(p->right);
+	}
+	free(p);
+}
+
+void free_real_tree(struct aln_tree_node* p)
+{
+	int i = 0;
+	while(p->links[i]){
+		free_real_tree(p->links[i]);
+		i++;	
+	}
+	free(p->internal_lables);
+	free(p->links);
+	free(p);
+}
+
+
+void free_feature_matrix(struct feature_matrix* fm)
+{
+	int i;
+	for (i = 0;i < fm->mdim;i++){
+		free(fm->m[i]);
+	}
+	free(fm->m);
+	free(fm);
+}
+
+
+void free_utf(struct utype_ufeat* utf)
+{
+	free_ft(utf->t);
+	free_ft(utf->f);
+	free(utf);
+}
+
+/*#ifndef MEMORY 
+void* malloc(int size)
+{
+	void* p;
+	p = (void*)malloc(size);
+	
+	if (!p){
+		fprintf(stderr,"Out of memory!\n");
+		exit(0);
+	}
+	return p;
+}
+#endif*/
+struct names* names_alloc(struct names* n)
+{
+	int i;
+	n = malloc(sizeof(struct names));
+	n->start = malloc(sizeof(int)*numseq);
+	n->end = malloc(sizeof(int)*numseq);
+	n->len = malloc(sizeof(int)*numseq);
+	
+	for (i = 0; i < numseq;i++){
+		n->start[i] = 0;
+ 		n->end[i] = 0;//aln->lsn[i];
+ 		n->len[i] = 0;
+	}
+	return n;
+}
+
+void names_free(struct names* n)
+{
+	free(n->start);
+	free(n->end);
+	free(n->len);
+	free(n);
+}
+
+
+struct alignment* aln_alloc(struct alignment* aln)
+{
+	int i;
+	aln = (struct alignment*) malloc(sizeof(struct alignment));
+	aln->s = malloc(sizeof(int*) * (numseq ));
+	aln->seq = malloc(sizeof(char*) * (numseq ));
+	aln->ft =  malloc(sizeof(struct feature* ) * (numseq));
+	aln->si  =  malloc(sizeof(struct sequence_information* ) * (numseq));
+	aln->sl = malloc(sizeof(unsigned int) * (numprofiles));
+	aln->sip = malloc(sizeof(unsigned int*)* numprofiles);
+	
+	aln->nsip = malloc(sizeof(unsigned int)* numprofiles);
+	aln->sn = malloc(sizeof(char*) * numseq);
+	aln->lsn = malloc(sizeof(unsigned int) * numseq);
+	for (i =0;i < numprofiles;i++){
+		aln->sip[i] = 0;
+		aln->nsip[i] = 0;
+		aln->sl[i] = 0;
+	}
+	
+	for(i =0;i < numseq;i++){
+		aln->lsn[i] = 0;
+		aln->ft[i] = 0;
+		aln->si[i] = 0;
+		aln->sip[i] = malloc(sizeof(int)*1);
+		aln->nsip[i] = 1;
+		aln->sip[i][0] = i;
+	}
+	return aln;
+}
+
+
+void free_aln(struct alignment* aln)
+{
+	int i;
+	for (i = numseq;i--;){
+		free(aln->s[i]);
+		free(aln->seq[i]);
+		free(aln->sn[i]);
+	}
+
+	if(aln->ft){
+		for(i = numseq;i--;){
+			free_ft(aln->ft[i]);
+		}
+		free(aln->ft);
+	}
+	if(aln->si){
+		free(aln->si);
+	}
+
+	for (i = numprofiles;i--;){
+		if(aln->sip[i]){
+			free(aln->sip[i]);
+		}
+	}
+	free(aln->seq);
+	free(aln->s);
+	free(aln->sn);
+	free(aln->sl);
+	free(aln->lsn);
+	free(aln->sip);
+	free(aln->nsip);
+	free(aln);
+}
+
+
+void free_param(struct parameters* param)
+{
+	free(param->infile);
+	free(param);
+}
+
+void free_ft(struct feature* n)
+{
+	struct feature* old_n = 0;
+	 if (n != NULL){
+	 	old_n = n;
+	 	n= n ->next;
+	 	free(old_n->type);
+	 	free(old_n->note);
+ 	 	free(old_n);
+		free_ft(n);
+	}
+}
+
+struct hirsch_mem* hirsch_mem_alloc(struct hirsch_mem* hm,int x)
+{
+
+	// a=((typeof(a))(((int)(((void *)malloc(c+15))+15))&-16)). 
+	hm = (struct hirsch_mem *) malloc(sizeof(struct hirsch_mem));
+	hm->starta = 0;
+	hm->startb = 0;
+	hm->enda = 0;
+	hm->endb = 0;
+	hm->size = x;
+	hm->len_a = 0;
+	hm->len_b = 0;
+	hm->f = malloc(sizeof(struct states)* (x+1));
+	hm->b = malloc(sizeof(struct states)* (x+1));
+	return hm;
+}
+
+struct hirsch_mem* hirsch_mem_realloc(struct hirsch_mem* hm,int x)
+{
+	hm->starta = 0;
+	hm->startb = 0;
+	hm->enda = 0;
+	hm->endb = 0;
+	hm->len_a = 0;
+	hm->len_b = 0;
+	hm->size = x;
+	hm->f = realloc(hm->f,sizeof(struct states)* (x+1));
+	hm->b = realloc(hm->b,sizeof(struct states)* (x+1));
+	return hm;
+}
+
+void hirsch_mem_free(struct hirsch_mem* hm)
+{
+	free(hm->f);
+	free(hm->b);
+	free(hm);
+}
+
+
+struct dp_matrix* dp_matrix_realloc(struct dp_matrix *dp,int x,int y)
+{
+	int i;
+	if (x > y){
+		y = x;
+	}else{
+		x =y;
+	}
+	if ( x > dp->x || y > dp->y){
+		//printf("REALLOCING:%d-%d	%d-%d\n",x,y,dp->x,dp->y);
+		i = 1;
+		while (i <= y){
+			i <<= 1;
+		//	printf("i:%d	y:%d\n",i,y);
+		}
+		y = i-1;
+		i = 1;
+		while (i <= x){
+			i <<= 1;
+			//printf("i:%d	y:%d\n",i,y);
+		}
+		x = i-1;
+		//printf("NEWX:%d	NEWY:%d\n",x,y);
+		dp->s = realloc(dp->s,sizeof(struct states)* (y+1));
+		dp->tb  = (char**) realloc (dp->tb,sizeof (char*)*(x+1));
+		dp->tb_mem = (void*) realloc(dp->tb_mem,sizeof(char) * (x+1) * (y+1));
+		dp->tb[0] = (char*) dp->tb_mem;
+  		for (i = 1; i <= x; i++){
+			dp->tb[i] = dp->tb[0] +(i*(y+1));
+		}
+		dp->x = x;
+		dp->y = y;
+	}
+	return dp;
+}
+
+struct dp_matrix* dp_matrix_alloc(struct dp_matrix *dp,int x,int y)
+{
+	int i;
+	dp = (struct dp_matrix *) malloc(sizeof(struct dp_matrix));
+	dp->x = x;
+	dp->y = y;
+	dp->s = malloc(sizeof(struct states)* (y+1));
+	dp->tb = (char**) malloc(sizeof(char*) * (x+1));
+	dp->tb_mem = (void *) malloc(sizeof(char) * (x+1) * (y+1));
+	dp->tb[0] = (char*) dp->tb_mem;
+	for ( i = 1; i <= x;i++){
+		dp->tb[i] = dp->tb[0] +(i*(y+1));
+	}
+	return dp;
+}
+
+void dp_matrix_free(struct dp_matrix *dp)
+{
+	free(dp->s);
+	free(dp->tb);
+	free(dp->tb_mem);
+	free(dp);
+}

Added: trunk/packages/kalign/branches/upstream/current/kalign2_misc.c
===================================================================
--- trunk/packages/kalign/branches/upstream/current/kalign2_misc.c	2006-11-19 13:38:57 UTC (rev 159)
+++ trunk/packages/kalign/branches/upstream/current/kalign2_misc.c	2006-11-29 14:12:29 UTC (rev 160)
@@ -0,0 +1,741 @@
+/*
+	kalign2_misc.c 
+	
+	Released under GPL - see the 'COPYING' file   
+	
+	Copyright (C) 2006 Timo Lassmann <timolassmann at gmail.com>
+	
+	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
+	any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+    
+	Please send bug reports, comments etc. to:
+	timolassmann at gmail.com
+*/
+
+
+
+#include <string.h>
+#include <ctype.h>
+#include "kalign2.h"
+
+void print_tree(struct aln_tree_node* p,struct alignment* aln,char* outfile)
+{
+	FILE *fout = NULL;
+	if ((fout = fopen(outfile, "w")) == NULL){
+		fprintf(stderr,"can't open output\n");
+		exit(0);
+	}
+	//fprintf(stderr,"\n\n%s\n",outfile);
+	/*if(byg_start("xml",outfile) != -1){
+		fprintf(fout,"<?xml version=\"1.0\" encoding=\"UTF-8\"?> <phyloxml xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"http://www.phyloxml.org/schema/phyloxml.xsd\"><phylogeny>\n");
+		
+		print_phyloxml_tree(p,aln,fout);
+		
+		fprintf(fout,"</phylogeny></phyloxml>\n");
+		
+	}else{*/
+		print_newick_tree(p,aln,fout);
+		fprintf(fout,";");
+	//}
+	fclose(fout);
+}
+
+
+
+void print_newick_tree(struct aln_tree_node* p,struct alignment* aln,FILE *fout)
+{
+	int j;
+		
+	if(p->links[0]){
+	
+		fprintf(fout,"(");
+		print_newick_tree(p->links[0],aln,fout);
+	}
+	if(p->num < numseq){
+		//If you want to print the actual names of the sequences 
+		for (j = 0; j < aln->lsn[p->num];j++){
+			if(isspace((int)aln->sn[p->num][j])){
+				fprintf(fout,"_");
+			}else{
+				fprintf(fout,"%c",aln->sn[p->num][j]);
+			}
+		}
+		//If you want to print the just the number of the sequence
+		//fprintf(stdout,"%d",p->num);
+		
+	}else{
+		fprintf(fout,",");
+	}
+	if(p->links[1]){
+		print_newick_tree(p->links[1],aln,fout);
+		fprintf(fout,")");
+	}
+}
+
+void print_phyloxml_tree(struct aln_tree_node* p,struct alignment* aln,FILE *fout)
+{
+	int j;
+		
+	if(p->links[0]){
+	
+		fprintf(fout,"<clade>\n");
+		print_phyloxml_tree(p->links[0],aln,fout);
+	}
+	if(p->num < numseq){
+		//If you want to print the actual names of the sequences 
+		fprintf(fout,"<clade>\n<name>");
+		for (j = 0; j < aln->lsn[p->num];j++){
+			fprintf(fout,"%c",aln->sn[p->num][j]);
+		}
+		fprintf(fout,"</name>\n</clade>\n");
+		//If you want to print the just the number of the sequence
+		//fprintf(stdout,"%d",p->num);
+		
+	}else{
+		//fprintf(fout,",");
+	}
+	if(p->links[1]){
+		print_phyloxml_tree(p->links[1],aln,fout);
+		fprintf(fout,"</clade>\n");
+	}
+}
+
+struct alignment* sort_sequences(struct alignment* aln,int* tree,char* sort)
+{
+	int i,j,a,b,c;
+	int choice = 0;
+	
+	if(sort){
+		if (byg_start("input",sort) != -1){
+			choice = 0;
+		}else if (byg_start("tree",sort) != -1){
+			choice = 1;
+		}else if (byg_start("gaps",sort) != -1){
+			choice = 2;
+		}else{
+			choice = 3;
+		}
+	}
+	//fprintf(stderr,"COICE:%d\n",choice);
+	switch(choice){
+		case 0:
+			for (i = 0; i < numseq;i++){
+				aln->nsip[i] = i;
+			}
+			break;
+		case 1:
+			c = 0;
+			for (i = 0; i < (numseq-1)*3;i +=3){
+				//fprintf(stderr,"TREE %d	%d	%d\n",tree[i],tree[i+1],tree[i+2]);
+				if(tree[i]  < numseq){
+					aln->nsip[c] = tree[i];
+					c++;
+				}
+				if(tree[i+1]  < numseq){
+					aln->nsip[c] = tree[i+1];
+					c++;
+				}
+			}
+			break;
+		case 2:
+			for (i = 0; i < numseq;i++){
+				a = 1000000;
+				b = -1;
+				for (j =0; j<numseq;j++){
+					if(aln->nsip[j] < a){
+						a = aln->nsip[j];
+						b = j;
+					}
+				}	
+				tree[i] = b;
+				aln->nsip[b] = 1000000;
+			}
+			for (i = 0; i < numseq;i++){
+				aln->nsip[i] = tree[i];
+			}
+			break;
+		case 3:
+			aln = sort_in_relation(aln,sort);
+			break;
+		default:
+			for (i = 0; i < numseq;i++){
+				aln->nsip[i] = i;
+			}
+			break;
+	}
+	
+	/*for (i = 0; i < numseq;i++){
+		fprintf(stderr,"%d\n",aln->nsip[i]);
+	}*/
+	
+	return aln;
+}
+
+struct alignment* sort_in_relation(struct alignment* aln,char* sort)
+{
+	int i,j,c;
+	int target = -1;
+	int id = 0;
+	int positions = 0;
+	int posa = 0;
+	int posb = 0;
+	for (i = 0; i < numseq;i++){
+		if (byg_start(sort,aln->sn[i]) != -1){
+			target = i;
+			aln->sip[i][0] = 1000;
+			break;
+		}
+	}
+	if(target == -1){
+		target = 0;
+		aln->sip[0][0] = 1000;
+	}
+	for (i = 0; i < numseq;i++){
+		if(i != target){
+			posa = 0;
+			posb =0;
+			c = 0;
+			id = 0;
+			positions = 0;
+			for (j = 0; j < aln->sl[i];j++){
+				posa += aln->s[i][j]+1;
+				while(posa > posb){
+					posb += aln->s[target][c]+1;
+					c++;
+				}
+				if(posa == posb){
+					if((int) aln->seq[i][j] == (int) aln->seq[target][c-1]){
+						id += 1000;
+					}
+					positions += 1;
+				}
+			}
+			if(positions){
+				aln->sip[i][0] = id/positions;
+			}else{
+				aln->sip[i][0] = 0;
+			}
+		}
+	}
+	for (i = 0; i < numseq;i++){
+		aln->nsip[i] = i;
+	}
+	quickSort(aln, numseq);
+	return aln;
+}
+
+void quickSort(struct alignment* aln, int array_size)
+{
+	q_sort(aln, 0, array_size - 1);
+}
+
+void q_sort(struct alignment* aln, int left, int right)
+{
+	int pivot, l_hold, r_hold;
+	int pivot2;
+	l_hold = left;
+	r_hold = right;
+	pivot2 = aln->nsip[left];
+	pivot = aln->sip[left][0];// numbers[left];
+	while (left < right){
+		while ((aln->sip[right][0] <= pivot) && (left < right)){
+			right--;
+		}
+		if (left != right){
+			aln->sip[left][0] = aln->sip[right][0];
+			aln->nsip[left] = aln->nsip[right];
+			left++;
+		}
+		while ((aln->sip[left][0] >= pivot) && (left < right)){
+			left++;
+		}
+		if (left != right){
+			aln->sip[right][0] = aln->sip[left][0];
+			aln->nsip[right] = aln->nsip[left];
+			right--;
+		}
+	}
+	aln->sip[left][0] = pivot;
+	aln->nsip[left] = pivot2;
+	pivot = left;
+	left = l_hold;
+	right = r_hold;
+	if (left < pivot){
+		q_sort(aln, left, pivot-1);
+	}
+	if (right > pivot){
+		q_sort(aln, pivot+1, right);
+	}
+}
+
+int* readtree(struct aln_tree_node* p,int* tree)
+{
+	if(p->links[0]){
+		tree = readtree(p->links[0],tree);
+	}
+	if(p->links[1]){
+		tree = readtree(p->links[1],tree);
+	}
+	
+	if(p->links[0]){
+		if(p->links[1]){
+			tree[tree[0]] = p->links[0]->num;
+			tree[tree[0]+1] = p->links[1]->num;
+			tree[tree[0]+2] = p->num;
+			tree[0] +=3;
+			free(p->links[0]->internal_lables);
+			free(p->links[0]->links);
+			free(p->links[0]);
+			free(p->links[1]->internal_lables);
+			free(p->links[1]->links);
+			free(p->links[1]);
+		}
+	}
+	return tree;
+}
+
+struct alignment* make_dna(struct alignment* aln)
+{
+
+	//int aacode[26] = {0,1,2,3,4,5,6,7,8,-1,9,10,11,12,23,13,14,15,16,17,17,18,19,20,21,22};
+	int i,j;
+	int* p;
+	
+	for(i = 0;i < numseq;i++){
+		p = aln->s[i];
+		for (j = 0; j < aln->sl[i];j++){
+			switch(p[j]){
+				case 2: //C
+					p[j] = 1;
+					break;
+				case 6: //G
+					p[j] = 2;
+					break;
+				case 17: //T  or U 
+					p[j] = 3;
+					break;
+				case 12: // N
+					p[j] = 4;
+					break;
+				case 20: // X
+					p[j] = 4;
+					break;
+				case 23://O whatever that is...
+					p[j] = 4;
+					break;
+			}
+		//	printf("%d\n",p[j]);
+		}
+	}
+	return aln;
+}
+
+float** read_matrix(float** subm,struct parameters* param)
+{
+	int i,j;
+	int m_pos = 0;
+	short *matrix_pointer = 0;
+	short blosum50mt[]={
+  5,
+ -2,  5,
+ -1, -3, 13,
+ -2,  5, -4,  8,
+ -1,  1, -3,  2,  6,
+ -3, -4, -2, -5, -3,  8,
+  0, -1, -3, -1, -3, -4,  8,
+ -2,  0, -3, -1,  0, -1, -2, 10,
+ -1, -4, -2, -4, -4,  0, -4, -4,  5,
+ -1,  0, -3, -1,  1, -4, -2,  0, -3,  6,
+ -2, -4, -2, -4, -3,  1, -4, -3,  2, -3,  5,
+ -1, -3, -2, -4, -2,  0, -3, -1,  2, -2,  3,  7,
+ -1,  4, -2,  2,  0, -4,  0,  1, -3,  0, -4, -2,  7,
+ -1, -2, -4, -1, -1, -4, -2, -2, -3, -1, -4, -3, -2, 10,
+ -1,  0, -3,  0,  2, -4, -2,  1, -3,  2, -2,  0,  0, -1,  7,
+ -2, -1, -4, -2,  0, -3, -3,  0, -4,  3, -3, -2, -1, -3,  1,  7,
+  1,  0, -1,  0, -1, -3,  0, -1, -3,  0, -3, -2,  1, -1,  0, -1,  5,
+  0,  0, -1, -1, -1, -2, -2, -2, -1, -1, -1, -1,  0, -1, -1, -1,  2,  5,
+  0, -4, -1, -4, -3, -1, -4, -4,  4, -3,  1,  1, -3, -3, -3, -3, -2,  0,  5,
+ -3, -5, -5, -5, -3,  1, -3, -3, -3, -3, -2, -1, -4, -4, -1, -3, -4, -3, -3, 15,
+ -1, -1, -2, -1, -1, -2, -2, -1, -1, -1, -1, -1, -1, -2, -1, -1, -1,  0, -1, -3, -1,
+ -2, -3, -3, -3, -2,  4, -3,  2, -1, -2, -1,  0, -2, -3, -1, -1, -2, -2, -1,  2, -1,  8,
+ -1,  2, -3,  1,  5, -4, -2,  0, -3,  1, -3, -1,  0, -1,  4,  0,  0, -1, -3, -2, -1, -2,  5};
+ 
+	short blosum62mt[]={
+  40,
+ -20,  40,
+  0, -30,  90,
+ -20,  40, -30,  60,
+ -10,  10, -40,  20,  50,
+ -20, -30, -20, -30, -30,  60,
+  0, -10, -30, -10, -20, -30,  60,
+ -20,  0, -30, -10,  0, -10, -20,  80,
+ -10, -30, -10, -30, -30,  0, -40, -30,  40,
+ -10,  0, -30, -10,  10, -30, -20, -10, -30,  50,
+ -10, -40, -10, -40, -30,  0, -40, -30,  20, -20,  40,
+ -10, -30, -10, -30, -20,  0, -30, -20,  10, -10,  20,  50,
+ -20,  30, -30,  10,  0, -30,  0,  10, -30,  0, -30, -20,  60,
+ -10, -20, -30, -10, -10, -40, -20, -20, -30, -10, -30, -20, -20,  70,
+ -10,  0, -30,  0,  20, -30, -20,  0, -30,  10, -20,  0,  0, -10,  50,
+ -10, -10, -30, -20,  0, -30, -20,  0, -30,  20, -20, -10,  0, -20,  10,  50,
+  10,  0, -10,  0,  0, -20,  0, -10, -20,  0, -20, -10,  10, -10,  0, -10,  40,
+  0, -10, -10, -10, -10, -20, -20, -20, -10, -10, -10, -10,  0, -10, -10, -10,  10,  50,
+  0, -30, -10, -30, -20, -10, -30, -30,  30, -20,  10,  10, -30, -20, -20, -30, -20,  0,  40,
+ -30, -40, -20, -40, -30,  10, -20, -20, -30, -30, -20, -10, -40, -40, -20, -30, -30, -20, -30, 110,
+  0, -10, -20, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -20, -10, -10,  0,  0, -10, -20, -10,
+ -20, -30, -20, -30, -20,  30, -30,  20, -10, -20, -10, -10, -20, -30, -10, -20, -20, -20, -10,  20, -10,  70,
+ -10,  10, -30,  10,  40, -30, -20,  0, -30,  10, -30, -10,  0, -10,  30,  0,  0, -10, -20, -30, -10, -20,  40};
+	
+	short gon250mt[]={
+	24,
+	0,   0,
+	5,   0, 115,
+	-3,   0, -32,  47,
+	 0,   0, -30,  27,  36,
+	-23,   0,  -8, -45, -39,  70,
+	5,   0, -20,   1,  -8, -52,  66,
+	-8,   0, -13,   4,   4,  -1, -14,  60,
+	-8,   0, -11, -38, -27,  10, -45, -22,  40,
+	-4,   0, -28,   5,  12, -33, -11,   6, -21,  32,
+	-12,   0, -15, -40, -28,  20, -44, -19,  28, -21,  40,
+	-7,   0,  -9, -30, -20,  16, -35, -13,  25, -14,  28,  43,
+	-3,   0, -18,  22,   9, -31,   4,  12, -28,   8, -30, -22,  38,
+	 3,   0, -31,  -7,  -5, -38, -16, -11, -26,  -6, -23, -24,  -9,  76,
+	-2,   0, -24,   9,  17, -26, -10,  12, -19,  15, -16, -10,   7,  -2,  27,
+	-6,   0, -22,  -3,   4, -32, -10,   6, -24,  27, -22, -17,   3,  -9,  15,  47,
+	11,   0,   1,   5,   2, -28,   4,  -2, -18,   1, -21, -14,   9,   4,   2,  -2,  22,
+	 6,   0,  -5,   0,  -1, -22, -11,  -3,  -6,   1, -13,  -6,   5,   1,   0,  -2,  15,  25,
+	 1,   0,   0, -29, -19,   1, -33, -20,  31, -17,  18,  16, -22, -18, -15, -20, -10,   0,  34,
+	-36,   0, -10, -52, -43,  36, -40,  -8, -18, -35,  -7, -10, -36, -50, -27, -16, -33, -35, -26, 142,
+	0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+	-22,   0,  -5, -28, -27,  51, -40,  22,  -7, -21,   0,  -2, -14, -31, -17, -18, -19, -19, -11,  41,   0,  78,
+	 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
+	if(param->sub_matrix){
+		if(byg_start(param->sub_matrix,"blosum62BLOSUM62") != -1){
+			matrix_pointer = blosum62mt;
+			//m_pos = 0;
+			//for (i = 0;i < 23;i++){
+			//	for (j = 0;j <= i;j++){
+			//		matrix_pointer[m_pos] = matrix_pointer[m_pos] * 10;
+			//		m_pos++;
+			//	}
+			//}
+			gpo = 55;
+			gpe = 8;
+			tgpe = 1;
+		}
+		if(byg_start(param->sub_matrix,"blosum50BLOSUM50") != -1){
+			matrix_pointer = blosum50mt;
+			m_pos = 0;
+			for (i = 0;i < 23;i++){
+				for (j = 0;j <= i;j++){
+					matrix_pointer[m_pos] = matrix_pointer[m_pos] * 10;
+					m_pos++;
+				}
+			}
+			gpo = 55;
+			gpe = 8;
+			tgpe = 1;
+		}
+		//vogt....
+		
+	}else{
+		if(!param->dna){
+			// gpo:5.494941        gpe:0.852492        tgpe:0.442410       bonus: 3.408872     z-cutoff: 58.823309 -> 0.829257 accuracy on bb3 
+			gpo = 54.94941;
+			gpe = 8.52492;
+			tgpe = 4.42410;
+			
+			//gpo = 54;
+			//gpe = 8;
+			//tgpe = 4;
+			//-gpo 10.9898        -gpe 0.852492      -tgpe  0.442410    -bonus    0.2   -zcutoff     58.823309  
+		//	param->secret = 0.2;
+			matrix_pointer = gon250mt;
+		}else{
+			//gpo = 400;
+		//	gpe =  30;
+			//tgpe = 30;
+			
+			//param->gpo = 43.4;
+			//param->gpe = 3.94;
+			//param->tgpe = 29.26;
+			
+			gpo = 43.4 *5;
+			gpe = 39.4;
+			tgpe =  292.6;
+			//param->secret = 28.3;
+			param->zlevel = 61.08;
+			param->internal_gap_weight = 49.14;
+			
+		}
+	}
+	if(param->gpo!= -1){
+		param->gpo *= 5;
+		gpo = param->gpo;
+	}
+	if(param->gpe != -1){
+		param->gpe *= 10;
+		gpe = param->gpe;
+	}
+	if(param->tgpe != -1){
+		param->tgpe *= 10;
+		tgpe = param->tgpe;
+	}
+
+	if(param->secret != -1){
+		param->secret *= 10;
+	}else{
+		if(!param->dna){
+			param->secret = 0.2;
+		}else{
+			param->secret = 283.0;
+		}
+	}
+
+	
+	//fprintf(stderr,"%d	%d	%d	%d\n",gpo,gpe,tgpe,	 (int)param->secret);
+	subm = malloc(sizeof (float*) * 32);
+	for (i = 32;i--;){
+		subm[i] = malloc(sizeof(float) * 32);
+		for (j = 32;j--;){
+			subm[i][j] = param->secret;//0;//gpe << 1;//-5;// better on Balibase
+		}
+	}
+	if(param->dna){
+		/*subm[0][0] += 10;
+		subm[0][1] += 6;
+		subm[1][0] += 6;
+		subm[1][1] += 10;
+		subm[2][2] += 10;
+		subm[2][3] += 6;
+		subm[3][2] += 6;
+		subm[3][3] += 10;*/
+//		     A    C    G    T    .    N
+//	A   91 -114  -31 -123    0  -43
+		subm[0][0] += 91;
+		subm[0][1] += -114;
+		subm[0][2] += -31;
+		subm[0][3] += -123;
+
+//	C -114  100 -125  -31    0  -43
+		subm[1][0] += -114;
+		subm[1][1] += 100;
+		subm[1][2] += -125;
+		subm[1][3] += -31;
+
+//	G  -31 -125  100 -114    0  -43
+		subm[2][0] += -31;
+		subm[2][1] += -125;
+		subm[2][2] += 100;
+		subm[2][3] += -114;
+
+//	T -123  -31 -114   91    0  -43
+		subm[3][0] += -123;
+		subm[3][1] += -31;
+		subm[3][2] += -114;
+		subm[3][3] += 91;
+
+//	.    0    0    0    0    0    0
+//	N  -43  -43  -43  -43    0  -43
+
+
+		/*for (i = 0; i < 4;i++){
+			for (j = 0;j < 4;j++){
+				if(i == j){
+					subm[i][j] += 1;
+				}else{
+					subm[i][j] -= 3;
+				}
+			}
+		}*/
+		
+	}else{
+
+		m_pos = 0;
+		for (i = 0;i < 23;i++){
+			for (j = 0;j <= i;j++){
+				if (i == j){
+				//	subm[i][j] += blosum62mt[m_pos]*10;
+					subm[i][j] += matrix_pointer[m_pos];
+				}else{
+				//	subm[i][j] += blosum62mt[m_pos]*10;
+				//	subm[j][i] += blosum62mt[m_pos]*10;
+					subm[i][j] += matrix_pointer[m_pos];
+					subm[j][i] += matrix_pointer[m_pos];
+				}
+				m_pos++;
+			}
+		}
+		/*for (i = 0; i < 23;i++){
+			for (j = 0; j < 23;j++){
+				fprintf(stderr,"%d ",subm[i][j]);
+			} 
+			fprintf(stderr,"\n");
+		}
+		fprintf(stderr,"\n");*/
+	}
+	return subm;
+}
+
+struct alignment* make_seq(struct alignment* aln,int a,int b,int* path)
+{
+	int c;
+	int i;
+	int posa = 0;
+	int posb = 0;
+
+	int* gap_a = 0;
+	int* gap_b = 0;
+
+	gap_a = malloc ((path[0]+1)*sizeof(int));
+	gap_b = malloc ((path[0]+1)*sizeof(int));
+
+	for (i = path[0]+1;i--;){
+		gap_a[i] = 0;
+		gap_b[i] = 0;
+	}
+	c = 1;
+	while(path[c] != 3){
+		if (!path[c]){
+			posa++;
+			posb++;
+		}
+		if (path[c] & 1){
+			gap_a[posa] += 1;
+			posb++;
+		}
+		if (path[c] & 2){
+			gap_b[posb] += 1;
+			posa++;
+		}
+		c++;
+	}	
+	for (i = aln->nsip[a];i--;){
+		update_gaps(aln->sl[aln->sip[a][i]],aln->s[aln->sip[a][i]],path[0],gap_a);
+	}
+	for (i = aln->nsip[b];i--;){
+		update_gaps(aln->sl[aln->sip[b][i]],aln->s[aln->sip[b][i]],path[0],gap_b);
+	}
+	free(gap_a);
+	free(gap_b);
+	free(path);
+	return aln;
+}
+
+
+void update_gaps(int old_len,int*gis,int new_len,int *newgaps)
+{
+	unsigned int i,j;
+	int add = 0;
+	int rel_pos = 0;
+	for (i = 0; i <= old_len;i++){
+		add = 0;
+		for (j = rel_pos;j <= rel_pos + gis[i];j++){
+			if (newgaps[j] != 0){
+				add += newgaps[j];
+			}
+		}
+		rel_pos += gis[i]+1;
+		gis[i] += add;
+	}
+}
+
+int* mirror_path(int* path)
+{
+	int c = 1;
+	while(path[c] != 3){
+		if (path[c] & 1){
+			path[c] += 1;
+		}else if (path[c] & 2){
+			path[c] -= 1;
+		}
+		c++;
+	}
+	return path;
+}
+
+struct node* insert(struct node *n, int pos)
+{
+        if (n == NULL){
+		n = (struct node*) malloc(sizeof(struct node));
+		n->next = 0;
+		n->pos = pos;
+	}else{
+		n->next = insert(n->next,pos);
+	}
+        return n;
+}
+
+struct bignode* big_insert_hash(struct bignode *n,const unsigned int pos)
+{
+	struct bignode* p = 0;
+	if(n){
+		if(n->num < NODESIZE){
+			n->pos[n->num] = pos;
+			n->num++;
+			return n;
+		}else{
+			p = (struct bignode*) malloc(sizeof(struct bignode));
+			p->pos[0] = pos;
+			p->num = 1;
+			p->next = n;
+		}
+	}else{
+		p = (struct bignode*) malloc(sizeof(struct bignode));
+		p->pos[0] = pos;
+		p->num = 1;
+		p->next = n;
+	}
+	return p;
+}
+
+void big_remove_nodes(struct bignode *n)
+{
+	struct bignode* p;
+	while(n){
+		p = n;
+		n = n->next;
+		free(p);
+	}
+}
+
+void big_print_nodes(struct bignode *n)
+{
+	int i;
+	while(n){
+		for (i = 0; i < n->num;i++){
+			fprintf(stderr,"%d ",n->pos[i]);
+		}
+		n = n->next;
+	}
+}
+
+struct node* insert_hash(struct node *n, int pos)
+{
+	struct node* p;
+	p = (struct node*) malloc(sizeof(struct node));
+	p->pos = pos;
+	p->next = n;
+	return p;
+}
+
+void remove_nodes(struct node *n)
+{
+	struct node* p;
+	while(n){
+		p = n;
+		n = n->next;
+		free(p);
+	}
+}

Added: trunk/packages/kalign/branches/upstream/current/kalign2_output.c
===================================================================
--- trunk/packages/kalign/branches/upstream/current/kalign2_output.c	2006-11-19 13:38:57 UTC (rev 159)
+++ trunk/packages/kalign/branches/upstream/current/kalign2_output.c	2006-11-29 14:12:29 UTC (rev 160)
@@ -0,0 +1,662 @@
+/*
+	kalign2_output.c
+	
+	Released under GPL - see the 'COPYING' file   
+	
+	Copyright (C) 2006 Timo Lassmann <timolassmann at gmail.com>
+	
+	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
+	any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+    
+	Please send bug reports, comments etc. to:
+	timolassmann at gmail.com
+*/
+
+#include "kalign2.h"
+#include "kalign2_output.h"
+
+void output(struct alignment* aln,struct parameters* param)
+{
+	if(!param->format){
+		fasta_output(aln,param->outfile);
+	}else{
+		if (byg_start(param->format,"alnALNclustalCLUSTALclustalwCLUSTALWclustalWClustalW") != -1){
+			aln_output(aln,param);
+		}else if (byg_start(param->format,"msfMSFgcgGCGpileupPILEUP") != -1){
+			msf_output(aln,param->outfile);
+		}else if (byg_start(param->format,"eclu") != -1){
+			clustal_output(aln,param->outfile);
+		}else if (byg_start("macsim",param->format) != -1){
+			macsim_output(aln,param->outfile,param->infile[0]);
+		}else{
+			fasta_output(aln,param->outfile);
+		}
+	}
+	free_param(param);
+}
+
+void macsim_output(struct alignment* aln,char* outfile,char* infile)
+{
+	int i,j,f;
+	int tmp;
+	struct feature *fn = 0;
+	FILE *fout = NULL;
+	if(outfile){
+		if ((fout = fopen(outfile, "w")) == NULL){
+			fprintf(stderr,"can't open output\n");
+			exit(0);
+		}
+	}else{
+		fout = stdout; 
+	}
+	fprintf(fout,"<?xml version=\"1.0\"?>\n<!DOCTYPE macsim SYSTEM \"http://www-bio3d-igbmc.u-strasbg.fr/macsim.dtd\">\n<macsim>\n<alignment>\n<aln-name>");
+	if(infile){
+		fprintf(fout,"%s.kalign",infile);
+	}else{
+		fprintf(fout,"kalign alignment");
+	}
+	fprintf(fout,"</aln-name>\n");
+
+	for (i =0;i< numseq;i++){
+		//c = aln->sl[i];
+		f = aln->nsip[i];
+		
+		fprintf(fout,"<sequence seq-type=\"Protein\">\n");
+		fprintf(fout,"<seq-name>");
+		for (j =0; j < aln->lsn[f];j++){
+			if(!iscntrl((int)aln->sn[f][j])){
+				fprintf(fout,"%c",aln->sn[f][j]);
+			}
+		}
+		fprintf(fout,"</seq-name>");
+		fprintf(fout,"<seq-info>\n");
+		fprintf(fout,"<accession>1aab_</accession>\n");
+		fprintf(fout,"<nid>1aab_</nid>\n");
+		fprintf(fout,"<ec>0.0.0.0</ec>\n");
+		fprintf(fout,"<group>0</group>\n");
+		if(aln->ft){
+		if(aln->ft[f]){
+			
+			fprintf(fout,"<ftable>\n");
+			fn = aln->ft[f];
+			while(fn){
+				fprintf(fout,"<fitem><ftype>%s</ftype><fstart>%d</fstart><fstop>%d</fstop><fnote>%s</fnote></fitem>\n",fn->type,fn->start,fn->end,fn->note);
+				fn = fn->next;
+			}
+			fprintf(fout,"</ftable>\n</seq-info>\n");
+		}
+		}
+		fprintf(fout,"<seq-data>\n");
+
+		for (j = 0; j < aln->sl[f];j++){
+			tmp = aln->s[f][j];
+			while (tmp){
+				fprintf(fout,"-");
+				tmp--;
+			}
+			fprintf(fout,"%c",aln->seq[f][j]);
+		}
+		tmp =aln->s[f][aln->sl[f]];
+		while (tmp){
+			fprintf(fout,"-");
+			tmp--;
+		}
+		fprintf(fout,"\n");
+		fprintf(fout,"</seq-data>\n");
+		fprintf(fout,"</sequence>\n");
+	}
+	fprintf(fout,"</alignment>\n");
+	fprintf(fout,"</macsim>\n");
+	if(outfile){
+		fclose(fout);
+	}
+	free_aln(aln);
+}
+
+
+void msf_output(struct alignment* aln,char* outfile)
+{
+	int i,j,c,f,g;
+	int max = 0;
+	int aln_len = 0;
+	int tmp;
+	char** linear_seq = 0;
+	FILE *fout = NULL;
+	
+	linear_seq = malloc(sizeof(char*)*numseq);
+	
+	aln_len = 0;
+	for (j = 0; j <= aln->sl[0];j++){
+		aln_len+= aln->s[0][j];
+	}
+	aln_len += aln->sl[0];
+	
+	for (i =0;i< numseq;i++){
+		linear_seq[i] = malloc(sizeof(char)*(aln_len+1));
+		
+		c = 0;
+		for (j = 0; j < aln->sl[i];j++){
+			tmp = aln->s[i][j];
+			while (tmp){
+				linear_seq[i][c] ='-';
+				c++;
+				tmp--;
+			}
+			linear_seq[i][c] = aln->seq[i][j];
+			c++;
+		}
+		
+		tmp =aln->s[i][aln->sl[i]];
+		while (tmp){
+			linear_seq[i][c] ='-';
+			c++;
+			tmp--;
+		}		
+		linear_seq[i][c] = 0;
+	}
+
+	if(outfile){
+		if ((fout = fopen(outfile, "w")) == NULL){
+			fprintf(stderr,"can't open output\n");
+			exit(0);
+		}
+	}else{
+		fout= stdout;
+	}
+	fprintf(fout,"PileUp\n\n\n\n   MSF:   %d  Type: P    Check:  7038   ..\n\n",aln_len);
+
+	for (j = 0; j< numseq;j++){
+		if( aln->lsn[j] > max){
+			max = aln->lsn[j];
+		}
+	}
+
+	for (i = 0; i< numseq;i++){
+			f = aln->nsip[i];
+			fprintf(fout," Name: ");
+			for (c = 0; c < aln->lsn[f];c++){
+				if(!iscntrl((int)aln->sn[f][c])){
+					fprintf(fout,"%c",aln->sn[f][c]);
+				}
+			}
+			while(c < max+3){
+				fprintf(fout," ");
+				c++;
+			}
+			fprintf(fout,"Len:   ");
+			fprintf(fout,"%d",aln_len);
+			fprintf(fout,"  Check:  2349  Weight:  1.00\n");
+			
+	}
+	fprintf(fout,"\n\n//\n\n");
+
+	for (i = 0; i+60 < aln_len;i +=60){
+		for (j = 0; j< numseq;j++){
+			f = aln->nsip[j];
+			for (c = 0; c < aln->lsn[f];c++){
+				if(!iscntrl((int)aln->sn[f][c])){
+					fprintf(fout,"%c",aln->sn[f][c]);
+				}
+			}
+			while(c < max+3){
+				fprintf(fout," ");
+				c++;
+			}
+			g = 1;
+			for (c = 0; c < 60;c++){
+				fprintf(fout,"%c",linear_seq[f][c+i]);
+				if (g == 10){
+					fprintf(fout," ");
+					g = 0;
+				}
+				g++;
+			}
+			fprintf(fout,"\n");
+			
+		}
+		fprintf(fout,"\n\n");
+	}
+	for (j = 0; j< numseq;j++){
+		f = aln->nsip[j];
+		
+		for (c = 0; c< aln->lsn[f];c++){
+			if(!iscntrl((int)aln->sn[f][c])){
+				fprintf(fout,"%c",aln->sn[f][c]);
+			}
+		}
+		
+		while(c < max+3){
+			fprintf(fout," ");
+			c++;
+		}
+		
+		g = 1;
+		for (c = i; c< aln_len;c++){
+			fprintf(fout,"%c",linear_seq[f][c]);
+			if (g == 10){
+				fprintf(fout," ");
+				g = 0;
+			}
+			g++;
+		}
+		fprintf(fout,"\n");
+	
+	}
+	fprintf(fout,"\n\n");
+	if(outfile){
+		fclose(fout);
+	}
+	
+	for (i =0;i< numseq;i++){
+		free(linear_seq[i]);
+	}
+	
+	free(linear_seq);
+	free_aln(aln);
+}
+
+
+void clustal_output(struct alignment* aln,char* outfile)
+{
+	int i,j,c,f;
+	int tmp;
+	int aln_len = 0;
+	char** linear_seq = 0;
+	
+	FILE* fout = NULL;
+	
+	linear_seq = malloc(sizeof(char*)*numseq);
+
+	aln_len = 0;
+	
+	for (j = 0; j <= aln->sl[0];j++){
+		aln_len+= aln->s[0][j];
+	}
+	
+	aln_len += aln->sl[0];
+	
+	for (i =0;i< numseq;i++){
+		linear_seq[i] = malloc(sizeof(char)*(aln_len+1));
+		
+		c = 0;
+		for (j = 0; j < aln->sl[i];j++){
+			tmp = aln->s[i][j];
+			while (tmp){
+				linear_seq[i][c] ='-';
+				c++;
+				tmp--;
+			}
+			linear_seq[i][c] = aln->seq[i][j];
+			c++;
+		}
+		
+		tmp =aln->s[i][aln->sl[i]];
+		while (tmp){
+			linear_seq[i][c] ='-';
+			c++;
+			tmp--;
+		}		
+		linear_seq[i][c] = 0;
+	}
+
+
+	if(outfile){
+		if ((fout = fopen(outfile, "w")) == NULL){
+			fprintf(stderr,"can't open output\n");
+			exit(0);
+		}
+	}else{
+		fout = stdout;
+	}
+
+	fprintf(fout,"Kalign (2.0) alignment in ClustalW format\n\n\n");
+
+
+	for (i = 0; i+60 < aln_len;i +=60){
+		for (j = 0; j< numseq;j++){
+			f = aln->nsip[j];
+			for (c = 0; c < aln->lsn[f];c++){
+				if(!iscntrl((int)aln->sn[f][c])){
+					fprintf(fout,"%c",aln->sn[f][c]);
+				}
+			}
+			while(c < 18){
+				fprintf(fout," ");
+				c++;
+			}
+			
+			for (c = 0; c < 60;c++){
+				fprintf(fout,"%c",linear_seq[f][c+i]);
+			}
+			fprintf(fout,"\n");
+		}
+		fprintf(fout,"\n\n");
+	}
+	for (j = 0; j< numseq;j++){
+		f = aln->nsip[j];
+		for (c = 0; c< aln->lsn[f];c++){
+			if(!iscntrl((int)aln->sn[f][c])){
+				fprintf(fout,"%c",aln->sn[f][c]);
+			}
+		}
+		while(c < 18){
+			fprintf(fout," ");
+			c++;
+		}
+	
+		for (c = i; c< aln_len;c++){
+			fprintf(fout,"%c",linear_seq[f][c]);
+		}
+		fprintf(fout,"\n");
+	}
+	fprintf(fout,"\n\n");
+	if(outfile){
+		fclose(fout);
+	}
+	for (i =0;i< numseq;i++){
+		free(linear_seq[i]);
+	}
+	free(linear_seq);
+	free_aln(aln);
+}
+
+void aln_output(struct alignment* aln,struct parameters* param)
+{
+	char* outfile = param->outfile;
+	int i,j,c,f;
+	int tmp;
+	int aln_len = 0;
+	
+	//int namestart = 0;
+	int max_name_len = 20;
+	int tmp_len = 0;
+	char** linear_seq = 0;
+	
+	struct names* n;
+	
+	n = get_meaningful_names(aln,param->id);
+	
+	//namestart = get_meaningful_names(aln,param->id);
+	
+	c = -1;
+	for (i = 0; i< numseq;i++){
+		if(n->len[i] > c){
+			c = n->len[i];
+		}
+		/*f = 0;
+		for (j = namestart;j < aln->lsn[i];j++){
+			if(isspace((int)aln->sn[i][j])){
+				break;
+			}
+			f++;
+		}
+		if(f > c){
+			c = f;
+		}
+		}*/
+	}
+	
+	if(c < max_name_len){
+		max_name_len = c;//this is know the maximum length of a unique name isdjgbv skj
+	}
+		
+	FILE* fout = NULL;
+	
+	linear_seq = malloc(sizeof(char*)*numseq);
+
+	aln_len = 0;
+	for (j = 0; j <= aln->sl[0];j++){
+		aln_len+= aln->s[0][j];
+	}
+	aln_len += aln->sl[0];
+	
+	for (i =0;i< numseq;i++){
+		linear_seq[i] = malloc(sizeof(char)*(aln_len+1));
+		
+		c = 0;
+		for (j = 0; j < aln->sl[i];j++){
+			tmp = aln->s[i][j];
+			while (tmp){
+				linear_seq[i][c] ='-';
+				c++;
+				tmp--;
+			}
+			linear_seq[i][c] = aln->seq[i][j];
+			c++;
+		}
+		
+		tmp =aln->s[i][aln->sl[i]];
+		while (tmp){
+			linear_seq[i][c] ='-';
+			c++;
+			tmp--;
+		}		
+		linear_seq[i][c] = 0;
+	}
+	
+	if(outfile){
+		if ((fout = fopen(outfile, "w")) == NULL){
+			fprintf(stderr,"can't open output\n");
+			exit(0);
+		}
+	}else{
+		fout = stdout;
+	}
+	
+	fprintf(fout,"Kalign (2.0) alignment in ClustalW format\n\n\n");
+
+	for (i = 0; i+60 < aln_len;i +=60){
+		for (j = 0; j< numseq;j++){
+			f = aln->nsip[j];
+			tmp_len = (max_name_len < n->len[f]) ? max_name_len:n->len[f];
+			for (c = 0; c < tmp_len;c++){
+				if(isspace((int)aln->sn[f][c+n->start[f]])){
+					break;
+				}
+				
+				if(!iscntrl((int)aln->sn[f][c+n->start[f]])){
+					fprintf(fout,"%c",aln->sn[f][c+n->start[f]]);
+				}
+			}
+			
+			while(c < max_name_len+5){
+				fprintf(fout," ");
+				c++;
+			}
+			
+			for (c = 0; c < 60;c++){
+				fprintf(fout,"%c",linear_seq[f][c+i]);
+			}
+			fprintf(fout,"\n");
+		}
+		fprintf(fout,"\n\n");
+	}
+	
+	for (j = 0; j< numseq;j++){
+		f = aln->nsip[j];
+		tmp_len = (max_name_len < n->len[f]) ? max_name_len:n->len[f];
+		for (c = 0; c< tmp_len;c++){
+			if(isspace((int)aln->sn[f][c+n->start[f]])){
+				break;
+			}
+			
+			if(!iscntrl((int)aln->sn[f][c+n->start[f]])){
+				fprintf(fout,"%c",aln->sn[f][c+n->start[f]]);
+			}
+		}
+		
+		while(c < max_name_len + 5){
+			fprintf(fout," ");
+			c++;
+		}
+	
+		for (c = i; c < aln_len;c++){
+			fprintf(fout,"%c",linear_seq[f][c]);
+		}
+		fprintf(fout,"\n");
+	}
+	fprintf(fout,"\n\n");
+	if(outfile){
+		fclose(fout);
+	}
+	
+	names_free(n);
+	
+	for (i =0;i< numseq;i++){
+		free(linear_seq[i]);
+	}
+	free(linear_seq);
+	free_aln(aln);
+}
+
+struct names* get_meaningful_names(struct alignment* aln,int id)
+{
+
+	struct names* n = 0;
+	int i,j,c;
+	int min_len = 0;
+	int start = 0;
+	int globalstart = 1000000;
+	
+	n = names_alloc(n);
+	for (i = 0; i < numseq;i++){
+ 		n->end[i] = aln->lsn[i];
+	}
+	
+		
+	if (id == -1){
+		for(i =0; i < numseq-1;i++){
+			for (j = i+1; j < numseq;j++){
+				min_len = (aln->lsn[i] < aln->lsn[j])? aln->lsn[i] : aln->lsn[j];
+				start = 0;
+				for (c = 0; c < min_len;c++){
+					if(isalnum((int)aln->sn[i][c]) && isalnum((int)aln->sn[j][c])){
+						if( aln->sn[i][c] != aln->sn[j][c]){
+							break;
+						}
+					}else{
+						if(aln->sn[i][c] == aln->sn[j][c]){
+							if(aln->sn[i][c] != '_' && aln->sn[i][c] != '-'){
+								start = c+1;
+							}
+						}else{
+							break;
+						}
+					}
+				}
+					
+				//fprintf(stderr,"%s\n%s\nstart: %d\n\n",aln->sn[i],aln->sn[j],start);
+				
+				if (start < globalstart){
+					globalstart = start;
+				}
+			} 
+		}
+		for (i = 0; i < numseq;i++){
+			n->start[i] = globalstart;
+			for (j = n->start[i]; j < aln->lsn[i];j++){
+				if(!isalnum((int)aln->sn[i][j]) && aln->sn[i][j] != '_' && aln->sn[i][j] != '-'){
+					n->end[i] = j;
+					break;
+				}
+			}
+		}
+
+	}else{
+		for(i =0; i < numseq;i++){
+			start = 0;
+			min_len = 0;
+			for (j = 0; j < aln->lsn[i];j++){
+				if((isalnum((int)aln->sn[i][j]) || aln->sn[i][j] == '_' || aln->sn[i][j] == '-')&& start == 0 ){
+					n->start[i] = j;
+					min_len++;
+					start = 1;
+				}else if ((!isalnum((int)aln->sn[i][j]) && aln->sn[i][j] != '_' && aln->sn[i][j] != '-')&& start == 1) {
+					if(id == min_len){
+						n->end[i] = j;
+						break;
+					}
+					start = 0;
+			
+				}
+			}
+			if(id > min_len){
+				fprintf(stderr,"Warning: sequence %d has no %dth word in the identifier line:\n%s\n",i,id,aln->sn[i]);
+				n->start[i] = 0;
+			}
+		}
+	}	
+	
+	for (i = 0; i < numseq;i++){
+		//fprintf(stderr,"%s\n%d-%d\n",aln->sn[i],n->start[i],n->end[i]);
+ 		n->len[i] = n->end[i] - n->start[i];
+	}
+	
+	return n;
+}
+
+
+void fasta_output(struct alignment* aln,char* outfile)
+{
+	int i,j,c,f;
+	int tmp;
+	FILE *fout = NULL;
+	if(outfile){
+		if ((fout = fopen(outfile, "w")) == NULL){
+			fprintf(stderr,"can't open output\n");
+			exit(0);
+		}
+	}else{
+		fout = stdout;
+	}
+	for (i = 0; i < numseq;i++){
+		f = aln->nsip[i];
+		fprintf(fout,">%s\n",aln->sn[f]);
+		c = 0;
+		for (j = 0; j < aln->sl[f];j++){
+			tmp = aln->s[f][j];
+			while (tmp){
+				fprintf(fout,"-");
+				c++;
+				if(c == 60){
+					fprintf(fout,"\n");
+					c = 0;
+				}
+				tmp--;
+			}
+			fprintf(fout,"%c",aln->seq[f][j]);
+			c++;
+			if(c == 60){
+				fprintf(fout,"\n");
+				c = 0;
+			}
+		}
+		tmp = aln->s[f][aln->sl[f]];
+		while (tmp){
+			fprintf(fout,"-");
+			c++;
+ 			if(c == 60){
+				fprintf(fout,"\n");
+				c = 0;
+			}
+			tmp--;
+		}
+		fprintf(fout,"\n");
+	}
+	if(outfile){
+		fclose(fout);
+	}
+	free_aln(aln);
+}
+

Added: trunk/packages/kalign/branches/upstream/current/kalign2_output.h
===================================================================
--- trunk/packages/kalign/branches/upstream/current/kalign2_output.h	2006-11-19 13:38:57 UTC (rev 159)
+++ trunk/packages/kalign/branches/upstream/current/kalign2_output.h	2006-11-29 14:12:29 UTC (rev 160)
@@ -0,0 +1,39 @@
+/*
+	kalign2_output.h
+	
+	Released under GPL - see the 'COPYING' file   
+	
+	Copyright (C) 2006 Timo Lassmann <timolassmann at gmail.com>
+	
+	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
+	any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+    
+	Please send bug reports, comments etc. to:
+	timolassmann at gmail.com
+*/
+
+#include <ctype.h>
+
+void aln_output(struct alignment* aln,struct parameters* param);
+void msf_output(struct alignment* aln,char* outfile);
+void fasta_output(struct alignment* aln,char* outfile);
+void clustal_output(struct alignment* aln,char* outfile);
+void macsim_output(struct alignment* aln,char* outfile,char* infile);
+
+struct names* get_meaningful_names(struct alignment* aln,int id);
+
+
+
+
+

Added: trunk/packages/kalign/branches/upstream/current/kalign2_profile.c
===================================================================
--- trunk/packages/kalign/branches/upstream/current/kalign2_profile.c	2006-11-19 13:38:57 UTC (rev 159)
+++ trunk/packages/kalign/branches/upstream/current/kalign2_profile.c	2006-11-29 14:12:29 UTC (rev 160)
@@ -0,0 +1,918 @@
+/*
+	kalign2_profile.c 
+	
+	Released under GPL - see the 'COPYING' file   
+	
+	Copyright (C) 2006 Timo Lassmann <timolassmann at gmail.com>
+	
+	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
+	any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+    
+	Please send bug reports, comments etc. to:
+	timolassmann at gmail.com
+*/
+
+#include "kalign2.h"
+
+
+/*
+void add_feature_information_from_alignment(int* path,int* fprof1,int* fprof2,int weight)
+{
+ 	int i = 0;
+ 	int j = 0;
+ 	int c = 1;
+	while(path[c] != 3){		
+		if (!path[c]){
+			fprof1[i] +=1;
+			fprof1[i+1] +=weight;
+			fprof2[j] +=1;
+			fprof2[j+1] +=weight;
+			i+=2;
+			j+=2;	
+		}
+		if (path[c] & 1){
+			j+=2;
+		}
+		if (path[c] & 2){
+			i+=2;		
+		}
+		c++;
+	}
+	free(path);
+}*/
+
+
+float* update2(const float* profa, const float* profb,float* newp,int* path,int sipa,int sipb,float internal_gap_weight)
+{
+	int i,c;
+	int* gap_len = 0;
+	int gap_cost = 0;
+	
+	gap_len = malloc(sizeof(int)* (path[0]+1));
+	gap_len[0] = 0;
+	
+	//fprintf(stderr,"%d len,,,,\n",path[0]);
+	for(i = 1; i <= path[0];i++){
+	//	fprintf(stderr,"%d,%d	",i,path[i]);
+		gap_len[i] = (path[i] >> 16);
+		path[i]  = path[i] & 0x0000ffff;
+	//	fprintf(stderr,"%d	%d\n",path[i],gap_len[i]);
+	}
+	//gap_len[path[0]] = 0;
+//	int len = 0;
+	c = 1;
+	
+	/*while(path[c] != 3){	
+		fprintf(stderr,"%d %d	%d\n",c,path[c],gap_len[c]);
+				
+		c++;
+	}
+	exit(0);*/
+
+
+	while(path[c] != 3){		
+		gap_cost = 0;
+		if (!path[c]){
+			while(!path[c] && path[c] != 3){
+		//		fprintf(stderr,"Align	%d	%d\n",c,path[c]);
+				for (i = 64; i--;){
+					newp[i] = profa[i] + profb[i];
+				}
+				profa += 64;
+				profb += 64;
+				newp += 64; 
+				c++;
+			}
+		}else if (path[c] & 1){
+			//fprintf(stderr,"%d\n",gap_len[c]);
+			if(path[c]  & 128){//N terminal gap !!!!!!1
+				for (i = 0; i < gap_len[c]-1;i++){
+					gap_cost += profb[29+64*i];
+			//		fprintf(stderr,"i:%d	%d\n",i,gap_cost);
+				}				
+				gap_cost += profb[27+64*i];
+			//	fprintf(stderr,"i:%d	%d\n",i,gap_cost);
+			}else if(path[c]  & 64){//c terminal gap !!!!!!1
+			//	fprintf(stderr,"c terminal gap\n");
+				gap_cost += profb[27+64];
+			//	fprintf(stderr,"i:%d	%d\n",0,gap_cost);
+				for (i = 1; i < gap_len[c];i++){
+					gap_cost += profb[29+64*i];
+			//		fprintf(stderr,"i:%d	%d\n",i,gap_cost);
+				}
+			}else{
+			//	fprintf(stderr,"middle gap\n");
+				gap_cost += profb[27+64];
+			//	fprintf(stderr,"i:%d	%d\n",0,gap_cost);
+				for (i = 1; i < gap_len[c]-1;i++){
+					gap_cost += profb[28+64*i];
+			//		fprintf(stderr,"i:%d	%d\n",i,gap_cost);
+				}
+				gap_cost += profb[27+64*i];
+			//	fprintf(stderr,"i:%d	%d\n",i,gap_cost);
+			}
+			//fprintf(stderr,"gap_A	%d	%d	length:%d	cost:%d\n",c,path[c],gap_len[c],gap_cost);
+			gap_cost /=  gap_len[c];
+			gap_cost *= internal_gap_weight;
+			
+			while(path[c] & 1 && path[c] != 3){
+		//		fprintf(stderr,"gap_A	%d	%d	cost:%d\n",c,path[c],gap_cost);
+				for (i = 64; i--;){
+					newp[i] = profb[i];
+				}
+				newp[23] += gap_cost;
+				for (i = 32; i < 55;i++){
+					newp[i] += gap_cost;
+				}
+				profb +=64;
+				newp += 64;
+				c++;
+			}		
+		}else if (path[c] & 2){
+			//fprintf(stderr,"%d\n",gap_len[c]);
+			if(path[c]  & 128){//N terminal gap !!!!!!1
+				for (i = 0; i < gap_len[c]-1;i++){
+					gap_cost += profa[29+64*i];
+			//		fprintf(stderr,"i:%d	%d\n",i,gap_cost);
+				}
+				gap_cost += profa[27+64*i];
+			//	fprintf(stderr,"i:%d	%d\n",i,gap_cost);
+			}else if(path[c]  & 64){//c terminal gap !!!!!!1
+			//	fprintf(stderr,"c terminal gap\n");
+				gap_cost += profa[27+64];
+			//	fprintf(stderr,"i:%d	%d\n",c-1,gap_cost);
+				for (i = 1; i < gap_len[c];i++){
+					gap_cost += profa[29+64*i];
+			//		fprintf(stderr,"i:%d	%d\n",i,gap_cost);
+				}
+			}else{
+			//	fprintf(stderr,"middle gap\n");
+				gap_cost += profa[27+64];
+			//	fprintf(stderr,"i:%d	%d\n",c-1,gap_cost);
+				for (i = 1; i < gap_len[c]-1;i++){
+					gap_cost += profa[28+64*i];
+			//		fprintf(stderr,"i:%d	%d\n",i,gap_cost);
+				}
+				gap_cost += profa[27+64*i];
+			//	fprintf(stderr,"i:%d	%d\n",i,gap_cost);
+			}
+			
+			gap_cost /=  gap_len[c];
+			
+			gap_cost *= internal_gap_weight;
+			
+			while(path[c] & 2 && path[c] != 3){
+		//		fprintf(stderr,"gap_b	%d	%d cost:%d\n",c,path[c],gap_cost);
+				for (i = 64; i--;){
+					newp[i] = profa[i];
+				}
+				newp[23] += gap_cost;
+				for (i = 32;i < 55;i++){
+					newp[i] += gap_cost;
+				}
+				profa +=64;
+				newp += 64;
+				c++;
+			}			
+		}
+	}
+	for (i = 64; i--;){
+		newp[i] =  profa[i] + profb[i];
+	}	
+	newp -= path[0] *64; 
+	
+	free(gap_len);
+	
+	return newp;
+}
+
+
+void smooth_gaps(float* prof,int len,int window,float strength)
+{
+	float tmp_gpo;
+	float tmp_gpe;
+	float tmp_tgpe;
+	int i,j;
+	if(!(window &1)){
+		window--;
+	}
+	for ( i = (window/2); i < len - (window/2);i++){
+		tmp_gpo = 0.0;
+		tmp_gpe = 0.0;
+		tmp_tgpe = 0.0;
+		for (j = -(window/2); j < (window/2);j++){
+			tmp_gpo += (float)prof[27+((i+j)*64)]*strength;
+			tmp_gpe += (float) prof[28+((i+j)*64)]*strength;
+			tmp_tgpe += (float) prof[29+((i+j)*64)]*strength;
+		}
+		tmp_gpo /= window;
+		tmp_gpe /= window;
+		tmp_tgpe /= window;
+		prof[27+(i*64)] =  prof[27+(i*64)]*(1.0-strength) + tmp_gpo;
+		prof[28+(i*64)] =  prof[28+(i*64)]*(1.0-strength) + tmp_gpe;
+		prof[29+(i*64)] =  prof[29+(i*64)]*(1.0-strength) + tmp_tgpe;
+	}
+}
+
+
+void increase_gaps(float* prof,int len,int window,float strength)
+{
+	float* mod = 0;
+	int i,j,c;
+	int start_pos = 0;
+	int end_pos = 0; 
+	
+	mod = malloc(sizeof(float)*window);
+	for ( i = 0; i < window;i++){
+		mod[i] = (strength - i*(float)strength / (float) window) - (0.5*strength);
+	}
+	//only gpo first....
+	for ( i = 0; i < len;i++){
+// 	//	fprintf(stderr,"(%0.2f:%0.2f) ",prof[26],prof[23]);
+		prof[26] = 0.0;
+		prof+= 64;
+	}
+	prof -= len << 6;
+	
+	
+	
+	for ( i = 0; i < len;i++){
+		
+		if(prof[23]!= 0){
+			
+			start_pos = i-window;
+			if(start_pos < 0){
+				c = start_pos + window;	
+			}else{
+				c = window;
+			}
+			
+			for ( j = c;j--;){
+				prof[26 - (64*(j+1))] +=  mod[j];
+			}
+			end_pos = i+window;
+			if(end_pos > len){
+				c = len - i;	
+			}else{
+				c = window;
+			}
+			//fprintf(stderr,"%d %d\n",i,c);
+			for (j = 0;j < c;j++){
+				prof[26 +(64*(j+1))] +=  mod[j];
+			}
+		}
+		prof+= 64;
+	}
+	prof -= len << 6;
+
+	for ( i = 0; i < len;i++){
+// 	//	fprintf(stderr,"(%0.2f:%0.2f) ",prof[26],prof[23]);
+		prof[27] = prof[27] * (prof[26]+1.0);
+		prof[28] = prof[28] * (prof[26]+1.0);
+		prof[29] = prof[29] * (prof[26]+1.0);
+		prof+= 64;
+	}
+	prof -= len << 6;
+	
+	free(mod);
+}
+
+
+void set_gap_penalties2(float* prof,int len,int nsip,int window,float strength)
+{
+	int i,j;
+	float tmp_gpo;
+	float tmp_gpe;
+	float tmp_tgpe;
+	
+	prof +=  (64 *(len));
+	
+	prof[27] = prof[55]*nsip*-gpo;
+	prof[28] = prof[55]*nsip*-gpe;
+	prof[29] = prof[55]*nsip*-tgpe;
+
+	i = len;
+	while(i--){
+		prof -= 64;
+		prof[27] = prof[55]*nsip*-gpo;
+		prof[28] = prof[55]*nsip*-gpe;
+		
+		prof[29] = prof[55]*nsip*-tgpe;
+	}
+	if(!(window &1)){
+		window--;
+	}
+	
+	
+	for ( i = (window/2); i < len - (window/2);i++){
+		tmp_gpo = 0.0;
+		tmp_gpe = 0.0;
+		tmp_tgpe = 0.0;
+		for (j = -(window/2); j < (window/2);j++){
+			tmp_gpo += (float)prof[27+((i+j)*64)]*strength;
+			tmp_gpe += (float) prof[28+((i+j)*64)]*strength;
+			tmp_tgpe += (float) prof[29+((i+j)*64)]*strength;
+		}
+		tmp_gpo /= window;
+		tmp_gpe /= window;
+		tmp_tgpe /= window;
+		prof[27+(i*64)] =  prof[27+(i*64)]*(1-strength) + tmp_gpo;
+		prof[28+(i*64)] =  prof[28+(i*64)]*(1-strength) + tmp_gpe;
+		prof[29+(i*64)] =  prof[29+(i*64)]*(1-strength) + tmp_tgpe;
+	}
+	
+	/*for ( i = 2; i < len-2;i++){
+                prof[27+(i*64)]  = (prof[27+((i-2)*64)] +prof[27+((i-1)*64)] + prof[27+(i*64)] + prof[27+((i+1)*64)] +prof[27+((i+2)*64)])/ 5;
+        }*/
+       /* for ( i = 2; i < len-2;i++){
+                prof[28+(i*64)]  = (prof[28+((i-2)*64)] + prof[28+((i-1)*64)] + prof[28+(i*64)] + prof[28+((i+1)*64)] +prof[28+((i+2)*64)])/ 5;
+        }
+        for ( i = 2; i < len-2;i++){
+                prof[29+(i*64)]  = (prof[29+((i-2)*64)] + prof[29+((i-1)*64)] + prof[29+(i*64)] + prof[29+((i+1)*64)] +prof[29+((i+2)*64)])/ 5;
+        }*/
+
+}
+
+
+
+float* make_profile2(float* prof, int* seq,int len,float** subm)
+{
+	int i,j,c;	
+	prof = malloc(sizeof(float)*(len+1)*64);
+	prof +=  (64 *len);
+	
+	for (i = 0;i < 64;i++){
+		prof[i] = 0;
+	}
+	prof[55] = 1;
+
+	i = len;
+	while(i--){
+		prof -= 64;
+
+		for (j = 0;j < 64;j++){
+			prof[j] = 0;
+		}
+		c = seq[i];
+		
+		prof[c] += 1;
+					
+		prof += 32;
+		for(j = 23;j--;){
+			prof[j] = subm[c][j];
+			
+		}
+		prof[23] = 1;
+		prof -= 32;
+
+	}
+	return prof;
+}
+
+
+float*  feature_update(const float* profa, const float* profb,float* newp,int* path,int stride)
+{
+	int i,c;
+	c = 1;
+	while(path[c] != 3){
+		if (!path[c]){
+			for (i = stride; i--;){
+				newp[i] = profa[i] + profb[i];
+			}
+			profa += stride;
+			profb += stride;
+		}
+		if (path[c] & 1){
+			for (i = stride; i--;){
+				newp[i] = profb[i];
+			}
+			profb += stride;	
+			
+		}
+		if (path[c] & 2){
+			for (i = stride; i--;){
+				newp[i] = profa[i];
+			}
+			profa+=stride;			
+		}
+		newp += stride;
+		c++;
+	}
+	for (i = stride; i--;){
+		newp[i] =  profa[i] + profb[i];
+	}	
+	newp -= path[0] *stride;
+	return newp;
+}
+
+float* make_wu_profile(float* prof,float* wu,int len)
+{
+	int i;	
+	
+	
+	prof = malloc(sizeof(float)*(len+1)*2);
+	
+	
+	for (i = 0;i < (len+1)*2;i++){
+		prof[i] = 0;
+	}
+	for (i = 0; i < len;i++){
+		if(!wu[i]){
+			prof[i<<1] = 1;
+			prof[(i<<1)+1] = 1;
+			
+		}else{
+			prof[i<<1] = wu[i]+1;
+			prof[(i<<1)+1] = wu[i]+1;
+		}
+	}
+	return prof;
+}
+
+
+float* make_feature_profile(float* prof,struct feature* f,int len,struct feature_matrix* fm)
+{
+	int i,j;	
+	
+	
+	prof = malloc(sizeof(int)*(len+1)*fm->stride);
+	
+	
+	for (i = 0;i < (len+1)*fm->stride;i++){
+		prof[i] = 0;
+	}
+	
+	while(f){
+		if(f->color != -1){
+			if(f->start < len && f->end < len){
+				for (i = f->start-1;i < f->end;i++){
+					prof[i*fm->stride + f->color] += 1;
+					for ( j =fm->mdim ;j < fm->stride;j++){
+						prof[i*fm->stride+j] += fm->m[f->color][j-fm->mdim];
+					}
+				}
+			}
+		}
+		f = f->next;
+	}	
+	return prof;
+}
+
+
+
+float* make_profile(float* prof, int* seq,int len, float** subm)
+{
+	int i,j,c;	
+	prof = malloc(sizeof(float)*(len+2)*64);
+	prof +=  (64 *(len+1));
+
+	for (i = 0;i < 64;i++){
+		prof[i] = 0;
+	}
+	prof[23+32] = -gpo;
+	prof[24+32] = -gpe;
+	prof[25+32] = -tgpe;
+
+	
+	i = len;
+	while(i--){
+		prof -= 64;
+
+		for (j = 0;j < 64;j++){
+			prof[j] = 0;
+		}
+		c = seq[i];
+		
+		prof[c] += 1;
+		
+		prof += 32;
+		
+		for(j = 23;j--;){
+			prof[j] = subm[c][j];
+		}
+		prof[23] = -gpo;
+		prof[24] = -gpe;
+		prof[25] = -tgpe;
+		
+		prof -= 32;
+	}
+	prof -= 64;
+	for (i = 0;i < 64;i++){
+		prof[i] = 0;
+	}
+	prof[23+32] = -gpo;
+	prof[24+32] = -gpe;
+	prof[25+32] = -tgpe;	
+	return prof;
+}
+
+float* dna_make_profile(float* prof, int* seq,int len,float** subm)
+//int* make_profile(int* prof, int* seq,int len)
+{
+	int i,j,c;	
+	prof = malloc(sizeof(float)*(len+2)*22);
+	prof +=  (22 *(len+1));
+	//fprintf(stderr,"Len:%d	%d\n",len,64*len);
+	//for (i = 64;i--;){
+	for (i = 0;i < 22;i++){
+		prof[i] = 0;
+	}
+	prof[5+11] = -gpo;
+	prof[6+11] = -gpe;
+	prof[7+11] = -tgpe;
+
+	
+	i = len;
+	while(i--){
+		prof -= 22;
+		//fprintf(stderr,"-64\n");
+		//for (j = 64; j--;){
+		for (j = 0;j < 22;j++){
+			prof[j] = 0;
+		}
+		c = seq[i];
+		
+		prof[c] += 1;
+		
+		//n = feature[i];
+		//prof[n+23] = 1;
+		
+		prof += 11;
+		for(j = 5;j--;){
+			prof[j] = subm[c][j];
+		}
+		prof[5] = -gpo;
+		prof[6] = -gpe;
+		prof[7] = -tgpe;
+		prof -= 11;
+	}
+	prof -= 22;
+	for (i = 0;i < 22;i++){
+		prof[i] = 0;
+	}
+	prof[5+11] = -gpo;
+	prof[6+11] = -gpe;
+	prof[7+11] = -tgpe;
+	
+	return prof;
+}
+
+
+
+
+float* update(const float* profa, const float* profb,float* newp,int* path,int sipa,int sipb)
+{
+	int i,j,c;
+	for (i = 64; i--;){
+		newp[i] = profa[i] + profb[i];
+	}
+	
+	profa += 64;
+	profb += 64;
+	newp += 64;
+
+	c = 1;
+	
+	while(path[c] != 3){
+		//Idea: limit the 'virtual' number of residues of one type to x.
+		// i.e. only allow a maximum of 10 alanines to be registered in each column
+		// the penalty for aligning a 'G' to this column will stay stable even when many (>10) alanines are present.
+		// the difference in score between the 'correct' (all alanine) and incorrect (alanines + glycine) will not increase 
+		// with the number of sequences. -> see Durbin pp 140
+		
+		if (!path[c]){
+			//fprintf(stderr,"Align	%d\n",c);
+			for (i = 64; i--;){
+				newp[i] = profa[i] + profb[i];
+			}
+				
+			
+			profa += 64;
+			profb += 64;
+		}
+		
+		if (path[c] & 1){
+			//fprintf(stderr,"Gap_A:%d\n",c);
+			//printf("open:%d	ext:%d	%d	%d\n",si->nsip[a] * gpo,si->nsip[a] * gpe,si->nsip[a] * profb[41],si->nsip[a] * profb[46]);
+			for (i = 64; i--;){
+				newp[i] = profb[i];
+			}
+			profb += 64;
+			#ifndef SIMPLE 
+			if(!(path[c] & 20)){
+				if(path[c] & 32){
+					newp[25] += sipa;//1;
+					i = tgpe*sipa;
+				}else{
+					newp[24] += sipa;//1;
+					i = gpe*sipa;
+				}
+				
+				for (j = 32; j < 55;j++){
+					newp[j] -=i;
+				}
+			}else{
+			if (path[c] & 16){ 
+	//			fprintf(stderr,"close_open");
+				if(path[c] & 32){
+					newp[25] += sipa;//1;
+					i = tgpe*sipa;
+					newp[23] += sipa;//1;
+					i += gpo*sipa;
+				}else{
+					newp[23] += sipa;//1;
+					i = gpo*sipa;
+				}
+								
+				for (j = 32; j < 55;j++){
+					newp[j] -=i;
+				}
+			}
+			if (path[c] & 4){ 
+	//			fprintf(stderr,"Gap_open");
+				if(path[c] & 32){
+					newp[25] += sipa;//1;
+					i = tgpe*sipa;
+					newp[23] += sipa;//1;
+					i += gpo*sipa;
+				}else{
+					newp[23] += sipa;//1;
+					i = gpo*sipa;
+				}
+				for (j = 32; j < 55;j++){
+					newp[j] -=i;
+				}
+			}
+			}
+			#endif
+			
+			
+		}
+		if (path[c] & 2){
+			//fprintf(stderr,"Gap_B:%d\n",c);
+			//printf("open:%d	ext:%d	%d	%d\n",si->nsip[b] * gpo,si->nsip[b] * gpe,profa[26],profa[27]);
+			for (i = 64; i--;){
+				newp[i] = profa[i];
+			}
+			profa+=64;
+			#ifndef SIMPLE 
+			if(!(path[c] & 20)){
+				if(path[c] & 32){
+					newp[25] += sipb;//1;
+					i = tgpe*sipb;
+				}else{
+					newp[24] += sipb;//1;
+					i = gpe*sipb;
+				}
+				for (j = 32; j < 55;j++){
+					newp[j] -=i;
+				}
+			}else{
+			if (path[c] & 16){
+	//			fprintf(stderr,"close_open");
+				if(path[c] & 32){
+					newp[25] += sipb;//1;
+					i =  tgpe*sipb;
+					newp[23] += sipb;//1;
+					i +=  gpo*sipb;
+				}else{
+					newp[23] += sipb;//1;
+					i =  gpo*sipb;
+				}
+				for (j = 32; j < 55;j++){
+					newp[j] -=i;
+				}
+			}
+			if (path[c] & 4){
+	//			fprintf(stderr,"Gap_open");
+				if(path[c] & 32){
+					newp[25] += sipb;//1;
+					i = tgpe*sipb;
+					newp[23] += sipb;//1;
+					i += gpo*sipb;
+				}else{
+					newp[23] += sipb;//1;
+					i = gpo*sipb;
+				}
+				
+				for (j = 32; j < 55;j++){
+					newp[j] -=i;
+				}
+			}
+			}
+			#endif
+			
+		}
+		newp += 64;
+		c++;
+	}
+	for (i = 64; i--;){
+		newp[i] =  profa[i] + profb[i];
+	}	
+	newp -= (path[0]+1) *64;
+	return newp;
+}
+
+float* dna_update(const float* profa, const float* profb, float* newp,int* path,int sipa,int sipb)
+{
+	int i,j,c;
+	
+	for (i = 22; i--;){
+		newp[i] = profa[i] + profb[i];
+	}
+	
+	profa += 22;
+	profb += 22;
+	newp += 22;
+	
+	
+	c = 1;
+	while(path[c] != 3){
+		//Idea: limit the 'virtual' number of residues of one type to x.
+		// i.e. only allow a maximum of 10 alanines to be registered in each column
+		// the penalty for aligning a 'G' to this column will stay stable even when many (>10) alanines are present.
+		// the difference in score between the 'correct' (all alanine) and incorrect (alanines + glycine) will not increase 
+		// with the number of sequences. -> see Durbin pp 140
+		
+		if (!path[c]){
+			//fprintf(stderr,"Align	%d\n",c);
+			for (i = 22; i--;){
+				newp[i] = profa[i] + profb[i];
+			}
+				
+			
+			profa += 22;
+			profb += 22;
+		}
+		if (path[c] & 1){
+			//fprintf(stderr,"Gap_A:%d\n",c);
+			//printf("open:%d	ext:%d	%d	%d\n",si->nsip[a] * gpo,si->nsip[a] * gpe,si->nsip[a] * profb[41],si->nsip[a] * profb[46]);
+			for (i = 22; i--;){
+				newp[i] = profb[i];
+			}
+			profb += 22;
+			if(!(path[c]&20)){
+				if(path[c]&32){
+					newp[7] += sipa;//1;
+					i = tgpe*sipa;
+				}else{
+					newp[6] += sipa;//1;
+					i = gpe*sipa;
+				}
+				
+				for (j = 11; j < 16;j++){
+					newp[j] -=i;
+				}
+			}else{
+			if (path[c] & 16){ 
+	//			fprintf(stderr,"close_open");
+				if(path[c]&32){
+					newp[7] += sipa;//1;
+					i = tgpe*sipa;
+					newp[5] += sipa;//1;
+					i += gpo*sipa;
+				}else{
+					newp[5] += sipa;//1;
+					i = gpo*sipa;
+				}
+								
+				for (j = 11; j < 16;j++){
+					newp[j] -=i;
+				}
+			}
+			if (path[c] & 4){ 
+	//			fprintf(stderr,"Gap_open");
+				if(path[c]&32){
+					newp[7] += sipa;//1;
+					i = tgpe*sipa;
+					newp[5] += sipa;//1;
+					i += gpo*sipa;
+				}else{
+					newp[5] += sipa;//1;
+					i = gpo*sipa;
+				}
+				for (j = 11; j < 16; j++){
+					newp[j] -=i;
+				}
+			}
+			}
+			
+			
+		}
+		if (path[c] & 2){
+			//fprintf(stderr,"Gap_B:%d\n",c);
+			//printf("open:%d	ext:%d	%d	%d\n",si->nsip[b] * gpo,si->nsip[b] * gpe,profa[26],profa[27]);
+			for (i = 22; i--;){
+				newp[i] = profa[i];
+			}
+			profa+=22;
+			if(!(path[c]&20)){
+				if(path[c]&32){
+					newp[7] += sipb;//1;
+					i = tgpe*sipb;
+				}else{
+					newp[6] += sipb;//1;
+					i = gpe*sipb;
+				}
+				for (j = 11; j < 16;j++){
+					newp[j] -=i;
+				}
+			}else{
+			if (path[c] & 16){
+	//			fprintf(stderr,"close_open");
+				if(path[c]&32){
+					newp[7] += sipb;//1;
+					i =  tgpe*sipb;
+					newp[5] += sipb;//1;
+					i +=  gpo*sipb;
+				}else{
+					newp[5] += sipb;//1;
+					i =  gpo*sipb;
+				}
+				for (j = 11; j < 16;j++){
+					newp[j] -=i;
+				}
+			}
+			if (path[c] & 4){
+	//			fprintf(stderr,"Gap_open");
+				if(path[c]&32){
+					newp[7] += sipb;//1;
+					i = tgpe*sipb;
+					newp[5] += sipb;//1;
+					i += gpo*sipb;
+				}else{
+					newp[5] += sipb;//1;
+					i = gpo*sipb;
+				}
+				
+				for (j = 11; j < 16;j++){
+					newp[j] -=i;
+				}
+			}
+			}
+			
+		}
+		newp += 22;
+		c++;
+	}
+	for (i = 22; i--;){
+		newp[i] =  profa[i] + profb[i];
+	}	
+	newp -= (path[0]+1) *22; 
+	return newp;
+}
+
+
+void dna_set_gap_penalties(float* prof,int len,int nsip)
+{
+	int i;
+	
+	prof +=  (22 *(len+1));
+	prof[8] = prof[16]*nsip;//gap open or close
+	prof[9] = prof[17]*nsip;//gap extention
+	
+	prof[10] = prof[18]*nsip;//gap open or close
+	//prof[30] = prof[58]*nsip;//gap extention
+	
+	
+	i = len+1;
+	while(i--){
+		prof -= 22;
+		prof[8] = prof[16]*nsip;//gap open or close
+		prof[9] = prof[17]*nsip;//gap extention
+		
+		prof[10] = prof[18]*nsip;//gap open or close
+	//	prof[30] = prof[58]*nsip;//gap extention	
+	}
+}
+
+void set_gap_penalties(float* prof,int len,int nsip)
+{
+	int i;
+	
+	prof +=  (64 *(len+1));
+	prof[27] = prof[55]*nsip;//gap open or close
+	prof[28] = prof[56]*nsip;//gap extention
+		
+	prof[29] = prof[57]*nsip;//gap open or close
+	i = len+1;
+	while(i--){
+		prof -= 64;
+		prof[27] = prof[55]*nsip;//gap open or close
+		prof[28] = prof[56]*nsip;//gap extention
+		
+		prof[29] = prof[57]*nsip;//gap open or close
+	}
+}
+

Added: trunk/packages/kalign/branches/upstream/current/kalign2_profile_alignment.c
===================================================================
--- trunk/packages/kalign/branches/upstream/current/kalign2_profile_alignment.c	2006-11-19 13:38:57 UTC (rev 159)
+++ trunk/packages/kalign/branches/upstream/current/kalign2_profile_alignment.c	2006-11-29 14:12:29 UTC (rev 160)
@@ -0,0 +1,579 @@
+/*
+	kalign2_profile_alignment.c
+	
+	Released under GPL - see the 'COPYING' file   
+	
+	Copyright (C) 2006 Timo Lassmann <timolassmann at gmail.com>
+	
+	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
+	any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+    
+	Please send bug reports, comments etc. to:
+	timolassmann at gmail.com
+*/
+
+#include "kalign2.h"
+#include "kalign2_profile_alignment.h"
+#include "kalign2_hirschberg.h"
+
+void profile_alignment_main(struct alignment* aln,struct parameters* param,float** submatrix)
+{
+	float** dm = 0;
+	int* tree = 0;
+	struct aln_tree_node* tree2 = 0;
+	int i,j;
+	int tmp_numseq;
+	int tmp_numprofiles;
+	
+	local_numseq = 0;
+	local_numprofiles = 0;
+	
+	//determine number of profiles that were inputted....
+	
+	while(aln->sl[local_numseq+numseq]){
+		local_numseq++;
+	}
+	
+	local_numprofiles = (local_numseq << 1) - 1;
+	//fprintf(stderr,"%d	%d\n",local_numseq,local_numprofiles);
+	
+	for (i = 0;i < numseq;i++){
+	//	fprintf(stderr,"%d	%d	%d\n",i,aln->s[i][0],aln->s[i][1]);
+		aln->s[i] = assign_gap_codes(aln->s[i],aln->sl[i]); 
+	}
+	
+	if(param->dna == 1){
+		if(byg_start(param->tree,"njNJ") != -1){
+			dm =  dna_profile_distance(aln,dm,param,1);
+		}else{
+			dm =  dna_profile_distance(aln,dm,param,0);
+		}
+	}else{
+		if(byg_start(param->tree,"njNJ") != -1){
+			dm =  protein_profile_wu_distance(aln,dm,param,1);
+		}else{
+			dm =  protein_profile_wu_distance(aln,dm,param,0);
+		}
+	}
+	/*for ( i=0; i < local_numseq;i++){
+		for (j = 0;j < local_numseq;j++){
+			fprintf(stderr,"%f ",dm[i][j]);
+		}
+		fprintf(stderr,"\n");
+	}*/
+	
+	tmp_numseq = numseq;
+	tmp_numprofiles = numprofiles;
+	
+	numseq = local_numseq;
+ 	numprofiles = local_numprofiles;
+	
+	if(byg_start(param->tree,"njNJ") != -1){
+		tree2 = real_nj(dm,param->ntree);
+	}else{
+		tree2 = real_upgma(dm,param->ntree);
+	}
+	
+	
+	
+	//WAs here need too add tree2 -> treee..... 
+	
+	
+	tree = malloc(sizeof(int)*(numseq*3+1));
+	for ( i = 1; i < (numseq*3)+1;i++){
+		tree[i] = 0;
+	}
+	tree[0] = 1;
+	tree = readtree(tree2,tree);
+	for (i = 0; i < (numseq*3);i++){
+		tree[i] = tree[i+1]+ tmp_numseq;
+	}
+	//exit(0);
+	
+	numseq = tmp_numseq;
+	numprofiles = tmp_numprofiles;
+	
+	int** map = 0;
+	
+	map =  hirschberg_profile_alignment(aln,tree,submatrix, map);
+	//clear up sequence array to be reused as gap array....
+	int *p = 0;
+	for (i = 0; i < numseq;i++){
+		p = aln->s[i];
+		for (j = 0; j < aln->sl[i];j++){
+			p[j] = 0;
+		}
+	}
+	//clear up
+	int a,b,c;
+	for (i = 0; i < (local_numseq-1)*3;i +=3){
+		a = tree[i];
+		b = tree[i+1];
+		c =  tree[i+2];
+		aln = make_seq(aln,a,b,map[c]);
+	}
+
+	for (i = 0; i < numseq;i++){
+		aln->nsip[i] = 0;
+	}
+	aln =  sort_sequences(aln,tree,param->sort);
+
+	//for (i = 0; i < numseq;i++){
+	//	fprintf(stderr,"%d	%d	%d\n",i,aln->nsip[i],aln->sip[i][0]);
+	//}
+	
+	
+	output(aln,param);
+	
+	
+	free(tree2->links);
+	free(tree2->internal_lables);
+	free(tree2);
+	
+
+	free(map);
+	free(tree);
+	exit(0);
+}
+
+
+int** hirschberg_profile_alignment(struct alignment* aln,int* tree,float**submatrix, int** map)
+{
+	struct hirsch_mem* hm = 0;
+	int i,j,g,a,b,c;
+	int len_a;
+	int len_b;
+	float** profile = 0;
+
+	profile = malloc(sizeof(float*)*numprofiles);
+	for ( i = 0;i< numprofiles;i++){
+		profile[i] = 0;
+	}
+
+	map = malloc(sizeof(int*)*numprofiles);
+	for ( i = 0;i < numprofiles;i++){
+		map[i] = 0;
+	}
+	
+	hm = hirsch_mem_alloc(hm,1024);
+
+	fprintf(stderr,"\nAlignment:\n");
+
+	for (i = 0; i < (local_numseq-1);i++){
+		a = tree[i*3];
+		b = tree[i*3+1];
+		c = tree[i*3+2];
+		fprintf(stderr,"\r%8.0f percent done",(float)(i) /(float)local_numseq * 100);
+		//fprintf(stderr,"Aligning:%d %d->%d	done:%f\n",a,b,c,((float)(i)/(float)local_numseq)*100);
+		len_a = aln->sl[a];
+		len_b = aln->sl[b];
+
+		
+		g = (len_a > len_b)? len_a:len_b;
+		map[c] = malloc(sizeof(int) * (g+2));
+		if(g > hm->size){
+			hm = hirsch_mem_realloc(hm,g);
+		}
+
+		for (j = 0; j < (g+2);j++){
+			map[c][j] = -1;
+		}
+		
+		if (a < numseq+local_numseq){
+			profile[a] = make_profile_from_alignment(profile[a],a,aln,submatrix);
+		}
+		if (b < numseq+local_numseq){
+			profile[b] = make_profile_from_alignment(profile[b],b,aln,submatrix);
+		}
+		
+		
+		set_gap_penalties(profile[b],len_b,aln->nsip[a]);
+		set_gap_penalties(profile[a],len_a,aln->nsip[b]);
+		
+		hm->starta = 0;
+		hm->startb = 0;
+		hm->enda = len_a;
+		hm->endb = len_b;
+		hm->len_a = len_a;
+		hm->len_b = len_b;
+		
+		hm->f[0].a = 0;
+		hm->f[0].ga =  -FLOATINFTY;
+		hm->f[0].gb = -FLOATINFTY;
+		hm->b[0].a = 0;
+		hm->b[0].ga =  -FLOATINFTY;
+		hm->b[0].gb =  -FLOATINFTY;
+	//	fprintf(stderr,"LENA:%d	LENB:%d	numseq:%d\n",len_a,len_b,numseq);
+		if(len_a < len_b){
+			map[c] = hirsch_pp_dyn(profile[a],profile[b],hm,map[c]);
+		}else{
+			hm->enda = len_b;
+			hm->endb = len_a;
+			hm->len_a = len_b;
+			hm->len_b = len_a;
+			map[c] = hirsch_pp_dyn(profile[b],profile[a],hm,map[c]);
+			map[c] = mirror_hirsch_path(map[c],len_a,len_b);
+		}
+		
+		map[c] = add_gap_info_to_hirsch_path(map[c],len_a,len_b);
+
+		if(i != local_numseq-2){
+			//fprintf(stderr,"updating....\n");
+			profile[c] = malloc(sizeof(float)*64*(map[c][0]+2));
+			profile[c] = update(profile[a],profile[b],profile[c],map[c],aln->nsip[a],aln->nsip[b]);
+		}
+			
+		aln->sl[c] = map[c][0];
+	
+		aln->nsip[c] = aln->nsip[a] + aln->nsip[b];
+		aln->sip[c] = malloc(sizeof(int)*(aln->nsip[a] + aln->nsip[b]));
+		g =0;
+		for (j = aln->nsip[a];j--;){
+			aln->sip[c][g] = aln->sip[a][j];
+			g++;
+		}
+		for (j = aln->nsip[b];j--;){
+			aln->sip[c][g] = aln->sip[b][j];
+			g++;
+		}
+
+		free(profile[a]);
+		free(profile[b]);
+	}
+	fprintf(stderr,"\r%8.0f percent done\n",100.0);
+	free(profile);
+	hirsch_mem_free(hm);
+	for (i = 32;i--;){
+		free(submatrix[i]);
+	}
+	free(submatrix);
+	return map;
+}
+
+
+int* assign_gap_codes(int* seq,int len)
+{
+	int i;
+	if(seq[0] < 0 && seq[1] < 0){
+		seq[0] = -2;
+	}
+	
+	for(i = 1; i < len;i++){
+		if(seq[i-1] < 0 && seq[i] < 0){
+			seq[i] = -2;
+		}
+		if(seq[i-1] < 0 && seq[i] >= 0){
+			seq[i-1] = -1;
+		}
+	}
+	i = 0;
+	while(seq[i] < 0){
+		if(seq[i] == -2){
+			seq[i] = -3;
+		}
+		i++;
+	}
+	i = len-1;
+	while(seq[i] < 0){
+		if(seq[i] == -2){
+			seq[i] = -3;
+		}
+		i--;
+	}
+
+	
+	return seq;
+}
+
+
+
+float* make_profile_from_alignment(float* prof, int num,struct alignment* aln,float** subm)
+{
+	int i,j,c;	
+	int a;
+	int len = aln->sl[num];
+	int* seq = 0;
+	prof = malloc(sizeof(float)*(len+2)*64);
+	for ( i = 0; i < (len+2)*64;i++){
+		prof[i] = 0;
+	}
+	
+	for ( a = 0; a < aln->nsip[num];a++){
+	//	fprintf(stderr,"SEQ:%d\n",a);
+		seq = aln->s[aln->sip[num][a]];
+		prof +=  (64 *(len+1));
+
+		prof[23+32] -= gpo;
+		prof[24+32] -= gpe;
+		prof[25+32] -= tgpe;
+	
+		
+		i = len;
+		while(i--){
+			prof -= 64;
+	
+			c = seq[i];
+			if(c >= 0){
+	//			if(i == 0){
+	//				fprintf(stderr,"%d	\n",c);
+	//			}
+				prof[c] += 1;
+				prof += 32;
+				for(j = 23;j--;){
+					prof[j] += subm[c][j];
+				}
+				prof[23] -= gpo;
+				prof[24] -= gpe;
+				prof[25] -= tgpe;
+				prof -= 32;
+			}else if(c == -1){
+				prof[23] += 1;
+				for (j = 32; j < 55;j++){
+					prof[j] -= gpo;
+				}
+			}else if(c == -2){
+				prof[24] += 1;
+				for (j = 32; j < 55;j++){
+					prof[j] -= gpe;
+				}
+			}else if(c == -3){
+				prof[25] += 1;
+				for (j = 32; j < 55;j++){
+					prof[j] -= tgpe;
+				}
+			}
+		}
+		prof -= 64;
+		prof[23+32] -= gpo;
+		prof[24+32] -= gpe;
+		prof[25+32] -= tgpe;
+	}
+	return prof;
+}
+
+
+float** protein_profile_wu_distance(struct alignment* aln,float** dm,struct parameters* param, int nj)
+{
+	struct bignode* hash[1024];
+	int*p =0;
+	int i,j,m,n,a,b;
+	unsigned int hv;
+		
+	int** local_seq = 0;
+	int* local_sl = 0;
+	
+	local_seq = malloc(sizeof(int*)*numseq);
+	local_sl = malloc(sizeof(int)*numseq);
+	for(i = 0; i< numseq;i++){
+		local_seq[i] = malloc(sizeof(int)*aln->sl[i]);
+		a = 0;
+		p = aln->s[i];
+		for (j = 0;j < aln->sl[i];j++){
+			if(p[j] >= 0){
+				local_seq[i][a] = p[j];
+				a++;
+			}
+		}
+		local_sl[i] = a;
+	}
+	//determine number of profiles that were inputted....
+
+	
+	for (i = 0;i < 1024;i++){
+		hash[i] = 0;
+	}	
+
+	if (nj){
+		dm = malloc (sizeof(float*)*local_numprofiles);
+		for (i = local_numprofiles;i--;){
+			dm[i] = malloc (sizeof (float)*(local_numprofiles));
+			for (j = local_numprofiles;j--;){
+				dm[i][j] = 0.0f;
+			}
+		}
+	}else{
+		dm = malloc (sizeof(float*)*local_numseq);
+		for (i = local_numseq;i--;){
+			dm[i] = malloc (sizeof (float)*(local_numseq));
+			for (j = local_numseq;j--;){
+				dm[i][j] = 0.0f;
+			}
+		}
+	}
+	fprintf(stderr,"Distance Calculation:\n");
+	b = (numseq*(numseq-1))/2;
+	a = 1;	
+	
+	//fprintf(stderr,"%d	%d	%8.0f\n",a,b,(float)a /(float)b * 100);
+		
+	for (i = 0; i < numseq-1;i++){
+		m = is_member(aln,i);
+		p = local_seq[i];
+		//p = malloc(sizeof(int)
+				
+		for (j = local_sl[i]-2;j--;){
+	//		hv = (p[j+1] << 5) + p[j+2];
+	//		hash[hv] = insert_hash(hash[hv],j);
+			hv = (p[j] << 5) + p[j+1];
+			hash[hv] = big_insert_hash(hash[hv],j);
+			
+			hv = (p[j] << 5) + p[j+2];
+			hash[hv] = big_insert_hash(hash[hv],j);
+		//	hv = (si->s[i][j+1] << 5) +t2;
+		//	hash[hv] = insert_hash(hash[hv],j);
+		}
+		for (j = i+1; j < numseq;j++){
+			n = is_member(aln,j);
+			if(n != m){
+				//fprintf(stderr,"%d	%d\n",n,m);
+				p = local_seq[j];
+				dm[m][n] += protein_wu_distance_calculation(hash,p,local_sl[j],local_sl[j]+local_sl[i],param->zlevel);
+				//fprintf(stderr,"%d-%d(%d	%d):%f\n",m,n,i,j,dm[m][n]);
+				//exit(0);
+				//dm[i][j] /= min;
+				dm[n][m] = dm[m][n];
+				
+			}
+			fprintf(stderr,"\r%8.0f percent done",(float)a /(float)b * 100);
+			a++;
+			
+		}
+		
+		
+		for (j = 1024;j--;){
+			if (hash[j]){
+				big_remove_nodes(hash[j]);
+				hash[j] = 0;
+			}
+		}	
+	}
+	
+	for(i = 0; i< numseq;i++){
+		free(local_seq[i]);
+	}
+	free(local_seq);
+	free(local_sl);
+	return dm;
+}
+
+float** dna_profile_distance(struct alignment* aln,float** dm,struct parameters* param, int nj)
+{
+	struct bignode* hash[1024];
+	
+	int *p = 0;
+	int i,j,a,b,m,n;
+	unsigned int hv;
+	int** local_seq = 0;
+	int* local_sl = 0;
+	
+	local_seq = malloc(sizeof(int*)*numseq);
+	local_sl = malloc(sizeof(int)*numseq);
+	for(i = 0; i< numseq;i++){
+		local_seq[i] = malloc(sizeof(int)*aln->sl[i]);
+		a = 0;
+		p = aln->s[i];
+		for (j = 0;j < aln->sl[i];j++){
+			if(p[j] >= 0){
+				local_seq[i][a] = p[j];
+				a++;
+			}
+		}
+		local_sl[i] = a;
+	}
+	
+	fprintf(stderr,"Distance Calculation:\n");
+	
+	
+	for (i = 0;i < 1024;i++){
+		hash[i] = 0;
+	}	
+
+	if (nj){
+		dm = malloc (sizeof(float*)*local_numprofiles);
+		for (i = local_numprofiles;i--;){
+			dm[i] = malloc (sizeof (float)*(local_numprofiles));
+			for (j = local_numprofiles;j--;){
+				dm[i][j] = 0.0f;
+			}
+		}
+	}else{
+		dm = malloc (sizeof(float*)*local_numseq);
+		for (i = local_numseq;i--;){
+			dm[i] = malloc (sizeof (float)*(local_numseq));
+			for (j = local_numseq;j--;){
+				dm[i][j] = 0.0f;
+			}
+		}
+	}
+
+	b = (numseq*(numseq-1))/2;
+	a = 1;	
+	
+	for (i = 0; i < numseq-1;i++){
+		m = is_member(aln,i);
+		p = local_seq[i];
+		for (j = local_sl[i]-5;j--;){
+			hv = ((p[j]&3)<<8) + ((p[j+1]&3)<<6) + ((p[j+2]&3)<<4)  + ((p[j+3]&3)<<2) + (p[j+4]&3);//ABCDE
+			hash[hv] = big_insert_hash(hash[hv],j);
+			hv = ((p[j]&3)<<8) + ((p[j+1]&3)<<6) + ((p[j+2]&3)<<4)  + ((p[j+3]&3)<<2) + (p[j+5]&3);//ABCDF
+			hash[hv] = big_insert_hash(hash[hv],j);
+			hv = ((p[j]&3)<<8) + ((p[j+1]&3)<<6) + ((p[j+2]&3)<<4)  + ((p[j+4]&3)<<2) + (p[j+5]&3);//ABCEF
+			hash[hv] = big_insert_hash(hash[hv],j);
+			hv = ((p[j]&3)<<8) + ((p[j+1]&3)<<6) + ((p[j+3]&3)<<4)  + ((p[j+4]&3)<<2) + (p[j+5]&3);//ABDEF
+			hash[hv] = big_insert_hash(hash[hv],j);
+			hv = ((p[j]&3)<<8) + ((p[j+2]&3)<<6) + ((p[j+3]&3)<<4) + ((p[j+4]&3)<<2) + (p[j+5]&3);//ACDEF
+			hash[hv] = big_insert_hash(hash[hv],j);
+		}
+		for (j = i+1; j < numseq;j++){
+			n = is_member(aln,j);
+			if(n != m){
+				p = local_seq[j];
+				//min =  (si->sl[i] > si->sl[j]) ?si->sl[j] :si->sl[i];
+				dm[m][n] += dna_distance_calculation(hash,p,local_sl[j],local_sl[j]+local_sl[i],param->zlevel);
+				//dm[i][j] /= (aln->sl[i] > aln->sl[j]) ? aln->sl[j] : aln->sl[i];
+				dm[n][m] = dm[m][n];
+			}
+			fprintf(stderr,"\r%8.0f percent done",(float)a /(float)b * 100);
+			a++;
+		}
+		
+		for (j = 1024;j--;){
+			if (hash[j]){
+				big_remove_nodes(hash[j]);
+				hash[j] = 0;
+			}
+		}
+	}
+	
+	for(i = 0; i< numseq;i++){
+		free(local_seq[i]);
+	}
+	free(local_seq);
+	free(local_sl);
+	return dm;
+}
+
+int is_member(struct alignment* aln,int test)
+{
+	int i,j;
+	for (i = numseq;i<numseq+local_numseq;i++){
+		for(j = 0;j < aln->nsip[i];j++){
+			if(aln->sip[i][j] == test){
+				return i-numseq;
+			}
+		}
+	}
+	return -1;
+}
+

Added: trunk/packages/kalign/branches/upstream/current/kalign2_profile_alignment.h
===================================================================
--- trunk/packages/kalign/branches/upstream/current/kalign2_profile_alignment.h	2006-11-19 13:38:57 UTC (rev 159)
+++ trunk/packages/kalign/branches/upstream/current/kalign2_profile_alignment.h	2006-11-29 14:12:29 UTC (rev 160)
@@ -0,0 +1,40 @@
+/*
+	kalign2_profile_alignment.h
+	
+	Released under GPL - see the 'COPYING' file   
+	
+	Copyright (C) 2006 Timo Lassmann <timolassmann at gmail.com>
+	
+	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
+	any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+    
+	Please send bug reports, comments etc. to:
+	timolassmann at gmail.com
+*/
+int local_numseq;
+int local_numprofiles;
+
+int* assign_gap_codes(int* seq,int len);
+
+
+int is_member(struct alignment* aln,int test);
+
+float** dna_profile_distance(struct alignment* aln,float** dm,struct parameters* param, int nj);
+float** protein_profile_wu_distance(struct alignment* aln,float** dm,struct parameters* param, int nj);
+
+
+int** hirschberg_profile_alignment(struct alignment* aln,int* tree,float**submatrix, int** map);
+float* make_profile_from_alignment(float* prof, int num,struct alignment* aln,float** subm);
+
+

Added: trunk/packages/kalign/branches/upstream/current/kalign2_simple_gaps.c
===================================================================
--- trunk/packages/kalign/branches/upstream/current/kalign2_simple_gaps.c	2006-11-19 13:38:57 UTC (rev 159)
+++ trunk/packages/kalign/branches/upstream/current/kalign2_simple_gaps.c	2006-11-29 14:12:29 UTC (rev 160)
@@ -0,0 +1,869 @@
+/*
+	kalign2_simple_gaps.c
+	
+	Released under GPL - see the 'COPYING' file   
+	
+	Copyright (C) 2006 Timo Lassmann <timolassmann at gmail.com>
+	
+	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
+	any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+    
+	Please send bug reports, comments etc. to:
+	timolassmann at gmail.com
+*/
+
+#include "kalign2.h"
+
+int** simple_hirschberg_alignment(struct alignment* aln,int* tree,int**submatrix, int** map)
+{
+	struct hirsch_mem* hm = 0;
+	int i,j,g,a,b,c;
+	int len_a;
+	int len_b;
+	int** profile = 0;
+
+	profile = malloc(sizeof(int*)*numprofiles);
+	for ( i = 0;i< numprofiles;i++){
+		profile[i] = 0;
+	}
+
+	map = malloc(sizeof(int*)*numprofiles);
+	for ( i = 0;i < numprofiles;i++){
+		map[i] = 0;
+	}
+	
+	hm = hirsch_mem_alloc(hm,1024);
+
+	fprintf(stderr,"\nAlignment:\n");
+
+	for (i = 0; i < (numseq-1);i++){
+		a = tree[i*3];
+		b = tree[i*3+1];
+		c = tree[i*3+2];
+		fprintf(stderr,"\r%8.0f percent done",(float)(i) /(float)numseq * 100);
+	//	fprintf(stderr,"Aligning:%d %d->%d	done:%f\n",a,b,c,((float)(i+1)/(float)numseq)*100);
+		len_a = aln->sl[a];
+		len_b = aln->sl[b];
+
+		
+		g = (len_a > len_b)? len_a:len_b;
+		map[c] = malloc(sizeof(int) * (g+2));
+		if(g > hm->size){
+			hm = hirsch_mem_realloc(hm,g);
+		}
+
+		for (j = 0; j < (g+2);j++){
+		//	hirsch_path[j] = -1;
+			map[c][j] = -1;
+		//	map[c][j] = 0;
+		}
+	//	map[c][0] = len_a;
+		//map[c][len_a+len_b+1] = 3;
+
+		if (a < numseq){
+			profile[a] = simple_make_profile(profile[a],aln->s[a],len_a,submatrix);
+		}
+		if (b < numseq){
+			profile[b] = simple_make_profile(profile[b],aln->s[b],len_b,submatrix);
+		}
+
+		hm->starta = 0;
+		hm->startb = 0;
+		hm->enda = len_a;
+		hm->endb = len_b;
+		hm->len_a = len_a;
+		hm->len_b = len_b;
+		
+		hm->f[0].a = 0;
+		hm->f[0].ga =  -INFTY;
+		hm->f[0].gb = -INFTY;
+		hm->b[0].a = 0;
+		hm->b[0].ga =  -INFTY;
+		hm->b[0].gb =  -INFTY;
+	//	fprintf(stderr,"LENA:%d	LENB:%d	numseq:%d\n",len_a,len_b,numseq);
+		if(len_a < len_b){
+			map[c] = simple_hirsch_pp_dyn(profile[a],profile[b],hm,map[c]);
+		}else{
+			hm->enda = len_b;
+			hm->endb = len_a;
+			hm->len_a = len_b;
+			hm->len_b = len_a;
+			map[c] = simple_hirsch_pp_dyn(profile[b],profile[a],hm,map[c]);
+			map[c] = mirror_hirsch_path(map[c],len_a,len_b);
+		}
+					
+		map[c] = add_gap_info_to_hirsch_path(map[c],len_a,len_b);
+
+		if(i != numseq-2){
+			profile[c] = malloc(sizeof(int)*64*(map[c][0]+2));
+			profile[c] = simple_update(profile[a],profile[b],profile[c],map[c]);
+		}
+			
+		aln->sl[c] = map[c][0];
+	
+		aln->nsip[c] = aln->nsip[a] + aln->nsip[b];
+		aln->sip[c] = malloc(sizeof(int)*(aln->nsip[a] + aln->nsip[b]));
+		g =0;
+		for (j = aln->nsip[a];j--;){
+			aln->sip[c][g] = aln->sip[a][j];
+			g++;
+		}
+		for (j = aln->nsip[b];j--;){
+			aln->sip[c][g] = aln->sip[b][j];
+			g++;
+		}
+
+		free(profile[a]);
+		free(profile[b]);
+	}
+	fprintf(stderr,"\r%8.0f percent done\n",100.0);
+	free(profile);
+	hirsch_mem_free(hm);
+	for (i = 32;i--;){
+		free(submatrix[i]);
+	}
+	free(submatrix);
+	return map;
+}
+
+
+int* simple_make_profile(int* prof, int* seq,int len,int** subm)
+{
+	int i,j,c;	
+	prof = malloc(sizeof(int)*(len+2)*64);
+	prof +=  (64 *(len+1));
+
+	for (i = 0;i < 64;i++){
+		prof[i] = 0;
+	}
+	prof[23+32] = -gpo;
+	prof[26] = 1;
+
+	
+	i = len;
+	while(i--){
+		prof -= 64;
+
+		for (j = 0;j < 64;j++){
+			prof[j] = 0;
+		}
+		prof[26] = 1;//number of residues // both additive
+		c = seq[i];
+		
+		prof[c] += 1;
+		
+		prof += 32;
+		
+		for(j = 23;j--;){
+			prof[j] = subm[c][j];
+		}
+		prof[23] = -gpo;
+		
+		prof -= 32;
+	}
+	prof -= 64;
+	for (i = 0;i < 64;i++){
+		prof[i] = 0;
+	}
+
+	prof[23+32] = -gpo;
+	prof[26] = 1;
+	return prof;
+}
+
+
+
+
+int* simple_update(int* profa,int* profb,int* newp,int* path)
+{
+	int i,c;
+	for (i = 64; i--;){
+		newp[i] = profa[i] + profb[i];
+	}
+	
+	profa += 64;
+	profb += 64;
+	newp += 64;
+
+	c = 1;
+	
+	while(path[c] != 3){
+		//Idea: limit the 'virtual' number of residues of one type to x.
+		// i.e. only allow a maximum of 10 alanines to be registered in each column
+		// the penalty for aligning a 'G' to this column will stay stable even when many (>10) alanines are present.
+		// the difference in score between the 'correct' (all alanine) and incorrect (alanines + glycine) will not increase 
+		// with the number of sequences. -> see Durbin pp 140
+		
+		if (!path[c]){
+			for (i = 64; i--;){
+				newp[i] = profa[i] + profb[i];
+			}
+				
+			
+			profa += 64;
+			profb += 64;
+		}
+		if (path[c] & 1){
+			for (i = 64; i--;){
+				newp[i] = profb[i];
+			}
+			profb += 64;			
+		}
+		if (path[c] & 2){
+			for (i = 64; i--;){
+				newp[i] = profa[i];
+			}
+			profa+=64;			
+		}
+		newp += 64;
+		c++;
+	}
+	for (i = 64; i--;){
+		newp[i] =  profa[i] + profb[i];
+	}	
+	newp -= (path[0]+1) *64;
+	return newp;
+}
+
+
+
+int* simple_hirsch_pp_dyn(const int* prof1,const int* prof2,struct hirsch_mem* hm, int* hirsch_path)
+{
+	int mid = ((hm->enda - hm->starta) / 2)+ hm->starta;
+	int input_states[6] = {hm->f[0].a,hm->f[0].ga,hm->f[0].gb,hm->b[0].a,hm->b[0].ga,hm->b[0].gb};
+	int old_cor[5] = {hm->starta,hm->enda,hm->startb,hm->endb,mid};
+
+	
+	//fprintf(stderr,"starta:%d enda:%d startb:%d endb:%d mid:%d\n",hm->starta,hm->enda,hm->startb,hm->endb,mid);
+	
+	
+	if(hm->starta  >= hm->enda){
+		return hirsch_path;
+	}
+	if(hm->startb  >= hm->endb){
+		return hirsch_path;
+	}
+
+	hm->enda = mid;
+	hm->f = simple_foward_hirsch_pp_dyn(prof1,prof2,hm);
+	/*int i;
+	fprintf(stderr,"FOWARD\n");
+	for (i = hm->startb; i <= hm->endb;i++){
+		fprintf(stderr,"%d	%d	%d\n",hm->f[i].a,hm->f[i].ga,hm->f[i].gb);
+	}*/
+
+	hm->starta = mid;
+	hm->enda = old_cor[1];
+	hm->b = simple_backward_hirsch_pp_dyn(prof1,prof2,hm);
+	/*fprintf(stderr,"BaCKWARD\n");
+
+	for (i = hm->startb; i <= hm->endb;i++){
+		fprintf(stderr,"%d	%d	%d\n",hm->b[i].a,hm->b[i].ga,hm->b[i].gb);
+	}*/
+
+	hirsch_path = simple_hirsch_align_two_pp_vector(prof1,prof2,hm,hirsch_path,input_states,old_cor);
+	return hirsch_path;
+}
+
+
+
+int* simple_hirsch_align_two_pp_vector(const int* prof1,const int* prof2,struct hirsch_mem* hm,int* hirsch_path,int input_states[],int old_cor[])
+{
+	struct states* f = hm->f;
+ 	struct states* b = hm->b;
+	int i,j,c;
+	int transition = -1;
+	
+	
+	//code:
+	// a -> a = 1
+	// a -> ga = 2
+	// a -> gb = 3
+	// ga ->ga = 4
+	// ga -> a = 5
+	//gb->gb = 6;
+	//gb->a = 7;
+	
+	//int max = -INFTY;
+	float max = -INFTY;	
+	float middle =  (hm->endb - hm->startb)/2 + hm->startb;
+	float sub = 0.0;
+	
+
+	prof1+= (64 * (old_cor[4]+1));
+	prof2 += 64 * (hm->startb);
+	i = hm->startb;
+	c = -1;
+	for(i = hm->startb; i < hm->endb;i++){
+		sub = abs(middle -i);
+		sub /= 1000; 
+		prof2 += 64;
+		//fprintf(stderr,"%d	%d	%d \n",f[i].a,b[i].a,max);
+		if(f[i].a+b[i].a-sub > max){
+			max = f[i].a+b[i].a-sub;
+	//		fprintf(stderr,"aligned->aligned:%d + %d = %d\n",f[i].a,b[i].a,f[i].a+b[i].a);
+			transition = 1;
+			c = i;
+		}
+		if(f[i].a+b[i].ga+prof2[23]*prof1[26]-sub > max){
+			max = f[i].a+b[i].ga+prof2[23]*prof1[26]-sub;
+	//		fprintf(stderr,"aligned->gap_a:%d + %d +%d = %d\n",f[i].a,b[i].ga,prof1[27],f[i].a+b[i].ga+prof2[27]);
+			transition = 2;
+			c = i;
+		}
+		if(f[i].a+b[i].gb+prof1[23]*prof2[26] -sub> max){
+			max = f[i].a+b[i].gb+prof1[23]*prof2[26]-sub;
+	//		fprintf(stderr,"aligned->gap_b:%d + %d +%d = %d\n",f[i].a,b[i].gb,prof1[27],f[i].a+b[i].gb+prof1[27]);
+			transition = 3;
+			c = i;
+		}
+		if(f[i].ga+b[i].a+prof2[23]*prof1[26]-sub > max){
+			max = f[i].ga+b[i].a+prof2[23]*prof1[26]-sub;
+	//		fprintf(stderr,"gap_a->aligned:%d + %d + %d(gpo) = %d\n",f[i].ga,b[i].a,prof2[27],f[i].ga+b[i].a+prof2[27]);
+			transition = 5;
+			c = i;
+		}
+
+
+		if(hm->startb == 0){
+			if(f[i].gb+b[i].gb-sub > max){
+				max = f[i].gb+b[i].gb-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+				transition = 6;
+				c = i;
+			}
+		}else{
+			if(f[i].gb+b[i].gb-sub > max){
+				max = f[i].gb+b[i].gb-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+				transition = 6;
+				c = i;
+			}
+		}
+		if(f[i].gb+b[i].a+prof1[23]*prof2[26]-sub > max){
+			max = f[i].gb+b[i].a+prof1[23]*prof2[26]-sub;
+	//		fprintf(stderr,"gap_b->aligned:%d + %d + %d(gpo) = %d\n",f[i].gb,b[i].a,prof1[27],f[i].gb+b[i].a+prof1[27]);
+			transition = 7;
+			c = i;
+		}
+	}
+	i = hm->endb;
+	sub = abs(middle -i);
+	sub /= 1000; 
+	if(f[i].a+b[i].gb+prof1[23]*prof2[26]-sub > max){
+		max = f[i].a+b[i].gb+prof1[23]*prof2[26]-sub;
+	//		fprintf(stderr,"aligned->gap_b:%d + %d +%d = %d\n",f[i].a,b[i].gb,prof1[27],f[i].a+b[i].gb+prof1[27]);
+		transition = 3;
+		c = i;
+	}
+	if(hm->endb == hm->len_b){
+		if(f[i].gb+b[i].gb-sub > max){
+			max = f[i].gb+b[i].gb-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+			transition = 6;
+			c = i;
+		}	
+	}else{
+		if(f[i].gb+b[i].gb-sub > max){
+			max = f[i].gb+b[i].gb-sub;
+	//			fprintf(stderr,"gap_b->gap_b:%d + %d +%d(gpe) =%d \n",f[i].gb, b[i].gb, prof1[28],f[i].gb+b[i].gb+prof1[28]);
+			transition = 6;
+			c = i;
+		}
+	}
+	
+	
+	
+	prof1-= (64 * (old_cor[4]+1));
+	prof2 -= hm->endb << 6;
+	
+	//fprintf(stderr,"Transition:%d	at:%d\n",transition,c);
+	//if(transition == -1){
+	//	exit(0);
+	//}
+	
+	j = hirsch_path[0];
+	switch(transition){
+		case 1: //a -> a = 1
+			
+			hirsch_path[old_cor[4]] = c;
+			hirsch_path[old_cor[4]+1] = c+1;
+			
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4],c);
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4]+1,c+1);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = 0;
+			hm->b[0].ga = -INFTY;
+			hm->b[0].gb = -INFTY;
+	//		fprintf(stderr,"Using this for start:%d	%d	%d\n",hm->f[0].a,hm->f[0].ga,hm->f[0].gb);
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = simple_hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = 0;
+			hm->f[0].ga = -INFTY;
+			hm->f[0].gb = -INFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d  what:%d-%d	%d-%d\n",c+1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = simple_hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+			break;
+		case 2:// a -> ga = 2
+			
+			hirsch_path[old_cor[4]] = c;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4],c);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = 0;
+			hm->b[0].ga = -INFTY;
+			hm->b[0].gb = -INFTY;
+			
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = simple_hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4];
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = -INFTY;
+			hm->f[0].ga = 0;
+			hm->f[0].gb = -INFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d  what:%d-%d	%d-%d\n",c+1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = simple_hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+			break;
+		case 3:// a -> gb = 3
+			
+			hirsch_path[old_cor[4]] = c;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4],c);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = 0;
+			hm->b[0].ga = -INFTY;
+			hm->b[0].gb = -INFTY;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = simple_hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c;
+			hm->endb = old_cor[3];
+			hm->f[0].a = -INFTY;
+			hm->f[0].ga = -INFTY;
+			hm->f[0].gb = 0;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = simple_hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+			break;
+		case 5://ga -> a = 5
+			hirsch_path[old_cor[4]+1] = c+1;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4]+1,c+1);
+
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = -INFTY;
+			hm->b[0].ga = 0;
+			hm->b[0].gb = -INFTY;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4];
+			
+			hm->startb = old_cor[2];
+			hm->endb = c-1;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = simple_hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = 0;
+			hm->f[0].ga = -INFTY;
+			hm->f[0].gb = -INFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = simple_hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+			break;
+		case 6://gb->gb = 6;
+			
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = -INFTY;
+			hm->b[0].ga = -INFTY;
+			hm->b[0].gb = 0;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			hm->startb = old_cor[2];
+			hm->endb = c;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = simple_hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c;
+			hm->endb = old_cor[3];
+			hm->f[0].a = -INFTY;
+			hm->f[0].ga = -INFTY;
+			hm->f[0].gb = 0;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = simple_hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+			break;
+		case 7://gb->a = 7;
+			
+			hirsch_path[old_cor[4]+1] = c+1;
+	//		fprintf(stderr,"Aligning:%d-%d\n",old_cor[4]+1,c+1);
+			//foward:
+			hm->f[0].a = input_states[0];
+			hm->f[0].ga = input_states[1];
+			hm->f[0].gb = input_states[2];
+			hm->b[0].a = -INFTY;
+			hm->b[0].ga = -INFTY;
+			hm->b[0].gb = 0;
+			
+			hm->starta = old_cor[0];
+			hm->enda = old_cor[4]-1;
+			hm->startb = old_cor[2];
+			hm->endb = c;
+			//fprintf(stderr,"Following first: %d  what:%d-%d	%d-%d\n",c-1,hm->starta,hm->enda,hm->startb,hm->endb);
+			hirsch_path = simple_hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+
+			//backward:
+			hm->starta = old_cor[4]+1;
+			hm->enda = old_cor[1];
+			hm->startb = c+1;
+			hm->endb = old_cor[3];
+			hm->f[0].a = 0;
+			hm->f[0].ga = -INFTY;
+			hm->f[0].gb = -INFTY;
+			hm->b[0].a = input_states[3];
+			hm->b[0].ga = input_states[4];
+			hm->b[0].gb = input_states[5];
+	
+			//fprintf(stderr,"Following last: %d\n",c+1);
+			hirsch_path = simple_hirsch_pp_dyn(prof1,prof2,hm,hirsch_path);
+			break;
+	}
+		
+	return hirsch_path;
+}
+
+
+
+struct states* simple_foward_hirsch_pp_dyn(const int* prof1,const int* prof2,struct hirsch_mem* hm)
+{
+	unsigned int freq[23];
+	struct states* s = hm->f;
+
+	register int pa = 0;
+	register int pga = 0;
+	register int pgb = 0;
+	register int ca = 0;
+	register int i = 0;
+	register int j = 0;
+	
+	
+	
+	prof1 += (hm->starta) << 6;
+	prof2 +=  (hm->startb) << 6;
+	s[hm->startb].a = s[0].a;
+	s[hm->startb].ga = s[0].ga;
+	s[hm->startb].gb = s[0].gb;
+	if(hm->startb == 0){
+		for (j = hm->startb+1; j < hm->endb;j++){
+			prof2+=64;
+			s[j].a = -INFTY;
+			
+			s[j].ga = s[j-1].a;
+			if (s[j-1].ga > s[j].ga){
+				s[j].ga = s[j-1].ga;
+			}
+			s[j].gb = -INFTY;
+		}	
+		prof2+=64;	
+	}else{
+
+		for (j = hm->startb+1; j < hm->endb;j++){
+			prof2+=64;
+			s[j].a = -INFTY;
+			
+			s[j].ga = s[j-1].a+prof2[23]*prof1[26];
+			if (s[j-1].ga > s[j].ga){
+				s[j].ga = s[j-1].ga;
+			}
+			s[j].gb = -INFTY;
+		//	prof2+=64;
+		}
+		prof2+=64;
+	}
+	
+	prof2 -= (hm->endb-hm->startb) << 6;
+	
+	s[hm->endb].a = -INFTY;
+	s[hm->endb].ga = -INFTY;
+	s[hm->endb].gb = -INFTY;
+
+
+	for (i = hm->starta;i < hm->enda;i++){
+		prof1 += 64;
+		pa = 1;
+ 		for (j = 23; j--;){
+			if(prof1[j]){
+				freq[pa] = j;
+				pa++;	
+			}
+		}
+		freq[0] = pa;
+			
+		pa = s[hm->startb].a;
+		pga = s[hm->startb].ga;
+		pgb = s[hm->startb].gb;
+		if(hm->startb == 0){
+			s[hm->startb].a = -INFTY;
+			s[hm->startb].ga = -INFTY;
+		
+			s[hm->startb].gb = pa;
+				if(pgb> s[hm->startb].gb){
+				s[hm->startb].gb = pgb;
+			}
+		}else{
+			s[hm->startb].a = -INFTY;
+			s[hm->startb].ga = -INFTY;
+		
+			s[hm->startb].gb = pa+prof1[23]*prof2[26];
+			if(pgb > s[hm->startb].gb){
+				s[hm->startb].gb = pgb;
+			}
+		}
+		for (j = hm->startb+1; j <= hm->endb;j++){
+			prof2 += 64;
+			ca = s[j].a;
+			
+			if((pga += prof2[23-64]*prof1[26-64]) > pa){ 
+				pa = pga;
+			}
+
+			if((pgb += prof1[23-64]*prof2[26-64]) > pa){
+				pa = pgb;
+			}
+			
+			prof2 += 32;
+			for (pga = freq[0];--pga;){
+				pgb = freq[pga];
+				pa += prof1[pgb]*prof2[pgb];
+			}
+			prof2 -= 32;	
+
+			s[j].a = pa;
+			
+			pga = s[j].ga;
+			
+			s[j].ga = s[j-1].a+prof2[23]*prof1[26];
+			if (s[j-1].ga> s[j].ga){
+				s[j].ga = s[j-1].ga;
+			}
+			
+			pgb = s[j].gb;
+			
+			s[j].gb = ca+prof1[23]*prof2[26];
+			if(pgb > s[j].gb){
+				s[j].gb = pgb;
+			}
+			pa = ca;
+		}
+		prof2 -= (hm->endb-hm->startb) << 6;
+		
+	}
+	prof1 -= 64 * (hm->enda);
+	return s;
+}
+
+struct states* simple_backward_hirsch_pp_dyn(const int* prof1,const int* prof2,struct hirsch_mem* hm)
+{
+	unsigned int freq[23];
+	struct states* s = hm->b;
+	
+	register int pa = 0;
+	register int pga = 0;
+	register int pgb = 0;
+	register int ca = 0;
+	register int i = 0;
+	register int j = 0;
+
+	prof1 += (hm->enda+1) << 6;
+	prof2 += (hm->endb+1) << 6;
+	s[hm->endb].a = s[0].a;
+	s[hm->endb].ga = s[0].ga;
+	s[hm->endb].gb = s[0].gb;
+	
+	
+	//init of first row;
+	//j = endb-startb;
+	if(hm->endb == hm->len_b){
+		
+		for(j = hm->endb-1;j > hm->startb;j--){
+			prof2 -= 64;
+			s[j].a = -INFTY;
+			
+			s[j].ga = s[j+1].a;
+			if (s[j+1].ga> s[j].ga){
+				s[j].ga = s[j+1].ga;
+			}
+			s[j].gb = -INFTY;
+		}
+		prof2 -= 64;
+	}else{
+		for(j = hm->endb-1;j > hm->startb;j--){
+			prof2 -= 64;
+			s[j].a = -INFTY;
+			
+			s[j].ga = s[j+1].a+prof2[23]*prof1[26];
+			if (s[j+1].ga > s[j].ga){
+				s[j].ga = s[j+1].ga;
+			}
+			s[j].gb = -INFTY;
+		//	prof2 -= 64;
+		}
+		prof2 -= 64;
+	}
+	
+	s[hm->startb].a = -INFTY;
+	s[hm->startb].ga = -INFTY;
+	s[hm->startb].gb = -INFTY;
+//	prof2 -= (endb -startb) << 6;
+
+	i = hm->enda-hm->starta;
+	while(i--){
+		prof1 -= 64;
+
+		pa = 1;
+		for (j = 23; j--;){
+			if(prof1[j]){
+				freq[pa] = j;
+				pa++;	
+			}
+		}
+		freq[0] = pa;
+		
+		pa = s[hm->endb].a;
+		pga = s[hm->endb].ga;
+		pgb = s[hm->endb].gb;
+		s[hm->endb].a = -INFTY;
+		s[hm->endb].ga = -INFTY;
+
+		if(hm->endb == hm->len_b){
+			s[hm->endb].gb = pa;
+			if(pgb > s[hm->endb].gb){
+				s[hm->endb].gb = pgb;
+			}
+		}else{
+			s[hm->endb].gb = pa+prof1[23]*prof2[26];
+			if(pgb> s[hm->endb].gb){
+				s[hm->endb].gb = pgb;
+			}
+		}
+		//j = endb-startb;
+		prof2 += (hm->endb-hm->startb) << 6;
+		//while(j--){
+		for(j = hm->endb-1;j >= hm->startb;j--){
+			prof2 -= 64;
+			ca = s[j].a;
+			if((pga += prof2[64+23]*prof1[26]) > pa){
+				pa = pga;
+			}
+			if((pgb += prof1[64+23]*prof2[26]) > pa){
+				pa = pgb;
+			}
+			
+			prof2 += 32;
+			for (pga = freq[0];--pga;){
+				pgb = freq[pga];
+				pa += prof1[pgb]*prof2[pgb];
+			}
+			prof2 -= 32;
+
+			s[j].a = pa;
+			
+			pga = s[j].ga;
+			
+			s[j].ga = s[j+1].a+prof2[23]*prof1[26];
+			if (s[j+1].ga > s[j].ga){
+				s[j].ga = s[j+1].ga;
+			}
+			
+			pgb = s[j].gb;
+			
+			s[j].gb = ca+prof1[23]*prof2[26];
+			if(pgb > s[j].gb){
+				s[j].gb = pgb;
+			}
+			pa = ca;
+		}
+	}		
+	return s;
+}
+
+

Added: trunk/packages/kalign/branches/upstream/current/kalign2_stats.c
===================================================================
--- trunk/packages/kalign/branches/upstream/current/kalign2_stats.c	2006-11-19 13:38:57 UTC (rev 159)
+++ trunk/packages/kalign/branches/upstream/current/kalign2_stats.c	2006-11-29 14:12:29 UTC (rev 160)
@@ -0,0 +1,23 @@
+#include "kalign2.h"
+
+
+void stats(struct alignment* aln)
+{
+	int i,j;
+	float 
+	
+	for (i = 0; i < numseq-1;i++){
+		for (j = i + 1; j < numseq;j++){
+			for (j = 0; j < aln->sl[f];j++){
+		}
+		f = aln->nsip[i];
+		fprintf(stdout,">%s\n",aln->sn[f]);
+		c = 0;
+		for (j = 0; j < aln->sl[f];j++){
+			tmp = aln->s[f][j];]
+			aln->seq[f][j]
+		}
+	}
+}
+
+

Added: trunk/packages/kalign/branches/upstream/current/kalign2_string_matching.c
===================================================================
--- trunk/packages/kalign/branches/upstream/current/kalign2_string_matching.c	2006-11-19 13:38:57 UTC (rev 159)
+++ trunk/packages/kalign/branches/upstream/current/kalign2_string_matching.c	2006-11-29 14:12:29 UTC (rev 160)
@@ -0,0 +1,174 @@
+/*
+	kalign2_string_matching.c
+	
+	Released under GPL - see the 'COPYING' file   
+	
+	Copyright (C) 2006 Timo Lassmann <timolassmann at gmail.com>
+	
+	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
+	any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+    
+	Please send bug reports, comments etc. to:
+	timolassmann at gmail.com
+*/
+
+#include <string.h>
+
+int byg_detect(int* text,int n)
+{
+	int Tc;
+	int i  = 0;
+	int s = 0;
+	int T[256];
+	for (i = 0;i < 256;i++){ 
+		T[i] = 0; 
+	}
+	int mb = 1;
+	//char *unique_aa = "EFILPQXZ";//permissiv
+	//ABCDEFGHIJKLMNOPQRSTUVWXYZ
+	char *unique_aa = "BDEFHIJKLMNOPQRSVWYZ";//restrictive
+	int aacode[26] = {0,1,2,3,4,5,6,7,8,-1,9,10,11,12,23,13,14,15,16,17,17,18,19,20,21,22};
+	for (i= 0;i < 20;i++){
+		T[(int)aacode[unique_aa[i]-65]] |= 1;
+	}
+	for (i = 0;i < n;i++){
+	//	fprintf(stderr,"%d\n",text[i]);
+		if(text[i] != -1){
+			s <<= 1;
+			s |= 1;
+			Tc = T[text[i]];
+			s &= Tc;
+			if(s & mb){
+				return 0;
+			}
+		}
+	}
+	return 1;
+}
+
+int check_identity(char* n,char*m)
+{
+	int len_n;
+	int len_m;
+	int i;
+	
+	len_n = strlen(n);
+	len_m = strlen(m);
+	if(len_m != len_n){
+		return -1;
+	}
+	for (i = 0; i < len_n;i++){
+		if(n[i] != m[i]){
+			return -1;
+		}
+	}
+	return 1;
+	
+}
+
+
+int byg_count(char* pattern,char*text)
+{
+	int Tc;
+	int count = 0;
+	int i  = 0;
+	int s = 0;
+	int T[256];
+	for (i = 0;i < 256;i++){ 
+		T[i] = 0; 
+	}
+	
+	int m = strlen(pattern);
+	int n = strlen (text);
+	int mb = (1 << (m-1));
+	
+	for (i= 0;i < m;i++){
+		T[(int)pattern[i]] |= (1 << i);
+	}
+
+	for (i = 0;i < n;i++){
+		s <<= 1;
+		s |= 1;
+		Tc = T[(int)text[i]];
+		s &= Tc;
+		if(s & mb){
+			count++;
+		}
+	}
+	return count;
+}
+
+int byg_end(char* pattern,char*text)
+{
+	int Tc;
+	int i  = 0;
+	int s = 0;
+	int T[256];
+	for (i = 0;i < 256;i++){ 
+		T[i] = 0; 
+	}
+	
+	int m = strlen(pattern);
+	int n = strlen (text);
+	int mb = (1 << (m-1));
+
+	for (i= 0;i < m;i++){
+		T[(int)pattern[i]] |= (1 << i);
+	}
+
+	for (i = 0;i < n;i++){
+		s <<= 1;
+		s |= 1;
+		if(!text[i]){
+			return -1;
+		}
+		Tc = T[(int)text[i]];
+		s &= Tc;
+		if(s & mb){
+			return i+1;
+		}
+	}
+	return -1;
+}
+
+int byg_start(char* pattern,char*text)
+{
+	int Tc;
+	int i  = 0;
+	int s = 0;
+	int T[256];
+	for (i = 0;i < 256;i++){ 
+		T[i] = 0; 
+	}
+	
+	int m = strlen(pattern);
+	int n = strlen(text);
+	int mb = (1 << (m-1));
+	
+	for (i= 0;i < m;i++){
+		T[(int)pattern[i]] |= (1 << i);
+	}
+
+	for (i = 0;i < n;i++){
+		s <<= 1;
+		s |= 1;
+		Tc = T[(int)text[i]];
+		s &= Tc;
+		if(s & mb){
+			return i-m+1;
+		}
+	}
+	return -1;
+}
+

Added: trunk/packages/kalign/branches/upstream/current/kalign2_tree.c
===================================================================
--- trunk/packages/kalign/branches/upstream/current/kalign2_tree.c	2006-11-19 13:38:57 UTC (rev 159)
+++ trunk/packages/kalign/branches/upstream/current/kalign2_tree.c	2006-11-29 14:12:29 UTC (rev 160)
@@ -0,0 +1,872 @@
+/*
+	kalign2_tree.c 
+	
+	Released under GPL - see the 'COPYING' file   
+	
+	Copyright (C) 2006 Timo Lassmann <timolassmann at gmail.com>
+	
+	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
+	any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+    
+	Please send bug reports, comments etc. to:
+	timolassmann at gmail.com
+*/
+
+#include "kalign2.h"
+
+struct aln_tree_node* real_upgma(float **dm,int ntree)
+{
+	int i,j;
+	int *as = 0;
+	float max;
+	int node_a = 0;
+	int node_b = 0;
+	int cnode = numseq;
+	
+	struct aln_tree_node** tree = 0;
+	struct aln_tree_node* tmp = 0;
+	
+	as = malloc(sizeof(int)*numseq);
+	for (i = numseq; i--;){
+		as[i] = i+1;
+	}
+	
+	tree = malloc(sizeof(struct aln_tree_node*)*numseq);
+	for (i=0;i < numseq;i++){
+		tree[i] = malloc(sizeof(struct aln_tree_node));
+		tree[i]->done = 1;
+		tree[i]->num = i;
+		tree[i]->path = 0;
+		tree[i]->profile = 0;
+		tree[i]->seq = 0;//seq[i];
+		tree[i]->len = 0;//len[i]; 
+		/*
+		Needs to be +2 because:
+		at n = 3 is is possible to get a perfectly balanced binary tree with 4 sequences at intermediate nodes
+		*/
+		/*tree[i]->links = malloc(sizeof(struct aln_tree_node*)*2);
+		
+		for ( j =0;j < 2;j++){
+			tree[i]->links[j] = 0;
+		}*/
+		
+		tree[i]->internal_lables = malloc(sizeof(int)*(ntree+(ntree-1)));
+		tree[i]->links = malloc(sizeof(struct aln_tree_node*)*(ntree+(ntree-1)));
+		
+		for ( j =0;j < (ntree+(ntree-1));j++){
+			tree[i]->links[j] = 0;
+			tree[i]->internal_lables[j] = 0;
+		}
+	}
+	
+	while (cnode != numprofiles){
+		max = -INFTY;
+		for (i = 0;i < numseq-1; i++){
+			if (as[i]){
+			for ( j = i + 1;j < numseq;j++){
+				if (as[j]){
+				if (dm[i][j] > max){
+					max = dm[i][j];
+					node_a = i;
+					node_b = j;
+				}
+				}
+			}
+			}
+		}
+		tmp = malloc(sizeof(struct aln_tree_node));
+		tmp->done = 0;
+		tmp->path = 0;
+		tmp->profile = 0;
+		tmp->num = cnode;
+		tmp->seq = 0;
+		tmp->len = 0;
+		
+		tmp->links = malloc(sizeof(struct aln_tree_node*)*(ntree+(ntree-1)));
+		tmp->internal_lables = malloc(sizeof(int)*(ntree+(ntree-1)));
+		tmp->links[0] = tree[node_a];
+		tmp->links[1] = tree[node_b];
+		tmp->internal_lables[0] = cnode;
+		tmp->internal_lables[1] = 0;
+		
+		for ( i =2;i < (ntree+(ntree-1));i++){
+			tmp->links[i] = 0;
+			tmp->internal_lables[i] = 0;
+			
+		}
+		
+		
+		tree[node_a] = tmp;
+		tree[node_b] = 0;
+				
+		/*deactivate  sequences to be joined*/
+		as[node_a] = cnode+1;
+		as[node_b] = 0;
+		cnode++;    
+		
+		/*calculate new distances*/
+		for (j = numseq;j--;){
+			if (j != node_b){
+				dm[node_a][j] = (dm[node_a][j] + dm[node_b][j])*0.5;
+			}
+		}
+		dm[node_a][node_a] = 0.0f;
+		for (j = numseq;j--;){
+			dm[j][node_a] = dm[node_a][j];
+			dm[j][node_b] = 0.0f;
+			dm[node_b][j] = 0.0f;
+		}		
+	}
+	tmp = tree[node_a];
+	
+	for (i = numseq;i--;){
+		free(dm[i]);
+	}
+	free(dm);
+	
+	
+	free(tree);
+	free(as);
+	return tmp;
+}
+
+struct aln_tree_node* real_nj(float **dm,int ntree)
+{
+	int i,j;
+	//float **dm = 0;
+	float *r = 0;
+	float *r_div = 0;
+	int *active = 0;
+	int node = 0;
+	float min = 0;
+	int join_a = 0;
+	int join_b = 0;
+	int leaves = 0;
+	
+	struct aln_tree_node** tree = 0;
+	struct aln_tree_node* tmp = 0;
+
+	leaves = numseq;
+	
+	r = malloc ((numseq*2-1) *sizeof(float));
+	r_div = malloc ((numseq*2-1) *sizeof(float));
+	active = malloc((numseq*2-1)*sizeof(int));
+	for ( i = 0;i < numseq*2-1;i++){
+		active[i] = 0;
+	}
+	for ( i = 0;i < numseq;i++){
+		active[i] = 1;
+	}
+	
+	
+	tree = malloc(sizeof(struct aln_tree_node*)*(numseq*2-1));
+	for (i=0;i < numseq*2-1;i++){
+		tree[i] = malloc(sizeof(struct aln_tree_node));
+		tree[i]->done = 1;
+		tree[i]->num = i;
+		tree[i]->path = 0;
+		tree[i]->profile = 0;
+		tree[i]->seq = 0;//seq[i];
+		tree[i]->len = 0;//len[i]; 	
+		tree[i]->internal_lables = malloc(sizeof(int)*(ntree+(ntree-1)));
+		tree[i]->links = malloc(sizeof(struct aln_tree_node*)*(ntree+(ntree-1)));
+		
+		for ( j =0;j < (ntree+(ntree-1));j++){
+			tree[i]->links[j] = 0;
+			tree[i]->internal_lables[j] = 0;
+		}
+	}
+	
+	node = numseq;
+	while (node != numseq*2 -1){
+		for (i = 0;i<numseq*2-1;i++){
+			if (active[i]){
+				r[i] = 0;
+				for (j = 0;j < numseq*2-1;j++){
+					if (active[j]){
+						r[i] += (i<j) ?dm[i][j]:dm[j][i];
+					}
+				}
+				r_div[i] = r[i] / (leaves-2);
+			}
+		}
+		for ( j = 0;j < numseq*2-1;j++){
+			if (active[j]){
+			for ( i = j+1;i < numseq*2-1;i++){
+				if (active[i]){
+				dm[i][j] = dm[j][i] - (r[i] + r[j])/2;
+				}
+			}
+			}
+		}
+		min = -INFTY;
+		for ( j = 0;j < numseq*2-1;j++){
+			if (active[j]){
+			for ( i = j+1;i < numseq*2-1;i++){
+				if (active[i]){
+					if (dm[i][j] > min){
+						min = dm[i][j];
+						join_a = j;
+						join_b = i;
+					}
+				}
+			}
+			}
+		}
+		//join_a always smaller than join_b && both smaller than node
+		dm[join_a][node] =  dm[join_a][join_b]/2 + (r_div[join_a] - r_div[join_b])/2;
+		dm[join_b][node] =  dm[join_a][join_b] - dm[join_a][node];
+		
+		tree[node]->num = node;
+		tree[node]->links[0] = tree[join_a];
+		tree[node]->links[1] = tree[join_b];
+		tree[node]->internal_lables[0] = node;
+		tree[node]->internal_lables[1] = 0;
+
+
+		active[join_a] = 0;
+		active[join_b] = 0;
+		
+		for (i = 0;i<numseq*2-1;i++){
+			if (active[i]){
+				dm[i][node] = (i>join_a) ? dm[join_a][i]: dm[i][join_a];
+				dm[i][node] -= dm[join_a][node];
+				dm[i][node] += (i > join_b) ? dm[join_b][i] : dm[i][join_b] ;
+				dm[i][node] -= dm[join_b][node];
+				dm[i][node] /= 2;
+			}
+		}
+		active[node] = 1;
+		node++;
+	}
+
+	for (i = numprofiles;i--;){
+		free(dm[i]);
+	}
+	free(dm);
+
+	free(r);
+	free(r_div);
+	free(active);
+	tmp = tree[node-1];
+	free(tree);
+	return tmp;
+}
+
+struct ntree_data* alignntree(struct ntree_data* ntree_data,struct aln_tree_node* p)
+{
+	int i = 0;
+	int ntree = ntree_data->ntree;
+	int* leaves = 0;
+	
+	leaves = malloc(sizeof(int)* (ntree+(ntree-1)));
+
+	while(p->links[i]){
+		alignntree(ntree_data,p->links[i]);
+		i++;	
+	}
+	i = 0;
+	if (p->links[i]){
+		fprintf(stderr,"Aligning subtree: at node:%d\n",p->num);
+		while(p->links[i]){
+			leaves[i] = p->links[i]->num;
+			i++;
+		}
+		leaves[i] = -1;
+	//	fprintf(stderr,"NODES:%d\n",i);
+		ntree_data =  find_best_topology(ntree_data,leaves,p->internal_lables);
+	//	exit(0);
+	}
+	free(leaves);
+	
+	return ntree_data;
+}
+
+
+void print_simple_phylip_tree(struct aln_tree_node* p)
+{
+	if(p->links[0]){
+	
+		fprintf(stderr,"(");
+		print_simple_phylip_tree(p->links[0]);
+	}
+	if(p->num < numseq){
+		fprintf(stderr,"%d",p->num);
+	}else{
+		fprintf(stderr,",");
+	}
+	if(p->links[1]){
+		print_simple_phylip_tree(p->links[1]);
+		fprintf(stderr,")");
+	}
+}
+
+
+void printtree(struct aln_tree_node* p)
+{
+	int i = 0;
+
+	while(p->links[i]){
+		printtree(p->links[i]);
+		i++;	
+	}
+	i = 0;
+	if (p->links[i]){
+		printf("Aligning: at node:%d\n",p->num);
+		while(p->links[i]){
+			printf("%d\n",p->links[i]->num);
+			i++;
+		}
+		i = 0;
+		while(p->internal_lables[i]){
+			printf("%d ",p->internal_lables[i]);
+			i++;
+		}
+		printf("\n");
+	}
+}
+
+void ntreeify(struct aln_tree_node* p,int ntree)
+{
+	int i = 0;
+	int c = 0;
+	struct aln_tree_node* tmp1 = 0;
+	struct aln_tree_node* tmp2 = 0;
+	if (p->links[0]){
+		ntreeify(p->links[0],ntree);
+	}
+	if (p->links[1]){
+		ntreeify(p->links[1],ntree);
+	}
+	
+	if (!p->done){
+		tmp1 = p->links[0];
+		tmp2 = p->links[1];
+		
+		p->done = tmp1->done + tmp2->done;
+		i = 0;
+		c = 0;
+		if(tmp1->done != 1){
+
+			while(tmp1->internal_lables[i]){
+				p->internal_lables[c] = tmp1->internal_lables[i];
+				i++;
+				c++;
+			}
+			if(tmp2->done != 1){
+				i = 0;
+				while(tmp2->internal_lables[i]){
+					p->internal_lables[c] = tmp2->internal_lables[i];
+					c++;
+					i++;
+				}
+			}
+		}else if(tmp2->done != 1){
+			i = 0;
+			while(tmp2->internal_lables[i]){
+				p->internal_lables[c] = tmp2->internal_lables[i];
+				c++;
+				i++;
+			}
+		}
+		p->internal_lables[c] = p->num;
+		
+		//fprintf(stderr,"%d:%d	%d:%d		%d\n",tmp1->num,tmp1->internal_lables[0],tmp2->num,tmp2->internal_lables[0],p->num);
+		/*for (i = 0; i< c;i++){
+			fprintf(stderr,"il:%d ",p->internal_lables[i]);
+		}
+		fprintf(stderr,"\n");*/
+	
+		
+		if (tmp1->done > 1){
+			for ( i = 0;i < tmp1->done;i++){
+				p->links[i] = tmp1->links[i];
+				tmp1->links[i] = 0;				
+			}
+		}
+		
+		if (tmp2->done > 1){
+			for ( i = 0; i < tmp2->done;i++){
+				p->links[tmp1->done+i] = tmp2->links[i];
+				tmp2->links[i] = 0;
+			}
+			free(tmp2->internal_lables);
+			free(tmp2->links);
+			free(tmp2);
+		}else{
+			p->links[tmp1->done] = tmp2;
+		}
+	//	fprintf(stderr,"p->num:%d\n",p->num);
+		p->links[p->done] = 0;
+		
+		if (tmp1->done > 1){
+			free(tmp1->internal_lables);
+			free(tmp1->links);
+			free(tmp1);
+		}
+		
+		if (p->done >= ntree){ 
+			p->done = 1;
+			/*i = 0;
+			while(p->internal_lables[i]){
+				i++;
+			}
+			p->internal_lables[i] = p->num;*/
+		}
+	}
+}
+
+struct ntree_data* find_best_topology(struct ntree_data* ntree_data,int* leaves,int* nodes)
+{
+	int i,c;
+	int elements = 0;
+	//int num_topologies =0;
+	int* milometer = 0; //DURBIN
+	struct tree_node* tree = 0;
+	struct tree_node* tmp = 0;
+	int newnode = 0;
+	int local_ntree = 0;
+	
+	int *tmp_tree = 0;
+
+	while(leaves[local_ntree] != -1){
+		local_ntree++;
+	}
+	//fprintf(stderr,"REALKDASF KJAF SA:%d\n",local_ntree);
+
+	//for (i = 0; i < local_ntree-1;i++){
+	//	fprintf(stderr,"nodes:%d\n",nodes[i]);
+	//}
+	
+
+	tmp_tree = malloc(sizeof(int)*(local_ntree+local_ntree-1)*3);
+	for (c = 0; c < (local_ntree+local_ntree-1)*3;c++){
+		tmp_tree[c] = 0;
+	}
+	
+	tmp_tree[0] =1;
+	
+	
+	if (local_ntree < 3){
+		//printf("ORDER1: %d	and	%d\n",leaves[0],leaves[1]);
+		tmp_tree[0] =1;
+	
+		tmp = malloc(sizeof(struct tree_node));
+		tmp->left = 0;
+		tmp->right = 0;
+		tmp->label = -1;
+		tmp->edge = 0;
+	
+		tmp->left = malloc(sizeof(struct tree_node));
+		tmp->left->left = 0;
+		tmp->left->right = 0;
+		tmp->left->edge = 1;
+		tmp->left->label = leaves[0];
+		tmp->right = malloc(sizeof(struct tree_node));
+		tmp->right->left = 0;
+		tmp->right->right = 0;
+		tmp->right->edge = 2;
+		tmp->right->label = leaves[1];
+		tree = malloc(sizeof(struct tree_node));
+		tree->left =tmp;
+		tree->right = 0;
+		tree->edge = -1;
+		tree->label = -1;
+
+		c =  add_label_simpletree(tree,nodes,0);
+		readsimpletree(tree,tmp_tree);
+		/*for (c = 1; c < tmp_tree[0];c++){
+			fprintf(stderr,"%d ",tmp_tree[c]);
+		}
+		fprintf(stderr,"\n\n");*/
+  		ntree_data =ntree_sub_alignment(ntree_data,tmp_tree,local_ntree);
+		free(tmp_tree);
+		
+	}else{
+		elements = local_ntree-2;
+		milometer = malloc(sizeof(int)*(elements));
+		for ( i = 0; i < elements;i++){
+			milometer[i] = 0;
+		}
+
+		i = 0;
+		while(milometer[0] != -1){
+	
+			tmp_tree[0] =1;
+	
+			tmp = malloc(sizeof(struct tree_node));
+			tmp->left = 0;
+			tmp->right = 0;
+			tmp->label = -1;
+			tmp->edge = 0;
+	
+			tmp->left = malloc(sizeof(struct tree_node));
+			tmp->left->left = 0;
+			tmp->left->right = 0;
+			tmp->left->edge = 1;
+			tmp->left->label = leaves[0];
+			tmp->right = malloc(sizeof(struct tree_node));
+			tmp->right->left = 0;
+			tmp->right->right = 0;
+			tmp->right->edge = 2;
+			tmp->right->label = leaves[1];
+			tree = malloc(sizeof(struct tree_node));
+			tree->left =tmp;
+			tree->right = 0;
+			tree->edge = -1;
+			tree->label = -1;
+		
+			//printsimpleTree(tree);
+			//tree = simpleinsert(tree,0,3,-3);
+			//fprintf(stderr,"\n\n");
+			//printsimpleTree(tree);
+			newnode = 3;
+			for(c = 0; c < elements;c++){			
+			//	printf("%d ",milometer[c]);
+				tree = simpleinsert(tree,milometer[c],newnode,leaves[2+c]);
+				newnode+=2;
+			} 
+			fprintf(stderr,"Topology:%d	",i);
+			//printsimpleTree(tree);
+			c = add_label_simpletree(tree,nodes,0);
+			
+			readsimpletree(tree,tmp_tree);
+			freesimpletree(tree);
+			/*for (c = 1; c < tmp_tree[0];c++){
+				fprintf(stderr,"%d ",tmp_tree[c]);
+			}
+			fprintf(stderr,"\n\n");*/
+			ntree_data =ntree_sub_alignment(ntree_data,tmp_tree,local_ntree);
+			
+			//exit(0);
+			//for (c = 0;c < ntree -1;c++){
+			//	fprintf(stderr,"%d ",nodes[c]);
+			//}
+			//fprintf(stderr,"\n\n");
+			i++;
+			milometer = ticker(milometer,elements);
+		}
+	
+		free(milometer);
+		free(tmp_tree);
+	}
+	return ntree_data;
+}
+
+int add_label_simpletree(struct tree_node* p,int* nodes,int i)
+{
+	if(p->left){
+		i = add_label_simpletree(p->left,nodes,i);
+	}
+	if(p->right){
+		i = add_label_simpletree(p->right,nodes,i);
+	}
+	if(p->left){
+		if(p->right){
+			p->label = nodes[i];
+			i++;
+			return i;
+		}
+	}
+	return i;
+}
+
+int* readsimpletree(struct tree_node* p,int* tree)
+{
+	if(p->left){
+		tree = readsimpletree(p->left,tree);
+	}
+	if(p->right){
+		tree = readsimpletree(p->right,tree);
+	}
+	if(p->left){
+		if(p->right){
+			tree[tree[0]] = p->left->label;
+			tree[tree[0]+1] = p->right->label;
+			tree[tree[0]+2] = p->label;
+			tree[0] +=3;
+	//		free(p->left);
+	//		free(p->right);
+	//	}else{
+	//		free(p->left);
+		}
+	}//else{
+	//	free(p->right);
+	//}
+	return tree;
+}
+
+void printsimpleTree(struct tree_node* p)
+{
+	if(p->left){
+	printsimpleTree(p->left);
+	}
+	//fprintf(stderr,"%d\n",p->label);
+	if(p->right){
+	printsimpleTree(p->right);
+	}
+	if(p->left){
+		if(p->right){
+			fprintf(stderr,"%d %d -> %d\n",p->left->label,p->right->label,p->label);
+			free(p->left);
+			free(p->right);
+		}else{
+			free(p->left);
+		}
+	}else{
+		free(p->right);
+	}
+	
+//	fprintf(stderr,"Edge:%d	Label:%d\n",p->edge,p->label);
+}
+
+
+struct tree_node* simpleinsert(struct tree_node* p,int target, int new_edge,int leaf_label)
+{
+	struct tree_node* tmp = 0;
+	struct tree_node* tmp2 = 0;
+
+	if(p->left){
+		if(p->left->edge == target){
+			tmp = malloc(sizeof(struct tree_node));
+			tmp->left = 0;
+			tmp->right = 0;
+			tmp->label = leaf_label;
+			tmp->edge = new_edge+1;
+			
+			tmp2 = malloc(sizeof(struct tree_node));
+			tmp2->left = tmp;
+			tmp2->right = p->left;
+			tmp2->label = -1;
+			tmp2->edge = p->left->edge;
+
+			p->left->edge = new_edge;
+
+			p->left = tmp2;
+
+
+			return p;
+		}else{
+			p->left = simpleinsert(p->left,target,new_edge,leaf_label);
+		}
+	}
+
+	if(p->right){
+		if(p->right->edge == target){
+			tmp = malloc(sizeof(struct tree_node));
+			tmp->left = 0;
+			tmp->right = 0;
+			tmp->label = leaf_label;
+			tmp->edge = new_edge+1;
+			
+			tmp2 = malloc(sizeof(struct tree_node));
+			tmp2->left = tmp;
+			tmp2->right = p->right;
+			tmp2->label = -1;
+			tmp2->edge = p->right->edge;
+
+			p->right->edge = new_edge;
+
+			p->right = tmp2;
+
+
+			return p;
+		}else{
+			p->right = simpleinsert(p->right,target,new_edge,leaf_label);
+		}
+	}
+	return p;
+}
+
+
+int* ticker(int* milometer,int elements)
+{
+	while(elements){
+		if (milometer[elements-1] < (2*elements)){
+			milometer[elements-1]++;
+			return milometer;
+		}else{
+			milometer[elements-1] = 0;
+			elements--;
+		}
+	}
+	milometer[0] = -1;
+	return milometer;
+}
+
+
+
+
+int* upgma(float **dm,int* tree)
+{
+	int i,j,t;
+	int *as = 0;
+	float max;
+	int node_a = 0;
+	int node_b = 0;
+	int cnode = numseq;
+
+	as = malloc(sizeof(int)*numseq);
+	for (i = numseq; i--;){
+		as[i] = i+1;
+	}
+
+	
+	t = 0;
+	while (cnode != numprofiles){
+		max = -INFTY;
+		for (i = 0;i < numseq-1; i++){
+			if (as[i]){
+			for ( j = i + 1;j < numseq;j++){
+				if (as[j]){
+				if (dm[i][j] > max){
+					max = dm[i][j];
+					node_a = i;
+					node_b = j;
+				}
+				}
+			}
+			}
+		}
+		
+		tree[t] = as[node_a]-1;
+		tree[t+1] = as[node_b]-1;
+		tree[t+2] = cnode;
+		t += 3;	
+		
+		/*deactivate  sequences to be joined*/
+		as[node_a] = cnode+1;
+		as[node_b] = 0;
+		cnode++;    
+		
+		/*calculate new distances*/
+		for (j = numseq;j--;){
+			if (j != node_b){
+				dm[node_a][j] = (dm[node_a][j] + dm[node_b][j])/2;
+			}
+		}
+		dm[node_a][node_a] = 0.0f;
+		for (j = numseq;j--;){
+			dm[j][node_a] = dm[node_a][j];
+			dm[j][node_b] = 0.0f;
+			dm[node_b][j] = 0.0f;
+		}		
+	}
+	free(as);
+	return tree;
+}
+
+
+
+int* nj(float **dm,int* tree)
+{
+	int i,j;
+	//float **dm = 0;
+	float *r = 0;
+	float *r_div = 0;
+	int *active = 0;
+	int node = 0;
+	float min = 0;
+	int join_a = 0;
+	int join_b = 0;
+	int leaves = 0;
+	int c =0;
+
+	leaves = numseq;
+	
+	r = malloc ((numseq*2-1) *sizeof(float));
+	r_div = malloc ((numseq*2-1) *sizeof(float));
+	active = malloc((numseq*2-1)*sizeof(int));
+	for ( i = 0;i < numseq*2-1;i++){
+		active[i] = 0;
+	}
+	for ( i = 0;i < numseq;i++){
+		active[i] = 1;
+	}
+	
+	node = numseq;
+	while (node != numseq*2 -1){
+		for (i = 0;i<numseq*2-1;i++){
+			if (active[i]){
+				r[i] = 0;
+				for (j = 0;j < numseq*2-1;j++){
+					if (active[j]){
+						r[i] += (i<j) ?dm[i][j]:dm[j][i];
+					}
+				}
+				r_div[i] = r[i] / (leaves-2);
+			}
+		}
+		for ( j = 0;j < numseq*2-1;j++){
+			if (active[j]){
+			for ( i = j+1;i < numseq*2-1;i++){
+				if (active[i]){
+				dm[i][j] = dm[j][i] - (r[i] + r[j])/2;
+				}
+			}
+			}
+		}
+		min = -INFTY;
+		for ( j = 0;j < numseq*2-1;j++){
+			if (active[j]){
+			for ( i = j+1;i < numseq*2-1;i++){
+				if (active[i]){
+					if (dm[i][j] > min){
+						min = dm[i][j];
+						join_a = j;
+						join_b = i;
+					}
+				}
+			}
+			}
+		}
+		//join_a always smaller than join_b && both smaller than node
+		dm[join_a][node] =  dm[join_a][join_b]/2 + (r_div[join_a] - r_div[join_b])/2;
+		dm[join_b][node] =  dm[join_a][join_b] - dm[join_a][node];
+
+		active[join_a] = 0;
+		active[join_b] = 0;
+		tree[c] = join_a;
+		tree[c+1] = join_b;
+		tree[c+2] = node;
+
+		for (i = 0;i<numseq*2-1;i++){
+			if (active[i]){
+				dm[i][node] = (i>join_a) ? dm[join_a][i]: dm[i][join_a];
+				dm[i][node] -= dm[join_a][node];
+				dm[i][node] += (i > join_b) ? dm[join_b][i] : dm[i][join_b] ;
+				dm[i][node] -= dm[join_b][node];
+				dm[i][node] /= 2;
+			}
+		}
+		active[node] = 1;
+		c += 3;
+		node++;
+
+	}
+
+
+	for (i = numprofiles;i--;){
+		free(dm[i]);
+	}
+	free(dm);
+
+	free(r);
+	free(r_div);
+	free(active);
+
+	return tree;
+}
+
+

Added: trunk/packages/kalign/branches/upstream/current/kalign2_upgma.c
===================================================================
--- trunk/packages/kalign/branches/upstream/current/kalign2_upgma.c	2006-11-19 13:38:57 UTC (rev 159)
+++ trunk/packages/kalign/branches/upstream/current/kalign2_upgma.c	2006-11-29 14:12:29 UTC (rev 160)
@@ -0,0 +1,283 @@
+/*
+	kalign2_upgma.c
+	
+	Released under GPL - see the 'COPYING' file   
+	
+	Copyright (C) 2006 Timo Lassmann <timolassmann at gmail.com>
+	
+	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
+	any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+    
+	Please send bug reports, comments etc. to:
+	timolassmann at gmail.com
+*/
+
+#include "kalign2.h"
+
+struct aln_tree_node* real_upgma(float **dm)
+{
+	int i,j;
+	int *as = 0;
+	float max;
+	int node_a = 0;
+	int node_b = 0;
+	int cnode = numseq;
+	
+	struct aln_tree_node** tree = 0;
+	struct aln_tree_node* tmp = 0;
+	
+	as = malloc(sizeof(int)*numseq);
+	for (i = numseq; i--;){
+		as[i] = i+1;
+	}
+	
+	tree = malloc(sizeof(struct aln_tree_node*)*numseq);
+	for (i=0;i < numseq;i++){
+		tree[i] = malloc(sizeof(struct aln_tree_node));
+		tree[i]->done = 1;
+		tree[i]->num = i;
+		tree[i]->path = 0;
+		tree[i]->profile = 0;
+		tree[i]->seq = 0;//seq[i];
+		tree[i]->len = 0;//len[i]; 
+		/*
+		Needs to be +2 because:
+		at n = 3 is is possible to get a perfectly balanced binary tree with 4 sequences at intermediate nodes
+		*/
+		tree[i]->links = malloc(sizeof(struct aln_tree_node*)*3);
+		
+		for ( j =0;j < 3;j++){
+			tree[i]->links[j] = 0;
+		}
+	}
+	
+	while (cnode != numprofiles){
+		max = -INFTY;
+		for (i = 0;i < numseq-1; i++){
+			if (as[i]){
+			for ( j = i + 1;j < numseq;j++){
+				if (as[j]){
+				if (dm[i][j] > max){
+					max = dm[i][j];
+					node_a = i;
+					node_b = j;
+				}
+				}
+			}
+			}
+		}
+		tmp = malloc(sizeof(struct aln_tree_node));
+		tmp->done = 0;
+		tmp->path = 0;
+		tmp->profile = 0;
+		tmp->num = cnode;
+		tmp->seq = 0;
+		tmp->len = 0;
+		tmp->links = malloc(sizeof(struct aln_tree_node*)*(3));
+		tmp->links[0] = tree[node_a];
+		tmp->links[1] = tree[node_b];
+		tmp->links[2] =0;
+
+		tree[node_a] = tmp;
+		tree[node_b] = 0;
+				
+		/*deactivate  sequences to be joined*/
+		as[node_a] = cnode+1;
+		as[node_b] = 0;
+		cnode++;    
+		
+		/*calculate new distances*/
+		for (j = numseq;j--;){
+			if (j != node_b){
+				dm[node_a][j] = (dm[node_a][j] + dm[node_b][j])/2;
+			}
+		}
+		dm[node_a][node_a] = 0.0f;
+		for (j = numseq;j--;){
+			dm[j][node_a] = dm[node_a][j];
+			dm[j][node_b] = 0.0f;
+			dm[node_b][j] = 0.0f;
+		}		
+	}
+	tmp = tree[node_a];
+	
+	for (i = numprofiles;i--;){
+		free(dm[i]);
+	}
+	free(dm);
+	
+	
+	free(tree);
+	free(as);
+	return tmp;
+}
+
+int* nj(float **dm,int* tree)
+{
+	int i,j;
+	//float **dm = 0;
+	float *r = 0;
+	float *r_div = 0;
+	int *active = 0;
+	int node = 0;
+	float min = 0;
+	int join_a = 0;
+	int join_b = 0;
+	int leaves = 0;
+	int c =0;
+
+	leaves = numseq;
+	
+	r = malloc ((numseq*2-1) *sizeof(float));
+	r_div = malloc ((numseq*2-1) *sizeof(float));
+	active = malloc((numseq*2-1)*sizeof(int));
+	for ( i = 0;i < numseq*2-1;i++){
+		active[i] = 0;
+	}
+	for ( i = 0;i < numseq;i++){
+		active[i] = 1;
+	}
+	
+	node = numseq;
+	while (node != numseq*2 -1){
+		for (i = 0;i<numseq*2-1;i++){
+			if (active[i]){
+				r[i] = 0;
+				for (j = 0;j < numseq*2-1;j++){
+					if (active[j]){
+						r[i] += (i<j) ?dm[i][j]:dm[j][i];
+					}
+				}
+				r_div[i] = r[i] / (leaves-2);
+			}
+		}
+		for ( j = 0;j < numseq*2-1;j++){
+			if (active[j]){
+			for ( i = j+1;i < numseq*2-1;i++){
+				if (active[i]){
+				dm[i][j] = dm[j][i] - (r[i] + r[j])/2;
+				}
+			}
+			}
+		}
+		min = -INFTY;
+		for ( j = 0;j < numseq*2-1;j++){
+			if (active[j]){
+			for ( i = j+1;i < numseq*2-1;i++){
+				if (active[i]){
+					if (dm[i][j] > min){
+						min = dm[i][j];
+						join_a = j;
+						join_b = i;
+					}
+				}
+			}
+			}
+		}
+		//join_a always smaller than join_b && both smaller than node
+		dm[join_a][node] =  dm[join_a][join_b]/2 + (r_div[join_a] - r_div[join_b])/2;
+		dm[join_b][node] =  dm[join_a][join_b] - dm[join_a][node];
+
+		active[join_a] = 0;
+		active[join_b] = 0;
+		tree[c] = join_a;
+		tree[c+1] = join_b;
+		tree[c+2] = node;
+
+		for (i = 0;i<numseq*2-1;i++){
+			if (active[i]){
+				dm[i][node] = (i>join_a) ? dm[join_a][i]: dm[i][join_a];
+				dm[i][node] -= dm[join_a][node];
+				dm[i][node] += (i > join_b) ? dm[join_b][i] : dm[i][join_b] ;
+				dm[i][node] -= dm[join_b][node];
+				dm[i][node] /= 2;
+			}
+		}
+		active[node] = 1;
+		c += 3;
+		node++;
+
+	}
+
+
+	for (i = numprofiles;i--;){
+		free(dm[i]);
+	}
+	free(dm);
+
+	free(r);
+	free(r_div);
+	free(active);
+
+	return tree;
+}
+
+int* upgma(float **dm,int* tree)
+{
+	int i,j,t;
+	int *as = 0;
+	float max;
+	int node_a = 0;
+	int node_b = 0;
+	int cnode = numseq;
+
+	as = malloc(sizeof(int)*numseq);
+	for (i = numseq; i--;){
+		as[i] = i+1;
+	}
+
+	
+	t = 0;
+	while (cnode != numprofiles){
+		max = -INFTY;
+		for (i = 0;i < numseq-1; i++){
+			if (as[i]){
+			for ( j = i + 1;j < numseq;j++){
+				if (as[j]){
+				if (dm[i][j] > max){
+					max = dm[i][j];
+					node_a = i;
+					node_b = j;
+				}
+				}
+			}
+			}
+		}
+		
+		tree[t] = as[node_a]-1;
+		tree[t+1] = as[node_b]-1;
+		tree[t+2] = cnode;
+		t += 3;	
+		
+		/*deactivate  sequences to be joined*/
+		as[node_a] = cnode+1;
+		as[node_b] = 0;
+		cnode++;    
+		
+		/*calculate new distances*/
+		for (j = numseq;j--;){
+			if (j != node_b){
+				dm[node_a][j] = (dm[node_a][j] + dm[node_b][j])/2;
+			}
+		}
+		dm[node_a][node_a] = 0.0f;
+		for (j = numseq;j--;){
+			dm[j][node_a] = dm[node_a][j];
+			dm[j][node_b] = 0.0f;
+			dm[node_b][j] = 0.0f;
+		}		
+	}
+	free(as);
+	return tree;
+}




More information about the debian-med-commit mailing list