[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