Annotation of embedaddon/quagga/isisd/topology/spgrid.c, revision 1.1
1.1 ! misho 1: #include <stdio.h>
! 2: #include <stdlib.h>
! 3: #include <string.h>
! 4:
! 5: #include "random.c"
! 6:
! 7: #include <zebra.h>
! 8:
! 9: #include "thread.h"
! 10: #include "vty.h"
! 11: #include "log.h"
! 12: #include "linklist.h"
! 13:
! 14: #include "spgrid.h"
! 15:
! 16:
! 17: #define DASH '-'
! 18: #define VERY_FAR 100000000
! 19:
! 20: #define DOUBLE_CYCLE 0
! 21: #define CYCLE 1
! 22: #define PATH 2
! 23:
! 24: #define NO 0
! 25: #define YES 1
! 26:
! 27: #define NODE( x, y ) (x*Y + y + 1)
! 28:
! 29: /*
! 30: * Prototypes.
! 31: */
! 32: void free_arc(void *);
! 33: void help(struct vty *);
! 34: void print_arc(struct vty *, struct list *, long, long, long);
! 35: void hhelp(struct vty *);
! 36: void usage(struct vty *);
! 37:
! 38: const char *graph_type[] = {
! 39: "double cycle",
! 40: "cycle",
! 41: "path"
! 42: };
! 43:
! 44: struct arc *arc;
! 45:
! 46: char args[30];
! 47:
! 48: long X, /* horizontal size of grid */
! 49: Y; /* vertical size of grid */
! 50:
! 51: long x,
! 52: y,
! 53: y1, y2, yp,
! 54: dl, dx, xn, yn, count,
! 55: *mess;
! 56:
! 57: double n;
! 58: long n0,
! 59: source,
! 60: i,
! 61: i0,
! 62: j,
! 63: dij;
! 64:
! 65: double m;
! 66: long m0,
! 67: mc,
! 68: k;
! 69:
! 70: long *p,
! 71: p_t,
! 72: l,
! 73: lx;
! 74:
! 75: long seed,
! 76: seed1,
! 77: seed2;
! 78:
! 79: int ext=0;
! 80:
! 81: /* initialized by default values */
! 82:
! 83: /* variables for generating one layer */
! 84:
! 85: /* variables for generating spanning graph */
! 86: int c_f = 0, cw_f = 0, cm_f = 0, cl_f = 0;
! 87:
! 88: int cw = DOUBLE_CYCLE; /* type of spanning graph */
! 89: long cm = 0, /* lower bound of the interval */
! 90: cl = 100; /* upper bound of the interval */
! 91:
! 92: /* variables for generating additional arcs */
! 93: int a_f = 0, ax_f = 0, am_f = 0, al_f = 0;
! 94:
! 95: long ax = 0, /* number of additional arcs */
! 96: am = 0, /* lower bound of the interval */
! 97: al = 100; /* upper bound of the interval */
! 98:
! 99: /* variables for inter-layer arcs */
! 100: int i_f = 0, ip_f = 0, ix_f = 0, ih_f = 0,
! 101: im_f = 0, il_f = 0, in_f = 0, is_f = 0;
! 102:
! 103: int ip = NO; /* to mess or not to mess */
! 104: long ix = 1, /* number of interlayered arcs in a NODE */
! 105: ih = 1, /* step between two layeres */
! 106: il = 10000, /* upper bound of the interval */
! 107: im = 1000; /* lower bound of the interval */
! 108: double in = 1, /* l *= in * |x1-x2| */
! 109: is = 0; /* l *= is * |x1-x2|^2 */
! 110:
! 111: /* variables for artifical source */
! 112: int s_f = 0, sl_f = 0, sm_f = 0;
! 113: long sl = VERY_FAR, /* upper bound of artifical arc */
! 114: sm, /* lower bound of artifical arc */
! 115: s;
! 116:
! 117: /* variables for potentials */
! 118: int p_f = 0, pl_f = 0, pm_f = 0, pn_f = 0, ps_f = 0;
! 119:
! 120: long pl, /* upper bound of the interval */
! 121: pm; /* lower bound of the interval */
! 122: double pn = 0, /* p += ln * (x+1) */
! 123: ps = 0; /* p += ls * (x+1)^2 */
! 124:
! 125: int np; /* number of parameter parsing now */
! 126:
! 127:
! 128: void
! 129: free_arc (void *val) {
! 130: free(val);
! 131: }
! 132:
! 133: void
! 134: print_arc (struct vty *vty, struct list *topology, long i, long j, long length)
! 135: {
! 136: struct arc *myarc;
! 137:
! 138: l = length;
! 139: if ( p_f ) l += ( p[i] - p[j] );
! 140: // vty_out (vty,"a %8ld %8ld %12ld%s", i, j, l ,VTY_NEWLINE);
! 141: myarc = malloc (sizeof(struct arc));
! 142: myarc->from_node = i;
! 143: myarc->to_node = j;
! 144: myarc->distance = l;
! 145: topology->del = free_arc;
! 146: listnode_add (topology, myarc);
! 147: }
! 148:
! 149: /* ---- help ---- */
! 150: void
! 151: help (struct vty *vty) {
! 152: // if ( args[2] == 'h') hhelp (vty);
! 153: vty_out (vty,"grid network generator for shortest paths problem.%s",VTY_NEWLINE);
! 154: vty_out (vty,"Generates problems in extended DIMACS format.%s",VTY_NEWLINE);
! 155: vty_out (vty,"X Y seed [ -cl#i -cm#i -c{c|d|p} -ip -il#i -im#i -p -pl#i -pm#i... ]%s",VTY_NEWLINE);
! 156: vty_out (vty,"#i - integer number%s",VTY_NEWLINE);
! 157: vty_out (vty,"-cl#i - #i is the upper bound on layer arc lengths (default 100)%s",VTY_NEWLINE);
! 158: vty_out (vty,"-cm#i - #i is the lower bound on layer arc lengths (default 0)%s",VTY_NEWLINE);
! 159: vty_out (vty,"-c#t - #t is the type of connecting graph: { c | d | p }%s",VTY_NEWLINE);
! 160: vty_out (vty," c - cycle, d - double cycle, p - path (default d)%s",VTY_NEWLINE);
! 161: vty_out (vty,"-ip - shuffle inter-layer arcs (default NO)%s",VTY_NEWLINE);
! 162: vty_out (vty,"-il#i - #i is the upper bound on inter-layer arc lengths (default 10000)%s",VTY_NEWLINE);
! 163: vty_out (vty,"-im#i - #i is the lower bound on inter-layer arc lengths (default 1000)%s",VTY_NEWLINE);
! 164: vty_out (vty,"-p - generate potentials%s",VTY_NEWLINE);
! 165: vty_out (vty,"-pl#i - #i is the upper bound on potentials (default il)%s",VTY_NEWLINE);
! 166: vty_out (vty,"-pm#i - #i is the lower bound on potentials (default im)%s",VTY_NEWLINE);
! 167: vty_out (vty,"%s",VTY_NEWLINE);
! 168: vty_out (vty,"-hh - extended help%s",VTY_NEWLINE);
! 169: }
! 170:
! 171: /* --------- sophisticated help ------------ */
! 172: void
! 173: hhelp (struct vty *vty) {
! 174: /*
! 175: zlog_info (
! 176: "\n'%s' - grid network generator for shortest paths problem.\n\
! 177: Generates problems in extended DIMACS format.\n\
! 178: \n\
! 179: %s X Y seed [ -cl#i -cm#i -c{c|d|p}\n\
! 180: -ax#i -al#i -am#i\n\
! 181: -ip -il#i -im#i -in#i -is#i -ix#i -ih#i\n\
! 182: -p -pl#i -pm#i -pn#f -ps#f\n\
! 183: -s -sl#i -sm#i\n\
! 184: ]\n\
! 185: %s -hh file_name\n\
! 186: \n\
! 187: #i - integer number #f - real number\n\
! 188: \n\
! 189: Parameters of connecting arcs within one layer:\n\
! 190: -cl#i - #i is the upper bound on arc lengths (default 100)\n\
! 191: -cm#i - #i is the lower bound on arc lengths (default 0)\n\
! 192: -c#t - #t is the type of connecting graph: { c | d | p }\n\
! 193: c - cycle, d - double cycle, p - path (default d)\n\
! 194: \n\
! 195: Parameters of additional arcs within one layer:\n\
! 196: -ax#i - #i is the number of additional arcs (default 0)\n\
! 197: -al#i - #i is the upper bound on arc lengths (default 100)\n\
! 198: -am#i - #i is the lower bound on arc lengths (default 0)\n\
! 199: \n\
! 200: Interlayerd arc parameters:\n\
! 201: -ip - shuffle inter-layer arcs (default NO)\n\
! 202: -il#i - #i is the upper bound on arc lengths (default 10000)\n\
! 203: -im#i - #i is the lower bound on arc lengths (default 1000)\n\
! 204: -in#f - multiply l(i, j) by #f * x(j)-x(i) (default 1)\n\
! 205: if #f=0 - don't multiply\n\
! 206: -is#f - multiply l(i, j) by #f * (x(j)-x(i))^2 (default NO)\n\
! 207: -ix#i - #i - is the number of arcs from a node (default 1)\n\
! 208: -ih#i - #i - is the step between connected layers (default 1)\n\
! 209: \n\
! 210: Potential parameters:\n\
! 211: -p - generate potentials \n\
! 212: -pl#i - #i is the upper bound on potentials (default ll)\n\
! 213: -pm#i - #i is the lower bound on potentials (default lm)\n\
! 214: -pn#f - multiply p(i) by #f * x(i) (default NO)\n\
! 215: -ps#f - multiply p(i) by #f * x(i)^2 (default NO)\n\
! 216: \n");
! 217: zlog_info (
! 218: " Artificial source parameters:\n\
! 219: -s - generate artificial source with default connecting arc lengths\n\
! 220: -sl#i - #i is the upper bound on art. arc lengths (default 100000000)\n\
! 221: -sm#i - #i is the lower bound on art. arc lengths (default sl)\n\"
! 222: );*/
! 223: }
! 224:
! 225: /* ----- wrong usage ----- */
! 226: void
! 227: usage (struct vty *vty) {
! 228: vty_out (vty,"usage: X Y seed [-ll#i -lm#i -cl#i -p -pl#i -pm#i ...]%s",VTY_NEWLINE);
! 229: vty_out (vty,"help: -h or -hh%s",VTY_NEWLINE);
! 230:
! 231: if ( np > 0 )
! 232: zlog_err ("error in parameter # %d\n\n", np );
! 233: }
! 234:
! 235:
! 236: /* parsing parameters */
! 237: /* checks the validity of incoming parameters */
! 238: int
! 239: spgrid_check_params ( struct vty *vty, int argc, const char **argv)
! 240: {
! 241: /* initialized by default values */
! 242: ext=0;
! 243:
! 244: /* variables for generating one layer */
! 245:
! 246: /* variables for generating spanning graph */
! 247: c_f = 0;
! 248: cw_f = 0;
! 249: cm_f = 0;
! 250: cl_f = 0;
! 251:
! 252: cw = PATH; /* type of spanning graph */
! 253: cm = 0; /* lower bound of the interval */
! 254: cl = 63; /* upper bound of the interval */
! 255:
! 256: /* variables for generating additional arcs */
! 257: a_f = 0;
! 258: ax_f = 0;
! 259: am_f = 0;
! 260: al_f = 0;
! 261:
! 262: ax = 0; /* number of additional arcs */
! 263: am = 0; /* lower bound of the interval */
! 264: al = 63; /* upper bound of the interval */
! 265:
! 266: /* variables for inter-layer arcs */
! 267: i_f = 0;
! 268: ip_f = 0;
! 269: ix_f = 0;
! 270: ih_f = 0;
! 271: im_f = 0;
! 272: il_f = 0;
! 273: in_f = 0;
! 274: is_f = 0;
! 275:
! 276: ip = NO; /* to mess or not to mess */
! 277: ix = 1; /* number of interlayered arcs in a NODE */
! 278: ih = 1; /* step between two layeres */
! 279: il = 63; //was 10000; /* upper bound of the interval */
! 280: im = 0; //was 1000; /* lower bound of the interval */
! 281: in = 1; /* l *= in * |x1-x2| */
! 282: is = 0; /* l *= is * |x1-x2|^2 */
! 283:
! 284: /* variables for artifical source */
! 285: s_f = 0;
! 286: sl_f = 0;
! 287: sm_f = 0;
! 288: sl = VERY_FAR; /* upper bound of artifical arc */
! 289:
! 290: /* variables for potentials */
! 291: p_f = 0;
! 292: pl_f = 0;
! 293: pm_f = 0;
! 294: pn_f = 0;
! 295: ps_f = 0;
! 296:
! 297: pn = 0; /* p += ln * (x+1) */
! 298: ps = 0; /* p += ls * (x+1)^2 */
! 299:
! 300:
! 301: if ( argc < 1 ) {
! 302: usage (vty);
! 303: return 1;
! 304: }
! 305:
! 306: np = 0;
! 307:
! 308: strcpy ( args, argv[0] );
! 309:
! 310: if ((args[0] == DASH) && (args[1] == 'h'))
! 311: help (vty);
! 312:
! 313: if ( argc < 3 ) {
! 314: usage (vty);
! 315: return 1;
! 316: }
! 317:
! 318: /* first parameter - horizontal size */
! 319: np = 1;
! 320: if ( ( X = atoi ( argv[0] ) ) < 1 ) {
! 321: usage (vty);
! 322: return 1;
! 323: }
! 324:
! 325: /* second parameter - vertical size */
! 326: np = 2;
! 327: if ( ( Y = atoi ( argv[1] ) ) < 1 ) {
! 328: usage (vty);
! 329: return 1;
! 330: }
! 331:
! 332: /* third parameter - seed */
! 333: np=3;
! 334: if ( ( seed = atoi ( argv[2] ) ) <= 0 ) {
! 335: usage (vty);
! 336: return 1;
! 337: }
! 338:
! 339: /* other parameters */
! 340: for ( np = 3; np < argc; np ++ ) {
! 341: strcpy ( args, argv[np] );
! 342: if ( args[0] != DASH ) {
! 343: usage (vty);
! 344: return 1;
! 345: }
! 346:
! 347: switch ( args[1] ) {
! 348: case 'c' : /* spanning graph in one layer */
! 349: c_f = 1;
! 350: switch ( args[2] ) {
! 351: case 'l': /* upper bound of the interval */
! 352: cl_f = 1;
! 353: cl = atol ( &args[3] );
! 354: break;
! 355: case 'm': /* lower bound */
! 356: cm_f = 1;
! 357: cm = atol ( &args[3] );
! 358: break;
! 359: case 'c': /* type - cycle */
! 360: cw_f = 1;
! 361: cw = CYCLE;
! 362: break;
! 363: case 'd': /* type - double cycle */
! 364: cw_f = 1;
! 365: cw = DOUBLE_CYCLE;
! 366: break;
! 367: case 'p': /* type - path */
! 368: cw_f = 1;
! 369: cw = PATH;
! 370: break;
! 371:
! 372: default: /* unknown switch value */
! 373: usage (vty);
! 374: return 1;
! 375: }
! 376: break;
! 377:
! 378: case 'a' : /* additional arcs in one layer */
! 379: a_f = 1;
! 380: switch ( args[2] )
! 381: {
! 382: case 'l': /* upper bound of the interval */
! 383: al_f = 1;
! 384: al = atol ( &args[3] );
! 385: break;
! 386: case 'm': /* lower bound */
! 387: am_f = 1;
! 388: am = atol ( &args[3] );
! 389: break;
! 390: case 'x': /* number of additional arcs */
! 391: ax_f = 1;
! 392: ax = atol ( &args[3] );
! 393: if ( ax < 0 )
! 394: {
! 395: usage (vty);
! 396: return 1;
! 397: }
! 398: break;
! 399:
! 400: default: /* unknown switch value */
! 401: {
! 402: usage (vty);
! 403: return 1;
! 404: }
! 405: }
! 406: break;
! 407:
! 408:
! 409: case 'i' : /* interlayered arcs */
! 410: i_f = 1;
! 411:
! 412: switch ( args[2] )
! 413: {
! 414: case 'l': /* upper bound */
! 415: il_f = 1;
! 416: il = atol ( &args[3] );
! 417: break;
! 418: case 'm': /* lower bound */
! 419: im_f = 1;
! 420: im = atol ( &args[3] );
! 421: break;
! 422: case 'n': /* additional length: l *= in*|i1-i2| */
! 423: in_f = 1;
! 424: in = atof ( &args[3] );
! 425: break;
! 426: case 's': /* additional length: l *= is*|i1-i2|^2 */
! 427: is_f = 1;
! 428: is = atof ( &args[3] );
! 429: break;
! 430: case 'p': /* mess interlayered arcs */
! 431: ip_f = 1;
! 432: ip = YES;
! 433: break;
! 434: case 'x': /* number of interlayered arcs */
! 435: ix_f = 1;
! 436: ix = atof ( &args[3] );
! 437: if ( ix < 1 ) {
! 438: usage (vty);
! 439: return 1;
! 440: }
! 441: break;
! 442: case 'h': /* step between two layeres */
! 443: ih_f = 1;
! 444: ih = atof ( &args[3] );
! 445: if ( ih < 1 ) {
! 446: usage (vty);
! 447: return 1;
! 448: }
! 449: break;
! 450: default: /* unknown switch value */
! 451: usage (vty);
! 452: return 1;
! 453: }
! 454: break;
! 455:
! 456: case 's' : /* additional source */
! 457: s_f = 1;
! 458: if ( strlen ( args ) > 2 )
! 459: {
! 460: switch ( args[2] )
! 461: {
! 462: case 'l': /* upper bound of art. arc */
! 463: sl_f = 1;
! 464: sl = atol ( &args[3] );
! 465: break;
! 466: case 'm': /* lower bound of art. arc */
! 467: sm_f = 1;
! 468: sm = atol ( &args[3] );
! 469: break;
! 470: default: /* unknown switch value */
! 471: usage (vty);
! 472: return 1;
! 473: }
! 474: }
! 475: break;
! 476:
! 477: case 'p' : /* potentials */
! 478: p_f = 1;
! 479: if ( strlen ( args ) > 2 )
! 480: {
! 481: switch ( args[2] )
! 482: {
! 483: case 'l': /* upper bound */
! 484: pl_f = 1;
! 485: pl = atol ( &args[3] );
! 486: break;
! 487: case 'm': /* lower bound */
! 488: pm_f = 1;
! 489: pm = atol ( &args[3] );
! 490: break;
! 491: case 'n': /* additional: p *= pn*(x+1) */
! 492: pn_f = 1;
! 493: pn = atof ( &args[3] );
! 494: break;
! 495: case 's': /* additional: p = ps* (x+1)^2 */
! 496: ps_f = 1;
! 497: ps = atof ( &args[3] );
! 498: break;
! 499: default: /* unknown switch value */
! 500: usage (vty);
! 501: return 1;
! 502: }
! 503: }
! 504: break;
! 505:
! 506: default: /* unknoun case */
! 507: usage (vty);
! 508: return 1;
! 509: }
! 510: }
! 511:
! 512:
! 513: return 0;
! 514: }
! 515:
! 516:
! 517: /* generator of layered networks for the shortest paths problem;
! 518: extended DIMACS format for output */
! 519: int
! 520: gen_spgrid_topology (struct vty *vty, struct list *topology)
! 521: {
! 522: /* ----- ajusting parameters ----- */
! 523:
! 524: /* spanning */
! 525: if ( cl < cm ) { lx = cl; cl = cm; cm = lx; }
! 526:
! 527: /* additional arcs */
! 528: if ( al < am ) { lx = al; al = am; am = lx; }
! 529:
! 530: /* interlayered arcs */
! 531: if ( il < im ) { lx = il; il = im; im = lx; }
! 532:
! 533: /* potential parameters */
! 534: if ( p_f )
! 535: {
! 536: if ( ! pl_f ) pl = il;
! 537: if ( ! pm_f ) pm = im;
! 538: if ( pl < pm ) { lx = pl; pl = pm; pm = lx; }
! 539: }
! 540:
! 541: /* number of nodes and arcs */
! 542:
! 543: n = (double)X *(double)Y + 1;
! 544:
! 545: m = (double)Y; /* arcs from source */
! 546:
! 547: switch ( cw )
! 548: {
! 549: case PATH:
! 550: mc = (double)Y - 1;
! 551: break;
! 552: case CYCLE:
! 553: mc = (double)Y;
! 554: break;
! 555: case DOUBLE_CYCLE:
! 556: mc = 2*(double)Y;
! 557: }
! 558:
! 559: m += (double)X * (double)mc; /* spanning arcs */
! 560: m += (double)X * (double)ax; /* additional arcs */
! 561:
! 562: /* interlayered arcs */
! 563: for ( x = 0; x < X; x ++ )
! 564: {
! 565: dl = ( ( X - x - 1 ) + ( ih - 1 ) ) / ih;
! 566: if ( dl > ix ) dl = ix;
! 567: m += (double)Y * (double)dl;
! 568: }
! 569:
! 570: /* artifical source parameters */
! 571: if ( s_f ) {
! 572: m += n; n ++ ;
! 573: if ( ! sm_f ) sm = sl;
! 574: if ( sl < sm ) { lx = sl; sl = sm; sm = lx; }
! 575: }
! 576:
! 577: if ( n >= (double)LONG_MAX || m >= (double)LONG_MAX )
! 578: {
! 579: zlog_err ("Too large problem. It can't be generated\n");
! 580: exit (4);
! 581: }
! 582: else
! 583: {
! 584: n0 = (long)n; m0 = (long)m;
! 585: }
! 586:
! 587: if ( ip_f )
! 588: mess = (long*) calloc ( Y, sizeof ( long ) );
! 589:
! 590: /* printing title */
! 591: zlog_info ("Generating topology for ISIS");
! 592:
! 593: source = ( s_f ) ? n0-1 : n0;
! 594:
! 595: if ( p_f ) /* generating potentials */ {
! 596: p = (long*) calloc ( n0+1, sizeof (long) );
! 597: seed1 = 2*seed + 1;
! 598: init_rand ( seed1);
! 599: pl = pl - pm + 1;
! 600:
! 601: for ( x = 0; x < X; x ++ )
! 602: for ( y = 0; y < Y; y ++ ) {
! 603: p_t = pm + nrand ( pl );
! 604: if ( pn_f ) p_t *= (long) ( (1 + x) * pn );
! 605: if ( ps_f ) p_t *= (long) ( (1 + x) * ( (1 + x) * ps ));
! 606:
! 607: p[ NODE ( x, y ) ] = p_t;
! 608: }
! 609: p[n0] = 0;
! 610: if ( s_f ) p[n0-1] = 0;
! 611: }
! 612:
! 613: if ( s_f ) /* additional arcs from artifical source */
! 614: {
! 615: seed2 = 3*seed + 1;
! 616: init_rand ( seed2 );
! 617: sl = sl - sm + 1;
! 618:
! 619: for ( x = X - 1; x >= 0; x -- )
! 620: for ( y = Y - 1; y >= 0; y -- )
! 621: {
! 622: i = NODE ( x, y );
! 623: s = sm + nrand ( sl );
! 624: print_arc (vty, topology, n0, i, s );
! 625: }
! 626:
! 627: print_arc (vty, topology, n0, n0-1, 0 );
! 628: }
! 629:
! 630:
! 631: /* ----- generating arcs within layers ----- */
! 632:
! 633: init_rand ( seed );
! 634: cl = cl - cm + 1;
! 635: al = al - am + 1;
! 636:
! 637: for ( x = 0; x < X; x ++ )
! 638: {
! 639: /* generating arcs within one layer */
! 640: for ( y = 0; y < Y-1; y ++ )
! 641: {
! 642: /* generating spanning graph */
! 643: i = NODE ( x, y );
! 644: j = NODE ( x, y+1 );
! 645: l = cm + nrand ( cl );
! 646: print_arc (vty, topology, i, j, l );
! 647:
! 648: if ( cw == DOUBLE_CYCLE )
! 649: {
! 650: l = cm + nrand ( cl );
! 651: print_arc (vty, topology, j, i, l );
! 652: }
! 653: }
! 654:
! 655: if ( cw <= CYCLE )
! 656: {
! 657: i = NODE ( x, Y-1 );
! 658: j = NODE ( x, 0 );
! 659: l = cm + nrand ( cl );
! 660: print_arc (vty, topology, i, j, l );
! 661:
! 662: if ( cw == DOUBLE_CYCLE )
! 663: {
! 664: l = cm + nrand ( cl );
! 665: print_arc (vty, topology, j, i, l );
! 666: }
! 667: }
! 668:
! 669: /* generating additional arcs */
! 670:
! 671: for ( k = ax; k > 0; k -- )
! 672: {
! 673: y1 = nrand ( Y );
! 674: do
! 675: y2 = nrand ( Y );
! 676: while ( y2 == y1 );
! 677: i = NODE ( x, y1 );
! 678: j = NODE ( x, y2 );
! 679: l = am + nrand ( al );
! 680: print_arc (vty, topology, i, j, l );
! 681: }
! 682: }
! 683:
! 684: /* ----- generating interlayered arcs ------ */
! 685:
! 686: il = il - im + 1;
! 687:
! 688: /* arcs from the source */
! 689:
! 690: for ( y = 0; y < Y; y ++ )
! 691: {
! 692: l = im + nrand ( il );
! 693: i = NODE ( 0, y );
! 694: print_arc (vty, topology, source, i, l );
! 695: }
! 696:
! 697: for ( x = 0; x < X-1; x ++ )
! 698: {
! 699: /* generating arcs from one layer */
! 700: for ( count = 0, xn = x + 1;
! 701: count < ix && xn < X;
! 702: count ++, xn += ih )
! 703: {
! 704: if ( ip_f )
! 705: for ( y = 0; y < Y; y ++ )
! 706: mess[y] = y;
! 707:
! 708: for ( y = 0; y < Y; y ++ )
! 709: {
! 710: i = NODE ( x, y );
! 711: dx = xn - x;
! 712: if ( ip_f )
! 713: {
! 714: yp = nrand(Y-y);
! 715: yn = mess[ yp ];
! 716: mess[ yp ] = mess[ Y - y - 1 ];
! 717: }
! 718: else
! 719: yn = y;
! 720: j = NODE ( xn, yn );
! 721: l = im + nrand ( il );
! 722: if ( in != 0 )
! 723: l *= (long) ( in * dx );
! 724: if ( is_f )
! 725: l *= (long) ( ( is * dx ) * dx );
! 726: print_arc (vty, topology, i, j, l );
! 727: }
! 728: }
! 729: }
! 730: /* all is done */
! 731: return ext;
! 732:
! 733: return 0;
! 734: }
! 735:
! 736:
! 737:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>