⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 biggirth.cpp

📁 已知LDPC码的稀疏交验矩阵H
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -