# Generate Topologies (.dot files)

Once your algorithm is defined, you need to define some topology using dot. For small graphs, it is ok to do it by hand. For bigger graphs, you might consider using `gg` and `gg-deco`, that are part of the `sasa` distribution:

## Generate graphs skeletons with `gg`

``````gg -h
``````
``````gg is an experimental graph generator.
usage: gg <graph-kind> [<option>]*
where <graph-kind> can be:
clique           Generate a clique
star             Generate a star
ring             Generate a ring
chain            Generate a chain
grid             Generate a grid
HC               Generate a hyper-cube
ER               Generate a graph using the Erdos Renyi algo
BA               Generate a graph using the Barabasi–Albert algo
tree             Generate a tree
UDG              Generate a graph using the Unit Disc Graph algo
QUDG             Generate a graph using the Quasi UDG algo

<option> can be:
--output, -o <string>
Redirect stdout into a file
--seed, -seed    Set the pseudo-random generator seed
--silent, -s     be quiet
--connected, -c  Try again until a connected graph is generated
--diameter       Compute the graph diameter and put it in the graph attributes
--help, -h       Print this help

Use 'gg <graph-kind> -h' to see specific options.
``````
``````gg grid -h
``````
``````gg is an experimental graph generator.
usage: gg grid [option]*
<option> can be:
--output, -o <string>
Redirect stdout into a file
--silent, -s     be quiet
--directed, -dir Generate a directed graph.
--help, -h       Print this help

<option> specific to this <graph-kind>:
--width, -w <float>
Set the grid's width

--height, -he <float>
Set the grid's height
``````

## Decorate graphs skeletons with `gg-deco`

``````gg-deco -h
``````
``````usage: gg-deco "<decoration pattern>" <input-file.dot> [<option>]*
decorates an <input-file.dot> using a <decoration pattern>.

The <decoration pattern> specifies which algos should be attached to which nodes.
Its syntax (in EBNF) is:
<decoration pattern> ::= <deco><more>
<deco> ::=
| <int>:<string>
| <int>-<int>:<string>
| <int>-:<string>
<more> ::= ([ \t]*<deco>)*

"i:file"   attaches <file> to node number <i> (the first node is numbered 0)
"i-j:file" attaches <file> to nodes number <i>, <i>+1, ..., <j>
"i-:file"  attaches <file> from node number <i> untill the end

decorations are handled from left to rigth (i.e., the rigth-most one wins).

Example: the <decoration pattern> "0:root.ml 1-:p.ml" assigns
- "root.ml" to the first node, and
- "p.ml" to the other ones.

<option> can be:
--output, -o <file>
Redirect stdout into a <file>
--help, -h  Print this help
``````

## An example

The following commands generate a random graph with 30 nodes using the Erdos-Renyi algorithm, and launch an interactive session that computes a bfs spanning tree. We use the `sfdp` dot viewer as it give better result than the default one on this kind of graphs.

``````[ -d "sasa" ] || git clone https://gricad-gitlab.univ-grenoble-alpes.fr/verimag/synchrone/sasa.git
cd sasa/test/bfs-spanning-tree
gg ER  -n 30 -o ER30.dot
gg-deco "0:root.ml 1-:p.ml" ER30.dot -o ER30.dot
make ER30.cma
rdbgui4sasa -sut "sasa ER30.dot -cd" # then click on the graph icon + the =sfdp= radio button
# or, via the CLI:
rdbg --sasa -sut "sasa ER30.dot -cd"
dot_view:=sf
n
gv
``````