Esempio n. 1
0
        private static int ComputeSpindleCount(List <int> X, int diamondCount, BitGraph_long HU, BitGraph_long HDL, BitGraph_long HDR, List <List <int> > DU, List <List <int> > DDL, List <List <int> > DDR)
        {
            var lostSpindlesU  = ComputeLostSpindles(X, HU, DU);
            var lostSpindlesDL = ComputeLostSpindles(X, HDL, DDL);
            var lostSpindlesDR = ComputeLostSpindles(X, HDR, DDR);

            return(diamondCount - lostSpindlesU - lostSpindlesDL - lostSpindlesDR);
        }
Esempio n. 2
0
        public static int ComputeLostSpindles(List <int> independentSet, BitGraph_long H, List <List <int> > directionDiamonds)
        {
            var all   = (1L << H.N) - 1;
            var bases = directionDiamonds.IndicesWhere(d => independentSet.Contains(d[0])).ToInt64();
            var tops  = directionDiamonds.IndicesWhere(d => independentSet.Contains(d[1])).ToInt64();

            var red       = all ^ tops;
            var blueGreen = all ^ bases;

            var tuples = H.MaximalIndependentSubsets(red).Select(R =>
            {
                var leftover = blueGreen & ~R;
                return(new Tuple <long, long, int, int>(R, leftover, BitUsage_long.PopulationCount(R), BitUsage_long.PopulationCount(leftover)));
            }).OrderByDescending(t => t.Item3 + t.Item4).ToList();


            var best = 0;
            var loss = 0;

            while (true)
            {
                var done = true;
                foreach (var tuple in tuples)
                {
                    if (tuple.Item3 + tuple.Item4 - loss <= best)
                    {
                        break;
                    }

                    done = false;

                    var set  = tuple.Item2;
                    var nset = ~set;
                    var k    = tuple.Item4 - loss;

                    long subset;

                    if (loss == 0)
                    {
                        subset = set;
                    }
                    else
                    {
                        subset = 0L;
                        var q = set;
                        for (int j = 0; j < k; j++)
                        {
                            var bit = q & -q;
                            subset |= bit;
                            q      ^= bit;
                        }
                    }

                    while (true)
                    {
                        if (GraphChoosability_long.IsSubsetTwoColorable(H, subset))
                        {
                            best = tuple.Item3 + tuple.Item4 - loss;
                            break;
                        }

                        var u = subset & -subset;
                        var v = ((subset | nset) + u) & set;
                        if (v == 0)
                        {
                            break;
                        }
                        var y = v ^ subset;
                        var t = BitUsage_long.PopulationCount(y) - 2;

                        subset = 0L;
                        var q = set;
                        for (int j = 0; j < t; j++)
                        {
                            var bit = q & -q;
                            subset |= bit;
                            q      ^= bit;
                        }

                        subset |= v;
                    }
                }

                if (done)
                {
                    break;
                }

                loss++;
            }

            return(H.N - best);
        }
Esempio n. 3
0
        static string GeneratePrettyConstraint(List <int> X, List <string> w, int diamondCount, BitGraph_long HU, BitGraph_long HDL, BitGraph_long HDR, List <List <int> > DU, List <List <int> > DDL, List <List <int> > DDR)
        {
            var spindleCount = ComputeSpindleCount(X, diamondCount, HU, HDL, HDR, DU, DDL, DDR);

            return(string.Join(" + ", X.GroupBy(v => w[v]).OrderBy(x => x.Key).Select(x => (x.Count() > 1 ? x.Count().ToString() : "") + x.Key)) + " + " + spindleCount + "s <= 1");
        }
