int gp_ColorVerticesIntegrityCheck(graphP theGraph, graphP origGraph) { int I, J, w; ColorVerticesContext *context = (ColorVerticesContext *) gp_GetExtension(theGraph, COLORVERTICES_ID); if (theGraph == NULL || origGraph == NULL || context == NULL) return NOTOK; if (gp_GetNumColorsUsed(theGraph) <= 0 && theGraph->M > 0) return NOTOK; if (_TestSubgraph(theGraph, origGraph) != TRUE) return NOTOK; if (_TestSubgraph(origGraph, theGraph) != TRUE) return NOTOK; for (I=0; I < theGraph->N; I++) { J = gp_GetFirstArc(theGraph, I); while (gp_IsArc(theGraph, J)) { w = theGraph->G[J].v; if (context->color[I] < 0 || context->color[I] == context->color[w]) return NOTOK; J = gp_GetNextArc(theGraph, J); } } return OK; }
int gp_ColorVerticesIntegrityCheck(graphP theGraph, graphP origGraph) { int v, w, e; ColorVerticesContext *context = (ColorVerticesContext *) gp_GetExtension(theGraph, COLORVERTICES_ID); if (theGraph == NULL || origGraph == NULL || context == NULL) return NOTOK; if (gp_GetNumColorsUsed(theGraph) <= 0 && theGraph->M > 0) return NOTOK; if (_TestSubgraph(theGraph, origGraph) != TRUE) return NOTOK; if (_TestSubgraph(origGraph, theGraph) != TRUE) return NOTOK; for (v = gp_GetFirstVertex(theGraph); gp_VertexInRange(theGraph, v); v++) { e = gp_GetFirstArc(theGraph, v); while (gp_IsArc(e)) { w = gp_GetNeighbor(theGraph, e); if (context->color[v] < 0 || context->color[v] == context->color[w]) return NOTOK; e = gp_GetNextArc(theGraph, e); } } return OK; }
void WriteAlgorithmResults(graphP theGraph, int Result, char command, platform_time start, platform_time end, char *infileName) { if (infileName) sprintf(Line, "The graph '%s' ", infileName); else sprintf(Line, "The graph "); Message(Line); switch (command) { case 'p' : sprintf(Line, "is%s planar.\n", Result==OK ? "" : " not"); break; case 'd' : sprintf(Line, "is%s planar.\n", Result==OK ? "" : " not"); break; case 'o' : sprintf(Line, "is%s outerplanar.\n", Result==OK ? "" : " not"); break; case '2' : sprintf(Line, "has %s subgraph homeomorphic to K_{2,3}.\n", Result==OK ? "no" : "a"); break; case '3' : sprintf(Line, "has %s subgraph homeomorphic to K_{3,3}.\n", Result==OK ? "no" : "a"); break; case '4' : sprintf(Line, "has %s subgraph homeomorphic to K_4.\n", Result==OK ? "no" : "a"); break; case 'c' : sprintf(Line, "has been %d-colored.\n", gp_GetNumColorsUsed(theGraph)); break; default : sprintf(Line, "nas not been processed due to unrecognized command.\n"); break; } Message(Line); sprintf(Line, "Algorithm '%s' executed in %.3lf seconds.\n", GetAlgorithmName(command), platform_GetDuration(start,end)); Message(Line); }
int RandomGraphs(char command, int NumGraphs, int SizeOfGraphs) { char theFileName[256]; int K, countUpdateFreq; int Result=OK, MainStatistic=0; int ObstructionMinorFreqs[NUM_MINORS]; graphP theGraph=NULL, origGraph=NULL; platform_time start, end; int embedFlags = GetEmbedFlags(command); int ReuseGraphs = TRUE; GetNumberIfZero(&NumGraphs, "Enter number of graphs to generate:", 1, 1000000000); GetNumberIfZero(&SizeOfGraphs, "Enter size of graphs:", 1, 10000); theGraph = MakeGraph(SizeOfGraphs, command); origGraph = MakeGraph(SizeOfGraphs, command); if (theGraph == NULL || origGraph == NULL) { gp_Free(&theGraph); return NOTOK; } // Initialize a secondary statistics array for (K=0; K < NUM_MINORS; K++) ObstructionMinorFreqs[K] = 0; // Seed the random number generator with "now". Do it after any prompting // to tie randomness to human process of answering the prompt. srand(time(NULL)); // Select a counter update frequency that updates more frequently with larger graphs // and which is relatively prime with 10 so that all digits of the count will change // even though we aren't showing the count value on every iteration countUpdateFreq = 3579 / SizeOfGraphs; countUpdateFreq = countUpdateFreq < 1 ? 1 : countUpdateFreq; countUpdateFreq = countUpdateFreq % 2 == 0 ? countUpdateFreq+1 : countUpdateFreq; countUpdateFreq = countUpdateFreq % 5 == 0 ? countUpdateFreq+2 : countUpdateFreq; // Start the count fprintf(stdout, "0\r"); fflush(stdout); // Start the timer platform_GetTime(start); // Generate and process the number of graphs requested for (K=0; K < NumGraphs; K++) { if ((Result = gp_CreateRandomGraph(theGraph)) == OK) { if (tolower(OrigOut)=='y') { sprintf(theFileName, "random\\%d.txt", K%10); gp_Write(theGraph, theFileName, WRITE_ADJLIST); } gp_CopyGraph(origGraph, theGraph); if (strchr("pdo234", command)) { Result = gp_Embed(theGraph, embedFlags); if (gp_TestEmbedResultIntegrity(theGraph, origGraph, Result) != Result) Result = NOTOK; if (Result == OK) { MainStatistic++; if (tolower(EmbeddableOut) == 'y') { sprintf(theFileName, "embedded\\%d.txt", K%10); gp_Write(theGraph, theFileName, WRITE_ADJMATRIX); } if (tolower(AdjListsForEmbeddingsOut) == 'y') { sprintf(theFileName, "adjlist\\%d.txt", K%10); gp_Write(theGraph, theFileName, WRITE_ADJLIST); } } else if (Result == NONEMBEDDABLE) { if (embedFlags == EMBEDFLAGS_PLANAR || embedFlags == EMBEDFLAGS_OUTERPLANAR) { if (theGraph->IC.minorType & MINORTYPE_A) ObstructionMinorFreqs[0] ++; else if (theGraph->IC.minorType & MINORTYPE_B) ObstructionMinorFreqs[1] ++; else if (theGraph->IC.minorType & MINORTYPE_C) ObstructionMinorFreqs[2] ++; else if (theGraph->IC.minorType & MINORTYPE_D) ObstructionMinorFreqs[3] ++; else if (theGraph->IC.minorType & MINORTYPE_E) ObstructionMinorFreqs[4] ++; if (theGraph->IC.minorType & MINORTYPE_E1) ObstructionMinorFreqs[5] ++; else if (theGraph->IC.minorType & MINORTYPE_E2) ObstructionMinorFreqs[6] ++; else if (theGraph->IC.minorType & MINORTYPE_E3) ObstructionMinorFreqs[7] ++; else if (theGraph->IC.minorType & MINORTYPE_E4) ObstructionMinorFreqs[8] ++; if (tolower(ObstructedOut) == 'y') { sprintf(theFileName, "obstructed\\%d.txt", K%10); gp_Write(theGraph, theFileName, WRITE_ADJMATRIX); } } } } else if (command == 'c') { if ((Result = gp_ColorVertices(theGraph)) == OK) Result = gp_ColorVerticesIntegrityCheck(theGraph, origGraph); if (Result == OK && gp_GetNumColorsUsed(theGraph) <= 5) MainStatistic++; } // If there is an error in processing, then write the file for debugging if (Result != OK && Result != NONEMBEDDABLE) { sprintf(theFileName, "error\\%d.txt", K%10); gp_Write(origGraph, theFileName, WRITE_ADJLIST); } } // Reinitialize or recreate graphs for next iteration ReinitializeGraph(&theGraph, ReuseGraphs, command); ReinitializeGraph(&origGraph, ReuseGraphs, command); // Show progress, but not so often that it bogs down progress if (quietMode == 'n' && (K+1) % countUpdateFreq == 0) { fprintf(stdout, "%d\r", K+1); fflush(stdout); } // Terminate loop on error if (Result != OK && Result != NONEMBEDDABLE) { ErrorMessage("\nError found\n"); Result = NOTOK; break; } } // Stop the timer platform_GetTime(end); // Finish the count fprintf(stdout, "%d\n", NumGraphs); fflush(stdout); // Free the graph structures created before the loop gp_Free(&theGraph); gp_Free(&origGraph); // Print some demographic results if (Result == OK || Result == NONEMBEDDABLE) Message("\nNo Errors Found."); sprintf(Line, "\nDone (%.3lf seconds).\n", platform_GetDuration(start,end)); Message(Line); // Report statistics for planar or outerplanar embedding if (embedFlags == EMBEDFLAGS_PLANAR || embedFlags == EMBEDFLAGS_OUTERPLANAR) { sprintf(Line, "Num Embedded=%d.\n", MainStatistic); Message(Line); for (K=0; K<5; K++) { // Outerplanarity does not produces minors C and D if (embedFlags == EMBEDFLAGS_OUTERPLANAR && (K==2 || K==3)) continue; sprintf(Line, "Minor %c = %d\n", K+'A', ObstructionMinorFreqs[K]); Message(Line); } if (!(embedFlags & ~EMBEDFLAGS_PLANAR)) { sprintf(Line, "\nNote: E1 are added to C, E2 are added to A, and E=E3+E4+K5 homeomorphs.\n"); Message(Line); for (K=5; K<NUM_MINORS; K++) { sprintf(Line, "Minor E%d = %d\n", K-4, ObstructionMinorFreqs[K]); Message(Line); } } } // Report statistics for graph drawing else if (embedFlags == EMBEDFLAGS_DRAWPLANAR) { sprintf(Line, "Num Graphs Embedded and Drawn=%d.\n", MainStatistic); Message(Line); } // Report statistics for subgraph homeomorphism algorithms else if (embedFlags == EMBEDFLAGS_SEARCHFORK23) { sprintf(Line, "Of the generated graphs, %d did not contain a K_{2,3} homeomorph as a subgraph.\n", MainStatistic); Message(Line); } else if (embedFlags == EMBEDFLAGS_SEARCHFORK33) { sprintf(Line, "Of the generated graphs, %d did not contain a K_{3,3} homeomorph as a subgraph.\n", MainStatistic); Message(Line); } else if (embedFlags == EMBEDFLAGS_SEARCHFORK4) { sprintf(Line, "Of the generated graphs, %d did not contain a K_4 homeomorph as a subgraph.\n", MainStatistic); Message(Line); } // Report statistics for vertex coloring else if (command == 'c') { sprintf(Line, "Num Graphs colored with 5 or fewer colors=%d.\n", MainStatistic); Message(Line); } FlushConsole(stdout); return Result==OK || Result==NONEMBEDDABLE ? OK : NOTOK; }