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

通讯编程

开发平台:

Visual C++

  1. /*-*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * Copyright (c) 1997 by the University of Southern California
  4.  * All rights reserved.
  5.  *
  6.  * Permission to use, copy, modify, and distribute this software and its
  7.  * documentation in source and binary forms for non-commercial purposes
  8.  * and without fee is hereby granted, provided that the above copyright
  9.  * notice appear in all copies and that both the copyright notice and
  10.  * this permission notice appear in supporting documentation. and that
  11.  * any documentation, advertising materials, and other materials related
  12.  * to such distribution and use acknowledge that the software was
  13.  * developed by the University of Southern California, Information
  14.  * Sciences Institute.  The name of the University may not be used to
  15.  * endorse or promote products derived from this software without
  16.  * specific prior written permission.
  17.  *
  18.  * THE UNIVERSITY OF SOUTHERN CALIFORNIA makes no representations about
  19.  * the suitability of this software for any purpose.  THIS SOFTWARE IS
  20.  * PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
  21.  * INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  22.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  23.  *
  24.  * Other copyrights might apply to parts of this software and are so
  25.  * noted when applicable.
  26.  *
  27.  *  sgb2comns.c -- a common converter from sgb format to ns format which may be used
  28.  *  for creating hierarchical as well as flat topology. 
  29.  *
  30.  *  usage :  sgb2hierns -sgb <sgbgraph.file> -out <outfile> {optional-arguments -hier 1
  31.  *  -topo <topo.file -used for scenario generation>}
  32.  *
  33.  *  Based on sgb2ns & sgb2hierns converters
  34.  *  Maintainer: Padma Haldar (haldar@isi.edu)
  35.  */
  36. #include <stdio.h>
  37. #include <strings.h>
  38. #include "gb_graph.h"
  39. #include "gb_save.h"
  40. #include "geog.h"
  41. #define TRUE   1
  42. #define FALSE  0
  43. #define TINY   16
  44. #define SMALL  64
  45. #define MED    256
  46. #define LARGE  4096
  47. #define HUGE   655536
  48. void print_error();
  49. void parse_input(int argc, char** argv, int* flag, FILE** output);
  50. void sgb2hierns(Graph *g, FILE *output, FILE *topofile);
  51. void sgb2flatns(Graph *g, FILE *output) ;
  52. void create_hierarchy(Graph *g, int *domain, char *transits, int *n, 
  53.        int *l, int *q, int *stubnode, int *stubsize, 
  54.       char **address, char *node_per_cluster);
  55. void print_topofile(FILE *output, int domain, char *transits, int n,
  56.     int l, int *stubnode, int *stubsize);
  57. void print_hier(FILE *fout, char **address, Graph *g, 
  58. int domain, char *node_per_cluster, int *q);
  59. void print_flat(FILE *fout, Graph *g);
  60. void print_hdr(FILE *fout, Graph *g);
  61. main(argc,argv)
  62.     int argc;
  63.     char *argv[];
  64. {
  65. int hier_flag=0;
  66. FILE *output=NULL;
  67. FILE *fout=NULL;
  68. Graph *g;
  69. if (argc < 3) {
  70. print_error();
  71. }
  72. fout = fopen(argv[2],"w");
  73. if (argc > 3) {
  74. parse_input(argc, argv, &hier_flag, &output);
  75. }
  76. g = restore_graph(argv[1]);
  77. if (g == NULL) {
  78. printf("%s does not contain a correct SGB graphn",argv[1]);
  79. return;
  80. }
  81. if (hier_flag) 
  82. sgb2hierns (g, fout, output);
  83. else 
  84. sgb2flatns (g, fout);
  85. }
  86. void print_error()
  87. {
  88.  /* for the purpose of scenario generator, 
  89.     need to return a list of transits & stubs 
  90.     and num of nodes in each - hence the optional 
  91.     third arg topofile */
  92. printf("sgb2comns <sgb-graph> <outfile.tcl>noptional args: 
  93. -hier(turn on hierarchy flag) -topo <topofile>(generate topology file for scenario generator)nn");
  94. printf("Example : "sgb2comns t100-0.gb hts100.tcl -hier -topo hts100.topofile"nn");
  95. exit(1);
  96. }
  97.       
  98. void parse_input(int argc, char** argv, int* flag, FILE** output) 
  99. {
  100. int i;
  101. for (i = 3; i < argc; i++) {
  102. if (strcmp(argv[i], "-hier") == 0)
  103. *flag = 1;
  104. else if (strcmp(argv[i], "-topo") == 0) {
  105. i++;
  106. *output = fopen(argv[i], "w");
  107. }
  108. else
  109. print_error();
  110. }
  111. }
  112. void sgb2hierns(Graph *g, FILE *output, FILE *topofile) 
  113. {
  114. int     domain = 0,
  115. n = 0,
  116. l = 0;
  117. char    transits[LARGE],
  118. node_per_cluster[HUGE];
  119. int     q[HUGE],
  120. stubsize[LARGE],
  121. stubnode[LARGE];
  122. char    *address[HUGE];
  123. // transits[0] = '';
  124. //  node_per_cluster[0] = '';
  125. create_hierarchy(g, &domain, transits, &n, &l, q, stubnode, 
  126.  stubsize, address, node_per_cluster);
  127. if (topofile != NULL) 
  128. print_topofile(topofile, domain, transits, n, l, 
  129.        stubnode, stubsize);
  130. print_hier(output, address, g, domain, node_per_cluster, q);
  131. }
  132. void sgb2flatns(Graph *g, FILE *output) 
  133. {
  134. print_flat(output, g);
  135. }
  136. void create_hierarchy(Graph *g, int *domain, char *transits, int *num, 
  137.       int *lp, int *q, int *stubnode, int *stubsize, 
  138.       char **address, char *node_per_cluster) 
  139. {
  140. Vertex  *v;
  141. Arc     *a;
  142. int     i=0,
  143. n=0,
  144. p=0,
  145. l=0,
  146. q_b=0,
  147. r=0;
  148. char    *temp,
  149. *index;
  150. char    name[SMALL],
  151. m[420],
  152. tempstr[TINY];
  153. /* generating hierarchical topology from transit-stub*/
  154. q[p] = 0;
  155. for (v = g->vertices,i; i < g->n; i++,v++) {
  156. strcpy(name, v->name);
  157. temp = name;
  158. temp += 2;
  159. index = strstr(temp, ".");
  160. temp[index - temp] = '';
  161. printf("temp = %sn",temp);
  162. if ( p == atoi(temp)) { /* in same domain as before */
  163. if (name[0] == 'T') { /* for transits -> single node domains */
  164. r = 0;
  165. address[i] = (char *)malloc(strlen(v->name));
  166. sprintf(address[i],"%d.%d.%d",p,q[p],r);
  167. printf("address[%d] = %d.%d.%dn",i,p,q[p],r);
  168. strcat(node_per_cluster, "1 ");
  169. sprintf(tempstr, "%d ", i); 
  170. strcat(transits, tempstr); 
  171. q[p] = q[p] + 1;
  172. }
  173. else if (name[0] == 'S') { /* for stubs */
  174. strcpy(name, v->name);
  175. temp = name;
  176. while(temp){
  177. index = strstr(temp, ".");
  178. if (index != NULL)
  179. temp = index + 1;
  180. else{
  181. if (atoi(temp) == 0) {
  182. /* counting stub nodes for scenario gen */
  183. stubnode[l] = i;
  184. l++;
  185. if ( q_b != 0) {
  186. sprintf(tempstr, "%d ", r + 1);
  187. strcat(node_per_cluster, tempstr);
  188. stubsize[n] = r + 1;
  189. n++;
  190. r = 0;
  191. address[i] = (char *)malloc(strlen(v->name));
  192. sprintf(address[i],"%d.%d.%d", p, q[p], r);
  193. printf("address[%d] = %d.%d.%dn",i,p,q[p],r);
  194. q_b = q[p];
  195. q[p] = q[p] + 1;
  196. }
  197. else {
  198. r++;
  199. address[i] = (char *)malloc(strlen(v->name));
  200. sprintf(address[i],"%d.%d.%d", p, q_b, r);
  201. printf("address[%d] = %d.%d.%dn",i,p,q_b,r);
  202. }
  203. break;
  204. }
  205. }
  206. }
  207. }
  208. else {
  209. sprintf(tempstr, "%d ", r + 1);
  210. printf("again...node_per_cluster = %sn",node_per_cluster);
  211. printf("tempstr = %sn",tempstr);
  212. strcat(node_per_cluster, tempstr);
  213. printf("here..stubsize = %dn",stubsize[n]);
  214. stubsize[n] = r + 1;
  215. n++; 
  216. p = atoi(temp);
  217. q[p] = 0;
  218. q_b = 0;
  219. r = 0;
  220. address[i] = (char *)malloc(strlen(v->name));
  221. sprintf(address[i],"%d.%d.%d",p,q[p],r);
  222. printf("address[%d] = %d.%d.%dn",i,p,q[p],r);
  223. strcat(node_per_cluster, "1 ");
  224. printf("again...node_per_cluster = %sn",node_per_cluster);
  225. sprintf(tempstr, "%d ", i); 
  226. strcat(transits, tempstr); 
  227. q[p] = q[p] + 1;
  228. }
  229. }
  230. (*domain) = p + 1;
  231. /* assuming all domains have equal # of clusters */
  232. /* for domains having diff no of clusters , use q[domain num]*/
  233. sprintf(tempstr, "%d ", r + 1);
  234. strcat(node_per_cluster, tempstr);
  235. stubsize[n] = r + 1;
  236. *num = n;
  237. *lp = l;
  238. }
  239. void print_topofile(FILE *output, int domain, char *transits, int n,
  240.     int l, int *stubnode, int *stubsize) 
  241. {
  242. int i;
  243. fprintf(output, "domains %dn", domain);
  244. fprintf(output, "transits %sn", transits);
  245. fprintf(output, "total-stubs %dn", n+1);
  246. fprintf(output, "stubs ");
  247. for(i = 0; i < l; i++) 
  248. fprintf(output, "%d ", stubnode[i]);
  249. fprintf(output, "nnodes/stub ");
  250. for(i = 0; i <= n; i++) 
  251. fprintf(output, "%d ", stubsize[i]);
  252. fprintf(output, "nnEnd of topology file. n");
  253. fclose(output);
  254. }
  255. void print_hier(FILE *fout, char **address, Graph *g, 
  256. int domain, char *node_per_cluster, int *q )
  257. {
  258. int     i,
  259. j,
  260. nlink;
  261. Vertex  *v;
  262. Arc     *a;
  263. fprintf(fout,"# Generated by sgb2comnsn");
  264. print_hdr(fout, g);
  265. fprintf(fout, "#Creating hierarchical topology from transit-stub graph:nn");
  266. fprintf(fout, "proc create-hier-topology {nsns node linkBW} {n");
  267. fprintf(fout, "tupvar $node nn"); 
  268. fprintf(fout, "tupvar $nsns nsnn"); 
  269. /*      fprintf(fout, "tglobal ns nnn"); */
  270. fprintf(fout,"tset verbose 1nn");
  271. /* nodes */
  272. fprintf(fout, "tif {$verbose} { n");
  273. fprintf(fout, "ttputs "Creating hierarchical nodes.." nn");
  274. fprintf(fout, "t}n");
  275. fprintf(fout, "tset i 0 n");
  276. fprintf(fout, "tforeach a { nn");
  277. for (i = 0; i < g->n; i++) {
  278. fprintf(fout, "tt%sn",address[i]);
  279. }
  280. fprintf(fout,"t} { n");
  281. fprintf(fout,"ttset n($i) [$ns node $a]n");
  282. fprintf(fout,"ttincr i n");
  283. fprintf(fout,"ttif {[expr $i %% 100] == 0} {n");
  284. fprintf(fout,"tttputs "creating node $i..." n tt} nt}");
  285. fprintf(fout,"nn");
  286. fprintf(fout,"# Topology information :n");
  287. fprintf(fout, "tlappend domain %dn", domain);
  288. fprintf(fout, "tAddrParams set domain_num_ $domainn");
  289. fprintf(fout, "tlappend cluster ");
  290. for (i = 0; i < domain; i++) {
  291. fprintf(fout, "%d ",q[i]);
  292. }
  293. fprintf(fout, "n");
  294. fprintf(fout, "tAddrParams set cluster_num_ $clustern");
  295. fprintf(fout, "tlappend eilastlevel %sn",node_per_cluster);
  296. fprintf(fout, "tAddrParams set nodes_num_ $eilastleveln");
  297. fprintf(fout,"nn");
  298. /* edges */
  299. fprintf(fout, "t# EDGES (from-node to-node length a b):n");
  300. nlink = 0;
  301. fprintf(fout, "tif {$verbose} { n");
  302. fprintf(fout, "ttputs "Creating links 0..."n");
  303. fprintf(fout, "ttflush stdout n");
  304. fprintf(fout, "t}n");
  305. fprintf(fout, "tset i 0 n");
  306. fprintf(fout, "tforeach t { n");
  307.     
  308. for (v = g->vertices,i=0; i < g->n; i++,v++) 
  309. for (a = v->arcs; a != NULL; a = a->next) {
  310. j = a->tip - g->vertices;
  311. if (j > i) {
  312. fprintf(fout, "tt{%d %d %dms} n",i, j, 10 * a->len);
  313. nlink++;
  314. }
  315. }
  316. fprintf(fout, "t} { n");
  317. fprintf(fout, "t$ns duplex-link-of-interfaces $n([lindex $t 0]) $n([lindex $t 1]) $linkBW [lindex $t 2] DropTail n");
  318. fprintf(fout, "tincr i n");
  319. fprintf(fout, "tif {[expr $i %% 100] == 0} { n");
  320. fprintf(fout, "ttputs "creating link $i..." n");
  321. fprintf(fout, "t} n } n");
  322. /* srm members. join-group will be performed by Agent/SRM::start */
  323. /* return the number of nodes in this topology */
  324. fprintf(fout, "treturn %dn", g->n);
  325. fprintf(fout, "}n");
  326. for (i=0; i < g->n; i++)
  327. if (address[i] != NULL)
  328. free(address[i]);
  329. fprintf(fout,"# end of hier topology generationn");
  330. fclose(fout);
  331. }
  332. void print_hdr(FILE *fout, Graph *g) 
  333. {
  334. fprintf(fout,"# GRAPH (#nodes #edges id uu vv ww xx yy zz):n");
  335. fprintf(fout,"# %d %d %s ",g->n, g->m, g->id);
  336. if (g->util_types[8] == 'I') fprintf(fout,"%ld ",g->uu.I);
  337. if (g->util_types[9] == 'I') fprintf(fout,"%ld ",g->vv.I);
  338. if (g->util_types[10] == 'I') fprintf(fout,"%ld ",g->ww.I);
  339. if (g->util_types[11] == 'I') fprintf(fout,"%ld ",g->xx.I);
  340. if (g->util_types[12] == 'I') fprintf(fout,"%ld ",g->yy.I);
  341. if (g->util_types[13] == 'I') fprintf(fout,"%ld ",g->zz.I);
  342. fprintf(fout,"nn");
  343. }
  344. void print_flat(FILE *fout, Graph *g) 
  345. {
  346. Vertex  *v;
  347. Arc     *a;
  348. int     i,
  349. j;
  350. print_hdr(fout, g);
  351. fprintf(fout, "proc create-topology {nsns node linkBW} {n");
  352. fprintf(fout, "tupvar $node nn");
  353. fprintf(fout, "tupvar $nsns nsnn");
  354. fprintf(fout,"tset verbose 1nn");
  355. /* nodes */
  356. fprintf(fout, "tif {$verbose} { n");
  357. fprintf(fout, "ttputs "Creating nodes..." n");
  358. fprintf(fout, "}n");
  359. fprintf(fout, "ttfor {set i 0} {$i < %d} {incr i} {n", g->n);
  360. fprintf(fout, "tttset n($i) [$ns node]n");
  361. fprintf(fout, "t}n");
  362. fprintf(fout, "n");
  363. /* edges */
  364. fprintf(fout, "t# EDGES (from-node to-node length a b):n");
  365. // nlink = 0;
  366. fprintf(fout, "tif {$verbose} { n");
  367. fprintf(fout, "ttputs -nonewline "Creating links 0..."n");
  368. fprintf(fout, "ttflush stdout n");
  369. fprintf(fout, "t}n");
  370. fprintf(fout, "tset i 0 n");
  371. fprintf(fout, "tforeach t { n");
  372. for (v = g->vertices,i=0; i < g->n; i++,v++) 
  373. for (a = v->arcs; a != NULL; a = a->next) {
  374. j = a->tip - g->vertices;
  375. if (j > i) {
  376. fprintf(fout,"tt{%d %d %dms} n",i,
  377. j, 10 * a->len); 
  378. //  nlink++;
  379. }
  380. }
  381. fprintf(fout, "t} { n");
  382. fprintf(fout, "t$ns duplex-link-of-interfaces $n([lindex $t 0]) $n([lindex $t 1]) $linkBW [lindex $t 2] DropTail n");
  383. fprintf(fout, "tincr i n");
  384. fprintf(fout, "tif {[expr $i %% 100] == 0} { n");
  385. fprintf(fout, "ttputs "creating link $i..." n");
  386. fprintf(fout, "t} n } n");
  387. /* srm members. join-group will be performed by Agent/SRM::start */
  388. /* return the number of nodes in this topology */
  389. fprintf(fout, "treturn %d", g->n);
  390. fprintf(fout, "}n");
  391. }