Mac binaries
[jabaws.git] / website / archive / binaries / mac / src / disembl / disembl.c
diff --git a/website/archive/binaries/mac/src/disembl/disembl.c b/website/archive/binaries/mac/src/disembl/disembl.c
new file mode 100644 (file)
index 0000000..1771ea6
--- /dev/null
@@ -0,0 +1,197 @@
+/********************************************************/
+/*  ____  _     _____ __  __ ____  _       _   _____    */
+/* |  _ \(_)___| ____|  \/  | __ )| |     / | |___ /    */
+/* | | | | / __|  _| | |\/| |  _ \| |     | |   |_ \    */
+/* | |_| | \__ \ |___| |  | | |_) | |___  | |_ ___) |   */
+/* |____/|_|___/_____|_|  |_|____/|_____| |_(_)____/    */
+/* DisEMBL is Copyright (C) 2003                        */
+/* Lars Juhl Jensen & Rune Linding - EMBL               */
+/* Licensed under GPL                                   */
+/********************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Define size of the alphabet */
+#define na 21
+
+/* Define max number of neurons */
+#define mw 41
+#define mh 30
+
+#include "russel.h"
+#include "bfactor.h"
+#include "missing.h"
+
+float sigmoid[256] = {
+  0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000,
+  0.000000, 0.000000, 0.000000, 0.000000, 0.000001, 0.000001, 0.000001, 0.000001,
+  0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000002, 0.000002, 0.000002,
+  0.000002, 0.000003, 0.000003, 0.000003, 0.000004, 0.000004, 0.000005, 0.000005,
+  0.000006, 0.000007, 0.000008, 0.000009, 0.000010, 0.000011, 0.000013, 0.000015,
+  0.000017, 0.000019, 0.000021, 0.000024, 0.000028, 0.000031, 0.000035, 0.000040,
+  0.000045, 0.000051, 0.000058, 0.000066, 0.000075, 0.000085, 0.000096, 0.000109,
+  0.000123, 0.000140, 0.000158, 0.000180, 0.000203, 0.000231, 0.000261, 0.000296,
+  0.000335, 0.000380, 0.000431, 0.000488, 0.000553, 0.000626, 0.000710, 0.000804,
+  0.000911, 0.001032, 0.001170, 0.001325, 0.001501, 0.001701, 0.001927, 0.002183,
+  0.002473, 0.002801, 0.003173, 0.003594, 0.004070, 0.004610, 0.005220, 0.005911,
+  0.006693, 0.007577, 0.008577, 0.009708, 0.010987, 0.012432, 0.014064, 0.015906,
+  0.017986, 0.020332, 0.022977, 0.025957, 0.029312, 0.033086, 0.037327, 0.042088,
+  0.047426, 0.053403, 0.060087, 0.067547, 0.075858, 0.085099, 0.095349, 0.106691,
+  0.119203, 0.132964, 0.148047, 0.164516, 0.182426, 0.201813, 0.222700, 0.245085,
+  0.268941, 0.294215, 0.320821, 0.348645, 0.377541, 0.407333, 0.437823, 0.468791,
+  0.500000, 0.531209, 0.562177, 0.592667, 0.622459, 0.651355, 0.679179, 0.705785,
+  0.731059, 0.754915, 0.777300, 0.798187, 0.817574, 0.835484, 0.851953, 0.867036,
+  0.880797, 0.893309, 0.904651, 0.914901, 0.924142, 0.932453, 0.939913, 0.946597,
+  0.952574, 0.957912, 0.962673, 0.966914, 0.970688, 0.974043, 0.977023, 0.979668,
+  0.982014, 0.984094, 0.985936, 0.987568, 0.989013, 0.990292, 0.991423, 0.992423,
+  0.993307, 0.994089, 0.994780, 0.995390, 0.995930, 0.996406, 0.996827, 0.997199,
+  0.997527, 0.997817, 0.998073, 0.998299, 0.998499, 0.998675, 0.998830, 0.998968,
+  0.999089, 0.999196, 0.999290, 0.999374, 0.999447, 0.999512, 0.999569, 0.999620,
+  0.999665, 0.999704, 0.999739, 0.999769, 0.999797, 0.999820, 0.999842, 0.999860,
+  0.999877, 0.999891, 0.999904, 0.999915, 0.999925, 0.999934, 0.999942, 0.999949,
+  0.999955, 0.999960, 0.999965, 0.999969, 0.999972, 0.999976, 0.999979, 0.999981,
+  0.999983, 0.999985, 0.999987, 0.999989, 0.999990, 0.999991, 0.999992, 0.999993,
+  0.999994, 0.999995, 0.999995, 0.999996, 0.999996, 0.999997, 0.999997, 0.999997,
+  0.999998, 0.999998, 0.999998, 0.999998, 0.999999, 0.999999, 0.999999, 0.999999,
+  0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 1.000000, 1.000000, 1.000000,
+  1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000
+};
+
+
+
+
+/*
+ *  Perform feed forward evaluation of a neural network on a sequence window.
+ */
+
+float feed_forward(int const *s, float const w[], int nw, int nh) {
+
+  float h[mh], o[2], x;
+  int i, j;
+
+  /* Shift input window to match network window size */
+  s += (mw-nw)/2;
+
+  /* Feed input values to hidden layer making use of sparse encoding */
+  for (i = 0; i < nh; ++i) {
+    x = w[(na*nw+1)*(i+1)-1];
+    for (j = 0; j < nw; ++j) {
+      x += w[(na*nw+1)*i+na*j+s[j]];
+    }
+    if (x <= -16) {
+      h[i] = 0;
+    } else if (x >= 16) {
+      h[i] = 1;
+    } else {
+      h[i] = sigmoid[(int)(8*x+128)];
+    }
+  }
+
+  /* Feed hidden layer values to output layer */
+  for (i = 0; i <= 1; ++i) {
+    x = w[(na*nw+1)*nh+(nh+1)*(i+1)-1];
+    for (j = 0; j < nh; ++j) {
+      x += w[(na*nw+1)*nh+(nh+1)*i+j]*h[j];
+    }
+    if (x <= -16) {
+      o[i] = 0;
+    } else if (x >= 16) {
+      o[i] = 1;
+    } else {
+      o[i] = sigmoid[(int)(8*x+128)];
+    }
+  }
+
+  /* Combine the scores from the two output neurons */
+  return((o[0]+1-o[1])/2);
+
+}
+
+
+
+
+/*
+ *  Calculate and print scores for a sequence window.
+ */
+
+void predict(int const *s) {
+
+  float sm, sb, sr;
+
+  if (s[(mw-1)/2] == na-1) {
+    return;
+  }
+
+  sr = 0;
+  sr += feed_forward(s, r19_1, 19, 30);
+  sr += feed_forward(s, r19_2, 19, 30);
+  sr += feed_forward(s, r19_3, 19, 30);
+  sr += feed_forward(s, r19_4, 19, 30);
+  sr += feed_forward(s, r19_5, 19, 30);
+  sr /= 5;
+  sr = 0.07387214+0.8020778*sr;
+
+  sb = 0;
+  sb += feed_forward(s, b41_1, 41, 5);
+  sb += feed_forward(s, b41_2, 41, 5);
+  sb += feed_forward(s, b41_3, 41, 5);
+  sb += feed_forward(s, b41_4, 41, 5);
+  sb += feed_forward(s, b41_5, 41, 5);
+  sb /= 5;
+  sb = 0.08016882+0.6282424*sb;
+
+  sm = 0;
+  sm += feed_forward(s, m9_1, 9, 30);
+  sm += feed_forward(s, m9_2, 9, 30);
+  sm += feed_forward(s, m9_3, 9, 30);
+  sm += feed_forward(s, m9_4, 9, 30);
+  sm += feed_forward(s, m9_5, 9, 30);
+  sm += feed_forward(s, m21_1, 21, 30);
+  sm += feed_forward(s, m21_2, 21, 30);
+  sm += feed_forward(s, m21_3, 21, 30);
+  sm += feed_forward(s, m21_4, 21, 30);
+  sm += feed_forward(s, m21_5, 21, 30);
+  sm /= 10;
+
+  printf("%f\t%f\t%f\n", sr, sr*sb, sm);
+
+}
+
+int main(int ARGC, char *ARGV[]) {
+
+  char *alphabet = strdup("FIVWMLCHYAGNRTPDEQSK");
+
+  char *p;
+  int c, i, j, s[mw];
+
+  for (i = 0; i < mw; ++i) {
+    s[i] = na-1;
+  }
+
+  while (!feof(stdin)) {
+
+    c = fgetc(stdin);
+    p = strchr(alphabet, c);
+    if (p != NULL) {
+      for (i = 1; i < mw; ++i) {
+        s[mw-i] = s[mw-i-1];
+      }
+      s[0] = p-alphabet;
+      predict(s);
+    } else if ((char)c == '\n') {
+      for (i = 0; i < (mw-1)/2; i++) {
+        for (j = 1; j < mw; ++j) {
+          s[mw-j] = s[mw-j-1];
+        }
+        s[0] = na-1;
+        predict(s);
+      }
+    }
+
+  }
+
+  return(0);
+
+}