Example #1
0
void csa_text_lf(uchar *p,CSA *csa, pos_t s, pos_t t)
{
  i64 i;
  i64 j,c;

#if DEBUG
  if (s < 1 || t > csa->n || s > t) {
	  printf("csa_text: out of range [%d,%d] n=%d\n",s,t,csa->n);
  }
#endif
//  lf = (lf_dna *)csa->psi_struc;

  i = csa->inverse(csa,(t+1));
  for (j=t-s; j>=0; j--) {
//    printf("rank %ld\n",i);
    c = csa->BW(csa,i);
    if (c == -1) {
      printf("csa_text_lf: ??? j = %ld i = %ld c = %ld  s=%ld t=%ld \n",
              j,i,c,s,t);
      exit(1);
    }
//    p[j] = c;
    putuint(p, j, c, csa->k2);
    i = csa->LF(csa,i);
  }
}
Example #2
0
static PyObject *sendPacket(PyObject *self, PyObject *args)
{
    
    int goodcn = -1;
    
    packetbuf p(MAXTRANS,ENET_PACKET_FLAG_RELIABLE);
    putint(p, N_CLIENT);
	std::cout<<"N_CLIENT ";
    
    loopv(server::clients) {
        int cn = server::clients[i]->clientnum;
        if(goodcn < 0) goodcn = cn; // find a good cn
    }
    
    putint(p, goodcn);
    std::cout<<goodcn<<" ";
    
    putuint(p, (((unsigned int)PyTuple_Size(args)))*2);
    std::cout<<(((unsigned int)PyTuple_Size(args))*2)<<" [ ";
    
    for(Py_ssize_t i=0;i<PyTuple_Size(args);i++)
    {
        int data=PyInt_AsLong(PyTuple_GetItem(args,i));
        std::cout<<data<<" ";
        putint(p, data);
    }
            
    sendpacket(-1, 1, p.finalize(), -1);
    std::cout<<"- sent\n";
    
    Py_INCREF(Py_None);
    return Py_None;
}
Example #3
0
///////////////////////////////////////////
//  i64 csa_substring(uchar *p,CSA *csa,rank_t r,i64 len)
//    extracts substring [s,s+len-1] into the buffer p using psi
//    and returns its length
//    length is shorter than len if (s+len-1 > n)
//    where s = SA[r]
///////////////////////////////////////////
i64 csa_substring(uchar *p,CSA *csa,rank_t r,i64 len)
{
  i64 i;
  i = 0;
  while (i < len) {
    if (r == 0) {
//      *p++ = 0; // $
      putuint(p, i, 0, csa->k2);
      break;
    }
//    *p++ = csa->T(csa,r);
    putuint(p, i, csa->T(csa,r), csa->k2);
    r = csa->psi(csa,r);
    i++;
  }
  return i;
}
Example #4
0
i64 csa_substring_lf_naive(uchar *p,CSA *csa,rank_t r,i64 len)
{
  i64 i;
  int c;

//  p += len;

  i = 0;
  while (i < len) {
//    r = csa_BW_LF_by_psi(csa,r, &c);
    r = csa->BW_LF(csa,r, &c);
    if (c == -1) {
//      *--p = 0; // $
      putuint(p, len-1-i, 0, csa->k2);
      break;
    }
//    *--p = c;
    putuint(p, len-1-i, c, csa->k2);
    i++;
  }
  return i;
}
Example #5
0
///////////////////////////////////////////
//  i64 csa_substring_lf(uchar *p,CSA *csa,rank_t r,i64 len)
//    extracts substring [s-len,s-1] into the buffer p[0,len-1] using BW
//    where s = SA[r]
///////////////////////////////////////////
i64 csa_substring_lf(uchar *p,CSA *csa,rank_t r,i64 len)
{
  i64 i,r2;
  int c;

//  p += len;

  i = 0;
  while (i < len) {
    c = csa->BW_rank(csa,r,&r2);
    if (c == -1) {
//      *--p = 0; // $
      putuint(p, len-1-i, 0, csa->k2);
      break;
    }
//    *--p = c;
    putuint(p, len-1-i, c, csa->k2);
    r = csa->K[csa->CtoA[c]+1]-1 + r2;
    i++;
  }
  return i;
}
Example #6
0
///////////////////////////////////////////
//  i64 csa_search_r(i64 keylen,int c, CSA *csa,rank_t *li,rank_t *ri)
//    returns the length of the longest suffix of key:c
//      where key is the substring of length keylen represented by range [*li, *ri]
//    returned [*li, *ri] is the range of key:c
///////////////////////////////////////////
i64 csa_search_r(i64 keylen, int c, CSA *csa,rank_t *li,rank_t *ri)
{
  uchar *substr;
  i64 ret;

  substr = mymalloc((keylen+1)*csa->k2);

  csa->substring(substr, csa, *li, keylen);
//  substr[keylen] = c;
  putuint(substr, keylen, c, csa->k2);

  ret = csa->search(substr, keylen+1, csa, li, ri);

  myfree(substr,(keylen+1)*csa->k2);

  return ret;
}
Example #7
0
///////////////////////////////////////////
//  int csa_child_r(CSA *csa,i64 len,rank_t l,rank_t r,uchar *tail,rank_t *ll,rank_t *rr)
//    returns the number of characters following suffixes [l,r]
//  tail stores the list of following characters
//  ll and rr store ranges for the following characters
//  lengths of head, ll, and rr must be at least csa->m (#distinct characters)
///////////////////////////////////////////
int csa_child_r(CSA *csa, i64 len, rank_t l, rank_t r, uchar *tail, rank_t *ll, rank_t *rr)
{
  int i,c,num;
  int sigma;

  uchar *substr;

  rank_t *ltmp, *rtmp;
  uchar *tailtmp;
  int *hc;

  sigma = csa->sigma;

  substr = mymalloc((len+1)*csa->k2);
  csa->substring(substr, csa, l, len);

  tailtmp = mymalloc(sigma * sizeof(*tailtmp) * csa->k2);
  ltmp = mymalloc(sigma * sizeof(*ltmp));
  rtmp = mymalloc(sigma * sizeof(*ltmp));
  hc = mymalloc(sigma * sizeof(*hc));

  num = csa_child_r_sub(csa, len, l, r, 0, substr, tailtmp, ltmp, rtmp);

  for (c=0; c<sigma; c++) hc[c] = -1;
//  for (i=0; i<num; i++) hc[tailtmp[i]] = i;
  for (i=0; i<num; i++) hc[getuint(tailtmp,i,csa->k2)] = i;
  i = 0;
  for (c=0; c<sigma; c++) {
    if (hc[c] >= 0) {
//      tail[i] = tailtmp[hc[c]];
      putuint(tail,i, getuint(tailtmp,hc[c],csa->k2), csa->k2);
      ll[i] = ltmp[hc[c]];
      rr[i] = rtmp[hc[c]];
      i++;
    }
  }

  free(hc);  free(rtmp);  free(ltmp);  free(tailtmp);

  myfree(substr,(len+1)*csa->k2);

  return num;
}
Example #8
0
int csa_child_rs(CSA *csa, uchar *substr, i64 len, uchar *tail, rank_t *ll, rank_t *rr)
{
  int i,c,num;
  rank_t lll, rrr;
  i64 ret;

  num = 0;
  for (i=0; i<csa->m; i++) {
    c = csa->AtoC[i];
//    substr[len] = c;
    putuint(substr, len, c, csa->k2);
    ret = csa->search(substr, len+1, csa, &lll, &rrr);
    if (ret == len+1) {
      tail[num] = c;
      ll[num] = lll;
      rr[num] = rrr;
      num++;
    }
  }

  return num;
}
Example #9
0
void csa_text_lf(uchar *p,CSA *csa, pos_t s, pos_t t)
{
  i64 i,j;
  int c;

#if DEBUG
  if (s < 1 || t > csa->n || s > t) {
    printf("csa_text: out of range [%d,%d] n=%d\n",s,t,csa->n);
  }
#endif
//  lf = (lf_dna *)csa->psi_struc;

  i = csa->inverse(csa,(t+1));
  for (j=t-s; j>=0; j--) {
//    printf("rank %ld\n",i);
    i = csa->BW_LF(csa,i, &c);
#if DEBUG
    if (c == -1) {
      printf("csa_text_lf: ??? j = %ld i = %ld c = %ld  s=%ld t=%ld \n",
              j,i,c,s,t);
      exit(1);
    }
#endif
//    p[j] = c;
#if 0
{
  int x,j;
    x = c;
    printf("(");
    for (j=0; j<csa->k2; j++) {
      printf("%c", x & 0xff);
      x >>= 8;
    }
    printf(")");
}
#endif
    putuint(p, j, c, csa->k2);
  }
}
Example #10
0
void csa_new_from_bwt(CSA csa, char *fname, char *fidx, int psi_id, int idx_id, bool coded)
{
	int k;
	i64 i,j,v,m;
	FILE *f2;
	i64 psize,isize;
	i64 n;

	psi_id = csa.id;
	if (psi_id >= 0) {
		printf("create psi: id=%d\n",psi_id);
	}
	if (idx_id >= 0) {
		printf("create idx: id=%d D=%d D2=%d\n",idx_id,csa.D,csa.D2);
	}

	psize = 0;

	if (psi_id >= 0) {
		switch (psi_id & 0x3f) {
			case ID_DIFF_GAMMA:
			case ID_DIFF_GAMMA_RL:
			case ID_DIFF_GAMMA_SPARSE:
			case ID_DIFF_GAMMA_RL_SPARSE:
				psize = psi1_makeindex(&csa, fname);
				printf("n     %ld\n",csa.n);
				printf("Psi   %ld bytes (%1.3f bpc)\n",
						psize,(double)psize*8/csa.n);
				break;
			case ID_DIFF_GAMMA_RR:
				psize = psi12_makeindex(&csa, fname);
				printf("n     %ld\n",csa.n);
				printf("Psi   %ld bytes (%1.3f bpc)\n",
						psize,(double)psize*8/csa.n);
				break;
			case ID_BWT_DNA:
				psize = lf_dna_makeindex(&csa, fname, coded);
				printf("n     %ld\n",csa.n);
				printf("BW    %ld bytes (%1.3f bpc)\n",
						psize,(double)psize*8/csa.n);
				break;
			case ID_BWT_BIT:
				psize = lf_bit_makeindex(&csa, fname);
				printf("n     %ld\n",csa.n);
				printf("BW    %ld bytes (%1.3f bpc)\n",
						psize,(double)psize*8/csa.n);
				break;
			case ID_BWT_WT:
			case ID_BWT_WT_HUF:
			case ID_BWT_WT_DENSE:
			case ID_BWT_WT_SPARSE4:
			case ID_BWT_WT_RR:
				psize = lf_wt_makeindex(&csa, fname);
				printf("n     %ld\n",csa.n);
				printf("BW    %ld bytes (%1.3f bpc)\n",
						psize,(double)psize*8/csa.n);
				break;
#if 0
			case ID_BWT_HUF:
				psize = lf_bwt_makeindex(&csa, fname);
				printf("n     %ld\n",csa.n);
				printf("BW    %ld bytes (%1.3f bpc)\n",
						psize,(double)psize*8/csa.n);
				break;
#endif
			case ID_SPARSE4:
				psize = psi2_makeindex(&csa, fname);
				printf("n     %ld\n",csa.n);
				printf("Psi   %ld bytes (%1.3f bpc)\n",
						psize,(double)psize*8/csa.n);
				break;
			default:
				printf("psi_id = %d\n",psi_id);
				exit(1);
		}
	}

	csa.k = (blog(csa.n+1)+1+8-1)/8;

	for (i=0; i<SIGMA; i++) csa.CtoA[i] = -1;
	//  csa.K[-1+1] = 0;
	csa.K[-1+1] = 1;
	for (m=0,v=1,i=0; i<SIGMA; i++) {
		if (csa.C[i]>0) {
			csa.AtoC[m] = i;
			csa.CtoA[i] = m;
			csa.K[m+1] = v;
			//      printf("i=%ld v = %ld C[i] = %ld\n",i,v,csa.C[i]);
			v += csa.C[i];
			m++;
		}
	}
	csa.K[m+1] = v;
	csa.m = m;

	if (csa.D >= csa.n) {
		printf("D=%d >= n=%ld\n",csa.D,csa.n);
		exit(0);
	}
	if (csa.D2 >= csa.n) {
		printf("D2=%d >= n=%ld\n",csa.D2,csa.n);
		exit(0);
	}

	if (idx_id >= 0) {
		n = csa.n;
		k = csa.k;
		////  compute SA and ISA
		if (csa.D > 0) csa.SA = (uchar *) mymalloc(((n-1)/csa.D+1+1)*k);
		if (csa.D2 > 0) csa.ISA = (uchar *) mymalloc(((n-1)/csa.D2+1+1)*k);
		if (csa.D == 0 && csa.D2 == 0) goto brk;

		switch (psi_id & 0x3f) {
			case ID_DIFF_GAMMA:
			case ID_DIFF_GAMMA_RL:
			case ID_DIFF_GAMMA_SPARSE:
			case ID_DIFF_GAMMA_RL_SPARSE:
			case ID_SPARSE4:
			case ID_DIFF_GAMMA_RR:
				j = 0;
				for (i=0; i<=n; i++) {
					display_progressbar("making sa ",i,n);
					j = csa.psi(&csa,j);
					//  sa[j] = i;
					if (csa.D > 0 && j % csa.D == 0) {
						putuint(csa.SA,j / csa.D,i,k);
					}
					if (csa.D2 > 0 && i % csa.D2 == 0) {
						putuint(csa.ISA,i / csa.D2,j,k);
					}
				}
				//      putuint(csa.SA,0,n,k);
				break;
			case ID_BWT_DNA:
			case ID_BWT_BIT:
			case ID_BWT_WT:
			case ID_BWT_WT_HUF:
			case ID_BWT_WT_DENSE:
			case ID_BWT_WT_SPARSE4:
			case ID_BWT_WT_RR:
			case ID_BWT_HUF:
				j = 0;
				for (i=n-1; i>=0; i--) {
					display_progressbar("making sa ",i,n);
					v = csa.LF(&csa,j);
					//        printf("LF[%ld] = %ld\n",j,v);
					j = v;
					if (csa.D > 0 && j % csa.D == 0) putuint(csa.SA, j/csa.D , i, k);
					if (csa.D2 > 0 && i % csa.D2 == 0) putuint(csa.ISA, i/csa.D2, j, k);
				}
				putuint(csa.SA,0,n,k);
				break;
			default:
				break;
		}
brk:
		////      write idx
		f2 = fopen(fidx,"wb"); /* directory */
		if (f2 == NULL) {
			perror("csa2_new1: ");
			exit(1);
		}

		isize = 0;

		writeint(4,VERSION,f2); /* version */
		isize += 4;

		writeint(1,ID_HEADER,f2); // header ID
		isize += 1;
		isize = write_header(&csa, f2, isize);

		if (csa.D > 0) {
			writeint(1,ID_SA,f2);
			isize += 1;
			isize = write_sa(&csa, f2, isize);
		}

		if (csa.D2 > 0) {
			writeint(1,ID_ISA,f2);
			isize += 1;
			isize = write_isa(&csa, f2, isize);
		}


		fclose(f2);

		if (csa.D > 0) free(csa.SA);
		if (csa.D2 > 0) free(csa.ISA);

		printf("Total %ld bytes (%1.3f bpc)\n",(psize+isize),
				(double)(psize+isize)*8/csa.n);
	}
	free(fidx);
}
Example #11
0
static void
bvprintf(struct putcinfo *action, const char *fmt, va_list args)
{
    const char *s = fmt;
    for (;; s++) {
        char c = GET_GLOBAL(*(u8*)s);
        if (!c)
            break;
        if (c != '%') {
            putc(action, c);
            continue;
        }
        const char *n = s+1;
        int field_width = 0;
        char padchar = ' ';
        u8 is64 = 0;
        for (;;) {
            c = GET_GLOBAL(*(u8*)n);
            if (!isdigit(c))
                break;
            if (!field_width && (c == '0'))
                padchar = '0';
            else
                field_width = field_width * 10 + c - '0';
            n++;
        }
        if (c == 'l') {
            // Ignore long format indicator
            n++;
            c = GET_GLOBAL(*(u8*)n);
        }
        if (c == 'l') {
            is64 = 1;
            n++;
            c = GET_GLOBAL(*(u8*)n);
        }
        s32 val;
        const char *sarg;
        switch (c) {
        case '%':
            putc(action, '%');
            break;
        case 'd':
            val = va_arg(args, s32);
            if (is64)
                va_arg(args, s32);
            if (val < 0) {
                putc(action, '-');
                val = -val;
            }
            putuint(action, val);
            break;
        case 'u':
            val = va_arg(args, s32);
            if (is64)
                va_arg(args, s32);
            putuint(action, val);
            break;
        case 'p':
            val = va_arg(args, s32);
            putc(action, '0');
            putc(action, 'x');
            puthex(action, val, 8);
            break;
        case 'x':
            val = va_arg(args, s32);
            if (is64) {
                u32 upper = va_arg(args, s32);
                if (upper) {
                    putprettyhex(action, upper, field_width - 8, padchar);
                    puthex(action, val, 8);
                    break;
                }
            }
            putprettyhex(action, val, field_width, padchar);
            break;
        case 'c':
            val = va_arg(args, int);
            putc(action, val);
            break;
        case '.':
            // Hack to support "%.s" - meaning string on stack.
            if (GET_GLOBAL(*(u8*)(n+1)) != 's')
                break;
            n++;
            sarg = va_arg(args, const char *);
            puts(action, sarg);
            break;
        case 's':
            sarg = va_arg(args, const char *);
            puts_cs(action, sarg);
            break;
        default:
            putc(action, '%');
            n = s;
        }
        s = n;
    }
}
Example #12
0
/**
 * @brief This is an minimally useful subset of the POSIX printf() function.
 *
 * To reduce code size, this pico_printf() implementation only supports a few
 * conversion specifiers:
 *  - @a 'd', @a 'u': for signed and unsigned decimal numbers, respectively;
 *  - @a 'x', @a 'X': for hexadecimal numbers, downcase and upcase;
 *  - @a 's': for NULL terminated strings.
 *
 * Other limitations:
 *  - No flag specifier is implemented;
 *  - No field width specifier is implemented;
 *  - The only supported length modifier is 'l', which is parsed and ignored,
 *    on supported archictetures 'int' and 'long int' are both 32 bits long.
 *  - 32 digits maximum length for formatted numbers.
 */
