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

📄 geog.c

📁 it is very important
💻 C
📖 第 1 页 / 共 2 页
字号:
strcpy(ss,u->name);strcpy(tt,v->name);b = strchr(s,'.');c = strchr(t,'.');if (b && c) {  *b++ = '\0';  *c++ = '\0';}while (!strcmp(s,t)) { /* still equal => must still be a '.' */  s = b;  t = c;  b = strchr(s,'.');  c = strchr(t,'.');  if (b && c) {    *b++ = '\0';    *c++ = '\0';  }  nlev -= 1;}return nlev;/* NOTREACHED */}Graph *geo_hier(long seed,	int nlevels,	/* number of levels (=size of following array) */	int edgemeth,	/* method of attaching edges */	int aux,	/* auxiliary parameter for edge method (threshold) */	geo_parms *pp)	/* array of parameter structures, one per level */{Graph *newG, *tG, *GG, *srcG, *dstG;long *numv;		/* array of sizes of lower-level graphs */geo_parms *curparms, workparms[MAXLEVEL];register i,k,indx;long dst;int temp,total,lowsize,otherend,blen,level;long maxP[MAXLEVEL], maxDiam[MAXLEVEL], wt[MAXLEVEL];Vertex *np,*vp,*up,*base;Arc *ap;char vnamestr[MAXNAMELEN];     if (seed)		/* convention: zero seed means don't use */	gb_init_rand(seed);     if (nlevels < 1 || nlevels > MAXLEVEL) {	gb_trouble_code = bad_specs+HIER_TRBL;	return NULL;     }     /* 1 <= nlevels <= MAXLEVEL */     /* copy the parameters so we can modify them, and caller doesn't      * see the changes.      */     for (level=0; level<nlevels; level++)	bcopy((char *)&pp[level],&workparms[level],sizeof(geo_parms));     level = 0;     gb_trouble_code = 0;          tG = NULL;     do {	gb_recycle(tG);        tG = geo(0L,workparms);     } while (tG != NULL && !isconnected(tG));     if (tG==NULL)	return tG;     maxDiam[0] = fdiam(tG);     maxP[0] = maxDiam[0];     wt[0] = 1;     for (i=1; i<nlevels; i++)       maxDiam[i] = -1;     curparms = workparms;     while (++level < nlevels) {       long tdiam;	curparms++;	/* parameters for graphs @ next level */        /* spread out the numbers of nodes per graph at this level */	numv = (long *) calloc(tG->n,sizeof(long));	lowsize = curparms->n;        randomize(numv,tG->n,curparms->n,3*tG->n);	/* create a subordinate graph for each vertex in the "top" graph,         * and add it into the new graph as a whole.	 * We construct the subgraphs all at once to ensure that each	 * has a unique address.	 */	for (i=0,vp=tG->vertices; i<tG->n; i++,vp++) {	    curparms->n = numv[i];	    do {		newG = geo(0L,curparms);		if (newG==NULL) return NULL;	    } while (!isconnected(newG));	    vp->sub = newG;	    tdiam = fdiam(newG);	    if (tdiam>maxDiam[level])	      maxDiam[level] = tdiam;	}	/* do some calculations before "flattening" the top Graph */	total = 0;	for (i=0; i<tG->n; i++) {	/* translate node numbers */	    temp = numv[i];			    numv[i]= total;	    total += temp;	}	if (total != tG->n*lowsize) {	    fprintf(stderr,"bad size of new graph!\n");	    fprintf(stderr,"total %d tG->n %d lowsize %d\n",total,tG->n,lowsize);	    gb_trouble_code = impossible+HIER_TRBL;	    return NULL;	}	/* now create what will become the "new" top-level graph */	newG = gb_new_graph(total);	if (newG==NULL) {	    gb_trouble_code += HIER_TRBL;	    return NULL;	}	/* resolution of the new graph */	newG->Gscale = tG->Gscale * curparms->scale;       /* compute edge weights for this level */       wt[level] = maxP[level-1] + 1;       maxP[level] = (maxDiam[level]*wt[level])	 + (maxDiam[level-1]*maxP[level-1]);       for (i=0,vp=tG->vertices; i<tG->n; i++,vp++) {	 strcpy(vnamestr,vp->name);	/* base name for all "offspring" */	 blen = strlen(vnamestr);	 vnamestr[blen] = '.';	    	 GG = tG->vertices[i].sub;	 base = newG->vertices + numv[i];	/* start of this node's */	 for (k=0,np=base,up=GG->vertices; k<GG->n; k++,np++,up++) {	   /* add the node's edges */	   for (ap=up->arcs; ap; ap=ap->next)  {	     otherend = ap->tip - GG->vertices;	     if (k < otherend)	       gb_new_edge(np,base+otherend,ap->len);	     	   }	   /* now set the new node's position */	   np->xpos = tG->vertices[i].xpos * curparms->scale + up->xpos;	   np->ypos = tG->vertices[i].ypos * curparms->scale + up->ypos;	   /* give the "new" node a name by catenating top & bot names */	   strcpy(vnamestr+blen+1,up->name);	   np->name = gb_save_string(vnamestr);	 } /* loop over GG's vertices */       }  /* loop over top-level vertices */       /*	* Now we have to transfer the top-level edges to new graph.	* This is done by one of three methods:	*    0: choose a random node in each subgraph	*    1: attach to the smallest-degree non-leaf node in each	*    2: attach to smallest-degree node	*    3: attach to first node with degree less than aux	*/       for (i=0; i<tG->n; i++) {	 Vertex *srcp, *dstp;	 Graph *srcG, *dstG;	 srcG = tG->vertices[i].sub;	 if (srcG == NULL) {	/* paranoia */	   gb_trouble_code = impossible+HIER_TRBL+1;	   return NULL;	 }	 for (ap=tG->vertices[i].arcs; ap; ap=ap->next) {	   dst = ap->tip - tG->vertices;	   if (i > dst)	/* consider each edge only ONCE */	     continue;	   dstG = ap->tip->sub;	   if (dstG == NULL) {	/* paranoia */	     gb_trouble_code = impossible+HIER_TRBL+1;	     return NULL;	   }	   /* choose endpoints of the top-level edge */	   switch (edgemeth) {	   case 0:	/* choose random node in each */	     srcp = srcG->vertices + gb_next_rand()%srcG->n;	     dstp = dstG->vertices + gb_next_rand()%dstG->n;	     break;	   case 1:	/* find nonleaf node of least degree in each */	     /* This causes problems with graph size < 3 */	     if (srcG->n > 2)	       srcp = find_small_deg(srcG,NOLEAF);	     else	       srcp = find_small_deg(srcG,LEAFOK);	     if (dstG->n > 2)	       dstp = find_small_deg(dstG,NOLEAF);	     else	       dstp = find_small_deg(dstG,LEAFOK);	     break;	   case 2: /* find node of smallest degree */	     srcp = find_small_deg(srcG,LEAFOK);	     dstp = find_small_deg(dstG,LEAFOK);	     break;	   case 3: /* first node w/degree < aux */	     srcp = find_thresh_deg(srcG,aux);	     dstp = find_thresh_deg(dstG,aux);	   default:	     gb_trouble_code = bad_specs+HIER_TRBL;	     return NULL;	   }	/* switch on edgemeth */	   /* pointer arithmetic: isn't it fun?	      printf("Copying edge from %d to %d\n",	      numv[i]+(srcp - srcG->vertices),	      numv[dst] + (dstp - dstG->vertices));	      */	   if (srcp==NULL || dstp==NULL) {	     gb_trouble_code = impossible + HIER_TRBL+2;	     return NULL;	   }			   srcp = newG->vertices + numv[i] + (srcp - srcG->vertices);	   dstp = newG->vertices + numv[dst] + (dstp - dstG->vertices);	   gb_new_edge(srcp,dstp,idist(srcp,dstp));	 } /* for each arc */       } /* for each vertex of top graph */        /* now make the "new" graph the "top" graph and recycle others */       for (i=0,vp=tG->vertices; i<tG->n; i++,vp++)	 gb_recycle(vp->sub);       gb_recycle(tG);       tG = newG;       free(numv);     }	/* while more levels *//* Finally, go back and add the policy weights, * based upon the computed max diameters * and Max Path lengths. */   for (i=0; i<tG->n; i++)     for (ap=tG->vertices[i].arcs; ap; ap=ap->next) {       dst = ap->tip - tG->vertices;       if (i > dst)	/* consider each edge only ONCE */	 continue;       assert(i != dst); /* no self loops */       /* i < dst: it is safe to refer to ap's mate by ap+1.  */       level = edge_level(&tG->vertices[i],&tG->vertices[dst],nlevels);       ap->policywt = (ap+1)->policywt = wt[level];     }/* construct the utility and id strings for the new graph. * Space constraints will restrict us to keeping about 4 levels' * worth of info. */  {    char buf[ID_FIELD_SIZE+1];    register char *cp;    int len, nextlen, left;    strcpy(tG->util_types,GEO_UTIL);	/* same for all geo graphs,	*/					/* defined in geo.h		*/    cp = tG->id;    sprintf(cp,"geo_hier(%d,%d,%d,%d,[",seed,nlevels,edgemeth,aux);    len = strlen(cp);    left = ID_FIELD_SIZE - len;    cp += len;        for (i=0; (i < nlevels) && (left > 0); i++) {      nextlen = printparms(buf,&pp[i]);      strncpy(cp,buf,left);      left -= nextlen;      cp += nextlen;    }    if (left > 0) {      sprintf(buf,"])");      nextlen = strlen(buf);      strncpy(cp,buf,left);    }  }  return tG;}	/* geo_hier() */

⌨️ 快捷键说明

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