Index: /stable/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/src/instruction.h
===================================================================
--- /stable/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/src/instruction.h	(revision 17100)
+++ /stable/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/src/instruction.h	(revision 17101)
@@ -9,23 +9,24 @@
 {
     // same values as in OpCodes.cs
-    Add = 1,
-    Sub = 2,
-    Mul = 3,
-    Div = 4,
-    Sin = 5,
-    Cos = 6,
-    Tan = 7,
-    Log = 8,
-    Exp = 9,
-    Var = 18,
-    Const = 20,
-    Power = 22,
-    Root = 23,
-    Square = 28,
-    Sqrt = 29,
-    Absolute = 48,
+    Add                = 1,
+    Sub                = 2,
+    Mul                = 3,
+    Div                = 4,
+    Sin                = 5,
+    Cos                = 6,
+    Tan                = 7,
+    Log                = 8,
+    Exp                = 9,
+    Var                = 18,
+    Const              = 20,
+    Power              = 22,
+    Root               = 23,
+    Square             = 28,
+    Sqrt               = 29,
+    Absolute           = 48,
     AnalyticalQuotient = 49,
-    Cube = 50,
-    CubeRoot = 51
+    Cube               = 50,
+    CubeRoot           = 51,
+    Tanh               = 52
 };
 
Index: /stable/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/src/interpreter.h
===================================================================
--- /stable/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/src/interpreter.h	(revision 17100)
+++ /stable/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/src/interpreter.h	(revision 17101)
@@ -64,25 +64,30 @@
             case OpCodes::Exp:
                 {
-                    in.value = std::exp(code[in.childIndex].value);
+                    in.value = hl_exp(code[in.childIndex].value);
                     break;
                 }
             case OpCodes::Log:
                 {
-                    in.value = std::log(code[in.childIndex].value);
+                    in.value = hl_log(code[in.childIndex].value);
                     break;
                 }
             case OpCodes::Sin:
                 {
-                    in.value = std::sin(code[in.childIndex].value);
+                    in.value = hl_sin(code[in.childIndex].value);
                     break;
                 }
             case OpCodes::Cos:
                 {
-                    in.value = std::cos(code[in.childIndex].value);
+                    in.value = hl_cos(code[in.childIndex].value);
                     break;
                 }
             case OpCodes::Tan:
                 {
-                    in.value = std::tan(code[in.childIndex].value);
+                    in.value = hl_tan(code[in.childIndex].value);
+                    break;
+                }
+            case OpCodes::Tanh:
+                {
+                    in.value = hl_tanh(code[in.childIndex].value);
                     break;
                 }
@@ -90,6 +95,6 @@
                 {
                     double x = code[in.childIndex].value;
-                    double y = std::round(code[in.childIndex + 1].value);
-                    in.value = std::pow(x, y);
+                    double y = hl_round(code[in.childIndex + 1].value);
+                    in.value = hl_pow(x, y);
                     break;
                 }
@@ -97,26 +102,26 @@
                 {
                     double x = code[in.childIndex].value;
-                    double y = std::round(code[in.childIndex + 1].value);
-                    in.value = std::pow(x, 1 / y);
+                    double y = hl_round(code[in.childIndex + 1].value);
+                    in.value = hl_pow(x, 1 / y);
                     break;
                 }
             case OpCodes::Sqrt:
                 {
-                    in.value = std::pow(code[in.childIndex].value, 1./2.);
+                    in.value = hl_pow(code[in.childIndex].value, 1./2.);
                     break;
                 }
             case OpCodes::Square:
                 {
-                    in.value = std::pow(code[in.childIndex].value, 2.);
+                    in.value = hl_pow(code[in.childIndex].value, 2.);
                     break;
                 }
             case OpCodes::CubeRoot:
                 {
-                    in.value = std::pow(code[in.childIndex].value, 1./3.);
+                    in.value = hl_pow(code[in.childIndex].value, 1./3.);
                     break;
                 }
             case OpCodes::Cube:
                 {
-                    in.value = std::pow(code[in.childIndex].value, 3.);
+                    in.value = hl_pow(code[in.childIndex].value, 3.);
                     break;
                 }
