eg_util.c

Go to the documentation of this file.
00001 #include "eg_util.h"
00002 /* load a graph into cook's format but reading from a binary file, the memory 
00003  * is not managed through EGmemPool, we might want to change that later on */
00004 int loadBGraph (const char *file,
00005                 int *nNodes,
00006                 int *nEdges,
00007                 int **edges,
00008                 double **weight)
00009 {
00010   /* local variables */
00011   FILE *in;
00012   int status,
00013     i;
00014 
00015   /* set-up */
00016   in = fopen (file, "rb");
00017   TEST (!in, "in loadGraph, can't open input file");
00018 
00019   /* reading parameters */
00020   status = fread (nNodes, sizeof (int), 1, in);
00021   TEST (status != 1, "in loadGraph, can't read from input file");
00022   status = fread (nEdges, sizeof (int), 1, in);
00023   TEST (status != 1, "in loadGraph, can't read from input file");
00024   *edges = (int *) malloc (sizeof (int) * (*nEdges) * 2);
00025   *weight = (double *) malloc (sizeof (double) * (*nEdges));
00026   TEST (!*edges || !*weight, "in loadGraph, not enough memory");
00027 
00028   for (i = 0; i < *nEdges; i++)
00029   {
00030     status = fread (*edges + 2 * i, sizeof (int), 2, in);
00031     TEST (status != 2, "in loadGraph, can't read from input file");
00032     status = fread (*weight + i, sizeof (double), 1, in);
00033     TEST (status != 1, "in loadGraph, can't read from input file");
00034   }
00035 
00036   fclose (in);
00037 
00038   return 0;
00039 }
00040 
00041 /* load a graph into cook's format, the memory is not managed through EGmemPool,
00042  * we might want to change that later on */
00043 int loadGraph (const char *file,
00044                int *nNodes,
00045                int *nEdges,
00046                int **edges,
00047                double **weight)
00048 {
00049   /* local variables */
00050   FILE *in;
00051   int status,
00052     i;
00053 
00054   /* set-up */
00055   in = fopen (file, "r");
00056   TEST (!in, "in loadGraph, can't open input file");
00057 
00058   /* reading parameters */
00059   status = fscanf (in, "%d%d", nNodes, nEdges);
00060   TEST (status != 2, "in loadGraph, can't read from input file");
00061 
00062   *edges = (int *) malloc (sizeof (int) * (*nEdges) * 2);
00063   *weight = (double *) malloc (sizeof (double) * (*nEdges));
00064   TEST (!*edges, "in loadGraph, not enough memory");
00065 
00066   for (i = 0; i < *nEdges; i++)
00067   {
00068     status =
00069       fscanf (in, "%d%d%lf", *edges + 2 * i, *edges + 2 * i + 1, *weight + i);
00070     TEST (status != 3, "in loadGraph, can't read from input file");
00071   }
00072 
00073   fclose (in);
00074 
00075   return 0;
00076 }
00077 
00078 int saveGraph (const char *file_name,
00079                int const nnodes,
00080                int const nedges,
00081                int const *const edges,
00082                double const *const weight)
00083 {
00084 
00085   FILE *logFile;
00086   int i;
00087 
00088   logFile = fopen (file_name, "w");
00089   fprintf (logFile, "%d %d\n", nnodes, nedges);
00090   for (i = 0; i < nedges; i++)
00091     fprintf (logFile, "%d %d %lf\n", edges[2 * i], edges[2 * i + 1], weight[i]);
00092 
00093   fclose (logFile);
00094 
00095   return 0;
00096 
00097 }
00098 
00099 int saveSubGraph (const char *file_name,
00100                   int nnodes,
00101                   int nsubedges,
00102                   int *edges,
00103                   int *subedges,
00104                   double *weight)
00105 {
00106 
00107   FILE *logFile;
00108   int i;
00109 
00110   logFile = fopen (file_name, "w");
00111   fprintf (logFile, "%d %d\n", nnodes, nsubedges);
00112   for (i = 0; i < nsubedges; i++)
00113     fprintf (logFile, "%d %d %lf\n", edges[2 * subedges[i]],
00114              edges[2 * subedges[i] + 1], weight ? weight[i] : 0.0);
00115 
00116   fclose (logFile);
00117 
00118   return 0;
00119 
00120 }
00121 
00122 int saveBgraph (const char *file_name,
00123                 int nnodes,
00124                 int nedges,
00125                 int *edges,
00126                 double *weight)
00127 {
00128 
00129   FILE *logFile;
00130   int i;
00131 
00132 #if DISPLAY_MODE
00133   fprintf (stdout, "Saving graph (binary format) to file %s ... ", file_name);
00134   fflush (stdout);
00135 #endif
00136 
00137   logFile = fopen (file_name, "wb+");
00138   fwrite (&nnodes, sizeof (int), 1, logFile);
00139   fwrite (&nedges, sizeof (int), 1, logFile);
00140   for (i = 0; i < nedges; i++)
00141   {
00142     fwrite (edges + (2 * i), sizeof (int), 1, logFile);
00143     fwrite (edges + (2 * i) + 1, sizeof (int), 1, logFile);
00144     fwrite (weight + i, sizeof (double), 1, logFile);
00145   }
00146   fclose (logFile);
00147 
00148 #if DISPLAY_MODE
00149   fprintf (stdout, "done.\n");
00150   fflush (stdout);
00151 #endif
00152 
00153   return 0;
00154 
00155 }
00156 
00157 /* recieve a graph through a socket */
00158 int EGreceiveRealGraph (CC_SFILE * s,
00159                         EGdGraph_t ** biDualG,
00160                         EGmemPool_t * mem)
00161 {
00162   /* local vars */
00163   int status;
00164   register unsigned int i;
00165   unsigned int nnodes,
00166     nedges,
00167     tail,
00168     head;
00169   EGdGraphNode_t **nodes;
00170   EGmengerEdgeData_t **edata;
00171   double dtmp;
00172   EGmengerNodeData_t *lndata;
00173 
00174   /* read number of nodes and edges */
00175   status = CCutil_sread_uint (s, &nnodes);
00176   CHECKRVAL (status);
00177   status = CCutil_sread_uint (s, &nedges);
00178   CHECKRVAL (status);
00179   MESSAGE (1, "\tnnodes = %d\n\tnedges=%d\n\t", nnodes, nedges);
00180   /* look for memory */
00181   *biDualG = EGnewDGraph (mem);
00182   nodes =
00183     (EGdGraphNode_t **) EGmemPoolMalloc (mem,
00184                                          sizeof (EGdGraphNode_t *) * nnodes);
00185   edata =
00186     (EGmengerEdgeData_t **) EGmemPoolMalloc (mem,
00187                                              sizeof (EGmengerEdgeData_t *) *
00188                                              nedges);
00189   for (i = 0; i < nnodes; i++)
00190   {
00191     lndata = EGnewMengerNodeData (mem);
00192     nodes[i] = EGdGraphAddNode (*biDualG, lndata);
00193   }
00194 
00195   for (i = 0; i < nedges; i++)
00196   {
00197     status = CCutil_sread_uint (s, &tail);
00198     CHECKRVAL (status);
00199     status = CCutil_sread_uint (s, &head);
00200     CHECKRVAL (status);
00201     edata[i] = EGnewMengerEdgeData (mem);
00202     EGdGraphAddEdge (*biDualG, edata[i], nodes[head], nodes[tail]);
00203   }
00204   for (i = 0; i < nedges; i++)
00205   {
00206     status = CCutil_sread_double (s, &dtmp);
00207     edata[i]->cost = EGdijkstraToCost (dtmp);
00208     TESTL (1, dtmp < 0, "edge weight our of bounds edge %u value %lf ", i,
00209            dtmp);
00210     CHECKRVAL (status);
00211   }
00212 
00213   /* clean up */
00214   EGmemPoolFree (nodes, sizeof (EGdGraphNode_t *) * nnodes, mem);
00215   EGmemPoolFree (edata, sizeof (EGmengerEdgeData_t *) * nedges, mem);
00216   return 0;
00217 }
00218 
00219 /* recieve a graph through a socket */
00220 int EGsendRealGraph (CC_SFILE * s,
00221                      EGdGraph_t * biDualG,
00222                      EGdGraphEdge_t *** dedges,
00223                      EGdGraphNode_t *** dnodes,
00224                      EGmemPool_t * mem)
00225 {
00226   /* local vars */
00227   int status;
00228   EGdGraphNode_t *cnode;
00229   EGlistNode_t *lIt,
00230    *eIt;
00231   int edge_count = 0;
00232 
00233   /* preset the values */
00234   *dnodes =
00235     (EGdGraphNode_t **) EGmemPoolMalloc (mem,
00236                                          sizeof (EGdGraphNode_t *) *
00237                                          biDualG->nodes->size);
00238   *dedges =
00239     (EGdGraphEdge_t **) EGmemPoolMalloc (mem,
00240                                          sizeof (EGdGraphEdge_t *) *
00241                                          biDualG->nedges);
00242 
00243   /* read number of nodes and edges */
00244   WARNINGL (1, 1, "assuming contiguous and unique ID for nodes");
00245   status = CCutil_swrite_uint (s, biDualG->nodes->size);
00246   CHECKRVAL (status);
00247   MESSAGE (10, "send nnodes=%u", biDualG->nodes->size);
00248   status = CCutil_swrite_uint (s, biDualG->nedges);
00249   CHECKRVAL (status);
00250   MESSAGE (10, "send nedges=%u", biDualG->nedges);
00251   for (lIt = biDualG->nodes->begin; lIt; lIt = lIt->next)
00252   {
00253     cnode = (EGdGraphNode_t *) lIt->this;
00254     (*dnodes)[cnode->id] = cnode;
00255     for (eIt = cnode->out_edges->begin; eIt; eIt = eIt->next)
00256     {
00257       (*dedges)[edge_count++] = (EGdGraphEdge_t *) (eIt->this);
00258       status =
00259         CCutil_swrite_uint (s, ((EGdGraphEdge_t *) (eIt->this))->tail->id);
00260       CHECKRVAL (status);
00261       status =
00262         CCutil_swrite_uint (s, ((EGdGraphEdge_t *) (eIt->this))->head->id);
00263       CHECKRVAL (status);
00264     }
00265   }
00266   for (lIt = biDualG->nodes->begin; lIt; lIt = lIt->next)
00267   {
00268     cnode = (EGdGraphNode_t *) lIt->this;
00269     for (eIt = cnode->out_edges->begin; eIt; eIt = eIt->next)
00270     {
00271       status =
00272         CCutil_swrite_double (s,
00273                               EGdijkstraCostToLf (((EGmengerEdgeData_t
00274                                                     *) (((EGdGraphEdge_t
00275                                                           *) (eIt->this))->
00276                                                         data))->cost));
00277       CHECKRVAL (status);
00278     }
00279   }
00280 
00281   return 0;
00282 }
00283 
00284 /* recieve a graph through a socket */
00285 int EGreceiveNetGraph (CC_SFILE * s,
00286                        unsigned int *nnodes,
00287                        unsigned int *nedges,
00288                        unsigned int **edges,
00289                        double **weight,
00290                        EGmemPool_t * mem)
00291 {
00292   /* local vars */
00293   int status;
00294   register unsigned int i;
00295 
00296   /* preset the values */
00297   *nedges = 0;
00298   *nnodes = 0;
00299   *edges = 0;
00300   *weight = 0;
00301 
00302   /* read number of nodes and edges */
00303   status = CCutil_sread_uint (s, nnodes);
00304   CHECKRVAL (status);
00305   status = CCutil_sread_uint (s, nedges);
00306   CHECKRVAL (status);
00307 #if CHECK_MODE
00308   TEST (*nnodes < 2
00309         || *nedges < 1, "empty or trivial graph, nnodes=%d, nedges=%d", *nnodes,
00310         *nedges);
00311 #endif
00312   *edges =
00313     (unsigned int *) EGmemPoolMalloc (mem,
00314                                       sizeof (unsigned int) * (*nedges) * 2);
00315   *weight = (double *) EGmemPoolMalloc (mem, sizeof (double) * (*nedges));
00316   for (i = 0; i < *nedges; i++)
00317   {
00318     status = CCutil_sread_uint (s, (*edges) + (i << 1));
00319     CHECKRVAL (status);
00320     status = CCutil_sread_uint (s, (*edges) + ((i << 1) | 1));
00321     CHECKRVAL (status);
00322 #if CHECK_MODE
00323     TEST ((*edges)[i << 1] < 0 || (*edges)[i << 1] >= *nnodes ||
00324           (*edges)[(i << 1) | 1] < 0 || (*edges)[(i << 1) | 1] >= *nnodes,
00325           "edge end out of range %d (%d %d)", i, (*edges)[i << 1],
00326           (*edges)[(i << 1) | 1]);
00327 #endif
00328   }
00329   for (i = 0; i < *nedges; i++)
00330   {
00331     status = CCutil_sread_double (s, (*weight) + i);
00332     CHECKRVAL (status);
00333   }
00334 
00335   return 0;
00336 }
00337 
00338 /* recieve a graph through a socket */
00339 int EGsendNetGraph (CC_SFILE * s,
00340                     unsigned int nnodes,
00341                     unsigned int nedges,
00342                     unsigned int *edges,
00343                     double *weight)
00344 {
00345   /* local vars */
00346   int status;
00347   register unsigned int i;
00348 
00349   /* preset the values */
00350 
00351   /* read number of nodes and edges */
00352   status = CCutil_swrite_uint (s, nnodes);
00353   CHECKRVAL (status);
00354   status = CCutil_swrite_uint (s, nedges);
00355   CHECKRVAL (status);
00356   for (i = 0; i < nedges; i++)
00357   {
00358     status = CCutil_swrite_uint (s, edges[i << 1]);
00359     CHECKRVAL (status);
00360     status = CCutil_swrite_uint (s, edges[(i << 1) | 1]);
00361     CHECKRVAL (status);
00362   }
00363   for (i = 0; i < nedges; i++)
00364   {
00365     status = CCutil_swrite_double (s, weight[i]);
00366     CHECKRVAL (status);
00367   }
00368 
00369   return 0;
00370 }
00371 
00372 /* send dominoes */
00373 int EGreceiveNetDomino (CC_SFILE * s,
00374                         EGnetDdom_t ** ddom,
00375                         EGmemPool_t * mem)
00376 {
00377   /* local vars */
00378   int status,
00379     pth;
00380   register unsigned int i;
00381 
00382   /* reset values */
00383   *ddom = (EGnetDdom_t *) EGmemPoolMalloc (mem, sizeof (EGnetDdom_t));
00384   memset (*ddom, 0, sizeof (EGnetDdom_t));
00385 
00386   /* start reading */
00387   status = CCutil_sread_uint (s, &((*ddom)->s));
00388   CHECKRVAL (status);
00389   status = CCutil_sread_uint (s, &((*ddom)->t));
00390   CHECKRVAL (status);
00391   status = CCutil_sread_double (s, &((*ddom)->value));
00392   CHECKRVAL (status);
00393 
00394   /* look for memory */
00395   (*ddom)->npath =
00396     (unsigned int *) EGmemPoolMalloc (mem, sizeof (unsigned int) * 3);
00397   (*ddom)->path =
00398     (unsigned int **) EGmemPoolMalloc (mem, sizeof (unsigned int *) * 3);
00399 
00400   /* read path lengths */
00401   status = CCutil_sread_uint (s, &((*ddom)->npath[0]));
00402   CHECKRVAL (status);
00403   status = CCutil_sread_uint (s, &((*ddom)->npath[1]));
00404   CHECKRVAL (status);
00405   status = CCutil_sread_uint (s, &((*ddom)->npath[2]));
00406   CHECKRVAL (status);
00407 
00408   /* read all paths */
00409   for (pth = 0; pth < 3; pth++)
00410   {
00411     (*ddom)->path[pth] =
00412       (unsigned int *) EGmemPoolMalloc (mem,
00413                                         sizeof (unsigned int) *
00414                                         ((*ddom)->npath[pth]));
00415     for (i = 0; i < (*ddom)->npath[pth]; i++)
00416     {
00417       status = CCutil_sread_uint (s, ((*ddom)->path[pth]) + i);
00418       CHECKRVAL (status);
00419     }
00420   }
00421 
00422   /* end */
00423   return 0;
00424 }
00425 
00426 /* send dominoes */
00427 int EGsendNetDomino (CC_SFILE * s,
00428                      EGnetDdom_t * ddom)
00429 {
00430   /* local vars */
00431   int status,
00432     pth;
00433   register unsigned int i;
00434 
00435   /* start reading */
00436   status = CCutil_swrite_uint (s, ddom->s);
00437   CHECKRVAL (status);
00438   status = CCutil_swrite_uint (s, ddom->t);
00439   CHECKRVAL (status);
00440   status = CCutil_swrite_double (s, ddom->value);
00441   CHECKRVAL (status);
00442 
00443   /* look for memory */
00444 
00445   /* read path lengths */
00446   status = CCutil_swrite_uint (s, ddom->npath[0]);
00447   CHECKRVAL (status);
00448   status = CCutil_swrite_uint (s, ddom->npath[1]);
00449   CHECKRVAL (status);
00450   status = CCutil_swrite_uint (s, ddom->npath[2]);
00451   CHECKRVAL (status);
00452 
00453   /* read all paths */
00454   for (pth = 0; pth < 3; pth++)
00455   {
00456     for (i = 0; i < ddom->npath[pth]; i++)
00457     {
00458       status = CCutil_swrite_uint (s, ddom->path[pth][i]);
00459       CHECKRVAL (status);
00460     }
00461   }
00462 
00463   /* end */
00464   return 0;
00465 }
00466 
00467 /* send dominoes */
00468 int EGsendRealDomino (CC_SFILE * s,
00469                       EGddomino_t * ddom)
00470 {
00471   /* local vars */
00472   int status,
00473     pth;
00474   register unsigned int i;
00475 
00476   TEST (ddom->DDtype != DOM_DUAL_NORM, "Can't send dominos of type other than "
00477         "DOM_DUAL_NORM");
00478   /* start reading */
00479   status = CCutil_swrite_uint (s, ddom->s->id);
00480   CHECKRVAL (status);
00481   status = CCutil_swrite_uint (s, ddom->t->id);
00482   CHECKRVAL (status);
00483   status = CCutil_swrite_double (s, EGdijkstraCostToLf (ddom->value));
00484   CHECKRVAL (status);
00485 
00486   /* look for memory */
00487 
00488   /* read path lengths */
00489   status = CCutil_swrite_uint (s, ddom->npath[0]);
00490   CHECKRVAL (status);
00491   status = CCutil_swrite_uint (s, ddom->npath[1]);
00492   CHECKRVAL (status);
00493   status = CCutil_swrite_uint (s, ddom->npath[2]);
00494   CHECKRVAL (status);
00495 
00496   /* read all paths */
00497   for (pth = 0; pth < 3; pth++)
00498   {
00499     for (i = 0; i < ddom->npath[pth]; i++)
00500     {
00501       status =
00502         CCutil_swrite_uint (s, ((EGdGraphEdge_t *) (ddom->path[pth][i]))->id);
00503       CHECKRVAL (status);
00504     }
00505   }
00506 
00507   /* end */
00508   return 0;
00509 }
00510 
00511 /* send dominoes */
00512 int EGreceiveRealDomino (CC_SFILE * s,
00513                          EGddomino_t ** ddom,
00514                          EGdGraphEdge_t ** dedges,
00515                          EGdGraphNode_t ** dnodes,
00516                          EGmemPool_t * mem)
00517 {
00518   /* local vars */
00519   int status,
00520     pth;
00521   unsigned int itmp;
00522   register unsigned int i;
00523   double dtmp;
00524 
00525   /* reset values */
00526   *ddom = EGmemPoolSMalloc (mem, EGddomino_t, 1);
00527   memset (*ddom, 0, sizeof (EGddomino_t));
00528   (*ddom)->DDtype = DOM_DUAL_NORM;
00529 
00530   /* start reading */
00531   status = CCutil_sread_uint (s, &itmp);
00532   CHECKRVAL (status);
00533   (*ddom)->s = dnodes[itmp];
00534   status = CCutil_sread_uint (s, &itmp);
00535   CHECKRVAL (status);
00536   (*ddom)->t = dnodes[itmp];
00537   status = CCutil_sread_double (s, &dtmp);
00538   CHECKRVAL (status);
00539   (*ddom)->value = EGdijkstraToCost (dtmp);
00540 
00541   /* look for memory */
00542   (*ddom)->npath = EGmemPoolSMalloc (mem, unsigned int,
00543                                      3);
00544   (*ddom)->path = EGmemPoolSMalloc (mem, void **,
00545                                     3);
00546 
00547   /* read path lengths */
00548   status = CCutil_sread_uint (s, &itmp);
00549   CHECKRVAL (status);
00550   (*ddom)->npath[0] = itmp;
00551   status = CCutil_sread_uint (s, &itmp);
00552   CHECKRVAL (status);
00553   (*ddom)->npath[1] = itmp;
00554   status = CCutil_sread_uint (s, &itmp);
00555   CHECKRVAL (status);
00556   (*ddom)->npath[2] = itmp;
00557 
00558   /* read all paths */
00559   for (pth = 0; pth < 3; pth++)
00560   {
00561     (*ddom)->path[pth] = EGmemPoolSMalloc (mem, void *,
00562                                              (*ddom)->npath[pth]);
00563     for (i = 0; i < (*ddom)->npath[pth]; i++)
00564     {
00565       status = CCutil_sread_uint (s, &itmp);
00566       CHECKRVAL (status);
00567       (*ddom)->path[pth][i] = dedges[itmp];
00568     }
00569   }
00570 
00571   /* end */
00572   return 0;
00573 }
00574 
00575 /* eliminate all small edges (cut-off value is a constant defined here 
00576  * as maxval ) */
00577 int removeSmallEdges (double maxval,
00578                       int *orig_edges,
00579                       int norig_edges,
00580                       double *orig_weight,
00581                       int *nedges,
00582                       int **edges,
00583                       double **weight,
00584                       EGmemPool_t * mem)
00585 {
00586 
00587   int i,
00588     t;
00589 
00590   t = 0;
00591   for (i = 0; i < norig_edges; i++)
00592     if (orig_weight[i] > maxval)
00593       t++;
00594 
00595   (*edges) = EGmemPoolMalloc (mem, sizeof (int) * t * 2);
00596   (*weight) = EGmemPoolMalloc (mem, sizeof (double) * t);
00597 
00598   t = 0;
00599   for (i = 0; i < norig_edges; i++)
00600     if (orig_weight[i] > maxval)
00601     {
00602 
00603       (*edges)[2 * t] = orig_edges[2 * i];
00604       (*edges)[2 * t + 1] = orig_edges[2 * i + 1];
00605       (*weight)[t] = orig_weight[i];
00606       t++;
00607 
00608     }
00609 
00610   *nedges = t;
00611 
00612   return 0;
00613 
00614 }
00615 
00616 int EGisCookGraphConnected (int nnodes,
00617                             int nedges,
00618                             int *edges,
00619                             EGmemPool_t * mem)
00620 {
00621 
00622   EGuGraph_t *G;
00623   int is_connected;
00624 
00625   G = EGuGraphImport (nnodes, nedges, edges, 0, 0, 0, mem);
00626   is_connected = EGuGraphIsConnected (G, mem);
00627 
00628   EGfreeUGraph (G);
00629 
00630   return is_connected;
00631 
00632 }

Generated on Thu Oct 20 14:58:41 2005 for DominoParitySeparator by  doxygen 1.4.5