Index: /trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/MultiObjective/NMSEConstraintsEvaluator.cs
===================================================================
--- /trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/MultiObjective/NMSEConstraintsEvaluator.cs	(revision 17905)
+++ /trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/MultiObjective/NMSEConstraintsEvaluator.cs	(revision 17906)
@@ -33,5 +33,5 @@
 
 namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Regression.MultiObjective {
-  [Item("NMSE Evaluator (multi-objective, with shape-constraints)",
+  [Item("NMSE Evaluator with shape-constraints",
     "Calculates the NMSE and the constraints violations of a symbolic regression solution as objectives.")]
   [StorableType("8E9D76B7-ED9C-43E7-9898-01FBD3633880")]
Index: /trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/ShapeConstraintsAnalyzer.cs
===================================================================
--- /trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/ShapeConstraintsAnalyzer.cs	(revision 17905)
+++ /trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/ShapeConstraintsAnalyzer.cs	(revision 17906)
@@ -31,5 +31,5 @@
 namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Regression {
   [StorableType("4318C6BD-E0A1-45FE-AC30-96E7F73B51FB")]
-  [Item("Shape-constraints analyser", "Analyzes the number of shape-constraint violations of symbolic regression models.")]
+  [Item("ShapeConstraintsAnalyzer", "Analyzes the number of shape-constraint violations of symbolic regression models.")]
   public class ShapeConstraintsAnalyzer : SymbolicDataAnalysisAnalyzer, ISymbolicExpressionTreeAnalyzer {
     private const string ProblemDataParameterName = "ProblemData";
@@ -106,5 +106,5 @@
       var estimator = new IntervalArithBoundsEstimator();
 
-      if (constraintViolationsTable.Rows.Any())
+      if (!constraintViolationsTable.Rows.Any())
         foreach (var constraint in constraints)
           constraintViolationsTable.Rows.Add(new DataRow(constraint.ToString()));
Index: /trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/NMSEConstraintsEvaluator.cs
===================================================================
--- /trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/NMSEConstraintsEvaluator.cs	(revision 17905)
+++ /trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/NMSEConstraintsEvaluator.cs	(revision 17906)
@@ -32,5 +32,5 @@
 
 namespace HeuristicLab.Problems.DataAnalysis.Symbolic {
-  [Item("NMSE Evaluator (single-objective, with shape-constraints)", "Calculates NMSE of a symbolic regression solution and checks constraints the fitness is a combination of NMSE and constraint violations.")]
+  [Item("NMSE Evaluator with shape-constraints", "Calculates NMSE of a symbolic regression solution and checks constraints the fitness is a combination of NMSE and constraint violations.")]
   [StorableType("27473973-DD8D-4375-997D-942E2280AE8E")]
   public class NMSEConstraintsEvaluator : SymbolicRegressionSingleObjectiveEvaluator {
Index: /trunk/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/IntervalArithCompiledExpressionBoundsEstimator.cs
===================================================================
--- /trunk/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/IntervalArithCompiledExpressionBoundsEstimator.cs	(revision 17905)
+++ /trunk/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/IntervalArithCompiledExpressionBoundsEstimator.cs	(revision 17906)
@@ -194,4 +194,10 @@
             return Expression.Divide(e1, e2);
           }
+        case OpCodes.AnalyticQuotient: {
+            var a = expr(node.GetSubtree(0));
+            var b = expr(node.GetSubtree(1));
+            var fun = typeof(Interval).GetMethod(methodName[opCode], new[] { a.Type, b.Type });
+            return Expression.Call(fun, a, b);
+          }
         // all these cases share the same code: get method info by name, emit call expression
         case OpCodes.Exp:
@@ -205,6 +211,5 @@
         case OpCodes.SquareRoot:
         case OpCodes.CubeRoot:
-        case OpCodes.Absolute:
-        case OpCodes.AnalyticQuotient: {
+        case OpCodes.Absolute: {
             var arg = expr(node.GetSubtree(0));
             var fun = typeof(Interval).GetMethod(methodName[opCode], new[] { arg.Type });
Index: /trunk/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/IntervalUtil.cs
===================================================================
--- /trunk/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/IntervalUtil.cs	(revision 17905)
+++ /trunk/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/IntervalUtil.cs	(revision 17906)
@@ -39,7 +39,7 @@
       var varRanges = variableRanges.GetReadonlyDictionary();
 
-      if (constraint.Variable != null && !varRanges.ContainsKey(constraint.Variable)) {
+      if (!string.IsNullOrEmpty(constraint.Variable) && !varRanges.ContainsKey(constraint.Variable)) {
         throw new ArgumentException(
-          $"The given variable {constraint.Variable} in the constraint does not exist in the model.",
+          $"No variable range found for variable {constraint.Variable} used in the constraints.",
           nameof(constraint));
       }
Index: /trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/HeuristicLab.Problems.DataAnalysis.Views-3.4.csproj
===================================================================
--- /trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/HeuristicLab.Problems.DataAnalysis.Views-3.4.csproj	(revision 17905)
+++ /trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/HeuristicLab.Problems.DataAnalysis.Views-3.4.csproj	(revision 17906)
@@ -102,4 +102,8 @@
       <HintPath>..\..\bin\ALGLIB-3.7.0.dll</HintPath>
       <Private>False</Private>
+    </Reference>
+    <Reference Include="HEAL.Attic, Version=1.5.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\bin\HEAL.Attic.dll</HintPath>
     </Reference>
     <Reference Include="System" />
Index: /trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/ShapeConstraintsView.cs
===================================================================
--- /trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/ShapeConstraintsView.cs	(revision 17905)
+++ /trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/ShapeConstraintsView.cs	(revision 17906)
@@ -50,4 +50,5 @@
       this.shapeConstraintsView.Content = Content;
       UpdateControl();
+      errorOutput.Text = "";
     }
 
@@ -77,4 +78,5 @@
     protected override void SetEnabledStateOfControls() {
       constraintsInput.Enabled = Content != null && !Locked && !ReadOnly;
+      parseBtn.Enabled = Content != null && !Locked && !ReadOnly;
     }
 
@@ -90,5 +92,5 @@
           errorOutput.ForeColor = Color.DarkGreen;
         } catch (ArgumentException ex) {
-          errorOutput.Text = ex.Message.Replace("Parameter name", "@Line");
+          errorOutput.Text = ex.Message;
           errorOutput.ForeColor = Color.DarkRed;
         } finally {
Index: /trunk/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Interval/IntervalCollection.cs
===================================================================
--- /trunk/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Interval/IntervalCollection.cs	(revision 17905)
+++ /trunk/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Interval/IntervalCollection.cs	(revision 17906)
@@ -35,5 +35,4 @@
     }
 
-    //[Storable]
     private IDictionary<string, Interval> intervals { get; set; } = new Dictionary<string, Interval>();
 
Index: /trunk/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Interval/ShapeConstraint.cs
===================================================================
--- /trunk/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Interval/ShapeConstraint.cs	(revision 17905)
+++ /trunk/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Interval/ShapeConstraint.cs	(revision 17906)
@@ -171,10 +171,10 @@
     private string GenerateExpressionString() {
       string expression;
-
+      string write(double val) => double.IsPositiveInfinity(val) ? "inf." : double.IsNegativeInfinity(val) ? "-inf." : $"{val}";
       if (!IsDerivative) {
-        expression = string.Format($"f in [{Interval?.LowerBound} .. {Interval?.UpperBound}]");
+        expression = string.Format($"f in [{write(Interval.LowerBound)} .. {write(Interval.UpperBound)}]");
         if (Regions != null) {
           foreach (var region in Regions.GetReadonlyDictionary())
-            expression += $", {region.Key} in [{region.Value.LowerBound} .. {region.Value.UpperBound}]";
+            expression += $", {region.Key} in [{write(region.Value.LowerBound)} .. {write(region.Value.UpperBound)}]";
         }
         if (Weight != 1.0) {
@@ -194,8 +194,8 @@
           derivationString = "³"; break;
       }
-      expression = string.Format($"∂{derivationString}f/∂{Variable}{derivationString} in [{Interval?.LowerBound} .. {Interval?.UpperBound}]");
+      expression = string.Format($"∂{derivationString}f/∂{Variable}{derivationString} in [{write(Interval.LowerBound)} .. {write(Interval.UpperBound)}]");
       if (Regions != null) {
         foreach (var region in Regions.GetReadonlyDictionary())
-          expression += $", {region.Key} in [{region.Value.LowerBound} .. {region.Value.UpperBound}]";
+          expression += $", {region.Key} in [{write(region.Value.LowerBound)} .. {write(region.Value.UpperBound)}]";
       }
       if (Weight != 1.0) {
Index: /trunk/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Interval/ShapeConstraintsParser.cs
===================================================================
--- /trunk/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Interval/ShapeConstraintsParser.cs	(revision 17905)
+++ /trunk/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Interval/ShapeConstraintsParser.cs	(revision 17906)
@@ -61,5 +61,5 @@
       } else {
         throw new
-          ArgumentException("Error at your constraints definition constraints have to start with (f | d | ∂ | #)",
+          ArgumentException($"Error at in definition {expr}. Constraints have to start with (f | d | ∂ | #)",
                             nameof(expr));
       }
@@ -68,5 +68,5 @@
     // [124 .. 145]
     private const string intervalRegex = @"\s*[\[]" +
-                                         @"\s*(?<lowerBound>[^\s\.;]*)" +
+                                         @"\s*(?<lowerBound>[^\s;]*)" +
                                          @"\s*(\.{2}|\s+|;)" +
                                          @"\s*(?<upperBound>[^\s\]]*)" +
@@ -76,5 +76,5 @@
     private const string weightRegex = @"\s*(weight:\s*(?<weight>\S*))?";
     public static ShapeConstraint ParseFunctionRangeConstraint(string expr) {
-      if (!expr.StartsWith("f")) throw new ArgumentException("Invalid function range constraint (e.g. f in [1..2])", nameof(expr));
+      if (!expr.StartsWith("f")) throw new ArgumentException($"Invalid function range constraint {expr} (e.g. f in [1..2])", nameof(expr));
       var start = "f".Length;
       var end = expr.Length;
@@ -95,10 +95,10 @@
                     intervalRegex +
                     @"(" +
-                      @"\s*,\s*"+ variableRegex +
+                      @"\s*,\s*" + variableRegex +
                       @"\s *\bin\b" +
                       intervalRegex +
                     @")*" +
                     weightRegex
-                    ); 
+                    );
 
 
@@ -125,5 +125,5 @@
               regions.AddInterval(region.Key, region.Value);
             else
-              throw new ArgumentException("A constraint cannot contain multiple regions of the same variable.");
+              throw new ArgumentException($"The constraint {expr} has multiple regions of the same variable.");
           }
           return new ShapeConstraint(interval, regions, weight);
@@ -131,5 +131,5 @@
           return new ShapeConstraint(interval, weight);
       } else
-        throw new ArgumentException("The inserted target constraint is not valid.", nameof(expr));
+        throw new ArgumentException($"The inserted target constraint {expr} is not valid.", nameof(expr));
     }
     public static ShapeConstraint ParseDerivationConstraint(string expr) {
@@ -149,5 +149,5 @@
                                   @")*" +
                                 weightRegex
-                                ); 
+                                );
 
       if (match.Success) {
@@ -161,7 +161,7 @@
         if (enumeratorNumDeriv != "" || denominatorNumDeriv != "") {
           if (enumeratorNumDeriv == "" || denominatorNumDeriv == "")
-            throw new ArgumentException("Number of derivation has to be written on both sides.", nameof(expr));
+            throw new ArgumentException($"Number of derivation has to be written on both sides in {expr}.", nameof(expr));
           if (enumeratorNumDeriv != denominatorNumDeriv)
-            throw new ArgumentException("Derivation number is not equal on both sides.", nameof(expr));
+            throw new ArgumentException($"Derivation number is not equal on both sides in {expr}.", nameof(expr));
         }
 
@@ -187,5 +187,5 @@
               regions.AddInterval(region.Key, region.Value);
             else
-              throw new ArgumentException("A constraint cannot contain multiple regions of the same variable.");
+              throw new ArgumentException($"The constraint {expr} has multiple regions of the same variable.");
           }
           return new ShapeConstraint(variable, numberOfDerivation, interval, regions, weight);
@@ -193,5 +193,5 @@
           return new ShapeConstraint(variable, numberOfDerivation, interval, weight);
       } else
-        throw new ArgumentException("The inserted derivation constraint is not valid.", nameof(expr));
+        throw new ArgumentException($"The inserted derivation constraint {expr} is not valid.", nameof(expr));
     }
 
@@ -220,5 +220,5 @@
       var valid = double.TryParse(input, out var value);
       if (!valid) {
-        throw new ArgumentException("Invalid value (valid value format: \"" + FormatPatterns.GetDoubleFormatPattern() + "\")");
+        throw new ArgumentException($"Invalid value {input} (valid value format: \"" + "+inf. | inf. | -inf. | " + FormatPatterns.GetDoubleFormatPattern() + "\")");
       }
 
