diff --git a/README.md b/README.md index 4bd52c2..c47ba28 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ To display help and exit, run the respective program without command-line argume ### SOCgen ``` $ ./SOCgen -Usage: ./SOCgen -n [-r ] [--grpahviz] [FILTER ...] +Usage: ./SOCgen -n [-r ] [--graphviz] [FILTER ...] -n Generate SOCs with `order' connected nodes -r Pick directed graphs at random, and exit after having found `num' SOCs --graphviz Output SOCs in Graphviz format, arcs of common parents are highlighted @@ -42,7 +42,7 @@ Usage: ./SOCgen -n [-r ] [--grpahviz] [FILTER ...] --no-sink ... without sink nodes (this logically implies -c) --no-source ... without source nodes (also this logically implies -c) -This program prints the found SOCs as adjacency matrices to stdout, unless --grpahviz has been specified. +This program prints the found SOCs as adjacency matrices to stdout, unless --graphviz has been specified. To exclude (some) of the isomorphic SOCs, it uses a degree-order filter. ``` @@ -66,7 +66,7 @@ This program verifies the admissibility of simple directed graphs. ### SOCgraphviz ``` $ ./SOCgraphviz -Usage: ./SOCgraphviz +Usage: ./SOCgraphviz [night] File name with adjacency matrices of simple directed graphs [FILE FORMAT] @@ -75,6 +75,7 @@ Usage: ./SOCgraphviz The file `filename' may contain graphs with different order (number of vertices) This program translates to adjacency matrices into the Graphviz format, and prints them to stdout. +Try the optional argument ``night'' for star-constallation-like output. ``` ### removeiso.py diff --git a/src/SOCgen.c b/src/SOCgen.c index 81b24c2..0632671 100644 --- a/src/SOCgen.c +++ b/src/SOCgen.c @@ -482,7 +482,7 @@ int main(int argc, char *argv[]) { } } if (UNKOPTION || n <= 1) { - fprintf(stderr, "Usage: %s -n [-r ] [--grpahviz] [FILTER ...]\n", argv[0]); + fprintf(stderr, "Usage: %s -n [-r ] [--graphviz] [FILTER ...]\n", argv[0]); fprintf(stderr, " -n Generate SOCs with `order' connected nodes\n"); fprintf(stderr, " -r Pick directed graphs at random, and exit after having found `num' SOCs\n"); fprintf(stderr, " --graphviz Output SOCs in Graphviz format, arcs of common parents are highlighted\n"); @@ -492,7 +492,7 @@ int main(int argc, char *argv[]) { fprintf(stderr, " --no-sink ... without sink nodes (this logically implies -c)\n"); fprintf(stderr, " --no-source ... without source nodes (also this logically implies -c)\n"); fprintf(stderr, "\n"); - fprintf(stderr, "This program prints the found SOCs as adjacency matrices to stdout, unless --grpahviz has been specified.\n"); + fprintf(stderr, "This program prints the found SOCs as adjacency matrices to stdout, unless --graphviz has been specified.\n"); fprintf(stderr, "To exclude (some) of the isomorphic SOCs, it uses a degree-order filter.\n"); return -1; } @@ -556,7 +556,7 @@ int main(int argc, char *argv[]) { padlen+3, SOCrate, padlen, ETC); fflush(stderr); } - // Convert graph index `grpahnumber' to the lists parents, children, + // Convert graph index `graphnumber' to the lists parents, children, // parentslen, childrenlen graphnrtolists(n, graphnumber, parents, parentslen, children, childrenlen); // Increase checked counter and prepare for next iteration diff --git a/src/SOCgraphviz.c b/src/SOCgraphviz.c index 94db46b..bd76880 100644 --- a/src/SOCgraphviz.c +++ b/src/SOCgraphviz.c @@ -4,11 +4,52 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include +#include +#include +#include +// Global configuration for the "night" mode +const float maxSize = 0.1; +const float minSize = 0.001; +const char *starColors[] = { + "white", + "lightgray", + "darkslategray", + "lightyellow", + "purple", + "cyan", + "silver", + "khaki", "khaki1", "khaki2", "khaki3", "khaki4", + "gold", "gold1", "gold2", "gold3", "gold4", + "darkgoldenrod", "darkgoldenrod1", "darkgoldenrod2", "darkgoldenrod3", "darkgoldenrod4", + "darkorange", "darkorange1", "darkorange2", "darkorange3", "darkorange4", + "coral", "coral1", "coral2", "coral3", "coral4", + "chocolate", "chocolate1", "chocolate2", "chocolate3", "chocolate4", + "antiquewhite", "antiquewhite1", "antiquewhite2", "antiquewhite3", "antiquewhite4", + "azure", "azure1", "azure2", "azure3", "azure4", + "bisque", "bisque1", "bisque2", "bisque3", "bisque4", + "seashell", "seashell1", "seashell2", "seashell3", "seashell4", + "lightyellow", "lightyellow1", "lightyellow2", "lightyellow3", "lightyellow4", + "lightpink", "lightpink1", "lightpink2", "lightpink3", "lightpink4", + "burlywood", "burlywood1", "burlywood2", "burlywood3", "burlywood4", + "lavenderblush", "lavenderblush1", "lavenderblush2", "lavenderblush3", "lavenderblush4", +}; +const size_t numColors = sizeof(starColors) / sizeof(starColors[0]); + +void printgraphhead(char *filename, const int line, const int NIGHT) { + printf("strict digraph \"File_%s_line_%d\" {", filename, line); + if (NIGHT) { + double rsize = minSize + (((double)rand() / RAND_MAX) * (maxSize - minSize)); + int rcolor = rand() % numColors; + printf(" bgcolor=\"black\";"); + printf(" node [shape=point, color=%s, style=filled, width=%lf, height=%lf];", starColors[rcolor], rsize, rsize); + printf(" edge [color=lightgray, penwidth=0.5];"); + } +} int main(int argc, char *argv[]) { // Parse command-line arguments - if (argc != 2) { - fprintf(stderr, "Usage: %s \n", argv[0]); + if (argc != 2 && (argc != 3 || strcmp(argv[2], "night") != 0)) { + fprintf(stderr, "Usage: %s [night]\n", argv[0]); fprintf(stderr, " File name with adjacency matrices of simple directed graphs\n"); fprintf(stderr, "\n"); fprintf(stderr, "[FILE FORMAT]\n"); @@ -17,8 +58,11 @@ int main(int argc, char *argv[]) { fprintf(stderr, " The file `filename' may contain graphs with different order (number of vertices)\n"); fprintf(stderr, "\n"); fprintf(stderr, "This program translates to adjacency matrices into the Graphviz format, and prints them to stdout.\n"); + fprintf(stderr, "Try the optional argument ``night'' for star-constallation-like output.\n"); return -1; } + const int NIGHT = argc - 2; + srand(time(NULL)); // Open file FILE *fp; @@ -33,14 +77,14 @@ int main(int argc, char *argv[]) { int n = -1; int row = 0; int col = 0; - printf("strict digraph \"File_%s_line_%d\" {", argv[1], line); + printgraphhead(argv[1], line, NIGHT); while (!feof(fp)) { char ch = fgetc(fp); switch (ch) { case '{': if (row == 0 && col == 0 && headprinted == 0) { headprinted = 1; - printf("strict digraph \"File_%s_line_%d\" {", argv[1], line); + printgraphhead(argv[1], line, NIGHT); } break; case '0':