?? biggirth.cpp
字號:
#include <stdio.h>#include <stdlib.h>#include <iostream.h>#include <fstream.h>#include "BigGirth.h"#include "Random.h"NodesInGraph::NodesInGraph(void):ParityBitInCt(false),SymbolBitInCt(false) {}void NodesInGraph::setNumOfConnectionSymbolBit(int deg) { if(deg<=0) {cout<<"Wrong NodesInGraph::setNumOfConnectionSymbolBit()"<<endl;exit(-1);} numOfConnectionSymbolBit=deg; connectionSymbolBit=new int[deg];}
void NodesInGraph::setNumOfConnectionParityBit(int deg) {
if(deg<=0) {cout<<"Wrong NodesInGraph::setNumOfConnectionCheckBit()"<<endl;exit(-1);}
numOfConnectionParityBit=deg;
connectionParityBit=new int[deg];
}void NodesInGraph::initConnectionParityBit(void) { maxDegParity=10000; numOfConnectionParityBit=0; connectionParityBit=new int[1];//dummy memory, actually not used}void NodesInGraph::initConnectionParityBit(int deg) { maxDegParity=deg; numOfConnectionParityBit=0; connectionParityBit=new int[1];//dummy memory, actually not used}NodesInGraph::~NodesInGraph(void) { if(connectionParityBit!=NULL) delete [] connectionParityBit; if(connectionSymbolBit!=NULL) delete [] connectionSymbolBit;}BigGirth::BigGirth(void) {;}BigGirth::BigGirth(int M, int N, int *symbolDegSequence, char *filename, int sglConcent, int tgtGirth,int * H_out):H(NULL){ int i, j, k, m, index, localDepth=100; int *mid; EXPAND_DEPTH=(tgtGirth-4)/2; //層數 L if(EXPAND_DEPTH<0) EXPAND_DEPTH=0; // corresponds to depth l in the PEG paper; // the target girth = 2*EXPAND_DEPTH+4 // if set large, then GREEDY algorithm myrandom=new Random(); //(12345678l, 987654321lu); (*this).M=M; (*this).N=N; (*this).filename=filename; mid=new int[M]; localGirth=new int[N]; nodesInGraph=new NodesInGraph [N]; for(i=0;i<N;i++){
nodesInGraph[i].setNumOfConnectionSymbolBit(symbolDegSequence[i]);
cout<<i<<" "<<symbolDegSequence[i]<<endl;
} j=0; for(k=0;k<N;k++) j+=symbolDegSequence[k];
k=j/M; //取整數了 for(i=0;i<M;i++) mid[i]=k;
for(i=0;i<j-k*M;i++) mid[i]++; //
k=0;
for(i=0;i<M;i++) k+=mid[i];
if(k!=j) {cout<<"Wrong in computing maxDegParity!"<<endl;
exit(-1);
} for(i=0;i<M;i++){ if(sglConcent==0)
nodesInGraph[i].initConnectionParityBit(mid[i]);
else
nodesInGraph[i].initConnectionParityBit(); //==1 }
ofstream fout2;
ofstream fout3; //fout2.open("drm_fach_58_130.txt",ios::out); //////////////////
//fout2.open("drm_sdch_96_138.txt",ios::out);
//fout2.open("drm_sdch_54_138.txt",ios::out);
//fout2.open("drm_msch_687_968.txt",ios::out);
//fout2.open("drm_msch_406_968.txt",ios::out);
//fout2.open("drm_msch_228_968.txt",ios::out);
//fout2.open("drm_H_sdc_92_138.txt",ios::out);
//fout2.open("drm_H_sdc_46_138.txt",ios::out);
//fout2.open("drm_H_msc_484_968.txt",ios::out);
// fout2.open("drm_H_msc_242_968.txt",ios::out);
fout2.open("test/drm_H_msc_546_1080.txt",ios::app);
if(!fout2)
{
cerr<<"error:unable to open output file: "<<fout2<<endl;
}
fout2<<M<<endl;
fout2<<N<<endl;
fout3.open("test/drm_H_msc10_20_bigGirth.txt",ios::app);
if(!fout2)
{
cerr<<"error:unable to open output file: "<<fout2<<endl;
}
/*開始PEG*/
for(k=0;k<N;k++){ m=1000000;
index=-1;
fout3<<" k: "<<k<<endl<<endl; for(i=0;i<M;i++){ if(nodesInGraph[i].numOfConnectionParityBit<m && nodesInGraph[i].numOfConnectionParityBit<nodesInGraph[i].maxDegParity){ m=nodesInGraph[i].numOfConnectionParityBit; //=0 index=i; //選一個最小 i=0 }
} nodesInGraph[k].connectionSymbolBit[0]=index;//least connections of parity bit,定下了第一個 int iter=0;
ITER: localGirth[k]=100; //localDepth ??
for(m=1;m<nodesInGraph[k].numOfConnectionSymbolBit;m++){ nodesInGraph[k].connectionSymbolBit[m]=selectParityConnect(k, m, localDepth); // localDepth=100 localGirth[k] = (localGirth[k]>localDepth) ? localDepth : localGirth[k]; //select the smaller one
fout3<<" localGirth["<<k<<"]: "<<localGirth[k]<<" iter: "<<iter<<endl;
if(k>0 && localGirth[k]<localGirth[k-1] && iter<20){ //出現了變小的趨勢
iter++;
goto ITER; ///循環 1,20次
}
if(localGirth[k]==0 && iter<30){
iter++;
goto ITER; ///循環 1,30次
}
} //if((k+1)%100==0) { cout<<"k="<<k<<" ";
for(m=0;m<nodesInGraph[k].numOfConnectionSymbolBit;m++){ cout<<nodesInGraph[k].connectionSymbolBit[m]<<" ";
fout2<<nodesInGraph[k].connectionSymbolBit[m]<<" "; //輸出結果
} cout<<"LocalGirth="<<2*localGirth[k]+4; cout<<endl;
fout2<<endl; //} updateConnection(k); }
fout2.clear();
fout2.close(); fout3.clear();
fout3.close(); cout<<"Showing the row weight distribution..."<<endl; for(i=0;i<M;i++) cout<<nodesInGraph[i].numOfConnectionParityBit<<" "; cout<<endl; delete [] mid; ofstream cycleFile; cycleFile.open("test/leftHandGirth.log", ios::out&&ios::app); localDepth=100;
for(k=0;k<N;k++){ if(localGirth[k]<localDepth)
localDepth=localGirth[k]; //選擇一個較小的 if(localDepth==100)
cycleFile<<"inf "; else
cycleFile<<2*localDepth+4<<" "; }
cycleFile<<endl; cycleFile.close();
cycleFile.clear(); cout<<"*************************************************************"<<endl; cout<<" The global girth of the PEG Tanner graph :="<< 2*localDepth+4<<endl; cout<<"*************************************************************"<<endl;
//////////////////////////////////
H=H_out;
/////////////////////////////////////////////
for(i=0;i<M;i++){
for(j=0;j<nodesInGraph[i].numOfConnectionParityBit;j++){ //numOfConnectionParityBit 0->N-1
H[i*N+nodesInGraph[i].connectionParityBit[j]]=1; //nodesInGraph[i].connectionParityBit[j] 0->N-1
}
}
cout<<"sam"<<endl;
/* for(i=0;i<M;i++){
for(j=0;j<N;j++){
cout<<H[i*N+j]<<" ";
}
cout<<endl;
}
*/}BigGirth::~BigGirth(void) { if(H!=NULL){ //for(int i=0;i<M;i++) // delete [] H[i]; delete []H; H=NULL; } delete [] localGirth; delete [] nodesInGraph; nodesInGraph=NULL; delete myrandom;} /*選擇連接校驗點*/int BigGirth::selectParityConnect(int kthSymbol, int mthConnection, int & cycle) { //cycle?? int i, j, k, index, mincycles, numCur, numNext, cpNumCur; int *tmp, *med; int *current;//take note of the covering parity bits mincycles=0; tmp=new int[M];
med=new int[M]; numCur=mthConnection; current=new int[mthConnection]; for(i=0;i<mthConnection;i++)
current[i]=nodesInGraph[kthSymbol].connectionSymbolBit[i]; LOOP: mincycles++;
for(i=0;i<M;i++)
tmp[i]=0; //maintain
for(i=0;i<mthConnection;i++)
tmp[nodesInGraph[kthSymbol].connectionSymbolBit[i]]=1;
for(i=0;i<numCur;i++){
for(j=0;j<nodesInGraph[current[i]].numOfConnectionParityBit;j++){
for(k=0;k<nodesInGraph[nodesInGraph[current[i]].connectionParityBit[j]].numOfConnectionSymbolBit;k++){
tmp[nodesInGraph[nodesInGraph[current[i]].connectionParityBit[j]].connectionSymbolBit[k]]=1;
}
}
} index=0;
cpNumCur=0;
for(i=0;i<M;i++){
if(tmp[i]==1)
cpNumCur++;
if(tmp[i]==1 || nodesInGraph[i].numOfConnectionParityBit>=nodesInGraph[i].maxDegParity)
index++;
}
if(cpNumCur==numCur){//can not expand any more //additional handlement to select one having least connections j=10000000; //dummy number for(i=0;i<M;i++){ if(tmp[i]==0 && nodesInGraph[i].numOfConnectionParityBit<j && nodesInGraph[i].numOfConnectionParityBit<nodesInGraph[i].maxDegParity) j=nodesInGraph[i].numOfConnectionParityBit; }
for(i=0;i<M;i++){ if(tmp[i]==0){ if(nodesInGraph[i].numOfConnectionParityBit!=j || nodesInGraph[i].numOfConnectionParityBit>=nodesInGraph[i].maxDegParity){ tmp[i]=1; } } } index=0; for(i=0;i<M;i++)
if(tmp[i]==1)
index++; //---------------------------------------------------------------- j=(*myrandom).uniform(0, M-index)+1; //randomly selected index=0; for(i=0;i<M;i++){ if(tmp[i]==0)
index++; if(index==j)
break; } delete [] tmp; tmp=NULL; delete [] current; current=NULL; return(i); } else if(index==M || mincycles>EXPAND_DEPTH){//covering all parity nodes or meet the upper bound on cycles cycle=mincycles-1; //作出了改變 for(i=0;i<M;i++)
tmp[i]=0;
for(i=0;i<numCur;i++)
tmp[current[i]]=1;
index=0;
for(i=0;i<M;i++)
if(tmp[i]==1)
index++;
if(index!=numCur){
cout<<"Error in the case of (index==M)"<<endl;exit(-1);
}
//additional handlement to select one having least connections j=10000000;
for(i=0;i<M;i++){
if(tmp[i]==0 && nodesInGraph[i].numOfConnectionParityBit<j && nodesInGraph[i].numOfConnectionParityBit<nodesInGraph[i].maxDegParity)
j=nodesInGraph[i].numOfConnectionParityBit;
}
for(i=0;i<M;i++){
if(tmp[i]==0){
if(nodesInGraph[i].numOfConnectionParityBit!=j || nodesInGraph[i].numOfConnectionParityBit>=nodesInGraph[i].maxDegParity){
tmp[i]=1;
}
}
}
index=0;
for(i=0;i<M;i++)
if(tmp[i]==1)
index++;
j=(*myrandom).uniform(0, M-index)+1;
index=0;
for(i=0;i<M;i++){
if(tmp[i]==0) index++;
if(index==j)
break;
}
delete [] tmp; tmp=NULL;
delete [] current; current=NULL;
return(i);
}
else if(cpNumCur>numCur && index!=M){
delete [] current;
current=NULL;
numCur=cpNumCur;
current=new int[numCur];
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -