X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/47f0168a8d8b7b257528283ca0e20e3b27d1ea4b..51c23076e2b42ff07dc167dea1cb0e3a4ab3cf68:/src/xbt/graph.c diff --git a/src/xbt/graph.c b/src/xbt/graph.c index a07efb9c2a..54126e78f1 100644 --- a/src/xbt/graph.c +++ b/src/xbt/graph.c @@ -1,6 +1,6 @@ /* a generic graph library. */ -/* Copyright (c) 2006-2017. The SimGrid Team. +/* Copyright (c) 2006-2018. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -9,9 +9,7 @@ #include "xbt/sysdep.h" #include "xbt/log.h" #include "xbt/graph.h" -#include "graph_private.h" #include "xbt/dict.h" -#include "xbt/heap.h" #include #include @@ -180,115 +178,3 @@ xbt_dynar_t xbt_graph_node_get_outedges(xbt_node_t n) { return n->out; } - -/** @brief Set the weight of the given edge */ -void xbt_graph_edge_set_length(xbt_edge_t e, double length) -{ - e->length = length; - -} - -/** @brief Get the length of a edge */ -double xbt_graph_edge_get_length(xbt_edge_t edge) -{ - return edge->length; -} - -/** @brief Floyd-Warshall algorithm for shortest path finding - * - * From wikipedia: - * - * The Floyd-Warshall algorithm takes as input an adjacency matrix representation of a weighted, directed graph (V, E). - * The weight of a path between two vertices is the sum of the weights of the edges along that path. The edges E of the - * graph may have negative weights, but the graph must not have any negative weight cycles. The algorithm computes, for - * each pair of vertices, the minimum weight among all paths between the two vertices. The running time complexity is - * Θ(|V|3). - */ -void xbt_floyd_algorithm(xbt_graph_t g, double *adj, double *d, xbt_node_t * p) -{ - unsigned long i; - unsigned long j; - unsigned long k; - unsigned long n = xbt_dynar_length(g->nodes); - - for (i = 0; i < n * n; i++) { - d[i] = adj[i]; - } - - for (i = 0; i < n; i++) { - for (j = 0; j < n; j++) { - if (d[i*n+j] > -1) { - p[i*n+j] = *((xbt_node_t *) xbt_dynar_get_ptr(g->nodes, i)); - } - } - } - - for (k = 0; k < n; k++) { - for (i = 0; i < n; i++) { - for (j = 0; j < n; j++) { - if (d[i * n + k] > -1 && d[k * n + j] > -1 && - (d[i * n + j] < 0 || d[i * n + j] > d[i * n + k] + d[k * n + j])) { - d[i * n + j] = d[i * n + k] + d[k * n + j]; - p[i * n + j] = p[k * n + j]; - } - } - } - } -} - -/** @brief Export the given graph in the GraphViz formatting for visualization */ -void xbt_graph_export_graphviz(xbt_graph_t g, const char *filename, const char *(node_name) (xbt_node_t), - const char *(edge_name) (xbt_edge_t)) -{ - unsigned int cursor = 0; - xbt_node_t node = NULL; - xbt_edge_t edge = NULL; - const char *name = NULL; - - FILE *file = fopen(filename, "w"); - xbt_assert(file, "Failed to open %s \n", filename); - - if (g->directed) - fprintf(file, "digraph test {\n"); - else - fprintf(file, "graph test {\n"); - - fprintf(file, " graph [overlap=scale]\n"); - - fprintf(file, " node [shape=box, style=filled]\n"); - fprintf(file, " node [width=.3, height=.3, style=filled, color=skyblue]\n\n"); - - xbt_dynar_foreach(g->nodes, cursor, node) { - if (node_name){ - fprintf(file, " \"%s\";\n", node_name(node)); - }else{ - fprintf(file, " \"%p\";\n", node); - } - } - xbt_dynar_foreach(g->edges, cursor, edge) { - const char *c; - const char *c_dir = "->"; - const char *c_ndir = "--"; - if (g->directed){ - c = c_dir; - }else{ - c = c_ndir; - } - if (node_name){ - const char *src_name = node_name(edge->src); - const char *dst_name = node_name(edge->dst); - fprintf(file, " \"%s\" %s \"%s\"", src_name, c, dst_name); - }else{ - fprintf(file, " \"%p\" %s \"%p\"", edge->src, c, edge->dst); - } - - if (edge_name){ - name = edge_name(edge); - if (name) - fprintf(file, "[label=\"%s\"]", name); - } - fprintf(file, ";\n"); - } - fprintf(file, "}\n"); - fclose(file); -}