28 using namespace shogun;
30 #ifndef DOXYGEN_SHOULD_SKIP_THIS
31 struct KLTSA_THREAD_PARAM
46 const int32_t* neighborhood_matrix;
59 PTHREAD_LOCK_T* W_matrix_lock;
80 return "KernelLocalTangentSpaceAlignment";
92 pthread_t* threads =
SG_MALLOC(pthread_t, num_threads);
93 KLTSA_THREAD_PARAM* parameters =
SG_MALLOC(KLTSA_THREAD_PARAM, num_threads);
95 int32_t num_threads = 1;
105 PTHREAD_LOCK_T W_matrix_lock;
107 PTHREAD_LOCK_INIT(&W_matrix_lock);
108 pthread_attr_init(&attr);
109 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
111 for (t=0; t<num_threads; t++)
114 kernel_matrix.
matrix,local_gram_matrix+(m_k*
m_k)*t,ev_vector+m_k*t,
115 G_matrix+(m_k*(1+m_target_dim))*t,W_matrix,&W_matrix_lock};
116 parameters[t] = params;
117 pthread_create(&threads[t], &attr,
run_kltsa_thread, (
void*)¶meters[t]);
119 for (t=0; t<num_threads; t++)
120 pthread_join(threads[t], NULL);
121 PTHREAD_LOCK_DESTROY(&W_matrix_lock);
126 kernel_matrix.
matrix,local_gram_matrix,ev_vector,
136 for (int32_t i=0; i<N; i++)
138 for (int32_t j=0; j<
m_k; j++)
139 W_matrix[N*neighborhood_matrix[i*m_k+j]+neighborhood_matrix[i*m_k+j]] += 1.0;
147 KLTSA_THREAD_PARAM* parameters = (KLTSA_THREAD_PARAM*)p;
148 int32_t idx_start = parameters->idx_start;
149 int32_t idx_step = parameters->idx_step;
150 int32_t idx_stop = parameters->idx_stop;
151 int32_t
m_k = parameters->m_k;
152 int32_t target_dim = parameters->target_dim;
153 int32_t N = parameters->N;
154 const int32_t* neighborhood_matrix = parameters->neighborhood_matrix;
155 const float64_t* kernel_matrix = parameters->kernel_matrix;
156 float64_t* ev_vector = parameters->ev_vector;
157 float64_t* G_matrix = parameters->G_matrix;
158 float64_t* local_gram_matrix = parameters->local_gram_matrix;
159 float64_t* W_matrix = parameters->W_matrix;
161 PTHREAD_LOCK_T* W_matrix_lock = parameters->W_matrix_lock;
166 for (j=0; j<
m_k; j++)
169 for (i=idx_start; i<idx_stop; i+=idx_step)
171 for (j=0; j<
m_k; j++)
173 for (k=0; k<
m_k; k++)
174 local_gram_matrix[j*m_k+k] = kernel_matrix[neighborhood_matrix[i*m_k+j]*N+neighborhood_matrix[i*m_k+k]];
180 wrap_dsyevr(
'V',
'U',m_k,local_gram_matrix,m_k,m_k-target_dim+1,m_k,ev_vector,G_matrix+m_k,&info);
183 cblas_dgemm(CblasColMajor,CblasNoTrans,CblasTrans,
184 m_k,m_k,1+target_dim,
187 0.0,local_gram_matrix,m_k);
190 PTHREAD_LOCK(W_matrix_lock);
192 for (j=0; j<
m_k; j++)
194 for (k=0; k<
m_k; k++)
195 W_matrix[N*neighborhood_matrix[i*m_k+k]+neighborhood_matrix[i*m_k+j]] -= local_gram_matrix[j*m_k+k];
198 PTHREAD_UNLOCK(W_matrix_lock);