18 #include <shogun/lib/external/libocas.h>
25 using namespace shogun;
27 #ifndef DOXYGEN_SHOULD_SKIP_THIS
28 struct wdocas_thread_params_output
38 struct wdocas_thread_params_add
47 #endif // DOXYGEN_SHOULD_SKIP_THIS
50 :
CMachine(), use_bias(false), bufsize(3000), C1(1), C2(1),
66 :
CMachine(), use_bias(false), bufsize(3000), C1(1), C2(1),
82 :
CMachine(), use_bias(false), bufsize(3000), C1(C), C2(C),
epsilon(1e-3),
83 degree(d), from_degree(from_d)
119 SG_ERROR(
"Features not of class string type byte\n")
137 for (int32_t i=0; i<num; i++)
151 int32_t w_dim_single_c=0;
153 for (int32_t i=0; i<
degree; i++)
159 return w_dim_single_c;
173 SG_ERROR(
"Features not of class string type byte\n")
239 SG_INFO(
"Ocas Converged after %d iterations\n"
240 "==================================\n"
241 "timing statistics:\n"
242 "output_time: %f s\n"
247 "ocas_time %f s\n\n", result.nIter, result.output_time, result.sort_time,
248 result.add_time, result.w_time, result.qp_solver_time, result.ocas_time);
250 for (int32_t i=bufsize-1; i>=0; i--)
271 uint32_t nDim = (uint32_t) o->
w_dim;
277 for(uint32_t j=0; j <nDim; j++)
279 W[j] = oldW[j]*(1-t) + t*W[j];
280 sq_norm_W += W[j]*W[j];
302 wdocas_thread_params_add* p = (wdocas_thread_params_add*) ptr;
304 int32_t start = p->start;
305 int32_t end = p->end;
308 uint32_t cut_length=p->cut_length;
309 uint32_t* new_cut=p->new_cut;
323 int32_t* val=SG_MALLOC(int32_t, cut_length);
324 for (int32_t j=start; j<end; j++)
327 memset(val,0,
sizeof(int32_t)*cut_length);
328 int32_t lim=
CMath::min(degree, string_length-j);
331 for (int32_t k=0; k<lim; k++)
337 for(uint32_t i=0; i < cut_length; i++)
339 val[i]=val[i]*alphabet_size + vec[new_cut[i]];
340 new_a[offs+val[i]]+=wd * y[new_cut[i]];
353 float64_t *new_col_H, uint32_t *new_cut, uint32_t cut_length,
354 uint32_t nSel,
void* ptr)
359 uint32_t nDim=(uint32_t) o->
w_dim;
362 memset(new_a, 0,
sizeof(
float32_t)*nDim);
375 nthreads=string_length-1;
379 for (t=0; t<nthreads; t++)
381 params_add[t].wdocas=o;
383 params_add[t].new_a=new_a;
384 params_add[t].new_cut=new_cut;
385 params_add[t].start = step*t;
386 params_add[t].end = step*(t+1);
387 params_add[t].cut_length = cut_length;
397 params_add[t].wdocas=o;
399 params_add[t].new_a=new_a;
400 params_add[t].new_cut=new_cut;
401 params_add[t].start = step*t;
403 params_add[t].cut_length = cut_length;
407 for (t=0; t<nthreads; t++)
409 if (pthread_join(threads[t], NULL) != 0)
420 for(i=0; i < cut_length; i++)
423 c_bias[nSel]+=o->
lab[new_cut[i]];
427 for(i=0; i < nSel; i++)
452 wdocas_thread_params_output* p = (wdocas_thread_params_output*) ptr;
454 int32_t start = p->start;
455 int32_t end = p->end;
458 int32_t* val = p->val;
476 for (int32_t i=start ; i<end; i++)
479 int32_t lim=
CMath::min(degree, string_length-j);
482 for (int32_t k=0; k<lim; k++)
488 for (int32_t i=start; i<end; i++)
490 val[i]=val[i]*alphabet_size + vec[i];
491 out[i]+=wd*w[offs+val[i]];
534 for (int32_t i=start; i<end; i++)
535 output[i]=y[i]*o->
bias + out[i]*y[i]/normalization_const;
547 wdocas_thread_params_output* params_output=SG_MALLOC(wdocas_thread_params_output, o->
parallel->
get_num_threads());
551 int32_t* val=SG_MALLOC(int32_t, nData);
564 for (t=0; t<nthreads; t++)
566 params_output[t].wdocas=o;
567 params_output[t].output=output;
568 params_output[t].out=out;
569 params_output[t].val=val;
570 params_output[t].start = step*t;
571 params_output[t].end = step*(t+1);
582 params_output[t].wdocas=o;
583 params_output[t].output=output;
584 params_output[t].out=out;
585 params_output[t].val=val;
586 params_output[t].start = step*t;
587 params_output[t].end = nData;
591 for (t=0; t<nthreads; t++)
593 if (pthread_join(threads[t], NULL) != 0)
597 SG_FREE(params_output);
617 uint32_t nDim= (uint32_t) o->
w_dim;
627 for (uint32_t i=0; i<nSel; i++)
632 bias += c_bias[i]*alpha[i];