itm.c
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:7k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /* $Id: itm.c,v 1.1 1996/10/04 13:37:19 calvert Exp $
  2.  *
  3.  * itm.c -- Driver to create graphs using geo(), geo_hier(), and transtub().
  4.  *
  5.  * Each argument is a file containing ONE set of specs for graph generation.
  6.  * Such a file has the following format:
  7.  *    <method keyword> <number of graphs> [<initial seed>]
  8.  *    <method-dependent parameter lines>
  9.  * Supported method names are "geo", "hier", and "ts".
  10.  * Method-dependent parameter lines are described by the following:
  11.  *    <geo_parms> ::=
  12.  *        <n> <scale> <edgeprobmethod> <alpha> [<beta>] [<gamma>]
  13.  *    <"geo" parms> ::= <geo_parms>
  14.  *    <"hier" parms> ::=
  15.  *          <number of levels> <edgeconnmethod> <threshold>
  16.  *          <geo_parms>+  {one per number of levels}
  17.  *    <"ts" parms> ::=
  18.  *          <# stubs/trans node> <#t-s edges> <#s-s edges>
  19.  *          <geo_parms>       {top-level parameters}
  20.  *          <geo_parms>       {transit domain parameters}
  21.  *          <geo_parms>       {stub domain parameters}
  22.  *
  23.  * Note that the stub domain "scale" parameter is ignored; a fraction
  24.  * of the transit scale range is used.  This fraction is STUB_OFF_FACTOR,
  25.  * defined in ts.c.
  26.  * 
  27.  * From the foregoing, it follows that best results will be obtained with
  28.  *   -- a SMALL value for top-level scale parameter
  29.  *   -- a LARGE value for transit-level scale parameter
  30.  * and then the value of stub-level scale parameter won't matter.
  31.  *
  32.  * The indicated number of graphs is produced using the given parameters.
  33.  * If the initial seed is present, it is used; otherwise, DFLTSEED is used.
  34.  *
  35.  * OUTPUT FILE NAMING CONVENTION:
  36.  * The i'th graph created with the parameters from file "arg" is placed
  37.  * in file "arg-i.gb", where the first value of i is zero.
  38.  *
  39.  */
  40. #include <stdio.h>
  41. #include <sys/types.h> /* for NBBY, number of bits/byte */
  42. #include <stdlib.h> /* for calloc(),atoi(),etc. */
  43. #include <string.h> /* for strtok() */
  44. #include "gb_graph.h"
  45. #include "geog.h"
  46. #define LINE 512
  47. #define GEO_KW "geo"
  48. #define HIER_KW "hier"
  49. #define TS_KW "ts"
  50. #define GEO 100
  51. #define HIER 101
  52. #define TS 102
  53. char *delim = " tn", *nonestr = "<none>";
  54. static char  errstr[256];
  55. char *
  56. get_geoparms(FILE * f, geo_parms * pp)
  57. {
  58. char *cp;
  59. char inbuf[LINE];
  60.     do {
  61. if (feof(f))
  62.     return "file ended unexpectedly";
  63. fgets(inbuf, LINE - 1, f);
  64. cp = strtok(inbuf, delim);
  65.     } while ((cp == NULL) || (*cp == '#'));
  66.     if ((pp->n = atoi(cp)) <= 0)
  67. return "bad n parameter";
  68.     cp = strtok(0, delim);
  69.     if (cp == NULL || (pp->scale = atoi(cp)) <= 0)
  70. return "bad scale parameter";
  71.     cp = strtok(0, delim);
  72.     if (cp == NULL) return "bad edge method parameter";
  73.     pp->method = atoi(cp);
  74.     if (pp->method < 1 || pp->method > 6)
  75. return "bad edge method parameter";
  76.     cp = strtok(0, delim);
  77.     if (cp == NULL) return "bad alpha parameter";
  78.     pp->alpha = atof(cp);
  79.     if (pp->alpha < 0.0 || pp->alpha > 1.0)
  80. return "bad alpha parameter";
  81.     cp = strtok(0, delim);
  82.     if (cp != NULL) {
  83.        if ((pp->beta = atof(cp)) < 0.0)
  84.        return "bad beta parameter";
  85.     } else pp->beta = 0.0;
  86.     cp = strtok(0,delim);
  87.     if (cp != NULL) {
  88.  if ((pp->gamma = atof(cp)) < 0.0)
  89.    return "bad gamma parameter";
  90.     } else pp->gamma = 0.0;
  91.     return NULL;
  92. } /* get_parms */
  93. char *
  94. get_hierparms(FILE *f,
  95.                 int *nLev,
  96. int *ecMeth,
  97. int *haux,
  98.                 geo_parms *parmsbuf)
  99. {
  100. char inbuf[LINE];
  101. char *cp;
  102. int i;
  103.     do {
  104. if (feof(f))
  105.     return "file ended unexpectedly";
  106. fgets(inbuf, LINE - 1, f);
  107. cp = strtok(inbuf, delim);
  108.     } while ((cp == NULL) || (*cp == '#'));
  109.     *nLev = atoi(cp);
  110.     if (*nLev < 0 || *nLev > MAXLEVEL)
  111. return "bad number of levels";
  112.     cp = strtok(0, delim);
  113.     if (cp == NULL || (*ecMeth = atoi(cp)) < 0)
  114. return "bad/missing edge connection method";
  115.     cp = strtok(0, delim);
  116.     if (cp != NULL)
  117. *haux = atoi(cp);
  118.     for (i=0; i<*nLev; i++)
  119. if (cp = get_geoparms(f,&parmsbuf[i]))
  120.     return cp;
  121.     return NULL;
  122. }
  123. char *
  124. get_tsparms(FILE *f,
  125.                 int *SpT, int *TSe, int *SSe,
  126.                 geo_parms *parmsbuf)
  127. {
  128. char inbuf[LINE];
  129. char *cp;
  130. int i;
  131.     if (SpT==NULL ||
  132. SSe==NULL ||
  133. TSe==NULL)
  134. return "bad input parameter (null ptr)";
  135.     do {
  136. if (feof(f))
  137.     return "file ended unexpectedly";
  138. fgets(inbuf, LINE - 1, f);
  139. cp = strtok(inbuf, delim);
  140.     } while ((cp == NULL) || (*cp == '#'));
  141.     if ((*SpT = atoi(cp)) < 0)
  142. return "bad stubs/trans parameter";
  143.     cp = strtok(0, delim);
  144.     if (cp == NULL)
  145. return "missing stub-stub edge parameter";
  146.     if ((*TSe = atoi(cp)) < 0)
  147. return "bad transit-stub edge parameter";
  148.     cp = strtok(0, delim);
  149.     if (cp == NULL)
  150. return "missing transit-stub edge parameter";
  151.     if ((*SSe = atoi(cp))  < 0)
  152. return "bad stub-stub edge parameter";
  153.     for (i=0; i<3; i++)
  154. if (cp = get_geoparms(f, &parmsbuf[i]))
  155.     return cp;
  156.     return NULL;
  157. }
  158. char *
  159. makegraph(char *iname)
  160. {
  161. FILE *infile;
  162. Graph *G = NULL;
  163. char inbuf[LINE],outfilename[LINE];
  164. register char *cp;
  165. char *method;
  166. int count, lineno=0, numlevels, nerrors;
  167. int i, m=0, prefixlen;
  168. int edgeConnMeth, haux, stubsPerTrans, tsEdges, ssEdges;
  169. long seed;
  170. geo_parms parmsbuf[MAXLEVEL]; /* make sure MAXLEVEL >= 3 */
  171.     if ((infile = fopen(iname, "r")) == NULL) {
  172.         sprintf(errstr, "can't open input file %s", iname);
  173.         die(errstr);
  174.     }
  175.     /* set up output file name */
  176.     sprintf(outfilename,"%s-",iname);
  177.     prefixlen = strlen(outfilename);
  178.     
  179.     do {
  180.         fgets(inbuf, LINE - 1, infile); lineno++;
  181.         method = strtok(inbuf, delim);
  182.     } while (((method == NULL) || (*method == '#'))
  183.             && !feof(infile));
  184. /* skip over comments  and blank lines */
  185.     if ((cp = strtok(NULL, delim))==NULL)
  186. return "missing <number of graphs>";
  187.     count = atoi(cp);
  188.     if ((cp = strtok(NULL, delim))==NULL)
  189. seed = 0;
  190.     else
  191.         seed = atol(cp);
  192.     if (strcmp(method,GEO_KW)==0) {
  193. if (cp = get_geoparms(infile,parmsbuf))
  194.     return cp;
  195. m = GEO;
  196.     } else if (strcmp(method,HIER_KW)==0) {
  197. if (cp = get_hierparms(infile,
  198. &numlevels, &edgeConnMeth, &haux, parmsbuf))
  199.     return cp;
  200. m = HIER;
  201.     } else if (strcmp(method,TS_KW)==0) {
  202. if (cp = get_tsparms(infile,
  203. &stubsPerTrans, &tsEdges, &ssEdges, parmsbuf))
  204.     return cp;
  205.         m = TS;
  206.     } else {
  207. sprintf(errstr,"Unknown generation method %s",method);
  208. return errstr;
  209.     }
  210.     if (seed)
  211. gb_init_rand(seed);
  212.     else
  213. gb_init_rand(DEFAULT_SEED);
  214.     for (i=0; i<count; i++) {
  215. sprintf(outfilename+prefixlen,"%d.gb",i);
  216. switch(m) {
  217. case GEO:
  218.             do {
  219. gb_recycle(G);
  220. G = geo(0,parmsbuf);
  221.     } while (G != NULL && !isconnected(G));
  222. break;
  223. case HIER:
  224.     G = geo_hier(0,numlevels,edgeConnMeth,haux,parmsbuf);
  225.     break;
  226. case TS:
  227.     G = transtub(0,stubsPerTrans,tsEdges,ssEdges,&parmsbuf[0],
  228. &parmsbuf[1],&parmsbuf[2]);
  229.     break;
  230. default:
  231.     return "This can't happen!";
  232. } /* switch */
  233. if (G==NULL) {
  234.     sprintf(errstr,"Error creating graph %d, trouble code=%d",i,
  235.                gb_trouble_code);
  236.     return errstr;
  237. }
  238. nerrors = save_graph(G, outfilename);
  239. if (nerrors > 0)
  240.     fprintf(stderr, "%s had %d anomaliesn", outfilename,nerrors);
  241. gb_recycle(G);
  242.     } /* for */
  243.     return NULL;
  244. }
  245. main(int argc, char **argv)
  246. {
  247.     FILE           *infile;
  248.     char    *rv;
  249.     char           *badinpstr = "badly formed input file %s, continuingn";
  250.     if (argc == 1) {
  251. printf("itm <spec-file0> <spec-file1> ....nn");
  252. return;
  253.     }
  254.     while (--argc) {
  255.         if (rv = makegraph(*(++argv))) {
  256.     fprintf(stderr,"Error processing file %s: %sn",*argv,rv);
  257. }
  258.     } /* while on argc */
  259.     exit(0);
  260. }