Esempio n. 4
0
        public static void Go()
        {
            File.Delete(WinnersFile);

            if (Colors == 5)
            {
                Winners.Add(Diamond);
            }

            var tokenSource = new CancellationTokenSource();
            var token       = tokenSource.Token;

            for (int N = MinVertices; N <= MaxVertices; N++)
            {
                System.Console.ForegroundColor = ConsoleColor.DarkCyan;
                System.Console.WriteLine("Checking " + N + " vertex graphs...");
                System.Console.ForegroundColor = ConsoleColor.White;

                for (var R = MinRingSize; R <= MaxRingSize; R++)
                {
                    System.Console.ForegroundColor = ConsoleColor.DarkGray;
                    System.Console.WriteLine("Checking ring size " + R + "...");
                    System.Console.ForegroundColor = ConsoleColor.White;

                    var path = string.Format(@"C:\Users\landon\Google Drive\research\Graph6\triangulation\disk\triangulation{0}_{1}.g6.tri.weighted.txt", N, R);
                    if (!File.Exists(path))
                    {
                        continue;
                    }

                    foreach (var h in path.EnumerateWeightedGraphs())
                    {
                        foreach (var g in EnumerateWeightings(h))
                        {
                            if (AT)
                            {
                                var result = g.HasFOrientation(v => g.Degree(v) - g.VertexWeight[v] - (5 - Colors));
                                if (result != null)
                                {
                                    result.Graph.VertexWeight = g.VertexWeight;
                                    var hh = result.Graph.EliminateSinks();

                                    if (hh.E > 0)
                                    {
                                        Winners.Add(hh);
                                        hh.AppendWeightStringToFile(WinnersFile);
                                        System.Console.ForegroundColor = ConsoleColor.Green;
                                        System.Console.WriteLine(string.Format("found {0} AT graph{1} so far", Winners.Count, Winners.Count > 1 ? "s" : ""));
                                        System.Console.ForegroundColor = ConsoleColor.White;
                                    }
                                }
                                else
                                {
                                }
                            }
                            else if (Offline)
                            {
                                List <List <int> > badAssignment;
                                var bg = new BitGraph_long(g.GetEdgeWeights());

                                if (bg.IsFChoosable(v => bg.Degree(v) - g.VertexWeight[v] - (5 - Colors), out badAssignment))
                                {
                                    Winners.Add(g);
                                    g.AppendWeightStringToFile(WinnersFile);
                                    System.Console.ForegroundColor = ConsoleColor.Green;
                                    System.Console.WriteLine(string.Format("found {0} choosable graph{1} so far", Winners.Count, Winners.Count > 1 ? "s" : ""));
                                    System.Console.ForegroundColor = ConsoleColor.White;
                                }
                            }
                            else
                            {
                                if (g.IsOnlineFChoosable(v => g.Degree(v) - g.VertexWeight[v] - (5 - Colors), token))
                                {
                                    Winners.Add(g);
                                    g.AppendWeightStringToFile(WinnersFile);
                                    System.Console.ForegroundColor = ConsoleColor.Green;
                                    System.Console.WriteLine(string.Format("found {0} paintable graph{1} so far", Winners.Count, Winners.Count > 1 ? "s" : ""));
                                    System.Console.ForegroundColor = ConsoleColor.White;
                                }
                            }
                        }
                    }
                }
            }
        }
Esempio n. 5
0
        public static void Go()
        {
            using (var graphIO = new GraphEnumerator(WinnersFile, MinVertices, MaxVertices))
            {
                graphIO.FileRoot = @"C:\Users\landon\Google Drive\research\Graph6\graph";
                foreach (var g in graphIO.EnumerateGraph6File())
                {
                    if (MaxIndependenceNumber < int.MaxValue)
                    {
                        if (g.EnumerateMaximalIndependentSets().Any(mis => mis.Count > MaxIndependenceNumber))
                        {
                            continue;
                        }
                    }

                    if (MaxDegree < int.MaxValue && g.MaxDegree > MaxDegree)
                    {
                        continue;
                    }

                    if (AT)
                    {
                        System.Console.Write("checking " + g.ToGraph6() + "...");
                        if (!g.IsOnlineFGChoosable(v => g.Degree(v) - 1, v => 1))
                        {
                            System.Console.WriteLine(" not paintable");
                        }
                        else
                        {
                            var result = HasFOrientation(g, v => g.Degree(v) - 1, true);
                            if (result != null)
                            {
                                graphIO.AddWinner(g, result.Graph);
                                System.Console.WriteLine(string.Format(" is d_1-AT"));
                            }
                            else
                            {
                                System.Console.WriteLine(" not AT");
                            }
                        }
                    }
                    else if (Offline)
                    {
                        if (g.EnumerateMaximalIndependentSets().Any(I => I.Count > 2))
                        {
                            continue;
                        }
                        System.Console.Write("checking " + g.ToGraph6() + "...");

                        List <List <int> > badAssignment;
                        var bg = new BitGraph_long(g.GetEdgeWeights());

                        System.Console.Write("checking " + g.ToGraph6() + "...");
                        if (bg.IsFChoosable(v => bg.Degree(v) - 1, out badAssignment))
                        {
                            graphIO.AddWinner(g);
                            System.Console.WriteLine(string.Format(" is {0}-fold d_1-choosable", Fold));
                        }
                        else
                        {
                            System.Console.WriteLine(" not choosable");
                        }
                    }
                    else
                    {
                        if (!DiamondFreeOnly || !g.ContainsInduced(Choosability.Graphs.Diamond))
                        {
                            System.Console.Write("checking " + g.ToGraph6() + "...");
                            if (g.IsOnlineFGChoosable(v => Fold * g.Degree(v) - 1, v => Fold))
                            {
                                graphIO.AddWinner(g);
                                System.Console.WriteLine(string.Format(" is {0}-fold d_1-paintable", Fold));
                            }
                            else
                            {
                                System.Console.WriteLine(" not paintable");
                            }
                        }
                        else
                        {
                            System.Console.WriteLine("skipping due to diamond " + g.ToGraph6());
                        }
                    }
                }
            }
        }
