// H <- ('a' 'b')+5 bool is_H(_iterator &it){ PEG( LOOP(5) && _is('a') && _is('b') && END_LOOP ); return true; }
// 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; }
// G <- ('a')+ bool is_G(_iterator &it){ PEG( LOOP(1) && _is('a') && END_LOOP ); return true; }
// D <- ?('a') 'b' bool is_D(_iterator &it){ PEG( H && _is('a') && END_H && _is('b') ); return true; }
// E <- 'd' ('a' 'b' | 'd') bool is_E(_iterator &it){ PEG( _is('d') && _L && _is('a') && _is('b') && _C && _is('d') && _R ); return true; }
// C <- !('a' 'b') 'a' bool is_C(_iterator &it){ PEG( NOT && _is('a') && _is('b') && END_NOT && _is('a') ); return true; }
// 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; }
// A <- 'a' 'b' 'c' 'd' 'e' bool is_A(_iterator &it){ PEG( _is('a') && _is('b') && _is('c') && _is('d') && _is('e') ); return true; }
// 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; }
// 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; }