コード例 #1
0
ファイル: Run.cs プロジェクト: whoaitsjoe/Research
        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);
        }
コード例 #2
0
ファイル: Run.cs プロジェクト: whoaitsjoe/Research
        /// <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);
            }
        }