27 using namespace shogun;
29 #ifndef DOXYGEN_SHOULD_SKIP_THIS
30 struct KLTSA_THREAD_PARAM
45 const int32_t* neighborhood_matrix;
57 PTHREAD_LOCK_T* W_matrix_lock;
79 return "KernelLocalTangentSpaceAlignment";
91 pthread_t* threads =
SG_MALLOC(pthread_t, num_threads);
92 KLTSA_THREAD_PARAM* parameters =
SG_MALLOC(KLTSA_THREAD_PARAM, num_threads);
94 int32_t num_threads = 1;
104 PTHREAD_LOCK_T W_matrix_lock;
106 PTHREAD_LOCK_INIT(&W_matrix_lock);
107 pthread_attr_init(&attr);
108 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
110 for (t=0; t<num_threads; t++)
113 kernel_matrix.
matrix,local_gram_matrix+(m_k*
m_k)*t,ev_vector+m_k*t,
114 G_matrix+(m_k*(1+m_target_dim))*t,W_matrix,&W_matrix_lock};
115 parameters[t] = params;
116 pthread_create(&threads[t], &attr,
run_kltsa_thread, (
void*)¶meters[t]);
118 for (t=0; t<num_threads; t++)
119 pthread_join(threads[t], NULL);
120 PTHREAD_LOCK_DESTROY(&W_matrix_lock);
125 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[j*N+i]+neighborhood_matrix[j*N+i]] += 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[j*N+i]*N+neighborhood_matrix[k*N+i]];
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[k*N+i]+neighborhood_matrix[j*N+i]] -= local_gram_matrix[j*m_k+k];
198 PTHREAD_UNLOCK(W_matrix_lock);
void wrap_dsyevr(char jobz, char uplo, int n, double *a, int lda, int il, int iu, double *eigenvalues, double *eigenvectors, int *info)
int32_t get_num_threads() const
virtual ~CKernelLocalTangentSpaceAlignment()
virtual void destroy_matrix()
the class KernelLocallyLinearEmbedding used to preprocess data using kernel extension of Locally Line...
static void * run_kltsa_thread(void *p)
THREADS.
virtual SGMatrix< float64_t > construct_weight_matrix(SGMatrix< float64_t > kernel_matrix, SGMatrix< int32_t > neighborhood_matrix)
HELPERS.
static void center_matrix(T *matrix, int32_t m, int32_t n)
CKernelLocalTangentSpaceAlignment()
virtual const char * get_name() const
static float32_t sqrt(float32_t x)
x^0.5
#define SG_MALLOC(type, len)
#define SG_CALLOC(type, len)