generators output
This commit is contained in:
		
							
								
								
									
										8
									
								
								bitvec.h
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								bitvec.h
									
									
									
									
									
								
							@@ -176,7 +176,7 @@ static inline int bv_next_zero(const bitvec_t *x, int start)
 | 
			
		||||
      return i*BLOCKSIZE + position - 1;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return BV_QWORD_RANK; // found nothing
 | 
			
		||||
  return BV_QWORD_RANK*BLOCKSIZE; // found nothing
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void bv_copy(const bitvec_t *from, bitvec_t *to)
 | 
			
		||||
@@ -185,4 +185,10 @@ static inline void bv_copy(const bitvec_t *from, bitvec_t *to)
 | 
			
		||||
    to->v[i] = from->v[i];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void bv_negate(const bitvec_t *from, bitvec_t *to)
 | 
			
		||||
{
 | 
			
		||||
  for(int i = 0; i < BV_QWORD_RANK; i++)
 | 
			
		||||
    to->v[i] = ~from->v[i];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* __BITVEC_H__ */
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										49
									
								
								enumerate.c
									
									
									
									
									
								
							
							
						
						
									
										49
									
								
								enumerate.c
									
									
									
									
									
								
							@@ -52,12 +52,12 @@ int shorten(int i, unsigned long left, unsigned long right, doublequotient_t *dq
 | 
			
		||||
}
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void balanced_thickening_callback(const bitvec_t *pos, int size, void *data)
 | 
			
		||||
void balanced_thickening_callback(const bitvec_t *pos, int size, const enumeration_info_t *ei)
 | 
			
		||||
{
 | 
			
		||||
  static long totcount = 0;
 | 
			
		||||
 | 
			
		||||
  if(data) {
 | 
			
		||||
    info_t *info = (info_t*)data;
 | 
			
		||||
  if(ei->callback_data) {
 | 
			
		||||
    info_t *info = (info_t*)ei->callback_data;
 | 
			
		||||
 | 
			
		||||
    unsigned long right_invariance = FIRSTBITS(info->rank);
 | 
			
		||||
    unsigned long left_invariance = FIRSTBITS(info->rank);
 | 
			
		||||
@@ -86,8 +86,36 @@ void balanced_thickening_callback(const bitvec_t *pos, int size, void *data)
 | 
			
		||||
      printf("%c", right_invariance & (1 << j) ? j + 'a' : ' ');
 | 
			
		||||
 | 
			
		||||
    if(info->buffer) {
 | 
			
		||||
      printf(" set: ");
 | 
			
		||||
      bv_print(stdout, pos, size/2);
 | 
			
		||||
      bitvec_t low, high;
 | 
			
		||||
      bv_copy(pos, &low);
 | 
			
		||||
      bv_negate(pos, &high);
 | 
			
		||||
 | 
			
		||||
      //      printf(" set: ");
 | 
			
		||||
      //      bv_print(stdout, &low, size/2);
 | 
			
		||||
      //      printf(" ");
 | 
			
		||||
      //      bv_print(stdout, &high, size/2);
 | 
			
		||||
 | 
			
		||||
      printf(" gen: ");
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
      for(int i = 0; i < size/2; i++) {
 | 
			
		||||
	if(!bv_get_bit(&high, i))
 | 
			
		||||
	  continue;
 | 
			
		||||
 | 
			
		||||
	printf("%s ", alphabetize(info->dq->cosets[size-1-i].min, stringbuffer));
 | 
			
		||||
 | 
			
		||||
	bv_difference(&high, &ei->principal_neg[size-1-i], &high);
 | 
			
		||||
	bv_difference(&low,  &ei->principal_pos[size-1-i], &low);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      for(int i = size/2 - 1; i >= 0; i--) {
 | 
			
		||||
	if(!bv_get_bit(&low, i))
 | 
			
		||||
	  continue;
 | 
			
		||||
 | 
			
		||||
	printf("%s ", alphabetize(info->dq->cosets[i].min, stringbuffer));
 | 
			
		||||
 | 
			
		||||
	bv_difference(&low, &ei->principal_pos[i], &low);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    int max_length = 0;
 | 
			
		||||
@@ -100,7 +128,7 @@ void balanced_thickening_callback(const bitvec_t *pos, int size, void *data)
 | 
			
		||||
	  max_length = info->dq->cosets[size-i-1].max->wordlength;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    printf(" max length: %d", max_length);
 | 
			
		||||
    //    printf(" max length: %d", max_length);
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
    if(info->buffer) {
 | 
			
		||||
@@ -164,9 +192,9 @@ void balanced_thickening_callback(const bitvec_t *pos, int size, void *data)
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void balanced_thickening_simple_callback(const bitvec_t *pos, int size, void *data)
 | 
			
		||||
void balanced_thickening_simple_callback(const bitvec_t *pos, int size, const enumeration_info_t *ei)
 | 
			
		||||
{
 | 
			
		||||
  long *count = (long*)data;
 | 
			
		||||
  long *count = (long*)ei->callback_data;
 | 
			
		||||
 | 
			
		||||
  if((++(*count)) % 100000000 == 0) {
 | 
			
		||||
    bv_print(stderr, pos, size/2);
 | 
			
		||||
@@ -259,7 +287,8 @@ int main(int argc, const char *argv[])
 | 
			
		||||
	printf("\n");
 | 
			
		||||
	wl = dq->cosets[i].min->wordlength;
 | 
			
		||||
      }
 | 
			
		||||
      fprintf(stdout, "%s(%d) ", alphabetize(dq->cosets[i].min, stringbuffer), dq->cosets[i].max->wordlength);
 | 
			
		||||
      //      fprintf(stdout, "%s(%d) ", alphabetize(dq->cosets[i].min, stringbuffer), dq->cosets[i].max->wordlength);
 | 
			
		||||
      fprintf(stdout, "%s ", alphabetize(dq->cosets[i].min, stringbuffer));
 | 
			
		||||
    }
 | 
			
		||||
    fprintf(stdout, "\n\n");
 | 
			
		||||
  }
 | 
			
		||||
@@ -289,7 +318,7 @@ int main(int argc, const char *argv[])
 | 
			
		||||
    if(dq->cosets[i].opposite == &dq->cosets[i]) {
 | 
			
		||||
      if(output_level >= 1) {
 | 
			
		||||
	if(fixpoints == 0)
 | 
			
		||||
	  fprintf(stdout, "No thickenings since the longest element fixes the following cosets:");
 | 
			
		||||
	  fprintf(stdout, "No balanced ideals since the longest element fixes the following cosets:");
 | 
			
		||||
	fprintf(stdout, " %s", alphabetize(dq->cosets[i].min, stringbuffer));
 | 
			
		||||
      }
 | 
			
		||||
      fixpoints++;
 | 
			
		||||
 
 | 
			
		||||
@@ -8,15 +8,6 @@
 | 
			
		||||
#include "weyl.h"
 | 
			
		||||
#include "queue.h"
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
  int size;        // the size of the weyl group. We store however only the first size/2 elements
 | 
			
		||||
  bitvec_t *principal_pos;
 | 
			
		||||
  bitvec_t *principal_neg;
 | 
			
		||||
  int *principal_is_slim;
 | 
			
		||||
  void (*callback)(const bitvec_t *, int, void*);
 | 
			
		||||
  void *callback_data;
 | 
			
		||||
} enumeration_info_t;
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  This function enumerates all balanced ideals satisfying certain constraints, given by its arguments pos, neg and next_neg
 | 
			
		||||
 | 
			
		||||
@@ -71,7 +62,7 @@ static long enumerate_tree(const enumeration_info_t *info, const bitvec_t *pos,
 | 
			
		||||
  if(next_next_neg >= info->size/2) {
 | 
			
		||||
    // there is no unknown left, so we found a balanced ideal
 | 
			
		||||
    if(info->callback)
 | 
			
		||||
      info->callback(&newpos, info->size, info->callback_data);
 | 
			
		||||
      info->callback(&newpos, info->size, info);
 | 
			
		||||
    return 1;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -154,7 +145,7 @@ static void generate_principal_ideals(doublequotient_t *dq, bitvec_t *pos, bitve
 | 
			
		||||
   returns the number of balanced ideals
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
long enumerate_balanced_thickenings(doublequotient_t *dq, void (*callback) (const bitvec_t *, int, void*), void *callback_data)
 | 
			
		||||
long enumerate_balanced_thickenings(doublequotient_t *dq, enumeration_callback callback, void *callback_data)
 | 
			
		||||
{
 | 
			
		||||
  long count = 0;
 | 
			
		||||
  enumeration_info_t info;
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,19 @@
 | 
			
		||||
 | 
			
		||||
#define DEBUG(msg, ...) do{fprintf(stderr, msg, ##__VA_ARGS__); }while(0)
 | 
			
		||||
 | 
			
		||||
struct enumeration_info {
 | 
			
		||||
  int size;        // the size of the weyl group. We store however only the first size/2 elements
 | 
			
		||||
  bitvec_t *principal_pos;
 | 
			
		||||
  bitvec_t *principal_neg;
 | 
			
		||||
  int *principal_is_slim;
 | 
			
		||||
  void (*callback)(const bitvec_t *, int, const struct enumeration_info *);
 | 
			
		||||
  void *callback_data;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef void (*enumeration_callback)(const bitvec_t *, int, const struct enumeration_info *);
 | 
			
		||||
typedef struct enumeration_info enumeration_info_t;
 | 
			
		||||
 | 
			
		||||
// enumerating balanced thickenings
 | 
			
		||||
long enumerate_balanced_thickenings(doublequotient_t *dq, void (*callback) (const bitvec_t *, int, void*), void *callback_data);
 | 
			
		||||
long enumerate_balanced_thickenings(doublequotient_t *dq, enumeration_callback callback, void *callback_data);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user