238 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			238 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include "CyclesOfGraph.h"
 | |
| 
 | |
| NodesOfGraph::NodesOfGraph(void) { parityConnections=NULL;symbolConnections=NULL;
 | |
| }
 | |
| NodesOfGraph::~NodesOfGraph(void) {
 | |
|   delete [] parityConnections;
 | |
|   delete [] symbolConnections;
 | |
|   delete [] symbolMapping;
 | |
| 
 | |
| }
 | |
| 
 | |
| void NodesOfGraph::setParityConnections(int num, int *value) {
 | |
|   numOfParityConnections=num;
 | |
|   parityConnections=new int[num];
 | |
|   for(int i=0;i<numOfParityConnections;i++){
 | |
|     parityConnections[i]=value[i];
 | |
|     //cout<<parityConnections[i]<<" ";
 | |
|   }
 | |
|   //cout<<endl;
 | |
| }
 | |
| void NodesOfGraph::setSymbolConnections(int num, int *value) {
 | |
|   numOfSymbolConnections=num;
 | |
|   symbolConnections=new int[num];
 | |
|   for(int i=0;i<numOfSymbolConnections;i++){
 | |
|     symbolConnections[i]=value[i];
 | |
|     //cout<<symbolConnections[i]<<" ";
 | |
|   }
 | |
|   //cout<<endl;
 | |
| }
 | |
| void NodesOfGraph::setSymbolMapping(int num, int *value) {
 | |
|   numOfSymbolMapping=num;
 | |
|   //cout<<num<<endl;
 | |
|   symbolMapping=new int[num];
 | |
|   for(int i=0;i<numOfSymbolMapping;i++){
 | |
|     symbolMapping[i]=value[i];
 | |
|     //cout<<symbolMapping[i]<<" ";
 | |
|   }
 | |
|   //cout<<endl;
 | |
| }
 | |
| 
 | |
| CyclesOfGraph::CyclesOfGraph(int mm, int n, int *(*h)){
 | |
|   int i, j, k, m, index;
 | |
|   M=mm;
 | |
|   N=n;
 | |
|   H=h;
 | |
| 
 | |
|   tmp=new int [N];
 | |
|   med=new int [N];
 | |
|   tmpCycles=new int [N];
 | |
|   cyclesTable=new int [N];
 | |
|   nodesOfGraph=new NodesOfGraph [N];
 | |
| 
 | |
|   //cout<<M<<" "<<N<<endl;
 | |
|   /*
 | |
|   for(i=0;i<M;i++){
 | |
|     for(j=0;j<N;j++)
 | |
|       cout<<H[i][j]<<" ";
 | |
|     cout<<endl;
 | |
|   }
 | |
|   */
 | |
|   for(i=0;i<N;i++){
 | |
|     index=0;
 | |
|     for(j=0;j<M;j++){
 | |
|       if(H[j][i]==1){
 | |
| 	tmp[index]=j;
 | |
| 	index++;
 | |
|       }
 | |
|     }
 | |
|     nodesOfGraph[i].setSymbolConnections(index, tmp);
 | |
|   }
 | |
|   for(i=0;i<M;i++){
 | |
|     index=0;
 | |
|     for(j=0;j<N;j++){
 | |
|       if(H[i][j]==1){
 | |
| 	tmp[index]=j;
 | |
| 	index++;
 | |
|       }
 | |
|     }
 | |
|     nodesOfGraph[i].setParityConnections(index, tmp);
 | |
|   }
 | |
|   for(i=0;i<N;i++){
 | |
|     index=0;
 | |
|     for(j=0;j<nodesOfGraph[i].numOfSymbolConnections;j++){
 | |
|       for(k=0;k<nodesOfGraph[nodesOfGraph[i].symbolConnections[j]].numOfParityConnections;k++){
 | |
| 	int t=0;
 | |
| 	for(m=0;m<index;m++){
 | |
| 	  if(nodesOfGraph[nodesOfGraph[i].symbolConnections[j]].parityConnections[k]==tmp[m]){
 | |
| 	    t=1; break;
 | |
| 	  }
 | |
| 	}
 | |
| 	if(nodesOfGraph[nodesOfGraph[i].symbolConnections[j]].parityConnections[k]==i) t=1;
 | |
| 	if(t==0) {
 | |
| 	  tmp[index]=nodesOfGraph[nodesOfGraph[i].symbolConnections[j]].parityConnections[k];
 | |
| 	  index++;
 | |
| 	}
 | |
|       }
 | |
|     }
 | |
|     nodesOfGraph[i].setSymbolMapping(index, tmp);
 | |
|   }
 | |
| }
 | |
