double current_obj_val(EXAMPLE *ex, SVECTOR **fycache, long m, STRUCTMODEL *sm, STRUCT_LEARN_PARM *sparm, double C, int *valid_examples) { long i, j; SVECTOR *f, *fy, *fybar, *lhs; LABEL ybar; double lossval, margin; double *new_constraint; double obj = 0.0; /* find cutting plane */ lhs = NULL; margin = 0; for (i=0;i<m;i++) { if(!valid_examples[i]) continue; find_most_violated_constraint_marginrescaling(ex[i].x, ex[i].y, &ybar, sm, sparm); /* get difference vector */ fy = copy_svector(fycache[i]); fybar = psi(ex[i].x,ybar,sm,sparm); lossval = loss(ex[i].y,ybar,sparm); /* scale difference vector */ for (f=fy;f;f=f->next) { //f->factor*=1.0/m; f->factor*=ex[i].x.example_cost/m; } for (f=fybar;f;f=f->next) { //f->factor*=-1.0/m; f->factor*=-ex[i].x.example_cost/m; } /* add ybar to constraint */ append_svector_list(fy,lhs); append_svector_list(fybar,fy); lhs = fybar; //margin+=lossval/m; margin += lossval*ex[i].x.example_cost/m; } /* compact the linear representation */ new_constraint = add_list_nn(lhs, sm->sizePsi); free_svector(lhs); obj = margin; for(i = 1; i < sm->sizePsi+1; i++) obj -= new_constraint[i]*sm->w[i]; if(obj < 0.0) obj = 0.0; obj *= C; for(i = 1; i < sm->sizePsi+1; i++) obj += 0.5*sm->w[i]*sm->w[i]; free(new_constraint); return obj; }
SVECTOR* find_cutting_plane(EXAMPLE *ex, SVECTOR **fycache, double *margin, long m, STRUCTMODEL *sm, STRUCT_LEARN_PARM *sparm, char* tmpdir, char *trainfile, double frac_sim, double Fweight, char *dataset_stats_file, double rho_admm, long isExhaustive, long isLPrelaxation, double *margin2, int datasetStartIdx, int chunkSz, int eid, int chunkid) { long i; SVECTOR *f, *fy, *fybar, *lhs; LABEL ybar; LATENT_VAR hbar; double lossval; double *new_constraint; long l,k; SVECTOR *fvec; WORD *words; LABEL *ybar_all = (LABEL*) malloc(sizeof(LABEL) * m); LATENT_VAR *hbar_all = (LATENT_VAR*) malloc (sizeof(LATENT_VAR) * m); time_t mv_start, mv_end; time(&mv_start); find_most_violated_constraint_marginrescaling_all_online(ybar_all, hbar_all, sm, sparm, m, tmpdir, trainfile, frac_sim, dataset_stats_file, rho_admm, isExhaustive, isLPrelaxation, Fweight, datasetStartIdx, chunkSz, eid, chunkid); time(&mv_end); #if (DEBUG_LEVEL==1) print_time(mv_start, mv_end, "Max violators"); #endif /* find cutting plane */ lhs = NULL; lossval = lossF1(ex, m, ybar_all, sparm, Fweight); *margin = lossval; *margin2 = 0; for (i=0;i<m;i++) { //find_most_violated_constraint_marginrescaling(ex[i].x, ex[i].y, &ybar, &hbar, sm, sparm); ybar = ybar_all[i]; hbar = hbar_all[i]; /* get difference vector */ fy = copy_svector(fycache[i]); fybar = psi(ex[i].x,ybar,hbar,sm,sparm); lossval = loss(ex[i].y,ybar,hbar,sparm); free_label(ybar); free_latent_var(hbar); /* scale difference vector */ for (f=fy;f;f=f->next) { f->factor*=1.0/m; //f->factor*=ex[i].x.example_cost/m; } for (f=fybar;f;f=f->next) { f->factor*=-1.0/m; //f->factor*=-ex[i].x.example_cost/m; } /* add ybar to constraint */ append_svector_list(fy,lhs); append_svector_list(fybar,fy); lhs = fybar; *margin2+=lossval/m; //*margin+=lossval*ex[i].x.example_cost/m; } free(ybar_all); free(hbar_all); /* compact the linear representation */ new_constraint = add_list_nn(lhs, sm->sizePsi); // printf("After this segfault ? \n");fflush(stdout); // printf("%x\n",new_constraint); free_svector(lhs); l=0; for (i=1;i<sm->sizePsi+1;i++) { if (fabs(new_constraint[i])>1E-10) l++; // non-zero } words = (WORD*)my_malloc(sizeof(WORD)*(l+1)); assert(words!=NULL); k=0; for (i=1;i<sm->sizePsi+1;i++) { if (fabs(new_constraint[i])>1E-10) { words[k].wnum = i; words[k].weight = new_constraint[i]; k++; } } words[k].wnum = 0; words[k].weight = 0.0; fvec = create_svector(words,"",1); free(words); free(new_constraint); return(fvec); }
SVECTOR* find_cutting_plane(EXAMPLE *ex, SVECTOR **fycache, double *margin, long m, STRUCTMODEL *sm, STRUCT_LEARN_PARM *sparm, int *valid_examples) { long i, j; SVECTOR *f, *fy, *fybar, *lhs; LABEL ybar; double lossval; double *new_constraint; long valid_count = 0; long l,k; SVECTOR *fvec; WORD *words; /* find cutting plane */ lhs = NULL; *margin = 0; for (i=0;i<m;i++) { if (valid_examples[i]) { valid_count++; } } for (i=0;i<m;i++) { if (!valid_examples[i]) { continue; } find_most_violated_constraint_marginrescaling(ex[i].x, ex[i].y, &ybar, sm, sparm); /* get difference vector */ fy = copy_svector(fycache[i]); fybar = psi(ex[i].x,ybar,sm,sparm); lossval = loss(ex[i].y,ybar,sparm); free_label(ybar); /* scale difference vector */ for (f=fy;f;f=f->next) { //f->factor*=1.0/m; //f->factor*=ex[i].x.example_cost/m; f->factor*=ex[i].x.example_cost/valid_count; } for (f=fybar;f;f=f->next) { //f->factor*=-1.0/m; //f->factor*=-ex[i].x.example_cost/m; f->factor*=-ex[i].x.example_cost/valid_count; } /* add ybar to constraint */ append_svector_list(fy,lhs); append_svector_list(fybar,fy); lhs = fybar; //*margin+=lossval/m; //*margin+=lossval*ex[i].x.example_cost/m; *margin+=lossval*ex[i].x.example_cost/valid_count; } /* compact the linear representation */ new_constraint = add_list_nn(lhs, sm->sizePsi); free_svector(lhs); l=0; for (i=1;i<sm->sizePsi+1;i++) { if (fabs(new_constraint[i])>1E-10) l++; // non-zero } words = (WORD*)my_malloc(sizeof(WORD)*(l+1)); assert(words!=NULL); k=0; for (i=1;i<sm->sizePsi+1;i++) { if (fabs(new_constraint[i])>1E-10) { words[k].wnum = i; words[k].weight = new_constraint[i]; k++; } } words[k].wnum = 0; words[k].weight = 0.0; fvec = create_svector(words,"",1); free(words); free(new_constraint); return(fvec); }