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

📄 graph.cpp

📁 This a framework to test new ideas in transmission technology. Actual development is a LDPC-coder in
💻 CPP
📖 第 1 页 / 共 4 页
字号:
  /*   Match graph edges  */  while(cedgecount<vedgecount) {    if((*(*graph).cdegreelist).numofnodes[0]!=0) {      (*(*graph).cdegreelist).numofnodes[0]--;      (*(*graph).cdegreelist).numofnodes[1]++;      cedgecount ++;    } else {      (*(*graph).cdegreelist).numofnodes[1]--;      (*(*graph).cdegreelist).numofnodes[2]++;      cedgecount ++;    }  }  while(cedgecount>vedgecount) {    if((*(*graph).cdegreelist).numofnodes[1]!=0) {      (*(*graph).cdegreelist).numofnodes[1]--;      (*(*graph).cdegreelist).numofnodes[0]++;      cedgecount --;    }  }  /*  Match graph1 edges */  while(cedgecount1<vedgecount1) {    if((*(*graph1).cdegreelist).numofnodes[0]!=0) {      (*(*graph1).cdegreelist).numofnodes[0]--;      (*(*graph1).cdegreelist).numofnodes[1]++;      cedgecount1 ++;    } else {      (*(*graph1).cdegreelist).numofnodes[1]--;      (*(*graph1).cdegreelist).numofnodes[2]++;      cedgecount1 ++;    }  }  while(cedgecount1>vedgecount1) {    if((*(*graph1).cdegreelist).numofnodes[1]!=0) {      (*(*graph1).cdegreelist).numofnodes[1]--;      (*(*graph1).cdegreelist).numofnodes[0]++;      cedgecount1 --;    }  }  vedgecount=0;  for (degreesnum=0; degreesnum<vdegreesnum; degreesnum++)    vedgecount+=(*(*graph).vdegreelist).numofnodes[degreesnum]*(*(*graph).vdegreelist).degree[degreesnum];  cedgecount=0;  for (degreesnum=0; degreesnum<cdegreesnum; degreesnum++)    cedgecount+=(*(*graph).cdegreelist).numofnodes[degreesnum]*(*(*graph).cdegreelist).degree[degreesnum];  vedgecount1=0;  for (degreesnum=0; degreesnum<vdegreesnum1; degreesnum++)    vedgecount1+=(*(*graph1).vdegreelist).numofnodes[degreesnum]*(*(*graph1).vdegreelist).degree[degreesnum];  cedgecount1=0;  for (degreesnum=0; degreesnum<cdegreesnum1; degreesnum++)    cedgecount1+=(*(*graph1).cdegreelist).numofnodes[degreesnum]*(*(*graph1).cdegreelist).degree[degreesnum];  if (verbose>0) {    printf("\n\n   Final counts:\n");    printf("  vnodenum=%d cnodenum=%d vedgecount:=%d cedgecount:=%d\n", vnodenum, cnodenum, vedgecount, cedgecount);    printf("  vnodenum1=%d cnodenum1=%d vedgecount1:=%d cedgecount1:=%d\n", vnodenum1, cnodenum1, vedgecount1, cedgecount1);  }  /* verify that edges and variables match */  assert(vnodenum==vnodenum1);  assert(vedgecount==cedgecount);  assert(vedgecount1==cedgecount1);  /* enter them into graph structure */  (*graph).vnodenum=vnodenum;  (*graph).cnodenum=cnodenum;  (*graph1).vnodenum=vnodenum1;  (*graph1).cnodenum=cnodenum1;  /******************************************************/  /***********  Operations for first graph   ************/  /******************************************************/  /* now the true rate is determined for graph*/  (*graph).rate=1.0-((double)(*graph).cnodenum)/((double)(*graph).vnodenum);  /* allocate memory for nodes of graph */  (*graph).vnodelist=(vnode *)allocate(sizeof(vnode)*(*graph).vnodenum);  (*graph).cnodelist=(cnode *)allocate(sizeof(cnode)*(*graph).cnodenum);  /* set the degree of each node */  degree=0;  while ((*(*graph).vdegreelist).numofnodes[degree]<=0)    degree++;  degreecounter=(*(*graph).vdegreelist).numofnodes[degree];  assert(degreecounter>0);  for (node=0; node<(*graph).vnodenum; node++) {    vnodedegree=(*(*graph).vdegreelist).degree[degree];    degreecounter--;    assert(degreecounter>=0);    if ((degreecounter==0) && (degree<vdegreesnum-1)) {      degree++;      while((*(*graph).vdegreelist).numofnodes[degree]<=0)        degree++;      /* assert(degree<vdegreesnum); */      degreecounter=(*(*graph).vdegreelist).numofnodes[degree];      assert(degreecounter>0);    }  }  degree=0;  while ((*(*graph).cdegreelist).numofnodes[degree]<=0)    degree++;  degreecounter=(*(*graph).cdegreelist).numofnodes[degree];  assert(degreecounter>0);  for (node=0; node<(*graph).cnodenum; node++) {    cnodedegree=(*(*graph).cdegreelist).degree[degree];    degreecounter--;    assert(degreecounter>=0);    if ((degreecounter==0) && (degree<cdegreesnum-1)) {      degree++;      while((*(*graph).cdegreelist).numofnodes[degree]<=0)        degree++;      assert(degree<cdegreesnum);      degreecounter=(*(*graph).cdegreelist).numofnodes[degree];      assert(degreecounter>0);    }  }  /* count the edges again to make sure no mistakes were made */  vedgecountnew=0;  for (node=0; node<(*graph).vnodenum; node++)    vedgecountnew+=vnodedegree;  assert(vedgecountnew==vedgecount);  cedgecountnew=0;  for (node=0; node<(*graph).cnodenum; node++)    cedgecountnew+=cnodedegree;  assert(cedgecountnew==cedgecount);  /* now allocate memory for edges */  for (node=0; node<(*graph).vnodenum; node++)    vnodeedgelist=(edge *)allocate(sizeof(edge)*vnodedegree);  for (node=0; node<(*graph).cnodenum; node++)    cnodeedgelist=(edge *)allocate(sizeof(edge)*cnodedegree);  /* generate random permutation which determines graph */  perm=(int *)allocate(sizeof(int)*vedgecount);  iperm=(int *)allocate(sizeof(int)*vedgecount);  randompermutation(perm, iperm, vedgecount);  /* allocate temporary memory */  whichnode=(int *)allocate(sizeof(int)*vedgecount);  whichsocket=(int *)allocate(sizeof(int)*vedgecount);  /* fill in whichnode and whichsocket */  edgecounter=0;  for (node=0; node<(*graph).cnodenum; node++) {    for (socket=0; socket<cnodedegree; socket++) {      *(whichnode+edgecounter)=node;      *(whichsocket+edgecounter)=socket;      edgecounter++;    }  }  edgecounter=0;  for (node=0; node<(*graph).vnodenum; node++) {    for (socket=0; socket<vnodedegree; socket++) {      tonode=*(whichnode+*(perm+edgecounter));      tosocket=*(whichsocket+*(perm+edgecounter));      vnodeedge.dest=tonode;      vnodeedge.socket=tosocket;      cnodetoedge.dest=node;      cnodetoedge.socket=socket;      edgecounter++;    }  }  /* free temporary memory */  free(perm);  free(iperm);  free(whichnode);  free(whichsocket);  /******************************************************/  /***********  Operations for second graph   ***********/  /******************************************************/  /* now the true rate is determined */  (*graph1).rate=1.0-((double)(*graph1).cnodenum)/((double)(*graph1).vnodenum);  /* allocate memory for nodes */  (*graph1).vnodelist=(vnode *)allocate(sizeof(vnode)*(*graph1).vnodenum);  (*graph1).cnodelist=(cnode *)allocate(sizeof(cnode)*(*graph1).cnodenum);  /* set the degree of each node */  degree=0;  while ((*(*graph1).vdegreelist).numofnodes[degree]<=0)    degree++;  degreecounter=(*(*graph1).vdegreelist).numofnodes[degree];  assert(degreecounter>0);  for (node=0; node<(*graph1).vnodenum; node++) {    vnodedegree1=(*(*graph1).vdegreelist).degree[degree];    degreecounter--;    assert(degreecounter>=0);    if ((degreecounter==0) && (degree<vdegreesnum1-1)) {      degree++;      while((*(*graph1).vdegreelist).numofnodes[degree]<=0)        degree++;      /* assert(degree<vdegreesnum1); */      degreecounter=(*(*graph1).vdegreelist).numofnodes[degree];      assert(degreecounter>0);    }  }  degree=0;  while ((*(*graph1).cdegreelist).numofnodes[degree]<=0)    degree++;  degreecounter=(*(*graph1).cdegreelist).numofnodes[degree];  assert(degreecounter>0);  for (node=0; node<(*graph1).cnodenum; node++) {    cnodedegree1=(*(*graph1).cdegreelist).degree[degree];    degreecounter--;    assert(degreecounter>=0);    if ((degreecounter==0) && (degree<cdegreesnum1-1)) {      degree++;      while((*(*graph1).cdegreelist).numofnodes[degree]<=0)        degree++;      assert(degree<cdegreesnum1);      degreecounter=(*(*graph1).cdegreelist).numofnodes[degree];      assert(degreecounter>0);    }  }  /* count the edges again to make sure no mistakes were made */  vedgecountnew1=0;  for (node=0; node<(*graph1).vnodenum; node++)    vedgecountnew1+=vnodedegree1;  assert(vedgecountnew1==vedgecount1);  cedgecountnew1=0;  for (node=0; node<(*graph1).cnodenum; node++)    cedgecountnew1+=cnodedegree1;  assert(cedgecountnew1==cedgecount1);  /* now allocate memory for edges */  for (node=0; node<(*graph1).vnodenum; node++)    vnodeedgelist1=(edge *)allocate(sizeof(edge)*vnodedegree1);  for (node=0; node<(*graph1).cnodenum; node++)    cnodeedgelist1=(edge *)allocate(sizeof(edge)*cnodedegree1);  /* generate random permutation which determines graph */  perm=(int *)allocate(sizeof(int)*vedgecount1);  iperm=(int *)allocate(sizeof(int)*vedgecount1);  randompermutation(perm, iperm, vedgecount1);  /* allocate temporary memory */  whichnode=(int *)allocate(sizeof(int)*vedgecount1);  whichsocket=(int *)allocate(sizeof(int)*vedgecount1);  /* fill in whichnode and whichsocket */  edgecounter=0;  for (node=0; node<(*graph1).cnodenum; node++) {    for (socket=0; socket<cnodedegree1; socket++) {      *(whichnode+edgecounter)=node;      *(whichsocket+edgecounter)=socket;      edgecounter++;    }  }  edgecounter=0;  for (node=0; node<(*graph1).vnodenum; node++) {    for (socket=0; socket<vnodedegree1; socket++) {      tonode=*(whichnode+*(perm+edgecounter));      tosocket=*(whichsocket+*(perm+edgecounter));      vnodeedge1.dest=tonode;      vnodeedge1.socket=tosocket;      cnodetoedge1.dest=node;      cnodetoedge1.socket=socket;      edgecounter++;    }  }  /* free temporary memory */  free(perm);  free(iperm);  free(whichnode);  free(whichsocket);}/*********************************//* Begin construction of graphs  *//*********************************/void beginconstructgraph(int user, graphs *graph, int *vnodenum, int *vdegreelist, double *vpercentagelist, int vdegreesnum, int *cdegreelist, double *cpercentagelist, int cdegreesnum, int verbose) {  int node, socket, tosocket, tonode, i, j, flag;  int *perm, *iperm, *temp;  int cnodenum, degreesnum, conodenum, degree, degreecounter;  int vedgecount, cedgecount, vedgecountnew, cedgecountnew, edgecounter;  int *whichnode, *whichsocket;  double sumv, sumc, target;  /* set number of degrees and max degrees */  if (verbose>0) {    printf("\nuser %d\n", user);    printf("Construction of (irregular) graphs:\n");    printf("1. Set number of degrees and max degrees.\n");  }  assert(vdegreesnum>0 && cdegreesnum>0);				       /* for first graph  */  (*graph).vdegreesnum=vdegreesnum;  (*graph).cdegreesnum=cdegreesnum;  (*graph).vmaxdegree=*(vdegreelist+vdegreesnum-1);  (*graph).cmaxdegree=*(cdegreelist+cdegreesnum-1);  /* take the percentage lists and convert them */  /* into node perspective                      */  if (verbose>0)    printf("2. Convert node percentages into node perspective.\n");  sumv=0;  /* for first graph */  for (degreesnum=0; degreesnum<vdegreesnum; degreesnum++)    sumv+=*(vpercentagelist+degreesnum)/((double)*(vdegreelist+degreesnum));  (*graph).sumv=sumv;  sumc=0;  for (degreesnum=0; degreesnum<cdegreesnum; degreesnum++)    sumc+=*(cpercentagelist+degreesnum)/((double)*(cdegreelist+degreesnum));  (*graph).sumc=sumc;  /* allocate memory */  (*graph).vdegreelist=(degreelist *)allocate(sizeof(degreelist));  (*graph).cdegreelist=(degreelist *)allocate(sizeof(degreelist));  if (verbose>0)    printf("3. Number of vnodes: [before adjustments]\n");  for (degreesnum=vdegreesnum-1; degreesnum>=0; degreesnum--) {    (*(*graph).vdegreelist).degree[degreesnum]=*(vdegreelist+degreesnum);    (*(*graph).vdegreelist).numofnodes[degreesnum]=(int)round((*vnodenum)**(vpercentagelist+degreesnum)/(sumv**(vdegreelist+degreesnum)));    if (verbose>0) {      printf("degreesnum:=%d\n", degreesnum);      printf("   vdegree:=%d vdegreenum:=%d\n\n", (*(*graph).vdegreelist).degree[degreesnum], (*(*graph).vdegreelist).numofnodes[degreesnum]);    }  }  if(verbose>0)    printf("\n\n");  /* first calculation of vnodenum */  (*vnodenum)=0;  for(degreesnum=0; degreesnum<vdegreesnum; degreesnum++)    (*vnodenum) +=(*(*graph).vdegreelist).numofnodes[degreesnum];  if(verbose>0) {    printf("vnodenum[%d]=%d\n", user, (*vnodenum));  }}/*****************************************************//*  Verify if all graphs have same number of vnodes  *//*****************************************************/int verifyvnodenum(int *vnodenum, int numus) {  int i, flag, flag1=-1;  flag=vnodenum[0];  for(i=1; i<numus; i++) {    if(vnodenum[i]<flag)      flag1=1;    if(vnodenum[i]>flag) {      flag=vnodenum[i];      flag1=1;    }  }  if(flag1==1)    return(flag);  else    return(-1);}/*****************************//*  Arrange number of vnode  *//*****************************/void arrangevnode(graphs *graph, int vdegreesnum, int vnodenum, int vnodemax) {  int degreesnum=0;  while(vnodenum<vnodemax) {    (*(*graph).vdegreelist).numofnodes[degreesnum]++;    vnodenum++;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -