From 7d41c1cdf71c2dd9b0d15eceac97af2d7eb187ad Mon Sep 17 00:00:00 2001 From: Markus Koch Date: Sat, 2 May 2020 17:31:26 +0200 Subject: [PATCH] Start implementing actual search --- src/dijkstragraph.h | 8 ++------ src/dijkstrasearch.c | 45 ++++++++++++++++++++++++++++++++++++++++++++ src/dijkstrasearch.h | 19 +++++++++++++++++++ src/main.c | 20 +++++++++++++++++--- 4 files changed, 83 insertions(+), 9 deletions(-) create mode 100644 src/dijkstrasearch.c create mode 100644 src/dijkstrasearch.h diff --git a/src/dijkstragraph.h b/src/dijkstragraph.h index 0c68831..d9dc164 100644 --- a/src/dijkstragraph.h +++ b/src/dijkstragraph.h @@ -5,18 +5,14 @@ #define DIJKSTRA_WEIGHT_AUTO (-1) -typedef int dijkstra_cost; +typedef unsigned int dijkstra_cost; +#define DIJKSTRA_COST_MAX UINT_MAX struct dijkstra_solver { GList *nodes; GList *paths; }; -struct dijkstra_state { - dijkstra_cost cost; - int visited; -}; - struct position { float x; float y; diff --git a/src/dijkstrasearch.c b/src/dijkstrasearch.c new file mode 100644 index 0000000..f8ee5b5 --- /dev/null +++ b/src/dijkstrasearch.c @@ -0,0 +1,45 @@ +#include "dijkstrasearch.h" + +void dijkstra_search_reset(struct dijkstra_search *search) +{ + unsigned int i; + for (i=0; i < search->node_count; i++) { + search->states[i]->cost = DIJKSTRA_COST_MAX; + search->states[i]->visited = 0; + } +} + +// WARNING: After creating this object, you must NOT modify the solver! +struct dijkstra_search *dijkstra_search_new(struct dijkstra_solver *solver) +{ + struct dijkstra_search *search; + unsigned int i; + + search = malloc(sizeof(*search)); + if (search) { + search->states = malloc(sizeof(*search->states) * g_list_length(solver->nodes)); + search->node_count = g_list_length(solver->nodes); + for (i=0; i < search->node_count; i++) { + search->states[i] = malloc(sizeof(struct dijkstra_state)); + if (!search->states) { + // TODO: I should dealloc all allocated memory before returning, + // but whatever, we'll crash and burn one way of the other. + return NULL; + } + } + dijkstra_search_reset(search); + } + + return search; +} + +void dijkstra_search_free(struct dijkstra_search *search) +{ + unsigned int i; + + for (i=0; i < search->node_count; i++) { + free(search->states[i]); + } + free(search->states); + free(search); +} diff --git a/src/dijkstrasearch.h b/src/dijkstrasearch.h new file mode 100644 index 0000000..fc2f838 --- /dev/null +++ b/src/dijkstrasearch.h @@ -0,0 +1,19 @@ +#ifndef DIJKSTRASEARCH_H +#define DIJKSTRASEARCH_H + +#include "dijkstragraph.h" + +struct dijkstra_state { + dijkstra_cost cost; + int visited; +}; + +struct dijkstra_search { + struct dijkstra_state **states; + unsigned int node_count; +}; + +struct dijkstra_search *dijkstra_search_new(struct dijkstra_solver *solver); +void dijkstra_search_free(struct dijkstra_search *search); + +#endif // DIJKSTRASEARCH_H diff --git a/src/main.c b/src/main.c index e5b1b4b..4dba590 100644 --- a/src/main.c +++ b/src/main.c @@ -1,9 +1,10 @@ #include #include #include +#include #include "dijkstragraph.h" -#include +#include "dijkstrasearch.h" #include "geojson.h" #include "logging.h" @@ -44,9 +45,12 @@ int main(int argc, char *argv[]) struct dijkstra_node *node; struct dijkstra_path *path; + struct dijkstra_search *search; + + /* Init stuff */ set_log_level(LL_INFO); - // Process arguments + /* Process arguments */ while((opt = getopt(argc, argv, "vs")) != -1) { switch(opt) { @@ -70,13 +74,14 @@ int main(int argc, char *argv[]) return 1; } + /* Generate solver */ solver = dijkstra_solver_new(); if (!solver) { report(LL_CRITICAL, "Memory allocation failure."); return 2; } - /* Parse file list */ + /* Load map data -> Generate graph */ for (i = optind; i < argc; ++i) { add_geojson_to_dijkstra(solver, argv[i]); } @@ -104,6 +109,15 @@ int main(int argc, char *argv[]) g_list_length(solver->nodes), g_list_length(solver->paths)); + /* Perform search */ + search = dijkstra_search_new(solver); + if (!search) { + report(LL_ERROR, "Error allocating dijkstra_search"); + dijkstra_solver_free(solver); + return -3; + } + + dijkstra_search_free(search); dijkstra_solver_free(solver); return 0;