#!/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)
