#!/usr/bin/python3 # SPDX-FileCopyrightText: 2025 Ämin Baumeler # # 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)