25 using namespace shogun;
27 #ifndef DOXYGEN_SHOULD_SKIP_THIS
30 struct DIJKSTRA_THREAD_PARAM
39 const int32_t* edges_idx_matrix;
56 class ISOMAP_COVERTREE_POINT
63 distance_matrix = dmatrix;
66 inline double distance(
const ISOMAP_COVERTREE_POINT& p)
const
68 return distance_matrix[point_index*distance_matrix.num_rows+p.point_index];
71 inline bool operator==(
const ISOMAP_COVERTREE_POINT& p)
const
73 return (p.point_index==point_index);
125 SG_ERROR(
"Given distance matrix is not square.\n");
129 SG_ERROR(
"K parameter should be less than number of given vectors (k=%d, N=%d)\n",
m_k, N);
140 coverTree->
insert(ISOMAP_COVERTREE_POINT(i,D_matrix));
144 ISOMAP_COVERTREE_POINT origin(i,D_matrix);
145 std::vector<ISOMAP_COVERTREE_POINT> neighbors =
147 for (std::size_t m=1; m<neighbors.size(); m++)
149 edges_matrix[i*m_k+m-1] = origin.distance(neighbors[m]);
150 edges_idx_matrix[i*m_k+m-1] = neighbors[m].point_index;
162 pthread_t* threads =
SG_MALLOC(pthread_t, num_threads);
163 DIJKSTRA_THREAD_PARAM* parameters =
SG_MALLOC(DIJKSTRA_THREAD_PARAM, num_threads);
165 CFibonacciHeap** heaps =
SG_MALLOC(CFibonacciHeap*, num_threads);
166 for (t=0; t<num_threads; t++)
167 heaps[t] =
new CFibonacciHeap(N);
170 int32_t num_threads = 1;
183 pthread_attr_init(&attr);
184 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
185 for (t=0; t<num_threads; t++)
187 parameters[t].i_start = t;
188 parameters[t].i_stop = N;
189 parameters[t].i_step = num_threads;
190 parameters[t].heap = heaps[t];
191 parameters[t].edges_matrix = edges_matrix;
192 parameters[t].edges_idx_matrix = edges_idx_matrix;
193 parameters[t].s = s+t*N;
194 parameters[t].f = f+t*N;
195 parameters[t].m_k =
m_k;
196 parameters[t].shortest_D = shortest_D;
199 for (t=0; t<num_threads; t++)
200 pthread_join(threads[t], NULL);
201 pthread_attr_destroy(&attr);
202 for (t=0; t<num_threads; t++)
208 DIJKSTRA_THREAD_PARAM single_thread_param;
209 single_thread_param.i_start = 0;
210 single_thread_param.i_stop = N;
211 single_thread_param.i_step = 1;
212 single_thread_param.m_k =
m_k;
213 single_thread_param.heap =
new CFibonacciHeap(N);
214 single_thread_param.edges_matrix = edges_matrix;
215 single_thread_param.edges_idx_matrix = edges_idx_matrix;
216 single_thread_param.s = s;
217 single_thread_param.f = f;
218 single_thread_param.shortest_D = shortest_D;
220 delete single_thread_param.heap;
234 DIJKSTRA_THREAD_PARAM* parameters = (DIJKSTRA_THREAD_PARAM*)p;
235 CFibonacciHeap* heap = parameters->heap;
236 int32_t i_start = parameters->i_start;
237 int32_t i_stop = parameters->i_stop;
238 int32_t i_step = parameters->i_step;
239 bool* s = parameters->s;
240 bool* f = parameters->f;
241 const float64_t* edges_matrix = parameters->edges_matrix;
242 const int32_t* edges_idx_matrix = parameters->edges_idx_matrix;
243 float64_t* shortest_D = parameters->shortest_D;
244 int32_t
m_k = parameters->m_k;
245 int32_t k,j,i,min_item,w;
252 for (k=i_start; k<i_stop; k+=i_step)
262 shortest_D[k*N+k] = 0.0;
269 while (heap->get_num_nodes()>0)
272 min_item = heap->extract_min(tmp);
277 for (i=0; i<
m_k; i++)
280 w = edges_idx_matrix[min_item*m_k+i];
285 dist = shortest_D[k*N+min_item] + edges_matrix[min_item*m_k+i];
287 if (dist < shortest_D[k*N+w])
290 shortest_D[k*N+w] = dist;
295 heap->decrease_key(w, dist);
300 heap->insert(w, dist);