Index: /branches/HeuristicLab.Mono/HeuristicLab 3.3 Tests.vsmdi
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab 3.3 Tests.vsmdi	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab 3.3 Tests.vsmdi	(revision 8585)
@@ -3,40 +3,40 @@
   <TestList name="HeuristicLab.Tests-Samples" id="0aad3ad9-2cb3-41d5-b82b-2da77b8f0a56" parentListId="8c43106b-9dc1-4907-a29f-aa66a61bf5b6">
     <TestLinks>
-      <TestLink id="fc406b79-142c-bb12-8287-0bc768acd728" name="CreateIslandGaTspSampleTest" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="1f743a89-461d-5650-31ba-e68c02f0fbad" name="RunGaVrpSampleTest" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="f8489a03-acca-11d3-53cb-8e24d5f2bc12" name="RunIslandGaTspSampleTest" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="7512aa68-9dbe-f891-d1da-99dc94661142" name="RunEsGriewankSampleTest" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="0f7f90f7-e380-ff65-538e-ae559774092a" name="RunPsoSchwefelSampleTest" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="53547167-fc2b-4954-b200-2cc27b4c4951" name="RunVnsTspSampleTest" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="45db65d6-d6b2-67e4-1bec-293528739529" name="CreateEsGriewankSampleTest" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="e6f3ab8a-1630-560c-c8b9-4e8ce2522172" name="CreateVnsTspSampleTest" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="433a86f1-0126-5281-1c23-90b47f066d94" name="RunGpSymbolicClassificationSampleTest" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="5c5fb63e-d219-6818-bba2-9f66dbe4d727" name="CreateGpSymbolicRegressionSampleTest" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="6c054fba-432a-4fe2-507f-e2083c998056" name="CreatePsoSchwefelSampleTest" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="0b6b45a4-99ea-b020-805a-1652f0f5b5a7" name="CreateSimulatedAnnealingRastriginSampleTest" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="74b708a9-14d0-3cc3-d72e-139d1a27f5ef" name="CreateGaTspSampleTest" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="8bb23f49-5206-4245-08b9-471f543b3e21" name="RunGpSymbolicRegressionSampleTest" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="eec82cf0-dae7-63c8-a469-6dd84d49a935" name="RunGaTspSampleTest" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="77c479e4-8f9a-5474-b026-e5c0811c8eb0" name="CreateLocalSearchKnapsackSampleTest" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="0d883f66-2fc5-99fc-eabb-2dff566104f5" name="CreateTabuSearchTspSampleTest" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="c8ea68e8-b9d7-24cb-5540-655f58da13bf" name="CreateGpArtificialAntSampleTest" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="7d7f6024-f783-1c71-db60-2d6746653109" name="RunSimulatedAnnealingRastriginSampleTest" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="51e968a7-120f-dd28-9514-ad35d3ee66d2" name="CreateGaVrpSampleTest" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="29188193-8d50-0c61-c6fa-4d5b608a72e8" name="RunGpArtificialAntSampleTest" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="95278ae9-832c-bef9-0bbc-4432195e63fa" name="RunTabuSearchTspSampleTest" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="21f1371d-8c47-9588-d8fa-cf45fd1d81eb" name="RunLocalSearchKnapsackSampleTest" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="29257c28-7dfb-f227-00a4-776d74b02a7b" name="CreateGpSymbolicClassificationSampleTest" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="fc406b79-142c-bb12-8287-0bc768acd728" name="CreateIslandGaTspSampleTest" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="1f743a89-461d-5650-31ba-e68c02f0fbad" name="RunGaVrpSampleTest" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="f8489a03-acca-11d3-53cb-8e24d5f2bc12" name="RunIslandGaTspSampleTest" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="7512aa68-9dbe-f891-d1da-99dc94661142" name="RunEsGriewankSampleTest" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="0f7f90f7-e380-ff65-538e-ae559774092a" name="RunPsoSchwefelSampleTest" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="53547167-fc2b-4954-b200-2cc27b4c4951" name="RunVnsTspSampleTest" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="45db65d6-d6b2-67e4-1bec-293528739529" name="CreateEsGriewankSampleTest" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="433a86f1-0126-5281-1c23-90b47f066d94" name="RunGpSymbolicClassificationSampleTest" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="5c5fb63e-d219-6818-bba2-9f66dbe4d727" name="CreateGpSymbolicRegressionSampleTest" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="6c054fba-432a-4fe2-507f-e2083c998056" name="CreatePsoSchwefelSampleTest" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="7d7f6024-f783-1c71-db60-2d6746653109" name="RunSimulatedAnnealingRastriginSampleTest" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="0b6b45a4-99ea-b020-805a-1652f0f5b5a7" name="CreateSimulatedAnnealingRastriginSampleTest" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="74b708a9-14d0-3cc3-d72e-139d1a27f5ef" name="CreateGaTspSampleTest" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="8bb23f49-5206-4245-08b9-471f543b3e21" name="RunGpSymbolicRegressionSampleTest" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="eec82cf0-dae7-63c8-a469-6dd84d49a935" name="RunGaTspSampleTest" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="77c479e4-8f9a-5474-b026-e5c0811c8eb0" name="CreateLocalSearchKnapsackSampleTest" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="0d883f66-2fc5-99fc-eabb-2dff566104f5" name="CreateTabuSearchTspSampleTest" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="c8ea68e8-b9d7-24cb-5540-655f58da13bf" name="CreateGpArtificialAntSampleTest" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="e6f3ab8a-1630-560c-c8b9-4e8ce2522172" name="CreateVnsTspSampleTest" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="51e968a7-120f-dd28-9514-ad35d3ee66d2" name="CreateGaVrpSampleTest" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="29188193-8d50-0c61-c6fa-4d5b608a72e8" name="RunGpArtificialAntSampleTest" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="95278ae9-832c-bef9-0bbc-4432195e63fa" name="RunTabuSearchTspSampleTest" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="21f1371d-8c47-9588-d8fa-cf45fd1d81eb" name="RunLocalSearchKnapsackSampleTest" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="29257c28-7dfb-f227-00a4-776d74b02a7b" name="CreateGpSymbolicClassificationSampleTest" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
     </TestLinks>
   </TestList>
   <TestList name="HeuristicLab.Problems.Instances.Tests" id="51dc1470-9bbb-4e7b-89f5-4595bacdbc42" parentListId="8c43106b-9dc1-4907-a29f-aa66a61bf5b6">
     <TestLinks>
-      <TestLink id="e5264222-cc79-4b16-d6fa-8fea9b868c0d" name="GetTSPLIBTSPInstanceTest" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="a4a79e51-0e00-0079-3cda-edacb878ba09" name="TestQAPLIBSolutions" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="fb433926-d43d-7fa9-3158-5a7d2f70b9a3" name="GetTSPLIBCVRPInstanceTest" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="c678a0cb-85a0-69f6-1dea-e61b4536de1e" name="GetElloumiCTAPInstanceTest" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="c048a606-a1e9-4d6a-91d7-febc30e0fead" name="GetQAPLIBInstanceTest" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="2002060f-2c38-f569-90a6-b19efd804446" name="GetCordeauGQAPInstanceTest" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="b3134ddf-d188-708f-0ea7-9eae51d3614a" name="TestQAPLIBInstances" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="48300c6a-c8fa-ea9f-3533-79e6e8046e78" name="GetTSPLIBATSPInstanceTest" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="e5264222-cc79-4b16-d6fa-8fea9b868c0d" name="GetTSPLIBTSPInstanceTest" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="a4a79e51-0e00-0079-3cda-edacb878ba09" name="TestQAPLIBSolutions" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="fb433926-d43d-7fa9-3158-5a7d2f70b9a3" name="GetTSPLIBCVRPInstanceTest" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="c678a0cb-85a0-69f6-1dea-e61b4536de1e" name="GetElloumiCTAPInstanceTest" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="c048a606-a1e9-4d6a-91d7-febc30e0fead" name="GetQAPLIBInstanceTest" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="2002060f-2c38-f569-90a6-b19efd804446" name="GetCordeauGQAPInstanceTest" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="b3134ddf-d188-708f-0ea7-9eae51d3614a" name="TestQAPLIBInstances" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="48300c6a-c8fa-ea9f-3533-79e6e8046e78" name="GetTSPLIBATSPInstanceTest" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
     </TestLinks>
   </TestList>
@@ -47,13 +47,15 @@
     <Description>This should be run whenever a new plugin is added or a plugin dependency or an assembly reference is added, updated, or deleted.</Description>
     <TestLinks>
-      <TestLink id="ec4d1ddf-ed6b-9f9e-29a0-d9e558856af1" name="ContentViewAttributeTest" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="202601a9-803a-67b8-a9d5-01dee0738a98" name="InstantiateAllCreatables" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="388c8c97-aaeb-a5f1-f695-656925a69975" name="TestParameterVisibility" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="29ead60b-2ae7-821a-ccc3-e5e4769661b7" name="TestStorableConstructor" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="36916402-ba0c-751d-366b-380dac87dcef" name="CheckPluginDependenciesForReferencedAssemblies" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="3983eb26-fd15-5b88-1fd7-07b363511b10" name="TestCloningConstructor" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="2028e687-d144-bb6f-bb05-ac86eaec07ee" name="TestCloningAllDeepCloneables" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="34ed65f1-46f7-d2e6-64cc-c2d958294d8b" name="CheckReferenceAssembliesForPluginDependencies" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-      <TestLink id="16b2cf1b-19e9-1b71-7f66-2744c23017a0" name="TestToString" storage="Heuristiclab.Tests\bin\Heuristiclab.Tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="0b6f54a2-1543-af9f-b604-0640ef177083" name="BuildTypeTest" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="ec4d1ddf-ed6b-9f9e-29a0-d9e558856af1" name="ContentViewAttributeTest" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="202601a9-803a-67b8-a9d5-01dee0738a98" name="InstantiateAllCreatables" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="388c8c97-aaeb-a5f1-f695-656925a69975" name="TestParameterVisibility" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="c895df0c-4700-c067-97e4-6bbde15397a5" name="IsSubTypeOfTest" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="29ead60b-2ae7-821a-ccc3-e5e4769661b7" name="TestStorableConstructor" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="36916402-ba0c-751d-366b-380dac87dcef" name="CheckPluginDependenciesForReferencedAssemblies" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="3983eb26-fd15-5b88-1fd7-07b363511b10" name="TestCloningConstructor" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="2028e687-d144-bb6f-bb05-ac86eaec07ee" name="TestCloningAllDeepCloneables" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="34ed65f1-46f7-d2e6-64cc-c2d958294d8b" name="CheckReferenceAssembliesForPluginDependencies" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+      <TestLink id="16b2cf1b-19e9-1b71-7f66-2744c23017a0" name="TestToString" storage="heuristiclab.tests\bin\heuristiclab.tests.dll" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
     </TestLinks>
   </TestList>
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis.Views/3.4/GaussianProcessModelView.Designer.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis.Views/3.4/GaussianProcessModelView.Designer.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis.Views/3.4/GaussianProcessModelView.Designer.cs	(revision 8585)
@@ -19,4 +19,6 @@
  */
 #endregion
+
+using HeuristicLab.Optimization.Views;
 
 namespace HeuristicLab.Algorithms.DataAnalysis.Views {
@@ -45,5 +47,14 @@
     /// </summary>
     private void InitializeComponent() {
+      this.resultCollectionView = new ResultCollectionView();
       this.SuspendLayout();
+      // 
+      // resultCollectionView
+      // 
+      this.resultCollectionView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.resultCollectionView.Location = new System.Drawing.Point(0, 0);
+      this.resultCollectionView.Name = "resultCollectionView";
+      this.resultCollectionView.Size = new System.Drawing.Size(253, 251);
+      this.resultCollectionView.TabIndex = 0;
       // 
       // GaussianProcessModelView
@@ -51,4 +62,5 @@
       this.AllowDrop = true;
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.resultCollectionView);
       this.Name = "GaussianProcessModelView";
       this.Size = new System.Drawing.Size(253, 251);
@@ -59,5 +71,5 @@
     #endregion
 
-
+    private ResultCollectionView resultCollectionView;
 
   }
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis.Views/3.4/GaussianProcessModelView.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis.Views/3.4/GaussianProcessModelView.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis.Views/3.4/GaussianProcessModelView.cs	(revision 8585)
@@ -21,6 +21,8 @@
 
 using System.Windows.Forms;
+using HeuristicLab.Data;
 using HeuristicLab.MainForm;
 using HeuristicLab.MainForm.WindowsForms;
+using HeuristicLab.Optimization;
 
 namespace HeuristicLab.Algorithms.DataAnalysis.Views {
@@ -31,5 +33,7 @@
     public new IGaussianProcessModel Content {
       get { return (IGaussianProcessModel)base.Content; }
-      set { base.Content = value; }
+      set {
+        base.Content = value;
+      }
     }
 
@@ -43,7 +47,16 @@
       if (Content == null) {
         // clear
+        resultCollectionView.Content = null;
       } else {
-        // update
+        resultCollectionView.Content = CreateResultCollection(Content);
       }
+    }
+
+    private ResultCollection CreateResultCollection(IGaussianProcessModel gaussianProcessModel) {
+      var res = new ResultCollection();
+      res.Add(new Result("Mean Function", gaussianProcessModel.MeanFunction));
+      res.Add(new Result("Covariance Function", gaussianProcessModel.CovarianceFunction));
+      res.Add(new Result("Noise sigma", new DoubleValue(gaussianProcessModel.SigmaNoise)));
+      return res;
     }
   }
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis.Views/3.4/GaussianProcessRegressionSolutionLineChartView.Designer.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis.Views/3.4/GaussianProcessRegressionSolutionLineChartView.Designer.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis.Views/3.4/GaussianProcessRegressionSolutionLineChartView.Designer.cs	(revision 8585)
@@ -0,0 +1,87 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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
+namespace HeuristicLab.Algorithms.DataAnalysis.Views {
+  partial class GaussianProcessRegressionSolutionLineChartView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
+      System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend();
+      this.chart = new HeuristicLab.Visualization.ChartControlsExtensions.EnhancedChart();
+      ((System.ComponentModel.ISupportInitialize)(this.chart)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // chart
+      // 
+      chartArea1.Name = "ChartArea";
+      this.chart.ChartAreas.Add(chartArea1);
+      this.chart.Dock = System.Windows.Forms.DockStyle.Fill;
+      legend1.Alignment = System.Drawing.StringAlignment.Center;
+      legend1.Docking = System.Windows.Forms.DataVisualization.Charting.Docking.Top;
+      legend1.Name = "Default";
+      this.chart.Legends.Add(legend1);
+      this.chart.Location = new System.Drawing.Point(0, 0);
+      this.chart.Name = "chart";
+      this.chart.Size = new System.Drawing.Size(358, 225);
+      this.chart.TabIndex = 0;
+      this.chart.CustomizeLegend += new System.EventHandler<System.Windows.Forms.DataVisualization.Charting.CustomizeLegendEventArgs>(this.chart_CustomizeLegend);
+      this.chart.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.Chart_MouseDoubleClick);
+      this.chart.MouseDown += new System.Windows.Forms.MouseEventHandler(this.chart_MouseDown);
+      this.chart.MouseMove += new System.Windows.Forms.MouseEventHandler(this.chart_MouseMove);
+      // 
+      // RegressionSolutionLineChartView
+      // 
+      this.AllowDrop = true;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.chart);
+      this.Name = "RegressionSolutionLineChartView";
+      this.Size = new System.Drawing.Size(358, 225);
+      ((System.ComponentModel.ISupportInitialize)(this.chart)).EndInit();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private HeuristicLab.Visualization.ChartControlsExtensions.EnhancedChart chart;
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis.Views/3.4/GaussianProcessRegressionSolutionLineChartView.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis.Views/3.4/GaussianProcessRegressionSolutionLineChartView.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis.Views/3.4/GaussianProcessRegressionSolutionLineChartView.cs	(revision 8585)
@@ -0,0 +1,327 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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 System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Windows.Forms;
+using System.Windows.Forms.DataVisualization.Charting;
+using HeuristicLab.MainForm;
+using HeuristicLab.Problems.DataAnalysis.Views;
+
+namespace HeuristicLab.Algorithms.DataAnalysis.Views {
+  [View("Line Chart 2")]
+  [Content(typeof(GaussianProcessRegressionSolution))]
+  public partial class GaussianProcessRegressionSolutionLineChartView : DataAnalysisSolutionEvaluationView {
+    private const string TARGETVARIABLE_SERIES_NAME = "Target Variable";
+    private const string ESTIMATEDVALUES_TRAINING_SERIES_NAME = "Estimated Values (training)";
+    private const string ESTIMATEDVALUES_TEST_SERIES_NAME = "Estimated Values (test)";
+    private const string ESTIMATEDVALUES_ALL_SERIES_NAME = "Estimated Values (all samples)";
+
+    public new GaussianProcessRegressionSolution Content {
+      get { return (GaussianProcessRegressionSolution)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public GaussianProcessRegressionSolutionLineChartView()
+      : base() {
+      InitializeComponent();
+      //configure axis
+      this.chart.CustomizeAllChartAreas();
+      this.chart.ChartAreas[0].CursorX.IsUserSelectionEnabled = true;
+      this.chart.ChartAreas[0].AxisX.ScaleView.Zoomable = true;
+      this.chart.ChartAreas[0].AxisX.IsStartedFromZero = true;
+      this.chart.ChartAreas[0].CursorX.Interval = 1;
+
+      this.chart.ChartAreas[0].CursorY.IsUserSelectionEnabled = true;
+      this.chart.ChartAreas[0].AxisY.ScaleView.Zoomable = true;
+      this.chart.ChartAreas[0].CursorY.Interval = 0;
+    }
+
+    private void RedrawChart() {
+      this.chart.Series.Clear();
+      if (Content != null) {
+        this.chart.ChartAreas[0].AxisX.Minimum = 0;
+        this.chart.ChartAreas[0].AxisX.Maximum = Content.ProblemData.Dataset.Rows - 1;
+
+        // training series
+        this.chart.Series.Add(ESTIMATEDVALUES_TRAINING_SERIES_NAME);
+        this.chart.Series[ESTIMATEDVALUES_TRAINING_SERIES_NAME].LegendText = ESTIMATEDVALUES_TRAINING_SERIES_NAME;
+        this.chart.Series[ESTIMATEDVALUES_TRAINING_SERIES_NAME].ChartType = SeriesChartType.Range;
+        this.chart.Series[ESTIMATEDVALUES_TRAINING_SERIES_NAME].EmptyPointStyle.Color = this.chart.Series[ESTIMATEDVALUES_TRAINING_SERIES_NAME].Color;
+        var mean = Content.EstimatedTrainingValues.ToArray();
+        var s2 = Content.EstimatedTrainingVariance.ToArray();
+        var lower = mean.Zip(s2, (m, s) => m - 1.96 * Math.Sqrt(s)).ToArray();
+        var upper = mean.Zip(s2, (m, s) => m + 1.96 * Math.Sqrt(s)).ToArray();
+        this.chart.Series[ESTIMATEDVALUES_TRAINING_SERIES_NAME].Points.DataBindXY(Content.ProblemData.TrainingIndices.ToArray(), lower, upper);
+        this.InsertEmptyPoints(this.chart.Series[ESTIMATEDVALUES_TRAINING_SERIES_NAME]);
+        this.chart.Series[ESTIMATEDVALUES_TRAINING_SERIES_NAME].Tag = Content;
+
+        // test series
+        this.chart.Series.Add(ESTIMATEDVALUES_TEST_SERIES_NAME);
+        this.chart.Series[ESTIMATEDVALUES_TEST_SERIES_NAME].LegendText = ESTIMATEDVALUES_TEST_SERIES_NAME;
+        this.chart.Series[ESTIMATEDVALUES_TEST_SERIES_NAME].ChartType = SeriesChartType.Range;
+
+        mean = Content.EstimatedTestValues.ToArray();
+        s2 = Content.EstimatedTestVariance.ToArray();
+        lower = mean.Zip(s2, (m, s) => m - 1.96 * Math.Sqrt(s)).ToArray();
+        upper = mean.Zip(s2, (m, s) => m + 1.96 * Math.Sqrt(s)).ToArray();
+        this.chart.Series[ESTIMATEDVALUES_TEST_SERIES_NAME].Points.DataBindXY(Content.ProblemData.TestIndices.ToArray(), lower, upper);
+        this.InsertEmptyPoints(this.chart.Series[ESTIMATEDVALUES_TEST_SERIES_NAME]);
+        this.chart.Series[ESTIMATEDVALUES_TEST_SERIES_NAME].Tag = Content;
+
+        // series of remaining points
+        int[] allIndices = Enumerable.Range(0, Content.ProblemData.Dataset.Rows).Except(Content.ProblemData.TrainingIndices).Except(Content.ProblemData.TestIndices).ToArray();
+        mean = Content.EstimatedValues.ToArray();
+        s2 = Content.EstimatedVariance.ToArray();
+        lower = mean.Zip(s2, (m, s) => m - 1.96 * Math.Sqrt(s)).ToArray();
+        upper = mean.Zip(s2, (m, s) => m + 1.96 * Math.Sqrt(s)).ToArray();
+        List<double> allLower = allIndices.Select(index => lower[index]).ToList();
+        List<double> allUpper = allIndices.Select(index => upper[index]).ToList();
+        this.chart.Series.Add(ESTIMATEDVALUES_ALL_SERIES_NAME);
+        this.chart.Series[ESTIMATEDVALUES_ALL_SERIES_NAME].LegendText = ESTIMATEDVALUES_ALL_SERIES_NAME;
+        this.chart.Series[ESTIMATEDVALUES_ALL_SERIES_NAME].ChartType = SeriesChartType.Range;
+        if (allIndices.Count() > 0) {
+          this.chart.Series[ESTIMATEDVALUES_ALL_SERIES_NAME].Points.DataBindXY(allIndices, allLower, allUpper);
+          this.InsertEmptyPoints(this.chart.Series[ESTIMATEDVALUES_ALL_SERIES_NAME]);
+        }
+        this.chart.Series[ESTIMATEDVALUES_ALL_SERIES_NAME].Tag = Content;
+
+        // target
+        this.chart.Series.Add(TARGETVARIABLE_SERIES_NAME);
+        this.chart.Series[TARGETVARIABLE_SERIES_NAME].LegendText = Content.ProblemData.TargetVariable;
+        this.chart.Series[TARGETVARIABLE_SERIES_NAME].ChartType = SeriesChartType.FastLine;
+        this.chart.Series[TARGETVARIABLE_SERIES_NAME].Points.DataBindXY(Enumerable.Range(0, Content.ProblemData.Dataset.Rows).ToArray(),
+          Content.ProblemData.Dataset.GetDoubleValues(Content.ProblemData.TargetVariable).ToArray());
+
+        this.ToggleSeriesData(this.chart.Series[ESTIMATEDVALUES_ALL_SERIES_NAME]);
+
+
+        // the series have been added in different order than in the normal line chart 
+        // --> adapt coloring;
+        chart.ApplyPaletteColors();
+        this.chart.Palette = ChartColorPalette.None;
+        var s0Color = chart.Series[0].Color;
+        var s1Color = chart.Series[1].Color;
+        var s2Color = chart.Series[2].Color;
+        var s3Color = chart.Series[3].Color;
+        this.chart.PaletteCustomColors = new Color[] { s1Color, s2Color, s3Color, s0Color };
+
+        UpdateCursorInterval();
+        this.UpdateStripLines();
+      }
+    }
+
+    private void InsertEmptyPoints(Series series) {
+      int i = 0;
+      while (i < series.Points.Count - 1) {
+        if (series.Points[i].IsEmpty) {
+          ++i;
+          continue;
+        }
+
+        var p1 = series.Points[i];
+        var p2 = series.Points[i + 1];
+        // check for consecutive indices
+        if ((int)p2.XValue - (int)p1.XValue != 1) {
+          // insert an empty point between p1 and p2 so that the line will be invisible (transparent)
+          var p = new DataPoint((int)((p1.XValue + p2.XValue) / 2), new double[] { 0.0, 0.0 }) { IsEmpty = true };
+          // insert 
+          series.Points.Insert(i + 1, p);
+        }
+        ++i;
+      }
+    }
+
+    private void UpdateCursorInterval() {
+      var estimatedValues = this.chart.Series[ESTIMATEDVALUES_TRAINING_SERIES_NAME].Points.Select(x => x.YValues[0]).DefaultIfEmpty(1.0);
+      var targetValues = this.chart.Series[TARGETVARIABLE_SERIES_NAME].Points.Select(x => x.YValues[0]).DefaultIfEmpty(1.0);
+      double estimatedValuesRange = estimatedValues.Max() - estimatedValues.Min();
+      double targetValuesRange = targetValues.Max() - targetValues.Min();
+      double interestingValuesRange = Math.Min(Math.Max(targetValuesRange, 1.0), Math.Max(estimatedValuesRange, 1.0));
+      double digits = (int)Math.Log10(interestingValuesRange) - 3;
+      double yZoomInterval = Math.Max(Math.Pow(10, digits), 10E-5);
+      this.chart.ChartAreas[0].CursorY.Interval = yZoomInterval;
+    }
+
+    #region events
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ModelChanged += new EventHandler(Content_ModelChanged);
+      Content.ProblemDataChanged += new EventHandler(Content_ProblemDataChanged);
+    }
+    protected override void DeregisterContentEvents() {
+      base.DeregisterContentEvents();
+      Content.ModelChanged -= new EventHandler(Content_ModelChanged);
+      Content.ProblemDataChanged -= new EventHandler(Content_ProblemDataChanged);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      RedrawChart();
+    }
+    private void Content_ProblemDataChanged(object sender, EventArgs e) {
+      RedrawChart();
+    }
+    private void Content_ModelChanged(object sender, EventArgs e) {
+      RedrawChart();
+    }
+
+
+
+    private void Chart_MouseDoubleClick(object sender, MouseEventArgs e) {
+      HitTestResult result = chart.HitTest(e.X, e.Y);
+      if (result.ChartArea != null && (result.ChartElementType == ChartElementType.PlottingArea ||
+                                       result.ChartElementType == ChartElementType.Gridlines) ||
+                                       result.ChartElementType == ChartElementType.StripLines) {
+        foreach (var axis in result.ChartArea.Axes)
+          axis.ScaleView.ZoomReset(int.MaxValue);
+      }
+    }
+    #endregion
+
+    private void UpdateStripLines() {
+      this.chart.ChartAreas[0].AxisX.StripLines.Clear();
+
+      int[] attr = new int[Content.ProblemData.Dataset.Rows + 1]; // add a virtual last row that is again empty to simplify loop further down
+      foreach (var row in Content.ProblemData.TrainingIndices) {
+        attr[row] += 1;
+      }
+      foreach (var row in Content.ProblemData.TestIndices) {
+        attr[row] += 2;
+      }
+      int start = 0;
+      int curAttr = attr[start];
+      for (int row = 0; row < attr.Length; row++) {
+        if (attr[row] != curAttr) {
+          switch (curAttr) {
+            case 0: break;
+            case 1:
+              this.CreateAndAddStripLine("Training", start, row, Color.FromArgb(40, Color.Green), Color.Transparent);
+              break;
+            case 2:
+              this.CreateAndAddStripLine("Test", start, row, Color.FromArgb(40, Color.Red), Color.Transparent);
+              break;
+            case 3:
+              this.CreateAndAddStripLine("Training and Test", start, row, Color.FromArgb(40, Color.Green), Color.FromArgb(40, Color.Red), ChartHatchStyle.WideUpwardDiagonal);
+              break;
+            default:
+              // should not happen
+              break;
+          }
+          curAttr = attr[row];
+          start = row;
+        }
+      }
+    }
+
+    private void CreateAndAddStripLine(string title, int start, int end, Color color, Color secondColor, ChartHatchStyle hatchStyle = ChartHatchStyle.None) {
+      StripLine stripLine = new StripLine();
+      stripLine.BackColor = color;
+      stripLine.BackSecondaryColor = secondColor;
+      stripLine.BackHatchStyle = hatchStyle;
+      stripLine.Text = title;
+      stripLine.Font = new Font("Times New Roman", 12, FontStyle.Bold);
+      // strip range is [start .. end] inclusive, but we evaluate [start..end[ (end is exclusive)
+      // the strip should be by one longer (starting at start - 0.5 and ending at end + 0.5)
+      stripLine.StripWidth = end - start;
+      stripLine.IntervalOffset = start - 0.5; // start slightly to the left of the first point to clearly indicate the first point in the partition
+      this.chart.ChartAreas[0].AxisX.StripLines.Add(stripLine);
+    }
+
+    private void ToggleSeriesData(Series series) {
+      if (series.Points.Count > 0) {  //checks if series is shown
+        if (this.chart.Series.Any(s => s != series && s.Points.Count > 0)) {
+          ClearPointsQuick(series.Points);
+        }
+      } else if (Content != null) {
+
+        IEnumerable<int> indices = null;
+        IEnumerable<double> mean = null;
+        IEnumerable<double> s2 = null;
+        double[] lower = null;
+        double[] upper = null;
+        switch (series.Name) {
+          case ESTIMATEDVALUES_ALL_SERIES_NAME:
+            indices = Enumerable.Range(0, Content.ProblemData.Dataset.Rows).Except(Content.ProblemData.TrainingIndices).Except(Content.ProblemData.TestIndices).ToArray();
+            mean = Content.EstimatedValues.ToArray();
+            s2 = Content.EstimatedVariance.ToArray();
+            lower = mean.Zip(s2, (m, s) => m - 1.96 * Math.Sqrt(s)).ToArray();
+            upper = mean.Zip(s2, (m, s) => m + 1.96 * Math.Sqrt(s)).ToArray();
+            lower = indices.Select(index => lower[index]).ToArray();
+            upper = indices.Select(index => upper[index]).ToArray();
+            break;
+          case ESTIMATEDVALUES_TRAINING_SERIES_NAME:
+            indices = Content.ProblemData.TrainingIndices.ToArray();
+            mean = Content.EstimatedTrainingValues.ToArray();
+            s2 = Content.EstimatedTrainingVariance.ToArray();
+            lower = mean.Zip(s2, (m, s) => m - 1.96 * Math.Sqrt(s)).ToArray();
+            upper = mean.Zip(s2, (m, s) => m + 1.96 * Math.Sqrt(s)).ToArray();
+            break;
+          case ESTIMATEDVALUES_TEST_SERIES_NAME:
+            indices = Content.ProblemData.TestIndices.ToArray();
+            mean = Content.EstimatedTestValues.ToArray();
+            s2 = Content.EstimatedTestVariance.ToArray();
+            lower = mean.Zip(s2, (m, s) => m - 1.96 * Math.Sqrt(s)).ToArray();
+            upper = mean.Zip(s2, (m, s) => m + 1.96 * Math.Sqrt(s)).ToArray();
+            break;
+        }
+        if (indices.Count() > 0) {
+          series.Points.DataBindXY(indices, lower, upper);
+          this.InsertEmptyPoints(series);
+          chart.Legends[series.Legend].ForeColor = Color.Black;
+          UpdateCursorInterval();
+          chart.Refresh();
+        }
+      }
+    }
+
+    // workaround as per http://stackoverflow.com/questions/5744930/datapointcollection-clear-performance
+    private static void ClearPointsQuick(DataPointCollection points) {
+      points.SuspendUpdates();
+      while (points.Count > 0)
+        points.RemoveAt(points.Count - 1);
+      points.ResumeUpdates();
+    }
+
+    private void chart_MouseMove(object sender, MouseEventArgs e) {
+      HitTestResult result = chart.HitTest(e.X, e.Y);
+      if (result.ChartElementType == ChartElementType.LegendItem && result.Series.Name != TARGETVARIABLE_SERIES_NAME)
+        Cursor = Cursors.Hand;
+      else
+        Cursor = Cursors.Default;
+    }
+    private void chart_MouseDown(object sender, MouseEventArgs e) {
+      HitTestResult result = chart.HitTest(e.X, e.Y);
+      if (result.ChartElementType == ChartElementType.LegendItem && result.Series.Name != TARGETVARIABLE_SERIES_NAME) {
+        ToggleSeriesData(result.Series);
+      }
+    }
+
+    private void chart_CustomizeLegend(object sender, CustomizeLegendEventArgs e) {
+      if (chart.Series.Count != 4) return;
+      e.LegendItems[0].Cells[1].ForeColor = this.chart.Series[ESTIMATEDVALUES_TRAINING_SERIES_NAME].Points.Count == 0 ? Color.Gray : Color.Black;
+      e.LegendItems[1].Cells[1].ForeColor = this.chart.Series[ESTIMATEDVALUES_TEST_SERIES_NAME].Points.Count == 0 ? Color.Gray : Color.Black;
+      e.LegendItems[2].Cells[1].ForeColor = this.chart.Series[ESTIMATEDVALUES_ALL_SERIES_NAME].Points.Count == 0 ? Color.Gray : Color.Black;
+      e.LegendItems[3].Cells[1].ForeColor = this.chart.Series[TARGETVARIABLE_SERIES_NAME].Points.Count == 0 ? Color.Gray : Color.Black;
+    }
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis.Views/3.4/HeuristicLab.Algorithms.DataAnalysis.Views-3.4.csproj
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis.Views/3.4/HeuristicLab.Algorithms.DataAnalysis.Views-3.4.csproj	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis.Views/3.4/HeuristicLab.Algorithms.DataAnalysis.Views-3.4.csproj	(revision 8585)
@@ -112,4 +112,5 @@
     <Reference Include="System.Drawing" />
     <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Windows.Forms.DataVisualization" />
     <Reference Include="System.Xml.Linq" />
     <Reference Include="System.Data.DataSetExtensions" />
@@ -118,4 +119,16 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="MeanProdView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="MeanProdView.Designer.cs">
+      <DependentUpon>MeanProdView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="MeanSumView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="MeanSumView.Designer.cs">
+      <DependentUpon>MeanSumView.cs</DependentUpon>
+    </Compile>
     <Compile Include="CovarianceProdView.cs">
       <SubType>UserControl</SubType>
@@ -142,5 +155,17 @@
       <DependentUpon>KMeansClusteringModelView.cs</DependentUpon>
     </Compile>
+    <Compile Include="NcaDimensionReductionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="NcaDimensionReductionView.Designer.cs">
+      <DependentUpon>NcaDimensionReductionView.cs</DependentUpon>
+    </Compile>
     <Compile Include="Plugin.cs" />
+    <Compile Include="GaussianProcessRegressionSolutionLineChartView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="GaussianProcessRegressionSolutionLineChartView.Designer.cs">
+      <DependentUpon>GaussianProcessRegressionSolutionLineChartView.cs</DependentUpon>
+    </Compile>
     <Compile Include="SupportVectorMachineModelSupportVectorsView.cs">
       <SubType>UserControl</SubType>
@@ -174,4 +199,9 @@
       <Private>False</Private>
     </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Analysis\3.3\HeuristicLab.Analysis-3.3.csproj">
+      <Project>{887425B4-4348-49ED-A457-B7D2C26DDBF9}</Project>
+      <Name>HeuristicLab.Analysis-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Collections\3.3\HeuristicLab.Collections-3.3.csproj">
       <Project>{958B43BC-CC5C-4FA2-8628-2B3B01D890B6}</Project>
@@ -242,4 +272,9 @@
       <Project>{DF87C13E-A889-46FF-8153-66DCAA8C5674}</Project>
       <Name>HeuristicLab.Problems.DataAnalysis-3.4</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Visualization.ChartControlsExtensions\3.3\HeuristicLab.Visualization.ChartControlsExtensions-3.3.csproj">
+      <Project>{315BDA09-3F4F-49B3-9790-B37CFC1C5750}</Project>
+      <Name>HeuristicLab.Visualization.ChartControlsExtensions-3.3</Name>
       <Private>False</Private>
     </ProjectReference>
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis.Views/3.4/MeanProdView.Designer.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis.Views/3.4/MeanProdView.Designer.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis.Views/3.4/MeanProdView.Designer.cs	(revision 8585)
@@ -0,0 +1,77 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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
+
+namespace HeuristicLab.Algorithms.DataAnalysis.Views {
+  partial class MeanProdView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.itemListView = new HeuristicLab.Core.Views.ItemListView<IMeanFunction>();
+      this.SuspendLayout();
+      // 
+      // itemListView
+      // 
+      this.itemListView.Caption = "ItemList View";
+      this.itemListView.Content = null;
+      this.itemListView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.itemListView.Location = new System.Drawing.Point(0, 0);
+      this.itemListView.Name = "itemListView";
+      this.itemListView.ReadOnly = false;
+      this.itemListView.Size = new System.Drawing.Size(253, 251);
+      this.itemListView.TabIndex = 0;
+      // 
+      // CovarianceSumView
+      // 
+      this.AllowDrop = true;
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.itemListView);
+      this.Name = "CovarianceSumView";
+      this.Size = new System.Drawing.Size(253, 251);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+
+    private Core.Views.ItemListView<IMeanFunction> itemListView;
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis.Views/3.4/MeanProdView.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis.Views/3.4/MeanProdView.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis.Views/3.4/MeanProdView.cs	(revision 8585)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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 System.Windows.Forms;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Algorithms.DataAnalysis.Views {
+  [View("Mean Product View")]
+  [Content(typeof(MeanProd), true)]
+  public partial class MeanProdView : AsynchronousContentView {
+
+    public new MeanProd Content {
+      get { return (MeanProd)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public MeanProdView()
+      : base() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        // clear
+        this.itemListView.Content = null;
+      } else {
+        // update
+        this.itemListView.Content = Content.Factors;
+      }
+    }
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis.Views/3.4/MeanSumView.Designer.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis.Views/3.4/MeanSumView.Designer.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis.Views/3.4/MeanSumView.Designer.cs	(revision 8585)
@@ -0,0 +1,77 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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
+
+namespace HeuristicLab.Algorithms.DataAnalysis.Views {
+  partial class MeanSumView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.itemListView = new HeuristicLab.Core.Views.ItemListView<IMeanFunction>();
+      this.SuspendLayout();
+      // 
+      // itemListView
+      // 
+      this.itemListView.Caption = "ItemList View";
+      this.itemListView.Content = null;
+      this.itemListView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.itemListView.Location = new System.Drawing.Point(0, 0);
+      this.itemListView.Name = "itemListView";
+      this.itemListView.ReadOnly = false;
+      this.itemListView.Size = new System.Drawing.Size(253, 251);
+      this.itemListView.TabIndex = 0;
+      // 
+      // CovarianceSumView
+      // 
+      this.AllowDrop = true;
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.itemListView);
+      this.Name = "CovarianceSumView";
+      this.Size = new System.Drawing.Size(253, 251);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+
+    private Core.Views.ItemListView<IMeanFunction> itemListView;
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis.Views/3.4/MeanSumView.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis.Views/3.4/MeanSumView.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis.Views/3.4/MeanSumView.cs	(revision 8585)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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 System.Windows.Forms;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Algorithms.DataAnalysis.Views {
+  [View("Mean Sum View")]
+  [Content(typeof(MeanSum), true)]
+  public partial class MeanSumView : AsynchronousContentView {
+
+    public new MeanSum Content {
+      get { return (MeanSum)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public MeanSumView()
+      : base() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        // clear
+        this.itemListView.Content = null;
+      } else {
+        // update
+        this.itemListView.Content = Content.Terms;
+      }
+    }
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis.Views/3.4/NcaDimensionReductionView.Designer.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis.Views/3.4/NcaDimensionReductionView.Designer.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis.Views/3.4/NcaDimensionReductionView.Designer.cs	(revision 8585)
@@ -0,0 +1,134 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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
+
+namespace HeuristicLab.Algorithms.DataAnalysis.Views {
+  partial class NCADimensionReductionView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.messageLabel = new System.Windows.Forms.Label();
+      this.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.rangeLabel = new System.Windows.Forms.Label();
+      this.rangeComboBox = new System.Windows.Forms.ComboBox();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // messageLabel
+      // 
+      this.messageLabel.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.messageLabel.Location = new System.Drawing.Point(0, 0);
+      this.messageLabel.Name = "messageLabel";
+      this.messageLabel.Size = new System.Drawing.Size(300, 167);
+      this.messageLabel.TabIndex = 0;
+      this.messageLabel.Text = "Visualization is not supported for more than two dimensions.";
+      this.messageLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
+      this.splitContainer.IsSplitterFixed = true;
+      this.splitContainer.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer.Name = "splitContainer";
+      this.splitContainer.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.rangeComboBox);
+      this.splitContainer.Panel1.Controls.Add(this.rangeLabel);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.messageLabel);
+      this.splitContainer.Size = new System.Drawing.Size(300, 198);
+      this.splitContainer.SplitterDistance = 27;
+      this.splitContainer.TabIndex = 1;
+      // 
+      // rangeLabel
+      // 
+      this.rangeLabel.AutoSize = true;
+      this.rangeLabel.Location = new System.Drawing.Point(3, 6);
+      this.rangeLabel.Name = "rangeLabel";
+      this.rangeLabel.Size = new System.Drawing.Size(47, 13);
+      this.rangeLabel.TabIndex = 0;
+      this.rangeLabel.Text = "Samples";
+      // 
+      // rangeComboBox
+      // 
+      this.rangeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.rangeComboBox.FormattingEnabled = true;
+      this.rangeComboBox.Items.AddRange(new object[] {
+            "Training",
+            "Test",
+            "All samples"});
+      this.rangeComboBox.Location = new System.Drawing.Point(56, 3);
+      this.rangeComboBox.Name = "rangeComboBox";
+      this.rangeComboBox.Size = new System.Drawing.Size(146, 21);
+      this.rangeComboBox.TabIndex = 1;
+      this.rangeComboBox.SelectedIndexChanged += new System.EventHandler(this.rangeComboBox_SelectedIndexChanged);
+      // 
+      // NCADimensionalityReductionView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.splitContainer);
+      this.Name = "NCADimensionalityReductionView";
+      this.Size = new System.Drawing.Size(300, 198);
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel1.PerformLayout();
+      this.splitContainer.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
+      this.splitContainer.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label messageLabel;
+    private System.Windows.Forms.SplitContainer splitContainer;
+    private System.Windows.Forms.ComboBox rangeComboBox;
+    private System.Windows.Forms.Label rangeLabel;
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis.Views/3.4/NcaDimensionReductionView.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis.Views/3.4/NcaDimensionReductionView.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis.Views/3.4/NcaDimensionReductionView.cs	(revision 8585)
@@ -0,0 +1,103 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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 System.Collections.Generic;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+using HeuristicLab.Problems.DataAnalysis.Views;
+
+namespace HeuristicLab.Algorithms.DataAnalysis.Views {
+  [View("Dimension Reduction")]
+  [Content(typeof(INcaClassificationSolution), IsDefaultView = false)]
+  public partial class NCADimensionReductionView : DataAnalysisSolutionEvaluationView {
+    private ViewHost viewHost = new ViewHost();
+    private ScatterPlot scatterPlot = new ScatterPlot();
+
+    public new INcaClassificationSolution Content {
+      get { return (INcaClassificationSolution)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public NCADimensionReductionView() {
+      InitializeComponent();
+      messageLabel.Visible = false;
+      viewHost.Dock = DockStyle.Fill;
+      splitContainer.Panel2.Controls.Add(viewHost);
+      rangeComboBox.SelectedIndex = 0;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        viewHost.Content = null;
+        scatterPlot.Rows.Clear();
+      } else {
+        UpdateScatterPlot();
+        viewHost.Content = scatterPlot;
+      }
+    }
+
+    private void UpdateScatterPlot() {
+      scatterPlot.Rows.Clear();
+      var rows = Content.ProblemData.ClassValues
+        .ToDictionary(c => c, c => new ScatterPlotDataRow(Content.ProblemData.GetClassName(c), string.Empty, Enumerable.Empty<Point2D<double>>()));
+      foreach (var r in rows.Values)
+        r.VisualProperties.PointSize = 5;
+
+      IEnumerable<int> range = null;
+      if (rangeComboBox.SelectedIndex == 0) range = Content.ProblemData.TrainingIndices;
+      else if (rangeComboBox.SelectedIndex == 1) range = Content.ProblemData.TestIndices;
+      else range = Enumerable.Range(0, Content.ProblemData.Dataset.Rows);
+
+      var reduced = Content.Model.Reduce(Content.ProblemData.Dataset, range);
+
+      int idx = 0;
+      if (reduced.GetLength(1) == 2) { // last column is the target variable
+        foreach (var r in range) {
+          var label = Content.ProblemData.Dataset.GetDoubleValue(Content.ProblemData.TargetVariable, r);
+          rows[label].Points.Add(new Point2D<double>(reduced[idx++, 0], 1.0));
+        }
+      } else {
+        foreach (var r in range) {
+          var label = Content.ProblemData.Dataset.GetDoubleValue(Content.ProblemData.TargetVariable, r);
+          rows[label].Points.Add(new Point2D<double>(reduced[idx, 0], reduced[idx, 1]));
+          idx++;
+        }
+      }
+      scatterPlot.Rows.AddRange(rows.Values);
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      rangeComboBox.Enabled = Content != null && viewHost.Visible;
+    }
+
+    #region Event Handlers
+    private void rangeComboBox_SelectedIndexChanged(object sender, System.EventArgs e) {
+      if (Content != null) UpdateScatterPlot();
+    }
+    #endregion
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis.Views/3.4/Plugin.cs.frame
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis.Views/3.4/Plugin.cs.frame	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis.Views/3.4/Plugin.cs.frame	(revision 8585)
@@ -29,4 +29,6 @@
   [PluginFile("HeuristicLab.Algorithms.DataAnalysis.Views-3.4.dll", PluginFileType.Assembly)]
   [PluginDependency("HeuristicLab.Algorithms.DataAnalysis", "3.4")]
+  [PluginDependency("HeuristicLab.Analysis", "3.3")]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
   [PluginDependency("HeuristicLab.Common", "3.3")]
   [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
@@ -41,4 +43,6 @@
   [PluginDependency("HeuristicLab.Optimization.Views", "3.3")]
   [PluginDependency("HeuristicLab.Problems.DataAnalysis", "3.4")]
+  [PluginDependency("HeuristicLab.Problems.DataAnalysis.Views", "3.4")]
+  [PluginDependency("HeuristicLab.Visualization.ChartControlsExtensions", "3.3")]
   public class HeuristicLabAlgorithmsDataAnalysisViewsPlugin : PluginBase {
   }
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/CrossValidation.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/CrossValidation.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/CrossValidation.cs	(revision 8585)
@@ -447,9 +447,6 @@
         problemDataClone.TestPartition.Start = SamplesStart.Value; problemDataClone.TestPartition.End = SamplesEnd.Value;
         // clone models
-        var ensembleSolution = new ClassificationEnsembleSolution(
-          solutions.Value.Select(x => cloner.Clone(x.Model)),
-          problemDataClone,
-          solutions.Value.Select(x => cloner.Clone(x.ProblemData.TrainingPartition)),
-          solutions.Value.Select(x => cloner.Clone(x.ProblemData.TestPartition)));
+        var ensembleSolution = new ClassificationEnsembleSolution(problemDataClone);
+        ensembleSolution.AddClassificationSolutions(solutions.Value);
 
         aggregatedResults.Add(new Result(solutions.Key + " (ensemble)", ensembleSolution));
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceConst.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceConst.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceConst.cs	(revision 8585)
@@ -0,0 +1,104 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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 System;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Algorithms.DataAnalysis {
+  [StorableClass]
+  [Item(Name = "CovarianceConst",
+    Description = "Constant covariance function for Gaussian processes.")]
+  public class CovarianceConst : CovarianceFunction {
+
+    public IValueParameter<DoubleValue> ScaleParameter {
+      get { return scaleParameter; }
+    }
+
+    [Storable]
+    private readonly HyperParameter<DoubleValue> scaleParameter;
+
+    [Storable]
+    private double scale;
+
+    [StorableConstructor]
+    protected CovarianceConst(bool deserializing)
+      : base(deserializing) {
+    }
+
+    protected CovarianceConst(CovarianceConst original, Cloner cloner)
+      : base(original, cloner) {
+      this.scaleParameter = cloner.Clone(original.scaleParameter);
+      this.scale = original.scale;
+
+      RegisterEvents();
+    }
+
+    public CovarianceConst()
+      : base() {
+      scaleParameter = new HyperParameter<DoubleValue>("Scale", "The scale of the constant covariance function.");
+      Parameters.Add(scaleParameter);
+      RegisterEvents();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEvents();
+    }
+
+    // caching
+    private void RegisterEvents() {
+      AttachValueChangeHandler<DoubleValue, double>(scaleParameter, () => { scale = scaleParameter.Value.Value; });
+    }
+
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CovarianceConst(this, cloner);
+    }
+
+    public override int GetNumberOfParameters(int numberOfVariables) {
+      return scaleParameter.Fixed ? 0 : 1;
+    }
+
+    public override void SetParameter(double[] hyp) {
+      if (!scaleParameter.Fixed && hyp.Length == 1) {
+        scaleParameter.SetValue(new DoubleValue(Math.Exp(2 * hyp[0])));
+      } else {
+        throw new ArgumentException("The length of the parameter vector does not match the number of free parameters for CovarianceConst", "hyp");
+      }
+    }
+
+    public override double GetCovariance(double[,] x, int i, int j) {
+      return scale;
+    }
+
+    public override IEnumerable<double> GetGradient(double[,] x, int i, int j) {
+      yield return 2.0 * scale;
+    }
+
+    public override double GetCrossCovariance(double[,] x, double[,] xt, int i, int j) {
+      return scale;
+    }
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceFunction.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceFunction.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceFunction.cs	(revision 8585)
@@ -0,0 +1,98 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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 System;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Algorithms.DataAnalysis {
+  [StorableClass]
+  // base class for covariance functions
+  public abstract class CovarianceFunction : ParameterizedNamedItem, ICovarianceFunction {
+    [StorableConstructor]
+    protected CovarianceFunction(bool deserializing)
+      : base(deserializing) {
+    }
+
+    protected CovarianceFunction(CovarianceFunction original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected CovarianceFunction()
+      : base() {
+      Name = ItemName;
+      Description = ItemDescription;
+    }
+
+    protected void SetNullableDoubleParameter(IValueParameter<DoubleValue> parameter, double? value) {
+      if (value.HasValue) {
+        parameter.Value = new DoubleValue(value.Value);
+      } else {
+        parameter.Value = null;
+      }
+    }
+
+    protected double? GetNullableDoubleParameter(IValueParameter<DoubleValue> parameter) {
+      return parameter.Value == null ? (double?)null : parameter.Value.Value;
+    }
+
+    protected void AttachValueChangeHandler<T, U>(IValueParameter<T> parameter, Action action)
+      where T : ValueTypeValue<U>
+      where U : struct {
+      parameter.ValueChanged += (sender, args) => {
+        if (parameter.Value != null) {
+          parameter.Value.ValueChanged += (s, a) => action();
+          action();
+        }
+      };
+      if (parameter.Value != null) {
+        parameter.Value.ValueChanged += (s, a) => action();
+      }
+    }
+
+    protected void AttachArrayChangeHandler<T, U>(IValueParameter<T> parameter, Action action)
+      where T : ValueTypeArray<U>
+      where U : struct {
+      parameter.ValueChanged += (sender, args) => {
+        if (parameter.Value != null) {
+          parameter.Value.ItemChanged += (s, a) => action();
+          parameter.Value.Reset += (s, a) => action();
+          action();
+        }
+      };
+      if (parameter.Value != null) {
+        parameter.Value.ItemChanged += (s, a) => action();
+        parameter.Value.Reset += (s, a) => action();
+      }
+
+    }
+
+    public abstract int GetNumberOfParameters(int numberOfVariables);
+    public abstract void SetParameter(double[] hyp);
+    public abstract double GetCovariance(double[,] x, int i, int j);
+    public abstract IEnumerable<double> GetGradient(double[,] x, int i, int j);
+    public abstract double GetCrossCovariance(double[,] x, double[,] xt, int i, int j);
+
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceLinear.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceLinear.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceLinear.cs	(revision 8585)
@@ -21,4 +21,5 @@
 
 using System;
+using System.Collections.Generic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -28,16 +29,6 @@
   [StorableClass]
   [Item(Name = "CovarianceLinear", Description = "Linear covariance function for Gaussian processes.")]
-  public class CovarianceLinear : Item, ICovarianceFunction {
-    private static readonly double[] emptyArray = new double[0];
-
-    [Storable]
-    private double[,] x;
-    [Storable]
-    private double[,] xt;
-
-    private double[,] k;
-    private bool symmetric;
-
-    public int GetNumberOfParameters(int numberOfVariables) {
+  public class CovarianceLinear : CovarianceFunction {
+    public override int GetNumberOfParameters(int numberOfVariables) {
       return 0;
     }
@@ -46,15 +37,4 @@
     protected CovarianceLinear(CovarianceLinear original, Cloner cloner)
       : base(original, cloner) {
-      if (original.x != null) {
-        this.x = new double[original.x.GetLength(0), original.x.GetLength(1)];
-        Array.Copy(original.x, this.x, x.Length);
-
-        this.xt = new double[original.xt.GetLength(0), original.xt.GetLength(1)];
-        Array.Copy(original.xt, this.xt, xt.Length);
-
-        this.k = new double[original.k.GetLength(0), original.k.GetLength(1)];
-        Array.Copy(original.k, this.k, k.Length);
-      }
-      this.symmetric = original.symmetric;
     }
     public CovarianceLinear()
@@ -66,53 +46,18 @@
     }
 
-    public void SetParameter(double[] hyp) {
+    public override void SetParameter(double[] hyp) {
       if (hyp.Length > 0) throw new ArgumentException("No hyperparameters are allowed for the linear covariance function.");
-      k = null;
     }
 
-    public void SetData(double[,] x) {
-      SetData(x, x);
-      this.symmetric = true;
+    public override double GetCovariance(double[,] x, int i, int j) {
+      return Util.ScalarProd(x, i, j);
     }
 
-    public void SetData(double[,] x, double[,] xt) {
-      this.x = x;
-      this.xt = xt;
-      this.symmetric = false;
-
-      k = null;
+    public override IEnumerable<double> GetGradient(double[,] x, int i, int j) {
+      yield break;
     }
 
-    public double GetCovariance(int i, int j) {
-      if (k == null) CalculateInnerProduct();
-      return k[i, j];
-    }
-
-    public double[] GetGradient(int i, int j) {
-      return emptyArray;
-    }
-
-
-    private void CalculateInnerProduct() {
-      if (x.GetLength(1) != xt.GetLength(1)) throw new InvalidOperationException();
-      int rows = x.GetLength(0);
-      int cols = xt.GetLength(0);
-      k = new double[rows, cols];
-      if (symmetric) {
-        for (int i = 0; i < rows; i++) {
-          for (int j = i; j < cols; j++) {
-            k[i, j] = Util.ScalarProd(Util.GetRow(x, i),
-                                      Util.GetRow(x, j));
-            k[j, i] = k[i, j];
-          }
-        }
-      } else {
-        for (int i = 0; i < rows; i++) {
-          for (int j = 0; j < cols; j++) {
-            k[i, j] = Util.ScalarProd(Util.GetRow(x, i),
-                                      Util.GetRow(xt, j));
-          }
-        }
-      }
+    public override double GetCrossCovariance(double[,] x, double[,] xt, int i, int j) {
+      return Util.ScalarProd(x, i, xt, j);
     }
   }
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceLinearArd.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceLinearArd.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceLinearArd.cs	(revision 8585)
@@ -0,0 +1,107 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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 System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Algorithms.DataAnalysis {
+  [StorableClass]
+  [Item(Name = "CovarianceLinearArd",
+    Description = "Linear covariance function with automatic relevance determination for Gaussian processes.")]
+  public class CovarianceLinearArd : CovarianceFunction {
+    public IValueParameter<DoubleArray> InverseLengthParameter {
+      get { return inverseLengthParameter; }
+    }
+
+    [Storable]
+    private HyperParameter<DoubleArray> inverseLengthParameter;
+
+    [Storable]
+    private double[] inverseLength;
+
+    [StorableConstructor]
+    protected CovarianceLinearArd(bool deserializing) : base(deserializing) { }
+    protected CovarianceLinearArd(CovarianceLinearArd original, Cloner cloner)
+      : base(original, cloner) {
+      inverseLengthParameter = cloner.Clone(original.inverseLengthParameter);
+      if (original.inverseLength != null) {
+        this.inverseLength = new double[original.inverseLength.Length];
+        Array.Copy(original.inverseLength, inverseLength, inverseLength.Length);
+      }
+
+      RegisterEvents();
+    }
+    public CovarianceLinearArd()
+      : base() {
+      inverseLengthParameter = new HyperParameter<DoubleArray>("InverseLength",
+                                                               "The inverse length parameter for ARD.");
+      Parameters.Add(inverseLengthParameter);
+      RegisterEvents();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEvents();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CovarianceLinearArd(this, cloner);
+    }
+
+    // caching
+    private void RegisterEvents() {
+      AttachArrayChangeHandler<DoubleArray, double>(inverseLengthParameter, () => { inverseLength = inverseLengthParameter.Value.ToArray(); });
+    }
+
+
+    public override int GetNumberOfParameters(int numberOfVariables) {
+      if (!inverseLengthParameter.Fixed)
+        return numberOfVariables;
+      else
+        return 0;
+    }
+
+    public override void SetParameter(double[] hyp) {
+      if (!inverseLengthParameter.Fixed && hyp.Length > 0) {
+        inverseLengthParameter.SetValue(new DoubleArray(hyp.Select(e => 1.0 / Math.Exp(e)).ToArray()));
+      } else throw new ArgumentException("The length of the parameter vector does not match the number of free parameters for CovarianceLinearArd", "hyp");
+    }
+
+    public override double GetCovariance(double[,] x, int i, int j) {
+      return Util.ScalarProd(x, i, j, inverseLength);
+    }
+
+    public override IEnumerable<double> GetGradient(double[,] x, int i, int j) {
+      for (int k = 0; k < inverseLength.Length; k++) {
+        yield return -2.0 * x[i, k] * x[j, k] * inverseLength[k] * inverseLength[k];
+      }
+    }
+
+    public override double GetCrossCovariance(double[,] x, double[,] xt, int i, int j) {
+      return Util.ScalarProd(x, i, xt, j, inverseLength);
+    }
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceMaternIso.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceMaternIso.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceMaternIso.cs	(revision 8585)
@@ -0,0 +1,173 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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 System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Algorithms.DataAnalysis {
+  [StorableClass]
+  [Item(Name = "CovarianceMaternIso",
+    Description = "Matern covariance function for Gaussian processes.")]
+  public class CovarianceMaternIso : CovarianceFunction {
+    public IValueParameter<DoubleValue> ScaleParameter {
+      get { return scaleParameter; }
+    }
+    public IValueParameter<DoubleValue> InverseLengthParameter {
+      get { return inverseLengthParameter; }
+    }
+    public IConstrainedValueParameter<IntValue> DParameter {
+      get { return dParameter; }
+    }
+
+    [Storable]
+    private readonly HyperParameter<DoubleValue> inverseLengthParameter;
+    [Storable]
+    private readonly HyperParameter<DoubleValue> scaleParameter;
+    [Storable]
+    private readonly ConstrainedValueParameter<IntValue> dParameter;
+
+    [Storable]
+    private double inverseLength;
+    [Storable]
+    private double sf2;
+    [Storable]
+    private int d;
+
+    [StorableConstructor]
+    protected CovarianceMaternIso(bool deserializing)
+      : base(deserializing) {
+    }
+
+    protected CovarianceMaternIso(CovarianceMaternIso original, Cloner cloner)
+      : base(original, cloner) {
+      this.scaleParameter = cloner.Clone(original.scaleParameter);
+      this.sf2 = original.sf2;
+      this.inverseLengthParameter = cloner.Clone(original.inverseLengthParameter);
+      this.inverseLength = original.inverseLength;
+      this.dParameter = cloner.Clone(original.dParameter);
+      this.d = original.d;
+      RegisterEvents();
+    }
+
+    public CovarianceMaternIso()
+      : base() {
+      inverseLengthParameter = new HyperParameter<DoubleValue>("InverseLength", "The inverse length parameter of the isometric Matern covariance function.");
+      scaleParameter = new HyperParameter<DoubleValue>("Scale", "The scale parameter of the isometric Matern covariance function.");
+      var validDValues = new ItemSet<IntValue>();
+      validDValues.Add((IntValue)new IntValue(1).AsReadOnly());
+      validDValues.Add((IntValue)new IntValue(3).AsReadOnly());
+      validDValues.Add((IntValue)new IntValue(5).AsReadOnly());
+      dParameter = new ConstrainedValueParameter<IntValue>("D", "The d parameter (allowed values: 1, 3, or 5) of the isometric Matern covariance function.", validDValues, validDValues.First());
+      d = dParameter.Value.Value;
+
+      Parameters.Add(inverseLengthParameter);
+      Parameters.Add(scaleParameter);
+      Parameters.Add(dParameter);
+
+      RegisterEvents();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEvents();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CovarianceMaternIso(this, cloner);
+    }
+
+    // caching
+    private void RegisterEvents() {
+      AttachValueChangeHandler<DoubleValue, double>(inverseLengthParameter, () => { inverseLength = inverseLengthParameter.Value.Value; });
+      AttachValueChangeHandler<DoubleValue, double>(scaleParameter, () => { sf2 = scaleParameter.Value.Value; });
+      AttachValueChangeHandler<IntValue, int>(dParameter, () => { d = dParameter.Value.Value; });
+    }
+
+    public override int GetNumberOfParameters(int numberOfVariables) {
+      return
+        (inverseLengthParameter.Fixed ? 0 : 1) +
+        (scaleParameter.Fixed ? 0 : 1);
+    }
+
+    public override void SetParameter(double[] hyp) {
+      int i = 0;
+      if (!inverseLengthParameter.Fixed) {
+        inverseLengthParameter.SetValue(new DoubleValue(1.0 / Math.Exp(hyp[i])));
+        i++;
+      }
+      if (!scaleParameter.Fixed) {
+        scaleParameter.SetValue(new DoubleValue(Math.Exp(2 * hyp[i])));
+        i++;
+      }
+      if (hyp.Length != i) throw new ArgumentException("The length of the parameter vector does not match the number of free parameters for CovarianceMaternIso", "hyp");
+    }
+
+
+    private double m(double t) {
+      double f;
+      switch (d) {
+        case 1: { f = 1; break; }
+        case 3: { f = 1 + t; break; }
+        case 5: { f = 1 + t * (1 + t / 3.0); break; }
+        default: throw new InvalidOperationException();
+      }
+      return f * Math.Exp(-t);
+    }
+
+    private double dm(double t) {
+      double df;
+      switch (d) {
+        case 1: { df = 1; break; }
+        case 3: { df = t; break; }
+        case 5: { df = t * (1 + t) / 3.0; break; }
+        default: throw new InvalidOperationException();
+      }
+      return df * t * Math.Exp(-t);
+    }
+
+    public override double GetCovariance(double[,] x, int i, int j) {
+      double dist = i == j
+                   ? 0.0
+                   : Math.Sqrt(Util.SqrDist(x, i, j, Math.Sqrt(d) * inverseLength));
+      return sf2 * m(dist);
+    }
+
+    public override IEnumerable<double> GetGradient(double[,] x, int i, int j) {
+      double dist = i == j
+                   ? 0.0
+                   : Math.Sqrt(Util.SqrDist(x, i, j, Math.Sqrt(d) * inverseLength));
+
+      yield return sf2 * dm(dist);
+      yield return 2 * sf2 * m(dist);
+    }
+
+    public override double GetCrossCovariance(double[,] x, double[,] xt, int i, int j) {
+      double dist = Math.Sqrt(Util.SqrDist(x, i, xt, j, Math.Sqrt(d) * inverseLength));
+      return sf2 * m(dist);
+    }
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceNoise.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceNoise.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceNoise.cs	(revision 8585)
@@ -0,0 +1,75 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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 System;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Algorithms.DataAnalysis {
+  [StorableClass]
+  [Item(Name = "CovarianceNoise",
+    Description = "Noise covariance function for Gaussian processes.")]
+  public class CovarianceNoise : Item, ICovarianceFunction {
+    [Storable]
+    private double sf2;
+    public double Scale { get { return sf2; } }
+
+    [StorableConstructor]
+    protected CovarianceNoise(bool deserializing)
+      : base(deserializing) {
+    }
+
+    protected CovarianceNoise(CovarianceNoise original, Cloner cloner)
+      : base(original, cloner) {
+      this.sf2 = original.sf2;
+    }
+
+    public CovarianceNoise()
+      : base() {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CovarianceNoise(this, cloner);
+    }
+
+    public int GetNumberOfParameters(int numberOfVariables) {
+      return 1;
+    }
+
+    public void SetParameter(double[] hyp) {
+      this.sf2 = Math.Exp(2 * hyp[0]);
+    }
+
+    public double GetCovariance(double[,] x, int i, int j) {
+      return sf2;
+    }
+
+    public IEnumerable<double> GetGradient(double[,] x, int i, int j) {
+      yield return 2 * sf2;
+    }
+
+    public double GetCrossCovariance(double[,] x, double[,] xt, int i, int j) {
+      return 0.0;
+    }
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovariancePeriodic.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovariancePeriodic.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovariancePeriodic.cs	(revision 8585)
@@ -21,6 +21,9 @@
 
 using System;
+using System.Collections.Generic;
+using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
+using HeuristicLab.Data;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
@@ -28,39 +31,59 @@
   [StorableClass]
   [Item(Name = "CovariancePeriodic", Description = "Periodic covariance function for Gaussian processes.")]
-  public class CovariancePeriodic : Item, ICovarianceFunction {
+  public class CovariancePeriodic : CovarianceFunction {
+    public IValueParameter<DoubleValue> ScaleParameter {
+      get { return scaleParameter; }
+    }
+    public IValueParameter<DoubleValue> InverseLengthParameter {
+      get { return inverseLengthParameter; }
+    }
+    public IValueParameter<DoubleValue> PeriodParameter {
+      get { return periodParameter; }
+    }
+
     [Storable]
-    private double[,] x;
+    private HyperParameter<DoubleValue> scaleParameter;
     [Storable]
-    private double[,] xt;
+    private HyperParameter<DoubleValue> inverseLengthParameter;
     [Storable]
-    private double sf2;
+    private HyperParameter<DoubleValue> periodParameter;
+
     [Storable]
-    private double l;
+    private double scale;
     [Storable]
-    private double p;
+    private double inverseLength;
+    [Storable]
+    private double period;
 
-    private bool symmetric;
 
-    private double[,] sd;
-    public int GetNumberOfParameters(int numberOfVariables) {
-      return 3;
-    }
     [StorableConstructor]
     protected CovariancePeriodic(bool deserializing) : base(deserializing) { }
     protected CovariancePeriodic(CovariancePeriodic original, Cloner cloner)
       : base(original, cloner) {
-      if (original.x != null) {
-        x = new double[original.x.GetLength(0), original.x.GetLength(1)];
-        Array.Copy(original.x, x, x.Length);
-        xt = new double[original.xt.GetLength(0), original.xt.GetLength(1)];
-        Array.Copy(original.xt, xt, xt.Length);
-      }
-      sf2 = original.sf2;
-      l = original.l;
-      p = original.p;
-      symmetric = original.symmetric;
+      this.scaleParameter = cloner.Clone(original.scaleParameter);
+      this.inverseLengthParameter = cloner.Clone(original.inverseLengthParameter);
+      this.periodParameter = cloner.Clone(original.periodParameter);
+      this.scale = original.scale;
+      this.inverseLength = original.inverseLength;
+      this.period = original.period;
+
+      RegisterEvents();
     }
+
     public CovariancePeriodic()
       : base() {
+      scaleParameter = new HyperParameter<DoubleValue>("Scale", "The scale of the periodic covariance function.");
+      inverseLengthParameter = new HyperParameter<DoubleValue>("InverseLength", "The inverse length parameter for the periodic covariance function.");
+      periodParameter = new HyperParameter<DoubleValue>("Period", "The period parameter for the periodic covariance function.");
+      Parameters.Add(scaleParameter);
+      Parameters.Add(inverseLengthParameter);
+      Parameters.Add(periodParameter);
+
+      RegisterEvents();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEvents();
     }
 
@@ -69,95 +92,63 @@
     }
 
-    public void SetParameter(double[] hyp) {
-      if (hyp.Length != 3) throw new ArgumentException();
-      this.l = Math.Exp(hyp[0]);
-      this.p = Math.Exp(hyp[1]);
-      this.sf2 = Math.Exp(2 * hyp[2]);
-
-      sf2 = Math.Min(10E6, sf2); // upper limit for the scale
-
-      sd = null;
-    }
-    public void SetData(double[,] x) {
-      SetData(x, x);
-      this.symmetric = true;
+    // caching
+    private void RegisterEvents() {
+      AttachValueChangeHandler<DoubleValue, double>(scaleParameter, () => { scale = scaleParameter.Value.Value; });
+      AttachValueChangeHandler<DoubleValue, double>(inverseLengthParameter, () => { inverseLength = inverseLengthParameter.Value.Value; });
+      AttachValueChangeHandler<DoubleValue, double>(periodParameter, () => { period = periodParameter.Value.Value; });
     }
 
-    public void SetData(double[,] x, double[,] xt) {
-      this.x = x;
-      this.xt = xt;
-      this.symmetric = false;
-
-      sd = null;
+    public override int GetNumberOfParameters(int numberOfVariables) {
+      return
+        (new[] { scaleParameter, inverseLengthParameter, periodParameter }).Count(p => !p.Fixed);
     }
 
-    public double GetCovariance(int i, int j) {
-      if (sd == null) CalculateSquaredDistances();
-      double k = sd[i, j];
-      k = Math.PI * k / p;
-      k = Math.Sin(k) / l;
+    public override void SetParameter(double[] hyp) {
+      int i = 0;
+      if (!inverseLengthParameter.Fixed) {
+        inverseLengthParameter.SetValue(new DoubleValue(1.0 / Math.Exp(hyp[i])));
+        i++;
+      }
+      if (!periodParameter.Fixed) {
+        periodParameter.SetValue(new DoubleValue(Math.Exp(hyp[i])));
+        i++;
+      }
+      if (!scaleParameter.Fixed) {
+        scaleParameter.SetValue(new DoubleValue(Math.Exp(2 * hyp[i])));
+        i++;
+      }
+      if (hyp.Length != i) throw new ArgumentException("The length of the parameter vector does not match the number of free parameters for CovariancePeriod", "hyp");
+    }
+
+    public override double GetCovariance(double[,] x, int i, int j) {
+      double k = i == j ? 0.0 : GetDistance(x, x, i, j);
+      k = Math.PI * k / period;
+      k = Math.Sin(k) * inverseLength;
       k = k * k;
 
-      return sf2 * Math.Exp(-2.0 * k);
+      return scale * Math.Exp(-2.0 * k);
     }
 
-
-    public double[] GetDiagonalCovariances() {
-      if (x != xt) throw new InvalidOperationException();
-      int rows = x.GetLength(0);
-      var cov = new double[rows];
-      for (int i = 0; i < rows; i++) {
-        double k = Math.Sqrt(Util.SqrDist(Util.GetRow(x, i), Util.GetRow(xt, i)));
-        k = Math.PI * k / p;
-        k = Math.Sin(k) / l;
-        k = k * k;
-        cov[i] = sf2 * Math.Exp(-2.0 * k);
-      }
-      return cov;
+    public override IEnumerable<double> GetGradient(double[,] x, int i, int j) {
+      double v = i == j ? 0.0 : Math.PI * GetDistance(x, x, i, j) / period;
+      double gradient = Math.Sin(v) * inverseLength;
+      gradient *= gradient;
+      yield return 4.0 * scale * Math.Exp(-2.0 * gradient) * gradient;
+      double r = Math.Sin(v) * inverseLength;
+      yield return 4.0 * scale * inverseLength * Math.Exp(-2 * r * r) * r * Math.Cos(v) * v;
+      yield return 2.0 * scale * Math.Exp(-2 * gradient);
     }
 
-    public double[] GetGradient(int i, int j) {
+    public override double GetCrossCovariance(double[,] x, double[,] xt, int i, int j) {
+      double k = GetDistance(x, xt, i, j);
+      k = Math.PI * k / period;
+      k = Math.Sin(k) * inverseLength;
+      k = k * k;
 
-      var res = new double[3];
-      double k = sd[i, j];
-      k = Math.PI * k / p;
-      {
-        double newK = Math.Sin(k) / l;
-        newK = newK * newK;
-        res[0] = 4 * sf2 * Math.Exp(-2 * newK) * newK;
-      }
-      {
-        double r = Math.Sin(k) / l;
-        res[1] = 4 * sf2 / l * Math.Exp(-2 * r * r) * r * Math.Cos(k) * k;
-      }
-      {
-        double newK = Math.Sin(k) / l;
-        newK = newK * newK;
-        res[2] = 2 * sf2 * Math.Exp(-2 * newK);
-      }
-
-      return res;
+      return scale * Math.Exp(-2.0 * k);
     }
 
-    private void CalculateSquaredDistances() {
-      if (x.GetLength(1) != xt.GetLength(1)) throw new InvalidOperationException();
-      int rows = x.GetLength(0);
-      int cols = xt.GetLength(0);
-      sd = new double[rows, cols];
-
-      if (symmetric) {
-        for (int i = 0; i < rows; i++) {
-          for (int j = i; j < cols; j++) {
-            sd[i, j] = Math.Sqrt(Util.SqrDist(Util.GetRow(x, i), Util.GetRow(x, j)));
-            sd[j, i] = sd[i, j];
-          }
-        }
-      } else {
-        for (int i = 0; i < rows; i++) {
-          for (int j = 0; j < cols; j++) {
-            sd[i, j] = Math.Sqrt(Util.SqrDist(Util.GetRow(x, i), Util.GetRow(xt, j)));
-          }
-        }
-      }
+    private double GetDistance(double[,] x, double[,] xt, int i, int j) {
+      return Math.Sqrt(Util.SqrDist(x, i, xt, j));
     }
   }
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceProd.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceProd.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceProd.cs	(revision 8585)
@@ -20,4 +20,6 @@
 #endregion
 
+using System;
+using System.Collections.Generic;
 using System.Linq;
 using HeuristicLab.Common;
@@ -61,8 +63,9 @@
     public int GetNumberOfParameters(int numberOfVariables) {
       this.numberOfVariables = numberOfVariables;
-      return factors.Select(t => t.GetNumberOfParameters(numberOfVariables)).Sum();
+      return factors.Select(f => f.GetNumberOfParameters(numberOfVariables)).Sum();
     }
 
     public void SetParameter(double[] hyp) {
+      if (factors.Count == 0) throw new ArgumentException("at least one factor is necessary for the product covariance function.");
       int offset = 0;
       foreach (var t in factors) {
@@ -72,35 +75,23 @@
       }
     }
-    public void SetData(double[,] x) {
-      SetData(x, x);
+
+    public double GetCovariance(double[,] x, int i, int j) {
+      return factors.Select(f => f.GetCovariance(x, i, j)).Aggregate((a, b) => a * b);
     }
 
-    public void SetData(double[,] x, double[,] xt) {
-      foreach (var t in factors) {
-        t.SetData(x, xt);
+    public IEnumerable<double> GetGradient(double[,] x, int i, int j) {
+      var covariances = factors.Select(f => f.GetCovariance(x, i, j)).ToArray();
+      for (int ii = 0; ii < factors.Count; ii++) {
+        foreach (var g in factors[ii].GetGradient(x, i, j)) {
+          double res = g;
+          for (int jj = 0; jj < covariances.Length; jj++)
+            if (ii != jj) res *= covariances[jj];
+          yield return res;
+        }
       }
     }
 
-    public double GetCovariance(int i, int j) {
-      return factors.Select(t => t.GetCovariance(i, j)).Aggregate((a, b) => a * b);
-    }
-
-    public double[] GetGradient(int i, int j) {
-      return Enumerable.Range(0, GetNumberOfParameters(numberOfVariables)).Select(k => GetGradient(i, j, k)).ToArray();
-    }
-    public double GetGradient(int i, int j, int k) {
-      // map from parameter index to factor
-      var vi = factors.Select((f, idx) => Enumerable.Repeat(idx, f.GetNumberOfParameters(numberOfVariables))).SelectMany(x => x).ToArray();
-      double res = 1.0;
-      int jj = Enumerable.Range(0, k).Count(e => vi[e] == vi[k]);
-      for (int ii = 0; ii < factors.Count; ii++) {
-        var f = factors[ii];
-        if (ii == vi[k]) {
-          res *= f.GetGradient(i, j)[jj];
-        } else {
-          res *= f.GetCovariance(i, j);
-        }
-      }
-      return res;
+    public double GetCrossCovariance(double[,] x, double[,] xt, int i, int j) {
+      return factors.Select(f => f.GetCrossCovariance(x, xt, i, j)).Aggregate((a, b) => a * b);
     }
   }
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceRQArd.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceRQArd.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceRQArd.cs	(revision 8585)
@@ -0,0 +1,106 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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 System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Algorithms.DataAnalysis {
+  [StorableClass]
+  [Item(Name = "CovarianceRQArd",
+    Description = "Rational quadratic covariance function with automatic relevance determination for Gaussian processes.")]
+  public class CovarianceRQArd : Item, ICovarianceFunction {
+    [Storable]
+    private double sf2;
+    public double Scale { get { return sf2; } }
+    [Storable]
+    private double[] inverseLength;
+    public double[] InverseLength {
+      get {
+        if (inverseLength == null) return null;
+        double[] res = new double[inverseLength.Length];
+        Array.Copy(inverseLength, res, res.Length);
+        return res;
+      }
+    }
+    [Storable]
+    private double alpha;
+    public double Shape { get { return alpha; } }
+
+    [StorableConstructor]
+    protected CovarianceRQArd(bool deserializing)
+      : base(deserializing) {
+    }
+
+    protected CovarianceRQArd(CovarianceRQArd original, Cloner cloner)
+      : base(original, cloner) {
+      this.sf2 = original.sf2;
+      this.inverseLength = original.InverseLength; // array is cloned in the getter
+      this.alpha = original.alpha;
+    }
+
+    public CovarianceRQArd()
+      : base() {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CovarianceRQArd(this, cloner);
+    }
+
+    public int GetNumberOfParameters(int numberOfVariables) {
+      return numberOfVariables + 2;
+    }
+
+    public void SetParameter(double[] hyp) {
+      this.inverseLength = hyp.Take(hyp.Length - 2).Select(e => 1.0 / Math.Exp(e)).ToArray();
+      this.sf2 = Math.Exp(2 * hyp[hyp.Length - 2]);
+      this.alpha = Math.Exp(hyp[hyp.Length - 1]);
+    }
+
+
+    public double GetCovariance(double[,] x, int i, int j) {
+      double d = i == j
+                   ? 0.0
+                   : Util.SqrDist(x, i, j, inverseLength);
+      return sf2 * Math.Pow(1 + 0.5 * d / alpha, -alpha);
+    }
+
+    public IEnumerable<double> GetGradient(double[,] x, int i, int j) {
+      double d = i == j
+                   ? 0.0
+                   : Util.SqrDist(x, i, j, inverseLength);
+      double b = 1 + 0.5 * d / alpha;
+      for (int k = 0; k < inverseLength.Length; k++) {
+        yield return sf2 * Math.Pow(b, -alpha - 1) * Util.SqrDist(x[i, k] * inverseLength[k], x[j, k] * inverseLength[k]);
+      }
+      yield return 2 * sf2 * Math.Pow(b, -alpha);
+      yield return sf2 * Math.Pow(b, -alpha) * (0.5 * d / b - alpha * Math.Log(b));
+    }
+
+    public double GetCrossCovariance(double[,] x, double[,] xt, int i, int j) {
+      double d = Util.SqrDist(x, i, xt, j, inverseLength);
+      return sf2 * Math.Pow(1 + 0.5 * d / alpha, -alpha);
+    }
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceRQiso.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceRQiso.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceRQiso.cs	(revision 8585)
@@ -0,0 +1,98 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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 System;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Algorithms.DataAnalysis {
+  [StorableClass]
+  [Item(Name = "CovarianceRQiso",
+    Description = "Isotropic rational quadratic covariance function for Gaussian processes.")]
+  public class CovarianceRQiso : Item, ICovarianceFunction {
+    [Storable]
+    private double sf2;
+    public double Scale { get { return sf2; } }
+    [Storable]
+    private double inverseLength;
+    public double InverseLength { get { return inverseLength; } }
+    [Storable]
+    private double alpha;
+    public double Shape { get { return alpha; } }
+
+    [StorableConstructor]
+    protected CovarianceRQiso(bool deserializing)
+      : base(deserializing) {
+    }
+
+    protected CovarianceRQiso(CovarianceRQiso original, Cloner cloner)
+      : base(original, cloner) {
+      this.sf2 = original.sf2;
+      this.inverseLength = original.inverseLength;
+      this.alpha = original.alpha;
+    }
+
+    public CovarianceRQiso()
+      : base() {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CovarianceRQiso(this, cloner);
+    }
+
+    public int GetNumberOfParameters(int numberOfVariables) {
+      return 3;
+    }
+
+    public void SetParameter(double[] hyp) {
+      if (hyp.Length != 3) throw new ArgumentException("CovarianceRQiso has three hyperparameters", "k");
+      this.inverseLength = 1.0 / Math.Exp(hyp[0]);
+      this.sf2 = Math.Exp(2 * hyp[1]);
+      this.alpha = Math.Exp(hyp[2]);
+    }
+
+
+    public double GetCovariance(double[,] x, int i, int j) {
+      double d = i == j
+                   ? 0.0
+                   : Util.SqrDist(x, i, j, inverseLength);
+      return sf2 * Math.Pow(1 + 0.5 * d / alpha, -alpha);
+    }
+
+    public IEnumerable<double> GetGradient(double[,] x, int i, int j) {
+      double d = i == j
+                   ? 0.0
+                   : Util.SqrDist(x, i, j, inverseLength);
+
+      double b = 1 + 0.5 * d / alpha;
+      yield return sf2 * Math.Pow(b, -alpha - 1) * d;
+      yield return 2 * sf2 * Math.Pow(b, -alpha);
+      yield return sf2 * Math.Pow(b, -alpha) * (0.5 * d / b - alpha * Math.Log(b));
+    }
+
+    public double GetCrossCovariance(double[,] x, double[,] xt, int i, int j) {
+      double d = Util.SqrDist(x, i, xt, j, inverseLength);
+      return sf2 * Math.Pow(1 + 0.5 * d / alpha, -alpha);
+    }
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceSEard.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceSEard.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceSEard.cs	(revision 8585)
@@ -21,4 +21,5 @@
 
 using System;
+using System.Collections.Generic;
 using System.Linq;
 using HeuristicLab.Common;
@@ -31,14 +32,17 @@
   public class CovarianceSEard : Item, ICovarianceFunction {
     [Storable]
-    private double[,] x;
+    private double sf2;
+    public double Scale { get { return sf2; } }
+
     [Storable]
-    private double[,] xt;
-    [Storable]
-    private double sf2;
-    [Storable]
-    private double[] l;
-
-    private double[,] sd;
-    private bool symmetric;
+    private double[] inverseLength;
+    public double[] InverseLength {
+      get {
+        if (inverseLength == null) return new double[0];
+        var copy = new double[inverseLength.Length];
+        Array.Copy(inverseLength, copy, copy.Length);
+        return copy;
+      }
+    }
 
     public int GetNumberOfParameters(int numberOfVariables) {
@@ -49,19 +53,6 @@
     protected CovarianceSEard(CovarianceSEard original, Cloner cloner)
       : base(original, cloner) {
-      if (original.x != null) {
-        this.x = new double[original.x.GetLength(0), original.x.GetLength(1)];
-        Array.Copy(original.x, this.x, x.Length);
-
-        this.xt = new double[original.xt.GetLength(0), original.xt.GetLength(1)];
-        Array.Copy(original.xt, this.xt, xt.Length);
-
-        this.sd = new double[original.sd.GetLength(0), original.sd.GetLength(1)];
-        Array.Copy(original.sd, this.sd, sd.Length);
-
-        this.l = new double[original.l.Length];
-        Array.Copy(original.l, this.l, l.Length);
-      }
+      this.inverseLength = original.InverseLength; // array is cloned in the getter
       this.sf2 = original.sf2;
-      this.symmetric = original.symmetric;
     }
     public CovarianceSEard()
@@ -74,62 +65,30 @@
 
     public void SetParameter(double[] hyp) {
-      this.l = hyp.Take(hyp.Length - 1).Select(Math.Exp).ToArray();
+      this.inverseLength = hyp.Take(hyp.Length - 1).Select(p => 1.0 / Math.Exp(p)).ToArray();
       this.sf2 = Math.Exp(2 * hyp[hyp.Length - 1]);
-      sf2 = Math.Min(10E6, sf2); // upper limit for the scale
-
-      sd = null;
     }
 
-    public void SetData(double[,] x) {
-      SetData(x, x);
-      this.symmetric = true;
+    public double GetCovariance(double[,] x, int i, int j) {
+      double d = i == j
+                   ? 0.0
+                   : Util.SqrDist(x, i, j, inverseLength);
+      return sf2 * Math.Exp(-d / 2.0);
     }
 
-    public void SetData(double[,] x, double[,] xt) {
-      this.x = x;
-      this.xt = xt;
-      this.symmetric = false;
+    public IEnumerable<double> GetGradient(double[,] x, int i, int j) {
+      double d = i == j
+                   ? 0.0
+                   : Util.SqrDist(x, i, j, inverseLength);
 
-      sd = null;
+      for (int ii = 0; ii < inverseLength.Length; ii++) {
+        double sqrDist = Util.SqrDist(x[i, ii] * inverseLength[ii], x[j, ii] * inverseLength[ii]);
+        yield return sf2 * Math.Exp(-d / 2.0) * sqrDist;
+      }
+      yield return 2.0 * sf2 * Math.Exp(-d / 2.0);
     }
 
-    public double GetCovariance(int i, int j) {
-      if (sd == null) CalculateSquaredDistances();
-      return sf2 * Math.Exp(-sd[i, j] / 2.0);
-    }
-
-    public double[] GetGradient(int i, int j) {
-      var res = new double[l.Length + 1];
-      for (int k = 0; k < l.Length; k++) {
-        double sqrDist = Util.SqrDist(x[i, k] / l[k], xt[j, k] / l[k]);
-
-        res[k] = sf2 * Math.Exp(-sd[i, j] / 2.0) * sqrDist;
-      }
-      res[res.Length - 1] = 2.0 * sf2 * Math.Exp(-sd[i, j] / 2.0);
-      return res;
-    }
-
-
-    private void CalculateSquaredDistances() {
-      if (x.GetLength(1) != xt.GetLength(1)) throw new InvalidOperationException();
-      int rows = x.GetLength(0);
-      int cols = xt.GetLength(0);
-      sd = new double[rows, cols];
-      if (symmetric) {
-        for (int i = 0; i < rows; i++) {
-          for (int j = i; j < cols; j++) {
-            sd[i, j] = Util.SqrDist(Util.GetRow(x, i).Select((e, k) => e / l[k]),
-                                    Util.GetRow(xt, j).Select((e, k) => e / l[k]));
-            sd[j, i] = sd[i, j];
-          }
-        }
-      } else {
-        for (int i = 0; i < rows; i++) {
-          for (int j = 0; j < cols; j++) {
-            sd[i, j] = Util.SqrDist(Util.GetRow(x, i).Select((e, k) => e / l[k]),
-                                    Util.GetRow(xt, j).Select((e, k) => e / l[k]));
-          }
-        }
-      }
+    public double GetCrossCovariance(double[,] x, double[,] xt, int i, int j) {
+      double d = Util.SqrDist(x, i, xt, j, inverseLength);
+      return sf2 * Math.Exp(-d / 2.0);
     }
   }
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceSEiso.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceSEiso.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceSEiso.cs	(revision 8585)
@@ -21,5 +21,5 @@
 
 using System;
-using System.Linq;
+using System.Collections.Generic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -32,14 +32,9 @@
   public class CovarianceSEiso : Item, ICovarianceFunction {
     [Storable]
-    private double[,] x;
+    private double sf2;
+    public double Scale { get { return sf2; } }
     [Storable]
-    private double[,] xt;
-    [Storable]
-    private double sf2;
-    [Storable]
-    private double l;
-    [Storable]
-    private bool symmetric;
-    private double[,] sd;
+    private double inverseLength;
+    public double InverseLength { get { return inverseLength; } }
 
     [StorableConstructor]
@@ -50,18 +45,6 @@
     protected CovarianceSEiso(CovarianceSEiso original, Cloner cloner)
       : base(original, cloner) {
-      if (original.x != null) {
-        this.x = new double[original.x.GetLength(0), original.x.GetLength(1)];
-        Array.Copy(original.x, this.x, x.Length);
-
-        this.xt = new double[original.xt.GetLength(0), original.xt.GetLength(1)];
-        Array.Copy(original.xt, this.xt, xt.Length);
-
-        this.sd = new double[original.sd.GetLength(0), original.sd.GetLength(1)];
-        Array.Copy(original.sd, this.sd, sd.Length);
-        this.sf2 = original.sf2;
-      }
       this.sf2 = original.sf2;
-      this.l = original.l;
-      this.symmetric = original.symmetric;
+      this.inverseLength = original.inverseLength;
     }
 
@@ -79,52 +62,29 @@
 
     public void SetParameter(double[] hyp) {
-      this.l = Math.Exp(hyp[0]);
-      this.sf2 = Math.Min(1E6, Math.Exp(2 * hyp[1])); // upper limit for scale
-      sd = null;
-    }
-    public void SetData(double[,] x) {
-      SetData(x, x);
-      this.symmetric = true;
+      if (hyp.Length != 2) throw new ArgumentException("CovarianceSEiso has two hyperparameters", "k");
+      this.inverseLength = 1.0 / Math.Exp(hyp[0]);
+      this.sf2 = Math.Exp(2 * hyp[1]);
     }
 
 
-    public void SetData(double[,] x, double[,] xt) {
-      this.symmetric = false;
-      this.x = x;
-      this.xt = xt;
-      sd = null;
+    public double GetCovariance(double[,] x, int i, int j) {
+      double d = i == j
+                   ? 0.0
+                   : Util.SqrDist(x, i, j, inverseLength);
+      return sf2 * Math.Exp(-d / 2.0);
     }
 
-    public double GetCovariance(int i, int j) {
-      if (sd == null) CalculateSquaredDistances();
-      return sf2 * Math.Exp(-sd[i, j] / 2.0);
+    public IEnumerable<double> GetGradient(double[,] x, int i, int j) {
+      double d = i == j
+                   ? 0.0
+                   : Util.SqrDist(x, i, j, inverseLength);
+      double g = Math.Exp(-d / 2.0);
+      yield return sf2 * g * d;
+      yield return 2.0 * sf2 * g;
     }
 
-    public double[] GetGradient(int i, int j) {
-      var res = new double[2];
-      res[0] = sf2 * Math.Exp(-sd[i, j] / 2.0) * sd[i, j];
-      res[1] = 2.0 * sf2 * Math.Exp(-sd[i, j] / 2.0);
-      return res;
-    }
-
-    private void CalculateSquaredDistances() {
-      if (x.GetLength(1) != xt.GetLength(1)) throw new InvalidOperationException();
-      int rows = x.GetLength(0);
-      int cols = xt.GetLength(0);
-      sd = new double[rows, cols];
-      if (symmetric) {
-        for (int i = 0; i < rows; i++) {
-          for (int j = i; j < rows; j++) {
-            sd[i, j] = Util.SqrDist(Util.GetRow(x, i).Select(e => e / l), Util.GetRow(xt, j).Select(e => e / l));
-            sd[j, i] = sd[i, j];
-          }
-        }
-      } else {
-        for (int i = 0; i < rows; i++) {
-          for (int j = 0; j < cols; j++) {
-            sd[i, j] = Util.SqrDist(Util.GetRow(x, i).Select(e => e / l), Util.GetRow(xt, j).Select(e => e / l));
-          }
-        }
-      }
+    public double GetCrossCovariance(double[,] x, double[,] xt, int i, int j) {
+      double d = Util.SqrDist(x, i, xt, j, inverseLength);
+      return sf2 * Math.Exp(-d / 2.0);
     }
   }
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceSum.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceSum.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceSum.cs	(revision 8585)
@@ -20,4 +20,6 @@
 #endregion
 
+using System;
+using System.Collections.Generic;
 using System.Linq;
 using HeuristicLab.Common;
@@ -65,4 +67,5 @@
 
     public void SetParameter(double[] hyp) {
+      if (terms.Count == 0) throw new ArgumentException("At least one term is needed for sum covariance function.");
       int offset = 0;
       foreach (var t in terms) {
@@ -72,20 +75,15 @@
       }
     }
-    public void SetData(double[,] x) {
-      SetData(x, x);
+
+    public double GetCovariance(double[,] x, int i, int j) {
+      return terms.Select(t => t.GetCovariance(x, i, j)).Sum();
     }
 
-    public void SetData(double[,] x, double[,] xt) {
-      foreach (var t in terms) {
-        t.SetData(x, xt);
-      }
+    public IEnumerable<double> GetGradient(double[,] x, int i, int j) {
+      return terms.Select(t => t.GetGradient(x, i, j)).Aggregate(Enumerable.Concat);
     }
 
-    public double GetCovariance(int i, int j) {
-      return terms.Select(t => t.GetCovariance(i, j)).Sum();
-    }
-
-    public double[] GetGradient(int i, int j) {
-      return terms.Select(t => t.GetGradient(i, j)).SelectMany(seq => seq).ToArray();
+    public double GetCrossCovariance(double[,] x, double[,] xt, int i, int j) {
+      return terms.Select(t => t.GetCrossCovariance(x, xt, i, j)).Sum();
     }
   }
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessHyperparameterInitializer.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessHyperparameterInitializer.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessHyperparameterInitializer.cs	(revision 8585)
@@ -91,5 +91,5 @@
       var rand = RandomParameter.ActualValue;
       for (int i = 0; i < r.Length; i++)
-        r[i] = rand.NextDouble() * 4 - 2;
+        r[i] = rand.NextDouble() * 2 - 1;
 
       HyperparameterParameter.ActualValue = r;
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessModel.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessModel.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessModel.cs	(revision 8585)
@@ -42,4 +42,14 @@
 
     [Storable]
+    private double[] hyperparameterGradients;
+    public double[] HyperparameterGradients {
+      get {
+        var copy = new double[hyperparameterGradients.Length];
+        Array.Copy(hyperparameterGradients, copy, copy.Length);
+        return copy;
+      }
+    }
+
+    [Storable]
     private ICovarianceFunction covarianceFunction;
     public ICovarianceFunction CovarianceFunction {
@@ -66,4 +76,7 @@
     [Storable]
     private double sqrSigmaNoise;
+    public double SigmaNoise {
+      get { return Math.Sqrt(sqrSigmaNoise); }
+    }
 
     [Storable]
@@ -73,5 +86,5 @@
     private double[,] x;
     [Storable]
-    private Scaling scaling;
+    private Scaling inputScaling;
 
 
@@ -82,5 +95,5 @@
       this.meanFunction = cloner.Clone(original.meanFunction);
       this.covarianceFunction = cloner.Clone(original.covarianceFunction);
-      this.scaling = cloner.Clone(original.scaling);
+      this.inputScaling = cloner.Clone(original.inputScaling);
       this.negativeLogLikelihood = original.negativeLogLikelihood;
       this.targetVariable = original.targetVariable;
@@ -103,14 +116,13 @@
       this.allowedInputVariables = allowedInputVariables.ToArray();
 
-      sqrSigmaNoise = Math.Exp(2.0 * hyp.First());
-      sqrSigmaNoise = Math.Max(10E-6, sqrSigmaNoise); // lower limit for the noise level
 
       int nVariables = this.allowedInputVariables.Length;
-      this.meanFunction.SetParameter(hyp.Skip(1)
+      this.meanFunction.SetParameter(hyp
         .Take(this.meanFunction.GetNumberOfParameters(nVariables))
         .ToArray());
-      this.covarianceFunction.SetParameter(hyp.Skip(1 + this.meanFunction.GetNumberOfParameters(nVariables))
+      this.covarianceFunction.SetParameter(hyp.Skip(this.meanFunction.GetNumberOfParameters(nVariables))
         .Take(this.covarianceFunction.GetNumberOfParameters(nVariables))
         .ToArray());
+      sqrSigmaNoise = Math.Exp(2.0 * hyp.Last());
 
       CalculateModel(ds, rows);
@@ -118,8 +130,7 @@
 
     private void CalculateModel(Dataset ds, IEnumerable<int> rows) {
-      scaling = new Scaling(ds, allowedInputVariables, rows);
-      x = AlglibUtil.PrepareAndScaleInputMatrix(ds, allowedInputVariables, rows, scaling);
-
-      var y = ds.GetDoubleValues(targetVariable, rows).ToArray();
+      inputScaling = new Scaling(ds, allowedInputVariables, rows);
+      x = AlglibUtil.PrepareAndScaleInputMatrix(ds, allowedInputVariables, rows, inputScaling);
+      var y = ds.GetDoubleValues(targetVariable, rows);
 
       int n = x.GetLength(0);
@@ -127,12 +138,10 @@
 
       meanFunction.SetData(x);
-      covarianceFunction.SetData(x);
 
       // calculate means and covariances
       double[] m = meanFunction.GetMean(x);
       for (int i = 0; i < n; i++) {
-
         for (int j = i; j < n; j++) {
-          l[j, i] = covarianceFunction.GetCovariance(i, j) / sqrSigmaNoise;
+          l[j, i] = covarianceFunction.GetCovariance(x, i, j) / sqrSigmaNoise;
           if (j == i) l[j, i] += 1.0;
         }
@@ -144,5 +153,5 @@
 
       var res = alglib.trfac.spdmatrixcholesky(ref l, n, false);
-      if (!res) throw new InvalidOperationException("Matrix is not positive semidefinite");
+      if (!res) throw new ArgumentException("Matrix is not positive semidefinite");
 
       // calculate sum of diagonal elements for likelihood
@@ -156,25 +165,20 @@
         alpha[i] = alpha[i] / sqrSigmaNoise;
       negativeLogLikelihood = 0.5 * Util.ScalarProd(ym, alpha) + diagSum + (n / 2.0) * Math.Log(2.0 * Math.PI * sqrSigmaNoise);
-    }
-
-    public double[] GetHyperparameterGradients() {
+
       // derivatives
-      int n = x.GetLength(0);
       int nAllowedVariables = x.GetLength(1);
-      double[,] q = new double[n, n];
-      double[,] eye = new double[n, n];
-      for (int i = 0; i < n; i++) eye[i, i] = 1.0;
-
-      int info;
-      alglib.densesolverreport denseSolveRep;
-
-      alglib.spdmatrixcholeskysolvem(l, n, false, eye, n, out info, out denseSolveRep, out q);
-      // double[,] a2 = outerProd(alpha, alpha);
+
+      alglib.matinvreport matInvRep;
+      double[,] lCopy = new double[l.GetLength(0), l.GetLength(1)];
+      Array.Copy(l, lCopy, lCopy.Length);
+
+      alglib.spdmatrixcholeskyinverse(ref lCopy, n, false, out info, out matInvRep);
+      if (info != 1) throw new ArgumentException("Can't invert matrix to calculate gradients.");
       for (int i = 0; i < n; i++) {
-        for (int j = 0; j < n; j++)
-          q[i, j] = q[i, j] / sqrSigmaNoise - alpha[i] * alpha[j]; // a2[i, j];
-      }
-
-      double noiseGradient = sqrSigmaNoise * Enumerable.Range(0, n).Select(i => q[i, i]).Sum();
+        for (int j = 0; j <= i; j++)
+          lCopy[i, j] = lCopy[i, j] / sqrSigmaNoise - alpha[i] * alpha[j];
+      }
+
+      double noiseGradient = sqrSigmaNoise * Enumerable.Range(0, n).Select(i => lCopy[i, i]).Sum();
 
       double[] meanGradients = new double[meanFunction.GetNumberOfParameters(nAllowedVariables)];
@@ -187,17 +191,24 @@
       if (covGradients.Length > 0) {
         for (int i = 0; i < n; i++) {
-          for (int j = 0; j < n; j++) {
-            var covDeriv = covarianceFunction.GetGradient(i, j);
+          for (int j = 0; j < i; j++) {
+            var g = covarianceFunction.GetGradient(x, i, j).ToArray();
             for (int k = 0; k < covGradients.Length; k++) {
-              covGradients[k] += q[i, j] * covDeriv[k];
+              covGradients[k] += lCopy[i, j] * g[k];
             }
           }
-        }
-        covGradients = covGradients.Select(g => g / 2.0).ToArray();
-      }
-
-      return new double[] { noiseGradient }
-        .Concat(meanGradients)
-        .Concat(covGradients).ToArray();
+
+          var gDiag = covarianceFunction.GetGradient(x, i, i).ToArray();
+          for (int k = 0; k < covGradients.Length; k++) {
+            // diag
+            covGradients[k] += 0.5 * lCopy[i, i] * gDiag[k];
+          }
+        }
+      }
+
+      hyperparameterGradients =
+        meanGradients
+        .Concat(covGradients)
+        .Concat(new double[] { noiseGradient }).ToArray();
+
     }
 
@@ -212,5 +223,5 @@
     }
     public GaussianProcessRegressionSolution CreateRegressionSolution(IRegressionProblemData problemData) {
-      return new GaussianProcessRegressionSolution(this, problemData);
+      return new GaussianProcessRegressionSolution(this, new RegressionProblemData(problemData));
     }
     IRegressionSolution IRegressionModel.CreateRegressionSolution(IRegressionProblemData problemData) {
@@ -220,44 +231,47 @@
 
     private IEnumerable<double> GetEstimatedValuesHelper(Dataset dataset, IEnumerable<int> rows) {
-      var newX = AlglibUtil.PrepareAndScaleInputMatrix(dataset, allowedInputVariables, rows, scaling);
+      var newX = AlglibUtil.PrepareAndScaleInputMatrix(dataset, allowedInputVariables, rows, inputScaling);
       int newN = newX.GetLength(0);
       int n = x.GetLength(0);
-      // var predMean = new double[newN];
-      // predVar = new double[newN];
-
-
-
-      // var kss = new double[newN];
       var Ks = new double[newN, n];
-      double[,] sWKs = new double[n, newN];
-      // double[,] v;
-
-
-      // for stddev 
-      //covarianceFunction.SetParameter(covHyp, newX);
-      //kss = covarianceFunction.GetDiagonalCovariances();
-
-      covarianceFunction.SetData(x, newX);
       meanFunction.SetData(newX);
       var ms = meanFunction.GetMean(newX);
       for (int i = 0; i < newN; i++) {
-
         for (int j = 0; j < n; j++) {
-          Ks[i, j] = covarianceFunction.GetCovariance(j, i);
-          sWKs[j, i] = Ks[i, j] / Math.Sqrt(sqrSigmaNoise);
-        }
-      }
+          Ks[i, j] = covarianceFunction.GetCrossCovariance(x, newX, j, i);
+        }
+      }
+
+      return Enumerable.Range(0, newN)
+        .Select(i => ms[i] + Util.ScalarProd(Util.GetRow(Ks, i), alpha));
+    }
+
+    public IEnumerable<double> GetEstimatedVariance(Dataset dataset, IEnumerable<int> rows) {
+      var newX = AlglibUtil.PrepareAndScaleInputMatrix(dataset, allowedInputVariables, rows, inputScaling);
+      int newN = newX.GetLength(0);
+      int n = x.GetLength(0);
+
+      var kss = new double[newN];
+      double[,] sWKs = new double[n, newN];
 
       // for stddev 
-      // alglib.rmatrixsolvem(l, n, sWKs, newN, true, out info, out denseSolveRep, out v);
-
+      for (int i = 0; i < newN; i++)
+        kss[i] = covarianceFunction.GetCovariance(newX, i, i);
 
       for (int i = 0; i < newN; i++) {
-        // predMean[i] = ms[i] + prod(GetRow(Ks, i), alpha);
-        yield return ms[i] + Util.ScalarProd(Util.GetRow(Ks, i), alpha);
-        // var sumV2 = prod(GetCol(v, i), GetCol(v, i));
-        // predVar[i] = kss[i] - sumV2;
-      }
-
+        for (int j = 0; j < n; j++) {
+          sWKs[j, i] = covarianceFunction.GetCrossCovariance(x, newX, j, i) / Math.Sqrt(sqrSigmaNoise);
+        }
+      }
+
+      // for stddev 
+      alglib.ablas.rmatrixlefttrsm(n, newN, l, 0, 0, false, false, 0, ref sWKs, 0, 0);
+
+      for (int i = 0; i < newN; i++) {
+        var sumV = Util.ScalarProd(Util.GetCol(sWKs, i), Util.GetCol(sWKs, i));
+        kss[i] -= sumV;
+        if (kss[i] < 0) kss[i] = 0;
+      }
+      return kss;
     }
   }
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessRegression.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessRegression.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessRegression.cs	(revision 8585)
@@ -22,6 +22,4 @@
 
 using System;
-using System.Collections.Generic;
-using System.Linq;
 using HeuristicLab.Algorithms.GradientDescent;
 using HeuristicLab.Common;
@@ -32,5 +30,4 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.PluginInfrastructure;
 using HeuristicLab.Problems.DataAnalysis;
 
@@ -59,9 +56,9 @@
 
     #region parameter properties
-    public IConstrainedValueParameter<IMeanFunction> MeanFunctionParameter {
-      get { return (IConstrainedValueParameter<IMeanFunction>)Parameters[MeanFunctionParameterName]; }
+    public IValueParameter<IMeanFunction> MeanFunctionParameter {
+      get { return (IValueParameter<IMeanFunction>)Parameters[MeanFunctionParameterName]; }
     }
-    public IConstrainedValueParameter<ICovarianceFunction> CovarianceFunctionParameter {
-      get { return (IConstrainedValueParameter<ICovarianceFunction>)Parameters[CovarianceFunctionParameterName]; }
+    public IValueParameter<ICovarianceFunction> CovarianceFunctionParameter {
+      get { return (IValueParameter<ICovarianceFunction>)Parameters[CovarianceFunctionParameterName]; }
     }
     public IValueParameter<IntValue> MinimizationIterationsParameter {
@@ -104,11 +101,6 @@
       Problem = new RegressionProblem();
 
-      List<IMeanFunction> meanFunctions = ApplicationManager.Manager.GetInstances<IMeanFunction>().ToList();
-      List<ICovarianceFunction> covFunctions = ApplicationManager.Manager.GetInstances<ICovarianceFunction>().ToList();
-
-      Parameters.Add(new ConstrainedValueParameter<IMeanFunction>(MeanFunctionParameterName, "The mean function to use.",
-        new ItemSet<IMeanFunction>(meanFunctions), meanFunctions.OfType<MeanConst>().First()));
-      Parameters.Add(new ConstrainedValueParameter<ICovarianceFunction>(CovarianceFunctionParameterName, "The covariance function to use.",
-        new ItemSet<ICovarianceFunction>(covFunctions), covFunctions.OfType<CovarianceSEiso>().First()));
+      Parameters.Add(new ValueParameter<IMeanFunction>(MeanFunctionParameterName, "The mean function to use.", new MeanConst()));
+      Parameters.Add(new ValueParameter<ICovarianceFunction>(CovarianceFunctionParameterName, "The covariance function to use.", new CovarianceSEiso()));
       Parameters.Add(new ValueParameter<IntValue>(MinimizationIterationsParameterName, "The number of iterations for likelihood optimization with LM-BFGS.", new IntValue(20)));
       Parameters.Add(new ValueParameter<IntValue>(SeedParameterName, "The random seed used to initialize the new pseudo random number generator.", new IntValue(0)));
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessRegressionModelCreator.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessRegressionModelCreator.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessRegressionModelCreator.cs	(revision 8585)
@@ -20,4 +20,5 @@
 #endregion
 
+using System;
 using System.Linq;
 using HeuristicLab.Common;
@@ -60,8 +61,15 @@
 
     public override IOperation Apply() {
-      var model = Create(ProblemData, Hyperparameter.ToArray(), MeanFunction, CovarianceFunction);
-      ModelParameter.ActualValue = model;
-      NegativeLogLikelihoodParameter.ActualValue = new DoubleValue(model.NegativeLogLikelihood);
-      HyperparameterGradientsParameter.ActualValue = new RealVector(model.GetHyperparameterGradients());
+      try {
+        var model = Create(ProblemData, Hyperparameter.ToArray(), MeanFunction, CovarianceFunction);
+        ModelParameter.ActualValue = model;
+        NegativeLogLikelihoodParameter.ActualValue = new DoubleValue(model.NegativeLogLikelihood);
+        HyperparameterGradientsParameter.ActualValue = new RealVector(model.HyperparameterGradients);
+        return base.Apply();
+      }
+      catch (ArgumentException) { }
+      catch (alglib.alglibexception) { }
+      NegativeLogLikelihoodParameter.ActualValue = new DoubleValue(1E300);
+      HyperparameterGradientsParameter.ActualValue = new RealVector(Hyperparameter.Count());
       return base.Apply();
     }
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessRegressionSolution.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessRegressionSolution.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessRegressionSolution.cs	(revision 8585)
@@ -20,4 +20,6 @@
 #endregion
 
+using System.Collections.Generic;
+using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -51,4 +53,18 @@
       return new GaussianProcessRegressionSolution(this, cloner);
     }
+
+    public IEnumerable<double> EstimatedVariance {
+      get { return GetEstimatedVariance(Enumerable.Range(0, ProblemData.Dataset.Rows)); }
+    }
+    public IEnumerable<double> EstimatedTrainingVariance {
+      get { return GetEstimatedVariance(ProblemData.TrainingIndices); }
+    }
+    public IEnumerable<double> EstimatedTestVariance {
+      get { return GetEstimatedVariance(ProblemData.TestIndices); }
+    }
+
+    public IEnumerable<double> GetEstimatedVariance(IEnumerable<int> rows) {
+      return Model.GetEstimatedVariance(ProblemData.Dataset, rows);
+    }
   }
 }
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessRegressionSolutionCreator.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessRegressionSolutionCreator.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessRegressionSolutionCreator.cs	(revision 8585)
@@ -75,19 +75,25 @@
 
     public override IOperation Apply() {
-      var m = ModelParameter.ActualValue;
-      var data = ProblemDataParameter.ActualValue;
-      var s = new GaussianProcessRegressionSolution(m, data);
+      if (ModelParameter.ActualValue != null) {
+        var m = (IGaussianProcessModel)ModelParameter.ActualValue.Clone();
+        var data = (IRegressionProblemData)ProblemDataParameter.ActualValue.Clone();
+        var s = new GaussianProcessRegressionSolution(m, data);
 
 
-      SolutionParameter.ActualValue = s;
-      var results = ResultsParameter.ActualValue;
-      if (!results.ContainsKey(SolutionParameterName)) {
-        results.Add(new Result(SolutionParameterName, "The Gaussian process regression solution", s));
-        results.Add(new Result(TrainingRSquaredResultName, "The Pearson's R² of the Gaussian process solution on the training partition.", new DoubleValue(s.TrainingRSquared)));
-        results.Add(new Result(TestRSquaredResultName, "The Pearson's R² of the Gaussian process solution on the test partition.", new DoubleValue(s.TestRSquared)));
-      } else {
-        results[SolutionParameterName].Value = s;
-        results[TrainingRSquaredResultName].Value = new DoubleValue(s.TrainingRSquared);
-        results[TestRSquaredResultName].Value = new DoubleValue(s.TestRSquared);
+        SolutionParameter.ActualValue = s;
+        var results = ResultsParameter.ActualValue;
+        if (!results.ContainsKey(SolutionParameterName)) {
+          results.Add(new Result(SolutionParameterName, "The Gaussian process regression solution", s));
+          results.Add(new Result(TrainingRSquaredResultName,
+                                 "The Pearson's R² of the Gaussian process solution on the training partition.",
+                                 new DoubleValue(s.TrainingRSquared)));
+          results.Add(new Result(TestRSquaredResultName,
+                                 "The Pearson's R² of the Gaussian process solution on the test partition.",
+                                 new DoubleValue(s.TestRSquared)));
+        } else {
+          results[SolutionParameterName].Value = s;
+          results[TrainingRSquaredResultName].Value = new DoubleValue(s.TrainingRSquared);
+          results[TestRSquaredResultName].Value = new DoubleValue(s.TestRSquared);
+        }
       }
       return base.Apply();
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/HyperParameter.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/HyperParameter.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/HyperParameter.cs	(revision 8585)
@@ -0,0 +1,70 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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 System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Algorithms.DataAnalysis {
+  [StorableClass]
+  [Item(Name = "HyperParameter", Description = "Represents a hyperparameter for Gaussian processes.")]
+  public class HyperParameter<T> : OptionalValueParameter<T>, IValueParameter<T> where T : class, IItem {
+
+    [Storable]
+    private bool @fixed = false;
+    public bool Fixed {
+      get { return @fixed; }
+    }
+
+    [StorableConstructor]
+    protected HyperParameter(bool deserializing) : base(deserializing) { }
+    protected HyperParameter(HyperParameter<T> original, Cloner cloner)
+      : base(original, cloner) {
+      this.@fixed = original.@fixed;
+    }
+    public HyperParameter(string name, string description)
+      : base(name, description) {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new HyperParameter<T>(this, cloner);
+    }
+
+    // if a value is set through this property then we fix the value of the hyperparameter 
+    public override T Value {
+      get {
+        return base.Value;
+      }
+      set {
+        base.Value = value;
+        @fixed = value != null;
+      }
+    }
+
+    // in the optimization we are allowed to set the value of non-fixed parameters
+    public void SetValue(T value) {
+      if (@fixed) throw new InvalidOperationException("Can't set the value of a fixed hyperparameter");
+      base.Value = value;
+    }
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/ICovarianceFunction.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/ICovarianceFunction.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/ICovarianceFunction.cs	(revision 8585)
@@ -20,4 +20,5 @@
 #endregion
 
+using System.Collections.Generic;
 using HeuristicLab.Core;
 
@@ -26,9 +27,7 @@
     int GetNumberOfParameters(int numberOfVariables);
     void SetParameter(double[] hyp);
-    void SetData(double[,] x);
-    void SetData(double[,] x, double[,] xt);
-
-    double GetCovariance(int i, int j);
-    double[] GetGradient(int i, int j);
+    double GetCovariance(double[,] x, int i, int j);
+    IEnumerable<double> GetGradient(double[,] x, int i, int j);
+    double GetCrossCovariance(double[,] x, double[,] xt, int i, int j);
   }
 }
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/MeanConst.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/MeanConst.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/MeanConst.cs	(revision 8585)
@@ -32,4 +32,6 @@
     [Storable]
     private double c;
+    public double Value { get { return c; } }
+
     public int GetNumberOfParameters(int numberOfVariables) {
       return 1;
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/MeanLinear.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/MeanLinear.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/MeanLinear.cs	(revision 8585)
@@ -31,4 +31,12 @@
     [Storable]
     private double[] alpha;
+    public double[] Weights {
+      get {
+        if (alpha == null) return new double[0];
+        var copy = new double[alpha.Length];
+        Array.Copy(alpha, copy, copy.Length);
+        return copy;
+      }
+    }
     public int GetNumberOfParameters(int numberOfVariables) {
       return numberOfVariables;
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/MeanProd.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/MeanProd.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/MeanProd.cs	(revision 8585)
@@ -82,16 +82,20 @@
     public double[] GetGradients(int k, double[,] x) {
       double[] res = Enumerable.Repeat(1.0, x.GetLength(0)).ToArray();
-      foreach (var f in factors) {
-        var numParam = f.GetNumberOfParameters(numberOfVariables);
-        if (k >= 0 && k < numParam) {
+      // find index of factor for the given k
+      int j = 0;
+      while (k >= factors[j].GetNumberOfParameters(numberOfVariables)) {
+        k -= factors[j].GetNumberOfParameters(numberOfVariables);
+        j++;
+      }
+      for (int i = 0; i < factors.Count; i++) {
+        var f = factors[i];
+        if (i == j) {
           // multiply gradient
           var g = f.GetGradients(k, x);
-          for (int i = 0; i < res.Length; i++) res[i] *= g[i];
-          k -= numParam;
+          for (int ii = 0; ii < res.Length; ii++) res[ii] *= g[ii];
         } else {
           // multiply mean
           var m = f.GetMean(x);
-          for (int i = 0; i < res.Length; i++) res[i] *= m[i];
-          k -= numParam;
+          for (int ii = 0; ii < res.Length; ii++) res[ii] *= m[ii];
         }
       }
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/Util.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/Util.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/Util.cs	(revision 8585)
@@ -20,5 +20,4 @@
 #endregion
 
-using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -30,11 +29,59 @@
     }
 
+    public static double SqrDist(IEnumerable<double> x, IEnumerable<double> y) {
+      return x.Zip(y, (a, b) => (a - b) * (a - b)).Sum();
+    }
+
     public static double SqrDist(double x, double y) {
       double d = x - y;
-      return Math.Max(d * d, 0.0);
+      return d * d;
     }
 
-    public static double SqrDist(IEnumerable<double> x, IEnumerable<double> y) {
-      return x.Zip(y, SqrDist).Sum();
+    public static double SqrDist(double[,] x, int i, int j, double scale = 1.0) {
+      return SqrDist(x, i, x, j, scale);
+    }
+
+    public static double SqrDist(double[,] x, int i, double[,] xt, int j, double scale = 1.0) {
+      double ss = 0.0;
+      for (int k = 0; k < x.GetLength(1); k++) {
+        double d = x[i, k] - xt[j, k];
+        ss += d * d;
+      }
+      return scale * scale * ss;
+    }
+
+    public static double SqrDist(double[,] x, int i, int j, double[] scale) {
+      return SqrDist(x, i, x, j, scale);
+    }
+
+    public static double SqrDist(double[,] x, int i, double[,] xt, int j, double[] scale) {
+      double ss = 0.0;
+      for (int k = 0; k < x.GetLength(1); k++) {
+        double d = x[i, k] - xt[j, k];
+        ss += d * d * scale[k] * scale[k];
+      }
+      return ss;
+    }
+    public static double ScalarProd(double[,] x, int i, int j, double scale = 1.0) {
+      return ScalarProd(x, i, x, j, scale);
+    }
+
+    public static double ScalarProd(double[,] x, int i, double[,] xt, int j, double scale = 1.0) {
+      double sum = 0.0;
+      for (int k = 0; k < x.GetLength(1); k++) {
+        sum += x[i, k] * xt[j, k];
+      }
+      return scale * scale * sum;
+    }
+    public static double ScalarProd(double[,] x, int i, int j, double[] scale) {
+      return ScalarProd(x, i, x, j, scale);
+    }
+
+    public static double ScalarProd(double[,] x, int i, double[,] xt, int j, double[] scale) {
+      double sum = 0.0;
+      for (int k = 0; k < x.GetLength(1); k++) {
+        sum += x[i, k] * scale[k] * xt[j, k] * scale[k];
+      }
+      return sum;
     }
 
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/HeuristicLab.Algorithms.DataAnalysis-3.4.csproj
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/HeuristicLab.Algorithms.DataAnalysis-3.4.csproj	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/HeuristicLab.Algorithms.DataAnalysis-3.4.csproj	(revision 8585)
@@ -120,4 +120,12 @@
     </Compile>
     <Compile Include="FixedDataAnalysisAlgorithm.cs" />
+    <Compile Include="GaussianProcess\HyperParameter.cs" />
+    <Compile Include="GaussianProcess\CovarianceFunction.cs" />
+    <Compile Include="GaussianProcess\CovarianceRQArd.cs" />
+    <Compile Include="GaussianProcess\CovarianceMaternIso.cs" />
+    <Compile Include="GaussianProcess\CovarianceLinearArd.cs" />
+    <Compile Include="GaussianProcess\CovarianceRQiso.cs" />
+    <Compile Include="GaussianProcess\CovarianceNoise.cs" />
+    <Compile Include="GaussianProcess\CovarianceConst.cs" />
     <Compile Include="GaussianProcess\MeanProd.cs" />
     <Compile Include="GaussianProcess\MeanSum.cs" />
@@ -145,4 +153,6 @@
     <Compile Include="Interfaces\IGaussianProcessModel.cs" />
     <Compile Include="Interfaces\IGaussianProcessSolution.cs" />
+    <Compile Include="Interfaces\INcaClassificationSolution.cs" />
+    <Compile Include="Interfaces\INcaModel.cs" />
     <Compile Include="Interfaces\INearestNeighbourClassificationSolution.cs" />
     <Compile Include="Interfaces\INearestNeighbourRegressionSolution.cs" />
@@ -175,4 +185,12 @@
     <Compile Include="Linear\MultinomialLogitClassificationSolution.cs" />
     <Compile Include="Linear\MultinomialLogitModel.cs" />
+    <Compile Include="Nca\Initialization\INcaInitializer.cs" />
+    <Compile Include="Nca\Initialization\LdaInitializer.cs" />
+    <Compile Include="Nca\Initialization\PcaInitializer.cs" />
+    <Compile Include="Nca\Initialization\RandomInitializer.cs" />
+    <Compile Include="Nca\Matrix.cs" />
+    <Compile Include="Nca\NcaAlgorithm.cs" />
+    <Compile Include="Nca\NcaClassificationSolution.cs" />
+    <Compile Include="Nca\NcaModel.cs" />
     <Compile Include="NearestNeighbour\NearestNeighbourClassification.cs" />
     <Compile Include="NearestNeighbour\NearestNeighbourClassificationSolution.cs" />
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Interfaces/IGaussianProcessModel.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Interfaces/IGaussianProcessModel.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Interfaces/IGaussianProcessModel.cs	(revision 8585)
@@ -20,4 +20,5 @@
 #endregion
 
+using System.Collections.Generic;
 using HeuristicLab.Problems.DataAnalysis;
 
@@ -28,7 +29,10 @@
   public interface IGaussianProcessModel : IRegressionModel {
     double NegativeLogLikelihood { get; }
+    double SigmaNoise { get; }
     IMeanFunction MeanFunction { get; }
     ICovarianceFunction CovarianceFunction { get; }
-    double[] GetHyperparameterGradients();
+    double[] HyperparameterGradients { get; }
+
+    IEnumerable<double> GetEstimatedVariance(Dataset ds, IEnumerable<int> rows);
   }
 }
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Interfaces/INcaClassificationSolution.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Interfaces/INcaClassificationSolution.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Interfaces/INcaClassificationSolution.cs	(revision 8585)
@@ -0,0 +1,28 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.Problems.DataAnalysis;
+
+namespace HeuristicLab.Algorithms.DataAnalysis {
+  public interface INcaClassificationSolution : IClassificationSolution {
+    new INcaModel Model { get; }
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Interfaces/INcaModel.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Interfaces/INcaModel.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Interfaces/INcaModel.cs	(revision 8585)
@@ -0,0 +1,31 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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 System.Collections.Generic;
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.Algorithms.DataAnalysis {
+  public interface INcaModel : IClassificationModel {
+    new INcaClassificationSolution CreateClassificationSolution(IClassificationProblemData problemData);
+
+    double[,] Reduce(Dataset dataset, IEnumerable<int> rows);
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Linear/LinearDiscriminantAnalysis.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Linear/LinearDiscriminantAnalysis.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Linear/LinearDiscriminantAnalysis.cs	(revision 8585)
@@ -111,5 +111,7 @@
       IClassificationProblemData problemData,
       IEnumerable<int> rows) {
-      return new SymbolicDiscriminantFunctionClassificationModel(tree, interpreter);
+      var model = new SymbolicDiscriminantFunctionClassificationModel(tree, interpreter);
+      model.SetAccuracyMaximizingThresholds(problemData);
+      return model;
     }
   }
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Linear/MultinomialLogitModel.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Linear/MultinomialLogitModel.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Linear/MultinomialLogitModel.cs	(revision 8585)
@@ -109,5 +109,5 @@
 
     public MultinomialLogitClassificationSolution CreateClassificationSolution(IClassificationProblemData problemData) {
-      return new MultinomialLogitClassificationSolution(problemData, this);
+      return new MultinomialLogitClassificationSolution(new ClassificationProblemData(problemData), this);
     }
     IClassificationSolution IClassificationModel.CreateClassificationSolution(IClassificationProblemData problemData) {
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Linear/Scaling.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Linear/Scaling.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Linear/Scaling.cs	(revision 8585)
@@ -59,4 +59,9 @@
       return ds.GetDoubleValues(variable, rows).Select(x => (x - min) / (max - min));
     }
+
+    public void GetScalingParameters(string variable, out double min, out double max) {
+      min = scalingParameters[variable].Item1;
+      max = scalingParameters[variable].Item2;
+    }
   }
 }
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Nca/Initialization/INcaInitializer.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Nca/Initialization/INcaInitializer.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Nca/Initialization/INcaInitializer.cs	(revision 8585)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.Core;
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.Algorithms.DataAnalysis {
+  public interface INCAInitializer : IItem {
+    /// <summary>
+    /// Calculates an initial projection for the NCA to start from.
+    /// </summary>
+    /// <param name="data">The problem data that contains the AllowedInputVariables and TrainingIndices.</param>
+    /// <param name="dimensions">The amount of columns in the matrix</param>
+    /// <returns>A flat representation of a matrix that is read row-wise and contains AllowedInputVariables * TrainingIndices numbers.</returns>
+    double[] Initialize(IClassificationProblemData data, int dimensions);
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Nca/Initialization/LdaInitializer.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Nca/Initialization/LdaInitializer.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Nca/Initialization/LdaInitializer.cs	(revision 8585)
@@ -0,0 +1,80 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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 System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.Algorithms.DataAnalysis {
+  [Item("LDA", "Initializes the matrix by performing a linear discriminant analysis.")]
+  [StorableClass]
+  public class LDAInitializer : Item, INCAInitializer {
+
+    [StorableConstructor]
+    protected LDAInitializer(bool deserializing) : base(deserializing) { }
+    protected LDAInitializer(LDAInitializer original, Cloner cloner) : base(original, cloner) { }
+    public LDAInitializer() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new LDAInitializer(this, cloner);
+    }
+
+    public double[] Initialize(IClassificationProblemData data, int dimensions) {
+      var instances = data.TrainingIndices.Count();
+      var attributes = data.AllowedInputVariables.Count();
+
+      var ldaDs = new double[instances, attributes + 1];
+      int row, col = 0;
+      foreach (var variable in data.AllowedInputVariables) {
+        row = 0;
+        foreach (var value in data.Dataset.GetDoubleValues(variable, data.TrainingIndices)) {
+          ldaDs[row, col] = value;
+          row++;
+        }
+        col++;
+      }
+      row = 0;
+      var uniqueClasses = new Dictionary<double, int>();
+      foreach (var label in data.Dataset.GetDoubleValues(data.TargetVariable, data.TrainingIndices)) {
+        if (!uniqueClasses.ContainsKey(label))
+          uniqueClasses[label] = uniqueClasses.Count;
+        ldaDs[row++, attributes] = label;
+      }
+      for (row = 0; row < instances; row++)
+        ldaDs[row, attributes] = uniqueClasses[ldaDs[row, attributes]];
+
+      int info;
+      double[,] matrix;
+      alglib.fisherldan(ldaDs, instances, attributes, uniqueClasses.Count, out info, out matrix);
+
+      var result = new double[attributes * dimensions];
+      for (int i = 0; i < attributes; i++)
+        for (int j = 0; j < dimensions; j++)
+          result[i * dimensions + j] = matrix[i, j];
+
+      return result;
+    }
+
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Nca/Initialization/PcaInitializer.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Nca/Initialization/PcaInitializer.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Nca/Initialization/PcaInitializer.cs	(revision 8585)
@@ -0,0 +1,71 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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 System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.Algorithms.DataAnalysis {
+  [Item("PCA", "Initializes the matrix by performing a principal components analysis.")]
+  [StorableClass]
+  public sealed class PCAInitializer : Item, INCAInitializer {
+
+    [StorableConstructor]
+    private PCAInitializer(bool deserializing) : base(deserializing) { }
+    private PCAInitializer(PCAInitializer original, Cloner cloner) : base(original, cloner) { }
+    public PCAInitializer() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PCAInitializer(this, cloner);
+    }
+
+    public double[] Initialize(IClassificationProblemData data, int dimensions) {
+      var instances = data.TrainingIndices.Count();
+      var attributes = data.AllowedInputVariables.Count();
+
+      var pcaDs = new double[instances, attributes];
+      int col = 0;
+      foreach (var variable in data.AllowedInputVariables) {
+        int row = 0;
+        foreach (var value in data.Dataset.GetDoubleValues(variable, data.TrainingIndices)) {
+          pcaDs[row, col] = value;
+          row++;
+        }
+        col++;
+      }
+
+      int info;
+      double[] varianceValues;
+      double[,] matrix;
+      alglib.pcabuildbasis(pcaDs, instances, attributes, out info, out varianceValues, out matrix);
+
+      var result = new double[attributes * dimensions];
+      for (int i = 0; i < attributes; i++)
+        for (int j = 0; j < dimensions; j++)
+          result[i * dimensions + j] = matrix[i, j];
+
+      return result;
+    }
+
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Nca/Initialization/RandomInitializer.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Nca/Initialization/RandomInitializer.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Nca/Initialization/RandomInitializer.cs	(revision 8585)
@@ -0,0 +1,81 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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 System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.DataAnalysis;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.Algorithms.DataAnalysis {
+  [Item("Random", "Initializes the matrix randomly.")]
+  [StorableClass]
+  public class RandomInitializer : ParameterizedNamedItem, INCAInitializer {
+    private IValueParameter<IntValue> RandomParameter {
+      get { return (IValueParameter<IntValue>)Parameters["Seed"]; }
+    }
+    private IValueParameter<BoolValue> SetSeedRandomlyParameter {
+      get { return (IValueParameter<BoolValue>)Parameters["SetSeedRandomly"]; }
+    }
+
+    public int Seed {
+      get { return RandomParameter.Value.Value; }
+      set { RandomParameter.Value.Value = value; }
+    }
+
+    public bool SetSeedRandomly {
+      get { return SetSeedRandomlyParameter.Value.Value; }
+      set { SetSeedRandomlyParameter.Value.Value = value; }
+    }
+
+    [StorableConstructor]
+    protected RandomInitializer(bool deserializing) : base(deserializing) { }
+    protected RandomInitializer(RandomInitializer original, Cloner cloner) : base(original, cloner) { }
+    public RandomInitializer()
+      : base() {
+      Parameters.Add(new ValueParameter<IntValue>("Seed", "The seed for the random number generator.", new IntValue(0)));
+      Parameters.Add(new ValueParameter<BoolValue>("SetSeedRandomly", "Whether the seed should be randomized for each call.", new BoolValue(true)));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RandomInitializer(this, cloner);
+    }
+
+    public double[] Initialize(IClassificationProblemData data, int dimensions) {
+      var instances = data.TrainingIndices.Count();
+      var attributes = data.AllowedInputVariables.Count();
+
+      var random = new MersenneTwister();
+      if (SetSeedRandomly) Seed = random.Next();
+      random.Reset(Seed);
+
+      var range = data.AllowedInputVariables.Select(x => data.Dataset.GetDoubleValues(x).Max() - data.Dataset.GetDoubleValues(x).Min()).ToArray();
+      var matrix = new double[attributes * dimensions];
+      for (int i = 0; i < matrix.Length; i++)
+        matrix[i] = random.NextDouble() / range[i / dimensions];
+
+      return matrix;
+    }
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Nca/Matrix.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Nca/Matrix.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Nca/Matrix.cs	(revision 8585)
@@ -0,0 +1,212 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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 System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Algorithms.DataAnalysis {
+  [NonDiscoverableType]
+  internal class Matrix : IEnumerable<double>, IDeepCloneable {
+    // this type is immutable
+    private readonly IEnumerable<double> values;
+    public readonly int Rows;
+    public readonly int Columns;
+
+    protected Matrix(Matrix original, Cloner cloner) {
+      this.values = original.values.ToArray();
+      this.Rows = original.Rows;
+      this.Columns = original.Columns;
+      cloner.RegisterClonedObject(original, this);
+    }
+    public Matrix(IEnumerable<double> vector) {
+      this.values = vector;
+      Rows = 1;
+      Columns = vector.Count();
+    }
+    public Matrix(IEnumerable<double> vector, int length) {
+      this.values = vector;
+      Rows = 1;
+      Columns = length;
+    }
+    public Matrix(double[,] matrix) {
+      this.values = GetOnlineValues(matrix);
+      Rows = matrix.GetLength(0);
+      Columns = matrix.GetLength(1);
+    }
+    public Matrix(IEnumerable<double> matrix, int rows, int columns) {
+      this.values = matrix;
+      Rows = rows;
+      Columns = columns;
+    }
+
+    public object Clone() {
+      return Clone(new Cloner());
+    }
+    public IDeepCloneable Clone(Cloner cloner) {
+      return new Matrix(this, cloner);
+    }
+
+    public Matrix Transpose() {
+      var result = new Matrix(Transpose(values, Columns, Rows), Columns, Rows);
+      return result;
+    }
+
+    private IEnumerable<double> Transpose(IEnumerable<double> values, int rows, int columns) {
+      // vectors don't need to be transposed
+      if (rows == 1 || columns == 1) {
+        foreach (var v in values) yield return v;
+        yield break;
+      }
+
+      int skip = 0;
+      var iter = values.GetEnumerator();
+      if (!iter.MoveNext()) yield break;
+      while (skip < rows) {
+        for (int i = 0; i < skip; i++) iter.MoveNext();
+        yield return iter.Current;
+        for (int j = 0; j < columns - 1; j++) {
+          for (int i = 0; i < rows; i++) iter.MoveNext();
+          yield return iter.Current;
+        }
+        skip++;
+        if (skip < rows) {
+          iter = values.GetEnumerator();
+          iter.MoveNext();
+        }
+      }
+    }
+
+    public Matrix Add(Matrix other) {
+      return new Matrix(AddOnline(other), Rows, Columns);
+    }
+
+    public void AddTo(double[,] matrix) {
+      if (Rows != matrix.GetLength(0) || Columns != matrix.GetLength(1)) throw new ArgumentException("unequal size", "matrix");
+      var iter = values.GetEnumerator();
+      for (int i = 0; i < Rows; i++)
+        for (int j = 0; j < Columns; j++) {
+          iter.MoveNext();
+          matrix[i, j] += iter.Current;
+        }
+    }
+
+    public Matrix Subtract(Matrix other) {
+      return new Matrix(SubtractOnline(other), Rows, Columns);
+    }
+
+    public Matrix Multiply(Matrix other) {
+      return new Matrix(MultiplyOnline(other), Rows, other.Columns);
+    }
+
+    public Matrix Multiply(double value) {
+      return new Matrix(values.Select(x => x * value), Rows, Columns);
+    }
+
+    public double VectorLength() {
+      return Math.Sqrt(SquaredVectorLength());
+    }
+
+    public double SquaredVectorLength() {
+      if (Rows != 1) throw new ArgumentException("Length only works on vectors.");
+      return values.Sum(x => x * x);
+    }
+
+    public Matrix OuterProduct(Matrix other) {
+      if (Rows != 1 || other.Rows != 1) throw new ArgumentException("OuterProduct can only be applied to vectors.");
+      return Transpose().Multiply(other);
+    }
+
+    public Matrix Negate() {
+      return new Matrix(values.Select(x => -x), Rows, Columns);
+    }
+
+    public Matrix Apply() {
+      return new Matrix(values.ToArray(), Rows, Columns);
+    }
+
+    public IEnumerator<double> GetEnumerator() { return values.GetEnumerator(); }
+    IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }
+
+
+    private IEnumerable<double> AddOnline(Matrix other) {
+      if (Rows != other.Rows || Columns != other.Columns) throw new ArgumentException("Number of rows and columns are not equal.");
+      var meIter = values.GetEnumerator();
+      var otherIter = other.GetEnumerator();
+      if (!meIter.MoveNext()) yield break;
+      if (!otherIter.MoveNext()) yield break;
+      for (int i = 0; i < Rows * Columns; i++) {
+        yield return meIter.Current + otherIter.Current;
+        meIter.MoveNext();
+        otherIter.MoveNext();
+      }
+    }
+
+    private IEnumerable<double> SubtractOnline(Matrix other) {
+      if (Rows != other.Rows || Columns != other.Columns) throw new ArgumentException("Number of rows and columns are not equal.");
+      var meIter = values.GetEnumerator();
+      var otherIter = other.GetEnumerator();
+      if (!meIter.MoveNext()) yield break;
+      if (!otherIter.MoveNext()) yield break;
+      for (int i = 0; i < Rows * Columns; i++) {
+        yield return meIter.Current - otherIter.Current;
+        meIter.MoveNext();
+        otherIter.MoveNext();
+      }
+    }
+
+    private IEnumerable<double> MultiplyOnline(Matrix other) {
+      if (Columns != other.Rows) throw new ArgumentException("Number of rows and columns are not equal.");
+      var meIter = values.GetEnumerator();
+      var otherByColumn = other.Transpose();
+      var otherIter = otherByColumn.GetEnumerator();
+      if (!meIter.MoveNext()) yield break;
+      if (!otherIter.MoveNext()) yield break;
+      for (int r = 0; r < Rows; r++) {
+        var row = new double[Columns];
+        for (int x = 0; x < Columns; x++) {
+          row[x] = meIter.Current;
+          meIter.MoveNext();
+        }
+        for (int c = 0; c < other.Columns; c++) {
+          var sum = 0.0;
+          for (int y = 0; y < other.Rows; y++) {
+            sum += row[y] * otherIter.Current;
+            otherIter.MoveNext();
+          }
+          yield return sum;
+        }
+        otherIter = otherByColumn.GetEnumerator();
+        otherIter.MoveNext();
+      }
+    }
+
+    private IEnumerable<double> GetOnlineValues(double[,] matrix) {
+      for (int i = 0; i < matrix.GetLength(0); i++)
+        for (int j = 0; j < matrix.GetLength(1); j++) {
+          yield return matrix[i, j];
+        }
+    }
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Nca/NcaAlgorithm.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Nca/NcaAlgorithm.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Nca/NcaAlgorithm.cs	(revision 8585)
@@ -0,0 +1,259 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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 System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using HeuristicLab.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.Algorithms.DataAnalysis {
+  internal delegate void Reporter(double quality, double[] coefficients);
+  /// <summary>
+  /// Neighborhood Components Analysis
+  /// </summary>
+  [Item("Neighborhood Components Analysis (NCA)", "Implementation of Neighborhood Components Analysis based on the description of J. Goldberger, S. Roweis, G. Hinton, R. Salakhutdinov. 2005. Neighbourhood Component Analysis. Advances in Neural Information Processing Systems, 17. pp. 513-520.")]
+  [Creatable("Data Analysis")]
+  [StorableClass]
+  public sealed class NcaAlgorithm : FixedDataAnalysisAlgorithm<IClassificationProblem> {
+    #region Parameter Properties
+    public IFixedValueParameter<IntValue> KParameter {
+      get { return (IFixedValueParameter<IntValue>)Parameters["K"]; }
+    }
+    public IFixedValueParameter<IntValue> DimensionsParameter {
+      get { return (IFixedValueParameter<IntValue>)Parameters["Dimensions"]; }
+    }
+    public IConstrainedValueParameter<INCAInitializer> InitializationParameter {
+      get { return (IConstrainedValueParameter<INCAInitializer>)Parameters["Initialization"]; }
+    }
+    public IFixedValueParameter<IntValue> NeighborSamplesParameter {
+      get { return (IFixedValueParameter<IntValue>)Parameters["NeighborSamples"]; }
+    }
+    public IFixedValueParameter<IntValue> IterationsParameter {
+      get { return (IFixedValueParameter<IntValue>)Parameters["Iterations"]; }
+    }
+    #endregion
+
+    #region Properties
+    private int K {
+      get { return KParameter.Value.Value; }
+      set { KParameter.Value.Value = value; }
+    }
+    private int Dimensions {
+      get { return DimensionsParameter.Value.Value; }
+      set { DimensionsParameter.Value.Value = value; }
+    }
+    private int NeighborSamples {
+      get { return NeighborSamplesParameter.Value.Value; }
+      set { NeighborSamplesParameter.Value.Value = value; }
+    }
+    private int Iterations {
+      get { return IterationsParameter.Value.Value; }
+      set { IterationsParameter.Value.Value = value; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    private NcaAlgorithm(bool deserializing) : base(deserializing) { }
+    private NcaAlgorithm(NcaAlgorithm original, Cloner cloner) : base(original, cloner) { }
+    public NcaAlgorithm()
+      : base() {
+      Parameters.Add(new FixedValueParameter<IntValue>("K", "The K for the nearest neighbor.", new IntValue(1)));
+      Parameters.Add(new FixedValueParameter<IntValue>("Dimensions", "The number of dimensions that NCA should reduce the data to.", new IntValue(2)));
+      Parameters.Add(new ConstrainedValueParameter<INCAInitializer>("Initialization", "Which method should be used to initialize the matrix. Typically LDA (linear discriminant analysis) should provide a good estimate."));
+      Parameters.Add(new FixedValueParameter<IntValue>("NeighborSamples", "How many of the neighbors should be sampled in order to speed up the calculation. This should be at least the value of k and at most the number of training instances minus one.", new IntValue(50)));
+      Parameters.Add(new FixedValueParameter<IntValue>("Iterations", "How many iterations the conjugate gradient (CG) method should be allowed to perform. The method might still terminate earlier if a local optima has already been reached.", new IntValue(20)));
+
+      INCAInitializer defaultInitializer = null;
+      foreach (var initializer in ApplicationManager.Manager.GetInstances<INCAInitializer>().OrderBy(x => x.ItemName)) {
+        if (initializer is LDAInitializer) defaultInitializer = initializer;
+        InitializationParameter.ValidValues.Add(initializer);
+      }
+      if (defaultInitializer != null) InitializationParameter.Value = defaultInitializer;
+
+      Problem = new ClassificationProblem();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new NcaAlgorithm(this, cloner);
+    }
+
+    public override void Prepare() {
+      if (Problem != null) base.Prepare();
+    }
+
+    protected override void Run() {
+      var initializer = InitializationParameter.Value;
+
+      var clonedProblem = (IClassificationProblemData)Problem.ProblemData.Clone();
+      var model = Train(clonedProblem, K, Dimensions, NeighborSamples, Iterations, initializer.Initialize(clonedProblem, Dimensions), ReportQuality, CancellationToken.None);
+      Results.Add(new Result("ClassificationSolution", "The classification solution.", model.CreateClassificationSolution(clonedProblem)));
+    }
+
+    public static INcaClassificationSolution CreateClassificationSolution(IClassificationProblemData data, int k, int dimensions, int neighborSamples, int iterations, INCAInitializer initializer) {
+      var clonedProblem = (IClassificationProblemData)data.Clone();
+      var model = Train(clonedProblem, k, dimensions, neighborSamples, iterations, initializer);
+      return model.CreateClassificationSolution(clonedProblem);
+    }
+
+    public static INcaModel Train(IClassificationProblemData problemData, int k, int dimensions, int neighborSamples, int iterations, INCAInitializer initializer) {
+      return Train(problemData, k, dimensions, neighborSamples, iterations, initializer.Initialize(problemData, dimensions), null, CancellationToken.None);
+    }
+
+    public static INcaModel Train(IClassificationProblemData problemData, int k, int neighborSamples, int iterations, double[,] initalMatrix) {
+      var matrix = new double[initalMatrix.Length];
+      for (int i = 0; i < initalMatrix.GetLength(0); i++)
+        for (int j = 0; j < initalMatrix.GetLength(1); j++)
+          matrix[i * initalMatrix.GetLength(1) + j] = initalMatrix[i, j];
+      return Train(problemData, k, initalMatrix.GetLength(1), neighborSamples, iterations, matrix, null, CancellationToken.None);
+    }
+
+    private static INcaModel Train(IClassificationProblemData data, int k, int dimensions, int neighborSamples, int iterations, double[] matrix, Reporter reporter, CancellationToken cancellation) {
+      var scaling = new Scaling(data.Dataset, data.AllowedInputVariables, data.TrainingIndices);
+      var scaledData = AlglibUtil.PrepareAndScaleInputMatrix(data.Dataset, data.AllowedInputVariables, data.TrainingIndices, scaling);
+      var classes = data.Dataset.GetDoubleValues(data.TargetVariable, data.TrainingIndices).ToArray();
+      var attributes = scaledData.GetLength(1);
+
+      var penalties = new Dictionary<double, Dictionary<double, double>>();
+      foreach (var c in data.ClassValues) {
+        penalties[c] = new Dictionary<double, double>();
+        foreach (var r in data.ClassValues)
+          penalties[c][r] = data.GetClassificationPenalty(c, r);
+      }
+
+      alglib.mincgstate state;
+      alglib.mincgreport rep;
+      alglib.mincgcreate(matrix, out state);
+      alglib.mincgsetcond(state, 0, 0, 0, iterations);
+      alglib.mincgsetxrep(state, true);
+      int neighborSampleSize = neighborSamples;
+      Optimize(state, scaledData, classes, penalties, dimensions, neighborSampleSize, cancellation, reporter);
+      alglib.mincgresults(state, out matrix, out rep);
+
+      var transformationMatrix = new double[attributes, dimensions];
+      var counter = 0;
+      for (var i = 0; i < attributes; i++)
+        for (var j = 0; j < dimensions; j++)
+          transformationMatrix[i, j] = matrix[counter++];
+
+      return new NcaModel(k, transformationMatrix, data.Dataset, data.TrainingIndices, data.TargetVariable, data.AllowedInputVariables, scaling, data.ClassValues.ToArray());
+    }
+
+    private static void Optimize(alglib.mincgstate state, double[,] data, double[] classes, Dictionary<double, Dictionary<double, double>> penalties, int dimensions, int neighborSampleSize, CancellationToken cancellation, Reporter reporter) {
+      while (alglib.mincgiteration(state)) {
+        if (cancellation.IsCancellationRequested) break;
+        if (state.needfg) {
+          Gradient(state.x, ref state.innerobj.f, state.innerobj.g, data, classes, penalties, dimensions, neighborSampleSize);
+          continue;
+        }
+        if (state.innerobj.xupdated) {
+          if (reporter != null)
+            reporter(state.innerobj.f, state.innerobj.x);
+          continue;
+        }
+        throw new InvalidOperationException("Neighborhood Components Analysis: Error in Optimize() (some derivatives were not provided?)");
+      }
+    }
+
+    private static void Gradient(double[] A, ref double func, double[] grad, double[,] data, double[] classes, Dictionary<double, Dictionary<double, double>> penalties, int dimensions, int neighborSampleSize) {
+      var instances = data.GetLength(0);
+      var attributes = data.GetLength(1);
+
+      var AMatrix = new Matrix(A, A.Length / dimensions, dimensions);
+
+      alglib.sparsematrix probabilities;
+      alglib.sparsecreate(instances, instances, out probabilities);
+      var transformedDistances = new Dictionary<int, double>(instances);
+      for (int i = 0; i < instances; i++) {
+        var iVector = new Matrix(GetRow(data, i), data.GetLength(1));
+        for (int k = 0; k < instances; k++) {
+          if (k == i) {
+            transformedDistances.Remove(k);
+            continue;
+          }
+          var kVector = new Matrix(GetRow(data, k));
+          transformedDistances[k] = Math.Exp(-iVector.Multiply(AMatrix).Subtract(kVector.Multiply(AMatrix)).SquaredVectorLength());
+        }
+        var sample = transformedDistances.OrderByDescending(x => x.Value).Take(neighborSampleSize).ToArray();
+        var normalization = sample.Sum(x => x.Value);
+        if (normalization > 0) {
+          foreach (var s in sample) {
+            if (s.Value <= 0) break;
+            alglib.sparseset(probabilities, i, s.Key, s.Value / normalization);
+          }
+        }
+      }
+      alglib.sparseconverttocrs(probabilities); // needed to enumerate in order (top-down and left-right)
+
+      int t0 = 0, t1 = 0, r, c;
+      double val;
+      var pi = new double[instances];
+      func = 0;
+      while (alglib.sparseenumerate(probabilities, ref t0, ref t1, out r, out c, out val)) {
+        double vp = val * penalties[classes[r]][classes[c]];
+        pi[r] += vp;
+        func += vp;
+      }
+
+      t0 = 0; t1 = 0;
+      var innerSum = new double[attributes, attributes];
+      while (alglib.sparseenumerate(probabilities, ref t0, ref t1, out r, out c, out val)) {
+        var vector = new Matrix(GetRow(data, r)).Subtract(new Matrix(GetRow(data, c)));
+        vector.OuterProduct(vector).Multiply(val * pi[r]).AddTo(innerSum);
+        vector.OuterProduct(vector).Multiply(-val * penalties[classes[r]][classes[c]]).AddTo(innerSum);
+      }
+
+      r = 0;
+      var newGrad = AMatrix.Multiply(2.0).Transpose().Multiply(new Matrix(innerSum)).Transpose();
+      foreach (var g in newGrad) {
+        grad[r++] = g;
+      }
+    }
+
+    private void ReportQuality(double func, double[] coefficients) {
+      var instances = Problem.ProblemData.TrainingIndices.Count();
+      DataTable qualities;
+      if (!Results.ContainsKey("Optimization")) {
+        qualities = new DataTable("Optimization");
+        qualities.Rows.Add(new DataRow("Penalty", string.Empty));
+        Results.Add(new Result("Optimization", qualities));
+      } else qualities = (DataTable)Results["Optimization"].Value;
+      qualities.Rows["Penalty"].Values.Add(func / instances);
+
+      if (!Results.ContainsKey("Penalty")) {
+        Results.Add(new Result("Penalty", new DoubleValue(func / instances)));
+      } else ((DoubleValue)Results["Penalty"].Value).Value = func / instances;
+    }
+
+    private static IEnumerable<double> GetRow(double[,] data, int row) {
+      for (int i = 0; i < data.GetLength(1); i++)
+        yield return data[row, i];
+    }
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Nca/NcaClassificationSolution.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Nca/NcaClassificationSolution.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Nca/NcaClassificationSolution.cs	(revision 8585)
@@ -0,0 +1,55 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.Algorithms.DataAnalysis {
+  [Item("NCA Classification Solution", "")]
+  [StorableClass]
+  public class NcaClassificationSolution : ClassificationSolution, INcaClassificationSolution {
+
+    public new INcaModel Model {
+      get { return (INcaModel)base.Model; }
+      set { base.Model = value; }
+    }
+
+    [StorableConstructor]
+    protected NcaClassificationSolution(bool deserializing) : base(deserializing) { }
+    protected NcaClassificationSolution(NcaClassificationSolution original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public NcaClassificationSolution(IClassificationProblemData problemData, INcaModel ncaModel)
+      : base(ncaModel, problemData) {
+      RecalculateResults();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new NcaClassificationSolution(this, cloner);
+    }
+
+    protected override void RecalculateResults() {
+      CalculateResults();
+    }
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Nca/NcaModel.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Nca/NcaModel.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Nca/NcaModel.cs	(revision 8585)
@@ -0,0 +1,113 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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 System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.Algorithms.DataAnalysis {
+  [Item("NCA Model", "")]
+  [StorableClass]
+  public class NcaModel : NamedItem, INcaModel {
+
+    [Storable]
+    private Scaling scaling;
+    [Storable]
+    private double[,] transformationMatrix;
+    public double[,] TransformationMatrix {
+      get { return (double[,])transformationMatrix.Clone(); }
+    }
+    [Storable]
+    private string[] allowedInputVariables;
+    [Storable]
+    private string targetVariable;
+    [Storable]
+    private INearestNeighbourModel nnModel;
+    [Storable]
+    private double[] classValues;
+
+    [StorableConstructor]
+    protected NcaModel(bool deserializing) : base(deserializing) { }
+    protected NcaModel(NcaModel original, Cloner cloner)
+      : base(original, cloner) {
+      this.scaling = cloner.Clone(original.scaling);
+      this.transformationMatrix = (double[,])original.transformationMatrix.Clone();
+      this.allowedInputVariables = (string[])original.allowedInputVariables.Clone();
+      this.targetVariable = original.targetVariable;
+      this.nnModel = cloner.Clone(original.nnModel);
+      this.classValues = (double[])original.classValues.Clone();
+    }
+    public NcaModel(int k, double[,] transformationMatrix, Dataset dataset, IEnumerable<int> rows, string targetVariable, IEnumerable<string> allowedInputVariables, Scaling scaling, double[] classValues) {
+      Name = ItemName;
+      Description = ItemDescription;
+      this.scaling = scaling;
+      this.transformationMatrix = (double[,])transformationMatrix.Clone();
+      this.allowedInputVariables = allowedInputVariables.ToArray();
+      this.targetVariable = targetVariable;
+      this.classValues = (double[])classValues.Clone();
+
+      var ds = ReduceDataset(dataset, rows);
+      nnModel = new NearestNeighbourModel(ds, Enumerable.Range(0, ds.Rows), k, ds.VariableNames.Last(), ds.VariableNames.Take(transformationMatrix.GetLength(1)), classValues);
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new NcaModel(this, cloner);
+    }
+
+    public IEnumerable<double> GetEstimatedClassValues(Dataset dataset, IEnumerable<int> rows) {
+      var ds = ReduceDataset(dataset, rows);
+      return nnModel.GetEstimatedClassValues(ds, Enumerable.Range(0, ds.Rows));
+    }
+
+    public INcaClassificationSolution CreateClassificationSolution(IClassificationProblemData problemData) {
+      return new NcaClassificationSolution(new ClassificationProblemData(problemData), this);
+    }
+
+    IClassificationSolution IClassificationModel.CreateClassificationSolution(IClassificationProblemData problemData) {
+      return CreateClassificationSolution(problemData);
+    }
+
+    public double[,] Reduce(Dataset dataset, IEnumerable<int> rows) {
+      var scaledData = AlglibUtil.PrepareAndScaleInputMatrix(dataset, allowedInputVariables, rows, scaling);
+      var targets = dataset.GetDoubleValues(targetVariable, rows).ToArray();
+      var result = new double[scaledData.GetLength(0), transformationMatrix.GetLength(1) + 1];
+      for (int i = 0; i < scaledData.GetLength(0); i++)
+        for (int j = 0; j < scaledData.GetLength(1); j++) {
+          for (int x = 0; x < transformationMatrix.GetLength(1); x++) {
+            result[i, x] += scaledData[i, j] * transformationMatrix[j, x];
+          }
+          result[i, transformationMatrix.GetLength(1)] = targets[i];
+        }
+      return result;
+    }
+
+    public Dataset ReduceDataset(Dataset dataset, IEnumerable<int> rows) {
+      return new Dataset(Enumerable
+          .Range(0, transformationMatrix.GetLength(1))
+          .Select(x => "X" + x.ToString())
+          .Concat(targetVariable.ToEnumerable()),
+        Reduce(dataset, rows));
+    }
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/NearestNeighbour/NearestNeighbourClassification.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/NearestNeighbour/NearestNeighbourClassification.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/NearestNeighbour/NearestNeighbourClassification.cs	(revision 8585)
@@ -21,16 +21,12 @@
 
 using System;
-using System.Collections.Generic;
 using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
-using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
 using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.Problems.DataAnalysis;
-using HeuristicLab.Problems.DataAnalysis.Symbolic;
-using HeuristicLab.Problems.DataAnalysis.Symbolic.Regression;
-using HeuristicLab.Parameters;
 
 namespace HeuristicLab.Algorithms.DataAnalysis {
@@ -84,29 +80,15 @@
 
     public static IClassificationSolution CreateNearestNeighbourClassificationSolution(IClassificationProblemData problemData, int k) {
-      Dataset dataset = problemData.Dataset;
-      string targetVariable = problemData.TargetVariable;
-      IEnumerable<string> allowedInputVariables = problemData.AllowedInputVariables;
-      IEnumerable<int> rows = problemData.TrainingIndices;
-      double[,] inputMatrix = AlglibUtil.PrepareInputMatrix(dataset, allowedInputVariables.Concat(new string[] { targetVariable }), rows);
-      if (inputMatrix.Cast<double>().Any(x => double.IsNaN(x) || double.IsInfinity(x)))
-        throw new NotSupportedException("Nearest neighbour classification does not support NaN or infinity values in the input dataset.");
+      var problemDataClone = (IClassificationProblemData)problemData.Clone();
+      return new NearestNeighbourClassificationSolution(problemDataClone, Train(problemDataClone, k));
+    }
 
-      alglib.nearestneighbor.kdtree kdtree = new alglib.nearestneighbor.kdtree();
-
-      int nRows = inputMatrix.GetLength(0);
-      int nFeatures = inputMatrix.GetLength(1) - 1;
-      double[] classValues = dataset.GetDoubleValues(targetVariable).Distinct().OrderBy(x => x).ToArray();
-      int nClasses = classValues.Count();
-      // map original class values to values [0..nClasses-1]
-      Dictionary<double, double> classIndices = new Dictionary<double, double>();
-      for (int i = 0; i < nClasses; i++) {
-        classIndices[classValues[i]] = i;
-      }
-      for (int row = 0; row < nRows; row++) {
-        inputMatrix[row, nFeatures] = classIndices[inputMatrix[row, nFeatures]];
-      }
-      alglib.nearestneighbor.kdtreebuild(inputMatrix, nRows, inputMatrix.GetLength(1) - 1, 1, 2, kdtree);
-      var problemDataClone = (IClassificationProblemData) problemData.Clone();
-      return new NearestNeighbourClassificationSolution(problemDataClone, new NearestNeighbourModel(kdtree, k, targetVariable, allowedInputVariables, problemDataClone.ClassValues.ToArray()));
+    public static INearestNeighbourModel Train(IClassificationProblemData problemData, int k) {
+      return new NearestNeighbourModel(problemData.Dataset,
+        problemData.TrainingIndices,
+        k,
+        problemData.TargetVariable,
+        problemData.AllowedInputVariables,
+        problemData.ClassValues.ToArray());
     }
     #endregion
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/NearestNeighbour/NearestNeighbourModel.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/NearestNeighbour/NearestNeighbourModel.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/NearestNeighbour/NearestNeighbourModel.cs	(revision 8585)
@@ -33,5 +33,5 @@
   /// </summary>
   [StorableClass]
-  [Item("NearestNeighbourModel", "Represents a neural network for regression and classification.")]
+  [Item("NearestNeighbourModel", "Represents a nearest neighbour model for regression and classification.")]
   public sealed class NearestNeighbourModel : NamedItem, INearestNeighbourModel {
 
@@ -56,4 +56,5 @@
     [Storable]
     private int k;
+
     [StorableConstructor]
     private NearestNeighbourModel(bool deserializing)
@@ -95,14 +96,37 @@
         this.classValues = (double[])original.classValues.Clone();
     }
-    public NearestNeighbourModel(alglib.nearestneighbor.kdtree kdTree, int k, string targetVariable, IEnumerable<string> allowedInputVariables, double[] classValues = null)
-      : base() {
-      this.name = ItemName;
-      this.description = ItemDescription;
-      this.kdTree = kdTree;
+    public NearestNeighbourModel(Dataset dataset, IEnumerable<int> rows, int k, string targetVariable, IEnumerable<string> allowedInputVariables, double[] classValues = null) {
+      Name = ItemName;
+      Description = ItemDescription;
       this.k = k;
       this.targetVariable = targetVariable;
       this.allowedInputVariables = allowedInputVariables.ToArray();
-      if (classValues != null)
+
+      var inputMatrix = AlglibUtil.PrepareInputMatrix(dataset,
+                                   allowedInputVariables.Concat(new string[] { targetVariable }),
+                                   rows);
+
+      if (inputMatrix.Cast<double>().Any(x => double.IsNaN(x) || double.IsInfinity(x)))
+        throw new NotSupportedException(
+          "Nearest neighbour classification does not support NaN or infinity values in the input dataset.");
+
+      this.kdTree = new alglib.nearestneighbor.kdtree();
+
+      var nRows = inputMatrix.GetLength(0);
+      var nFeatures = inputMatrix.GetLength(1) - 1;
+
+      if (classValues != null) {
         this.classValues = (double[])classValues.Clone();
+        int nClasses = classValues.Length;
+        // map original class values to values [0..nClasses-1]
+        var classIndices = new Dictionary<double, double>();
+        for (int i = 0; i < nClasses; i++)
+          classIndices[classValues[i]] = i;
+
+        for (int row = 0; row < nRows; row++) {
+          inputMatrix[row, nFeatures] = classIndices[inputMatrix[row, nFeatures]];
+        }
+      }
+      alglib.nearestneighbor.kdtreebuild(inputMatrix, nRows, inputMatrix.GetLength(1) - 1, 1, 2, kdTree);
     }
 
@@ -140,4 +164,5 @@
 
     public IEnumerable<double> GetEstimatedClassValues(Dataset dataset, IEnumerable<int> rows) {
+      if (classValues == null) throw new InvalidOperationException("No class values are defined.");
       double[,] inputData = AlglibUtil.PrepareInputMatrix(dataset, allowedInputVariables, rows);
 
@@ -177,5 +202,5 @@
 
     public INearestNeighbourRegressionSolution CreateRegressionSolution(IRegressionProblemData problemData) {
-      return new NearestNeighbourRegressionSolution(problemData, this);
+      return new NearestNeighbourRegressionSolution(new RegressionProblemData(problemData), this);
     }
     IRegressionSolution IRegressionModel.CreateRegressionSolution(IRegressionProblemData problemData) {
@@ -183,5 +208,5 @@
     }
     public INearestNeighbourClassificationSolution CreateClassificationSolution(IClassificationProblemData problemData) {
-      return new NearestNeighbourClassificationSolution(problemData, this);
+      return new NearestNeighbourClassificationSolution(new ClassificationProblemData(problemData), this);
     }
     IClassificationSolution IClassificationModel.CreateClassificationSolution(IClassificationProblemData problemData) {
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/NearestNeighbour/NearestNeighbourRegression.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/NearestNeighbour/NearestNeighbourRegression.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/NearestNeighbour/NearestNeighbourRegression.cs	(revision 8585)
@@ -21,16 +21,11 @@
 
 using System;
-using System.Collections.Generic;
-using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
-using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
 using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.Problems.DataAnalysis;
-using HeuristicLab.Problems.DataAnalysis.Symbolic;
-using HeuristicLab.Problems.DataAnalysis.Symbolic.Regression;
-using HeuristicLab.Parameters;
 
 namespace HeuristicLab.Algorithms.DataAnalysis {
@@ -84,19 +79,14 @@
 
     public static IRegressionSolution CreateNearestNeighbourRegressionSolution(IRegressionProblemData problemData, int k) {
-      Dataset dataset = problemData.Dataset;
-      string targetVariable = problemData.TargetVariable;
-      IEnumerable<string> allowedInputVariables = problemData.AllowedInputVariables;
-      IEnumerable<int> rows = problemData.TrainingIndices;
-      double[,] inputMatrix = AlglibUtil.PrepareInputMatrix(dataset, allowedInputVariables.Concat(new string[] { targetVariable }), rows);
-      if (inputMatrix.Cast<double>().Any(x => double.IsNaN(x) || double.IsInfinity(x)))
-        throw new NotSupportedException("Nearest neighbour regression does not support NaN or infinity values in the input dataset.");
+      var clonedProblemData = (IRegressionProblemData)problemData.Clone();
+      return new NearestNeighbourRegressionSolution(clonedProblemData, Train(problemData, k));
+    }
 
-      alglib.nearestneighbor.kdtree kdtree = new alglib.nearestneighbor.kdtree();
-
-      int nRows = inputMatrix.GetLength(0);
-
-      alglib.nearestneighbor.kdtreebuild(inputMatrix, nRows, inputMatrix.GetLength(1) - 1, 1, 2, kdtree);
-
-      return new NearestNeighbourRegressionSolution((IRegressionProblemData)problemData.Clone(), new NearestNeighbourModel(kdtree, k, targetVariable, allowedInputVariables));
+    public static INearestNeighbourModel Train(IRegressionProblemData problemData, int k) {
+      return new NearestNeighbourModel(problemData.Dataset,
+        problemData.TrainingIndices,
+        k,
+        problemData.TargetVariable,
+        problemData.AllowedInputVariables);
     }
     #endregion
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/NeuralNetwork/NeuralNetworkEnsembleModel.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/NeuralNetwork/NeuralNetworkEnsembleModel.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/NeuralNetwork/NeuralNetworkEnsembleModel.cs	(revision 8585)
@@ -130,5 +130,5 @@
 
     public INeuralNetworkEnsembleRegressionSolution CreateRegressionSolution(IRegressionProblemData problemData) {
-      return new NeuralNetworkEnsembleRegressionSolution(problemData, this);
+      return new NeuralNetworkEnsembleRegressionSolution(new RegressionEnsembleProblemData(problemData), this);
     }
     IRegressionSolution IRegressionModel.CreateRegressionSolution(IRegressionProblemData problemData) {
@@ -136,5 +136,5 @@
     }
     public INeuralNetworkEnsembleClassificationSolution CreateClassificationSolution(IClassificationProblemData problemData) {
-      return new NeuralNetworkEnsembleClassificationSolution(problemData, this);
+      return new NeuralNetworkEnsembleClassificationSolution(new ClassificationEnsembleProblemData(problemData), this);
     }
     IClassificationSolution IClassificationModel.CreateClassificationSolution(IClassificationProblemData problemData) {
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/NeuralNetwork/NeuralNetworkModel.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/NeuralNetwork/NeuralNetworkModel.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/NeuralNetwork/NeuralNetworkModel.cs	(revision 8585)
@@ -138,5 +138,5 @@
 
     public INeuralNetworkRegressionSolution CreateRegressionSolution(IRegressionProblemData problemData) {
-      return new NeuralNetworkRegressionSolution(problemData, this);
+      return new NeuralNetworkRegressionSolution(new RegressionProblemData(problemData), this);
     }
     IRegressionSolution IRegressionModel.CreateRegressionSolution(IRegressionProblemData problemData) {
@@ -144,5 +144,5 @@
     }
     public INeuralNetworkClassificationSolution CreateClassificationSolution(IClassificationProblemData problemData) {
-      return new NeuralNetworkClassificationSolution(problemData, this);
+      return new NeuralNetworkClassificationSolution(new ClassificationProblemData(problemData), this);
     }
     IClassificationSolution IClassificationModel.CreateClassificationSolution(IClassificationProblemData problemData) {
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Plugin.cs.frame
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Plugin.cs.frame	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/Plugin.cs.frame	(revision 8585)
@@ -28,5 +28,5 @@
   [Plugin("HeuristicLab.Algorithms.DataAnalysis", "Provides wrappers for data analysis algorithms implemented in external libraries (linear regression, linear discriminant analysis, k-means clustering, support vector classification and regression)", "3.4.3.$WCREV$")]
   [PluginFile("HeuristicLab.Algorithms.DataAnalysis-3.4.dll", PluginFileType.Assembly)]
-  [PluginDependency("HeuristicLab.ALGLIB", "3.5.0")]
+  [PluginDependency("HeuristicLab.ALGLIB", "3.6.0")]
   [PluginDependency("HeuristicLab.Algorithms.GradientDescent", "3.3")]
   [PluginDependency("HeuristicLab.Analysis", "3.3")]
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/RandomForest/RandomForestModel.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/RandomForest/RandomForestModel.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/RandomForest/RandomForestModel.cs	(revision 8585)
@@ -132,5 +132,5 @@
 
     public IRandomForestRegressionSolution CreateRegressionSolution(IRegressionProblemData problemData) {
-      return new RandomForestRegressionSolution(problemData, this);
+      return new RandomForestRegressionSolution(new RegressionProblemData(problemData), this);
     }
     IRegressionSolution IRegressionModel.CreateRegressionSolution(IRegressionProblemData problemData) {
@@ -138,5 +138,5 @@
     }
     public IRandomForestClassificationSolution CreateClassificationSolution(IClassificationProblemData problemData) {
-      return new RandomForestClassificationSolution(problemData, this);
+      return new RandomForestClassificationSolution(new ClassificationProblemData(problemData), this);
     }
     IClassificationSolution IClassificationModel.CreateClassificationSolution(IClassificationProblemData problemData) {
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/SupportVectorMachine/SupportVectorMachineModel.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/SupportVectorMachine/SupportVectorMachineModel.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.DataAnalysis/3.4/SupportVectorMachine/SupportVectorMachineModel.cs	(revision 8585)
@@ -124,5 +124,5 @@
     }
     public SupportVectorRegressionSolution CreateRegressionSolution(IRegressionProblemData problemData) {
-      return new SupportVectorRegressionSolution(this, problemData);
+      return new SupportVectorRegressionSolution(this, new RegressionProblemData(problemData));
     }
     IRegressionSolution IRegressionModel.CreateRegressionSolution(IRegressionProblemData problemData) {
@@ -153,5 +153,5 @@
 
     public SupportVectorClassificationSolution CreateClassificationSolution(IClassificationProblemData problemData) {
-      return new SupportVectorClassificationSolution(this, problemData);
+      return new SupportVectorClassificationSolution(this, new ClassificationProblemData(problemData));
     }
     IClassificationSolution IClassificationModel.CreateClassificationSolution(IClassificationProblemData problemData) {
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.GradientDescent/3.3/LbfgsInitializer.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.GradientDescent/3.3/LbfgsInitializer.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.GradientDescent/3.3/LbfgsInitializer.cs	(revision 8585)
@@ -87,9 +87,9 @@
       alglib.minlbfgs.minlbfgsstate state = new alglib.minlbfgs.minlbfgsstate();
       if (ApproximateGradients.Value) {
-        alglib.minlbfgs.minlbfgscreatef(n, Math.Min(n, 7), initialPoint, 1E-5, state);
+        alglib.minlbfgs.minlbfgscreatef(n, Math.Min(n, 10), initialPoint, 1E-5, state);
       } else {
-        alglib.minlbfgs.minlbfgscreate(n, Math.Min(n, 7), initialPoint, state);
+        alglib.minlbfgs.minlbfgscreate(n, Math.Min(n, 10), initialPoint, state);
       }
-      alglib.minlbfgs.minlbfgssetcond(state, 0, 0, 0, Iterations.Value);
+      alglib.minlbfgs.minlbfgssetcond(state, 0.0, 0, 0, Iterations.Value);
       alglib.minlbfgs.minlbfgssetxrep(state, true);
 
Index: /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.GradientDescent/3.3/Plugin.cs.frame
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.GradientDescent/3.3/Plugin.cs.frame	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Algorithms.GradientDescent/3.3/Plugin.cs.frame	(revision 8585)
@@ -25,5 +25,5 @@
   [Plugin("HeuristicLab.Algorithms.GradientDescent", "3.3.0.$WCREV$")]
   [PluginFile("HeuristicLab.Algorithms.GradientDescent-3.3.dll", PluginFileType.Assembly)]
-  [PluginDependency("HeuristicLab.ALGLIB", "3.5.0")]
+  [PluginDependency("HeuristicLab.ALGLIB", "3.6.0")]
   [PluginDependency("HeuristicLab.Analysis", "3.3.0")]
   [PluginDependency("HeuristicLab.Collections", "3.3")]
Index: /branches/HeuristicLab.Mono/HeuristicLab.Analysis/3.3/HeuristicLab.Analysis-3.3.csproj
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Analysis/3.3/HeuristicLab.Analysis-3.3.csproj	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Analysis/3.3/HeuristicLab.Analysis-3.3.csproj	(revision 8585)
@@ -143,4 +143,5 @@
     <Compile Include="Plugin.cs" />
     <Compile Include="PopulationDiversityAnalysis\PopulationDiversityAnalyzer.cs" />
+    <Compile Include="PopulationDiversityAnalysis\SingleObjectivePopulationDiversityAnalyzer.cs" />
     <Compile Include="QualityAnalysis\BestAverageWorstQualityAnalyzer.cs" />
     <Compile Include="QualityAnalysis\BestAverageWorstQualityCalculator.cs" />
Index: /branches/HeuristicLab.Mono/HeuristicLab.Analysis/3.3/Plugin.cs.frame
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Analysis/3.3/Plugin.cs.frame	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Analysis/3.3/Plugin.cs.frame	(revision 8585)
@@ -28,5 +28,5 @@
   [Plugin("HeuristicLab.Analysis", "3.3.7.$WCREV$")]
   [PluginFile("HeuristicLab.Analysis-3.3.dll", PluginFileType.Assembly)]
-  [PluginDependency("HeuristicLab.ALGLIB", "3.5")]
+  [PluginDependency("HeuristicLab.ALGLIB", "3.6.0")]
   [PluginDependency("HeuristicLab.Collections", "3.3")]
   [PluginDependency("HeuristicLab.Common", "3.3")]
Index: /branches/HeuristicLab.Mono/HeuristicLab.Analysis/3.3/PopulationDiversityAnalysis/SingleObjectivePopulationDiversityAnalyzer.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Analysis/3.3/PopulationDiversityAnalysis/SingleObjectivePopulationDiversityAnalyzer.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Analysis/3.3/PopulationDiversityAnalysis/SingleObjectivePopulationDiversityAnalyzer.cs	(revision 8585)
@@ -0,0 +1,256 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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 System;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis {
+  /// <summary>
+  /// An operator for analyzing the solution diversity in a population.
+  /// </summary>
+  [Item("SingleObjectivePopulationDiversityAnalyzer", "An operator for analyzing the solution diversity in a population.")]
+  [StorableClass]
+  public class SingleObjectivePopulationDiversityAnalyzer : SingleSuccessorOperator, IAnalyzer, ISimilarityBasedOperator {
+    #region ISimilarityBasedOperator Members
+    public ISolutionSimilarityCalculator SimilarityCalculator { get; set; }
+    #endregion
+
+    public virtual bool EnabledByDefault {
+      get { return false; }
+    }
+
+    public ScopeParameter CurrentScopeParameter {
+      get { return (ScopeParameter)Parameters["CurrentScope"]; }
+    }
+    public LookupParameter<BoolValue> MaximizationParameter {
+      get { return (LookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> QualityParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public ValueLookupParameter<ResultCollection> ResultsParameter {
+      get { return (ValueLookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+    public ValueParameter<BoolValue> StoreHistoryParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["StoreHistory"]; }
+    }
+    public ValueParameter<IntValue> UpdateIntervalParameter {
+      get { return (ValueParameter<IntValue>)Parameters["UpdateInterval"]; }
+    }
+    public LookupParameter<IntValue> UpdateCounterParameter {
+      get { return (LookupParameter<IntValue>)Parameters["UpdateCounter"]; }
+    }
+
+    [StorableConstructor]
+    protected SingleObjectivePopulationDiversityAnalyzer(bool deserializing) : base(deserializing) { }
+    protected SingleObjectivePopulationDiversityAnalyzer(SingleObjectivePopulationDiversityAnalyzer original, Cloner cloner) : base(original, cloner) { }
+    public SingleObjectivePopulationDiversityAnalyzer()
+      : base() {
+      Parameters.Add(new ScopeParameter("CurrentScope", "The current scope that contains the solutions which should be analyzed."));
+      Parameters.Add(new LookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem."));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", "The qualities of the solutions which should be analyzed."));
+      Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The result collection where the population diversity analysis results should be stored."));
+      Parameters.Add(new ValueParameter<BoolValue>("StoreHistory", "True if the history of the population diversity analysis should be stored.", new BoolValue(false)));
+      Parameters.Add(new ValueParameter<IntValue>("UpdateInterval", "The interval in which the population diversity analysis should be applied.", new IntValue(1)));
+      Parameters.Add(new LookupParameter<IntValue>("UpdateCounter", "The value which counts how many times the operator was called since the last update.", "PopulationDiversityAnalyzerUpdateCounter"));
+
+      MaximizationParameter.Hidden = true;
+      QualityParameter.Hidden = true;
+      ResultsParameter.Hidden = true;
+      UpdateCounterParameter.Hidden = true;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SingleObjectivePopulationDiversityAnalyzer(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      int updateInterval = UpdateIntervalParameter.Value.Value;
+      IntValue updateCounter = UpdateCounterParameter.ActualValue;
+      // if counter does not yet exist then initialize it with update interval
+      // to make sure the solutions are analyzed on the first application of this operator
+      if (updateCounter == null) {
+        updateCounter = new IntValue(updateInterval);
+        UpdateCounterParameter.ActualValue = updateCounter;
+      } else updateCounter.Value++;
+
+      //analyze solutions only every 'updateInterval' times
+      if (updateCounter.Value == updateInterval) {
+        updateCounter.Value = 0;
+
+        bool max = MaximizationParameter.ActualValue.Value;
+        ItemArray<DoubleValue> qualities = QualityParameter.ActualValue;
+        bool storeHistory = StoreHistoryParameter.Value.Value;
+        int count = CurrentScopeParameter.ActualValue.SubScopes.Count;
+
+        if (count > 1) {
+          // calculate solution similarities
+          var similarityMatrix = SimilarityCalculator.CalculateSolutionCrowdSimilarity(CurrentScopeParameter.ActualValue);
+
+          // sort similarities by quality
+          double[][] sortedSimilarityMatrix = null;
+          if (max)
+            sortedSimilarityMatrix = similarityMatrix
+              .Select((x, index) => new { Solutions = x, Quality = qualities[index] })
+              .OrderByDescending(x => x.Quality)
+              .Select(x => x.Solutions)
+              .ToArray();
+          else
+            sortedSimilarityMatrix = similarityMatrix
+              .Select((x, index) => new { Solutions = x, Quality = qualities[index] })
+              .OrderBy(x => x.Quality)
+              .Select(x => x.Solutions)
+              .ToArray();
+
+          double[,] similarities = new double[similarityMatrix.Length, similarityMatrix[0].Length];
+          for (int i = 0; i < similarityMatrix.Length; i++)
+            for (int j = 0; j < similarityMatrix[0].Length; j++)
+              similarities[i, j] = similarityMatrix[i][j];
+
+          // calculate minimum, average and maximum similarities
+          double similarity;
+          double[] minSimilarities = new double[count];
+          double[] avgSimilarities = new double[count];
+          double[] maxSimilarities = new double[count];
+          for (int i = 0; i < count; i++) {
+            minSimilarities[i] = 1;
+            avgSimilarities[i] = 0;
+            maxSimilarities[i] = 0;
+            for (int j = 0; j < count; j++) {
+              if (i != j) {
+                similarity = similarities[i, j];
+
+                if ((similarity < 0) || (similarity > 1))
+                  throw new InvalidOperationException("Solution similarities have to be in the interval [0;1].");
+
+                if (minSimilarities[i] > similarity) minSimilarities[i] = similarity;
+                avgSimilarities[i] += similarity;
+                if (maxSimilarities[i] < similarity) maxSimilarities[i] = similarity;
+              }
+            }
+            avgSimilarities[i] = avgSimilarities[i] / (count - 1);
+          }
+          double avgMinSimilarity = minSimilarities.Average();
+          double avgAvgSimilarity = avgSimilarities.Average();
+          double avgMaxSimilarity = maxSimilarities.Average();
+
+          // fetch results collection
+          ResultCollection results;
+          if (!ResultsParameter.ActualValue.ContainsKey(Name + " Results")) {
+            results = new ResultCollection();
+            ResultsParameter.ActualValue.Add(new Result(Name + " Results", results));
+          } else {
+            results = (ResultCollection)ResultsParameter.ActualValue[Name + " Results"].Value;
+          }
+
+          // store similarities
+          HeatMap similaritiesHeatMap = new HeatMap(similarities, "Solution Similarities", 0.0, 1.0);
+          if (!results.ContainsKey("Solution Similarities"))
+            results.Add(new Result("Solution Similarities", similaritiesHeatMap));
+          else
+            results["Solution Similarities"].Value = similaritiesHeatMap;
+
+          // store similarities history
+          if (storeHistory) {
+            if (!results.ContainsKey("Solution Similarities History")) {
+              HeatMapHistory history = new HeatMapHistory();
+              history.Add(similaritiesHeatMap);
+              results.Add(new Result("Solution Similarities History", history));
+            } else {
+              ((HeatMapHistory)results["Solution Similarities History"].Value).Add(similaritiesHeatMap);
+            }
+          }
+
+          // store average minimum, average and maximum similarity
+          if (!results.ContainsKey("Average Minimum Solution Similarity"))
+            results.Add(new Result("Average Minimum Solution Similarity", new DoubleValue(avgMinSimilarity)));
+          else
+            ((DoubleValue)results["Average Minimum Solution Similarity"].Value).Value = avgMinSimilarity;
+
+          if (!results.ContainsKey("Average Average Solution Similarity"))
+            results.Add(new Result("Average Average Solution Similarity", new DoubleValue(avgAvgSimilarity)));
+          else
+            ((DoubleValue)results["Average Average Solution Similarity"].Value).Value = avgAvgSimilarity;
+
+          if (!results.ContainsKey("Average Maximum Solution Similarity"))
+            results.Add(new Result("Average Maximum Solution Similarity", new DoubleValue(avgMaxSimilarity)));
+          else
+            ((DoubleValue)results["Average Maximum Solution Similarity"].Value).Value = avgMaxSimilarity;
+
+          // store average minimum, average and maximum solution similarity data table
+          DataTable minAvgMaxSimilarityDataTable;
+          if (!results.ContainsKey("Average Minimum/Average/Maximum Solution Similarity")) {
+            minAvgMaxSimilarityDataTable = new DataTable("Average Minimum/Average/Maximum Solution Similarity");
+            minAvgMaxSimilarityDataTable.VisualProperties.XAxisTitle = "Iteration";
+            minAvgMaxSimilarityDataTable.VisualProperties.YAxisTitle = "Solution Similarity";
+            minAvgMaxSimilarityDataTable.Rows.Add(new DataRow("Average Minimum Solution Similarity", null));
+            minAvgMaxSimilarityDataTable.Rows["Average Minimum Solution Similarity"].VisualProperties.StartIndexZero = true;
+            minAvgMaxSimilarityDataTable.Rows.Add(new DataRow("Average Average Solution Similarity", null));
+            minAvgMaxSimilarityDataTable.Rows["Average Average Solution Similarity"].VisualProperties.StartIndexZero = true;
+            minAvgMaxSimilarityDataTable.Rows.Add(new DataRow("Average Maximum Solution Similarity", null));
+            minAvgMaxSimilarityDataTable.Rows["Average Maximum Solution Similarity"].VisualProperties.StartIndexZero = true;
+            results.Add(new Result("Average Minimum/Average/Maximum Solution Similarity", minAvgMaxSimilarityDataTable));
+          } else {
+            minAvgMaxSimilarityDataTable = (DataTable)results["Average Minimum/Average/Maximum Solution Similarity"].Value;
+          }
+          minAvgMaxSimilarityDataTable.Rows["Average Minimum Solution Similarity"].Values.Add(avgMinSimilarity);
+          minAvgMaxSimilarityDataTable.Rows["Average Average Solution Similarity"].Values.Add(avgAvgSimilarity);
+          minAvgMaxSimilarityDataTable.Rows["Average Maximum Solution Similarity"].Values.Add(avgMaxSimilarity);
+
+          // store minimum, average, maximum similarities data table
+          DataTable minAvgMaxSimilaritiesDataTable = new DataTable("Minimum/Average/Maximum Solution Similarities");
+          minAvgMaxSimilaritiesDataTable.VisualProperties.XAxisTitle = "Solution Index";
+          minAvgMaxSimilaritiesDataTable.VisualProperties.YAxisTitle = "Solution Similarity";
+          minAvgMaxSimilaritiesDataTable.Rows.Add(new DataRow("Minimum Solution Similarity", null, minSimilarities));
+          minAvgMaxSimilaritiesDataTable.Rows["Minimum Solution Similarity"].VisualProperties.ChartType = DataRowVisualProperties.DataRowChartType.Points;
+          minAvgMaxSimilaritiesDataTable.Rows.Add(new DataRow("Average Solution Similarity", null, avgSimilarities));
+          minAvgMaxSimilaritiesDataTable.Rows["Average Solution Similarity"].VisualProperties.ChartType = DataRowVisualProperties.DataRowChartType.Points;
+          minAvgMaxSimilaritiesDataTable.Rows.Add(new DataRow("Maximum Solution Similarity", null, maxSimilarities));
+          minAvgMaxSimilaritiesDataTable.Rows["Maximum Solution Similarity"].VisualProperties.ChartType = DataRowVisualProperties.DataRowChartType.Points;
+          if (!results.ContainsKey("Minimum/Average/Maximum Solution Similarities")) {
+            results.Add(new Result("Minimum/Average/Maximum Solution Similarities", minAvgMaxSimilaritiesDataTable));
+          } else {
+            results["Minimum/Average/Maximum Solution Similarities"].Value = minAvgMaxSimilaritiesDataTable;
+          }
+
+          // store minimum, average, maximum similarities history
+          if (storeHistory) {
+            if (!results.ContainsKey("Minimum/Average/Maximum Solution Similarities History")) {
+              DataTableHistory history = new DataTableHistory();
+              history.Add(minAvgMaxSimilaritiesDataTable);
+              results.Add(new Result("Minimum/Average/Maximum Solution Similarities History", history));
+            } else {
+              ((DataTableHistory)results["Minimum/Average/Maximum Solution Similarities History"].Value).Add(minAvgMaxSimilaritiesDataTable);
+            }
+          }
+        }
+      }
+      return base.Apply();
+    }
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Common/3.3/EnumerableStatisticExtensions.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Common/3.3/EnumerableStatisticExtensions.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Common/3.3/EnumerableStatisticExtensions.cs	(revision 8585)
@@ -45,4 +45,22 @@
         return (valuesArr[(n / 2) - 1] + valuesArr[n / 2]) / 2.0;
       }
+    }
+
+    /// <summary>
+    /// Calculates the range (max - min) of the enumeration.
+    /// </summary>
+    /// <param name="values"></param>
+    /// <returns></returns>
+    public static double Range(this IEnumerable<double> values) {
+      double min = double.PositiveInfinity;
+      double max = double.NegativeInfinity;
+      int i = 0;
+      foreach (var e in values) {
+        if (min > e) min = e;
+        if (max < e) max = e;
+        i++;
+      }
+      if (i <= 2) throw new ArgumentException("The enumerable must contain at least two elements", "values");
+      return max - min;
     }
 
@@ -105,4 +123,5 @@
 
     public static IEnumerable<double> LimitToRange(this IEnumerable<double> values, double min, double max) {
+      if (min > max) throw new ArgumentException(string.Format("Minimum {0} is larger than maximum {1}.", min, max));
       foreach (var x in values) {
         if (double.IsNaN(x)) yield return (max + min) / 2.0;
Index: /branches/HeuristicLab.Mono/HeuristicLab.Data.Views/3.3/StringConvertibleValueView.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Data.Views/3.3/StringConvertibleValueView.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Data.Views/3.3/StringConvertibleValueView.cs	(revision 8585)
@@ -95,4 +95,5 @@
     }
     private void valueTextBox_Validating(object sender, CancelEventArgs e) {
+      if (ReadOnly) return;
       string errorMessage;
       if (!Content.Validate(valueTextBox.Text, out errorMessage)) {
@@ -103,4 +104,5 @@
     }
     private void valueTextBox_Validated(object sender, EventArgs e) {
+      if (ReadOnly) return;
       if (!Content.ReadOnly) Content.SetValue(valueTextBox.Text);
       errorProvider.SetError(valueTextBox, string.Empty);
Index: /branches/HeuristicLab.Mono/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/SymbolView.Designer.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/SymbolView.Designer.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/SymbolView.Designer.cs	(revision 8585)
@@ -175,5 +175,5 @@
     protected System.Windows.Forms.Label initialFrequencyLabel;
     protected System.Windows.Forms.TextBox initialFrequencyTextBox;
-    private System.Windows.Forms.CheckBox enabledCheckBox;
+    protected System.Windows.Forms.CheckBox enabledCheckBox;
     protected System.Windows.Forms.Label minimumArityLabel;
     protected System.Windows.Forms.Label maximumArityLabel;
Index: /branches/HeuristicLab.Mono/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Analyzers/SymbolicExpressionTreeLengthAnalyzer.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Analyzers/SymbolicExpressionTreeLengthAnalyzer.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Analyzers/SymbolicExpressionTreeLengthAnalyzer.cs	(revision 8585)
@@ -88,5 +88,5 @@
 
     [StorableConstructor]
-    private SymbolicExpressionTreeLengthAnalyzer(bool deserializing) : base() { }
+    private SymbolicExpressionTreeLengthAnalyzer(bool deserializing) : base(deserializing) { }
     private SymbolicExpressionTreeLengthAnalyzer(SymbolicExpressionTreeLengthAnalyzer original, Cloner cloner)
       : base(original, cloner) {
Index: /branches/HeuristicLab.Mono/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionGrammar.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionGrammar.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionGrammar.cs	(revision 8585)
@@ -181,6 +181,5 @@
 
     #region IStatefulItem methods
-    void IStatefulItem.InitializeState()
-    {
+    void IStatefulItem.InitializeState() {
       ReadOnly = false;
     }
@@ -245,5 +244,5 @@
         var groupSymbol = s as GroupSymbol;
         if (groupSymbol != null) RegisterGroupSymbolEvents(groupSymbol);
-        else symbol.Changed += new EventHandler(Symbol_Changed);
+        else s.Changed += new EventHandler(Symbol_Changed);
       }
     }
@@ -255,5 +254,5 @@
         var groupSymbol = s as GroupSymbol;
         if (groupSymbol != null) DeregisterGroupSymbolEvents(groupSymbol);
-        else symbol.Changed -= new EventHandler(Symbol_Changed);
+        else s.Changed -= new EventHandler(Symbol_Changed);
       }
     }
Index: /branches/HeuristicLab.Mono/HeuristicLab.Optimizer/3.3/CreateExperimentDialog.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Optimizer/3.3/CreateExperimentDialog.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Optimizer/3.3/CreateExperimentDialog.cs	(revision 8585)
@@ -473,7 +473,8 @@
     private void AddOptimizer(IOptimizer optimizer, Experiment experiment) {
       if (createBatchRun) {
-        var batchRun = new BatchRun();
-        batchRun.Repetitions = repetitions;
-        batchRun.Optimizer = optimizer;
+        var batchRun = new BatchRun(repetitions.ToString() + "x " + optimizer.Name) {
+          Repetitions = repetitions,
+          Optimizer = optimizer
+        };
         experiment.Optimizers.Add(batchRun);
       } else {
@@ -708,5 +709,6 @@
 
       int counter = 0, totalVariations = GetNumberOfVariations();
-      if (instances.Count == 0) {
+      int totalInstances = instances.Values.SelectMany(x => x).Count();
+      if (totalInstances == 0) {
         try {
           AddParameterVariations(Optimizer, localExperiment, ref counter, totalVariations);
@@ -729,5 +731,11 @@
             if (!failed) {
               try {
-                AddParameterVariations(algorithm, localExperiment, ref counter, totalVariations);
+                if (totalInstances > 1 && totalVariations / totalInstances > 1) {
+                  var experiment = new Experiment(descriptor.Name);
+                  AddParameterVariations(algorithm, experiment, ref counter, totalVariations);
+                  localExperiment.Optimizers.Add(experiment);
+                } else {
+                  AddParameterVariations(algorithm, localExperiment, ref counter, totalVariations);
+                }
               } catch (OperationCanceledException) {
                 e.Cancel = true;
Index: /branches/HeuristicLab.Mono/HeuristicLab.PluginInfrastructure/3.3/ArgumentHandling/ArgumentHandling.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.PluginInfrastructure/3.3/ArgumentHandling/ArgumentHandling.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.PluginInfrastructure/3.3/ArgumentHandling/ArgumentHandling.cs	(revision 8585)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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 System.Collections.Generic;
+using System.Linq;
+using System.Text.RegularExpressions;
+
+namespace HeuristicLab.PluginInfrastructure {
+  public static class ArgumentHandling {
+    public const string StartToken = "start";
+
+    public static IArgument[] GetArguments(string[] args) {
+      var arguments = new HashSet<IArgument>();
+      foreach (var entry in args) {
+        var argument = ParseArgument(entry);
+        if (argument != null && argument.Valid) arguments.Add(argument);
+      }
+      return arguments.ToArray();
+    }
+
+    private static Argument ParseArgument(string entry) {
+      var regex = new Regex("^/[a-z]+(:[A-Za-z0-9 ]+)?$");
+      if (!regex.IsMatch(entry)) return null;
+      entry = entry.Remove(0, 1);
+      var parts = entry.Split(':');
+      string key = parts[0];
+      string value = parts.Length == 2 ? parts[1].Trim() : string.Empty;
+      switch (key) {
+        case StartToken: return new StartArgument(value);
+        default: return null;
+      }
+    }
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.PluginInfrastructure/3.3/ArgumentHandling/Arguments.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.PluginInfrastructure/3.3/ArgumentHandling/Arguments.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.PluginInfrastructure/3.3/ArgumentHandling/Arguments.cs	(revision 8585)
@@ -0,0 +1,48 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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
+
+namespace HeuristicLab.PluginInfrastructure {
+  public abstract class Argument : IArgument {
+    public string Value { get; private set; }
+    public abstract bool Valid { get; }
+
+    protected Argument(string value) {
+      this.Value = value;
+    }
+
+    public override bool Equals(object obj) {
+      if (obj == null || this.GetType() != obj.GetType()) return false;
+      return this.Value == ((Argument)obj).Value;
+    }
+
+    public override int GetHashCode() {
+      return GetType().GetHashCode();
+    }
+  }
+
+  public class StartArgument : Argument {
+    public override bool Valid {
+      get { return !string.IsNullOrEmpty(Value); }
+    }
+
+    public StartArgument(string value) : base(value) { }
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.PluginInfrastructure/3.3/ArgumentHandling/IArgument.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.PluginInfrastructure/3.3/ArgumentHandling/IArgument.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.PluginInfrastructure/3.3/ArgumentHandling/IArgument.cs	(revision 8585)
@@ -0,0 +1,27 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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
+
+namespace HeuristicLab.PluginInfrastructure {
+  public interface IArgument {
+    string Value { get; }
+    bool Valid { get; }
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.PluginInfrastructure/3.3/HeuristicLab.PluginInfrastructure-3.3.csproj
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.PluginInfrastructure/3.3/HeuristicLab.PluginInfrastructure-3.3.csproj	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.PluginInfrastructure/3.3/HeuristicLab.PluginInfrastructure-3.3.csproj	(revision 8585)
@@ -215,4 +215,7 @@
       <DependentUpon>PluginView.cs</DependentUpon>
     </Compile>
+    <Compile Include="ArgumentHandling\ArgumentHandling.cs" />
+    <Compile Include="ArgumentHandling\Arguments.cs" />
+    <Compile Include="ArgumentHandling\IArgument.cs" />
     <Compile Include="Attributes\ApplicationAttribute.cs" />
     <Compile Include="Attributes\ContactInformationAttribute.cs" />
@@ -261,4 +264,5 @@
     <Compile Include="Main.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="TypeExtensions.cs" />
     <None Include="Advanced\DeploymentService\GenerateServiceClients.cmd" />
     <None Include="app.config">
Index: /branches/HeuristicLab.Mono/HeuristicLab.PluginInfrastructure/3.3/LightweightApplicationManager.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.PluginInfrastructure/3.3/LightweightApplicationManager.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.PluginInfrastructure/3.3/LightweightApplicationManager.cs	(revision 8585)
@@ -75,5 +75,6 @@
       foreach (Type t in GetTypes(type)) {
         object instance = null;
-        try { instance = Activator.CreateInstance(t); } catch { }
+        try { instance = Activator.CreateInstance(t); }
+        catch { }
         if (instance != null) instances.Add(instance);
       }
@@ -127,59 +128,21 @@
         var assemblyTypes = assembly.GetTypes();
 
-        var buildTypes = from t in assembly.GetTypes()
-                         where CheckTypeCompatibility(type, t)
-                         where !IsNonDiscoverableType(t)
-                         where onlyInstantiable == false ||
-                               (!t.IsAbstract && !t.IsInterface && !t.HasElementType)
-                         select BuildType(t, type);
+        var matchingTypes = from assemblyType in assembly.GetTypes()
+                            let t = assemblyType.BuildType(type)
+                            where t != null
+                            where t.IsSubTypeOf(type)
+                            where !t.IsNonDiscoverableType()
+                            where onlyInstantiable == false || (!t.IsAbstract && !t.IsInterface && !t.HasElementType)
+                            where includeGenericTypeDefinitions || !t.IsGenericTypeDefinition
+                            select t;
 
-        return from t in buildTypes
-               where includeGenericTypeDefinitions || !t.IsGenericTypeDefinition
-               select t;
-      } catch (TypeLoadException) {
-        return Enumerable.Empty<Type>();
-      } catch (ReflectionTypeLoadException) {
+        return matchingTypes;
+      }
+      catch (TypeLoadException) {
         return Enumerable.Empty<Type>();
       }
-    }
-
-    private static bool IsNonDiscoverableType(Type t) {
-      return t.GetCustomAttributes(typeof(NonDiscoverableTypeAttribute), false).Any();
-    }
-
-    private static bool CheckTypeCompatibility(Type type, Type other) {
-      if (type.IsAssignableFrom(other))
-        return true;
-      if (type.IsGenericType && other.IsGenericType) {
-        var otherGenericArguments = other.GetGenericArguments();
-        var typeGenericArguments = type.GetGenericArguments();
-
-        //check type arguments count
-        if (otherGenericArguments.Length != typeGenericArguments.Length)
-          return false;
-
-        //check type arguments & constraints
-        int i = 0;
-        foreach (var genericArgument in typeGenericArguments) {
-          if (otherGenericArguments[i].IsGenericParameter) {
-            foreach (var constraint in otherGenericArguments[i].GetGenericParameterConstraints())
-              if (!constraint.IsAssignableFrom(genericArgument)) return false;
-          } else if (genericArgument != otherGenericArguments[i]) return false;
-          i++;
-        }
-        //check types
-        try {
-          var otherGenericTypeDefinition = other.GetGenericTypeDefinition();
-          if (type.IsAssignableFrom(otherGenericTypeDefinition.MakeGenericType(typeGenericArguments)))
-            return true;
-        } catch (Exception) { }
+      catch (ReflectionTypeLoadException) {
+        return Enumerable.Empty<Type>();
       }
-      return false;
-    }
-    private static Type BuildType(Type type, Type protoType) {
-      if (type.IsGenericType && protoType.IsGenericType)
-        return type.GetGenericTypeDefinition().MakeGenericType(protoType.GetGenericArguments());
-      else
-        return type;
     }
 
Index: /branches/HeuristicLab.Mono/HeuristicLab.PluginInfrastructure/3.3/Main.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.PluginInfrastructure/3.3/Main.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.PluginInfrastructure/3.3/Main.cs	(revision 8585)
@@ -42,5 +42,5 @@
           Application.EnableVisualStyles();
           Application.SetCompatibleTextRenderingDefault(false);
-          Application.Run(new StarterForm());
+          Application.Run(new StarterForm(args));
         }
         catch (Exception ex) {
Index: /branches/HeuristicLab.Mono/HeuristicLab.PluginInfrastructure/3.3/SandboxApplicationManager.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.PluginInfrastructure/3.3/SandboxApplicationManager.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.PluginInfrastructure/3.3/SandboxApplicationManager.cs	(revision 8585)
@@ -261,56 +261,14 @@
     /// <returns>Enumerable of the discovered types.</returns>
     private static IEnumerable<Type> GetTypes(Type type, Assembly assembly, bool onlyInstantiable, bool includeGenericTypeDefinitions) {
-      var buildTypes = from t in assembly.GetTypes()
-                       where CheckTypeCompatibility(type, t)
-                       where !IsNonDiscoverableType(t)
-                       where onlyInstantiable == false ||
-                             (!t.IsAbstract && !t.IsInterface && !t.HasElementType)
-                       select BuildType(t, type);
-
-      return from t in buildTypes
-             where includeGenericTypeDefinitions || !t.IsGenericTypeDefinition
-             select t;
-    }
-
-
-    private static bool IsNonDiscoverableType(Type t) {
-      return t.GetCustomAttributes(typeof(NonDiscoverableTypeAttribute), false).Any();
-    }
-
-    private static bool CheckTypeCompatibility(Type type, Type other) {
-      if (type.IsAssignableFrom(other))
-        return true;
-      if (type.IsGenericType && other.IsGenericType) {
-        var otherGenericArguments = other.GetGenericArguments();
-        var typeGenericArguments = type.GetGenericArguments();
-
-        //check type arguments count
-        if (otherGenericArguments.Length != typeGenericArguments.Length)
-          return false;
-
-        //check type arguments & constraints
-        int i = 0;
-        foreach (var genericArgument in typeGenericArguments) {
-          if (otherGenericArguments[i].IsGenericParameter) {
-            foreach (var constraint in otherGenericArguments[i].GetGenericParameterConstraints())
-              if (!constraint.IsAssignableFrom(genericArgument)) return false;
-          } else if (genericArgument != otherGenericArguments[i]) return false;
-          i++;
-        }
-        //check types
-        try {
-          var otherGenericTypeDefinition = other.GetGenericTypeDefinition();
-          if (type.IsAssignableFrom(otherGenericTypeDefinition.MakeGenericType(typeGenericArguments)))
-            return true;
-        }
-        catch (Exception) { }
-      }
-      return false;
-    }
-    private static Type BuildType(Type type, Type protoType) {
-      if (type.IsGenericType && protoType.IsGenericType)
-        return type.GetGenericTypeDefinition().MakeGenericType(protoType.GetGenericArguments());
-      else
-        return type;
+      var matchingTypes = from assemblyType in assembly.GetTypes()
+                          let t = assemblyType.BuildType(type)
+                          where t != null
+                          where t.IsSubTypeOf(type)
+                          where !t.IsNonDiscoverableType()
+                          where onlyInstantiable == false || (!t.IsAbstract && !t.IsInterface && !t.HasElementType)
+                          where includeGenericTypeDefinitions || !t.IsGenericTypeDefinition
+                          select t;
+
+      return matchingTypes;
     }
 
Index: /branches/HeuristicLab.Mono/HeuristicLab.PluginInfrastructure/3.3/Starter/StarterForm.Designer.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.PluginInfrastructure/3.3/Starter/StarterForm.Designer.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.PluginInfrastructure/3.3/Starter/StarterForm.Designer.cs	(revision 8585)
@@ -181,5 +181,6 @@
       this.Name = "StarterForm";
       this.Text = "HeuristicLab Starter";
-      this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing);
+      this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.StarterForm_FormClosing);
+      this.Shown += new System.EventHandler(this.StarterForm_Shown);
       this.ResumeLayout(false);
 
Index: /branches/HeuristicLab.Mono/HeuristicLab.PluginInfrastructure/3.3/Starter/StarterForm.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.PluginInfrastructure/3.3/Starter/StarterForm.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.PluginInfrastructure/3.3/Starter/StarterForm.cs	(revision 8585)
@@ -26,8 +26,8 @@
 using System.Linq;
 using System.Threading;
+using System.Threading.Tasks;
 using System.Windows.Forms;
 using HeuristicLab.PluginInfrastructure.Advanced;
 using HeuristicLab.PluginInfrastructure.Manager;
-using System.Threading.Tasks;
 
 namespace HeuristicLab.PluginInfrastructure.Starter {
@@ -46,4 +46,6 @@
     private SplashScreen splashScreen;
     private bool updatesAvailable = false;
+    private string[] arguments;
+
     /// <summary>
     /// Initializes an instance of the starter form.
@@ -127,4 +129,31 @@
     }
 
+    /// <summary>
+    /// Creates a new StarterForm and passes the arguments in <paramref name="args"/>.
+    /// </summary>
+    /// <param name="args">The arguments that should be processed</param>
+    public StarterForm(string[] args)
+      : this() {
+      this.arguments = args;
+    }
+
+    private void StarterForm_Shown(object sender, EventArgs e) {
+      foreach (var argument in ArgumentHandling.GetArguments(arguments)) {
+        if (argument is StartArgument) {
+          var appDesc = (from desc in pluginManager.Applications
+                         where desc.Name == argument.Value
+                         select desc).SingleOrDefault();
+          if (appDesc != null) {
+            StartApplication(appDesc);
+          } else {
+            MessageBox.Show("Cannot start application " + argument.Value + ".",
+                            "HeuristicLab",
+                            MessageBoxButtons.OK,
+                            MessageBoxIcon.Warning);
+          }
+        }
+      }
+    }
+
     private void applicationsListView_ItemActivate(object sender, EventArgs e) {
       if (applicationsListView.SelectedItems.Count > 0) {
@@ -259,5 +288,5 @@
     }
 
-    private void MainForm_FormClosing(object sender, FormClosingEventArgs e) {
+    private void StarterForm_FormClosing(object sender, FormClosingEventArgs e) {
       splashScreen.Close();
       abortRequested = true;
Index: /branches/HeuristicLab.Mono/HeuristicLab.PluginInfrastructure/3.3/TypeExtensions.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.PluginInfrastructure/3.3/TypeExtensions.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.PluginInfrastructure/3.3/TypeExtensions.cs	(revision 8585)
@@ -0,0 +1,129 @@
+﻿#region License Information
+
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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 System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+
+namespace HeuristicLab.PluginInfrastructure {
+  internal static class TypeExtensions {
+    internal static bool IsNonDiscoverableType(this Type t) {
+      return t.GetCustomAttributes(typeof(NonDiscoverableTypeAttribute), false).Any();
+    }
+
+    /// <summary>
+    /// Constructs a concrete type from a given proto type.
+    /// </summary>
+    /// <param name="type"></param>
+    /// <param name="protoType"></param>
+    /// <returns>The constructed type, a generic type definition or null, if a type construction is not possible</returns>
+    /// <remarks>This method does not work with nested generic types</remarks>
+    internal static Type BuildType(this Type type, Type protoType) {
+      if (type == null || protoType == null) throw new ArgumentNullException();
+
+      if (!type.IsGenericTypeDefinition) return type;
+      if (protoType.IsGenericTypeDefinition) return type;
+      if (!protoType.IsGenericType) return type;
+
+      var typeGenericArguments = type.GetGenericArguments();
+      var protoTypeGenericArguments = protoType.GetGenericArguments();
+      if (typeGenericArguments.Length != protoTypeGenericArguments.Length) return null;
+
+      for (int i = 0; i < typeGenericArguments.Length; i++) {
+        var typeGenericArgument = typeGenericArguments[i];
+        var protoTypeGenericArgument = protoTypeGenericArguments[i];
+
+        //check class contraint on generic type parameter 
+        if (typeGenericArgument.GenericParameterAttributes.HasFlag(GenericParameterAttributes.ReferenceTypeConstraint))
+          if (!protoTypeGenericArgument.IsClass && !protoTypeGenericArgument.IsInterface && !protoType.IsArray) return null;
+
+        //check default constructor constraint on generic type parameter 
+        if (typeGenericArgument.GenericParameterAttributes.HasFlag(GenericParameterAttributes.DefaultConstructorConstraint))
+          if (!protoTypeGenericArgument.IsValueType && protoTypeGenericArgument.GetConstructor(Type.EmptyTypes) == null) return null;
+
+        //check type restrictions on generic type parameter
+        foreach (var constraint in typeGenericArgument.GetGenericParameterConstraints())
+          if (!constraint.IsAssignableFrom(protoTypeGenericArgument)) return null;
+      }
+
+      try {
+        return type.MakeGenericType(protoTypeGenericArguments);
+      }
+      catch (Exception) {
+        return null;
+      }
+    }
+
+    internal static bool IsSubTypeOf(this Type subType, Type baseType) {
+      if (baseType.IsAssignableFrom(subType)) return true;
+      if (!baseType.IsGenericType) return false;
+
+      if (RecursiveCheckGenericTypes(baseType, subType)) return true;
+      IEnumerable<Type> implementedInterfaces = subType.GetInterfaces().Where(t => t.IsGenericType);
+      foreach (var implementedInterface in implementedInterfaces.Where(i => i.IsGenericType)) {
+        if (baseType.CheckGenericTypes(implementedInterface)) return true;
+      }
+
+      return false;
+    }
+
+    private static bool RecursiveCheckGenericTypes(Type baseType, Type subType) {
+      if (!baseType.IsGenericType) return false;
+      if (!subType.IsGenericType) return false;
+      if (baseType.CheckGenericTypes(subType)) return true;
+      if (subType.BaseType == null) return false;
+
+      return RecursiveCheckGenericTypes(baseType, subType.BaseType);
+    }
+
+    private static bool CheckGenericTypes(this Type baseType, Type subType) {
+      var baseTypeGenericTypeDefinition = baseType.GetGenericTypeDefinition();
+      var subTypeGenericTypeDefinition = subType.GetGenericTypeDefinition();
+      if (baseTypeGenericTypeDefinition != subTypeGenericTypeDefinition) return false;
+      var baseTypeGenericArguments = baseType.GetGenericArguments();
+      var subTypeGenericArguments = subType.GetGenericArguments();
+
+      for (int i = 0; i < baseTypeGenericArguments.Length; i++) {
+        var baseTypeGenericArgument = baseTypeGenericArguments[i];
+        var subTypeGenericArgument = subTypeGenericArguments[i];
+
+        if (baseTypeGenericArgument.IsGenericParameter ^ subTypeGenericArgument.IsGenericParameter) return false;
+        if (baseTypeGenericArgument == subTypeGenericArgument) continue;
+        if (!baseTypeGenericArgument.IsGenericParameter && !subTypeGenericArgument.IsGenericParameter) return false;
+
+        if (baseTypeGenericArgument.GenericParameterAttributes.HasFlag(GenericParameterAttributes.ReferenceTypeConstraint) &&
+            !subTypeGenericArgument.GenericParameterAttributes.HasFlag(GenericParameterAttributes.ReferenceTypeConstraint)) return false;
+        if (baseTypeGenericArgument.GenericParameterAttributes.HasFlag(GenericParameterAttributes.DefaultConstructorConstraint) &&
+            !subTypeGenericArgument.GenericParameterAttributes.HasFlag(GenericParameterAttributes.DefaultConstructorConstraint)) return false;
+        if (baseTypeGenericArgument.GenericParameterAttributes.HasFlag(GenericParameterAttributes.NotNullableValueTypeConstraint) &&
+            !subTypeGenericArgument.GenericParameterAttributes.HasFlag(GenericParameterAttributes.NotNullableValueTypeConstraint)) return false;
+
+        foreach (var baseTypeGenericParameterConstraint in baseTypeGenericArgument.GetGenericParameterConstraints()) {
+          if (!subTypeGenericArgument.GetGenericParameterConstraints().Any(t => baseTypeGenericParameterConstraint.IsAssignableFrom(t))) return false;
+        }
+      }
+      return true;
+    }
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views/3.4/InteractiveSymbolicDiscriminantFunctionClassificationSolutionSimplifierView.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views/3.4/InteractiveSymbolicDiscriminantFunctionClassificationSolutionSimplifierView.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views/3.4/InteractiveSymbolicDiscriminantFunctionClassificationSolutionSimplifierView.cs	(revision 8585)
@@ -50,10 +50,11 @@
 
     protected override void UpdateModel(ISymbolicExpressionTree tree) {
-      Content.Model = new SymbolicDiscriminantFunctionClassificationModel(tree, Content.Model.Interpreter);
+      var model = new SymbolicDiscriminantFunctionClassificationModel(tree, Content.Model.Interpreter, Content.Model.LowerEstimationLimit, Content.Model.UpperEstimationLimit);
       // the default policy for setting thresholds in classification models is the accuarcy maximizing policy.
       // This is rather slow to calculate and can lead to a very laggy UI in the interactive solution simplifier.
       // However, since we automatically prune sub-trees based on the threshold reaching the maximum accuracy we must
       // also use maximum accuracy threshold calculation here in order to prevent incoherent behavior of the simplifier.
-      Content.SetAccuracyMaximizingThresholds();
+      model.SetAccuracyMaximizingThresholds(Content.ProblemData);
+      Content.Model = model;
     }
 
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification-3.4.csproj
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification-3.4.csproj	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification-3.4.csproj	(revision 8585)
@@ -115,4 +115,5 @@
     <Compile Include="MultiObjective\SymbolicClassificationMultiObjectiveValidationBestSolutionAnalyzer.cs" />
     <Compile Include="Plugin.cs" />
+    <Compile Include="SingleObjective\SymbolicClassificationSingleObjectivePenaltyScoreEvaluator.cs" />
     <Compile Include="SingleObjective\SymbolicClassificationSingleObjectiveBoundedMeanSquaredErrorEvaluator.cs" />
     <Compile Include="SingleObjective\SymbolicClassificationSingleObjectiveOverfittingAnalyzer.cs" />
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/MultiObjective/SymbolicClassificationMultiObjectiveTrainingBestSolutionAnalyzer.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/MultiObjective/SymbolicClassificationMultiObjectiveTrainingBestSolutionAnalyzer.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/MultiObjective/SymbolicClassificationMultiObjectiveTrainingBestSolutionAnalyzer.cs	(revision 8585)
@@ -77,7 +77,7 @@
     protected override ISymbolicClassificationSolution CreateSolution(ISymbolicExpressionTree bestTree, double[] bestQuality) {
       var model = new SymbolicDiscriminantFunctionClassificationModel((ISymbolicExpressionTree)bestTree.Clone(), SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper);
-      if (ApplyLinearScaling.Value) {
-        SymbolicDiscriminantFunctionClassificationModel.Scale(model, ProblemDataParameter.ActualValue);
-      }
+      if (ApplyLinearScaling.Value) SymbolicDiscriminantFunctionClassificationModel.Scale(model, ProblemDataParameter.ActualValue);
+
+      model.SetAccuracyMaximizingThresholds(ProblemDataParameter.ActualValue);
       return new SymbolicDiscriminantFunctionClassificationSolution(model, (IClassificationProblemData)ProblemDataParameter.ActualValue.Clone());
     }
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/MultiObjective/SymbolicClassificationMultiObjectiveValidationBestSolutionAnalyzer.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/MultiObjective/SymbolicClassificationMultiObjectiveValidationBestSolutionAnalyzer.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/MultiObjective/SymbolicClassificationMultiObjectiveValidationBestSolutionAnalyzer.cs	(revision 8585)
@@ -66,7 +66,7 @@
     protected override ISymbolicClassificationSolution CreateSolution(ISymbolicExpressionTree bestTree, double[] bestQualities) {
       var model = new SymbolicDiscriminantFunctionClassificationModel((ISymbolicExpressionTree)bestTree.Clone(), SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper);
-      if (ApplyLinearScaling.Value) {
-        SymbolicDiscriminantFunctionClassificationModel.Scale(model, ProblemDataParameter.ActualValue);
-      }
+      if (ApplyLinearScaling.Value) SymbolicDiscriminantFunctionClassificationModel.Scale(model, ProblemDataParameter.ActualValue);
+
+      model.SetAccuracyMaximizingThresholds(ProblemDataParameter.ActualValue);
       return new SymbolicDiscriminantFunctionClassificationSolution(model, (IClassificationProblemData)ProblemDataParameter.ActualValue.Clone());
     }
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/Plugin.cs.frame
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/Plugin.cs.frame	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/Plugin.cs.frame	(revision 8585)
@@ -28,5 +28,5 @@
   [Plugin("HeuristicLab.Problems.DataAnalysis.Symbolic.Classification","Provides classes to perform symbolic classification (single- or multiobjective).", "3.4.3.$WCREV$")]
   [PluginFile("HeuristicLab.Problems.DataAnalysis.Symbolic.Classification-3.4.dll", PluginFileType.Assembly)]
-  [PluginDependency("HeuristicLab.ALGLIB", "3.5")]
+  [PluginDependency("HeuristicLab.ALGLIB", "3.6.0")]
   [PluginDependency("HeuristicLab.Analysis", "3.3")]
   [PluginDependency("HeuristicLab.Common", "3.3")]
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectivePenaltyScoreEvaluator.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectivePenaltyScoreEvaluator.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectivePenaltyScoreEvaluator.cs	(revision 8585)
@@ -0,0 +1,79 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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 System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Classification {
+  [Item("Penalty Score Evaluator", "Calculates the penalty score of a symbolic classification solution.")]
+  [StorableClass]
+  public class SymbolicClassificationSingleObjectivePenaltyScoreEvaluator : SymbolicClassificationSingleObjectiveEvaluator {
+    public override bool Maximization { get { return false; } }
+
+    [StorableConstructor]
+    protected SymbolicClassificationSingleObjectivePenaltyScoreEvaluator(bool deserializing) : base(deserializing) { }
+    protected SymbolicClassificationSingleObjectivePenaltyScoreEvaluator(SymbolicClassificationSingleObjectivePenaltyScoreEvaluator original, Cloner cloner) : base(original, cloner) { }
+    public SymbolicClassificationSingleObjectivePenaltyScoreEvaluator() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicClassificationSingleObjectivePenaltyScoreEvaluator(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      double quality = Evaluate(ExecutionContext, SymbolicExpressionTreeParameter.ActualValue, ProblemDataParameter.ActualValue, GenerateRowsToEvaluate());
+      QualityParameter.ActualValue = new DoubleValue(quality);
+      return base.Apply();
+    }
+
+    public static double Calculate(IClassificationModel model, IClassificationProblemData problemData, IEnumerable<int> rows) {
+      var estimations = model.GetEstimatedClassValues(problemData.Dataset, rows).GetEnumerator();
+      if (!estimations.MoveNext()) return double.NaN;
+
+      var penalty = 0.0;
+      var count = 0;
+      foreach (var r in rows) {
+        var actualClass = problemData.Dataset.GetDoubleValue(problemData.TargetVariable, r);
+        penalty += problemData.GetClassificationPenalty(actualClass, estimations.Current);
+        estimations.MoveNext();
+        count++;
+      }
+      return penalty / count;
+    }
+
+    public override double Evaluate(IExecutionContext context, ISymbolicExpressionTree tree, IClassificationProblemData problemData, IEnumerable<int> rows) {
+      SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = context;
+      EstimationLimitsParameter.ExecutionContext = context;
+
+      var model = new SymbolicDiscriminantFunctionClassificationModel(tree, SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper);
+      model.SetAccuracyMaximizingThresholds(problemData);
+      double penalty = Calculate(model, problemData, rows);
+
+      SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null;
+      EstimationLimitsParameter.ExecutionContext = null;
+
+      return penalty;
+    }
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveTrainingBestSolutionAnalyzer.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveTrainingBestSolutionAnalyzer.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveTrainingBestSolutionAnalyzer.cs	(revision 8585)
@@ -75,7 +75,7 @@
     protected override ISymbolicClassificationSolution CreateSolution(ISymbolicExpressionTree bestTree, double bestQuality) {
       var model = new SymbolicDiscriminantFunctionClassificationModel((ISymbolicExpressionTree)bestTree.Clone(), SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper);
-      if (ApplyLinearScaling.Value) {
-        SymbolicDiscriminantFunctionClassificationModel.Scale(model, ProblemDataParameter.ActualValue);
-      }
+      if (ApplyLinearScaling.Value) SymbolicDiscriminantFunctionClassificationModel.Scale(model, ProblemDataParameter.ActualValue);
+
+      model.SetAccuracyMaximizingThresholds(ProblemDataParameter.ActualValue);
       return new SymbolicDiscriminantFunctionClassificationSolution(model, (IClassificationProblemData)ProblemDataParameter.ActualValue.Clone());
     }
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveTrainingParetoBestSolutionAnalyzer.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveTrainingParetoBestSolutionAnalyzer.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveTrainingParetoBestSolutionAnalyzer.cs	(revision 8585)
@@ -60,6 +60,7 @@
     protected override ISymbolicClassificationSolution CreateSolution(ISymbolicExpressionTree bestTree) {
       var model = new SymbolicDiscriminantFunctionClassificationModel((ISymbolicExpressionTree)bestTree.Clone(), SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper);
-      if (ApplyLinearScaling.Value)
-        SymbolicDiscriminantFunctionClassificationModel.Scale(model, ProblemDataParameter.ActualValue);
+      if (ApplyLinearScaling.Value) SymbolicDiscriminantFunctionClassificationModel.Scale(model, ProblemDataParameter.ActualValue);
+
+      model.SetAccuracyMaximizingThresholds(ProblemDataParameter.ActualValue);
       return new SymbolicDiscriminantFunctionClassificationSolution(model, (IClassificationProblemData)ProblemDataParameter.ActualValue.Clone());
     }
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveValidationBestSolutionAnalyzer.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveValidationBestSolutionAnalyzer.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveValidationBestSolutionAnalyzer.cs	(revision 8585)
@@ -66,7 +66,7 @@
     protected override ISymbolicClassificationSolution CreateSolution(ISymbolicExpressionTree bestTree, double bestQuality) {
       var model = new SymbolicDiscriminantFunctionClassificationModel((ISymbolicExpressionTree)bestTree.Clone(), SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper);
-      if (ApplyLinearScaling.Value) {
-        SymbolicDiscriminantFunctionClassificationModel.Scale(model, ProblemDataParameter.ActualValue);
-      }
+      if (ApplyLinearScaling.Value) SymbolicDiscriminantFunctionClassificationModel.Scale(model, ProblemDataParameter.ActualValue);
+
+      model.SetAccuracyMaximizingThresholds(ProblemDataParameter.ActualValue);
       return new SymbolicDiscriminantFunctionClassificationSolution(model, (IClassificationProblemData)ProblemDataParameter.ActualValue.Clone());
     }
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveValidationParetoBestSolutionAnalyzer.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveValidationParetoBestSolutionAnalyzer.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveValidationParetoBestSolutionAnalyzer.cs	(revision 8585)
@@ -60,6 +60,7 @@
     protected override ISymbolicClassificationSolution CreateSolution(ISymbolicExpressionTree bestTree) {
       var model = new SymbolicDiscriminantFunctionClassificationModel((ISymbolicExpressionTree)bestTree.Clone(), SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper);
-      if (ApplyLinearScaling.Value)
-        SymbolicDiscriminantFunctionClassificationModel.Scale(model, ProblemDataParameter.ActualValue);
+      if (ApplyLinearScaling.Value) SymbolicDiscriminantFunctionClassificationModel.Scale(model, ProblemDataParameter.ActualValue);
+
+      model.SetAccuracyMaximizingThresholds(ProblemDataParameter.ActualValue);
       return new SymbolicDiscriminantFunctionClassificationSolution(model, (IClassificationProblemData)ProblemDataParameter.ActualValue.Clone());
     }
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SymbolicClassificationModel.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SymbolicClassificationModel.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SymbolicClassificationModel.cs	(revision 8585)
@@ -51,5 +51,5 @@
 
     public ISymbolicClassificationSolution CreateClassificationSolution(IClassificationProblemData problemData) {
-      return new SymbolicClassificationSolution(this, problemData);
+      return new SymbolicClassificationSolution(this, new ClassificationProblemData(problemData));
     }
     IClassificationSolution IClassificationModel.CreateClassificationSolution(IClassificationProblemData problemData) {
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SymbolicDiscriminantFunctionClassificationModel.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SymbolicDiscriminantFunctionClassificationModel.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SymbolicDiscriminantFunctionClassificationModel.cs	(revision 8585)
@@ -67,6 +67,6 @@
       double lowerEstimationLimit = double.MinValue, double upperEstimationLimit = double.MaxValue)
       : base(tree, interpreter) {
-      thresholds = new double[] { double.NegativeInfinity };
-      classValues = new double[] { 0.0 };
+      this.thresholds = new double[0];
+      this.classValues = new double[0];
       this.lowerEstimationLimit = lowerEstimationLimit;
       this.upperEstimationLimit = upperEstimationLimit;
@@ -88,9 +88,9 @@
 
     public IEnumerable<double> GetEstimatedValues(Dataset dataset, IEnumerable<int> rows) {
-      return Interpreter.GetSymbolicExpressionTreeValues(SymbolicExpressionTree, dataset, rows)
-        .LimitToRange(lowerEstimationLimit, upperEstimationLimit);
+      return Interpreter.GetSymbolicExpressionTreeValues(SymbolicExpressionTree, dataset, rows).LimitToRange(lowerEstimationLimit, upperEstimationLimit);
     }
 
     public IEnumerable<double> GetEstimatedClassValues(Dataset dataset, IEnumerable<int> rows) {
+      if (!Thresholds.Any() && !ClassValues.Any()) throw new ArgumentException("No thresholds and class values were set for the current symbolic classification model.");
       foreach (var x in GetEstimatedValues(dataset, rows)) {
         int classIndex = 0;
@@ -105,5 +105,5 @@
 
     public SymbolicDiscriminantFunctionClassificationSolution CreateClassificationSolution(IClassificationProblemData problemData) {
-      return new SymbolicDiscriminantFunctionClassificationSolution(this, problemData);
+      return new SymbolicDiscriminantFunctionClassificationSolution(this, new ClassificationProblemData(problemData));
     }
     IClassificationSolution IClassificationModel.CreateClassificationSolution(IClassificationProblemData problemData) {
@@ -121,4 +121,24 @@
     }
     #endregion
+
+    public void SetAccuracyMaximizingThresholds(IClassificationProblemData problemData) {
+      double[] classValues;
+      double[] thresholds;
+      var targetClassValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, problemData.TrainingIndices);
+      var estimatedTrainingValues = GetEstimatedValues(problemData.Dataset, problemData.TrainingIndices);
+      AccuracyMaximizationThresholdCalculator.CalculateThresholds(problemData, estimatedTrainingValues, targetClassValues, out classValues, out thresholds);
+
+      SetThresholdsAndClassValues(thresholds, classValues);
+    }
+
+    public void SetClassDistributionCutPointThresholds(IClassificationProblemData problemData) {
+      double[] classValues;
+      double[] thresholds;
+      var targetClassValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, problemData.TrainingIndices);
+      var estimatedTrainingValues = GetEstimatedValues(problemData.Dataset, problemData.TrainingIndices);
+      NormalDistributionCutPointsThresholdCalculator.CalculateThresholds(problemData, estimatedTrainingValues, targetClassValues, out classValues, out thresholds);
+
+      SetThresholdsAndClassValues(thresholds, classValues);
+    }
 
     public static void Scale(SymbolicDiscriminantFunctionClassificationModel model, IClassificationProblemData problemData) {
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/Interfaces/ISymbolicRegressionModel.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/Interfaces/ISymbolicRegressionModel.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/Interfaces/ISymbolicRegressionModel.cs	(revision 8585)
@@ -20,7 +20,8 @@
 #endregion
 
-using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
 namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Regression {
   public interface ISymbolicRegressionModel : IRegressionModel, ISymbolicDataAnalysisModel {
+    double LowerEstimationLimit { get; }
+    double UpperEstimationLimit { get; }
   }
 }
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/Plugin.cs.frame
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/Plugin.cs.frame	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/Plugin.cs.frame	(revision 8585)
@@ -28,5 +28,5 @@
   [Plugin("HeuristicLab.Problems.DataAnalysis.Symbolic.Regression","Provides classes to perform symbolic regression (single- or multiobjective).", "3.4.3.$WCREV$")]
   [PluginFile("HeuristicLab.Problems.DataAnalysis.Symbolic.Regression-3.4.dll", PluginFileType.Assembly)]
-  [PluginDependency("HeuristicLab.ALGLIB", "3.5")]
+  [PluginDependency("HeuristicLab.ALGLIB", "3.6.0")]
   [PluginDependency("HeuristicLab.Analysis", "3.3")]
   [PluginDependency("HeuristicLab.Common", "3.3")]
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SymbolicRegressionModel.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SymbolicRegressionModel.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SymbolicRegressionModel.cs	(revision 8585)
@@ -64,5 +64,5 @@
 
     public ISymbolicRegressionSolution CreateRegressionSolution(IRegressionProblemData problemData) {
-      return new SymbolicRegressionSolution(this, problemData);
+      return new SymbolicRegressionSolution(this, new RegressionProblemData(problemData));
     }
     IRegressionSolution IRegressionModel.CreateRegressionSolution(IRegressionProblemData problemData) {
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/Plugin.cs.frame
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/Plugin.cs.frame	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/Plugin.cs.frame	(revision 8585)
@@ -29,5 +29,5 @@
   [PluginFile("HeuristicLab.Problems.DataAnalysis.Symbolic.Views-3.4.dll", PluginFileType.Assembly)]
   [PluginFile("displayModelFrame.html", PluginFileType.Data)]
-  [PluginDependency("HeuristicLab.ALGLIB", "3.5")]
+  [PluginDependency("HeuristicLab.ALGLIB", "3.6.0")]
   [PluginDependency("HeuristicLab.Collections", "3.3")]
   [PluginDependency("HeuristicLab.Common", "3.3")]
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/Symbols/VariableView.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/Symbols/VariableView.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/Symbols/VariableView.cs	(revision 8585)
@@ -92,4 +92,5 @@
     protected override void SetEnabledStateOfControls() {
       base.SetEnabledStateOfControls();
+      enabledCheckBox.Enabled = Content != null && Content.VariableNames.Any() && !Locked && !ReadOnly;
       weightInitializationMuTextBox.Enabled = Content != null;
       weightInitializationMuTextBox.ReadOnly = ReadOnly;
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Plugin.cs.frame
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Plugin.cs.frame	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Plugin.cs.frame	(revision 8585)
@@ -28,5 +28,5 @@
   [Plugin("HeuristicLab.Problems.DataAnalysis.Symbolic","Provides base classes for symbolic data analysis tasks.", "3.4.3.$WCREV$")]
   [PluginFile("HeuristicLab.Problems.DataAnalysis.Symbolic-3.4.dll", PluginFileType.Assembly)]
-  [PluginDependency("HeuristicLab.ALGLIB", "3.5.0")]
+  [PluginDependency("HeuristicLab.ALGLIB", "3.6.0")]
   [PluginDependency("HeuristicLab.Analysis", "3.3")]
   [PluginDependency("HeuristicLab.Collections", "3.3")]
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/Classification/ClassificationEnsembleSolutionEstimatedClassValuesView.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/Classification/ClassificationEnsembleSolutionEstimatedClassValuesView.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/Classification/ClassificationEnsembleSolutionEstimatedClassValuesView.cs	(revision 8585)
@@ -96,5 +96,5 @@
       }
 
-      int classValuesCount = Content.ProblemData.ClassValues.Count;
+      int classValuesCount = Content.ProblemData.Classes;
       int solutionsCount = Content.ClassificationSolutions.Count();
       string[,] values = new string[indices.Length, 5 + classValuesCount + solutionsCount];
@@ -114,8 +114,7 @@
             estimatedValuesVector[i].GroupBy(x => x).Select(g => new { Key = g.Key, Count = g.Count() }).ToList();
           var estimationCount = groups.Where(g => g.Key != null).Select(g => g.Count).Sum();
-          values[i, 4] =
-            (((double)groups.Where(g => g.Key == estimatedClassValues[i]).Single().Count) / estimationCount).ToString();
-          for (int classIndex = 0; classIndex < Content.ProblemData.ClassValues.Count; classIndex++) {
-            var group = groups.Where(g => g.Key == Content.ProblemData.ClassValues[classIndex]).SingleOrDefault();
+          values[i, 4] = (((double)groups.Where(g => g.Key == estimatedClassValues[i]).Single().Count) / estimationCount).ToString();
+          for (int classIndex = 0; classIndex < Content.ProblemData.Classes; classIndex++) {
+            var group = groups.Where(g => g.Key == Content.ProblemData.ClassValues.ElementAt(classIndex)).SingleOrDefault();
             if (group == null) values[i, 5 + classIndex] = 0.ToString();
             else values[i, 5 + classIndex] = group.Count.ToString();
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/Classification/DiscriminantFunctionClassificationSolutionThresholdView.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/Classification/DiscriminantFunctionClassificationSolutionThresholdView.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/Classification/DiscriminantFunctionClassificationSolutionThresholdView.cs	(revision 8585)
@@ -238,4 +238,5 @@
       double[] thresholds = Content.Model.Thresholds.ToArray();
       thresholds[classIndex] = e.NewLocationY;
+      Array.Sort(thresholds);
       Content.Model.SetThresholdsAndClassValues(thresholds, Content.Model.ClassValues);
     }
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/FeatureCorrelation/AbstractFeatureCorrelationView.Designer.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/FeatureCorrelation/AbstractFeatureCorrelationView.Designer.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/FeatureCorrelation/AbstractFeatureCorrelationView.Designer.cs	(revision 8585)
@@ -0,0 +1,253 @@
+﻿#region License Information
+
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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
+namespace HeuristicLab.Problems.DataAnalysis.Views {
+  partial class AbstractFeatureCorrelationView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AbstractFeatureCorrelationView));
+      this.DataGridView = new System.Windows.Forms.DataGridView();
+      this.HeatMapProgressBar = new System.Windows.Forms.ProgressBar();
+      this.PartitionComboBox = new System.Windows.Forms.ComboBox();
+      this.CorrelationCalcLabel = new System.Windows.Forms.Label();
+      this.CorrelationCalcComboBox = new System.Windows.Forms.ComboBox();
+      this.PartitionLabel = new System.Windows.Forms.Label();
+      this.minimumLabel = new System.Windows.Forms.Label();
+      this.maximumLabel = new System.Windows.Forms.Label();
+      this.PictureBox = new System.Windows.Forms.PictureBox();
+      this.SplitContainer = new System.Windows.Forms.SplitContainer();
+      this.CalculatingPanel = new System.Windows.Forms.Panel();
+      this.CalculatingLabel = new System.Windows.Forms.Label();
+      ((System.ComponentModel.ISupportInitialize)(this.DataGridView)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.PictureBox)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.SplitContainer)).BeginInit();
+      this.SplitContainer.Panel1.SuspendLayout();
+      this.SplitContainer.Panel2.SuspendLayout();
+      this.SplitContainer.SuspendLayout();
+      this.CalculatingPanel.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // DataGridView
+      // 
+      this.DataGridView.AllowUserToAddRows = false;
+      this.DataGridView.AllowUserToDeleteRows = false;
+      this.DataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+      this.DataGridView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.DataGridView.Location = new System.Drawing.Point(0, 0);
+      this.DataGridView.Name = "DataGridView";
+      this.DataGridView.ReadOnly = true;
+      this.DataGridView.Size = new System.Drawing.Size(475, 301);
+      this.DataGridView.TabIndex = 0;
+      this.DataGridView.VirtualMode = true;
+      this.DataGridView.CellPainting += new System.Windows.Forms.DataGridViewCellPaintingEventHandler(this.DataGridView_CellPainting);
+      this.DataGridView.CellValueNeeded += new System.Windows.Forms.DataGridViewCellValueEventHandler(this.DataGridView_CellValueNeeded);
+      this.DataGridView.ColumnHeaderMouseClick += new System.Windows.Forms.DataGridViewCellMouseEventHandler(this.DataGridView_ColumnHeaderMouseClick);
+      this.DataGridView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.DataGridView_KeyDown);
+      // 
+      // HeatMapProgressBar
+      // 
+      this.HeatMapProgressBar.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
+      this.HeatMapProgressBar.Location = new System.Drawing.Point(25, 46);
+      this.HeatMapProgressBar.Name = "HeatMapProgressBar";
+      this.HeatMapProgressBar.RightToLeft = System.Windows.Forms.RightToLeft.No;
+      this.HeatMapProgressBar.Size = new System.Drawing.Size(154, 21);
+      this.HeatMapProgressBar.TabIndex = 9;
+      // 
+      // PartitionComboBox
+      // 
+      this.PartitionComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.PartitionComboBox.FormattingEnabled = true;
+      this.PartitionComboBox.Location = new System.Drawing.Point(333, 3);
+      this.PartitionComboBox.Name = "PartitionComboBox";
+      this.PartitionComboBox.Size = new System.Drawing.Size(142, 21);
+      this.PartitionComboBox.TabIndex = 8;
+      this.PartitionComboBox.SelectionChangeCommitted += new System.EventHandler(this.PartitionComboBox_SelectedChangeCommitted);
+      // 
+      // CorrelationCalcLabel
+      // 
+      this.CorrelationCalcLabel.AutoSize = true;
+      this.CorrelationCalcLabel.Location = new System.Drawing.Point(0, 6);
+      this.CorrelationCalcLabel.Name = "CorrelationCalcLabel";
+      this.CorrelationCalcLabel.Size = new System.Drawing.Size(104, 13);
+      this.CorrelationCalcLabel.TabIndex = 7;
+      this.CorrelationCalcLabel.Text = "Correlation Measure:";
+      // 
+      // CorrelationCalcComboBox
+      // 
+      this.CorrelationCalcComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.CorrelationCalcComboBox.FormattingEnabled = true;
+      this.CorrelationCalcComboBox.Location = new System.Drawing.Point(110, 3);
+      this.CorrelationCalcComboBox.Name = "CorrelationCalcComboBox";
+      this.CorrelationCalcComboBox.Size = new System.Drawing.Size(163, 21);
+      this.CorrelationCalcComboBox.TabIndex = 6;
+      this.CorrelationCalcComboBox.SelectionChangeCommitted += new System.EventHandler(this.CorrelationMeasureComboBox_SelectedChangeCommitted);
+      // 
+      // PartitionLabel
+      // 
+      this.PartitionLabel.AutoSize = true;
+      this.PartitionLabel.Location = new System.Drawing.Point(279, 6);
+      this.PartitionLabel.Name = "PartitionLabel";
+      this.PartitionLabel.Size = new System.Drawing.Size(48, 13);
+      this.PartitionLabel.TabIndex = 10;
+      this.PartitionLabel.Text = "Partition:";
+      // 
+      // minimumLabel
+      // 
+      this.minimumLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.minimumLabel.BackColor = System.Drawing.Color.Transparent;
+      this.minimumLabel.Location = new System.Drawing.Point(487, 314);
+      this.minimumLabel.Name = "minimumLabel";
+      this.minimumLabel.Size = new System.Drawing.Size(73, 19);
+      this.minimumLabel.TabIndex = 13;
+      this.minimumLabel.Text = "0.0";
+      this.minimumLabel.TextAlign = System.Drawing.ContentAlignment.TopCenter;
+      // 
+      // maximumLabel
+      // 
+      this.maximumLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.maximumLabel.BackColor = System.Drawing.Color.Transparent;
+      this.maximumLabel.Location = new System.Drawing.Point(487, 2);
+      this.maximumLabel.Name = "maximumLabel";
+      this.maximumLabel.Size = new System.Drawing.Size(73, 25);
+      this.maximumLabel.TabIndex = 12;
+      this.maximumLabel.Text = "1.0";
+      this.maximumLabel.TextAlign = System.Drawing.ContentAlignment.BottomCenter;
+      // 
+      // PictureBox
+      // 
+      this.PictureBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.PictureBox.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+      this.PictureBox.Image = ((System.Drawing.Image)(resources.GetObject("PictureBox.Image")));
+      this.PictureBox.Location = new System.Drawing.Point(507, 30);
+      this.PictureBox.Name = "PictureBox";
+      this.PictureBox.Size = new System.Drawing.Size(35, 281);
+      this.PictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
+      this.PictureBox.TabIndex = 15;
+      this.PictureBox.TabStop = false;
+      // 
+      // SplitContainer
+      // 
+      this.SplitContainer.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.SplitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
+      this.SplitContainer.IsSplitterFixed = true;
+      this.SplitContainer.Location = new System.Drawing.Point(3, 3);
+      this.SplitContainer.Name = "SplitContainer";
+      this.SplitContainer.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // SplitContainer.Panel1
+      // 
+      this.SplitContainer.Panel1.Controls.Add(this.CorrelationCalcLabel);
+      this.SplitContainer.Panel1.Controls.Add(this.CorrelationCalcComboBox);
+      this.SplitContainer.Panel1.Controls.Add(this.PartitionComboBox);
+      this.SplitContainer.Panel1.Controls.Add(this.PartitionLabel);
+      // 
+      // SplitContainer.Panel2
+      // 
+      this.SplitContainer.Panel2.Controls.Add(this.CalculatingPanel);
+      this.SplitContainer.Panel2.Controls.Add(this.DataGridView);
+      this.SplitContainer.Size = new System.Drawing.Size(475, 330);
+      this.SplitContainer.SplitterDistance = 25;
+      this.SplitContainer.TabIndex = 16;
+      // 
+      // CalculatingPanel
+      // 
+      this.CalculatingPanel.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.CalculatingPanel.Controls.Add(this.CalculatingLabel);
+      this.CalculatingPanel.Controls.Add(this.HeatMapProgressBar);
+      this.CalculatingPanel.Location = new System.Drawing.Point(138, 95);
+      this.CalculatingPanel.Name = "CalculatingPanel";
+      this.CalculatingPanel.Size = new System.Drawing.Size(200, 81);
+      this.CalculatingPanel.TabIndex = 10;
+      // 
+      // CalculatingLabel
+      // 
+      this.CalculatingLabel.AutoSize = true;
+      this.CalculatingLabel.Location = new System.Drawing.Point(42, 19);
+      this.CalculatingLabel.Name = "CalculatingLabel";
+      this.CalculatingLabel.Size = new System.Drawing.Size(120, 13);
+      this.CalculatingLabel.TabIndex = 10;
+      this.CalculatingLabel.Text = "Calculating correlation...";
+      // 
+      // AbstractFeatureCorrelationView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.SplitContainer);
+      this.Controls.Add(this.minimumLabel);
+      this.Controls.Add(this.PictureBox);
+      this.Controls.Add(this.maximumLabel);
+      this.Name = "AbstractFeatureCorrelationView";
+      this.Size = new System.Drawing.Size(569, 336);
+      ((System.ComponentModel.ISupportInitialize)(this.DataGridView)).EndInit();
+      ((System.ComponentModel.ISupportInitialize)(this.PictureBox)).EndInit();
+      this.SplitContainer.Panel1.ResumeLayout(false);
+      this.SplitContainer.Panel1.PerformLayout();
+      this.SplitContainer.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.SplitContainer)).EndInit();
+      this.SplitContainer.ResumeLayout(false);
+      this.CalculatingPanel.ResumeLayout(false);
+      this.CalculatingPanel.PerformLayout();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.DataGridView DataGridView;
+    protected System.Windows.Forms.ProgressBar HeatMapProgressBar;
+    protected System.Windows.Forms.ComboBox PartitionComboBox;
+    protected System.Windows.Forms.Label CorrelationCalcLabel;
+    protected System.Windows.Forms.ComboBox CorrelationCalcComboBox;
+    protected System.Windows.Forms.Label PartitionLabel;
+    protected System.Windows.Forms.Label minimumLabel;
+    protected System.Windows.Forms.Label maximumLabel;
+    protected System.Windows.Forms.PictureBox PictureBox;
+    protected System.Windows.Forms.SplitContainer SplitContainer;
+    protected System.Windows.Forms.Panel CalculatingPanel;
+    protected System.Windows.Forms.Label CalculatingLabel;
+
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/FeatureCorrelation/AbstractFeatureCorrelationView.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/FeatureCorrelation/AbstractFeatureCorrelationView.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/FeatureCorrelation/AbstractFeatureCorrelationView.cs	(revision 8585)
@@ -0,0 +1,304 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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 System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Data.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+using FCE = HeuristicLab.Problems.DataAnalysis.FeatureCorrelationEnums;
+
+namespace HeuristicLab.Problems.DataAnalysis.Views {
+  [View("Feature Correlation View")]
+  [Content(typeof(DataAnalysisProblemData), false)]
+  public abstract partial class AbstractFeatureCorrelationView : AsynchronousContentView {
+
+    private int[] virtualRowIndices;
+    private List<KeyValuePair<int, SortOrder>> sortedColumnIndices;
+    private StringConvertibleMatrixView.RowComparer rowComparer;
+
+    protected FeatureCorrelationCalculator fcc;
+    protected HeatMap currentCorrelation;
+
+    public new DataAnalysisProblemData Content {
+      get { return (DataAnalysisProblemData)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public AbstractFeatureCorrelationView() {
+      InitializeComponent();
+      sortedColumnIndices = new List<KeyValuePair<int, SortOrder>>();
+      rowComparer = new StringConvertibleMatrixView.RowComparer();
+      fcc = new FeatureCorrelationCalculator();
+      var calculatorList = FCE.EnumToList<FCE.CorrelationCalculators>().Select(x => new KeyValuePair<FCE.CorrelationCalculators, string>(x, FCE.GetEnumDescription(x))).ToList();
+      CorrelationCalcComboBox.ValueMember = "Key";
+      CorrelationCalcComboBox.DisplayMember = "Value";
+      CorrelationCalcComboBox.DataSource = new BindingList<KeyValuePair<FCE.CorrelationCalculators, string>>(calculatorList);
+      var partitionList = FCE.EnumToList<FCE.Partitions>().Select(x => new KeyValuePair<FCE.Partitions, string>(x, FCE.GetEnumDescription(x))).ToList();
+      PartitionComboBox.ValueMember = "Key";
+      PartitionComboBox.DisplayMember = "Value";
+      PartitionComboBox.DataSource = new BindingList<KeyValuePair<FCE.Partitions, string>>(partitionList);
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      fcc.ProgressCalculation += new DataAnalysis.FeatureCorrelationCalculator.ProgressCalculationHandler(Content_ProgressCalculation);
+      fcc.CorrelationCalculationFinished += new DataAnalysis.FeatureCorrelationCalculator.CorrelationCalculationFinishedHandler(Content_CorrelationCalculationFinished);
+    }
+
+    protected override void DeregisterContentEvents() {
+      fcc.CorrelationCalculationFinished += new DataAnalysis.FeatureCorrelationCalculator.CorrelationCalculationFinishedHandler(Content_CorrelationCalculationFinished);
+      fcc.ProgressCalculation += new DataAnalysis.FeatureCorrelationCalculator.ProgressCalculationHandler(Content_ProgressCalculation);
+      base.DeregisterContentEvents();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content != null) {
+        fcc.ProblemData = Content;
+        CalculateCorrelation();
+      } else {
+        DataGridView.Columns.Clear();
+        DataGridView.Rows.Clear();
+      }
+    }
+
+    protected void CorrelationMeasureComboBox_SelectedChangeCommitted(object sender, System.EventArgs e) {
+      CalculateCorrelation();
+    }
+    protected void PartitionComboBox_SelectedChangeCommitted(object sender, System.EventArgs e) {
+      CalculateCorrelation();
+    }
+
+    protected abstract void CalculateCorrelation();
+
+    protected void UpdateDataGrid() {
+      virtualRowIndices = Enumerable.Range(0, currentCorrelation.Rows).ToArray();
+      DataGridViewColumn[] columns = new DataGridViewColumn[currentCorrelation.Columns];
+      for (int i = 0; i < columns.Length; ++i) {
+        var column = new DataGridViewTextBoxColumn();
+        column.FillWeight = 1;
+        columns[i] = column;
+      }
+
+      DataGridView.Columns.Clear();
+      DataGridView.Columns.AddRange(columns);
+
+      DataGridView.RowCount = currentCorrelation.Rows;
+
+      ClearSorting();
+      UpdateColumnHeaders();
+      UpdateRowHeaders();
+
+      maximumLabel.Text = currentCorrelation.Maximum.ToString();
+      minimumLabel.Text = currentCorrelation.Minimum.ToString();
+
+      DataGridView.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.ColumnHeader);
+      DataGridView.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders);
+      DataGridView.Enabled = true;
+    }
+
+    protected virtual void UpdateColumnHeaders() {
+      for (int i = 0; i < DataGridView.ColumnCount; i++) {
+        DataGridView.Columns[i].HeaderText = currentCorrelation.ColumnNames.ElementAt(i);
+      }
+    }
+    protected virtual void UpdateRowHeaders() {
+      for (int i = 0; i < DataGridView.RowCount; i++) {
+        DataGridView.Rows[i].HeaderCell.Value = currentCorrelation.RowNames.ElementAt(virtualRowIndices[i]);
+      }
+    }
+
+    protected void Content_ProgressCalculation(object sender, ProgressChangedEventArgs e) {
+      if (!CalculatingPanel.Visible && e.ProgressPercentage != HeatMapProgressBar.Maximum) {
+        CalculatingPanel.Show();
+      } else if (e.ProgressPercentage == HeatMapProgressBar.Maximum) {
+        CalculatingPanel.Hide();
+      }
+      HeatMapProgressBar.Value = e.ProgressPercentage;
+    }
+
+    protected abstract void Content_CorrelationCalculationFinished(object sender, FeatureCorrelationCalculator.CorrelationCalculationFinishedArgs e);
+
+    protected void DataGridView_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e) {
+      if (Content == null) return;
+      int rowIndex = virtualRowIndices[e.RowIndex];
+      e.Value = currentCorrelation[rowIndex, e.ColumnIndex];
+    }
+
+    protected void DataGridView_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) {
+      if (Content == null) return;
+      if (e.RowIndex < 0) return;
+      if (e.ColumnIndex < 0) return;
+      if (e.State.HasFlag(DataGridViewElementStates.Selected)) return;
+      if (!e.PaintParts.HasFlag(DataGridViewPaintParts.Background)) return;
+
+      int rowIndex = virtualRowIndices[e.RowIndex];
+      Color backColor = GetDataPointColor(currentCorrelation[rowIndex, e.ColumnIndex], currentCorrelation.Minimum, currentCorrelation.Maximum);
+      using (Brush backColorBrush = new SolidBrush(backColor)) {
+        e.Graphics.FillRectangle(backColorBrush, e.CellBounds);
+      }
+      e.PaintContent(e.CellBounds);
+      e.Handled = true;
+    }
+
+    protected virtual Color GetDataPointColor(double value, double min, double max) {
+      IList<Color> colors = ColorGradient.Colors;
+      int index = (int)((colors.Count - 1) * (value - min) / (max - min));
+      if (index >= colors.Count) index = colors.Count - 1;
+      if (index < 0) index = 0;
+      return colors[index];
+    }
+
+    #region sort
+    protected void DataGridView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) {
+      if (Content != null) {
+        if (e.Button == MouseButtons.Left) {
+          bool addToSortedIndices = (Control.ModifierKeys & Keys.Control) == Keys.Control;
+          SortOrder newSortOrder = SortOrder.Ascending;
+          if (sortedColumnIndices.Any(x => x.Key == e.ColumnIndex)) {
+            SortOrder oldSortOrder = sortedColumnIndices.Where(x => x.Key == e.ColumnIndex).First().Value;
+            int enumLength = Enum.GetValues(typeof(SortOrder)).Length;
+            newSortOrder = oldSortOrder = (SortOrder)Enum.Parse(typeof(SortOrder), ((((int)oldSortOrder) + 1) % enumLength).ToString());
+          }
+
+          if (!addToSortedIndices)
+            sortedColumnIndices.Clear();
+
+          if (sortedColumnIndices.Any(x => x.Key == e.ColumnIndex)) {
+            int sortedIndex = sortedColumnIndices.FindIndex(x => x.Key == e.ColumnIndex);
+            if (newSortOrder != SortOrder.None)
+              sortedColumnIndices[sortedIndex] = new KeyValuePair<int, SortOrder>(e.ColumnIndex, newSortOrder);
+            else
+              sortedColumnIndices.RemoveAt(sortedIndex);
+          } else
+            if (newSortOrder != SortOrder.None)
+              sortedColumnIndices.Add(new KeyValuePair<int, SortOrder>(e.ColumnIndex, newSortOrder));
+          Sort();
+        }
+      }
+    }
+
+    protected virtual void ClearSorting() {
+      virtualRowIndices = Enumerable.Range(0, currentCorrelation.Rows).ToArray();
+      sortedColumnIndices.Clear();
+      UpdateSortGlyph();
+    }
+
+    private void Sort() {
+      virtualRowIndices = Sort(sortedColumnIndices);
+      UpdateSortGlyph();
+      UpdateRowHeaders();
+      DataGridView.Invalidate();
+    }
+
+    protected virtual int[] Sort(IEnumerable<KeyValuePair<int, SortOrder>> sortedColumns) {
+      int[] newSortedIndex = Enumerable.Range(0, currentCorrelation.Rows).ToArray();
+      if (sortedColumns.Count() != 0) {
+        rowComparer.SortedIndices = sortedColumns;
+        rowComparer.Matrix = currentCorrelation;
+        Array.Sort(newSortedIndex, rowComparer);
+      }
+      return newSortedIndex;
+    }
+    private void UpdateSortGlyph() {
+      foreach (DataGridViewColumn col in this.DataGridView.Columns)
+        col.HeaderCell.SortGlyphDirection = SortOrder.None;
+      foreach (KeyValuePair<int, SortOrder> p in sortedColumnIndices)
+        this.DataGridView.Columns[p.Key].HeaderCell.SortGlyphDirection = p.Value;
+    }
+    #endregion
+
+    #region copy
+    protected void DataGridView_KeyDown(object sender, KeyEventArgs e) {
+      if (e.Control && e.KeyCode == Keys.C)
+        CopyValuesFromDataGridView();
+    }
+
+    private void CopyValuesFromDataGridView() {
+      if (DataGridView.SelectedCells.Count == 0) return;
+      StringBuilder s = new StringBuilder();
+      int minRowIndex = DataGridView.SelectedCells[0].RowIndex;
+      int maxRowIndex = DataGridView.SelectedCells[DataGridView.SelectedCells.Count - 1].RowIndex;
+      int minColIndex = DataGridView.SelectedCells[0].ColumnIndex;
+      int maxColIndex = DataGridView.SelectedCells[DataGridView.SelectedCells.Count - 1].ColumnIndex;
+
+      if (minRowIndex > maxRowIndex) {
+        int temp = minRowIndex;
+        minRowIndex = maxRowIndex;
+        maxRowIndex = temp;
+      }
+      if (minColIndex > maxColIndex) {
+        int temp = minColIndex;
+        minColIndex = maxColIndex;
+        maxColIndex = temp;
+      }
+
+      bool addRowNames = DataGridView.AreAllCellsSelected(false) && currentCorrelation.RowNames.Count() > 0;
+      bool addColumnNames = DataGridView.AreAllCellsSelected(false) && currentCorrelation.ColumnNames.Count() > 0;
+
+      //add colum names
+      if (addColumnNames) {
+        if (addRowNames)
+          s.Append('\t');
+
+        DataGridViewColumn column = DataGridView.Columns.GetFirstColumn(DataGridViewElementStates.Visible);
+        while (column != null) {
+          s.Append(column.HeaderText);
+          s.Append('\t');
+          column = DataGridView.Columns.GetNextColumn(column, DataGridViewElementStates.Visible, DataGridViewElementStates.None);
+        }
+        s.Remove(s.Length - 1, 1); //remove last tab
+        s.Append(Environment.NewLine);
+      }
+
+      for (int i = minRowIndex; i <= maxRowIndex; i++) {
+        int rowIndex = this.virtualRowIndices[i];
+        if (addRowNames) {
+          s.Append(currentCorrelation.RowNames.ElementAt(rowIndex));
+          s.Append('\t');
+        }
+
+        DataGridViewColumn column = DataGridView.Columns.GetFirstColumn(DataGridViewElementStates.Visible);
+        while (column != null) {
+          DataGridViewCell cell = DataGridView[column.Index, i];
+          if (cell.Selected) {
+            s.Append(currentCorrelation[rowIndex, column.Index]);
+            s.Append('\t');
+          }
+
+          column = DataGridView.Columns.GetNextColumn(column, DataGridViewElementStates.Visible, DataGridViewElementStates.None);
+        }
+        s.Remove(s.Length - 1, 1); //remove last tab
+        s.Append(Environment.NewLine);
+      }
+      Clipboard.SetText(s.ToString());
+    }
+    #endregion
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/FeatureCorrelation/AbstractFeatureCorrelationView.resx
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/FeatureCorrelation/AbstractFeatureCorrelationView.resx	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/FeatureCorrelation/AbstractFeatureCorrelationView.resx	(revision 8585)
@@ -0,0 +1,1022 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="PictureBox.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        Qk0S0gAAAAAAADYAAAAoAAAAMQAAAGsBAAABABgAAAAAAAAAAADEDgAAxA4AAAAAAAAAAAAA/wAe/wAe
+        /wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe
+        /wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe
+        /wAe/wAe/wAe/wAe/wAe/wAe/wAeAP8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8A
+        G/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8A
+        G/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AGwD/ABj/ABj/ABj/
+        ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/
+        ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/
+        ABj/ABj/ABj/ABj/ABj/ABgA/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV
+        /wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV
+        /wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAVAP8AEv8AEv8AEv8AEv8A
+        Ev8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8A
+        Ev8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8A
+        Ev8AEv8AEv8AEv8AEgD/AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//
+        AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//
+        AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA8A/wAM/wAM/wAM/wAM/wAM/wAM
+        /wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM
+        /wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM
+        /wAM/wAM/wAMAP8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8A
+        Cf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8A
+        Cf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACQD/AAb/AAb/AAb/AAb/AAb/AAb/AAb/
+        AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/
+        AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/
+        AAb/AAYA/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG
+        /wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG
+        /wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAGAP8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8A
+        A/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8A
+        A/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8A
+        AwD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/
+        AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/
+        AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAAA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA
+        /wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA
+        /wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMAAP8G
+        AP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8G
+        AP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8G
+        AP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAAD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/
+        CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/
+        CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQAA/wwA/wwA
+        /wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA
+        /wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA
+        /wwA/wwA/wwA/wwA/wwA/wwA/wwAAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8P
+        AP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8P
+        AP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAAD/EgD/EgD/EgD/
+        EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/
+        EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/
+        EgD/EgD/EgD/EgD/EgD/EgAA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA
+        /xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA
+        /xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUAAP8YAP8YAP8YAP8YAP8Y
+        AP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8Y
+        AP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8Y
+        AP8YAP8YAP8YAP8YAAD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/
+        GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/
+        GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwAA/x4A/x4A/x4A/x4A/x4A/x4A
+        /x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A
+        /x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A
+        /x4A/x4A/x4AAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8h
+        AP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8h
+        AP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/
+        JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/
+        JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/
+        JAD/JAAA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA
+        /ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA
+        /ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycAAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8q
+        AP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8q
+        AP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8q
+        AAD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/
+        LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/
+        LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA
+        /zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA
+        /zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAAAP8z
+        AP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8z
+        AP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8z
+        AP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAAD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/
+        NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/
+        NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgAA/zkA/zkA
+        /zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA
+        /zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA
+        /zkA/zkA/zkA/zkA/zkA/zkA/zkAAP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88
+        AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88
+        AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AAD/PwD/PwD/PwD/
+        PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/
+        PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/
+        PwD/PwD/PwD/PwD/PwD/PwAA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA
+        /0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA
+        /0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IAAP9FAP9FAP9FAP9FAP9F
+        AP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9F
+        AP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9F
+        AP9FAP9FAP9FAP9FAAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/
+        SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/
+        SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAAA/0sA/0sA/0sA/0sA/0sA/0sA
+        /0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA
+        /0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA
+        /0sA/0sA/0sAAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9L
+        AP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9L
+        AP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAAD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/
+        TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/
+        TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/
+        TgD/TgAA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA
+        /1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA
+        /1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EAAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9U
+        AP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9U
+        AP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9U
+        AAD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/
+        VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/
+        VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwAA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA
+        /1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA
+        /1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oAAP9d
+        AP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9d
+        AP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9d
+        AP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/
+        YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/
+        YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAAA/2MA/2MA
+        /2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA
+        /2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA
+        /2MA/2MA/2MA/2MA/2MA/2MA/2MAAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9m
+        AP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9m
+        AP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAAD/aQD/aQD/aQD/
+        aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/
+        aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/
+        aQD/aQD/aQD/aQD/aQD/aQAA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA
+        /2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA
+        /2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wAAP9vAP9vAP9vAP9vAP9v
+        AP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9v
+        AP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9v
+        AP9vAP9vAP9vAP9vAAD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/
+        cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/
+        cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgAA/3UA/3UA/3UA/3UA/3UA/3UA
+        /3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA
+        /3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA
+        /3UA/3UA/3UAAP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94
+        AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94
+        AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AAD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/
+        ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/
+        ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/
+        ewD/ewAA/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A
+        /34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A
+        /34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34AAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+B
+        AP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+B
+        AP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+B
+        AAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/
+        hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/
+        hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAAA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA
+        /4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA
+        /4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cAAP+K
+        AP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+K
+        AP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+K
+        AP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAAD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/
+        jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/
+        jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQAA/5AA/5AA
+        /5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA
+        /5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA
+        /5AA/5AA/5AA/5AA/5AA/5AA/5AAAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+T
+        AP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+T
+        AP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAAD/lgD/lgD/lgD/
+        lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/
+        lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/
+        lgD/lgD/lgD/lgD/lgD/lgAA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA
+        /5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA
+        /5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kAAP+ZAP+ZAP+ZAP+ZAP+Z
+        AP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+Z
+        AP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+Z
+        AP+ZAP+ZAP+ZAP+ZAAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/
+        nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/
+        nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAAA/58A/58A/58A/58A/58A/58A
+        /58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A
+        /58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A
+        /58A/58A/58AAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+i
+        AP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+i
+        AP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAAD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/
+        pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/
+        pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/
+        pQD/pQAA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA
+        /6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA
+        /6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gAAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+r
+        AP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+r
+        AP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+r
+        AAD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/
+        rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/
+        rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgAA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA
+        /7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA
+        /7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EAAP+0
+        AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0
+        AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0
+        AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AAD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/
+        twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/
+        twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twAA/7oA/7oA
+        /7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA
+        /7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA
+        /7oA/7oA/7oA/7oA/7oA/7oA/7oAAP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9
+        AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9
+        AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AAD/wAD/wAD/wAD/
+        wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/
+        wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/
+        wAD/wAD/wAD/wAD/wAD/wAAA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA
+        /8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA
+        /8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MAAP/GAP/GAP/GAP/GAP/G
+        AP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/G
+        AP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/G
+        AP/GAP/GAP/GAP/GAAD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/
+        yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/
+        yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQAA/8wA/8wA/8wA/8wA/8wA/8wA
+        /8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA
+        /8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA
+        /8wA/8wA/8wAAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/P
+        AP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/P
+        AP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAAD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/
+        0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/
+        0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/
+        0gD/0gAA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA
+        /9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA
+        /9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UAAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/Y
+        AP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/Y
+        AP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/Y
+        AAD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/
+        2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/
+        2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wAA/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A
+        /94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A
+        /94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94AAP/h
+        AP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/h
+        AP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/h
+        AP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAAD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/
+        5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/
+        5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AAA/+cA/+cA
+        /+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA
+        /+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA
+        /+cA/+cA/+cA/+cA/+cA/+cA/+cAAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/n
+        AP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/n
+        AP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAAD/6gD/6gD/6gD/
+        6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/
+        6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/
+        6gD/6gD/6gD/6gD/6gD/6gAA/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A
+        /+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A
+        /+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0AAP/wAP/wAP/wAP/wAP/w
+        AP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/w
+        AP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/w
+        AP/wAP/wAP/wAP/wAAD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/
+        8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/
+        8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wAA//YA//YA//YA//YA//YA//YA
+        //YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA
+        //YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA
+        //YA//YA//YAAP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5
+        AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5
+        AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AAD//AD//AD//AD//AD//AD//AD//AD/
+        /AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD/
+        /AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD/
+        /AD//AAA//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A
+        //8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A
+        //8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8AAPz/APz/APz/APz/APz/APz/APz/APz/APz/
+        APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/
+        APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/
+        AAD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5
+        /wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5
+        /wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wAA9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A
+        9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A
+        9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8AAPP/
+        APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/
+        APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/
+        APP/APP/APP/APP/APP/APP/APP/APP/AADw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw
+        /wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw
+        /wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wAA7f8A7f8A
+        7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A
+        7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A
+        7f8A7f8A7f8A7f8A7f8A7f8A7f8AAOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/
+        AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/
+        AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AADn/wDn/wDn/wDn
+        /wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn
+        /wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn
+        /wDn/wDn/wDn/wDn/wDn/wAA5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A
+        5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A
+        5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8AAOH/AOH/AOH/AOH/AOH/
+        AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/
+        AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/
+        AOH/AOH/AOH/AOH/AADe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe
+        /wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe
+        /wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wAA2/8A2/8A2/8A2/8A2/8A2/8A
+        2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A
+        2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A
+        2/8A2/8A2/8AANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/
+        ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/
+        ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/AADV/wDV/wDV/wDV/wDV/wDV/wDV/wDV
+        /wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV
+        /wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV
+        /wDV/wAA0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A
+        0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A
+        0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8AAM//AM//AM//AM//AM//AM//AM//AM//AM//
+        AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//
+        AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//
+        AADM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM
+        /wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM
+        /wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wAAyf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8A
+        yf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8A
+        yf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8AAMb/
+        AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/
+        AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/
+        AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AADG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG
+        /wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG
+        /wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wAAw/8Aw/8A
+        w/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8A
+        w/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8A
+        w/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8AAMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/
+        AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/
+        AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AAC9/wC9/wC9/wC9
+        /wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9
+        /wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9
+        /wC9/wC9/wC9/wC9/wC9/wAAuv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8A
+        uv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8A
+        uv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8AALf/ALf/ALf/ALf/ALf/
+        ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/
+        ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/
+        ALf/ALf/ALf/ALf/AAC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0
+        /wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0
+        /wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wAAsf8Asf8Asf8Asf8Asf8Asf8A
+        sf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8A
+        sf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8A
+        sf8Asf8Asf8AAK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/
+        AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/
+        AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AACr/wCr/wCr/wCr/wCr/wCr/wCr/wCr
+        /wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr
+        /wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr
+        /wCr/wAAqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8A
+        qP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8A
+        qP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AAKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/
+        AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/
+        AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/
+        AACi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi
+        /wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi
+        /wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wAAn/8An/8An/8An/8An/8An/8An/8An/8An/8An/8A
+        n/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8A
+        n/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8AAJz/
+        AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/
+        AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/
+        AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AACZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ
+        /wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ
+        /wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wAAlv8Alv8A
+        lv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8A
+        lv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8A
+        lv8Alv8Alv8Alv8Alv8Alv8Alv8AAJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/
+        AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/
+        AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AACQ/wCQ/wCQ/wCQ
+        /wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ
+        /wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ
+        /wCQ/wCQ/wCQ/wCQ/wCQ/wAAjf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8A
+        jf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8A
+        jf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8AAIr/AIr/AIr/AIr/AIr/
+        AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/
+        AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/
+        AIr/AIr/AIr/AIr/AACH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH
+        /wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH
+        /wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wAAhP8AhP8AhP8AhP8AhP8AhP8A
+        hP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8A
+        hP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8A
+        hP8AhP8AhP8AAIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/
+        AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/
+        AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AAB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+
+        /wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+
+        /wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+
+        /wB+/wAAe/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8A
+        e/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8A
+        e/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8AAHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/
+        AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/
+        AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/
+        AAB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4
+        /wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4
+        /wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wAAdf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8A
+        df8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8A
+        df8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8AAHL/
+        AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/
+        AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/
+        AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AABv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv
+        /wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv
+        /wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wAAbP8AbP8A
+        bP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8A
+        bP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8A
+        bP8AbP8AbP8AbP8AbP8AbP8AbP8AAGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/
+        AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/
+        AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AABm/wBm/wBm/wBm
+        /wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm
+        /wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm
+        /wBm/wBm/wBm/wBm/wBm/wAAY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8A
+        Y/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8A
+        Y/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AAGD/AGD/AGD/AGD/AGD/
+        AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/
+        AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/
+        AGD/AGD/AGD/AGD/AABd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd
+        /wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd
+        /wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wAAWv8AWv8AWv8AWv8AWv8AWv8A
+        Wv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8A
+        Wv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8A
+        Wv8AWv8AWv8AAFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/
+        AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/
+        AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AABU/wBU/wBU/wBU/wBU/wBU/wBU/wBU
+        /wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU
+        /wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU
+        /wBU/wAAUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8A
+        Uf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8A
+        Uf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AAE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/
+        AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/
+        AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/
+        AABL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL
+        /wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL
+        /wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wAASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8A
+        SP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8A
+        SP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8AAEX/
+        AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/
+        AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/
+        AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AABC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC
+        /wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC
+        /wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wAAP/8AP/8A
+        P/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8A
+        P/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8A
+        P/8AP/8AP/8AP/8AP/8AP/8AP/8AADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/
+        ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/
+        ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/AAA5/wA5/wA5/wA5
+        /wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5
+        /wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5
+        /wA5/wA5/wA5/wA5/wA5/wAANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8A
+        Nv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8A
+        Nv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8AADP/ADP/ADP/ADP/ADP/
+        ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/
+        ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/
+        ADP/ADP/ADP/ADP/AAAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw
+        /wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw
+        /wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAALf8ALf8ALf8ALf8ALf8ALf8A
+        Lf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8A
+        Lf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8A
+        Lf8ALf8ALf8AACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/
+        ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/
+        ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/AAAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq
+        /wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq
+        /wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq
+        /wAq/wAAJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8A
+        J/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8A
+        J/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/
+        ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/
+        ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/
+        AAAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh
+        /wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh
+        /wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAAHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8A
+        Hv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8A
+        Hv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AABv/
+        ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/
+        ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/
+        ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/AAAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY
+        /wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY
+        /wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAAFf8AFf8A
+        Ff8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8A
+        Ff8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8A
+        Ff8AFf8AFf8AFf8AFf8AFf8AFf8AABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/
+        ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/
+        ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/AAAP/wAP/wAP/wAP
+        /wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP
+        /wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP
+        /wAP/wAP/wAP/wAP/wAP/wAADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8A
+        DP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8A
+        DP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8AAAn/AAn/AAn/AAn/AAn/
+        AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/
+        AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/
+        AAn/AAn/AAn/AAn/AAAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG
+        /wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG
+        /wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAAA/8AA/8AA/8AA/8AA/8AA/8A
+        A/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8A
+        A/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8A
+        A/8AA/8AA/8AAAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/
+        AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/
+        AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAAA/wMA/wMA/wMA/wMA/wMA/wMA/wMA
+        /wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA
+        /wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA
+        /wMA/wMAAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8G
+        AP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8G
+        AP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAAD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/
+        CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/
+        CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/
+        CQAA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA
+        /wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA
+        /wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwAAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8P
+        AP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8P
+        AP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAAD/
+        EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/
+        EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/
+        EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgAA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA
+        /xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA
+        /xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUAAP8YAP8Y
+        AP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8Y
+        AP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8Y
+        AP8YAP8YAP8YAP8YAP8YAP8YAP8YAAD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/
+        GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/
+        GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwAA/x4A/x4A/x4A
+        /x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A
+        /x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A
+        /x4A/x4A/x4A/x4A/x4A/x4AAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8h
+        AP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8h
+        AP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAAD/JAD/JAD/JAD/JAD/
+        JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/
+        JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/
+        JAD/JAD/JAD/JAD/JAAA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA
+        /ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA
+        /ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycAAP8nAP8nAP8nAP8nAP8nAP8n
+        AP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8n
+        AP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8n
+        AP8nAP8nAP8nAAD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/
+        KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/
+        KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgAA/y0A/y0A/y0A/y0A/y0A/y0A/y0A
+        /y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A
+        /y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A
+        /y0A/y0AAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8w
+        AP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8w
+        AP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAAD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/
+        MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/
+        MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/
+        MwAA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA
+        /zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA
+        /zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYAAP85AP85AP85AP85AP85AP85AP85AP85AP85AP85
+        AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85
+        AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AAD/
+        PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/
+        PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/
+        PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAAA/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A
+        /z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A
+        /z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8AAP9CAP9C
+        AP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9C
+        AP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9C
+        AP9CAP9CAP9CAP9CAP9CAP9CAP9CAAD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/
+        RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/
+        RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQAA/0gA/0gA/0gA
+        /0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA
+        /0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA
+        /0gA/0gA/0gA/0gA/0gA/0gAAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9L
+        AP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9L
+        AP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAAD/TgD/TgD/TgD/TgD/
+        TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/
+        TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/
+        TgD/TgD/TgD/TgD/TgAA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA
+        /1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA
+        /1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EAAP9UAP9UAP9UAP9UAP9UAP9U
+        AP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9U
+        AP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9U
+        AP9UAP9UAP9UAAD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/
+        VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/
+        VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwAA/1oA/1oA/1oA/1oA/1oA/1oA/1oA
+        /1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA
+        /1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA
+        /1oA/1oAAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9d
+        AP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9d
+        AP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/
+        YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/
+        YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/
+        YAAA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA
+        /2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA
+        /2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MAAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9m
+        AP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9m
+        AP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAAD/
+        aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/
+        aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/
+        aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQAA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA
+        /2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA
+        /2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wAAP9vAP9v
+        AP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9v
+        AP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9v
+        AP9vAP9vAP9vAP9vAP9vAP9vAP9vAAD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/
+        cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/
+        cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgAA/3UA/3UA/3UA
+        /3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA
+        /3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA
+        /3UA/3UA/3UA/3UA/3UA/3UAAP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91
+        AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91
+        AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AAD/eAD/eAD/eAD/eAD/
+        eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/
+        eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/
+        eAD/eAD/eAD/eAD/eAAA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA
+        /3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA
+        /3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sAAP9+AP9+AP9+AP9+AP9+AP9+
+        AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+
+        AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+
+        AP9+AP9+AP9+AAD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/
+        gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/
+        gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQAA/4QA/4QA/4QA/4QA/4QA/4QA/4QA
+        /4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA
+        /4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA
+        /4QA/4QAAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+H
+        AP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+H
+        AP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAAD/igD/igD/igD/igD/igD/igD/igD/igD/
+        igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/
+        igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/
+        igAA/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A
+        /40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A
+        /40A/40A/40A/40A/40A/40A/40A/40A/40A/40AAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+Q
+        AP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+Q
+        AP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAAD/
+        kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/
+        kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/
+        kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwAA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA
+        /5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA
+        /5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YAAP+ZAP+Z
+        AP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+Z
+        AP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+Z
+        AP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/
+        nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/
+        nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAAA/58A/58A/58A
+        /58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A
+        /58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A
+        /58A/58A/58A/58A/58A/58AAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+i
+        AP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+i
+        AP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAAD/pQD/pQD/pQD/pQD/
+        pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/
+        pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/
+        pQD/pQD/pQD/pQD/pQAA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA
+        /6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA
+        /6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gAAP+rAP+rAP+rAP+rAP+rAP+r
+        AP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+r
+        AP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+r
+        AP+rAP+rAP+rAAD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/
+        rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/
+        rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgAA/7EA/7EA/7EA/7EA/7EA/7EA/7EA
+        /7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA
+        /7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA
+        /7EA/7EAAP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0
+        AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0
+        AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AAD/twD/twD/twD/twD/twD/twD/twD/twD/
+        twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/
+        twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/
+        twAA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA
+        /7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA
+        /7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oAAP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9
+        AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9
+        AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AAD/
+        wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/
+        wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/
+        wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAAA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA
+        /8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA
+        /8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MAAP/DAP/D
+        AP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/D
+        AP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/D
+        AP/DAP/DAP/DAP/DAP/DAP/DAP/DAAD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/
+        xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/
+        xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgAA/8kA/8kA/8kA
+        /8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA
+        /8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA
+        /8kA/8kA/8kA/8kA/8kA/8kAAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/M
+        AP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/M
+        AP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAAD/zwD/zwD/zwD/zwD/
+        zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/
+        zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/
+        zwD/zwD/zwD/zwD/zwAA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA
+        /9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA
+        /9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IAAP/VAP/VAP/VAP/VAP/VAP/V
+        AP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/V
+        AP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/V
+        AP/VAP/VAP/VAAD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/
+        2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/
+        2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AAA/9sA/9sA/9sA/9sA/9sA/9sA/9sA
+        /9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA
+        /9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA
+        /9sA/9sAAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/e
+        AP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/e
+        AP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAAD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/
+        4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/
+        4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/
+        4QAA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA
+        /+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA
+        /+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QAAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/n
+        AP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/n
+        AP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAAD/
+        6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/
+        6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/
+        6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gAA/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A
+        /+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A
+        /+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0AAP/wAP/w
+        AP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/w
+        AP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/w
+        AP/wAP/wAP/wAP/wAP/wAP/wAP/wAAD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/
+        8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/
+        8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wAA//YA//YA//YA
+        //YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA
+        //YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA
+        //YA//YA//YA//YA//YA//YAAP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5
+        AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5
+        AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AAD//AD//AD//AD//AD/
+        /AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD/
+        /AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD/
+        /AD//AD//AD//AD//AAA//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A
+        //8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A
+        //8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8AAPz/APz/APz/APz/APz/APz/
+        APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/
+        APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/
+        APz/APz/APz/AAD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5
+        /wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5
+        /wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wAA9v8A9v8A9v8A9v8A9v8A9v8A9v8A
+        9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A
+        9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A
+        9v8A9v8AAPP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/
+        APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/
+        APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/AADw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw
+        /wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw
+        /wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw
+        /wAA7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A
+        7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A
+        7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8AAOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/
+        AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/
+        AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AADq
+        /wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq
+        /wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq
+        /wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wAA5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A
+        5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A
+        5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8AAOT/AOT/
+        AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/
+        AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/
+        AOT/AOT/AOT/AOT/AOT/AOT/AOT/AADh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh
+        /wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh
+        /wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wAA3v8A3v8A3v8A
+        3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A
+        3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A
+        3v8A3v8A3v8A3v8A3v8A3v8AANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/
+        ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/
+        ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/AADY/wDY/wDY/wDY/wDY
+        /wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY
+        /wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY
+        /wDY/wDY/wDY/wDY/wAA1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A
+        1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A
+        1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8AANL/ANL/ANL/ANL/ANL/ANL/
+        ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/
+        ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/
+        ANL/ANL/ANL/AADP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP
+        /wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP
+        /wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wAAzP8AzP8AzP8AzP8AzP8AzP8AzP8A
+        zP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8A
+        zP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8A
+        zP8AzP8AAMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/
+        AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/
+        AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AADG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG
+        /wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG
+        /wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG
+        /wAAw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8A
+        w/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8A
+        w/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8AAMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/
+        AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/
+        AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AAC9
+        /wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9
+        /wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9
+        /wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wAAuv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8A
+        uv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8A
+        uv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8AALf/ALf/
+        ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/
+        ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/
+        ALf/ALf/ALf/ALf/ALf/ALf/ALf/AAC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0
+        /wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0
+        /wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wAAsf8Asf8Asf8A
+        sf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8A
+        sf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8A
+        sf8Asf8Asf8Asf8Asf8Asf8AAK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/
+        AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/
+        AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AACr/wCr/wCr/wCr/wCr
+        /wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr
+        /wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr
+        /wCr/wCr/wCr/wCr/wAAqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8A
+        qP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8A
+        qP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AAKX/AKX/AKX/AKX/AKX/AKX/
+        AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/
+        AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/
+        AKX/AKX/AKX/AACi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi
+        /wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi
+        /wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wAAn/8An/8An/8An/8An/8An/8An/8A
+        n/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8A
+        n/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8A
+        n/8An/8AAJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/
+        AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/
+        AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AACc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc
+        /wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc
+        /wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc
+        /wAAmf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8A
+        mf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8A
+        mf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8AAJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/
+        AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/
+        AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AACT
+        /wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT
+        /wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT
+        /wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wAAkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8A
+        kP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8A
+        kP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AAI3/AI3/
+        AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/
+        AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/
+        AI3/AI3/AI3/AI3/AI3/AI3/AI3/AACK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK
+        /wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK
+        /wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wAAh/8Ah/8Ah/8A
+        h/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8A
+        h/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8A
+        h/8Ah/8Ah/8Ah/8Ah/8Ah/8AAIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/
+        AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/
+        AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AACB/wCB/wCB/wCB/wCB
+        /wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB
+        /wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB
+        /wCB/wCB/wCB/wCB/wAAfv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8A
+        fv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8A
+        fv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8AAHv/AHv/AHv/AHv/AHv/AHv/
+        AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/
+        AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/
+        AHv/AHv/AHv/AAB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4
+        /wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4
+        /wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wAAdf8Adf8Adf8Adf8Adf8Adf8Adf8A
+        df8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8A
+        df8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8A
+        df8Adf8AAHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/
+        AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/
+        AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AABv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv
+        /wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv
+        /wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv
+        /wAAbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8A
+        bP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8A
+        bP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AAGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/
+        AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/
+        AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AABm
+        /wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm
+        /wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm
+        /wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wAAY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8A
+        Y/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8A
+        Y/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AAGD/AGD/
+        AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/
+        AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/
+        AGD/AGD/AGD/AGD/AGD/AGD/AGD/AABd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd
+        /wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd
+        /wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wAAWv8AWv8AWv8A
+        Wv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8A
+        Wv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8A
+        Wv8AWv8AWv8AWv8AWv8AWv8AAFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/
+        AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/
+        AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AABU/wBU/wBU/wBU/wBU
+        /wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU
+        /wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU
+        /wBU/wBU/wBU/wBU/wAAUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8A
+        Uf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8A
+        Uf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AAE7/AE7/AE7/AE7/AE7/AE7/
+        AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/
+        AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/
+        AE7/AE7/AE7/AABO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO
+        /wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO
+        /wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wAAS/8AS/8AS/8AS/8AS/8AS/8AS/8A
+        S/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8A
+        S/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8A
+        S/8AS/8AAEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/
+        AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/
+        AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AABF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF
+        /wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF
+        /wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF
+        /wAAQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8A
+        Qv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8A
+        Qv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AAD//AD//AD//AD//AD//AD//AD//AD//AD//AD//
+        AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//
+        AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AAA8
+        /wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8
+        /wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8
+        /wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wAAOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8A
+        Of8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8A
+        Of8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AADb/ADb/
+        ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/
+        ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/
+        ADb/ADb/ADb/ADb/ADb/ADb/ADb/AAAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz
+        /wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz
+        /wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAAMP8AMP8AMP8A
+        MP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8A
+        MP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8A
+        MP8AMP8AMP8AMP8AMP8AMP8AAC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/
+        AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/
+        AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AAAq/wAq/wAq/wAq/wAq
+        /wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq
+        /wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq
+        /wAq/wAq/wAq/wAq/wAAJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8A
+        J/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8A
+        J/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AACT/ACT/ACT/ACT/ACT/ACT/
+        ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/
+        ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/
+        ACT/ACT/ACT/AAAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh
+        /wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh
+        /wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAAHv8AHv8AHv8AHv8AHv8AHv8AHv8A
+        Hv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8A
+        Hv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8A
+        Hv8AHv8AABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/
+        ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/
+        ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/AAAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY
+        /wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY
+        /wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY
+        /wAAFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8A
+        Ff8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8A
+        Ff8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/
+        ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/
+        ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/AAAP
+        /wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP
+        /wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP
+        /wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8A
+        DP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8A
+        DP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8AAAn/AAn/
+        AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/
+        AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/
+        AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG
+        /wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG
+        /wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAAA/8AA/8AA/8A
+        A/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8A
+        A/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8A
+        A/8AA/8AA/8AA/8AA/8AA/8A
+</value>
+  </data>
+</root>
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/FeatureCorrelation/FeatureCorrelationCache.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/FeatureCorrelation/FeatureCorrelationCache.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/FeatureCorrelation/FeatureCorrelationCache.cs	(revision 8585)
@@ -0,0 +1,59 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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 System;
+using System.Collections.Generic;
+using HeuristicLab.PluginInfrastructure;
+using FCE = HeuristicLab.Problems.DataAnalysis.FeatureCorrelationEnums;
+
+namespace HeuristicLab.Problems.DataAnalysis.Views {
+  [NonDiscoverableType]
+  internal class FeatureCorrelationCache : Object {
+    private Dictionary<FCE.CorrelationCalculators, Dictionary<FCE.Partitions, double[,]>> correlationsCache;
+
+    public FeatureCorrelationCache()
+      : base() {
+      InitializeCaches();
+    }
+
+    private void InitializeCaches() {
+      correlationsCache = new Dictionary<FCE.CorrelationCalculators, Dictionary<FCE.Partitions, double[,]>>();
+      foreach (var calc in FCE.EnumToList<FCE.CorrelationCalculators>()) {
+        correlationsCache.Add(calc, new Dictionary<FCE.Partitions, double[,]>());
+      }
+    }
+
+    public void Reset() {
+      InitializeCaches();
+    }
+
+    public double[,] GetCorrelation(FCE.CorrelationCalculators calc, FCE.Partitions partition) {
+      double[,] corr;
+      correlationsCache[calc].TryGetValue(partition, out corr);
+      return corr;
+    }
+
+    public void SetCorrelation(FCE.CorrelationCalculators calc, FCE.Partitions partition, double[,] correlation) {
+      correlationsCache[calc][partition] = correlation;
+    }
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/FeatureCorrelation/FeatureCorrelationTimeframeCache.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/FeatureCorrelation/FeatureCorrelationTimeframeCache.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/FeatureCorrelation/FeatureCorrelationTimeframeCache.cs	(revision 8585)
@@ -0,0 +1,62 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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 System;
+using System.Collections.Generic;
+using HeuristicLab.PluginInfrastructure;
+using FCE = HeuristicLab.Problems.DataAnalysis.FeatureCorrelationEnums;
+
+namespace HeuristicLab.Problems.DataAnalysis.Views {
+  [NonDiscoverableType]
+  internal class FeatureCorrelationTimeframeCache : Object {
+    private Dictionary<FCE.CorrelationCalculators, Dictionary<FCE.Partitions, Dictionary<string, double[,]>>> timeFrameCorrelationsCache;
+
+    public FeatureCorrelationTimeframeCache()
+      : base() {
+      InitializeCaches();
+    }
+
+    private void InitializeCaches() {
+      timeFrameCorrelationsCache = new Dictionary<FCE.CorrelationCalculators, Dictionary<FCE.Partitions, Dictionary<string, double[,]>>>();
+      foreach (var calc in FCE.EnumToList<FCE.CorrelationCalculators>()) {
+        timeFrameCorrelationsCache.Add(calc, new Dictionary<FCE.Partitions, Dictionary<string, double[,]>>());
+        foreach (var part in FCE.EnumToList<FCE.Partitions>()) {
+          timeFrameCorrelationsCache[calc].Add(part, new Dictionary<string, double[,]>());
+        }
+      }
+    }
+
+    public void Reset() {
+      InitializeCaches();
+    }
+
+    public double[,] GetTimeframeCorrelation(FCE.CorrelationCalculators calc, FCE.Partitions partition, string variable) {
+      double[,] corr;
+      timeFrameCorrelationsCache[calc][partition].TryGetValue(variable, out corr);
+      return corr;
+    }
+
+    public void SetTimeframeCorrelation(FCE.CorrelationCalculators calc, FCE.Partitions partition, string variable, double[,] correlation) {
+      timeFrameCorrelationsCache[calc][partition][variable] = correlation;
+    }
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/FeatureCorrelation/FeatureCorrelationView.Designer.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/FeatureCorrelation/FeatureCorrelationView.Designer.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/FeatureCorrelation/FeatureCorrelationView.Designer.cs	(revision 8585)
@@ -0,0 +1,60 @@
+﻿#region License Information
+
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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
+namespace HeuristicLab.Problems.DataAnalysis.Views {
+  partial class FeatureCorrelationView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.SuspendLayout();
+      // 
+      // FeatureCorrelationView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Name = "FeatureCorrelationView";
+      this.Size = new System.Drawing.Size(569, 336);
+      this.ResumeLayout(false);
+    }
+    #endregion
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/FeatureCorrelation/FeatureCorrelationView.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/FeatureCorrelation/FeatureCorrelationView.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/FeatureCorrelation/FeatureCorrelationView.cs	(revision 8585)
@@ -0,0 +1,81 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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 System.Windows.Forms;
+using HeuristicLab.Analysis;
+using HeuristicLab.Data;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+using FCE = HeuristicLab.Problems.DataAnalysis.FeatureCorrelationEnums;
+
+namespace HeuristicLab.Problems.DataAnalysis.Views {
+  [View("Feature Correlation View")]
+  [Content(typeof(DataAnalysisProblemData), false)]
+  public partial class FeatureCorrelationView : AbstractFeatureCorrelationView {
+
+    private FeatureCorrelationCache correlationCache;
+
+    public FeatureCorrelationView()
+      : base() {
+      InitializeComponent();
+      correlationCache = new FeatureCorrelationCache();
+    }
+
+    protected override void OnContentChanged() {
+      correlationCache.Reset();
+      base.OnContentChanged();
+    }
+
+    protected override void CalculateCorrelation() {
+      if (CorrelationCalcComboBox.SelectedItem != null && PartitionComboBox.SelectedItem != null) {
+        FCE.CorrelationCalculators calc = (FCE.CorrelationCalculators)CorrelationCalcComboBox.SelectedValue;
+        FCE.Partitions partition = (FCE.Partitions)PartitionComboBox.SelectedValue;
+        DataGridView.Columns.Clear();
+        DataGridView.Enabled = false;
+        double[,] corr = correlationCache.GetCorrelation(calc, partition);
+        if (corr == null) {
+          fcc.CalculateElements(calc, partition);
+        } else {
+          SetNewCorrelation(corr, calc);
+          UpdateDataGrid();
+        }
+      }
+    }
+
+    private void SetNewCorrelation(double[,] elements, FCE.CorrelationCalculators calc) {
+      DoubleRange range = FCE.calculatorInterval[calc];
+      HeatMap hm = new HeatMap(elements, "", range.End, range.Start);
+      hm.RowNames = Content.Dataset.DoubleVariables;
+      hm.ColumnNames = Content.Dataset.DoubleVariables;
+      currentCorrelation = hm;
+    }
+
+    protected override void Content_CorrelationCalculationFinished(object sender, FeatureCorrelationCalculator.CorrelationCalculationFinishedArgs e) {
+      if (InvokeRequired) {
+        Invoke(new FeatureCorrelationCalculator.CorrelationCalculationFinishedHandler(Content_CorrelationCalculationFinished), sender, e);
+      } else {
+        correlationCache.SetCorrelation(e.Calculcator, e.Partition, e.Correlation);
+        SetNewCorrelation(e.Correlation, e.Calculcator);
+        UpdateDataGrid();
+      }
+    }
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/FeatureCorrelation/TimeframeFeatureCorrelationView.Designer.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/FeatureCorrelation/TimeframeFeatureCorrelationView.Designer.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/FeatureCorrelation/TimeframeFeatureCorrelationView.Designer.cs	(revision 8585)
@@ -0,0 +1,150 @@
+﻿#region License Information
+
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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
+namespace HeuristicLab.Problems.DataAnalysis.Views {
+  partial class TimeframeFeatureCorrelationView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.VariableSelectionLabel = new System.Windows.Forms.Label();
+      this.VariableSelectionComboBox = new System.Windows.Forms.ComboBox();
+      this.TimeFrameLabel = new System.Windows.Forms.Label();
+      this.TimeframeComboBox = new System.Windows.Forms.ComboBox();
+      ((System.ComponentModel.ISupportInitialize)(this.PictureBox)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.SplitContainer)).BeginInit();
+      this.SplitContainer.Panel1.SuspendLayout();
+      this.SplitContainer.Panel2.SuspendLayout();
+      this.SplitContainer.SuspendLayout();
+      this.CalculatingPanel.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // PartitionComboBox
+      // 
+      this.PartitionComboBox.Location = new System.Drawing.Point(344, 3);
+      this.PartitionComboBox.Size = new System.Drawing.Size(131, 21);
+      // 
+      // maximumLabel
+      // 
+      this.maximumLabel.Location = new System.Drawing.Point(487, 3);
+      // 
+      // PictureBox
+      // 
+      this.PictureBox.Location = new System.Drawing.Point(506, 31);
+      this.PictureBox.Size = new System.Drawing.Size(35, 280);
+      // 
+      // SplitContainer
+      // 
+      // 
+      // SplitContainer.Panel1
+      // 
+      this.SplitContainer.Panel1.Controls.Add(this.VariableSelectionComboBox);
+      this.SplitContainer.Panel1.Controls.Add(this.TimeframeComboBox);
+      this.SplitContainer.Panel1.Controls.Add(this.TimeFrameLabel);
+      this.SplitContainer.Panel1.Controls.Add(this.VariableSelectionLabel);
+      this.SplitContainer.SplitterDistance = 52;
+      // 
+      // CalculatingPanel
+      // 
+      this.CalculatingPanel.Location = new System.Drawing.Point(138, 82);
+      // 
+      // VariableSelectionLabel
+      // 
+      this.VariableSelectionLabel.AutoSize = true;
+      this.VariableSelectionLabel.Location = new System.Drawing.Point(0, 33);
+      this.VariableSelectionLabel.Name = "VariableSelectionLabel";
+      this.VariableSelectionLabel.Size = new System.Drawing.Size(81, 13);
+      this.VariableSelectionLabel.TabIndex = 16;
+      this.VariableSelectionLabel.Text = "Select Variable:";
+      // 
+      // VariableSelectionComboBox
+      // 
+      this.VariableSelectionComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.VariableSelectionComboBox.FormattingEnabled = true;
+      this.VariableSelectionComboBox.Location = new System.Drawing.Point(110, 30);
+      this.VariableSelectionComboBox.Name = "VariableSelectionComboBox";
+      this.VariableSelectionComboBox.Size = new System.Drawing.Size(163, 21);
+      this.VariableSelectionComboBox.TabIndex = 17;
+      this.VariableSelectionComboBox.SelectionChangeCommitted += new System.EventHandler(this.VariableSelectionComboBox_SelectedChangeCommitted);
+      // 
+      // TimeFrameLabel
+      // 
+      this.TimeFrameLabel.AutoSize = true;
+      this.TimeFrameLabel.Location = new System.Drawing.Point(279, 33);
+      this.TimeFrameLabel.Name = "TimeFrameLabel";
+      this.TimeFrameLabel.Size = new System.Drawing.Size(59, 13);
+      this.TimeFrameLabel.TabIndex = 18;
+      this.TimeFrameLabel.Text = "Timeframe:";
+      // 
+      // TimeframeComboBox
+      // 
+      this.TimeframeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.TimeframeComboBox.FormattingEnabled = true;
+      this.TimeframeComboBox.Location = new System.Drawing.Point(344, 30);
+      this.TimeframeComboBox.Name = "TimeframeComboBox";
+      this.TimeframeComboBox.Size = new System.Drawing.Size(131, 21);
+      this.TimeframeComboBox.TabIndex = 19;
+      this.TimeframeComboBox.SelectionChangeCommitted += new System.EventHandler(this.TimeframeComboBox_SelectedChangeCommitted);
+      // 
+      // TimeframeFeatureCorrelationView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Name = "TimeframeFeatureCorrelationView";
+      ((System.ComponentModel.ISupportInitialize)(this.PictureBox)).EndInit();
+      this.SplitContainer.Panel1.ResumeLayout(false);
+      this.SplitContainer.Panel1.PerformLayout();
+      this.SplitContainer.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.SplitContainer)).EndInit();
+      this.SplitContainer.ResumeLayout(false);
+      this.CalculatingPanel.ResumeLayout(false);
+      this.CalculatingPanel.PerformLayout();
+      this.ResumeLayout(false);
+
+    }
+    #endregion
+
+    protected System.Windows.Forms.Label VariableSelectionLabel;
+    protected System.Windows.Forms.ComboBox VariableSelectionComboBox;
+    protected System.Windows.Forms.Label TimeFrameLabel;
+    protected System.Windows.Forms.ComboBox TimeframeComboBox;
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/FeatureCorrelation/TimeframeFeatureCorrelationView.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/FeatureCorrelation/TimeframeFeatureCorrelationView.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/FeatureCorrelation/TimeframeFeatureCorrelationView.cs	(revision 8585)
@@ -0,0 +1,110 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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 System;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Analysis;
+using HeuristicLab.Data;
+using HeuristicLab.MainForm;
+using FCE = HeuristicLab.Problems.DataAnalysis.FeatureCorrelationEnums;
+
+namespace HeuristicLab.Problems.DataAnalysis.Views {
+  [View("Timeframe Feature Correlation View")]
+  [Content(typeof(DataAnalysisProblemData), false)]
+  public partial class TimeframeFeatureCorrelationView : AbstractFeatureCorrelationView {
+
+    private FeatureCorrelationTimeframeCache correlationTimeframCache;
+
+    public TimeframeFeatureCorrelationView() {
+      InitializeComponent();
+      TimeframeComboBox.DataSource = Enumerable.Range(0, 16).ToList<int>();
+      correlationTimeframCache = new FeatureCorrelationTimeframeCache();
+    }
+
+    protected override void OnContentChanged() {
+      correlationTimeframCache.Reset();
+      if (Content != null) {
+        VariableSelectionComboBox.DataSource = Content.Dataset.DoubleVariables.ToList();
+      }
+      base.OnContentChanged();
+    }
+
+    protected void VariableSelectionComboBox_SelectedChangeCommitted(object sender, EventArgs e) {
+      CalculateCorrelation();
+    }
+    protected void TimeframeComboBox_SelectedChangeCommitted(object sender, EventArgs e) {
+      CalculateCorrelation();
+    }
+
+    protected override void CalculateCorrelation() {
+      string variable = (string)VariableSelectionComboBox.SelectedItem;
+      if (CorrelationCalcComboBox.SelectedItem != null && PartitionComboBox.SelectedItem != null && variable != null) {
+        FCE.CorrelationCalculators calc = (FCE.CorrelationCalculators)CorrelationCalcComboBox.SelectedValue;
+        FCE.Partitions partition = (FCE.Partitions)PartitionComboBox.SelectedValue;
+        DataGridView.Columns.Clear();
+        DataGridView.Enabled = false;
+        int frames = (int)TimeframeComboBox.SelectedItem;
+        double[,] corr = correlationTimeframCache.GetTimeframeCorrelation(calc, partition, variable);
+        if (corr == null) {
+          fcc.CalculateTimeframeElements(calc, partition, variable, frames);
+        } else if (corr.GetLength(1) <= frames) {
+          fcc.CalculateTimeframeElements(calc, partition, variable, frames, corr);
+        } else {
+          SetNewCorrelation(corr, calc, frames);
+          UpdateDataGrid();
+        }
+      }
+    }
+
+    private void SetNewCorrelation(double[,] elements, FCE.CorrelationCalculators calc, int frames) {
+      double[,] neededValues = new double[elements.GetLength(0), frames + 1];
+      for (int i = 0; i < elements.GetLength(0); i++) {
+        Array.Copy(elements, i * elements.GetLength(1), neededValues, i * neededValues.GetLength(1), frames + 1);
+      }
+      SetNewCorrelation(neededValues, calc);
+    }
+
+    private void SetNewCorrelation(double[,] elements, FCE.CorrelationCalculators calc) {
+      DoubleRange range = FCE.calculatorInterval[calc];
+      HeatMap hm = new HeatMap(elements, "", range.End, range.Start);
+      hm.RowNames = Content.Dataset.DoubleVariables;
+      hm.ColumnNames = Enumerable.Range(0, elements.GetLength(1)).Select(x => x.ToString());
+      currentCorrelation = hm;
+    }
+
+    protected override void Content_CorrelationCalculationFinished(object sender, FeatureCorrelationCalculator.CorrelationCalculationFinishedArgs e) {
+      if (InvokeRequired) {
+        Invoke(new FeatureCorrelationCalculator.CorrelationCalculationFinishedHandler(Content_CorrelationCalculationFinished), sender, e);
+      } else {
+        correlationTimeframCache.SetTimeframeCorrelation(e.Calculcator, e.Partition, e.Variable, e.Correlation);
+        SetNewCorrelation(e.Correlation, e.Calculcator);
+        UpdateDataGrid();
+      }
+    }
+
+    protected override void UpdateColumnHeaders() {
+      for (int i = 0; i < DataGridView.ColumnCount; i++) {
+        DataGridView.Columns[i].HeaderText = i.ToString();
+      }
+    }
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/HeuristicLab.Problems.DataAnalysis.Views-3.4.csproj
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/HeuristicLab.Problems.DataAnalysis.Views-3.4.csproj	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/HeuristicLab.Problems.DataAnalysis.Views-3.4.csproj	(revision 8585)
@@ -131,4 +131,10 @@
       <DependentUpon>ClusteringSolutionVisualizationView.cs</DependentUpon>
     </Compile>
+    <Compile Include="FeatureCorrelation\AbstractFeatureCorrelationView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="FeatureCorrelation\AbstractFeatureCorrelationView.Designer.cs">
+      <DependentUpon>AbstractFeatureCorrelationView.cs</DependentUpon>
+    </Compile>
     <Compile Include="DataAnalysisSolutionEvaluationView.cs">
       <SubType>UserControl</SubType>
@@ -137,5 +143,19 @@
       <DependentUpon>DataAnalysisSolutionEvaluationView.cs</DependentUpon>
     </Compile>
+    <Compile Include="FeatureCorrelation\FeatureCorrelationView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="FeatureCorrelation\FeatureCorrelationView.Designer.cs">
+      <DependentUpon>FeatureCorrelationView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="FeatureCorrelation\FeatureCorrelationCache.cs" />
+    <Compile Include="FeatureCorrelation\FeatureCorrelationTimeframeCache.cs" />
     <Compile Include="Plugin.cs" />
+    <Compile Include="ProblemDataView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ProblemDataView.Designer.cs">
+      <DependentUpon>ProblemDataView.cs</DependentUpon>
+    </Compile>
     <Compile Include="Regression\RegressionEnsembleSolutionModelView.cs">
       <SubType>UserControl</SubType>
@@ -265,4 +285,10 @@
     <Compile Include="Solution Views\RegressionSolutionView.Designer.cs">
       <DependentUpon>RegressionSolutionView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="FeatureCorrelation\TimeframeFeatureCorrelationView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="FeatureCorrelation\TimeframeFeatureCorrelationView.Designer.cs">
+      <DependentUpon>TimeframeFeatureCorrelationView.cs</DependentUpon>
     </Compile>
     <None Include="HeuristicLab.snk" />
@@ -388,6 +414,9 @@
     </BootstrapperPackage>
   </ItemGroup>
+  <ItemGroup />
   <ItemGroup>
-    <Folder Include="obj\" />
+    <EmbeddedResource Include="FeatureCorrelation\AbstractFeatureCorrelationView.resx">
+      <DependentUpon>AbstractFeatureCorrelationView.cs</DependentUpon>
+    </EmbeddedResource>
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/Plugin.cs.frame
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/Plugin.cs.frame	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/Plugin.cs.frame	(revision 8585)
@@ -30,5 +30,5 @@
   [PluginDependency("HeuristicLab.ALGLIB", "3.6.0")]
   [PluginDependency("HeuristicLab.Analysis", "3.3")]
-  [PluginDependency("HeuristicLab.Analysis.Views", "3.3")]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
   [PluginDependency("HeuristicLab.Common", "3.3")]
   [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/ProblemDataView.Designer.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/ProblemDataView.Designer.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/ProblemDataView.Designer.cs	(revision 8585)
@@ -0,0 +1,67 @@
+﻿namespace HeuristicLab.Problems.DataAnalysis.Views {
+  partial class ProblemDataView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.FeatureCorrelationButton = new System.Windows.Forms.Button();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      // 
+      // FeatureCorrelationButton
+      // 
+      this.FeatureCorrelationButton.Location = new System.Drawing.Point(184, 45);
+      this.FeatureCorrelationButton.Name = "FeatureCorrelationButton";
+      this.FeatureCorrelationButton.Size = new System.Drawing.Size(121, 24);
+      this.FeatureCorrelationButton.TabIndex = 4;
+      this.FeatureCorrelationButton.Text = "Feature Correlation";
+      this.FeatureCorrelationButton.UseVisualStyleBackColor = true;
+      this.FeatureCorrelationButton.Click += new System.EventHandler(this.FeatureCorrelationButton_Click);
+      // 
+      // ProblemDataView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.FeatureCorrelationButton);
+      this.Name = "ProblemDataView";
+      this.Controls.SetChildIndex(this.parameterCollectionView, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.FeatureCorrelationButton, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.Button FeatureCorrelationButton;
+
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/ProblemDataView.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/ProblemDataView.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/ProblemDataView.cs	(revision 8585)
@@ -0,0 +1,48 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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 System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Problems.DataAnalysis.Views {
+  [View("Problem Data View")]
+  [Content(typeof(DataAnalysisProblemData), true)]
+  public partial class ProblemDataView : ParameterizedNamedItemView {
+
+    public new DataAnalysisProblemData Content {
+      get { return (DataAnalysisProblemData)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ProblemDataView() {
+      InitializeComponent();
+    }
+
+    private void FeatureCorrelationButton_Click(object sender, System.EventArgs e) {
+      ViewHost viewHost = new ViewHost();
+      viewHost.Content = (DataAnalysisProblemData)this.Content.Clone();
+      viewHost.ViewType = typeof(FeatureCorrelationView);
+      viewHost.Show();
+    }
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionSolutionLineChartView.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionSolutionLineChartView.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionSolutionLineChartView.cs	(revision 8585)
@@ -89,6 +89,8 @@
         this.chart.Series[ESTIMATEDVALUES_ALL_SERIES_NAME].LegendText = ESTIMATEDVALUES_ALL_SERIES_NAME;
         this.chart.Series[ESTIMATEDVALUES_ALL_SERIES_NAME].ChartType = SeriesChartType.FastLine;
-        this.chart.Series[ESTIMATEDVALUES_ALL_SERIES_NAME].Points.DataBindXY(allIndices, allEstimatedValues);
-        this.InsertEmptyPoints(this.chart.Series[ESTIMATEDVALUES_ALL_SERIES_NAME]);
+        if (allEstimatedValues.Count > 0) {
+          this.chart.Series[ESTIMATEDVALUES_ALL_SERIES_NAME].Points.DataBindXY(allIndices, allEstimatedValues);
+          this.InsertEmptyPoints(this.chart.Series[ESTIMATEDVALUES_ALL_SERIES_NAME]);
+        }
         this.chart.Series[ESTIMATEDVALUES_ALL_SERIES_NAME].Tag = Content;
         this.ToggleSeriesData(this.chart.Series[ESTIMATEDVALUES_ALL_SERIES_NAME]);
@@ -224,10 +226,10 @@
 
         IEnumerable<int> indices = null;
-        IEnumerable<double> predictedValues = null;
+        double[] predictedValues = null;
         switch (series.Name) {
           case ESTIMATEDVALUES_ALL_SERIES_NAME:
             indices = Enumerable.Range(0, Content.ProblemData.Dataset.Rows).Except(Content.ProblemData.TrainingIndices).Except(Content.ProblemData.TestIndices).ToArray();
             var estimatedValues = Content.EstimatedValues.ToArray();
-            predictedValues = indices.Select(index => estimatedValues[index]).ToList();
+            predictedValues = indices.Select(index => estimatedValues[index]).ToArray();
             break;
           case ESTIMATEDVALUES_TRAINING_SERIES_NAME:
@@ -240,6 +242,8 @@
             break;
         }
-        series.Points.DataBindXY(indices, predictedValues);
-        this.InsertEmptyPoints(series);
+        if (predictedValues.Length > 0) {
+          series.Points.DataBindXY(indices, predictedValues);
+          this.InsertEmptyPoints(series);
+        }
         chart.Legends[series.Legend].ForeColor = Color.Black;
         UpdateCursorInterval();
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/HeuristicLab.Problems.DataAnalysis-3.4.csproj
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/HeuristicLab.Problems.DataAnalysis-3.4.csproj	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/HeuristicLab.Problems.DataAnalysis-3.4.csproj	(revision 8585)
@@ -93,4 +93,12 @@
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="ALGLIB-3.6.0, Version=3.6.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <HintPath>..\..\bin\ALGLIB-3.6.0.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.ALGLIB-3.6.0, Version=3.6.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <HintPath>..\..\bin\HeuristicLab.ALGLIB-3.6.0.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Core">
@@ -122,4 +130,6 @@
     <Compile Include="Implementation\Clustering\ClusteringProblemData.cs" />
     <Compile Include="Implementation\Clustering\ClusteringSolution.cs" />
+    <Compile Include="Implementation\FeatureCorrelation\FeatureCorrelationCalculator.cs" />
+    <Compile Include="Implementation\FeatureCorrelation\FeatureCorrelationEnums.cs" />
     <Compile Include="Implementation\Regression\ConstantRegressionModel.cs" />
     <Compile Include="Implementation\Regression\ConstantRegressionSolution.cs" />
@@ -180,4 +190,5 @@
     <Compile Include="OnlineCalculators\OnlinePearsonsRSquaredCalculator.cs" />
     <Compile Include="Implementation\Regression\RegressionSolution.cs" />
+    <Compile Include="OnlineCalculators\SpearmansRankCorrelationCoefficientCalculator.cs" />
     <Compile Include="Plugin.cs" />
     <Compile Include="Implementation\Classification\ThresholdCalculators\AccuracyMaximizationThresholdCalculator.cs" />
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationEnsembleModel.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationEnsembleModel.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationEnsembleModel.cs	(revision 8585)
@@ -95,5 +95,5 @@
 
     IClassificationSolution IClassificationModel.CreateClassificationSolution(IClassificationProblemData problemData) {
-      return new ClassificationEnsembleSolution(models, problemData);
+      return new ClassificationEnsembleSolution(models, new ClassificationEnsembleProblemData(problemData));
     }
     #endregion
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationEnsembleSolution.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationEnsembleSolution.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationEnsembleSolution.cs	(revision 8585)
@@ -104,4 +104,7 @@
     }
 
+    public ClassificationEnsembleSolution(IClassificationProblemData problemData) :
+      this(Enumerable.Empty<IClassificationModel>(), problemData) { }
+
     public ClassificationEnsembleSolution(IEnumerable<IClassificationModel> models, IClassificationProblemData problemData)
       : this(models, problemData,
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationProblemData.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationProblemData.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationProblemData.cs	(revision 8585)
@@ -223,38 +223,34 @@
     }
 
-    private List<double> classValues;
-    public List<double> ClassValues {
+    private List<double> classValuesCache;
+    private List<double> ClassValuesCache {
       get {
-        if (classValues == null) {
-          classValues = Dataset.GetDoubleValues(TargetVariableParameter.Value.Value).Distinct().ToList();
-          classValues.Sort();
+        if (classValuesCache == null) {
+          classValuesCache = Dataset.GetDoubleValues(TargetVariableParameter.Value.Value).Distinct().OrderBy(x => x).ToList();
         }
-        return classValues;
+        return classValuesCache;
       }
     }
-    IEnumerable<double> IClassificationProblemData.ClassValues {
-      get { return ClassValues; }
-    }
-
+    public IEnumerable<double> ClassValues {
+      get { return ClassValuesCache; }
+    }
     public int Classes {
-      get { return ClassValues.Count; }
-    }
-
-    private List<string> classNames;
-    public List<string> ClassNames {
+      get { return ClassValuesCache.Count; }
+    }
+
+    private List<string> classNamesCache;
+    private List<string> ClassNamesCache {
       get {
-        if (classNames == null) {
-          classNames = new List<string>();
+        if (classNamesCache == null) {
+          classNamesCache = new List<string>();
           for (int i = 0; i < ClassNamesParameter.Value.Rows; i++)
-            classNames.Add(ClassNamesParameter.Value[i, 0]);
+            classNamesCache.Add(ClassNamesParameter.Value[i, 0]);
         }
-        return classNames;
+        return classNamesCache;
       }
     }
-    IEnumerable<string> IClassificationProblemData.ClassNames {
-      get { return ClassNames; }
-    }
-
-    private Dictionary<Tuple<double, double>, double> classificationPenaltiesCache = new Dictionary<Tuple<double, double>, double>();
+    public IEnumerable<string> ClassNames {
+      get { return ClassNamesCache; }
+    }
     #endregion
 
@@ -277,4 +273,13 @@
 
     public ClassificationProblemData() : this(defaultDataset, defaultAllowedInputVariables, defaultTargetVariable) { }
+
+    public ClassificationProblemData(IClassificationProblemData classificationProblemData)
+      : this(classificationProblemData.Dataset, classificationProblemData.AllowedInputVariables, classificationProblemData.TargetVariable) {
+      TrainingPartition.Start = classificationProblemData.TrainingPartition.Start;
+      TrainingPartition.End = classificationProblemData.TrainingPartition.End;
+      TestPartition.Start = classificationProblemData.TestPartition.Start;
+      TestPartition.End = classificationProblemData.TestPartition.End;
+    }
+
     public ClassificationProblemData(Dataset dataset, IEnumerable<string> allowedInputVariables, string targetVariable)
       : base(dataset, allowedInputVariables) {
@@ -310,14 +315,11 @@
       DeregisterParameterEvents();
 
-      classNames = null;
       ((IStringConvertibleMatrix)ClassNamesParameter.Value).Columns = 1;
-      ((IStringConvertibleMatrix)ClassNamesParameter.Value).Rows = ClassValues.Count;
+      ((IStringConvertibleMatrix)ClassNamesParameter.Value).Rows = ClassValuesCache.Count;
       for (int i = 0; i < Classes; i++)
-        ClassNamesParameter.Value[i, 0] = "Class " + ClassValues[i];
+        ClassNamesParameter.Value[i, 0] = "Class " + ClassValuesCache[i];
       ClassNamesParameter.Value.ColumnNames = new List<string>() { "ClassNames" };
       ClassNamesParameter.Value.RowNames = ClassValues.Select(s => "ClassValue: " + s);
 
-      classificationPenaltiesCache.Clear();
-      ((ValueParameter<DoubleMatrix>)ClassificationPenaltiesParameter).ReactOnValueToStringChangedAndValueItemImageChanged = false;
       ((IStringConvertibleMatrix)ClassificationPenaltiesParameter.Value).Rows = Classes;
       ((IStringConvertibleMatrix)ClassificationPenaltiesParameter.Value).Columns = Classes;
@@ -330,23 +332,22 @@
         }
       }
-      ((ValueParameter<DoubleMatrix>)ClassificationPenaltiesParameter).ReactOnValueToStringChangedAndValueItemImageChanged = true;
       RegisterParameterEvents();
     }
 
     public string GetClassName(double classValue) {
-      if (!ClassValues.Contains(classValue)) throw new ArgumentException();
-      int index = ClassValues.IndexOf(classValue);
-      return ClassNames[index];
+      if (!ClassValuesCache.Contains(classValue)) throw new ArgumentException();
+      int index = ClassValuesCache.IndexOf(classValue);
+      return ClassNamesCache[index];
     }
     public double GetClassValue(string className) {
-      if (!ClassNames.Contains(className)) throw new ArgumentException();
-      int index = ClassNames.IndexOf(className);
-      return ClassValues[index];
+      if (!ClassNamesCache.Contains(className)) throw new ArgumentException();
+      int index = ClassNamesCache.IndexOf(className);
+      return ClassValuesCache[index];
     }
     public void SetClassName(double classValue, string className) {
-      if (!classValues.Contains(classValue)) throw new ArgumentException();
-      int index = ClassValues.IndexOf(classValue);
-      ClassNames[index] = className;
+      if (!ClassValuesCache.Contains(classValue)) throw new ArgumentException();
+      int index = ClassValuesCache.IndexOf(classValue);
       ClassNamesParameter.Value[index, 0] = className;
+      // updating of class names cache is not necessary here as the parameter value fires a changed event which updates the cache
     }
 
@@ -355,11 +356,7 @@
     }
     public double GetClassificationPenalty(double correctClassValue, double estimatedClassValue) {
-      var key = Tuple.Create(correctClassValue, estimatedClassValue);
-      if (!classificationPenaltiesCache.ContainsKey(key)) {
-        int correctClassIndex = ClassValues.IndexOf(correctClassValue);
-        int estimatedClassIndex = ClassValues.IndexOf(estimatedClassValue);
-        classificationPenaltiesCache[key] = ClassificationPenaltiesParameter.Value[correctClassIndex, estimatedClassIndex];
-      }
-      return classificationPenaltiesCache[key];
+      int correctClassIndex = ClassValuesCache.IndexOf(correctClassValue);
+      int estimatedClassIndex = ClassValuesCache.IndexOf(estimatedClassValue);
+      return ClassificationPenaltiesParameter.Value[correctClassIndex, estimatedClassIndex];
     }
     public void SetClassificationPenalty(string correctClassName, string estimatedClassName, double penalty) {
@@ -367,7 +364,6 @@
     }
     public void SetClassificationPenalty(double correctClassValue, double estimatedClassValue, double penalty) {
-      var key = Tuple.Create(correctClassValue, estimatedClassValue);
-      int correctClassIndex = ClassValues.IndexOf(correctClassValue);
-      int estimatedClassIndex = ClassValues.IndexOf(estimatedClassValue);
+      int correctClassIndex = ClassValuesCache.IndexOf(correctClassValue);
+      int estimatedClassIndex = ClassValuesCache.IndexOf(estimatedClassValue);
 
       ClassificationPenaltiesParameter.Value[correctClassIndex, estimatedClassIndex] = penalty;
@@ -379,6 +375,4 @@
       ClassNamesParameter.Value.Reset += new EventHandler(Parameter_ValueChanged);
       ClassNamesParameter.Value.ItemChanged += new EventHandler<EventArgs<int, int>>(MatrixParameter_ItemChanged);
-      ClassificationPenaltiesParameter.Value.Reset += new EventHandler(Parameter_ValueChanged);
-      ClassificationPenaltiesParameter.Value.ItemChanged += new EventHandler<EventArgs<int, int>>(MatrixParameter_ItemChanged);
     }
     private void DeregisterParameterEvents() {
@@ -386,17 +380,18 @@
       ClassNamesParameter.Value.Reset -= new EventHandler(Parameter_ValueChanged);
       ClassNamesParameter.Value.ItemChanged -= new EventHandler<EventArgs<int, int>>(MatrixParameter_ItemChanged);
-      ClassificationPenaltiesParameter.Value.Reset -= new EventHandler(Parameter_ValueChanged);
-      ClassificationPenaltiesParameter.Value.ItemChanged -= new EventHandler<EventArgs<int, int>>(MatrixParameter_ItemChanged);
     }
 
     private void TargetVariableParameter_ValueChanged(object sender, EventArgs e) {
-      classValues = null;
+      classValuesCache = null;
+      classNamesCache = null;
       ResetTargetVariableDependentMembers();
       OnChanged();
     }
     private void Parameter_ValueChanged(object sender, EventArgs e) {
+      classNamesCache = null;
       OnChanged();
     }
     private void MatrixParameter_ItemChanged(object sender, EventArgs<int, int> e) {
+      classNamesCache = null;
       OnChanged();
     }
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/DiscriminantFunctionClassificationSolution.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/DiscriminantFunctionClassificationSolution.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/DiscriminantFunctionClassificationSolution.cs	(revision 8585)
@@ -51,6 +51,4 @@
       valueEvaluationCache = new Dictionary<int, double>();
       classValueEvaluationCache = new Dictionary<int, double>();
-
-      SetAccuracyMaximizingThresholds();
     }
 
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/DiscriminantFunctionClassificationSolutionBase.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/DiscriminantFunctionClassificationSolutionBase.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/DiscriminantFunctionClassificationSolutionBase.cs	(revision 8585)
@@ -94,11 +94,4 @@
     }
 
-    protected override void OnModelChanged() {
-      DeregisterEventHandler();
-      SetAccuracyMaximizingThresholds();
-      RegisterEventHandler();
-      base.OnModelChanged();
-    }
-
     protected void CalculateRegressionResults() {
       double[] estimatedTrainingValues = EstimatedTrainingValues.ToArray(); // cache values
@@ -137,25 +130,6 @@
     }
 
-    public void SetAccuracyMaximizingThresholds() {
-      double[] classValues;
-      double[] thresholds;
-      var targetClassValues = ProblemData.Dataset.GetDoubleValues(ProblemData.TargetVariable, ProblemData.TrainingIndices);
-      AccuracyMaximizationThresholdCalculator.CalculateThresholds(ProblemData, EstimatedTrainingValues, targetClassValues, out classValues, out thresholds);
-
-      Model.SetThresholdsAndClassValues(thresholds, classValues);
-    }
-
-    public void SetClassDistibutionCutPointThresholds() {
-      double[] classValues;
-      double[] thresholds;
-      var targetClassValues = ProblemData.Dataset.GetDoubleValues(ProblemData.TargetVariable, ProblemData.TrainingIndices);
-      NormalDistributionCutPointsThresholdCalculator.CalculateThresholds(ProblemData, EstimatedTrainingValues, targetClassValues, out classValues, out thresholds);
-
-      Model.SetThresholdsAndClassValues(thresholds, classValues);
-    }
-
     protected virtual void OnModelThresholdsChanged(EventArgs e) {
-      CalculateResults();
-      CalculateRegressionResults();
+      OnModelChanged();
     }
 
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ThresholdCalculators/AccuracyMaximizationThresholdCalculator.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ThresholdCalculators/AccuracyMaximizationThresholdCalculator.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ThresholdCalculators/AccuracyMaximizationThresholdCalculator.cs	(revision 8585)
@@ -85,19 +85,24 @@
             //all positives
             if (pair.TargetClassValue.IsAlmost(classValues[i - 1])) {
-              if (pair.EstimatedValue > lowerThreshold && pair.EstimatedValue < actualThreshold)
+              if (pair.EstimatedValue > lowerThreshold && pair.EstimatedValue <= actualThreshold)
                 //true positive
-                classificationScore += problemData.GetClassificationPenalty(classValues[i - 1], classValues[i - 1]);
+                classificationScore += problemData.GetClassificationPenalty(pair.TargetClassValue, pair.TargetClassValue);
               else
                 //false negative
-                classificationScore += problemData.GetClassificationPenalty(classValues[i], classValues[i - 1]);
+                classificationScore += problemData.GetClassificationPenalty(pair.TargetClassValue, classValues[i]);
             }
               //all negatives
             else {
-              if (pair.EstimatedValue > lowerThreshold && pair.EstimatedValue < actualThreshold)
-                //false positive
-                classificationScore += problemData.GetClassificationPenalty(classValues[i - 1], classValues[i]);
-              else
-                //true negative, consider only upper class
-                classificationScore += problemData.GetClassificationPenalty(classValues[i], classValues[i]);
+              //false positive
+              if (pair.EstimatedValue > lowerThreshold && pair.EstimatedValue <= actualThreshold)
+                classificationScore += problemData.GetClassificationPenalty(pair.TargetClassValue, classValues[i - 1]);
+              else if (pair.EstimatedValue <= lowerThreshold)
+                classificationScore += problemData.GetClassificationPenalty(pair.TargetClassValue, classValues[i - 2]);
+              else if (pair.EstimatedValue > actualThreshold) {
+                if (pair.TargetClassValue < classValues[i - 1]) //negative in wrong class, consider upper class
+                  classificationScore += problemData.GetClassificationPenalty(pair.TargetClassValue, classValues[i]);
+                else //true negative, must be optimized by the other thresholds
+                  classificationScore += problemData.GetClassificationPenalty(pair.TargetClassValue, pair.TargetClassValue);
+              }
             }
           }
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisProblemData.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisProblemData.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisProblemData.cs	(revision 8585)
@@ -107,4 +107,5 @@
     [StorableConstructor]
     protected DataAnalysisProblemData(bool deserializing) : base(deserializing) { }
+
     [StorableHook(HookType.AfterDeserialization)]
     private void AfterDeserialization() {
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/FeatureCorrelation/FeatureCorrelationCalculator.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/FeatureCorrelation/FeatureCorrelationCalculator.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/FeatureCorrelation/FeatureCorrelationCalculator.cs	(revision 8585)
@@ -0,0 +1,274 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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 System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using HeuristicLab.PluginInfrastructure;
+using FCE = HeuristicLab.Problems.DataAnalysis.FeatureCorrelationEnums;
+
+namespace HeuristicLab.Problems.DataAnalysis {
+  public class FeatureCorrelationCalculator : Object {
+
+    private BackgroundWorker bw;
+    private BackgroundWorkerInfo bwInfo;
+
+    private IDataAnalysisProblemData problemData;
+    public IDataAnalysisProblemData ProblemData {
+      set {
+        if (bw != null) {
+          bw.CancelAsync();
+        }
+        problemData = value;
+      }
+    }
+
+    public FeatureCorrelationCalculator()
+      : base() { }
+
+    public FeatureCorrelationCalculator(IDataAnalysisProblemData problemData)
+      : base() {
+      this.problemData = problemData;
+    }
+
+    public void CalculateElements(FCE.CorrelationCalculators calc, FCE.Partitions partition) {
+      CalculateElements(problemData.Dataset, calc, partition);
+    }
+
+    // returns if any calculation takes place
+    public bool CalculateTimeframeElements(FCE.CorrelationCalculators calc, FCE.Partitions partition, string variable, int frames, double[,] correlation = null) {
+      if (correlation == null || correlation.GetLength(1) <= frames) {
+        CalculateElements(problemData.Dataset, calc, partition, variable, frames, correlation);
+        return true;
+      } else {
+        return false;
+      }
+    }
+
+    private double[,] GetElementsOfCorrelation(double[,] corr, int frames) {
+      double[,] elements = new double[corr.GetLength(0), frames + 1];
+      for (int i = 0; i < corr.GetLength(0); i++) {
+        for (int j = 0; j <= frames; j++) {
+          elements[i, j] = corr[i, j];
+        }
+      }
+      return elements;
+    }
+
+    private void CalculateElements(Dataset dataset, FCE.CorrelationCalculators calc, FCE.Partitions partition, string variable = null, int frames = 0, double[,] alreadyCalculated = null) {
+      bwInfo = new BackgroundWorkerInfo { Dataset = dataset, Calculator = calc, Partition = partition, Variable = variable, Frames = frames, AlreadyCalculated = alreadyCalculated };
+      if (bw == null) {
+        bw = new BackgroundWorker();
+        bw.WorkerReportsProgress = true;
+        bw.WorkerSupportsCancellation = true;
+        bw.DoWork += new DoWorkEventHandler(BwDoWork);
+        bw.ProgressChanged += new ProgressChangedEventHandler(BwProgressChanged);
+        bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(BwRunWorkerCompleted);
+      }
+      if (bw.IsBusy) {
+        bw.CancelAsync();
+      } else {
+        bw.RunWorkerAsync(bwInfo);
+      }
+    }
+
+    #region backgroundworker
+    private void BwDoWork(object sender, DoWorkEventArgs e) {
+      BackgroundWorkerInfo bwInfo = (BackgroundWorkerInfo)e.Argument;
+      if (bwInfo.Variable == null) {
+        BwCalculateCorrelation(sender, e);
+      } else {
+        BwCalculateTimeframeCorrelation(sender, e);
+      }
+    }
+
+    private void BwCalculateCorrelation(object sender, DoWorkEventArgs e) {
+      BackgroundWorker worker = sender as BackgroundWorker;
+
+      BackgroundWorkerInfo bwInfo = (BackgroundWorkerInfo)e.Argument;
+      Dataset dataset = bwInfo.Dataset;
+      FCE.Partitions partition = bwInfo.Partition;
+      FCE.CorrelationCalculators calc = bwInfo.Calculator;
+
+      IList<string> doubleVariableNames = dataset.DoubleVariables.ToList();
+      OnlineCalculatorError error;
+      int length = doubleVariableNames.Count;
+      double[,] elements = new double[length, length];
+      double calculations = (Math.Pow(length, 2) + length) / 2;
+
+      worker.ReportProgress(0);
+
+      for (int i = 0; i < length; i++) {
+        for (int j = 0; j < i + 1; j++) {
+          if (worker.CancellationPending) {
+            e.Cancel = true;
+            return;
+          }
+
+          IEnumerable<double> var1 = GetRelevantValues(problemData, partition, doubleVariableNames[i]);
+          IEnumerable<double> var2 = GetRelevantValues(problemData, partition, doubleVariableNames[j]);
+
+          elements[i, j] = CalculateElementWithCalculator(calc, var1, var2, out error);
+
+          elements[j, i] = elements[i, j];
+          if (!error.Equals(OnlineCalculatorError.None)) {
+            worker.ReportProgress(100);
+            throw new ArgumentException("Calculator returned " + error + Environment.NewLine + "Maybe try another calculator.");
+          }
+          worker.ReportProgress((int)Math.Round((((Math.Pow(i, 2) + i) / 2 + j + 1.0) / calculations) * 100));
+        }
+      }
+      e.Result = elements;
+    }
+
+    private void BwCalculateTimeframeCorrelation(object sender, DoWorkEventArgs e) {
+      BackgroundWorker worker = sender as BackgroundWorker;
+
+      BackgroundWorkerInfo bwInfo = (BackgroundWorkerInfo)e.Argument;
+      Dataset dataset = bwInfo.Dataset;
+      FCE.Partitions partition = bwInfo.Partition;
+      FCE.CorrelationCalculators calc = bwInfo.Calculator;
+      string variable = bwInfo.Variable;
+      int frames = bwInfo.Frames;
+      double[,] alreadyCalculated = bwInfo.AlreadyCalculated;
+
+      IList<string> doubleVariableNames = dataset.DoubleVariables.ToList();
+      OnlineCalculatorError error;
+      int length = doubleVariableNames.Count;
+      double[,] elements = new double[length, frames + 1];
+      double calculations = (frames + 1) * length;
+
+      worker.ReportProgress(0);
+
+      int start = 0;
+      if (alreadyCalculated != null) {
+        for (int i = 0; i < alreadyCalculated.GetLength(0); i++) {
+          Array.Copy(alreadyCalculated, i * alreadyCalculated.GetLength(1), elements, i * elements.GetLength(1), alreadyCalculated.GetLength(1));
+        }
+        start = alreadyCalculated.GetLength(1);
+      }
+
+      for (int i = 0; i < length; i++) {
+        for (int j = start; j <= frames; j++) {
+          if (worker.CancellationPending) {
+            e.Cancel = true;
+            return;
+          }
+
+          IEnumerable<double> var1 = GetRelevantValues(problemData, partition, variable);
+          IEnumerable<double> var2 = GetRelevantValues(problemData, partition, doubleVariableNames[i]);
+
+          var valuesInFrame = var1.Take(j);
+          var help = var1.Skip(j).ToList();
+          help.AddRange(valuesInFrame);
+          var1 = help;
+
+          elements[i, j] = CalculateElementWithCalculator(calc, var1, var2, out error);
+
+          if (!error.Equals(OnlineCalculatorError.None)) {
+            worker.ReportProgress(100);
+            throw new ArgumentException("Calculator returned " + error + Environment.NewLine + "Maybe try another calculator.");
+          }
+          worker.ReportProgress((int)((100.0 / calculations) * (i * (frames + 1) + j + 1)));
+        }
+      }
+      e.Result = elements;
+    }
+
+    private IEnumerable<double> GetRelevantValues(IDataAnalysisProblemData problemData, FCE.Partitions partition, string variable) {
+      IEnumerable<double> var = problemData.Dataset.GetDoubleValues(variable);
+      if (partition.Equals(FCE.Partitions.TrainingSamples)) {
+        var = var.Skip(problemData.TrainingPartition.Start).Take(problemData.TrainingPartition.End - problemData.TrainingPartition.Start);
+      } else if (partition.Equals(FCE.Partitions.TestSamples)) {
+        var = var.Skip(problemData.TestPartition.Start).Take(problemData.TestPartition.End - problemData.TestPartition.Start);
+      }
+      return var;
+    }
+
+    private double CalculateElementWithCalculator(FCE.CorrelationCalculators calc, IEnumerable<double> var1, IEnumerable<double> var2, out OnlineCalculatorError error) {
+      if (calc.Equals(FCE.CorrelationCalculators.HoeffdingsDependence)) {
+        return HoeffdingsDependenceCalculator.Calculate(var1, var2, out error);
+      } else if (calc.Equals(FCE.CorrelationCalculators.SpearmansRank)) {
+        return SpearmansRankCorrelationCoefficientCalculator.Calculate(var1, var2, out error);
+      } else if (calc.Equals(FCE.CorrelationCalculators.PearsonsRSquared)) {
+        return OnlinePearsonsRSquaredCalculator.Calculate(var1, var2, out error);
+      } else {
+        return Math.Sqrt(OnlinePearsonsRSquaredCalculator.Calculate(var1, var2, out error));
+      }
+    }
+
+    private void BwRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
+      BackgroundWorker worker = sender as BackgroundWorker;
+      if (!e.Cancelled && !worker.CancellationPending) {
+        if (!(e.Error == null)) {
+          ErrorHandling.ShowErrorDialog(e.Error);
+        } else {
+          OnCorrelationCalculationFinished((double[,])e.Result, bwInfo.Calculator, bwInfo.Partition, bwInfo.Variable);
+        }
+      } else {
+        bw.RunWorkerAsync(bwInfo);
+      }
+    }
+    #endregion
+
+    #region events
+    public class CorrelationCalculationFinishedArgs : EventArgs {
+      public double[,] Correlation { get; private set; }
+      public FCE.CorrelationCalculators Calculcator { get; private set; }
+      public FCE.Partitions Partition { get; private set; }
+      public string Variable { get; private set; }
+
+      public CorrelationCalculationFinishedArgs(double[,] correlation, FCE.CorrelationCalculators calculator, FCE.Partitions partition, string variable = null) {
+        this.Correlation = correlation;
+        this.Calculcator = calculator;
+        this.Partition = partition;
+        this.Variable = variable;
+      }
+    }
+    public delegate void CorrelationCalculationFinishedHandler(object sender, CorrelationCalculationFinishedArgs e);
+    public event CorrelationCalculationFinishedHandler CorrelationCalculationFinished;
+    protected virtual void OnCorrelationCalculationFinished(double[,] correlation, FCE.CorrelationCalculators calculator, FCE.Partitions partition, string variable = null) {
+      var handler = CorrelationCalculationFinished;
+      if (handler != null)
+        handler(this, new CorrelationCalculationFinishedArgs(correlation, calculator, partition, variable));
+    }
+
+    public delegate void ProgressCalculationHandler(object sender, ProgressChangedEventArgs e);
+    public event ProgressCalculationHandler ProgressCalculation;
+    protected void BwProgressChanged(object sender, ProgressChangedEventArgs e) {
+      BackgroundWorker worker = sender as BackgroundWorker;
+      if (!worker.CancellationPending && ProgressCalculation != null) {
+        ProgressCalculation(sender, e);
+      }
+    }
+    #endregion
+
+    protected class BackgroundWorkerInfo {
+      public Dataset Dataset { get; set; }
+      public FCE.CorrelationCalculators Calculator { get; set; }
+      public FCE.Partitions Partition { get; set; }
+      public string Variable { get; set; }
+      public int Frames { get; set; }
+      public double[,] AlreadyCalculated { get; set; }
+    }
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/FeatureCorrelation/FeatureCorrelationEnums.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/FeatureCorrelation/FeatureCorrelationEnums.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/FeatureCorrelation/FeatureCorrelationEnums.cs	(revision 8585)
@@ -0,0 +1,101 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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 System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Reflection;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.DataAnalysis {
+  // see http://blog.spontaneouspublicity.com/associating-strings-with-enums-in-c
+  public class FeatureCorrelationEnums {
+    public enum Partitions {
+      [Description("All Samples")]
+      AllSamples,
+      [Description("Training Samples")]
+      TrainingSamples,
+      [Description("Test Samples")]
+      TestSamples
+    }
+
+    public enum CorrelationCalculators {
+      [Description("Pearsons R")]
+      PearsonsR,
+      [Description("Pearsons R Squared")]
+      PearsonsRSquared,
+      [Description("Hoeffdings Dependence")]
+      HoeffdingsDependence,
+      [Description("Spearmans Rank")]
+      SpearmansRank
+    }
+
+    public static readonly Dictionary<CorrelationCalculators, DoubleRange> calculatorInterval = new Dictionary<CorrelationCalculators, DoubleRange>(){ 
+      { CorrelationCalculators.PearsonsR, new DoubleRange(1.0, -1.0)},
+      { CorrelationCalculators.SpearmansRank, new DoubleRange(1.0, -1.0)},
+      { CorrelationCalculators.HoeffdingsDependence, new DoubleRange(1.0, -0.5)},
+      { CorrelationCalculators.PearsonsRSquared, new DoubleRange(1.0, 0.0)}
+    };
+
+    public static string GetEnumDescription(object value) {
+      FieldInfo fi = value.GetType().GetField(value.ToString());
+
+      DescriptionAttribute[] attributes =
+          (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
+
+      if (attributes != null && attributes.Length > 0)
+        return attributes[0].Description;
+      else
+        return value.ToString();
+    }
+
+    public static IEnumerable<T> EnumToList<T>() {
+      Type enumType = typeof(T);
+
+      // Can't use generic type constraints on value types,
+      // so have to do check like this
+      if (enumType.BaseType != typeof(Enum)) {
+        throw new ArgumentException("T must be of type System.Enum");
+      }
+
+      Array enumValArray = Enum.GetValues(enumType);
+      return Enum.GetValues(enumType).Cast<int>().Select(x => (T)Enum.Parse(enumType, x.ToString())).ToList();
+    }
+
+    public static T GetEnumOfDescription<T>(string desc) {
+      Type enumType = typeof(T);
+
+      if (enumType.BaseType != typeof(Enum))
+        throw new ArgumentException("T must be of type System.Enum");
+
+      Array enumValArray = Enum.GetValues(enumType);
+      foreach (int val in enumValArray) {
+
+        T e = (T)Enum.Parse(enumType, val.ToString());
+        if (GetEnumDescription(e).Equals(desc)) {
+          return (T)e;
+        }
+      }
+      throw new ArgumentException("Description is not in the given type T");
+    }
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/ConstantRegressionModel.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/ConstantRegressionModel.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/ConstantRegressionModel.cs	(revision 8585)
@@ -55,5 +55,5 @@
 
     public IRegressionSolution CreateRegressionSolution(IRegressionProblemData problemData) {
-      return new ConstantRegressionSolution(this, problemData);
+      return new ConstantRegressionSolution(this, new RegressionProblemData(problemData));
     }
   }
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionEnsembleModel.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionEnsembleModel.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionEnsembleModel.cs	(revision 8585)
@@ -102,5 +102,5 @@
 
     public RegressionEnsembleSolution CreateRegressionSolution(IRegressionProblemData problemData) {
-      return new RegressionEnsembleSolution(this.Models, problemData);
+      return new RegressionEnsembleSolution(this.Models, new RegressionEnsembleProblemData(problemData));
     }
     IRegressionSolution IRegressionModel.CreateRegressionSolution(IRegressionProblemData problemData) {
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionProblemData.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionProblemData.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionProblemData.cs	(revision 8585)
@@ -121,4 +121,11 @@
       : this(defaultDataset, defaultAllowedInputVariables, defaultTargetVariable) {
     }
+    public RegressionProblemData(IRegressionProblemData regressionProblemData)
+      : this(regressionProblemData.Dataset, regressionProblemData.AllowedInputVariables, regressionProblemData.TargetVariable) {
+      TrainingPartition.Start = regressionProblemData.TrainingPartition.Start;
+      TrainingPartition.End = regressionProblemData.TrainingPartition.End;
+      TestPartition.Start = regressionProblemData.TestPartition.Start;
+      TestPartition.End = regressionProblemData.TestPartition.End;
+    }
 
     public RegressionProblemData(Dataset dataset, IEnumerable<string> allowedInputVariables, string targetVariable)
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/OnlineCalculators/HoeffdingsDependenceCalculator.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/OnlineCalculators/HoeffdingsDependenceCalculator.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/OnlineCalculators/HoeffdingsDependenceCalculator.cs	(revision 8585)
@@ -23,5 +23,4 @@
 using System.Collections.Generic;
 using System.Linq;
-using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.DataAnalysis {
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/OnlineCalculators/SpearmansRankCorrelationCoefficientCalculator.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/OnlineCalculators/SpearmansRankCorrelationCoefficientCalculator.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/OnlineCalculators/SpearmansRankCorrelationCoefficientCalculator.cs	(revision 8585)
@@ -0,0 +1,34 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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 System.Collections.Generic;
+using System.Linq;
+
+namespace HeuristicLab.Problems.DataAnalysis {
+  public class SpearmansRankCorrelationCoefficientCalculator {
+
+    public static double Calculate(IEnumerable<double> originalValues, IEnumerable<double> estimatedValues, out OnlineCalculatorError errorState) {
+      double rs = alglib.basestat.spearmancorr2(originalValues.ToArray(), estimatedValues.ToArray(), originalValues.Count());
+      errorState = OnlineCalculatorError.None;
+      return rs;
+    }
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Plugin.cs.frame
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Plugin.cs.frame	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.DataAnalysis/3.4/Plugin.cs.frame	(revision 8585)
@@ -28,4 +28,5 @@
   [Plugin("HeuristicLab.Problems.DataAnalysis","Provides base classes for data analysis tasks.", "3.4.3.$WCREV$")]
   [PluginFile("HeuristicLab.Problems.DataAnalysis-3.4.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.ALGLIB","3.6")]
   [PluginDependency("HeuristicLab.Collections", "3.3")]
   [PluginDependency("HeuristicLab.Common", "3.3")]
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Classification/CSV/ClassifiactionCSVInstanceProvider.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Classification/CSV/ClassifiactionCSVInstanceProvider.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Classification/CSV/ClassifiactionCSVInstanceProvider.cs	(revision 8585)
@@ -22,7 +22,9 @@
 using System;
 using System.Collections.Generic;
+using System.Globalization;
 using System.IO;
 using System.Linq;
 using System.Text;
+using HeuristicLab.Common;
 using HeuristicLab.Problems.DataAnalysis;
 
@@ -61,23 +63,26 @@
 
       Dataset dataset = new Dataset(csvFileParser.VariableNames, csvFileParser.Values);
-      string targetVar = csvFileParser.VariableNames.Where(x => dataset.DoubleVariables.Contains(x)).Last();
-      IEnumerable<string> allowedInputVars = dataset.DoubleVariables.Where(x => !x.Equals(targetVar));
+      string targetVar = dataset.DoubleVariables.Last();
 
-      ClassificationProblemData claData = new ClassificationProblemData(dataset, allowedInputVars, targetVar);
-
-      int trainingPartEnd = csvFileParser.Rows * 2 / 3;
-      claData.TrainingPartition.Start = 0;
-      claData.TrainingPartition.End = trainingPartEnd;
-      claData.TestPartition.Start = trainingPartEnd;
-      claData.TestPartition.End = csvFileParser.Rows;
-      int pos = path.LastIndexOf('\\');
-      if (pos < 0)
-        claData.Name = path;
-      else {
-        pos++;
-        claData.Name = path.Substring(pos, path.Length - pos);
+      // turn of input variables that are constant in the training partition
+      var allowedInputVars = new List<string>();
+      var trainingIndizes = Enumerable.Range(0, (csvFileParser.Rows * 2) / 3);
+      foreach (var variableName in dataset.DoubleVariables) {
+        if (dataset.GetDoubleValues(variableName, trainingIndizes).Range() > 0 &&
+          variableName != targetVar)
+          allowedInputVars.Add(variableName);
       }
 
-      return claData;
+      ClassificationProblemData classificationData = new ClassificationProblemData(dataset, allowedInputVars, targetVar);
+
+      int trainingPartEnd = trainingIndizes.Last();
+      classificationData.TrainingPartition.Start = trainingIndizes.First();
+      classificationData.TrainingPartition.End = trainingPartEnd;
+      classificationData.TestPartition.Start = trainingPartEnd;
+      classificationData.TestPartition.End = csvFileParser.Rows;
+
+      classificationData.Name = Path.GetFileName(path);
+
+      return classificationData;
     }
 
@@ -86,23 +91,23 @@
     }
     public override void ExportData(IClassificationProblemData instance, string path) {
-      StringBuilder strBuilder = new StringBuilder();
+      var strBuilder = new StringBuilder();
 
       foreach (var variable in instance.InputVariables) {
-        strBuilder.Append(variable + ";");
+        strBuilder.Append(variable + CultureInfo.CurrentCulture.TextInfo.ListSeparator);
       }
-      strBuilder.Remove(strBuilder.Length - 1, 1);
+      strBuilder.Remove(strBuilder.Length - CultureInfo.CurrentCulture.TextInfo.ListSeparator.Length, CultureInfo.CurrentCulture.TextInfo.ListSeparator.Length);
       strBuilder.AppendLine();
 
-      Dataset dataset = instance.Dataset;
+      var dataset = instance.Dataset;
 
       for (int i = 0; i < dataset.Rows; i++) {
         for (int j = 0; j < dataset.Columns; j++) {
-          strBuilder.Append(dataset.GetValue(i, j) + ";");
+          if (j > 0) strBuilder.Append(CultureInfo.CurrentCulture.TextInfo.ListSeparator);
+          strBuilder.Append(dataset.GetValue(i, j));
         }
-        strBuilder.Remove(strBuilder.Length - 1, 1);
         strBuilder.AppendLine();
       }
 
-      using (StreamWriter writer = new StreamWriter(path)) {
+      using (var writer = new StreamWriter(path)) {
         writer.Write(strBuilder);
       }
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Clustering/CSV/ClusteringCSVInstanceProvider.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Clustering/CSV/ClusteringCSVInstanceProvider.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Clustering/CSV/ClusteringCSVInstanceProvider.cs	(revision 8585)
@@ -22,6 +22,9 @@
 using System;
 using System.Collections.Generic;
+using System.Globalization;
 using System.IO;
+using System.Linq;
 using System.Text;
+using HeuristicLab.Common;
 using HeuristicLab.Problems.DataAnalysis;
 
@@ -60,20 +63,24 @@
 
       var dataset = new Dataset(csvFileParser.VariableNames, csvFileParser.Values);
-      var claData = new ClusteringProblemData(dataset, dataset.DoubleVariables);
 
-      int trainingPartEnd = csvFileParser.Rows * 2 / 3;
-      claData.TrainingPartition.Start = 0;
-      claData.TrainingPartition.End = trainingPartEnd;
-      claData.TestPartition.Start = trainingPartEnd;
-      claData.TestPartition.End = csvFileParser.Rows;
-      int pos = path.LastIndexOf('\\');
-      if (pos < 0)
-        claData.Name = path;
-      else {
-        pos++;
-        claData.Name = path.Substring(pos, path.Length - pos);
+      // turn of input variables that are constant in the training partition
+      var allowedInputVars = new List<string>();
+      var trainingIndizes = Enumerable.Range(0, (csvFileParser.Rows * 2) / 3);
+      foreach (var variableName in dataset.DoubleVariables) {
+        if (dataset.GetDoubleValues(variableName, trainingIndizes).Range() > 0)
+          allowedInputVars.Add(variableName);
       }
 
-      return claData;
+      var clusteringData = new ClusteringProblemData(dataset, allowedInputVars);
+
+      int trainingPartEnd = trainingIndizes.Last();
+      clusteringData.TrainingPartition.Start = trainingIndizes.First();
+      clusteringData.TrainingPartition.End = trainingPartEnd;
+      clusteringData.TestPartition.Start = trainingPartEnd;
+      clusteringData.TestPartition.End = csvFileParser.Rows;
+
+      clusteringData.Name = Path.GetFileName(path);
+
+      return clusteringData;
     }
 
@@ -85,7 +92,7 @@
 
       foreach (var variable in instance.InputVariables) {
-        strBuilder.Append(variable + ";");
+        strBuilder.Append(variable + CultureInfo.CurrentCulture.TextInfo.ListSeparator);
       }
-      strBuilder.Remove(strBuilder.Length - 1, 1);
+      strBuilder.Remove(strBuilder.Length - CultureInfo.CurrentCulture.TextInfo.ListSeparator.Length, CultureInfo.CurrentCulture.TextInfo.ListSeparator.Length);
       strBuilder.AppendLine();
 
@@ -94,7 +101,7 @@
       for (int i = 0; i < dataset.Rows; i++) {
         for (int j = 0; j < dataset.Columns; j++) {
-          strBuilder.Append(dataset.GetValue(i, j) + ";");
+          if (j > 0) strBuilder.Append(CultureInfo.CurrentCulture.TextInfo.ListSeparator);
+          strBuilder.Append(dataset.GetValue(i, j));
         }
-        strBuilder.Remove(strBuilder.Length - 1, 1);
         strBuilder.AppendLine();
       }
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Plugin.cs.frame
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Plugin.cs.frame	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Plugin.cs.frame	(revision 8585)
@@ -25,4 +25,5 @@
   [Plugin("HeuristicLab.Problems.Instances.DataAnalysis", "3.3.7.$WCREV$")]
   [PluginFile("HeuristicLab.Problems.Instances.DataAnalysis-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
   [PluginDependency("HeuristicLab.Core", "3.3")]
   [PluginDependency("HeuristicLab.Data", "3.3")]
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/CSV/RegressionCSVInstanceProvider.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/CSV/RegressionCSVInstanceProvider.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/CSV/RegressionCSVInstanceProvider.cs	(revision 8585)
@@ -22,7 +22,9 @@
 using System;
 using System.Collections.Generic;
+using System.Globalization;
 using System.IO;
 using System.Linq;
 using System.Text;
+using HeuristicLab.Common;
 using HeuristicLab.Problems.DataAnalysis;
 
@@ -59,24 +61,26 @@
 
       Dataset dataset = new Dataset(csvFileParser.VariableNames, csvFileParser.Values);
-      string targetVar = csvFileParser.VariableNames.Where(x => dataset.DoubleVariables.Contains(x)).Last();
+      string targetVar = dataset.DoubleVariables.Last();
 
-      IEnumerable<string> allowedInputVars = dataset.DoubleVariables.Where(x => !x.Equals(targetVar));
+      // turn of input variables that are constant in the training partition
+      var allowedInputVars = new List<string>();
+      var trainingIndizes = Enumerable.Range(0, (csvFileParser.Rows * 2) / 3);
+      foreach (var variableName in dataset.DoubleVariables) {
+        if (dataset.GetDoubleValues(variableName, trainingIndizes).Range() > 0 &&
+          variableName != targetVar)
+          allowedInputVars.Add(variableName);
+      }
 
-      IRegressionProblemData regData = new RegressionProblemData(dataset, allowedInputVars, targetVar);
+      IRegressionProblemData regressionData = new RegressionProblemData(dataset, allowedInputVars, targetVar);
 
-      int trainingPartEnd = csvFileParser.Rows * 2 / 3;
-      regData.TrainingPartition.Start = 0;
-      regData.TrainingPartition.End = trainingPartEnd;
-      regData.TestPartition.Start = trainingPartEnd;
-      regData.TestPartition.End = csvFileParser.Rows;
+      var trainingPartEnd = trainingIndizes.Last();
+      regressionData.TrainingPartition.Start = trainingIndizes.First();
+      regressionData.TrainingPartition.End = trainingPartEnd;
+      regressionData.TestPartition.Start = trainingPartEnd;
+      regressionData.TestPartition.End = csvFileParser.Rows;
 
-      int pos = path.LastIndexOf('\\');
-      if (pos < 0)
-        regData.Name = path;
-      else {
-        pos++;
-        regData.Name = path.Substring(pos, path.Length - pos);
-      }
-      return regData;
+      regressionData.Name = Path.GetFileName(path);
+
+      return regressionData;
     }
 
@@ -85,23 +89,23 @@
     }
     public override void ExportData(IRegressionProblemData instance, string path) {
-      StringBuilder strBuilder = new StringBuilder();
+      var strBuilder = new StringBuilder();
 
       foreach (var variable in instance.InputVariables) {
-        strBuilder.Append(variable + ";");
+        strBuilder.Append(variable + CultureInfo.CurrentCulture.TextInfo.ListSeparator);
       }
-      strBuilder.Remove(strBuilder.Length - 1, 1);
+      strBuilder.Remove(strBuilder.Length - CultureInfo.CurrentCulture.TextInfo.ListSeparator.Length, CultureInfo.CurrentCulture.TextInfo.ListSeparator.Length);
       strBuilder.AppendLine();
 
-      Dataset dataset = instance.Dataset;
+      var dataset = instance.Dataset;
 
       for (int i = 0; i < dataset.Rows; i++) {
         for (int j = 0; j < dataset.Columns; j++) {
-          strBuilder.Append(dataset.GetValue(i, j) + ";");
+          if (j > 0) strBuilder.Append(CultureInfo.CurrentCulture.TextInfo.ListSeparator);
+          strBuilder.Append(dataset.GetValue(i, j));
         }
-        strBuilder.Remove(strBuilder.Length - 1, 1);
         strBuilder.AppendLine();
       }
 
-      using (StreamWriter writer = new StreamWriter(path)) {
+      using (var writer = new StreamWriter(path)) {
         writer.Write(strBuilder);
       }
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.Instances.DataAnalysis/3.3/TableFileParser.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.Instances.DataAnalysis/3.3/TableFileParser.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.Instances.DataAnalysis/3.3/TableFileParser.cs	(revision 8585)
@@ -32,5 +32,5 @@
 namespace HeuristicLab.Problems.Instances.DataAnalysis {
   public class TableFileParser {
-    private const int BUFFER_SIZE = 1024;
+    private const int BUFFER_SIZE = 65536;
     private static readonly char[] POSSIBLE_SEPARATORS = new char[] { ',', ';', '\t' };
     private Tokenizer tokenizer;
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.Instances.QAPLIB/3.3/QAPLIBInstanceProvider.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.Instances.QAPLIB/3.3/QAPLIBInstanceProvider.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.Instances.QAPLIB/3.3/QAPLIBInstanceProvider.cs	(revision 8585)
@@ -65,7 +65,11 @@
       "esc16j",
       "esc32a",
+      "esc32b",
+      "esc32c",
+      "esc32d",
       "esc32e",
       "esc32f",
       "esc32g",
+      "esc32h",
       "had12",
       "had14",
@@ -126,6 +130,9 @@
       "tai25a",
       "tai25b",
+      "tai30a",
       "tai30b",
+      "tai35a",
       "tai35b",
+      "tai40a",
       "tai40b",
       "tai50a",
@@ -204,5 +211,5 @@
 
                 int[] assignment = slnParser.Assignment;
-                if (reversedSolutions.Contains(instance.Name)) {
+                if (assignment != null && reversedSolutions.Contains(instance.Name)) {
                   assignment = (int[])slnParser.Assignment.Clone();
                   for (int i = 0; i < assignment.Length; i++)
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.Instances.QAPLIB/3.3/QAPLIBSolutionParser.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.Instances.QAPLIB/3.3/QAPLIBSolutionParser.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.Instances.QAPLIB/3.3/QAPLIBSolutionParser.cs	(revision 8585)
@@ -90,4 +90,5 @@
           string valLine = reader.ReadLine();
           string[] vals = valLine.Split(delim, StringSplitOptions.RemoveEmptyEntries);
+          if (vals.Length == 0) continue;
           for (int j = 0; j < vals.Length; j++) {
             if (valueAsLocation)
@@ -96,4 +97,5 @@
           }
         }
+        if (read < Size) Assignment = null;
         return true;
       } catch (Exception e) {
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.QuadraticAssignment/3.3/QuadraticAssignmentProblem.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.QuadraticAssignment/3.3/QuadraticAssignmentProblem.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.QuadraticAssignment/3.3/QuadraticAssignmentProblem.cs	(revision 8585)
@@ -412,4 +412,5 @@
       Description = data.Description;
       Load(weights, distances);
+      if (data.BestKnownQuality.HasValue) BestKnownQuality = new DoubleValue(data.BestKnownQuality.Value);
       EvaluateAndLoadAssignment(data.BestKnownAssignment);
       OnReset();
@@ -426,4 +427,5 @@
       Description = data.Description;
       Load(weights, distances);
+      if (data.BestKnownQuality.HasValue) BestKnownQuality = new DoubleValue(data.BestKnownQuality.Value);
       EvaluateAndLoadAssignment(data.BestKnownTour);
       OnReset();
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.TestFunctions/3.3/SingleObjectiveTestFunctionProblem.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.TestFunctions/3.3/SingleObjectiveTestFunctionProblem.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.TestFunctions/3.3/SingleObjectiveTestFunctionProblem.cs	(revision 8585)
@@ -139,13 +139,15 @@
     protected override void OnEvaluatorChanged() {
       base.OnEvaluatorChanged();
-      ParameterizeEvaluator();
+      bool problemSizeChange = ProblemSize.Value < Evaluator.MinimumProblemSize
+        || ProblemSize.Value > Evaluator.MaximumProblemSize;
+      if (problemSizeChange) {
+        ProblemSize.Value = Math.Max(Evaluator.MinimumProblemSize, Math.Min(ProblemSize.Value, Evaluator.MaximumProblemSize));
+      } else {
+        ParameterizeEvaluator();
+      }
       UpdateMoveEvaluators();
       ParameterizeAnalyzers();
       Maximization.Value = Evaluator.Maximization;
       BoundsParameter.Value = Evaluator.Bounds;
-      if (ProblemSize.Value < Evaluator.MinimumProblemSize)
-        ProblemSize.Value = Evaluator.MinimumProblemSize;
-      else if (ProblemSize.Value > Evaluator.MaximumProblemSize)
-        ProblemSize.Value = Evaluator.MaximumProblemSize;
       BestKnownQuality = new DoubleValue(Evaluator.BestKnownQuality);
       Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
@@ -312,5 +314,10 @@
       Evaluator.PointParameter.ActualName = SolutionCreator.RealVectorParameter.ActualName;
       Evaluator.PointParameter.Hidden = true;
-      BestKnownSolutionParameter.Value = Evaluator.GetBestKnownSolution(ProblemSize.Value);
+      try {
+        BestKnownSolutionParameter.Value = Evaluator.GetBestKnownSolution(ProblemSize.Value);
+      } catch (ArgumentException e) {
+        ErrorHandling.ShowErrorDialog(e);
+        ProblemSize.Value = Evaluator.MinimumProblemSize;
+      }
     }
     private void ParameterizeOperators() {
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs	(revision 8585)
@@ -24,4 +24,5 @@
 using System.IO;
 using System.Linq;
+using HeuristicLab.Analysis;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -83,4 +84,7 @@
     private TSPPopulationDiversityAnalyzer TSPPopulationDiversityAnalyzer {
       get { return Operators.OfType<TSPPopulationDiversityAnalyzer>().FirstOrDefault(); }
+    }
+    private SingleObjectivePopulationDiversityAnalyzer SingleObjectivePopulationDiversityAnalyzer {
+      get { return Operators.OfType<SingleObjectivePopulationDiversityAnalyzer>().FirstOrDefault(); }
     }
     #endregion
@@ -238,5 +242,5 @@
       Operators.Add(new BestTSPSolutionAnalyzer());
       Operators.Add(new TSPAlleleFrequencyAnalyzer());
-      Operators.Add(new TSPPopulationDiversityAnalyzer());
+      Operators.Add(new SingleObjectivePopulationDiversityAnalyzer());
       ParameterizeAnalyzers();
       var operators = new HashSet<IPermutationOperator>(new IPermutationOperator[] {
@@ -324,4 +328,11 @@
         TSPPopulationDiversityAnalyzer.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
         TSPPopulationDiversityAnalyzer.ResultsParameter.ActualName = "Results";
+      }
+
+      if (SingleObjectivePopulationDiversityAnalyzer != null) {
+        SingleObjectivePopulationDiversityAnalyzer.MaximizationParameter.ActualName = MaximizationParameter.Name;
+        SingleObjectivePopulationDiversityAnalyzer.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
+        SingleObjectivePopulationDiversityAnalyzer.ResultsParameter.ActualName = "Results";
+        SingleObjectivePopulationDiversityAnalyzer.SimilarityCalculator = Operators.OfType<TSPSimilarityCalculator>().SingleOrDefault();
       }
     }
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.VehicleRouting.Views/3.4/HeuristicLab.Problems.VehicleRouting.Views-3.4.csproj
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.VehicleRouting.Views/3.4/HeuristicLab.Problems.VehicleRouting.Views-3.4.csproj	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.VehicleRouting.Views/3.4/HeuristicLab.Problems.VehicleRouting.Views-3.4.csproj	(revision 8585)
@@ -69,5 +69,6 @@
     <OutputPath>..\..\bin\</OutputPath>
     <DefineConstants>TRACE</DefineConstants>
-    <DocumentationFile>bin\x86\Release\HeuristicLab.Problems.VehicleRouting.Views-3.4.xml</DocumentationFile>
+    <DocumentationFile>
+    </DocumentationFile>
     <Optimize>true</Optimize>
     <DebugType>pdbonly</DebugType>
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/Capacitated/BestCapacitatedVRPSolutionAnalyzer.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/Capacitated/BestCapacitatedVRPSolutionAnalyzer.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/Capacitated/BestCapacitatedVRPSolutionAnalyzer.cs	(revision 8585)
@@ -30,4 +30,5 @@
 using HeuristicLab.Problems.VehicleRouting.Interfaces;
 using HeuristicLab.Problems.VehicleRouting.Variants;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
 
 namespace HeuristicLab.Problems.VehicleRouting {
@@ -87,4 +88,5 @@
 
     public override IOperation Apply() {
+      IVRPProblemInstance problemInstance = ProblemInstanceParameter.ActualValue;
       ItemArray<IVRPEncoding> solutions = VRPToursParameter.ActualValue;
       ResultCollection results = ResultsParameter.ActualValue;
@@ -100,5 +102,6 @@
           results.Add(new Result("Best VRP Solution Overload", new DoubleValue(overloads[i].Value)));
         } else {
-          if (qualities[i].Value <= solution.Quality.Value) {
+          VRPEvaluation eval = problemInstance.Evaluate(solution.Solution);
+          if (qualities[i].Value <= eval.Quality) {
             (results["Best VRP Solution Overload"].Value as DoubleValue).Value = overloads[i].Value;
           }
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/PickupAndDelivery/BestPickupAndDeliveryVRPSolutionAnalyzer.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/PickupAndDelivery/BestPickupAndDeliveryVRPSolutionAnalyzer.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/PickupAndDelivery/BestPickupAndDeliveryVRPSolutionAnalyzer.cs	(revision 8585)
@@ -30,4 +30,5 @@
 using HeuristicLab.Problems.VehicleRouting.Interfaces;
 using HeuristicLab.Problems.VehicleRouting.Variants;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
 
 namespace HeuristicLab.Problems.VehicleRouting {
@@ -87,4 +88,5 @@
 
     public override IOperation Apply() {
+      IVRPProblemInstance problemInstance = ProblemInstanceParameter.ActualValue;
       ItemArray<IVRPEncoding> solutions = VRPToursParameter.ActualValue;
       ResultCollection results = ResultsParameter.ActualValue;
@@ -101,5 +103,6 @@
           results.Add(new Result("Best VRP Solution PickupViolations", new DoubleValue(pickupViolations[i].Value)));
         } else {
-          if (qualities[i].Value <= solution.Quality.Value) {
+          VRPEvaluation eval = problemInstance.Evaluate(solution.Solution);
+          if (qualities[i].Value <= eval.Quality) {
             (results["Best VRP Solution PickupViolations"].Value as DoubleValue).Value = pickupViolations[i].Value;
           }
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/TimeWindowed/BestTimeWindowedVRPSolutionAnalyzer.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/TimeWindowed/BestTimeWindowedVRPSolutionAnalyzer.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/TimeWindowed/BestTimeWindowedVRPSolutionAnalyzer.cs	(revision 8585)
@@ -30,4 +30,5 @@
 using HeuristicLab.Problems.VehicleRouting.Interfaces;
 using HeuristicLab.Problems.VehicleRouting.Variants;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
 
 namespace HeuristicLab.Problems.VehicleRouting {
@@ -91,4 +92,5 @@
 
     public override IOperation Apply() {
+      IVRPProblemInstance problemInstance = ProblemInstanceParameter.ActualValue;
       ItemArray<IVRPEncoding> solutions = VRPToursParameter.ActualValue;
       ResultCollection results = ResultsParameter.ActualValue;
@@ -106,5 +108,6 @@
           results.Add(new Result("Best VRP Solution TravelTime", new DoubleValue(travelTimes[i].Value)));
         } else {
-          if (qualities[i].Value <= solution.Quality.Value) {
+          VRPEvaluation eval = problemInstance.Evaluate(solution.Solution);
+          if (qualities[i].Value <= eval.Quality) {
             (results["Best VRP Solution Tardiness"].Value as DoubleValue).Value = tardinesses[i].Value;
             (results["Best VRP Solution TravelTime"].Value as DoubleValue).Value = travelTimes[i].Value;
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/ConstraintRelaxation/Capacitated/CapacityRelaxationVRPAnalyzer.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/ConstraintRelaxation/Capacitated/CapacityRelaxationVRPAnalyzer.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/ConstraintRelaxation/Capacitated/CapacityRelaxationVRPAnalyzer.cs	(revision 8585)
@@ -60,4 +60,7 @@
       get { return (IValueParameter<DoubleValue>)Parameters["MinPenaltyFactor"]; }
     }
+    public IValueParameter<DoubleValue> MaxPenaltyFactorParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["MaxPenaltyFactor"]; }
+    }
 
     public ValueLookupParameter<ResultCollection> ResultsParameter {
@@ -80,7 +83,8 @@
       Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Overload", "The overloads of the VRP solutions which should be analyzed."));
 
-      Parameters.Add(new ValueParameter<DoubleValue>("Sigma", "The sigma applied to the penalty factor.", new DoubleValue(0.04)));
-      Parameters.Add(new ValueParameter<DoubleValue>("Phi", "The phi applied to the penalty factor.", new DoubleValue(0.01)));
+      Parameters.Add(new ValueParameter<DoubleValue>("Sigma", "The sigma applied to the penalty factor.", new DoubleValue(0.5)));
+      Parameters.Add(new ValueParameter<DoubleValue>("Phi", "The phi applied to the penalty factor.", new DoubleValue(0.5)));
       Parameters.Add(new ValueParameter<DoubleValue>("MinPenaltyFactor", "The minimum penalty factor.", new DoubleValue(0.01)));
+      Parameters.Add(new ValueParameter<DoubleValue>("MaxPenaltyFactor", "The maximum penalty factor.", new DoubleValue(100000)));
 
       Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The result collection where the best VRP solution should be stored."));
@@ -95,4 +99,14 @@
     }
 
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      // BackwardsCompatibility3.3
+      #region Backwards compatible code, remove with 3.4
+      if (!Parameters.ContainsKey("MaxPenaltyFactor")) {
+        Parameters.Add(new ValueParameter<DoubleValue>("MaxPenaltyFactor", "The maximum penalty factor.", new DoubleValue(100000)));
+      }
+      #endregion
+    }
+
     public override IOperation Apply() {
       ICapacitatedProblemInstance cvrp = ProblemInstanceParameter.ActualValue as ICapacitatedProblemInstance;
@@ -105,4 +119,5 @@
       double phi = PhiParameter.Value.Value;
       double minPenalty = MinPenaltyFactorParameter.Value.Value;
+      double maxPenalty = MaxPenaltyFactorParameter.Value.Value;
 
       for (int j = 0; j < qualities.Length; j++) {
@@ -124,4 +139,6 @@
       if (cvrp.OverloadPenalty.Value < minPenalty)
         cvrp.OverloadPenalty.Value = minPenalty;
+      if (cvrp.OverloadPenalty.Value > maxPenalty)
+        cvrp.OverloadPenalty.Value = maxPenalty;
 
       for (int j = 0; j < qualities.Length; j++) {
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/ConstraintRelaxation/PickupAndDelivery/PickupViolationsRelaxationVRPAnalyzer.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/ConstraintRelaxation/PickupAndDelivery/PickupViolationsRelaxationVRPAnalyzer.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/ConstraintRelaxation/PickupAndDelivery/PickupViolationsRelaxationVRPAnalyzer.cs	(revision 8585)
@@ -60,4 +60,7 @@
       get { return (IValueParameter<DoubleValue>)Parameters["MinPenaltyFactor"]; }
     }
+    public IValueParameter<DoubleValue> MaxPenaltyFactorParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["MaxPenaltyFactor"]; }
+    }
 
     public ValueLookupParameter<ResultCollection> ResultsParameter {
@@ -80,7 +83,8 @@
       Parameters.Add(new ScopeTreeLookupParameter<IntValue>("PickupViolations", "The pickup violation of the VRP solutions which should be analyzed."));
 
-      Parameters.Add(new ValueParameter<DoubleValue>("Sigma", "The sigma applied to the penalty factor.", new DoubleValue(0.04)));
-      Parameters.Add(new ValueParameter<DoubleValue>("Phi", "The phi applied to the penalty factor.", new DoubleValue(0.01)));
+      Parameters.Add(new ValueParameter<DoubleValue>("Sigma", "The sigma applied to the penalty factor.", new DoubleValue(0.5)));
+      Parameters.Add(new ValueParameter<DoubleValue>("Phi", "The phi applied to the penalty factor.", new DoubleValue(0.5)));
       Parameters.Add(new ValueParameter<DoubleValue>("MinPenaltyFactor", "The minimum penalty factor.", new DoubleValue(0.01)));
+      Parameters.Add(new ValueParameter<DoubleValue>("MaxPenaltyFactor", "The maximum penalty factor.", new DoubleValue(100000)));
 
       Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The result collection where the best VRP solution should be stored."));
@@ -95,4 +99,14 @@
     }
 
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      // BackwardsCompatibility3.3
+      #region Backwards compatible code, remove with 3.4
+      if (!Parameters.ContainsKey("MaxPenaltyFactor")) {
+        Parameters.Add(new ValueParameter<DoubleValue>("MaxPenaltyFactor", "The maximum penalty factor.", new DoubleValue(100000)));
+      }
+      #endregion
+    }
+
     public override IOperation Apply() {
       IPickupAndDeliveryProblemInstance pdp = ProblemInstanceParameter.ActualValue as IPickupAndDeliveryProblemInstance;
@@ -105,4 +119,5 @@
       double phi = PhiParameter.Value.Value;
       double minPenalty = MinPenaltyFactorParameter.Value.Value;
+      double maxPenalty = MaxPenaltyFactorParameter.Value.Value;
 
       for (int j = 0; j < qualities.Length; j++) {
@@ -124,4 +139,6 @@
       if (pdp.PickupViolationPenalty.Value < minPenalty)
         pdp.PickupViolationPenalty.Value = minPenalty;
+      if (pdp.PickupViolationPenalty.Value > maxPenalty)
+        pdp.PickupViolationPenalty.Value = maxPenalty;
 
       for (int j = 0; j < qualities.Length; j++) {
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/ConstraintRelaxation/TimeWindowed/TimeWindowRelaxationVRPAnalyzer.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/ConstraintRelaxation/TimeWindowed/TimeWindowRelaxationVRPAnalyzer.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/ConstraintRelaxation/TimeWindowed/TimeWindowRelaxationVRPAnalyzer.cs	(revision 8585)
@@ -60,4 +60,7 @@
       get { return (IValueParameter<DoubleValue>)Parameters["MinPenaltyFactor"]; }
     }
+    public IValueParameter<DoubleValue> MaxPenaltyFactorParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["MaxPenaltyFactor"]; }
+    }
 
     public ValueLookupParameter<ResultCollection> ResultsParameter {
@@ -80,7 +83,8 @@
       Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Tardiness", "The tardiness of the VRP solutions which should be analyzed."));
 
-      Parameters.Add(new ValueParameter<DoubleValue>("Sigma", "The sigma applied to the penalty factor.", new DoubleValue(0.04)));
-      Parameters.Add(new ValueParameter<DoubleValue>("Phi", "The phi applied to the penalty factor.", new DoubleValue(0.01)));
+      Parameters.Add(new ValueParameter<DoubleValue>("Sigma", "The sigma applied to the penalty factor.", new DoubleValue(0.5)));
+      Parameters.Add(new ValueParameter<DoubleValue>("Phi", "The phi applied to the penalty factor.", new DoubleValue(0.5)));
       Parameters.Add(new ValueParameter<DoubleValue>("MinPenaltyFactor", "The minimum penalty factor.", new DoubleValue(0.01)));
+      Parameters.Add(new ValueParameter<DoubleValue>("MaxPenaltyFactor", "The maximum penalty factor.", new DoubleValue(100000)));
 
       Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The result collection where the best VRP solution should be stored."));
@@ -95,4 +99,14 @@
     }
 
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      // BackwardsCompatibility3.3
+      #region Backwards compatible code, remove with 3.4
+      if (!Parameters.ContainsKey("MaxPenaltyFactor")) {
+        Parameters.Add(new ValueParameter<DoubleValue>("MaxPenaltyFactor", "The maximum penalty factor.", new DoubleValue(100000)));
+      }
+      #endregion
+    }
+
     public override IOperation Apply() {
       ITimeWindowedProblemInstance vrptw = ProblemInstanceParameter.ActualValue as ITimeWindowedProblemInstance;
@@ -105,4 +119,5 @@
       double phi = PhiParameter.Value.Value;
       double minPenalty = MinPenaltyFactorParameter.Value.Value;
+      double maxPenalty = MaxPenaltyFactorParameter.Value.Value;
 
       for (int j = 0; j < qualities.Length; j++) {
@@ -124,4 +139,6 @@
       if (vrptw.TardinessPenalty.Value < minPenalty)
         vrptw.TardinessPenalty.Value = minPenalty;
+      if (vrptw.TardinessPenalty.Value > maxPenalty)
+        vrptw.TardinessPenalty.Value = maxPenalty;
 
       for (int j = 0; j < qualities.Length; j++) {
Index: /branches/HeuristicLab.Mono/HeuristicLab.Problems.VehicleRouting/3.4/HeuristicLab.Problems.VehicleRouting-3.4.csproj
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Problems.VehicleRouting/3.4/HeuristicLab.Problems.VehicleRouting-3.4.csproj	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Problems.VehicleRouting/3.4/HeuristicLab.Problems.VehicleRouting-3.4.csproj	(revision 8585)
@@ -72,5 +72,6 @@
     <OutputPath>..\..\bin\</OutputPath>
     <DefineConstants>TRACE</DefineConstants>
-    <DocumentationFile>bin\x86\Release\HeuristicLab.Routing.TSP-3.3.xml</DocumentationFile>
+    <DocumentationFile>
+    </DocumentationFile>
     <Optimize>true</Optimize>
     <DebugType>pdbonly</DebugType>
Index: anches/HeuristicLab.Mono/HeuristicLab.Tests/HeuristicLab-3.3/GaussianProcessRegressionTest.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Tests/HeuristicLab-3.3/GaussianProcessRegressionTest.cs	(revision 8584)
+++ 	(revision )
@@ -1,113 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2012 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 System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading;
-using HeuristicLab.Algorithms.DataAnalysis;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Problems.DataAnalysis;
-using HeuristicLab.SequentialEngine;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-
-namespace HeuristicLab_33.Tests {
-  [TestClass]
-  public class GaussianProcessRegressionTest {
-    public GaussianProcessRegressionTest() { }
-
-    private TestContext testContextInstance;
-
-    /// <summary>
-    ///Gets or sets the test context which provides
-    ///information about and functionality for the current test run.
-    ///</summary>
-    public TestContext TestContext {
-      get {
-        return testContextInstance;
-      }
-      set {
-        testContextInstance = value;
-      }
-    }
-
-    private EventWaitHandle trigger = new AutoResetEvent(false);
-    private Exception ex;
-
-    [TestMethod]
-    public void GaussianProcessRegressionPerformanceTest() {
-      ex = null;
-
-      var cv = new CrossValidation();
-      var alg = new GaussianProcessRegression();
-      alg.Engine = new SequentialEngine();
-      cv.Algorithm = alg;
-
-      cv.Problem = new RegressionProblem();
-      var rand = new HeuristicLab.Random.MersenneTwister();
-      double[,] data = GenerateData(100, rand);
-      List<string> variables = new List<string>() { "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "y" };
-      Dataset ds = new Dataset(variables, data);
-      cv.Problem.ProblemDataParameter.ActualValue = new RegressionProblemData(ds, variables.Take(10), variables.Last());
-      cv.Algorithm.Prepare();
-      cv.Folds.Value = 5;
-      cv.SamplesStart.Value = 0;
-      cv.SamplesEnd.Value = 99;
-
-      cv.ExceptionOccurred += new EventHandler<EventArgs<Exception>>(cv_ExceptionOccurred);
-      cv.Stopped += new EventHandler(cv_Stopped);
-
-      cv.Prepare();
-      cv.Start();
-      trigger.WaitOne();
-      if (ex != null) throw ex;
-
-      TestContext.WriteLine("Runtime: {0}", cv.ExecutionTime.ToString());
-
-    }
-
-    // poly-10: y = x1 x2 + x3 x4 + x5 x6 + x1 x7 x9 + x3 x6 x10
-    private double[,] GenerateData(int n, IRandom random) {
-      double[,] data = new double[n, 11];
-      for (int i = 0; i < n; i++) {
-        for (int c = 0; c < 10; c++) {
-          data[i, c] = random.NextDouble() * 2.0 - 1.0;
-        }
-        data[i, 10] =
-          data[i, 0] * data[i, 1] +
-          data[i, 2] * data[i, 3] +
-          data[i, 4] * data[i, 5] +
-          data[i, 0] * data[i, 6] * data[i, 8] +
-          data[i, 2] * data[i, 5] * data[i, 9];
-      }
-      return data;
-    }
-
-    private void cv_ExceptionOccurred(object sender, EventArgs<Exception> e) {
-      ex = e.Value;
-    }
-
-    private void cv_Stopped(object sender, EventArgs e) {
-      trigger.Set();
-    }
-  }
-}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Tests/HeuristicLab-3.3/InstantiateCreatablesTest.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Tests/HeuristicLab-3.3/InstantiateCreatablesTest.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Tests/HeuristicLab-3.3/InstantiateCreatablesTest.cs	(revision 8585)
@@ -28,6 +28,12 @@
 
 namespace HeuristicLab_33.Tests {
+
   [TestClass]
   public class InstantiateCreatablesTest {
+    // Use ClassInitialize to run code before running the first test in the class
+    [ClassInitialize]
+    public static void MyClassInitialize(TestContext testContext) {
+      PluginLoader.Assemblies.Any();
+    }
     [TestMethod]
     public void InstantiateAllCreatables() {
@@ -49,5 +55,5 @@
       }
 
-      Assert.IsTrue(!exceptions.Any());
+      Assert.IsTrue(!exceptions.Any(), string.Join(Environment.NewLine, exceptions));
     }
   }
Index: /branches/HeuristicLab.Mono/HeuristicLab.Tests/HeuristicLab-3.3/SamplesTest.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Tests/HeuristicLab-3.3/SamplesTest.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Tests/HeuristicLab-3.3/SamplesTest.cs	(revision 8585)
@@ -97,11 +97,4 @@
       ConfigureGeneticAlgorithmParameters<ProportionalSelector, OrderCrossover2, InversionManipulator>(
         ga, 100, 1, 1000, 0.05);
-
-      ga.Analyzer.Operators.SetItemCheckedState(ga.Analyzer.Operators
-        .OfType<TSPAlleleFrequencyAnalyzer>()
-        .Single(), false);
-      ga.Analyzer.Operators.SetItemCheckedState(ga.Analyzer.Operators
-        .OfType<TSPPopulationDiversityAnalyzer>()
-        .Single(), false);
       #endregion
       return ga;
@@ -350,4 +343,7 @@
       Assert.AreEqual(100.62175156249987, GetDoubleResult(ga, "CurrentWorstQuality"), 1E-8);
       Assert.AreEqual(100900, GetIntResult(ga, "EvaluatedSolutions"));
+      var bestTrainingSolution = (IClassificationSolution)ga.Results["Best training solution"].Value;
+      Assert.AreEqual(0.80625, bestTrainingSolution.TrainingAccuracy, 1E-8);
+      Assert.AreEqual(0.782608695652174, bestTrainingSolution.TestAccuracy, 1E-8);
     }
 
@@ -555,11 +551,4 @@
         UnidirectionalRingMigrator, BestSelector, WorstReplacer>(
         ga, 100, 1, 1000, 0.05, 5, 50, 0.25);
-
-      ga.Analyzer.Operators.SetItemCheckedState(ga.Analyzer.Operators
-        .OfType<TSPAlleleFrequencyAnalyzer>()
-        .Single(), false);
-      ga.Analyzer.Operators.SetItemCheckedState(ga.Analyzer.Operators
-        .OfType<TSPPopulationDiversityAnalyzer>()
-        .Single(), false);
       #endregion
       return ga;
@@ -836,10 +825,4 @@
       ts.TabuTenure.Value = 60;
 
-      ts.Analyzer.Operators.SetItemCheckedState(ts.Analyzer.Operators
-        .OfType<TSPAlleleFrequencyAnalyzer>()
-        .Single(), false);
-      ts.Analyzer.Operators.SetItemCheckedState(ts.Analyzer.Operators
-        .OfType<TSPPopulationDiversityAnalyzer>()
-        .Single(), false);
       #endregion
       ts.Engine = new ParallelEngine();
@@ -920,10 +903,4 @@
         .Single(), false);
       vns.ShakingOperator = shakingOperator;
-      vns.Analyzer.Operators.SetItemCheckedState(vns.Analyzer.Operators
-        .OfType<TSPAlleleFrequencyAnalyzer>()
-        .Single(), false);
-      vns.Analyzer.Operators.SetItemCheckedState(vns.Analyzer.Operators
-        .OfType<TSPPopulationDiversityAnalyzer>()
-        .Single(), false);
       #endregion
       vns.Engine = new ParallelEngine();
Index: /branches/HeuristicLab.Mono/HeuristicLab.Tests/HeuristicLab.Algorithms.DataAnalysis-3.4/GaussianProcessFunctionsTest.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Tests/HeuristicLab.Algorithms.DataAnalysis-3.4/GaussianProcessFunctionsTest.cs	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Tests/HeuristicLab.Algorithms.DataAnalysis-3.4/GaussianProcessFunctionsTest.cs	(revision 8585)
@@ -123,19 +123,19 @@
       );
 
-      //      prod.Factors.Clear();
-      //      prod.Factors.Add(new MeanConst());
-      //      prod.Factors.Add(new MeanLinear());
-      //      TestMeanFunction(prod, 1,
-      //  new double[] { 2.9087, 1.8646, 3.1971, 1.9889, 1.7639, 1.2801, 2.8059, 3.7243, 3.1901, 1.4979 },
-      //  new double[][]
-      //          {
-      //            new double[] { 1.8436,    2.1279,    3.1166,    1.6886,    3.2505,    2.9613,    2.3260,    1.7293,   1.7697,    2.3982 },
-      //            new double[] { 0.6443,    0.3786,    0.8116,    0.5328,    0.3507,    0.9390,    0.8759,    0.5502,   0.6225,    0.5870 },
-      //            new double[] { 0.2077,    0.3012,    0.4709,    0.2305,    0.8443,    0.1948,    0.2259,    0.1707,   0.2277,    0.4357 },
-      //            new double[] { 0.3111,    0.9234,    0.4302,    0.1848,    0.9049,    0.9797,    0.4389,    0.1111,   0.2581,    0.4087 },
-      //            new double[] { 0.5949,    0.2622,    0.6028,    0.7112,    0.2217,    0.1174,    0.2967,    0.3188,   0.4242,    0.5079 },
-      //            new double[] { 0.0855,    0.2625,    0.8010,    0.0292,    0.9289,    0.7303,    0.4886,    0.5785,   0.2373,    0.4588 }
-      //          }
-      //);
+      prod.Factors.Clear();
+      prod.Factors.Add(new MeanConst());
+      prod.Factors.Add(new MeanLinear());
+      TestMeanFunction(prod, 1,
+  new double[] { 1.843574580675791, 2.127929337522181, 3.116568910281474, 1.688566127130978, 3.250517738447450, 2.961262743634280, 2.326019412613392, 1.729286976436201, 1.769654419215176, 2.398170347588917 },
+  new double[][]
+                {
+                  new double[] { 2.9088,    1.8646,    3.1971,    1.9890,    1.7640,    1.2801,    2.8059,    3.7243,    3.1899    ,1.4978 },
+                  new double[] { 0.4173,    0.0497,    0.9027,    0.9448,    0.4909,    0.4893,    0.3377,    0.9001,    0.3692    ,0.1112 },
+                  new double[] { 0.7803,    0.3897,    0.2417,    0.4039,    0.0965,    0.1320,    0.9421,    0.9561,    0.5752    ,0.0598 },
+                  new double[] { 0.2348,    0.3532,    0.8212,    0.0154,    0.0430,    0.1690,    0.6491,    0.7317,    0.6477    ,0.4509 },
+                  new double[] { 0.5470,    0.2963,    0.7447,    0.1890,    0.6868,    0.1835,    0.3685,    0.6256,    0.7802    ,0.0811 },
+                  new double[] { 0.9294,    0.7757,    0.4868,    0.4359,    0.4468,    0.3063,    0.5085,    0.5108,    0.8176    ,0.7948 }
+                }
+);
     }
 
@@ -185,26 +185,26 @@
           {
             new double[,] {
-{    0.6345,    0.6652,    0.2647,    0.6484,    0.4251,    0.6943,    0.5427,    0.4338,    0.5527,    0.3280},
-{    0.5921,    0.4959,    0.4876,    0.6115,    0.4601,    0.6702,    0.5360,    0.3252,    0.4791,    0.3526},
-{    0.3961,    0.4296,    0.2816,    0.5165,    0.6456,    0.3784,    0.2923,    0.5455,    0.4237,    0.3036},
-{    0.3916,    0.6566,    0.3888,    0.4777,    0.7173,    0.6255,    0.2051,    0.2256,    0.2498,    0.3182},
-{    0.2181,    0.6194,    0.4041,    0.1929,    0.7305,    0.7077,    0.3750,    0.1532,    0.1758,    0.2510},
-{    0.2344,    0.4538,    0.4967,    0.3056,    0.7032,    0.6205,    0.2413,    0.0960,    0.0929,    0.2492},
-{    0.5996,    0.4229,    0.4622,    0.6365,    0.2384,    0.6451,    0.5566,    0.5865,    0.5446,    0.3263},
-{    0.6017,    0.5846,    0.3398,    0.6585,    0.4850,    0.5905,    0.5060,    0.6636,    0.5900,    0.3834},
-{    0.5719,    0.5057,    0.2476,    0.6023,    0.3674,    0.6144,    0.5216,    0.5174,    0.5364,    0.2776},
-{    0.6327,    0.4789,    0.5849,    0.6712,    0.5796,    0.6030,    0.5167,    0.3428,    0.5177,    0.4767},
+{         0,    0.3197,    0.6358,    0.5518,    0.5207,    0.5909,    0.3361,    0.4897,    0.2447,    0.5720},
+{    0.3197,         0,    0.6697,    0.6190,    0.4635,    0.4047,    0.4190,    0.6899,    0.3650,    0.1552},
+{    0.6358,    0.6697,         0,    0.6031,    0.5367,    0.5927,    0.6008,    0.4084,    0.4103,    0.6843},
+{    0.5518,    0.6190,    0.6031,         0,    0.4173,    0.2740,    0.6339,    0.6114,    0.6702,    0.6455},
+{    0.5207,    0.4635,    0.5367,    0.4173,         0,    0.2510,    0.6610,    0.6935,    0.5180,    0.5362},
+{    0.5909,    0.4047,    0.5927,    0.2740,    0.2510,         0,    0.6019,    0.6955,    0.6232,    0.3756},
+{    0.3361,    0.4190,    0.6008,    0.6339,    0.6610,    0.6019,         0,    0.3205,    0.3279,    0.6165},
+{    0.4897,    0.6899,    0.4084,    0.6114,    0.6935,    0.6955,    0.3205,         0,    0.4189,    0.7344},
+{    0.2447,    0.3650,    0.4103,    0.6702,    0.5180,    0.6232,    0.3279,    0.4189,         0,    0.5595},
+{    0.5720,    0.1552,    0.6843,    0.6455,    0.5362,    0.3756,    0.6165,    0.7344,    0.5595,         0},
             },
             new double[,] {
-{    1.1542,    1.0808,    1.7137,    1.1224,    1.5090,    0.9961,    1.3298,    1.4968,    1.3127,    1.6369},
-{    1.2413,    1.4053,    1.4181,    1.2031,    1.4591,    1.0675,    1.3411,    1.6404,    1.4309,    1.6057},
-{    1.5486,    1.5027,    1.6936,    1.3729,    1.1289,    1.5721,    1.6807,    1.3251,    1.5109,    1.6670},
-{    1.5547,    1.1026,    1.5584,    1.4331,    0.9067,    1.1739,    1.7826,    1.7593,    1.7313,    1.6490},
-{    1.7679,    1.1868,    1.5379,    1.7963,    0.8253,    0.9483,    1.5767,    1.8403,    1.8154,    1.7298},
-{    1.7492,    1.4683,    1.4041,    1.6646,    0.9652,    1.1845,    1.7411,    1.9016,    1.9048,    1.7320},
-{    1.2267,    1.5121,    1.4560,    1.1498,    1.7445,    1.1302,    1.3060,    1.2519,    1.3266,    1.6389},
-{    1.2227,    1.2555,    1.6220,    1.0978,    1.4220,    1.2443,    1.3896,    1.0850,    1.2454,    1.5656},
-{    1.2789,    1.3900,    1.7339,    1.2214,    1.5866,    1.1971,    1.3647,    1.3715,    1.3404,    1.6984},
-{    1.1581,    1.4312,    1.2549,    1.0647,    1.2647,    1.2200,    1.3726,    1.6182,    1.3709,    1.4346},
+{    2.0000,    1.6472,    1.1513,    1.3142,    1.3662,    1.2437,    1.6267,    1.4148,    1.7372,    1.2786},
+{    1.6472,    2.0000,    1.0689,    1.1876,    1.4541,    1.5370,    1.5174,    1.0103,    1.5898,    1.8381},
+{    1.1513,    1.0689,    2.0000,    1.2199,    1.3398,    1.2402,    1.2244,    1.5320,    1.5293,    1.0276},
+{    1.3142,    1.1876,    1.2199,    2.0000,    1.5197,    1.7027,    1.1555,    1.2033,    1.0675,    1.1291},
+{    1.3662,    1.4541,    1.3398,    1.5197,    2.0000,    1.7299,    1.0916,    0.9989,    1.3706,    1.3407},
+{    1.2437,    1.5370,    1.2402,    1.7027,    1.7299,    2.0000,    1.2223,    0.9923,    1.1787,    1.5758},
+{    1.6267,    1.5174,    1.2244,    1.1555,    1.0916,    1.2223,    2.0000,    1.6461,    1.6369,    1.1928},
+{    1.4148,    1.0103,    1.5320,    1.2033,    0.9989,    0.9923,    1.6461,    2.0000,    1.5176,    0.7806},
+{    1.7372,    1.5898,    1.5293,    1.0675,    1.3706,    1.1787,    1.6369,    1.5176,    2.0000,    1.3009},
+{    1.2786,    1.8381,    1.0276,    1.1291,    1.3407,    1.5758,    1.1928,    0.7806,    1.3009,    2.0000},
           }
           }
@@ -227,29 +227,550 @@
           {
             new double[,] {
-{    1.0207,    1.1326,    0.3026,    1.0685,    0.5423,    1.2686,    0.7724,    0.5574,    0.7955,    0.3900},
-{    0.8944,    0.6729,    0.6564,    0.9490,    0.6043,    1.1534,    0.7573,    0.3860,    0.6400,    0.4263},
-{    0.4942,    0.5501,    0.3252,    0.7151,    1.0586,    0.4660,    0.3398,    0.7787,    0.5400,    0.3554},
-{    0.4868,    1.0987,    0.4824,    0.6372,    1.4215,    0.9914,    0.2266,    0.2521,    0.2830,    0.3760},
-{    0.2427,    0.9726,    0.5072,    0.2117,    1.5705,    1.3491,    0.4606,    0.1646,    0.1911,    0.2846},
-{    0.2632,    0.5928,    0.6745,    0.3581,    1.3203,    0.9760,    0.2721,    0.1002,    0.0969,    0.2822},
-{    0.9151,    0.5386,    0.6082,    1.0272,    0.2684,    1.0567,    0.8045,    0.8794,    0.7766,    0.3876},
-{    0.9208,    0.8744,    0.4072,    1.1062,    0.6514,    0.8901,    0.6932,    1.1260,    0.8886,    0.4738},
-{    0.8418,    0.6927,    0.2801,    0.9226,    0.4489,    0.9576,    0.7259,    0.7169,    0.7582,    0.3198},
-{    1.0149,    0.6396,    0.8752,    1.1578,    0.8615,    0.9246,    0.7154,    0.4117,    0.7177,    0.6353},
+{         0,    0.3781,    1.0250,    0.7934,    0.7239,    0.8910,    0.4018,    0.6606,    0.2764,    0.8421},
+{    0.3781,         0,    1.1512,    0.9715,    0.6106,    0.5082,    0.5320,    1.2453,    0.4451,    0.1669},
+{    1.0250,    1.1512,         0,    0.9248,    0.7589,    0.8960,    0.9183,    0.5143,    0.5175,    1.2171},
+{    0.7934,    0.9715,    0.9248,         0,    0.5292,    0.3149,    1.0188,    0.9487,    1.1534,    1.0583},
+{    0.7239,    0.6106,    0.7589,    0.5292,         0,    0.2845,    1.1157,    1.2640,    0.7182,    0.7577},
+{    0.8910,    0.5082,    0.8960,    0.3149,    0.2845,         0,    0.9214,    1.2749,    0.9845,    0.4616},
+{    0.4018,    0.5320,    0.9183,    1.0188,    1.1157,    0.9214,         0,    0.3793,    0.3899,    0.9638},
+{    0.6606,    1.2453,    0.5143,    0.9487,    1.2640,    1.2749,    0.3793,         0,    0.5318,    1.6567},
+{    0.2764,    0.4451,    0.5175,    1.1534,    0.7182,    0.9845,    0.3899,    0.5318,         0,    0.8116},
+{    0.8421,    0.1669,    1.2171,    1.0583,    0.7577,    0.4616,    0.9638,    1.6567,    0.8116,         0},
             },
             new double[,] {
-{   13.7185,   13.5970,   14.4724,   13.6668,   14.2254,   13.4477,   13.9840,   14.2096,   13.9596,   14.3828},
-{   13.8542,   14.0889,   14.1062,   13.7957,   14.1607,   13.5743,   14.0000,   14.3869,   14.1234,   14.3454},
-{   14.2753,   14.2173,   14.4492,   14.0445,   13.6775,   14.3044,   14.4343,   13.9773,   14.2278,   14.4183},
-{   14.2829,   13.6339,   14.2875,   14.1263,   13.2777,   13.7501,   14.5498,   14.5238,   14.4923,   14.3972},
-{   14.5334,   13.7703,   14.2618,   14.5649,   13.1097,   13.3585,   14.3100,   14.6126,   14.5857,   14.4907},
-{   14.5125,   14.1727,   14.0872,   14.4155,   13.3905,   13.7667,   14.5035,   14.6775,   14.6809,   14.4932},
-{   13.8321,   14.2292,   14.1566,   13.7114,   14.5073,   13.6796,   13.9499,   13.8703,   13.9795,   14.3852},
-{   13.8260,   13.8756,   14.3651,   13.6258,   14.1115,   13.8588,   14.0675,   13.6042,   13.8604,   14.2964},
-{   13.9103,   14.0681,   14.4953,   13.8241,   14.3221,   13.7864,   14.0331,   14.0426,   13.9991,   14.4548},
-{   13.7248,   14.1238,   13.8747,   13.5695,   13.8893,   13.8218,   14.0442,   14.3604,   14.0418,   14.1283},
+{   14.7781,   14.3950,   13.7138,   13.9618,   14.0352,   13.8578,   14.3707,   14.1018,   14.4990,   13.9100},
+{   14.3950,   14.7781,   13.5767,   13.7715,   14.1542,   14.2607,   14.2360,   13.4735,   14.3260,   14.6102},
+{   13.7138,   13.5767,   14.7781,   13.8217,   13.9982,   13.8525,   13.8286,   14.2545,   14.2511,   13.5045},
+{   13.9618,   13.7715,   13.8217,   14.7781,   14.2390,   14.4598,   13.7206,   13.7960,   13.5743,   13.6778},
+{   14.0352,   14.1542,   13.9982,   14.2390,   14.7781,   14.4908,   13.6154,   13.4528,   14.0413,   13.9995},
+{   13.8578,   14.2607,   13.8525,   14.4598,   14.4908,   14.7781,   13.8254,   13.4407,   13.7576,   14.3090},
+{   14.3707,   14.2360,   13.8286,   13.7206,   13.6154,   13.8254,   14.7781,   14.3938,   14.3828,   13.7798},
+{   14.1018,   13.4735,   14.2545,   13.7960,   13.4528,   13.4407,   14.3938,   14.7781,   14.2363,   13.0113},
+{   14.4990,   14.3260,   14.2511,   13.5743,   14.0413,   13.7576,   14.3828,   14.2363,   14.7781,   13.9425},
+{   13.9100,   14.6102,   13.5045,   13.6778,   13.9995,   14.3090,   13.7798,   13.0113,   13.9425,   14.7781},
             },
           }
        );
+    }
+
+    [TestMethod]
+    public void CovRQIsoTest() {
+      TestCovarianceFunction(new CovarianceRQiso(), 0,
+        new double[,]
+          {
+{    0.6452,    0.6190,    0.8662,    0.6338,    0.7802,    0.5893,    0.7102,    0.7753,    0.7037,    0.8331},
+{    0.6771,    0.7392,    0.7442,    0.6630,    0.7603,    0.6144,    0.7145,    0.8346,    0.7492,    0.8200},
+{    0.7963,    0.7777,    0.8574,    0.7266,    0.6362,    0.8060,    0.8519,    0.7084,    0.7810,    0.8459},
+{    0.7988,    0.6268,    0.8004,    0.7500,    0.5583,    0.6524,    0.8968,    0.8864,    0.8739,    0.8382},
+{    0.8902,    0.6571,    0.7919,    0.9030,    0.5304,    0.5727,    0.8079,    0.9232,    0.9117,    0.8733},
+{    0.8819,    0.7639,    0.7387,    0.8449,    0.5785,    0.6563,    0.8783,    0.9519,    0.9535,    0.8742},
+{    0.6716,    0.7814,    0.7590,    0.6437,    0.8797,    0.6366,    0.7012,    0.6810,    0.7090,    0.8339},
+{    0.6702,    0.6823,    0.8268,    0.6250,    0.7456,    0.6782,    0.7331,    0.6205,    0.6786,    0.8033},
+{    0.6910,    0.7332,    0.8750,    0.6697,    0.8119,    0.6608,    0.7235,    0.7261,    0.7142,    0.8595},
+{    0.6467,    0.7493,    0.6821,    0.6133,    0.6857,    0.6692,    0.7265,    0.8252,    0.7259,    0.7506},
+          },
+        new double[][,]
+          {
+            new double[,] {
+{         0,    0.2722,    0.4584,    0.4165,    0.3996,    0.4367,    0.2838,    0.3820,    0.2165,    0.4271},
+{    0.2722,         0,    0.4736,    0.4505,    0.3666,    0.3300,    0.3391,    0.4823,    0.3037,    0.1436},
+{    0.4584,    0.4736,         0,    0.4428,    0.4084,    0.4376,    0.4416,    0.3323,    0.3336,    0.4799},
+{    0.4165,    0.4505,    0.4428,         0,    0.3381,    0.2388,    0.4575,    0.4468,    0.4739,    0.4629},
+{    0.3996,    0.3666,    0.4084,    0.3381,         0,    0.2213,    0.4698,    0.4837,    0.3981,    0.4081},
+{    0.4367,    0.3300,    0.4376,    0.2388,    0.2213,         0,    0.4422,    0.4845,    0.4525,    0.3109},
+{    0.2838,    0.3391,    0.4416,    0.4575,    0.4698,    0.4422,         0,    0.2728,    0.2781,    0.4493},
+{    0.3820,    0.4823,    0.3323,    0.4468,    0.4837,    0.4845,    0.2728,         0,    0.3390,    0.4995},
+{    0.2165,    0.3037,    0.3336,    0.4739,    0.3981,    0.4525,    0.2781,    0.3390,         0,    0.4206},
+{    0.4271,    0.1436,    0.4799,    0.4629,    0.4081,    0.3109,    0.4493,    0.4995,    0.4206,         0},
+            },
+            new double[,] {
+{    2.0000,    1.6749,    1.2884,    1.4086,    1.4481,    1.3558,    1.6576,    1.4857,    1.7530,    1.3818},
+{    1.6749,    2.0000,    1.2296,    1.3147,    1.5166,    1.5831,    1.5672,    1.1884,    1.6266,    1.8443},
+{    1.2884,    1.2296,    2.0000,    1.3383,    1.4280,    1.3533,    1.3417,    1.5791,    1.5769,    1.2005},
+{    1.4086,    1.3147,    1.3383,    2.0000,    1.5691,    1.7228,    1.2914,    1.3262,    1.2286,    1.2725},
+{    1.4481,    1.5166,    1.4280,    1.5691,    2.0000,    1.7466,    1.2457,    1.1805,    1.4515,    1.4286},
+{    1.3558,    1.5831,    1.3533,    1.7228,    1.7466,    2.0000,    1.3401,    1.1758,    1.3083,    1.6150},
+{    1.6576,    1.5672,    1.3417,    1.2914,    1.2457,    1.3401,    2.0000,    1.6740,    1.6662,    1.3186},
+{    1.4857,    1.1884,    1.5791,    1.3262,    1.1805,    1.1758,    1.6740,    2.0000,    1.5674,    1.0305},
+{    1.7530,    1.6266,    1.5769,    1.2286,    1.4515,    1.3083,    1.6662,    1.5674,    2.0000,    1.3985},
+{    1.3818,    1.8443,    1.2005,    1.2725,    1.4286,    1.6150,    1.3186,    1.0305,    1.3985,    2.0000},
+          },
+                      new double[,] {
+{         0,   -0.0124,   -0.0541,   -0.0386,   -0.0340,   -0.0452,   -0.0137,   -0.0298,   -0.0073,   -0.0419},
+{   -0.0124,         0,   -0.0623,   -0.0505,   -0.0265,   -0.0200,   -0.0215,   -0.0682,   -0.0162,   -0.0029},
+{   -0.0541,   -0.0623,         0,   -0.0474,   -0.0363,   -0.0455,   -0.0470,   -0.0204,   -0.0206,   -0.0664},
+{   -0.0386,   -0.0505,   -0.0474,         0,   -0.0213,   -0.0091,   -0.0537,   -0.0490,   -0.0624,   -0.0563},
+{   -0.0340,   -0.0265,   -0.0363,   -0.0213,         0,   -0.0077,   -0.0600,   -0.0693,   -0.0336,   -0.0362},
+{   -0.0452,   -0.0200,   -0.0455,   -0.0091,   -0.0077,         0,   -0.0472,   -0.0700,   -0.0514,   -0.0172},
+{   -0.0137,   -0.0215,   -0.0470,   -0.0537,   -0.0600,   -0.0472,         0,   -0.0125,   -0.0131,   -0.0500},
+{   -0.0298,   -0.0682,   -0.0204,   -0.0490,   -0.0693,   -0.0700,   -0.0125,         0,   -0.0215,   -0.0919},
+{   -0.0073,   -0.0162,   -0.0206,   -0.0624,   -0.0336,   -0.0514,   -0.0131,   -0.0215,         0,   -0.0399},
+{   -0.0419,   -0.0029,   -0.0664,   -0.0563,   -0.0362,   -0.0172,   -0.0500,   -0.0919,   -0.0399,         0},
+          }
+          }
+      );
+      TestCovarianceFunction(new CovarianceRQiso(), 1,
+         new double[,]
+           {
+{    6.8660,    6.8070,    7.2367,    6.8409,    7.1145,    6.7347,    6.9959,    7.1068,    6.9839,    7.1923},
+{    6.9324,    7.0474,    7.0559,    6.9038,    7.0827,    6.7961,    7.0038,    7.1944,    7.0644,    7.1739},
+{    7.1392,    7.1106,    7.2253,    7.0255,    6.8461,    7.1536,    7.2179,    6.9926,    7.1158,    7.2099},
+{    7.1429,    6.8249,    7.1453,    7.0658,    6.6525,    6.8816,    7.2752,    7.2623,    7.2467,    7.1995},
+{    7.2671,    6.8913,    7.1326,    7.2827,    6.5716,    6.6915,    7.1564,    7.3065,    7.2931,    7.2459},
+{    7.2567,    7.0886,    7.0466,    7.2086,    6.7069,    6.8897,    7.2522,    7.3388,    7.3405,    7.2471},
+{    6.9215,    7.1164,    7.0807,    6.8626,    7.2540,    6.8471,    6.9792,    6.9401,    6.9937,    7.1935},
+{    6.9185,    6.9428,    7.1836,    6.8210,    7.0584,    6.9346,    7.0369,    6.8105,    6.9354,    7.1496},
+{    6.9598,    7.0372,    7.2481,    6.9176,    7.1623,    6.8992,    7.0200,    7.0247,    7.0033,    7.2280},
+{    6.8692,    7.0646,    6.9424,    6.7937,    6.9495,    6.9165,    7.0254,    7.1813,    7.0242,    7.0668},
+           },
+         new double[][,]
+          {
+            new double[,] {
+{         0,    0.3746,    0.9986,    0.7776,    0.7108,    0.8711,    0.3978,    0.6497,    0.2745,    0.8243},
+{    0.3746,         0,    1.1178,    0.9478,    0.6013,    0.5017,    0.5249,    1.2062,    0.4401,    0.1662},
+{    0.9986,    1.1178,         0,    0.9033,    0.7445,    0.8758,    0.8972,    0.5076,    0.5108,    1.1798},
+{    0.7776,    0.9478,    0.9033,         0,    0.5222,    0.3124,    0.9927,    0.9261,    1.1199,    1.0301},
+{    0.7108,    0.6013,    0.7445,    0.5222,         0,    0.2825,    1.0844,    1.2237,    0.7052,    0.7433},
+{    0.8711,    0.5017,    0.8758,    0.3124,    0.2825,         0,    0.9000,    1.2339,    0.9601,    0.4563},
+{    0.3978,    0.5249,    0.8972,    0.9927,    1.0844,    0.9000,         0,    0.3757,    0.3861,    0.9404},
+{    0.6497,    1.2062,    0.5076,    0.9261,    1.2237,    1.2339,    0.3757,         0,    0.5247,    1.5872},
+{    0.2745,    0.4401,    0.5108,    1.1199,    0.7052,    0.9601,    0.3861,    0.5247,         0,    0.7950},
+{    0.8243,    0.1662,    1.1798,    1.0301,    0.7433,    0.4563,    0.9404,    1.5872,    0.7950,         0},
+            },
+            new double[,] {
+{   14.7781,   14.3968,   13.7277,   13.9699,   14.0420,   13.8682,   14.3727,   14.1074,   14.5000,   13.9192},
+{   14.3968,   14.7781,   13.5943,   13.7839,   14.1589,   14.2640,   14.2397,   13.4942,   14.3286,   14.6106},
+{   13.7277,   13.5943,   14.7781,   13.8329,   14.0057,   13.8630,   13.8396,   14.2579,   14.2545,   13.5242},
+{   13.9699,   13.7839,   13.8329,   14.7781,   14.2426,   14.4610,   13.7342,   13.8078,   13.5920,   13.6926},
+{   14.0420,   14.1589,   14.0057,   14.2426,   14.7781,   14.4918,   13.6319,   13.4742,   14.0479,   14.0069},
+{   13.8682,   14.2640,   13.8630,   14.4610,   14.4918,   14.7781,   13.8365,   13.4625,   13.7703,   14.3117},
+{   14.3727,   14.2397,   13.8396,   13.7342,   13.6319,   13.8365,   14.7781,   14.3956,   14.3848,   13.7920},
+{   14.1074,   13.4942,   14.2579,   13.8078,   13.4742,   13.4625,   14.3956,   14.7781,   14.2399,   13.0490},
+{   14.5000,   14.3286,   14.2545,   13.5920,   14.0479,   13.7703,   14.3848,   14.2399,   14.7781,   13.9510},
+{   13.9192,   14.6106,   13.5242,   13.6926,   14.0069,   14.3117,   13.7920,   13.0490,   13.9510,   14.7781},
+            },
+            new double[,] {
+{         0,   -0.0009,   -0.0068,   -0.0040,   -0.0034,   -0.0051,   -0.0010,   -0.0028,   -0.0005,   -0.0046},
+{   -0.0009,         0,   -0.0086,   -0.0061,   -0.0024,   -0.0016,   -0.0018,   -0.0101,   -0.0013,   -0.0002},
+{   -0.0068,   -0.0086,         0,   -0.0055,   -0.0037,   -0.0052,   -0.0054,   -0.0017,   -0.0017,   -0.0097},
+{   -0.0040,   -0.0061,   -0.0055,         0,   -0.0018,   -0.0006,   -0.0067,   -0.0058,   -0.0087,   -0.0073},
+{   -0.0034,   -0.0024,   -0.0037,   -0.0018,         0,   -0.0005,   -0.0081,   -0.0105,   -0.0033,   -0.0037},
+{   -0.0051,   -0.0016,   -0.0052,   -0.0006,   -0.0005,         0,   -0.0055,   -0.0106,   -0.0063,   -0.0013},
+{   -0.0010,   -0.0018,   -0.0054,   -0.0067,   -0.0081,   -0.0055,         0,   -0.0009,   -0.0010,   -0.0060},
+{   -0.0028,   -0.0101,   -0.0017,   -0.0058,   -0.0105,   -0.0106,   -0.0009,         0,   -0.0018,   -0.0183},
+{   -0.0005,   -0.0013,   -0.0017,   -0.0087,   -0.0033,   -0.0063,   -0.0010,   -0.0018,         0,   -0.0042},
+{   -0.0046,   -0.0002,   -0.0097,   -0.0073,   -0.0037,   -0.0013,   -0.0060,   -0.0183,   -0.0042,         0},
+                           }
+          }
+       );
+    }
+
+
+    [TestMethod]
+    public void CovRQArdTest() {
+      TestCovarianceFunction(new CovarianceRQArd(), 0,
+        new double[,]
+          {
+{    0.6452,    0.6190,    0.8662,    0.6338,    0.7802,    0.5893,    0.7102,    0.7753,    0.7037,    0.8331},
+{    0.6771,    0.7392,    0.7442,    0.6630,    0.7603,    0.6144,    0.7145,    0.8346,    0.7492,    0.8200},
+{    0.7963,    0.7777,    0.8574,    0.7266,    0.6362,    0.8060,    0.8519,    0.7084,    0.7810,    0.8459},
+{    0.7988,    0.6268,    0.8004,    0.7500,    0.5583,    0.6524,    0.8968,    0.8864,    0.8739,    0.8382},
+{    0.8902,    0.6571,    0.7919,    0.9030,    0.5304,    0.5727,    0.8079,    0.9232,    0.9117,    0.8733},
+{    0.8819,    0.7639,    0.7387,    0.8449,    0.5785,    0.6563,    0.8783,    0.9519,    0.9535,    0.8742},
+{    0.6716,    0.7814,    0.7590,    0.6437,    0.8797,    0.6366,    0.7012,    0.6810,    0.7090,    0.8339},
+{    0.6702,    0.6823,    0.8268,    0.6250,    0.7456,    0.6782,    0.7331,    0.6205,    0.6786,    0.8033},
+{    0.6910,    0.7332,    0.8750,    0.6697,    0.8119,    0.6608,    0.7235,    0.7261,    0.7142,    0.8595},
+{    0.6467,    0.7493,    0.6821,    0.6133,    0.6857,    0.6692,    0.7265,    0.8252,    0.7259,    0.7506},
+          },
+        new double[][,]
+          {            
+        new double[,]
+          {
+{         0,    0.0948,    0.0978,    0.1380,    0.0028,    0.0024,    0.0044,    0.1286,    0.0018,    0.0447},
+{    0.0948,         0,    0.2750,    0.3462,    0.1119,    0.1211,    0.0509,    0.2553,    0.0675,    0.0032},
+{    0.0978,    0.2750,         0,    0.0008,    0.0864,    0.0782,    0.1437,    0.0000,    0.1769,    0.2257},
+{    0.1380,    0.3462,    0.0008,         0,    0.1268,    0.1539,    0.1537,    0.0009,    0.1250,    0.2813},
+{    0.0028,    0.1119,    0.0864,    0.1268,         0,    0.0000,    0.0091,    0.0583,    0.0078,    0.0736},
+{    0.0024,    0.1211,    0.0782,    0.1539,    0.0000,         0,    0.0103,    0.0583,    0.0062,    0.0932},
+{    0.0044,    0.0509,    0.1437,    0.1537,    0.0091,    0.0103,         0,    0.2216,    0.0007,    0.0223},
+{    0.1286,    0.2553,    0.0000,    0.0009,    0.0583,    0.0583,    0.2216,         0,    0.1731,    0.1652},
+{    0.0018,    0.0675,    0.1769,    0.1250,    0.0078,    0.0062,    0.0007,    0.1731,         0,    0.0325},
+{    0.0447,    0.0032,    0.2257,    0.2813,    0.0736,    0.0932,    0.0223,    0.1652,    0.0325,         0},
+          },
+        new double[,]
+          {
+{         0,    0.1070,    0.1204,    0.0703,    0.2451,    0.1932,    0.0180,    0.0171,    0.0323,    0.2478},
+{    0.1070,         0,    0.0083,    0.0001,    0.0494,    0.0416,    0.1874,    0.1133,    0.0228,    0.0925},
+{    0.1204,    0.0083,         0,    0.0118,    0.0107,    0.0055,    0.2208,    0.3181,    0.0691,    0.0119},
+{    0.0703,    0.0001,    0.0118,         0,    0.0582,    0.0549,    0.1208,    0.1341,    0.0111,    0.0479},
+{    0.2451,    0.0494,    0.0107,    0.0582,         0,    0.0010,    0.2774,    0.2574,    0.1207,    0.0007},
+{    0.1932,    0.0416,    0.0055,    0.0549,    0.0010,         0,    0.2946,    0.2347,    0.0840,    0.0034},
+{    0.0180,    0.1874,    0.2208,    0.1208,    0.2774,    0.2946,         0,    0.0001,    0.0934,    0.3384},
+{    0.0171,    0.1133,    0.3181,    0.1341,    0.2574,    0.2347,    0.0001,         0,    0.0891,    0.2133},
+{    0.0323,    0.0228,    0.0691,    0.0111,    0.1207,    0.0840,    0.0934,    0.0891,         0,    0.1299},
+{    0.2478,    0.0925,    0.0119,    0.0479,    0.0007,    0.0034,    0.3384,    0.2133,    0.1299,         0},
+          },
+        new double[,]
+          {
+{         0,    0.0098,    0.1427,    0.0239,    0.0193,    0.0020,    0.1179,    0.1363,    0.1310,    0.0223},
+{    0.0098,         0,    0.0828,    0.0493,    0.0553,    0.0213,    0.0538,    0.0506,    0.0574,    0.0081},
+{    0.1427,    0.0828,         0,    0.2908,    0.3087,    0.1947,    0.0133,    0.0050,    0.0187,    0.0494},
+{    0.0239,    0.0493,    0.2908,         0,    0.0005,    0.0175,    0.1674,    0.2256,    0.1509,    0.0768},
+{    0.0193,    0.0553,    0.3087,    0.0005,         0,    0.0121,    0.1425,    0.1652,    0.1926,    0.0849},
+{    0.0020,    0.0213,    0.1947,    0.0175,    0.0121,         0,    0.1035,    0.1094,    0.0981,    0.0518},
+{    0.1179,    0.0538,    0.0133,    0.1674,    0.1425,    0.1035,         0,    0.0048,    0.0000,    0.0171},
+{    0.1363,    0.0506,    0.0050,    0.2256,    0.1652,    0.1094,    0.0048,         0,    0.0043,    0.0209},
+{    0.1310,    0.0574,    0.0187,    0.1509,    0.1926,    0.0981,    0.0000,    0.0043,         0,    0.0189},
+{    0.0223,    0.0081,    0.0494,    0.0768,    0.0849,    0.0518,    0.0171,    0.0209,    0.0189,         0},
+          },
+        new double[,]
+          {
+{         0,    0.0441,    0.0162,    0.0636,    0.0102,    0.0607,    0.0219,    0.0034,    0.0418,    0.1036},
+{    0.0441,         0,    0.0760,    0.0050,    0.0877,    0.0080,    0.0032,    0.0383,    0.1549,    0.0394},
+{    0.0162,    0.0760,         0,    0.1383,    0.0017,    0.1442,    0.0637,    0.0088,    0.0008,    0.1587},
+{    0.0636,    0.0050,    0.1383,         0,    0.1525,    0.0000,    0.0134,    0.0838,    0.1319,    0.0047},
+{    0.0102,    0.0877,    0.0017,    0.1525,         0,    0.1932,    0.0393,    0.0013,    0.0046,    0.1872},
+{    0.0607,    0.0080,    0.1442,    0.0000,    0.1932,         0,    0.0154,    0.0676,    0.1524,    0.0068},
+{    0.0219,    0.0032,    0.0637,    0.0134,    0.0393,    0.0154,         0,    0.0463,    0.1176,    0.0359},
+{    0.0034,    0.0383,    0.0088,    0.0838,    0.0013,    0.0676,    0.0463,         0,    0.0147,    0.0787},
+{    0.0418,    0.1549,    0.0008,    0.1319,    0.0046,    0.1524,    0.1176,    0.0147,         0,    0.2390},
+{    0.1036,    0.0394,    0.1587,    0.0047,    0.1872,    0.0068,    0.0359,    0.0787,    0.2390,         0},
+          },
+        new double[,]
+          {
+{         0,    0.0166,    0.0813,    0.1208,    0.1221,    0.1784,    0.1217,    0.0967,    0.0096,    0.0086},
+{    0.0166,         0,    0.0315,    0.0499,    0.0622,    0.1381,    0.0438,    0.0248,    0.0012,    0.0003},
+{    0.0813,    0.0315,         0,    0.0012,    0.0008,    0.0149,    0.0002,    0.0004,    0.0680,    0.0342},
+{    0.1208,    0.0499,    0.0012,         0,    0.0001,    0.0125,    0.0022,    0.0025,    0.0550,    0.0521},
+{    0.1221,    0.0622,    0.0008,    0.0001,         0,    0.0151,    0.0015,    0.0014,    0.0724,    0.0618},
+{    0.1784,    0.1381,    0.0149,    0.0125,    0.0151,         0,    0.0184,    0.0145,    0.1119,    0.1556},
+{    0.1217,    0.0438,    0.0002,    0.0022,    0.0015,    0.0184,         0,    0.0000,    0.0663,    0.0356},
+{    0.0967,    0.0248,    0.0004,    0.0025,    0.0014,    0.0145,    0.0000,         0,    0.0578,    0.0214},
+{    0.0096,    0.0012,    0.0680,    0.0550,    0.0724,    0.1119,    0.0663,    0.0578,         0,    0.0003},
+{    0.0086,    0.0003,    0.0342,    0.0521,    0.0618,    0.1556,    0.0356,    0.0214,    0.0003,         0},
+          },
+        new double[,]
+          {
+{    2.0000,    1.6749,    1.2884,    1.4086,    1.4481,    1.3558,    1.6576,    1.4857,    1.7530,    1.3818},
+{    1.6749,    2.0000,    1.2296,    1.3147,    1.5166,    1.5831,    1.5672,    1.1884,    1.6266,    1.8443},
+{    1.2884,    1.2296,    2.0000,    1.3383,    1.4280,    1.3533,    1.3417,    1.5791,    1.5769,    1.2005},
+{    1.4086,    1.3147,    1.3383,    2.0000,    1.5691,    1.7228,    1.2914,    1.3262,    1.2286,    1.2725},
+{    1.4481,    1.5166,    1.4280,    1.5691,    2.0000,    1.7466,    1.2457,    1.1805,    1.4515,    1.4286},
+{    1.3558,    1.5831,    1.3533,    1.7228,    1.7466,    2.0000,    1.3401,    1.1758,    1.3083,    1.6150},
+{    1.6576,    1.5672,    1.3417,    1.2914,    1.2457,    1.3401,    2.0000,    1.6740,    1.6662,    1.3186},
+{    1.4857,    1.1884,    1.5791,    1.3262,    1.1805,    1.1758,    1.6740,    2.0000,    1.5674,    1.0305},
+{    1.7530,    1.6266,    1.5769,    1.2286,    1.4515,    1.3083,    1.6662,    1.5674,    2.0000,    1.3985},
+{    1.3818,    1.8443,    1.2005,    1.2725,    1.4286,    1.6150,    1.3186,    1.0305,    1.3985,    2.0000},
+          },
+        new double[,]
+          {
+{         0,   -0.0124,   -0.0541,   -0.0386,   -0.0340,   -0.0452,   -0.0137,   -0.0298,   -0.0073,   -0.0419},
+{   -0.0124,         0,   -0.0623,   -0.0505,   -0.0265,   -0.0200,   -0.0215,   -0.0682,   -0.0162,   -0.0029},
+{   -0.0541,   -0.0623,         0,   -0.0474,   -0.0363,   -0.0455,   -0.0470,   -0.0204,   -0.0206,   -0.0664},
+{   -0.0386,   -0.0505,   -0.0474,         0,   -0.0213,   -0.0091,   -0.0537,   -0.0490,   -0.0624,   -0.0563},
+{   -0.0340,   -0.0265,   -0.0363,   -0.0213,         0,   -0.0077,   -0.0600,   -0.0693,   -0.0336,   -0.0362},
+{   -0.0452,   -0.0200,   -0.0455,   -0.0091,   -0.0077,         0,   -0.0472,   -0.0700,   -0.0514,   -0.0172},
+{   -0.0137,   -0.0215,   -0.0470,   -0.0537,   -0.0600,   -0.0472,         0,   -0.0125,   -0.0131,   -0.0500},
+{   -0.0298,   -0.0682,   -0.0204,   -0.0490,   -0.0693,   -0.0700,   -0.0125,         0,   -0.0215,   -0.0919},
+{   -0.0073,   -0.0162,   -0.0206,   -0.0624,   -0.0336,   -0.0514,   -0.0131,   -0.0215,         0,   -0.0399},
+{   -0.0419,   -0.0029,   -0.0664,   -0.0563,   -0.0362,   -0.0172,   -0.0500,   -0.0919,   -0.0399,         0},
+          },
+          }
+      );
+
+      TestCovarianceFunction(new CovarianceRQArd(), 1,
+       new double[,]
+          {
+{    6.8660,    6.8070,    7.2367,    6.8409,    7.1145,    6.7347,    6.9959,    7.1068,    6.9839,    7.1923},
+{    6.9324,    7.0474,    7.0559,    6.9038,    7.0827,    6.7961,    7.0038,    7.1944,    7.0644,    7.1739},
+{    7.1392,    7.1106,    7.2253,    7.0255,    6.8461,    7.1536,    7.2179,    6.9926,    7.1158,    7.2099},
+{    7.1429,    6.8249,    7.1453,    7.0658,    6.6525,    6.8816,    7.2752,    7.2623,    7.2467,    7.1995},
+{    7.2671,    6.8913,    7.1326,    7.2827,    6.5716,    6.6915,    7.1564,    7.3065,    7.2931,    7.2459},
+{    7.2567,    7.0886,    7.0466,    7.2086,    6.7069,    6.8897,    7.2522,    7.3388,    7.3405,    7.2471},
+{    6.9215,    7.1164,    7.0807,    6.8626,    7.2540,    6.8471,    6.9792,    6.9401,    6.9937,    7.1935},
+{    6.9185,    6.9428,    7.1836,    6.8210,    7.0584,    6.9346,    7.0369,    6.8105,    6.9354,    7.1496},
+{    6.9598,    7.0372,    7.2481,    6.9176,    7.1623,    6.8992,    7.0200,    7.0247,    7.0033,    7.2280},
+{    6.8692,    7.0646,    6.9424,    6.7937,    6.9495,    6.9165,    7.0254,    7.1813,    7.0242,    7.0668},
+          },
+       new double[][,]
+          {            
+        new double[,]
+          {
+{         0,    0.1304,    0.2130,    0.2577,    0.0051,    0.0048,    0.0061,    0.2187,    0.0023,    0.0863},
+{    0.1304,         0,    0.6491,    0.7284,    0.1836,    0.1841,    0.0788,    0.6386,    0.0979,    0.0037},
+{    0.2130,    0.6491,         0,    0.0016,    0.1576,    0.1566,    0.2918,    0.0000,    0.2709,    0.5549},
+{    0.2577,    0.7284,    0.0016,         0,    0.1959,    0.2014,    0.3334,    0.0018,    0.2955,    0.6260},
+{    0.0051,    0.1836,    0.1576,    0.1959,         0,    0.0000,    0.0210,    0.1476,    0.0138,    0.1340},
+{    0.0048,    0.1841,    0.1566,    0.2014,    0.0000,         0,    0.0210,    0.1485,    0.0131,    0.1368},
+{    0.0061,    0.0788,    0.2918,    0.3334,    0.0210,    0.0210,         0,    0.3051,    0.0010,    0.0467},
+{    0.2187,    0.6386,    0.0000,    0.0018,    0.1476,    0.1485,    0.3051,         0,    0.2679,    0.5250},
+{    0.0023,    0.0979,    0.2709,    0.2955,    0.0138,    0.0131,    0.0010,    0.2679,         0,    0.0615},
+{    0.0863,    0.0037,    0.5549,    0.6260,    0.1340,    0.1368,    0.0467,    0.5250,    0.0615,         0},
+          },
+        new double[,]
+          {
+{         0,    0.1472,    0.2623,    0.1312,    0.4360,    0.3853,    0.0252,    0.0290,    0.0410,    0.4783},
+{    0.1472,         0,    0.0195,    0.0002,    0.0811,    0.0633,    0.2900,    0.2833,    0.0330,    0.1071},
+{    0.2623,    0.0195,         0,    0.0240,    0.0196,    0.0110,    0.4485,    0.4860,    0.1059,    0.0293},
+{    0.1312,    0.0002,    0.0240,         0,    0.0898,    0.0718,    0.2620,    0.2779,    0.0262,    0.1067},
+{    0.4360,    0.0811,    0.0196,    0.0898,         0,    0.0012,    0.6403,    0.6512,    0.2138,    0.0013},
+{    0.3853,    0.0633,    0.0110,    0.0718,    0.0012,         0,    0.5997,    0.5978,    0.1783,    0.0050},
+{    0.0252,    0.2900,    0.4485,    0.2620,    0.6403,    0.5997,         0,    0.0002,    0.1297,    0.7083},
+{    0.0290,    0.2833,    0.4860,    0.2779,    0.6512,    0.5978,    0.0002,         0,    0.1379,    0.6776},
+{    0.0410,    0.0330,    0.1059,    0.0262,    0.2138,    0.1783,    0.1297,    0.1379,         0,    0.2455},
+{    0.4783,    0.1071,    0.0293,    0.1067,    0.0013,    0.0050,    0.7083,    0.6776,    0.2455,         0},
+          },
+        new double[,]
+          {
+{         0,    0.0135,    0.3109,    0.0446,    0.0343,    0.0040,    0.1652,    0.2317,    0.1661,    0.0430},
+{    0.0135,         0,    0.1954,    0.1037,    0.0908,    0.0323,    0.0832,    0.1265,    0.0831,    0.0094},
+{    0.3109,    0.1954,         0,    0.5932,    0.5627,    0.3898,    0.0271,    0.0076,    0.0287,    0.1215},
+{    0.0446,    0.1037,    0.5932,         0,    0.0007,    0.0229,    0.3633,    0.4676,    0.3566,    0.1709},
+{    0.0343,    0.0908,    0.5627,    0.0007,         0,    0.0155,    0.3289,    0.4180,    0.3412,    0.1546},
+{    0.0040,    0.0323,    0.3898,    0.0229,    0.0155,         0,    0.2106,    0.2787,    0.2080,    0.0761},
+{    0.1652,    0.0832,    0.0271,    0.3633,    0.3289,    0.2106,         0,    0.0066,    0.0000,    0.0357},
+{    0.2317,    0.1265,    0.0076,    0.4676,    0.4180,    0.2787,    0.0066,         0,    0.0067,    0.0665},
+{    0.1661,    0.0831,    0.0287,    0.3566,    0.3412,    0.2080,    0.0000,    0.0067,         0,    0.0358},
+{    0.0430,    0.0094,    0.1215,    0.1709,    0.1546,    0.0761,    0.0357,    0.0665,    0.0358,         0},
+          },
+        new double[,]
+          {
+{         0,    0.0606,    0.0353,    0.1187,    0.0182,    0.1211,    0.0307,    0.0058,    0.0530,    0.2000},
+{    0.0606,         0,    0.1794,    0.0105,    0.1438,    0.0121,    0.0050,    0.0958,    0.2245,    0.0456},
+{    0.0353,    0.1794,         0,    0.2821,    0.0031,    0.2886,    0.1294,    0.0135,    0.0012,    0.3901},
+{    0.1187,    0.0105,    0.2821,         0,    0.2356,    0.0000,    0.0291,    0.1737,    0.3117,    0.0105},
+{    0.0182,    0.1438,    0.0031,    0.2356,         0,    0.2466,    0.0907,    0.0033,    0.0081,    0.3409},
+{    0.1211,    0.0121,    0.2886,    0.0000,    0.2466,         0,    0.0313,    0.1720,    0.3233,    0.0100},
+{    0.0307,    0.0050,    0.1294,    0.0291,    0.0907,    0.0313,         0,    0.0638,    0.1634,    0.0752},
+{    0.0058,    0.0958,    0.0135,    0.1737,    0.0033,    0.1720,    0.0638,         0,    0.0227,    0.2501},
+{    0.0530,    0.2245,    0.0012,    0.3117,    0.0081,    0.3233,    0.1634,    0.0227,         0,    0.4517},
+{    0.2000,    0.0456,    0.3901,    0.0105,    0.3409,    0.0100,    0.0752,    0.2501,    0.4517,         0},
+          },
+        new double[,]
+          {
+{         0,    0.0228,    0.1771,    0.2255,    0.2172,    0.3559,    0.1705,    0.1644,    0.0122,    0.0167},
+{    0.0228,         0,    0.0745,    0.1050,    0.1020,    0.2099,    0.0679,    0.0620,    0.0017,    0.0004},
+{    0.1771,    0.0745,         0,    0.0024,    0.0015,    0.0299,    0.0004,    0.0005,    0.1042,    0.0840},
+{    0.2255,    0.1050,    0.0024,         0,    0.0001,    0.0163,    0.0048,    0.0051,    0.1299,    0.1160},
+{    0.2172,    0.1020,    0.0015,    0.0001,         0,    0.0192,    0.0034,    0.0036,    0.1283,    0.1125},
+{    0.3559,    0.2099,    0.0299,    0.0163,    0.0192,         0,    0.0374,    0.0368,    0.2374,    0.2284},
+{    0.1705,    0.0679,    0.0004,    0.0048,    0.0034,    0.0374,         0,    0.0000,    0.0921,    0.0746},
+{    0.1644,    0.0620,    0.0005,    0.0051,    0.0036,    0.0368,    0.0000,         0,    0.0895,    0.0680},
+{    0.0122,    0.0017,    0.1042,    0.1299,    0.1283,    0.2374,    0.0921,    0.0895,         0,    0.0005},
+{    0.0167,    0.0004,    0.0840,    0.1160,    0.1125,    0.2284,    0.0746,    0.0680,    0.0005,         0},
+          },
+        new double[,]
+          {
+{   14.7781,   14.3968,   13.7277,   13.9699,   14.0420,   13.8682,   14.3727,   14.1074,   14.5000,   13.9192},
+{   14.3968,   14.7781,   13.5943,   13.7839,   14.1589,   14.2640,   14.2397,   13.4942,   14.3286,   14.6106},
+{   13.7277,   13.5943,   14.7781,   13.8329,   14.0057,   13.8630,   13.8396,   14.2579,   14.2545,   13.5242},
+{   13.9699,   13.7839,   13.8329,   14.7781,   14.2426,   14.4610,   13.7342,   13.8078,   13.5920,   13.6926},
+{   14.0420,   14.1589,   14.0057,   14.2426,   14.7781,   14.4918,   13.6319,   13.4742,   14.0479,   14.0069},
+{   13.8682,   14.2640,   13.8630,   14.4610,   14.4918,   14.7781,   13.8365,   13.4625,   13.7703,   14.3117},
+{   14.3727,   14.2397,   13.8396,   13.7342,   13.6319,   13.8365,   14.7781,   14.3956,   14.3848,   13.7920},
+{   14.1074,   13.4942,   14.2579,   13.8078,   13.4742,   13.4625,   14.3956,   14.7781,   14.2399,   13.0490},
+{   14.5000,   14.3286,   14.2545,   13.5920,   14.0479,   13.7703,   14.3848,   14.2399,   14.7781,   13.9510},
+{   13.9192,   14.6106,   13.5242,   13.6926,   14.0069,   14.3117,   13.7920,   13.0490,   13.9510,   14.7781},
+          },
+        new double[,]
+          {
+{         0,   -0.0009,   -0.0068,   -0.0040,   -0.0034,   -0.0051,   -0.0010,   -0.0028,   -0.0005,   -0.0046},
+{   -0.0009,         0,   -0.0086,   -0.0061,   -0.0024,   -0.0016,   -0.0018,   -0.0101,   -0.0013,   -0.0002},
+{   -0.0068,   -0.0086,         0,   -0.0055,   -0.0037,   -0.0052,   -0.0054,   -0.0017,   -0.0017,   -0.0097},
+{   -0.0040,   -0.0061,   -0.0055,         0,   -0.0018,   -0.0006,   -0.0067,   -0.0058,   -0.0087,   -0.0073},
+{   -0.0034,   -0.0024,   -0.0037,   -0.0018,         0,   -0.0005,   -0.0081,   -0.0105,   -0.0033,   -0.0037},
+{   -0.0051,   -0.0016,   -0.0052,   -0.0006,   -0.0005,         0,   -0.0055,   -0.0106,   -0.0063,   -0.0013},
+{   -0.0010,   -0.0018,   -0.0054,   -0.0067,   -0.0081,   -0.0055,         0,   -0.0009,   -0.0010,   -0.0060},
+{   -0.0028,   -0.0101,   -0.0017,   -0.0058,   -0.0105,   -0.0106,   -0.0009,         0,   -0.0018,   -0.0183},
+{   -0.0005,   -0.0013,   -0.0017,   -0.0087,   -0.0033,   -0.0063,   -0.0010,   -0.0018,         0,   -0.0042},
+{   -0.0046,   -0.0002,   -0.0097,   -0.0073,   -0.0037,   -0.0013,   -0.0060,   -0.0183,   -0.0042,         0},
+          },
+          }
+     );
+    }
+
+
+    [TestMethod]
+    public void CovMaternIsoTest() {
+      var cov = new CovarianceMaternIso();
+      cov.DParameter.Value = cov.DParameter.ValidValues.Single(x => x.Value == 1);
+      TestCovarianceFunction(cov, 0,
+        new double[,]
+          {
+{    0.3504,    0.3297,    0.5736,    0.3413,    0.4721,    0.3071,    0.4052,    0.4670,    0.3995,    0.5310},
+{    0.3765,    0.4317,    0.4364,    0.3649,    0.4520,    0.3261,    0.4090,    0.5328,    0.4412,    0.5155},
+{    0.4891,    0.4695,    0.5618,    0.4200,    0.3432,    0.4996,    0.5545,    0.4036,    0.4729,    0.5468},
+{    0.4918,    0.3358,    0.4935,    0.4420,    0.2843,    0.3562,    0.6189,    0.6027,    0.5844,    0.5373},
+{    0.6085,    0.3600,    0.4844,    0.6291,    0.2643,    0.2947,    0.5017,    0.6650,    0.6440,    0.5835},
+{    0.5959,    0.4556,    0.4312,    0.5456,    0.2990,    0.3593,    0.5907,    0.7278,    0.7318,    0.5848},
+{    0.3720,    0.4733,    0.4507,    0.3492,    0.5928,    0.3435,    0.3972,    0.3798,    0.4041,    0.5320},
+{    0.3708,    0.3810,    0.5235,    0.3344,    0.4378,    0.3775,    0.4260,    0.3309,    0.3778,    0.4967},
+{    0.3884,    0.4261,    0.5860,    0.3704,    0.5063,    0.3631,    0.4172,    0.4196,    0.4088,    0.5645},
+{    0.3516,    0.4413,    0.3808,    0.3253,    0.3839,    0.3700,    0.4200,    0.5215,    0.4193,    0.4426},
+          },
+        new double[][,]
+          {
+            new double[,] {
+{         0,    0.3341,    0.3674,    0.3665,    0.3647,    0.3678,    0.3380,    0.3621,    0.3122,    0.3673},
+{    0.3341,         0,    0.3655,    0.3678,    0.3593,    0.3512,    0.3535,    0.3632,    0.3441,    0.2724},
+{    0.3674,    0.3655,         0,    0.3679,    0.3657,    0.3678,    0.3679,    0.3518,    0.3521,    0.3639},
+{    0.3665,    0.3678,    0.3679,         0,    0.3532,    0.3217,    0.3675,    0.3679,    0.3654,    0.3670},
+{    0.3647,    0.3593,    0.3657,    0.3532,         0,    0.3143,    0.3661,    0.3627,    0.3645,    0.3657},
+{    0.3678,    0.3512,    0.3678,    0.3217,    0.3143,         0,    0.3679,    0.3624,    0.3677,    0.3462},
+{    0.3380,    0.3535,    0.3679,    0.3675,    0.3661,    0.3679,         0,    0.3343,    0.3361,    0.3678},
+{    0.3621,    0.3632,    0.3518,    0.3679,    0.3627,    0.3624,    0.3343,         0,    0.3534,    0.3480},
+{    0.3122,    0.3441,    0.3521,    0.3654,    0.3645,    0.3677,    0.3361,    0.3534,         0,    0.3669},
+{    0.3673,    0.2724,    0.3639,    0.3670,    0.3657,    0.3462,    0.3678,    0.3480,    0.3669,         0},
+            },
+            new double[,] {
+{    2.0000,    1.0726,    0.6992,    0.7999,    0.8353,    0.7546,    1.0516,    0.8703,    1.1763,    0.7767},
+{    1.0726,    2.0000,    0.6529,    0.7205,    0.9001,    0.9680,    0.9512,    0.6215,    1.0157,    1.3261},
+{    0.6992,    0.6529,    2.0000,    0.7399,    0.8171,    0.7524,    0.7427,    0.9637,    0.9614,    0.6307},
+{    0.7999,    0.7205,    0.7399,    2.0000,    0.9532,    1.1341,    0.7016,    0.7298,    0.6522,    0.6865},
+{    0.8353,    0.9001,    0.8171,    0.9532,    2.0000,    1.1670,    0.6654,    0.6156,    0.8384,    0.8177},
+{    0.7546,    0.9680,    0.7524,    1.1341,    1.1670,    2.0000,    0.7414,    0.6121,    0.7152,    1.0027},
+{    1.0516,    0.9512,    0.7427,    0.7016,    0.6654,    0.7414,    2.0000,    1.0716,    1.0620,    0.7236},
+{    0.8703,    0.6215,    0.9637,    0.7298,    0.6156,    0.6121,    1.0716,    2.0000,    0.9514,    0.5073},
+{    1.1763,    1.0157,    0.9614,    0.6522,    0.8384,    0.7152,    1.0620,    0.9514,    2.0000,    0.7911},
+{    0.7767,    1.3261,    0.6307,    0.6865,    0.8177,    1.0027,    0.7236,    0.5073,    0.7911,    2.0000},
+          },
+          }
+      );
+
+      cov = new CovarianceMaternIso();
+      cov.DParameter.Value = cov.DParameter.ValidValues.Single(x => x.Value == 1);
+      TestCovarianceFunction(cov, 1,
+         new double[,]
+           {
+{    5.0240,    4.9127,    6.0225,    4.9757,    5.6062,    4.7858,    5.2996,    5.5839,    5.2720,    5.8539},
+{    5.1587,    5.4247,    5.4464,    5.0993,    5.5171,    4.8930,    5.3181,    5.8612,    5.4683,    5.7906},
+{    5.6795,    5.5947,    5.9766,    5.3703,    4.9856,    5.7244,    5.9479,    5.2920,    5.6098,    5.9177},
+{    5.6910,    4.9457,    5.6984,    5.4720,    4.6518,    5.0545,    6.1936,    6.1332,    6.0640,    5.8794},
+{    6.1550,    5.0740,    5.6595,    6.2308,    4.5290,    4.7142,    5.7333,    6.3593,    6.2847,    6.0607},
+{    6.1078,    5.5332,    5.4226,    5.9127,    4.7394,    5.0707,    6.0880,    6.5739,    6.5871,    6.0658},
+{    5.1358,    5.6116,    5.5116,    5.0174,    6.0960,    4.9875,    5.2612,    5.1753,    5.2945,    5.8581},
+{    5.1296,    5.1809,    5.8235,    4.9384,    5.4528,    5.1635,    5.3983,    4.9192,    5.1652,    5.7119},
+{    5.2179,    5.3989,    6.0701,    5.1278,    5.7524,    5.0900,    5.3568,    5.3681,    5.3171,    5.9874},
+{    5.0301,    5.4688,    5.1800,    4.8886,    5.1954,    5.1255,    5.3700,    5.8155,    5.3671,    5.4746},
+           },
+         new double[][,]
+          {
+            new double[,] {
+{         0,    1.3467,    1.9408,    1.7781,    1.7213,    1.8512,    1.3793,    1.6654,    1.1869,    1.8156},
+{    1.3467,         0,    2.0157,    1.9064,    1.6180,    1.5105,    1.5369,    2.0667,    1.4355,    0.9602},
+{    1.9408,    2.0157,         0,    1.8749,    1.7505,    1.8547,    1.8704,    1.5173,    1.5209,    2.0519},
+{    1.7781,    1.9064,    1.8749,         0,    1.5338,    1.2516,    1.9369,    1.8912,    2.0170,    1.9613},
+{    1.7213,    1.6180,    1.7505,    1.5338,         0,    1.2011,    1.9955,    2.0764,    1.7164,    1.7495},
+{    1.8512,    1.5105,    1.8547,    1.2516,    1.2011,         0,    1.8725,    2.0820,    1.9149,    1.4559},
+{    1.3793,    1.5369,    1.8704,    1.9369,    1.9955,    1.8725,         0,    1.3483,    1.3632,    1.9013},
+{    1.6654,    2.0667,    1.5173,    1.8912,    2.0764,    2.0820,    1.3483,         0,    1.5366,    2.2512},
+{    1.1869,    1.4355,    1.5209,    2.0170,    1.7164,    1.9149,    1.3632,    1.5366,         0,    1.7923},
+{    1.8156,    0.9602,    2.0519,    1.9613,    1.7495,    1.4559,    1.9013,    2.2512,    1.7923,         0},
+            },
+            new double[,] {
+{   14.7781,   11.7510,   10.0394,   10.5489,   10.7184,   10.3248,   11.6660,   10.8814,   12.1567,   10.4351},
+{   11.7510,   14.7781,    9.7898,   10.1506,   11.0167,   11.3155,   11.2432,    9.6139,   11.5176,   12.7049},
+{   10.0394,    9.7898,   14.7781,   10.2506,   10.6319,   10.3138,   10.2646,   11.2970,   11.2870,    9.6657},
+{   10.5489,   10.1506,   10.2506,   14.7781,   11.2517,   11.9945,   10.0521,   10.1990,    9.7856,    9.9719},
+{   10.7184,   11.0167,   10.6319,   11.2517,   14.7781,   12.1214,    9.8583,    9.5798,   10.7329,   10.6348},
+{   10.3248,   11.3155,   10.3138,   11.9945,   12.1214,   14.7781,   10.2581,    9.5600,   10.1233,   11.4631},
+{   11.6660,   11.2432,   10.2646,   10.0521,    9.8583,   10.2581,   14.7781,   11.7468,   11.7082,   10.1669},
+{   10.8814,    9.6139,   11.2970,   10.1990,    9.5798,    9.5600,   11.7468,   14.7781,   11.2438,    8.9219},
+{   12.1567,   11.5176,   11.2870,    9.7856,   10.7329,   10.1233,   11.7082,   11.2438,   14.7781,   10.5061},
+{   10.4351,   12.7049,    9.6657,    9.9719,   10.6348,   11.4631,   10.1669,    8.9219,   10.5061,   14.7781},
+            },
+          }
+       );
+
+      cov = new CovarianceMaternIso();
+      cov.DParameter.Value = cov.DParameter.ValidValues.Single(x => x.Value == 5);
+      TestCovarianceFunction(cov, 0,
+         new double[,]
+           {
+{    0.4963,    0.4629,    0.7958,    0.4817,    0.6753,    0.4255,    0.5810,    0.6685,    0.5725,    0.7486},
+{    0.5375,    0.6197,    0.6264,    0.5193,    0.6481,    0.4570,    0.5867,    0.7507,    0.6331,    0.7303},
+{    0.6974,    0.6718,    0.7832,    0.6029,    0.4847,    0.7108,    0.7752,    0.5786,    0.6764,    0.7668},
+{    0.7008,    0.4727,    0.7030,    0.6342,    0.3873,    0.5056,    0.8402,    0.8250,    0.8069,    0.7559},
+{    0.8305,    0.5116,    0.6914,    0.8494,    0.3535,    0.4049,    0.7134,    0.8794,    0.8623,    0.8060},
+{    0.8184,    0.6530,    0.6190,    0.7654,    0.4121,    0.5105,    0.8132,    0.9232,    0.9256,    0.8074},
+{    0.5305,    0.6769,    0.6464,    0.4943,    0.8153,    0.4853,    0.5691,    0.5426,    0.5794,    0.7499},
+{    0.5286,    0.5443,    0.7399,    0.4706,    0.6283,    0.5390,    0.6115,    0.4648,    0.5395,    0.7071},
+{    0.5557,    0.6117,    0.8085,    0.5280,    0.7191,    0.5164,    0.5987,    0.6022,    0.5864,    0.7862},
+{    0.4982,    0.6333,    0.5441,    0.4557,    0.5488,    0.5273,    0.6028,    0.7375,    0.6019,    0.6350},
+           },
+         new double[][,]
+          {
+            new double[,] {
+{         0,    0.3844,    0.5881,    0.5499,    0.5324,    0.5694,    0.3987,    0.5135,    0.3134,    0.5603},
+{    0.3844,         0,    0.5987,    0.5817,    0.4964,    0.4543,    0.4650,    0.6029,    0.4230,    0.2154},
+{    0.5881,    0.5987,         0,    0.5749,    0.5416,    0.5703,    0.5739,    0.4571,    0.4586,    0.6019},
+{    0.5499,    0.5817,    0.5749,         0,    0.4638,    0.3422,    0.5874,    0.5785,    0.5988,    0.5915},
+{    0.5324,    0.4964,    0.5416,    0.4638,         0,    0.3197,    0.5963,    0.6034,    0.5308,    0.5413},
+{    0.5694,    0.4543,    0.5703,    0.3422,    0.3197,         0,    0.5744,    0.6036,    0.5833,    0.4316},
+{    0.3987,    0.4650,    0.5739,    0.5874,    0.5963,    0.5744,         0,    0.3852,    0.3917,    0.5806},
+{    0.5135,    0.6029,    0.4571,    0.5785,    0.6034,    0.6036,    0.3852,         0,    0.4649,    0.5937},
+{    0.3134,    0.4230,    0.4586,    0.5988,    0.5308,    0.5833,    0.3917,    0.4649,         0,    0.5539},
+{    0.5603,    0.2154,    0.6019,    0.5915,    0.5413,    0.4316,    0.5806,    0.5937,    0.5539,         0},
+            },
+            new double[,] {
+{    2.0000,    1.5097,    0.9901,    1.1464,    1.1989,    1.0773,    1.4852,    1.2492,    1.6213,    1.1113},
+{    1.5097,    2.0000,    0.9152,    1.0239,    1.2908,    1.3817,    1.3599,    0.8633,    1.4419,    1.7557},
+{    0.9901,    0.9152,    2.0000,    1.0545,    1.1721,    1.0739,    1.0588,    1.3761,    1.3731,    0.8785},
+{    1.1464,    1.0239,    1.0545,    2.0000,    1.3625,    1.5777,    0.9939,    1.0387,    0.9139,    0.9697},
+{    1.1989,    1.2908,    1.1721,    1.3625,    2.0000,    1.6120,    0.9356,    0.8534,    1.2033,    1.1730},
+{    1.0773,    1.3817,    1.0739,    1.5777,    1.6120,    2.0000,    1.0568,    0.8477,    1.0156,    1.4258},
+{    1.4852,    1.3599,    1.0588,    0.9939,    0.9356,    1.0568,    2.0000,    1.5084,    1.4974,    1.0289},
+{    1.2492,    0.8633,    1.3761,    1.0387,    0.8534,    0.8477,    1.5084,    2.0000,    1.3601,    0.6706},
+{    1.6213,    1.4419,    1.3731,    0.9139,    1.2033,    1.0156,    1.4974,    1.3601,    2.0000,    1.1332},
+{    1.1113,    1.7557,    0.8785,    0.9697,    1.1730,    1.4258,    1.0289,    0.6706,    1.1332,    2.0000},
+            },
+          }
+       );
+
+      cov = new CovarianceMaternIso();
+      cov.DParameter.Value = cov.DParameter.ValidValues.Single(x => x.Value == 5);
+      TestCovarianceFunction(cov, 1,
+         new double[,]
+           {
+{    6.5823,    6.4972,    7.1422,    6.5459,    6.9521,    6.3944,    6.7729,    6.9402,    6.7551,    7.0723},
+{    6.6790,    6.8501,    6.8629,    6.6372,    6.9035,    6.4817,    6.7847,    7.0756,    6.8757,    7.0436},
+{    6.9899,    6.9460,    7.1241,    6.8172,    6.5535,    7.0122,    7.1124,    6.7680,    6.9540,    7.0999},
+{    6.9957,    6.5229,    6.9993,    6.8778,    6.2792,    6.6048,    7.2033,    7.1828,    7.1579,    7.0835},
+{    7.1904,    6.6190,    6.9797,    7.2154,    6.1675,    6.3337,    7.0164,    7.2536,    7.2321,    7.1567},
+{    7.1739,    6.9125,    6.8488,    7.0978,    6.3553,    6.6166,    7.1667,    7.3062,    7.3089,    7.1586},
+{    6.6630,    6.9549,    6.9004,    6.5773,    7.1696,    6.5549,    6.7481,    6.6904,    6.7696,    7.0742},
+{    6.6587,    6.6943,    7.0587,    6.5173,    6.8667,    6.6823,    6.8343,    6.5023,    6.6835,    7.0060},
+{    6.7194,    6.8347,    7.1602,    6.6574,    7.0257,    6.6305,    6.8089,    6.8159,    6.7840,    7.1284},
+{    6.5868,    6.8760,    6.6937,    6.4782,    6.7042,    6.6558,    6.8171,    7.0551,    6.8153,    6.8793},
+           },
+         new double[][,]
+          {
+            new double[,] {
+{         0,    0.5862,    1.4459,    1.1551,    1.0644,    1.2798,    0.6204,    0.9803,    0.4359,    1.2178},
+{    0.5862,         0,    1.5974,    1.3802,    0.9128,    0.7716,    0.8048,    1.7072,    0.6825,    0.2685},
+{    1.4459,    1.5974,         0,    1.3222,    1.1103,    1.2860,    1.3141,    0.7801,    0.7846,    1.6746},
+{    1.1551,    1.3802,    1.3222,         0,    0.8009,    0.4933,    1.4383,    1.3520,    1.5999,    1.4863},
+{    1.0644,    0.9128,    1.1103,    0.8009,         0,    0.4481,    1.5552,    1.7288,    1.0568,    1.1088},
+{    1.2798,    0.7716,    1.2860,    0.4933,    0.4481,         0,    1.3179,    1.7414,    1.3962,    0.7060},
+{    0.6204,    0.8048,    1.3141,    1.4383,    1.5552,    1.3179,         0,    0.5878,    0.6033,    1.3707},
+{    0.9803,    1.7072,    0.7801,    1.3520,    1.7288,    1.7414,    0.5878,         0,    0.8045,    2.1597},
+{    0.4359,    0.6825,    0.7846,    1.5999,    1.0568,    1.3962,    0.6033,    0.8045,         0,    1.1785},
+{    1.2178,    0.2685,    1.6746,    1.4863,    1.1088,    0.7060,    1.3707,    2.1597,    1.1785,         0},
+            },
+            new double[,] {
+{   14.7781,   14.1637,   13.1581,   13.5134,   13.6208,   13.3631,   14.1260,   13.7191,   14.3263,   13.4382},
+{   14.1637,   14.7781,   12.9663,   13.2398,   13.7972,   13.9577,   13.9203,   12.8239,   14.0574,   14.5034},
+{   13.1581,   12.9663,   14.7781,   13.3113,   13.5666,   13.3555,   13.3212,   13.9482,   13.9431,   12.8665},
+{   13.5134,   13.2398,   13.3113,   14.7781,   13.9248,   14.2646,   13.1676,   13.2747,   12.9630,   13.1074},
+{   13.6208,   13.7972,   13.5666,   13.9248,   14.7781,   14.3133,   13.0201,   12.7957,   13.6298,   13.5685},
+{   13.3631,   13.9577,   13.3555,   14.2646,   14.3133,   14.7781,   13.3166,   12.7791,   13.2200,   14.0312},
+{   14.1260,   13.9203,   13.3212,   13.1676,   13.0201,   13.3166,   14.7781,   14.1618,   14.1449,   13.2516},
+{   13.7191,   12.8239,   13.9482,   13.2747,   12.7957,   12.7791,   14.1618,   14.7781,   13.9207,   12.2062},
+{   14.3263,   14.0574,   13.9431,   12.9630,   13.6298,   13.2200,   14.1449,   13.9207,   14.7781,   13.4853},
+{   13.4382,   14.5034,   12.8665,   13.1074,   13.5685,   14.0312,   13.2516,   12.2062,   13.4853,   14.7781},
+            },
+          }
+       );
+
     }
 
@@ -278,4 +799,176 @@
 
     [TestMethod]
+    public void CovLinearArdTest() {
+      TestCovarianceFunction(new CovarianceLinearArd(), 0,
+        new double[,]
+          {
+{    0.9089,    0.9972,    1.8813,    0.8618,    2.0022,    1.5168,    1.2612,    1.1009,    0.9506,    1.3851},
+{    0.4654,    0.7437,    1.1757,    0.4150,    1.4523,    1.0699,    0.7535,    0.6763,    0.5206,    0.8497},
+{    1.3719,    1.4959,    2.0386,    1.2323,    1.8810,    2.1422,    1.6645,    1.1482,    1.2603,    1.5724},
+{    0.8471,    0.6576,    1.4267,    0.7465,    1.1331,    1.3215,    1.1946,    0.9029,    0.8677,    1.0329},
+{    0.7965,    0.5520,    1.2342,    0.7932,    0.8598,    0.9288,    0.8927,    0.7688,    0.7360,    0.9016},
+{    0.5306,    0.5096,    0.8879,    0.4618,    0.7612,    0.8960,    0.7367,    0.5462,    0.5288,    0.6475},
+{    0.8779,    1.2411,    1.6264,    0.7940,    2.0553,    1.5512,    1.1513,    0.8304,    0.8693,    1.2945},
+{    1.4220,    1.6025,    2.2818,    1.2950,    2.3982,    2.1948,    1.7607,    1.2347,    1.3535,    1.7961},
+{    1.0929,    1.3303,    1.9743,    1.0277,    2.1337,    1.7820,    1.3686,    1.0950,    1.0529,    1.5034},
+{    0.3405,    0.7064,    0.9979,    0.2372,    1.2538,    1.1478,    0.7212,    0.6071,    0.4222,    0.6815},
+          },
+        new double[][,]
+          {            
+        new double[,]
+          {
+{   -0.3483,   -0.0415,   -0.7534,   -0.7885,   -0.4097,   -0.4084,   -0.2818,   -0.7512,   -0.3081,   -0.0928},
+{   -0.0415,   -0.0049,   -0.0897,   -0.0939,   -0.0488,   -0.0486,   -0.0336,   -0.0895,   -0.0367,   -0.0111},
+{   -0.7534,   -0.0897,   -1.6297,   -1.7057,   -0.8863,   -0.8834,   -0.6097,   -1.6250,   -0.6666,   -0.2008},
+{   -0.7885,   -0.0939,   -1.7057,   -1.7853,   -0.9276,   -0.9246,   -0.6381,   -1.7008,   -0.6976,   -0.2101},
+{   -0.4097,   -0.0488,   -0.8863,   -0.9276,   -0.4820,   -0.4804,   -0.3316,   -0.8837,   -0.3625,   -0.1092},
+{   -0.4084,   -0.0486,   -0.8834,   -0.9246,   -0.4804,   -0.4788,   -0.3305,   -0.8808,   -0.3613,   -0.1088},
+{   -0.2818,   -0.0336,   -0.6097,   -0.6381,   -0.3316,   -0.3305,   -0.2281,   -0.6079,   -0.2494,   -0.0751},
+{   -0.7512,   -0.0895,   -1.6250,   -1.7008,   -0.8837,   -0.8808,   -0.6079,   -1.6204,   -0.6646,   -0.2002},
+{   -0.3081,   -0.0367,   -0.6666,   -0.6976,   -0.3625,   -0.3613,   -0.2494,   -0.6646,   -0.2726,   -0.0821},
+{   -0.0928,   -0.0111,   -0.2008,   -0.2101,   -0.1092,   -0.1088,   -0.0751,   -0.2002,   -0.0821,   -0.0247},
+          },
+        new double[,]
+          {
+{   -1.2177,   -0.6082,   -0.3772,   -0.6303,   -0.1506,   -0.2060,   -1.4702,   -1.4921,   -0.8977,   -0.0933},
+{   -0.6082,   -0.3037,   -0.1884,   -0.3148,   -0.0752,   -0.1029,   -0.7343,   -0.7452,   -0.4483,   -0.0466},
+{   -0.3772,   -0.1884,   -0.1168,   -0.1952,   -0.0466,   -0.0638,   -0.4554,   -0.4622,   -0.2781,   -0.0289},
+{   -0.6303,   -0.3148,   -0.1952,   -0.3263,   -0.0780,   -0.1066,   -0.7610,   -0.7723,   -0.4646,   -0.0483},
+{   -0.1506,   -0.0752,   -0.0466,   -0.0780,   -0.0186,   -0.0255,   -0.1818,   -0.1845,   -0.1110,   -0.0115},
+{   -0.2060,   -0.1029,   -0.0638,   -0.1066,   -0.0255,   -0.0348,   -0.2487,   -0.2524,   -0.1519,   -0.0158},
+{   -1.4702,   -0.7343,   -0.4554,   -0.7610,   -0.1818,   -0.2487,   -1.7751,   -1.8015,   -1.0838,   -0.1127},
+{   -1.4921,   -0.7452,   -0.4622,   -0.7723,   -0.1845,   -0.2524,   -1.8015,   -1.8283,   -1.0999,   -0.1143},
+{   -0.8977,   -0.4483,   -0.2781,   -0.4646,   -0.1110,   -0.1519,   -1.0838,   -1.0999,   -0.6617,   -0.0688},
+{   -0.0933,   -0.0466,   -0.0289,   -0.0483,   -0.0115,   -0.0158,   -0.1127,   -0.1143,   -0.0688,   -0.0072},
+          },
+        new double[,]
+          {
+{   -0.1103,   -0.1659,   -0.3856,   -0.0072,   -0.0202,   -0.0794,   -0.3048,   -0.3436,   -0.3042,   -0.2117},
+{   -0.1659,   -0.2495,   -0.5801,   -0.0109,   -0.0304,   -0.1194,   -0.4585,   -0.5169,   -0.4575,   -0.3185},
+{   -0.3856,   -0.5801,   -1.3487,   -0.0253,   -0.0706,   -0.2776,   -1.0661,   -1.2017,   -1.0638,   -0.7406},
+{   -0.0072,   -0.0109,   -0.0253,   -0.0005,   -0.0013,   -0.0052,   -0.0200,   -0.0225,   -0.0199,   -0.0139},
+{   -0.0202,   -0.0304,   -0.0706,   -0.0013,   -0.0037,   -0.0145,   -0.0558,   -0.0629,   -0.0557,   -0.0388},
+{   -0.0794,   -0.1194,   -0.2776,   -0.0052,   -0.0145,   -0.0571,   -0.2194,   -0.2473,   -0.2189,   -0.1524},
+{   -0.3048,   -0.4585,   -1.0661,   -0.0200,   -0.0558,   -0.2194,   -0.8427,   -0.9499,   -0.8408,   -0.5854},
+{   -0.3436,   -0.5169,   -1.2017,   -0.0225,   -0.0629,   -0.2473,   -0.9499,   -1.0708,   -0.9478,   -0.6598},
+{   -0.3042,   -0.4575,   -1.0638,   -0.0199,   -0.0557,   -0.2189,   -0.8408,   -0.9478,   -0.8390,   -0.5841},
+{   -0.2117,   -0.3185,   -0.7406,   -0.0139,   -0.0388,   -0.1524,   -0.5854,   -0.6598,   -0.5841,   -0.4066},
+          },
+        new double[,]
+          {
+{   -0.5984,   -0.3242,   -0.8147,   -0.2068,   -0.7514,   -0.2007,   -0.4031,   -0.6844,   -0.8535,   -0.0887},
+{   -0.3242,   -0.1756,   -0.4413,   -0.1120,   -0.4070,   -0.1087,   -0.2184,   -0.3707,   -0.4623,   -0.0481},
+{   -0.8147,   -0.4413,   -1.1092,   -0.2815,   -1.0229,   -0.2733,   -0.5488,   -0.9318,   -1.1620,   -0.1208},
+{   -0.2068,   -0.1120,   -0.2815,   -0.0714,   -0.2596,   -0.0694,   -0.1393,   -0.2365,   -0.2949,   -0.0307},
+{   -0.7514,   -0.4070,   -1.0229,   -0.2596,   -0.9434,   -0.2521,   -0.5062,   -0.8593,   -1.0717,   -0.1114},
+{   -0.2007,   -0.1087,   -0.2733,   -0.0694,   -0.2521,   -0.0673,   -0.1352,   -0.2296,   -0.2863,   -0.0298},
+{   -0.4031,   -0.2184,   -0.5488,   -0.1393,   -0.5062,   -0.1352,   -0.2716,   -0.4611,   -0.5750,   -0.0598},
+{   -0.6844,   -0.3707,   -0.9318,   -0.2365,   -0.8593,   -0.2296,   -0.4611,   -0.7828,   -0.9762,   -0.1015},
+{   -0.8535,   -0.4623,   -1.1620,   -0.2949,   -1.0717,   -0.2863,   -0.5750,   -0.9762,   -1.2174,   -0.1265},
+{   -0.0887,   -0.0481,   -0.1208,   -0.0307,   -0.1114,   -0.0298,   -0.0598,   -0.1015,   -0.1265,   -0.0132},
+          },
+        new double[,]
+          {
+{   -1.7276,   -1.4419,   -0.9049,   -0.8103,   -0.8305,   -0.5694,   -0.9452,   -0.9495,   -1.5198,   -1.4774},
+{   -1.4419,   -1.2034,   -0.7552,   -0.6763,   -0.6932,   -0.4752,   -0.7889,   -0.7925,   -1.2684,   -1.2331},
+{   -0.9049,   -0.7552,   -0.4739,   -0.4244,   -0.4350,   -0.2982,   -0.4951,   -0.4973,   -0.7960,   -0.7738},
+{   -0.8103,   -0.6763,   -0.4244,   -0.3800,   -0.3895,   -0.2670,   -0.4433,   -0.4453,   -0.7128,   -0.6929},
+{   -0.8305,   -0.6932,   -0.4350,   -0.3895,   -0.3993,   -0.2737,   -0.4544,   -0.4565,   -0.7306,   -0.7102},
+{   -0.5694,   -0.4752,   -0.2982,   -0.2670,   -0.2737,   -0.1876,   -0.3115,   -0.3129,   -0.5009,   -0.4869},
+{   -0.9452,   -0.7889,   -0.4951,   -0.4433,   -0.4544,   -0.3115,   -0.5171,   -0.5195,   -0.8315,   -0.8083},
+{   -0.9495,   -0.7925,   -0.4973,   -0.4453,   -0.4565,   -0.3129,   -0.5195,   -0.5218,   -0.8353,   -0.8120},
+{   -1.5198,   -1.2684,   -0.7960,   -0.7128,   -0.7306,   -0.5009,   -0.8315,   -0.8353,   -1.3369,   -1.2997},
+{   -1.4774,   -1.2331,   -0.7738,   -0.6929,   -0.7102,   -0.4869,   -0.8083,   -0.8120,   -1.2997,   -1.2634},
+          },
+          }
+      );
+
+      TestCovarianceFunction(new CovarianceLinearArd(), 1,
+       new double[,]
+          {
+{    0.1230,    0.1350,    0.2546,    0.1166,    0.2710,    0.2053,    0.1707,    0.1490,    0.1287,    0.1875},
+{    0.0630,    0.1006,    0.1591,    0.0562,    0.1965,    0.1448,    0.1020,    0.0915,    0.0705,    0.1150},
+{    0.1857,    0.2024,    0.2759,    0.1668,    0.2546,    0.2899,    0.2253,    0.1554,    0.1706,    0.2128},
+{    0.1146,    0.0890,    0.1931,    0.1010,    0.1533,    0.1788,    0.1617,    0.1222,    0.1174,    0.1398},
+{    0.1078,    0.0747,    0.1670,    0.1074,    0.1164,    0.1257,    0.1208,    0.1040,    0.0996,    0.1220},
+{    0.0718,    0.0690,    0.1202,    0.0625,    0.1030,    0.1213,    0.0997,    0.0739,    0.0716,    0.0876},
+{    0.1188,    0.1680,    0.2201,    0.1075,    0.2781,    0.2099,    0.1558,    0.1124,    0.1176,    0.1752},
+{    0.1924,    0.2169,    0.3088,    0.1753,    0.3246,    0.2970,    0.2383,    0.1671,    0.1832,    0.2431},
+{    0.1479,    0.1800,    0.2672,    0.1391,    0.2888,    0.2412,    0.1852,    0.1482,    0.1425,    0.2035},
+{    0.0461,    0.0956,    0.1351,    0.0321,    0.1697,    0.1553,    0.0976,    0.0822,    0.0571,    0.0922},
+          },
+       new double[][,]
+          {            
+        new double[,]
+          {
+{   -0.0471,   -0.0056,   -0.1020,   -0.1067,   -0.0554,   -0.0553,   -0.0381,   -0.1017,   -0.0417,   -0.0126},
+{   -0.0056,   -0.0007,   -0.0121,   -0.0127,   -0.0066,   -0.0066,   -0.0045,   -0.0121,   -0.0050,   -0.0015},
+{   -0.1020,   -0.0121,   -0.2206,   -0.2308,   -0.1199,   -0.1196,   -0.0825,   -0.2199,   -0.0902,   -0.0272},
+{   -0.1067,   -0.0127,   -0.2308,   -0.2416,   -0.1255,   -0.1251,   -0.0864,   -0.2302,   -0.0944,   -0.0284},
+{   -0.0554,   -0.0066,   -0.1199,   -0.1255,   -0.0652,   -0.0650,   -0.0449,   -0.1196,   -0.0491,   -0.0148},
+{   -0.0553,   -0.0066,   -0.1196,   -0.1251,   -0.0650,   -0.0648,   -0.0447,   -0.1192,   -0.0489,   -0.0147},
+{   -0.0381,   -0.0045,   -0.0825,   -0.0864,   -0.0449,   -0.0447,   -0.0309,   -0.0823,   -0.0337,   -0.0102},
+{   -0.1017,   -0.0121,   -0.2199,   -0.2302,   -0.1196,   -0.1192,   -0.0823,   -0.2193,   -0.0899,   -0.0271},
+{   -0.0417,   -0.0050,   -0.0902,   -0.0944,   -0.0491,   -0.0489,   -0.0337,   -0.0899,   -0.0369,   -0.0111},
+{   -0.0126,   -0.0015,   -0.0272,   -0.0284,   -0.0148,   -0.0147,   -0.0102,   -0.0271,   -0.0111,   -0.0033},
+          },
+        new double[,]
+          {
+{   -0.1648,   -0.0823,   -0.0510,   -0.0853,   -0.0204,   -0.0279,   -0.1990,   -0.2019,   -0.1215,   -0.0126},
+{   -0.0823,   -0.0411,   -0.0255,   -0.0426,   -0.0102,   -0.0139,   -0.0994,   -0.1008,   -0.0607,   -0.0063},
+{   -0.0510,   -0.0255,   -0.0158,   -0.0264,   -0.0063,   -0.0086,   -0.0616,   -0.0625,   -0.0376,   -0.0039},
+{   -0.0853,   -0.0426,   -0.0264,   -0.0442,   -0.0105,   -0.0144,   -0.1030,   -0.1045,   -0.0629,   -0.0065},
+{   -0.0204,   -0.0102,   -0.0063,   -0.0105,   -0.0025,   -0.0034,   -0.0246,   -0.0250,   -0.0150,   -0.0016},
+{   -0.0279,   -0.0139,   -0.0086,   -0.0144,   -0.0034,   -0.0047,   -0.0337,   -0.0342,   -0.0206,   -0.0021},
+{   -0.1990,   -0.0994,   -0.0616,   -0.1030,   -0.0246,   -0.0337,   -0.2402,   -0.2438,   -0.1467,   -0.0152},
+{   -0.2019,   -0.1008,   -0.0625,   -0.1045,   -0.0250,   -0.0342,   -0.2438,   -0.2474,   -0.1489,   -0.0155},
+{   -0.1215,   -0.0607,   -0.0376,   -0.0629,   -0.0150,   -0.0206,   -0.1467,   -0.1489,   -0.0896,   -0.0093},
+{   -0.0126,   -0.0063,   -0.0039,   -0.0065,   -0.0016,   -0.0021,   -0.0152,   -0.0155,   -0.0093,   -0.0010},
+          },
+        new double[,]
+          {
+{   -0.0149,   -0.0224,   -0.0522,   -0.0010,   -0.0027,   -0.0107,   -0.0413,   -0.0465,   -0.0412,   -0.0287},
+{   -0.0224,   -0.0338,   -0.0785,   -0.0015,   -0.0041,   -0.0162,   -0.0621,   -0.0700,   -0.0619,   -0.0431},
+{   -0.0522,   -0.0785,   -0.1825,   -0.0034,   -0.0096,   -0.0376,   -0.1443,   -0.1626,   -0.1440,   -0.1002},
+{   -0.0010,   -0.0015,   -0.0034,   -0.0001,   -0.0002,   -0.0007,   -0.0027,   -0.0030,   -0.0027,   -0.0019},
+{   -0.0027,   -0.0041,   -0.0096,   -0.0002,   -0.0005,   -0.0020,   -0.0076,   -0.0085,   -0.0075,   -0.0052},
+{   -0.0107,   -0.0162,   -0.0376,   -0.0007,   -0.0020,   -0.0077,   -0.0297,   -0.0335,   -0.0296,   -0.0206},
+{   -0.0413,   -0.0621,   -0.1443,   -0.0027,   -0.0076,   -0.0297,   -0.1140,   -0.1286,   -0.1138,   -0.0792},
+{   -0.0465,   -0.0700,   -0.1626,   -0.0030,   -0.0085,   -0.0335,   -0.1286,   -0.1449,   -0.1283,   -0.0893},
+{   -0.0412,   -0.0619,   -0.1440,   -0.0027,   -0.0075,   -0.0296,   -0.1138,   -0.1283,   -0.1136,   -0.0790},
+{   -0.0287,   -0.0431,   -0.1002,   -0.0019,   -0.0052,   -0.0206,   -0.0792,   -0.0893,   -0.0790,   -0.0550},
+          },
+        new double[,]
+          {
+{   -0.0810,   -0.0439,   -0.1103,   -0.0280,   -0.1017,   -0.0272,   -0.0546,   -0.0926,   -0.1155,   -0.0120},
+{   -0.0439,   -0.0238,   -0.0597,   -0.0152,   -0.0551,   -0.0147,   -0.0296,   -0.0502,   -0.0626,   -0.0065},
+{   -0.1103,   -0.0597,   -0.1501,   -0.0381,   -0.1384,   -0.0370,   -0.0743,   -0.1261,   -0.1573,   -0.0163},
+{   -0.0280,   -0.0152,   -0.0381,   -0.0097,   -0.0351,   -0.0094,   -0.0189,   -0.0320,   -0.0399,   -0.0041},
+{   -0.1017,   -0.0551,   -0.1384,   -0.0351,   -0.1277,   -0.0341,   -0.0685,   -0.1163,   -0.1450,   -0.0151},
+{   -0.0272,   -0.0147,   -0.0370,   -0.0094,   -0.0341,   -0.0091,   -0.0183,   -0.0311,   -0.0388,   -0.0040},
+{   -0.0546,   -0.0296,   -0.0743,   -0.0189,   -0.0685,   -0.0183,   -0.0368,   -0.0624,   -0.0778,   -0.0081},
+{   -0.0926,   -0.0502,   -0.1261,   -0.0320,   -0.1163,   -0.0311,   -0.0624,   -0.1059,   -0.1321,   -0.0137},
+{   -0.1155,   -0.0626,   -0.1573,   -0.0399,   -0.1450,   -0.0388,   -0.0778,   -0.1321,   -0.1648,   -0.0171},
+{   -0.0120,   -0.0065,   -0.0163,   -0.0041,   -0.0151,   -0.0040,   -0.0081,   -0.0137,   -0.0171,   -0.0018},
+          },
+        new double[,]
+          {
+{   -0.2338,   -0.1951,   -0.1225,   -0.1097,   -0.1124,   -0.0771,   -0.1279,   -0.1285,   -0.2057,   -0.1999},
+{   -0.1951,   -0.1629,   -0.1022,   -0.0915,   -0.0938,   -0.0643,   -0.1068,   -0.1072,   -0.1717,   -0.1669},
+{   -0.1225,   -0.1022,   -0.0641,   -0.0574,   -0.0589,   -0.0404,   -0.0670,   -0.0673,   -0.1077,   -0.1047},
+{   -0.1097,   -0.0915,   -0.0574,   -0.0514,   -0.0527,   -0.0361,   -0.0600,   -0.0603,   -0.0965,   -0.0938},
+{   -0.1124,   -0.0938,   -0.0589,   -0.0527,   -0.0540,   -0.0370,   -0.0615,   -0.0618,   -0.0989,   -0.0961},
+{   -0.0771,   -0.0643,   -0.0404,   -0.0361,   -0.0370,   -0.0254,   -0.0422,   -0.0423,   -0.0678,   -0.0659},
+{   -0.1279,   -0.1068,   -0.0670,   -0.0600,   -0.0615,   -0.0422,   -0.0700,   -0.0703,   -0.1125,   -0.1094},
+{   -0.1285,   -0.1072,   -0.0673,   -0.0603,   -0.0618,   -0.0423,   -0.0703,   -0.0706,   -0.1130,   -0.1099},
+{   -0.2057,   -0.1717,   -0.1077,   -0.0965,   -0.0989,   -0.0678,   -0.1125,   -0.1130,   -0.1809,   -0.1759},
+{   -0.1999,   -0.1669,   -0.1047,   -0.0938,   -0.0961,   -0.0659,   -0.1094,   -0.1099,   -0.1759,   -0.1710},
+          },
+          }
+     );
+    }
+
+
+    [TestMethod]
     public void CovPeriodicTest() {
       TestCovarianceFunction(new CovariancePeriodic(), 0,
@@ -297,43 +990,43 @@
             new double[,]
               {
-{    0.0883,    0.3624,    0.5578,    0.1949,    0.7358,    0.6487,    0.2984,    0.7338,    0.2296,    0.6286},
-{    0.0211,    0.5833,    0.6197,    0.0027,    0.7026,    0.4160,    0.3448,    0.6246,    0.6512,    0.6645},
-{    0.7208,    0.7352,    0.5721,    0.4719,    0.1707,    0.7008,    0.5831,    0.2792,    0.7357,    0.5962},
-{    0.7162,    0.2728,    0.7132,    0.6561,    0.7349,    0.0401,    0.5435,    0.5416,    0.5487,    0.6150},
-{    0.5414,    0.0183,    0.7276,    0.5484,    0.6728,    0.7228,    0.6963,    0.5851,    0.5603,    0.5493},
-{    0.5430,    0.7140,    0.5794,    0.5986,    0.7046,    0.0216,    0.5451,    0.6879,    0.6941,    0.5484},
-{    0.0050,    0.7357,    0.6982,    0.1011,    0.5441,    0.1662,    0.2038,    0.0396,    0.2855,    0.6263},
-{    0.0025,    0.0470,    0.6457,    0.2925,    0.6298,    0.0258,    0.5324,    0.3451,    0.0275,    0.7069},
-{    0.1088,    0.5338,    0.5476,    0.0019,    0.6859,    0.0068,    0.4402,    0.4667,    0.3421,    0.5684},
-{    0.0774,    0.6520,    0.0457,    0.4271,    0.0686,    0.0013,    0.4709,    0.6502,    0.4644,    0.6594},                
-              },
-            new double[,]
-              {
-{    1.8911,    3.5259,   -0.1726,    2.7462,   -1.7412,    3.7725,   -2.7071,   -1.8853,   -2.5019,   -0.5552},
-{   -0.8840,   -2.8021,   -2.7150,    0.3273,   -2.3218,    3.6802,   -2.8022,   -0.5330,   -2.6079,   -0.7758},
-{   -1.2996,   -1.8154,   -0.2547,   -2.9071,    2.5861,   -1.0654,   -0.3131,   -2.6579,   -1.7190,   -0.3814},
-{   -1.2366,    3.1709,   -1.1989,   -2.5877,    2.7645,    1.2794,    0.0523,   -0.0174,   -0.1087,   -0.4806},
-{    0.0086,    0.8629,   -1.4146,    0.0921,    1.6565,    3.3174,   -1.0231,    0.2231,    0.1477,   -0.1137},
-{   -0.0491,   -2.2183,   -2.8095,   -0.3938,    3.5099,    0.9382,   -0.0753,    0.4427,    0.4556,   -0.1062},
-{   -0.4372,   -1.7059,   -2.3555,    2.0194,   -0.0642,    2.5547,   -2.4014,   -1.1924,   -2.6748,   -0.5422},
-{   -0.3101,   -1.2911,   -0.6547,    3.2602,   -2.6843,   -0.9727,   -2.8761,    3.4673,   -1.0044,   -1.1276},
-{   -1.8766,   -2.8747,   -0.0998,   -0.2703,   -0.9342,    0.5245,   -2.9018,   -2.9072,   -2.7976,   -0.2342},
-{    1.7731,   -2.6049,   -1.2740,    3.7069,   -1.5344,   -0.2241,   -2.9071,   -0.6824,   -2.9071,   -2.5738},             
-              },
-            new double[,]
-              {
-{    1.9096,    1.5931,    0.2877,    1.7941,    0.7384,    1.1215,    1.6733,    0.7902,    1.7547,    0.3763},
-{    1.9788,    1.2580,    1.1862,    1.9973,    0.9676,    1.5216,    1.6156,    0.3704,    1.1157,    0.4367},
-{    0.5925,    0.7648,    0.3033,    1.4416,    1.8211,    0.5208,    0.3160,    1.6965,    0.7306,    0.3320},
-{    0.5729,    1.7041,    0.5612,    1.1037,    0.7004,    1.9595,    0.2729,    0.2709,    0.2781,    0.3568},
-{    0.2707,    1.9816,    0.6289,    0.2779,    0.4531,    0.8782,    0.5082,    0.3184,    0.2903,    0.2788},
-{    0.2723,    0.9219,    1.2651,    0.3350,    0.9602,    1.9782,    0.2744,    0.4870,    0.5024,    0.2778},
-{    1.9950,    0.7261,    0.9832,    1.8961,    0.2735,    1.8260,    1.7841,    1.9600,    1.6889,    0.3729},
-{    1.9975,    1.9524,    0.4031,    1.6805,    1.1645,    1.9741,    1.3471,    1.6152,    1.9723,    0.5395},
-{    1.8880,    1.3447,    0.2770,    1.9981,    0.4821,    1.9932,    1.4877,    1.4494,    1.6190,    0.2991},
-{    1.9210,    1.1139,    1.9538,    1.5061,    1.9301,    1.9987,    1.4432,    0.4107,    1.4528,    1.0956},        
-              },
-          }
-      );
+{         0,    0.6171,    0.0967,    0.2357,    0.4461,    0.0247,    0.6403,    0.6107,    0.5464,    0.1081},
+{    0.6171,         0,    0.4105,    0.0173,    0.6953,    0.7281,    0.7351,    0.6132,    0.6825,    0.5825},
+{    0.0967,    0.4105,         0,    0.0012,    0.3397,    0.0195,    0.0034,    0.7305,    0.7317,    0.5618},
+{    0.2357,    0.0173,    0.0012,         0,    0.7346,    0.5651,    0.0847,    0.0026,    0.4161,    0.1700},
+{    0.4461,    0.6953,    0.3397,    0.7346,         0,    0.5493,    0.3178,    0.6422,    0.4630,    0.3434},
+{    0.0247,    0.7281,    0.0195,    0.5651,    0.5493,         0,    0.0023,    0.6572,    0.0311,    0.6971},
+{    0.6403,    0.7351,    0.0034,    0.0847,    0.3178,    0.0023,         0,    0.6182,    0.6285,    0.0109},
+{    0.6107,    0.6132,    0.7305,    0.0026,    0.6422,    0.6572,    0.6182,         0,    0.7351,    0.6230},
+{    0.5464,    0.6825,    0.7317,    0.4161,    0.4630,    0.0311,    0.6285,    0.7351,         0,    0.1843},
+{    0.1081,    0.5825,    0.5618,    0.1700,    0.3434,    0.6971,    0.0109,    0.6230,    0.1843,         0},
+              },
+            new double[,]
+              {
+{         0,   -0.4917,    1.9759,   -2.5233,   -2.9038,   -0.9545,   -0.6223,   -2.7396,   -0.0884,   -1.8718},
+{   -0.4917,         0,    3.6663,    0.8377,   -2.3760,   -1.4241,   -1.6437,    3.8424,   -0.9067,    0.2162},
+{    1.9759,    3.6663,         0,   -0.2205,   -2.7933,   -0.8509,   -0.3646,   -1.4789,   -1.5087,    3.8738},
+{   -2.5233,    0.8377,   -0.2205,         0,   -1.6172,   -0.2162,    1.8523,    0.3213,    3.6804,    2.5815},
+{   -2.9038,   -2.3760,   -2.7933,   -1.6172,         0,   -0.1136,    3.3650,    3.7893,   -2.9070,   -2.7998},
+{   -0.9545,   -1.4241,   -0.8509,   -0.2162,   -0.1136,         0,   -0.2974,    3.7478,    1.1265,   -1.0310},
+{   -0.6223,   -1.6437,   -0.3646,    1.8523,    3.3650,   -0.2974,         0,   -0.4977,   -0.5548,    0.6640},
+{   -2.7396,    3.8424,   -1.4789,    0.3213,    3.7893,    3.7478,   -0.4977,         0,   -1.6417,    1.1444},
+{   -0.0884,   -0.9067,   -1.5087,    3.6804,   -2.9070,    1.1265,   -0.5548,   -1.6417,         0,   -2.3160},
+{   -1.8718,    0.2162,    3.8738,    2.5815,   -2.7998,   -1.0310,    0.6640,    1.1444,   -2.3160,         0},
+              },
+            new double[,]
+              {
+{    2.0000,    0.3597,    1.9008,    1.7477,    1.4793,    1.9751,    0.3943,    1.2046,    0.2758,    1.8887},
+{    0.3597,    2.0000,    1.5291,    1.9826,    0.9929,    0.6320,    0.7047,    1.1997,    0.4741,    0.3153},
+{    1.9008,    1.5291,    2.0000,    1.9988,    1.6221,    1.9804,    1.9966,    0.6498,    0.6595,    1.2969},
+{    1.7477,    1.9826,    1.9988,    2.0000,    0.6957,    0.2956,    1.9134,    1.9974,    1.5215,    1.8218},
+{    1.4793,    0.9929,    1.6221,    0.6957,    2.0000,    0.2787,    1.6495,    1.1369,    1.4549,    1.6174},
+{    1.9751,    0.6320,    1.9804,    0.2956,    0.2787,    2.0000,    1.9977,    1.1010,    1.9686,    0.5106},
+{    0.3943,    0.7047,    1.9966,    1.9134,    1.6495,    1.9977,    2.0000,    0.3612,    0.3762,    1.9891},
+{    1.2046,    1.1997,    0.6498,    1.9974,    1.1369,    1.1010,    0.3612,    2.0000,    0.7040,    0.3681},
+{    0.2758,    0.4741,    0.6595,    1.5215,    1.4549,    1.9686,    0.3762,    0.7040,    2.0000,    1.8059},
+{    1.8887,    0.3153,    1.2969,    1.8218,    1.6174,    0.5106,    1.9891,    0.3681,    1.8059,    2.0000},
+              },
+          }
+      , 5e-3);
       TestCovarianceFunction(new CovariancePeriodic(), 1,
         new double[,]
@@ -354,44 +1047,43 @@
             new double[,]
               {
-{    2.7658,    2.8666,    1.3028,    2.8119,    1.9878,    2.9569,    2.4420,    2.0231,    2.4786,    1.5821},
-{    2.6198,    2.2663,    2.2343,    2.6874,    2.1274,    2.8825,    2.4171,    1.5700,    2.2016,    1.6875},
-{    1.8698,    2.0061,    1.3786,    2.3444,    2.8027,    1.7965,    1.4262,    2.4522,    1.9823,    1.4760},
-{    1.8510,    2.8387,    1.8395,    2.1959,    3.0210,    2.7352,    1.0285,    1.1240,    1.2352,    1.5397},
-{    1.0892,    2.7145,    1.9025,    0.9710,    3.0490,    2.9953,    1.7820,    0.7805,    0.8894,    1.2407},
-{    1.1645,    2.1025,    2.2694,    1.4845,    2.9828,    2.7182,    1.1965,    0.4978,    0.4823,    1.2323},
-{    2.6463,    1.9790,    2.1357,    2.7724,    1.1832,    2.8010,    2.4926,    2.6000,    2.4488,    1.5751},
-{    2.6534,    2.5933,    1.6329,    2.8450,    2.2244,    2.6143,    2.3047,    2.8613,    2.6123,    1.8170},
-{    2.5480,    2.3036,    1.2251,    2.6556,    1.7503,    2.6975,    2.3636,    2.3476,    2.4186,    1.3608},
-{    2.7599,    2.2008,    2.5944,    2.8858,    2.5757,    2.6581,    2.3450,    1.6460,    2.3490,    2.1920},
-              },
-            new double[,]
-              {
-{    1.2575,    1.0910,    1.1185,    1.1908,    1.4623,    0.8439,    1.4825,    1.4718,    1.4712,    1.2892},
-{    1.3993,    1.5049,    1.5043,    1.3445,    1.4935,    1.0563,    1.4887,    1.2825,    1.5024,    1.3439},
-{    1.4231,    1.4673,    1.1682,    1.5008,    1.2052,    1.3938,    1.1981,    1.4796,    1.4607,    1.2285},
-{    1.4160,    1.1451,    1.4114,    1.5019,    0.5165,    1.2949,    0.9209,    0.9927,    1.0722,    1.2656},
-{    0.9668,    1.3176,    1.4350,    0.8763,    0.1550,    0.6776,    1.3876,    0.7218,    0.8114,    1.0761},
-{    1.0221,    1.4893,    1.5049,    1.2335,    0.7388,    1.3137,    1.0450,    0.4752,    0.4611,    1.0702},
-{    1.3798,    1.4597,    1.4948,    1.2488,    1.0355,    1.2079,    1.4662,    1.4126,    1.4806,    1.2853},
-{    1.3741,    1.4168,    1.3163,    1.1334,    1.5039,    1.4032,    1.5040,    1.1017,    1.4045,    1.4024},
-{    1.4421,    1.5040,    1.0652,    1.3723,    1.3735,    1.3349,    1.4984,    1.5004,    1.4883,    1.1567},
-{    1.2652,    1.5023,    1.4161,    1.0487,    1.4273,    1.3702,    1.5007,    1.3231,    1.5003,    1.5016},
-              },
-            new double[,]
-              {
-{   11.6566,   11.5235,   13.4099,   11.5959,   12.6253,   11.4024,   12.0716,   12.5834,   12.0256,   13.0964},
-{   11.8460,   12.2894,   12.3285,   11.7588,   12.4583,   11.5022,   12.1027,   13.1103,   12.3684,   12.9759},
-{   12.7645,   12.6035,   13.3256,   12.1932,   11.6081,   12.8500,   13.2725,   12.0588,   12.6318,   13.2165},
-{   12.7864,   11.5605,   12.7999,   12.3753,   11.3155,   11.6967,   13.7101,   13.6063,   13.4846,   13.1446},
-{   13.6442,   11.7236,   12.7260,   13.7721,   11.2771,   11.3504,   12.8668,   13.9754,   13.8595,   13.4785},
-{   13.5621,   12.4883,   12.2856,   13.2070,   11.3674,   11.7187,   13.5272,   14.2715,   14.2876,   13.4877},
-{   11.8120,   12.6357,   12.4483,   11.6480,   13.5417,   11.6104,   12.0079,   11.8714,   12.0630,   13.1045},
-{   11.8028,   11.8801,   13.0386,   11.5521,   12.3406,   11.8531,   12.2422,   11.5305,   11.8557,   12.8261},
-{   11.9378,   12.2435,   13.4957,   11.8000,   12.9036,   11.7458,   12.1694,   12.1892,   12.1009,   13.3455},
-{   11.6644,   12.3694,   11.8785,   11.4978,   11.9025,   11.7967,   12.1924,   13.0236,   12.1874,   12.3800},
-
-              },
-          }
-      );
+{         0,    1.5463,    2.7702,    2.4754,    2.3601,    2.6154,    1.6170,    2.2426,    1.2120,    2.5484},
+{    1.5463,         0,    2.8809,    2.7132,    2.1407,    1.9051,    1.9633,    2.9438,    1.7399,    0.7903},
+{    2.7702,    2.8809,         0,    2.6583,    2.4199,    2.6219,    2.6503,    1.9201,    1.9281,    2.9266},
+{    2.4754,    2.7132,    2.6583,         0,    1.9565,    1.3445,    2.7639,    2.6871,    2.8826,    2.8025},
+{    2.3601,    2.1407,    2.4199,    1.9565,         0,    1.2406,    2.8530,    2.9544,    2.3499,    2.4179},
+{    2.6154,    1.9051,    2.6219,    1.3445,    1.2406,         0,    2.6541,    2.9603,    2.7276,    1.7848},
+{    1.6170,    1.9633,    2.6503,    2.7639,    2.8530,    2.6541,         0,    1.5498,    1.5819,    2.7045},
+{    2.2426,    2.9438,    1.9201,    2.6871,    2.9544,    2.9603,    1.5498,         0,    1.9628,    3.0510},
+{    1.2120,    1.7399,    1.9281,    2.8826,    2.3499,    2.7276,    1.5819,    1.9628,         0,    2.5033},
+{    2.5484,    0.7903,    2.9266,    2.8025,    2.4179,    1.7848,    2.7045,    3.0510,    2.5033,         0},
+              },
+            new double[,]
+              {
+{         0,    1.2693,    1.2518,    1.4723,    1.4989,    1.4024,    1.3080,    1.5046,    1.0560,    1.4419},
+{    1.2693,         0,    1.0599,    1.3190,    1.4956,    1.4360,    1.4550,    0.8895,    1.3688,    0.7299},
+{    1.2518,    1.0599,         0,    1.3700,    1.4880,    1.3979,    1.3765,    1.4411,    1.4438,    0.9428},
+{    1.4723,    1.3190,    1.3700,         0,    1.4529,    1.1461,    1.2600,    1.3448,    1.0562,    1.2056},
+{    1.4989,    1.4956,    1.4880,    1.4529,         0,    1.0760,    1.1183,    0.8531,    1.5002,    1.4885},
+{    1.4024,    1.4360,    1.3979,    1.1461,    1.0760,         0,    1.3735,    0.8314,    1.3035,    1.3888},
+{    1.3080,    1.4550,    1.3765,    1.2600,    1.1183,    1.3735,         0,    1.2713,    1.2891,    1.3279},
+{    1.5046,    0.8895,    1.4411,    1.3448,    0.8531,    0.8314,    1.2713,         0,    1.4549,   -0.0705},
+{    1.0560,    1.3688,    1.4438,    1.0562,    1.5002,    1.3035,    1.2891,    1.4549,         0,    1.4621},
+{    1.4419,    0.7299,    0.9428,    1.2056,    1.4885,    1.3888,    1.3279,   -0.0705,    1.4621,         0},
+              },
+            new double[,]
+              {
+{   14.7781,   13.1371,   11.6509,   12.0296,   12.1738,   11.8516,   13.0567,   12.3184,   13.5101,   11.9373},
+{   13.1371,   14.7781,   11.5044,   11.7253,   12.4422,   12.7230,   12.6543,   11.4201,   12.9155,   13.9651},
+{   11.6509,   11.5044,   14.7781,   11.7964,   12.0992,   11.8434,   11.8067,   12.7053,   12.6959,   11.4432},
+{   12.0296,   11.7253,   11.7964,   14.7781,   12.6624,   13.3637,   11.6592,   11.7593,   11.5022,   11.6084},
+{   12.1738,   12.4422,   12.0992,   12.6624,   14.7781,   13.4786,   11.5416,   11.4058,   12.1864,   12.1017},
+{   11.8516,   12.7230,   11.8434,   13.3637,   13.4786,   14.7781,   11.8019,   11.3978,   11.7066,   12.8636},
+{   13.0567,   12.6543,   11.8067,   11.6592,   11.5416,   11.8019,   14.7781,   13.1331,   13.0967,   11.7366},
+{   12.3184,   11.4201,   12.7053,   11.7593,   11.4058,   11.3978,   13.1331,   14.7781,   12.6549,   11.2744},
+{   13.5101,   12.9155,   12.6959,   11.5022,   12.1864,   11.7066,   13.0967,   12.6549,   14.7781,   11.9944},
+{   11.9373,   13.9651,   11.4432,   11.6084,   12.1017,   12.8636,   11.7366,   11.2744,   11.9944,   14.7781},
+              },
+          }
+      , 5e-3);
     }
 
@@ -417,79 +1109,79 @@
             new double[,]
               {
-{    0.0297,    0.0008,    0.1332,    0.0075,    0.0033,    0.1356,    0.1399,    0.0132,    0.0276,    0.0236},
-{    0.2195,    0.0760,    0.4116,    0.1404,    0.0661,    0.4222,    0.4578,    0.2055,    0.2348,    0.2319},
-{    0.0517,    0.2064,    0.0070,    0.0939,    0.1720,    0.0010,    0.0006,    0.0824,    0.0593,    0.0831},
-{    0.0702,    0.1767,    0.0138,    0.1216,    0.1600,    0.0000,    0.0042,    0.1370,    0.0899,    0.1055},
-{    0.0208,    0.0075,    0.0791,    0.0016,    0.0081,    0.0952,    0.1169,    0.0032,    0.0157,    0.0080},
-{    0.0210,    0.0090,    0.0729,    0.0016,    0.0093,    0.1198,    0.1302,    0.0035,    0.0169,    0.0083},
-{    0.0577,    0.0013,    0.1635,    0.0219,    0.0001,    0.2043,    0.1892,    0.0282,    0.0538,    0.0509},
-{    0.0400,    0.1707,    0.0063,    0.0740,    0.2146,    0.0009,    0.0004,    0.0664,    0.0480,    0.0767},
-{    0.0484,    0.0001,    0.1696,    0.0163,    0.0003,    0.1943,    0.1752,    0.0224,    0.0430,    0.0403},
-{    0.1646,    0.0512,    0.3078,    0.0946,    0.0363,    0.4180,    0.4014,    0.1559,    0.1792,    0.1624},
-              },
-            new double[,]
-              {
-{    0.1891,    0.1240,    0.0820,    0.1696,    0.0031,    0.1707,    0.2043,    0.2781,    0.2004,    0.0972},
-{    0.0206,    0.0055,    0.0047,    0.0153,    0.1507,    0.0203,    0.0180,    0.0393,    0.0188,    0.0017},
-{    0.0009,    0.0027,    0.0445,    0.0001,    0.2050,    0.0017,    0.0002,    0.0033,    0.0001,    0.0314},
-{    0.0299,    0.0058,    0.0035,    0.0216,    0.0879,    0.0257,    0.0282,    0.0478,    0.0269,    0.0008},
-{    0.0109,    0.0249,    0.1078,    0.0161,    0.2308,    0.0046,    0.0132,    0.0051,    0.0156,    0.0995},
-{    0.0050,    0.0210,    0.0807,    0.0081,    0.2449,    0.0023,    0.0077,    0.0014,    0.0087,    0.0799},
-{    0.3307,    0.3104,    0.1616,    0.2911,    0.0083,    0.3156,    0.3349,    0.3724,    0.3385,    0.2101},
-{    0.3424,    0.2692,    0.1909,    0.2890,    0.0089,    0.3606,    0.3705,    0.3347,    0.3304,    0.2120},
-{    0.0863,    0.0522,    0.0094,    0.0726,    0.0574,    0.0866,    0.0832,    0.1122,    0.0810,    0.0165},
-{    0.0127,    0.0417,    0.1061,    0.0155,    0.3892,    0.0111,    0.0189,    0.0100,    0.0193,    0.1014},
-              },
-            new double[,]
-              {
-{    0.0034,    0.2562,    0.0327,    0.0014,    0.3388,    0.2764,    0.0277,    0.0114,    0.0004,    0.0248},
-{    0.0011,    0.2285,    0.0042,    0.0170,    0.2221,    0.2096,    0.0049,    0.0480,    0.0065,    0.0025},
-{    0.2015,    0.0078,    0.1295,    0.2780,    0.0040,    0.0198,    0.1228,    0.3341,    0.2396,    0.1418},
-{    0.0680,    0.4545,    0.1341,    0.0206,    0.3587,    0.5459,    0.1598,    0.0081,    0.0510,    0.1276},
-{    0.0635,    0.4599,    0.1153,    0.0181,    0.3065,    0.4160,    0.1235,    0.0043,    0.0420,    0.1157},
-{    0.0177,    0.4178,    0.0479,    0.0002,    0.2613,    0.3893,    0.0634,    0.0032,    0.0076,    0.0498},
-{    0.0701,    0.0569,    0.0349,    0.1239,    0.0571,    0.0618,    0.0289,    0.1812,    0.1014,    0.0474},
-{    0.1082,    0.0231,    0.0737,    0.1642,    0.0213,    0.0383,    0.0596,    0.2089,    0.1397,    0.0817},
-{    0.0725,    0.0528,    0.0410,    0.1309,    0.0525,    0.0660,    0.0298,    0.1975,    0.1018,    0.0485},
-{    0.0113,    0.1597,    0.0003,    0.0377,    0.1303,    0.1706,    0.0001,    0.0934,    0.0255,    0.0013},
-              },
-            new double[,]
-              {
-{    0.0013,    0.0438,    0.0027,    0.0151,    0.0798,    0.0919,    0.0417,    0.0390,    0.0099,    0.0013},
-{    0.0553,    0.0008,    0.0666,    0.1035,    0.0041,    0.0171,    0.0000,    0.0004,    0.0117,    0.0359},
-{    0.0174,    0.1749,    0.0170,    0.0008,    0.1544,    0.3093,    0.1687,    0.1202,    0.0776,    0.0468},
-{    0.1281,    0.0030,    0.1335,    0.1954,    0.0005,    0.0030,    0.0103,    0.0148,    0.0479,    0.0839},
-{    0.0075,    0.1070,    0.0054,    0.0005,    0.0892,    0.1537,    0.1200,    0.1246,    0.0626,    0.0277},
-{    0.1480,    0.0045,    0.1234,    0.2318,    0.0007,    0.0026,    0.0111,    0.0174,    0.0552,    0.0911},
-{    0.0314,    0.0085,    0.0400,    0.0675,    0.0188,    0.0356,    0.0034,    0.0015,    0.0021,    0.0159},
-{    0.0006,    0.0829,    0.0004,    0.0040,    0.1160,    0.1607,    0.0752,    0.0511,    0.0253,    0.0109},
-{    0.0220,    0.1865,    0.0273,    0.0029,    0.2474,    0.2629,    0.1595,    0.1460,    0.0850,    0.0630},
-{    0.1528,    0.0235,    0.1708,    0.2114,    0.0125,    0.0008,    0.0319,    0.0457,    0.0807,    0.1306},
-              },
-            new double[,]
-              {
-{    0.4109,    0.2403,    0.0141,    0.4547,    0.0000,    0.0197,    0.1292,    0.0921,    0.3144,    0.1812},
-{    0.2957,    0.1851,    0.0005,    0.3352,    0.0171,    0.0011,    0.0553,    0.0319,    0.2074,    0.0806},
-{    0.1247,    0.0378,    0.0836,    0.1437,    0.1103,    0.0466,    0.0000,    0.0056,    0.0470,    0.0007},
-{    0.0954,    0.0166,    0.1039,    0.1185,    0.1102,    0.0509,    0.0025,    0.0179,    0.0341,    0.0004},
-{    0.1154,    0.0202,    0.0965,    0.1566,    0.0959,    0.0381,    0.0014,    0.0160,    0.0398,    0.0001},
-{    0.0427,    0.0014,    0.1718,    0.0639,    0.1870,    0.1065,    0.0289,    0.0704,    0.0045,    0.0201},
-{    0.1097,    0.0458,    0.0623,    0.1321,    0.1541,    0.0278,    0.0003,    0.0031,    0.0488,    0.0020},
-{    0.1106,    0.0387,    0.0683,    0.1273,    0.1243,    0.0300,    0.0003,    0.0025,    0.0466,    0.0021},
-{    0.3427,    0.2142,    0.0002,    0.3796,    0.0098,    0.0046,    0.0739,    0.0392,    0.2257,    0.1093},
-{    0.2913,    0.2028,    0.0000,    0.3120,    0.0114,    0.0025,    0.0644,    0.0379,    0.2131,    0.0810},
-              },
-            new double[,]
-              {
-{    1.1542,    1.0808,    1.7137,    1.1224,    1.5090,    0.9961,    1.3298,    1.4968,    1.3127,    1.6369},
-{    1.2413,    1.4053,    1.4181,    1.2031,    1.4591,    1.0675,    1.3411,    1.6404,    1.4309,    1.6057},
-{    1.5486,    1.5027,    1.6936,    1.3729,    1.1289,    1.5721,    1.6807,    1.3251,    1.5109,    1.6670},
-{    1.5547,    1.1026,    1.5584,    1.4331,    0.9067,    1.1739,    1.7826,    1.7593,    1.7313,    1.6490},
-{    1.7679,    1.1868,    1.5379,    1.7963,    0.8253,    0.9483,    1.5767,    1.8403,    1.8154,    1.7298},
-{    1.7492,    1.4683,    1.4041,    1.6646,    0.9652,    1.1845,    1.7411,    1.9016,    1.9048,    1.7320},
-{    1.2267,    1.5121,    1.4560,    1.1498,    1.7445,    1.1302,    1.3060,    1.2519,    1.3266,    1.6389},
-{    1.2227,    1.2555,    1.6220,    1.0978,    1.4220,    1.2443,    1.3896,    1.0850,    1.2454,    1.5656},
-{    1.2789,    1.3900,    1.7339,    1.2214,    1.5866,    1.1971,    1.3647,    1.3715,    1.3404,    1.6984},
-{    1.1581,    1.4312,    1.2549,    1.0647,    1.2647,    1.2200,    1.3726,    1.6182,    1.3709,    1.4346},
+{         0,    0.1113,    0.1356,    0.1828,    0.0037,    0.0032,    0.0052,    0.1649,    0.0020,    0.0599},
+{    0.1113,         0,    0.3889,    0.4757,    0.1415,    0.1485,    0.0629,    0.3653,    0.0811,    0.0035},
+{    0.1356,    0.3889,         0,    0.0011,    0.1136,    0.1060,    0.1954,    0.0000,    0.2176,    0.3219},
+{    0.1828,    0.4757,    0.0011,         0,    0.1566,    0.1766,    0.2129,    0.0012,    0.1768,    0.3923},
+{    0.0037,    0.1415,    0.1136,    0.1566,         0,    0.0000,    0.0128,    0.0836,    0.0101,    0.0966},
+{    0.0032,    0.1485,    0.1060,    0.1766,    0.0000,         0,    0.0140,    0.0837,    0.0085,    0.1126},
+{    0.0052,    0.0629,    0.1954,    0.2129,    0.0128,    0.0140,         0,    0.2603,    0.0008,    0.0306},
+{    0.1649,    0.3653,    0.0000,    0.0012,    0.0836,    0.0837,    0.2603,         0,    0.2139,    0.2429},
+{    0.0020,    0.0811,    0.2176,    0.1768,    0.0101,    0.0085,    0.0008,    0.2139,         0,    0.0433},
+{    0.0599,    0.0035,    0.3219,    0.3923,    0.0966,    0.1126,    0.0306,    0.2429,    0.0433,         0},
+              },
+            new double[,]
+              {
+{         0,    0.1257,    0.1670,    0.0931,    0.3194,    0.2613,    0.0213,    0.0219,    0.0365,    0.3319},
+{    0.1257,         0,    0.0117,    0.0001,    0.0625,    0.0510,    0.2315,    0.1621,    0.0274,    0.1000},
+{    0.1670,    0.0117,         0,    0.0160,    0.0141,    0.0075,    0.3003,    0.3909,    0.0850,    0.0170},
+{    0.0931,    0.0001,    0.0160,         0,    0.0718,    0.0629,    0.1673,    0.1835,    0.0157,    0.0668},
+{    0.3194,    0.0625,    0.0141,    0.0718,         0,    0.0011,    0.3903,    0.3690,    0.1570,    0.0009},
+{    0.2613,    0.0510,    0.0075,    0.0629,    0.0011,         0,    0.4011,    0.3369,    0.1158,    0.0041},
+{    0.0213,    0.2315,    0.3003,    0.1673,    0.3903,    0.4011,         0,    0.0002,    0.1102,    0.4643},
+{    0.0219,    0.1621,    0.3909,    0.1835,    0.3690,    0.3369,    0.0002,         0,    0.1101,    0.3135},
+{    0.0365,    0.0274,    0.0850,    0.0157,    0.1570,    0.1158,    0.1102,    0.1101,         0,    0.1728},
+{    0.3319,    0.1000,    0.0170,    0.0668,    0.0009,    0.0041,    0.4643,    0.3135,    0.1728,         0},
+              },
+            new double[,]
+              {
+{         0,    0.0115,    0.1979,    0.0316,    0.0251,    0.0027,    0.1396,    0.1747,    0.1481,    0.0299},
+{    0.0115,         0,    0.1171,    0.0678,    0.0700,    0.0261,    0.0664,    0.0724,    0.0689,    0.0088},
+{    0.1979,    0.1171,         0,    0.3960,    0.4057,    0.2638,    0.0181,    0.0061,    0.0230,    0.0705},
+{    0.0316,    0.0678,    0.3960,         0,    0.0006,    0.0201,    0.2320,    0.3087,    0.2134,    0.1071},
+{    0.0251,    0.0700,    0.4057,    0.0006,         0,    0.0137,    0.2005,    0.2369,    0.2506,    0.1115},
+{    0.0027,    0.0261,    0.2638,    0.0201,    0.0137,         0,    0.1409,    0.1571,    0.1351,    0.0626},
+{    0.1396,    0.0664,    0.0181,    0.2320,    0.2005,    0.1409,         0,    0.0056,    0.0000,    0.0234},
+{    0.1747,    0.0724,    0.0061,    0.3087,    0.2369,    0.1571,    0.0056,         0,    0.0054,    0.0308},
+{    0.1481,    0.0689,    0.0230,    0.2134,    0.2506,    0.1351,    0.0000,    0.0054,         0,    0.0252},
+{    0.0299,    0.0088,    0.0705,    0.1071,    0.1115,    0.0626,    0.0234,    0.0308,    0.0252,         0},
+              },
+            new double[,]
+              {
+{         0,    0.0518,    0.0225,    0.0842,    0.0134,    0.0822,    0.0259,    0.0044,    0.0472,    0.1388},
+{    0.0518,         0,    0.1075,    0.0068,    0.1109,    0.0098,    0.0040,    0.0548,    0.1861,    0.0426},
+{    0.0225,    0.1075,         0,    0.1884,    0.0022,    0.1953,    0.0866,    0.0109,    0.0010,    0.2263},
+{    0.0842,    0.0068,    0.1884,         0,    0.1883,    0.0000,    0.0186,    0.1147,    0.1866,    0.0066},
+{    0.0134,    0.1109,    0.0022,    0.1883,         0,    0.2191,    0.0553,    0.0019,    0.0060,    0.2459},
+{    0.0822,    0.0098,    0.1953,    0.0000,    0.2191,         0,    0.0209,    0.0970,    0.2098,    0.0083},
+{    0.0259,    0.0040,    0.0866,    0.0186,    0.0553,    0.0209,         0,    0.0544,    0.1387,    0.0493},
+{    0.0044,    0.0548,    0.0109,    0.1147,    0.0019,    0.0970,    0.0544,         0,    0.0181,    0.1157},
+{    0.0472,    0.1861,    0.0010,    0.1866,    0.0060,    0.2098,    0.1387,    0.0181,         0,    0.3179},
+{    0.1388,    0.0426,    0.2263,    0.0066,    0.2459,    0.0083,    0.0493,    0.1157,    0.3179,         0},
+              },
+            new double[,]
+              {
+{         0,    0.0195,    0.1128,    0.1600,    0.1591,    0.2414,    0.1441,    0.1240,    0.0109,    0.0116},
+{    0.0195,         0,    0.0446,    0.0686,    0.0786,    0.1693,    0.0542,    0.0354,    0.0014,    0.0003},
+{    0.1128,    0.0446,         0,    0.0016,    0.0011,    0.0202,    0.0003,    0.0004,    0.0837,    0.0487},
+{    0.1600,    0.0686,    0.0016,         0,    0.0001,    0.0143,    0.0030,    0.0034,    0.0778,    0.0727},
+{    0.1591,    0.0786,    0.0011,    0.0001,         0,    0.0171,    0.0021,    0.0020,    0.0942,    0.0812},
+{    0.2414,    0.1693,    0.0202,    0.0143,    0.0171,         0,    0.0250,    0.0207,    0.1541,    0.1880},
+{    0.1441,    0.0542,    0.0003,    0.0030,    0.0021,    0.0250,         0,    0.0000,    0.0782,    0.0489},
+{    0.1240,    0.0354,    0.0004,    0.0034,    0.0020,    0.0207,    0.0000,         0,    0.0714,    0.0315},
+{    0.0109,    0.0014,    0.0837,    0.0778,    0.0942,    0.1541,    0.0782,    0.0714,         0,    0.0003},
+{    0.0116,    0.0003,    0.0487,    0.0727,    0.0812,    0.1880,    0.0489,    0.0315,    0.0003,         0},
+              },
+            new double[,]
+              {
+{    2.0000,    1.6472,    1.1513,    1.3142,    1.3662,    1.2437,    1.6267,    1.4148,    1.7372,    1.2786},
+{    1.6472,    2.0000,    1.0689,    1.1876,    1.4541,    1.5370,    1.5174,    1.0103,    1.5898,    1.8381},
+{    1.1513,    1.0689,    2.0000,    1.2199,    1.3398,    1.2402,    1.2244,    1.5320,    1.5293,    1.0276},
+{    1.3142,    1.1876,    1.2199,    2.0000,    1.5197,    1.7027,    1.1555,    1.2033,    1.0675,    1.1291},
+{    1.3662,    1.4541,    1.3398,    1.5197,    2.0000,    1.7299,    1.0916,    0.9989,    1.3706,    1.3407},
+{    1.2437,    1.5370,    1.2402,    1.7027,    1.7299,    2.0000,    1.2223,    0.9923,    1.1787,    1.5758},
+{    1.6267,    1.5174,    1.2244,    1.1555,    1.0916,    1.2223,    2.0000,    1.6461,    1.6369,    1.1928},
+{    1.4148,    1.0103,    1.5320,    1.2033,    0.9989,    0.9923,    1.6461,    2.0000,    1.5176,    0.7806},
+{    1.7372,    1.5898,    1.5293,    1.0675,    1.3706,    1.1787,    1.6369,    1.5176,    2.0000,    1.3009},
+{    1.2786,    1.8381,    1.0276,    1.1291,    1.3407,    1.5758,    1.1928,    0.7806,    1.3009,    2.0000},
               },
           }
@@ -513,80 +1205,79 @@
             new double[,]
               {
-{    0.0479,    0.0014,    0.1523,    0.0123,    0.0043,    0.2477,    0.1991,    0.0170,    0.0398,    0.0281},
-{    0.3315,    0.1032,    0.5541,    0.2179,    0.0869,    0.7265,    0.6468,    0.2439,    0.3136,    0.2803},
-{    0.0645,    0.2643,    0.0081,    0.1300,    0.2820,    0.0013,    0.0007,    0.1176,    0.0756,    0.0972},
-{    0.0873,    0.2957,    0.0172,    0.1622,    0.3171,    0.0000,    0.0047,    0.1531,    0.1019,    0.1247},
-{    0.0232,    0.0117,    0.0993,    0.0017,    0.0174,    0.1815,    0.1436,    0.0035,    0.0171,    0.0091},
-{    0.0236,    0.0117,    0.0990,    0.0019,    0.0174,    0.1884,    0.1468,    0.0037,    0.0176,    0.0094},
-{    0.0880,    0.0016,    0.2151,    0.0353,    0.0002,    0.3347,    0.2735,    0.0424,    0.0767,    0.0605},
-{    0.0612,    0.2553,    0.0076,    0.1243,    0.2881,    0.0014,    0.0006,    0.1127,    0.0723,    0.0948},
-{    0.0712,    0.0001,    0.1919,    0.0250,    0.0003,    0.3028,    0.2438,    0.0311,    0.0607,    0.0464},
-{    0.2640,    0.0683,    0.4605,    0.1632,    0.0539,    0.6409,    0.5558,    0.1872,    0.2484,    0.2165},
-
-              },
-            new double[,]
-              {
-{    0.3043,    0.2111,    0.0937,    0.2795,    0.0039,    0.3119,    0.2908,    0.3573,    0.2884,    0.1155},
-{    0.0311,    0.0075,    0.0063,    0.0237,    0.1980,    0.0349,    0.0254,    0.0467,    0.0251,    0.0021},
-{    0.0011,    0.0034,    0.0514,    0.0001,    0.3361,    0.0021,    0.0002,    0.0048,    0.0002,    0.0367},
-{    0.0372,    0.0097,    0.0043,    0.0287,    0.1743,    0.0407,    0.0312,    0.0534,    0.0305,    0.0010},
-{    0.0122,    0.0391,    0.1353,    0.0177,    0.4961,    0.0087,    0.0162,    0.0055,    0.0170,    0.1128},
-{    0.0056,    0.0275,    0.1095,    0.0095,    0.4598,    0.0037,    0.0087,    0.0015,    0.0091,    0.0905},
-{    0.5047,    0.3954,    0.2126,    0.4698,    0.0094,    0.5169,    0.4841,    0.5584,    0.4828,    0.2496},
-{    0.5240,    0.4027,    0.2288,    0.4855,    0.0119,    0.5436,    0.5076,    0.5679,    0.4977,    0.2620},
-{    0.1271,    0.0714,    0.0107,    0.1112,    0.0702,    0.1350,    0.1159,    0.1555,    0.1144,    0.0190},
-{    0.0203,    0.0557,    0.1587,    0.0268,    0.5785,    0.0170,    0.0262,    0.0120,    0.0268,    0.1351},
-              },
-            new double[,]
-              {
-{    0.0054,    0.4363,    0.0374,    0.0023,    0.4322,    0.5050,    0.0394,    0.0147,    0.0005,    0.0294},
-{    0.0017,    0.3100,    0.0057,    0.0265,    0.2917,    0.3606,    0.0070,    0.0570,    0.0086,    0.0030},
-{    0.2513,    0.0100,    0.1495,    0.3849,    0.0065,    0.0243,    0.1428,    0.4769,    0.3053,    0.1660},
-{    0.0845,    0.7606,    0.1664,    0.0274,    0.7108,    0.8653,    0.1766,    0.0090,    0.0577,    0.1507},
-{    0.0707,    0.7222,    0.1447,    0.0198,    0.6589,    0.7932,    0.1517,    0.0046,    0.0456,    0.1311},
-{    0.0198,    0.5458,    0.0650,    0.0002,    0.4907,    0.6123,    0.0715,    0.0033,    0.0079,    0.0564},
-{    0.1069,    0.0724,    0.0459,    0.2000,    0.0642,    0.1012,    0.0417,    0.2717,    0.1447,    0.0563},
-{    0.1655,    0.0345,    0.0884,    0.2758,    0.0286,    0.0577,    0.0816,    0.3546,    0.2104,    0.1009},
-{    0.1067,    0.0723,    0.0464,    0.2005,    0.0641,    0.1028,    0.0414,    0.2736,    0.1438,    0.0559},
-{    0.0182,    0.2133,    0.0004,    0.0650,    0.1937,    0.2616,    0.0001,    0.1122,    0.0353,    0.0017},
-              },
-            new double[,]
-              {
-{    0.0021,    0.0746,    0.0031,    0.0249,    0.1018,    0.1679,    0.0593,    0.0501,    0.0143,    0.0015},
-{    0.0836,    0.0011,    0.0897,    0.1607,    0.0053,    0.0294,    0.0000,    0.0005,    0.0156,    0.0434},
-{    0.0217,    0.2240,    0.0197,    0.0011,    0.2531,    0.3809,    0.1960,    0.1716,    0.0989,    0.0547},
-{    0.1593,    0.0050,    0.1656,    0.2607,    0.0010,    0.0048,    0.0114,    0.0166,    0.0543,    0.0991},
-{    0.0083,    0.1680,    0.0068,    0.0006,    0.1918,    0.2930,    0.1474,    0.1339,    0.0681,    0.0314},
-{    0.1662,    0.0059,    0.1676,    0.2716,    0.0013,    0.0041,    0.0126,    0.0182,    0.0575,    0.1032},
-{    0.0480,    0.0109,    0.0526,    0.1090,    0.0211,    0.0583,    0.0049,    0.0023,    0.0029,    0.0189},
-{    0.0009,    0.1240,    0.0005,    0.0068,    0.1558,    0.2422,    0.1030,    0.0867,    0.0381,    0.0134},
-{    0.0323,    0.2554,    0.0309,    0.0045,    0.3023,    0.4098,    0.2220,    0.2023,    0.1201,    0.0726},
-{    0.2451,    0.0313,    0.2555,    0.3645,    0.0186,    0.0012,    0.0442,    0.0549,    0.1118,    0.1741},
-              },
-            new double[,]
-              {
-{    0.6611,    0.4092,    0.0161,    0.7494,    0.0000,    0.0361,    0.1838,    0.1184,    0.4525,    0.2155},
-{    0.4466,    0.2511,    0.0006,    0.5202,    0.0225,    0.0019,    0.0781,    0.0379,    0.2771,    0.0975},
-{    0.1555,    0.0484,    0.0965,    0.1990,    0.1809,    0.0574,    0.0000,    0.0080,    0.0599,    0.0008},
-{    0.1186,    0.0277,    0.1289,    0.1581,    0.2184,    0.0807,    0.0027,    0.0200,    0.0387,    0.0005},
-{    0.1284,    0.0317,    0.1211,    0.1718,    0.2062,    0.0727,    0.0017,    0.0172,    0.0433,    0.0001},
-{    0.0479,    0.0018,    0.2333,    0.0749,    0.3511,    0.1675,    0.0326,    0.0736,    0.0047,    0.0228},
-{    0.1675,    0.0583,    0.0820,    0.2131,    0.1735,    0.0455,    0.0004,    0.0046,    0.0696,    0.0024},
-{    0.1692,    0.0579,    0.0819,    0.2138,    0.1669,    0.0452,    0.0005,    0.0042,    0.0702,    0.0026},
-{    0.5045,    0.2934,    0.0003,    0.5815,    0.0120,    0.0071,    0.1028,    0.0543,    0.3190,    0.1259},
-{    0.4673,    0.2708,    0.0000,    0.5382,    0.0169,    0.0039,    0.0891,    0.0455,    0.2954,    0.1079},
-              },
-            new double[,]
-              {
-{   13.7185,   13.5970,   14.4724,   13.6668,   14.2254,   13.4477,   13.9840,   14.2096,   13.9596,   14.3828},
-{   13.8542,   14.0889,   14.1062,   13.7957,   14.1607,   13.5743,   14.0000,   14.3869,   14.1234,   14.3454},
-{   14.2753,   14.2173,   14.4492,   14.0445,   13.6775,   14.3044,   14.4343,   13.9773,   14.2278,   14.4183},
-{   14.2829,   13.6339,   14.2875,   14.1263,   13.2777,   13.7501,   14.5498,   14.5238,   14.4923,   14.3972},
-{   14.5334,   13.7703,   14.2618,   14.5649,   13.1097,   13.3585,   14.3100,   14.6126,   14.5857,   14.4907},
-{   14.5125,   14.1727,   14.0872,   14.4155,   13.3905,   13.7667,   14.5035,   14.6775,   14.6809,   14.4932},
-{   13.8321,   14.2292,   14.1566,   13.7114,   14.5073,   13.6796,   13.9499,   13.8703,   13.9795,   14.3852},
-{   13.8260,   13.8756,   14.3651,   13.6258,   14.1115,   13.8588,   14.0675,   13.6042,   13.8604,   14.2964},
-{   13.9103,   14.0681,   14.4953,   13.8241,   14.3221,   13.7864,   14.0331,   14.0426,   13.9991,   14.4548},
-{   13.7248,   14.1238,   13.8747,   13.5695,   13.8893,   13.8218,   14.0442,   14.3604,   14.0418,   14.1283},
+{         0,    0.1316,    0.2186,    0.2629,    0.0051,    0.0049,    0.0062,    0.2224,    0.0023,    0.0882},
+{    0.1316,         0,    0.6685,    0.7466,    0.1864,    0.1865,    0.0799,    0.6593,    0.0990,    0.0037},
+{    0.2186,    0.6685,         0,    0.0017,    0.1606,    0.1602,    0.2987,    0.0000,    0.2745,    0.5725},
+{    0.2629,    0.7466,    0.0017,         0,    0.1985,    0.2030,    0.3422,    0.0019,    0.3043,    0.6432},
+{    0.0051,    0.1864,    0.1606,    0.1985,         0,    0.0000,    0.0216,    0.1524,    0.0141,    0.1366},
+{    0.0049,    0.1865,    0.1602,    0.2030,    0.0000,         0,    0.0215,    0.1535,    0.0134,    0.1384},
+{    0.0062,    0.0799,    0.2987,    0.3422,    0.0216,    0.0215,         0,    0.3081,    0.0010,    0.0478},
+{    0.2224,    0.6593,    0.0000,    0.0019,    0.1524,    0.1535,    0.3081,         0,    0.2715,    0.5480},
+{    0.0023,    0.0990,    0.2745,    0.3043,    0.0141,    0.0134,    0.0010,    0.2715,         0,    0.0628},
+{    0.0882,    0.0037,    0.5725,    0.6432,    0.1366,    0.1384,    0.0478,    0.5480,    0.0628,         0},
+              },
+            new double[,]
+              {
+{         0,    0.1486,    0.2692,    0.1339,    0.4441,    0.3941,    0.0255,    0.0295,    0.0413,    0.4886},
+{    0.1486,         0,    0.0201,    0.0002,    0.0823,    0.0641,    0.2940,    0.2925,    0.0334,    0.1076},
+{    0.2692,    0.0201,         0,    0.0246,    0.0200,    0.0113,    0.4590,    0.4923,    0.1073,    0.0302},
+{    0.1339,    0.0002,    0.0246,         0,    0.0910,    0.0723,    0.2689,    0.2847,    0.0270,    0.1096},
+{    0.4441,    0.0823,    0.0200,    0.0910,         0,    0.0012,    0.6588,    0.6726,    0.2177,    0.0013},
+{    0.3941,    0.0641,    0.0113,    0.0723,    0.0012,         0,    0.6140,    0.6177,    0.1829,    0.0050},
+{    0.0255,    0.2940,    0.4590,    0.2689,    0.6588,    0.6140,         0,    0.0002,    0.1310,    0.7259},
+{    0.0295,    0.2925,    0.4923,    0.2847,    0.6726,    0.6177,    0.0002,         0,    0.1398,    0.7073},
+{    0.0413,    0.0334,    0.1073,    0.0270,    0.2177,    0.1829,    0.1310,    0.1398,         0,    0.2506},
+{    0.4886,    0.1076,    0.0302,    0.1096,    0.0013,    0.0050,    0.7259,    0.7073,    0.2506,         0},
+              },
+            new double[,]
+              {
+{         0,    0.0137,    0.3191,    0.0455,    0.0349,    0.0041,    0.1669,    0.2356,    0.1673,    0.0440},
+{    0.0137,         0,    0.2012,    0.1063,    0.0922,    0.0327,    0.0843,    0.1306,    0.0841,    0.0094},
+{    0.3191,    0.2012,         0,    0.6073,    0.5736,    0.3987,    0.0277,    0.0077,    0.0290,    0.1253},
+{    0.0455,    0.1063,    0.6073,         0,    0.0007,    0.0231,    0.3728,    0.4790,    0.3672,    0.1755},
+{    0.0349,    0.0922,    0.5736,    0.0007,         0,    0.0156,    0.3385,    0.4318,    0.3474,    0.1576},
+{    0.0041,    0.0327,    0.3987,    0.0231,    0.0156,         0,    0.2156,    0.2880,    0.2133,    0.0769},
+{    0.1669,    0.0843,    0.0277,    0.3728,    0.3385,    0.2156,         0,    0.0066,    0.0000,    0.0366},
+{    0.2356,    0.1306,    0.0077,    0.4790,    0.4318,    0.2880,    0.0066,         0,    0.0068,    0.0694},
+{    0.1673,    0.0841,    0.0290,    0.3672,    0.3474,    0.2133,    0.0000,    0.0068,         0,    0.0365},
+{    0.0440,    0.0094,    0.1253,    0.1755,    0.1576,    0.0769,    0.0366,    0.0694,    0.0365,         0},
+              },
+            new double[,]
+              {
+{         0,    0.0612,    0.0363,    0.1211,    0.0186,    0.1239,    0.0310,    0.0059,    0.0534,    0.2043},
+{    0.0612,         0,    0.1847,    0.0107,    0.1461,    0.0123,    0.0050,    0.0989,    0.2270,    0.0458},
+{    0.0363,    0.1847,         0,    0.2888,    0.0032,    0.2952,    0.1324,    0.0137,    0.0012,    0.4024},
+{    0.1211,    0.0107,    0.2888,         0,    0.2388,    0.0000,    0.0299,    0.1780,    0.3210,    0.0108},
+{    0.0186,    0.1461,    0.0032,    0.2388,         0,    0.2484,    0.0933,    0.0034,    0.0083,    0.3475},
+{    0.1239,    0.0123,    0.2952,    0.0000,    0.2484,         0,    0.0320,    0.1778,    0.3315,    0.0102},
+{    0.0310,    0.0050,    0.1324,    0.0299,    0.0933,    0.0320,         0,    0.0644,    0.1650,    0.0770},
+{    0.0059,    0.0989,    0.0137,    0.1780,    0.0034,    0.1778,    0.0644,         0,    0.0230,    0.2610},
+{    0.0534,    0.2270,    0.0012,    0.3210,    0.0083,    0.3315,    0.1650,    0.0230,         0,    0.4611},
+{    0.2043,    0.0458,    0.4024,    0.0108,    0.3475,    0.0102,    0.0770,    0.2610,    0.4611,         0},
+              },
+            new double[,]
+              {
+{         0,    0.0230,    0.1818,    0.2301,    0.2212,    0.3641,    0.1723,    0.1672,    0.0123,    0.0171},
+{    0.0230,         0,    0.0767,    0.1076,    0.1036,    0.2126,    0.0688,    0.0640,    0.0017,    0.0004},
+{    0.1818,    0.0767,         0,    0.0024,    0.0015,    0.0305,    0.0004,    0.0006,    0.1055,    0.0867},
+{    0.2301,    0.1076,    0.0024,         0,    0.0001,    0.0164,    0.0049,    0.0052,    0.1338,    0.1192},
+{    0.2212,    0.1036,    0.0015,    0.0001,         0,    0.0194,    0.0035,    0.0037,    0.1306,    0.1147},
+{    0.3641,    0.2126,    0.0305,    0.0164,    0.0194,         0,    0.0382,    0.0380,    0.2434,    0.2311},
+{    0.1723,    0.0688,    0.0004,    0.0049,    0.0035,    0.0382,         0,    0.0000,    0.0930,    0.0764},
+{    0.1672,    0.0640,    0.0006,    0.0052,    0.0037,    0.0380,    0.0000,         0,    0.0907,    0.0710},
+{    0.0123,    0.0017,    0.1055,    0.1338,    0.1306,    0.2434,    0.0930,    0.0907,         0,    0.0005},
+{    0.0171,    0.0004,    0.0867,    0.1192,    0.1147,    0.2311,    0.0764,    0.0710,    0.0005,         0},
+              },
+            new double[,]
+              {
+{   14.7781,   14.3950,   13.7138,   13.9618,   14.0352,   13.8578,   14.3707,   14.1018,   14.4990,   13.9100},
+{   14.3950,   14.7781,   13.5767,   13.7715,   14.1542,   14.2607,   14.2360,   13.4735,   14.3260,   14.6102},
+{   13.7138,   13.5767,   14.7781,   13.8217,   13.9982,   13.8525,   13.8286,   14.2545,   14.2511,   13.5045},
+{   13.9618,   13.7715,   13.8217,   14.7781,   14.2390,   14.4598,   13.7206,   13.7960,   13.5743,   13.6778},
+{   14.0352,   14.1542,   13.9982,   14.2390,   14.7781,   14.4908,   13.6154,   13.4528,   14.0413,   13.9995},
+{   13.8578,   14.2607,   13.8525,   14.4598,   14.4908,   14.7781,   13.8254,   13.4407,   13.7576,   14.3090},
+{   14.3707,   14.2360,   13.8286,   13.7206,   13.6154,   13.8254,   14.7781,   14.3938,   14.3828,   13.7798},
+{   14.1018,   13.4735,   14.2545,   13.7960,   13.4528,   13.4407,   14.3938,   14.7781,   14.2363,   13.0113},
+{   14.4990,   14.3260,   14.2511,   13.5743,   14.0413,   13.7576,   14.3828,   14.2363,   14.7781,   13.9425},
+{   13.9100,   14.6102,   13.5045,   13.6778,   13.9995,   14.3090,   13.7798,   13.0113,   13.9425,   14.7781},
               },
           }
@@ -617,27 +1308,27 @@
             new double[,]
               {
-{    0.6345,    0.6652,    0.2647,    0.6484,    0.4251,    0.6943,    0.5427,    0.4338,    0.5527,    0.3280},
-{    0.5921,    0.4959,    0.4876,    0.6115,    0.4601,    0.6702,    0.5360,    0.3252,    0.4791,    0.3526},
-{    0.3961,    0.4296,    0.2816,    0.5165,    0.6456,    0.3784,    0.2923,    0.5455,    0.4237,    0.3036},
-{    0.3916,    0.6566,    0.3888,    0.4777,    0.7173,    0.6255,    0.2051,    0.2256,    0.2498,    0.3182},
-{    0.2181,    0.6194,    0.4041,    0.1929,    0.7305,    0.7077,    0.3750,    0.1532,    0.1758,    0.2510},
-{    0.2344,    0.4538,    0.4967,    0.3056,    0.7032,    0.6205,    0.2413,    0.0960,    0.0929,    0.2492},
-{    0.5996,    0.4229,    0.4622,    0.6365,    0.2384,    0.6451,    0.5566,    0.5865,    0.5446,    0.3263},
-{    0.6017,    0.5846,    0.3398,    0.6585,    0.4850,    0.5905,    0.5060,    0.6636,    0.5900,    0.3834},
-{    0.5719,    0.5057,    0.2476,    0.6023,    0.3674,    0.6144,    0.5216,    0.5174,    0.5364,    0.2776},
-{    0.6327,    0.4789,    0.5849,    0.6712,    0.5796,    0.6030,    0.5167,    0.3428,    0.5177,    0.4767},
-              },
-            new double[,]
-              {
-{    1.1542,    1.0808,    1.7137,    1.1224,    1.5090,    0.9961,    1.3298,    1.4968,    1.3127,    1.6369},
-{    1.2413,    1.4053,    1.4181,    1.2031,    1.4591,    1.0675,    1.3411,    1.6404,    1.4309,    1.6057},
-{    1.5486,    1.5027,    1.6936,    1.3729,    1.1289,    1.5721,    1.6807,    1.3251,    1.5109,    1.6670},
-{    1.5547,    1.1026,    1.5584,    1.4331,    0.9067,    1.1739,    1.7826,    1.7593,    1.7313,    1.6490},
-{    1.7679,    1.1868,    1.5379,    1.7963,    0.8253,    0.9483,    1.5767,    1.8403,    1.8154,    1.7298},
-{    1.7492,    1.4683,    1.4041,    1.6646,    0.9652,    1.1845,    1.7411,    1.9016,    1.9048,    1.7320},
-{    1.2267,    1.5121,    1.4560,    1.1498,    1.7445,    1.1302,    1.3060,    1.2519,    1.3266,    1.6389},
-{    1.2227,    1.2555,    1.6220,    1.0978,    1.4220,    1.2443,    1.3896,    1.0850,    1.2454,    1.5656},
-{    1.2789,    1.3900,    1.7339,    1.2214,    1.5866,    1.1971,    1.3647,    1.3715,    1.3404,    1.6984},
-{    1.1581,    1.4312,    1.2549,    1.0647,    1.2647,    1.2200,    1.3726,    1.6182,    1.3709,    1.4346},
+{         0,    0.3197,    0.6358,    0.5518,    0.5207,    0.5909,    0.3361,    0.4897,    0.2447,    0.5720},
+{    0.3197,         0,    0.6697,    0.6190,    0.4635,    0.4047,    0.4190,    0.6899,    0.3650,    0.1552},
+{    0.6358,    0.6697,         0,    0.6031,    0.5367,    0.5927,    0.6008,    0.4084,    0.4103,    0.6843},
+{    0.5518,    0.6190,    0.6031,         0,    0.4173,    0.2740,    0.6339,    0.6114,    0.6702,    0.6455},
+{    0.5207,    0.4635,    0.5367,    0.4173,         0,    0.2510,    0.6610,    0.6935,    0.5180,    0.5362},
+{    0.5909,    0.4047,    0.5927,    0.2740,    0.2510,         0,    0.6019,    0.6955,    0.6232,    0.3756},
+{    0.3361,    0.4190,    0.6008,    0.6339,    0.6610,    0.6019,         0,    0.3205,    0.3279,    0.6165},
+{    0.4897,    0.6899,    0.4084,    0.6114,    0.6935,    0.6955,    0.3205,         0,    0.4189,    0.7344},
+{    0.2447,    0.3650,    0.4103,    0.6702,    0.5180,    0.6232,    0.3279,    0.4189,         0,    0.5595},
+{    0.5720,    0.1552,    0.6843,    0.6455,    0.5362,    0.3756,    0.6165,    0.7344,    0.5595,         0},
+              },
+            new double[,]
+              {
+{    2.0000,    1.6472,    1.1513,    1.3142,    1.3662,    1.2437,    1.6267,    1.4148,    1.7372,    1.2786},
+{    1.6472,    2.0000,    1.0689,    1.1876,    1.4541,    1.5370,    1.5174,    1.0103,    1.5898,    1.8381},
+{    1.1513,    1.0689,    2.0000,    1.2199,    1.3398,    1.2402,    1.2244,    1.5320,    1.5293,    1.0276},
+{    1.3142,    1.1876,    1.2199,    2.0000,    1.5197,    1.7027,    1.1555,    1.2033,    1.0675,    1.1291},
+{    1.3662,    1.4541,    1.3398,    1.5197,    2.0000,    1.7299,    1.0916,    0.9989,    1.3706,    1.3407},
+{    1.2437,    1.5370,    1.2402,    1.7027,    1.7299,    2.0000,    1.2223,    0.9923,    1.1787,    1.5758},
+{    1.6267,    1.5174,    1.2244,    1.1555,    1.0916,    1.2223,    2.0000,    1.6461,    1.6369,    1.1928},
+{    1.4148,    1.0103,    1.5320,    1.2033,    0.9989,    0.9923,    1.6461,    2.0000,    1.5176,    0.7806},
+{    1.7372,    1.5898,    1.5293,    1.0675,    1.3706,    1.1787,    1.6369,    1.5176,    2.0000,    1.3009},
+{    1.2786,    1.8381,    1.0276,    1.1291,    1.3407,    1.5758,    1.1928,    0.7806,    1.3009,    2.0000},
               },
           }
@@ -661,27 +1352,27 @@
             new double[,]
               {
-{    1.0207,    1.1326,    0.3026,    1.0685,    0.5423,    1.2686,    0.7724,    0.5574,    0.7955,    0.3900},
-{    0.8944,    0.6729,    0.6564,    0.9490,    0.6043,    1.1534,    0.7573,    0.3860,    0.6400,    0.4263},
-{    0.4942,    0.5501,    0.3252,    0.7151,    1.0586,    0.4660,    0.3398,    0.7787,    0.5400,    0.3554},
-{    0.4868,    1.0987,    0.4824,    0.6372,    1.4215,    0.9914,    0.2266,    0.2521,    0.2830,    0.3760},
-{    0.2427,    0.9726,    0.5072,    0.2117,    1.5705,    1.3491,    0.4606,    0.1646,    0.1911,    0.2846},
-{    0.2632,    0.5928,    0.6745,    0.3581,    1.3203,    0.9760,    0.2721,    0.1002,    0.0969,    0.2822},
-{    0.9151,    0.5386,    0.6082,    1.0272,    0.2684,    1.0567,    0.8045,    0.8794,    0.7766,    0.3876},
-{    0.9208,    0.8744,    0.4072,    1.1062,    0.6514,    0.8901,    0.6932,    1.1260,    0.8886,    0.4738},
-{    0.8418,    0.6927,    0.2801,    0.9226,    0.4489,    0.9576,    0.7259,    0.7169,    0.7582,    0.3198},
-{    1.0149,    0.6396,    0.8752,    1.1578,    0.8615,    0.9246,    0.7154,    0.4117,    0.7177,    0.6353},
-              },
-            new double[,]
-              {
-{   13.7185,   13.5970,   14.4724,   13.6668,   14.2254,   13.4477,   13.9840,   14.2096,   13.9596,   14.3828},
-{   13.8542,   14.0889,   14.1062,   13.7957,   14.1607,   13.5743,   14.0000,   14.3869,   14.1234,   14.3454},
-{   14.2753,   14.2173,   14.4492,   14.0445,   13.6775,   14.3044,   14.4343,   13.9773,   14.2278,   14.4183},
-{   14.2829,   13.6339,   14.2875,   14.1263,   13.2777,   13.7501,   14.5498,   14.5238,   14.4923,   14.3972},
-{   14.5334,   13.7703,   14.2618,   14.5649,   13.1097,   13.3585,   14.3100,   14.6126,   14.5857,   14.4907},
-{   14.5125,   14.1727,   14.0872,   14.4155,   13.3905,   13.7667,   14.5035,   14.6775,   14.6809,   14.4932},
-{   13.8321,   14.2292,   14.1566,   13.7114,   14.5073,   13.6796,   13.9499,   13.8703,   13.9795,   14.3852},
-{   13.8260,   13.8756,   14.3651,   13.6258,   14.1115,   13.8588,   14.0675,   13.6042,   13.8604,   14.2964},
-{   13.9103,   14.0681,   14.4953,   13.8241,   14.3221,   13.7864,   14.0331,   14.0426,   13.9991,   14.4548},
-{   13.7248,   14.1238,   13.8747,   13.5695,   13.8893,   13.8218,   14.0442,   14.3604,   14.0418,   14.1283},
+{         0,    0.3781,    1.0250,    0.7934,    0.7239,    0.8910,    0.4018,    0.6606,    0.2764,    0.8421},
+{    0.3781,         0,    1.1512,    0.9715,    0.6106,    0.5082,    0.5320,    1.2453,    0.4451,    0.1669},
+{    1.0250,    1.1512,         0,    0.9248,    0.7589,    0.8960,    0.9183,    0.5143,    0.5175,    1.2171},
+{    0.7934,    0.9715,    0.9248,         0,    0.5292,    0.3149,    1.0188,    0.9487,    1.1534,    1.0583},
+{    0.7239,    0.6106,    0.7589,    0.5292,         0,    0.2845,    1.1157,    1.2640,    0.7182,    0.7577},
+{    0.8910,    0.5082,    0.8960,    0.3149,    0.2845,         0,    0.9214,    1.2749,    0.9845,    0.4616},
+{    0.4018,    0.5320,    0.9183,    1.0188,    1.1157,    0.9214,         0,    0.3793,    0.3899,    0.9638},
+{    0.6606,    1.2453,    0.5143,    0.9487,    1.2640,    1.2749,    0.3793,         0,    0.5318,    1.6567},
+{    0.2764,    0.4451,    0.5175,    1.1534,    0.7182,    0.9845,    0.3899,    0.5318,         0,    0.8116},
+{    0.8421,    0.1669,    1.2171,    1.0583,    0.7577,    0.4616,    0.9638,    1.6567,    0.8116,         0},
+              },
+            new double[,]
+              {
+{   14.7781,   14.3950,   13.7138,   13.9618,   14.0352,   13.8578,   14.3707,   14.1018,   14.4990,   13.9100},
+{   14.3950,   14.7781,   13.5767,   13.7715,   14.1542,   14.2607,   14.2360,   13.4735,   14.3260,   14.6102},
+{   13.7138,   13.5767,   14.7781,   13.8217,   13.9982,   13.8525,   13.8286,   14.2545,   14.2511,   13.5045},
+{   13.9618,   13.7715,   13.8217,   14.7781,   14.2390,   14.4598,   13.7206,   13.7960,   13.5743,   13.6778},
+{   14.0352,   14.1542,   13.9982,   14.2390,   14.7781,   14.4908,   13.6154,   13.4528,   14.0413,   13.9995},
+{   13.8578,   14.2607,   13.8525,   14.4598,   14.4908,   14.7781,   13.8254,   13.4407,   13.7576,   14.3090},
+{   14.3707,   14.2360,   13.8286,   13.7206,   13.6154,   13.8254,   14.7781,   14.3938,   14.3828,   13.7798},
+{   14.1018,   13.4735,   14.2545,   13.7960,   13.4528,   13.4407,   14.3938,   14.7781,   14.2363,   13.0113},
+{   14.4990,   14.3260,   14.2511,   13.5743,   14.0413,   13.7576,   14.3828,   14.2363,   14.7781,   13.9425},
+{   13.9100,   14.6102,   13.5045,   13.6778,   13.9995,   14.3090,   13.7798,   13.0113,   13.9425,   14.7781},
               },
           }
@@ -712,27 +1403,27 @@
             new double[,]
               {
-{    0.5767,    0.6633,    0.4980,    0.5588,    0.8510,    1.0532,    0.6845,    0.4776,    0.5254,    0.4543},
-{    0.2756,    0.3688,    0.5733,    0.2537,    0.6682,    0.7170,    0.4039,    0.2199,    0.2494,    0.2996},
-{    0.5435,    0.6426,    0.5741,    0.6365,    1.2144,    0.8107,    0.4866,    0.6263,    0.5340,    0.4774},
-{    0.3317,    0.4317,    0.5547,    0.3566,    0.8127,    0.8265,    0.2450,    0.2037,    0.2167,    0.3287},
-{    0.1737,    0.3419,    0.4987,    0.1530,    0.6281,    0.6573,    0.3347,    0.1177,    0.1294,    0.2263},
-{    0.1244,    0.2312,    0.4411,    0.1411,    0.5353,    0.5559,    0.1778,    0.0524,    0.0491,    0.1614},
-{    0.5264,    0.5249,    0.7518,    0.5054,    0.4900,    1.0006,    0.6408,    0.4870,    0.4733,    0.4224},
-{    0.8556,    0.9368,    0.7753,    0.8528,    1.1632,    1.2961,    0.8909,    0.8193,    0.7984,    0.6886},
-{    0.6251,    0.6728,    0.4889,    0.6191,    0.7840,    1.0950,    0.7139,    0.5665,    0.5648,    0.4174},
-{    0.2155,    0.3383,    0.5837,    0.1593,    0.7267,    0.6922,    0.3726,    0.2082,    0.2186,    0.3249},
-              },
-            new double[,]
-              {
-{    1.0490,    1.0777,    3.2240,    0.9672,    3.0213,    1.5108,    1.6771,    1.6478,    1.2478,    2.2672},
-{    0.5777,    1.0450,    1.6673,    0.4992,    2.1190,    1.1421,    1.0104,    1.1094,    0.7448,    1.3644},
-{    2.1246,    2.2479,    3.4526,    1.6919,    2.1236,    3.3679,    2.7976,    1.5214,    1.9041,    2.6212},
-{    1.3170,    0.7250,    2.2233,    1.0698,    1.0274,    1.5513,    2.1295,    1.5883,    1.5021,    1.7032},
-{    1.4080,    0.6551,    1.8980,    1.4249,    0.7096,    0.8808,    1.4075,    1.4146,    1.3360,    1.5596},
-{    0.9281,    0.7482,    1.2467,    0.7687,    0.7347,    1.0613,    1.2826,    1.0386,    1.0071,    1.1216},
-{    1.0770,    1.8767,    2.3681,    0.9129,    3.5854,    1.7532,    1.5037,    1.0396,    1.1531,    2.1215},
-{    1.7387,    2.0120,    3.7012,    1.4217,    3.4103,    2.7309,    2.4467,    1.3395,    1.6854,    2.8121},
-{    1.3978,    1.8493,    3.4235,    1.2554,    3.3854,    2.1334,    1.8678,    1.5019,    1.4113,    2.5536},
-{    0.3944,    1.0110,    1.2523,    0.2526,    1.5856,    1.4004,    0.9900,    0.9825,    0.5788,    0.9777},
+{         0,    0.4127,    1.0287,    0.6741,    0.5630,    0.4325,    0.5722,    1.0336,    0.4752,    0.5617},
+{    0.4127,         0,    0.6880,    0.3738,    0.2907,    0.1730,    0.4679,    0.8675,    0.4878,    0.1286},
+{    1.0287,    0.6880,         0,    0.7937,    0.6606,    0.5323,    0.9538,    0.9634,    0.8138,    0.6381},
+{    0.6741,    0.3738,    0.7937,         0,    0.3455,    0.1881,    0.6345,    0.9714,    0.7339,    0.3214},
+{    0.5630,    0.2907,    0.6606,    0.3455,         0,    0.1313,    0.5056,    0.8485,    0.6038,    0.2630},
+{    0.4325,    0.1730,    0.5323,    0.1881,    0.1313,         0,    0.3748,    0.6687,    0.4734,    0.1491},
+{    0.5722,    0.4679,    0.9538,    0.6345,    0.5056,    0.3748,         0,    0.6955,    0.5871,    0.5059},
+{    1.0336,    0.8675,    0.9634,    0.9714,    0.8485,    0.6687,    0.6955,         0,    0.9475,    0.6932},
+{    0.4752,    0.4878,    0.8138,    0.7339,    0.6038,    0.4734,    0.5871,    0.9475,         0,    0.6046},
+{    0.5617,    0.1286,    0.6381,    0.3214,    0.2630,    0.1491,    0.5059,    0.6932,    0.6046,         0},
+              },
+            new double[,]
+              {
+{    4.0023,    2.1261,    1.8626,    1.6054,    1.4771,    0.9102,    2.7697,    2.9858,    3.3730,    1.2556},
+{    2.1261,    1.9372,    1.0981,    0.7172,    0.9121,    0.6569,    1.6947,    1.2703,    2.1250,    1.5231},
+{    1.8626,    1.0981,    4.6784,    1.6055,    1.6490,    1.1138,    1.9438,    3.6140,    3.0330,    0.9581},
+{    1.6054,    0.7172,    1.6055,    2.5635,    1.2584,    1.1688,    1.1565,    1.9117,    1.1689,    0.5622},
+{    1.4771,    0.9121,    1.6490,    1.2584,    1.8469,    0.9049,    0.8350,    1.2221,    1.5977,    0.6577},
+{    0.9102,    0.6569,    1.1138,    1.1688,    0.9049,    0.8258,    0.7611,    0.9541,    0.8954,    0.6253},
+{    2.7697,    1.6947,    1.9438,    1.1565,    0.8350,    0.7611,    3.6346,    3.5720,    2.9305,    0.9789},
+{    2.9858,    1.2703,    3.6140,    1.9117,    1.2221,    0.9541,    3.5720,    5.8240,    3.4327,    0.7368},
+{    3.3730,    2.1250,    3.0330,    1.1689,    1.5977,    0.8954,    2.9305,    3.4327,    4.3277,    1.4057},
+{    1.2556,    1.5231,    0.9581,    0.5622,    0.6577,    0.6253,    0.9789,    0.7368,    1.4057,    1.7151},
               },
           }
@@ -756,34 +1447,34 @@
             new double[,]
               {
-{    0.9277,    1.1294,    0.5692,    0.9208,    1.0857,    1.9243,    0.9742,    0.6136,    0.7561,    0.5402},
-{    0.4163,    0.5003,    0.7718,    0.3938,    0.8777,    1.2339,    0.5706,    0.2610,    0.3331,    0.3622},
-{    0.6780,    0.8229,    0.6629,    0.8812,    1.9912,    0.9983,    0.5655,    0.8941,    0.6805,    0.5589},
-{    0.4124,    0.7225,    0.6882,    0.4757,    1.6107,    1.3101,    0.2707,    0.2276,    0.2455,    0.3883},
-{    0.1933,    0.5369,    0.6259,    0.1679,    1.3503,    1.2531,    0.4112,    0.1265,    0.1406,    0.2566},
-{    0.1396,    0.3021,    0.5989,    0.1654,    1.0050,    0.8744,    0.2004,    0.0548,    0.0512,    0.1827},
-{    0.8034,    0.6684,    0.9892,    0.8156,    0.5515,    1.6391,    0.9263,    0.7302,    0.6750,    0.5018},
-{    1.3094,    1.4012,    0.9292,    1.4326,    1.5622,    1.9537,    1.2206,    1.3902,    1.2026,    0.8509},
-{    0.9201,    0.9215,    0.5531,    0.9483,    0.9578,    1.7066,    0.9935,    0.7850,    0.7983,    0.4808},
-{    0.3456,    0.4518,    0.8735,    0.2747,    1.0802,    1.0614,    0.5160,    0.2500,    0.3030,    0.4330},
-              },
-            new double[,]
-              {
-{   12.4684,   13.5589,   27.2269,   11.7775,   28.4810,   20.3974,   17.6367,   15.6433,   13.2687,   19.9218},
-{    6.4483,   10.4768,   16.5855,    5.7248,   20.5652,   14.5226,   10.5485,    9.7302,    7.3516,   12.1897},
-{   19.5852,   21.2676,   29.4561,   17.3075,   25.7280,   30.6436,   24.0261,   16.0481,   17.9305,   22.6719},
-{   12.0994,    8.9651,   20.3832,   10.5449,   15.0447,   18.1696,   17.3814,   13.1126,   12.5737,   14.8704},
-{   11.5753,    7.6010,   17.6020,   11.5533,   11.2719,   12.4074,   12.7745,   11.2328,   10.7342,   13.0642},
-{    7.7002,    7.2219,   12.5086,    6.6571,   10.1926,   12.3345,   10.6842,    8.0169,    7.7623,    9.3850},
-{   12.1437,   17.6603,   23.0249,   10.8865,   29.8159,   21.2199,   16.0607,   11.5178,   12.1505,   18.6213},
-{   19.6612,   22.2367,   32.7783,   17.6462,   33.8425,   30.4168,   24.7688,   16.7960,   18.7578,   25.6781},
-{   15.2039,   18.7161,   28.6209,   14.2089,   30.5600,   24.5693,   19.2063,   15.3774,   14.7399,   21.7333},
-{    4.6744,    9.9769,   13.8465,    3.2199,   17.4141,   15.8657,   10.1292,    8.7194,    5.9286,    9.6290},
-              },
-          }
-      );
-    }
-
-
-    private void TestCovarianceFunction(ICovarianceFunction cf, double hypValue, double[,] expectedCov, double[][,] expectedGradients) {
+{         0,    0.4881,    1.6583,    0.9692,    0.7827,    0.6522,    0.6841,    1.3942,    0.5367,    0.8270},
+{    0.4881,         0,    1.1827,    0.5867,    0.3830,    0.2172,    0.5941,    1.5658,    0.5949,    0.1383},
+{    1.6583,    1.1827,         0,    1.2171,    0.9340,    0.8047,    1.4579,    1.2131,    1.0263,    1.1349},
+{    0.9692,    0.5867,    1.2171,         0,    0.4382,    0.2161,    1.0197,    1.5073,    1.2629,    0.5270},
+{    0.7827,    0.3830,    0.9340,    0.4382,         0,    0.1488,    0.8534,    1.5465,    0.8372,    0.3717},
+{    0.6522,    0.2172,    0.8047,    0.2161,    0.1488,         0,    0.5737,    1.2259,    0.7478,    0.1832},
+{    0.6841,    0.5941,    1.4579,    1.0197,    0.8534,    0.5737,         0,    0.8230,    0.6981,    0.7909},
+{    1.3942,    1.5658,    1.2131,    1.5073,    1.5465,    1.2259,    0.8230,         0,    1.2028,    1.5638},
+{    0.5367,    0.5949,    1.0263,    1.2629,    0.8372,    0.7478,    0.6981,    1.2028,         0,    0.8770},
+{    0.8270,    0.1383,    1.1349,    0.5270,    0.3717,    0.1832,    0.7909,    1.5638,    0.8770,         0},
+              },
+            new double[,]
+              {
+{   29.5729,   18.5805,   22.1876,   17.0550,   15.1746,   10.1428,   24.4678,   29.7604,   28.1516,   13.6594},
+{   18.5805,   14.3139,   13.9483,    8.3170,    8.8785,    6.0953,   15.8990,   16.9410,   19.1490,   12.1067},
+{   22.1876,   13.9483,   34.5691,   18.1905,   17.2281,   12.4415,   21.9535,   33.6266,   28.2630,   12.5918},
+{   17.0550,    8.3170,   18.1905,   18.9418,   11.7900,    9.9253,   13.7325,   21.9184,   14.8634,    6.8107},
+{   15.1746,    8.8785,   17.2281,   11.7900,   13.6471,    7.5799,   10.4142,   16.4592,   16.3685,    6.8676},
+{   10.1428,    6.0953,   12.4415,    9.9253,    7.5799,    6.1018,    8.6086,   12.9238,   10.4507,    5.6783},
+{   24.4678,   15.8990,   21.9535,   13.7325,   10.4142,    8.6086,   26.8561,   31.2335,   25.7489,   11.3079},
+{   29.7604,   16.9410,   33.6266,   21.9184,   16.4592,   12.9238,   31.2335,   43.0336,   32.2012,   12.2815},
+{   28.1516,   19.1490,   28.2630,   14.8634,   16.3685,   10.4507,   25.7489,   32.2012,   31.9778,   15.0663},
+{   13.6594,   12.1067,   12.5918,    6.8107,    6.8676,    5.6783,   11.3079,   12.2815,   15.0663,   12.6728},
+              },
+          }
+      , 5e-3);
+    }
+
+
+    private void TestCovarianceFunction(ICovarianceFunction cf, double hypValue, double[,] expectedCov, double[][,] expectedGradients, double delta = 1E-3) {
       var x = GetData();
       var xt = GetDataTest();
@@ -792,5 +1483,4 @@
       var hyp = Enumerable.Repeat(hypValue, nHyp).ToArray();
       cf.SetParameter(hyp);
-      cf.SetData(x, xt);
 
       int rows0 = x.GetLength(0);
@@ -799,13 +1489,13 @@
       for (int i = 0; i < rows0; i++)
         for (int j = 0; j < rows1; j++)
-          actualCov[i, j] = cf.GetCovariance(i, j);
-
-      AssertEqual(expectedCov, actualCov);
+          actualCov[i, j] = cf.GetCrossCovariance(x, xt, i, j);
+
+      AssertEqual(expectedCov, actualCov, delta);
 
       for (int i = 0; i < rows0; i++)
         for (int j = 0; j < rows1; j++) {
-          var g = cf.GetGradient(i, j);
+          var g = cf.GetGradient(x, i, j).ToArray();
           for (int k = 0; k < nHyp; k++)
-            Assert.AreEqual(expectedGradients[k][i, j], g[k], 5E-3);
+            Assert.AreEqual(expectedGradients[k][i, j], g[k], delta);
         }
     }
@@ -837,9 +1527,9 @@
         Assert.AreEqual(expected[i], actual[i], 1E-3);
     }
-    private void AssertEqual(double[,] expected, double[,] actual) {
+    private void AssertEqual(double[,] expected, double[,] actual, double delta = 5e-3) {
       Assert.AreEqual(expected.Length, actual.Length);
       for (int i = 0; i < expected.GetLength(0); i++)
         for (int j = 0; j < expected.GetLength(1); j++)
-          Assert.AreEqual(expected[i, j], actual[i, j], 5E-3);
+          Assert.AreEqual(expected[i, j], actual[i, j], delta);
     }
 
Index: /branches/HeuristicLab.Mono/HeuristicLab.Tests/HeuristicLab.Algorithms.DataAnalysis-3.4/GaussianProcessModelTest.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Tests/HeuristicLab.Algorithms.DataAnalysis-3.4/GaussianProcessModelTest.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Tests/HeuristicLab.Algorithms.DataAnalysis-3.4/GaussianProcessModelTest.cs	(revision 8585)
@@ -0,0 +1,97 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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 System.Linq;
+using HeuristicLab.Algorithms.DataAnalysis;
+using HeuristicLab.Problems.Instances.DataAnalysis;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Algorithms.DataAnalysis_34.Tests {
+  [TestClass]
+
+  // reference values calculated with Rasmussen's GPML MATLAB package
+  public class GaussianProcessModelTest {
+    [TestMethod]
+    [DeploymentItem(@"HeuristicLab.Algorithms.DataAnalysis-3.4/co2.txt")]
+    public void GaussianProcessModelOutputTest() {
+      var provider = new RegressionCSVInstanceProvider();
+      var problemData = provider.ImportData("co2.txt");
+
+      var targetVariable = "interpolated";
+      var allowedInputVariables = new string[] { "decimal date" };
+      var rows = Enumerable.Range(0, 401);
+
+      var meanFunction = new MeanConst();
+      var covarianceFunction = new CovarianceSum();
+      covarianceFunction.Terms.Add(new CovarianceSEiso());
+      var prod = new CovarianceProd();
+      prod.Factors.Add(new CovarianceSEiso());
+      prod.Factors.Add(new CovariancePeriodic());
+      covarianceFunction.Terms.Add(prod);
+
+      {
+        var hyp = new double[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+        var model = new GaussianProcessModel(problemData.Dataset, targetVariable, allowedInputVariables, rows, hyp,
+                                             meanFunction,
+                                             covarianceFunction);
+        Assert.AreEqual(4.3170e+004, model.NegativeLogLikelihood, 1);
+
+        var dHyp = model.HyperparameterGradients;
+        Assert.AreEqual(-248.7932, dHyp[0], 1E-2);
+        var dHypCovExpected = new double[] { -0.5550e4, -5.5533e4, -0.2511e4, -2.7625e4, -1.3033e4, 0.0289e4, -2.7625e4 };
+        AssertEqual(dHypCovExpected, dHyp.Skip(1).Take(7).ToArray(), 1);
+        Assert.AreEqual(-2.0171e+003, dHyp.Last(), 1);
+
+
+        var predTrain = model.GetEstimatedValues(problemData.Dataset, new int[] { 0, 400 }).ToArray();
+        Assert.AreEqual(310.5930, predTrain[0], 1e-3);
+        Assert.AreEqual(347.9993, predTrain[1], 1e-3);
+
+        var predTrainVar = model.GetEstimatedVariance(problemData.Dataset, problemData.TrainingIndices).ToArray();
+      }
+
+      {
+        var hyp = new double[] { 0.029973094285941, 0.455535210579926, 3.438647883940457, 1.464114485889487, 3.001788584487478, 3.815289323309630, 4.374914122810222, 3.001788584487478, 0.716427415979145 };
+        var model = new GaussianProcessModel(problemData.Dataset, targetVariable, allowedInputVariables, rows, hyp,
+                                             meanFunction,
+                                             covarianceFunction);
+        Assert.AreEqual(872.8448, model.NegativeLogLikelihood, 1e-3);
+
+        var dHyp = model.HyperparameterGradients;
+        Assert.AreEqual(-0.0046, dHyp[0], 1e-3);
+        var dHypCovExpected = new double[] { 0.2652, -0.2386, 0.1706, -0.1744, 0.0000, 0.0000, -0.1744 };
+        AssertEqual(dHypCovExpected, dHyp.Skip(1).Take(7).ToArray(), 1e-3);
+        Assert.AreEqual(0.8621, dHyp.Last(), 1e-3);
+
+        var predTrain = model.GetEstimatedValues(problemData.Dataset, new int[] { 0, 400 }).ToArray();
+        Assert.AreEqual(315.3692, predTrain[0], 1e-3);
+        Assert.AreEqual(356.6076, predTrain[1], 1e-3);
+      }
+    }
+
+
+    private void AssertEqual(double[] expected, double[] actual, double delta = 1E-3) {
+      Assert.AreEqual(expected.Length, actual.Length);
+      for (int i = 0; i < expected.Length; i++)
+        Assert.AreEqual(expected[i], actual[i], delta);
+    }
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Tests/HeuristicLab.Algorithms.DataAnalysis-3.4/GaussianProcessRegressionTest.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Tests/HeuristicLab.Algorithms.DataAnalysis-3.4/GaussianProcessRegressionTest.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Tests/HeuristicLab.Algorithms.DataAnalysis-3.4/GaussianProcessRegressionTest.cs	(revision 8585)
@@ -0,0 +1,94 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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 System;
+using System.Linq;
+using System.Threading;
+using HeuristicLab.Algorithms.DataAnalysis;
+using HeuristicLab.Common;
+using HeuristicLab.Problems.DataAnalysis;
+using HeuristicLab.Problems.Instances.DataAnalysis;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Algorithms.DataAnalysis_34.Tests {
+  [TestClass]
+  [DeploymentItem(@"HeuristicLab.Algorithms.DataAnalysis-3.4/co2.txt")]
+  public class GaussianProcessRegressionTest {
+    public GaussianProcessRegressionTest() { }
+
+    private TestContext testContextInstance;
+
+    /// <summary>
+    ///Gets or sets the test context which provides
+    ///information about and functionality for the current test run.
+    ///</summary>
+    public TestContext TestContext {
+      get {
+        return testContextInstance;
+      }
+      set {
+        testContextInstance = value;
+      }
+    }
+
+    private EventWaitHandle trigger = new AutoResetEvent(false);
+    private Exception ex;
+
+    [TestMethod]
+    public void GaussianProcessRegressionPerformanceTest() {
+      ex = null;
+
+      var alg = new GaussianProcessRegression();
+      alg.Engine = new HeuristicLab.SequentialEngine.SequentialEngine();
+
+      alg.Problem = new RegressionProblem();
+      var provider = new RegressionCSVInstanceProvider();
+      var problemData = (RegressionProblemData)provider.ImportData("co2.txt");
+      problemData.TargetVariableParameter.ActualValue = problemData.TargetVariableParameter.ValidValues.First(x => x.Value == "interpolated");
+      problemData.InputVariables.SetItemCheckedState(problemData.InputVariables.First(x => x.Value == "year"), false);
+      problemData.InputVariables.SetItemCheckedState(problemData.InputVariables.First(x => x.Value == "month"), false);
+      problemData.InputVariables.SetItemCheckedState(problemData.InputVariables.First(x => x.Value == "average"), false);
+      problemData.InputVariables.SetItemCheckedState(problemData.InputVariables.First(x => x.Value == "interpolated"), false);
+      problemData.InputVariables.SetItemCheckedState(problemData.InputVariables.First(x => x.Value == "trend"), false);
+      problemData.InputVariables.SetItemCheckedState(problemData.InputVariables.First(x => x.Value == "#days"), false);
+
+      alg.Problem.ProblemDataParameter.Value = problemData;
+
+      alg.ExceptionOccurred += new EventHandler<EventArgs<Exception>>(cv_ExceptionOccurred);
+      alg.Stopped += new EventHandler(cv_Stopped);
+
+      alg.Prepare();
+      alg.Start();
+      trigger.WaitOne();
+      if (ex != null) throw ex;
+
+      TestContext.WriteLine("Runtime: {0}", alg.ExecutionTime.ToString());
+    }
+
+    private void cv_ExceptionOccurred(object sender, EventArgs<Exception> e) {
+      ex = e.Value;
+    }
+
+    private void cv_Stopped(object sender, EventArgs e) {
+      trigger.Set();
+    }
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Tests/HeuristicLab.Algorithms.DataAnalysis-3.4/co2.txt
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Tests/HeuristicLab.Algorithms.DataAnalysis-3.4/co2.txt	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Tests/HeuristicLab.Algorithms.DataAnalysis-3.4/co2.txt	(revision 8585)
@@ -0,0 +1,653 @@
+year, month, decimal date, average, interpolated, trend, #days
+1958, 3,1958.208,315.71,315.71,314.62,-1
+1958, 4,1958.292,317.45,317.45,315.29,-1
+1958, 5,1958.375,317.50,317.50,314.71,-1
+1958, 6,1958.458,-99.99,317.10,314.85,-1
+1958, 7,1958.542,315.86,315.86,314.98,-1
+1958, 8,1958.625,314.93,314.93,315.94,-1
+1958, 9,1958.708,313.20,313.20,315.91,-1
+1958,10,1958.792,-99.99,312.66,315.61,-1
+1958,11,1958.875,313.33,313.33,315.31,-1
+1958,12,1958.958,314.67,314.67,315.61,-1
+1959, 1,1959.042,315.62,315.62,315.70,-1
+1959, 2,1959.125,316.38,316.38,315.88,-1
+1959, 3,1959.208,316.71,316.71,315.62,-1
+1959, 4,1959.292,317.72,317.72,315.56,-1
+1959, 5,1959.375,318.29,318.29,315.50,-1
+1959, 6,1959.458,318.15,318.15,315.92,-1
+1959, 7,1959.542,316.54,316.54,315.66,-1
+1959, 8,1959.625,314.80,314.80,315.81,-1
+1959, 9,1959.708,313.84,313.84,316.55,-1
+1959,10,1959.792,313.26,313.26,316.19,-1
+1959,11,1959.875,314.80,314.80,316.78,-1
+1959,12,1959.958,315.58,315.58,316.52,-1
+1960, 1,1960.042,316.43,316.43,316.51,-1
+1960, 2,1960.125,316.97,316.97,316.47,-1
+1960, 3,1960.208,317.58,317.58,316.49,-1
+1960, 4,1960.292,319.02,319.02,316.86,-1
+1960, 5,1960.375,320.03,320.03,317.24,-1
+1960, 6,1960.458,319.59,319.59,317.36,-1
+1960, 7,1960.542,318.18,318.18,317.30,-1
+1960, 8,1960.625,315.91,315.91,316.92,-1
+1960, 9,1960.708,314.16,314.16,316.87,-1
+1960,10,1960.792,313.83,313.83,316.76,-1
+1960,11,1960.875,315.00,315.00,316.98,-1
+1960,12,1960.958,316.19,316.19,317.13,-1
+1961, 1,1961.042,316.93,316.93,317.03,-1
+1961, 2,1961.125,317.70,317.70,317.28,-1
+1961, 3,1961.208,318.54,318.54,317.47,-1
+1961, 4,1961.292,319.48,319.48,317.27,-1
+1961, 5,1961.375,320.58,320.58,317.70,-1
+1961, 6,1961.458,319.77,319.77,317.48,-1
+1961, 7,1961.542,318.57,318.57,317.70,-1
+1961, 8,1961.625,316.79,316.79,317.80,-1
+1961, 9,1961.708,314.80,314.80,317.49,-1
+1961,10,1961.792,315.38,315.38,318.35,-1
+1961,11,1961.875,316.10,316.10,318.13,-1
+1961,12,1961.958,317.01,317.01,317.94,-1
+1962, 1,1962.042,317.94,317.94,318.06,-1
+1962, 2,1962.125,318.56,318.56,318.11,-1
+1962, 3,1962.208,319.68,319.68,318.57,-1
+1962, 4,1962.292,320.63,320.63,318.45,-1
+1962, 5,1962.375,321.01,321.01,318.20,-1
+1962, 6,1962.458,320.55,320.55,318.27,-1
+1962, 7,1962.542,319.58,319.58,318.67,-1
+1962, 8,1962.625,317.40,317.40,318.48,-1
+1962, 9,1962.708,316.26,316.26,319.03,-1
+1962,10,1962.792,315.42,315.42,318.33,-1
+1962,11,1962.875,316.69,316.69,318.62,-1
+1962,12,1962.958,317.69,317.69,318.61,-1
+1963, 1,1963.042,318.74,318.74,318.91,-1
+1963, 2,1963.125,319.08,319.08,318.68,-1
+1963, 3,1963.208,319.86,319.86,318.69,-1
+1963, 4,1963.292,321.39,321.39,319.09,-1
+1963, 5,1963.375,322.25,322.25,319.39,-1
+1963, 6,1963.458,321.47,321.47,319.16,-1
+1963, 7,1963.542,319.74,319.74,318.77,-1
+1963, 8,1963.625,317.77,317.77,318.83,-1
+1963, 9,1963.708,316.21,316.21,319.06,-1
+1963,10,1963.792,315.99,315.99,319.00,-1
+1963,11,1963.875,317.12,317.12,319.10,-1
+1963,12,1963.958,318.31,318.31,319.25,-1
+1964, 1,1964.042,319.57,319.57,319.67,-1
+1964, 2,1964.125,-99.99,320.07,319.61,-1
+1964, 3,1964.208,-99.99,320.73,319.55,-1
+1964, 4,1964.292,-99.99,321.77,319.48,-1
+1964, 5,1964.375,322.25,322.25,319.42,-1
+1964, 6,1964.458,321.89,321.89,319.69,-1
+1964, 7,1964.542,320.44,320.44,319.58,-1
+1964, 8,1964.625,318.70,318.70,319.81,-1
+1964, 9,1964.708,316.70,316.70,319.56,-1
+1964,10,1964.792,316.79,316.79,319.78,-1
+1964,11,1964.875,317.79,317.79,319.72,-1
+1964,12,1964.958,318.71,318.71,319.59,-1
+1965, 1,1965.042,319.44,319.44,319.48,-1
+1965, 2,1965.125,320.44,320.44,319.97,-1
+1965, 3,1965.208,320.89,320.89,319.65,-1
+1965, 4,1965.292,322.13,322.13,319.80,-1
+1965, 5,1965.375,322.16,322.16,319.36,-1
+1965, 6,1965.458,321.87,321.87,319.65,-1
+1965, 7,1965.542,321.39,321.39,320.51,-1
+1965, 8,1965.625,318.81,318.81,319.93,-1
+1965, 9,1965.708,317.81,317.81,320.68,-1
+1965,10,1965.792,317.30,317.30,320.36,-1
+1965,11,1965.875,318.87,318.87,320.87,-1
+1965,12,1965.958,319.42,319.42,320.26,-1
+1966, 1,1966.042,320.62,320.62,320.63,-1
+1966, 2,1966.125,321.59,321.59,321.10,-1
+1966, 3,1966.208,322.39,322.39,321.16,-1
+1966, 4,1966.292,323.87,323.87,321.51,-1
+1966, 5,1966.375,324.01,324.01,321.18,-1
+1966, 6,1966.458,323.75,323.75,321.52,-1
+1966, 7,1966.542,322.39,322.39,321.49,-1
+1966, 8,1966.625,320.37,320.37,321.50,-1
+1966, 9,1966.708,318.64,318.64,321.54,-1
+1966,10,1966.792,318.10,318.10,321.18,-1
+1966,11,1966.875,319.79,319.79,321.84,-1
+1966,12,1966.958,321.08,321.08,321.95,-1
+1967, 1,1967.042,322.07,322.07,322.07,-1
+1967, 2,1967.125,322.50,322.50,321.94,-1
+1967, 3,1967.208,323.04,323.04,321.72,-1
+1967, 4,1967.292,324.42,324.42,322.05,-1
+1967, 5,1967.375,325.00,325.00,322.27,-1
+1967, 6,1967.458,324.09,324.09,321.94,-1
+1967, 7,1967.542,322.55,322.55,321.66,-1
+1967, 8,1967.625,320.92,320.92,322.04,-1
+1967, 9,1967.708,319.31,319.31,322.19,-1
+1967,10,1967.792,319.31,319.31,322.36,-1
+1967,11,1967.875,320.72,320.72,322.78,-1
+1967,12,1967.958,321.96,321.96,322.86,-1
+1968, 1,1968.042,322.57,322.57,322.55,-1
+1968, 2,1968.125,323.15,323.15,322.56,-1
+1968, 3,1968.208,323.89,323.89,322.59,-1
+1968, 4,1968.292,325.02,325.02,322.73,-1
+1968, 5,1968.375,325.57,325.57,322.87,-1
+1968, 6,1968.458,325.36,325.36,323.20,-1
+1968, 7,1968.542,324.14,324.14,323.25,-1
+1968, 8,1968.625,322.03,322.03,323.15,-1
+1968, 9,1968.708,320.41,320.41,323.31,-1
+1968,10,1968.792,320.25,320.25,323.32,-1
+1968,11,1968.875,321.31,321.31,323.32,-1
+1968,12,1968.958,322.84,322.84,323.69,-1
+1969, 1,1969.042,324.00,324.00,323.98,-1
+1969, 2,1969.125,324.42,324.42,323.89,-1
+1969, 3,1969.208,325.64,325.64,324.41,-1
+1969, 4,1969.292,326.66,326.66,324.35,-1
+1969, 5,1969.375,327.34,327.34,324.57,-1
+1969, 6,1969.458,326.76,326.76,324.63,-1
+1969, 7,1969.542,325.88,325.88,325.08,-1
+1969, 8,1969.625,323.67,323.67,324.80,-1
+1969, 9,1969.708,322.38,322.38,325.28,-1
+1969,10,1969.792,321.78,321.78,324.84,-1
+1969,11,1969.875,322.85,322.85,324.78,-1
+1969,12,1969.958,324.11,324.11,324.88,-1
+1970, 1,1970.042,325.03,325.03,325.04,-1
+1970, 2,1970.125,325.99,325.99,325.42,-1
+1970, 3,1970.208,326.87,326.87,325.69,-1
+1970, 4,1970.292,328.13,328.13,325.86,-1
+1970, 5,1970.375,328.07,328.07,325.27,-1
+1970, 6,1970.458,327.66,327.66,325.52,-1
+1970, 7,1970.542,326.35,326.35,325.51,-1
+1970, 8,1970.625,324.69,324.69,325.76,-1
+1970, 9,1970.708,323.10,323.10,325.93,-1
+1970,10,1970.792,323.16,323.16,326.15,-1
+1970,11,1970.875,323.98,323.98,325.96,-1
+1970,12,1970.958,325.13,325.13,326.06,-1
+1971, 1,1971.042,326.17,326.17,326.26,-1
+1971, 2,1971.125,326.68,326.68,326.09,-1
+1971, 3,1971.208,327.18,327.18,325.94,-1
+1971, 4,1971.292,327.78,327.78,325.47,-1
+1971, 5,1971.375,328.92,328.92,326.11,-1
+1971, 6,1971.458,328.57,328.57,326.41,-1
+1971, 7,1971.542,327.34,327.34,326.46,-1
+1971, 8,1971.625,325.46,325.46,326.49,-1
+1971, 9,1971.708,323.36,323.36,326.18,-1
+1971,10,1971.792,323.57,323.57,326.58,-1
+1971,11,1971.875,324.80,324.80,326.82,-1
+1971,12,1971.958,326.01,326.01,327.02,-1
+1972, 1,1972.042,326.77,326.77,326.86,-1
+1972, 2,1972.125,327.63,327.63,327.05,-1
+1972, 3,1972.208,327.75,327.75,326.52,-1
+1972, 4,1972.292,329.72,329.72,327.41,-1
+1972, 5,1972.375,330.07,330.07,327.21,-1
+1972, 6,1972.458,329.09,329.09,326.94,-1
+1972, 7,1972.542,328.05,328.05,327.24,-1
+1972, 8,1972.625,326.32,326.32,327.37,-1
+1972, 9,1972.708,324.93,324.93,327.73,-1
+1972,10,1972.792,325.06,325.06,328.05,-1
+1972,11,1972.875,326.50,326.50,328.51,-1
+1972,12,1972.958,327.55,327.55,328.56,-1
+1973, 1,1973.042,328.54,328.54,328.58,-1
+1973, 2,1973.125,329.56,329.56,328.87,-1
+1973, 3,1973.208,330.30,330.30,328.99,-1
+1973, 4,1973.292,331.50,331.50,329.12,-1
+1973, 5,1973.375,332.48,332.48,329.60,-1
+1973, 6,1973.458,332.07,332.07,329.96,-1
+1973, 7,1973.542,330.87,330.87,330.09,-1
+1973, 8,1973.625,329.31,329.31,330.43,-1
+1973, 9,1973.708,327.51,327.51,330.43,-1
+1973,10,1973.792,327.18,327.18,330.23,-1
+1973,11,1973.875,328.16,328.16,330.17,-1
+1973,12,1973.958,328.64,328.64,329.66,-1
+1974, 1,1974.042,329.35,329.35,329.44,-1
+1974, 2,1974.125,330.71,330.71,330.11,-1
+1974, 3,1974.208,331.48,331.48,330.19,-1
+1974, 4,1974.292,332.65,332.65,330.25,-1
+1974, 5,1974.375,333.19,333.19,330.25,15
+1974, 6,1974.458,332.12,332.12,329.93,27
+1974, 7,1974.542,330.99,330.99,330.20,31
+1974, 8,1974.625,329.17,329.17,330.31,31
+1974, 9,1974.708,327.41,327.41,330.35,29
+1974,10,1974.792,327.21,327.21,330.29,29
+1974,11,1974.875,328.34,328.34,330.33,29
+1974,12,1974.958,329.50,329.50,330.47,31
+1975, 1,1975.042,330.68,330.68,330.81,31
+1975, 2,1975.125,331.41,331.41,330.86,28
+1975, 3,1975.208,331.85,331.85,330.49,26
+1975, 4,1975.292,333.29,333.29,330.77,30
+1975, 5,1975.375,333.91,333.91,330.94,30
+1975, 6,1975.458,333.40,333.40,331.18,29
+1975, 7,1975.542,331.74,331.74,330.92,27
+1975, 8,1975.625,329.88,329.88,331.06,31
+1975, 9,1975.708,328.57,328.57,331.54,30
+1975,10,1975.792,328.36,328.36,331.46,17
+1975,11,1975.875,329.33,329.33,331.39,25
+1975,12,1975.958,-99.99,330.59,331.60, 1
+1976, 1,1976.042,331.66,331.66,331.82,25
+1976, 2,1976.125,332.75,332.75,332.19,29
+1976, 3,1976.208,333.46,333.46,331.99,29
+1976, 4,1976.292,334.78,334.78,332.24,25
+1976, 5,1976.375,334.78,334.78,331.86,31
+1976, 6,1976.458,334.06,334.06,331.74,25
+1976, 7,1976.542,332.95,332.95,332.06,21
+1976, 8,1976.625,330.64,330.64,331.87,31
+1976, 9,1976.708,328.96,328.96,331.94,28
+1976,10,1976.792,328.77,328.77,331.92,30
+1976,11,1976.875,330.18,330.18,332.33,26
+1976,12,1976.958,331.65,331.65,332.69,24
+1977, 1,1977.042,332.69,332.69,332.75,29
+1977, 2,1977.125,333.23,333.23,332.60,26
+1977, 3,1977.208,334.97,334.97,333.36,29
+1977, 4,1977.292,336.03,336.03,333.39,29
+1977, 5,1977.375,336.82,336.82,333.87,30
+1977, 6,1977.458,336.10,336.10,333.76,25
+1977, 7,1977.542,334.79,334.79,333.96,28
+1977, 8,1977.625,332.53,332.53,333.92,30
+1977, 9,1977.708,331.19,331.19,334.27,27
+1977,10,1977.792,331.21,331.21,334.43,30
+1977,11,1977.875,332.35,332.35,334.59,28
+1977,12,1977.958,333.47,333.47,334.48,31
+1978, 1,1978.042,335.10,335.10,335.11,26
+1978, 2,1978.125,335.26,335.26,334.58,28
+1978, 3,1978.208,336.61,336.61,334.95,30
+1978, 4,1978.292,337.77,337.77,335.11,28
+1978, 5,1978.375,338.01,338.01,335.05,30
+1978, 6,1978.458,337.98,337.98,335.60,27
+1978, 7,1978.542,336.48,336.48,335.68,31
+1978, 8,1978.625,334.37,334.37,335.88,31
+1978, 9,1978.708,332.33,332.33,335.49,24
+1978,10,1978.792,332.41,332.41,335.66,31
+1978,11,1978.875,333.76,333.76,336.01,28
+1978,12,1978.958,334.83,334.83,335.79,31
+1979, 1,1979.042,336.21,336.21,336.23,31
+1979, 2,1979.125,336.65,336.65,335.94,27
+1979, 3,1979.208,338.13,338.13,336.40,29
+1979, 4,1979.292,338.95,338.95,336.21,24
+1979, 5,1979.375,339.00,339.00,336.01,20
+1979, 6,1979.458,339.20,339.20,336.79,30
+1979, 7,1979.542,337.60,337.60,336.78,29
+1979, 8,1979.625,335.56,335.56,337.10,29
+1979, 9,1979.708,333.93,333.93,337.17,26
+1979,10,1979.792,334.12,334.12,337.44,28
+1979,11,1979.875,335.26,335.26,337.54,30
+1979,12,1979.958,336.78,336.78,337.76,24
+1980, 1,1980.042,337.80,337.80,337.95,30
+1980, 2,1980.125,338.28,338.28,337.73,28
+1980, 3,1980.208,340.04,340.04,338.43,31
+1980, 4,1980.292,340.86,340.86,338.20,30
+1980, 5,1980.375,341.47,341.47,338.45,31
+1980, 6,1980.458,341.26,341.26,338.79,30
+1980, 7,1980.542,339.34,339.34,338.48,26
+1980, 8,1980.625,337.45,337.45,338.92,24
+1980, 9,1980.708,336.10,336.10,339.27,26
+1980,10,1980.792,336.05,336.05,339.32,29
+1980,11,1980.875,337.21,337.21,339.38,27
+1980,12,1980.958,338.29,338.29,339.23,27
+1981, 1,1981.042,339.36,339.36,339.41,31
+1981, 2,1981.125,340.51,340.51,339.89,28
+1981, 3,1981.208,341.57,341.57,339.98,31
+1981, 4,1981.292,342.56,342.56,339.93,30
+1981, 5,1981.375,343.01,343.01,339.98,31
+1981, 6,1981.458,342.49,342.49,340.02,28
+1981, 7,1981.542,340.68,340.68,339.81,31
+1981, 8,1981.625,338.49,338.49,339.97,28
+1981, 9,1981.708,336.92,336.92,340.17,30
+1981,10,1981.792,337.12,337.12,340.44,31
+1981,11,1981.875,338.59,338.59,340.76,30
+1981,12,1981.958,339.90,339.90,340.81,28
+1982, 1,1982.042,340.92,340.92,341.03,30
+1982, 2,1982.125,341.69,341.69,341.05,27
+1982, 3,1982.208,342.85,342.85,341.21,21
+1982, 4,1982.292,343.92,343.92,341.30, 9
+1982, 5,1982.375,344.67,344.67,341.63,31
+1982, 6,1982.458,343.78,343.78,341.33,29
+1982, 7,1982.542,342.23,342.23,341.45,28
+1982, 8,1982.625,340.11,340.11,341.61,27
+1982, 9,1982.708,338.32,338.32,341.53,26
+1982,10,1982.792,338.39,338.39,341.72,30
+1982,11,1982.875,339.48,339.48,341.62,28
+1982,12,1982.958,340.88,340.88,341.77,31
+1983, 1,1983.042,341.64,341.64,341.79,31
+1983, 2,1983.125,342.87,342.87,342.30,27
+1983, 3,1983.208,343.59,343.59,342.04,30
+1983, 4,1983.292,345.25,345.25,342.63,26
+1983, 5,1983.375,345.96,345.96,342.80,29
+1983, 6,1983.458,345.52,345.52,343.03,25
+1983, 7,1983.542,344.15,344.15,343.41,30
+1983, 8,1983.625,342.25,342.25,343.72,28
+1983, 9,1983.708,340.17,340.17,343.34,27
+1983,10,1983.792,340.30,340.30,343.63,31
+1983,11,1983.875,341.53,341.53,343.66,29
+1983,12,1983.958,343.07,343.07,343.97,26
+1984, 1,1984.042,344.05,344.05,344.15,31
+1984, 2,1984.125,344.77,344.77,344.21,29
+1984, 3,1984.208,345.46,345.46,344.00,23
+1984, 4,1984.292,-99.99,346.77,344.17, 2
+1984, 5,1984.375,347.55,347.55,344.35,27
+1984, 6,1984.458,346.98,346.98,344.49,25
+1984, 7,1984.542,345.55,345.55,344.82,29
+1984, 8,1984.625,343.20,343.20,344.67,24
+1984, 9,1984.708,341.35,341.35,344.54,27
+1984,10,1984.792,341.68,341.68,344.99,28
+1984,11,1984.875,343.06,343.06,345.16,28
+1984,12,1984.958,344.54,344.54,345.42,28
+1985, 1,1985.042,345.25,345.25,345.35,29
+1985, 2,1985.125,346.06,346.06,345.51,26
+1985, 3,1985.208,347.66,347.66,346.27,28
+1985, 4,1985.292,348.20,348.20,345.64,27
+1985, 5,1985.375,348.92,348.92,345.75,31
+1985, 6,1985.458,348.40,348.40,345.94,30
+1985, 7,1985.542,346.66,346.66,345.86,28
+1985, 8,1985.625,344.85,344.85,346.22,27
+1985, 9,1985.708,343.20,343.20,346.32,27
+1985,10,1985.792,343.08,343.08,346.36,27
+1985,11,1985.875,344.40,344.40,346.53,29
+1985,12,1985.958,345.82,345.82,346.75,29
+1986, 1,1986.042,346.54,346.54,346.56,26
+1986, 2,1986.125,347.13,347.13,346.59,26
+1986, 3,1986.208,348.05,348.05,346.71,31
+1986, 4,1986.292,349.77,349.77,347.21,30
+1986, 5,1986.375,350.53,350.53,347.39,30
+1986, 6,1986.458,349.90,349.90,347.47,24
+1986, 7,1986.542,348.11,348.11,347.30,26
+1986, 8,1986.625,346.09,346.09,347.49,29
+1986, 9,1986.708,345.01,345.01,348.16,25
+1986,10,1986.792,344.47,344.47,347.71,30
+1986,11,1986.875,345.86,345.86,347.99,30
+1986,12,1986.958,347.15,347.15,348.06,30
+1987, 1,1987.042,348.38,348.38,348.31,30
+1987, 2,1987.125,348.70,348.70,348.01,28
+1987, 3,1987.208,349.72,349.72,348.31,27
+1987, 4,1987.292,351.32,351.32,348.77,30
+1987, 5,1987.375,352.14,352.14,349.03,31
+1987, 6,1987.458,351.61,351.61,349.23,29
+1987, 7,1987.542,349.91,349.91,349.20,28
+1987, 8,1987.625,347.84,347.84,349.34,27
+1987, 9,1987.708,346.52,346.52,349.71,29
+1987,10,1987.792,346.65,346.65,349.88,30
+1987,11,1987.875,347.95,347.95,350.07,27
+1987,12,1987.958,349.18,349.18,350.07,30
+1988, 1,1988.042,350.38,350.38,350.36,29
+1988, 2,1988.125,351.68,351.68,351.01,27
+1988, 3,1988.208,352.24,352.24,350.76,30
+1988, 4,1988.292,353.66,353.66,351.00,30
+1988, 5,1988.375,354.18,354.18,350.99,31
+1988, 6,1988.458,353.68,353.68,351.30,29
+1988, 7,1988.542,352.58,352.58,351.94,30
+1988, 8,1988.625,350.66,350.66,352.19,27
+1988, 9,1988.708,349.03,349.03,352.22,29
+1988,10,1988.792,349.08,349.08,352.34,31
+1988,11,1988.875,350.15,350.15,352.29,27
+1988,12,1988.958,351.44,351.44,352.36,30
+1989, 1,1989.042,352.89,352.89,352.83,31
+1989, 2,1989.125,353.24,353.24,352.55,28
+1989, 3,1989.208,353.80,353.80,352.36,30
+1989, 4,1989.292,355.59,355.59,352.93,30
+1989, 5,1989.375,355.89,355.89,352.65,31
+1989, 6,1989.458,355.30,355.30,352.88,30
+1989, 7,1989.542,353.98,353.98,353.33,31
+1989, 8,1989.625,351.53,351.53,353.11,29
+1989, 9,1989.708,350.02,350.02,353.27,28
+1989,10,1989.792,350.29,350.29,353.53,30
+1989,11,1989.875,351.44,351.44,353.60,30
+1989,12,1989.958,352.84,352.84,353.78,28
+1990, 1,1990.042,353.79,353.79,353.74,30
+1990, 2,1990.125,354.88,354.88,354.20,28
+1990, 3,1990.208,355.65,355.65,354.21,31
+1990, 4,1990.292,356.27,356.27,353.66,29
+1990, 5,1990.375,357.29,357.29,354.10,30
+1990, 6,1990.458,356.32,356.32,353.92,30
+1990, 7,1990.542,354.88,354.88,354.27,29
+1990, 8,1990.625,352.89,352.89,354.51,30
+1990, 9,1990.708,351.28,351.28,354.53,27
+1990,10,1990.792,351.59,351.59,354.81,31
+1990,11,1990.875,353.05,353.05,355.10,29
+1990,12,1990.958,354.27,354.27,355.12,30
+1991, 1,1991.042,354.87,354.87,354.85,29
+1991, 2,1991.125,355.68,355.68,355.01,28
+1991, 3,1991.208,357.06,357.06,355.57,27
+1991, 4,1991.292,358.51,358.51,355.88,30
+1991, 5,1991.375,359.09,359.09,355.94,31
+1991, 6,1991.458,358.10,358.10,355.75,30
+1991, 7,1991.542,356.12,356.12,355.51,29
+1991, 8,1991.625,353.89,353.89,355.50,31
+1991, 9,1991.708,352.30,352.30,355.58,30
+1991,10,1991.792,352.32,352.32,355.55,31
+1991,11,1991.875,353.79,353.79,355.78,30
+1991,12,1991.958,355.07,355.07,355.89,31
+1992, 1,1992.042,356.17,356.17,356.12,30
+1992, 2,1992.125,356.93,356.93,356.23,29
+1992, 3,1992.208,357.82,357.82,356.28,29
+1992, 4,1992.292,359.00,359.00,356.30,30
+1992, 5,1992.375,359.55,359.55,356.33,31
+1992, 6,1992.458,359.32,359.32,356.92,30
+1992, 7,1992.542,356.85,356.85,356.27,30
+1992, 8,1992.625,354.91,354.91,356.61,30
+1992, 9,1992.708,352.93,352.93,356.27,29
+1992,10,1992.792,353.31,353.31,356.57,30
+1992,11,1992.875,354.27,354.27,356.32,30
+1992,12,1992.958,355.53,355.53,356.37,31
+1993, 1,1993.042,356.86,356.86,356.83,28
+1993, 2,1993.125,357.27,357.27,356.43,28
+1993, 3,1993.208,358.36,358.36,356.70,31
+1993, 4,1993.292,359.27,359.27,356.60,30
+1993, 5,1993.375,360.19,360.19,357.00,31
+1993, 6,1993.458,359.52,359.52,357.09,30
+1993, 7,1993.542,357.42,357.42,356.83,27
+1993, 8,1993.625,355.46,355.46,357.14,28
+1993, 9,1993.708,354.10,354.10,357.45,26
+1993,10,1993.792,354.12,354.12,357.46,30
+1993,11,1993.875,355.40,355.40,357.53,30
+1993,12,1993.958,356.84,356.84,357.76,31
+1994, 1,1994.042,358.22,358.22,358.13,27
+1994, 2,1994.125,358.98,358.98,358.15,27
+1994, 3,1994.208,359.91,359.91,358.25,30
+1994, 4,1994.292,361.32,361.32,358.57,30
+1994, 5,1994.375,361.68,361.68,358.44,30
+1994, 6,1994.458,360.80,360.80,358.39,30
+1994, 7,1994.542,359.39,359.39,358.79,31
+1994, 8,1994.625,357.42,357.42,359.12,31
+1994, 9,1994.708,355.63,355.63,359.05,30
+1994,10,1994.792,356.09,356.09,359.50,31
+1994,11,1994.875,357.56,357.56,359.72,30
+1994,12,1994.958,358.87,358.87,359.75,31
+1995, 1,1995.042,359.87,359.87,359.76,31
+1995, 2,1995.125,360.79,360.79,359.98,28
+1995, 3,1995.208,361.77,361.77,360.19,30
+1995, 4,1995.292,363.23,363.23,360.56,30
+1995, 5,1995.375,363.77,363.77,360.61,29
+1995, 6,1995.458,363.22,363.22,360.82,30
+1995, 7,1995.542,361.70,361.70,361.03,31
+1995, 8,1995.625,359.11,359.11,360.74,30
+1995, 9,1995.708,358.11,358.11,361.48,30
+1995,10,1995.792,357.97,357.97,361.34,31
+1995,11,1995.875,359.40,359.40,361.54,30
+1995,12,1995.958,360.61,360.61,361.49,30
+1996, 1,1996.042,362.04,362.04,361.84,31
+1996, 2,1996.125,363.17,363.17,362.29,29
+1996, 3,1996.208,364.17,364.17,362.55,31
+1996, 4,1996.292,364.51,364.51,361.81,29
+1996, 5,1996.375,365.16,365.16,362.10,31
+1996, 6,1996.458,364.93,364.93,362.64,30
+1996, 7,1996.542,363.53,363.53,362.83,31
+1996, 8,1996.625,361.38,361.38,362.99,30
+1996, 9,1996.708,359.60,359.60,363.03,28
+1996,10,1996.792,359.54,359.54,362.91,31
+1996,11,1996.875,360.84,360.84,362.99,30
+1996,12,1996.958,362.18,362.18,363.05,31
+1997, 1,1997.042,363.04,363.04,362.85,31
+1997, 2,1997.125,364.09,364.09,363.28,28
+1997, 3,1997.208,364.47,364.47,362.86,31
+1997, 4,1997.292,366.25,366.25,363.59,29
+1997, 5,1997.375,366.69,366.69,363.76,30
+1997, 6,1997.458,365.59,365.59,363.39,28
+1997, 7,1997.542,364.34,364.34,363.63,26
+1997, 8,1997.625,362.20,362.20,363.78,27
+1997, 9,1997.708,360.31,360.31,363.69,29
+1997,10,1997.792,360.71,360.71,364.01,31
+1997,11,1997.875,362.44,362.44,364.51,29
+1997,12,1997.958,364.33,364.33,365.12,31
+1998, 1,1998.042,365.18,365.18,365.01,30
+1998, 2,1998.125,365.98,365.98,365.18,27
+1998, 3,1998.208,367.13,367.13,365.50,31
+1998, 4,1998.292,368.61,368.61,366.00,30
+1998, 5,1998.375,369.49,369.49,366.60,30
+1998, 6,1998.458,368.95,368.95,366.73,30
+1998, 7,1998.542,367.74,367.74,367.05,30
+1998, 8,1998.625,365.79,365.79,367.37,31
+1998, 9,1998.708,364.01,364.01,367.34,29
+1998,10,1998.792,364.35,364.35,367.63,31
+1998,11,1998.875,365.52,365.52,367.58,23
+1998,12,1998.958,367.08,367.08,367.85,26
+1999, 1,1999.042,368.12,368.12,367.92,27
+1999, 2,1999.125,368.98,368.98,368.18,23
+1999, 3,1999.208,369.60,369.60,368.00,25
+1999, 4,1999.292,370.96,370.96,368.44,30
+1999, 5,1999.375,370.77,370.77,367.95,30
+1999, 6,1999.458,370.33,370.33,368.14,30
+1999, 7,1999.542,369.28,369.28,368.60,30
+1999, 8,1999.625,366.86,366.86,368.42,30
+1999, 9,1999.708,364.94,364.94,368.24,28
+1999,10,1999.792,365.35,365.35,368.62,31
+1999,11,1999.875,366.68,366.68,368.68,29
+1999,12,1999.958,368.04,368.04,368.72,29
+2000, 1,2000.042,369.25,369.25,369.06,27
+2000, 2,2000.125,369.50,369.50,368.79,23
+2000, 3,2000.208,370.56,370.56,369.04,31
+2000, 4,2000.292,371.82,371.82,369.29,29
+2000, 5,2000.375,371.51,371.51,368.64,29
+2000, 6,2000.458,371.71,371.71,369.49,29
+2000, 7,2000.542,369.85,369.85,369.18,28
+2000, 8,2000.625,368.20,368.20,369.78,28
+2000, 9,2000.708,366.91,366.91,370.19,30
+2000,10,2000.792,366.99,366.99,370.22,31
+2000,11,2000.875,368.33,368.33,370.29,25
+2000,12,2000.958,369.67,369.67,370.31,30
+2001, 1,2001.042,370.52,370.52,370.36,29
+2001, 2,2001.125,371.49,371.49,370.77,28
+2001, 3,2001.208,372.53,372.53,370.97,29
+2001, 4,2001.292,373.37,373.37,370.79,30
+2001, 5,2001.375,373.82,373.82,370.92,25
+2001, 6,2001.458,373.18,373.18,370.97,28
+2001, 7,2001.542,371.57,371.57,370.94,30
+2001, 8,2001.625,369.63,369.63,371.21,30
+2001, 9,2001.708,368.16,368.16,371.41,30
+2001,10,2001.792,368.42,368.42,371.65,31
+2001,11,2001.875,369.69,369.69,371.70,27
+2001,12,2001.958,371.18,371.18,371.89,31
+2002, 1,2002.042,372.45,372.45,372.23,29
+2002, 2,2002.125,373.14,373.14,372.26,27
+2002, 3,2002.208,373.93,373.93,372.22,27
+2002, 4,2002.292,375.00,375.00,372.33,30
+2002, 5,2002.375,375.65,375.65,372.74,31
+2002, 6,2002.458,375.50,375.50,373.29,30
+2002, 7,2002.542,374.00,374.00,373.36,31
+2002, 8,2002.625,371.83,371.83,373.47,31
+2002, 9,2002.708,370.66,370.66,374.01,29
+2002,10,2002.792,370.51,370.51,373.85,31
+2002,11,2002.875,372.20,372.20,374.33,30
+2002,12,2002.958,373.71,373.71,374.50,30
+2003, 1,2003.042,374.87,374.87,374.63,31
+2003, 2,2003.125,375.62,375.62,374.75,27
+2003, 3,2003.208,376.48,376.48,374.79,31
+2003, 4,2003.292,377.74,377.74,375.02,27
+2003, 5,2003.375,378.50,378.50,375.47,31
+2003, 6,2003.458,378.18,378.18,375.95,29
+2003, 7,2003.542,376.72,376.72,376.16,28
+2003, 8,2003.625,374.31,374.31,375.98,26
+2003, 9,2003.708,373.20,373.20,376.51,28
+2003,10,2003.792,373.10,373.10,376.45,30
+2003,11,2003.875,374.64,374.64,376.83,25
+2003,12,2003.958,375.93,375.93,376.74,30
+2004, 1,2004.042,377.00,377.00,376.79,31
+2004, 2,2004.125,377.87,377.87,377.01,27
+2004, 3,2004.208,378.73,378.73,377.06,30
+2004, 4,2004.292,380.41,380.41,377.65,29
+2004, 5,2004.375,380.63,380.63,377.51,28
+2004, 6,2004.458,379.56,379.56,377.28,26
+2004, 7,2004.542,377.61,377.61,377.03,28
+2004, 8,2004.625,376.15,376.15,377.85,19
+2004, 9,2004.708,374.11,374.11,377.49,16
+2004,10,2004.792,374.44,374.44,377.80,31
+2004,11,2004.875,375.93,375.93,378.13,27
+2004,12,2004.958,377.45,377.45,378.30,31
+2005, 1,2005.042,378.47,378.47,378.21,31
+2005, 2,2005.125,379.76,379.76,378.95,27
+2005, 3,2005.208,381.14,381.14,379.63,27
+2005, 4,2005.292,382.20,382.20,379.54,30
+2005, 5,2005.375,382.47,382.47,379.33,31
+2005, 6,2005.458,382.20,382.20,379.87,30
+2005, 7,2005.542,380.78,380.78,380.17,30
+2005, 8,2005.625,378.73,378.73,380.38,30
+2005, 9,2005.708,376.66,376.66,379.98,30
+2005,10,2005.792,376.98,376.98,380.29,14
+2005,11,2005.875,378.29,378.29,380.47,24
+2005,12,2005.958,379.92,379.92,380.75,29
+2006, 1,2006.042,381.35,381.35,381.11,26
+2006, 2,2006.125,382.16,382.16,381.35,25
+2006, 3,2006.208,382.66,382.66,381.11,30
+2006, 4,2006.292,384.73,384.73,382.01,27
+2006, 5,2006.375,384.98,384.98,381.83,29
+2006, 6,2006.458,384.09,384.09,381.78,29
+2006, 7,2006.542,382.38,382.38,381.81,27
+2006, 8,2006.625,380.45,380.45,382.10,28
+2006, 9,2006.708,378.92,378.92,382.22,29
+2006,10,2006.792,379.16,379.16,382.48,25
+2006,11,2006.875,380.18,380.18,382.38,30
+2006,12,2006.958,381.79,381.79,382.65,31
+2007, 1,2007.042,382.93,382.93,382.75,23
+2007, 2,2007.125,383.81,383.81,382.96,21
+2007, 3,2007.208,384.56,384.56,382.92,31
+2007, 4,2007.292,386.40,386.40,383.58,28
+2007, 5,2007.375,386.58,386.58,383.35,31
+2007, 6,2007.458,386.05,386.05,383.77,30
+2007, 7,2007.542,384.49,384.49,383.98,31
+2007, 8,2007.625,382.00,382.00,383.70,30
+2007, 9,2007.708,380.90,380.90,384.25,25
+2007,10,2007.792,381.14,381.14,384.47,30
+2007,11,2007.875,382.42,382.42,384.64,30
+2007,12,2007.958,383.89,383.89,384.81,28
+2008, 1,2008.042,385.44,385.44,385.26,31
+2008, 2,2008.125,385.73,385.73,384.92,28
+2008, 3,2008.208,385.97,385.97,384.41,30
+2008, 4,2008.292,387.16,387.16,384.50,28
+2008, 5,2008.375,388.50,388.50,385.39,26
+2008, 6,2008.458,387.88,387.88,385.56,24
+2008, 7,2008.542,386.42,386.42,385.86,10
+2008, 8,2008.625,384.15,384.15,385.83,28
+2008, 9,2008.708,383.09,383.09,386.34,30
+2008,10,2008.792,382.99,382.99,386.24,24
+2008,11,2008.875,384.13,384.13,386.31,29
+2008,12,2008.958,385.56,385.56,386.43,30
+2009, 1,2009.042,386.93,386.93,386.69,31
+2009, 2,2009.125,387.42,387.42,386.56,28
+2009, 3,2009.208,388.77,388.77,387.19,30
+2009, 4,2009.292,389.46,389.46,386.73,28
+2009, 5,2009.375,390.19,390.19,387.00,31
+2009, 6,2009.458,389.44,389.44,387.15,29
+2009, 7,2009.542,387.91,387.91,387.39,29
+2009, 8,2009.625,385.92,385.92,387.61,30
+2009, 9,2009.708,384.79,384.79,388.10,27
+2009,10,2009.792,384.39,384.39,387.70,31
+2009,11,2009.875,386.00,386.00,388.22,30
+2009,12,2009.958,387.27,387.27,388.15,21
+2010, 1,2010.042,388.45,388.45,388.21,28
+2010, 2,2010.125,389.82,389.82,388.96,24
+2010, 3,2010.208,391.08,391.08,389.50,28
+2010, 4,2010.292,392.46,392.46,389.72,28
+2010, 5,2010.375,392.95,392.95,389.76,30
+2010, 6,2010.458,392.03,392.03,389.75,29
+2010, 7,2010.542,390.13,390.13,389.61,30
+2010, 8,2010.625,388.15,388.15,389.84,31
+2010, 9,2010.708,386.80,386.80,390.11,30
+2010,10,2010.792,387.18,387.18,390.49,31
+2010,11,2010.875,388.59,388.59,390.80,29
+2010,12,2010.958,389.68,389.68,390.56,31
+2011, 1,2011.042,391.19,391.19,390.95,29
+2011, 2,2011.125,391.76,391.76,390.90,28
+2011, 3,2011.208,392.40,392.40,390.83,30
+2011, 4,2011.292,393.28,393.28,390.55,28
+2011, 5,2011.375,394.16,394.16,390.97,31
+2011, 6,2011.458,393.68,393.68,391.39,28
+2011, 7,2011.542,392.39,392.39,391.87,31
+2011, 8,2011.625,390.08,390.08,391.77,29
+2011, 9,2011.708,389.00,389.00,392.31,28
+2011,10,2011.792,388.92,388.92,392.23,31
+2011,11,2011.875,390.20,390.20,392.41,29
+2011,12,2011.958,391.80,391.80,392.68,31
+2012, 1,2012.042,393.10,393.10,392.86,30
+2012, 2,2012.125,393.65,393.65,392.79,26
+2012, 3,2012.208,394.44,394.44,392.87,31
+2012, 4,2012.292,396.19,396.19,393.45,30
+2012, 5,2012.375,396.77,396.77,393.58,31
+2012, 6,2012.458,395.77,395.77,393.48,29
Index: /branches/HeuristicLab.Mono/HeuristicLab.Tests/HeuristicLab.PluginInfraStructure-3.3/TypeDiscoveryTest.cs
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Tests/HeuristicLab.PluginInfraStructure-3.3/TypeDiscoveryTest.cs	(revision 8585)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Tests/HeuristicLab.PluginInfraStructure-3.3/TypeDiscoveryTest.cs	(revision 8585)
@@ -0,0 +1,79 @@
+﻿using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Problems.DataAnalysis;
+using HeuristicLab_33.Tests;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.PluginInfraStructure.Tests {
+  /// <summary>
+  /// Summary description for TypeDiscoveryTest
+  /// </summary>
+  [TestClass]
+  public class TypeDiscoveryTest {
+    public TypeDiscoveryTest() { }
+
+    private TestContext testContextInstance;
+
+    /// <summary>
+    ///Gets or sets the test context which provides
+    ///information about and functionality for the current test run.
+    ///</summary>
+    public TestContext TestContext {
+      get { return testContextInstance; }
+      set { testContextInstance = value; }
+    }
+
+    public static void MyClassInitialize(TestContext testContext) {
+      PluginLoader.Assemblies.Any();
+    }
+
+    [TestMethod]
+    public void IsSubTypeOfTest() {
+      Assert.IsTrue(typeof(int).IsSubTypeOf(typeof(object)));
+      Assert.IsTrue(typeof(IntValue).IsSubTypeOf(typeof(IItem)));
+      Assert.IsTrue(typeof(List<int>).IsSubTypeOf(typeof(object)));
+
+      Assert.IsTrue(typeof(List<int>).IsSubTypeOf(typeof(IList)));
+      Assert.IsTrue(typeof(List<>).IsSubTypeOf(typeof(IList)));
+      Assert.IsFalse(typeof(NamedItemCollection<>).IsSubTypeOf(typeof(ICollection<IItem>)));
+      Assert.IsFalse(typeof(NamedItemCollection<>).IsSubTypeOf(typeof(ICollection<NamedItem>)));
+
+
+      Assert.IsTrue(typeof(List<IItem>).IsSubTypeOf(typeof(IList<IItem>)));
+      Assert.IsFalse(typeof(IList<IntValue>).IsSubTypeOf(typeof(IList<IItem>)));
+      Assert.IsTrue(typeof(List<IItem>).IsSubTypeOf(typeof(IList<IItem>)));
+      Assert.IsFalse(typeof(ItemList<>).IsSubTypeOf(typeof(IList<IItem>)));
+      Assert.IsFalse(typeof(ItemList<>).IsSubTypeOf(typeof(List<IItem>)));
+
+      Assert.IsFalse(typeof(List<int>).IsSubTypeOf(typeof(List<>)));
+      Assert.IsTrue(typeof(List<>).IsSubTypeOf(typeof(IList<>)));
+      Assert.IsTrue(typeof(ItemList<>).IsSubTypeOf(typeof(IList<>)));
+      Assert.IsTrue(typeof(NamedItemCollection<>).IsSubTypeOf(typeof(IItemCollection<>)));
+      Assert.IsFalse(typeof(List<IntValue>).IsSubTypeOf(typeof(IList<>)));
+    }
+
+    [TestMethod]
+    public void BuildTypeTest() {
+      Assert.AreEqual(typeof(List<>).BuildType(typeof(List<>)), typeof(List<>));
+      Assert.AreEqual(typeof(List<int>).BuildType(typeof(List<>)), typeof(List<int>));
+      Assert.AreEqual(typeof(List<>).BuildType(typeof(List<int>)), typeof(List<int>));
+
+      Assert.AreEqual(typeof(ICollection<>).BuildType(typeof(List<>)), typeof(ICollection<>));
+      Assert.AreEqual(typeof(ICollection<int>).BuildType(typeof(List<>)), typeof(ICollection<int>));
+      Assert.AreEqual(typeof(ICollection<>).BuildType(typeof(List<int>)), typeof(ICollection<int>));
+
+      Assert.AreEqual(typeof(ItemCollection<>).BuildType(typeof(ICollection<int>)), null);
+      Assert.AreEqual(typeof(ItemCollection<>).BuildType(typeof(Dictionary<IItem, IItem>)), null);
+      Assert.AreEqual(typeof(ItemCollection<>).BuildType(typeof(ICollection<IItem>)), typeof(ItemCollection<IItem>));
+
+      Assert.AreEqual(typeof(FixedValueParameter<>).BuildType(typeof(ItemCollection<DataAnalysisProblemData>)), null);
+      Assert.AreEqual(typeof(IFixedValueParameter<>).BuildType(typeof(ItemCollection<DoubleValue>)), typeof(IFixedValueParameter<DoubleValue>));
+      Assert.AreEqual(typeof(IFixedValueParameter<>).BuildType(typeof(ItemCollection<IItem>)), typeof(IFixedValueParameter<IItem>));
+    }
+  }
+}
Index: /branches/HeuristicLab.Mono/HeuristicLab.Tests/HeuristicLab.Tests.csproj
===================================================================
--- /branches/HeuristicLab.Mono/HeuristicLab.Tests/HeuristicLab.Tests.csproj	(revision 8584)
+++ /branches/HeuristicLab.Mono/HeuristicLab.Tests/HeuristicLab.Tests.csproj	(revision 8585)
@@ -102,6 +102,6 @@
   </PropertyGroup>
   <ItemGroup>
-    <Reference Include="ALGLIB-3.5.0, Version=3.5.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
-      <HintPath>..\bin\ALGLIB-3.5.0.dll</HintPath>
+    <Reference Include="ALGLIB-3.6.0, Version=3.6.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <HintPath>..\bin\ALGLIB-3.6.0.dll</HintPath>
     </Reference>
     <Reference Include="HeuristicLab.Algorithms.DataAnalysis-3.4, Version=3.4.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
@@ -279,5 +279,4 @@
     <Compile Include="HeuristicLab-3.3\ContentViewTests.cs" />
     <Compile Include="HeuristicLab-3.3\ParameterVisibilityTest.cs" />
-    <Compile Include="HeuristicLab-3.3\GaussianProcessRegressionTest.cs" />
     <Compile Include="HeuristicLab-3.3\DeepCloneableCloningTest.cs" />
     <Compile Include="HeuristicLab-3.3\GeneticAlgorithmTest.cs" />
@@ -290,5 +289,7 @@
     <Compile Include="HeuristicLab-3.3\ThreadSafeLogTest.cs" />
     <Compile Include="HeuristicLab-3.3\ToStringTest.cs" />
+    <Compile Include="HeuristicLab.Algorithms.DataAnalysis-3.4\GaussianProcessModelTest.cs" />
     <Compile Include="HeuristicLab.Algorithms.DataAnalysis-3.4\GaussianProcessFunctionsTest.cs" />
+    <Compile Include="HeuristicLab.Algorithms.DataAnalysis-3.4\GaussianProcessRegressionTest.cs" />
     <Compile Include="HeuristicLab.Analysis-3.3\MultidimensionalScalingTest.cs" />
     <Compile Include="HeuristicLab.Encodings.BinaryVectorEncoding-3.3\Auxiliary.cs" />
@@ -354,4 +355,5 @@
     <Compile Include="HeuristicLab.Persistence-3.3\UseCases.cs" />
     <Compile Include="HeuristicLab.PluginInfraStructure-3.3\InstallationManagerTest.cs" />
+    <Compile Include="HeuristicLab.PluginInfraStructure-3.3\TypeDiscoveryTest.cs" />
     <Compile Include="HeuristicLab.Problems.DataAnalysis-3.4\OnlineCalculatorPerformanceTest.cs" />
     <Compile Include="HeuristicLab.Problems.DataAnalysis-3.4\StatisticCalculatorsTest.cs" />
@@ -388,4 +390,7 @@
   </ItemGroup>
   <ItemGroup>
+    <Content Include="HeuristicLab.Algorithms.DataAnalysis-3.4\co2.txt">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
     <None Include="app.config" />
     <None Include="Builder.testsettings">
