Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/Crossovers/ParameterSetCrossover.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/Crossovers/ParameterSetCrossover.cs	(revision 4539)
+++ 	(revision )
@@ -1,88 +1,0 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using HeuristicLab.Operators;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Core;
-using HeuristicLab.Parameters;
-using HeuristicLab.Encodings.RealVectorEncoding;
-using HeuristicLab.Encodings.BinaryVectorEncoding;
-using HeuristicLab.Encodings.IntegerVectorEncoding;
-using HeuristicLab.Collections;
-using HeuristicLab.Data;
-using HeuristicLab.Optimization;
-
-namespace HeuristicLab.Problems.MetaOptimization.Encodings.Crossovers {
-  /// <summary>
-  /// 
-  /// </summary>
-  [Item("ParameterSetCrossover", "TODO")]
-  [StorableClass]
-  public class ParameterSetCrossover : SingleSuccessorOperator, IParameterSetOperator, ICrossover {
-    public override bool CanChangeName {
-      get { return false; }
-    }
-
-    public ILookupParameter<IRandom> RandomParameter {
-      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
-    }
-    public ILookupParameter<ItemArray<IParameterSet>> ParentsParameter {
-      get { return (ScopeTreeLookupParameter<IParameterSet>)Parameters["Parents"]; }
-    }
-    public ILookupParameter<IParameterSet> ChildParameter {
-      get { return (ILookupParameter<IParameterSet>)Parameters["Child"]; }
-    }
-
-    public IValueParameter<IBinaryVectorCrossover> BinaryVectorCrossoverParameter {
-      get { return (IValueParameter<IBinaryVectorCrossover>)Parameters["BinaryVectorCrossover"]; }
-    }
-    public IValueParameter<IIntegerVectorCrossover> IntegerVectorCrossoverParameter {
-      get { return (IValueParameter<IIntegerVectorCrossover>)Parameters["IntegerVectorCrossover"]; }
-    }
-    public IValueParameter<IRealVectorCrossover> RealVectorCrossoverParameter {
-      get { return (IValueParameter<IRealVectorCrossover>)Parameters["RealVectorCrossover"]; }
-    }
-    public ParameterSetCrossover()
-      : base() {
-      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic crossover operators."));
-      Parameters.Add(new ScopeTreeLookupParameter<IParameterSet>("Parents", "The parent vectors which should be crossed."));
-      ParentsParameter.ActualName = "ParameterSet";
-      Parameters.Add(new LookupParameter<IParameterSet>("Child", "The child vector resulting from the crossover."));
-      ChildParameter.ActualName = "ParameterSet";
-      Parameters.Add(new ValueParameter<IRealVectorCrossover>("BinaryVectorCrossover", "Crossover operator used for crossing binary parameters"));
-      Parameters.Add(new ValueParameter<IRealVectorCrossover>("IntegerVectorCrossover", "Crossover operator used for crossing integer parameters"));
-      Parameters.Add(new ValueParameter<IRealVectorCrossover>("RealVectorCrossover", "Crossover operator used for crossing real parameters"));
-    }
-    public override IOperation Apply() {
-      IEnumerable<IndexedItem<IParameterConfiguration>> integerParameters1 = GetIntegerParameters(ParentsParameter.ActualValue[0]);
-      IEnumerable<IndexedItem<IParameterConfiguration>> integerParameters2 = GetIntegerParameters(ParentsParameter.ActualValue[1]);
-      IParameterSet child = (IParameterSet)ParentsParameter.ActualValue[0].Clone();
-      
-      // TODO: use specific crossover operators to do the crossing
-      // for now: just swap the int-values
-      foreach (var par in integerParameters1) {
-        ParentsParameter.ActualValue[1].Parameters.ElementAt(par.Index).Parameter.ActualValue = par.Value.Parameter.ActualValue;
-      }
-      foreach (var par in integerParameters2) {
-        ParentsParameter.ActualValue[0].Parameters.ElementAt(par.Index).Parameter.ActualValue = par.Value.Parameter.ActualValue;
-      }
-
-      ChildParameter.ActualValue = child;
-      return base.Apply();
-    }
-
-    private IEnumerable<IndexedItem<IParameterConfiguration>> GetIntegerParameters(IParameterSet parameterSet) {
-      List<IndexedItem<IParameterConfiguration>> integerParameters = new List<IndexedItem<IParameterConfiguration>>();
-      int i = 0;
-      foreach (var item in parameterSet.Parameters) {
-        if (item.Parameter.DataType == typeof(IntValue)) {
-          integerParameters.Add(new IndexedItem<IParameterConfiguration>(i, (IParameterConfiguration)item.Clone()));
-        }
-        i++;
-      }
-      return integerParameters;
-    }
-
-  }
-}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/Crossovers/ParameterVectorCrossover.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/Crossovers/ParameterVectorCrossover.cs	(revision 4830)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/Crossovers/ParameterVectorCrossover.cs	(revision 4830)
@@ -0,0 +1,87 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Operators;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Collections;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Problems.MetaOptimization.Encodings.Crossovers {
+  /// <summary>
+  /// 
+  /// </summary>
+  [Item("ParameterVectorCrossover", "TODO")]
+  [StorableClass]
+  public class ParameterVectorCrossover : SingleSuccessorOperator, IParameterConfigurationOperator, ICrossover {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    public ILookupParameter<ItemArray<IParameterConfiguration>> ParentsParameter {
+      get { return (ScopeTreeLookupParameter<IParameterConfiguration>)Parameters["Parents"]; }
+    }
+    public ILookupParameter<IParameterConfiguration> ChildParameter {
+      get { return (ILookupParameter<IParameterConfiguration>)Parameters["Child"]; }
+    }
+
+    private IIntegerVectorCrossover integerVectorCrossover;
+    public IIntegerVectorCrossover IntegerVectorCrossover {
+      get { return integerVectorCrossover; }
+      set { integerVectorCrossover = value; }
+    }
+    private IRealVectorCrossover realVectorCrossover;
+    public IRealVectorCrossover RealVectorCrossover {
+      get { return realVectorCrossover; }
+      set { realVectorCrossover = value; }
+    }
+
+    [StorableConstructor]
+    protected ParameterVectorCrossover(bool deserializing) : base(deserializing) { }
+    protected ParameterVectorCrossover(ParameterVectorCrossover original, Cloner cloner) : base(original, cloner) { }
+    public ParameterVectorCrossover()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic crossover operators."));
+      Parameters.Add(new ScopeTreeLookupParameter<IParameterConfiguration>("Parents", "The parent vectors which should be crossed."));
+      ParentsParameter.ActualName = "ParameterConfiguration";
+      Parameters.Add(new LookupParameter<IParameterConfiguration>("Child", "The child vector resulting from the crossover."));
+      ChildParameter.ActualName = "ParameterConfiguration";
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ParameterVectorCrossover(this, cloner);
+    }
+
+    public override IOperation Apply() {
+
+      IParameterConfiguration child = (IParameterConfiguration)ParentsParameter.ActualValue[0].Clone();
+      // todo
+      //for (int i = 0; i < child.Parameters.Count; i++) {
+      //  if (child.Parameters[i].Parameter.DataType == typeof(IntValue)) {
+      //    child.Parameters[i].Parameter.ActualValue = CrossInteger(ParentsParameter.ActualValue[0].Parameters[i], ParentsParameter.ActualValue[1].Parameters[i]);
+      //  }
+      //}
+
+      this.ChildParameter.ActualValue = child;
+      return base.Apply();
+    }
+
+    private IntValue CrossInteger(IParameterConfiguration parameter1, IParameterConfiguration parameter2) {
+      IntegerVector integerChild = HeuristicLab.Encodings.IntegerVectorEncoding.DiscreteCrossover.Apply(
+        RandomParameter.ActualValue,
+        new IntegerVector(new IntArray(new int[] { ((IntValue)parameter1.Parameter.ActualValue).Value })),
+        new IntegerVector(new IntArray(new int[] { ((IntValue)parameter2.Parameter.ActualValue).Value })));
+      return new IntValue(integerChild[0]);
+    }
+
+  }
+}