@@ -130,5 +135,5 @@
                     double x = code[in.childIndex].value;
                     double y = code[in.childIndex + 1].value;
-                    in.value = x / std::sqrt(1 + y*y);
+                    in.value = x / hl_sqrt(1 + y*y);
                     break;
                 }
@@ -228,4 +233,9 @@
                     break;
                 }
+            case OpCodes::Tanh:
+                {
+                    tanh(in.buf, code[in.childIndex].buf);
+                    break;
+                }
             case OpCodes::Log:
                 {
Index: /stable/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/src/vector_operations.h
===================================================================
--- /stable/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/src/vector_operations.h	(revision 17100)
+++ /stable/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/src/vector_operations.h	(revision 17101)
@@ -14,7 +14,9 @@
 #define hl_cos vdt::fast_cos
 #define hl_tan vdt::fast_tan
+#define hl_tanh vdt::fast_tanh
 #define hl_sqrt vdt::fast_sqrt
 #define hl_pow vdt::fast_pow
 #define hl_round vdt::fast_round
+#define hl_inv vdt::fast_inv
 #else
 #define hl_exp std::exp
@@ -23,7 +25,10 @@
 #define hl_cos std::cos
 #define hl_tan std::tan
+#define hl_tanh std::tanh
 #define hl_sqrt std::sqrt
 #define hl_pow std::pow
 #define hl_round std::round
+#define hl_inv(x) 1. / x;
+
 #endif
 
@@ -47,9 +52,10 @@
 inline void cos(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = hl_cos(b[i]); }
 inline void tan(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = hl_tan(b[i]); }
+inline void tanh(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = hl_tanh(b[i]); }
 inline void sqrt(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = hl_sqrt(b[i]); }
 inline void pow(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = hl_pow(a[i], hl_round(b[i])); };
 inline void root(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = hl_pow(a[i], 1. / hl_round(b[i])); };
 inline void square(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = hl_pow(b[i], 2.); };
-inline void inv(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = 1. / b[i]; }
+inline void inv(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = hl_inv(b[i]); }
 inline void neg(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = -b[i]; }
 inline void abs(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = std::fabs(b[i]); }
@@ -66,9 +72,11 @@
 // vector operations
 inline void neg(double* __restrict a) noexcept { FOR(i) a[i] = -a[i]; }
-inline void inv(double* __restrict a) noexcept { FOR(i) a[i] = 1. / a[i]; }
+inline void inv(double* __restrict a) noexcept { FOR(i) a[i] = hl_inv(a[i]); }
 inline void exp(double* __restrict a) noexcept { FOR(i) a[i] = hl_exp(a[i]); }
 inline void log(double* __restrict a) noexcept { FOR(i) a[i] = hl_log(a[i]); }
 inline void sin(double* __restrict a) noexcept { FOR(i) a[i] = hl_sin(a[i]); }
 inline void cos(double* __restrict a) noexcept { FOR(i) a[i] = hl_cos(a[i]); }
+inline void tan(double* __restrict a) noexcept { FOR(i) a[i] = hl_tan(a[i]); }
+inline void tanh(double* __restrict a) noexcept { FOR(i) a[i] = hl_tanh(a[i]); }
 inline void round(double* __restrict a) noexcept { FOR(i) a[i] = hl_round(a[i]); }
 inline void square(double* __restrict a) noexcept { FOR(i) a[i] = hl_pow(a[i], 2.); }
Index: /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Converters/TreeToAutoDiffTermConverter.cs
===================================================================
--- /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Converters/TreeToAutoDiffTermConverter.cs	(revision 17100)
+++ /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Converters/TreeToAutoDiffTermConverter.cs	(revision 17101)
@@ -76,5 +76,7 @@
       eval: Math.Tan,
       diff: x => 1 + Math.Tan(x) * Math.Tan(x));
