00001
00011 #include <GKlib.h>
00012
00013
00014
00028
00029 int gk_rw_PageRank(gk_csr_t *mat, float lamda, float eps, int max_niter, float *pr)
00030 {
00031 ssize_t i, j, k, iter, nrows;
00032 double *rscale, *prold, *prnew, *prtmp;
00033 double fromsinks, error;
00034 ssize_t *rowptr;
00035 int *rowind;
00036 float *rowval;
00037
00038 nrows = mat->nrows;
00039 rowptr = mat->rowptr;
00040 rowind = mat->rowind;
00041 rowval = mat->rowval;
00042
00043 prold = gk_dsmalloc(nrows, 0, "gk_rw_PageRank: prnew");
00044 prnew = gk_dsmalloc(nrows, 0, "gk_rw_PageRank: prold");
00045 rscale = gk_dsmalloc(nrows, 0, "gk_rw_PageRank: rscale");
00046
00047
00048
00049 for (i=0; i<nrows; i++) {
00050 for (j=rowptr[i]; j<rowptr[i+1]; j++)
00051 rscale[i] += rowval[j];
00052 if (rscale[i] > 0)
00053 rscale[i] = 1.0/rscale[i];
00054 }
00055
00056
00057 for (i=0; i<nrows; i++)
00058 prnew[i] = pr[i];
00059
00060
00061 for (iter=0; iter<max_niter; iter++) {
00062 gk_SWAP(prnew, prold, prtmp);
00063 gk_dset(nrows, 0.0, prnew);
00064
00065
00066
00067
00068 for (fromsinks=0.0, i=0; i<nrows; i++) {
00069 if (rscale[i] == 0)
00070 fromsinks += prold[i];
00071 }
00072
00073
00074 for (i=0; i<nrows; i++) {
00075 for (j=rowptr[i]; j<rowptr[i+1]; j++)
00076 prnew[rowind[j]] += prold[i]*rscale[i]*rowval[j];
00077 }
00078
00079
00080 for (i=0; i<nrows; i++) {
00081 prnew[i] = lamda*(fromsinks*pr[i]+prnew[i]) + (1.0-lamda)*pr[i];
00082 }
00083
00084
00085 for (error=0.0, i=0; i<nrows; i++)
00086 error = (fabs(prnew[i]-prold[i]) > error ? fabs(prnew[i]-prold[i]) : error);
00087
00088
00089
00090 if (error < eps)
00091 break;
00092 }
00093
00094
00095 for (i=0; i<nrows; i++)
00096 pr[i] = prnew[i];
00097
00098 gk_free((void **)&prnew, &prold, &rscale, LTERM);
00099
00100 return (int)(iter+1);
00101
00102 }
00103