static void add_edges(graph_info *g, unsigned start, int extended_m, level *my_level) { //setup m and k[n] for the children //note that these values will not change b/w each child //of this node in the search tree g->m++; g->k[g->n - 1]++; unsigned old_max_k = g->max_k; if(g->k[g->n - 1] > g->max_k) g->max_k = g->k[g->n - 1]; //if the child has a node of degree greater than MAX_K, //don't search it if(g->k[g->n - 1] <= my_level->max_k) { for(unsigned i = start; i < g->n - 1; i++) { g->k[i]++; //same as comment above if(g->k[i] <= my_level->max_k) { unsigned old_max_k = g->max_k; if(g->k[i] > g->max_k) g->max_k = g->k[i]; g->distances[g->n*i + (g->n-1)] = g->distances[g->n*(g->n-1) + i] = 1; ADDELEMENT(GRAPHROW(g->nauty_graph, i, extended_m), g->n-1); ADDELEMENT(GRAPHROW(g->nauty_graph, g->n-1, extended_m), i); add_edges(g, i + 1, extended_m, my_level); DELELEMENT(GRAPHROW(g->nauty_graph, i, extended_m), g->n-1); DELELEMENT(GRAPHROW(g->nauty_graph, g->n-1, extended_m), i); g->distances[g->n*i + (g->n-1)] = g->distances[g->n*(g->n-1) + i] = GRAPH_INFINITY; g->max_k = old_max_k; } g->k[i]--; } } //tear down values we created in the beginning g->max_k = old_max_k; g->m--; g->k[g->n - 1]--; if(g->k[g->n - 1] > 0) { graph_info *temporary = new_graph_info(*g); fill_dist_matrix(*temporary); temporary->diameter = calc_diameter(*temporary); temporary->sum_of_distances = calc_sum(*temporary); if(!add_graph_to_level(temporary, my_level)) graph_info_destroy(temporary); } }
void compl(graph *g, int m, int n, graph *h) /* h := complement of g */ { int i,j; setword *gi,*hi; #if MAXN set all[MAXM]; #else DYNALLSTAT(set,all,all_sz); DYNALLOC1(set,all,all_sz,m,"complg"); #endif EMPTYSET(all,m); for (i = 0; i < n; ++i) ADDELEMENT(all,i); gi = (setword*) g; hi = (setword*) h; for (i = 0; i < n; ++i) { for (j = 0; j < m; ++j) hi[j] = gi[j] ^ all[j]; DELELEMENT(hi,i); gi += m; hi += m; } }
static void newedge(graph *g1, int m1, int n1, int v1, int v2, int w1, int w2, graph *g2, int m2) /* Make g2 by subdividing edges v1-v2 and w1-w2 in g1 and adding an edge between them. Must have m2 >= m1. */ { int i,j; setword *s1,*s2; s1 = g1; s2 = g2; for (i = 0; i < n1; ++i) { for (j = 0; j < m1; ++j) *(s2++) = *(s1++); for (; j < m2; ++j) *(s2++) = 0; } s2 = GRAPHROW(g2,v1,m2); DELELEMENT(s2,v2); ADDELEMENT(s2,n1); s2 = GRAPHROW(g2,v2,m2); DELELEMENT(s2,v1); ADDELEMENT(s2,n1); s2 = GRAPHROW(g2,w1,m2); DELELEMENT(s2,w2); ADDELEMENT(s2,n1+1); s2 = GRAPHROW(g2,w2,m2); DELELEMENT(s2,w1); ADDELEMENT(s2,n1+1); s2 = GRAPHROW(g2,n1,m2); EMPTYSET(s2,m2); ADDELEMENT(s2,v1); ADDELEMENT(s2,v2); ADDELEMENT(s2,n1+1); s2 = GRAPHROW(g2,n1+1,m2); EMPTYSET(s2,m2); ADDELEMENT(s2,w1); ADDELEMENT(s2,w2); ADDELEMENT(s2,n1); }
void Nauty::deleteElement(int ix, int jx) { // Right now die if bad index. Can throw exception later assert(ix < n_ && jx < n_); set *gv = GRAPHROW(G_, ix, m_); if (ISELEMENT(gv, jx)) { DELELEMENT(gv, jx); } autoComputed_ = false; }