| 
 | |
| CyclesOfGraph::~CyclesOfGraph(void){
 | |
|   delete [] tmp;
 | |
|   tmp=NULL;
 | |
|   delete [] med;
 | |
|   med=NULL;
 | |
|   delete [] tmpCycles;
 | |
|   tmpCycles=NULL;
 | |
|   delete [] cyclesTable;
 | |
|   cyclesTable=NULL;
 | |
|   delete [] nodesOfGraph;
 | |
|   nodesOfGraph=NULL;
 | |
| }
 | |
|   
 | |
| void CyclesOfGraph::getCyclesTable(void) {
 | |
|   int i, j, k, m, n, t, imed;
 | |
|   for(i=0;i<N;i++){
 | |
|     //special handlement for nodes having only one or zero connections
 | |
|     if(nodesOfGraph[i].numOfSymbolConnections<=1) {
 | |
|       cyclesTable[i]=2*N; 
 | |
|       continue;
 | |
|     }
 | |
|     for(j=0;j<nodesOfGraph[i].numOfSymbolConnections-1;j++){ //-1 because the graph is undirected
 | |
|       for(k=0;k<nodesOfGraph[nodesOfGraph[i].symbolConnections[j]].numOfParityConnections;k++){
 | |
| 	tmp[k]=nodesOfGraph[nodesOfGraph[i].symbolConnections[j]].parityConnections[k];
 | |
| 	//cout<<tmp[k]<<" ";
 | |
|       }
 | |
|       //cout<<endl;
 | |
|       int cycles=2;
 | |
|       int index=nodesOfGraph[nodesOfGraph[i].symbolConnections[j]].numOfParityConnections;
 | |
|     LOOP:
 | |
|       imed=0;
 | |
|       for(k=0;k<index;k++){
 | |
| 	if(tmp[k]==i) continue;
 | |
| 	//cout<<"k="<<k<<" "<<tmp[k]<<endl;
 | |
| 	for(m=0;m<nodesOfGraph[tmp[k]].numOfSymbolConnections;m++){
 | |
| 	  for(n=0;n<nodesOfGraph[i].numOfSymbolConnections;n++){
 | |
| 	    if((n!=j)&&(nodesOfGraph[tmp[k]].symbolConnections[m]==nodesOfGraph[i].symbolConnections[n])){
 | |
| 	      cycles+=2;
 | |
| 	      goto OUTLOOP;
 | |
| 	    }
 | |
| 	  }
 | |
| 	}
 | |
| 	for(m=0;m<nodesOfGraph[tmp[k]].numOfSymbolMapping;m++){
 | |
| 	  t=0;
 | |
| 	  for(int l=0;l<imed;l++) {
 | |
| 	    if(nodesOfGraph[tmp[k]].symbolMapping[m]==med[l]){
 | |
| 	      t=1; break;
 | |
| 	    }
 | |
| 	  }
 | |
| 	  if(t==0){
 | |
| 	    med[imed]=nodesOfGraph[tmp[k]].symbolMapping[m];
 | |
| 	    //cout<<med[imed]<<endl;
 | |
| 	    imed++;
 | |
| 	  }
 | |
| 	}
 | |
|       }
 | |
|       index=imed;//cout<<index<<" "<<endl;
 | |
|       for(k=0;k<index;k++) {
 | |
| 	tmp[k]=med[k];//cout<<tmp[k]<<" ";
 | |
|       }
 | |
|       //cout<<"j="<<j<<endl;
 | |
|       cycles+=2;
 | |
|       if(cycles>=2*N) //dead lock 
 | |
| 	goto OUTLOOP;
 | |
|       else
 | |
| 	goto LOOP;
 | |
|     OUTLOOP:
 | |
|       tmpCycles[j]=cycles;
 | |
|     }
 | |
|     //for(j=0;j<nodesOfGraph[i].numOfSymbolConnections-1;j++) cout<<tmpCycles[j]<<" ";
 | |
|     //cout<<endl;
 | |
|     cyclesTable[i]=tmpCycles[0];
 | |
|     for(j=1;j<nodesOfGraph[i].numOfSymbolConnections-1;j++){
 | |
|       if(cyclesTable[i]>tmpCycles[j])
 | |
| 	cyclesTable[i]=tmpCycles[j];
 | |
|     }
 | |
|     //OUTPUT cycles per symbol node
 | |
|     //cout<<"i="<<i<<" "<<cyclesTable[i]<<endl;
 | |
|   }
 | |
| }
 | |
