32 #ifdef USE_SHORTREAL_KERNELCACHE
118 #ifndef DOXYGEN_SHOULD_SKIP_THIS
120 template <
class T>
struct K_THREAD_PARAM
222 SG_ERROR(
"Index out of Range: idx_a=%d/%d idx_b=%d/%d\n",
235 return get_kernel_matrix<float64_t>();
248 for (int32_t i=0; i!=
num_rhs; i++)
264 for (int32_t j=0; j!=
num_lhs; j++)
280 SG_ERROR(
"no features assigned to kernel\n");
285 int64_t total_num = int64_t(m)*n;
288 bool symmetric= (
lhs &&
lhs==
rhs && m==n);
290 SG_DEBUG(
"returning kernel matrix of size %dx%d\n", m, n);
297 K_THREAD_PARAM<T> params;
299 params.result=result;
302 params.total_start=0;
303 params.total_end=total_num;
306 params.symmetric=symmetric;
308 get_kernel_matrix_helper<T>((
void*) ¶ms);
312 pthread_t* threads =
SG_MALLOC(pthread_t, num_threads-1);
313 K_THREAD_PARAM<T>* params =
SG_MALLOC(K_THREAD_PARAM<T>, num_threads);
314 int64_t step= total_num/num_threads;
319 for (t=0; t<num_threads; t++)
321 params[t].kernel =
this;
322 params[t].result = result;
325 params[t].total_start=t*step;
326 params[t].total_end=(t+1)*step;
329 params[t].symmetric=symmetric;
330 params[t].verbose=
false;
332 int code=pthread_create(&threads[t], NULL,
333 CKernel::get_kernel_matrix_helper<T>, (
void*)¶ms[t]);
337 SG_WARNING(
"Thread creation failed (thread %d of %d) "
338 "with error:'%s'\n",t, num_threads, strerror(code));
344 params[t].kernel =
this;
345 params[t].result = result;
348 params[t].total_start=t*step;
349 params[t].total_end=total_num;
352 params[t].symmetric=symmetric;
353 params[t].verbose=
true;
354 get_kernel_matrix_helper<T>(¶ms[t]);
356 for (t=0; t<num_threads; t++)
358 if (pthread_join(threads[t], NULL) != 0)
359 SG_WARNING(
"pthread_join of thread %d/%d failed\n", t, num_threads);
569 int32_t count, int32_t *IDX,
float64_t *weights);
600 int32_t num_vec, int32_t* vec_idx,
float64_t* target,
601 int32_t num_suppvec, int32_t* IDX,
float64_t* alphas,
628 int32_t vector_idx,
float64_t * subkernel_contrib);
693 i_start=(int32_t) (offs/int64_t(n));
705 K_THREAD_PARAM<T>* params= (K_THREAD_PARAM<T>*) p;
706 int32_t i_start=params->start;
707 int32_t i_end=params->end;
709 T* result=params->result;
710 bool symmetric=params->symmetric;
713 bool verbose=params->verbose;
714 int64_t total_start=params->total_start;
715 int64_t total_end=params->total_end;
716 int64_t total=total_start;
718 for (int32_t i=i_start; i<i_end; i++)
725 for (int32_t j=j_start; j<n; j++)
730 if (symmetric && i!=j)
737 if (symmetric && i!=j)
741 k->SG_PROGRESS(total, total_start, total_end);