From b4bd3c142896795ae4620d209bfa90e255db0863 Mon Sep 17 00:00:00 2001
From: Michael Krisper <michael.krisper@tugraz.at>
Date: Wed, 5 Jul 2017 15:24:50 +0200
Subject: [PATCH] Updated SearchAlgorithm to try both direction for interpolate
 search

---
 VectoCore/VectoCore/Configuration/Constants.cs         |  2 +-
 VectoCore/VectoCore/Utils/SearchAlgorithm.cs           | 10 ++++++++--
 .../VectoCoreTest/Integration/TorqueLimitsTest.cs      |  2 +-
 3 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/VectoCore/VectoCore/Configuration/Constants.cs b/VectoCore/VectoCore/Configuration/Constants.cs
index d88a0b9497..306c57e0fc 100644
--- a/VectoCore/VectoCore/Configuration/Constants.cs
+++ b/VectoCore/VectoCore/Configuration/Constants.cs
@@ -146,7 +146,7 @@ namespace TUGraz.VectoCore.Configuration
 			/// The initial search interval for the operating point search in the driver.
 			/// </summary>
 			public static readonly MeterPerSquareSecond OperatingPointInitialSearchIntervalAccelerating =
-				-0.1.SI<MeterPerSquareSecond>();
+				0.1.SI<MeterPerSquareSecond>();
 
 			public static readonly PerSecond EngineIdlingSearchInterval = 10.SI<PerSecond>();
 
diff --git a/VectoCore/VectoCore/Utils/SearchAlgorithm.cs b/VectoCore/VectoCore/Utils/SearchAlgorithm.cs
index 5b001a4078..2316cded98 100644
--- a/VectoCore/VectoCore/Utils/SearchAlgorithm.cs
+++ b/VectoCore/VectoCore/Utils/SearchAlgorithm.cs
@@ -97,8 +97,14 @@ namespace TUGraz.VectoCore.Utils
 					ref iterationCount);
 			} catch (VectoException ex) {
 				var log = LogManager.GetLogger(typeof(SearchAlgorithm).FullName);
-				log.Debug("Falling back to LineSearch. InterpolationSearch failed: " + ex.Message);
-				result = LineSearch(x, y, interval, getYValue, evaluateFunction, criterion, abortCriterion, ref iterationCount);
+				log.Debug("Falling back to InterpolationSearch in reverse. Normal InterpolationSearch failed: " + ex.Message);
+				try {
+					result = InterpolateSearch(x, y, -interval, getYValue, evaluateFunction, criterion, abortCriterion,
+						ref iterationCount);
+				} catch (VectoException ex1) {
+					log.Debug("Falling back to LineSearch. Reverse InterpolationSearch failed: " + ex1.Message);
+					result = LineSearch(x, y, interval, getYValue, evaluateFunction, criterion, abortCriterion, ref iterationCount);
+				}
 			}
 			return result;
 		}
diff --git a/VectoCore/VectoCoreTest/Integration/TorqueLimitsTest.cs b/VectoCore/VectoCoreTest/Integration/TorqueLimitsTest.cs
index b48ca55f24..f4aa1ca18e 100644
--- a/VectoCore/VectoCoreTest/Integration/TorqueLimitsTest.cs
+++ b/VectoCore/VectoCoreTest/Integration/TorqueLimitsTest.cs
@@ -194,7 +194,7 @@ namespace TUGraz.VectoCore.Tests.Integration
 			Assert.IsTrue(jobContainer.Runs.All(r => r.Success), string.Concat(jobContainer.Runs.Select(r => r.ExecException)));
 		}
 
-		[TestCase(GearboxSpeedLimitJobDecl)]
+		[TestCategory("LongRunning"), TestCase(GearboxSpeedLimitJobDecl)]
 		public void TestRunGbxSpeedLimitedSimulations(string file)
 		{
 			var fileWriter = new FileOutputWriter(file);
-- 
GitLab