Exemple #1
0
// H <- ('a' 'b')+5
bool is_H(_iterator &it){ 
	PEG(
		LOOP(5) && _is('a') && _is('b') && END_LOOP
	);
	return true; 
}
Exemple #2
0
// F <- ('a' | 'b' | ('c' 'd' ('e' | 'f') ) ('g' | 'h') ) 'i' | 'j'
bool is_F(_iterator &it){ 
	PEG(
		_L && _is('a') && _C && _is('b') && _C && _L && _is('c') && _is('d') && _L && _is('e') && _C && _is('f') && _R && _R && _L && _is('g') && _C && _is('h') && _R && _R && _is('i') && _C && _is('j')
	); 
	return true; 
}
Exemple #3
0
// G <- ('a')+
bool is_G(_iterator &it){ 
	PEG(
		LOOP(1) && _is('a') && END_LOOP
	);
	return true; 
}
Exemple #4
0
// D <- ?('a') 'b'
bool is_D(_iterator &it){ 
	PEG(
		H && _is('a') && END_H && _is('b')
	);
	return true; 
}
Exemple #5
0
// E <- 'd' ('a' 'b' | 'd') 
bool is_E(_iterator &it){
	PEG(
		_is('d') && _L && _is('a') && _is('b') && _C && _is('d') && _R
	);
	return true; 
}
Exemple #6
0
// C <- !('a' 'b') 'a' 
bool is_C(_iterator &it){ 
	PEG(
		NOT && _is('a') && _is('b') && END_NOT && _is('a')
	);
	return true; 
}
Exemple #7
0
// B <- &('a' | 'b') 'c' 'd'
bool is_B(_iterator &it){ 
	PEG(
		AND && _is('a') && _C && _is('b') && END_AND && _is('c') && _is('d')
	);
	return true; 
}
Exemple #8
0
// A <- 'a' 'b' 'c' 'd' 'e'
bool is_A(_iterator &it){ 
	PEG(
		_is('a') && _is('b') && _is('c') && _is('d') && _is('e')
	);
	return true; 
}
Exemple #9
0
// I denote by "**n" the counterpart of "TIMES(n)." 
// I <- ('a' 'b')**3
bool is_I(_iterator &it){ 
	PEG(
		TIMES(3) && _is('a') && _is('b') && END_TIMES
	);
	return true; 
}
Exemple #10
0
Fichier : LDPC.c Projet : ksdb/LDPC
// LDPCのインスタンスを生成
LDPC *generate_LDPC(int weight_row, int weight_col, int n_code, char *exename)
{
  // for loop
  int i, j, k;
  
  LDPC *ldpc = (LDPC *)malloc(sizeof(LDPC));

  ldpc->weight_col = weight_col;
  ldpc->weight_row = weight_row;
  ldpc->n_code = n_code;

  // 符号長が行重みの整数倍でない場合は列数を調整
  if(n_code%weight_row!=0){
    ldpc->n_col = n_code + weight_row - (n_code%weight_row);
  }else{
    ldpc->n_col = n_code;
  }

  char str[256];
  sprintf(str, "%s_IMG/G_%d_%d_%d.png", exename, ldpc->weight_row, ldpc->weight_col, ldpc->n_code);

  // ファイルあったらそこから読み込む.なかったら作る
  if(!load_imagemat(ldpc)){
    // 列重み1あたりの行数
    int n_row_perblock = ldpc->n_col/ldpc->weight_row;
    // 行数
    ldpc->n_row = n_row_perblock*ldpc->weight_col;

    PEG(ldpc);

    // 検査行列のメモリを取る
    ldpc->H = idalloc(ldpc->n_row, ldpc->n_col);
    for(i=0;i<ldpc->n_col;i++){
      for(j=0;j<ldpc->VC_1p[i];j++){
	ldpc->H[ldpc->VC_1[i][j]][i] = 1;
      }
    }

    ifree2(ldpc->VC_1, ldpc->n_col);
    ifree2(ldpc->CV_1, ldpc->n_row);
    free(ldpc->VC_1p);
    free(ldpc->CV_1p);
    

    // 既約台形正準形への変形
    int **H_irr = idalloc(ldpc->n_row, ldpc->n_col);
    int *idx_col = isalloc(ldpc->n_col);
    init_ivec_order(idx_col, ldpc->n_col);
    ldpc->n_parity = irreduce_binmat(ldpc->H, H_irr, ldpc->n_row, ldpc->n_col, idx_col);

    // 生成行列のメモリを取る
    ldpc->n_inf = ldpc->n_col - ldpc->n_parity;
    ldpc->n_effinf = ldpc->n_inf - (ldpc->n_col-ldpc->n_code);
    ldpc->G = idalloc(ldpc->n_inf, ldpc->n_col);
    ldpc->coderate = ldpc->n_effinf/(double)ldpc->n_code;

    // 生成行列に代入
    for(i=0;i<ldpc->n_inf;i++){
      ldpc->G[i][i+ldpc->n_parity] = 1;
    }
    for(i=0;i<ldpc->n_inf;i++){
      for(j=0;j<ldpc->n_parity;j++){
	ldpc->G[i][j] = H_irr[j][i+ldpc->n_parity];
      }
    }

    for(i=0;i<ldpc->n_row;i++){
      for(j=0;j<ldpc->n_col;j++){
	H_irr[i][j] = ldpc->H[i][j];
      }
    }
    for(i=0;i<ldpc->n_row;i++){
      for(j=0;j<ldpc->n_col;j++){
	ldpc->H[i][j] = H_irr[i][idx_col[j]];
      }
    }
    print_matimage(ldpc);

    idfree(H_irr, ldpc->n_row);
    free(idx_col);
  }

  // Gの各列に対して1の立ってる行だけ取り出す
  int *tmp_1 = isalloc(10000);
  ldpc->G_1 = isalloc_p(ldpc->n_col);
  ldpc->G_1p = isalloc(ldpc->n_col);
  for(i=0;i<ldpc->n_col;i++){
    for(j=0;j<ldpc->n_inf;j++){
      if(ldpc->G[j][i]){
	tmp_1[ldpc->G_1p[i]] = j;
	ldpc->G_1p[i]++;
      }
    }
    ldpc->G_1[i] = isalloc(ldpc->G_1p[i]);
    for(j=0;j<ldpc->G_1p[i];j++){
      ldpc->G_1[i][j] = tmp_1[j];
    }
  }

  // チェックノードと変数ノードの関係
  ldpc->CV_1 = isalloc_p(ldpc->n_row);
  ldpc->CV_1p = isalloc(ldpc->n_row);
  for(i=0;i<ldpc->n_row;i++){
    for(j=0;j<ldpc->n_col;j++){
      if(ldpc->H[i][j]){
  	tmp_1[ldpc->CV_1p[i]] = j;
  	ldpc->CV_1p[i]++;
      }
    }
    ldpc->CV_1[i] = isalloc(ldpc->CV_1p[i]);
    for(j=0;j<ldpc->CV_1p[i];j++){
      ldpc->CV_1[i][j] = tmp_1[j];
    }
  }
  ldpc->VC_1 = isalloc_p(ldpc->n_col);
  ldpc->VC_1p = isalloc(ldpc->n_col);
  for(i=0;i<ldpc->n_col;i++){
    for(j=0;j<ldpc->n_row;j++){
      if(ldpc->H[j][i]){
  	tmp_1[ldpc->VC_1p[i]] = j;
  	ldpc->VC_1p[i]++;
      }
    }
    ldpc->VC_1[i] = isalloc(ldpc->VC_1p[i]);
    for(j=0;j<ldpc->VC_1p[i];j++){
      ldpc->VC_1[i][j] = tmp_1[j];
    }
  }

  // 逆参照テーブル
  ldpc->CV_1_inv = isalloc_p(ldpc->n_row);
  for(i=0;i<ldpc->n_row;i++){
    ldpc->CV_1_inv[i] = isalloc(ldpc->CV_1p[i]);
    for(j=0;j<ldpc->CV_1p[i];j++){
      for(k=0;k<ldpc->VC_1p[ldpc->CV_1[i][j]];k++){
	if(ldpc->VC_1[ldpc->CV_1[i][j]][k] == i){
	  ldpc->CV_1_inv[i][j] = k;
	  break;
	}
      }
    }
  }
  ldpc->VC_1_inv = isalloc_p(ldpc->n_col);
  for(i=0;i<ldpc->n_col;i++){
    ldpc->VC_1_inv[i] = isalloc(ldpc->VC_1p[i]);
    for(j=0;j<ldpc->VC_1p[i];j++){
      for(k=0;k<ldpc->CV_1p[ldpc->VC_1[i][j]];k++){
	if(ldpc->CV_1[ldpc->VC_1[i][j]][k] == i){
	  ldpc->VC_1_inv[i][j] = k;
	  break;
	}
      }
    }
  }

  
  ldpc->codebits = isalloc(ldpc->n_col);
  ldpc->infbits_in = isalloc(ldpc->n_inf);
  ldpc->infbits_out = isalloc(ldpc->n_inf);
  ldpc->checkbits = isalloc(ldpc->n_row);
  ldpc->variablebits = isalloc(ldpc->n_col);

  ldpc->C_llr = dsalloc_p(ldpc->n_row);
  for(i=0;i<ldpc->n_row;i++){
    ldpc->C_llr[i] = dsalloc(ldpc->CV_1p[i]);
  }
  ldpc->V_llr = dsalloc_p(ldpc->n_col);
  for(i=0;i<ldpc->n_col;i++){
    ldpc->V_llr[i] = dsalloc(ldpc->VC_1p[i]);
  }

  // LLRのケツ数ビットはショートニング分なのでLLR=∞
  ldpc->llr = dsalloc(ldpc->n_col);
  for(i=0;i<ldpc->n_inf-ldpc->n_effinf;i++){
    ldpc->llr[ldpc->n_col-i-1] = 12.5;
  }
  
  return ldpc;
}