Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.ALGLIB/3.7.0/HeuristicLab.ALGLIB-3.7.0/Plugin.cs.frame
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.ALGLIB/3.7.0/HeuristicLab.ALGLIB-3.7.0/Plugin.cs.frame	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.ALGLIB/3.7.0/HeuristicLab.ALGLIB-3.7.0/Plugin.cs.frame	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.ALGLIB/3.7.0/HeuristicLab.ALGLIB-3.7.0/Properties/AssemblyInfo.cs.frame
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.ALGLIB/3.7.0/HeuristicLab.ALGLIB-3.7.0/Properties/AssemblyInfo.cs.frame	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.ALGLIB/3.7.0/HeuristicLab.ALGLIB-3.7.0/Properties/AssemblyInfo.cs.frame	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -33,5 +33,5 @@
 [assembly: AssemblyCompany("")]
 [assembly: AssemblyProduct("HeuristicLab")]
-[assembly: AssemblyCopyright("(c) 2002-2016 HEAL")]
+[assembly: AssemblyCopyright("(c) 2002-2018 HEAL")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.AutoDiff/1.0/HeuristicLab.AutoDiff-1.0/Plugin.cs.frame
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.AutoDiff/1.0/HeuristicLab.AutoDiff-1.0/Plugin.cs.frame	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.AutoDiff/1.0/HeuristicLab.AutoDiff-1.0/Plugin.cs.frame	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.AutoDiff/1.0/HeuristicLab.AutoDiff-1.0/Properties/AssemblyInfo.cs.frame
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.AutoDiff/1.0/HeuristicLab.AutoDiff-1.0/Properties/AssemblyInfo.cs.frame	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.AutoDiff/1.0/HeuristicLab.AutoDiff-1.0/Properties/AssemblyInfo.cs.frame	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -33,5 +33,5 @@
 [assembly: AssemblyCompany("")]
 [assembly: AssemblyProduct("HeuristicLab")]
-[assembly: AssemblyCopyright("(c) 2002-2016 HEAL")]
+[assembly: AssemblyCopyright("(c) 2002-2018 HEAL")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.AvalonEdit/5.0.1/HeuristicLab.AvalonEdit-5.0.1/Plugin.cs.frame
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.AvalonEdit/5.0.1/HeuristicLab.AvalonEdit-5.0.1/Plugin.cs.frame	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.AvalonEdit/5.0.1/HeuristicLab.AvalonEdit-5.0.1/Plugin.cs.frame	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.AvalonEdit/5.0.1/HeuristicLab.AvalonEdit-5.0.1/Properties/AssemblyInfo.cs.frame
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.AvalonEdit/5.0.1/HeuristicLab.AvalonEdit-5.0.1/Properties/AssemblyInfo.cs.frame	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.AvalonEdit/5.0.1/HeuristicLab.AvalonEdit-5.0.1/Properties/AssemblyInfo.cs.frame	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -31,5 +31,5 @@
 [assembly: AssemblyCompany("")]
 [assembly: AssemblyProduct("HeuristicLab")]
-[assembly: AssemblyCopyright("(c) 2002-2016 HEAL")]
+[assembly: AssemblyCopyright("(c) 2002-2018 HEAL")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Cecil/0.9.5/HeuristicLab.Cecil-0.9.5/Plugin.cs.frame
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Cecil/0.9.5/HeuristicLab.Cecil-0.9.5/Plugin.cs.frame	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Cecil/0.9.5/HeuristicLab.Cecil-0.9.5/Plugin.cs.frame	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Cecil/0.9.5/HeuristicLab.Cecil-0.9.5/Properties/AssemblyInfo.cs.frame
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Cecil/0.9.5/HeuristicLab.Cecil-0.9.5/Properties/AssemblyInfo.cs.frame	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Cecil/0.9.5/HeuristicLab.Cecil-0.9.5/Properties/AssemblyInfo.cs.frame	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -31,5 +31,5 @@
 [assembly: AssemblyCompany("")]
 [assembly: AssemblyProduct("HeuristicLab")]
-[assembly: AssemblyCopyright("(c) 2002-2016 HEAL")]
+[assembly: AssemblyCopyright("(c) 2002-2018 HEAL")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.DayView/1.0/Plugin.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.DayView/1.0/Plugin.cs	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.DayView/1.0/Plugin.cs	(revision 16311)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.DayView/1.0/Properties/AssemblyInfo.cs.frame
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.DayView/1.0/Properties/AssemblyInfo.cs.frame	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.DayView/1.0/Properties/AssemblyInfo.cs.frame	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -32,5 +32,5 @@
 [assembly: AssemblyCompany("")]
 [assembly: AssemblyProduct("HeuristicLab")]
-[assembly: AssemblyCopyright("(c) 2002-2016 HEAL")]
+[assembly: AssemblyCopyright("(c) 2002-2018 HEAL")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.DotNetScilab/1.0/HeuristicLab.DotNetScilab-1.0/Plugin.cs.frame
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.DotNetScilab/1.0/HeuristicLab.DotNetScilab-1.0/Plugin.cs.frame	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.DotNetScilab/1.0/HeuristicLab.DotNetScilab-1.0/Plugin.cs.frame	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.DotNetScilab/1.0/HeuristicLab.DotNetScilab-1.0/Properties/AssemblyInfo.cs.frame
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.DotNetScilab/1.0/HeuristicLab.DotNetScilab-1.0/Properties/AssemblyInfo.cs.frame	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.DotNetScilab/1.0/HeuristicLab.DotNetScilab-1.0/Properties/AssemblyInfo.cs.frame	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -32,5 +32,5 @@
 [assembly: AssemblyCompany("")]
 [assembly: AssemblyProduct("HeuristicLab")]
-[assembly: AssemblyCopyright("(c) 2002-2016 HEAL")]
+[assembly: AssemblyCopyright("(c) 2002-2018 HEAL")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.EPPlus/4.0.3/HeuristicLab.EPPlus-4.0.3/Plugin.cs.frame
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.EPPlus/4.0.3/HeuristicLab.EPPlus-4.0.3/Plugin.cs.frame	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.EPPlus/4.0.3/HeuristicLab.EPPlus-4.0.3/Plugin.cs.frame	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.EPPlus/4.0.3/HeuristicLab.EPPlus-4.0.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.EPPlus/4.0.3/HeuristicLab.EPPlus-4.0.3/Properties/AssemblyInfo.cs.frame	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.EPPlus/4.0.3/HeuristicLab.EPPlus-4.0.3/Properties/AssemblyInfo.cs.frame	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -32,5 +32,5 @@
 [assembly: AssemblyCompany("")]
 [assembly: AssemblyProduct("HeuristicLab")]
-[assembly: AssemblyCopyright("(c) 2002-2016 HEAL")]
+[assembly: AssemblyCopyright("(c) 2002-2018 HEAL")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.GeoIP/1.12/GeoIPLookupService.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.GeoIP/1.12/GeoIPLookupService.cs	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.GeoIP/1.12/GeoIPLookupService.cs	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.GeoIP/1.12/Properties/AssemblyInfo.cs.frame
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.GeoIP/1.12/Properties/AssemblyInfo.cs.frame	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.GeoIP/1.12/Properties/AssemblyInfo.cs.frame	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -32,5 +32,5 @@
 [assembly: AssemblyCompany("")]
 [assembly: AssemblyProduct("HeuristicLab")]
-[assembly: AssemblyCopyright("(c) 2002-2016 HEAL")]
+[assembly: AssemblyCopyright("(c) 2002-2018 HEAL")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Igraph/0.8.0-pre/HeuristicLab.Igraph-0.8.0-pre/Datatypes.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Igraph/0.8.0-pre/HeuristicLab.Igraph-0.8.0-pre/Datatypes.cs	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Igraph/0.8.0-pre/HeuristicLab.Igraph-0.8.0-pre/Datatypes.cs	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Igraph/0.8.0-pre/HeuristicLab.Igraph-0.8.0-pre/DllImporter.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Igraph/0.8.0-pre/HeuristicLab.Igraph-0.8.0-pre/DllImporter.cs	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Igraph/0.8.0-pre/HeuristicLab.Igraph-0.8.0-pre/DllImporter.cs	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Igraph/0.8.0-pre/HeuristicLab.Igraph-0.8.0-pre/Plugin.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Igraph/0.8.0-pre/HeuristicLab.Igraph-0.8.0-pre/Plugin.cs	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Igraph/0.8.0-pre/HeuristicLab.Igraph-0.8.0-pre/Plugin.cs	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Igraph/0.8.0-pre/HeuristicLab.Igraph-0.8.0-pre/Properties/AssemblyInfo.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Igraph/0.8.0-pre/HeuristicLab.Igraph-0.8.0-pre/Properties/AssemblyInfo.cs	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Igraph/0.8.0-pre/HeuristicLab.Igraph-0.8.0-pre/Properties/AssemblyInfo.cs	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -31,5 +31,5 @@
 [assembly: AssemblyCompany("HEAL")]
 [assembly: AssemblyProduct("HeuristicLab")]
-[assembly: AssemblyCopyright("(c) 2002-2016 HEAL")]
+[assembly: AssemblyCopyright("(c) 2002-2018 HEAL")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Igraph/0.8.0-pre/HeuristicLab.Igraph-0.8.0-pre/Wrappers/Datatypes.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Igraph/0.8.0-pre/HeuristicLab.Igraph-0.8.0-pre/Wrappers/Datatypes.cs	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Igraph/0.8.0-pre/HeuristicLab.Igraph-0.8.0-pre/Wrappers/Datatypes.cs	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Igraph/0.8.0-pre/HeuristicLab.Igraph-0.8.0-pre/Wrappers/Graph.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Igraph/0.8.0-pre/HeuristicLab.Igraph-0.8.0-pre/Wrappers/Graph.cs	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Igraph/0.8.0-pre/HeuristicLab.Igraph-0.8.0-pre/Wrappers/Graph.cs	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Igraph/0.8.0-pre/HeuristicLab.Igraph-0.8.0-pre/Wrappers/Matrix.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Igraph/0.8.0-pre/HeuristicLab.Igraph-0.8.0-pre/Wrappers/Matrix.cs	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Igraph/0.8.0-pre/HeuristicLab.Igraph-0.8.0-pre/Wrappers/Matrix.cs	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Igraph/0.8.0-pre/HeuristicLab.Igraph-0.8.0-pre/Wrappers/Vector.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Igraph/0.8.0-pre/HeuristicLab.Igraph-0.8.0-pre/Wrappers/Vector.cs	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Igraph/0.8.0-pre/HeuristicLab.Igraph-0.8.0-pre/Wrappers/Vector.cs	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.LibSVM/3.12/HeuristicLab.LibSVM-3.12/Plugin.cs.frame
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.LibSVM/3.12/HeuristicLab.LibSVM-3.12/Plugin.cs.frame	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.LibSVM/3.12/HeuristicLab.LibSVM-3.12/Plugin.cs.frame	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.LibSVM/3.12/HeuristicLab.LibSVM-3.12/Properties/AssemblyInfo.cs.frame
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.LibSVM/3.12/HeuristicLab.LibSVM-3.12/Properties/AssemblyInfo.cs.frame	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.LibSVM/3.12/HeuristicLab.LibSVM-3.12/Properties/AssemblyInfo.cs.frame	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -32,5 +32,5 @@
 [assembly: AssemblyCompany("")]
 [assembly: AssemblyProduct("HeuristicLab")]
-[assembly: AssemblyCopyright("(c) 2002-2016 HEAL")]
+[assembly: AssemblyCopyright("(c) 2002-2018 HEAL")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.MathJax/2.6.1/HeuristicLab.MathJax-2.6.1/Plugin.cs.frame
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.MathJax/2.6.1/HeuristicLab.MathJax-2.6.1/Plugin.cs.frame	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.MathJax/2.6.1/HeuristicLab.MathJax-2.6.1/Plugin.cs.frame	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.MathJax/2.6.1/HeuristicLab.MathJax-2.6.1/Properties/AssemblyInfo.cs.frame
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.MathJax/2.6.1/HeuristicLab.MathJax-2.6.1/Properties/AssemblyInfo.cs.frame	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.MathJax/2.6.1/HeuristicLab.MathJax-2.6.1/Properties/AssemblyInfo.cs.frame	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -32,5 +32,5 @@
 [assembly: AssemblyCompany("")]
 [assembly: AssemblyProduct("HeuristicLab")]
-[assembly: AssemblyCopyright("(c) 2002-2016 HEAL")]
+[assembly: AssemblyCopyright("(c) 2002-2018 HEAL")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.MatlabConnector/1.0/HeuristicLab.MatlabConnector-1.0/Plugin.cs.frame
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.MatlabConnector/1.0/HeuristicLab.MatlabConnector-1.0/Plugin.cs.frame	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.MatlabConnector/1.0/HeuristicLab.MatlabConnector-1.0/Plugin.cs.frame	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.MatlabConnector/1.0/HeuristicLab.MatlabConnector-1.0/Properties/AssemblyInfo.cs.frame
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.MatlabConnector/1.0/HeuristicLab.MatlabConnector-1.0/Properties/AssemblyInfo.cs.frame	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.MatlabConnector/1.0/HeuristicLab.MatlabConnector-1.0/Properties/AssemblyInfo.cs.frame	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -32,5 +32,5 @@
 [assembly: AssemblyCompany("")]
 [assembly: AssemblyProduct("HeuristicLab")]
-[assembly: AssemblyCopyright("(c) 2002-2016 HEAL")]
+[assembly: AssemblyCopyright("(c) 2002-2018 HEAL")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NRefactory/5.5.0/HeuristicLab.NRefactory-5.5.0/Plugin.cs.frame
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NRefactory/5.5.0/HeuristicLab.NRefactory-5.5.0/Plugin.cs.frame	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NRefactory/5.5.0/HeuristicLab.NRefactory-5.5.0/Plugin.cs.frame	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NRefactory/5.5.0/HeuristicLab.NRefactory-5.5.0/Properties/AssemblyInfo.cs.frame
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NRefactory/5.5.0/HeuristicLab.NRefactory-5.5.0/Properties/AssemblyInfo.cs.frame	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NRefactory/5.5.0/HeuristicLab.NRefactory-5.5.0/Properties/AssemblyInfo.cs.frame	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -31,5 +31,5 @@
 [assembly: AssemblyCompany("")]
 [assembly: AssemblyProduct("HeuristicLab")]
-[assembly: AssemblyCopyright("(c) 2002-2016 HEAL")]
+[assembly: AssemblyCopyright("(c) 2002-2018 HEAL")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/HeuristicLab.NativeInterpreter-0.1/DllImporter.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/HeuristicLab.NativeInterpreter-0.1/DllImporter.cs	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/HeuristicLab.NativeInterpreter-0.1/DllImporter.cs	(revision 16311)
@@ -0,0 +1,65 @@
+﻿using System;
+using System.Runtime.InteropServices;
+
+namespace HeuristicLab.Problems.DataAnalysis.Symbolic {
+  [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
+  public struct NativeInstruction {
+    public byte opcode;
+    public ushort narg;
+    public int childIndex;
+    public double value;
+    public double weight;
+
+    public IntPtr buf;
+    public IntPtr data;
+  }
+
+  public class NativeWrapper {
+    private const string x86dll = "hl-native-interpreter-msvc-x86.dll";
+    private const string x64dll = "hl-native-interpreter-msvc-x64.dll";
+
+    private readonly static bool is64;
+
+    static NativeWrapper() {
+      is64 = Environment.Is64BitProcess;
+    }
+
+    public static double GetValue(NativeInstruction[] code, int len, int row) {
+      return is64 ? GetValue64(code, len, row) : GetValue32(code, len, row);
+    }
+
+    public static void GetValues(NativeInstruction[] code, int len, int[] rows, int nRows, double[] result) {
+      if (is64)
+        GetValues64(code, len, rows, nRows, result);
+      else
+        GetValues32(code, len, rows, nRows, result);
+    }
+
+    public static void GetValuesVectorized(NativeInstruction[] code, int len, int[] rows, int nRows, double[] result) {
+      if (is64)
+        GetValuesVectorized64(code, len, rows, nRows, result);
+      else
+        GetValuesVectorized32(code, len, rows, nRows, result);
+    }
+
+    // x86
+    [DllImport(x86dll, EntryPoint = "GetValue", CallingConvention = CallingConvention.Cdecl)]
+    internal static extern double GetValue32(NativeInstruction[] code, int len, int row);
+
+    [DllImport(x86dll, EntryPoint = "GetValues", CallingConvention = CallingConvention.Cdecl)]
+    internal static extern void GetValues32(NativeInstruction[] code, int len, int[] rows, int nRows, double[] result);
+
+    [DllImport(x86dll, EntryPoint = "GetValuesVectorized", CallingConvention = CallingConvention.Cdecl)]
+    internal static extern void GetValuesVectorized32(NativeInstruction[] code, int len, int[] rows, int nRows, double[] result);
+
+    // x64
+    [DllImport(x64dll, EntryPoint = "GetValue", CallingConvention = CallingConvention.Cdecl)]
+    internal static extern double GetValue64(NativeInstruction[] code, int len, int row);
+
+    [DllImport(x64dll, EntryPoint = "GetValues", CallingConvention = CallingConvention.Cdecl)]
+    internal static extern void GetValues64(NativeInstruction[] code, int len, int[] rows, int nRows, double[] result);
+
+    [DllImport(x64dll, EntryPoint = "GetValuesVectorized", CallingConvention = CallingConvention.Cdecl)]
+    internal static extern void GetValuesVectorized64(NativeInstruction[] code, int len, int[] rows, int nRows, double[] result);
+  }
+}
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/HeuristicLab.NativeInterpreter-0.1/HeuristicLab.NativeInterpreter-0.1.csproj
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/HeuristicLab.NativeInterpreter-0.1/HeuristicLab.NativeInterpreter-0.1.csproj	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/HeuristicLab.NativeInterpreter-0.1/HeuristicLab.NativeInterpreter-0.1.csproj	(revision 16311)
@@ -0,0 +1,72 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{E05AC63F-6924-4C83-BD0A-EDF3C103C1D8}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.DataAnalysis.Symbolic.NativeInterpreter</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.DataAnalysis.Symbolic.NativeInterpreter-0.1</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <Deterministic>true</Deterministic>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\..\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\..\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="DllImporter.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="hl-native-interpreter-msvc-x64.dll">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="hl-native-interpreter-msvc-x86.dll">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+</Project>
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/HeuristicLab.NativeInterpreter-0.1/Plugin.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/HeuristicLab.NativeInterpreter-0.1/Plugin.cs	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/HeuristicLab.NativeInterpreter-0.1/Plugin.cs	(revision 16311)
@@ -0,0 +1,31 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.DataAnalysis.Symbolic {
+  [Plugin("HeuristicLab.NativeInterpreter", "Provides a native (C++) interpreter for symbolic expression trees", "0.0.0.1")]
+  [PluginFile("HeuristicLab.Problems.DataAnalysis.Symbolic.NativeInterpreter-0.1.dll", PluginFileType.Assembly)]
+  [PluginFile("hl-native-interpreter-msvc-x86.dll", PluginFileType.NativeDll)]
+  [PluginFile("hl-native-interpreter-msvc-x64.dll", PluginFileType.NativeDll)]
+  public class HeuristicLabNativeInterpreterPlugin : PluginBase {
+  }
+}
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/HeuristicLab.NativeInterpreter-0.1/Properties/AssemblyInfo.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/HeuristicLab.NativeInterpreter-0.1/Properties/AssemblyInfo.cs	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/HeuristicLab.NativeInterpreter-0.1/Properties/AssemblyInfo.cs	(revision 16311)
@@ -0,0 +1,36 @@
+﻿using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Problems.DataAnalysis.Symbolic.NativeInterpreter-0.1")]
+[assembly: AssemblyDescription("A wrapper for a native code implementation of a tree interpreter")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("HEAL")]
+[assembly: AssemblyProduct("HeuristicLab.Problems.DataAnalysis.Symbolic.NativeInterpreter-0.1")]
+[assembly: AssemblyCopyright("(c) 2002-2018 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components.  If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("e05ac63f-6924-4c83-bd0a-edf3c103c1d8")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("0.0.0.1")]
+[assembly: AssemblyFileVersion("0.0.0.1")]
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/.ycm_extra_conf.py
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/.ycm_extra_conf.py	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/.ycm_extra_conf.py	(revision 16311)
@@ -0,0 +1,145 @@
+# Generated by YCM Generator at 2018-11-01 01:38:35.867002
+
+# This file is NOT licensed under the GPLv3, which is the license for the rest
+# of YouCompleteMe.
+#
+# Here's the license text for this file:
+#
+# This is free and unencumbered software released into the public domain.
+#
+# Anyone is free to copy, modify, publish, use, compile, sell, or
+# distribute this software, either in source code form or as a compiled
+# binary, for any purpose, commercial or non-commercial, and by any
+# means.
+#
+# In jurisdictions that recognize copyright laws, the author or authors
+# of this software dedicate any and all copyright interest in the
+# software to the public domain. We make this dedication for the benefit
+# of the public at large and to the detriment of our heirs and
+# successors. We intend this dedication to be an overt act of
+# relinquishment in perpetuity of all present and future rights to this
+# software under copyright law.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# For more information, please refer to <http://unlicense.org/>
+
+import os
+import ycm_core
+
+flags = [
+    '-x',
+    'c++',
+    '-Dhl_native_interpreter_EXPORTS',
+    '-I/mnt/c/Projects/hl-native-interpreter/src',
+    '-I/mnt/c/Projects/hl-native-interpreter/lib',
+    '-Wall',
+    '-Werror',
+    '-Wextra',
+    '-fdeclspec',
+    '-std=c++14',
+]
+
+
+# Set this to the absolute path to the folder (NOT the file!) containing the
+# compile_commands.json file to use that instead of 'flags'. See here for
+# more details: http://clang.llvm.org/docs/JSONCompilationDatabase.html
+#
+# You can get CMake to generate this file for you by adding:
+#   set( CMAKE_EXPORT_COMPILE_COMMANDS 1 )
+# to your CMakeLists.txt file.
+#
+# Most projects will NOT need to set this to anything; you can just change the
+# 'flags' list of compilation flags. Notice that YCM itself uses that approach.
+compilation_database_folder = ''
+
+if os.path.exists( compilation_database_folder ):
+  database = ycm_core.CompilationDatabase( compilation_database_folder )
+else:
+  database = None
+
+SOURCE_EXTENSIONS = [ '.C', '.cpp', '.cxx', '.cc', '.c', '.m', '.mm' ]
+
+def DirectoryOfThisScript():
+  return os.path.dirname( os.path.abspath( __file__ ) )
+
+
+def MakeRelativePathsInFlagsAbsolute( flags, working_directory ):
+  if not working_directory:
+    return list( flags )
+  new_flags = []
+  make_next_absolute = False
+  path_flags = [ '-isystem', '-I', '-iquote', '--sysroot=' ]
+  for flag in flags:
+    new_flag = flag
+
+    if make_next_absolute:
+      make_next_absolute = False
+      if not flag.startswith( '/' ):
+        new_flag = os.path.join( working_directory, flag )
+
+    for path_flag in path_flags:
+      if flag == path_flag:
+        make_next_absolute = True
+        break
+
+      if flag.startswith( path_flag ):
+        path = flag[ len( path_flag ): ]
+        new_flag = path_flag + os.path.join( working_directory, path )
+        break
+
+    if new_flag:
+      new_flags.append( new_flag )
+  return new_flags
+
+
+def IsHeaderFile( filename ):
+  extension = os.path.splitext( filename )[ 1 ]
+  return extension in [ '.H', '.h', '.hxx', '.hpp', '.hh' ]
+
+
+def GetCompilationInfoForFile( filename ):
+  # The compilation_commands.json file generated by CMake does not have entries
+  # for header files. So we do our best by asking the db for flags for a
+  # corresponding source file, if any. If one exists, the flags for that file
+  # should be good enough.
+  if IsHeaderFile( filename ):
+    basename = os.path.splitext( filename )[ 0 ]
+    for extension in SOURCE_EXTENSIONS:
+      replacement_file = basename + extension
+      if os.path.exists( replacement_file ):
+        compilation_info = database.GetCompilationInfoForFile(
+          replacement_file )
+        if compilation_info.compiler_flags_:
+          return compilation_info
+    return None
+  return database.GetCompilationInfoForFile( filename )
+
+
+def FlagsForFile( filename, **kwargs ):
+  if database:
+    # Bear in mind that compilation_info.compiler_flags_ does NOT return a
+    # python list, but a "list-like" StringVec object
+    compilation_info = GetCompilationInfoForFile( filename )
+    if not compilation_info:
+      return None
+
+    final_flags = MakeRelativePathsInFlagsAbsolute(
+      compilation_info.compiler_flags_,
+      compilation_info.compiler_working_dir_ )
+
+  else:
+    relative_to = DirectoryOfThisScript()
+    final_flags = MakeRelativePathsInFlagsAbsolute( flags, relative_to )
+
+  return {
+    'flags': final_flags,
+    'do_cache': True
+  }
+
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/CMakeLists.txt
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/CMakeLists.txt	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/CMakeLists.txt	(revision 16311)
@@ -0,0 +1,28 @@
+cmake_minimum_required(VERSION 3.0)
+
+project(
+    hl-native-interpreter
+    VERSION 0.1
+    DESCRIPTION "Native C++ interpreter for HeuristicLab symbolic expression trees"
+    LANGUAGES CXX
+)
+
+add_library(hl-native-interpreter SHARED src/interpreter.cpp)
+target_include_directories(hl-native-interpreter PRIVATE ${PROJECT_SOURCE_DIR}/src ${PROJECT_SOURCE_DIR}/lib)
+target_compile_features(hl-native-interpreter PRIVATE cxx_std_17)
+
+add_library(hl-native-interpreter-vdt SHARED src/interpreter.cpp)
+target_include_directories(hl-native-interpreter-vdt PRIVATE ${PROJECT_SOURCE_DIR}/src ${PROJECT_SOURCE_DIR}/lib)
+target_compile_features(hl-native-interpreter-vdt PRIVATE cxx_std_17)
+
+if(MSVC)
+    target_compile_options(hl-native-interpreter PRIVATE "/W4" "/Qvec-report:2" "$<$<CONFIG:Release>:/O2>")
+    target_compile_options(hl-native-interpreter-vdt PRIVATE "/W4" "/Qvec-report:2" "$<$<CONFIG:Release>:/O2>")
+    target_compile_definitions(hl-native-interpreter-vdt PRIVATE "USE_VDT")
+else()
+    target_compile_options(hl-native-interpreter PRIVATE "-Wall" "-Wextra" "-Werror" "-fopt-info-vec-optimized" "$<$<CONFIG:Release>:-O3;-march=x86-64>")
+    target_compile_options(hl-native-interpreter-vdt PRIVATE "-Wall" "-Wextra" "-Werror" "-fopt-info-vec-optimized" "$<$<CONFIG:Release>:-O3;-march=x86-64>")
+    target_compile_definitions(hl-native-interpreter-vdt PRIVATE "USE_VDT")
+    set_target_properties(hl-native-interpreter PROPERTIES PREFIX "")
+    set_target_properties(hl-native-interpreter-vdt PROPERTIES PREFIX "")
+endif()
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/README.md
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/README.md	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/README.md	(revision 16311)
@@ -0,0 +1,66 @@
+# Build instructions
+
+1) Create a folder to hold the build 
+
+`mkdir build` 
+
+`cd build`
+
+2) Run CMake 
+
+- Visual Studio
+
+    `cmake -G "Microsoft Visual Studio 15 2017 [arch]" <path-to-repository>`. Leave `arch` empty for x86 or `Win64` for x64. 
+    
+    `cmake --build . --config Release`
+
+- MinGW
+
+    `cmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release|Debug`. CMake supports different build types: `Release`, `Debug`, `MinSizeRel` and `RelWithDebInfo`. 
+    
+    `cmake --build .` or `make` or `make VERBOSE=1`
+    
+The build system generates two targets, one using the standard math library functions (`std::exp`, `std::log`, etc.) and the other using functions from the [vdt](https://github.com/dpiparo/vdt) library (described in more detail in [this talk from CERN](https://indico.cern.ch/event/202688/contributions/1487957/attachments/305612/426820/OpenLabFPWorkshop_9_2012.pdf)). A performance comparison with existing HL interpreters is given below. MinGW and MSVC builds of this library were tested. The non-vdt MinGW binary suffers significant peformance loss due to trancendental functions `log` and `exp`. All MinGW binaries also exhibit performance loss with the `pow` and `root` functions. Batched versions take advantage of auto-vectorization. Overall the `Native-MinGW-Vdt[BatchSize=64]` performs the best on the selected grammars. Units in the table correspond to billion node evaluations per second.
+    
+    
+# Performance
+
+## Arithmetic Grammar 
+
+|  Rows | StandardInterpreter | LinerInterpreter | ILEmittingInterpreter | CompiledTreeInterpreter | Native-MSVC-Std | Native-MSVC-Vdt | Native-MinGW-Std | Native-MinGW-Vdt | Native-MSVC-Std[BatchSize=64] | Native-MSVC-Vdt[BatchSize=64] | Native-MinGW-Std[BatchSize=64] | Native-MinGW-Vdt[BatchSize=64] |
+|:-----:|:-------------------:|:----------------:|:---------------------:|:-----------------------:|:---------------:|:---------------:|:----------------:|:----------------:|:-----------------------------:|:-----------------------------:|:------------------------------:|:------------------------------:|
+|  1000 |        0.0430       |      0.2115      |         0.0922        |          0.0817         |      0.5487     |      0.5118     |      0.5512      |      0.5665      |             1.2304            |             1.1942            |             1.1942             |             1.2688             |
+|  2000 |        0.0488       |      0.2048      |         0.1584        |          0.1501         |      0.5845     |      0.5803     |      0.5817      |      0.5668      |             1.3247            |             1.1497            |             1.3693             |             1.3617             |
+|  3000 |        0.0487       |      0.2087      |         0.2142        |          0.2049         |      0.5832     |      0.5678     |      0.5851      |      0.5722      |             1.4745            |             1.2876            |             1.4986             |             1.4986             |
+|  4000 |        0.0488       |      0.2113      |         0.2492        |          0.2423         |      0.4828     |      0.5254     |      0.5472      |      0.5696      |             1.5237            |             1.5190            |             1.4555             |             1.4341             |
+|  5000 |        0.0489       |      0.2072      |         0.2645        |          0.2576         |      0.5394     |      0.4646     |      0.5788      |      0.5618      |             1.3790            |             1.0923            |             1.5276             |             1.5509             |
+|  6000 |        0.0486       |      0.2065      |         0.3038        |          0.3248         |      0.5875     |      0.5861     |      0.5020      |      0.4713      |             1.5239            |             1.0601            |             1.4897             |             1.5399             |
+|  7000 |        0.0489       |      0.2082      |         0.3261        |          0.3518         |      0.5751     |      0.5869     |      0.5805      |      0.5993      |             1.1952            |             1.0627            |             1.2332             |             1.2191             |
+|  8000 |        0.0487       |      0.2086      |         0.3467        |          0.3760         |      0.5890     |      0.5737     |      0.5781      |      0.6024      |             1.3660            |             1.5192            |             1.3622             |             1.4428             |
+|  9000 |        0.0485       |      0.2033      |         0.3653        |          0.3924         |      0.5915     |      0.5918     |      0.5778      |      0.5855      |             1.4990            |             1.5476            |             1.5742             |             1.5325             |
+| 10000 |        0.0486       |      0.2048      |         0.3749        |          0.4080         |      0.5825     |      0.6015     |      0.5797      |      0.6069      |             1.5221            |             1.5671            |             1.4601             |             1.5958             |
+
+## TypeCoherent Grammar
+
+|  Rows | StandardInterpreter | LinerInterpreter | ILEmittingInterpreter | CompiledTreeInterpreter | Native-MSVC-Std | Native-MSVC-Vdt | Native-MinGW-Std | Native-MinGW-Vdt | Native-MSVC-Std[BatchSize=64] | Native-MSVC-Vdt[BatchSize=64] | Native-MinGW-Std[BatchSize=64] | Native-MinGW-Vdt[BatchSize=64] |
+|:-----:|:-------------------:|:----------------:|:---------------------:|:-----------------------:|:---------------:|:---------------:|:----------------:|:----------------:|:-----------------------------:|:-----------------------------:|:------------------------------:|:------------------------------:|
+|  1000 |        0.0435       |      0.1522      |         0.0813        |          0.0732         |      0.3049     |      0.3074     |      0.2419      |      0.3098      |             0.7542            |             0.7928            |             0.3049             |             1.1368             |
+|  2000 |        0.0441       |      0.1569      |         0.1254        |          0.1165         |      0.3066     |      0.3138     |      0.2407      |      0.3170      |             0.7932            |             0.8429            |             0.3199             |             1.2424             |
+|  3000 |        0.0441       |      0.1536      |         0.1521        |          0.1476         |      0.3115     |      0.3088     |      0.2397      |      0.3136      |             0.8595            |             0.8675            |             0.3268             |             1.3074             |
+|  4000 |        0.0440       |      0.1559      |         0.1708        |          0.1692         |      0.3122     |      0.3166     |      0.2420      |      0.3172      |             0.8443            |             0.8918            |             0.3247             |             1.3084             |
+|  5000 |        0.0436       |      0.1543      |         0.1829        |          0.1852         |      0.3119     |      0.3138     |      0.2355      |      0.3175      |             0.8634            |             0.8872            |             0.3165             |             1.3024             |
+|  6000 |        0.0439       |      0.1539      |         0.1950        |          0.1939         |      0.3091     |      0.3060     |      0.2389      |      0.3127      |             0.8758            |             0.9049            |             0.3284             |             1.3058             |
+|  7000 |        0.0437       |      0.1553      |         0.2013        |          0.2055         |      0.3131     |      0.2835     |      0.2403      |      0.3141      |             0.8542            |             0.8989            |             0.3292             |             1.2941             |
+|  8000 |        0.0442       |      0.1530      |         0.2084        |          0.2095         |      0.3109     |      0.3096     |      0.2381      |      0.3132      |             0.8804            |             0.9049            |             0.3286             |             1.3383             |
+|  9000 |        0.0440       |      0.1552      |         0.2127        |          0.2222         |      0.3107     |      0.2944     |      0.2385      |      0.3035      |             0.8359            |             0.9049            |             0.3171             |             1.2707             |
+| 10000 |        0.0439       |      0.1554      |         0.2133        |          0.2274         |      0.3118     |      0.2870     |      0.2385      |      0.3089      |             0.8424            |             0.9023            |             0.3187             |             1.3271             |
+
+
+
+
+
+
+
+
+
+
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/asin.h
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/asin.h	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/asin.h	(revision 16311)
@@ -0,0 +1,217 @@
+/*
+ * aasin.h
+ * The basic idea is to exploit Pade' polynomials.
+ * A lot of ideas were inspired by the cephes math library (by Stephen L. Moshier
+ * moshier@na-net.ornl.gov) as well as actual code. 
+ * The Cephes library can be found here:  http://www.netlib.org/cephes/
+ * 
+ *  Created on: Jun 23, 2012
+ *      Author: Danilo Piparo, Thomas Hauth, Vincenzo Innocente
+ */
+
+/* 
+ * VDT is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef ASIN_H_
+#define ASIN_H_
+
+#include "vdtcore_common.h"
+
+namespace vdt{
+
+namespace details{
+
+const double RX1asin = 2.967721961301243206100E-3;
+const double RX2asin = -5.634242780008963776856E-1;
+const double RX3asin = 6.968710824104713396794E0;
+const double RX4asin = -2.556901049652824852289E1;
+const double RX5asin = 2.853665548261061424989E1;
+
+const double SX1asin = -2.194779531642920639778E1;
+const double SX2asin =  1.470656354026814941758E2;
+const double SX3asin = -3.838770957603691357202E2;
+const double SX4asin = 3.424398657913078477438E2;
+
+const double PX1asin = 4.253011369004428248960E-3;
+const double PX2asin = -6.019598008014123785661E-1;
+const double PX3asin = 5.444622390564711410273E0;
+const double PX4asin = -1.626247967210700244449E1;
+const double PX5asin = 1.956261983317594739197E1;
+const double PX6asin = -8.198089802484824371615E0;
+
+const double QX1asin = -1.474091372988853791896E1;
+const double QX2asin =  7.049610280856842141659E1;
+const double QX3asin = -1.471791292232726029859E2;
+const double QX4asin = 1.395105614657485689735E2;
+const double QX5asin = -4.918853881490881290097E1;
+
+inline double getRX(const double x){
+	double rx = RX1asin;
+	rx*= x;
+	rx+= RX2asin;
+	rx*= x;    
+	rx+= RX3asin;
+	rx*= x;    
+	rx+= RX4asin;
+	rx*= x;    
+	rx+= RX5asin;
+	return rx;
+}
+inline double getSX(const double x){
+	double sx = x;
+	sx+= SX1asin;
+	sx*= x;    
+	sx+= SX2asin;
+	sx*= x;    
+	sx+= SX3asin;
+	sx*= x;    
+	sx+= SX4asin;
+	return sx;
+}
+
+inline double getPX(const double x){
+	double px = PX1asin;
+	px*= x;
+	px+= PX2asin;
+	px*= x;    
+	px+= PX3asin;
+	px*= x;    
+	px+= PX4asin;
+	px*= x;    
+	px+= PX5asin;
+	px*= x;    
+	px+= PX6asin;
+	return px;
+}
+
+inline double getQX(const double x){
+	double qx = x;
+	qx+= QX1asin;
+	qx*= x;    
+	qx+= QX2asin;
+	qx*= x;    
+	qx+= QX3asin;
+	qx*= x;    
+	qx+= QX4asin;
+	qx*= x;    
+	qx+= QX5asin;
+	return qx;
+	}
+}
+
+}
+
+namespace vdt{
+
+// asin double precision --------------------------------------------------------
+/// Double Precision asin
+inline double fast_asin(double x){	
+
+	const uint64_t sign_mask = details::getSignMask(x);
+	x = std::fabs(x);
+	const double a = x;
+	
+	
+	double zz = 1.0 - a;
+	double px = details::getRX(zz);
+	double qx = details::getSX(zz);
+
+	const double p = zz * px/qx;
+
+	zz = std::sqrt(zz+zz);
+	double z = details::PIO4 - zz;
+	zz = zz * p - details::MOREBITS;
+	z -= zz;
+	z += details::PIO4;
+	
+	if( a < 0.625 ){
+		zz = a * a;
+		px = details::getPX(zz);
+		qx = details::getQX(zz);
+		z = zz*px/qx;    
+		z = a * z + a;
+	}
+	
+
+	// Linear approx, not sooo needed but seable. Price is cheap though
+	double res = a < 1e-8? a : z ;
+        // Restore Sign	
+	return details::dpORuint64(res,sign_mask);
+
+}
+
+//------------------------------------------------------------------------------
+/// Single Precision asin
+inline float fast_asinf(float x){      
+
+
+    uint32_t flag=0;
+
+    const uint32_t sign_mask = details::getSignMask(x);
+    const float a = std::fabs(x);
+
+    float z;
+    if( a > 0.5f )
+        {
+        z = 0.5f * (1.0f - a);
+        x = sqrtf( z );
+        flag = 1;
+        }
+    else
+        {
+        x = a;
+        z = x * x;
+        }
+        
+    z = (((( 4.2163199048E-2f * z
+            + 2.4181311049E-2f) * z
+            + 4.5470025998E-2f) * z
+            + 7.4953002686E-2f) * z
+            + 1.6666752422E-1f) * z * x
+            + x;
+
+//     if( flag != 0 )
+//       {
+//       z = z + z;
+//       z = PIO2F - z;
+//       }
+
+    // No branch with the two coefficients
+            
+    float tmp = z + z;
+    tmp = details::PIO2F - tmp;
+
+    // Linear approx, not sooo needed but seable. Price is cheap though
+    float res = a < 1e-4f? a : tmp * flag + (1-flag) * z ;
+    
+    // Restore Sign 
+    return details::spORuint32(res,sign_mask);
+
+}
+
+//------------------------------------------------------------------------------
+// The cos is in this file as well
+
+inline double fast_acos( double x ){return details::PIO2  - fast_asin(x);}
+
+//------------------------------------------------------------------------------
+
+inline float fast_acosf( float x ){return details::PIO2F  - fast_asinf(x);}
+
+//------------------------------------------------------------------------------
+
+} //vdt namespace
+
+#endif /* ASIN_H_ */
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/atan.h
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/atan.h	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/atan.h	(revision 16311)
@@ -0,0 +1,163 @@
+/*
+ * atan.h
+ * The basic idea is to exploit Pade polynomials.
+ * A lot of ideas were inspired by the cephes math library (by Stephen L. Moshier
+ * moshier@na-net.ornl.gov) as well as actual code. 
+ * The Cephes library can be found here:  http://www.netlib.org/cephes/
+ * 
+ *  Created on: Jun 23, 2012
+ *      Author: Danilo Piparo, Thomas Hauth, Vincenzo Innocente
+ */
+
+/* 
+ * VDT is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef ATAN_H_
+#define ATAN_H_
+
+#include "vdtcore_common.h"
+
+namespace vdt{
+
+namespace details{
+const double T3PO8 = 2.41421356237309504880;
+const double MOREBITSO2 = MOREBITS * 0.5;
+
+inline double get_atan_px(const double x2){
+
+	const double PX1atan = -8.750608600031904122785E-1;
+	const double PX2atan = -1.615753718733365076637E1;
+	const double PX3atan = -7.500855792314704667340E1;
+	const double PX4atan = -1.228866684490136173410E2;
+	const double PX5atan = -6.485021904942025371773E1;
+
+	double px = PX1atan;
+	px *= x2;
+	px += PX2atan;
+	px *= x2;
+	px += PX3atan;
+	px *= x2;
+	px += PX4atan;
+	px *= x2;
+	px += PX5atan;
+
+	return px;
+}
+
+
+inline double get_atan_qx(const double x2){
+	const double QX1atan = 2.485846490142306297962E1;
+	const double QX2atan = 1.650270098316988542046E2;
+	const double QX3atan = 4.328810604912902668951E2;
+	const double QX4atan = 4.853903996359136964868E2;
+	const double QX5atan = 1.945506571482613964425E2;
+
+	double qx=x2;
+	qx += QX1atan;
+	qx *=x2;
+	qx += QX2atan;
+	qx *=x2;
+	qx += QX3atan;
+	qx *=x2;
+	qx += QX4atan;
+	qx *=x2;
+	qx += QX5atan;
+
+	return qx;
+}
+
+}
+
+
+
+/// Fast Atan implementation double precision
+inline double fast_atan(double x){
+
+	/* make argument positive and save the sign */
+	const uint64_t sign_mask = details::getSignMask(x);
+	x=std::fabs(x);
+
+	/* range reduction */
+	const double originalx=x;
+
+	double y = details::PIO4;
+	double factor = details::MOREBITSO2;
+	x = (x-1.0) / (x+1.0);
+
+	if( originalx > details::T3PO8 ) {
+		y = details::PIO2;
+		factor = details::MOREBITS;
+		x = -1.0 / originalx ;
+	}
+	if ( originalx <= 0.66 ) {
+		y = 0.;
+		factor = 0.;
+		x = originalx;
+	}
+
+	const double x2 = x * x;
+
+	const double px = details::get_atan_px(x2);
+	const double qx = details::get_atan_qx(x2);
+
+	//double res = y +x * x2 * px / qx + x +factor;
+
+	const double poq=px / qx;
+
+	double res = x * x2 * poq + x;
+	res+=y;
+
+	res+=factor;
+
+	return details::dpORuint64(res,sign_mask);
+}
+
+//------------------------------------------------------------------------------
+/// Fast Atan implementation single precision
+inline float fast_atanf( float xx ) {
+
+	const uint32_t sign_mask = details::getSignMask(xx);
+
+	float x= std::fabs(xx);
+	const float x0=x;
+	float y=0.0f;
+
+	/* range reduction */
+	if( x0 > 0.4142135623730950f ){ // * tan pi/8
+		x = (x0-1.0f)/(x0+1.0f);
+		y = details::PIO4F;
+	}
+	if( x0 > 2.414213562373095f ){  // tan 3pi/8
+		x = -( 1.0f/x0 );
+		y = details::PIO2F;
+	}
+
+
+	const float x2 = x * x;
+	y +=
+			((( 8.05374449538e-2f * x2
+					- 1.38776856032E-1f) * x2
+					+ 1.99777106478E-1f) * x2
+					- 3.33329491539E-1f) * x2 * x
+					+ x;
+
+	return details::spORuint32(y,sign_mask);
+}
+
+//------------------------------------------------------------------------------
+
+}// end of vdt
+
+#endif // end of atan
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/atan2.h
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/atan2.h	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/atan2.h	(revision 16311)
@@ -0,0 +1,143 @@
+/*
+ * atan2.h
+ * The basic idea is to exploit Pade polynomials.
+ * A lot of ideas were inspired by the cephes math library (by Stephen L. Moshier
+ * moshier@na-net.ornl.gov) as well as actual code.
+ * The Cephes library can be found here:  http://www.netlib.org/cephes/
+ *
+ *  Created on: Sept 20, 2012
+ *      Author: Danilo Piparo, Thomas Hauth, Vincenzo Innocente
+ */
+
+/*
+ * VDT is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef ATAN2_H_
+#define ATAN2_H_
+
+#include "vdtcore_common.h"
+#include "atan.h"
+
+namespace vdt{
+
+inline double fast_atan2( double y, double x ) {
+    // move in first octant
+    double xx = std::fabs(x);
+    double yy = std::fabs(y);
+    double tmp (0.0);
+    if (yy>xx) {
+        tmp = yy;
+        yy=xx; xx=tmp;
+        tmp=1.;
+    }
+
+    // To avoid the fpe, we protect against /0.
+    const double oneIfXXZero = (xx==0.);
+    double t=yy/(xx+oneIfXXZero);
+    double z=t;
+
+    double s = details::PIO4;
+    double factor = details::MOREBITSO2;
+    t = (t-1.0) / (t+1.0);
+
+    if( z > details::T3PO8 ) {
+        s = details::PIO2;
+        factor = details::MOREBITS;
+        t = -1.0 / z ;
+    }
+    if ( z <= 0.66 ) {
+        s = 0.;
+        factor = 0.;
+        t = z;
+    }
+
+    const double t2 = t * t;
+
+    const double px = details::get_atan_px(t2);
+    const double qx = details::get_atan_qx(t2);
+
+    //double res = y +x * x2 * px / qx + x +factor;
+
+    const double poq=px / qx;
+
+    double ret = t * t2 * poq + t;
+    ret+=s;
+
+    ret+=factor;
+
+    // Here we put the result to 0 if xx was 0, if not nothing happens!
+    ret*= (1.-oneIfXXZero);
+
+    // move back in place
+    if (y==0) ret=0.0;
+    if (tmp!=0) ret = details::PIO2 - ret;
+    if (x<0) ret = details::PI - ret;
+    if (y<0) ret = -ret;
+
+
+    return ret;
+}
+
+inline float fast_atan2f( float y, float x ) {
+
+    // move in first octant
+    float xx = std::fabs(x);
+    float yy = std::fabs(y);
+    float tmp (0.0f);
+    if (yy>xx) {
+        tmp = yy;
+        yy=xx; xx=tmp;
+        tmp =1.f;
+    }
+
+    // To avoid the fpe, we protect against /0.
+    const float oneIfXXZero = (xx==0.f);
+    
+    float t=yy/(xx/*+oneIfXXZero*/);
+    float z=t;
+    if( t > 0.4142135623730950f ) // * tan pi/8
+            z = (t-1.0f)/(t+1.0f);
+
+    //printf("%e %e %e %e\n",yy,xx,t,z);
+    float z2 = z * z;
+    
+    float ret =(((( 8.05374449538e-2f * z2
+                    - 1.38776856032E-1f) * z2
+                    + 1.99777106478E-1f) * z2
+                    - 3.33329491539E-1f) * z2 * z
+                    + z );
+
+    // Here we put the result to 0 if xx was 0, if not nothing happens!
+    ret*= (1.f - oneIfXXZero);
+    
+    // move back in place
+    if (y==0.f) ret=0.f;
+    if( t > 0.4142135623730950f ) ret += details::PIO4F;
+    if (tmp!=0) ret = details::PIO2F - ret;
+    if (x<0.f) ret = details::PIF - ret;
+    if (y<0.f) ret = -ret;
+
+    return ret;
+
+}
+
+
+
+//------------------------------------------------------------------------------
+
+} // end namespace vdt
+
+
+#endif
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/cos.h
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/cos.h	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/cos.h	(revision 16311)
@@ -0,0 +1,32 @@
+/*
+ * cos.h
+ * The basic idea is to exploit Pade polynomials.
+ * A lot of ideas were inspired by the cephes math library (by Stephen L. Moshier
+ * moshier@na-net.ornl.gov) as well as actual code. 
+ * The Cephes library can be found here:  http://www.netlib.org/cephes/
+ * 
+ *  Created on: Jun 23, 2012
+ *      Author: Danilo Piparo, Thomas Hauth, Vincenzo Innocente
+ */
+
+#ifndef COS_H_
+#define COS_H_
+
+#include "sincos.h"
+
+namespace vdt{
+
+// Cos double precision --------------------------------------------------------
+
+/// Double precision cosine: just call sincos.
+inline double fast_cos(double x){double s,c;fast_sincos(x,s,c);return c;}
+
+//------------------------------------------------------------------------------
+
+inline float fast_cosf(float x){float s,c;fast_sincosf(x,s,c);return c;}
+
+//------------------------------------------------------------------------------
+
+} //vdt namespace
+
+#endif /* COS_H_ */
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/exp.h
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/exp.h	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/exp.h	(revision 16311)
@@ -0,0 +1,157 @@
+/*
+ * exp.h
+ * The basic idea is to exploit Pade polynomials.
+ * A lot of ideas were inspired by the cephes math library (by Stephen L. Moshier
+ * moshier@na-net.ornl.gov) as well as actual code. 
+ * The Cephes library can be found here:  http://www.netlib.org/cephes/
+ * 
+ *  Created on: Jun 23, 2012
+ *      Author: Danilo Piparo, Thomas Hauth, Vincenzo Innocente
+ */
+
+/* 
+ * VDT is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _VDT_EXP_
+#define _VDT_EXP_
+
+#include "vdtcore_common.h"
+#include <limits>
+
+namespace vdt{
+
+namespace details{
+  
+  const double EXP_LIMIT = 708;
+
+  const double PX1exp = 1.26177193074810590878E-4;
+  const double PX2exp = 3.02994407707441961300E-2;
+  const double PX3exp = 9.99999999999999999910E-1;
+  const double QX1exp = 3.00198505138664455042E-6;
+  const double QX2exp = 2.52448340349684104192E-3;
+  const double QX3exp = 2.27265548208155028766E-1;
+  const double QX4exp = 2.00000000000000000009E0;
+
+  const double LOG2E = 1.4426950408889634073599; // 1/log(2)
+
+  const float MAXLOGF = 88.72283905206835f;
+  const float MINLOGF = -88.f;
+
+  const float C1F =   0.693359375f;
+  const float C2F =  -2.12194440e-4f;
+
+  const float PX1expf = 1.9875691500E-4f;
+  const float PX2expf =1.3981999507E-3f;
+  const float PX3expf =8.3334519073E-3f;
+  const float PX4expf =4.1665795894E-2f;
+  const float PX5expf =1.6666665459E-1f;
+  const float PX6expf =5.0000001201E-1f;
+
+  const float LOG2EF = 1.44269504088896341f;
+
+}
+
+// Exp double precision --------------------------------------------------------
+
+
+/// Exponential Function double precision
+inline double fast_exp(double initial_x){
+
+    double x = initial_x;
+    double px=details::fpfloor(details::LOG2E * x +0.5);
+ 
+    const int32_t n = int32_t(px);
+
+    x -= px * 6.93145751953125E-1;
+    x -= px * 1.42860682030941723212E-6;
+
+    const double xx = x * x;
+
+    // px = x * P(x**2).
+    px = details::PX1exp;
+    px *= xx;
+    px += details::PX2exp;
+    px *= xx;
+    px += details::PX3exp;
+    px *= x;
+
+    // Evaluate Q(x**2).
+    double qx = details::QX1exp;
+    qx *= xx;
+    qx += details::QX2exp;
+    qx *= xx;
+    qx += details::QX3exp;
+    qx *= xx;
+    qx += details::QX4exp;
+
+    // e**x = 1 + 2x P(x**2)/( Q(x**2) - P(x**2) )
+    x = px / (qx - px);
+    x = 1.0 + 2.0 * x;
+
+    // Build 2^n in double.
+    x *= details::uint642dp(( ((uint64_t)n) +1023)<<52);
+
+    if (initial_x > details::EXP_LIMIT)
+            x = std::numeric_limits<double>::infinity();
+    if (initial_x < -details::EXP_LIMIT)
+            x = 0.;
+
+    return x;
+    
+}
+
+// Exp single precision --------------------------------------------------------
+
+/// Exponential Function single precision
+inline float fast_expf(float initial_x) {
+	
+    float x = initial_x;
+
+    float z = details::fpfloor( details::LOG2EF * x +0.5f ); /* floor() truncates toward -infinity. */
+
+    x -= z * details::C1F;
+    x -= z * details::C2F;
+    const int32_t n = int32_t ( z );
+
+    const float x2 = x * x;
+
+    z = x*details::PX1expf;
+    z += details::PX2expf;
+    z *= x;
+    z += details::PX3expf;
+    z *= x;
+    z += details::PX4expf;
+    z *= x;
+    z += details::PX5expf;
+    z *= x;
+    z += details::PX6expf;
+    z *= x2;
+    z += x + 1.0f;
+
+    /* multiply by power of 2 */
+    z *=  details::uint322sp((n+0x7f)<<23);
+
+    if (initial_x > details::MAXLOGF) z=std::numeric_limits<float>::infinity();
+    if (initial_x < details::MINLOGF) z=0.f;
+
+    return z;
+
+  }
+
+//------------------------------------------------------------------------------
+
+} // end namespace vdt
+
+#endif
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/inv.h
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/inv.h	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/inv.h	(revision 16311)
@@ -0,0 +1,92 @@
+/*
+ * inv.h
+ * An experiment: implement division with the square fo the approximate 
+ * inverse square root.
+ * In other words one transforms a shift, multiplications and sums into a 
+ * sqrt.
+ * 
+ *  Created on: Jun 24, 2012
+ *      Author: Danilo Piparo, Thomas Hauth, Vincenzo Innocente
+ * 
+ * VDT is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef INV_H_
+#define INV_H_
+
+#include "vdtcore_common.h"
+#include "sqrt.h"
+#include <cmath>
+#include <limits>
+
+namespace vdt{
+
+//------------------------------------------------------------------------------
+
+/// General implementation of the inversion
+inline double fast_inv_general(double x, const uint32_t isqrt_iterations) {  
+  const uint64_t sign_mask = details::getSignMask(x);
+  const double sqrt_one_over_x = fast_isqrt_general(std::fabs(x),
+                                                   isqrt_iterations);
+  return sqrt_one_over_x*(details::dpORuint64(sqrt_one_over_x , sign_mask ));
+}
+
+//------------------------------------------------------------------------------
+
+/// Four iterations inversion
+inline double fast_inv(double x) {return fast_inv_general(x,4);}
+
+//------------------------------------------------------------------------------
+
+/// Three iterations
+inline double fast_approx_inv(double x) {return fast_inv_general(x,3);}
+
+//------------------------------------------------------------------------------
+
+/// For comparisons
+inline double inv (double x) {return 1./x;}
+
+//------------------------------------------------------------------------------
+// Single precision          
+
+
+
+/// General implementation of the inversion
+inline float fast_invf_general(float x, const uint32_t isqrt_iterations) { 
+  const uint32_t sign_mask = details::getSignMask(x);
+  const float sqrt_one_over_x = fast_isqrtf_general(std::fabs(x),
+                                                   isqrt_iterations);
+  return sqrt_one_over_x*(details::spORuint32(sqrt_one_over_x , sign_mask ));
+}
+
+//------------------------------------------------------------------------------
+
+/// Two iterations
+inline float fast_invf(float x) {return fast_invf_general(x,2);}
+
+//------------------------------------------------------------------------------
+
+/// One iterations
+inline float fast_approx_invf(float x) {return fast_invf_general(x,1);}
+
+//------------------------------------------------------------------------------
+
+/// For comparisons
+inline float invf (float x) {return 1.f/x;}
+
+//------------------------------------------------------------------------------
+
+} // end namespace vdt
+
+#endif /* INV_H_ */
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/log.h
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/log.h	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/log.h	(revision 16311)
@@ -0,0 +1,207 @@
+/*
+ * log.h
+ * The basic idea is to exploit Pade polynomials.
+ * A lot of ideas were inspired by the cephes math library (by Stephen L. Moshier
+ * moshier@na-net.ornl.gov) as well as actual code. 
+ * The Cephes library can be found here:  http://www.netlib.org/cephes/
+ * 
+ *  Created on: Jun 23, 2012
+ *      Author: Danilo Piparo, Thomas Hauth, Vincenzo Innocente
+ */
+
+/* 
+ * VDT is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LOG_H_
+#define LOG_H_
+
+#include "vdtcore_common.h"
+#include <limits>
+
+namespace vdt{
+
+// local namespace for the constants/functions which are necessary only here
+namespace details{
+
+const double LOG_UPPER_LIMIT = 1e307;
+const double LOG_LOWER_LIMIT = 0;
+
+const double SQRTH = 0.70710678118654752440;
+
+inline double get_log_px(const double x){
+	const double PX1log = 1.01875663804580931796E-4;
+	const double PX2log = 4.97494994976747001425E-1;
+	const double PX3log = 4.70579119878881725854E0;
+	const double PX4log = 1.44989225341610930846E1;
+	const double PX5log = 1.79368678507819816313E1;
+	const double PX6log = 7.70838733755885391666E0;
+
+	double px = PX1log;
+	px *= x;
+	px += PX2log;
+	px *= x;
+	px += PX3log;
+	px *= x;
+	px += PX4log;
+	px *= x;
+	px += PX5log;
+	px *= x;
+	px += PX6log;
+	return px;
+
+}
+
+inline double get_log_qx(const double x){
+	const double QX1log = 1.12873587189167450590E1;
+	const double QX2log = 4.52279145837532221105E1;
+	const double QX3log = 8.29875266912776603211E1;
+	const double QX4log = 7.11544750618563894466E1;
+	const double QX5log = 2.31251620126765340583E1;
+
+	double qx = x;
+	qx += QX1log;
+	qx *=x;
+	qx += QX2log;
+	qx *=x;
+	qx += QX3log;
+	qx *=x;
+	qx += QX4log;
+	qx *=x;
+	qx += QX5log;
+	return qx;
+}
+
+}
+
+// Log double precision --------------------------------------------------------
+inline double fast_log(double x){
+
+	const double original_x = x;
+
+	/* separate mantissa from exponent */
+	double fe;
+	x = details::getMantExponent(x,fe);
+
+	// blending
+	x > details::SQRTH? fe+=1. : x+=x ;
+	x -= 1.0;
+
+	/* rational form */
+	double px =  details::get_log_px(x);
+
+	//for the final formula
+	const double x2 = x*x;
+	px *= x;
+	px *= x2;
+
+	const double qx = details::get_log_qx(x);
+
+	double res = px / qx ;
+
+	res -= fe * 2.121944400546905827679e-4;
+	res -= 0.5 * x2  ;
+
+	res = x + res;
+	res += fe * 0.693359375;
+
+	if (original_x > details::LOG_UPPER_LIMIT)
+		res = std::numeric_limits<double>::infinity();
+	if (original_x < details::LOG_LOWER_LIMIT) // THIS IS NAN!
+		res =  - std::numeric_limits<double>::quiet_NaN();
+
+	return res;
+
+}
+
+// Log single precision --------------------------------------------------------
+
+
+
+namespace details{
+
+const float LOGF_UPPER_LIMIT = MAXNUMF;
+const float LOGF_LOWER_LIMIT = 0;
+
+const float PX1logf = 7.0376836292E-2f;
+const float PX2logf	= -1.1514610310E-1f;
+const float PX3logf	= 1.1676998740E-1f;
+const float PX4logf	= -1.2420140846E-1f;
+const float PX5logf	= 1.4249322787E-1f;
+const float PX6logf	= -1.6668057665E-1f;
+const float PX7logf	= 2.0000714765E-1f;
+const float PX8logf	= -2.4999993993E-1f;
+const float PX9logf	= 3.3333331174E-1f;
+
+inline float get_log_poly(const float x){
+	float y = x*PX1logf;
+	y += PX2logf;
+	y *= x;
+	y += PX3logf;
+	y *= x;
+	y += PX4logf;
+	y *= x;
+	y += PX5logf;
+	y *= x;
+	y += PX6logf;
+	y *= x;
+	y += PX7logf;
+	y *= x;
+	y += PX8logf;
+	y *= x;
+	y += PX9logf;
+	return y;
+}
+
+const float SQRTHF = 0.707106781186547524f;
+
+}
+
+// Log single precision --------------------------------------------------------
+inline float fast_logf( float x ) {
+
+	const float original_x = x;
+
+	float fe;
+	x = details::getMantExponentf( x, fe);
+
+	x > details::SQRTHF? fe+=1.f : x+=x ;
+	x -= 1.0f;
+
+	const float x2 = x*x;
+
+	float res = details::get_log_poly(x);
+	res *= x2*x;
+
+	res += -2.12194440e-4f * fe;
+	res +=  -0.5f * x2;
+
+	res= x + res;
+
+	res += 0.693359375f * fe;
+
+	if (original_x > details::LOGF_UPPER_LIMIT)
+		res = std::numeric_limits<float>::infinity();
+	if (original_x < details::LOGF_LOWER_LIMIT)
+		res = -std::numeric_limits<float>::quiet_NaN();
+
+	return res;
+}
+
+
+//------------------------------------------------------------------------------
+
+} //vdt namespace
+
+#endif /* LOG_H_ */
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/sin.h
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/sin.h	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/sin.h	(revision 16311)
@@ -0,0 +1,48 @@
+/*
+ * cos.h
+ * The basic idea is to exploit Pade polynomials.
+ * A lot of ideas were inspired by the cephes math library (by Stephen L. Moshier
+ * moshier@na-net.ornl.gov) as well as actual code. 
+ * The Cephes library can be found here:  http://www.netlib.org/cephes/
+ * 
+ *  Created on: Jun 23, 2012
+ *      Author: Danilo Piparo, Thomas Hauth, Vincenzo Innocente
+ */
+
+/* 
+ * VDT is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef SIN_H_
+#define SIN_H_
+
+#include "sincos.h"
+
+namespace vdt{
+
+// Sin double precision --------------------------------------------------------
+
+/// Double precision sine: just call sincos.
+inline double fast_sin(double x){double s,c;fast_sincos(x,s,c);return s;}
+
+//------------------------------------------------------------------------------
+
+inline float fast_sinf(float x){float s,c;fast_sincosf(x,s,c);return s;}
+
+//------------------------------------------------------------------------------
+
+
+} //vdt namespace
+
+#endif /* SIN_H_ */
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/sincos.h
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/sincos.h	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/sincos.h	(revision 16311)
@@ -0,0 +1,238 @@
+/*
+ * sincos_common.h
+ * The basic idea is to exploit Pade polynomials.
+ * A lot of ideas were inspired by the cephes math library (by Stephen L. Moshier
+ * moshier@na-net.ornl.gov) as well as actual code. 
+ * The Cephes library can be found here:  http://www.netlib.org/cephes/
+ * 
+ *  Created on: Jun 23, 2012
+ *      Author: Danilo Piparo, Thomas Hauth, Vincenzo Innocente
+ */
+
+/* 
+ * VDT is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "vdtcore_common.h"
+#include <cmath>
+#include <limits>
+
+#ifndef SINCOS_COMMON_H_
+#define SINCOS_COMMON_H_
+
+namespace vdt{
+
+namespace details{
+
+// double precision constants
+
+const double DP1sc = 7.85398125648498535156E-1;
+const double DP2sc = 3.77489470793079817668E-8;
+const double DP3sc = 2.69515142907905952645E-15;
+
+const double C1sin = 1.58962301576546568060E-10;
+const double C2sin =-2.50507477628578072866E-8;
+const double C3sin = 2.75573136213857245213E-6;
+const double C4sin =-1.98412698295895385996E-4;
+const double C5sin = 8.33333333332211858878E-3;
+const double C6sin =-1.66666666666666307295E-1;
+
+const double C1cos =-1.13585365213876817300E-11;
+const double C2cos = 2.08757008419747316778E-9;
+const double C3cos =-2.75573141792967388112E-7;
+const double C4cos = 2.48015872888517045348E-5;
+const double C5cos =-1.38888888888730564116E-3;
+const double C6cos = 4.16666666666665929218E-2;
+
+const double DP1 = 7.853981554508209228515625E-1;
+const double DP2 = 7.94662735614792836714E-9;
+const double DP3 = 3.06161699786838294307E-17;
+
+// single precision constants 
+
+const float DP1F = 0.78515625;
+const float DP2F = 2.4187564849853515625e-4;
+const float DP3F = 3.77489497744594108e-8;
+
+const float T24M1 = 16777215.;
+
+//------------------------------------------------------------------------------
+
+inline double get_sin_px(const double x){
+	double px=C1sin;
+	px *= x;
+	px += C2sin;
+	px *= x;
+	px += C3sin;
+	px *= x;
+	px += C4sin;
+	px *= x;
+	px += C5sin;
+	px *= x;
+	px += C6sin;
+	return px;
+}
+
+//------------------------------------------------------------------------------
+
+inline double get_cos_px(const double x){
+	double px=C1cos;
+	px *= x;
+	px += C2cos;
+	px *= x;
+	px += C3cos;
+	px *= x;
+	px += C4cos;
+	px *= x;
+	px += C5cos;
+	px *= x;
+	px += C6cos;
+	return px;
+}
+
+
+//------------------------------------------------------------------------------
+/// Reduce to 0 to 45
+inline double reduce2quadrant(double x, int32_t& quad) {
+
+    x = fabs(x);
+    quad = int (ONEOPIO4 * x); // always positive, so (int) == std::floor
+    quad = (quad+1) & (~1);    
+    const double y = double (quad);
+    // Extended precision modular arithmetic
+    return ((x - y * DP1) - y * DP2) - y * DP3;
+  }
+
+//------------------------------------------------------------------------------
+/// Sincos only for -45deg < x < 45deg
+inline void fast_sincos_m45_45( const double z, double & s, double &c ) {
+
+    double zz = z * z;    
+    s = z  +  z * zz * get_sin_px(zz);                
+    c = 1.0 - zz * .5 + zz * zz * get_cos_px(zz);
+  }
+
+
+//------------------------------------------------------------------------------
+
+} // End namespace details
+
+/// Double precision sincos
+inline void fast_sincos( const double xx, double & s, double &c ) {
+    // I have to use doubles to make it vectorise...
+
+    int j;
+    double x = details::reduce2quadrant(xx,j);
+    const double signS = (j&4); 
+
+    j-=2;
+
+    const double signC = (j&4);
+    const double poly = j&2;
+
+    details::fast_sincos_m45_45(x,s,c);
+    
+    //swap
+    if( poly==0 ) {
+      const double tmp = c;
+      c=s; 
+      s=tmp;
+    }
+
+    if(signC == 0.) 
+      c = -c;
+    if(signS != 0.) 
+      s = -s;
+    if (xx < 0.)  
+      s = -s;
+
+  }
+
+
+// Single precision functions
+
+namespace details {
+//------------------------------------------------------------------------------
+/// Reduce to 0 to 45
+inline float reduce2quadrant(float x, int & quad) {
+    /* make argument positive */
+    x = fabs(x);
+
+    quad = int (ONEOPIO4F * x); /* integer part of x/PIO4 */
+
+    quad = (quad+1) & (~1);
+    const float y = float(quad);
+    // quad &=4;
+    // Extended precision modular arithmetic
+    return ((x - y * DP1F) - y * DP2F) - y * DP3F;
+  }
+  
+  
+//------------------------------------------------------------------------------
+
+
+
+/// Sincos only for -45deg < x < 45deg
+inline void fast_sincosf_m45_45( const float x, float & s, float &c ) {
+
+    float z = x * x;
+
+    s = (((-1.9515295891E-4f * z
+       + 8.3321608736E-3f) * z
+      - 1.6666654611E-1f) * z * x)
+      + x;
+
+    c = ((  2.443315711809948E-005f * z
+        - 1.388731625493765E-003f) * z
+     + 4.166664568298827E-002f) * z * z
+      - 0.5f * z + 1.0f;
+  }
+
+//------------------------------------------------------------------------------
+
+} // end details namespace
+
+/// Single precision sincos
+inline void fast_sincosf( const float xx, float & s, float &c ) {
+	
+
+    int j;
+    const float x = details::reduce2quadrant(xx,j);
+    int signS = (j&4); 
+
+    j-=2;
+
+    const int signC = (j&4);
+    const int poly = j&2;
+
+    float ls,lc;
+    details::fast_sincosf_m45_45(x,ls,lc);
+
+    //swap
+    if( poly==0 ) {
+      const float tmp = lc;
+      lc=ls; ls=tmp;
+    }
+
+    if(signC == 0) lc = -lc;
+    if(signS != 0) ls = -ls;
+    if (xx<0)  ls = -ls;
+    c=lc;
+    s=ls;
+  }
+
+
+} // end namespace vdt
+
+#endif 
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/sqrt.h
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/sqrt.h	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/sqrt.h	(revision 16311)
@@ -0,0 +1,99 @@
+/*
+ * sqrt.h
+ * Implementations born on the Quake 3 fast inverse square root 
+ * function.
+ * http://en.wikipedia.org/wiki/Fast_inverse_square_root
+ * 
+ *  Created on: Jun 24, 2012
+ *      Author: Danilo Piparo, Thomas Hauth, Vincenzo Innocente
+ */
+
+/* 
+ * VDT is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef SQRT_H_
+#define SQRT_H_
+
+#include "vdtcore_common.h"
+
+namespace vdt{
+
+//------------------------------------------------------------------------------
+
+
+/// Sqrt implmentation from Quake3
+inline double fast_isqrt_general(double x, const uint32_t ISQRT_ITERATIONS) {
+
+  const double threehalfs = 1.5;
+  const double x2 = x * 0.5;
+  double y  = x;
+  uint64_t i  = details::dp2uint64(y);
+  // Evil!
+  i  = 0x5fe6eb50c7aa19f9ULL  - ( i >> 1 );
+  y  = details::uint642dp(i);
+  for (uint32_t j=0;j<ISQRT_ITERATIONS;++j)
+      y *= threehalfs - ( x2 * y * y ) ;
+
+  return y;
+}
+
+//------------------------------------------------------------------------------
+
+/// Four iterations
+inline double fast_isqrt(double x) {return fast_isqrt_general(x,4);}
+
+/// Three iterations
+inline double fast_approx_isqrt(double x) {return fast_isqrt_general(x,3);}
+
+//------------------------------------------------------------------------------
+
+/// For comparisons
+inline double isqrt (double x) {return 1./std::sqrt(x);}
+
+//------------------------------------------------------------------------------
+
+/// Sqrt implmentation from Quake3
+inline float fast_isqrtf_general(float x, const uint32_t ISQRT_ITERATIONS) {
+
+	const float threehalfs = 1.5f;
+	const float x2 = x * 0.5f;
+	float y  = x;
+	uint32_t i  = details::sp2uint32(y);
+	i  = 0x5f3759df - ( i >> 1 );
+	y  = details::uint322sp(i);
+	for (uint32_t j=0;j<ISQRT_ITERATIONS;++j)
+		y  *= ( threehalfs - ( x2 * y * y ) );
+
+	return y;
+}
+
+//------------------------------------------------------------------------------
+
+/// Two iterations
+inline float fast_isqrtf(float x) {return fast_isqrtf_general(x,2);}
+
+/// One (!) iterations
+inline float fast_approx_isqrtf(float x) {return fast_isqrtf_general(x,1);}
+
+//------------------------------------------------------------------------------
+
+/// For comparisons
+inline float isqrtf (float x) {return 1.f/std::sqrt(x);}
+
+//------------------------------------------------------------------------------
+
+} // end namespace vdt
+
+#endif /* SQRT_H_ */
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/stdwrap.h
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/stdwrap.h	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/stdwrap.h	(revision 16311)
@@ -0,0 +1,30 @@
+#ifndef _VDT_STD_H_
+#define _VDT_STD_H_
+
+#include <cmath>
+
+// wrapper around std function just to benefit of naming
+// to be used in vectorized wrappers
+
+namespace vdt {
+  
+  template<typename T>
+  inline T fast_sqrt(T x) { return std::sqrt(x); }
+
+  template<typename T>
+  inline T fast_div(T x,T y) { return x/y; }
+
+  template<typename T>
+  inline T fast_fma(T x,T y, T z) { return x*y+z; }
+
+  // correclty rounded
+  template<typename T>
+  inline T fast_fmac(T x, T y, T z) { return std::fma(x,y,z); }
+  
+  template<typename T>
+  inline T fast_pow(T x, T y) { return std::pow(x, y); }
+
+  template<typename T>
+  inline T fast_round(T x) { return std::round(x); }
+}
+#endif
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/tan.h
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/tan.h	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/tan.h	(revision 16311)
@@ -0,0 +1,171 @@
+/*
+ * tan.h
+ * The basic idea is to exploit Pade polynomials.
+ * A lot of ideas were inspired by the cephes math library (by Stephen L. Moshier
+ * moshier@na-net.ornl.gov) as well as actual code. 
+ * The Cephes library can be found here:  http://www.netlib.org/cephes/
+ * 
+ *  Created on: Jun 23, 2012
+ *      Author: Danilo Piparo, Thomas Hauth, Vincenzo Innocente
+ */
+
+/* 
+ * VDT is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef TAN_H_
+#define TAN_H_
+
+#include "vdtcore_common.h"
+#include "sincos.h"
+
+namespace vdt{
+
+
+namespace details{
+
+const double PX1tan=-1.30936939181383777646E4;
+const double PX2tan=1.15351664838587416140E6;
+const double PX3tan=-1.79565251976484877988E7;
+
+const double QX1tan = 1.36812963470692954678E4;
+const double QX2tan = -1.32089234440210967447E6;
+const double QX3tan = 2.50083801823357915839E7;
+const double QX4tan = -5.38695755929454629881E7;
+
+const double DP1tan = 7.853981554508209228515625E-1;
+const double DP2tan = 7.94662735614792836714E-9;
+const double DP3tan = 3.06161699786838294307E-17;
+
+const float DP1Ftan = 0.78515625;
+const float DP2Ftan = 2.4187564849853515625e-4;
+const float DP3Ftan = 3.77489497744594108e-8;
+
+
+//------------------------------------------------------------------------------
+/// Reduce to -45 to 45
+inline double reduce2quadranttan(double x, int32_t& quad) {
+
+    x = fabs(x);
+    quad = int( ONEOPIO4 * x ); // always positive, so (int) == std::floor
+    quad = (quad+1) & (~1);
+    const double y = quad;
+    // Extended precision modular arithmetic
+    return ((x - y * DP1tan) - y * DP2tan) - y * DP3tan;
+  }
+
+//------------------------------------------------------------------------------
+/// Reduce to -45 to 45
+inline float reduce2quadranttan(float x, int32_t& quad) {
+
+    x = fabs(x);
+    quad = int( ONEOPIO4F * x ); // always positive, so (int) == std::floor
+    quad = (quad+1) & (~1);
+    const float y = quad;
+    // Extended precision modular arithmetic
+    return ((x - y * DP1Ftan) - y * DP2Ftan) - y * DP3Ftan;
+  }
+
+}
+
+//------------------------------------------------------------------------------
+/// Double precision tangent implementation
+inline double fast_tan(double x){
+
+    const uint64_t sign_mask = details::getSignMask(x);
+
+    int32_t quad =0;
+    const double z=details::reduce2quadranttan(x,quad);
+
+    const double zz = z * z;
+
+    double res=z;
+
+    if( zz > 1.0e-14 ){
+        double px = details::PX1tan;
+        px *= zz;
+        px += details::PX2tan;
+        px *= zz;
+        px += details::PX3tan;
+
+        double qx=zz;
+        qx += details::QX1tan;
+        qx *=zz; 
+        qx += details::QX2tan;
+        qx *=zz;
+        qx += details::QX3tan;
+        qx *=zz;
+        qx += details::QX4tan;
+
+        res = z + z * zz * px / qx;
+    }
+
+    // A no branching way to say: if j&2 res = -1/res. You can!!!
+    quad &=2;
+    quad >>=1;
+    const int32_t alt = quad^1;
+    // Avoid fpe generated by 1/0 if res is 0
+    const double zeroIfXNonZero = (x==0.);
+    res += zeroIfXNonZero;
+    res = quad * (-1./res) + alt * res; // one coeff is one and one is 0!
+
+    // Again, return 0 if res==0, the correct result otherwhise
+    return details::dpXORuint64(res,sign_mask) * (1.-zeroIfXNonZero);
+
+}
+
+// Single precision ------------------------------------------------------------
+
+inline float fast_tanf(float x){
+    const uint32_t sign_mask = details::getSignMask(x);
+
+    int32_t quad =0;
+    const float z=details::reduce2quadranttan(x,quad);
+
+    const float zz = z * z;
+
+    float res=z;
+
+    if( zz > 1.0e-14f ){
+      res =
+        ((((( 9.38540185543E-3f * zz
+        + 3.11992232697E-3f) * zz
+        + 2.44301354525E-2f) * zz
+        + 5.34112807005E-2f) * zz
+        + 1.33387994085E-1f) * zz
+        + 3.33331568548E-1f) * zz * z
+        + z;
+    }
+
+    // A no branching way to say: if j&2 res = -1/res. You can!!!
+    quad &=2;
+    quad >>=1;
+    const int32_t alt = quad^1;
+    // Avoid fpe generated by 1/0 if res is 0
+    const float zeroIfXNonZero = (x==0.f);
+    res += zeroIfXNonZero;
+    res = quad * (-1.f/res) + alt * res; // one coeff is one and one is 0!
+
+    return details::spXORuint32(res,sign_mask) * (1.f-zeroIfXNonZero);
+
+}
+
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+
+} //vdt namespace
+
+
+#endif /* TAN_H_ */
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/tanh.h
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/tanh.h	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/tanh.h	(revision 16311)
@@ -0,0 +1,77 @@
+/*
+ * tanh.h
+ * The basic idea is to exploit Pade polynomials.
+ * Implemented by Manuel Schiller for LHCb.
+ * 
+ *  Created on: Sep 23, 2017
+ *      Author: Paul Seyfert, Manuel Schiller
+ */
+
+/* 
+ * VDT is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef TANH_H_
+#define TANH_H_
+
+#include "vdtcore_common.h"
+
+namespace vdt{
+
+
+
+
+/// Fast tanh implementation double precision
+inline double fast_tanh(double x){
+	// for very large |x| > 20, tanh(x) is x/|x| anyway (at least to double
+	// precision)
+	//
+	// NB: branch-free code takes longer to execute
+	if (std::abs(x) > 20.) return std::copysign(1., x);
+	// strategy for large arguments: tanh(2x) = 2 tanh(x)/(1 + tanh^2(x))
+	// idea is to use this "argument halving" a couple of times, and use a
+	// very short PadÃ© approximation for the rest of the way
+	const auto xx = x * 0.125;
+	const auto xx2 = xx * xx;
+	const auto numer = 135135 + xx2 * (17325 + xx2 * ( 378 + xx2 *  1));
+	const auto denom = 135135 + xx2 * (62370 + xx2 * (3150 + xx2 * 28));
+
+	auto tanh = xx * numer / denom;
+	tanh = 2 * tanh / (tanh * tanh + 1);
+	tanh = 2 * tanh / (tanh * tanh + 1);
+	return 2 * tanh / (tanh * tanh + 1);
+}
+
+//------------------------------------------------------------------------------
+/// Fast tanh implementation single precision
+inline float fast_tanhf( float x ) {
+	// same strategy as double version above, but even shorter PadÃ©
+	// approximation is sufficient for float
+	//
+	// NB: branch-free code takes longer to execute
+	if (std::abs(x) > 9.1f) return std::copysign(1.f, x);
+	const auto xx = x * 0.125f;
+	const auto xx2 = xx * xx;
+	auto tanh = xx * (xx2 + 15) / (6 * xx2 + 15);
+	tanh = 2 * tanh / (tanh * tanh + 1);
+	tanh = 2 * tanh / (tanh * tanh + 1);
+	return 2 * tanh / (tanh * tanh + 1);
+}
+
+//------------------------------------------------------------------------------
+// Vector signatures
+
+}// end of vdt
+
+#endif // end of tanh
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/vdtMath.h
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/vdtMath.h	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/vdtMath.h	(revision 16311)
@@ -0,0 +1,23 @@
+#ifndef _VDT_MATH_H_
+#define _VDT_MATH_H_
+
+// Include all the VDT fucntions
+
+#include "sin.h"
+#include "asin.h"
+
+#include "cos.h"
+
+#include "tan.h"
+#include "tanh.h"
+#include "atan.h"
+#include "atan2.h"
+
+#include "exp.h"
+#include "log.h"
+
+#include "sqrt.h"
+
+#include "inv.h"
+
+#endif
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/vdtcore_common.h
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/vdtcore_common.h	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/lib/vdt/vdtcore_common.h	(revision 16311)
@@ -0,0 +1,243 @@
+/*
+ * vdtcore_common.h
+ * Common functions for the vdt routines.
+ * The basic idea is to exploit Pade polynomials.
+ * A lot of ideas were inspired by the cephes math library (by Stephen L. Moshier
+ * moshier@na-net.ornl.gov) as well as actual code for the exp, log, sin, cos, 
+ * tan, asin, acos and atan functions. The Cephes library can be found here:
+ * http://www.netlib.org/cephes/
+ * 
+ *  Created on: Jun 23, 2012
+ *      Author: Danilo Piparo, Thomas Hauth, Vincenzo Innocente
+ */
+
+/* 
+ * VDT is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef VDTCOMMON_H_
+#define VDTCOMMON_H_
+
+#include <cinttypes>
+#include <cmath>
+
+namespace vdt{
+
+namespace details{
+
+// Constants
+const double TWOPI = 2.*M_PI;
+const double PI = M_PI;
+const double PIO2 = M_PI_2;
+const double PIO4 = M_PI_4;
+const double ONEOPIO4 = 4./M_PI;
+
+const float TWOPIF = 2.*M_PI;
+const float PIF = M_PI;
+const float PIO2F = M_PI_2;
+const float PIO4F = M_PI_4;
+const float ONEOPIO4F = 4./M_PI;
+
+const double MOREBITS = 6.123233995736765886130E-17;
+
+
+const float MAXNUMF = 3.4028234663852885981170418348451692544e38f;
+
+//------------------------------------------------------------------------------
+
+/// Used to switch between different type of interpretations of the data (64 bits)
+union ieee754{
+	inline ieee754 () {};
+	inline ieee754 (double thed) {d=thed;};
+	inline ieee754 (uint64_t thell) {ll=thell;};
+	inline ieee754 (float thef) {f[0]=thef;};
+	inline ieee754 (uint32_t thei) {i[0]=thei;};
+  double d;
+  float f[2];
+  uint32_t i[2];
+  uint64_t ll;
+  uint16_t s[4];
+};
+
+//------------------------------------------------------------------------------
+
+/// Converts an unsigned long long to a double
+inline double uint642dp(uint64_t ll) {
+  ieee754 tmp;
+  tmp.ll=ll;
+  return tmp.d;
+}
+
+//------------------------------------------------------------------------------
+
+/// Converts a double to an unsigned long long
+inline uint64_t dp2uint64(double x) {
+  ieee754 tmp;
+  tmp.d=x;
+  return tmp.ll;
+}
+
+//------------------------------------------------------------------------------
+/// Makes an AND of a double and a unsigned long long
+inline double dpANDuint64(const double x, const uint64_t i ){
+  return uint642dp(dp2uint64(x) & i); 
+}
+//------------------------------------------------------------------------------
+/// Makes an OR of a double and a unsigned long long
+inline double dpORuint64(const double x, const uint64_t i ){
+  return uint642dp(dp2uint64(x) | i); 
+}
+
+/// Makes a XOR of a double and a unsigned long long
+inline double dpXORuint64(const double x, const uint64_t i ){
+  return uint642dp(dp2uint64(x) ^ i); 
+}
+
+//------------------------------------------------------------------------------
+inline uint64_t getSignMask(const double x){
+  const uint64_t mask=0x8000000000000000ULL;
+  return dp2uint64(x) & mask;
+}
+
+//------------------------------------------------------------------------------
+/// Converts an int to a float
+inline float uint322sp(int x) {
+    ieee754 tmp;
+    tmp.i[0]=x;
+    return tmp.f[0];
+  }
+
+//------------------------------------------------------------------------------
+/// Converts a float to an int
+inline uint32_t sp2uint32(float x) {
+    ieee754 tmp;
+    tmp.f[0]=x;
+    return tmp.i[0];
+  }
+
+//------------------------------------------------------------------------------
+/// Makes an AND of a float and a unsigned long
+inline float spANDuint32(const float x, const uint32_t i ){
+  return uint322sp(sp2uint32(x) & i); 
+}
+//------------------------------------------------------------------------------
+/// Makes an OR of a float and a unsigned long
+inline float spORuint32(const float x, const uint32_t i ){
+  return uint322sp(sp2uint32(x) | i); 
+}
+
+//------------------------------------------------------------------------------
+/// Makes an OR of a float and a unsigned long
+inline float spXORuint32(const float x, const uint32_t i ){
+  return uint322sp(sp2uint32(x) ^ i); 
+}
+//------------------------------------------------------------------------------
+/// Get the sign mask
+inline uint32_t getSignMask(const float x){
+  const uint32_t mask=0x80000000;
+  return sp2uint32(x) & mask;
+}
+
+//------------------------------------------------------------------------------
+/// Like frexp but vectorising and the exponent is a double.
+inline double getMantExponent(const double x, double & fe){
+
+  uint64_t n = dp2uint64(x);
+
+  // Shift to the right up to the beginning of the exponent.
+  // Then with a mask, cut off the sign bit
+  uint64_t le = (n >> 52);
+
+  // chop the head of the number: an int contains more than 11 bits (32)
+  int32_t e = le; // This is important since sums on uint64_t do not vectorise
+  fe = e-1023 ;
+
+  // This puts to 11 zeroes the exponent
+  n &=0x800FFFFFFFFFFFFFULL;
+  // build a mask which is 0.5, i.e. an exponent equal to 1022
+  // which means *2, see the above +1.
+  const uint64_t p05 = 0x3FE0000000000000ULL; //dp2uint64(0.5);
+  n |= p05;
+
+  return uint642dp(n);
+}
+
+//------------------------------------------------------------------------------
+/// Like frexp but vectorising and the exponent is a float.
+inline float getMantExponentf(const float x, float & fe){
+
+    uint32_t n = sp2uint32(x);
+    int32_t e = (n >> 23)-127;
+    fe = e;
+
+    // fractional part
+    const uint32_t p05f = 0x3f000000; // //sp2uint32(0.5);
+    n &= 0x807fffff;// ~0x7f800000;
+    n |= p05f;
+
+    return uint322sp(n);
+
+}
+
+//------------------------------------------------------------------------------
+/// Converts a fp to an int
+inline uint32_t fp2uint(float x) {
+    return sp2uint32(x);
+  }
+/// Converts a fp to an int
+inline uint64_t fp2uint(double x) {
+    return dp2uint64(x);
+  }
+/// Converts an int to fp
+inline float int2fp(uint32_t i) {
+    return uint322sp(i);
+  }
+/// Converts an int to fp
+inline double int2fp(uint64_t i) {
+    return uint642dp(i);
+  }
+
+//------------------------------------------------------------------------------
+/**
+ * A vectorisable floor implementation, not only triggered by fast-math.
+ * These functions do not distinguish between -0.0 and 0.0, so are not IEC6509 
+ * compliant for argument -0.0
+**/ 
+inline double fpfloor(const double x){
+  // no problem since exp is defined between -708 and 708. Int is enough for it!
+  int32_t ret = int32_t (x);
+  ret-=(sp2uint32(x)>>31);  
+  return ret;
+
+}
+//------------------------------------------------------------------------------
+/**
+ * A vectorisable floor implementation, not only triggered by fast-math.
+ * These functions do not distinguish between -0.0 and 0.0, so are not IEC6509 
+ * compliant for argument -0.0
+**/ 
+inline float fpfloor(const float x){
+  int32_t ret = int32_t (x);
+  ret-=(sp2uint32(x)>>31);  
+  return ret;
+
+}
+
+//------------------------------------------------------------------------------
+
+}
+
+} // end of namespace vdt
+
+#endif /* VDTCOMMON_H_ */
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/src/instruction.h
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/src/instruction.h	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/src/instruction.h	(revision 16311)
@@ -0,0 +1,45 @@
+#ifndef INSTRUCTION_H
+#define INSTRUCTION_H
+
+#include <cstdint>
+
+#include "vector_operations.h"
+
+enum OpCodes : uint8_t
+{
+    // same values as in OpCodes.cs
+    Add = 1,
+    Sub = 2,
+    Mul = 3,
+    Div = 4,
+    Sin = 5,
+    Cos = 6,
+    Tan = 7,
+    Log = 8,
+    Exp = 9,
+    Var = 18,
+    Const = 20,
+    Power = 22,
+    Root = 23,
+    Square = 28,
+    Sqrt = 29
+};
+
+struct instruction
+{
+    // from Instruction.cs
+    uint8_t opcode;
+    uint16_t narg;
+
+    int childIndex;
+
+    // from LinearInstruction.cs
+    double value;
+    double weight; // necessary for variables
+
+    // pointer to data
+    double *buf;
+    double *data;
+};
+
+#endif
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/src/interpreter.cpp
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/src/interpreter.cpp	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/src/interpreter.cpp	(revision 16311)
@@ -0,0 +1,63 @@
+#include "interpreter.h" 
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+constexpr size_t BUFSIZE = BATCHSIZE * sizeof(double);
+
+// slow (ish?)
+__declspec(dllexport) 
+double __cdecl GetValue(instruction* code, int codeLength, int row) noexcept
+{
+    return evaluate(code, codeLength, row);
+}
+
+__declspec(dllexport) 
+void __cdecl GetValues(instruction* code, int codeLength, int* rows, int totalRows, double* result) noexcept
+{
+    for (int i = 0; i < totalRows; ++i)
+    {
+        result[i] = evaluate(code, codeLength, rows[i]);
+    }
+}
+
+__declspec(dllexport)
+void __cdecl GetValuesVectorized(instruction* code, int codeLength, int* rows, int totalRows, double* __restrict result) noexcept
+{
+    double* buffer = static_cast<double*>(_aligned_malloc(codeLength * BUFSIZE, 16));
+    for (int i = 0; i < codeLength; ++i)
+    {
+        instruction& in = code[i];
+        in.buf = buffer + (i * BATCHSIZE);
+
+        if (in.opcode == OpCodes::Const)
+        {
+            load(in.buf, in.value);
+        }
+    }
+
+    int remainingRows = totalRows % BATCHSIZE;
+    int total = totalRows - remainingRows;
+
+    for (int rowIndex = 0; rowIndex < total; rowIndex += BATCHSIZE)
+    {
+        evaluate(code, codeLength, rows, rowIndex, BATCHSIZE);
+        std::memcpy(result + rowIndex, code[0].buf, BUFSIZE);
+    }
+
+    // are there any rows left?
+    if (remainingRows > 0) 
+    {
+        for (int rowIndex = total; rowIndex < totalRows; rowIndex += remainingRows)
+        {
+            evaluate(code, codeLength, rows, rowIndex, remainingRows);
+            std::memcpy(result + rowIndex, code[0].buf, remainingRows * sizeof(double));
+        }
+    }
+    _aligned_free(buffer);
+}
+
+#ifdef __cplusplus
+}
+#endif
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/src/interpreter.h
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/src/interpreter.h	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/src/interpreter.h	(revision 16311)
@@ -0,0 +1,231 @@
+#ifndef NATIVE_TREE_INTERPRETER_CLANG_H
+#define NATIVE_TREE_INTERPRETER_CLANG_H
+
+#include "vector_operations.h"
+#include "instruction.h"
+
+inline double evaluate(instruction *code, int len, int row) noexcept
+{
+    for (int i = len - 1; i >= 0; --i)
+    {
+        instruction &in = code[i];
+        switch (in.opcode)
+        {
+            case OpCodes::Var:
+                {
+                    in.value = in.weight * in.data[row];
+                    break;
+                }
+            case OpCodes::Add:
+                {
+                    in.value = code[in.childIndex].value;
+                    for (int j = 1; j < in.narg; ++j)
+                    {
+                        in.value += code[in.childIndex + j].value;
+                    }
+                    break;
+                }
+            case OpCodes::Sub:
+                {
+                    in.value = code[in.childIndex].value;
+                    for (int j = 1; j < in.narg; ++j)
+                    {
+                        in.value -= code[in.childIndex + j].value;
+                    }
+                    if (in.narg == 1)
+                    {
+                        in.value = -in.value;
+                    }
+                    break;
+                }
+            case OpCodes::Mul:
+                {
+                    in.value = code[in.childIndex].value;
+                    for (int j = 1; j < in.narg; ++j)
+                    {
+                        in.value *= code[in.childIndex + j].value;
+                    }
+                    break;
+                }
+            case OpCodes::Div:
+                {
+                    in.value = code[in.childIndex].value;
+                    for (int j = 1; j < in.narg; ++j)
+                    {
+                        in.value /= code[in.childIndex + j].value;
+                    }
+                    if (in.narg == 1)
+                    {
+                        in.value = 1 / in.value;
+                    }
+                    break;
+                }
+            case OpCodes::Exp:
+                {
+                    in.value = std::exp(code[in.childIndex].value);
+                    break;
+                }
+            case OpCodes::Log:
+                {
+                    in.value = std::log(code[in.childIndex].value);
+                    break;
+                }
+            case OpCodes::Sin:
+                {
+                    in.value = std::sin(code[in.childIndex].value);
+                    break;
+                }
+            case OpCodes::Cos:
+                {
+                    in.value = std::cos(code[in.childIndex].value);
+                    break;
+                }
+            case OpCodes::Tan:
+                {
+                    in.value = std::tan(code[in.childIndex].value);
+                    break;
+                }
+            case OpCodes::Power:
+                {
+                    double x = code[in.childIndex].value;
+                    double y = std::round(code[in.childIndex + 1].value);
+                    in.value = std::pow(x, y);
+                    break;
+                }
+            case OpCodes::Root:
+                {
+                    double x = code[in.childIndex].value;
+                    double y = std::round(code[in.childIndex + 1].value);
+                    in.value = std::pow(x, 1 / y);
+                    break;
+                }
+            case OpCodes::Sqrt:
+                {
+                    in.value = std::sqrt(code[in.childIndex].value);
+                    break;
+                }
+        }
+    }
+    return code[0].value;
+}
+
+inline void load_data(instruction &in, int* __restrict rows, int rowIndex, int batchSize) noexcept
+{
+    for (int i = 0; i < batchSize; ++i)
+    {
+        auto row = rows[rowIndex + i];
+        in.buf[i] = in.weight * in.data[row];
+    }
+}
+
+inline void evaluate(instruction* code, int len, int* __restrict rows, int rowIndex, int batchSize) noexcept
+{
+    for (int i = len - 1; i >= 0; --i)
+    {
+        instruction &in = code[i];
+        switch (in.opcode)
+        {
+            case OpCodes::Var:
+                {
+                    load_data(in, rows, rowIndex, batchSize); // buffer data
+                    break;
+                }
+            case OpCodes::Add:
+                {
+                    load(in.buf, code[in.childIndex].buf);
+                    for (int j = 1; j < in.narg; ++j)
+                    {
+                        add(in.buf, code[in.childIndex + j].buf);
+                    }
+                    break;
+                }
+            case OpCodes::Sub:
+                {
+                    if (in.narg == 1)
+                    {
+                        neg(in.buf, code[in.childIndex].buf);
+                        break;
+                    }
+                    else
+                    {
+                        load(in.buf, code[in.childIndex].buf);
+                        for (int j = 1; j < in.narg; ++j)
+                        {
+                            sub(in.buf, code[in.childIndex + j].buf);
+                        }
+                    }
+                    break;
+                }
+            case OpCodes::Mul:
+                {
+                    load(in.buf, code[in.childIndex].buf);
+                    for (int j = 1; j < in.narg; ++j)
+                    {
+                        mul(in.buf, code[in.childIndex + j].buf);
+                    }
+                    break;
+                }
+            case OpCodes::Div:
+                {
+                    if (in.narg == 1)
+                    {
+                        inv(in.buf, code[in.childIndex].buf);
+                        break;
+                    }
+                    else
+                    {
+                        load(in.buf, code[in.childIndex].buf);
+                        for (int j = 1; j < in.narg; ++j)
+                        {
+                            div(in.buf, code[in.childIndex + j].buf);
+                        }
+                    }
+                    break;
+                }
+            case OpCodes::Sin:
+                {
+                    sin(in.buf, code[in.childIndex].buf);
+                    break;
+                }
+            case OpCodes::Cos:
+                {
+                    cos(in.buf, code[in.childIndex].buf);
+                    break;
+                }
+            case OpCodes::Tan:
+                {
+                    tan(in.buf, code[in.childIndex].buf);
+                    break;
+                }
+            case OpCodes::Log:
+                {
+                    log(in.buf, code[in.childIndex].buf);
+                    break;
+                }
+            case OpCodes::Exp:
+                {
+                    exp(in.buf, code[in.childIndex].buf);
+                    break;
+                }
+            case OpCodes::Power:
+                {
+                    load(in.buf, code[in.childIndex].buf);
+                    pow(in.buf, code[in.childIndex + 1].buf);
+                    break;
+                }
+            case OpCodes::Root:
+                {
+                    load(in.buf, code[in.childIndex].buf);
+                    root(in.buf, code[in.childIndex + 1].buf);
+                    break;
+                }
+            case OpCodes::Square:
+                {
+                    square(in.buf, code[in.childIndex].buf);
+                    break;
+                }
+        }
+    }
+}
+
+#endif
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/src/vector_operations.h
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/src/vector_operations.h	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/src/vector_operations.h	(revision 16311)
@@ -0,0 +1,75 @@
+#ifndef VECTOR_OPERATIONS_H
+#define VECTOR_OPERATIONS_H
+
+#define _USE_MATH_DEFINES
+#include <cmath>
+#include <cstring>
+
+#ifdef USE_VDT
+#include "vdt/vdtMath.h"
+#include "vdt/stdwrap.h"
+#define hl_exp vdt::fast_exp
+#define hl_log vdt::fast_log
+#define hl_sin vdt::fast_sin
+#define hl_cos vdt::fast_cos
+#define hl_tan vdt::fast_tan
+#define hl_sqrt vdt::fast_sqrt
+#define hl_pow vdt::fast_pow
+#define hl_round vdt::fast_round
+#else
+#define hl_exp std::exp
+#define hl_log std::log
+#define hl_sin std::sin
+#define hl_cos std::cos
+#define hl_tan std::tan
+#define hl_sqrt std::sqrt
+#define hl_pow std::pow
+#define hl_round std::round
+#endif
+
+constexpr int BATCHSIZE = 64;
+
+#define FOR(i) for(int i = 0; i < BATCHSIZE; ++i)
+
+// When auto-vectorizing without __restrict,
+// gcc and clang check for overlap (with a bunch of integer code)
+// before running the vectorized loop
+
+// vector - vector operations
+inline void load(double* __restrict a, double const * __restrict b) noexcept { std::memcpy(a, b, BATCHSIZE * sizeof(double)); }
+inline void add(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] += b[i]; }
+inline void sub(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] -= b[i]; }
+inline void mul(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] *= b[i]; }
+inline void div(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] /= b[i]; }
+inline void exp(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = hl_exp(b[i]); }
+inline void log(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = hl_log(b[i]); }
+inline void sin(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = hl_sin(b[i]); }
+inline void cos(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = hl_cos(b[i]); }
+inline void tan(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = hl_tan(b[i]); }
+inline void sqrt(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = hl_sqrt(b[i]); }
+inline void pow(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = hl_pow(a[i], hl_round(b[i])); };
+inline void root(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = hl_pow(a[i], 1. / hl_round(b[i])); };
+inline void square(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = hl_pow(b[i], 2.); };
+inline void inv(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = 1. / b[i]; }
+inline void neg(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = -b[i]; }
+
+// vector - scalar operations
+inline void load(double* __restrict a, double s) noexcept { FOR(i) a[i] = s; }
+inline void add(double* __restrict a, double s) noexcept { FOR(i) a[i] += s; }
+inline void sub(double* __restrict a, double s) noexcept { FOR(i) a[i] -= s; }
+inline void mul(double* __restrict a, double s) noexcept { FOR(i) a[i] *= s; }
+inline void div(double* __restrict a, double s) noexcept { FOR(i) a[i] /= s; }
+
+// vector operations
+inline void neg(double* __restrict a) noexcept { FOR(i) a[i] = -a[i]; }
+inline void inv(double* __restrict a) noexcept { FOR(i) a[i] = 1. / a[i]; }
+inline void exp(double* __restrict a) noexcept { FOR(i) a[i] = hl_exp(a[i]); }
+inline void log(double* __restrict a) noexcept { FOR(i) a[i] = hl_log(a[i]); }
+inline void sin(double* __restrict a) noexcept { FOR(i) a[i] = hl_sin(a[i]); }
+inline void cos(double* __restrict a) noexcept { FOR(i) a[i] = hl_cos(a[i]); }
+inline void sqrt(double* __restrict a) noexcept { FOR(i) a[i] = hl_sqrt(a[i]); }
+inline void round(double* __restrict a) noexcept { FOR(i) a[i] = hl_round(a[i]); }
+inline void square(double* __restrict a) noexcept { FOR(i) a[i] = hl_pow(a[i], 2.); }
+
+#undef FOR
+#endif
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Netron/3.0.2672.12446/HeuristicLab.Netron-3.0.2672.12446/CustomTools/CustomPanTool.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Netron/3.0.2672.12446/HeuristicLab.Netron-3.0.2672.12446/CustomTools/CustomPanTool.cs	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Netron/3.0.2672.12446/HeuristicLab.Netron-3.0.2672.12446/CustomTools/CustomPanTool.cs	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Netron/3.0.2672.12446/HeuristicLab.Netron-3.0.2672.12446/NetronVisualization.Designer.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Netron/3.0.2672.12446/HeuristicLab.Netron-3.0.2672.12446/NetronVisualization.Designer.cs	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Netron/3.0.2672.12446/HeuristicLab.Netron-3.0.2672.12446/NetronVisualization.Designer.cs	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Netron/3.0.2672.12446/HeuristicLab.Netron-3.0.2672.12446/NetronVisualization.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Netron/3.0.2672.12446/HeuristicLab.Netron-3.0.2672.12446/NetronVisualization.cs	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Netron/3.0.2672.12446/HeuristicLab.Netron-3.0.2672.12446/NetronVisualization.cs	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Netron/3.0.2672.12446/HeuristicLab.Netron-3.0.2672.12446/Plugin.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Netron/3.0.2672.12446/HeuristicLab.Netron-3.0.2672.12446/Plugin.cs	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.Netron/3.0.2672.12446/HeuristicLab.Netron-3.0.2672.12446/Plugin.cs	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.ProtobufCS/2.4.1/HeuristicLab.ProtobufCS/Plugin.cs.frame
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.ProtobufCS/2.4.1/HeuristicLab.ProtobufCS/Plugin.cs.frame	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.ProtobufCS/2.4.1/HeuristicLab.ProtobufCS/Plugin.cs.frame	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.ProtobufCS/2.4.1/HeuristicLab.ProtobufCS/Properties/AssemblyInfo.cs.frame
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.ProtobufCS/2.4.1/HeuristicLab.ProtobufCS/Properties/AssemblyInfo.cs.frame	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.ProtobufCS/2.4.1/HeuristicLab.ProtobufCS/Properties/AssemblyInfo.cs.frame	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -32,5 +32,5 @@
 [assembly: AssemblyCompany("")]
 [assembly: AssemblyProduct("HeuristicLab")]
