Annotation of researchv10no/cmd/dag/dag_stem.c, revision 1.1.1.1

1.1       root        1: #include       "draw_dag.h"
                      2: 
                      3: 
                      4: // Merge all stems from the same node into a single one
                      5: // The width of the remaining node is appropriately widened while
                      6: // its height should be largest of the whole bunch.
                      7: 
                      8: void dag_delstem()
                      9: {
                     10:        Istems = new edge_t*[N_real_nodes];
                     11:        Ostems = new edge_t*[N_real_nodes];
                     12:        Stems = new int[N_real_nodes];
                     13: 
                     14:        int n_remove = 0;
                     15:        int n_retain = 0;
                     16:        for(int in = 0; in < 2; ++in)
                     17:        {
                     18:                edge_t **these = in ? Inedges : Outedges;
                     19:                edge_t **those = in ? Outedges : Inedges;
                     20:                edge_t **edges = in ? Istems : Ostems;
                     21:                for(int v = 0; v < N_real_nodes; ++v)
                     22:                {
                     23:                        // remove all stems from the edge list
                     24:                        edge_t *e, *elast, *stem;
                     25:                        edges[v] = NULL;
                     26:                        elast = NULL;
                     27:                        stem = NULL;
                     28:                        for(e = these[v]; e; e = elast ? elast->next : these[v])
                     29:                        {
                     30:                                if(these[e->node] || those[e->node]->next)
                     31:                                        elast = e;
                     32:                                else if(!stem)
                     33:                                {
                     34:                                        stem = e;
                     35:                                        elast = e;
                     36:                                        n_retain++;
                     37:                                }
                     38:                                else
                     39:                                {
                     40:                                        if(elast)
                     41:                                                elast->next = e->next;
                     42:                                        else    these[v] = e->next;
                     43:                                        e->next = edges[v];
                     44:                                        edges[v] = e;
                     45:                                        n_remove++;
                     46:                                }
                     47:                        }
                     48: 
                     49:                        if(edges[v])
                     50:                        {
                     51:                                // merge edges
                     52:                                int w = stem->node;
                     53:                                for(e = edges[v]; e; e = e->next)
                     54:                                {
                     55:                                        stem->count += e->count;
                     56:                                        stem->weight += e->weight;
                     57:                                        those[e->node] = NULL;
                     58:                                        Stems[e->node] = 1;
                     59:                                }
                     60:                                stem->link->count = stem->count;
                     61:                                stem->link->weight = stem->weight;
                     62:                                edges[v]->chain = stem;
                     63:                        }
                     64:                }
                     65:        }
                     66: }
                     67: 
                     68: 
                     69: // reinsert the stems
                     70: void dag_insstem()
                     71: {
                     72:        for(int down = 0; down < 2; ++down)
                     73:        {
                     74:                edge_t **edges = down ? Ostems : Istems;
                     75:                edge_t **these = down ? Outedges : Inedges;
                     76:                edge_t **those = down ? Inedges : Outedges;
                     77:                for(int v = 0; v < N_real_nodes; ++v)
                     78:                {
                     79:                        if(!edges[v])
                     80:                                continue;
                     81: 
                     82:                        // our representative
                     83:                        edge_t *stem = edges[v]->chain;
                     84:                        edges[v]->chain = NULL;
                     85: 
                     86:                        // number of friends
                     87:                        int n_edges = 0;
                     88:                        for(edge_t *e = edges[v]; e; e = e->next)
                     89:                                n_edges += 1;
                     90: 
                     91:                        // insert the nodes in the rank listing
                     92:                        int w = stem->node;
                     93:                        int *rank = Rank[Level[w]];
                     94:                        for(int n_rank = 0; rank[n_rank] != -1; ++n_rank)
                     95:                                ;
                     96:                        rank[n_rank+n_edges] = -1;
                     97:                        int pos = Invert[stem->node];
                     98:                        for(int i = n_rank+n_edges-1; i > pos+n_edges; --i)
                     99:                        {
                    100:                                rank[i] = rank[i-n_edges];
                    101:                                Invert[rank[i]] = i;
                    102:                        }
                    103: 
                    104:                        edge_t *elast;
                    105:                        for(e = edges[v], i = pos+1; e; i++, elast = e, e = e->next)
                    106:                        {
                    107:                                int n = e->node;
                    108:                                those[n] = e->link;
                    109:                                stem->count -= e->count;
                    110:                                stem->weight -= e->weight;
                    111:                                Component[n] = Component[w];
                    112:                                rank[i] = n;
                    113:                                Invert[n] = i;
                    114:                        }
                    115:                        stem->link->count = stem->count;
                    116:                        stem->link->weight = stem->weight;
                    117: 
                    118:                        // put these edges back in the proper edge list
                    119:                        elast->next = these[v];
                    120:                        these[v] = edges[v];
                    121:                        edges[v] = NULL;
                    122:                }
                    123:        }
                    124: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.