Levels
This commit is contained in:
		
							
								
								
									
										124
									
								
								thickenings.c
									
									
									
									
									
								
							
							
						
						
									
										124
									
								
								thickenings.c
									
									
									
									
									
								
							@@ -631,7 +631,7 @@ typedef struct {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static long enumerate_tree(const enumeration_info_t *info, const bitvec_t *pos, const bitvec_t *neg, int next_neg, int already_known)
 | 
					static long enumerate_tree(const enumeration_info_t *info, const bitvec_t *pos, const bitvec_t *neg, int next_neg, int already_known, int level)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  static long totcount = 0;
 | 
					  static long totcount = 0;
 | 
				
			||||||
  bitvec_t newpos, newneg, known;
 | 
					  bitvec_t newpos, newneg, known;
 | 
				
			||||||
@@ -676,13 +676,76 @@ static long enumerate_tree(const enumeration_info_t *info, const bitvec_t *pos,
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  do {
 | 
					  do {
 | 
				
			||||||
    count += enumerate_tree(info, &newpos, &newneg, next_next_neg, next_neg + 1);
 | 
					    count += enumerate_tree(info, &newpos, &newneg, next_next_neg, next_neg + 1, level + 1);
 | 
				
			||||||
    next_next_neg = bv_next_zero(&known, next_next_neg + 1);
 | 
					    next_next_neg = bv_next_zero(&known, next_next_neg + 1);
 | 
				
			||||||
  } while(next_next_neg <= info->size/2);
 | 
					  } while(next_next_neg <= info->size/2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // multiprocessing stuff
 | 
				
			||||||
 | 
					  //  if(level == 3)
 | 
				
			||||||
 | 
					  //    fprintf(stderr, "%d\n", count);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return count;
 | 
					  return count;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void generate_principal_ideals(node_t *graph, int size, bitvec_t *pos, bitvec_t *neg, int *is_slim)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  queue_t queue;
 | 
				
			||||||
 | 
					  int current;
 | 
				
			||||||
 | 
					  edgelist_t *edge;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // generate principal ideals
 | 
				
			||||||
 | 
					  int *principal = (int*)malloc(size*sizeof(int));
 | 
				
			||||||
 | 
					  for(int i = 0; i < size; i++) {
 | 
				
			||||||
 | 
					    memset(principal, 0, size*sizeof(int));
 | 
				
			||||||
 | 
					    principal[i] = 1;
 | 
				
			||||||
 | 
					    queue_init(&queue);
 | 
				
			||||||
 | 
					    queue_put(&queue, i);
 | 
				
			||||||
 | 
					    while((current = queue_get(&queue)) != -1)
 | 
				
			||||||
 | 
					      for(edge = graph[current].bruhat_lower; edge; edge = edge->next)
 | 
				
			||||||
 | 
						if(!principal[edge->to]) {
 | 
				
			||||||
 | 
						  principal[edge->to] = 1;
 | 
				
			||||||
 | 
						  queue_put(&queue, edge->to);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // copy the first half into bitvectors
 | 
				
			||||||
 | 
					    bv_clear(&pos[i]);
 | 
				
			||||||
 | 
					    bv_clear(&neg[i]);
 | 
				
			||||||
 | 
					    is_slim[i] = 1;
 | 
				
			||||||
 | 
					    for(int j = 0; j < size/2; j++)
 | 
				
			||||||
 | 
					      if(principal[j])
 | 
				
			||||||
 | 
						bv_set_bit(&pos[i], j);
 | 
				
			||||||
 | 
					    for(int j = 0; j < size/2; j++)
 | 
				
			||||||
 | 
					      if(principal[size - 1 - j]) {
 | 
				
			||||||
 | 
						bv_set_bit(&neg[i], j);
 | 
				
			||||||
 | 
						if(bv_get_bit(&pos[i], j))
 | 
				
			||||||
 | 
						  is_slim[i] = 0;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef _DEBUG
 | 
				
			||||||
 | 
					    if(is_slim[i]) {
 | 
				
			||||||
 | 
					      fprintf(stderr, " ids: [0");
 | 
				
			||||||
 | 
					      for(int j = 1; j < size; j++)
 | 
				
			||||||
 | 
						if(principal[j])
 | 
				
			||||||
 | 
						  fprintf(stderr, ", %d", graph[j].id);
 | 
				
			||||||
 | 
					      fprintf(stderr, "]\n");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  free(principal);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // output principal ideals
 | 
				
			||||||
 | 
					#ifdef _DEBUG
 | 
				
			||||||
 | 
					  for(int i = 0; i < size; i++) {
 | 
				
			||||||
 | 
					    fprintf(stderr, "%2d: ", i);
 | 
				
			||||||
 | 
					    bv_print_nice(stderr, &pos[i], &neg[i], -1, size/2);
 | 
				
			||||||
 | 
					    fprintf(stderr, "\n");
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  fprintf(stderr,"\n");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
   enumerates all balanced ideals
 | 
					   enumerates all balanced ideals
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -696,12 +759,8 @@ static long enumerate_tree(const enumeration_info_t *info, const bitvec_t *pos,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
long enumerate_balanced_thickenings(node_t *graph, int size, void (*callback) (const bitvec_t *, int, void*), void *callback_data)
 | 
					long enumerate_balanced_thickenings(node_t *graph, int size, void (*callback) (const bitvec_t *, int, void*), void *callback_data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  signed char *level;
 | 
					 | 
				
			||||||
  long count = 0;
 | 
					  long count = 0;
 | 
				
			||||||
  enumeration_info_t info;
 | 
					  enumeration_info_t info;
 | 
				
			||||||
  queue_t queue;
 | 
					 | 
				
			||||||
  int current;
 | 
					 | 
				
			||||||
  edgelist_t *edge;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  info.size = size;
 | 
					  info.size = size;
 | 
				
			||||||
  info.callback = callback;
 | 
					  info.callback = callback;
 | 
				
			||||||
@@ -720,63 +779,14 @@ long enumerate_balanced_thickenings(node_t *graph, int size, void (*callback) (c
 | 
				
			|||||||
  if(info.size > 128*BV_QWORD_RANK)
 | 
					  if(info.size > 128*BV_QWORD_RANK)
 | 
				
			||||||
    return -1;
 | 
					    return -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // generate principal ideals
 | 
					  generate_principal_ideals(graph, size, info.principal_pos, info.principal_neg, info.principal_is_slim);
 | 
				
			||||||
  int *principal = (int*)malloc(info.size*sizeof(int));
 | 
					 | 
				
			||||||
  for(int i = 0; i < info.size; i++) {
 | 
					 | 
				
			||||||
    memset(principal, 0, info.size*sizeof(int));
 | 
					 | 
				
			||||||
    principal[i] = 1;
 | 
					 | 
				
			||||||
    queue_init(&queue);
 | 
					 | 
				
			||||||
    queue_put(&queue, i);
 | 
					 | 
				
			||||||
    while((current = queue_get(&queue)) != -1)
 | 
					 | 
				
			||||||
      for(edge = graph[current].bruhat_lower; edge; edge = edge->next)
 | 
					 | 
				
			||||||
	if(!principal[edge->to]) {
 | 
					 | 
				
			||||||
	  principal[edge->to] = 1;
 | 
					 | 
				
			||||||
	  queue_put(&queue, edge->to);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // copy the first half into bitvectors
 | 
					 | 
				
			||||||
    bv_clear(&info.principal_pos[i]);
 | 
					 | 
				
			||||||
    bv_clear(&info.principal_neg[i]);
 | 
					 | 
				
			||||||
    info.principal_is_slim[i] = 1;
 | 
					 | 
				
			||||||
    for(int j = 0; j < info.size/2; j++)
 | 
					 | 
				
			||||||
      if(principal[j])
 | 
					 | 
				
			||||||
	bv_set_bit(&info.principal_pos[i], j);
 | 
					 | 
				
			||||||
    for(int j = 0; j < info.size/2; j++)
 | 
					 | 
				
			||||||
      if(principal[info.size - 1 - j]) {
 | 
					 | 
				
			||||||
	bv_set_bit(&info.principal_neg[i], j);
 | 
					 | 
				
			||||||
	if(bv_get_bit(&info.principal_pos[i], j))
 | 
					 | 
				
			||||||
	  info.principal_is_slim[i] = 0;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef _DEBUG
 | 
					 | 
				
			||||||
    if(info.principal_is_slim[i]) {
 | 
					 | 
				
			||||||
      fprintf(stderr, " ids: [0");
 | 
					 | 
				
			||||||
      for(int j = 1; j < info.size; j++)
 | 
					 | 
				
			||||||
	if(principal[j])
 | 
					 | 
				
			||||||
	  fprintf(stderr, ", %d", graph[j].id);
 | 
					 | 
				
			||||||
      fprintf(stderr, "]\n");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  free(principal);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // output principal ideals
 | 
					 | 
				
			||||||
#ifdef _DEBUG
 | 
					 | 
				
			||||||
  for(int i = 0; i < info.size; 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
 | 
					  // enumerate balanced ideals
 | 
				
			||||||
  bitvec_t pos, neg;
 | 
					  bitvec_t pos, neg;
 | 
				
			||||||
  bv_clear(&pos);
 | 
					  bv_clear(&pos);
 | 
				
			||||||
  bv_clear(&neg);
 | 
					  bv_clear(&neg);
 | 
				
			||||||
  for(int i = 0; i <= info.size/2; i++)
 | 
					  for(int i = 0; i <= info.size/2; i++)
 | 
				
			||||||
    count += enumerate_tree(&info, &pos, &neg, i, 0);
 | 
					    count += enumerate_tree(&info, &pos, &neg, i, 0, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  free(info.principal_is_slim);
 | 
					  free(info.principal_is_slim);
 | 
				
			||||||
  free(info.principal_pos);
 | 
					  free(info.principal_pos);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user