/* unconditional mutual information, to be used in C code. */ double c_mi(int *xx, int *llx, int *yy, int *lly, int *num) { int i = 0, j = 0, k = 0; int **n = NULL, *ni = NULL, *nj = NULL; double res = 0; /* initialize the contingency table and the marginal frequencies. */ n = alloc2dcont(*llx, *lly); ni = alloc1dcont(*llx); nj = alloc1dcont(*lly); /* compute the joint frequency of x and y. */ for (k = 0; k < *num; k++) { n[xx[k] - 1][yy[k] - 1]++; }/*FOR*/ /* compute the marginals. */ for (i = 0; i < *llx; i++) for (j = 0; j < *lly; j++) { ni[i] += n[i][j]; nj[j] += n[i][j]; }/*FOR*/ /* compute the mutual information from the joint and marginal frequencies. */ for (i = 0; i < *llx; i++) for (j = 0; j < *lly; j++) res += MI_PART(n[i][j], ni[i], nj[j], *num); return (res)/(*num); }/*C_MI*/
/* compute the mutual information from the joint and marginal frequencies. */ static double _mi(int *n, int *nrowt, int *ncolt, int *nrows, int *ncols, int *length) { int i = 0, j = 0; double res = 0; for (i = 0; i < *nrows; i++) for (j = 0; j < *ncols; j++) res += MI_PART(n[CMC(i, j, *nrows)], nrowt[i], ncolt[j], *length); return res; }/*_MI*/
/* compute the mutual information from the joint and marginal frequencies. */ double mi_kernel(int **n, int *nrowt, int *ncolt, int nrows, int ncols, int length) { int i = 0, j = 0; double res = 0; for (i = 0; i < nrows; i++) for (j = 0; j < ncols; j++) res += MI_PART(n[i][j], nrowt[i], ncolt[j], length); return res; }/*MI_KERNEL*/
/* compute the conditional mutual information from the joint and marginal frequencies. */ static double _cmi(int **n, int **nrowt, int **ncolt, int *ncond, int *nr, int *nc, int *nl) { int i = 0, j = 0, k = 0; double res = 0; for (k = 0; k < *nl; k++) for (j = 0; j < *nc; j++) for (i = 0; i < *nr; i++) res += MI_PART(n[k][CMC(i, j, *nr)], nrowt[k][i], ncolt[k][j], ncond[k]); return res; }/*_CMI*/
/* compute the conditional mutual information from the joint and marginal * frequencies. */ double cmi_kernel(int ***n, int **nrowt, int **ncolt, int *ncond, int nr, int nc, int nl) { int i = 0, j = 0, k = 0; double res = 0; for (k = 0; k < nl; k++) for (j = 0; j < nc; j++) for (i = 0; i < nr; i++) res += MI_PART(n[k][i][j], nrowt[k][i], ncolt[k][j], ncond[k]); return res; }/*CMI_KERNEL*/
/* conditional mutual information, to be used in C code. */ double c_cmi(int *xx, int *llx, int *yy, int *lly, int *zz, int *llz, int *num) { int i = 0, j = 0, k = 0; int ***n = NULL, **ni = NULL, **nj = NULL, *nk = NULL; double res = 0; /* initialize the contingency table and the marginal frequencies. */ n = alloc3dcont(*llx, *lly, *llz); ni = alloc2dcont(*llx, *llz); nj = alloc2dcont(*lly, *llz); nk = alloc1dcont(*llz); /* compute the joint frequency of x, y, and z. */ for (k = 0; k < *num; k++) { n[xx[k] - 1][yy[k] - 1][zz[k] - 1]++; }/*FOR*/ /* compute the marginals. */ for (i = 0; i < *llx; i++) for (j = 0; j < *lly; j++) for (k = 0; k < *llz; k++) { ni[i][k] += n[i][j][k]; nj[j][k] += n[i][j][k]; nk[k] += n[i][j][k]; }/*FOR*/ /* compute the conditional mutual information from the joint and marginal frequencies. */ for (i = 0; i < *llx; i++) for (j = 0; j < *lly; j++) for (k = 0; k < *llz; k++) res += MI_PART(n[i][j][k], ni[i][k], nj[j][k], nk[k]); res = res/(*num); return res; }/*C_CMI*/