void test_fkvsort() { gk_idx_t i; gk_fkv_t array[N]; /* test the increasing sort */ printf("Testing fkvsorti...\n"); for (i=0; i<N; i++) { array[i].key = RandomInRange(123432)/(1.0+RandomInRange(645323)); array[i].val = i; } gk_fkvsorti(N, array); for (i=0; i<N-1; i++) { if (array[i].key > array[i+1].key) printf("gk_fkvsorti error at index %jd [%f %f] [%jd %jd]\n", (intmax_t)i, array[i].key, array[i+1].key, (intmax_t)array[i].val, (intmax_t)array[i+1].val); } /* test the decreasing sort */ printf("Testing fkvsortd...\n"); for (i=0; i<N; i++) { array[i].key = RandomInRange(123432)/(1.0+RandomInRange(645323)); array[i].val = i; } gk_fkvsortd(N, array); for (i=0; i<N-1; i++) { if (array[i].key < array[i+1].key) printf("gk_fkvsortd error at index %jd [%f %f] [%jd %jd]\n", (intmax_t)i, array[i].key, array[i+1].key, (intmax_t)array[i].val, (intmax_t)array[i+1].val); } }
int getTopSimUsers(gk_csr_t *adjMat, int user, gk_fkv_t *topUsers, int nsim) { //to store the restart distributon of vertices float *pr; int i, j, count; int iter = 0; gk_fkv_t *pRanks; pr = (float*) malloc(sizeof(float)*adjMat->nrows); //initialize the restart distribution for user pr[user] = 1.0; iter = gk_rw_PageRank(adjMat, 0.5, 0.000001, 100, pr); fprintf(stderr, "Iter: %d\n", iter); count = 0; //count the non-zero values in pr and sort them for (i = 0; i < adjMat->nrows; i++) { if (pr[i] > 0 && i != user) { count++; } } //printf("Found %d similar users.\n", count); pRanks = gk_fkvmalloc(count, "store page ranks"); for (i = 0, j = 0; i < adjMat->nrows; i++) { if (pr[i] > 0 && i != user) { pRanks[j].key = pr[i]; pRanks[j].val = i; j++; } } nsim = gk_min(nsim, count); gk_dfkvkselect(count, nsim, pRanks); gk_fkvsortd(nsim, pRanks); gk_fkvcopy(nsim, pRanks, topUsers); free(pr); free(pRanks); return nsim; }