int CMulticlassOCAS::msvm_full_add_new_cut(float64_t *new_col_H, uint32_t *new_cut, uint32_t nSel, void* user_data) { float64_t* full_A = ((mocas_data*)user_data)->full_A; float64_t* new_a = ((mocas_data*)user_data)->new_a; float64_t* data_y = ((mocas_data*)user_data)->data_y; uint32_t nY = ((mocas_data*)user_data)->nY; uint32_t nDim = ((mocas_data*)user_data)->nDim; uint32_t nData = ((mocas_data*)user_data)->nData; CDotFeatures* features = ((mocas_data*)user_data)->features; float64_t sq_norm_a; uint32_t i, j, y, y2; memset(new_a, 0, sizeof(float64_t)*nDim*nY); for(i=0; i < nData; i++) { y = (uint32_t)(data_y[i]); y2 = (uint32_t)new_cut[i]; if(y2 != y) { features->add_to_dense_vec(1.0,i,&new_a[nDim*y],nDim); features->add_to_dense_vec(-1.0,i,&new_a[nDim*y2],nDim); } } // compute new_a'*new_a and insert new_a to the last column of full_A sq_norm_a = CMath::dot(new_a,new_a,nDim*nY); for(j=0; j < nDim*nY; j++ ) full_A[LIBOCAS_INDEX(j,nSel,nDim*nY)] = new_a[j]; new_col_H[nSel] = sq_norm_a; for(i=0; i < nSel; i++) { float64_t tmp = 0; for(j=0; j < nDim*nY; j++ ) tmp += new_a[j]*full_A[LIBOCAS_INDEX(j,i,nDim*nY)]; new_col_H[i] = tmp; } return 0; }
/*---------------------------------------------------------------------------------- sparse_add_new_cut( new_col_H, new_cut, cut_length, nSel ) does the following: new_a = sum(data_X(:,find(new_cut ~=0 )),2); new_col_H = [sparse_A(:,1:nSel)'*new_a ; new_a'*new_a]; sparse_A(:,nSel+1) = new_a; ---------------------------------------------------------------------------------*/ int CSVMOcas::add_new_cut( float64_t *new_col_H, uint32_t *new_cut, uint32_t cut_length, uint32_t nSel, void* ptr) { CSVMOcas* o = (CSVMOcas*) ptr; CDotFeatures* f = o->features; uint32_t nDim=(uint32_t) o->w_dim; float64_t* y = o->lab.vector; float64_t** c_val = o->cp_value; uint32_t** c_idx = o->cp_index; uint32_t* c_nzd = o->cp_nz_dims; float64_t* c_bias = o->cp_bias; float64_t sq_norm_a; uint32_t i, j, nz_dims; /* temporary vector */ float64_t* new_a = o->tmp_a_buf; memset(new_a, 0, sizeof(float64_t)*nDim); for(i=0; i < cut_length; i++) { f->add_to_dense_vec(y[new_cut[i]], new_cut[i], new_a, nDim); if (o->use_bias) c_bias[nSel]+=y[new_cut[i]]; } /* compute new_a'*new_a and count number of non-zerou dimensions */ nz_dims = 0; sq_norm_a = CMath::sq(c_bias[nSel]); for(j=0; j < nDim; j++ ) { if(new_a[j] != 0) { nz_dims++; sq_norm_a += new_a[j]*new_a[j]; } } /* sparsify new_a and insert it to the last column of sparse_A */ c_nzd[nSel] = nz_dims; c_idx[nSel]=NULL; c_val[nSel]=NULL; if(nz_dims > 0) { c_idx[nSel]=SG_MALLOC(uint32_t, nz_dims); c_val[nSel]=SG_MALLOC(float64_t, nz_dims); uint32_t idx=0; for(j=0; j < nDim; j++ ) { if(new_a[j] != 0) { c_idx[nSel][idx] = j; c_val[nSel][idx++] = new_a[j]; } } } new_col_H[nSel] = sq_norm_a; for(i=0; i < nSel; i++) { float64_t tmp = c_bias[nSel]*c_bias[i]; for(j=0; j < c_nzd[i]; j++) tmp += new_a[c_idx[i][j]]*c_val[i][j]; new_col_H[i] = tmp; } //CMath::display_vector(new_col_H, nSel+1, "new_col_H"); //CMath::display_vector((int32_t*) c_idx[nSel], (int32_t) nz_dims, "c_idx"); //CMath::display_vector((float64_t*) c_val[nSel], nz_dims, "c_val"); return 0; }