35#define MAX_DIST ((DistType)INT_MAX)
41static int left(
int i) {
return 2 * i; }
43static int right(
int i) {
return 2 * i + 1; }
45static int parent(
int i) {
return i / 2; }
109 for (count = 0, i = 0; i < n; i++)
110 if (i != startVertex) {
111 h.
data[count] = (size_t)i;
116 for (j = (n - 1) / 2; j >= 0; j--)
139 if (
dist[increasedVertex] <= newDist)
142 placeInHeap = h->
index[increasedVertex];
144 dist[increasedVertex] = newDist;
151 h->
data[i] = increasedVertex;
152 h->
index[increasedVertex] = i;
157 size_t closestVertex;
162 for (
int i = 0; i < n; i++)
171 closestDist =
dist[closestVertex];
174 for (
size_t i = 1; i <
graph[closestVertex].nedges; i++) {
179 prevClosestDist = closestDist;
183 for (
int i = 0; i < n; i++)
185 dist[i] = INT_MAX - prevClosestDist < 10 ? INT_MAX : prevClosestDist + 10;
218 for (count = 0, i = 0; i < n; i++)
219 if (i != startVertex) {
220 h.
data[count] = (size_t)i;
225 for (j = (n - 1) / 2; j >= 0; j--)
249 if (
dist[increasedVertex] <= newDist)
252 placeInHeap = h->
index[increasedVertex];
254 dist[increasedVertex] = newDist;
261 h->
data[i] = increasedVertex;
262 h->
index[increasedVertex] = i;
270 size_t closestVertex = 0;
275 for (
int i = 0; i < n; i++)
284 closestDist =
dist[closestVertex];
285 if (closestDist == FLT_MAX)
287 for (
size_t i = 1; i <
graph[closestVertex].nedges; i++) {
302 for (
size_t i= 0; i <
graph->n; i++) {
306 for (
size_t i =
graph->sources[source]; i <
graph->sources[source + 1];
308 size_t target =
graph->targets[i];
309 dists[target] =
graph->weights[i];
311 assert(
graph->n <= INT_MAX);
317 float d = dists[closest];
324 terms[offset].
i = (int)source;
325 terms[offset].
j = (int)closest;
327 terms[offset].
w = 1 / (d*d);
330 for (
size_t i =
graph->sources[closest]; i <
graph->sources[closest + 1];
332 size_t target =
graph->targets[i];
333 float weight =
graph->weights[i];
Memory allocation wrappers that exit on failure.
static void * gv_calloc(size_t nmemb, size_t size)
API for compacted arrays of booleans.
static bool bitarray_get(bitarray_t self, size_t index)
get the value of the given element
#define greaterPriority(h, i, j)
static double dist(int dim, double *x, double *y)
Agraph_t * graph(char *name)
Arithmetic helper functions.
static bool extractMax(heap *h, size_t *max, Word dist[])
static void exchange(heap *h, int i, int j)
static bool extractMax_f(heap *h, size_t *max, float dist[])
static void freeHeap(heap *h)
static heap initHeap(int startVertex, Word dist[], int n)
static void increaseKey_f(heap *h, size_t increasedVertex, float newDist, float dist[])
static void increaseKey(heap *h, size_t increasedVertex, Word newDist, Word dist[])
static heap initHeap_f(int startVertex, float dist[], int n)
static void heapify_f(heap *h, int i, float dist[])
void dijkstra_f(int vertex, vtx_data *graph, int n, float *dist)
size_t dijkstra_sgd(graph_sgd *graph, size_t source, term_sgd *terms)
static bool greaterPriority_f(const heap *h, int i, int j, const float *dist)
void ngdijkstra(int vertex, vtx_data *graph, int n, DistType *dist)
static void assign(heap *h, int i, int j)
static void heapify(heap *h, int i, Word dist[])
#define neighbor(t, i, edim, elist)