public static void Go() { File.Delete(WinnersFile); var allColors = Enumerable.Range(0, C).To_long(); var w = 0; var assignmentLookup = LoadLookup(); for (var R = MinRingSize; R <= 9; R++) { System.Console.WriteLine("generating assignments for ring size " + R + "..."); var partitionFile = @"C:\Users\landon\Google Drive\research\Graph6\noncrossing\non_crossing" + R + ".txt"; var possibleAssociations = NonCrossing.Load(partitionFile); var contractionsPile = possibleAssociations.Select(ll => ll.Where(l => l.Count >= 2).Select(l => l.ToUInt64()).ToList()).Where(ll => ll.Count > 1).ToList(); foreach (var contraction in contractionsPile) { var key = new Key(R, contraction); List <List <long> > assignments; if (!assignmentLookup.TryGetValue(key, out assignments)) { assignments = RingAssignmentGenerator.GenerateAssignments(R, C, Fold, contraction); assignmentLookup[key] = assignments; } } } SaveLookup(assignmentLookup); 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; } var partitionFile = @"C:\Users\landon\Google Drive\research\Graph6\noncrossing\non_crossing" + R + ".txt"; var possibleAssociations = NonCrossing.Load(partitionFile); var contractionsPile = possibleAssociations.Select(ll => ll.Where(l => l.Count >= 2).Select(l => l.ToUInt64()).ToList()).Where(ll => ll.Count > 1).ToList(); var lookupCount = assignmentLookup.Count; foreach (var g in path.EnumerateWeightedGraphs()) { var ring = g.Vertices.Where(v => g.VertexWeight[v] == 99).ToList(); var inside = g.Vertices.Except(ring).ToList(); var cyclicRingOrdering = GetCyclicOrdering(g, ring); var allGood = false; foreach (var contraction in contractionsPile) { var key = new Key(R, contraction); List <List <long> > assignments; if (!assignmentLookup.TryGetValue(key, out assignments)) { assignments = RingAssignmentGenerator.GenerateAssignments(R, C, Fold, contraction); assignmentLookup[key] = assignments; //if (assignmentLookup.Count - lookupCount > 50) // SaveLookup(assignmentLookup); } var good = true; foreach (var stacks in assignments) { var insideAssignment = Enumerable.Repeat <long>(0, g.N).ToList(); foreach (var v in inside) { var neighborColors = g.Neighbors[v].Intersect(ring).Aggregate(0L, (tot, z) => tot | stacks[cyclicRingOrdering.IndexOf(z)]); insideAssignment[v] = allColors & ~neighborColors; } if (!g.IsFoldChoosable(insideAssignment, inside, Fold)) { good = false; break; } } if (good) { allGood = true; break; } } if (allGood) { var gh = g.Clone(); gh.VertexWeight = g.VertexWeight.Select(ww => ww == 99 ? 0 : ww).ToList(); gh.AppendWeightStringToFile(WinnersFile); w++; System.Console.ForegroundColor = ConsoleColor.Green; System.Console.WriteLine(string.Format("found {0} reducible graph{1} so far", w, w > 1 ? "s" : "")); System.Console.ForegroundColor = ConsoleColor.White; } } if (lookupCount < assignmentLookup.Count) { SaveLookup(assignmentLookup); } } } }
public static void Go() { var RNG = new Random(DateTime.Now.Millisecond); File.Delete(WinnersFile); var allColors = Enumerable.Range(0, C).To_long(); var w = 0; var assignmentLookup = FindFractionalColorable.LoadLookup(); System.Console.Write("Loading graphs..."); var graphs = Enumerable.Range(MinVertices, MaxVertices - MinVertices + 1).CartesianProduct(Enumerable.Range(MinRingSize, MaxRingSize - MinRingSize + 1)).SelectMany(tup => { var N = tup.Item1; var R = tup.Item2; 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)) { return new Graph[] { } } ; return(path.EnumerateWeightedGraphs().Where(gg => InsideLowerLimit <= gg.Vertices.Count(v => gg.VertexWeight[v] != 99) && gg.Vertices.Count(v => gg.VertexWeight[v] != 99) <= InsideUpperLimit)); }).Reverse().ToList(); System.Console.WriteLine(" found " + graphs.Count); System.Console.Write("Loading contractions..."); var totalContractions = 0; var contractionsLookup = new Dictionary <int, List <List <ulong> > >(); for (var R = MinRingSize; R <= MaxRingSize; R++) { var minHave = GetMinContractionSize(R); var partitionFile = @"C:\Users\landon\Google Drive\research\Graph6\noncrossing\non_crossing" + R + ".txt"; if (File.Exists(partitionFile)) { var vv = NonCrossing.Load(partitionFile).ToList(); var possibleAssociations = NonCrossing.Load(partitionFile).Where(ll => ll.Any(l => l.Count >= minHave)).ToList(); totalContractions += possibleAssociations.Count(); contractionsLookup[R] = possibleAssociations.Select(ll => ll.Where(l => l.Count >= 2).Select(l => l.ToUInt64()).ToList()).Where(ll => ll.Count >= 1).ToList(); } } System.Console.WriteLine(" found " + totalContractions); while (graphs.Count > 0) { System.Console.Write("selecting contractions... "); var count = graphs.Count; var lookupCount = assignmentLookup.Count; var randomContractionAssignments = new Dictionary <int, List <List <long> > >(); for (var R = MinRingSize; R <= MaxRingSize; R++) { List <List <ulong> > contractions; if (contractionsLookup.TryGetValue(R, out contractions)) { if (contractions.Count <= 0) { continue; } var q = RNG.Next(contractions.Count); var contraction = contractions[q]; contractions.RemoveAt(q); var key = new FindFractionalColorable.Key(R, contraction); List <List <long> > assignments; if (!assignmentLookup.TryGetValue(key, out assignments)) { assignments = RingAssignmentGenerator.GenerateAssignments(R, C, Fold, contraction); if (!FindFractionalColorable.SkipLookup) { assignmentLookup[key] = assignments; } } randomContractionAssignments[R] = assignments; } System.Console.Write(R + ","); } if (randomContractionAssignments.Count <= 0) { break; } if (assignmentLookup.Count > lookupCount) { FindFractionalColorable.SaveLookup(assignmentLookup); } System.Console.WriteLine(); System.Console.Write("checking reducibility..."); for (int i = graphs.Count - 1; i >= 0; i--) { var g = graphs[i]; var ring = g.Vertices.Where(v => g.VertexWeight[v] == 99).ToList(); if (!randomContractionAssignments.ContainsKey(ring.Count)) { continue; } var inside = g.Vertices.Except(ring).ToList(); var cyclicRingOrdering = FindFractionalColorable.GetCyclicOrdering(g, ring); var assignments = randomContractionAssignments[ring.Count]; var good = true; foreach (var stacks in assignments) { var insideAssignment = Enumerable.Repeat <long>(0, g.N).ToList(); foreach (var v in inside) { var neighborColors = g.Neighbors[v].Intersect(ring).Aggregate(0L, (tot, z) => tot | stacks[cyclicRingOrdering.IndexOf(z)]); insideAssignment[v] = allColors & ~neighborColors; } if (!g.IsFoldChoosable(insideAssignment, inside, Fold)) { good = false; break; } } if (good) { var gh = g.Clone(); gh.VertexWeight = g.VertexWeight.Select(ww => ww == 99 ? 0 : ww).ToList(); gh.AppendWeightStringToFile(WinnersFile); w++; graphs.RemoveAt(i); } } var reduced = count - graphs.Count; System.Console.WriteLine(" found " + reduced); } }