|     
 | |
| int CyclesOfGraph::girth(void) {
 | |
|   int girth=2*N;
 | |
|   for(int i=0;i<N;i++) 
 | |
|     if(girth>cyclesTable[i]) girth=cyclesTable[i];
 | |
|   return(girth);
 | |
| }
 | |
| 
 | |
| void CyclesOfGraph::printCyclesTable(void){
 | |
|   using namespace std;
 | |
|   int i, temp[20];
 | |
|   /*
 | |
|   for(i=0;i<N;i++)
 | |
|     cout<<cyclesTable[i]<<" ";
 | |
|   cout<<endl;
 | |
|   */
 | |
|   for(i=0;i<20;i++) temp[i]=0;
 | |
|   for(i=0;i<N;i++){
 | |
|     if(cyclesTable[i]==4) temp[0]++;
 | |
|     else if(cyclesTable[i]==6) temp[1]++;    
 | |
|     else if(cyclesTable[i]==8) temp[2]++;
 | |
|     else if(cyclesTable[i]==10) temp[3]++;
 | |
|     else if(cyclesTable[i]==12) temp[4]++;
 | |
|     else if(cyclesTable[i]==14) temp[5]++;
 | |
|     else if(cyclesTable[i]==16) temp[6]++;
 | |
|     else if(cyclesTable[i]==18) temp[7]++;
 | |
|     else if(cyclesTable[i]==20) temp[8]++;
 | |
|     else if(cyclesTable[i]==22) temp[9]++;
 | |
|     else if(cyclesTable[i]==24) temp[10]++;
 | |
|     else if(cyclesTable[i]==26) temp[11]++;
 | |
|     else if(cyclesTable[i]==28) temp[12]++;
 | |
|     else if(cyclesTable[i]==30) temp[13]++;
 | |
|     else {
 | |
|       cout<<"Wrong cycles calculation   "<<cyclesTable[i]<<endl;
 | |
|       exit(-1);
 | |
|     }
 | |
|   }  
 | |
|   cout<<endl;
 | |
|   cout<<"Num of Nodes with local girth   4:  "<< temp[0]<<endl;
 | |
|   cout<<"Num of Nodes with local girth   6:  "<< temp[1]<<endl;
 | |
|   cout<<"Num of Nodes with local girth   8:  "<< temp[2]<<endl;
 | |
|   cout<<"Num of Nodes with local girth   10:  "<< temp[3]<<endl;
 | |
|   cout<<"Num of Nodes with local girth   12:  "<< temp[4]<<endl;
 | |
|   cout<<"Num of Nodes with local girth   14:  "<< temp[5]<<endl;
 | |
|   cout<<"Num of Nodes with local girth   16:  "<< temp[6]<<endl;
 | |
|   cout<<"Num of Nodes with local girth   18:  "<< temp[7]<<endl;
 | |
|   cout<<"Num of Nodes with local girth   20:  "<< temp[8]<<endl;
 | |
|   cout<<"Num of Nodes with local girth   22:  "<< temp[9]<<endl;
 | |
|   cout<<"Num of Nodes with local girth   24:  "<< temp[10]<<endl;
 | |
|   cout<<"Num of Nodes with local girth   26:  "<< temp[11]<<endl;
 | |
|   cout<<"Num of Nodes with local girth   28:  "<< temp[12]<<endl;
 | |
|   cout<<"Num of Nodes with local girth   30:  "<< temp[13]<<endl;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | 
