28 printf(
"model->nrows = %d, model->ncols = %d\n", model->nrows, model->ncols);
30 model->ncols = model->nrows;
31 gk_csr_CreateIndex(model, GK_CSR_COL);
33 double * eval =
slim_test(ctrl, model, train, test);
36 for (
int j = 0; j < ctrl->
nratings; j ++)
37 printf(
"For rating value %3d HR = %.5f ARHR = %.5f cumulative HR = %.5f ARHR = %.5f\n",
38 j+1, eval[j*4], eval[j*4+1], eval[j*4+2], eval[j*4+3]);
42 gk_free((
void **)&eval, LTERM);
61 gk_csr_t * train, gk_csr_t * test){
72 double * eval = gk_malloc(
sizeof(
double)*(ctrl->
nratings)*4,
"malloc eval");
76 int * nr = gk_malloc(
sizeof(
int)*ctrl->
nratings,
"malloc nr");
79 int ncols = gk_max(train->ncols, model->ncols);
80 int * nc = gk_malloc(
sizeof(
int)*ncols,
"malloc nc");
81 gk_iset(ncols, 0, nc);
82 int * nhc = gk_malloc(
sizeof(
int)*ncols,
"malloc nhc");
83 gk_iset(ncols, 0, nhc);
91 pfile = gk_fopen(ctrl->
pred_file,
"w",
"pred file");
92 printf(
"Output predictions to %s file...\n", ctrl->
pred_file);
96 for (
int u = 0; u < nu; u ++){
101 printf(
"."); fflush(stdout);
106 if (test->rowptr[u+1] - test->rowptr[u] == 0) {
108 fprintf(pfile,
"\n");
115 gk_dkv_t * rcmd = NULL;
120 for (
int kk = test->rowptr[u]; kk < test->rowptr[u+1]; kk ++){
122 int r = (int)(test->rowval[kk]);
125 nc[test->rowind[kk]] ++;
130 for (
int jj = 0; jj < nrcmd; jj ++){
134 fprintf(pfile,
"%d %.5f ", (
int)rcmd[jj].val+1, rcmd[jj].key);
137 for (
int kk = test->rowptr[u]; kk < test->rowptr[u+1]; kk ++){
139 int r = (int)(test->rowval[kk]);
143 if (rcmd[jj].val == test->rowind[kk]){
145 nhc[test->rowind[kk]] ++;
148 nhits ++; arh += 1.0/(double)(jj + 1) ;
150 eval[(r - 1)*4 + 0] += 1.0;
151 eval[(r - 1)*4 + 1] += 1.0/(
double)(jj + 1) ;
152 eval[(r - 1)*4 + 2] = eval[(r - 1)*4 + 0];
153 eval[(r - 1)*4 + 3] = eval[(r - 1)*4 + 1];
162 fprintf(pfile,
"\n");
166 gk_free((
void **)&rcmd, LTERM);
177 for (
int i = 0; i < ctrl->
nratings; i ++){
179 eval[i*4 + 0] /= (double)nr[i];
180 eval[i*4 + 1] /= (double)nr[i];
184 for (
int i = ctrl->
nratings - 2; i >= 0; i --){
186 eval[i*4 + 2] += eval[(i+1)*4 + 2];
187 eval[i*4 + 3] += eval[(i+1)*4 + 3];
189 for (
int i = 0; i < ctrl->
nratings; i ++){
191 eval[i*4 + 2] /= (double)nr[i];
192 eval[i*4 + 3] /= (double)nr[i];
200 gk_free((
void **)&nc, LTERM);
201 gk_free((
void **)&nhc, LTERM);
202 gk_free((
void **)&nr, LTERM);
203 gk_free((
void **)&timer, LTERM);
204 gk_free((
void **)&iidx, LTERM);
229 gk_csr_t * train,
int u, gk_dkv_t ** rcmd){
232 if (model->colptr == NULL)
233 gk_csr_CreateIndex(model, GK_CSR_COL);
235 int ni = train->ncols;
238 *iidx = gk_malloc(
sizeof(
int)*ni,
"malloc *iidx");
240 gk_iset(ni, -1, *iidx);
242 int nuitrn = train->rowptr[u+1] - train->rowptr[u];
249 for (
int ii = 0; ii < nuitrn; ii ++)
250 *(*iidx + *(train->rowptr[u] + ii + train->rowind)) -= 1;
253 gk_dkv_t * ccandb = gk_malloc(
sizeof(gk_dkv_t)*ni,
"malloc ccandb");
257 nuitrn = train->rowptr[u+1] - train->rowptr[u];
258 for (
int i = 0; i < nuitrn; i ++){
259 int ii = *(train->rowptr[u] + i + train->rowind);
260 for (
int j = 0; j < model->colptr[ii+1] - model->colptr[ii]; j ++){
261 int jj = *(model->colptr[ii] + j + model->colind);
262 if ((*iidx)[jj] < -1)
continue;
263 if ((*iidx)[jj] == -1){
265 ccandb[nrcmd].key = *(model->colptr[ii] + j + model->colval) * 1.0;
266 ccandb[nrcmd].val = jj;
269 ccandb[(*iidx)[jj]].key += *(model->colptr[ii] + j + model->colval) * 1.0;
275 gk_dkvsortd(nrcmd, ccandb);
276 int nrcmd2 = gk_min(nrcmd, ctrl->
topn);