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

通讯编程

开发平台:

Visual C++

  1. /* $Id: edriver.c,v 1.1 1996/10/04 13:33:19 ewz Exp $
  2.  *
  3.  * edriver.c -- driver program to call eval routines. 
  4.  *
  5.  * Input: <filestem> [-nd] [-<f0><f1>]*
  6.  *
  7.  *      The file "./<filestem>.gb" is expected to contain a graph
  8.  *      description created by "gb_save()".
  9.  *
  10.  * If the -nd option is given, the distribution files will
  11.  * not be created.  They take up lots of space for larger graphs.
  12.  *
  13.  *      The options -<f0><f1> specify the fields to use
  14.  *      in computing the shortest path metrics.  For each -<f0><f1>
  15.  *      pair, shortest paths will be computed using <f0> as the distance
  16.  *      metric and <f1> as the measurement metric, where <f0> and <f1>
  17.  *      are one of {l, a, b, h}, indicating the arc field to use
  18.  *      (l = len, a = a, b = b) or to use unit weight (h).  The scalar
  19.  *      properties of diameter and average depth will be stored in the
  20.  *      scalar file; if the -nd option is not present, the depth 
  21.  *      distribution will be stored in the file <filestem>-<f0><f1>d.
  22.  *
  23.  * Output: 
  24.  *
  25.  *      ./<filestem>-ev - scalar characteristics of graph:
  26.  *              average vertex degree 
  27.  *                      diam-<f0><f1>
  28.  *                      avgdepth-<f0><f1>
  29.  * number of biconnected components
  30.  * ./<filestem>-dd - vertex degree distribution
  31.  *      ./<filestem>-<f0><f1>d - depth distribution for <f0><f1> metrics
  32.  *
  33.  * Default is to evaluate all characteristics. 
  34.  *
  35.  */
  36. #include <stdio.h>
  37. #include "gb_graph.h"
  38. #include "gb_save.h"
  39. #include "gb_dijk.h"
  40. #include "eval.h"
  41. #define MAXF 132
  42. #define OPEN_OUT(f,s)   
  43. { strcpy(outfile+plen,s);
  44.   if ((f = fopen(outfile,"a"))==NULL) {
  45. fprintf(stderr,"Unable to open output file %sn",s);
  46. exit(2);
  47.         } 
  48.  }
  49. main(argc,argv)
  50.     int argc;
  51.     char *argv[];
  52. {
  53.     int i; 
  54.     int min, max, sum, bins, *ddist; 
  55.     float avg;
  56.     Graph *g; 
  57.     char infile[MAXF];
  58.     char outfile[MAXF];
  59.     char *dstr = "-nd";
  60.     int plen, idx;
  61.     FILE *ddf, *evf, *pdf, *fp, *fopen();
  62.     int prdist = 1;
  63.     enum Field f0, f1;
  64.     int first = 1;
  65.     if (argc == 1) {
  66. printf("Usage: edriver <filestem> [-nd] [-<f0><f1>]*nn");
  67. return;
  68.     }
  69.     /* determine whether to print distributions */
  70.     /* determine where in argv the field pairs begin */
  71.     if (argc >= 3 && strcmp(argv[2],dstr) == 0) {
  72.         prdist = 0;
  73.       idx = 3;
  74.     }
  75.     else idx = 2;
  76.     sprintf(infile,"%s.gb",argv[1]);
  77.     if ((g = restore_graph(infile))==NULL) {
  78. fprintf(stderr,"Unable to restore graph from %s.n",infile);
  79. exit(1);
  80.     }
  81.     /* open output file -ev in append mode */
  82.     /* check whether this is a new run of stat or an additional run */
  83.     /* if new then put header info in -ev */
  84.     /*             open -dd */
  85.     /*             run node degree distribution routines */
  86.     /* run path routines for each field spec */
  87.     /* if new then run bicomps */
  88.     /* test if this is the first time evaluating this graph file */
  89.     sprintf(outfile,"%s",argv[1]);
  90.     plen = strlen(outfile);
  91.     strcpy(outfile+plen,"-ev");   
  92.     if ((fp = fopen(outfile, "r")) != NULL) {
  93. first = 0;
  94. fclose(fp);
  95.     }
  96.     OPEN_OUT(evf,"-ev");
  97.     if (first) {
  98.     if (prdist) OPEN_OUT(ddf,"-dd");
  99. /* node degree distribution */
  100. /* fprintf(ddf,"#node degreesn"); */
  101.     max = finddegdist(g,&ddist);
  102.     sum = 0;
  103.     for (i = 0; i <= max; i++) {
  104. sum += i*ddist[i];
  105. if (prdist) fprintf(ddf,"%3d : %dn",i,ddist[i]);
  106.     }
  107.     if (prdist) fclose(ddf);
  108.     putc('#',evf);
  109.     g->id[ID_FIELD_SIZE-1] = 0; /* just to be safe, sometimes they get
  110. truncated */
  111.     fputs(g->id,evf);
  112.     putc('n',evf);
  113.     fprintf(evf,"avgdeg %fn",(float)sum/g->n);
  114.     }
  115.     /* go through each field specification, one at a time */
  116.     for (idx; idx < argc; idx++) {
  117.       switch (argv[idx][1]) {
  118. case 'l': f0 = Len; break;
  119.         case 'a': f0 = A; break;
  120.         case 'b': f0 = B; break;
  121.         case 'h': f0 = Hops; break;
  122.       }
  123.       switch (argv[idx][2]) {
  124. case 'l': f1 = Len; break;
  125.         case 'a': f1 = A; break;
  126.         case 'b': f1 = B; break;
  127.         case 'h': f1 = Hops; break;
  128.       }
  129.       dopaths(g,f0,f1,&min,&max,&avg); 
  130.       fprintf(evf,"diam%s %dn",argv[idx],max);
  131.       fprintf(evf,"avgdepth%s %.3fn",argv[idx],avg);     
  132.       if (prdist) {
  133. OPEN_OUT(pdf,argv[idx]);
  134. dodepthdist(g,&ddist);
  135.         bins = max - min + 1;
  136. for (i = 0; i<bins; i++)
  137.   fprintf(pdf,"%3d : %dn",min+i,ddist[i]);
  138. fclose(pdf); 
  139.       }
  140.     }
  141. /* N.B. do bicomponents AFTER everything else, it mess up some fields! */
  142.     if (first) 
  143.         fprintf(evf,"bicomp %dn",bicomp(g,0));
  144.     fclose(evf);
  145.     exit(0);
  146. }