-
+    private static readonly Func<Term, UnaryFunc> tanh = UnaryFunc.Factory(
+      eval: Math.Tanh,
+      diff: x => 1 - Math.Tanh(x) * Math.Tanh(x));
     private static readonly Func<Term, UnaryFunc> erf = UnaryFunc.Factory(
       eval: alglib.errorfunction,
@@ -261,4 +263,8 @@
       if (node.Symbol is Tangent) {
         return tan(
+          ConvertToAutoDiff(node.GetSubtree(0)));
+      }
+      if (node.Symbol is HyperbolicTangent) {
+        return tanh(
           ConvertToAutoDiff(node.GetSubtree(0)));
       }
@@ -321,4 +327,5 @@
           !(n.Symbol is Cosine) &&
           !(n.Symbol is Tangent) &&
+          !(n.Symbol is HyperbolicTangent) &&
           !(n.Symbol is Erf) &&
           !(n.Symbol is Norm) &&
Index: /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Formatters/SymbolicDataAnalysisExpressionCSharpFormatter.cs
===================================================================
--- /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Formatters/SymbolicDataAnalysisExpressionCSharpFormatter.cs	(revision 17100)
+++ /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Formatters/SymbolicDataAnalysisExpressionCSharpFormatter.cs	(revision 17101)
@@ -26,8 +26,8 @@
 using System.Text;
 using System.Text.RegularExpressions;
+using HEAL.Attic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
-using HEAL.Attic;
 
 namespace HeuristicLab.Problems.DataAnalysis.Symbolic {
@@ -56,5 +56,5 @@
     }
 
-    private string VariableName2Identifier(string name) {     
+    private string VariableName2Identifier(string name) {
       /*
        * identifier-start-character:
@@ -131,4 +131,6 @@
         } else if (node.Symbol is Tangent) {
           FormatFunction(node, "Math.Tan", strBuilder);
+        } else if (node.Symbol is HyperbolicTangent) {
+          FormatFunction(node, "Math.Tanh", strBuilder);
         } else if (node.Symbol is Square) {
           FormatSquare(node, strBuilder);
Index: /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Formatters/SymbolicDataAnalysisExpressionExcelFormatter.cs
===================================================================
--- /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Formatters/SymbolicDataAnalysisExpressionExcelFormatter.cs	(revision 17100)
+++ /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Formatters/SymbolicDataAnalysisExpressionExcelFormatter.cs	(revision 17101)
@@ -25,8 +25,8 @@
 using System.Linq;
 using System.Text;
+using HEAL.Attic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
-using HEAL.Attic;
 
 namespace HeuristicLab.Problems.DataAnalysis.Symbolic {
@@ -193,5 +193,8 @@
         stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
         stringBuilder.Append(")");
-
+      } else if (symbol is HyperbolicTangent) {
+        stringBuilder.Append("TANH(");
+        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
+        stringBuilder.Append(")");
       } else if (symbol is Variable) {
         VariableTreeNode variableTreeNode = node as VariableTreeNode;
Index: /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Formatters/SymbolicDataAnalysisExpressionLatexFormatter.cs
===================================================================
--- /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Formatters/SymbolicDataAnalysisExpressionLatexFormatter.cs	(revision 17100)
+++ /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Formatters/SymbolicDataAnalysisExpressionLatexFormatter.cs	(revision 17101)
@@ -24,8 +24,8 @@
 using System.Linq;
 using System.Text;
+using HEAL.Attic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
-using HEAL.Attic;
 
 namespace HeuristicLab.Problems.DataAnalysis.Symbolic {
@@ -137,4 +137,6 @@
       } else if (node.Symbol is Tangent) {
         strBuilder.Append(@"\tan \left( ");
+      } else if (node.Symbol is HyperbolicTangent) {
+        strBuilder.Append(@"\tanh \left( ");
       } else if (node.Symbol is AiryA) {
         strBuilder.Append(@"\operatorname{airy}_a \left( ");
@@ -303,4 +305,6 @@
       } else if (node.Symbol is Tangent) {
         throw new InvalidOperationException();
+      } else if (node.Symbol is HyperbolicTangent) {
+        throw new InvalidOperationException();
       } else if (node.Symbol is AiryA) {
         throw new InvalidOperationException();
@@ -399,4 +403,6 @@
       } else if (node.Symbol is Tangent) {
         strBuilder.Append(@" \right) ");
+      } else if (node.Symbol is HyperbolicTangent) {
+        strBuilder.Append(@" \right) ");
       } else if (node.Symbol is AiryA) {
         strBuilder.Append(@" \right) ");
Index: /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Formatters/SymbolicDataAnalysisExpressionMATLABFormatter.cs
===================================================================
--- /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Formatters/SymbolicDataAnalysisExpressionMATLABFormatter.cs	(revision 17100)
+++ /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Formatters/SymbolicDataAnalysisExpressionMATLABFormatter.cs	(revision 17101)
@@ -23,8 +23,8 @@
 using System.Linq;
 using System.Text;
+using HEAL.Attic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
-using HEAL.Attic;
 
 namespace HeuristicLab.Problems.DataAnalysis.Symbolic {
@@ -252,4 +252,8 @@
       } else if (symbol is Tangent) {
         stringBuilder.Append("tan(");
+        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
+        stringBuilder.Append(")");
+      } else if (symbol is HyperbolicTangent) {
+        stringBuilder.Append("tanh(");
         stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
         stringBuilder.Append(")");
Index: /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Formatters/SymbolicDataAnalysisExpressionMathematicaFormatter.cs
===================================================================
--- /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Formatters/SymbolicDataAnalysisExpressionMathematicaFormatter.cs	(revision 17100)
+++ /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Formatters/SymbolicDataAnalysisExpressionMathematicaFormatter.cs	(revision 17101)
@@ -24,8 +24,8 @@
 using System.Linq;
 using System.Text;
+using HEAL.Attic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
-using HEAL.Attic;
 
 namespace HeuristicLab.Problems.DataAnalysis.Symbolic {
@@ -70,4 +70,6 @@
         } else if (node.Symbol is Tangent) {
           FormatFunction(node, "Tan", strBuilder);
+        } else if (node.Symbol is HyperbolicTangent) {
+          FormatFunction(node, "Tanh", strBuilder);
         } else if (node.Symbol is Exponential) {
           FormatFunction(node, "Exp", strBuilder);
Index: /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Formatters/SymbolicDataAnalysisExpressionSmalltalkFormatter.cs
===================================================================
--- /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Formatters/SymbolicDataAnalysisExpressionSmalltalkFormatter.cs	(revision 17100)
+++ /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Formatters/SymbolicDataAnalysisExpressionSmalltalkFormatter.cs	(revision 17101)
@@ -160,4 +160,7 @@
         stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
         stringBuilder.Append(" tan");
+      } else if (symbol is HyperbolicTangent) {
+        stringBuilder.Append(FormatRecursively(node.GetSubtree(0)));
+        stringBuilder.Append(" tanh");
       } else if (symbol is Variable) {
         VariableTreeNode variableTreeNode = node as VariableTreeNode;
Index: /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Grammars/FullFunctionalExpressionGrammar.cs
===================================================================
--- /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Grammars/FullFunctionalExpressionGrammar.cs	(revision 17100)
+++ /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Grammars/FullFunctionalExpressionGrammar.cs	(revision 17101)
@@ -55,4 +55,5 @@
       var log = new Logarithm();
       var abs = new Absolute();
+      var tanh = new HyperbolicTangent();
       var pow = new Power();
       pow.InitialFrequency = 0.0;
@@ -129,8 +130,8 @@
       autoregressiveVariable.Enabled = false;
 
-      var allSymbols = new List<Symbol>() { add, sub, mul, div, aq, mean, abs, sin, cos, tan, log, square, cube, pow, sqrt, cubeRoot, root, exp,
+      var allSymbols = new List<Symbol>() { add, sub, mul, div, aq, mean, abs, sin, cos, tan, log, square, cube, pow, sqrt, cubeRoot, root, exp, tanh,
         airyA, airyB, bessel, cosineIntegral, dawson, erf, expIntegralEi, fresnelCosineIntegral, fresnelSineIntegral, gamma, hypCosineIntegral, hypSineIntegral, norm, psi, sineIntegral,
         @if, gt, lt, and, or, not,xor, timeLag, integral, derivative, constant, variableSymbol, binFactorVariable, factorVariable, laggedVariable,autoregressiveVariable, variableCondition };
-      var unaryFunctionSymbols = new List<Symbol>() { abs, square, sqrt, cube, cubeRoot, sin, cos, tan, log, exp, not, timeLag, integral, derivative,
+      var unaryFunctionSymbols = new List<Symbol>() { abs, square, sqrt, cube, cubeRoot, sin, cos, tan, log, exp, tanh, not, timeLag, integral, derivative,
         airyA, airyB, bessel, cosineIntegral, dawson, erf, expIntegralEi, fresnelCosineIntegral, fresnelSineIntegral, gamma, hypCosineIntegral, hypSineIntegral, norm, psi, sineIntegral
       };
Index: /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Grammars/TypeCoherentExpressionGrammar.cs
===================================================================
--- /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Grammars/TypeCoherentExpressionGrammar.cs	(revision 17100)
+++ /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Grammars/TypeCoherentExpressionGrammar.cs	(revision 17101)
@@ -85,4 +85,5 @@
       var gamma = new Gamma();
       var hypCosineIntegral = new HyperbolicCosineIntegral();
+      var tanh = new HyperbolicTangent();
       var hypSineIntegral = new HyperbolicSineIntegral();
       var norm = new Norm();
@@ -116,6 +117,6 @@
       #region group symbol declaration
       var arithmeticSymbols = new GroupSymbol(ArithmeticFunctionsName, new List<ISymbol>() { add, sub, mul, div, mean });
-      var trigonometricSymbols = new GroupSymbol(TrigonometricFunctionsName, new List<ISymbol>() { sin, cos, tan });
-      var exponentialAndLogarithmicSymbols = new GroupSymbol(ExponentialFunctionsName, new List<ISymbol> { exp, log });
+      var trigonometricSymbols = new GroupSymbol(TrigonometricFunctionsName, new List<ISymbol>() { sin, cos, tan, tanh});
+      var exponentialAndLogarithmicSymbols = new GroupSymbol(ExponentialFunctionsName, new List<ISymbol> { exp, log});
       var specialFunctions = new GroupSymbol(SpecialFunctionsName, new List<ISymbol> { abs, airyA, airyB, bessel, cosineIntegral, dawson, erf, expIntegralEi,
         fresnelCosineIntegral,fresnelSineIntegral,gamma,hypCosineIntegral,hypSineIntegral,norm, psi, sineIntegral, analyticalQuotient});
@@ -242,4 +243,5 @@
       Symbols.First(s => s is Average).Enabled = false;
       Symbols.First(s => s is Absolute).Enabled = false;
+      Symbols.First(s => s is HyperbolicTangent).Enabled = false;
       Symbols.First(s => s.Name == TrigonometricFunctionsName).Enabled = false;
       Symbols.First(s => s.Name == PowerFunctionsName).Enabled = false;
@@ -254,4 +256,5 @@
       Symbols.First(s => s is Xor).Enabled = false;
       Symbols.First(s => s is Absolute).Enabled = false;
+      Symbols.First(s => s is HyperbolicTangent).Enabled = false;
       Symbols.First(s => s.Name == TrigonometricFunctionsName).Enabled = false;
       Symbols.First(s => s.Name == ExponentialFunctionsName).Enabled = false;
@@ -264,4 +267,5 @@
       Symbols.First(s => s is Average).Enabled = false;
       Symbols.First(s => s is Absolute).Enabled = false;
+      Symbols.First(s => s is HyperbolicTangent).Enabled = false;
       Symbols.First(s => s.Name == TrigonometricFunctionsName).Enabled = false;
       Symbols.First(s => s.Name == PowerFunctionsName).Enabled = false;
Index: /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic-3.4.csproj
===================================================================
--- /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic-3.4.csproj	(revision 17100)
+++ /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic-3.4.csproj	(revision 17101)
@@ -239,4 +239,5 @@
     <Compile Include="Symbols\Absolute.cs" />
     <Compile Include="Symbols\CubeRoot.cs" />
+    <Compile Include="Symbols\HyperbolicTangent.cs" />
     <Compile Include="Symbols\VariableBase.cs" />
     <Compile Include="Symbols\VariableTreeNodeBase.cs" />
Index: /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Importer/InfixExpressionParser.cs
===================================================================
--- /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Importer/InfixExpressionParser.cs	(revision 17100)
+++ /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Importer/InfixExpressionParser.cs	(revision 17101)
@@ -111,4 +111,5 @@
         { "COS", new Cosine()},
         { "TAN", new Tangent()},
+        { "TANH", new HyperbolicTangent()},
         { "AIRYA", new AiryA()},
         { "AIRYB", new AiryB()},
Index: /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Importer/SymbolicExpressionImporter.cs
===================================================================
--- /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Importer/SymbolicExpressionImporter.cs	(revision 17100)
+++ /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Importer/SymbolicExpressionImporter.cs	(revision 17101)
@@ -53,4 +53,5 @@
         {"COS", new Cosine()},
         {"TAN", new Tangent()},
+        {"TANH", new HyperbolicTangent ()},
         {"AIRYA", new AiryA()},
         {"AIRYB", new AiryB()},
Index: /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/BatchOperations.cs
===================================================================
--- /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/BatchOperations.cs	(revision 17100)
+++ /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/BatchOperations.cs	(revision 17101)
@@ -69,4 +69,8 @@
         a[i] = Math.Tan(b[i]);
     }
+    public static void Tanh(double[] a, double[] b) {
+      for (int i = 0; i < BATCHSIZE; ++i)
+        a[i] = Math.Tanh(b[i]);
+    }
 
     public static void Pow(double[] a, double[] b) {
Index: /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/OpCodes.cs
===================================================================
--- /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/OpCodes.cs	(revision 17100)
+++ /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/OpCodes.cs	(revision 17101)
@@ -90,4 +90,6 @@
     public const byte CubeRoot = 51;
 
+    public const byte Tanh = 52;
+
 
     private static Dictionary<Type, byte> symbolToOpcode = new Dictionary<Type, byte>() {
@@ -99,4 +101,5 @@
       { typeof(Cosine), OpCodes.Cos },
       { typeof(Tangent), OpCodes.Tan },
+      { typeof (HyperbolicTangent), OpCodes.Tanh},
       { typeof(Logarithm), OpCodes.Log },
       { typeof(Exponential), OpCodes.Exp },
Index: /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/SymbolicDataAnalysisExpressionCompiledTreeInterpreter.cs
===================================================================
--- /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/SymbolicDataAnalysisExpressionCompiledTreeInterpreter.cs	(revision 17100)
+++ /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/SymbolicDataAnalysisExpressionCompiledTreeInterpreter.cs	(revision 17101)
@@ -45,4 +45,5 @@
     private static readonly MethodInfo Cos = typeof(Math).GetMethod("Cos", new[] { typeof(double) });
     private static readonly MethodInfo Tan = typeof(Math).GetMethod("Tan", new[] { typeof(double) });
+    private static readonly MethodInfo Tanh = typeof(Math).GetMethod("Tanh", new[] { typeof(double) });
     private static readonly MethodInfo Sqrt = typeof(Math).GetMethod("Sqrt", new[] { typeof(double) });
     private static readonly MethodInfo Floor = typeof(Math).GetMethod("Floor", new[] { typeof(double) });
@@ -223,4 +224,8 @@
             return Expression.Call(Tan, arg);
           }
+        case OpCodes.Tanh: {
+            var arg = MakeExpr(node.GetSubtree(0), variableIndices, row, columns);
+            return Expression.Call(Tanh, arg);
+          }
         case OpCodes.Square: {
             var arg = MakeExpr(node.GetSubtree(0), variableIndices, row, columns);
Index: /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/SymbolicDataAnalysisExpressionTreeBatchInterpreter.cs
===================================================================
--- /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/SymbolicDataAnalysisExpressionTreeBatchInterpreter.cs	(revision 17100)
+++ /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/SymbolicDataAnalysisExpressionTreeBatchInterpreter.cs	(revision 17101)
@@ -159,5 +159,8 @@
               break;
             }
-
+          case OpCodes.Tanh: {
+              Tanh(instr.buf, code[c].buf);
+              break;
+            }
           case OpCodes.Absolute: {
               Absolute(instr.buf, code[c].buf);
Index: /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/SymbolicDataAnalysisExpressionTreeILEmittingInterpreter.cs
===================================================================
--- /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/SymbolicDataAnalysisExpressionTreeILEmittingInterpreter.cs	(revision 17100)
+++ /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/SymbolicDataAnalysisExpressionTreeILEmittingInterpreter.cs	(revision 17101)
@@ -45,4 +45,5 @@
     private static MethodInfo sin = typeof(Math).GetMethod("Sin", new Type[] { typeof(double) });
     private static MethodInfo tan = typeof(Math).GetMethod("Tan", new Type[] { typeof(double) });
+    private static MethodInfo tanh = typeof(Math).GetMethod("Tanh", new Type[] { typeof(double) });
     private static MethodInfo exp = typeof(Math).GetMethod("Exp", new Type[] { typeof(double) });
     private static MethodInfo log = typeof(Math).GetMethod("Log", new Type[] { typeof(double) });
@@ -283,4 +284,9 @@
             CompileInstructions(il, state, ds);
             il.Emit(System.Reflection.Emit.OpCodes.Call, tan);
+            return;
+          }
+        case OpCodes.Tanh: {
+            CompileInstructions(il, state, ds);
+            il.Emit(System.Reflection.Emit.OpCodes.Call, tanh);
             return;
           }
Index: /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/SymbolicDataAnalysisExpressionTreeInterpreter.cs
===================================================================
--- /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/SymbolicDataAnalysisExpressionTreeInterpreter.cs	(revision 17100)
+++ /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/SymbolicDataAnalysisExpressionTreeInterpreter.cs	(revision 17101)
@@ -205,4 +205,7 @@
             return Math.Abs(Evaluate(dataset, ref row, state));
           }
+        case OpCodes.Tanh: {
+            return Math.Tanh(Evaluate(dataset, ref row, state));
+          }
         case OpCodes.Cos: {
             return Math.Cos(Evaluate(dataset, ref row, state));
Index: /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/SymbolicDataAnalysisExpressionTreeLinearInterpreter.cs
===================================================================
--- /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/SymbolicDataAnalysisExpressionTreeLinearInterpreter.cs	(revision 17100)
+++ /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/SymbolicDataAnalysisExpressionTreeLinearInterpreter.cs	(revision 17101)
@@ -226,4 +226,6 @@
         } else if (instr.opCode == OpCodes.Absolute) {
           instr.value = Math.Abs(code[instr.childIndex].value);
+        } else if (instr.opCode == OpCodes.Tanh) {
+          instr.value = Math.Tanh(code[instr.childIndex].value);
         } else if (instr.opCode == OpCodes.Cos) {
           instr.value = Math.Cos(code[instr.childIndex].value);
Index: /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Symbols/HyperbolicTangent.cs
===================================================================
--- /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Symbols/HyperbolicTangent.cs	(revision 17101)
+++ /stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Symbols/HyperbolicTangent.cs	(revision 17101)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HEAL.Attic;
+
+namespace HeuristicLab.Problems.DataAnalysis.Symbolic {
+  [StorableType("32F7D410-066A-4ABF-81BB-9CD5A49C7B17")]
+  [Item("HyperbolicSineIntegral", "Symbol that represents the hyperbolic sine integral.")]
+  public sealed class HyperbolicTangent : Symbol {
+    private const int minimumArity = 1;
+    private const int maximumArity = 1;
+
+    public override int MinimumArity {
+      get { return minimumArity; }
+    }
+    public override int MaximumArity {
+      get { return maximumArity; }
+    }
+
+    [StorableConstructor]
+    private HyperbolicTangent(StorableConstructorFlag _) : base(_) { }
+    private HyperbolicTangent(HyperbolicTangent original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new HyperbolicTangent(this, cloner);
+    }
+    public HyperbolicTangent() : base("HyperbolicTangent", "Symbol that represents the hyperbolic tanh().") { }
+  }
+}
+
+
