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>