Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/HeuristicLab.Tests/HeuristicLab-3.3/CollectObjectGraphTest.cs @ 17085

Last change on this file since 17085 was 17021, checked in by mkommend, 5 years ago

#2520: Adapted all unit tests to use attic instead of the xml persistence. This affects all sample unit tests, the test resources, script unit tests and some general unit tests.

File size: 6.4 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2019 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.Collections.Generic;
24using System.Diagnostics;
25using System.Linq;
26using System.Threading.Tasks;
27using HEAL.Attic;
28using HeuristicLab.Algorithms.GeneticAlgorithm;
29using HeuristicLab.Common;
30using HeuristicLab.Optimization;
31using HeuristicLab.Problems.TestFunctions;
32using Microsoft.VisualStudio.TestTools.UnitTesting;
33
34namespace HeuristicLab.Tests {
35  [TestClass]
36  public class CollectObjectGraphTest {
37    private static readonly ProtoBufSerializer serializer = new ProtoBufSerializer();
38
39    private TestContext testContextInstance;
40    public TestContext TestContext {
41      get { return testContextInstance; }
42      set { testContextInstance = value; }
43    }
44
45    [TestMethod]
46    [Description("Verify that the object graph traversal is working by checking the number of objects after traversal.")]
47    [TestCategory("General")]
48    [TestCategory("Essential")]
49    [TestProperty("Time", "medium")]
50    public void TestObjectGraphTraversal() {
51      GeneticAlgorithm ga = (GeneticAlgorithm)serializer.Deserialize(@"Test Resources\GA_SymbReg.hl");
52      var objects = ga.GetObjectGraphObjects().ToList();
53
54      // Should be 3982, but count may change slightly as members are added or removed
55      Assert.IsTrue(objects.Count > 1, "Number of objects in the object graph seems to small.");
56    }
57
58    [TestMethod]
59    [TestCategory("General")]
60    [TestCategory("Essential")]
61    [TestProperty("Time", "medium")]
62    public void CollectGASample() {
63      GeneticAlgorithm ga = (GeneticAlgorithm)serializer.Deserialize(@"Test Resources\GA_SymbReg.hl");
64
65      Stopwatch watch = new Stopwatch();
66      watch.Start();
67      for (int i = 0; i < 1; i++)
68        ga.GetObjectGraphObjects().Count();
69      watch.Stop();
70
71      var objects = ga.GetObjectGraphObjects().ToList();
72
73      TestContext.WriteLine("Time elapsed {0}", watch.Elapsed);
74      TestContext.WriteLine("Objects discovered: {0}", objects.Count());
75      TestContext.WriteLine("HL objects discovered: {0}", objects.Count(o => o.GetType().Namespace.StartsWith("HeuristicLab")));
76      TestContext.WriteLine("");
77
78      Dictionary<Type, List<object>> objs = new Dictionary<Type, List<object>>();
79      foreach (object o in objects) {
80        if (!objs.ContainsKey(o.GetType()))
81          objs.Add(o.GetType(), new List<object>());
82        objs[o.GetType()].Add(o);
83      }
84
85      foreach (string s in objects.Select(o => o.GetType().Namespace).Distinct().OrderBy(s => s)) {
86        TestContext.WriteLine("{0}: {1}", s, objects.Count(o => o.GetType().Namespace == s));
87      }
88      TestContext.WriteLine("");
89
90
91      TestContext.WriteLine("Analysis of contained objects per name");
92      foreach (var pair in objs.OrderBy(x => x.Key.ToString())) {
93        TestContext.WriteLine("{0}: {1}", pair.Key, pair.Value.Count);
94      }
95      TestContext.WriteLine("");
96
97      TestContext.WriteLine("Analysis of contained objects");
98      foreach (var pair in from o in objs orderby o.Value.Count descending select o) {
99        TestContext.WriteLine("{0}: {1}", pair.Key, pair.Value.Count);
100      }
101      TestContext.WriteLine("");
102    }
103
104    /// <summary>
105    /// Tests if performance of multiple executions of a GA stays constant (as discussed in #1424)
106    /// Tests if object collection works after multiple executions of a GA
107    /// (for example the traversal of `ThreadLocal` objects in CollectObjectGraphObjects
108    /// causes a StackOverflow occurs after some executions)
109    /// </summary>
110    [TestMethod]
111    [TestCategory("General")]
112    [TestProperty("Time", "long")]
113    public void AlgorithmExecutions() {
114      var algs = new List<IAlgorithm>();
115
116      Stopwatch sw = new Stopwatch();
117      for (int i = 0; i < 100; i++) {
118        GeneticAlgorithm ga = new GeneticAlgorithm();
119        ga.PopulationSize.Value = 5;
120        ga.MaximumGenerations.Value = 5;
121        ga.Engine = new SequentialEngine.SequentialEngine();
122        ga.Problem = new SingleObjectiveTestFunctionProblem();
123
124        sw.Start();
125        algs.Add(ga);
126
127        ga.Start();
128        sw.Stop();
129        TestContext.WriteLine("{0}: {1} ", i, sw.Elapsed);
130        sw.Reset();
131      }
132    }
133
134    /// <summary>
135    /// Test the execution of many algorithms in parallel
136    /// </summary>
137    [TestMethod]
138    [TestCategory("General")]
139    [TestProperty("Time", "medium")]
140    public void ParallelAlgorithmExecutions() {
141      int n = 60;
142      var tasks = new Task[n];
143
144      TestContext.WriteLine("creating tasks...");
145      for (int i = 0; i < n; i++) {
146        tasks[i] = new Task((iobj) => {
147          int locali = (int)iobj;
148          GeneticAlgorithm ga = new GeneticAlgorithm();
149          ga.Name = "Alg " + locali;
150          ga.PopulationSize.Value = 5;
151          ga.MaximumGenerations.Value = 5;
152          ga.Engine = new SequentialEngine.SequentialEngine();
153          ga.Problem = new SingleObjectiveTestFunctionProblem();
154          ga.Prepare(true);
155          Console.WriteLine("{0}; Objects before execution: {1}", ga.Name, ga.GetObjectGraphObjects().Count());
156          var sw = new Stopwatch();
157          sw.Start();
158          ga.Start();
159          sw.Stop();
160          Console.WriteLine("{0}; Objects after execution: {1}", ga.Name, ga.GetObjectGraphObjects().Count());
161          Console.WriteLine("{0}; ExecutionTime: {1} ", ga.Name, sw.Elapsed);
162        }, i);
163      }
164      TestContext.WriteLine("starting tasks...");
165      for (int i = 0; i < n; i++) {
166        tasks[i].Start();
167      }
168      TestContext.WriteLine("waiting for tasks to finish...");
169      Task.WaitAll(tasks);
170    }
171  }
172}
Note: See TracBrowser for help on using the repository browser.