File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / isisd / topology / spgrid.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 17:26:11 2012 UTC (12 years, 5 months ago) by misho
Branches: quagga, MAIN
CVS tags: v0_99_22p0, v0_99_22, v0_99_21, v0_99_20_1, v0_99_20, HEAD
quagga

    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>