📄 c_quickscore.c
字号:
/* To compile, type "mex C_quickscore.c" */
#include <stdio.h>
#include "nrutil.h"
#include "nrutil.c"
#include <math.h>
#include "mex.h"
#define MAX(X,Y) (X)>(Y)?(X):(Y)
int two_to_the(int n)
{
return 1 << n;
}
void int2bin(int num, int nbits, int bits[])
{
int i, mask;
mask = 1 << (nbits-1); /* mask = 0010...0 , where the 1 is in col nbits (rightmost = col 1) */
for (i = 0; i < nbits; i++) {
bits[i] = ((num & mask) == 0) ? 0 : 1;
num <<= 1;
}
}
void quickscore(int ndiseases, int nfindings, const double *fpos, int npos, const double *fneg, int nneg,
const double *inhibit, const double *prior, const double *leak, double *prob)
{
double *Pon, *Poff, **Uon, **Uoff, **post, *pterm, *ptermOff, *ptermOn, temp, p, myp;
int *bits, nsubsets, *fmask;
int f, d, i, j, si, size_subset, sign;
Pon = dvector(0, ndiseases);
Poff = dvector(0, ndiseases);
Pon[0] = 1;
Poff[0] = 0;
for (i=1; i <= ndiseases; i++) {
Pon[i] = prior[i-1];
Poff[i] = 1-Pon[i];
}
Uon = dmatrix(0, nfindings-1, 0, ndiseases);
Uoff = dmatrix(0, nfindings-1, 0, ndiseases);
d = 0;
for (f=0; f < nfindings; f++) {
Uon[f][d] = leak[f];
Uoff[f][d] = leak[f];
}
for (f=0; f < nfindings; f++) {
for (d=1; d <= ndiseases; d++) {
Uon[f][d] = inhibit[f + nfindings*(d-1)];
Uoff[f][d] = 1;
}
}
post = dmatrix(0, ndiseases, 0, 1);
for (d = 0; d <= ndiseases; d++) {
post[d][0] = 0;
post[d][1] = 0;
}
bits = ivector(0, npos-1);
fmask = ivector(0, nfindings-1);
pterm = dvector(0, ndiseases);
ptermOff = dvector(0, ndiseases);
ptermOn = dvector(0, ndiseases);
nsubsets = two_to_the(npos);
for (si = 0; si < nsubsets; si++) {
int2bin(si, npos, bits);
for (i=0; i < nfindings; i++) fmask[i] = 0;
for (i=0; i < nneg; i++) fmask[(int)fneg[i]-1] = 1;
size_subset = 0;
for (i=0; i < npos; i++) {
if (bits[i]) {
size_subset++;
fmask[(int)fpos[i]-1] = 1;
}
}
p = 1;
for (d=0; d <= ndiseases; d++) {
temp = 1;
for (j = 0; j < nfindings; j++) {
if (fmask[j]) temp *= Uoff[j][d];
}
ptermOff[d] = temp;
temp = 1;
for (j = 0; j < nfindings; j++) {
if (fmask[j]) temp *= Uon[j][d];
}
ptermOn[d] = temp;
pterm[d] = Poff[d]*ptermOff[d] + Pon[d]*ptermOn[d];
p *= pterm[d];
}
sign = (int) pow(-1, size_subset);
for (d=0; d <= ndiseases; d++) {
myp = p / pterm[d];
post[d][0] += sign*(myp * ptermOff[d]);
post[d][1] += sign*(myp * ptermOn[d]);
}
} /* next si */
for (d=0; d <= ndiseases; d++) {
post[d][0] *= Poff[d];
post[d][1] *= Pon[d];
}
for (d=0; d <= ndiseases; d++) {
temp = post[d][0] + post[d][1];
post[d][0] /= temp;
post[d][1] /= temp;
if (d>0) { prob[d-1] = post[d][1]; }
}
free_dvector(Pon, 0, ndiseases);
free_dvector(Poff, 0, ndiseases);
free_dmatrix(Uon, 0, nfindings-1, 0, ndiseases);
free_dmatrix(Uoff, 0, nfindings-1, 0, ndiseases);
free_dmatrix(post, 0, ndiseases, 0, 1);
free_ivector(bits, 0, npos-1);
free_ivector(fmask, 0, nfindings-1);
free_dvector(pterm, 0, ndiseases);
free_dvector(ptermOff, 0, ndiseases);
free_dvector(ptermOn, 0, ndiseases);
}
void mexFunction(
int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[]
)
{
double *fpos, *fneg, *inhibit, *prior, *leak, *prob;
int npos, nneg, ndiseases, nfindings;
double *p;
/* read the input args */
fpos = mxGetPr(prhs[0]);
npos = MAX(mxGetM(prhs[0]), mxGetN(prhs[0]));
fneg = mxGetPr(prhs[1]);
nneg = MAX(mxGetM(prhs[1]), mxGetN(prhs[1]));
inhibit = mxGetPr(prhs[2]); /* inhibit(finding, disease) */
nfindings = mxGetM(prhs[2]);
ndiseases = mxGetN(prhs[2]);
prior = mxGetPr(prhs[3]);
leak = mxGetPr(prhs[4]);
/* set the output pointers */
plhs[0] = mxCreateDoubleMatrix(1, ndiseases, mxREAL);
prob = mxGetPr(plhs[0]);
quickscore(ndiseases, nfindings, fpos, npos, fneg, nneg, inhibit, prior, leak, prob);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -