results in a graph where all dependencies between internal family members and the outside graph are redundant:
Graphviz "transitive reduction" (also available via pygraphviz) can fix this: tred foo.dot > foo-tred.dot:
It would be good to do this in Cylc. To get rid of redundant prerequisites as well as simplify the graph we should generate the pygraphviz graph structure early on, from the raw Cylc graph string, and then - after transitive reduction - use that to generate task prerequisites.
For the record, graphviz also has a way to overlay some edges that diverge from or converge on a single node, dot -Gconcentrate foo.dot (which, in the absence of transitive reduction, is quite nice):
Use of family triggers on families with internal structure creates a lot of unnecessary dependencies.
Example (from https://github.com/cylc/cylc/pull/2311 ref https://github.com/cylc/cylc/pull/2311#issuecomment-305157438), this graph:
where family
NCM
has internal dependencies:results in a graph where all dependencies between internal family members and the outside graph are redundant:
Graphviz "transitive reduction" (also available via pygraphviz) can fix this:
tred foo.dot > foo-tred.dot
:It would be good to do this in Cylc. To get rid of redundant prerequisites as well as simplify the graph we should generate the pygraphviz graph structure early on, from the raw Cylc graph string, and then - after transitive reduction - use that to generate task prerequisites.