|
|
1.1 ! root 1: #include "draw_dag.h" ! 2: ! 3: #include <sys/types.h> ! 4: #include <sys/times.h> ! 5: #define TIC 60 ! 6: ! 7: int N_real_nodes, // actual number of input nodes ! 8: N_nodes, // number of nodes at various phases ! 9: N_edges, // total number of edges ! 10: N_self_edges, // # of loops detected ! 11: N_flat_edges, // # of edges whose ends are at the same level ! 12: N_repeat_edges, // # of multi-edges deleted ! 13: N_revert_edges, // # of edges whose direction is reverted ! 14: N_component; // # of connected components ! 15: edge_t **Inedges, // in-edges for each node ! 16: **Outedges, // out-edges ! 17: **Noedges, // self-edges and flat edges ! 18: **Istems, // stem edges ! 19: **Ostems; ! 20: int *Stems; ! 21: int *Root, // space to store union trees of vertices at same ranks ! 22: *Component, // connected component numbers ! 23: *Invert, // inversion of nodes in their ranks ! 24: *Level, // level assignment of nodes ! 25: Maxlevel, // maximum level assigned to any node ! 26: *N_level, // number of nodes at each level ! 27: **Rank; // array of ordered lists of nodes ! 28: int *Nodepos, // node positions ! 29: *Deleted, // virtual nodes that were deleted ! 30: *Width, // widths of nodes ! 31: Nodesep, // minimum separation between nodes ! 32: *Height, // height of nodes ! 33: Levelsep, // separation between levels ! 34: *Levelheight, // height of layers ! 35: *Levelpos; // position of levels ! 36: ! 37: int Xbound,Ybound; // if "fill" then size of box to fill, else 0 ! 38: ! 39: int Verbose; // say lots of things ! 40: ! 41: /* ! 42: Draw any directed graphs. ! 43: This function works best with directed acyclic graphs. ! 44: Cycles are broken using a depth-first search. ! 45: */ ! 46: ! 47: void draw_dag(int n_nodes, node_t **nodes, edge_t **edges, options_t options) ! 48: { ! 49: struct tms begtm, endtm; ! 50: Verbose = options.verbose; ! 51: ! 52: if(options.verbose) ! 53: { ! 54: #ifndef TIMING ! 55: fprintf(stderr,"Start graph drawing\n"); ! 56: #endif ! 57: times(&begtm); ! 58: } ! 59: ! 60: // Create Inedges[], Outedges[], Width[], N_nodes, and N_edges ! 61: dag_start(n_nodes,nodes,edges,options); ! 62: ! 63: // remove stem edges ! 64: if(N_flat_edges <= 0) ! 65: dag_delstem(); ! 66: ! 67: // Create Level[], Maxlevel ! 68: int *srcs = options.source_nodes; ! 69: int source = (srcs && srcs[0] != -1) ? Root[srcs[0]] : -1; ! 70: int *sinks = options.sink_nodes; ! 71: int sink = (sinks && sinks[0] != -1) ? Root[sinks[0]] : -1; ! 72: if(sink == source) ! 73: sink = -1; ! 74: int **same = options.same_nodes; ! 75: dag_levels(source,sink,same ? 1 : 0); ! 76: ! 77: // Make long edges into short edges by inserting dummy nodes ! 78: dag_unitedges(); ! 79: ! 80: // Create N_level[], Rank[][] ! 81: dag_ranks(); ! 82: ! 83: // reinsert stems ! 84: if(N_flat_edges <= 0) ! 85: dag_insstem(); ! 86: ! 87: // Create Positions[], Maxpos ! 88: dag_positions(options.ranksep,!options.quick); ! 89: ! 90: // Create splines ! 91: dag_spline(); ! 92: ! 93: // Return values to user ! 94: dag_end(nodes,edges); ! 95: ! 96: if(Verbose) ! 97: { ! 98: times(&endtm); ! 99: int total = (endtm.tms_utime-begtm.tms_utime) + ! 100: (endtm.tms_stime-begtm.tms_stime); ! 101: int percent = (total - (total/TIC)*TIC)*100/TIC; ! 102: #ifdef TIMING ! 103: fprintf(stderr,"%d.%02d\n",total/TIC, percent); ! 104: #else ! 105: fprintf(stderr,"Total time in graph drawing: %d.%02ds\n", ! 106: total/TIC, percent); ! 107: #endif ! 108: } ! 109: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.