00001 #include "eg_util.h"
00002
00003
00004 int loadBGraph (const char *file,
00005 int *nNodes,
00006 int *nEdges,
00007 int **edges,
00008 double **weight)
00009 {
00010
00011 FILE *in;
00012 int status,
00013 i;
00014
00015
00016 in = fopen (file, "rb");
00017 TEST (!in, "in loadGraph, can't open input file");
00018
00019
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
00042
00043 int loadGraph (const char *file,
00044 int *nNodes,
00045 int *nEdges,
00046 int **edges,
00047 double **weight)
00048 {
00049
00050 FILE *in;
00051 int status,
00052 i;
00053
00054
00055 in = fopen (file, "r");
00056 TEST (!in, "in loadGraph, can't open input file");
00057
00058
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
00158 int EGreceiveRealGraph (CC_SFILE * s,
00159 EGdGraph_t ** biDualG,
00160 EGmemPool_t * mem)
00161 {
00162
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
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
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
00214 EGmemPoolFree (nodes, sizeof (EGdGraphNode_t *) * nnodes, mem);
00215 EGmemPoolFree (edata, sizeof (EGmengerEdgeData_t *) * nedges, mem);
00216 return 0;
00217 }
00218
00219
00220 int EGsendRealGraph (CC_SFILE * s,
00221 EGdGraph_t * biDualG,
00222 EGdGraphEdge_t *** dedges,
00223 EGdGraphNode_t *** dnodes,
00224 EGmemPool_t * mem)
00225 {
00226
00227 int status;
00228 EGdGraphNode_t *cnode;
00229 EGlistNode_t *lIt,
00230 *eIt;
00231 int edge_count = 0;
00232
00233
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
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
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
00293 int status;
00294 register unsigned int i;
00295
00296
00297 *nedges = 0;
00298 *nnodes = 0;
00299 *edges = 0;
00300 *weight = 0;
00301
00302
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
00339 int EGsendNetGraph (CC_SFILE * s,
00340 unsigned int nnodes,
00341 unsigned int nedges,
00342 unsigned int *edges,
00343 double *weight)
00344 {
00345
00346 int status;
00347 register unsigned int i;
00348
00349
00350
00351
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
00373 int EGreceiveNetDomino (CC_SFILE * s,
00374 EGnetDdom_t ** ddom,
00375 EGmemPool_t * mem)
00376 {
00377
00378 int status,
00379 pth;
00380 register unsigned int i;
00381
00382
00383 *ddom = (EGnetDdom_t *) EGmemPoolMalloc (mem, sizeof (EGnetDdom_t));
00384 memset (*ddom, 0, sizeof (EGnetDdom_t));
00385
00386
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
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
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
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
00423 return 0;
00424 }
00425
00426
00427 int EGsendNetDomino (CC_SFILE * s,
00428 EGnetDdom_t * ddom)
00429 {
00430
00431 int status,
00432 pth;
00433 register unsigned int i;
00434
00435
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
00444
00445
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
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
00464 return 0;
00465 }
00466
00467
00468 int EGsendRealDomino (CC_SFILE * s,
00469 EGddomino_t * ddom)
00470 {
00471
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
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
00487
00488
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
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
00508 return 0;
00509 }
00510
00511
00512 int EGreceiveRealDomino (CC_SFILE * s,
00513 EGddomino_t ** ddom,
00514 EGdGraphEdge_t ** dedges,
00515 EGdGraphNode_t ** dnodes,
00516 EGmemPool_t * mem)
00517 {
00518
00519 int status,
00520 pth;
00521 unsigned int itmp;
00522 register unsigned int i;
00523 double dtmp;
00524
00525
00526 *ddom = EGmemPoolSMalloc (mem, EGddomino_t, 1);
00527 memset (*ddom, 0, sizeof (EGddomino_t));
00528 (*ddom)->DDtype = DOM_DUAL_NORM;
00529
00530
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
00542 (*ddom)->npath = EGmemPoolSMalloc (mem, unsigned int,
00543 3);
00544 (*ddom)->path = EGmemPoolSMalloc (mem, void **,
00545 3);
00546
00547
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
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
00572 return 0;
00573 }
00574
00575
00576
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 }