/*  Network.h  */

#include "../cfiles.h"
#include "../Ideq.h"

/*--------------------------------------------------------------------*/
/*
   ---------------------------------
   forward declarations of typedef's
   ---------------------------------
*/
typedef struct _Network   Network ;
typedef struct _Arc   Arc ;
typedef struct _ArcChunk   ArcChunk ;
/*--------------------------------------------------------------------*/
/*
   ------------------------------------------------------------
   structure to hold a network.

   nnode    -- number of nodes in the network.
               the source node is 0, the sink node is nnode - 1
   narc     -- number of arcs in the network
   ntrav    -- number of arcs that are traversed,
               used as a measure of complexity
   inheads  -- array of pointers used to point to the first arc 
               in the in list for the nodes
   outheads -- array of pointers used to point to the first arc 
               in the out list for the nodes
   chunk    -- pointer to the first ArcChunk structure
   msglvl   -- message level, default is 0
   msgFile  -- message file, default is stdout
   ------------------------------------------------------------
*/
struct _Network {
   int        nnode      ;
   int        narc       ;
   int        ntrav      ;
   Arc        **inheads  ;
   Arc        **outheads ;
   ArcChunk   *chunk     ;
   int        msglvl     ;
   FILE       *msgFile   ;
} ;
/*
   ----------------------------------------------------------------
   arc structure

   vertices in the arc are (first, second). there is one arc that
   is linked into the out list for vertex first and the in list for
   vertex second via the nextOut and nextIn fields, respectively.
   ----------------------------------------------------------------
*/
struct _Arc {
   int   first    ;
   int   second   ;
   int   capacity ;
   int   flow     ;
   Arc   *nextOut ;
   Arc   *nextIn  ;
} ;
/*
   ---------------------------------------------------------------
   structure to hold a vector of arcs, used in forming the network
   when the total number of arcs is not known ahead of time.

   size  -- dimension of base[] array
   inuse -- number of arc structures in use, 
            next free arc is located at &base[inuse]
   base  -- vector of Arc structures
   next  -- link to the next ArcChunk structure,
            used to free the storage when finished
   ---------------------------------------------------------------
*/
struct _ArcChunk {
   int        size  ;
   int        inuse ;
   Arc        *base ;
   ArcChunk   *next ;
} ;
/*--------------------------------------------------------------------*/
/*
------------------------------------------------------------------------
----- methods found in basics.c   --------------------------------------
------------------------------------------------------------------------
*/
/*
   --------------------------------------------
   construct a new instance of the Network object

   created -- 96jun08, cca
   --------------------------------------------
*/
Network *
Network_new (
   void
) ;
/*
   ---------------------------------------------
   set the default fields of the Network object

   created  -- 96jun08, cca
   ---------------------------------------------
*/
void
Network_setDefaultFields (
   Network   *network
) ;
/*
   ---------------------------------------------
   clear the data fields for a Network object

   created  -- 96jun08, cca
   ---------------------------------------------
*/
void
Network_clearData (
   Network   *network
) ;
/*
   ------------------------
   free the Network object

   created  -- 96jun08, cca
   ------------------------
*/
void
Network_free (
   Network   *network
) ;
/*--------------------------------------------------------------------*/
/*
------------------------------------------------------------------------
----- methods found in init.c   ----------------------------------------
------------------------------------------------------------------------
*/
/*
   -------------------------------------------------------------
   initialize the Network object
 
   nnode -- number of nodes in the network, must be > 2,
            source node is 0, sink node is nnode - 1
   narc  -- number of arcs. this value can be zero if the number 
            of arcs is not known at initialization time. 
            storage for the arcs will grow as needed
 
   created -- 96jun08, cca
   -------------------------------------------------------------
*/
void
Network_init (
   Network   *network,
   int       nnode,
   int       narc
) ;
/*
   ---------------------------------
   purpose -- set the message fields
 
   created -- 96oct23, cca
   ---------------------------------
*/
void
Network_setMessageInfo (
   Network   *network,
   int       msglvl,
   FILE      *msgFile
) ;
/*--------------------------------------------------------------------*/
/*
------------------------------------------------------------------------
----- methods found in addArc.c   --------------------------------------
------------------------------------------------------------------------
*/
/*
   -------------------------
   add an arc to the network
 
   created -- 96jun08, cca
   -------------------------
*/
void
Network_addArc (
   Network   *network,
   int       firstNode,
   int       secondNode,
   int       capacity,
   int       flow
) ;
/*--------------------------------------------------------------------*/
/*
------------------------------------------------------------------------
----- methods found in findAugmentingPath.c   --------------------------
------------------------------------------------------------------------
*/
/*
   -----------------------------------------------------------------
   find an augmenting path from the source to the sink through node.
 
   node   -- (source, node) is an arc below capacity
   delta  -- capacity(source, node) - flow(source, node)
   tag    -- tag used to build this traversal tree
   deq    -- dequeue object to handle traversal,
             out-nodes get put at head of list,
             in-nodes get put at tail of list
   tags   -- tags vector for the nodes
   deltas -- flow increment vector for the nodes
   pred   -- predecessor vector for the nodes
 
   created -- 96jun08, cca
   -----------------------------------------------------------------
*/
int
Network_findAugmentingPath (
   Network   *network,
   int       node,
   int       delta,
   int       tag,
   Ideq      *deq,
   int       tags[],
   int       deltas[],
   int       pred[]
) ;
/*--------------------------------------------------------------------*/
/*
------------------------------------------------------------------------
----- methods found in augmentingPath.c   ------------------------------
------------------------------------------------------------------------
*/
/*
   ----------------------------------------------------------------
  given an augmenting path defined by the pred[] vector and delta,
   the change in flow, augment the path from the source to the sink

   created -- 86jun08, cca
   ----------------------------------------------------------------
*/
void
Network_augmentPath (
   Network   *network,
   int       delta,
   int       pred[]
) ;
/*--------------------------------------------------------------------*/
/*
------------------------------------------------------------------------
----- methods found in findMaxFlow.c   ---------------------------------
------------------------------------------------------------------------
*/
/*
   ----------------------------------
   find the maximum flow of a network
 
   created -- 96jun08, cca
   ----------------------------------
*/
void
Network_findMaxFlow (
   Network   *network
) ;
/*--------------------------------------------------------------------*/
/*
------------------------------------------------------------------------
----- methods found in findMincut.c   ----------------------------------
------------------------------------------------------------------------
*/
/*
   --------------------------------------------------------------
   mark the nodes 1 or 2 to define a min-cut,
   where source in X and sink in Y.
   start the search from the source node.
   for x in X and y in Y 
      arc (x,y) is in the min-cut when flow(x,y) == capacity(x,y)
      arc (y,x) is in the min-cut when flow(y,x) == 0
   on return, mark[*] is filled with 1 or 2, 
   where the mark[source] = 1 and mark[sink] = 2
 
   created -- 96jun08, cca
   --------------------------------------------------------------
*/
void
Network_findMincutFromSource (
   Network   *network,
   Ideq      *deq,
   int       mark[]
) ;
/*
   --------------------------------------------------------------
   mark the nodes 1 or 2 to define a min-cut,
   where source in X and sink in Y.
   start the search from the sink node.
   for x in X and y in Y
      arc (x,y) is in the min-cut when flow(x,y) == capacity(x,y)
      arc (y,x) is in the min-cut when flow(y,x) == 0
   on return, mark[*] is filled with 1 or 2,
   where the mark[source] = 1 and mark[sink] = 2
 
   created -- 96jun08, cca
   --------------------------------------------------------------
*/
void
Network_findMincutFromSink (
   Network   *network,
   Ideq      *deq,
   int       mark[]
) ;
/*--------------------------------------------------------------------*/
/*
------------------------------------------------------------------------
----- methods found in IO.c   ------------------------------------------
------------------------------------------------------------------------
*/
/*
   ----------------------------------------
   print the network for debugging purposes
 
   created -- 96jun08, cca
   ----------------------------------------
*/
void
Network_writeForHumanEye (
   Network   *network,
   FILE      *fp
) ;
/*
   ---------------------------------------------------
   print the network statistics for debugging purposes
 
   created -- 96jun08, cca
   ---------------------------------------------------
*/
void
Network_writeStats (
   Network   *network,
   FILE      *fp
) ;
/*--------------------------------------------------------------------*/


syntax highlighted by Code2HTML, v. 0.9.1