Index: /branches/DataAnalysisService/HeuristicLab.Encodings.ParameterConfigurationTreeEncoding/3.3/HeuristicLab.Encodings.ParameterConfigurationTreeEncoding.csproj
===================================================================
--- /branches/DataAnalysisService/HeuristicLab.Encodings.ParameterConfigurationTreeEncoding/3.3/HeuristicLab.Encodings.ParameterConfigurationTreeEncoding.csproj	(revision 7910)
+++ /branches/DataAnalysisService/HeuristicLab.Encodings.ParameterConfigurationTreeEncoding/3.3/HeuristicLab.Encodings.ParameterConfigurationTreeEncoding.csproj	(revision 7911)
@@ -76,4 +76,5 @@
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="RangeConstraints\ConstrainedValue.cs" />
+    <Compile Include="RangeConstraints\DoubleValueFactorRange.cs" />
     <Compile Include="RangeConstraints\DoubleValueRange.cs" />
     <Compile Include="RangeConstraints\IntValueRange.cs" />
Index: /branches/DataAnalysisService/HeuristicLab.Encodings.ParameterConfigurationTreeEncoding/3.3/RangeConstraints/DoubleValueFactorRange.cs
===================================================================
--- /branches/DataAnalysisService/HeuristicLab.Encodings.ParameterConfigurationTreeEncoding/3.3/RangeConstraints/DoubleValueFactorRange.cs	(revision 7911)
+++ /branches/DataAnalysisService/HeuristicLab.Encodings.ParameterConfigurationTreeEncoding/3.3/RangeConstraints/DoubleValueFactorRange.cs	(revision 7911)
@@ -0,0 +1,88 @@
+﻿#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.Encodings.ParameterConfigurationTreeEncoding {
+  [StorableClass]
+  public class DoubleValueFactorRange : Range<DoubleValue> {
+
+    public override DoubleValue LowerBound {
+      get {
+        return base.LowerBound;
+      }
+      set {
+        base.LowerBound = value;
+      }
+    }
+
+    public DoubleValueFactorRange(DoubleValue lowerBound, DoubleValue upperBound, DoubleValue stepSize) : base(lowerBound, upperBound, stepSize) { }
+    public DoubleValueFactorRange() { }
+    [StorableConstructor]
+    protected DoubleValueFactorRange(bool deserializing) : base(deserializing) { }
+    protected DoubleValueFactorRange(DoubleValueFactorRange original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new DoubleValueFactorRange(this, cloner);
+    }
+
+    protected override DoubleValue GetRandomSample(IRandom random) {
+      double val;
+      do {
+        val = Math.Round((random.NextDouble() * (UpperBound.Value - LowerBound.Value) + LowerBound.Value) / StepSize.Value, 0) * StepSize.Value;
+      } while (!IsInRange(val));
+      return new DoubleValue(val);
+    }
+
+    public double ApplyStepSize(double value) {
+      if (value <= this.StepSize.Value)
+        return (Math.Round(value, 9));
+      else
+        return (Math.Round(value / this.StepSize.Value, 0)) * this.StepSize.Value;
+    }
+
+    public bool IsInRange(double value) {
+      return value <= this.UpperBound.Value && value >= this.LowerBound.Value;
+    }
+
+    public override IEnumerable<DoubleValue> GetCombinations() {
+      var solutions = new List<DoubleValue>();
+      double value = LowerBound.Value;
+
+      while (value <= UpperBound.Value) {
+        solutions.Add(new DoubleValue(value));
+        value *= StepSize.Value;
+        value = ApplyStepSize(value);
+      }
+      return solutions;
+    }
+
+    protected override double CalculateSimilarityValue(DoubleValue a, DoubleValue b) {
+      double range = UpperBound.Value - LowerBound.Value;
+      double diff = Math.Abs(a.Value - b.Value);
+      return Math.Max(0, (range - (diff * 2)) / range);
+    }
+  }
+}
Index: /branches/DataAnalysisService/HeuristicLab.Encodings.ParameterConfigurationTreeEncoding/3.3/ValueConfigurations/RangeValueConfiguration.cs
===================================================================
--- /branches/DataAnalysisService/HeuristicLab.Encodings.ParameterConfigurationTreeEncoding/3.3/ValueConfigurations/RangeValueConfiguration.cs	(revision 7910)
+++ /branches/DataAnalysisService/HeuristicLab.Encodings.ParameterConfigurationTreeEncoding/3.3/ValueConfigurations/RangeValueConfiguration.cs	(revision 7911)
@@ -34,5 +34,5 @@
     public IRange RangeConstraint {
       get { return rangeConstraint; }
-      private set {
+      set {
         if (rangeConstraint != value) {
           DeregisterRangeConstraintEvents();
