private void checkAllCrossings(
            List<S2Edge> allEdges, int minCrossings, int maxChecksCrossingsRatio)
        {
            var index = new EdgeVectorIndex(allEdges);
            index.ComputeIndex();
             var it = new S2EdgeIndex.DataEdgeIterator(index);
            double totalCrossings = 0;
            double totalIndexChecks = 0;

            for (var @in = 0; @in < allEdges.Count; ++@in)
            {
                var e = allEdges[@in];

                var candidateSet = new HashSet<int>();

                var sb = new StringBuilder();
                it.GetCandidates(e.Start, e.End); 
                foreach (var i in it)// it.GetCandidates(e.Start, e.End); it.HasNext; it.Next())
                {
                    candidateSet.Add(i);
                    sb.Append(i).Append("/");
                    ++totalIndexChecks;
                }

                for (var i = 0; i < allEdges.Count; ++i)
                {
                    var crossing = S2EdgeUtil.RobustCrossing(
                        e.Start, e.End, allEdges[i].Start, allEdges[i].End);
                    if (crossing >= 0)
                    {
                        var sbError = new StringBuilder();
                        sbError
                            .Append("\n==CHECK_ERROR===================================\n")
                            .Append("CandidateSet: ")
                            .Append(sb)
                            .Append("\nin=")
                            .Append(@in)
                            .Append(" i=")
                            .Append(i)
                            .Append(" robustCrossing=")
                            .Append(crossing)
                            .Append("\nfrom:\n")
                            .Append(e)
                            .Append("\nto:\n")
                            .Append(allEdges[i])
                            .Append("\n==================================================");
                        assertTrue(sbError.ToString(), candidateSet.Contains(i));
                        ++totalCrossings;
                    }
                }
            }

            Console.WriteLine(
                "Pairs/num crossings/check crossing ratio: "
                + (allEdges.Count*allEdges.Count) + "/"
                + totalCrossings + "/"
                + (totalIndexChecks/totalCrossings));
            assertTrue(minCrossings <= totalCrossings);
            assertTrue(totalCrossings*maxChecksCrossingsRatio >= totalIndexChecks);
        }
        private void checkAllCrossings(
            List <S2Edge> allEdges, int minCrossings, int maxChecksCrossingsRatio)
        {
            var index = new EdgeVectorIndex(allEdges);

            index.ComputeIndex();
            var    it               = new S2EdgeIndex.DataEdgeIterator(index);
            double totalCrossings   = 0;
            double totalIndexChecks = 0;

            for (var @in = 0; @in < allEdges.Count; ++@in)
            {
                var e = allEdges[@in];

                var candidateSet = new HashSet <int>();

                var sb = new StringBuilder();
                it.GetCandidates(e.Start, e.End);
                foreach (var i in it)// it.GetCandidates(e.Start, e.End); it.HasNext; it.Next())
                {
                    candidateSet.Add(i);
                    sb.Append(i).Append("/");
                    ++totalIndexChecks;
                }

                for (var i = 0; i < allEdges.Count; ++i)
                {
                    var crossing = S2EdgeUtil.RobustCrossing(
                        e.Start, e.End, allEdges[i].Start, allEdges[i].End);
                    if (crossing >= 0)
                    {
                        var sbError = new StringBuilder();
                        sbError
                        .Append("\n==CHECK_ERROR===================================\n")
                        .Append("CandidateSet: ")
                        .Append(sb)
                        .Append("\nin=")
                        .Append(@in)
                        .Append(" i=")
                        .Append(i)
                        .Append(" robustCrossing=")
                        .Append(crossing)
                        .Append("\nfrom:\n")
                        .Append(e)
                        .Append("\nto:\n")
                        .Append(allEdges[i])
                        .Append("\n==================================================");
                        assertTrue(sbError.ToString(), candidateSet.Contains(i));
                        ++totalCrossings;
                    }
                }
            }

            Console.WriteLine(
                "Pairs/num crossings/check crossing ratio: "
                + (allEdges.Count * allEdges.Count) + "/"
                + totalCrossings + "/"
                + (totalIndexChecks / totalCrossings));
            assertTrue(minCrossings <= totalCrossings);
            assertTrue(totalCrossings * maxChecksCrossingsRatio >= totalIndexChecks);
        }