(ebg_edges, hsgr_edges)
| 187 | |
| 188 | |
| 189 | def write_dot_file(ebg_edges, hsgr_edges): |
| 190 | dot = args.dot |
| 191 | dot.write("digraph {\nrankdir=BT;\n") # not strict! |
| 192 | labels = {} |
| 193 | hsgr_edges = list(hsgr_edges) |
| 194 | |
| 195 | def edge_params(e): |
| 196 | params = { |
| 197 | "label": e.weight, |
| 198 | "dir": "both", # not really, but enables arrowtail |
| 199 | # "constraint": "false", |
| 200 | } |
| 201 | if e.forward and e.backward: |
| 202 | params["arrowhead"] = "normal" |
| 203 | params["arrowtail"] = "dotnormal" |
| 204 | elif e.forward: |
| 205 | params["arrowhead"] = "normal" |
| 206 | params["arrowtail"] = "dot" |
| 207 | elif e.backward: |
| 208 | params["arrowhead"] = "none" |
| 209 | params["arrowtail"] = "dotnormal" |
| 210 | return params |
| 211 | |
| 212 | def draw_edge(e, params, sub): |
| 213 | dot.write(f" {sub}{e.source}->{sub}{e.target}[{join(params)}];\n") |
| 214 | labels[f"{sub}{e.source}"] = e.source |
| 215 | labels[f"{sub}{e.target}"] = e.target |
| 216 | |
| 217 | dot.write("subgraph cluster_ebg {\n label=ebg;\n") |
| 218 | for e in ebg_edges: |
| 219 | params = edge_params(e) |
| 220 | draw_edge(e, params, "ebg") |
| 221 | dot.write("}\n") |
| 222 | |
| 223 | dot.write("subgraph cluster_hsgr {\n label=hsgr;\n") |
| 224 | for e in sorted(hsgr_edges): |
| 225 | params = edge_params(e) |
| 226 | if e.shortcut: |
| 227 | params["color"] = "red" |
| 228 | params["label"] = f'"{e.turn_id}|{e.weight}"' |
| 229 | draw_edge(e, params, "hsgr") |
| 230 | dot.write("}\n") |
| 231 | |
| 232 | for id_, label in labels.items(): |
| 233 | params = {"label": label} |
| 234 | dot.write(f"{id_}[{join(params)}];\n") |
| 235 | dot.write( |
| 236 | f""" |
| 237 | labelloc="t"; |
| 238 | label="{os.path.basename(args.input)}"; |
| 239 | }}\n""" |
| 240 | ) |
| 241 | |
| 242 | |
| 243 | def print_table(rows, headers): |
no test coverage detected