From cdedae2f356207d81614eedff60a0abe1abfbedf Mon Sep 17 00:00:00 2001 From: Marika-K Date: Fri, 14 Jun 2024 15:30:37 +0200 Subject: [PATCH] metro map: embed plotly as interactive plot, small updates in doc --- docs/source/_static/sbahn_berlin.html | 14 ++ docs/source/conf.py | 1 + docs/source/mods/figures/metromap_sberlin.png | Bin 73617 -> 0 bytes docs/source/mods/metromap.rst | 8 +- src/gurobi_optimods/metromap.py | 170 +++++++++--------- 5 files changed, 106 insertions(+), 87 deletions(-) create mode 100644 docs/source/_static/sbahn_berlin.html delete mode 100644 docs/source/mods/figures/metromap_sberlin.png diff --git a/docs/source/_static/sbahn_berlin.html b/docs/source/_static/sbahn_berlin.html new file mode 100644 index 00000000..9fed08ab --- /dev/null +++ b/docs/source/_static/sbahn_berlin.html @@ -0,0 +1,14 @@ + + + +
+
+ + diff --git a/docs/source/conf.py b/docs/source/conf.py index f4fcb393..863b45aa 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -51,6 +51,7 @@ "construction_warning": False, } html_favicon = "https://www.gurobi.com/favicon.ico" +html_static_path = ["_static"] autosectionlabel_prefix_document = True diff --git a/docs/source/mods/figures/metromap_sberlin.png b/docs/source/mods/figures/metromap_sberlin.png deleted file mode 100644 index d555c50d05b78eda4ad706dd0e5cdc2e0e91eed3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73617 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 z 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 UtHGAR3cc@TB{jt~`MXd5KN}4`6aWAK diff --git a/docs/source/mods/metromap.rst b/docs/source/mods/metromap.rst index f6701a78..f2d39c75 100644 --- a/docs/source/mods/metromap.rst +++ b/docs/source/mods/metromap.rst @@ -426,10 +426,12 @@ The plot function can be called as follows:: The following figure is an example of the above call, it shows the lines in the octilinear representation of the S-Bahn Berlin network. +(Use `link <../_static/sbahn_berlin.html>`_ to open in full screen.) + +.. raw:: html + + -.. image:: figures/metromap_sberlin.png - :width: 600 - :alt: sberlin_oct. Note that plotting the lines in the octilinear network is an art or a further optimization problem. If lines share an edge, it needs to be decided how to shift diff --git a/src/gurobi_optimods/metromap.py b/src/gurobi_optimods/metromap.py index 68f1f7d9..ac8cb4ea 100644 --- a/src/gurobi_optimods/metromap.py +++ b/src/gurobi_optimods/metromap.py @@ -49,18 +49,19 @@ def metromap( Parameters ---------- - graph : networkx graph with node attribute 'pos' being a tuple of x- and y-coordinate + graph : Graph + networkx graph with node attribute 'pos' being a tuple of x- and y-coordinate linepath_data : DataFrame DataFrame with information on the line routes/paths. It must include "linename", "edge_source", and "edge_target". This data frame could also be empty - include_planarity : Bool + include_planarity : bool parameter to turn off the consideration of planarity constraints - penalty_edge_directions : Float + penalty_edge_directions : float weight for original direction part in the objective, default is 1 - penalty_line_bends : Float + penalty_line_bends : float weight for line-bend part in the objective, default is 1 - penalty_distance : Float + penalty_distance : float weight for distance part in the objective, default is 1 Returns @@ -156,19 +157,20 @@ def create_model( """Create the model Parameters ---------- - graph : networkx graph with node attribute 'pos' being a tuple of x- and y-coordinate + graph : Graph + networkx graph with node attribute 'pos' being a tuple of x- and y-coordinate linepaths : DataFrame DataFrame with information on the line routes/paths. This data frame could also be empty - include_planarity : Bool + include_planarity : bool parameter to turn off the consideration of planarity constraints - geofata : Bool + geodata : bool if original positions were given - penalty_edge_directions : Float + penalty_edge_directions : float weight for original direction part in the objective - penalty_line_bends : Float + penalty_line_bends : float weight for line-bend part in the objective - penalty_distance : Float + penalty_distance : float weight for distance part in the objective Returns @@ -222,13 +224,13 @@ def create_model( if geodata == True: # include original geographic information - posOrig = nx.get_node_attributes(graph, "pos") + pos_orig = nx.get_node_attributes(graph, "pos") # only allow neighboring positions create_orig_nodepostion_constraints( - graph, edge_direction, obj, posOrig, penalty_edge_directions + graph, edge_direction, obj, pos_orig, penalty_edge_directions ) # ensure the same edge order - create_orig_edgeorder_constraints(graph, model, edge_direction, posOrig) + create_orig_edgeorder_constraints(graph, model, edge_direction, pos_orig) # one direction for each edge model.addConstrs( @@ -336,20 +338,20 @@ def sort_by_angle(item): return q -def create_orig_edgeorder_constraints(graph, model, edge_direction, posOrig): - """Assume geographical node data is given. - For each node in the graph order the neighbors counter-clock-wise and - add constraints to ensure the preservation of this order in the octilinear - graph representation +# Assume geographical node data is given. +# For each node in the graph order the neighbors counter-clock-wise and +# add constraints to ensure the preservation of this order in the octilinear +# graph representation - Parameters - ---------- - graph : graph (networkx) - undirected networkx graph - model : Gurobi model object - edge_direction : tupledict (Gurobi variables) - posOrig : node attribute (of graph) - """ + +# Parameters +# ---------- +# graph : Graph +# undirected networkx graph +# model : Gurobi model object +# edge_direction : tupledict (Gurobi variables) +# pos_orig : node attribute (of graph) +def create_orig_edgeorder_constraints(graph, model, edge_direction, pos_orig): for v in graph.nodes: # we can assume that the degree is at most 8 if len(graph.edges(v)) <= 1: @@ -361,8 +363,8 @@ def create_orig_edgeorder_constraints(graph, model, edge_direction, posOrig): model.addConstr(beta.sum() <= 1) for u, w in graph.edges(v): neighbors.append(w) - positions.append(posOrig[w]) - sorted_q = counter_clockwise_sort(posOrig[v], positions) + positions.append(pos_orig[w]) + sorted_q = counter_clockwise_sort(pos_orig[v], positions) node = neighbors[sorted_q[0][0]] for i in range(1, len(sorted_q)): nextNode = neighbors[sorted_q[i][0]] @@ -390,28 +392,27 @@ def create_orig_edgeorder_constraints(graph, model, edge_direction, posOrig): ) +# Assume geographical node data is given. +# For each edge in the graph compute the direction from the original graph data. +# Fix variables such that for each edge only the original direction or the two adjacent +# directions are allowed. + +# Parameters +# ---------- +# graph : graph (networkx) - undirected networkx graph +# edge_direction : tupledict (gurobi variables) +# obj : list - position 0 holds the objective funtion +# pos_orig : node attribute (of graph) - original position +# penalty_edge_directions : penalty if not original position is chosen for the edge + + +# edge_direction : tupledict (gurobi variables) def create_orig_nodepostion_constraints( - graph, edge_direction, obj, posOrig, penalty_edge_directions + graph, edge_direction, obj, pos_orig, penalty_edge_directions ): - """Assume geographical node data is given. - For each edge in the graph compute the direction from the original graph data. - Fix variables such that for each edge only the original direction or the two adjacent - directions are allowed. - - Parameters - ---------- - graph : graph (networkx) - undirected networkx graph - model : Gurobi model object - edge_direction : tupledict (gurobi variables) - obj : list - position 0 holds the objective funtion - posOrig : node attribute (of graph) - original position - penalty_edge_directions : penalty if not original position is chosen for the edge - - edge_direction : tupledict (gurobi variables) - """ for u, v in graph.edges: - posU = posOrig[u] - posV = posOrig[v] + posU = pos_orig[u] + posV = pos_orig[v] dx = posV[0] - posU[0] dy = posV[1] - posU[1] theta = math.atan2(dy, dx) @@ -490,19 +491,18 @@ def create_orig_nodepostion_constraints( obj[0] += penalty_edge_directions * edge_direction[u, v, 6] -def create_direction_constraints(graph, model, edge_direction, x, y, mindist): - """Define for each direction constraints on the position x and y for each edge +# Define for each direction constraints on the position x and y for each edge - Parameters - ---------- - graph : graph (networkx) - undirected networkx graph - model : Gurobi model object - edge_direction : tupledict (gurobi variables) - x : tupledict (gurobi variables) - x position of node - y : tupledict (gurobi variables) - y position of node - mindist : Scalar - minimum distance between two nodes - """ +# Parameters +# ---------- +# graph : graph (networkx) - undirected networkx graph +# model : Gurobi model object +# edge_direction : tupledict (gurobi variables) +# x : tupledict (gurobi variables) - x position of node +# y : tupledict (gurobi variables) - y position of node +# mindist : Scalar - minimum distance between two nodes +def create_direction_constraints(graph, model, edge_direction, x, y, mindist): for u, v in graph.edges: model.addConstr((edge_direction[u, v, 0] == 1) >> (y[v] - y[u] == 0)) model.addConstr((edge_direction[u, v, 0] == 1) >> (x[v] - x[u] >= mindist)) @@ -534,19 +534,19 @@ def create_direction_constraints(graph, model, edge_direction, x, y, mindist): ) -def compute_bends(graph, model, edge_direction, obj, linepaths, penalty_line_bends): - """Compute bends for each two consecutive lines. If there are linepaths covering - both edges, add variables to model and objective that account for the "line bend". +# Compute bends for each two consecutive lines. If there are linepaths covering +# both edges, add variables to model and objective that account for the "line bend". - Parameters - ---------- - graph : graph (networkx) - undirected networkx graph - model : Gurobi model object - edge_direction : tupledict (gurobi variables) - obj : list - position 0 holds the objective funtion - linepaths : pandas Dataframe - linepaths - penalty_line_bends : penalty to account for bends of lines - """ + +# Parameters +# ---------- +# graph : graph (networkx) - undirected networkx graph +# model : Gurobi model object +# edge_direction : tupledict (gurobi variables) +# obj : list - position 0 holds the objective funtion +# linepaths : pandas Dataframe - linepaths +# penalty_line_bends : penalty to account for bends of lines +def compute_bends(graph, model, edge_direction, obj, linepaths, penalty_line_bends): bend = {} for v in graph.nodes: templist = list(graph.edges(v)) @@ -881,19 +881,19 @@ def planarity_callback(model, where): ) -def add_coordinateConstr(graph, model, d, x, y, mindist, bigM): - """Define additional cuts to improve the LP relaxation +# Define additional cuts to improve the LP relaxation - Parameters - ---------- - graph : graph (networkx) - undirected networkx graph - model : Gurobi model object - edge_direction : tupledict (gurobi variables) - x : tupledict (gurobi variables) - x position of node - y : tupledict (gurobi variables) - y position of node - mindist : Scalar - minimum distance between two nodes - """ +# Parameters +# ---------- +# graph : graph (networkx) - undirected networkx graph +# model : Gurobi model object +# d : tupledict (gurobi variables) edge_directions +# x : tupledict (gurobi variables) - x position of node +# y : tupledict (gurobi variables) - y position of node +# mindist : Scalar - minimum distance between two nodes +# bigM : scalar +def add_coordinateConstr(graph, model, d, x, y, mindist, bigM): for u, v in graph.edges: # one of the directions 0,1,2 then z1 increasing, y non-decreasing, x non-decreasing model.addConstr( @@ -1046,8 +1046,10 @@ def plot_map(graph, directions, linepath_data): Parameters ---------- - graph : networkx graph with node attribute 'pos_oct' being a tuple of x- and y-coordinate - directions: dictionary providing the assigned direction (0 to 7) for each edge + graph : Graph + networkx graph with node attribute 'pos_oct' being a tuple of x- and y-coordinate + directions: dict() + dictionary providing the assigned direction (0 to 7) for each edge linepath_data : DataFrame DataFrame with information on the line routes/paths. Returns