WSTester updated to work plus hopefully all the other changes that need to go into...
[jabaws.git] / binaries / src / ViennaRNA / Kinfold / cache.c
diff --git a/binaries/src/ViennaRNA/Kinfold/cache.c b/binaries/src/ViennaRNA/Kinfold/cache.c
new file mode 100644 (file)
index 0000000..d96928b
--- /dev/null
@@ -0,0 +1,133 @@
+/*
+  Last changed Time-stamp: <2006-10-03 16:31:54 xtof>
+  c  Christoph Flamm and Ivo L Hofacker
+  {xtof,ivo}@tbi.univie.ac.at
+  Kinfold: $Name:  $
+  $Id: cache.c,v 1.3 2006/10/04 12:45:12 xtof Exp $
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+#include "utils.h"
+#include "cache_util.h"
+
+/*
+  modify cache_f(), cache_comp() and the typedef of cache_entry
+  in cache_utils.h to suit your application
+*/
+
+/* PUBLIC FUNCTIONES */
+cache_entry *lookup_cache (char *x);
+int write_cache (cache_entry *x);
+/*  void delete_cache (cache_entry *x); */
+void kill_cache();
+void initialize_cache();
+
+/* PRIVATE FUNCTIONES */
+/*  static int cache_comp(cache_entry *x, cache_entry *y); */
+static unsigned cache_f (char *x);
+
+/* #define CACHESIZE 67108864 -1 */ /* 2^26 -1   must be power of 2 -1 */
+/* #define CACHESIZE 33554432 -1 */ /* 2^25 -1   must be power of 2 -1 */
+/* #define CACHESIZE 16777216 -1 */ /* 2^24 -1   must be power of 2 -1 */ 
+/* #define CACHESIZE  4194304 -1 */ /* 2^22 -1   must be power of 2 -1 */
+#define CACHESIZE  1048576 -1  /* 2^20 -1   must be power of 2 -1 */
+/* #define CACHESIZE   262144 -1 */ /* 2^18 -1   must be power of 2 -1 */
+/* next is default */
+/* #define CACHESIZE    65536 -1 */ /* 2^16 -1   must be power of 2 -1 */
+/* #define CACHESIZE    16384 -1 */ /* 2^14 -1   must be power of 2 -1 */
+/* #define CACHESIZE     4096 -1 */ /* 2^12 -1   must be power of 2 -1 */
+
+static cache_entry *cachetab[CACHESIZE+1];
+static char UNUSED rcsid[] ="$Id: cache.c,v 1.3 2006/10/04 12:45:12 xtof Exp $";
+unsigned long collisions=0;
+
+/* stolen from perl source */
+char coeff[] = {
+                61,59,53,47,43,41,37,31,29,23,17,13,11,7,3,1,
+                61,59,53,47,43,41,37,31,29,23,17,13,11,7,3,1,
+                61,59,53,47,43,41,37,31,29,23,17,13,11,7,3,1,
+                61,59,53,47,43,41,37,31,29,23,17,13,11,7,3,1,
+                61,59,53,47,43,41,37,31,29,23,17,13,11,7,3,1,
+                61,59,53,47,43,41,37,31,29,23,17,13,11,7,3,1,
+                61,59,53,47,43,41,37,31,29,23,17,13,11,7,3,1,
+                61,59,53,47,43,41,37,31,29,23,17,13,11,7,3,1};
+
+/* key must not be longer than 128 */
+#pragma inline (cache_f)
+unsigned cache_f(char *x) { 
+  register char *s;
+  register int i;
+  register unsigned cache;
+
+  s = x;
+
+  for (i=0,    cache = 0;
+       /* while */ *s;
+       s++,           i++ , cache *= 5 ) {
+    cache += *s * coeff[i];
+  }
+
+   /* divide through CACHESIZE for normalization */
+  return ((cache) & (CACHESIZE));
+}
+
+
+/* returns NULL unless x is in the cache */
+cache_entry *lookup_cache (char *x) {
+  int cacheval;
+  cache_entry *c;
+
+  cacheval=cache_f(x);
+  if ((c=cachetab[cacheval]))
+    if (strcmp(c->structure,x)==0) return c;
+  
+  return NULL;
+}
+
+/* returns 1 if x already was in the cache */
+int write_cache (cache_entry *x) {
+  int cacheval;
+  cache_entry *c;
+  
+  cacheval=cache_f(x->structure);
+  if ((c=cachetab[cacheval])) {
+    free(c->structure);
+    free(c->neighbors);
+    free(c->rates);
+    free(c->energies);
+    free(c);
+  }
+  cachetab[cacheval]=x;
+  return 0;
+}
+
+/**/
+void initialize_cache () { }
+
+/**/
+void kill_cache () {
+  int i;
+  
+  for (i=0;i<CACHESIZE+1;i++) {
+    if ( cachetab[i] ) {
+      free (cachetab[i]->structure);
+      free (cachetab[i]->neighbors);
+      free (cachetab[i]->rates);
+      free (cachetab[i]->energies);
+      free (cachetab[i]);
+    }
+    cachetab[i]=NULL;
+  }
+}
+
+#if 0
+/**/
+static int cache_comp(cache_entry *x, cache_entry *y) {
+  return strcmp(((cache_entry *)x)->structure, ((cache_entry *)y)->structure);
+}
+#endif
+
+/* End of file */