int pico_printf(const char *format, ...)
{
	const char *s = format;
	int len = 0;
	va_list ap;
	va_start(ap, format);

	while (*s) {
		char c = *s++;
		if (c == '%') {
			c = *s++;
			/*
			 * Ignore 'l' length sub-specifier.
			 * This has no effect in ILP32 (4/4/4).
			 * In i586, 'int' and 'long int' are both 4 bytes long.
			 */
			if (c == 'l') {
				c = *s++;
			}
			switch (c) {
#if (PICO_PRINTF_D)
			case 'd': {
				int n;
				n = va_arg(ap, int);
				if (n < 0) {
					len += pico_putchar('-');
					n = -n;
				}
				len += putuint(n, 10, false);
				break;
			}
#endif
#if (PICO_PRINTF_U)
			case 'u': {
				unsigned int u;
				u = va_arg(ap, unsigned int);
				len += putuint(u, 10, false);
				break;
			}
#endif
#if (PICO_PRINTF_X)
			case 'X':
			case 'x': {
				unsigned int u;
				u = va_arg(ap, unsigned int);
				len += putuint(u, 16, c == 'X');
				break;
			}
#endif
#if (PICO_PRINTF_S)
			case 's': {
				const char *str;
				str = va_arg(ap, const char *);
				len += pico_putchars(str);
				break;
			}
#endif
#if (PICO_PRINTF_ESC)
			default:
				len += pico_putchar('%');
			case '%':
				len += pico_putchar(c);
				break;
#endif
			}
			continue;
		}

		len += pico_putchar(c);
	}
Example #13
0
void csa_new_from_bwt(int argc, char *argv[])
{
  i64 i,j,v,m;
  FILE *f2;
  i64 psize,isize;
  i64 n;
  int k;
  char *fname,*fidx;
  char *p;
  int psi_id, idx_id;
  CSA csa;
  int sigma;

  csa.sigma = 256; /* default alphabet size */
  csa.k2 = 1;

//  for (i=0; i<SIGMA+2; i++) csa.C[i] = 0;
//  for (i=0; i<SIGMA; i++) csa.C[i] = 0;

  fname = NULL;  fidx = NULL;
  psi_id = idx_id = -1;
  for (i=1; i<argc; i++) {
    p = argv[i];
    if (p[0] == '-') {
      p++;
      switch (toupper(p[0])) {
      case 'I':
      // -I[n]:[D]:[D2]
        p++;
        idx_id = 0;
        csa_options(&csa, p);
        break;
      case 'P':
      // -P[n]:[L]
        p++;
        psi_id = 0;
        psi_options(&csa, p);
        break;
      case 'C':
      // -C[s]
        p++;
        sigma_options(&csa, p);
        break;
      default:
        printf("??? no such option %s\n",argv[i]);
        exit(1);
      }
    } else {
      fname = argv[i];
      k = strlen(fname);
      fidx = mymalloc(k+5);
      sprintf(fidx,"%s.idx",fname);
    }
  }
  if (fname == NULL) {
    printf("no input file.\n");
    exit(0);
  }
  printf("sigma = %d k2 = %d\n", csa.sigma, csa.k2);
  sigma = csa.sigma;

  csa.C = mymalloc(sizeof(*csa.C)*sigma); //
  csa.CtoA = mymalloc(sizeof(*csa.CtoA)*sigma); //
  csa.AtoC = mymalloc(sizeof(*csa.AtoC)*sigma); //
  csa.K = mymalloc(sizeof(*csa.K)*(sigma+2)); //
  for (i=0; i<sigma; i++) csa.C[i] = 0;


  psi_id = csa.id;
  if (psi_id >= 0) {
    printf("create psi: id=%d\n",psi_id);
  }
  if (idx_id >= 0) {
    printf("create idx: id=%d D=%d D2=%d\n",idx_id,csa.D,csa.D2);
  }

  psize = 0;

  if (psi_id >= 0) {
    switch (psi_id & 0x3f) {
    case ID_DIFF_GAMMA:
    case ID_DIFF_GAMMA_RL:
    case ID_DIFF_GAMMA_SPARSE:
    case ID_DIFF_GAMMA_RL_SPARSE:
      psize = psi1_makeindex(&csa, fname);
      printf("n     %ld\n",csa.n);
      printf("Psi   %ld bytes (%1.3f bpc)\n",
              psize,(double)psize*8/csa.n);
      break;
    case ID_DIFF_GAMMA_RR:
      psize = psi12_makeindex(&csa, fname);
      printf("n     %ld\n",csa.n);
      printf("Psi   %ld bytes (%1.3f bpc)\n",
              psize,(double)psize*8/csa.n);
      break;
    case ID_BWT_DNA:
      psize = lf_dna_makeindex(&csa, fname);
      printf("n     %ld\n",csa.n);
      printf("BW    %ld bytes (%1.3f bpc)\n",
              psize,(double)psize*8/csa.n);
      break;
    case ID_BWT_DNA2:
      psize = lf_dna2_makeindex(&csa, fname);
      printf("n     %ld\n",csa.n);
      printf("BW    %ld bytes (%1.3f bpc)\n",
              psize,(double)psize*8/csa.n);
      break;
    case ID_BWT_BIT:
      psize = lf_bit_makeindex(&csa, fname);
      printf("n     %ld\n",csa.n);
      printf("BW    %ld bytes (%1.3f bpc)\n",
              psize,(double)psize*8/csa.n);
      break;
    case ID_BWT_WT:
    case ID_BWT_WT_HUF:
    case ID_BWT_WT_DENSE:
    case ID_BWT_WT_SPARSE4:
    case ID_BWT_WT_RR:
      psize = lf_wt_makeindex(&csa, fname);
      printf("n     %ld\n",csa.n);
      printf("BW    %ld bytes (%1.3f bpc)\n",
              psize,(double)psize*8/csa.n);
      break;
#if 0
    case ID_BWT_HUF:
      psize = lf_bwt_makeindex(&csa, fname);
      printf("n     %ld\n",csa.n);
      printf("BW    %ld bytes (%1.3f bpc)\n",
              psize,(double)psize*8/csa.n);
      break;
#endif
    case ID_SPARSE4:
      psize = psi2_makeindex(&csa, fname);
      printf("n     %ld\n",csa.n);
      printf("Psi   %ld bytes (%1.3f bpc)\n",
              psize,(double)psize*8/csa.n);
      break;
    default:
      printf("psi_id = %d\n",psi_id);
      exit(1);
    }
  }

  csa.k = (blog(csa.n+1)+1+8-1)/8;

  for (i=0; i<sigma; i++) csa.CtoA[i] = -1;
  csa.K[-1+1] = 1;
  for (m=0,v=1,i=0; i<sigma; i++) {
    if (csa.C[i]>0) {
      csa.AtoC[m] = i;
      csa.CtoA[i] = m;
      csa.K[m+1] = v;
//      printf("i=%ld v = %ld C[i] = %ld\n",i,v,csa.C[i]);
      v += csa.C[i];
      m++;
    }
  }
  csa.K[m+1] = v;
  csa.m = m;

  if (csa.D >= csa.n) {
    printf("D=%d >= n=%ld\n",csa.D,csa.n);
    exit(0);
  }
  if (csa.D2 >= csa.n) {
    printf("D2=%d >= n=%ld\n",csa.D2,csa.n);
    exit(0);
  }

  if (idx_id >= 0) {
    n = csa.n;
    k = csa.k;
////  compute SA and ISA
    if (csa.D > 0) csa.SA = mymalloc(((n-1)/csa.D+1+1)*k);
    if (csa.D2 > 0) csa.ISA = mymalloc(((n-1)/csa.D2+1+1)*k);
    if (csa.D == 0 && csa.D2 == 0) goto brk;

    switch (psi_id & 0x3f) {
    case ID_DIFF_GAMMA:
    case ID_DIFF_GAMMA_RL:
    case ID_DIFF_GAMMA_SPARSE:
    case ID_DIFF_GAMMA_RL_SPARSE:
    case ID_SPARSE4:
    case ID_DIFF_GAMMA_RR:
      j = 0;
      for (i=0; i<=n; i++) {
        display_progressbar("making sa ",i,n);
        j = csa.psi(&csa,j);
  //  sa[j] = i;
        if (csa.D > 0 && j % csa.D == 0) {
          putuint(csa.SA,j / csa.D,i,k);
        }
        if (csa.D2 > 0 && i % csa.D2 == 0) {
          putuint(csa.ISA,i / csa.D2,j,k);
        }
      }
//      putuint(csa.SA,0,n,k);
      break;
    case ID_BWT_DNA:
    case ID_BWT_DNA2:
    case ID_BWT_BIT:
    case ID_BWT_WT:
    case ID_BWT_WT_HUF:
    case ID_BWT_WT_DENSE:
    case ID_BWT_WT_SPARSE4:
    case ID_BWT_WT_RR:
    case ID_BWT_HUF:
      j = 0;
      for (i=n-1; i>=0; i--) {
        display_progressbar("making sa ",i,n);
        v = csa.LF(&csa,j);
//        printf("LF[%ld] = %ld\n",j,v);
        j = v;
        if (csa.D > 0 && j % csa.D == 0) putuint(csa.SA, j/csa.D , i, k);
        if (csa.D2 > 0 && i % csa.D2 == 0) putuint(csa.ISA, i/csa.D2, j, k);
      }
//      putuint(csa.SA,0,n,k);
      if (csa.D > 0) putuint(csa.SA,0,n,k); // 2011-12-20
      break;
    default:
      break;
    }
brk:
////      write idx
    f2 = fopen(fidx,"wb"); /* directory */
    if (f2 == NULL) {
      perror("csa2_new1: ");
      exit(1);
    }

    isize = 0;

    writeint(4,VERSION,f2); /* version */
    isize += 4;

    writeint(1,ID_HEADER,f2); // header ID
    isize += 1;
    isize = write_header(&csa, f2, isize);

    if (csa.D > 0) {
      writeint(1,ID_SA,f2);
      isize += 1;
      isize = write_sa(&csa, f2, isize);
    }

    if (csa.D2 > 0) {
      writeint(1,ID_ISA,f2);
      isize += 1;
      isize = write_isa(&csa, f2, isize);
    }


    fclose(f2);

    if (csa.D > 0) free(csa.SA);
    if (csa.D2 > 0) free(csa.ISA);

    printf("Total %ld bytes (%1.3f bpc)\n",(psize+isize),
                (double)(psize+isize)*8/csa.n);
  }
  free(fidx);
}
Example #14
0
int csa_child_r_sub(CSA *csa, i64 len, rank_t l, rank_t r, int num, uchar *substr, uchar *tail, rank_t *ll, rank_t *rr)
{

  rank_t lll, rrr;
  i64 j, ret;
  int c1,c2;

//  printf("child_r_sub [%ld,%ld]\n",l,r);

  lll = l;  rrr = r;
  for (j=0; j<len; j++) {
    lll = csa->psi(csa, lll);
    rrr = csa->psi(csa, rrr);
  }
  c1 = csa->T(csa, lll);
  c2 = csa->T(csa, rrr);

  if (c1 == c2) {
//    printf("num=%d c=%d [%ld,%ld]\n",num,c1,l,r);
//    tail[num] = c1;
    putuint(tail,num,c1, csa->k2);
    ll[num] = l;
    rr[num] = r;
    num++;
  } else {
    i64 l2,r2;
    if (c1 == -1) {
      l2 = l+1;
    } else {
      lll = l;  rrr = r;
//      substr[len] = c1;
      putuint(substr, len, c1, csa->k2);
      ret = csa->search(substr, len+1, csa, &lll, &rrr);
      if (ret == len+1) {
//        printf("num=%d c=%d [%ld,%ld]\n",num,c1,lll,rrr);
//        tail[num] = c1;
        putuint(tail,num,c1, csa->k2);
        ll[num] = lll;
        rr[num] = rrr;
        num++;
        l2 = rrr+1;
//      } else {
//        printf("??? c1\n");
      }
    }
    if (c2 == -1) {
      r2 = r-1;
    } else {
      lll = l;  rrr = r;
//      substr[len] = c2;
      putuint(substr, len, c2, csa->k2);
      ret = csa->search(substr, len+1, csa, &lll, &rrr);
      if (ret == len+1) {
//        printf("num=%d c=%d [%ld,%ld]\n",num,c2,lll,rrr);
//        tail[num] = c2;
        putuint(tail,num,c2, csa->k2);
        ll[num] = lll;
        rr[num] = rrr;
        num++;
        r2 = lll-1;
//      } else {
//        printf("??? c2\n");
      }
    }
    if (l2 <= r2) {
      num = csa_child_r_sub(csa, len, l2, r2, num, substr, tail, ll, rr);
    }
  }

  return num;
}