-[assembly: AssemblyCopyright("(c) 2002-2016 HEAL")]
+[assembly: AssemblyCopyright("(c) 2002-2018 HEAL")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/HeuristicLab.SimSharp-3.0.11/HeuristicLab.SimSharp-3.0.11.csproj
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/HeuristicLab.SimSharp-3.0.11/HeuristicLab.SimSharp-3.0.11.csproj	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/HeuristicLab.SimSharp-3.0.11/HeuristicLab.SimSharp-3.0.11.csproj	(revision 16311)
@@ -0,0 +1,128 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{5C93CAF7-AE6A-4540-95B2-5DA6761A2677}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.SimSharp</RootNamespace>
+    <AssemblyName>HeuristicLab.SimSharp-3.0.11</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Plugin.cs.frame" />
+    <Compile Include="Plugin.cs" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\..\HeuristicLab.PluginInfrastructure\3.3\HeuristicLab.PluginInfrastructure-3.3.csproj">
+      <Project>{94186a6a-5176-4402-ae83-886557b53cca}</Project>
+      <Name>HeuristicLab.PluginInfrastructure-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\SimSharp-3.0.11\SimSharp-3.0.11.csproj">
+      <Project>{9fe9c740-7859-4d01-ad07-7d4e15a6320b}</Project>
+      <Name>SimSharp-3.0.11</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="SimSharp-3.0.11 License.txt">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent Condition=" '$(OS)' == 'Windows_NT' ">
+      set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+      set ProjectDir=$(ProjectDir)
+      set SolutionDir=$(SolutionDir)
+      set Outdir=$(Outdir)
+
+      call PreBuildEvent.cmd
+    </PreBuildEvent>
+    <PreBuildEvent Condition=" '$(OS)' != 'Windows_NT' ">
+      export ProjectDir=$(ProjectDir)
+      export SolutionDir=$(SolutionDir)
+
+      $SolutionDir/PreBuildEvent.sh
+    </PreBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/HeuristicLab.SimSharp-3.0.11/Plugin.cs.frame
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/HeuristicLab.SimSharp-3.0.11/Plugin.cs.frame	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/HeuristicLab.SimSharp-3.0.11/Plugin.cs.frame	(revision 16311)
@@ -0,0 +1,31 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.SimSharp {
+  [Plugin("HeuristicLab.SimSharp", "Transport plugin for the simulation framework Sim#", "3.0.11.$WCREV$")]
+  [PluginFile("HeuristicLab.SimSharp-3.0.11.dll", PluginFileType.Assembly)]
+  [PluginFile("SimSharp-3.0.11.dll", PluginFileType.Assembly)]
+  [PluginFile("SimSharp-3.0.11 License.txt", PluginFileType.License)]
+  public class HeuristicLabSimSharpPlugin : PluginBase {
+  }
+}
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/HeuristicLab.SimSharp-3.0.11/Properties/AssemblyInfo.cs.frame
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/HeuristicLab.SimSharp-3.0.11/Properties/AssemblyInfo.cs.frame	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/HeuristicLab.SimSharp-3.0.11/Properties/AssemblyInfo.cs.frame	(revision 16311)
@@ -0,0 +1,35 @@
+﻿using System.Reflection;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.SimSharp-3.0.11")]
+[assembly: AssemblyDescription("Transport plugin for the simulation framework Sim#")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("HEAL")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2018 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("15bc80f5-e0b9-4481-bab1-289d1403f877")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.0.11.0")]
+[assembly: AssemblyFileVersion("3.0.11.$WCREV$")]
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/HeuristicLab.SimSharp-3.0.11/SimSharp-3.0.11 License.txt
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/HeuristicLab.SimSharp-3.0.11/SimSharp-3.0.11 License.txt	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/HeuristicLab.SimSharp-3.0.11/SimSharp-3.0.11 License.txt	(revision 16311)
@@ -0,0 +1,705 @@
+Sim# integrates code from a third-party "BlueRaja". Below the license from that
+third party provider as well as Sim#'s own license are given.
+Sim# also uses FastRandom from Colin Green (sharpneat@gmail.com) which is also
+licensed under the GPL. 
+
+=== License of BlueRaja's Event Queue ===
+
+The MIT License (MIT)
+
+Copyright (c) 2013 Daniel "BlueRaja" Pflughoeft
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+=== License of SimSharp and FastRandom ===
+
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Analysis/ContinuousStatistics.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Analysis/ContinuousStatistics.cs	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Analysis/ContinuousStatistics.cs	(revision 16311)
@@ -0,0 +1,72 @@
+﻿#region License Information
+/* SimSharp - A .NET port of SimPy, discrete event simulation framework
+Copyright (C) 2016  Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.*/
+#endregion
+
+using System;
+
+namespace SimSharp {
+  public sealed class ContinuousStatistics {
+    private readonly Environment env;
+
+    public int Count { get; private set; }
+    public double TotalTimeD { get; private set; }
+    public TimeSpan TotalTime { get { return env.ToTimeSpan(TotalTimeD); } }
+
+    public double Min { get; private set; }
+    public double Max { get; private set; }
+    public double Area { get; private set; }
+    public double Mean { get; private set; }
+    public double StdDev { get { return Math.Sqrt(Variance); } }
+    public double Variance { get { return (TotalTimeD > 0) ? variance / TotalTimeD : 0.0; } }
+
+    private double lastUpdateTime;
+    private double lastValue;
+    private double variance;
+
+    private bool firstSample;
+
+
+    public ContinuousStatistics(Environment env) {
+      this.env = env;
+      lastUpdateTime = env.NowD;
+    }
+
+    public void Update(double value) {
+      Count++;
+
+      if (!firstSample) {
+        Min = Max = Mean = value;
+        firstSample = true;
+      } else {
+        if (value < Min) Min = value;
+        if (value > Max) Max = value;
+
+        var duration = env.NowD - lastUpdateTime;
+        if (duration > 0) {
+          Area += (lastValue * duration);
+          var oldMean = Mean;
+          Mean = oldMean + (lastValue - oldMean) * duration / (duration + TotalTimeD);
+          variance = variance + (lastValue - oldMean) * (lastValue - Mean) * duration;
+          TotalTimeD += duration;
+        }
+      }
+
+      lastUpdateTime = env.NowD;
+      lastValue = value;
+    }
+  }
+}
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Collections/EventQueue-License.txt
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Collections/EventQueue-License.txt	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Collections/EventQueue-License.txt	(revision 16311)
@@ -0,0 +1,21 @@
+﻿The MIT License (MIT)
+
+Copyright (c) 2013 Daniel "BlueRaja" Pflughoeft
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Collections/EventQueue.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Collections/EventQueue.cs	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Collections/EventQueue.cs	(revision 16311)
@@ -0,0 +1,287 @@
+﻿using System;
+using System.Collections;
+using System.Collections.Generic;
+
+namespace SimSharp {
+  /// <summary>
+  /// An implementation of a min-Priority Queue using a heap.  Has O(1) .Contains()!
+  /// See https://bitbucket.org/BlueRaja/high-speed-priority-queue-for-c/wiki/Getting%20Started for more information
+  /// </summary>
+  /// <remarks>
+  /// There are modifications so that the type is not generic anymore and can only hold values of type EventQueueNode
+  /// </remarks>
+  public sealed class EventQueue : IEnumerable<EventQueueNode> {
+    private int _numNodes;
+    private readonly EventQueueNode[] _nodes;
+    private long _numNodesEverEnqueued;
+
+    /// <summary>
+    /// Instantiate a new Priority Queue
+    /// </summary>
+    /// <param name="maxNodes">EventQueueNodehe max nodes ever allowed to be enqueued (going over this will cause an exception)</param>
+    public EventQueue(int maxNodes) {
+      _numNodes = 0;
+      _nodes = new EventQueueNode[maxNodes + 1];
+      _numNodesEverEnqueued = 0;
+    }
+
+    /// <summary>
+    /// Returns the number of nodes in the queue.  O(1)
+    /// </summary>
+    public int Count {
+      get {
+        return _numNodes;
+      }
+    }
+
+    /// <summary>
+    /// Returns the maximum number of items that can be enqueued at once in this queue.  Once you hit this number (ie. once Count == MaxSize),
+    /// attempting to enqueue another item will throw an exception.  O(1)
+    /// </summary>
+    public int MaxSize {
+      get {
+        return _nodes.Length - 1;
+      }
+    }
+
+    /// <summary>
+    /// Removes every node from the queue.  O(n) (So, don't do this often!)
+    /// </summary>
+#if AGGRESSIVE_INLINING
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
+#endif
+    public void Clear() {
+      Array.Clear(_nodes, 1, _numNodes);
+      _numNodes = 0;
+    }
+
+    /// <summary>
+    /// Returns (in O(1)!) whether the given node is in the queue.  O(1)
+    /// </summary>
+#if AGGRESSIVE_INLINING
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
+#endif
+    public bool Contains(EventQueueNode node) {
+      return (_nodes[node.QueueIndex] == node);
+    }
+
+    /// <summary>
+    /// Enqueue a node - .Priority must be set beforehand!  O(log n)
+    /// </summary>
+#if AGGRESSIVE_INLINING
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
+#endif
+    public EventQueueNode Enqueue(DateTime primaryPriority, Event @event, int secondaryPriority = 0) {
+      var node = new EventQueueNode {
+        PrimaryPriority = primaryPriority,
+        SecondaryPriority = secondaryPriority,
+        Event = @event,
+        QueueIndex = ++_numNodes,
+        InsertionIndex = _numNodesEverEnqueued++
+      };
+      _nodes[_numNodes] = node;
+      CascadeUp(_nodes[_numNodes]);
+      return node;
+    }
+
+#if AGGRESSIVE_INLINING
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
+#endif
+    private void Swap(EventQueueNode node1, EventQueueNode node2) {
+      //Swap the nodes
+      _nodes[node1.QueueIndex] = node2;
+      _nodes[node2.QueueIndex] = node1;
+
+      //Swap their indicies
+      int temp = node1.QueueIndex;
+      node1.QueueIndex = node2.QueueIndex;
+      node2.QueueIndex = temp;
+    }
+
+    //Performance appears to be slightly better when this is NOT inlined o_O
+    private void CascadeUp(EventQueueNode node) {
+      //aka Heapify-up
+      int parent = node.QueueIndex / 2;
+      while (parent >= 1) {
+        EventQueueNode parentNode = _nodes[parent];
+        if (HasHigherPriority(parentNode, node))
+          break;
+
+        //Node has lower priority value, so move it up the heap
+        Swap(node, parentNode); //For some reason, this is faster with Swap() rather than (less..?) individual operations, like in CascadeDown()
+
+        parent = node.QueueIndex / 2;
+      }
+    }
+
+#if AGGRESSIVE_INLINING
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
+#endif
+    private void CascadeDown(EventQueueNode node) {
+      //aka Heapify-down
+      EventQueueNode newParent;
+      int finalQueueIndex = node.QueueIndex;
+      while (true) {
+        newParent = node;
+        int childLeftIndex = 2 * finalQueueIndex;
+
+        //Check if the left-child is higher-priority than the current node
+        if (childLeftIndex > _numNodes) {
+          //This could be placed outside the loop, but then we'd have to check newParent != node twice
+          node.QueueIndex = finalQueueIndex;
+          _nodes[finalQueueIndex] = node;
+          break;
+        }
+
+        EventQueueNode childLeft = _nodes[childLeftIndex];
+        if (HasHigherPriority(childLeft, newParent)) {
+          newParent = childLeft;
+        }
+
+        //Check if the right-child is higher-priority than either the current node or the left child
+        int childRightIndex = childLeftIndex + 1;
+        if (childRightIndex <= _numNodes) {
+          EventQueueNode childRight = _nodes[childRightIndex];
+          if (HasHigherPriority(childRight, newParent)) {
+            newParent = childRight;
+          }
+        }
+
+        //If either of the children has higher (smaller) priority, swap and continue cascading
+        if (newParent != node) {
+          //Move new parent to its new index.  node will be moved once, at the end
+          //Doing it this way is one less assignment operation than calling Swap()
+          _nodes[finalQueueIndex] = newParent;
+
+          int temp = newParent.QueueIndex;
+          newParent.QueueIndex = finalQueueIndex;
+          finalQueueIndex = temp;
+        } else {
+          //See note above
+          node.QueueIndex = finalQueueIndex;
+          _nodes[finalQueueIndex] = node;
+          break;
+        }
+      }
+    }
+
+    /// <summary>
+    /// Returns true if 'higher' has higher priority than 'lower', false otherwise.
+    /// Note that calling HasHigherPriority(node, node) (ie. both arguments the same node) will return false
+    /// </summary>
+#if AGGRESSIVE_INLINING
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
+#endif
+    private bool HasHigherPriority(EventQueueNode higher, EventQueueNode lower) {
+      return (higher.PrimaryPriority < lower.PrimaryPriority ||
+          (higher.PrimaryPriority == lower.PrimaryPriority
+            && (higher.SecondaryPriority < lower.SecondaryPriority ||
+            (higher.SecondaryPriority == lower.SecondaryPriority
+              && higher.InsertionIndex < lower.InsertionIndex))));
+    }
+
+    /// <summary>
+    /// Removes the head of the queue (node with highest priority; ties are broken by order of insertion), and returns it.  O(log n)
+    /// </summary>
+    public EventQueueNode Dequeue() {
+      EventQueueNode returnMe = _nodes[1];
+      Remove(returnMe);
+      return returnMe;
+    }
+
+    /// <summary>
+    /// Returns the head of the queue, without removing it (use Dequeue() for that).  O(1)
+    /// </summary>
+    public EventQueueNode First {
+      get {
+        return _nodes[1];
+      }
+    }
+
+    /// <summary>
+    /// This method must be called on a node every time its priority changes while it is in the queue.  
+    /// <b>Forgetting to call this method will result in a corrupted queue!</b>
+    /// O(log n)
+    /// </summary>
+#if AGGRESSIVE_INLINING
+        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
+#endif
+    public void UpdatePriority(EventQueueNode node, DateTime primaryPriority, int secondaryPriority) {
+      node.PrimaryPriority = primaryPriority;
+      node.SecondaryPriority = secondaryPriority;
+      OnNodeUpdated(node);
+    }
+
+    internal void OnNodeUpdated(EventQueueNode node) {
+      //Bubble the updated node up or down as appropriate
+      int parentIndex = node.QueueIndex / 2;
+      EventQueueNode parentNode = _nodes[parentIndex];
+
+      if (parentIndex > 0 && HasHigherPriority(node, parentNode)) {
+        CascadeUp(node);
+      } else {
+        //Note that CascadeDown will be called if parentNode == node (that is, node is the root)
+        CascadeDown(node);
+      }
+    }
+
+    /// <summary>
+    /// Removes a node from the queue.  Note that the node does not need to be the head of the queue.  O(log n)
+    /// </summary>
+    public void Remove(EventQueueNode node) {
+      if (!Contains(node)) {
+        return;
+      }
+      if (_numNodes <= 1) {
+        _nodes[1] = null;
+        _numNodes = 0;
+        return;
+      }
+
+      //Make sure the node is the last node in the queue
+      bool wasSwapped = false;
+      EventQueueNode formerLastNode = _nodes[_numNodes];
+      if (node.QueueIndex != _numNodes) {
+        //Swap the node with the last node
+        Swap(node, formerLastNode);
+        wasSwapped = true;
+      }
+
+      _numNodes--;
+      _nodes[node.QueueIndex] = null;
+
+      if (wasSwapped) {
+        //Now bubble formerLastNode (which is no longer the last node) up or down as appropriate
+        OnNodeUpdated(formerLastNode);
+      }
+    }
+
+    public IEnumerator<EventQueueNode> GetEnumerator() {
+      for (int i = 1; i <= _numNodes; i++)
+        yield return _nodes[i];
+    }
+
+    IEnumerator IEnumerable.GetEnumerator() {
+      return GetEnumerator();
+    }
+
+    /// <summary>
+    /// <b>Should not be called in production code.</b>
+    /// Checks to make sure the queue is still in a valid state.  Used for testing/debugging the queue.
+    /// </summary>
+    public bool IsValidQueue() {
+      for (int i = 1; i < _nodes.Length; i++) {
+        if (_nodes[i] != null) {
+          int childLeftIndex = 2 * i;
+          if (childLeftIndex < _nodes.Length && _nodes[childLeftIndex] != null && HasHigherPriority(_nodes[childLeftIndex], _nodes[i]))
+            return false;
+
+          int childRightIndex = childLeftIndex + 1;
+          if (childRightIndex < _nodes.Length && _nodes[childRightIndex] != null && HasHigherPriority(_nodes[childRightIndex], _nodes[i]))
+            return false;
+        }
+      }
+      return true;
+    }
+  }
+}
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Collections/EventQueueNode.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Collections/EventQueueNode.cs	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Collections/EventQueueNode.cs	(revision 16311)
@@ -0,0 +1,40 @@
+﻿using System;
+
+namespace SimSharp {
+  public class EventQueueNode {
+    /// <summary>
+    /// The Priority to insert this node at. Must be set BEFORE adding a node to the queue.
+    /// </summary>
+    public DateTime PrimaryPriority { get; set; }
+
+    /// <summary>
+    /// An integer priority that will be used to distinguish nodes with the same
+    /// <see cref="PrimaryPriority"/> and before the <see cref="InsertionIndex"/> is used.
+    /// Must be set BEFORE adding a node to the queue.
+    /// </summary>
+    /// <remarks>
+    /// A lower value means higher priority, thus int.MinValue has highest priority.
+    /// </remarks>
+    public int SecondaryPriority { get; set; }
+
+    /// <summary>
+    /// The event that is associated with this node.
+    /// </summary>
+    public Event Event { get; set; }
+
+    /// <summary>
+    /// <b>Used by the priority queue - do not edit this value.</b>
+    /// Represents the order the node was inserted in
+    /// </summary>
+    /// <remarks>
+    /// This is unique among all inserted nodes and thus represents the third and final priority.
+    /// </remarks>
+    public long InsertionIndex { get; set; }
+
+    /// <summary>
+    /// <b>Used by the priority queue - do not edit this value.</b>
+    /// Represents the current position in the queue
+    /// </summary>
+    public int QueueIndex { get; set; }
+  }
+}
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/ActiveObject.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/ActiveObject.cs	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/ActiveObject.cs	(revision 16311)
@@ -0,0 +1,27 @@
+﻿#region License Information
+/* SimSharp - A .NET port of SimPy, discrete event simulation framework
+Copyright (C) 2016  Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.*/
+#endregion
+
+namespace SimSharp {
+  public abstract class ActiveObject<T> where T : Environment {
+    protected T Environment { get; private set; }
+
+    protected ActiveObject(T environment) {
+      Environment = environment;
+    }
+  }
+}
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Environment.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Environment.cs	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Environment.cs	(revision 16311)
@@ -0,0 +1,420 @@
+﻿#region License Information
+/* SimSharp - A .NET port of SimPy, discrete event simulation framework
+Copyright (C) 2016  Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.*/
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+namespace SimSharp {
+  /// <summary>
+  /// Environments hold the event queues, schedule and process events.
+  /// </summary>
+  public class Environment {
+    private const int InitialMaxEvents = 1024;
+    private object locker = new object();
+
+    /// <summary>
+    /// Describes the number of seconds that a logical step of 1 in the *D-API takes.
+    /// </summary>
+    protected double DefaultTimeStepSeconds { get; private set; }
+
+    /// <summary>
+    /// Calculates the logical date of the simulation by the amount of default steps
+    /// that have passed.
+    /// </summary>
+    public double NowD {
+      get { return (Now - StartDate).TotalSeconds / DefaultTimeStepSeconds; }
+    }
+
+    /// <summary>
+    /// The current simulation time as a calendar date.
+    /// </summary>
+    public DateTime Now { get; protected set; }
+
+    /// <summary>
+    /// The calendar date when the simulation started. This defaults to 1970-1-1 if
+    /// no other date has been specified in the overloaded constructor.
+    /// </summary>
+    public DateTime StartDate { get; protected set; }
+
+    /// <summary>
+    /// The random number generator that is to be used in all events in
+    /// order to produce reproducible results.
+    /// </summary>
+    protected IRandom Random { get; set; }
+
+    protected EventQueue ScheduleQ;
+    public Process ActiveProcess { get; set; }
+
+    public TextWriter Logger { get; set; }
+    public int ProcessedEvents { get; protected set; }
+
+    public Environment() : this(new DateTime(1970, 1, 1)) { }
+    public Environment(TimeSpan? defaultStep) : this(new DateTime(1970, 1, 1), defaultStep) { }
+    public Environment(int randomSeed, TimeSpan? defaultStep = null) : this(new DateTime(1970, 1, 1), randomSeed, defaultStep) { }
+    public Environment(DateTime initialDateTime, TimeSpan? defaultStep = null) {
+      DefaultTimeStepSeconds = (defaultStep ?? TimeSpan.FromSeconds(1)).Duration().TotalSeconds;
+      StartDate = initialDateTime;
+      Now = initialDateTime;
+      Random = new SystemRandom();
+      ScheduleQ = new EventQueue(InitialMaxEvents);
+      Logger = Console.Out;
+    }
+    public Environment(DateTime initialDateTime, int randomSeed, TimeSpan? defaultStep = null) {
+      DefaultTimeStepSeconds = (defaultStep ?? TimeSpan.FromSeconds(1)).Duration().TotalSeconds;
+      StartDate = initialDateTime;
+      Now = initialDateTime;
+      Random = new SystemRandom(randomSeed);
+      ScheduleQ = new EventQueue(InitialMaxEvents);
+      Logger = Console.Out;
+    }
+
+    public double ToDouble(TimeSpan span) {
+      return span.TotalSeconds / DefaultTimeStepSeconds;
+    }
+
+    public TimeSpan ToTimeSpan(double span) {
+      return TimeSpan.FromSeconds(DefaultTimeStepSeconds * span);
+    }
+
+    /// <summary>
+    /// Creates a new process from an event generator. The process is automatically
+    /// scheduled to be started at the current simulation time.
+    /// </summary>
+    /// <param name="generator">The generator function that represents the process.</param>
+    /// <param name="priority">The priority to rank events at the same time (smaller value = higher priority).</param>
+    /// <returns>The scheduled process that was created.</returns>
+    public Process Process(IEnumerable<Event> generator, int priority = 0) {
+      return new Process(this, generator, priority);
+    }
+
+    /// <summary>
+    /// Creates and returns a new timeout.
+    /// </summary>
+    /// <param name="delay">The time after which the timeout is fired.</param>
+    /// <param name="priority">The priority to rank events at the same time (smaller value = higher priority).</param>
+    /// <returns>The scheduled timeout event that was created.</returns>
+    public Timeout TimeoutD(double delay, int priority = 0) {
+      return Timeout(TimeSpan.FromSeconds(DefaultTimeStepSeconds * delay), priority);
+    }
+
+    /// <summary>
+    /// Creates and returns a new timeout.
+    /// </summary>
+    /// <param name="delay">The time after which the timeout is fired.</param>
+    /// <param name="priority">The priority to rank events at the same time (smaller value = higher priority).</param>
+    /// <returns>The scheduled timeout event that was created.</returns>
+    public Timeout Timeout(TimeSpan delay, int priority = 0) {
+      return new Timeout(this, delay, priority: priority);
+    }
+
+    public virtual void Reset(int randomSeed) {
+      ProcessedEvents = 0;
+      Now = StartDate;
+      Random = new SystemRandom(randomSeed);
+      ScheduleQ = new EventQueue(InitialMaxEvents);
+    }
+
+    public virtual void ScheduleD(double delay, Event @event) {
+      Schedule(TimeSpan.FromSeconds(DefaultTimeStepSeconds * delay), @event);
+    }
+
+    /// <summary>
+    /// Schedules an event to occur at the same simulation time as the call was made.
+    /// </summary>
+    /// <param name="event">The event that should be scheduled.</param>
+    /// <param name="priority">The priority to rank events at the same time (smaller value = higher priority).</param></param>
+    public virtual void Schedule(Event @event, int priority = 0) {
+      lock (locker) {
+        DoSchedule(Now, @event, priority);
+      }
+    }
+
+    /// <summary>
+    /// Schedules an event to occur after a certain (positive) delay.
+    /// </summary>
+    /// <exception cref="ArgumentException">
+    /// Thrown when <paramref name="delay"/> is negative.
+    /// </exception>
+    /// <param name="delay">The (positive) delay after which the event should be fired.</param>
+    /// <param name="event">The event that should be scheduled.</param>
+    /// <param name="priority">The priority to rank events at the same time (smaller value = higher priority).</param>
+    public virtual void Schedule(TimeSpan delay, Event @event, int priority = 0) {
+      if (delay < TimeSpan.Zero)
+        throw new ArgumentException("Negative delays are not allowed in Schedule(TimeSpan, Event).");
+      lock (locker) {
+        var eventTime = Now + delay;
+        DoSchedule(eventTime, @event, priority);
+      }
+    }
+
+    protected virtual EventQueueNode DoSchedule(DateTime date, Event @event, int priority = 0) {
+      if (ScheduleQ.MaxSize == ScheduleQ.Count) {
+        // the capacity has to be adjusted, there are more events in the queue than anticipated
+        var oldSchedule = ScheduleQ;
+        ScheduleQ = new EventQueue(ScheduleQ.MaxSize * 2);
+        foreach (var e in oldSchedule) ScheduleQ.Enqueue(e.PrimaryPriority, e.Event, e.SecondaryPriority);
+      }
+      return ScheduleQ.Enqueue(date, @event, priority);
+    }
+
+    public virtual object RunD(double? until = null) {
+      if (!until.HasValue) return Run();
+      return Run(Now + TimeSpan.FromSeconds(DefaultTimeStepSeconds * until.Value));
+    }
+
+    public virtual object Run(TimeSpan span) {
+      return Run(Now + span);
+    }
+
+    public virtual object Run(DateTime until) {
+      if (until <= Now) throw new InvalidOperationException("Simulation end date must lie in the future.");
+      var stopEvent = new Event(this);
+      var node = DoSchedule(until, stopEvent);
+      // stop event is always the first to execute at the given time
+      node.InsertionIndex = -1;
+      ScheduleQ.OnNodeUpdated(node);
+      return Run(stopEvent);
+    }
+
+    public virtual object Run(Event stopEvent = null) {
+      if (stopEvent != null) {
+        if (stopEvent.IsProcessed) return stopEvent.Value;
+        stopEvent.AddCallback(StopSimulation);
+      }
+
+      try {
+        var stop = ScheduleQ.Count == 0;
+        while (!stop) {
+          Step();
+          ProcessedEvents++;
+          lock (locker) {
+            stop = ScheduleQ.Count == 0;
+          }
+        }
+      } catch (StopSimulationException e) { return e.Value; }
+      if (stopEvent == null) return null;
+      if (!stopEvent.IsTriggered) throw new InvalidOperationException("No scheduled events left but \"until\" event was not triggered.");
+      return stopEvent.Value;
+    }
+
+    public virtual void Step() {
+      Event evt;
+      lock (locker) {
+        var next = ScheduleQ.Dequeue();
+        Now = next.PrimaryPriority;
+        evt = next.Event;
+      }
+      evt.Process();
+    }
+
+    public virtual double PeekD() {
+      lock (locker) {
+        if (ScheduleQ.Count == 0) return double.MaxValue;
+        return (Peek() - StartDate).TotalSeconds / DefaultTimeStepSeconds;
+      }
+    }
+
+    public virtual DateTime Peek() {
+      lock (locker) {
+        return ScheduleQ.Count > 0 ? ScheduleQ.First.PrimaryPriority : DateTime.MaxValue;
+      }
+    }
+
+    protected virtual void StopSimulation(Event @event) {
+      throw new StopSimulationException(@event.Value);
+    }
+
+    public virtual void Log(string message, params object[] args) {
+      if (Logger != null)
+        Logger.WriteLine(message, args);
+    }
+
+    #region Random number distributions
+    protected static readonly double NormalMagicConst = 4 * Math.Exp(-0.5) / Math.Sqrt(2.0);
+
+    public double RandUniform(double a, double b) {
+      return a + (b - a) * Random.NextDouble();
+    }
+
+    public TimeSpan RandUniform(TimeSpan a, TimeSpan b) {
+      return TimeSpan.FromSeconds(RandUniform(a.TotalSeconds, b.TotalSeconds));
+    }
+
+    public double RandTriangular(double low, double high) {
+      var u = Random.NextDouble();
+      if (u > 0.5)
+        return high + (low - high) * Math.Sqrt(((1.0 - u) / 2));
+      return low + (high - low) * Math.Sqrt(u / 2);
+    }
+
+    public TimeSpan RandTriangular(TimeSpan low, TimeSpan high) {
+      return TimeSpan.FromSeconds(RandTriangular(low.TotalSeconds, high.TotalSeconds));
+    }
+
+    public double RandTriangular(double low, double high, double mode) {
+      var u = Random.NextDouble();
+      var c = (mode - low) / (high - low);
+      if (u > c)
+        return high + (low - high) * Math.Sqrt(((1.0 - u) * (1.0 - c)));
+      return low + (high - low) * Math.Sqrt(u * c);
+    }
+
+    public TimeSpan RandTriangular(TimeSpan low, TimeSpan high, TimeSpan mode) {
+      return TimeSpan.FromSeconds(RandTriangular(low.TotalSeconds, high.TotalSeconds, mode.TotalSeconds));
+    }
+
+    /// <summary>
+    /// Returns a number that is exponentially distributed given a certain mean.
+    /// </summary>
+    /// <remarks>
+    /// Unlike in other APIs here the mean should be given and not the lambda parameter.
+    /// </remarks>
+    /// <param name="mean">The mean(!) of the distribution is 1 / lambda.</param>
+    /// <returns>A number that is exponentially distributed</returns>
+    public double RandExponential(double mean) {
+      return -Math.Log(1 - Random.NextDouble()) * mean;
+    }
+
+    /// <summary>
+    /// Returns a timespan that is exponentially distributed given a certain mean.
+    /// </summary>
+    /// <remarks>
+    /// Unlike in other APIs here the mean should be given and not the lambda parameter.
+    /// </remarks>
+    /// <param name="mean">The mean(!) of the distribution is 1 / lambda.</param>
+    /// <returns>A number that is exponentially distributed</returns>
+    public TimeSpan RandExponential(TimeSpan mean) {
+      return TimeSpan.FromSeconds(RandExponential(mean.TotalSeconds));
+    }
+
+    public double RandNormal(double mu, double sigma) {
+      double z, zz, u1, u2;
+      do {
+        u1 = Random.NextDouble();
+        u2 = 1 - Random.NextDouble();
+        z = NormalMagicConst * (u1 - 0.5) / u2;
+        zz = z * z / 4.0;
+      } while (zz > -Math.Log(u2));
+      return mu + z * sigma;
+    }
+
+    public TimeSpan RandNormal(TimeSpan mu, TimeSpan sigma) {
+      return TimeSpan.FromSeconds(RandNormal(mu.TotalSeconds, sigma.TotalSeconds));
+    }
+
+    public double RandNormalPositive(double mu, double sigma) {
+      double val;
+      do {
+        val = RandNormal(mu, sigma);
+      } while (val <= 0);
+      return val;
+    }
+
+    public TimeSpan RandNormalPositive(TimeSpan mu, TimeSpan sigma) {
+      return TimeSpan.FromSeconds(RandNormalPositive(mu.TotalSeconds, sigma.TotalSeconds));
+    }
+
+    public double RandNormalNegative(double mu, double sigma) {
+      double val;
+      do {
+        val = RandNormal(mu, sigma);
+      } while (val >= 0);
+      return val;
+    }
+
+    public TimeSpan RandNormalNegative(TimeSpan mu, TimeSpan sigma) {
+      return TimeSpan.FromSeconds(RandNormalNegative(mu.TotalSeconds, sigma.TotalSeconds));
+    }
+
+    public double RandLogNormal(double mu, double sigma) {
+      return Math.Exp(RandNormal(mu, sigma));
+    }
+
+    public TimeSpan RandLogNormal(TimeSpan mu, TimeSpan sigma) {
+      return TimeSpan.FromSeconds(RandLogNormal(mu.TotalSeconds, sigma.TotalSeconds));
+    }
+
+    public double RandCauchy(double x0, double gamma) {
+      return x0 + gamma * Math.Tan(Math.PI * (Random.NextDouble() - 0.5));
+    }
+
+    public TimeSpan RandCauchy(TimeSpan x0, TimeSpan gamma) {
+      return TimeSpan.FromSeconds(RandCauchy(x0.TotalSeconds, gamma.TotalSeconds));
+    }
+
+    public double RandWeibull(double alpha, double beta) {
+      return alpha * Math.Pow(-Math.Log(1 - Random.NextDouble()), 1 / beta);
+    }
+
+    public TimeSpan RandWeibull(TimeSpan mu, TimeSpan sigma) {
+      return TimeSpan.FromSeconds(RandWeibull(mu.TotalSeconds, sigma.TotalSeconds));
+    }
+    #endregion
+
+    #region Random timeouts
+    public Timeout TimeoutUniformD(double a, double b) {
+      return new Timeout(this, ToTimeSpan(RandUniform(a, b)));
+    }
+
+    public Timeout TimeoutUniform(TimeSpan a, TimeSpan b) {
+      return new Timeout(this, RandUniform(a, b));
+    }
+
+    public Timeout TimeoutTriangularD(double low, double high) {
+      return new Timeout(this, ToTimeSpan(RandTriangular(low, high)));
+    }
+
+    public Timeout TimeoutTriangular(TimeSpan low, TimeSpan high) {
+      return new Timeout(this, RandTriangular(low, high));
+    }
+
+    public Timeout TimeoutTriangularD(double low, double high, double mode) {
+      return new Timeout(this, ToTimeSpan(RandTriangular(low, high, mode)));
+    }
+
+    public Timeout TimeoutTriangular(TimeSpan low, TimeSpan high, TimeSpan mode) {
+      return new Timeout(this, RandTriangular(low, high, mode));
+    }
+
+    public Timeout TimeoutExponentialD(double mean) {
+      return new Timeout(this, ToTimeSpan(RandExponential(mean)));
+    }
+
+    public Timeout TimeoutExponential(TimeSpan mean) {
+      return new Timeout(this, RandExponential(mean));
+    }
+
+    public Timeout TimeoutNormalPositiveD(double mu, double sigma) {
+      return new Timeout(this, ToTimeSpan(RandNormalPositive(mu, sigma)));
+    }
+
+    public Timeout TimeoutNormalPositive(TimeSpan mu, TimeSpan sigma) {
+      return new Timeout(this, RandNormalPositive(mu, sigma));
+    }
+
+    public Timeout TimeoutLogNormalD(double mu, double sigma) {
+      return new Timeout(this, ToTimeSpan(RandLogNormal(mu, sigma)));
+    }
+
+    public Timeout TimeoutLogNormal(TimeSpan mu, TimeSpan sigma) {
+      return new Timeout(this, RandLogNormal(mu, sigma));
+    }
+    #endregion
+  }
+}
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Events/AllOf.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Events/AllOf.cs	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Events/AllOf.cs	(revision 16311)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* SimSharp - A .NET port of SimPy, discrete event simulation framework
+Copyright (C) 2016  Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.*/
+#endregion
+
+using System.Collections.Generic;
+
+namespace SimSharp {
+  public class AllOf : Condition {
+    public AllOf(Environment environment, params Event[] events) : base(environment, events) { }
+    public AllOf(Environment environment, IEnumerable<Event> events) : base(environment, events) { }
+
+    protected override bool Evaluate() {
+      return FiredEvents.Count == Events.Count;
+    }
+  }
+}
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Events/AnyOf.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Events/AnyOf.cs	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Events/AnyOf.cs	(revision 16311)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* SimSharp - A .NET port of SimPy, discrete event simulation framework
+Copyright (C) 2016  Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.*/
+#endregion
+
+using System.Collections.Generic;
+
+namespace SimSharp {
+  public class AnyOf : Condition {
+    public AnyOf(Environment environment, params Event[] events) : base(environment, events) { }
+    public AnyOf(Environment environment, IEnumerable<Event> events) : base(environment, events) { }
+
+    protected override bool Evaluate() {
+      return FiredEvents.Count > 0 || Events.Count == 0;
+    }
+  }
+}
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Events/Condition.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Events/Condition.cs	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Events/Condition.cs	(revision 16311)
@@ -0,0 +1,97 @@
+﻿#region License Information
+/* SimSharp - A .NET port of SimPy, discrete event simulation framework
+Copyright (C) 2016  Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.*/
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Collections.Specialized;
+
+namespace SimSharp {
+  /// <summary>
+  /// Conditions are events that execute when any or all of its sub-events are executed.
+  /// </summary>
+  public abstract class Condition : Event {
+
+    public new OrderedDictionary Value {
+      get { return (OrderedDictionary)base.Value; }
+      set { base.Value = value; }
+    }
+
+    protected List<Event> Events { get; private set; }
+
+    protected List<Event> FiredEvents { get; private set; }
+
+    protected Condition(Environment environment, params Event[] events)
+      : this(environment, (IEnumerable<Event>)events) { }
+    protected Condition(Environment environment, IEnumerable<Event> events)
+      : base(environment) {
+      CallbackList.Add(CollectValues);
+      Events = new List<Event>(events);
+      FiredEvents = new List<Event>();
+
+      foreach (var @event in Events) {
+        if (Environment != @event.Environment)
+          throw new ArgumentException("It is not allowed to mix events from different environments");
+        if (@event.IsProcessed) Check(@event);
+        else @event.AddCallback(Check);
+      }
+
+      if (IsAlive && Evaluate())
+        Succeed();
+    }
+
+    protected void Check(Event @event) {
+      if (IsTriggered || IsProcessed) {
+        if (!@event.IsOk) throw new InvalidOperationException(
+@"Errors that happen after the condition has been triggered will not be
+handled by the condition and cause the simulation to crash.");
+        return;
+      }
+      FiredEvents.Add(@event);
+
+      if (!@event.IsOk)
+        Fail(@event.Value);
+      else if (Evaluate()) {
+        Succeed();
+      }
+    }
+
+    protected virtual IEnumerable<KeyValuePair<object, object>> GetValues() {
+      var values = new List<KeyValuePair<object, object>>();
+      foreach (var e in Events) {
+        var condition = e as Condition;
+        if (condition != null) {
+          values.AddRange(condition.GetValues());
+        } else if (e.IsProcessed) {
+          values.Add(new KeyValuePair<object, object>(e, e.Value));
+        }
+      }
+      return values;
+    }
+
+    protected virtual void CollectValues(Event @event) {
+      if (@event.IsOk) {
+        var value = new OrderedDictionary();
+        foreach (var v in GetValues())
+          value.Add(v.Key, v.Value);
+        Value = value;
+      }
+    }
+
+    protected abstract bool Evaluate();
+  }
+}
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Events/Event.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Events/Event.cs	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Events/Event.cs	(revision 16311)
@@ -0,0 +1,200 @@
+﻿#region License Information
+/* SimSharp - A .NET port of SimPy, discrete event simulation framework
+Copyright (C) 2016  Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.*/
+#endregion
+
+using System;
+using System.Collections.Generic;
+
+namespace SimSharp {
+  /// <summary>
+  /// The base class for all events in SimSharp.
+  /// An event can be in one of three states at any time:
+  ///  - Alive: The event object exists, but is neither scheduled to
+  ///           be executed, nor is it already executed.
+  ///  - Triggered: The event has been put in the event queue and is
+  ///               going to be executed.
+  ///  - Processed: The event has been executed.
+  /// 
+  /// Usually, the event is alive until its Trigger, Succeed, or Fail
+  /// method have been called. Then it becomes triggered. When the
+  /// Environment progresses to the event and executes its callbacks
+  /// the event becomes processed.
+  /// </summary>
+  public class Event {
+    protected internal Environment Environment { get; private set; }
+    protected List<Action<Event>> CallbackList { get; set; }
+
+    /// <summary>
+    /// The value property can be used to return arbitrary data from a
+    /// process or an event. It also represents the interrupt cause to
+    /// a process.
+    /// </summary>
+    public object Value { get; protected set; }
+
+    /// <summary>
+    /// The IsOk flag indicates if the event succeeded or failed. An event
+    /// that failed indicates to a waiting process that the action could
+    /// not be performed and that the faulting situation must be handled.
+    /// Typically, interrupting a process sets the IsOk flag to false.
+    /// </summary>
+    public bool IsOk { get; protected set; }
+    /// <summary>
+    /// An event is alive when it is not triggered and not processed. That
+    /// is, when it exists in memory without being scheduled. Typically,
+    /// a Process is alive until its last event has been processed and the
+    /// process event itself is to be processed.
+    /// </summary>
+    public bool IsAlive { get { return !IsTriggered && !IsProcessed; } }
+    /// <summary>
+    /// An event becomes processed when its callbacks have been executed.
+    /// Events may only be processed once and an exception will be thrown
+    /// if they are to be processed multiple times.
+    /// </summary>
+    public bool IsProcessed { get; protected set; }
+    /// <summary>
+    /// An event becomes triggered when it is placed into the event queue.
+    /// That is, when its callbacks are going to be executed.
+    /// An even that is triggered may later not be failed or retriggered.
+    /// </summary>
+    public bool IsTriggered { get; protected set; }
+
+    public Event(Environment environment) {
+      Environment = environment;
+      CallbackList = new List<Action<Event>>();
+    }
+
+    /// <summary>
+    /// This method schedules the event right now. It takes the IsOk state
+    /// and uses the <see cref="Value"/> of the given <paramref name="@event"/>.
+    /// Thus if the given event fails, this event will also be triggered as
+    /// failing.
+    /// </summary>
+    /// <exception cref="InvalidOperationException">
+    /// Thrown when the event has already been triggered.
+    /// </exception>
+    /// <remarks>
+    /// The signature of this method allows it to be used as a callback.
+    /// </remarks>
+    /// <param name="event">The event that triggers this event.</param>
+    /// <param name="priority">The priority to rank events at the same time (smaller value = higher priority).</param>
+    public virtual void Trigger(Event @event, int priority = 0) {
+      if (IsTriggered)
+        throw new InvalidOperationException("Event has already been triggered.");
+      IsOk = @event.IsOk;
+      Value = @event.Value;
+      IsTriggered = true;
+      Environment.Schedule(this, priority);
+    }
+
+    /// <summary>
+    /// This method schedules the event right now. It sets IsOk state to true
+    /// and optionally uses also the value. If urgent is given, the event may
+    /// be scheduled as urgent. Urgent events are placed in a separate event
+    /// queue. The callbacks of urgent events are executed before normal events.
+    /// </summary>
+    /// <exception cref="InvalidOperationException">
+    /// Thrown when the event has already been triggered.
+    /// </exception>
+    /// <param name="value">The value that the event should use.</param>
+    /// <param name="priority">The priority to rank events at the same time (smaller value = higher priority).</param>
+    public virtual void Succeed(object value = null, int priority = 0) {
+      if (IsTriggered)
+        throw new InvalidOperationException("Event has already been triggered.");
+      IsOk = true;
+      Value = value;
+      IsTriggered = true;
+      Environment.Schedule(this, priority);
+    }
+
+    /// <summary>
+    /// This method schedules the event right now. It sets IsOk state to false
+    /// and optionally uses also the value. If urgent is given, the event may
+    /// be scheduled as urgent. Urgent events are placed in a separate event
+    /// queue. The callbacks of urgent events are executed before normal events.
+    /// </summary>
+    /// <exception cref="InvalidOperationException">
+    /// Thrown when the event has already been triggered.
+    /// </exception>
+    /// <param name="value">The value that the event should use.</param>
+    /// <param name="priority">The priority to rank events at the same time (smaller value = higher priority).</param>
+    public virtual void Fail(object value = null, int priority = 0) {
+      if (IsTriggered)
+        throw new InvalidOperationException("Event has already been triggered.");
+      IsOk = false;
+      Value = value;
+      IsTriggered = true;
+      Environment.Schedule(this, priority);
+    }
+
+    /// <summary>
+    /// This method adds a callback to the list of callbacks. Callbacks will be
+    /// executed in the order they have been added.
+    /// </summary>
+    /// <param name="callback">The callback to execute when the event is being
+    /// processed.</param>
+    public virtual void AddCallback(Action<Event> callback) {
+      if (IsProcessed) throw new InvalidOperationException("Event is already processed.");
+      CallbackList.Add(callback);
+    }
+
+    /// <summary>
+    /// This method adds a range of callbacks to the list of callbacks. Callbacks
+    /// will be executed in the order they have been added.
+    /// </summary>
+    /// <param name="callbacks">The callbacks to execute when the event is being
+    /// processed.</param>
+    public virtual void AddCallbacks(IEnumerable<Action<Event>> callbacks) {
+      if (IsProcessed) throw new InvalidOperationException("Event is already processed.");
+      CallbackList.AddRange(callbacks);
+    }
+
+    /// <summary>
+    /// This method removes a callback to the list of callbacks.
+    /// </summary>
+    /// <remarks>
+    /// It is not checked if the callback has actually been added before and
+    /// no exception will be thrown if it had not been present.
+    /// </remarks>
+    /// <param name="callback">The callback to remove.</param>
+    public virtual void RemoveCallback(Action<Event> callback) {
+      if (IsProcessed) throw new InvalidOperationException("Event is already processed.");
+      CallbackList.Remove(callback);
+    }
+
+    /// <summary>
+    /// This method processes the event, that is, it calls all the callbacks.
+    /// When it finishes it will be marked IsProcessed and cannot be processed
+    /// again.
+    /// </summary>
+    /// <exception cref="InvalidOperationException">When the event has already
+    /// been processed.</exception>
+    public virtual void Process() {
+      if (IsProcessed) throw new InvalidOperationException("Event has already been processed.");
+      IsProcessed = true;
+      foreach (var callback in CallbackList)
+        callback(this);
+      CallbackList = null;
+    }
+
+    public static Condition operator &(Event event1, Event event2) {
+      return new AllOf(event1.Environment, event1, event2);
+    }
+    public static Condition operator |(Event event1, Event event2) {
+      return new AnyOf(event1.Environment, event1, event2);
+    }
+  }
+}
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Events/Process.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Events/Process.cs	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Events/Process.cs	(revision 16311)
@@ -0,0 +1,167 @@
+﻿#region License Information
+/* SimSharp - A .NET port of SimPy, discrete event simulation framework
+Copyright (C) 2016  Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.*/
+#endregion
+
+using System;
+using System.Collections.Generic;
+
+namespace SimSharp {
+  /// <summary>
+  /// A Process handles the iteration of events. Processes may define steps that
+  /// a certain entity in the simulation has to perform. Each time the process
+  /// should wait it yields an event and will be resumed when that event is processed.
+  /// </summary>
+  /// <remarks>
+  /// Since an iterator method does not have access to its process, the method can
+  /// retrieve the associated Process through the ActiveProcess property of the
+  /// environment. Each Process sets and resets that property during Resume.
+  /// </remarks>
+  public class Process : Event {
+    private readonly IEnumerator<Event> generator;
+    private Event target;
+    /// <summary>
+    /// Target is the event that is expected to be executed next in the process.
+    /// </summary>
+    public Event Target {
+      get { return target; }
+      protected set { target = value; }
+    }
+
+    /// <summary>
+    /// Sets up a new process.
+    /// The process places an initialize event into the event queue which starts
+    /// the process by retrieving events from the generator.
+    /// </summary>
+    /// <param name="environment">The environment in which the process lives.</param>
+    /// <param name="generator">The generator function of the process.</param>
+    /// <param name="priority">The priority if multiple processes are started at the same time.</param>
+    public Process(Environment environment, IEnumerable<Event> generator, int priority = 0)
+      : base(environment) {
+      this.generator = generator.GetEnumerator();
+      IsOk = true;
+      target = new Initialize(environment, this, priority);
+    }
+
+    /// <summary>
+    /// This interrupts a process and causes the IsOk flag to be set to false.
+    /// If a process is interrupted the iterator method needs to call HandleFault()
+    /// before continuing to yield further events.
+    /// </summary>
+    /// <exception cref="InvalidOperationException">This is thrown in three conditions:
+    ///  - If the process has already been triggered.
+    ///  - If the process attempts to interrupt itself.
+    ///  - If the process continues to yield events despite being faulted.</exception>
+    /// <param name="cause">The cause of the interrupt.</param>
+    /// <param name="priority">The priority to rank events at the same time (smaller value = higher priority).</param>
+    public virtual void Interrupt(object cause = null, int priority = 0) {
+      if (IsTriggered) throw new InvalidOperationException("The process has terminated and cannot be interrupted.");
+      if (Environment.ActiveProcess == this) throw new InvalidOperationException("A process is not allowed to interrupt itself.");
+
+      var interruptEvent = new Event(Environment);
+      interruptEvent.AddCallback(Resume);
+      interruptEvent.Fail(cause, priority);
+
+      if (Target != null)
+        Target.RemoveCallback(Resume);
+    }
+
+    protected virtual void Resume(Event @event) {
+      Environment.ActiveProcess = this;
+      while (true) {
+        if (@event.IsOk) {
+          if (generator.MoveNext()) {
+            if (IsTriggered) {
+              // the generator called e.g. Environment.ActiveProcess.Fail
+              Environment.ActiveProcess = null;
+              return;
+            }
+            if (!ProceedToEvent()) {
+              @event = target;
+              continue;
+            } else break;
+          } else if (!IsTriggered) {
+            Succeed(@event.Value);
+            break;
+          } else break;
+        } else {
+          /* Fault handling differs from SimPy as in .NET it is not possible to inject an
+         * exception into an enumerator and it is impossible to put a yield return inside
+         * a try-catch block. In SimSharp the Process will set IsOk and will then move to
+         * the next yield in the generator. However, if after this move IsOk is still false
+         * we know that the error was not handled. It is assumed the error is handled if
+         * HandleFault() is called on the environment's ActiveProcess which will reset the
+         * flag. */
+          IsOk = false;
+          Value = @event.Value;
+
+          if (generator.MoveNext()) {
+            if (IsTriggered) {
+              // the generator called e.g. Environment.ActiveProcess.Fail
+              Environment.ActiveProcess = null;
+              return;
+            }
+            // if we move next, but IsOk is still false
+            if (!IsOk) throw new InvalidOperationException("The process did not react to being faulted.");
+            // otherwise HandleFault was called and the fault was handled
+            if (ProceedToEvent()) break;
+          } else if (!IsTriggered) {
+            if (!IsOk) Fail(@event.Value);
+            else Succeed(@event.Value);
+            break;
+          } else break;
+        }
+      }
+      Environment.ActiveProcess = null;
+    }
+
+    protected virtual bool ProceedToEvent() {
+      target = generator.Current;
+      Value = target.Value;
+      if (target.IsProcessed) return false;
+      target.AddCallback(Resume);
+      return true;
+    }
+
+    /// <summary>
+    /// This method must be called to reset the IsOk flag of the process back to true.
+    /// The IsOk flag may be set to false if the process waited on an event that failed.
+    /// </summary>
+    /// <remarks>
+    /// In SimPy a faulting process would throw an exception which is then catched and
+    /// chained. In SimSharp catching exceptions from a yield is not possible as a yield
+    /// return statement may not throw an exception.
+    /// If a processes faulted the Value property may indicate a cause for the fault.
+    /// </remarks>
+    /// <returns>True if a faulting situation needs to be handled, false if the process
+    /// is okay and the last yielded event succeeded.</returns>
+    public virtual bool HandleFault() {
+      if (IsOk) return false;
+      IsOk = true;
+      return true;
+    }
+
+    private class Initialize : Event {
+      public Initialize(Environment environment, Process process, int priority)
+        : base(environment) {
+        CallbackList.Add(process.Resume);
+        IsOk = true;
+        IsTriggered = true;
+        environment.Schedule(this, priority);
+      }
+    }
+  }
+}
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Events/Timeout.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Events/Timeout.cs	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Events/Timeout.cs	(revision 16311)
@@ -0,0 +1,46 @@
+﻿#region License Information
+/* SimSharp - A .NET port of SimPy, discrete event simulation framework
+Copyright (C) 2016  Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.*/
+#endregion
+
+using System;
+
+namespace SimSharp {
+  /// <summary>
+  /// Timeouts are simple events that are executed after a certain timespan has passed.
+  /// </summary>
+  public sealed class Timeout : Event {
+    /// <summary>
+    /// A timeout is an event that is executed after a certain timespan has passed.
+    /// </summary>
+    /// <remarks>
+    /// Timeout events are scheduled when they are created. They are always triggered
+    /// when they are created.
+    /// </remarks>
+    /// <param name="environment">The environment in which it is scheduled.</param>
+    /// <param name="delay">The timespan for the timeout.</param>
+    /// <param name="value">The value of the timeout.</param>
+    /// <param name="isOk">Whether the timeout should succeed or fail.</param>
+    /// <param name="priority">The priority to rank events at the same time (smaller value = higher priority).</param>
+    public Timeout(Environment environment, TimeSpan delay, object value = null, bool isOk = true, int priority = 0)
+      : base(environment) {
+      IsOk = isOk;
+      Value = value;
+      IsTriggered = true;
+      environment.Schedule(delay, this, priority);
+    }
+  }
+}
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Exceptions/EmptyScheduleException.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Exceptions/EmptyScheduleException.cs	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Exceptions/EmptyScheduleException.cs	(revision 16311)
@@ -0,0 +1,32 @@
+﻿#region License Information
+/* SimSharp - A .NET port of SimPy, discrete event simulation framework
+Copyright (C) 2016  Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.*/
+#endregion
+
+using System;
+
+namespace SimSharp {
+  /// <summary>
+  /// An exception that is thrown to stop the simulation.
+  /// </summary>
+  public class StopSimulationException : Exception {
+    public object Value { get; private set; }
+    
+    public StopSimulationException(object value) {
+      Value = value;
+    }
+  }
+}
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Preempted.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Preempted.cs	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Preempted.cs	(revision 16311)
@@ -0,0 +1,31 @@
+﻿#region License Information
+/* SimSharp - A .NET port of SimPy, discrete event simulation framework
+Copyright (C) 2016  Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.*/
+#endregion
+
+using System;
+
+namespace SimSharp {
+  public sealed class Preempted {
+    public Process By { get; private set; }
+    public DateTime UsageSince { get; private set; }
+
+    public Preempted(Process by, DateTime usageSince) {
+      By = by;
+      UsageSince = usageSince;
+    }
+  }
+}
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Container.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Container.cs	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Container.cs	(revision 16311)
@@ -0,0 +1,93 @@
+﻿#region License Information
+/* SimSharp - A .NET port of SimPy, discrete event simulation framework
+Copyright (C) 2016  Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.*/
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace SimSharp {
+  public class Container {
+    public double Level { get; protected set; }
+    public double Capacity { get; protected set; }
+    protected Environment Environment { get; private set; }
+
+    protected Queue<ContainerPut> PutQueue { get; private set; }
+    protected Queue<ContainerGet> GetQueue { get; private set; }
+
+    public Container(Environment environment, double capacity = double.MaxValue, double initial = 0) {
+      if (capacity <= 0) throw new ArgumentException("Capacity must be > 0", "capacity");
+      if (initial < 0) throw new ArgumentException("Initial must be >= 0", "initial");
+      if (initial > capacity) throw new ArgumentException("Initial must be <= capacity", "initial");
+      Environment = environment;
+      Capacity = capacity;
+      Level = initial;
+      PutQueue = new Queue<ContainerPut>();
+      GetQueue = new Queue<ContainerGet>();
+    }
+
+    public virtual ContainerPut Put(double amount) {
+      if (amount > Capacity) throw new ArgumentException("Cannot put more than capacity", "amount");
+      var put = new ContainerPut(Environment, TriggerGet, amount);
+      PutQueue.Enqueue(put);
+      TriggerPut();
+      return put;
+    }
+
+    public virtual ContainerGet Get(double amount) {
+      if (amount > Capacity) throw new ArgumentException("Cannot get more than capacity", "amount");
+      var get = new ContainerGet(Environment, TriggerPut, amount);
+      GetQueue.Enqueue(get);
+      TriggerGet();
+      return get;
+    }
+
+    protected virtual void DoPut(ContainerPut put) {
+      if (Capacity - Level >= put.Amount) {
+        Level += put.Amount;
+        put.Succeed();
+      }
+    }
+
+    protected virtual void DoGet(ContainerGet get) {
+      if (Level >= get.Amount) {
+        Level -= get.Amount;
+        get.Succeed();
+      }
+    }
+
+    protected virtual void TriggerPut(Event @event = null) {
+      while (PutQueue.Count > 0) {
+        var put = PutQueue.Peek();
+        DoPut(put);
+        if (put.IsTriggered) {
+          PutQueue.Dequeue();
+        } else break;
+      }
+    }
+
+    protected virtual void TriggerGet(Event @event = null) {
+      while (GetQueue.Count > 0) {
+        var get = GetQueue.Peek();
+        DoGet(get);
+        if (get.IsTriggered) {
+          GetQueue.Dequeue();
+        } else break;
+      }
+    }
+  }
+}
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Events/ContainerGet.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Events/ContainerGet.cs	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Events/ContainerGet.cs	(revision 16311)
@@ -0,0 +1,36 @@
+﻿#region License Information
+/* SimSharp - A .NET port of SimPy, discrete event simulation framework
+Copyright (C) 2016  Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.*/
+#endregion
+
+using System;
+
+namespace SimSharp {
+  public class ContainerGet : Event {
+    public double Amount { get; protected set; }
+    public DateTime Time { get; private set; }
+    public Process Process { get; private set; }
+
+    public ContainerGet(Environment environment, Action<Event> callback, double amount)
+      : base(environment) {
+      if (amount <= 0) throw new ArgumentException("Amount must be > 0.", "amount");
+      Amount = amount;
+      CallbackList.Add(callback);
+      Time = environment.Now;
+      Process = environment.ActiveProcess;
+    }
+  }
+}
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Events/ContainerPut.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Events/ContainerPut.cs	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Events/ContainerPut.cs	(revision 16311)
@@ -0,0 +1,36 @@
+﻿#region License Information
+/* SimSharp - A .NET port of SimPy, discrete event simulation framework
+Copyright (C) 2016  Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.*/
+#endregion
+
+using System;
+
+namespace SimSharp {
+  public class ContainerPut : Event {
+    public double Amount { get; protected set; }
+    public DateTime Time { get; private set; }
+    public Process Process { get; private set; }
+
+    public ContainerPut(Environment environment, Action<Event> callback, double amount)
+      : base(environment) {
+      if (amount <= 0) throw new ArgumentException("Amount must be > 0.", "amount");
+      Amount = amount;
+      CallbackList.Add(callback);
+      Time = environment.Now;
+      Process = environment.ActiveProcess;
+    }
+  }
+}
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Events/FilterStoreGet.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Events/FilterStoreGet.cs	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Events/FilterStoreGet.cs	(revision 16311)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* SimSharp - A .NET port of SimPy, discrete event simulation framework
+Copyright (C) 2016  Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.*/
+#endregion
+
+using System;
+
+namespace SimSharp {
+  public class FilterStoreGet : StoreGet {
+    public Func<object, bool> Filter { get; private set; }
+
+    public FilterStoreGet(Environment environment, Action<Event> callback, Func<object, bool> filter)
+      : base(environment, callback) {
+      Filter = filter;
+    }
+  }
+}
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Events/PreemptiveRequest.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Events/PreemptiveRequest.cs	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Events/PreemptiveRequest.cs	(revision 16311)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* SimSharp - A .NET port of SimPy, discrete event simulation framework
+Copyright (C) 2016  Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.*/
+#endregion
+
+using System;
+
+namespace SimSharp {
+  public sealed class PreemptiveRequest : PriorityRequest {
+    public bool Preempt { get; private set; }
+
+    public PreemptiveRequest(Environment environment, Action<Event> callback, Action<Event> disposeCallback, int priority = 1, bool preempt = false)
+      : base(environment, callback, disposeCallback, priority) {
+      Preempt = preempt;
+    }
+  }
+}
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Events/PriorityRequest.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Events/PriorityRequest.cs	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Events/PriorityRequest.cs	(revision 16311)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* SimSharp - A .NET port of SimPy, discrete event simulation framework
+Copyright (C) 2016  Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.*/
+#endregion
+
+using System;
+
+namespace SimSharp {
+  public class PriorityRequest : Request {
+    public int Priority { get; private set; }
+
+    public PriorityRequest(Environment environment, Action<Event> callback, Action<Event> disposeCallback, int priority = 1)
+      : base(environment, callback, disposeCallback) {
+      Priority = priority;
+    }
+  }
+}
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Events/Release.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Events/Release.cs	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Events/Release.cs	(revision 16311)
@@ -0,0 +1,31 @@
+﻿#region License Information
+/* SimSharp - A .NET port of SimPy, discrete event simulation framework
+Copyright (C) 2016  Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.*/
+#endregion
+
+using System;
+
+namespace SimSharp {
+  public sealed class Release : Event {
+    public Request Request { get; private set; }
+
+    public Release(Environment environment, Request request, Action<Event> callback)
+      : base(environment) {
+      Request = request;
+      CallbackList.Add(callback);
+    }
+  }
+}
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Events/Request.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Events/Request.cs	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Events/Request.cs	(revision 16311)
@@ -0,0 +1,39 @@
+﻿#region License Information
+/* SimSharp - A .NET port of SimPy, discrete event simulation framework
+Copyright (C) 2016  Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.*/
+#endregion
+
+using System;
+
+namespace SimSharp {
+  public class Request : Event, IDisposable {
+    private readonly Action<Event> disposeCallback;
+    public DateTime Time { get; private set; }
+    public Process Process { get; private set; }
+
+    public Request(Environment environment, Action<Event> callback, Action<Event> disposeCallback)
+      : base(environment) {
+      CallbackList.Add(callback);
+      this.disposeCallback = disposeCallback;
+      Time = environment.Now;
+      Process = environment.ActiveProcess;
+    }
+
+    public virtual void Dispose() {
+      if (disposeCallback != null) disposeCallback(this);
+    }
+  }
+}
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Events/ResourcePoolRequest.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Events/ResourcePoolRequest.cs	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Events/ResourcePoolRequest.cs	(revision 16311)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* SimSharp - A .NET port of SimPy, discrete event simulation framework
+Copyright (C) 2016  Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.*/
+#endregion
+
+using System;
+
+namespace SimSharp {
+  public class ResourcePoolRequest : Request {
+    public Func<object, bool> Filter { get; private set; }
+
+    public ResourcePoolRequest(Environment environment, Action<Event> callback, Action<Event> disposeCallback, Func<object, bool> filter)
+      : base(environment, callback, disposeCallback) {
+      Filter = filter;
+    }
+  }
+}
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Events/StoreGet.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Events/StoreGet.cs	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Events/StoreGet.cs	(revision 16311)
@@ -0,0 +1,33 @@
+﻿#region License Information
+/* SimSharp - A .NET port of SimPy, discrete event simulation framework
+Copyright (C) 2016  Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.*/
+#endregion
+
+using System;
+
+namespace SimSharp {
+  public class StoreGet : Event {
+    public DateTime Time { get; private set; }
+    public Process Process { get; private set; }
+
+    public StoreGet(Environment environment, Action<Event> callback)
+      : base(environment) {
+      CallbackList.Add(callback);
+      Time = environment.Now;
+      Process = environment.ActiveProcess;
+    }
+  }
+}
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Events/StorePut.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Events/StorePut.cs	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Events/StorePut.cs	(revision 16311)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* SimSharp - A .NET port of SimPy, discrete event simulation framework
+Copyright (C) 2016  Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.*/
+#endregion
+
+using System;
+
+namespace SimSharp {
+  public class StorePut : Event {
+    public DateTime Time { get; private set; }
+    public Process Process { get; private set; }
+
+    public StorePut(Environment environment, Action<Event> callback, object value)
+      : base(environment) {
+      if (value == null) throw new ArgumentNullException("value", "Value to put in a Store cannot be null.");
+      CallbackList.Add(callback);
+      Value = value;
+      Time = environment.Now;
+      Process = environment.ActiveProcess;
+    }
+  }
+}
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/FilterStore.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/FilterStore.cs	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/FilterStore.cs	(revision 16311)
@@ -0,0 +1,111 @@
+﻿#region License Information
+/* SimSharp - A .NET port of SimPy, discrete event simulation framework
+Copyright (C) 2016  Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.*/
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace SimSharp {
+  public class FilterStore {
+    public int Count { get { return Items.Count; } }
+    public int Capacity { get; protected set; }
+    protected Environment Environment { get; private set; }
+
+    protected Queue<StorePut> PutQueue { get; private set; }
+    protected LinkedList<FilterStoreGet> GetQueue { get; private set; }
+    protected List<object> Items { get; private set; }
+
+    public FilterStore(Environment environment, int capacity = int.MaxValue) {
+      if (capacity <= 0) throw new ArgumentException("Capacity must be > 0", "capacity");
+      Environment = environment;
+      Capacity = capacity;
+      PutQueue = new Queue<StorePut>();
+      GetQueue = new LinkedList<FilterStoreGet>();
+      Items = new List<object>();
+    }
+    public FilterStore(Environment environment, IEnumerable<object> items, int capacity = int.MaxValue) {
+      if (capacity <= 0) throw new ArgumentException("Capacity must be > 0", "capacity");
+      Environment = environment;
+      Capacity = capacity;
+      PutQueue = new Queue<StorePut>();
+      GetQueue = new LinkedList<FilterStoreGet>();
+      Items = new List<object>(items);
+      if (capacity < Items.Count) throw new ArgumentException("There are more initial items than there is capacity.", "items");
+    }
+
+    public virtual bool IsAvailable(Func<object, bool> filter) {
+      return Items.Any(filter);
+    }
+
+    public virtual StorePut Put(object item) {
+      var put = new StorePut(Environment, TriggerGet, item);
+      PutQueue.Enqueue(put);
+      TriggerPut();
+      return put;
+    }
+
+    public virtual FilterStoreGet Get(Func<object, bool> filter = null) {
+      if (filter == null) filter = _ => true;
+      var get = new FilterStoreGet(Environment, TriggerPut, filter);
+      GetQueue.AddLast(get);
+      TriggerGet();
+      return get;
+    }
+
+    protected virtual void DoPut(StorePut put) {
+      if (Items.Count < Capacity) {
+        Items.Add(put.Value);
+        put.Succeed();
+      }
+    }
+
+    protected virtual void DoGet(FilterStoreGet get) {
+      for (int i = 0; i < Items.Count; i++) {
+        var item = Items[i];
+        if (!get.Filter(item)) continue;
+        Items.RemoveAt(i);
+        get.Succeed(item);
+        return;
+      }
+    }
+
+    protected virtual void TriggerPut(Event @event = null) {
+      while (PutQueue.Count > 0) {
+        var put = PutQueue.Peek();
+        DoPut(put);
+        if (put.IsTriggered) {
+          PutQueue.Dequeue();
+        } else break;
+      }
+    }
+
+    protected virtual void TriggerGet(Event @event = null) {
+      var current = GetQueue.First;
+      while (current != null) {
+        var get = current.Value;
+        DoGet(get);
+        if (get.IsTriggered) {
+          var next = current.Next;
+          GetQueue.Remove(current);
+          current = next;
+        } else current = current.Next;
+        if (Items.Count == 0) break;
+      }
+    }
+  }
+}
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/PreemptiveResource.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/PreemptiveResource.cs	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/PreemptiveResource.cs	(revision 16311)
@@ -0,0 +1,129 @@
+﻿#region License Information
+/* SimSharp - A .NET port of SimPy, discrete event simulation framework
+Copyright (C) 2016  Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.*/
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace SimSharp {
+  public class PreemptiveResource {
+
+    public int Capacity { get; protected set; }
+
+    public int InUse { get { return Users.Count; } }
+
+    public int Remaining { get { return Capacity - InUse; } }
+
+    protected Environment Environment { get; private set; }
+
+    protected SortedList<int, LinkedList<PreemptiveRequest>> RequestQueue { get; private set; }
+    protected Queue<Release> ReleaseQueue { get; private set; }
+    protected HashSet<Request> Users { get; private set; }
+
+    public PreemptiveResource(Environment environment, int capacity = 1) {
+      if (capacity <= 0) throw new ArgumentException("Capacity must be > 0.", "capacity");
+      Environment = environment;
+      Capacity = capacity;
+      RequestQueue = new SortedList<int, LinkedList<PreemptiveRequest>>();
+      ReleaseQueue = new Queue<Release>();
+      Users = new HashSet<Request>();
+    }
+
+    public virtual PreemptiveRequest Request(int priority = 1, bool preempt = false) {
+      var request = new PreemptiveRequest(Environment, TriggerRelease, DisposeCallback, priority, preempt);
+      if (!RequestQueue.ContainsKey(request.Priority))
+        RequestQueue.Add(request.Priority, new LinkedList<PreemptiveRequest>());
+      RequestQueue[request.Priority].AddLast(request);
+      TriggerRequest();
+      return request;
+    }
+
+    public virtual Release Release(PreemptiveRequest request) {
+      var release = new Release(Environment, request, TriggerRequest);
+      ReleaseQueue.Enqueue(release);
+      TriggerRelease();
+      return release;
+    }
+
+    protected void DisposeCallback(Event @event) {
+      var request = @event as PreemptiveRequest;
+      if (request != null) Release(request);
+    }
+
+    protected virtual void DoRequest(PreemptiveRequest request) {
+      if (Users.Count >= Capacity && request.Preempt) {
+        // Check if we can preempt another process
+        var oldest = Users.OfType<PreemptiveRequest>().Select((r, i) => new { Request = r, Index = i })
+          .OrderByDescending(x => x.Request.Priority)
+          .ThenByDescending(x => x.Request.Time)
+          .ThenByDescending(x => x.Request.Preempt)
+          .ThenByDescending(x => x.Index)
+          .First().Request;
+        if (oldest.Priority > request.Priority || (oldest.Priority == request.Priority
+            && (!oldest.Preempt && request.Preempt || (oldest.Preempt == request.Preempt
+              && oldest.Time > request.Time)))) {
+          Users.Remove(oldest);
+          oldest.Process.Interrupt(new Preempted(request.Process, oldest.Time));
+        }
+      }
+      if (Users.Count < Capacity) {
+        Users.Add(request);
+        request.Succeed();
+      }
+    }
+
+    protected virtual void DoRelease(Release release) {
+      if (!Users.Remove(release.Request)) {
+        var preemptRequest = release.Request as PreemptiveRequest;
+        if (preemptRequest != null) {
+          var current = RequestQueue[preemptRequest.Priority].First;
+          while (current != null && current.Value != release.Request)
+            current = current.Next;
+          if (current != null) RequestQueue[preemptRequest.Priority].Remove(current);
+        }
+      }
+      release.Succeed();
+    }
+
+    protected virtual void TriggerRequest(Event @event = null) {
+      foreach (var entry in RequestQueue) {
+        var requests = entry.Value;
+        var current = requests.First;
+        while (current != null) {
+          var request = current.Value;
+          DoRequest(request);
+          if (request.IsTriggered) {
+            var next = current.Next;
+            requests.Remove(current);
+            current = next;
+          } else current = current.Next;
+        }
+      }
+    }
+
+    protected virtual void TriggerRelease(Event @event = null) {
+      while (ReleaseQueue.Count > 0) {
+        var release = ReleaseQueue.Peek();
+        DoRelease(release);
+        if (release.IsTriggered) {
+          ReleaseQueue.Dequeue();
+        } else break;
+      }
+    }
+  }
+}
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/PriorityResource.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/PriorityResource.cs	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/PriorityResource.cs	(revision 16311)
@@ -0,0 +1,115 @@
+﻿#region License Information
+/* SimSharp - A .NET port of SimPy, discrete event simulation framework
+Copyright (C) 2016  Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.*/
+#endregion
+
+using System;
+using System.Collections.Generic;
+
+namespace SimSharp {
+  public class PriorityResource {
+
+    public int Capacity { get; protected set; }
+
+    public int InUse { get { return Users.Count; } }
+
+    public int Remaining { get { return Capacity - InUse; } }
+
+    protected Environment Environment { get; private set; }
+
+    protected SortedList<int, LinkedList<PriorityRequest>> RequestQueue { get; private set; }
+    protected Queue<Release> ReleaseQueue { get; private set; }
+    protected HashSet<Request> Users { get; private set; }
+
+    public PriorityResource(Environment environment, int capacity = 1) {
+      if (capacity <= 0) throw new ArgumentException("Capacity must be > 0.", "capacity");
+      Environment = environment;
+      Capacity = capacity;
+      RequestQueue = new SortedList<int, LinkedList<PriorityRequest>>();
+      ReleaseQueue = new Queue<Release>();
+      Users = new HashSet<Request>();
+    }
+
+    public virtual PriorityRequest Request(int priority = 1) {
+      var request = new PriorityRequest(Environment, TriggerRelease, DisposeCallback, priority);
+      if (!RequestQueue.ContainsKey(priority))
+        RequestQueue.Add(priority, new LinkedList<PriorityRequest>());
+      RequestQueue[priority].AddLast(request);
+      TriggerRequest();
+      return request;
+    }
+
+    public virtual Release Release(PriorityRequest request) {
+      var release = new Release(Environment, request, TriggerRequest);
+      ReleaseQueue.Enqueue(release);
+      TriggerRelease();
+      return release;
+    }
+
+    protected void DisposeCallback(Event @event) {
+      var request = @event as PriorityRequest;
+      if (request != null) Release(request);
+    }
+
+    protected virtual void DoRequest(Request request) {
+      if (Users.Count < Capacity) {
+        Users.Add(request);
+        request.Succeed();
+      }
+    }
+
+    protected virtual void DoRelease(Release release) {
+      if (!Users.Remove(release.Request)) {
+        var prioRequest = release.Request as PriorityRequest;
+        if (prioRequest != null) {
+          var current = RequestQueue[prioRequest.Priority].First;
+          while (current != null && current.Value != release.Request)
+            current = current.Next;
+          if (current != null) RequestQueue[prioRequest.Priority].Remove(current);
+        }
+      }
+      release.Succeed();
+    }
+
+    protected virtual void TriggerRequest(Event @event = null) {
+      foreach (var entry in RequestQueue) {
+        var cascade = false;
+        var requests = entry.Value;
+        while (requests.Count > 0) {
+          var req = requests.First.Value;
+          DoRequest(req);
+          if (req.IsTriggered) {
+            requests.RemoveFirst();
+          } else {
+            cascade = true;
+            break;
+          }
+        }
+        if (cascade) break;
+      }
+    }
+
+    protected virtual void TriggerRelease(Event @event = null) {
+      while (ReleaseQueue.Count > 0) {
+        var release = ReleaseQueue.Peek();
+        DoRelease(release);
+        if (release.IsTriggered) {
+          ReleaseQueue.Dequeue();
+        } else break;
+      }
+    }
+  }
+}
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Resource.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Resource.cs	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Resource.cs	(revision 16311)
@@ -0,0 +1,104 @@
+﻿#region License Information
+/* SimSharp - A .NET port of SimPy, discrete event simulation framework
+Copyright (C) 2016  Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.*/
+#endregion
+
+using System;
+using System.Collections.Generic;
+
+namespace SimSharp {
+  public class Resource {
+
+    public int Capacity { get; protected set; }
+
+    public int InUse { get { return Users.Count; } }
+
+    public int Remaining { get { return Capacity - InUse; } }
+
+    protected Environment Environment { get; private set; }
+
+    protected LinkedList<Request> RequestQueue { get; private set; }
+    protected Queue<Release> ReleaseQueue { get; private set; }
+    protected HashSet<Request> Users { get; private set; }
+
+    public Resource(Environment environment, int capacity = 1) {
+      if (capacity <= 0) throw new ArgumentException("Capacity must > 0.", "capacity");
+      Environment = environment;
+      Capacity = capacity;
+      RequestQueue = new LinkedList<Request>();
+      ReleaseQueue = new Queue<Release>();
+      Users = new HashSet<Request>();
+    }
+
+    public virtual Request Request() {
+      var request = new Request(Environment, TriggerRelease, DisposeCallback);
+      RequestQueue.AddLast(request);
+      TriggerRequest();
+      return request;
+    }
+
+    public virtual Release Release(Request request) {
+      var release = new Release(Environment, request, TriggerRequest);
+      ReleaseQueue.Enqueue(release);
+      TriggerRelease();
+      return release;
+    }
+
+    protected virtual void DisposeCallback(Event @event) {
+      var request = @event as Request;
+      if (request != null) {
+        Release(request);
+      }
+    }
+
+    protected virtual void DoRequest(Request request) {
+      if (Users.Count < Capacity) {
+        Users.Add(request);
+        request.Succeed();
+      }
+    }
+
+    protected virtual void DoRelease(Release release) {
+      if (!Users.Remove(release.Request)) {
+        var current = RequestQueue.First;
+        while (current != null && current.Value != release.Request)
+          current = current.Next;
+        if (current != null) RequestQueue.Remove(current);
+      }
+      release.Succeed();
+    }
+
+    protected virtual void TriggerRequest(Event @event = null) {
+      while (RequestQueue.Count > 0) {
+        var request = RequestQueue.First.Value;
+        DoRequest(request);
+        if (request.IsTriggered) {
+          RequestQueue.RemoveFirst();
+        } else break;
+      }
+    }
+
+    protected virtual void TriggerRelease(Event @event = null) {
+      while (ReleaseQueue.Count > 0) {
+        var release = ReleaseQueue.Peek();
+        DoRelease(release);
+        if (release.IsTriggered) {
+          ReleaseQueue.Dequeue();
+        } else break;
+      }
+    }
+  }
+}
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/ResourcePool.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/ResourcePool.cs	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/ResourcePool.cs	(revision 16311)
@@ -0,0 +1,110 @@
+﻿#region License Information
+/* SimSharp - A .NET port of SimPy, discrete event simulation framework
+Copyright (C) 2016  Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.*/
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace SimSharp {
+  public class ResourcePool {
+    protected static readonly Func<object, bool> TrueFunc = _ => true;
+
+    public int Capacity { get; protected set; }
+
+    public int InUse { get { return Capacity - Remaining; } }
+
+    public int Remaining { get { return Resources.Count; } }
+
+    protected Environment Environment { get; private set; }
+
+    protected LinkedList<ResourcePoolRequest> RequestQueue { get; private set; }
+    protected Queue<Release> ReleaseQueue { get; private set; }
+    protected List<object> Resources { get; private set; }
+
+    public ResourcePool(Environment environment, IEnumerable<object> resources) {
+      Environment = environment;
+      if (resources == null) throw new ArgumentNullException("resources");
+      Resources = new List<object>(resources);
+      Capacity = Resources.Count;
+      if (Capacity == 0) throw new ArgumentException("There must be at least one resource", "resources");
+      RequestQueue = new LinkedList<ResourcePoolRequest>();
+      ReleaseQueue = new Queue<Release>();
+    }
+
+    public virtual bool IsAvailable(Func<object, bool> filter) {
+      return Resources.Any(filter);
+    }
+
+    public virtual ResourcePoolRequest Request(Func<object, bool> filter = null) {
+      var request = new ResourcePoolRequest(Environment, TriggerRelease, DisposeCallback, filter ?? TrueFunc);
+      RequestQueue.AddLast(request);
+      TriggerRequest();
+      return request;
+    }
+
+    public virtual Release Release(Request request) {
+      var release = new Release(Environment, request, TriggerRequest);
+      ReleaseQueue.Enqueue(release);
+      TriggerRelease();
+      return release;
+    }
+
+    protected virtual void DisposeCallback(Event @event) {
+      var request = @event as Request;
+      if (request != null) Release(request);
+    }
+
+    protected virtual void DoRequest(ResourcePoolRequest request) {
+      foreach (var o in Resources) {
+        if (!request.Filter(o)) continue;
+        Resources.Remove(o);
+        request.Succeed(o);
+        return;
+      }
+    }
+
+    protected virtual void DoRelease(Release release) {
+      Resources.Add(release.Request.Value);
+      release.Succeed();
+    }
+
+    protected virtual void TriggerRequest(Event @event = null) {
+      var current = RequestQueue.First;
+      while (current != null) {
+        var request = current.Value;
+        DoRequest(request);
+        if (request.IsTriggered) {
+          var next = current.Next;
+          RequestQueue.Remove(current);
+          current = next;
+        } else current = current.Next;
+        if (Resources.Count == 0) break;
+      }
+    }
+
+    protected virtual void TriggerRelease(Event @event = null) {
+      while (ReleaseQueue.Count > 0) {
+        var release = ReleaseQueue.Peek();
+        DoRelease(release);
+        if (release.IsTriggered) {
+          ReleaseQueue.Dequeue();
+        } else break;
+      }
+    }
+  }
+}
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Store.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Store.cs	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Core/Resources/Store.cs	(revision 16311)
@@ -0,0 +1,91 @@
+﻿#region License Information
+/* SimSharp - A .NET port of SimPy, discrete event simulation framework
+Copyright (C) 2016  Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.*/
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace SimSharp {
+  public class Store {
+    public int Count { get { return Items.Count; } }
+    public int Capacity { get; protected set; }
+    protected Environment Environment { get; private set; }
+
+    protected Queue<StorePut> PutQueue { get; private set; }
+    protected Queue<StoreGet> GetQueue { get; private set; }
+    protected List<object> Items { get; private set; }
+
+    public Store(Environment environment, int capacity = int.MaxValue) {
+      if (capacity <= 0) throw new ArgumentException("Capacity must be > 0", "capacity");
+      Environment = environment;
+      Capacity = capacity;
+      PutQueue = new Queue<StorePut>();
+      GetQueue = new Queue<StoreGet>();
+      Items = new List<object>();
+    }
+
+    public virtual StorePut Put(object item) {
+      var put = new StorePut(Environment, TriggerGet, item);
+      PutQueue.Enqueue(put);
+      TriggerPut();
+      return put;
+    }
+
+    public virtual StoreGet Get() {
+      var get = new StoreGet(Environment, TriggerPut);
+      GetQueue.Enqueue(get);
+      TriggerGet();
+      return get;
+    }
+
+    protected virtual void DoPut(StorePut put) {
+      if (Items.Count < Capacity) {
+        Items.Add(put.Value);
+        put.Succeed();
+      }
+    }
+
+    protected virtual void DoGet(StoreGet get) {
+      if (Items.Count > 0) {
+        var item = Items.First();
+        Items.RemoveAt(0);
+        get.Succeed(item);
+      }
+    }
+
+    protected virtual void TriggerPut(Event @event = null) {
+      while (PutQueue.Count > 0) {
+        var put = PutQueue.Peek();
+        DoPut(put);
+        if (put.IsTriggered) {
+          PutQueue.Dequeue();
+        } else break;
+      }
+    }
+
+    protected virtual void TriggerGet(Event @event = null) {
+      while (GetQueue.Count > 0) {
+        var get = GetQueue.Peek();
+        DoGet(get);
+        if (get.IsTriggered) {
+          GetQueue.Dequeue();
+        } else break;
+      }
+    }
+  }
+}
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Properties/AssemblyInfo.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Properties/AssemblyInfo.cs	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Properties/AssemblyInfo.cs	(revision 16311)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* SimSharp - A .NET port of SimPy, discrete event simulation framework
+Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.*/
+#endregion
+
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("SimSharp")]
+[assembly: AssemblyDescription("A .NET port of SimPy, discrete event simulation framework")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("HEAL")]
+[assembly: AssemblyProduct("SimSharp")]
+[assembly: AssemblyCopyright("(c) 2002-2018 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("d51e9cc2-c26b-4df5-94f8-ca8f63f75db9")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.0.11.0")]
+[assembly: AssemblyFileVersion("3.0.11.0")]
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Random/FastRandom.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Random/FastRandom.cs	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Random/FastRandom.cs	(revision 16311)
@@ -0,0 +1,413 @@
+﻿/* ***************************************************************************
+ * This file is part of SharpNEAT - Evolution of Neural Networks.
+ * 
+ * Copyright 2004-2006, 2009-2010 Colin Green (sharpneat@gmail.com)
+ *
+ * SharpNEAT is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * SharpNEAT is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with SharpNEAT.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+// ENHANCEMENT: Replace usages of this class with the superceding version from Math.Net.
+using System;
+
+namespace SimSharp {
+  /// <summary>
+  /// A fast random number generator for .NET
+  /// Colin Green, January 2005
+  /// 
+  /// Key points:
+  ///  1) Based on a simple and fast xor-shift pseudo random number generator (RNG) specified in: 
+  ///  Marsaglia, George. (2003). Xorshift RNGs.
+  ///  http://www.jstatsoft.org/v08/i14/paper
+  ///  
+  ///  This particular implementation of xorshift has a period of 2^128-1. See the above paper to see
+  ///  how this can be easily extened if you need a longer period. At the time of writing I could find no 
+  ///  information on the period of System.Random for comparison.
+  /// 
+  ///  2) Faster than System.Random. Up to 8x faster, depending on which methods are called.
+  /// 
+  ///  3) Direct replacement for System.Random. This class implements all of the methods that System.Random 
+  ///  does plus some additional methods. The like named methods are functionally equivalent.
+  ///  
+  ///  4) Allows fast re-initialisation with a seed, unlike System.Random which accepts a seed at construction
+  ///  time which then executes a relatively expensive initialisation routine. This provides a vast speed improvement
+  ///  if you need to reset the pseudo-random number sequence many times, e.g. if you want to re-generate the same
+  ///  sequence of random numbers many times. An alternative might be to cache random numbers in an array, but that 
+  ///  approach is limited by memory capacity and the fact that you may also want a large number of different sequences 
+  ///  cached. Each sequence can be represented by a single seed value (int) when using FastRandom.
+  ///  
+  ///  Notes.
+  ///  A further performance improvement can be obtained by declaring local variables as static, thus avoiding 
+  ///  re-allocation of variables on each call. However care should be taken if multiple instances of
+  ///  FastRandom are in use or if being used in a multi-threaded environment.
+  /// 
+  /// 
+  /// Colin Green, September 4th 2005
+  ///   - Added NextBytesUnsafe() - commented out by default.
+  ///   - Fixed bug in Reinitialise() - y,z and w variables were not being reset.
+  ///     
+  /// Colin Green, December 2008.
+  ///   - Fix to Next() - Was previously able to return int.MaxValue, contrary to the method's contract and comments.
+  ///   - Modified NextBool() to use _bitMask instead of a count of remaining bits. Also reset the bit buffer in Reinitialise().
+  ///    
+  /// Colin Green, 2011-08-31
+  ///   - Added NextByte() method.
+  ///   - Added new statically declared seedRng FastRandom to allow easy creation of multiple FastRandoms with different seeds 
+  ///     within a single clock tick.
+  ///     
+  /// Colin Green, 2011-10-04
+  ///  - Seeds are now hashed. Without this the first random sample for nearby seeds (1,2,3, etc.) are very similar 
+  ///    (have a similar bit pattern). Thanks to Francois Guibert for identifying this problem.
+  /// 
+  /// </summary>
+  public class FastRandom : IRandom {
+    #region Static Fields
+    /// <summary>
+    /// A static RNG that is used to generate seed values when constructing new instances of FastRandom.
+    /// This overcomes the problem whereby multiple FastRandom instances are instantiated within the same
+    /// tick count and thus obtain the same seed, that approach can result in extreme biases occuring 
+    /// in some cases depending on how the RNG is used.
+    /// </summary>
+    static readonly FastRandom __seedRng = new FastRandom((int)System.Environment.TickCount);
+    #endregion
+
+    #region Instance Fields
+
+    // The +1 ensures NextDouble doesn't generate 1.0
+    const double REAL_UNIT_INT = 1.0 / ((double)int.MaxValue + 1.0);
+    const double REAL_UNIT_UINT = 1.0 / ((double)uint.MaxValue + 1.0);
+    const uint Y = 842502087, Z = 3579807591, W = 273326509;
+
+    uint _x, _y, _z, _w;
+
+    #endregion
+
+    #region Constructors
+
+    /// <summary>
+    /// Initialises a new instance using a seed generated from the class's static seed RNG.
+    /// </summary>
+    public FastRandom() {
+      Reinitialise(__seedRng.NextInt());
+    }
+
+    /// <summary>
+    /// Initialises a new instance using an int value as seed.
+    /// This constructor signature is provided to maintain compatibility with
+    /// System.Random
+    /// </summary>
+    public FastRandom(int seed) {
+      Reinitialise(seed);
+    }
+
+    #endregion
+
+    #region Public Methods [Reinitialisation]
+
+    /// <summary>
+    /// Reinitialises using an int value as a seed.
+    /// </summary>
+    public void Reinitialise(int seed) {
+      // The only stipulation stated for the xorshift RNG is that at least one of
+      // the seeds x,y,z,w is non-zero. We fulfill that requirement by only allowing
+      // resetting of the x seed.
+
+      // The first random sample will be very closely related to the value of _x we set here. 
+      // Thus setting _x = seed will result in a close correlation between the bit patterns of the seed and
+      // the first random sample, therefore if the seed has a pattern (e.g. 1,2,3) then there will also be 
+      // a recognisable pattern across the first random samples.
+      //
+      // Such a strong correlation between the seed and the first random sample is an undesirable
+      // charactersitic of a RNG, therefore we significantly weaken any correlation by hashing the seed's bits. 
+      // This is achieved by multiplying the seed with four large primes each with bits distributed over the
+      // full length of a 32bit value, finally adding the results to give _x.
+      _x = (uint)((seed * 1431655781)
+                  + (seed * 1183186591)
+                  + (seed * 622729787)
+                  + (seed * 338294347));
+
+      _y = Y;
+      _z = Z;
+      _w = W;
+
+      _bitBuffer = 0;
+      _bitMask = 1;
+    }
+
+    #endregion
+
+    #region Public Methods [System.Random functionally equivalent methods]
+
+    /// <summary>
+    /// Generates a random int over the range 0 to int.MaxValue-1.
+    /// MaxValue is not generated in order to remain functionally equivalent to System.Random.Next().
+    /// This does slightly eat into some of the performance gain over System.Random, but not much.
+    /// For better performance see:
+    /// 
+    /// Call NextInt() for an int over the range 0 to int.MaxValue.
+    /// 
+    /// Call NextUInt() and cast the result to an int to generate an int over the full Int32 value range
+    /// including negative values. 
+    /// </summary>
+    public int Next() {
+      uint t = _x ^ (_x << 11);
+      _x = _y; _y = _z; _z = _w;
+      _w = (_w ^ (_w >> 19)) ^ (t ^ (t >> 8));
+
+      // Handle the special case where the value int.MaxValue is generated. This is outside of 
+      // the range of permitted values, so we therefore call Next() to try again.
+      uint rtn = _w & 0x7FFFFFFF;
+      if (rtn == 0x7FFFFFFF) {
+        return Next();
+      }
+      return (int)rtn;
+    }
+
+    /// <summary>
+    /// Generates a random int over the range 0 to upperBound-1, and not including upperBound.
+    /// </summary>
+    public int Next(int upperBound) {
+      if (upperBound < 0) {
+        throw new ArgumentOutOfRangeException("upperBound", upperBound, "upperBound must be >=0");
+      }
+
+      uint t = _x ^ (_x << 11);
+      _x = _y; _y = _z; _z = _w;
+
+      // ENHANCEMENT: Can we do this without converting to a double and back again?
+      // The explicit int cast before the first multiplication gives better performance.
+      // See comments in NextDouble.
+      return (int)((REAL_UNIT_INT * (int)(0x7FFFFFFF & (_w = (_w ^ (_w >> 19)) ^ (t ^ (t >> 8))))) * upperBound);
+    }
+
+    /// <summary>
+    /// Generates a random int over the range lowerBound to upperBound-1, and not including upperBound.
+    /// upperBound must be >= lowerBound. lowerBound may be negative.
+    /// </summary>
+    public int Next(int lowerBound, int upperBound) {
+      if (lowerBound > upperBound) {
+        throw new ArgumentOutOfRangeException("upperBound", upperBound, "upperBound must be >=lowerBound");
+      }
+
+      uint t = _x ^ (_x << 11);
+      _x = _y; _y = _z; _z = _w;
+
+      // The explicit int cast before the first multiplication gives better performance.
+      // See comments in NextDouble.
+      int range = upperBound - lowerBound;
+      if (range < 0) {   // If range is <0 then an overflow has occured and must resort to using long integer arithmetic instead (slower).
+        // We also must use all 32 bits of precision, instead of the normal 31, which again is slower.  
+        return lowerBound + (int)((REAL_UNIT_UINT * (double)(_w = (_w ^ (_w >> 19)) ^ (t ^ (t >> 8)))) * (double)((long)upperBound - (long)lowerBound));
+      }
+
+      // 31 bits of precision will suffice if range<=int.MaxValue. This allows us to cast to an int and gain
+      // a little more performance.
+      return lowerBound + (int)((REAL_UNIT_INT * (double)(int)(0x7FFFFFFF & (_w = (_w ^ (_w >> 19)) ^ (t ^ (t >> 8))))) * (double)range);
+    }
+
+    /// <summary>
+    /// Generates a random double. Values returned are over the range [0, 1). That is, inclusive of 0.0 and exclusive of 1.0.
+    /// </summary>
+    public double NextDouble() {
+      uint t = _x ^ (_x << 11);
+      _x = _y; _y = _z; _z = _w;
+
+      // Here we can gain a 2x speed improvement by generating a value that can be cast to 
+      // an int instead of the more easily available uint. If we then explicitly cast to an 
+      // int the compiler will then cast the int to a double to perform the multiplication, 
+      // this final cast is a lot faster than casting from a uint to a double. The extra cast
+      // to an int is very fast (the allocated bits remain the same) and so the overall effect 
+      // of the extra cast is a significant performance improvement.
+      //
+      // Also note that the loss of one bit of precision is equivalent to what occurs within 
+      // System.Random.
+      return REAL_UNIT_INT * (int)(0x7FFFFFFF & (_w = (_w ^ (_w >> 19)) ^ (t ^ (t >> 8))));
+    }
+
+    /// <summary>
+    /// Fills the provided byte array with random bytes.
+    /// This method is functionally equivalent to System.Random.NextBytes(). 
+    /// </summary>
+    public void NextBytes(byte[] buffer) {
+      // Fill up the bulk of the buffer in chunks of 4 bytes at a time.
+      uint x = this._x, y = this._y, z = this._z, w = this._w;
+      int i = 0;
+      uint t;
+      for (int bound = buffer.Length - 3; i < bound; ) {
+        // Generate 4 bytes. 
+        // Increased performance is achieved by generating 4 random bytes per loop.
+        // Also note that no mask needs to be applied to zero out the higher order bytes before
+        // casting because the cast ignores thos bytes. Thanks to Stefan Trosch�tz for pointing this out.
+        t = x ^ (x << 11);
+        x = y; y = z; z = w;
+        w = (w ^ (w >> 19)) ^ (t ^ (t >> 8));
+
+        buffer[i++] = (byte)w;
+        buffer[i++] = (byte)(w >> 8);
+        buffer[i++] = (byte)(w >> 16);
+        buffer[i++] = (byte)(w >> 24);
+      }
+
+      // Fill up any remaining bytes in the buffer.
+      if (i < buffer.Length) {
+        // Generate 4 bytes.
+        t = x ^ (x << 11);
+        x = y; y = z; z = w;
+        w = (w ^ (w >> 19)) ^ (t ^ (t >> 8));
+
+        buffer[i++] = (byte)w;
+        if (i < buffer.Length) {
+          buffer[i++] = (byte)(w >> 8);
+          if (i < buffer.Length) {
+            buffer[i++] = (byte)(w >> 16);
+            if (i < buffer.Length) {
+              buffer[i] = (byte)(w >> 24);
+            }
+          }
+        }
+      }
+      this._x = x; this._y = y; this._z = z; this._w = w;
+    }
+
+    ///// <summary>
+    ///// A version of NextBytes that uses a pointer to set 4 bytes of the byte buffer in one operation
+    ///// thus providing a nice speedup. The loop is also partially unrolled to allow out-of-order-execution,
+    ///// this results in about a x2 speedup on an AMD Athlon. Thus performance may vary wildly on different CPUs
+    ///// depending on the number of execution units available.
+    ///// 
+    ///// Another significant speedup is obtained by setting the 4 bytes by indexing pDWord (e.g. pDWord[i++]=_w)
+    ///// instead of dereferencing it (e.g. *pDWord++=_w).
+    ///// 
+    ///// Note that this routine requires the unsafe compilation flag to be specified and so is commented out by default.
+    ///// </summary>
+    ///// <param name="buffer"></param>
+    //      public unsafe void NextBytesUnsafe(byte[] buffer)
+    //      {
+    //          if(buffer.Length % 8 != 0)
+    //              throw new ArgumentException("Buffer length must be divisible by 8", "buffer");
+    //
+    //          uint _x=this._x, _y=this._y, _z=this._z, _w=this._w;
+    //          
+    //          fixed(byte* pByte0 = buffer)
+    //          {
+    //              uint* pDWord = (uint*)pByte0;
+    //              for(int i=0, len=buffer.Length>>2; i < len; i+=2) 
+    //              {
+    //                  uint t=(_x^(_x<<11));
+    //                  _x=_y; _y=_z; _z=_w;
+    //                  pDWord[i] = _w = (_w^(_w>>19))^(t^(t>>8));
+    //
+    //                  t=(_x^(_x<<11));
+    //                  _x=_y; _y=_z; _z=_w;
+    //                  pDWord[i+1] = _w = (_w^(_w>>19))^(t^(t>>8));
+    //              }
+    //          }
+    //
+    //          this._x=_x; this._y=_y; this._z=_z; this._w=_w;
+    //      }
+    #endregion
+
+    #region Public Methods [Methods not present on System.Random]
+
+    /// <summary>
+    /// Generates a uint. Values returned are over the full range of a uint, 
+    /// uint.MinValue to uint.MaxValue, inclusive.
+    /// 
+    /// This is the fastest method for generating a single random number because the underlying
+    /// random number generator algorithm generates 32 random bits that can be cast directly to 
+    /// a uint.
+    /// </summary>
+    public uint NextUInt() {
+      uint t = _x ^ (_x << 11);
+      _x = _y; _y = _z; _z = _w;
+      return _w = (_w ^ (_w >> 19)) ^ (t ^ (t >> 8));
+    }
+
+    /// <summary>
+    /// Generates a random int over the range 0 to int.MaxValue, inclusive. 
+    /// This method differs from Next() only in that the range is 0 to int.MaxValue
+    /// and not 0 to int.MaxValue-1.
+    /// 
+    /// The slight difference in range means this method is slightly faster than Next()
+    /// but is not functionally equivalent to System.Random.Next().
+    /// </summary>
+    public int NextInt() {
+      uint t = _x ^ (_x << 11);
+      _x = _y; _y = _z; _z = _w;
+      return (int)(0x7FFFFFFF & (_w = (_w ^ (_w >> 19)) ^ (t ^ (t >> 8))));
+    }
+
+    /// <summary>
+    /// Generates a random double. Values returned are over the range (0, 1). That is, exclusive of both 0.0 and 1.0.
+    /// </summary>
+    public double NextDoubleNonZero() {
+      uint t = _x ^ (_x << 11);
+      _x = _y; _y = _z; _z = _w;
+
+      // See notes on NextDouble(). Here we generate a random value from 0 to 0x7f ff ff fe, and add one
+      // to generate a random value from 1 to 0x7f ff ff ff.
+      return REAL_UNIT_INT * (int)((0x7FFFFFFE & (_w = (_w ^ (_w >> 19)) ^ (t ^ (t >> 8)))) + 1U);
+    }
+
+    // Buffer 32 bits in bitBuffer, return 1 at a time, keep track of how many have been returned
+    // with bitMask.
+    uint _bitBuffer;
+    uint _bitMask;
+
+    /// <summary>
+    /// Generates a single random bit.
+    /// This method's performance is improved by generating 32 bits in one operation and storing them
+    /// ready for future calls.
+    /// </summary>
+    public bool NextBool() {
+      if (0 == _bitMask) {
+        // Generate 32 more bits.
+        uint t = _x ^ (_x << 11);
+        _x = _y; _y = _z; _z = _w;
+        _bitBuffer = _w = (_w ^ (_w >> 19)) ^ (t ^ (t >> 8));
+
+        // Reset the bitMask that tells us which bit to read next.
+        _bitMask = 0x80000000;
+        return (_bitBuffer & _bitMask) == 0;
+      }
+
+      return (_bitBuffer & (_bitMask >>= 1)) == 0;
+    }
+
+    // Buffer of random bytes. A single UInt32 is used to buffer 4 bytes.
+    // _byteBufferState tracks how bytes remain in the buffer, a value of 
+    // zero  indicates that the buffer is empty.
+    uint _byteBuffer;
+    byte _byteBufferState;
+
+    /// <summary>
+    /// Generates a signle random byte with range [0,255].
+    /// This method's performance is improved by generating 4 bytes in one operation and storing them
+    /// ready for future calls.
+    /// </summary>
+    public byte NextByte() {
+      if (0 == _byteBufferState) {
+        // Generate 4 more bytes.
+        uint t = _x ^ (_x << 11);
+        _x = _y; _y = _z; _z = _w;
+        _byteBuffer = _w = (_w ^ (_w >> 19)) ^ (t ^ (t >> 8));
+        _byteBufferState = 0x4;
+        return (byte)_byteBuffer;  // Note. Masking with 0xFF is unnecessary.
+      }
+      _byteBufferState >>= 1;
+      return (byte)(_byteBuffer >>= 1);
+    }
+
+    #endregion
+  }
+}
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Random/IRandom.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Random/IRandom.cs	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Random/IRandom.cs	(revision 16311)
@@ -0,0 +1,28 @@
+﻿#region License Information
+/* SimSharp - A .NET port of SimPy, discrete event simulation framework
+Copyright (C) 2016  Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.*/
+#endregion
+
+namespace SimSharp {
+  public interface IRandom {
+    int Next();
+    int Next(int upperBound);
+    int Next(int lowerBound, int upperBound);
+    double NextDouble();
+
+    void Reinitialise(int seed);
+  }
+}
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Random/SystemRandom.cs
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Random/SystemRandom.cs	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/Random/SystemRandom.cs	(revision 16311)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* SimSharp - A .NET port of SimPy, discrete event simulation framework
+Copyright (C) 2016  Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.*/
+#endregion
+
+using System;
+
+namespace SimSharp {
+  public class SystemRandom : IRandom {
+    private Random random;
+
+    public SystemRandom() {
+      random = new Random();
+    }
+
+    public SystemRandom(int seed) {
+      random = new Random(seed);
+    }
+    public int Next() {
+      return random.Next();
+    }
+
+    public int Next(int upperBound) {
+      return random.Next(upperBound);
+    }
+
+    public int Next(int lowerBound, int upperBound) {
+      return random.Next(lowerBound, upperBound);
+    }
+
+    public double NextDouble() {
+      return random.NextDouble();
+    }
+
+    public void Reinitialise(int seed) {
+      random = new Random(seed);
+    }
+  }
+}
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/SimSharp-3.0.11.csproj
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/SimSharp-3.0.11.csproj	(revision 16311)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.11/SimSharp-3.0.11/SimSharp-3.0.11.csproj	(revision 16311)
@@ -0,0 +1,133 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{9FE9C740-7859-4D01-AD07-7D4E15A6320B}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>SimSharp</RootNamespace>
+    <AssemblyName>SimSharp-3.0.11</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <TargetFrameworkProfile />
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\..\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
+    <OutputPath>..\..\..\..\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <DocumentationFile>
+    </DocumentationFile>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>..\..\..\..\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>..\..\..\..\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Analysis\ContinuousStatistics.cs" />
+    <Compile Include="Collections\EventQueue.cs" />
+    <Compile Include="Collections\EventQueueNode.cs" />
+    <Compile Include="Core\ActiveObject.cs" />
+    <Compile Include="Core\Events\AnyOf.cs" />
+    <Compile Include="Core\Events\AllOf.cs" />
+    <Compile Include="Core\Resources\Container.cs" />
+    <Compile Include="Core\Environment.cs" />
+    <Compile Include="Core\Resources\Events\ResourcePoolRequest.cs" />
+    <Compile Include="Core\Resources\Events\FilterStoreGet.cs" />
+    <Compile Include="Core\Resources\Events\StorePut.cs" />
+    <Compile Include="Core\Resources\Events\StoreGet.cs" />
+    <Compile Include="Core\Resources\Events\ContainerGet.cs" />
+    <Compile Include="Core\Resources\Events\ContainerPut.cs" />
+    <Compile Include="Core\Events\Condition.cs" />
+    <Compile Include="Core\Events\Event.cs" />
+    <Compile Include="Core\Resources\Events\PreemptiveRequest.cs" />
+    <Compile Include="Core\Events\Process.cs" />
+    <Compile Include="Core\Resources\Events\Release.cs" />
+    <Compile Include="Core\Resources\Events\PriorityRequest.cs" />
+    <Compile Include="Core\Resources\Events\Request.cs" />
+    <Compile Include="Core\Events\Timeout.cs" />
+    <Compile Include="Core\Exceptions\EmptyScheduleException.cs" />
+    <Compile Include="Core\Preempted.cs" />
+    <Compile Include="Core\Resources\FilterStore.cs" />
+    <Compile Include="Core\Resources\PreemptiveResource.cs" />
+    <Compile Include="Core\Resources\PriorityResource.cs" />
+    <Compile Include="Core\Resources\Resource.cs" />
+    <Compile Include="Core\Resources\ResourcePool.cs" />
+    <Compile Include="Core\Resources\Store.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Random\FastRandom.cs" />
+    <Compile Include="Random\IRandom.cs" />
+    <Compile Include="Random\SystemRandom.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Collections\EventQueue-License.txt" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.WinFormsUI/2.7.0/HeuristicLab.WinFormsUI-2.7.0/Plugin.cs.frame
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.WinFormsUI/2.7.0/HeuristicLab.WinFormsUI-2.7.0/Plugin.cs.frame	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.WinFormsUI/2.7.0/HeuristicLab.WinFormsUI-2.7.0/Plugin.cs.frame	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.WinFormsUI/2.7.0/HeuristicLab.WinFormsUI-2.7.0/Properties/AssemblyInfo.cs.frame
===================================================================
--- branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.WinFormsUI/2.7.0/HeuristicLab.WinFormsUI-2.7.0/Properties/AssemblyInfo.cs.frame	(revision 16308)
+++ branches/2845_EnhancedProgress/HeuristicLab.ExtLibs/HeuristicLab.WinFormsUI/2.7.0/HeuristicLab.WinFormsUI-2.7.0/Properties/AssemblyInfo.cs.frame	(revision 16311)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -32,5 +32,5 @@
 [assembly: AssemblyCompany("")]
 [assembly: AssemblyProduct("HeuristicLab")]
-[assembly: AssemblyCopyright("(c) 2002-2016 HEAL")]
+[assembly: AssemblyCopyright("(c) 2002-2018 HEAL")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
