WSTester updated to work plus hopefully all the other changes that need to go into...
[jabaws.git] / binaries / src / ViennaRNA / RNAforester / src / readgraph.c
diff --git a/binaries/src/ViennaRNA/RNAforester/src/readgraph.c b/binaries/src/ViennaRNA/RNAforester/src/readgraph.c
new file mode 100644 (file)
index 0000000..772a730
--- /dev/null
@@ -0,0 +1,129 @@
+/* set up data structures for weighted match */
+
+/* to add a new type, add new case in SetUp() and a Set_X() routine */
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "wmatch.h"
+
+void SetUp (void* gptr, int type)
+{   int i,allocsize;
+    Graph g=NULL;
+    EuclidGraph xy=NULL;
+    MatrixGraph matg=NULL;
+
+    if (type==1) {
+       g = (Graph) gptr;
+       U = Degree(g,0);
+       V = NumEdges(g);
+       }
+    else if (type==2) {
+       xy = (EuclidGraph) gptr;
+       U = xy[0][0];
+       V = U*(U-1)/2;
+       }
+    else if (type==3) {
+       matg = (MatrixGraph) gptr;
+       U = matg[0];
+       V = U*(U-1)/2;
+       }
+
+    allocsize = (U+2*V+2)*sizeof(int);
+    A      = (int *) malloc(allocsize);
+    END    = (int *) malloc(allocsize);
+    WEIGHT = (int *) malloc(allocsize);
+    for (i=0; i<U+2*V+2; i++)
+       A[i]=END[i]=WEIGHT[i]=0;
+
+    if (type == 1) SetStandard(g);
+    else if (type == 2) SetEuclid(xy);
+    else if (type == 3) SetMatrix(matg);
+}
+
+
+/* set up from Type 1 graph. */
+
+void SetStandard(Graph graph)
+{   int elabel, adj_node, i, j;
+    int u, v, currentedge;
+    Edge edge;
+
+    currentedge = U+2;
+    for (i=1; i<=U; ++i) {
+       edge = FirstEdge(graph,i);
+       for (j = 1; j <= Degree(graph,i); ++j) {
+           adj_node = EndPoint(edge);
+           if (i < adj_node) {
+               elabel = ELabel(edge)*2;
+               WEIGHT[currentedge-1] = WEIGHT[currentedge] = 2*elabel;
+               END[currentedge-1] = i;
+               END[currentedge] = adj_node;
+               if (A[i] == 0)
+                   A[i] = currentedge;
+               else {
+                   u = i;
+                   v = A[i];
+                   while (v != 0) {
+                       if (END[v] > adj_node)
+                           break;
+                       u = v;
+                       v = A[v];
+                       }
+                   A[u] = currentedge;
+                   A[currentedge] = v;
+                   }
+               u = adj_node;
+               v = A[u];
+               while (v != 0) {
+                   u = v;
+                   v = A[v];
+                   }
+               A[u] = currentedge - 1;
+               currentedge += 2;
+               }
+           edge = NextEdge(edge);
+           }
+       }
+}
+
+/* set up from Euclidean graph */
+
+void SetEuclid(EuclidGraph graph)
+{   int i,j,currentedge;
+
+    currentedge = U+2;
+
+    for (i=U; i>=1; --i) 
+       for (j = i-1; j >= 1; --j) {
+           WEIGHT[currentedge-1] = WEIGHT[currentedge]
+                   = 2*eucdist2(graph,i,j);
+           END[currentedge-1] = i;
+           END[currentedge] = j;
+           A[currentedge] = A[i];
+           A[i] = currentedge;
+           A[currentedge-1] = A[j];
+           A[j] = currentedge-1;
+           currentedge += 2;
+           }
+}
+
+void SetMatrix(MatrixGraph graph)
+{   int i,j,currentedge;
+
+    currentedge = U+2;
+
+    for (i=U; i>=1; --i) 
+       for (j = i-1; j >= 1; --j) {
+           WEIGHT[currentedge-1] = WEIGHT[currentedge]
+                   = 2*graph[j*U+i];
+           END[currentedge-1] = i;
+           END[currentedge] = j;
+           A[currentedge] = A[i];
+           A[i] = currentedge;
+           A[currentedge-1] = A[j];
+           A[j] = currentedge-1;
+           currentedge += 2;
+           }
+}
+