Initial commit
This commit is contained in:
54
tools/adj2dot
Executable file
54
tools/adj2dot
Executable file
@@ -0,0 +1,54 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
# SPDX-FileCopyrightText: 2025 Ämin Baumeler <amin@indyfac.ch>
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
import sys
|
||||
import numpy as np
|
||||
|
||||
if len(sys.argv) != 1:
|
||||
print(
|
||||
sys.argv[0]
|
||||
+ """
|
||||
|
||||
Read adjacency vector of a digraph from stdin, and transform it to
|
||||
the GraphViz dot language for graph visualization.
|
||||
|
||||
The input represents the adjacency vector of a digraph. A 1 in
|
||||
position (i,j) of a line is an arc i<-j, and a 0 no arc i<-j.
|
||||
The coordinate i runs from 0 to n-1, the corrdinate j likewise, but
|
||||
with j != i. The entries are ordered lexicographically."""
|
||||
)
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
def print_dot(n, adj, labels):
|
||||
print('strict digraph "DG" {')
|
||||
for v in range(n):
|
||||
print(f'GN{v} [label="{labels[v]}"];')
|
||||
i = 0
|
||||
j = 1
|
||||
for entry in adj:
|
||||
if entry:
|
||||
print(f"GN{j} -> GN{i}")
|
||||
j = j + 1
|
||||
if i == j:
|
||||
j = j + 1
|
||||
if j >= n:
|
||||
i = i + 1
|
||||
j = 0
|
||||
print("}")
|
||||
|
||||
|
||||
for line in sys.stdin:
|
||||
labels = None
|
||||
if ":" in line:
|
||||
labels, line = line.split(":")
|
||||
labels = tuple(map(int, tuple(labels)))
|
||||
adj = tuple(map(int, tuple(line.strip())))
|
||||
n = int(np.ceil(np.sqrt(len(adj))))
|
||||
if not labels:
|
||||
labels = tuple(range(n))
|
||||
print_dot(n, adj, labels)
|
||||
sys.exit(0)
|
Reference in New Issue
Block a user