Free cookie consent management tool by TermsFeed Policy Generator

source: branches/2521_ProblemRefactoring/HeuristicLab.Problems.GraphColoring/3.3/GraphColoringProblem.cs @ 17745

Last change on this file since 17745 was 17745, checked in by mkommend, 4 years ago

#2971: Added first draft of results implementation and problem adaptation.

File size: 30.8 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using System.Linq;
24using System.Threading;
25using HEAL.Attic;
26using HeuristicLab.Analysis;
27using HeuristicLab.Common;
28using HeuristicLab.Core;
29using HeuristicLab.Data;
30using HeuristicLab.Encodings.LinearLinkageEncoding;
31using HeuristicLab.Optimization;
32using HeuristicLab.Optimization.Operators;
33using HeuristicLab.Parameters;
34using HeuristicLab.Problems.Instances;
35
36namespace HeuristicLab.Problems.GraphColoring {
37  [StorableType("88078013-834F-40AC-9298-B8E1C4B393D3")]
38  public enum FitnessFunction { Prioritized, Penalized }
39  [Item("Graph Coloring Problem (GCP)", "Attempts to find a coloring using a minimal number of colors that doesn't produce a conflict.")]
40  [Creatable(CreatableAttribute.Categories.CombinatorialProblems, Priority = 135)]
41  [StorableType("007BD5F0-196C-4045-AC5D-BF287927C3DC")]
42  public sealed class GraphColoringProblem : LinearLinkageProblem,
43    IProblemInstanceConsumer<GCPData>, IProblemInstanceExporter<GCPData> {
44
45    [Storable]
46    private IValueParameter<IntMatrix> adjacencyListParameter;
47    public IValueParameter<IntMatrix> AdjacencyListParameter {
48      get { return adjacencyListParameter; }
49    }
50    [Storable]
51    private IValueParameter<EnumValue<FitnessFunction>> fitnessFunctionParameter;
52    public IValueParameter<EnumValue<FitnessFunction>> FitnessFunctionParameter {
53      get { return fitnessFunctionParameter; }
54    }
55    public FitnessFunction FitnessFunction {
56      get { return fitnessFunctionParameter.Value.Value; }
57      set { fitnessFunctionParameter.Value.Value = value; }
58    }
59    [Storable]
60    private IValueParameter<IntValue> bestKnownColorsParameter;
61    public IValueParameter<IntValue> BestKnownColorsParameter {
62      get { return bestKnownColorsParameter; }
63    }
64
65    [StorableConstructor]
66    private GraphColoringProblem(StorableConstructorFlag _) : base(_) { }
67    private GraphColoringProblem(GraphColoringProblem original, Cloner cloner)
68      : base(original, cloner) {
69      adjacencyListParameter = cloner.Clone(original.adjacencyListParameter);
70      fitnessFunctionParameter = cloner.Clone(original.fitnessFunctionParameter);
71      bestKnownColorsParameter = cloner.Clone(original.bestKnownColorsParameter);
72      RegisterEventHandlers();
73    }
74    public GraphColoringProblem() {
75      Maximization = false;
76      Parameters.Add(adjacencyListParameter = new ValueParameter<IntMatrix>("Adjacency List", "The adjacency list that describes the (symmetric) edges in the graph with nodes from 0 to N-1.") { ReadOnly = true });
77      Parameters.Add(fitnessFunctionParameter = new ValueParameter<EnumValue<FitnessFunction>>("Fitness Function", "The function to use for evaluating the quality of a solution.", new EnumValue<FitnessFunction>(FitnessFunction.Penalized)));
78      Parameters.Add(bestKnownColorsParameter = new OptionalValueParameter<IntValue>("BestKnownColors", "The least amount of colors in a valid coloring.") { ReadOnly = true });
79
80      var imat = new IntMatrix(defaultInstance.Length, 2);
81      for (var i = 0; i < defaultInstance.Length; i++) {
82        imat[i, 0] = defaultInstance[i].Item1 - 1;
83        imat[i, 1] = defaultInstance[i].Item2 - 1;
84      }
85      Dimension = defaultInstanceNodes;
86      Encoding.LengthParameter.ReadOnly = DimensionRefParameter.ReadOnly = true;
87      AdjacencyListParameter.Value = imat;
88      BestKnownQualityParameter.Value = null;
89      BestKnownColorsParameter.Value = new IntValue(defaultInstanceBestColors);
90
91      InitializeOperators();
92      RegisterEventHandlers();
93    }
94
95    public override IDeepCloneable Clone(Cloner cloner) {
96      return new GraphColoringProblem(this, cloner);
97    }
98
99
100    [StorableHook(HookType.AfterDeserialization)]
101    private void AfterDeserialization() {
102      RegisterEventHandlers();
103    }
104
105    private void RegisterEventHandlers() {
106      fitnessFunctionParameter.ValueChanged += FitnessFunctionParameterOnValueChanged;
107      fitnessFunctionParameter.Value.ValueChanged += FitnessFunctionOnValueChanged;
108    }
109
110    private void FitnessFunctionParameterOnValueChanged(object sender, EventArgs eventArgs) {
111      fitnessFunctionParameter.Value.ValueChanged += FitnessFunctionOnValueChanged;
112      FitnessFunctionOnValueChanged(sender, eventArgs);
113    }
114
115    private void FitnessFunctionOnValueChanged(object sender, EventArgs eventArgs) {
116      BestKnownQualityParameter.Value = null;
117      if (FitnessFunction == FitnessFunction.Prioritized
118        && BestKnownColorsParameter.Value != null
119        && Dimension > 0) {
120        var mag = Math.Pow(10, -(int)Math.Ceiling(Math.Log10(Dimension)));
121        // the value is e.g. 0.051 for 0 conflicts with 51 colors (and less than 1000 nodes)
122        BestKnownQuality = BestKnownColorsParameter.Value.Value * mag;
123      } else BestKnownQualityParameter.Value = null;
124      OnReset();
125    }
126
127    public override ISingleObjectiveEvaluationResult Evaluate(LinearLinkage lle, IRandom random, CancellationToken cancellationToken) {
128      var adjList = adjacencyListParameter.Value;
129      var llee = lle.ToEndLinks(); // LLE-e encoding uses the highest indexed member as group number
130
131      double quality = double.NaN;
132
133      switch (FitnessFunction) {
134        case FitnessFunction.Prioritized: {
135            var colors = llee.Distinct().Count();
136            var conflicts = CalculateConflicts(llee);
137            // number of conflicts is the integer part of the quality
138            // number of colors constitutes the fractional part
139            // the number of fractional digits is defined by the maximum number of possible colors (each node its own color)
140            var mag = Math.Pow(10, -(int)Math.Ceiling(Math.Log10(llee.Length)));
141            // the value is e.g. 4.03 for 4 conflicts with 3 colors (and less than 100 nodes)
142            quality = conflicts + colors * mag;
143            break;
144          }
145        case FitnessFunction.Penalized: {
146            // Fitness function from
147            // David S. Johnson, Cecilia R. Aragon, Lyle A. McGeoch, and Catherine Schevon. 1991.
148            // Optimization by simulated annealing: An experimental evaluation; part II, graph coloring and number partitioning.
149            // Operations Research 39(3), pp. 378–406.
150            // All local optima of this function correspond to legal colorings.
151            // We need to calculate conflicts and nodes per color
152            var colors = llee.GroupBy(x => x).ToDictionary(x => x.Key, x => new EvaluationHelper() { ColorCount = x.Count() });
153            for (var r = 0; r < adjList.Rows; r++) {
154              var color1 = llee[adjList[r, 0]];
155              var color2 = llee[adjList[r, 1]];
156              if (color1 == color2) colors[color1].ConflictCount++;
157            }
158            quality = 2 * colors.Sum(x => x.Value.ColorCount * x.Value.ConflictCount) - colors.Sum(x => x.Value.ColorCount * x.Value.ColorCount);
159            break;
160          }
161        default: throw new InvalidOperationException(string.Format("Unknown fitness function {0}.", FitnessFunction));
162      }
163
164      return new SingleObjectiveEvaluationResult(quality);
165    }
166
167    private class EvaluationHelper {
168      public int ColorCount { get; set; }
169      public int ConflictCount { get; set; }
170    }
171
172    public override void Analyze(ISingleObjectiveSolutionContext<LinearLinkage>[] solutionContexts, IRandom random) {
173      base.Analyze(solutionContexts, random);
174
175      var lles = solutionContexts.Select(context => context.EncodedSolution).ToArray();
176
177      //TODO: reimplement code below using results directly
178
179      //var orderedIndividuals = lles.Zip(qualities, (i, q) => new { LLE = i, Quality = q }).OrderBy(z => z.Quality);
180      //var best = Maximization ? orderedIndividuals.Last().LLE : orderedIndividuals.First().LLE;
181
182      //var llee = best.ToEndLinks();
183      //var colors = llee.Distinct().Count();
184      //var conflicts = CalculateConflicts(llee);
185
186      //IResult res;
187      //int bestColors = int.MaxValue, bestConflicts = int.MaxValue;
188      //var improvement = false;
189      //if (!results.TryGetValue("Best Solution Conflicts", out res)) {
190      //  bestConflicts = conflicts;
191      //  res = new Result("Best Solution Conflicts", new IntValue(bestConflicts));
192      //  results.Add(res);
193      //} else {
194      //  bestConflicts = ((IntValue)res.Value).Value;
195      //  improvement = conflicts < bestConflicts;
196      //  if (improvement) ((IntValue)res.Value).Value = bestConflicts = conflicts;
197      //}
198      //if (!results.TryGetValue("Best Solution Colors", out res)) {
199      //  bestColors = colors;
200      //  res = new Result("Best Solution Colors", new IntValue(bestColors));
201      //  results.Add(res);
202      //} else {
203      //  bestColors = ((IntValue)res.Value).Value;
204      //  improvement = improvement || conflicts == bestConflicts && colors < bestColors;
205      //  if (improvement)
206      //    ((IntValue)res.Value).Value = bestColors = colors;
207      //}
208      //if (!results.ContainsKey("Best Encoded Solution") || improvement)
209      //  results.AddOrUpdateResult("Best Encoded Solution", (LinearLinkage)best.Clone());
210
211      //if (!results.TryGetValue("Best Solution", out res) || !(res.Value is IntMatrix)) {
212      //  var matrix = new IntMatrix(llee.Length, 2) { ColumnNames = new[] { "Node", "Color" } };
213      //  UpdateMatrix(llee, matrix);
214      //  res = new Result("Best Solution", matrix);
215      //  results.AddOrUpdateResult("Best Solution", matrix);
216      //} else {
217      //  if (improvement) {
218      //    UpdateMatrix(llee, (IntMatrix)res.Value);
219      //  }
220      //}
221
222      //if (conflicts == 0) {
223      //  if (BestKnownColorsParameter.Value == null || BestKnownColorsParameter.Value.Value > colors)
224      //    BestKnownColorsParameter.Value = new IntValue(colors);
225      //}
226    }
227
228    private static void UpdateMatrix(int[] llee, IntMatrix matrix) {
229      var assign = llee.Select((v, i) => new { Node = i, Color = v }).OrderBy(x => x.Color);
230      var color = 0;
231      var prev = -1;
232      foreach (var a in assign) {
233        if (prev >= 0 && prev != a.Color)
234          color++;
235        matrix[a.Node, 0] = a.Node;
236        matrix[a.Node, 1] = color;
237        prev = a.Color;
238      }
239    }
240
241    private int CalculateConflicts(int[] llee) {
242      var adjList = AdjacencyListParameter.Value;
243      var conflicts = 0;
244      for (var r = 0; r < adjList.Rows; r++) {
245        if (llee[adjList[r, 0]] == llee[adjList[r, 1]]) conflicts++; // both nodes are adjacent and have the same color (are in the same group)
246      }
247      return conflicts;
248    }
249
250    public void Load(GCPData data) {
251      Dimension = data.Nodes;
252      AdjacencyListParameter.Value = new IntMatrix(data.Adjacencies);
253      if (data.BestKnownColoring != null) {
254        var colors = data.BestKnownColoring.Distinct().Count();
255        BestKnownColorsParameter.Value = new IntValue(colors);
256        if (FitnessFunction == FitnessFunction.Prioritized) {
257          var mag = Math.Pow(10, -(int)Math.Ceiling(Math.Log10(data.Nodes)));
258          BestKnownQuality = colors * mag;
259        } else {
260          var nodesPerColor = data.BestKnownColoring.GroupBy(x => x).Select(x => x.Count());
261          BestKnownQuality = -nodesPerColor.Sum(x => x * x);
262        }
263      } else if (data.BestKnownColors.HasValue) {
264        BestKnownColorsParameter.Value = new IntValue(data.BestKnownColors.Value);
265        if (FitnessFunction == FitnessFunction.Prioritized) {
266          var mag = Math.Pow(10, -(int)Math.Ceiling(Math.Log10(data.Nodes)));
267          // the value is e.g. 0.051 for 0 conflicts with 51 colors (and less than 1000 nodes)
268          BestKnownQuality = data.BestKnownColors.Value * mag;
269        } else BestKnownQualityParameter.Value = null;
270      } else {
271        BestKnownColorsParameter.Value = null;
272        BestKnownQualityParameter.Value = null;
273      }
274      Name = data.Name;
275      Description = data.Description;
276      OnReset();
277    }
278
279    public GCPData Export() {
280      var instance = new GCPData();
281      instance.Name = Name;
282      instance.Description = Description;
283      instance.Nodes = Dimension;
284      var adjList = AdjacencyListParameter.Value;
285      instance.Adjacencies = new int[adjList.Rows, 2];
286      for (var r = 0; r < adjList.Rows; r++) {
287        instance.Adjacencies[r, 0] = adjList[r, 0];
288        instance.Adjacencies[r, 1] = adjList[r, 1];
289      }
290      if (BestKnownColorsParameter.Value != null)
291        instance.BestKnownColors = BestKnownColorsParameter.Value.Value;
292      return instance;
293    }
294
295    private void InitializeOperators() {
296      Operators.Add(new HammingSimilarityCalculator());
297      Operators.Add(new QualitySimilarityCalculator());
298      Operators.Add(new PopulationSimilarityAnalyzer(Operators.OfType<ISolutionSimilarityCalculator>()));
299
300      Parameterize();
301    }
302
303    private void Parameterize() {
304      foreach (var simCalc in Operators.OfType<ISolutionSimilarityCalculator>()) {
305        simCalc.SolutionVariableName = Encoding.Name;
306        simCalc.QualityVariableName = Evaluator.QualityParameter.ActualName;
307      }
308    }
309
310    #region Default Instance (myciel6.col)
311    private static readonly int defaultInstanceNodes = 95;
312    private static readonly int defaultInstanceBestColors = 7;
313    private static readonly Tuple<int, int>[] defaultInstance = {
314Tuple.Create(1, 2),
315Tuple.Create(1, 4),
316Tuple.Create(1, 7),
317Tuple.Create(1, 9),
318Tuple.Create(1, 13),
319Tuple.Create(1, 15),
320Tuple.Create(1, 18),
321Tuple.Create(1, 20),
322Tuple.Create(1, 25),
323Tuple.Create(1, 27),
324Tuple.Create(1, 30),
325Tuple.Create(1, 32),
326Tuple.Create(1, 36),
327Tuple.Create(1, 38),
328Tuple.Create(1, 41),
329Tuple.Create(1, 43),
330Tuple.Create(1, 49),
331Tuple.Create(1, 51),
332Tuple.Create(1, 54),
333Tuple.Create(1, 56),
334Tuple.Create(1, 60),
335Tuple.Create(1, 62),
336Tuple.Create(1, 65),
337Tuple.Create(1, 67),
338Tuple.Create(1, 72),
339Tuple.Create(1, 74),
340Tuple.Create(1, 77),
341Tuple.Create(1, 79),
342Tuple.Create(1, 83),
343Tuple.Create(1, 85),
344Tuple.Create(1, 88),
345Tuple.Create(1, 90),
346Tuple.Create(2, 3),
347Tuple.Create(2, 6),
348Tuple.Create(2, 8),
349Tuple.Create(2, 12),
350Tuple.Create(2, 14),
351Tuple.Create(2, 17),
352Tuple.Create(2, 19),
353Tuple.Create(2, 24),
354Tuple.Create(2, 26),
355Tuple.Create(2, 29),
356Tuple.Create(2, 31),
357Tuple.Create(2, 35),
358Tuple.Create(2, 37),
359Tuple.Create(2, 40),
360Tuple.Create(2, 42),
361Tuple.Create(2, 48),
362Tuple.Create(2, 50),
363Tuple.Create(2, 53),
364Tuple.Create(2, 55),
365Tuple.Create(2, 59),
366Tuple.Create(2, 61),
367Tuple.Create(2, 64),
368Tuple.Create(2, 66),
369Tuple.Create(2, 71),
370Tuple.Create(2, 73),
371Tuple.Create(2, 76),
372Tuple.Create(2, 78),
373Tuple.Create(2, 82),
374Tuple.Create(2, 84),
375Tuple.Create(2, 87),
376Tuple.Create(2, 89),
377Tuple.Create(3, 5),
378Tuple.Create(3, 7),
379Tuple.Create(3, 10),
380Tuple.Create(3, 13),
381Tuple.Create(3, 16),
382Tuple.Create(3, 18),
383Tuple.Create(3, 21),
384Tuple.Create(3, 25),
385Tuple.Create(3, 28),
386Tuple.Create(3, 30),
387Tuple.Create(3, 33),
388Tuple.Create(3, 36),
389Tuple.Create(3, 39),
390Tuple.Create(3, 41),
391Tuple.Create(3, 44),
392Tuple.Create(3, 49),
393Tuple.Create(3, 52),
394Tuple.Create(3, 54),
395Tuple.Create(3, 57),
396Tuple.Create(3, 60),
397Tuple.Create(3, 63),
398Tuple.Create(3, 65),
399Tuple.Create(3, 68),
400Tuple.Create(3, 72),
401Tuple.Create(3, 75),
402Tuple.Create(3, 77),
403Tuple.Create(3, 80),
404Tuple.Create(3, 83),
405Tuple.Create(3, 86),
406Tuple.Create(3, 88),
407Tuple.Create(3, 91),
408Tuple.Create(4, 5),
409Tuple.Create(4, 6),
410Tuple.Create(4, 10),
411Tuple.Create(4, 12),
412Tuple.Create(4, 16),
413Tuple.Create(4, 17),
414Tuple.Create(4, 21),
415Tuple.Create(4, 24),
416Tuple.Create(4, 28),
417Tuple.Create(4, 29),
418Tuple.Create(4, 33),
419Tuple.Create(4, 35),
420Tuple.Create(4, 39),
421Tuple.Create(4, 40),
422Tuple.Create(4, 44),
423Tuple.Create(4, 48),
424Tuple.Create(4, 52),
425Tuple.Create(4, 53),
426Tuple.Create(4, 57),
427Tuple.Create(4, 59),
428Tuple.Create(4, 63),
429Tuple.Create(4, 64),
430Tuple.Create(4, 68),
431Tuple.Create(4, 71),
432Tuple.Create(4, 75),
433Tuple.Create(4, 76),
434Tuple.Create(4, 80),
435Tuple.Create(4, 82),
436Tuple.Create(4, 86),
437Tuple.Create(4, 87),
438Tuple.Create(4, 91),
439Tuple.Create(5, 8),
440Tuple.Create(5, 9),
441Tuple.Create(5, 14),
442Tuple.Create(5, 15),
443Tuple.Create(5, 19),
444Tuple.Create(5, 20),
445Tuple.Create(5, 26),
446Tuple.Create(5, 27),
447Tuple.Create(5, 31),
448Tuple.Create(5, 32),
449Tuple.Create(5, 37),
450Tuple.Create(5, 38),
451Tuple.Create(5, 42),
452Tuple.Create(5, 43),
453Tuple.Create(5, 50),
454Tuple.Create(5, 51),
455Tuple.Create(5, 55),
456Tuple.Create(5, 56),
457Tuple.Create(5, 61),
458Tuple.Create(5, 62),
459Tuple.Create(5, 66),
460Tuple.Create(5, 67),
461Tuple.Create(5, 73),
462Tuple.Create(5, 74),
463Tuple.Create(5, 78),
464Tuple.Create(5, 79),
465Tuple.Create(5, 84),
466Tuple.Create(5, 85),
467Tuple.Create(5, 89),
468Tuple.Create(5, 90),
469Tuple.Create(6, 11),
470Tuple.Create(6, 13),
471Tuple.Create(6, 15),
472Tuple.Create(6, 22),
473Tuple.Create(6, 25),
474Tuple.Create(6, 27),
475Tuple.Create(6, 34),
476Tuple.Create(6, 36),
477Tuple.Create(6, 38),
478Tuple.Create(6, 45),
479Tuple.Create(6, 49),
480Tuple.Create(6, 51),
481Tuple.Create(6, 58),
482Tuple.Create(6, 60),
483Tuple.Create(6, 62),
484Tuple.Create(6, 69),
485Tuple.Create(6, 72),
486Tuple.Create(6, 74),
487Tuple.Create(6, 81),
488Tuple.Create(6, 83),
489Tuple.Create(6, 85),
490Tuple.Create(6, 92),
491Tuple.Create(7, 11),
492Tuple.Create(7, 12),
493Tuple.Create(7, 14),
494Tuple.Create(7, 22),
495Tuple.Create(7, 24),
496Tuple.Create(7, 26),
497Tuple.Create(7, 34),
498Tuple.Create(7, 35),
499Tuple.Create(7, 37),
500Tuple.Create(7, 45),
501Tuple.Create(7, 48),
502Tuple.Create(7, 50),
503Tuple.Create(7, 58),
504Tuple.Create(7, 59),
505Tuple.Create(7, 61),
506Tuple.Create(7, 69),
507Tuple.Create(7, 71),
508Tuple.Create(7, 73),
509Tuple.Create(7, 81),
510Tuple.Create(7, 82),
511Tuple.Create(7, 84),
512Tuple.Create(7, 92),
513Tuple.Create(8, 11),
514Tuple.Create(8, 13),
515Tuple.Create(8, 16),
516Tuple.Create(8, 22),
517Tuple.Create(8, 25),
518Tuple.Create(8, 28),
519Tuple.Create(8, 34),
520Tuple.Create(8, 36),
521Tuple.Create(8, 39),
522Tuple.Create(8, 45),
523Tuple.Create(8, 49),
524Tuple.Create(8, 52),
525Tuple.Create(8, 58),
526Tuple.Create(8, 60),
527Tuple.Create(8, 63),
528Tuple.Create(8, 69),
529Tuple.Create(8, 72),
530Tuple.Create(8, 75),
531Tuple.Create(8, 81),
532Tuple.Create(8, 83),
533Tuple.Create(8, 86),
534Tuple.Create(8, 92),
535Tuple.Create(9, 11),
536Tuple.Create(9, 12),
537Tuple.Create(9, 16),
538Tuple.Create(9, 22),
539Tuple.Create(9, 24),
540Tuple.Create(9, 28),
541Tuple.Create(9, 34),
542Tuple.Create(9, 35),
543Tuple.Create(9, 39),
544Tuple.Create(9, 45),
545Tuple.Create(9, 48),
546Tuple.Create(9, 52),
547Tuple.Create(9, 58),
548Tuple.Create(9, 59),
549Tuple.Create(9, 63),
550Tuple.Create(9, 69),
551Tuple.Create(9, 71),
552Tuple.Create(9, 75),
553Tuple.Create(9, 81),
554Tuple.Create(9, 82),
555Tuple.Create(9, 86),
556Tuple.Create(9, 92),
557Tuple.Create(10, 11),
558Tuple.Create(10, 14),
559Tuple.Create(10, 15),
560Tuple.Create(10, 22),
561Tuple.Create(10, 26),
562Tuple.Create(10, 27),
563Tuple.Create(10, 34),
564Tuple.Create(10, 37),
565Tuple.Create(10, 38),
566Tuple.Create(10, 45),
567Tuple.Create(10, 50),
568Tuple.Create(10, 51),
569Tuple.Create(10, 58),
570Tuple.Create(10, 61),
571Tuple.Create(10, 62),
572Tuple.Create(10, 69),
573Tuple.Create(10, 73),
574Tuple.Create(10, 74),
575Tuple.Create(10, 81),
576Tuple.Create(10, 84),
577Tuple.Create(10, 85),
578Tuple.Create(10, 92),
579Tuple.Create(11, 17),
580Tuple.Create(11, 18),
581Tuple.Create(11, 19),
582Tuple.Create(11, 20),
583Tuple.Create(11, 21),
584Tuple.Create(11, 29),
585Tuple.Create(11, 30),
586Tuple.Create(11, 31),
587Tuple.Create(11, 32),
588Tuple.Create(11, 33),
589Tuple.Create(11, 40),
590Tuple.Create(11, 41),
591Tuple.Create(11, 42),
592Tuple.Create(11, 43),
593Tuple.Create(11, 44),
594Tuple.Create(11, 53),
595Tuple.Create(11, 54),
596Tuple.Create(11, 55),
597Tuple.Create(11, 56),
598Tuple.Create(11, 57),
599Tuple.Create(11, 64),
600Tuple.Create(11, 65),
601Tuple.Create(11, 66),
602Tuple.Create(11, 67),
603Tuple.Create(11, 68),
604Tuple.Create(11, 76),
605Tuple.Create(11, 77),
606Tuple.Create(11, 78),
607Tuple.Create(11, 79),
608Tuple.Create(11, 80),
609Tuple.Create(11, 87),
610Tuple.Create(11, 88),
611Tuple.Create(11, 89),
612Tuple.Create(11, 90),
613Tuple.Create(11, 91),
614Tuple.Create(12, 23),
615Tuple.Create(12, 25),
616Tuple.Create(12, 27),
617Tuple.Create(12, 30),
618Tuple.Create(12, 32),
619Tuple.Create(12, 46),
620Tuple.Create(12, 49),
621Tuple.Create(12, 51),
622Tuple.Create(12, 54),
623Tuple.Create(12, 56),
624Tuple.Create(12, 70),
625Tuple.Create(12, 72),
626Tuple.Create(12, 74),
627Tuple.Create(12, 77),
628Tuple.Create(12, 79),
629Tuple.Create(12, 93),
630Tuple.Create(13, 23),
631Tuple.Create(13, 24),
632Tuple.Create(13, 26),
633Tuple.Create(13, 29),
634Tuple.Create(13, 31),
635Tuple.Create(13, 46),
636Tuple.Create(13, 48),
637Tuple.Create(13, 50),
638Tuple.Create(13, 53),
639Tuple.Create(13, 55),
640Tuple.Create(13, 70),
641Tuple.Create(13, 71),
642Tuple.Create(13, 73),
643Tuple.Create(13, 76),
644Tuple.Create(13, 78),
645Tuple.Create(13, 93),
646Tuple.Create(14, 23),
647Tuple.Create(14, 25),
648Tuple.Create(14, 28),
649Tuple.Create(14, 30),
650Tuple.Create(14, 33),
651Tuple.Create(14, 46),
652Tuple.Create(14, 49),
653Tuple.Create(14, 52),
654Tuple.Create(14, 54),
655Tuple.Create(14, 57),
656Tuple.Create(14, 70),
657Tuple.Create(14, 72),
658Tuple.Create(14, 75),
659Tuple.Create(14, 77),
660Tuple.Create(14, 80),
661Tuple.Create(14, 93),
662Tuple.Create(15, 23),
663Tuple.Create(15, 24),
664Tuple.Create(15, 28),
665Tuple.Create(15, 29),
666Tuple.Create(15, 33),
667Tuple.Create(15, 46),
668Tuple.Create(15, 48),
669Tuple.Create(15, 52),
670Tuple.Create(15, 53),
671Tuple.Create(15, 57),
672Tuple.Create(15, 70),
673Tuple.Create(15, 71),
674Tuple.Create(15, 75),
675Tuple.Create(15, 76),
676Tuple.Create(15, 80),
677Tuple.Create(15, 93),
678Tuple.Create(16, 23),
679Tuple.Create(16, 26),
680Tuple.Create(16, 27),
681Tuple.Create(16, 31),
682Tuple.Create(16, 32),
683Tuple.Create(16, 46),
684Tuple.Create(16, 50),
685Tuple.Create(16, 51),
686Tuple.Create(16, 55),
687Tuple.Create(16, 56),
688Tuple.Create(16, 70),
689Tuple.Create(16, 73),
690Tuple.Create(16, 74),
691Tuple.Create(16, 78),
692Tuple.Create(16, 79),
693Tuple.Create(16, 93),
694Tuple.Create(17, 23),
695Tuple.Create(17, 25),
696Tuple.Create(17, 27),
697Tuple.Create(17, 34),
698Tuple.Create(17, 46),
699Tuple.Create(17, 49),
700Tuple.Create(17, 51),
701Tuple.Create(17, 58),
702Tuple.Create(17, 70),
703Tuple.Create(17, 72),
704Tuple.Create(17, 74),
705Tuple.Create(17, 81),
706Tuple.Create(17, 93),
707Tuple.Create(18, 23),
708Tuple.Create(18, 24),
709Tuple.Create(18, 26),
710Tuple.Create(18, 34),
711Tuple.Create(18, 46),
712Tuple.Create(18, 48),
713Tuple.Create(18, 50),
714Tuple.Create(18, 58),
715Tuple.Create(18, 70),
716Tuple.Create(18, 71),
717Tuple.Create(18, 73),
718Tuple.Create(18, 81),
719Tuple.Create(18, 93),
720Tuple.Create(19, 23),
721Tuple.Create(19, 25),
722Tuple.Create(19, 28),
723Tuple.Create(19, 34),
724Tuple.Create(19, 46),
725Tuple.Create(19, 49),
726Tuple.Create(19, 52),
727Tuple.Create(19, 58),
728Tuple.Create(19, 70),
729Tuple.Create(19, 72),
730Tuple.Create(19, 75),
731Tuple.Create(19, 81),
732Tuple.Create(19, 93),
733Tuple.Create(20, 23),
734Tuple.Create(20, 24),
735Tuple.Create(20, 28),
736Tuple.Create(20, 34),
737Tuple.Create(20, 46),
738Tuple.Create(20, 48),
739Tuple.Create(20, 52),
740Tuple.Create(20, 58),
741Tuple.Create(20, 70),
742Tuple.Create(20, 71),
743Tuple.Create(20, 75),
744Tuple.Create(20, 81),
745Tuple.Create(20, 93),
746Tuple.Create(21, 23),
747Tuple.Create(21, 26),
748Tuple.Create(21, 27),
749Tuple.Create(21, 34),
750Tuple.Create(21, 46),
751Tuple.Create(21, 50),
752Tuple.Create(21, 51),
753Tuple.Create(21, 58),
754Tuple.Create(21, 70),
755Tuple.Create(21, 73),
756Tuple.Create(21, 74),
757Tuple.Create(21, 81),
758Tuple.Create(21, 93),
759Tuple.Create(22, 23),
760Tuple.Create(22, 29),
761Tuple.Create(22, 30),
762Tuple.Create(22, 31),
763Tuple.Create(22, 32),
764Tuple.Create(22, 33),
765Tuple.Create(22, 46),
766Tuple.Create(22, 53),
767Tuple.Create(22, 54),
768Tuple.Create(22, 55),
769Tuple.Create(22, 56),
770Tuple.Create(22, 57),
771Tuple.Create(22, 70),
772Tuple.Create(22, 76),
773Tuple.Create(22, 77),
774Tuple.Create(22, 78),
775Tuple.Create(22, 79),
776Tuple.Create(22, 80),
777Tuple.Create(22, 93),
778Tuple.Create(23, 35),
779Tuple.Create(23, 36),
780Tuple.Create(23, 37),
781Tuple.Create(23, 38),
782Tuple.Create(23, 39),
783Tuple.Create(23, 40),
784Tuple.Create(23, 41),
785Tuple.Create(23, 42),
786Tuple.Create(23, 43),
787Tuple.Create(23, 44),
788Tuple.Create(23, 45),
789Tuple.Create(23, 59),
790Tuple.Create(23, 60),
791Tuple.Create(23, 61),
792Tuple.Create(23, 62),
793Tuple.Create(23, 63),
794Tuple.Create(23, 64),
795Tuple.Create(23, 65),
796Tuple.Create(23, 66),
797Tuple.Create(23, 67),
798Tuple.Create(23, 68),
799Tuple.Create(23, 69),
800Tuple.Create(23, 82),
801Tuple.Create(23, 83),
802Tuple.Create(23, 84),
803Tuple.Create(23, 85),
804Tuple.Create(23, 86),
805Tuple.Create(23, 87),
806Tuple.Create(23, 88),
807Tuple.Create(23, 89),
808Tuple.Create(23, 90),
809Tuple.Create(23, 91),
810Tuple.Create(23, 92),
811Tuple.Create(24, 47),
812Tuple.Create(24, 49),
813Tuple.Create(24, 51),
814Tuple.Create(24, 54),
815Tuple.Create(24, 56),
816Tuple.Create(24, 60),
817Tuple.Create(24, 62),
818Tuple.Create(24, 65),
819Tuple.Create(24, 67),
820Tuple.Create(24, 94),
821Tuple.Create(25, 47),
822Tuple.Create(25, 48),
823Tuple.Create(25, 50),
824Tuple.Create(25, 53),
825Tuple.Create(25, 55),
826Tuple.Create(25, 59),
827Tuple.Create(25, 61),
828Tuple.Create(25, 64),
829Tuple.Create(25, 66),
830Tuple.Create(25, 94),
831Tuple.Create(26, 47),
832Tuple.Create(26, 49),
833Tuple.Create(26, 52),
834Tuple.Create(26, 54),
835Tuple.Create(26, 57),
836Tuple.Create(26, 60),
837Tuple.Create(26, 63),
838Tuple.Create(26, 65),
839Tuple.Create(26, 68),
840Tuple.Create(26, 94),
841Tuple.Create(27, 47),
842Tuple.Create(27, 48),
843Tuple.Create(27, 52),
844Tuple.Create(27, 53),
845Tuple.Create(27, 57),
846Tuple.Create(27, 59),
847Tuple.Create(27, 63),
848Tuple.Create(27, 64),
849Tuple.Create(27, 68),
850Tuple.Create(27, 94),
851Tuple.Create(28, 47),
852Tuple.Create(28, 50),
853Tuple.Create(28, 51),
854Tuple.Create(28, 55),
855Tuple.Create(28, 56),
856Tuple.Create(28, 61),
857Tuple.Create(28, 62),
858Tuple.Create(28, 66),
859Tuple.Create(28, 67),
860Tuple.Create(28, 94),
861Tuple.Create(29, 47),
862Tuple.Create(29, 49),
863Tuple.Create(29, 51),
864Tuple.Create(29, 58),
865Tuple.Create(29, 60),
866Tuple.Create(29, 62),
867Tuple.Create(29, 69),
868Tuple.Create(29, 94),
869Tuple.Create(30, 47),
870Tuple.Create(30, 48),
871Tuple.Create(30, 50),
872Tuple.Create(30, 58),
873Tuple.Create(30, 59),
874Tuple.Create(30, 61),
875Tuple.Create(30, 69),
876Tuple.Create(30, 94),
877Tuple.Create(31, 47),
878Tuple.Create(31, 49),
879Tuple.Create(31, 52),
880Tuple.Create(31, 58),
881Tuple.Create(31, 60),
882Tuple.Create(31, 63),
883Tuple.Create(31, 69),
884Tuple.Create(31, 94),
885Tuple.Create(32, 47),
886Tuple.Create(32, 48),
887Tuple.Create(32, 52),
888Tuple.Create(32, 58),
889Tuple.Create(32, 59),
890Tuple.Create(32, 63),
891Tuple.Create(32, 69),
892Tuple.Create(32, 94),
893Tuple.Create(33, 47),
894Tuple.Create(33, 50),
895Tuple.Create(33, 51),
896Tuple.Create(33, 58),
897Tuple.Create(33, 61),
898Tuple.Create(33, 62),
899Tuple.Create(33, 69),
900Tuple.Create(33, 94),
901Tuple.Create(34, 47),
902Tuple.Create(34, 53),
903Tuple.Create(34, 54),
904Tuple.Create(34, 55),
905Tuple.Create(34, 56),
906Tuple.Create(34, 57),
907Tuple.Create(34, 64),
908Tuple.Create(34, 65),
909Tuple.Create(34, 66),
910Tuple.Create(34, 67),
911Tuple.Create(34, 68),
912Tuple.Create(34, 94),
913Tuple.Create(35, 47),
914Tuple.Create(35, 49),
915Tuple.Create(35, 51),
916Tuple.Create(35, 54),
917Tuple.Create(35, 56),
918Tuple.Create(35, 70),
919Tuple.Create(35, 94),
920Tuple.Create(36, 47),
921Tuple.Create(36, 48),
922Tuple.Create(36, 50),
923Tuple.Create(36, 53),
924Tuple.Create(36, 55),
925Tuple.Create(36, 70),
926Tuple.Create(36, 94),
927Tuple.Create(37, 47),
928Tuple.Create(37, 49),
929Tuple.Create(37, 52),
930Tuple.Create(37, 54),
931Tuple.Create(37, 57),
932Tuple.Create(37, 70),
933Tuple.Create(37, 94),
934Tuple.Create(38, 47),
935Tuple.Create(38, 48),
936Tuple.Create(38, 52),
937Tuple.Create(38, 53),
938Tuple.Create(38, 57),
939Tuple.Create(38, 70),
940Tuple.Create(38, 94),
941Tuple.Create(39, 47),
942Tuple.Create(39, 50),
943Tuple.Create(39, 51),
944Tuple.Create(39, 55),
945Tuple.Create(39, 56),
946Tuple.Create(39, 70),
947Tuple.Create(39, 94),
948Tuple.Create(40, 47),
949Tuple.Create(40, 49),
950Tuple.Create(40, 51),
951Tuple.Create(40, 58),
952Tuple.Create(40, 70),
953Tuple.Create(40, 94),
954Tuple.Create(41, 47),
955Tuple.Create(41, 48),
956Tuple.Create(41, 50),
957Tuple.Create(41, 58),
958Tuple.Create(41, 70),
959Tuple.Create(41, 94),
960Tuple.Create(42, 47),
961Tuple.Create(42, 49),
962Tuple.Create(42, 52),
963Tuple.Create(42, 58),
964Tuple.Create(42, 70),
965Tuple.Create(42, 94),
966Tuple.Create(43, 47),
967Tuple.Create(43, 48),
968Tuple.Create(43, 52),
969Tuple.Create(43, 58),
970Tuple.Create(43, 70),
971Tuple.Create(43, 94),
972Tuple.Create(44, 47),
973Tuple.Create(44, 50),
974Tuple.Create(44, 51),
975Tuple.Create(44, 58),
976Tuple.Create(44, 70),
977Tuple.Create(44, 94),
978Tuple.Create(45, 47),
979Tuple.Create(45, 53),
980Tuple.Create(45, 54),
981Tuple.Create(45, 55),
982Tuple.Create(45, 56),
983Tuple.Create(45, 57),
984Tuple.Create(45, 70),
985Tuple.Create(45, 94),
986Tuple.Create(46, 47),
987Tuple.Create(46, 59),
988Tuple.Create(46, 60),
989Tuple.Create(46, 61),
990Tuple.Create(46, 62),
991Tuple.Create(46, 63),
992Tuple.Create(46, 64),
993Tuple.Create(46, 65),
994Tuple.Create(46, 66),
995Tuple.Create(46, 67),
996Tuple.Create(46, 68),
997Tuple.Create(46, 69),
998Tuple.Create(46, 94),
999Tuple.Create(47, 71),
1000Tuple.Create(47, 72),
1001Tuple.Create(47, 73),
1002Tuple.Create(47, 74),
1003Tuple.Create(47, 75),
1004Tuple.Create(47, 76),
1005Tuple.Create(47, 77),
1006Tuple.Create(47, 78),
1007Tuple.Create(47, 79),
1008Tuple.Create(47, 80),
1009Tuple.Create(47, 81),
1010Tuple.Create(47, 82),
1011Tuple.Create(47, 83),
1012Tuple.Create(47, 84),
1013Tuple.Create(47, 85),
1014Tuple.Create(47, 86),
1015Tuple.Create(47, 87),
1016Tuple.Create(47, 88),
1017Tuple.Create(47, 89),
1018Tuple.Create(47, 90),
1019Tuple.Create(47, 91),
1020Tuple.Create(47, 92),
1021Tuple.Create(47, 93),
1022Tuple.Create(48, 95),
1023Tuple.Create(49, 95),
1024Tuple.Create(50, 95),
1025Tuple.Create(51, 95),
1026Tuple.Create(52, 95),
1027Tuple.Create(53, 95),
1028Tuple.Create(54, 95),
1029Tuple.Create(55, 95),
1030Tuple.Create(56, 95),
1031Tuple.Create(57, 95),
1032Tuple.Create(58, 95),
1033Tuple.Create(59, 95),
1034Tuple.Create(60, 95),
1035Tuple.Create(61, 95),
1036Tuple.Create(62, 95),
1037Tuple.Create(63, 95),
1038Tuple.Create(64, 95),
1039Tuple.Create(65, 95),
1040Tuple.Create(66, 95),
1041Tuple.Create(67, 95),
1042Tuple.Create(68, 95),
1043Tuple.Create(69, 95),
1044Tuple.Create(70, 95),
1045Tuple.Create(71, 95),
1046Tuple.Create(72, 95),
1047Tuple.Create(73, 95),
1048Tuple.Create(74, 95),
1049Tuple.Create(75, 95),
1050Tuple.Create(76, 95),
1051Tuple.Create(77, 95),
1052Tuple.Create(78, 95),
1053Tuple.Create(79, 95),
1054Tuple.Create(80, 95),
1055Tuple.Create(81, 95),
1056Tuple.Create(82, 95),
1057Tuple.Create(83, 95),
1058Tuple.Create(84, 95),
1059Tuple.Create(85, 95),
1060Tuple.Create(86, 95),
1061Tuple.Create(87, 95),
1062Tuple.Create(88, 95),
1063Tuple.Create(89, 95),
1064Tuple.Create(90, 95),
1065Tuple.Create(91, 95),
1066Tuple.Create(92, 95),
1067Tuple.Create(93, 95),
1068Tuple.Create(94, 95)
1069    };
1070    #endregion
1071  }
1072}
Note: See TracBrowser for help on using the repository browser.