Index: /branches/3073_IA_constraint_splitting/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/IntervalInterpreter.cs
===================================================================
--- /branches/3073_IA_constraint_splitting/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/IntervalInterpreter.cs	(revision 17636)
+++ /branches/3073_IA_constraint_splitting/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/IntervalInterpreter.cs	(revision 17637)
@@ -24,4 +24,5 @@
 using System;
 using System.Collections.Generic;
+using System.Collections.ObjectModel;
 using System.Linq;
 using System.Runtime.Remoting.Contexts;
@@ -79,5 +80,5 @@
     private IntervalInterpreter(IntervalInterpreter original, Cloner cloner)
       : base(original, cloner) { }
-
+    
     public IntervalInterpreter()
       : base("IntervalInterpreter", "Interpreter for calculation of intervals of symbolic models.") {
@@ -88,5 +89,5 @@
       Parameters.Add(new FixedValueParameter<BoolValue>(UseIntervalSplittingParameterName, "", new BoolValue(false)));
     }
-
+    
     public override IDeepCloneable Clone(Cloner cloner) {
       return new IntervalInterpreter(this, cloner);
@@ -107,7 +108,7 @@
     public Interval GetSymbolicExpressionTreeInterval(
       ISymbolicExpressionTree tree, IDataset dataset,
-      IEnumerable<int> rows = null, bool splitting = true) {
+      IEnumerable<int> rows = null) {
       var variableRanges = DatasetUtil.GetVariableRanges(dataset, rows);
-      return GetSymbolicExpressionTreeInterval(tree, variableRanges, splitting);
+      return GetSymbolicExpressionTreeInterval(tree, variableRanges);
     }
 
@@ -115,12 +116,12 @@
       ISymbolicExpressionTree tree, IDataset dataset,
       out IDictionary<ISymbolicExpressionTreeNode, Interval>
-        nodeIntervals, IEnumerable<int> rows = null, bool splitting = true) {
+        nodeIntervals, IEnumerable<int> rows = null) {
       var variableRanges = DatasetUtil.GetVariableRanges(dataset, rows);
-      return GetSymbolicExpressionTreeIntervals(tree, variableRanges, out nodeIntervals, splitting);
+      return GetSymbolicExpressionTreeIntervals(tree, variableRanges, out nodeIntervals);
     }
 
     public Interval GetSymbolicExpressionTreeInterval(
       ISymbolicExpressionTree tree,
-      IDictionary<string, Interval> variableRanges, bool splitting = true) {
+      IReadOnlyDictionary<string, Interval> variableRanges) {
       lock (syncRoot) {
         EvaluatedSolutions++;
@@ -129,5 +130,5 @@
       Interval outputInterval;
 
-      if (splitting) {
+      if (UseIntervalSplitting) {
         outputInterval = GetSymbolicExpressionTreeIntervals(tree, variableRanges,
           out var nodeIntervals);
@@ -146,7 +147,7 @@
     public Interval GetSymbolicExpressionTreeIntervals(
       ISymbolicExpressionTree tree,
-      IDictionary<string, Interval> variableRanges,
+      IReadOnlyDictionary<string, Interval> variableRanges,
       out IDictionary<ISymbolicExpressionTreeNode, Interval>
-        nodeIntervals, bool splitting = true) {
+        nodeIntervals) {
       lock (syncRoot) {
         EvaluatedSolutions++;
@@ -157,5 +158,5 @@
 
       Interval outputInterval;
-      if (splitting) {
+      if (UseIntervalSplitting) {
         var variables = tree.IterateNodesPrefix().OfType<VariableTreeNode>().Select(x => x.VariableName).Distinct()
                             .ToList();
@@ -165,5 +166,6 @@
           var currIndex = 0;
           var currDepth = 0;
-          outputInterval = EvaluateRecursive(instructions, intervals, variableRanges, variables, MinSplittingWidth, MaxSplittingDepth,
+          IDictionary<string, Interval> writeableVariableRanges = variableRanges.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
+          outputInterval = EvaluateRecursive(instructions, intervals, writeableVariableRanges, variables, MinSplittingWidth, MaxSplittingDepth,
             ref currIndex, ref currDepth, tree);
         } else {
@@ -195,5 +197,5 @@
     private static Instruction[] PrepareInterpreterState(
       ISymbolicExpressionTree tree,
-      IDictionary<string, Interval> variableRanges) {
+      IReadOnlyDictionary<string, Interval> variableRanges) {
       if (variableRanges == null)
         throw new ArgumentNullException("No variablew ranges are present!", nameof(variableRanges));
@@ -212,4 +214,6 @@
       return code;
     }
+
+
 
     public static Interval EvaluateRecursive(
@@ -221,5 +225,6 @@
       Interval evaluate() {
         var ic = 0;
-        return Evaluate(instructions, ref ic, nodeIntervals, variableIntervals);
+        IReadOnlyDictionary<string, Interval> readonlyRanges = new ReadOnlyDictionary<string, Interval>(variableIntervals);
+        return Evaluate(instructions, ref ic, nodeIntervals, readonlyRanges);
       }
 
@@ -261,5 +266,5 @@
       Instruction[] instructions, ref int instructionCounter,
       IDictionary<ISymbolicExpressionTreeNode, Interval> nodeIntervals = null,
-      IDictionary<string, Interval> variableIntervals = null) {
+      IReadOnlyDictionary<string, Interval> variableIntervals = null) {
       var currentInstr = instructions[instructionCounter];
       //Use ref parameter, because the tree will be iterated through recursively from the left-side branch to the right side