Esempio n. 6
0
        public static void Go()
        {
            using (var graphEnumerator = new GraphEnumerator(WinnersFile, MinVertices, MaxVertices, false))
            {
                graphEnumerator.FileRoot        = @"C:\Users\landon\Google Drive\research\Graph6\graph";
                graphEnumerator.WeightCondition = WeightCondition;
                graphEnumerator.OnlyExcludeBySpanningSubgraphs = false;
                foreach (var g in graphEnumerator.EnumerateGraph6File(Filter, EnumerateWeightings, induced: true))
                {
                    if (MaxIndependenceNumber < int.MaxValue)
                    {
                        if (g.EnumerateMaximalIndependentSets().Any(mis => mis.Count > MaxIndependenceNumber))
                        {
                            continue;
                        }
                    }

                    if (g.MaxDegree > MaxDegree)
                    {
                        continue;
                    }

                    if (g.MinDegree < MinDegree)
                    {
                        continue;
                    }

                    if (Mic)
                    {
                        System.Console.Write("checking " + g.ToGraph6() + " with weights [" + string.Join(",", g.VertexWeight) + "] ...");

                        var micScore = g.Vertices.Sum(v => g.VertexWeight[v] + 1);

                        if (g.Mic() >= micScore)
                        {
                            graphEnumerator.AddWinner(g);
                            System.Console.WriteLine(string.Format(" is f-KP"));
                        }
                        else
                        {
                            System.Console.WriteLine(" not f-mic'able");
                        }
                    }
                    else if (AT)
                    {
                        System.Console.Write("checking " + g.ToGraph6() + " with weights [" + string.Join(",", g.VertexWeight) + "] ...");
                        if (!Not)
                        {
                            if (!g.IsOnlineFGChoosable(v => g.Degree(v) - g.VertexWeight[v], v => 1))
                            {
                                System.Console.WriteLine(" not paintable");
                            }
                            else
                            {
                                var result = HasFOrientation(g, v => g.Degree(v) - g.VertexWeight[v], true);

                                if (result != null)
                                {
                                    if (OddAT)
                                    {
                                        if (Math.Abs(result.Even - result.Odd) % 2 == 1)
                                        {
                                            graphEnumerator.AddWinner(g, result.Graph);
                                            System.Console.WriteLine(string.Format(" is odd f-AT"));
                                        }
                                        else
                                        {
                                            System.Console.WriteLine(string.Format(" not odd f-AT"));
                                        }
                                    }
                                    else
                                    {
                                        graphEnumerator.AddWinner(g, result.Graph);
                                        System.Console.WriteLine(string.Format(" is f-AT"));
                                    }
                                }
                                else
                                {
                                    System.Console.WriteLine(" not AT");
                                }
                            }
                        }
                        else
                        {
                            var good   = !g.IsOnlineFGChoosable(v => g.Degree(v) - g.VertexWeight[v], v => 1);
                            var result = HasFOrientation(g, v => g.Degree(v) - g.VertexWeight[v], true);
                            good |= result == null || OddAT && Math.Abs(result.Even - result.Odd) % 2 == 0;
                            if (good)
                            {
                                graphEnumerator.AddWinner(g);
                                System.Console.WriteLine(string.Format(" not f-AT"));
                            }
                            else
                            {
                                System.Console.WriteLine(" is AT");
                            }
                        }
                    }
                    else if (Offline)
                    {
                        List <List <int> > badAssignment;
                        var bg = new BitGraph_long(g.GetEdgeWeights());

                        System.Console.Write("checking " + " with weights [" + string.Join(",", g.VertexWeight) + "] ...");
                        if (bg.IsFChoosable(v => bg.Degree(v) - g.VertexWeight[v], out badAssignment))
                        {
                            graphEnumerator.AddWinner(g);
                            System.Console.WriteLine(string.Format(" is {0}-fold f-choosable", Fold));
                        }
                        else
                        {
                            System.Console.WriteLine(" not choosable");
                        }
                    }
                    else
                    {
                        System.Console.Write("checking " + " with weights [" + string.Join(",", g.VertexWeight) + "] ...");
                        if (!Not)
                        {
                            if (g.IsOnlineFGChoosable(v => Fold * g.Degree(v) - g.VertexWeight[v], v => Fold))
                            {
                                graphEnumerator.AddWinner(g);
                                System.Console.WriteLine(string.Format(" is {0}-fold f-paintable", Fold));
                            }
                            else
                            {
                                System.Console.WriteLine(" not paintable");
                            }
                        }
                        else
                        {
                            if (!g.IsOnlineFGChoosable(v => Fold * g.Degree(v) - g.VertexWeight[v], v => Fold))
                            {
                                graphEnumerator.AddWinner(g);
                                System.Console.WriteLine(string.Format(" is not {0}-fold f-paintable", Fold));
                            }
                            else
                            {
                                System.Console.WriteLine(" paintable");
                            }
                        }
                    }
                }
            }

            if (Not)
            {
                EliminateDoubleEdgeNotSubdivisions.Go(WinnersFile, AT);
            }
            else
            {
                EliminiteDoubleEdgeSubdivisions.Go(WinnersFile);
            }
        }