public void runWithCandidate(Point2 candidate) { init(Globals.d); List <Point2> allEdges = Initialization.initializeEdges(); Queue <Point2> candidateVertexQueue = new Queue <Point2>(); var invalidVertexFlag = false; //flag to dtermine if one of the tests fail (i.e. candidate vertex cannot be a vertex). var st = DateTime.Now; foreach (Point2 candidateVertex in CandidateVertices) { candidateVertexQueue.Enqueue(candidateVertex); } invalidVertexFlag = false; //reset vertex flag if (candidate == null) { if (Globals.ShowMessages) { Console.WriteLine("ERROR: thisCandidate is null. Check possibleEdge being added to currentCandidate."); } invalidVertexFlag = true; return; } candidate.SortLexicographically(); //sort coordinates of points to account for symmetry //Testing output Console.WriteLine("Now checking: {0}. # of elements in queue: {1}", candidate, candidateVertexQueue.Count); //check to see if currentCandidate is in RedVertices List foreach (Point2 thisRedVertex in RedVertices) { if (candidate.Equals(thisRedVertex)) { if (Globals.ShowMessages) { Console.WriteLine("{0} is a red vertex.", candidate); } if (Globals.ShowMessages) { Console.WriteLine("--Eliminated. In Red Vertices List."); } invalidVertexFlag = true; break; } } //check if sum of coordinates is > d*2^(d-2) if (candidate.SumOfCoordinates() > (Globals.d * Math.Pow(2, (Globals.d - 2)))) { if (Globals.ShowMessages) { Console.WriteLine("{0}. Sum of coordinates exceedds d*2^(d-2).", candidate); } NonVertices.Add(candidate); return; } foreach (int coordinate in candidate.Coordinates) { if (coordinate == 0) { if (Globals.ShowMessages) { Console.WriteLine("--Eliminated. In Red Vertices List (one of the coordinates is 0)."); } invalidVertexFlag = true; break; } } //check if currentCandidate is in list of vertices foreach (Point2 thisVertex in Vertices) { if (candidate.Equals(thisVertex)) { if (Globals.ShowMessages) { Console.WriteLine("--Eliminated. In Vertices List."); } invalidVertexFlag = true; break; } } //check if currentCandidate is in list of non-vertices foreach (Point2 thisNonVertex in NonVertices) { if (candidate.Equals(thisNonVertex)) { if (Globals.ShowMessages) { Console.WriteLine("--Eliminated. In Non Vertices List."); } invalidVertexFlag = true; break; } } foreach (Point2 thisFinalCandidate in FinalCandidateVertexList) { if (candidate.Equals(thisFinalCandidate)) { if (Globals.ShowMessages) { Console.WriteLine("--Eliminated. In Final Candidate List."); } invalidVertexFlag = true; break; } } if (invalidVertexFlag) { return; } //Check if currentCandidate is in one of the cones if (InsideConeCheck(candidate)) { Console.WriteLine("{0} is inside a cone.", candidate); return; } //Check decomposition heuristic if (DoubleDecompositionHeuristic(candidate, allEdges)) { Console.WriteLine("{0} has at least two decompositions.", candidate); return; } Console.WriteLine("Adding {0} to Final Canddiate Vertex List.", candidate); }
/// <summary> /// Main method that gets called for determining ad. /// </summary> public void run() { init(Globals.d); var allEdges = Initialization.initializeEdges(); var candidateVertexQueue = new Queue <Point2>(); var invalidVertexFlag = false; //flag to determine if one of the tests fail (i.e. candidate vertex cannot be a vertex). var st = DateTime.Now; // datetime variable to track running time. var timeCheck = true; // bool to display running time for each check. Point2 currentCandidate; foreach (Point2 candidateVertex in CandidateVertices) { candidateVertexQueue.Enqueue(candidateVertex); } //go through a number of checks to see if candidate vertex is still valid. while (candidateVertexQueue.Count != 0) { currentCandidate = candidateVertexQueue.Dequeue(); foreach (Point2 possibleEdge in allEdges) { //add possibleEdge to currentCandidate Point2 thisCandidate = Point2.AddPoints(currentCandidate, possibleEdge); invalidVertexFlag = false; //reset vertex flag if (thisCandidate == null) { if (Globals.ShowMessages) { Console.WriteLine("ERROR: thisCandidate is null. Check possibleEdge being added to currentCandidate."); } invalidVertexFlag = true; continue; } thisCandidate.SortLexicographically(); //sort coordinates of points to account for symmetry //Testing output Console.WriteLine("Now checking: {0}. # of elements in queue: {1}", thisCandidate, candidateVertexQueue.Count); st = DateTime.Now; //check to see if currentCandidate is in RedVertices List foreach (Point2 thisRedVertex in RedVertices) { if (thisCandidate.Equals(thisRedVertex)) { if (Globals.ShowMessages) { Console.WriteLine("{0} is a red vertex.", thisCandidate); } invalidVertexFlag = true; break; } } if (timeCheck) { Console.WriteLine("Checking Red Vertices: {0}ms.", st - DateTime.Now); } st = DateTime.Now; if (invalidVertexFlag) { continue; } //check if sum of coordinates is > d*2^(d-2) if (thisCandidate.SumOfCoordinates() > (Globals.d * Math.Pow(2, (Globals.d - 2)))) { if (Globals.ShowMessages) { Console.WriteLine("{0}. Sum of coordinates exceeds d*2^(d-2).", thisCandidate); } NonVertices.Add(thisCandidate); continue; } if (timeCheck) { Console.WriteLine("Checking Sum of Coords > d*2^(d-2): {0}ms.", st - DateTime.Now); } st = DateTime.Now; foreach (int coordinate in thisCandidate.Coordinates) { if (coordinate == 0) { if (Globals.ShowMessages) { Console.WriteLine("--Eliminated. In Red Vertices List (one of the coordinates is 0)."); } invalidVertexFlag = true; break; } } if (timeCheck) { Console.WriteLine("Checking Each Coord for 0: {0}ms.", st - DateTime.Now); } st = DateTime.Now; if (invalidVertexFlag) { continue; } //check if currentCandidate is in list of vertices foreach (Point2 thisVertex in Vertices) { if (thisCandidate.Equals(thisVertex)) { if (Globals.ShowMessages) { Console.WriteLine("--Eliminated. In Vertices List."); } invalidVertexFlag = true; break; } } if (timeCheck) { Console.WriteLine("In Vertex List Check: {0}ms.", st - DateTime.Now); } st = DateTime.Now; if (invalidVertexFlag) { continue; } //check if currentCandidate is in list of non-vertices foreach (Point2 thisNonVertex in NonVertices) { if (thisCandidate.Equals(thisNonVertex)) { if (Globals.ShowMessages) { Console.WriteLine("--Eliminated. In Non Vertices List."); } invalidVertexFlag = true; break; } } if (timeCheck) { Console.WriteLine("In Nonvertex List Check: {0}ms.", st - DateTime.Now); } st = DateTime.Now; if (invalidVertexFlag) { continue; } //check if currentCandidate is in list of FinalCandidate (e.g. already checked before). foreach (Point2 thisFinalCandidate in FinalCandidateVertexList) { if (thisCandidate.Equals(thisFinalCandidate)) { if (Globals.ShowMessages) { Console.WriteLine("--Eliminated. In Final Candidate List."); } invalidVertexFlag = true; break; } } if (timeCheck) { Console.WriteLine("In Final Candidate List Check: {0}ms.", st - DateTime.Now); } st = DateTime.Now; if (invalidVertexFlag) { continue; } //Check if currentCandidate is in one of the cones if (InsideConeCheck(thisCandidate)) { if (Globals.ShowMessages) { Console.WriteLine("{0} is inside a cone.", thisCandidate); } NonVertices.Add(thisCandidate); continue; } if (timeCheck) { Console.WriteLine("Inside Cone CHeck: {0}ms.", st - DateTime.Now); } st = DateTime.Now; //Epsilon Check -- check eps{ij}=1 while eps{i}=eps{j}=0 and eps{ij}=0 while eps{i}=eps{j}=1 if (EpsilonCheck(thisCandidate)) { if (Globals.ShowMessages) { Console.WriteLine("{0} failed the epsilon check.", thisCandidate); } } if (timeCheck) { Console.WriteLine("Epsilon Check: {0}ms.", st - DateTime.Now); } st = DateTime.Now; //Double decomposition heuristic if (DoubleDecompositionHeuristic(thisCandidate, allEdges)) { if (Globals.ShowMessages) { Console.WriteLine("{0} has at least two decompositions.", thisCandidate); } NonVertices.Add(thisCandidate); if (timeCheck) { Console.WriteLine("DDHeuristic: {0}ms.", st - DateTime.Now); } st = DateTime.Now; continue; } if (timeCheck) { Console.WriteLine("DDHeuristic: {0}ms.", st - DateTime.Now); } if (Globals.ShowMessages) { Console.WriteLine("Adding {0} to Final Candidate Vertex List.", thisCandidate); } FinalCandidateVertexList.Add(thisCandidate); candidateVertexQueue.Enqueue(thisCandidate); } } CandidateVertexPostProcessing(FinalCandidateVertexList); Console.WriteLine("\n\nRed Vertices:"); foreach (Point2 p in RedVertices) { Console.WriteLine(p); } Console.WriteLine("\n\nFinal Candidate Vertex List: "); foreach (Point2 p in FinalCandidateVertexList) { Console.WriteLine(p); } }