Results seem sensible
This commit is contained in:
128
thickenings.c
128
thickenings.c
@@ -91,12 +91,10 @@ void prepare_graph(semisimple_type_t type, node_t *graph)
|
||||
graph[i].is_hyperplane_reflection = 0;
|
||||
}
|
||||
|
||||
// get coxeter graph
|
||||
LOG("Generate Weyl group.\n");
|
||||
|
||||
weyl_generate(type, graph_data);
|
||||
|
||||
fprintf(stderr, "Weyl group generated.\n");
|
||||
|
||||
for(int i = 0; i < order; i++)
|
||||
for(int j = 0; j < rank; j++) {
|
||||
graph_unsorted[i].left = graph_data[i].left;
|
||||
@@ -105,6 +103,8 @@ void prepare_graph(semisimple_type_t type, node_t *graph)
|
||||
|
||||
// find wordlengths
|
||||
|
||||
LOG("Determine word lengths.\n");
|
||||
|
||||
graph_unsorted[0].wordlength = 0;
|
||||
queue_init(&queue);
|
||||
queue_put(&queue, 0);
|
||||
@@ -118,9 +118,7 @@ void prepare_graph(semisimple_type_t type, node_t *graph)
|
||||
}
|
||||
}
|
||||
|
||||
fprintf(stderr, "Wordlengths calculated.\n");
|
||||
|
||||
// sort by wordlength
|
||||
LOG("Sort by wordlength.\n");
|
||||
|
||||
for(int i = 0; i < order; i++)
|
||||
ordering[i] = i;
|
||||
@@ -135,9 +133,7 @@ void prepare_graph(semisimple_type_t type, node_t *graph)
|
||||
graph[i].left[j] = reverse_ordering[graph_unsorted[ordering[i]].left[j]]; // rewrite references
|
||||
}
|
||||
|
||||
fprintf(stderr, "Sorted by wordlength.\n");
|
||||
|
||||
// find words
|
||||
LOG("Find shortest words.\n");
|
||||
|
||||
for(int i = 0; i < order; i++)
|
||||
memset(graph[i].word, 0, hyperplanes*sizeof(int));
|
||||
@@ -154,9 +150,7 @@ void prepare_graph(semisimple_type_t type, node_t *graph)
|
||||
}
|
||||
}
|
||||
|
||||
fprintf(stderr, "Shortest words found.\n");
|
||||
|
||||
// generate right edges
|
||||
LOG("Generate right edges.\n");
|
||||
|
||||
for(int i = 0; i < order; i++) {
|
||||
for(int j = 0; j < rank; j++) {
|
||||
@@ -168,9 +162,7 @@ void prepare_graph(semisimple_type_t type, node_t *graph)
|
||||
}
|
||||
}
|
||||
|
||||
fprintf(stderr, "Right edges generated.\n");
|
||||
|
||||
// find opposites
|
||||
LOG("Find opposites.\n");
|
||||
|
||||
node_t *longest = &graph[order-1];
|
||||
for(int i = 0; i < order; i++) {
|
||||
@@ -180,9 +172,7 @@ void prepare_graph(semisimple_type_t type, node_t *graph)
|
||||
graph[i].opposite = current;
|
||||
}
|
||||
|
||||
fprintf(stderr, "Opposites found.\n");
|
||||
|
||||
// enumerate hyperplanes
|
||||
LOG("Enumerate hyperplanes.\n");
|
||||
|
||||
hyperplane_count = 0;
|
||||
for(int i = 0; i < order; i++) {
|
||||
@@ -203,9 +193,7 @@ void prepare_graph(semisimple_type_t type, node_t *graph)
|
||||
}
|
||||
}
|
||||
|
||||
fprintf(stderr, "Hyperplanes enumerated.\n");
|
||||
|
||||
// generate folding order
|
||||
LOG("Determine Bruhat order.\n");
|
||||
|
||||
edgelist_count = 0;
|
||||
for(int i = 0; i < order; i++) {
|
||||
@@ -229,9 +217,7 @@ void prepare_graph(semisimple_type_t type, node_t *graph)
|
||||
}
|
||||
}
|
||||
|
||||
fprintf(stderr, "Bruhat order generated.\n");
|
||||
|
||||
// remove redundant edges
|
||||
LOG("Perform transitive reduction.\n");
|
||||
|
||||
for(int i = 0; i < order; i++) {
|
||||
memset(seen, 0, order*sizeof(int));
|
||||
@@ -272,9 +258,7 @@ void prepare_graph(semisimple_type_t type, node_t *graph)
|
||||
}
|
||||
}
|
||||
|
||||
fprintf(stderr, "Redundant edges removed.\n");
|
||||
|
||||
// reverse folding order
|
||||
LOG("Revert Bruhat order.\n");
|
||||
|
||||
edgelist_count = 0;
|
||||
for(int i = 0; i < order; i++) {
|
||||
@@ -288,7 +272,7 @@ void prepare_graph(semisimple_type_t type, node_t *graph)
|
||||
}
|
||||
}
|
||||
|
||||
fprintf(stderr, "Bruhat order reversed.\n");
|
||||
LOG("Sort opposites.\n");
|
||||
|
||||
// additional sorting step to force opposite property (opposite of j is at n - j - 1)
|
||||
|
||||
@@ -373,7 +357,7 @@ int prepare_simplified_graph(semisimple_type_t type, unsigned long left, unsigne
|
||||
full_graph = graph_alloc(type);
|
||||
prepare_graph(type, full_graph);
|
||||
|
||||
fprintf(stderr, "Full graph generated.\n");
|
||||
LOG("Full graph generated.\n");
|
||||
|
||||
// initialize stuff
|
||||
|
||||
@@ -385,6 +369,8 @@ int prepare_simplified_graph(semisimple_type_t type, unsigned long left, unsigne
|
||||
reduced[i] = i;
|
||||
}
|
||||
|
||||
LOG("Group by double coset.\n");
|
||||
|
||||
// step 1: group
|
||||
for(int i = 0; i < order; i++) {
|
||||
if(group[i] != -1)
|
||||
@@ -406,6 +392,8 @@ int prepare_simplified_graph(semisimple_type_t type, unsigned long left, unsigne
|
||||
}
|
||||
}
|
||||
|
||||
LOG("Find minimal length elements.\n");
|
||||
|
||||
// step 2: find minimum
|
||||
for(int i = 0; i < order; i++)
|
||||
if(full_graph[i].wordlength < full_graph[reduced[group[i]]].wordlength)
|
||||
@@ -424,12 +412,11 @@ int prepare_simplified_graph(semisimple_type_t type, unsigned long left, unsigne
|
||||
for(int i = 0; i < order; i++)
|
||||
simplified[i] = simplified[reduced[i]];
|
||||
|
||||
// fprintf(stderr, "Number of double cosets: %d\n\n", ncosets);
|
||||
|
||||
// simplified_graph = (node_t*) malloc(ncosets*sizeof(node_t));
|
||||
seen = (int*) malloc(ncosets*sizeof(int));
|
||||
edgelists_used = 0;
|
||||
|
||||
LOG("Copy minimal elements.\n");
|
||||
|
||||
// step 5: set up nodes from minima
|
||||
current = 0;
|
||||
for(int i = 0; i < order; i++)
|
||||
@@ -445,6 +432,8 @@ int prepare_simplified_graph(semisimple_type_t type, unsigned long left, unsigne
|
||||
}
|
||||
}
|
||||
|
||||
LOG("Find induced order.\n");
|
||||
|
||||
// step 6: find order relations
|
||||
for(int i = 0; i < order; i++) {
|
||||
edge = full_graph[i].bruhat_lower;
|
||||
@@ -461,6 +450,8 @@ int prepare_simplified_graph(semisimple_type_t type, unsigned long left, unsigne
|
||||
}
|
||||
}
|
||||
|
||||
LOG("Perform transitive reduction.\n");
|
||||
|
||||
// step 7: remove redundant edges
|
||||
for(int i = 0; i < ncosets; i++) {
|
||||
memset(seen, 0, ncosets*sizeof(int));
|
||||
@@ -477,7 +468,6 @@ int prepare_simplified_graph(semisimple_type_t type, unsigned long left, unsigne
|
||||
previous = edge;
|
||||
} else if(seen[edge->to]) {
|
||||
// this edge is redundant, remove it
|
||||
// fprintf(stderr, "removing edge from %d to %d\n", i, edge->to);
|
||||
if(previous)
|
||||
previous->next = edge->next;
|
||||
else
|
||||
@@ -505,6 +495,8 @@ int prepare_simplified_graph(semisimple_type_t type, unsigned long left, unsigne
|
||||
}
|
||||
}
|
||||
|
||||
LOG("Revert order.\n");
|
||||
|
||||
// step 8: revert order
|
||||
edgelists_used = 0;
|
||||
for(int i = 0; i < ncosets; i++) {
|
||||
@@ -517,33 +509,57 @@ int prepare_simplified_graph(semisimple_type_t type, unsigned long left, unsigne
|
||||
}
|
||||
}
|
||||
|
||||
// output as graphviz dot file
|
||||
/*
|
||||
fprintf(stdout, "difull_graph test123 {\n");
|
||||
for(int i = 0; i < ncosets; i++) {
|
||||
edge = simplified_graph[i].bruhat_lower;
|
||||
while(edge) {
|
||||
fprintf(stdout, "%s -> %s;\n",
|
||||
alphabetize(simplified_graph[i].word, simplified_graph[i].wordlength, alphabet, buffer),
|
||||
alphabetize(simplified_graph[edge->to].word, simplified_graph[edge->to].wordlength, alphabet, buffer2));
|
||||
LOG("Sort opposites.\n");
|
||||
|
||||
edge = edge->next;
|
||||
int *ordering = (int*)malloc(ncosets*sizeof(int));
|
||||
int *reverse_ordering = (int*)malloc(ncosets*sizeof(int));
|
||||
node_t *unsorted = (node_t*)malloc(ncosets*sizeof(node_t));
|
||||
int opp, pos;
|
||||
|
||||
pos = 0;
|
||||
for(int i = 0; i < ncosets; i++) { // first all the pairs
|
||||
opp = simplified_graph[i].opposite;
|
||||
if(opp > i) { // first occurrence of this pair
|
||||
ordering[pos] = i;
|
||||
ordering[ncosets-1-pos] = opp;
|
||||
reverse_ordering[i] = pos;
|
||||
reverse_ordering[opp] = ncosets-1-pos;
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
fprintf(stdout, "}\n"); */
|
||||
for(int i = 0; i < ncosets; i++) // and finally the self-opposites
|
||||
if(simplified_graph[i].opposite == i) {
|
||||
ordering[pos] = i;
|
||||
reverse_ordering[i] = pos;
|
||||
pos++;
|
||||
}
|
||||
|
||||
// some output
|
||||
/* for(int i = 0; i < ncosets; i++)
|
||||
fprintf(stderr, "%s <=> %s\n", simplified_graph[i].wordlength == 0 ? "1" : alphabetize(simplified_graph[i].word, simplified_graph[i].wordlength, alphabet, buffer), simplified_graph[simplified_graph[i].opposite].wordlength == 0 ? "1" : alphabetize(simplified_graph[simplified_graph[i].opposite].word, simplified_graph[simplified_graph[i].opposite].wordlength, alphabet, buffer2)); */
|
||||
|
||||
// fprintf(stderr, "\nAdded %d edges.\n\n", edgelists_used);
|
||||
// now really do it
|
||||
memcpy(unsorted, simplified_graph, ncosets*sizeof(node_t));
|
||||
for(int i = 0; i < ncosets; i++) {
|
||||
simplified_graph[i] = unsorted[ordering[i]];
|
||||
simplified_graph[i].opposite = reverse_ordering[simplified_graph[i].opposite];
|
||||
for(edgelist_t *edge = simplified_graph[i].bruhat_lower; edge != (edgelist_t*)0; edge = edge->next)
|
||||
edge->to = reverse_ordering[edge->to];
|
||||
for(edgelist_t *edge = simplified_graph[i].bruhat_higher; edge != (edgelist_t*)0; edge = edge->next)
|
||||
edge->to = reverse_ordering[edge->to];
|
||||
for(int j = 0; j < rank; j++) {
|
||||
simplified_graph[i].left[j] = reverse_ordering[simplified_graph[i].left[j]];
|
||||
simplified_graph[i].right[j] = reverse_ordering[simplified_graph[i].right[j]];
|
||||
}
|
||||
}
|
||||
|
||||
free(ordering);
|
||||
free(reverse_ordering);
|
||||
free(unsorted);
|
||||
free(seen);
|
||||
free(reduced);
|
||||
free(group);
|
||||
free(simplified);
|
||||
graph_free(type, full_graph);
|
||||
|
||||
LOG("Simplified graph generated.\n");
|
||||
|
||||
return ncosets;
|
||||
}
|
||||
|
||||
@@ -637,6 +653,11 @@ static long enumerate_tree(const enumeration_info_t *info, const bitvec_t *pos,
|
||||
// everything before next_neg which was unknown should be set to positive; to speed this up, we can start with already_known
|
||||
bv_set_range_except(&newpos, neg, already_known, next_neg);
|
||||
|
||||
#ifdef _DEBUG
|
||||
bv_print_nice(stderr, &newpos, &newneg, -1, info->size/2);
|
||||
fprintf(stderr, "\n");
|
||||
#endif
|
||||
|
||||
// check if this leads to any conflicts (equivalently, violates slimness)
|
||||
if(!bv_disjoint(&newpos, &newneg))
|
||||
return 0;
|
||||
@@ -728,12 +749,15 @@ long enumerate_balanced_thickenings(node_t *graph, int size, void (*callback) (c
|
||||
}
|
||||
free(principal);
|
||||
|
||||
/*
|
||||
// output principal ideals
|
||||
#ifdef _DEBUG
|
||||
for(int i = 0; i < info.size; i++) {
|
||||
fprintf(stderr, "%d: ", i);
|
||||
fprintf(stderr, "%2d: ", i);
|
||||
bv_print_nice(stderr, &info.principal_pos[i], &info.principal_neg[i], -1, info.size/2);
|
||||
fprintf(stderr, "\n");
|
||||
} */
|
||||
}
|
||||
fprintf(stderr,"\n");
|
||||
#endif
|
||||
|
||||
// enumerate balanced ideals
|
||||
bitvec_t pos, neg;
|
||||
|
||||
Reference in New Issue
Block a user