⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unpairs.c

📁 ViennaRNA-1.6.1
💻 C
字号:
#include "wmatch.h"/* Expands a blossom.  Fixes up LINK and MATE. */void UNPAIR (int oldbase, int oldmate){   int e, newbase, u;#ifdef DEBUG    printf("Unpair oldbase, oldmate=%d %d\n",oldbase, oldmate);#endif    UNLINK (oldbase);    newbase = BMATE (oldmate);    if (newbase != oldbase) {	LINK [oldbase] = -DUMMYEDGE;	REMATCH (newbase, MATE[oldbase]);	if (f == LASTEDGE[1])	    LINK[secondmate] = -LASTEDGE[2];	else LINK[secondmate] = -LASTEDGE[1];	}    e = LINK[oldmate];    u = BEND (OPPEDGE (e));    if (u == newbase) {	POINTER (newbase, oldmate, e);	return;	}    LINK[BMATE (u)] = -e;    do {	e = -LINK[u];	v = BMATE (u);	POINTER (u, v, -LINK[v]);	u = BEND (e);    } while (u != newbase);    e = OPPEDGE (e);    POINTER (newbase, oldmate, e);}/* changes the matching along an alternating path *//* firstmate is the first base vertex on the path *//* edge e is the new matched edge for firstmate   */void REMATCH (int firstmate, int e) {#ifdef DEBUG     printf("Rematch firstmate=%d e=%d-%d\n",firstmate, END[OPPEDGE(e)], END[e]);#endif    MATE[firstmate] = e;    nexte = -LINK[firstmate];    while (nexte != DUMMYEDGE) {	e = nexte;	f = OPPEDGE (e);	firstmate = BEND (e);	secondmate = BEND (f);	nexte = -LINK[firstmate];	LINK[firstmate] = -MATE[secondmate];	LINK[secondmate] = -MATE[firstmate];	MATE[firstmate] = f;	MATE[secondmate] = e;	}}/* unlinks subblossoms in a blossom.  oldbase is the base of the blossom to *//* be unlinked. */void UNLINK (int oldbase){   int k, j=1;#ifdef DEBUG    printf("Unlink oldbase=%d\n",oldbase);#endif    i = NEXTVTX[oldbase];    newbase = NEXTVTX[oldbase];    nextbase = NEXTVTX[LASTVTX[newbase]];    e = LINK[nextbase];UL2:    do {	nextedge = OPPEDGE (LINK[newbase]);	for (k=1; k <= 2; ++k) {	    LINK[newbase] = -LINK[newbase];	    BASE[i] = newbase;	    i = NEXTVTX[i];	    while (i != nextbase) {		BASE[i] = newbase;		i = NEXTVTX[i];		} 	    newbase = nextbase;	    nextbase = NEXTVTX[LASTVTX[newbase]];	    }	} while (LINK[nextbase] == nextedge);    if (j==1) {	LASTEDGE[1] = nextedge;	j++;	nextedge = OPPEDGE (e);	if (LINK[nextbase] == nextedge) {	    goto UL2;	    }	}    LASTEDGE[2] = nextedge;    if (BASE[LASTVTX[oldbase]] == oldbase) 	NEXTVTX[oldbase] = newbase;    else {	NEXTVTX[oldbase] = DUMMYVERTEX;	LASTVTX[oldbase] = oldbase;	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -