00001
00005
00006 #include "converse.h"
00007 #include "graph.h"
00008 #include <stdlib.h>
00009
00010 #define printf CmiPrintf
00011 void printPartition(Graph * g, int nodes[], int numNodes)
00012 {
00013 int i;
00014 for (i=0; i<numNodes; i++)
00015 printf("\t%d", nodes[i]);
00016 printf("\n");
00017
00018 }
00019
00020 int intSqrt(int x)
00021 {
00022 int y=1;
00023 while (y*y<x) y++;
00024 return y;
00025 }
00026
00027 Graph * g_initGraph(int V, int E) {
00028 Graph *g;
00029
00030 g = (Graph *) malloc(sizeof(Graph));
00031
00032 g->V = V;
00033 g->E = E ;
00034 g->vertices = (VertexRecord *) malloc(V*sizeof(VertexRecord));
00035 g->edges = (int *) malloc( 2* (1 + g->E) * sizeof(int));
00036 g->currentVertex = -1;
00037 g->currentEdge = 0;
00038 return g;
00039 }
00040
00041 void g_freeGraph(Graph* g)
00042 {
00043 free(g->vertices);
00044 g->vertices=0;
00045 free(g->edges);
00046 g->edges = 0;
00047 free(g);
00048 }
00049
00050 void g_nextVertex(Graph *g, int v, float weight)
00051 {
00052 int current;
00053
00054 g->currentVertex++;
00055 current = g->currentVertex;
00056 if(current >= g->V)
00057 printf("current overflow\n");
00058 g->vertices[current].index = v;
00059 g->vertices[current].weight = weight;
00060 g->vertices[current].firstEdge = g->currentEdge;
00061 g->vertices[current].numEdges = 0;
00062
00063
00064 }
00065
00066
00067 void g_addEdge(Graph *g, int w, float weight)
00068 {
00069
00070 int v, i;
00071 v = g->currentVertex;
00072
00073
00074
00075
00076
00077
00078
00079 i = g->vertices[v].firstEdge;
00080 while (i < g->currentEdge) {
00081 if (g->edges[i] == w) {
00082 return; }
00083 i++;
00084 }
00085
00086
00087
00088 g->vertices[v].numEdges++;
00089 g->edges[g->currentEdge++] = w;
00090
00091 }
00092
00093 void g_finishVertex(Graph *g) {
00094
00095 if (g->vertices[g->currentVertex].numEdges != g->currentEdge - g->vertices[g->currentVertex].firstEdge)
00096 printf("Error in finishVertex\n");
00097
00098
00099 }
00100
00101
00102 Graph *generateRandomGraph(int numNodes) {
00103
00104 Graph *g;
00105
00106 int i, stride, n;
00107
00108 g = (Graph *) malloc(sizeof(Graph));
00109 g->vertices = (VertexRecord *) malloc(numNodes*sizeof(VertexRecord));
00110 g->V = numNodes;
00111
00112 g->E = 4* g->V ;
00113 g->edges = (int *) malloc( (1 + g->E) * sizeof(int));
00114 stride = intSqrt(g->V);
00115
00116 n = 0;
00117 for (i = 0; i<g->V; i++) {
00118 g->vertices[i].index = i;
00119 g->vertices[i].firstEdge = n;
00120 g->vertices[i].numEdges = 4;
00121 g->vertices[i].weight = 1.0;
00122
00123 g->edges[n++] = (i + numNodes - 1) % numNodes;
00124 g->edges[n++] = (i + 1) % numNodes;
00125
00126 g->edges[n++] = (i +numNodes - stride) % numNodes;
00127 g->edges[n++] = (i + stride) % numNodes;
00128
00129 }
00130 return g;
00131 }
00132
00133
00134
00135
00136 void g_printGraph(Graph *g) {
00137 int i, j;
00138
00139 CmiPrintf("%d vertices, %d edges \n", g->V, g->E);
00140 for (i=0; i< g->V; i++)
00141 { printf("\n %d: (%d)\t", i, g->vertices[i].numEdges );
00142 for (j=0; j<g->vertices[i].numEdges; j++)
00143 printf(" %d,", g->edges[g->vertices[i].firstEdge + j ]); }
00144
00145 }
00146
00147 int g_numNeighbors(Graph *g, int node) {
00148
00149 return g->vertices[node].numEdges;
00150 }
00151
00152 int g_getNeighbor(Graph *g, int node, int i) {
00153
00154 if (i >= g->vertices[node].numEdges) {
00155 printf("error: node %d has only %d neighbors. You asked for %d'th nbr\n",
00156 node, g->vertices[node].numEdges, i);
00157 return 0;
00158 }
00159 return g->edges [ g->vertices[node].firstEdge + i];
00160
00161 }
00162
00163 float graph_weightof(Graph *g, int vertex) {
00164
00165 return g->vertices[vertex].weight;
00166
00167 }
00168