Index: /trunk/sources/HeuristicLab.Operators/3.3/AddVariableInfoDialog.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/AddVariableInfoDialog.Designer.cs	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/AddVariableInfoDialog.Designer.cs	(revision 1670)
@@ -0,0 +1,265 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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
+
+namespace HeuristicLab.Operators {
+  partial class AddVariableInfoDialog {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.cancelButton = new System.Windows.Forms.Button();
+      this.okButton = new System.Windows.Forms.Button();
+      this.formalNameLabel = new System.Windows.Forms.Label();
+      this.formalNameTextBox = new System.Windows.Forms.TextBox();
+      this.descriptionLabel = new System.Windows.Forms.Label();
+      this.descriptionTextBox = new System.Windows.Forms.TextBox();
+      this.dataTypeLabel = new System.Windows.Forms.Label();
+      this.kindLabel = new System.Windows.Forms.Label();
+      this.kindNewCheckBox = new System.Windows.Forms.CheckBox();
+      this.kindInCheckBox = new System.Windows.Forms.CheckBox();
+      this.kindOutCheckBox = new System.Windows.Forms.CheckBox();
+      this.kindDeletedCheckBox = new System.Windows.Forms.CheckBox();
+      this.dataTypeTextBox = new System.Windows.Forms.TextBox();
+      this.setDataTypeButton = new System.Windows.Forms.Button();
+      this.SuspendLayout();
+      // 
+      // cancelButton
+      // 
+      this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+      this.cancelButton.Location = new System.Drawing.Point(311, 210);
+      this.cancelButton.Name = "cancelButton";
+      this.cancelButton.Size = new System.Drawing.Size(75, 23);
+      this.cancelButton.TabIndex = 13;
+      this.cancelButton.Text = "&Cancel";
+      this.cancelButton.UseVisualStyleBackColor = true;
+      // 
+      // okButton
+      // 
+      this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK;
+      this.okButton.Location = new System.Drawing.Point(230, 210);
+      this.okButton.Name = "okButton";
+      this.okButton.Size = new System.Drawing.Size(75, 23);
+      this.okButton.TabIndex = 12;
+      this.okButton.Text = "&OK";
+      this.okButton.UseVisualStyleBackColor = true;
+      this.okButton.Click += new System.EventHandler(this.okButton_Click);
+      // 
+      // formalNameLabel
+      // 
+      this.formalNameLabel.AutoSize = true;
+      this.formalNameLabel.Location = new System.Drawing.Point(12, 9);
+      this.formalNameLabel.Name = "formalNameLabel";
+      this.formalNameLabel.Size = new System.Drawing.Size(72, 13);
+      this.formalNameLabel.TabIndex = 0;
+      this.formalNameLabel.Text = "&Formal Name:";
+      // 
+      // formalNameTextBox
+      // 
+      this.formalNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.formalNameTextBox.Location = new System.Drawing.Point(90, 6);
+      this.formalNameTextBox.Name = "formalNameTextBox";
+      this.formalNameTextBox.Size = new System.Drawing.Size(296, 20);
+      this.formalNameTextBox.TabIndex = 1;
+      this.formalNameTextBox.Text = "Name";
+      this.formalNameTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.formalNameTextBox_Validating);
+      // 
+      // descriptionLabel
+      // 
+      this.descriptionLabel.AutoSize = true;
+      this.descriptionLabel.Location = new System.Drawing.Point(12, 35);
+      this.descriptionLabel.Name = "descriptionLabel";
+      this.descriptionLabel.Size = new System.Drawing.Size(63, 13);
+      this.descriptionLabel.TabIndex = 2;
+      this.descriptionLabel.Text = "&Description:";
+      // 
+      // descriptionTextBox
+      // 
+      this.descriptionTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.descriptionTextBox.Location = new System.Drawing.Point(90, 32);
+      this.descriptionTextBox.Multiline = true;
+      this.descriptionTextBox.Name = "descriptionTextBox";
+      this.descriptionTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+      this.descriptionTextBox.Size = new System.Drawing.Size(296, 123);
+      this.descriptionTextBox.TabIndex = 3;
+      // 
+      // dataTypeLabel
+      // 
+      this.dataTypeLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.dataTypeLabel.AutoSize = true;
+      this.dataTypeLabel.Location = new System.Drawing.Point(12, 164);
+      this.dataTypeLabel.Name = "dataTypeLabel";
+      this.dataTypeLabel.Size = new System.Drawing.Size(60, 13);
+      this.dataTypeLabel.TabIndex = 4;
+      this.dataTypeLabel.Text = "Data &Type:";
+      // 
+      // kindLabel
+      // 
+      this.kindLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.kindLabel.AutoSize = true;
+      this.kindLabel.Location = new System.Drawing.Point(12, 188);
+      this.kindLabel.Name = "kindLabel";
+      this.kindLabel.Size = new System.Drawing.Size(72, 13);
+      this.kindLabel.TabIndex = 7;
+      this.kindLabel.Text = "Variable &Kind:";
+      // 
+      // kindNewCheckBox
+      // 
+      this.kindNewCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.kindNewCheckBox.AutoSize = true;
+      this.kindNewCheckBox.Location = new System.Drawing.Point(90, 187);
+      this.kindNewCheckBox.Name = "kindNewCheckBox";
+      this.kindNewCheckBox.Size = new System.Drawing.Size(48, 17);
+      this.kindNewCheckBox.TabIndex = 8;
+      this.kindNewCheckBox.Text = "&New";
+      this.kindNewCheckBox.UseVisualStyleBackColor = true;
+      // 
+      // kindInCheckBox
+      // 
+      this.kindInCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.kindInCheckBox.AutoSize = true;
+      this.kindInCheckBox.Checked = true;
+      this.kindInCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
+      this.kindInCheckBox.Location = new System.Drawing.Point(144, 187);
+      this.kindInCheckBox.Name = "kindInCheckBox";
+      this.kindInCheckBox.Size = new System.Drawing.Size(35, 17);
+      this.kindInCheckBox.TabIndex = 9;
+      this.kindInCheckBox.Text = "&In";
+      this.kindInCheckBox.UseVisualStyleBackColor = true;
+      // 
+      // kindOutCheckBox
+      // 
+      this.kindOutCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.kindOutCheckBox.AutoSize = true;
+      this.kindOutCheckBox.Location = new System.Drawing.Point(185, 187);
+      this.kindOutCheckBox.Name = "kindOutCheckBox";
+      this.kindOutCheckBox.Size = new System.Drawing.Size(43, 17);
+      this.kindOutCheckBox.TabIndex = 10;
+      this.kindOutCheckBox.Text = "&Out";
+      this.kindOutCheckBox.UseVisualStyleBackColor = true;
+      // 
+      // kindDeletedCheckBox
+      // 
+      this.kindDeletedCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.kindDeletedCheckBox.AutoSize = true;
+      this.kindDeletedCheckBox.Location = new System.Drawing.Point(234, 187);
+      this.kindDeletedCheckBox.Name = "kindDeletedCheckBox";
+      this.kindDeletedCheckBox.Size = new System.Drawing.Size(63, 17);
+      this.kindDeletedCheckBox.TabIndex = 11;
+      this.kindDeletedCheckBox.Text = "&Deleted";
+      this.kindDeletedCheckBox.UseVisualStyleBackColor = true;
+      // 
+      // dataTypeTextBox
+      // 
+      this.dataTypeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dataTypeTextBox.Location = new System.Drawing.Point(90, 161);
+      this.dataTypeTextBox.Name = "dataTypeTextBox";
+      this.dataTypeTextBox.ReadOnly = true;
+      this.dataTypeTextBox.Size = new System.Drawing.Size(247, 20);
+      this.dataTypeTextBox.TabIndex = 6;
+      this.dataTypeTextBox.Text = "HeuristicLab.Data.BoolData";
+      // 
+      // setDataTypeButton
+      // 
+      this.setDataTypeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.setDataTypeButton.Location = new System.Drawing.Point(343, 161);
+      this.setDataTypeButton.Name = "setDataTypeButton";
+      this.setDataTypeButton.Size = new System.Drawing.Size(43, 20);
+      this.setDataTypeButton.TabIndex = 5;
+      this.setDataTypeButton.Text = "&Set...";
+      this.setDataTypeButton.UseVisualStyleBackColor = true;
+      this.setDataTypeButton.Click += new System.EventHandler(this.setDataTypeButton_Click);
+      // 
+      // AddVariableInfoDialog
+      // 
+      this.AcceptButton = this.okButton;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.CancelButton = this.cancelButton;
+      this.ClientSize = new System.Drawing.Size(398, 245);
+      this.Controls.Add(this.setDataTypeButton);
+      this.Controls.Add(this.kindDeletedCheckBox);
+      this.Controls.Add(this.kindOutCheckBox);
+      this.Controls.Add(this.kindInCheckBox);
+      this.Controls.Add(this.kindNewCheckBox);
+      this.Controls.Add(this.descriptionTextBox);
+      this.Controls.Add(this.dataTypeTextBox);
+      this.Controls.Add(this.formalNameTextBox);
+      this.Controls.Add(this.kindLabel);
+      this.Controls.Add(this.dataTypeLabel);
+      this.Controls.Add(this.descriptionLabel);
+      this.Controls.Add(this.formalNameLabel);
+      this.Controls.Add(this.cancelButton);
+      this.Controls.Add(this.okButton);
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "AddVariableInfoDialog";
+      this.ShowIcon = false;
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "Add Variable Info";
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button cancelButton;
+    private System.Windows.Forms.Button okButton;
+    private System.Windows.Forms.Label formalNameLabel;
+    private System.Windows.Forms.TextBox formalNameTextBox;
+    private System.Windows.Forms.Label descriptionLabel;
+    private System.Windows.Forms.TextBox descriptionTextBox;
+    private System.Windows.Forms.Label dataTypeLabel;
+    private System.Windows.Forms.Label kindLabel;
+    private System.Windows.Forms.CheckBox kindNewCheckBox;
+    private System.Windows.Forms.CheckBox kindInCheckBox;
+    private System.Windows.Forms.CheckBox kindOutCheckBox;
+    private System.Windows.Forms.CheckBox kindDeletedCheckBox;
+    private System.Windows.Forms.TextBox dataTypeTextBox;
+    private System.Windows.Forms.Button setDataTypeButton;
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/3.3/AddVariableInfoDialog.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/AddVariableInfoDialog.cs	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/AddVariableInfoDialog.cs	(revision 1670)
@@ -0,0 +1,79 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// Dialog to add a variable info.
+  /// </summary>
+  public partial class AddVariableInfoDialog : Form {
+    private IVariableInfo myVariableInfo;
+    /// <summary>
+    /// Gets the current variable info.
+    /// </summary>
+    public IVariableInfo VariableInfo {
+      get { return myVariableInfo; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="AddVariableInfoDialog"/>.
+    /// </summary>
+    public AddVariableInfoDialog() {
+      InitializeComponent();
+      dataTypeTextBox.Text = typeof(BoolData).FullName;
+      dataTypeTextBox.Tag = typeof(BoolData);
+    }
+
+    private void formalNameTextBox_Validating(object sender, CancelEventArgs e) {
+      if (formalNameTextBox.Text == "")
+        e.Cancel = true;
+    }
+
+    private void setDataTypeButton_Click(object sender, EventArgs e) {
+      ChooseTypeDialog dialog = new ChooseTypeDialog();
+      dialog.Caption = "Set Data Type";
+      if (dialog.ShowDialog(this) == DialogResult.OK) {
+        dataTypeTextBox.Text = dialog.Type.FullName;
+        dataTypeTextBox.Tag = dialog.Type;
+      }
+      dialog.Dispose();
+    }
+
+    private void okButton_Click(object sender, EventArgs e) {
+      VariableKind kind = VariableKind.None;
+      if (kindNewCheckBox.Checked) kind = kind | VariableKind.New;
+      if (kindInCheckBox.Checked) kind = kind | VariableKind.In;
+      if (kindOutCheckBox.Checked) kind = kind | VariableKind.Out;
+      if (kindDeletedCheckBox.Checked) kind = kind | VariableKind.Deleted;
+
+      myVariableInfo = new VariableInfo(formalNameTextBox.Text, descriptionTextBox.Text, (Type)dataTypeTextBox.Tag, kind);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/3.3/AddVariableInfoDialog.resx
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/AddVariableInfoDialog.resx	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/AddVariableInfoDialog.resx	(revision 1670)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Operators/3.3/CombinedOperator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/CombinedOperator.cs	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/CombinedOperator.cs	(revision 1670)
@@ -0,0 +1,169 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// Contains an operator graph and automatically injects its sub-operators into the scope it is 
+  /// applied on (useful for modularization to assemble complex operators out of simpler ones).
+  /// </summary>
+  public class CombinedOperator : DelegatingOperator {
+    private string myDescription;
+    /// <summary>
+    /// Gets the description of the current instance.
+    /// </summary>
+    public override string Description {
+      get { return myDescription; }
+    }
+    private IOperatorGraph myOperatorGraph;
+    /// <summary>
+    /// Gets the operator graph of the current instance.
+    /// </summary>
+    public IOperatorGraph OperatorGraph {
+      get { return myOperatorGraph; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="CombinedOperator"/>.
+    /// </summary>
+    public CombinedOperator()
+      : base() {
+      myDescription =
+        @"A combined operator contains a whole operator graph. It is useful for modularization to assemble complex operators out of simpler ones.
+
+A combined operator automatically inject its sub-operators into the scope it is applied on. Thereby the names of the sub-operators are used as variable names. Those operators can be extracted again in the contained operator graph by using an OperatorExtractor. So it is possible to parameterize a combined operator with custom operators.";
+      myOperatorGraph = new OperatorGraph();
+    }
+
+    /// <summary>
+    /// Sets the description of the current instance.
+    /// </summary>
+    /// <remarks>Calls <see cref="OnDescriptionChanged"/>.</remarks>
+    /// <exception cref="NullReferenceException">Thrown when <paramref name="description"/> is <c>null</c>.</exception>
+    /// <param name="description">The description to set.</param>
+    public void SetDescription(string description) {
+      if (description == null)
+        throw new NullReferenceException("description must not be null");
+
+      if (description != myDescription) {
+        myDescription = description;
+        OnDescriptionChanged();
+      }
+    }
+
+    /// <summary>
+    /// Clones the current instance (deep clone).
+    /// </summary>
+    /// <remarks>Calls <see cref="OperatorBase.Clone
+    /// (System.Collections.Generic.IDictionary&lt;System.Guid, object&gt;)"/> 
+    /// of base class <see cref="DelegatingOperator"/>.<br/>
+    /// Deep clone through <see cref="Auxiliary.Clone"/> method of helper class 
+    /// <see cref="Auxiliary"/>.</remarks>
+    /// <param name="clonedObjects">Dictionary of all already cloned objects. (Needed to avoid cycles.)</param>
+    /// <returns>The cloned object as <see cref="CombinedOperator"/>.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      CombinedOperator clone = (CombinedOperator)base.Clone(clonedObjects);
+      clone.myDescription = Description;
+      clone.myOperatorGraph = (IOperatorGraph)Auxiliary.Clone(OperatorGraph, clonedObjects);
+      return clone;
+    }
+
+    /// <summary>
+    /// Adds all sub operators to the specified <paramref name="scope"/>.
+    /// </summary>
+    /// <param name="scope">The scope where to inject the sub operators.</param>
+    /// <returns><c>null</c> if the initial operator is <c>nulll</c>, else a new 
+    /// <see cref="AtomicOperation"/> with the initial operator and the given <paramref name="scope"/>.</returns>
+    public override IOperation Apply(IScope scope) {
+      if (OperatorGraph.InitialOperator != null) {
+        for (int i = 0; i < SubOperators.Count; i++) {
+          if (scope.GetVariable(SubOperators[i].Name) != null)
+            scope.RemoveVariable(SubOperators[i].Name);
+          scope.AddVariable(new Variable(SubOperators[i].Name, SubOperators[i]));
+        }
+        return new AtomicOperation(OperatorGraph.InitialOperator, scope);
+      } else {
+        return null;
+      }
+    }
+
+    /// <summary>
+    /// Creates a new instance of <see cref="CombinedOperatorView"/> to display the current instance.
+    /// </summary>
+    /// <returns>The created view as <see cref="CombinedOperatorView"/>.</returns>
+    public override IView CreateView() {
+      return new CombinedOperatorView(this);
+    }
+
+    /// <summary>
+    /// Occurs when the description of the current instance has been changed.
+    /// </summary>
+    public event EventHandler DescriptionChanged;
+    /// <summary>
+    /// Fires a new <c>DescriptionChanged</c> event.
+    /// </summary>
+    protected virtual void OnDescriptionChanged() {
+      if (DescriptionChanged != null)
+        DescriptionChanged(this, new EventArgs());
+    }
+
+    #region Persistence Methods
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>The description and the operator graph of the current instance are saved as child 
+    /// nodes with tag names <c>Description</c> <c>OperatorGraph</c>.<br/>
+    /// Calls <see cref="OperatorBase.GetXmlNode"/> of base class <see cref="DelegatingOperator"/>.</remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where to save the data.</param>
+    /// <param name="persistedObjects">The dictionary of all already persisted objects. (Needed to avoid cycles.)</param>
+    /// <returns>The saved <see cref="XmlNode"/>.</returns>
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlNode descriptionNode = document.CreateNode(XmlNodeType.Element, "Description", null);
+      descriptionNode.InnerText = myDescription;
+      node.AppendChild(descriptionNode);
+      node.AppendChild(PersistenceManager.Persist("OperatorGraph", OperatorGraph, document, persistedObjects));
+      return node;
+    }
+    /// <summary>
+    /// Loads the persisted instance from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="OperatorBase.Populate"/> of base class <see cref="DelegatingOperator"/>.
+    /// <br/> See <see cref="GetXmlNode"/> for further information on how the data must be saved.</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the operator is saved.</param>
+    /// <param name="restoredObjects">The dictionary of all already restored objects. 
+    /// (Needed to avoid cycles.)</param>
+    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      XmlNode descriptionNode = node.SelectSingleNode("Description");
+      if (descriptionNode != null) myDescription = descriptionNode.InnerText;
+      myOperatorGraph = (IOperatorGraph)PersistenceManager.Restore(node.SelectSingleNode("OperatorGraph"), restoredObjects);
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/3.3/CombinedOperatorView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/CombinedOperatorView.Designer.cs	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/CombinedOperatorView.Designer.cs	(revision 1670)
@@ -0,0 +1,252 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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
+
+namespace HeuristicLab.Operators {
+  partial class CombinedOperatorView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.operatorGraphTabPage = new System.Windows.Forms.TabPage();
+      this.operatorGraphView = new HeuristicLab.Core.OperatorGraphView();
+      this.variableInfosTabPage = new System.Windows.Forms.TabPage();
+      this.operatorBaseVariableInfosView = new HeuristicLab.Core.OperatorBaseVariableInfosView();
+      this.variablesTabPage = new System.Windows.Forms.TabPage();
+      this.operatorBaseVariablesView = new HeuristicLab.Core.OperatorBaseVariablesView();
+      this.constraintsTabPage = new System.Windows.Forms.TabPage();
+      this.constrainedItemBaseView = new HeuristicLab.Core.ConstrainedItemBaseView();
+      this.descriptionTabPage = new System.Windows.Forms.TabPage();
+      this.descriptionTextBox = new System.Windows.Forms.TextBox();
+      this.removeVariableInfoButton = new System.Windows.Forms.Button();
+      this.addVariableInfoButton = new System.Windows.Forms.Button();
+      this.tabControl.SuspendLayout();
+      this.operatorGraphTabPage.SuspendLayout();
+      this.variableInfosTabPage.SuspendLayout();
+      this.variablesTabPage.SuspendLayout();
+      this.constraintsTabPage.SuspendLayout();
+      this.descriptionTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // tabControl
+      // 
+      this.tabControl.Controls.Add(this.operatorGraphTabPage);
+      this.tabControl.Controls.Add(this.variableInfosTabPage);
+      this.tabControl.Controls.Add(this.variablesTabPage);
+      this.tabControl.Controls.Add(this.constraintsTabPage);
+      this.tabControl.Controls.Add(this.descriptionTabPage);
+      this.tabControl.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.tabControl.Location = new System.Drawing.Point(0, 0);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(397, 335);
+      this.tabControl.TabIndex = 0;
+      // 
+      // operatorGraphTabPage
+      // 
+      this.operatorGraphTabPage.Controls.Add(this.operatorGraphView);
+      this.operatorGraphTabPage.Location = new System.Drawing.Point(4, 22);
+      this.operatorGraphTabPage.Name = "operatorGraphTabPage";
+      this.operatorGraphTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.operatorGraphTabPage.Size = new System.Drawing.Size(389, 309);
+      this.operatorGraphTabPage.TabIndex = 0;
+      this.operatorGraphTabPage.Text = "Operator Graph";
+      this.operatorGraphTabPage.UseVisualStyleBackColor = true;
+      // 
+      // operatorGraphView
+      // 
+      this.operatorGraphView.Caption = "Operator Graph";
+      this.operatorGraphView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorGraphView.Location = new System.Drawing.Point(3, 3);
+      this.operatorGraphView.Name = "operatorGraphView";
+      this.operatorGraphView.OperatorGraph = null;
+      this.operatorGraphView.Size = new System.Drawing.Size(383, 303);
+      this.operatorGraphView.TabIndex = 0;
+      // 
+      // variableInfosTabPage
+      // 
+      this.variableInfosTabPage.Controls.Add(this.removeVariableInfoButton);
+      this.variableInfosTabPage.Controls.Add(this.addVariableInfoButton);
+      this.variableInfosTabPage.Controls.Add(this.operatorBaseVariableInfosView);
+      this.variableInfosTabPage.Location = new System.Drawing.Point(4, 22);
+      this.variableInfosTabPage.Name = "variableInfosTabPage";
+      this.variableInfosTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.variableInfosTabPage.Size = new System.Drawing.Size(389, 309);
+      this.variableInfosTabPage.TabIndex = 1;
+      this.variableInfosTabPage.Text = "Variable Infos";
+      this.variableInfosTabPage.UseVisualStyleBackColor = true;
+      // 
+      // operatorBaseVariableInfosView
+      // 
+      this.operatorBaseVariableInfosView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.operatorBaseVariableInfosView.Caption = "Operator";
+      this.operatorBaseVariableInfosView.Location = new System.Drawing.Point(3, 3);
+      this.operatorBaseVariableInfosView.Name = "operatorBaseVariableInfosView";
+      this.operatorBaseVariableInfosView.Operator = null;
+      this.operatorBaseVariableInfosView.Size = new System.Drawing.Size(383, 274);
+      this.operatorBaseVariableInfosView.TabIndex = 0;
+      this.operatorBaseVariableInfosView.SelectedVariableInfosChanged += new System.EventHandler(this.operatorBaseVariableInfosView_SelectedVariableInfosChanged);
+      // 
+      // variablesTabPage
+      // 
+      this.variablesTabPage.Controls.Add(this.operatorBaseVariablesView);
+      this.variablesTabPage.Location = new System.Drawing.Point(4, 22);
+      this.variablesTabPage.Name = "variablesTabPage";
+      this.variablesTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.variablesTabPage.Size = new System.Drawing.Size(389, 309);
+      this.variablesTabPage.TabIndex = 2;
+      this.variablesTabPage.Text = "Local Variables";
+      this.variablesTabPage.UseVisualStyleBackColor = true;
+      // 
+      // operatorBaseVariablesView
+      // 
+      this.operatorBaseVariablesView.Caption = "Operator";
+      this.operatorBaseVariablesView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorBaseVariablesView.Location = new System.Drawing.Point(3, 3);
+      this.operatorBaseVariablesView.Name = "operatorBaseVariablesView";
+      this.operatorBaseVariablesView.Operator = null;
+      this.operatorBaseVariablesView.Size = new System.Drawing.Size(383, 303);
+      this.operatorBaseVariablesView.TabIndex = 0;
+      // 
+      // constraintsTabPage
+      // 
+      this.constraintsTabPage.Controls.Add(this.constrainedItemBaseView);
+      this.constraintsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.constraintsTabPage.Name = "constraintsTabPage";
+      this.constraintsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.constraintsTabPage.Size = new System.Drawing.Size(389, 309);
+      this.constraintsTabPage.TabIndex = 3;
+      this.constraintsTabPage.Text = "Constraints";
+      this.constraintsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // constrainedItemBaseView
+      // 
+      this.constrainedItemBaseView.Caption = "Constrained Item";
+      this.constrainedItemBaseView.ConstrainedItem = null;
+      this.constrainedItemBaseView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.constrainedItemBaseView.Location = new System.Drawing.Point(3, 3);
+      this.constrainedItemBaseView.Name = "constrainedItemBaseView";
+      this.constrainedItemBaseView.Size = new System.Drawing.Size(383, 303);
+      this.constrainedItemBaseView.TabIndex = 0;
+      // 
+      // descriptionTabPage
+      // 
+      this.descriptionTabPage.Controls.Add(this.descriptionTextBox);
+      this.descriptionTabPage.Location = new System.Drawing.Point(4, 22);
+      this.descriptionTabPage.Name = "descriptionTabPage";
+      this.descriptionTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.descriptionTabPage.Size = new System.Drawing.Size(389, 309);
+      this.descriptionTabPage.TabIndex = 4;
+      this.descriptionTabPage.Text = "Description";
+      this.descriptionTabPage.UseVisualStyleBackColor = true;
+      // 
+      // descriptionTextBox
+      // 
+      this.descriptionTextBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.descriptionTextBox.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.descriptionTextBox.Location = new System.Drawing.Point(3, 3);
+      this.descriptionTextBox.Multiline = true;
+      this.descriptionTextBox.Name = "descriptionTextBox";
+      this.descriptionTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+      this.descriptionTextBox.Size = new System.Drawing.Size(383, 303);
+      this.descriptionTextBox.TabIndex = 0;
+      this.descriptionTextBox.Validated += new System.EventHandler(this.descriptionTextBox_Validated);
+      // 
+      // removeVariableInfoButton
+      // 
+      this.removeVariableInfoButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.removeVariableInfoButton.Enabled = false;
+      this.removeVariableInfoButton.Location = new System.Drawing.Point(84, 283);
+      this.removeVariableInfoButton.Name = "removeVariableInfoButton";
+      this.removeVariableInfoButton.Size = new System.Drawing.Size(75, 23);
+      this.removeVariableInfoButton.TabIndex = 2;
+      this.removeVariableInfoButton.Text = "&Remove";
+      this.removeVariableInfoButton.UseVisualStyleBackColor = true;
+      this.removeVariableInfoButton.Click += new System.EventHandler(this.removeVariableInfoButton_Click);
+      // 
+      // addVariableInfoButton
+      // 
+      this.addVariableInfoButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.addVariableInfoButton.Location = new System.Drawing.Point(3, 283);
+      this.addVariableInfoButton.Name = "addVariableInfoButton";
+      this.addVariableInfoButton.Size = new System.Drawing.Size(75, 23);
+      this.addVariableInfoButton.TabIndex = 1;
+      this.addVariableInfoButton.Text = "&Add...";
+      this.addVariableInfoButton.UseVisualStyleBackColor = true;
+      this.addVariableInfoButton.Click += new System.EventHandler(this.addVariableInfoButton_Click);
+      // 
+      // CombinedOperatorView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.tabControl);
+      this.Name = "CombinedOperatorView";
+      this.Size = new System.Drawing.Size(397, 335);
+      this.tabControl.ResumeLayout(false);
+      this.operatorGraphTabPage.ResumeLayout(false);
+      this.variableInfosTabPage.ResumeLayout(false);
+      this.variablesTabPage.ResumeLayout(false);
+      this.constraintsTabPage.ResumeLayout(false);
+      this.descriptionTabPage.ResumeLayout(false);
+      this.descriptionTabPage.PerformLayout();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TabControl tabControl;
+    private System.Windows.Forms.TabPage operatorGraphTabPage;
+    private System.Windows.Forms.TabPage variableInfosTabPage;
+    private System.Windows.Forms.TabPage variablesTabPage;
+    private System.Windows.Forms.TabPage constraintsTabPage;
+    private System.Windows.Forms.TabPage descriptionTabPage;
+    private System.Windows.Forms.TextBox descriptionTextBox;
+    private HeuristicLab.Core.OperatorGraphView operatorGraphView;
+    private HeuristicLab.Core.OperatorBaseVariableInfosView operatorBaseVariableInfosView;
+    private HeuristicLab.Core.OperatorBaseVariablesView operatorBaseVariablesView;
+    private HeuristicLab.Core.ConstrainedItemBaseView constrainedItemBaseView;
+    private System.Windows.Forms.Button removeVariableInfoButton;
+    private System.Windows.Forms.Button addVariableInfoButton;
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/3.3/CombinedOperatorView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/CombinedOperatorView.cs	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/CombinedOperatorView.cs	(revision 1670)
@@ -0,0 +1,132 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// The visual representation of a <see cref="CombinedOperator"/>.
+  /// </summary>
+  public partial class CombinedOperatorView : ViewBase {
+    /// <summary>
+    /// Gets or sets the combined operator to display.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>.
+    /// No own data storage present.</remarks>
+    public CombinedOperator CombinedOperator {
+      get { return (CombinedOperator)Item; }
+      set { base.Item = value; }
+    }
+
+    /// <summary>
+    /// Removes the eventhandlers in all children and from the underlying <see cref="CombinedOperator"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void RemoveItemEvents() {
+      operatorGraphView.OperatorGraph = null;
+      operatorBaseVariableInfosView.Operator = null;
+      operatorBaseVariablesView.Operator = null;
+      constrainedItemBaseView.ConstrainedItem = null;
+      CombinedOperator.DescriptionChanged -= new EventHandler(CombinedOperator_DescriptionChanged);
+      base.RemoveItemEvents();
+    }
+    
+    /// <summary>
+    /// Adds event handlers in all children and to the underlying <see cref="CombinedOperator"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      operatorGraphView.OperatorGraph = CombinedOperator.OperatorGraph;
+      operatorBaseVariableInfosView.Operator = CombinedOperator;
+      operatorBaseVariablesView.Operator = CombinedOperator;
+      constrainedItemBaseView.ConstrainedItem = CombinedOperator;
+      CombinedOperator.DescriptionChanged += new EventHandler(CombinedOperator_DescriptionChanged);
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="CombinedOperatorView"/>.
+    /// </summary>
+    public CombinedOperatorView() {
+      InitializeComponent();
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="CombinedOperatorView"/> with the specified 
+    /// <paramref name="combinedOperator"/>.
+    /// </summary>
+    /// <param name="combinedOperator">The combined operator to display.</param>
+    public CombinedOperatorView(CombinedOperator combinedOperator)
+      : this() {
+      CombinedOperator = combinedOperator;
+    }
+
+    /// <summary>
+    /// Updates all controls with the latest data of the model.
+    /// </summary>
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (CombinedOperator == null) {
+        descriptionTextBox.Text = "";
+        descriptionTextBox.Enabled = false;
+      } else {
+        descriptionTextBox.Text = CombinedOperator.Description;
+        descriptionTextBox.Enabled = true;
+      }
+    }
+
+    private void CombinedOperator_DescriptionChanged(object sender, EventArgs e) {
+      descriptionTextBox.Text = CombinedOperator.Description;
+    }
+    private void descriptionTextBox_Validated(object sender, EventArgs e) {
+      CombinedOperator.SetDescription(descriptionTextBox.Text);
+    }
+
+    private void operatorBaseVariableInfosView_SelectedVariableInfosChanged(object sender, EventArgs e) {
+      removeVariableInfoButton.Enabled = operatorBaseVariableInfosView.SelectedVariableInfos.Count > 0;
+    }
+
+    #region Click Events
+    private void addVariableInfoButton_Click(object sender, EventArgs e) {
+      AddVariableInfoDialog dialog = new AddVariableInfoDialog();
+      if (dialog.ShowDialog(this) == DialogResult.OK) {
+        if (CombinedOperator.GetVariableInfo(dialog.VariableInfo.FormalName) != null)
+          Auxiliary.ShowErrorMessageBox("A variable info with the same formal name already exists.");
+        else
+          CombinedOperator.AddVariableInfo(dialog.VariableInfo);
+      }
+      dialog.Dispose();
+    }
+    private void removeVariableInfoButton_Click(object sender, EventArgs e) {
+      IVariableInfo[] selected = new IVariableInfo[operatorBaseVariableInfosView.SelectedVariableInfos.Count];
+      operatorBaseVariableInfosView.SelectedVariableInfos.CopyTo(selected, 0);
+      for (int i = 0; i < selected.Length; i++)
+        CombinedOperator.RemoveVariableInfo(selected[i].FormalName);
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/3.3/CombinedOperatorView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/CombinedOperatorView.resx	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/CombinedOperatorView.resx	(revision 1670)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Operators/3.3/ComparatorBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/ComparatorBase.cs	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/ComparatorBase.cs	(revision 1670)
@@ -0,0 +1,78 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// Base class for operators which perform comparisons between two items.
+  /// </summary>
+  public abstract class ComparatorBase : OperatorBase {
+    /// <summary>
+    /// Initializes a new instance of <see cref="ComparatorBase"/> with three 
+    /// variable infos (<c>LeftSide</c>, <c>RightSide</c> and <c>Result</c>).
+    /// </summary>
+    protected ComparatorBase() {
+      AddVariableInfo(new VariableInfo("LeftSide", "Variable on the left side of the comparison", typeof(IItem), VariableKind.In));
+      AddVariableInfo(new VariableInfo("RightSide", "Variable on the right side of the comparison", typeof(IItem), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Result", "Result of the comparison", typeof(BoolData), VariableKind.Out | VariableKind.New));
+    }
+
+    /// <summary>
+    /// Compares two items with each other and injects the <c>Result</c> variable - if it is no local one - into
+    /// the specified <paramref name="scope"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="Compare"/>.</remarks>
+    /// <exception cref="InvalidOperationException">Thrown when left side of the comparison does not
+    /// implement <see cref="IComparable"/>.</exception>
+    /// <param name="scope">The scope where to apply the compare operation.</param>
+    /// <returns><c>null</c>.</returns>
+    public override IOperation Apply(IScope scope) {
+      BoolData result = GetVariableValue<BoolData>("Result", scope, false, false);
+      if (result == null) {
+        result = new BoolData(true);
+        IVariableInfo info = GetVariableInfo("Result");
+        if (info.Local)
+          AddVariable(new Variable(info.ActualName, result));
+        else
+          scope.AddVariable(new Variable(scope.TranslateName(info.FormalName), result));
+      }
+      IItem leftSide = GetVariableValue<IItem>("LeftSide", scope, true);
+      if (!(leftSide is IComparable)) throw new InvalidOperationException("Comparator: Left side needs to be of type IComparable");
+      IComparable left = (IComparable)leftSide;
+      IItem rightSide = GetVariableValue<IItem>("RightSide", scope, true);
+      result.Data = Compare(left, rightSide);
+      return null;
+    }
+
+    /// <summary>
+    /// Compares two variables with each other.
+    /// </summary>
+    /// <param name="left">The variable on the left side of the comparison.</param>
+    /// <param name="right">The variable on the right side of the comparison.</param>
+    /// <returns><c>true</c> if the comparison query was successful, <c>false</c> otherwise.</returns>
+    protected abstract bool Compare(IComparable left, IItem right);
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/3.3/ConditionalBranch.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/ConditionalBranch.cs	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/ConditionalBranch.cs	(revision 1670)
@@ -0,0 +1,69 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// Branch of (one or)two operators whose executions depend on a specific condition.
+  /// </summary>
+  public class ConditionalBranch : OperatorBase {
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get { return @"ConditionalBranch expects to have 1 or 2 sub-operators.
+It will return the 1st sub-operator if ""Condition"" is true and the 2nd sub-operator if ""Condition"" equals to false.
+
+In case a 2nd sub-operator does not exist and ""Condition"" would equal to false, Conditional Branch will not return a new operation."; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ConditionalBranch"/> with one variable info 
+    /// (<c>Condition</c>).
+    /// </summary>
+    public ConditionalBranch()
+      : base() {
+      AddVariableInfo(new VariableInfo("Condition", "A boolean variable that decides the branch", typeof(BoolData), VariableKind.In));
+    }
+
+    /// <summary>
+    /// Applies the operator of branch one under a specific condition on the given 
+    /// <paramref name="scope"/>, or - if existent - operator of branch two if the condition could not
+    /// be fulfilled. 
+    /// </summary>
+    /// <param name="scope">The scope to apply the operators on.</param>
+    /// <returns>A new <see cref="AtomicOperation"/> with either operator 1 or operator 2 applied
+    /// to the given <paramref name="scope"/> or <c>null</c>.</returns>
+    public override IOperation Apply(IScope scope) {
+      BoolData resultData = GetVariableValue<BoolData>("Condition", scope, true);
+      bool result = resultData.Data;
+
+      if ((result) && (SubOperators.Count > 0) && (SubOperators[0] != null))
+        return new AtomicOperation(SubOperators[0], scope);
+      else if ((!result) && (SubOperators.Count > 1) && (SubOperators[1] != null))
+        return new AtomicOperation(SubOperators[1], scope);
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/3.3/Counter.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/Counter.cs	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/Counter.cs	(revision 1670)
@@ -0,0 +1,59 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// Class to increment an int variable by 1.
+  /// </summary>
+  public class Counter : OperatorBase {
+    /// <summary>
+    /// Gets the description of the current instance.
+    /// </summary>
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="Counter"/> with one variable info (<c>Value</c>).
+    /// </summary>
+    public Counter()
+      : base() {
+      AddVariableInfo(new VariableInfo("Value", "Counter value", typeof(IntData), VariableKind.In | VariableKind.Out));
+    }
+
+    /// <summary>
+    /// Increments an int value of the specified <paramref name="scope"/> by one.
+    /// </summary>
+    /// <param name="scope">The scope whose variable should be incremented.</param>
+    /// <returns><c>null</c>.</returns>
+    public override IOperation Apply(IScope scope) {
+      IntData value = GetVariableValue<IntData>("Value", scope, true);
+      value.Data++;
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/3.3/DataCollector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/DataCollector.cs	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/DataCollector.cs	(revision 1670)
@@ -0,0 +1,75 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// Collects values of specific variable names in a given scope.
+  /// </summary>
+  public class DataCollector : OperatorBase {
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="DataCollector"/> with two variable infos 
+    /// (<c>VariableNames</c> and <c>Values</c>).
+    /// </summary>
+    public DataCollector() {
+      IVariableInfo variableNamesVariableInfo = new VariableInfo("VariableNames", "Names of variables whose values should be collected", typeof(ItemList<StringData>), VariableKind.In);
+      variableNamesVariableInfo.Local = true;
+      AddVariableInfo(variableNamesVariableInfo);
+      ItemList<StringData> variableNames = new ItemList<StringData>();
+      AddVariable(new Variable("VariableNames", variableNames));
+      AddVariableInfo(new VariableInfo("Values", "Collected values", typeof(ItemList), VariableKind.New | VariableKind.In | VariableKind.Out));
+    }
+
+    /// <summary>
+    /// Collects the values of a specified list of variable names in the given <paramref name="scope"/>.
+    /// </summary>
+    /// <param name="scope">The scope where to collect the values from.</param>
+    /// <returns><c>null</c>.</returns>
+    public override IOperation Apply(IScope scope) {
+      ItemList<StringData> names = GetVariableValue<ItemList<StringData>>("VariableNames", scope, false);
+      ItemList values = GetVariableValue<ItemList>("Values", scope, true, false);
+      if (values == null) {
+        values = new ItemList();
+        IVariableInfo info = GetVariableInfo("Values");
+        if (info.Local)
+          AddVariable(new Variable(info.ActualName, values));
+        else
+          scope.AddVariable(new Variable(scope.TranslateName(info.FormalName), values));
+      }
+
+      ItemList currentValues = new ItemList();
+      for (int i = 0; i < names.Count; i++)
+        currentValues.Add((IItem)scope.GetVariableValue(names[i].Data, true).Clone());
+      values.Add(currentValues);
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/3.3/DelegatingOperator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/DelegatingOperator.cs	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/DelegatingOperator.cs	(revision 1670)
@@ -0,0 +1,78 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// Base class for operators that call other operators.
+  /// </summary>
+  public abstract class DelegatingOperator : OperatorBase {
+    /// <summary>
+    /// Executes the specified operator in the given <paramref name="scope"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="OperatorBase.OnExecuted"/>.<br/>
+    /// Will be executed two times: First to execute the operation where the local variables 
+    /// are added to the global scope and a second time to remove the local variables again.</remarks>
+    /// <param name="scope">The scope where to apply the operation.</param>
+    /// <returns><c>null</c>.</returns>
+    public override IOperation Execute(IScope scope) {
+      myCanceled = false;
+
+      if(scope.GetVariable(Guid.ToString()) == null) { // contained operator not yet executed
+        // add marker
+        scope.AddVariable(new Variable(Guid.ToString(), new NullData()));
+
+        // add aliases and local variables
+        foreach (IVariableInfo variableInfo in VariableInfos) {
+          scope.AddAlias(variableInfo.FormalName, variableInfo.ActualName);
+          if (variableInfo.Local)
+            scope.AddVariable(GetVariable(variableInfo.ActualName));
+        }
+
+        CompositeOperation next = new CompositeOperation();
+        next.AddOperation(Apply(scope));
+        // execute combined operator again after contained operators have been executed
+        next.AddOperation(new AtomicOperation(this, scope));
+
+        OnExecuted();
+        return next;
+      } else {  // contained operator already executed
+        // remove marker
+        scope.RemoveVariable(Guid.ToString());
+
+        // remove aliases and local variables
+        foreach (IVariableInfo variableInfo in VariableInfos) {
+          scope.RemoveAlias(variableInfo.FormalName);
+          if (variableInfo.Local)
+            scope.RemoveVariable(variableInfo.ActualName);
+        }
+
+        OnExecuted();
+        return null;
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/3.3/DoubleCounter.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/DoubleCounter.cs	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/DoubleCounter.cs	(revision 1670)
@@ -0,0 +1,62 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// Class to add a specified interval to a double value.
+  /// </summary>
+  public class DoubleCounter : OperatorBase {
+    /// <summary>
+    /// Gets the description of the current instance.
+    /// </summary>
+    public override string Description {
+      get { return @"Adds a given interval to a double value"; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="DoubleCounter"/>, including two variable infos 
+    /// (<c>Value</c> and <c>Interval</c>).
+    /// </summary>
+    public DoubleCounter()
+      : base() {
+      AddVariableInfo(new VariableInfo("Value", "Counter value", typeof(DoubleData), VariableKind.In | VariableKind.Out));
+      AddVariableInfo(new VariableInfo("Interval", "Interval value", typeof(DoubleData), VariableKind.In));
+    }
+
+    /// <summary>
+    /// Adds to a double value of the given <paramref name="scope"/> a specified interval.
+    /// </summary>
+    /// <param name="scope">The scope whose variable should be incremented.</param>
+    /// <returns><c>null</c>.</returns>
+    public override IOperation Apply(IScope scope) {
+      DoubleData value = GetVariableValue<DoubleData>("Value", scope, true);
+      double interval = GetVariableValue<DoubleData>("Interval", scope, true).Data;
+      value.Data += interval;
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/3.3/EmptyOperator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/EmptyOperator.cs	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/EmptyOperator.cs	(revision 1670)
@@ -0,0 +1,53 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// Placeholder and also used for testing; Does nothing.
+  /// </summary>
+  public class EmptyOperator : OperatorBase {
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get { return "An empty operator just does nothing. Useful for testing and as a place holder for sub-operators of SequentialSubScopesProcessor and ParallelSubScopesProcessor."; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="EmptyOperator"/>.
+    /// </summary>
+    public EmptyOperator()
+      : base() {
+    }
+
+    /// <summary>
+    /// Does nothing.
+    /// </summary>
+    /// <param name="scope">The scope to apply the operator on.</param>
+    /// <returns><c>null</c>.</returns>
+    public override IOperation Apply(IScope scope) {
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/3.3/EqualToComparator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/EqualToComparator.cs	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/EqualToComparator.cs	(revision 1670)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// Operator to check whether two items are equal to each other.
+  /// </summary>
+  public class EqualToComparator : ComparatorBase {
+
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="EqualToComparator"/>.
+    /// </summary>
+    public EqualToComparator()
+      : base() {
+    }
+
+    /// <summary>
+    /// Checks whether the two specified items are equal to each other.
+    /// </summary>
+    /// <param name="left">The left side of the comparison.</param>
+    /// <param name="right">The right side of the comparison.</param>
+    /// <returns><c>true</c> if the two elements are equal to each other, <c>false otherwise</c>.</returns>
+    protected override bool Compare(IComparable left, IItem right) {
+      return left.CompareTo(right) == 0;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/3.3/GreaterOrEqualThanComparator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/GreaterOrEqualThanComparator.cs	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/GreaterOrEqualThanComparator.cs	(revision 1670)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// Operator to check whether one item is equal or greater than another.
+  /// </summary>
+  public class GreaterOrEqualThanComparator : ComparatorBase {
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="GreaterOrEqualThanComparator"/>.
+    /// </summary>
+    public GreaterOrEqualThanComparator()
+      : base() {
+    }
+
+    /// <summary>
+    /// Checks whether the <paramref name="left"/> item is greater or equal to the <paramref name="right"/>.
+    /// </summary>
+    /// <param name="left">The left side of the comparison.</param>
+    /// <param name="right">The right side of the comparison.</param>
+    /// <returns><c>true</c> if the <paramref name="left"/> item is greater or equal to the 
+    /// <paramref name="right"/>, <c>false</c> otherwise.</returns>
+    protected override bool Compare(IComparable left, IItem right) {
+      return left.CompareTo(right) >= 0;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/3.3/GreaterThanComparator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/GreaterThanComparator.cs	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/GreaterThanComparator.cs	(revision 1670)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// Operator to check whether an item is greater than another one.
+  /// </summary>
+  public class GreaterThanComparator : ComparatorBase {
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="GreaterThanComparator"/>.
+    /// </summary>
+    public GreaterThanComparator()
+      : base() {
+    }
+
+    /// <summary>
+    /// Checks whether the <paramref name="left"/> item is greater than the <paramref name="right"/>.
+    /// </summary>
+    /// <param name="left">The left side of the comparison.</param>
+    /// <param name="right">The right side of the comparison.</param>
+    /// <returns><c>true</c> if the <paramref name="left"/> item is greater than the 
+    /// <paramref name="right"/>, <c>false</c> otherwise.</returns>
+    protected override bool Compare(IComparable left, IItem right) {
+      return left.CompareTo(right) > 0;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/3.3/HeuristicLab.Operators-3.2.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/HeuristicLab.Operators-3.2.csproj	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/HeuristicLab.Operators-3.2.csproj	(revision 1670)
@@ -0,0 +1,184 @@
+﻿<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{A9983BA2-B3B2-475E-8E2C-62050B71D1C5}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Operators</RootNamespace>
+    <AssemblyName>HeuristicLab.Operators-3.2</AssemblyName>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>
+    </DocumentationFile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>bin\Release\HeuristicLab.Operators-3.2.XML</DocumentationFile>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x86\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>bin\x86\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>bin\Release\HeuristicLab.Operators-3.2.XML</DocumentationFile>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x64\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>bin\x64\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>bin\Release\HeuristicLab.Operators-3.2.XML</DocumentationFile>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AddVariableInfoDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="AddVariableInfoDialog.Designer.cs">
+      <DependentUpon>AddVariableInfoDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="CombinedOperator.cs" />
+    <Compile Include="CombinedOperatorView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="CombinedOperatorView.Designer.cs">
+      <DependentUpon>CombinedOperatorView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ComparatorBase.cs" />
+    <Compile Include="ConditionalBranch.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="DelegatingOperator.cs" />
+    <Compile Include="DoubleCounter.cs" />
+    <Compile Include="ScopeCleaner.cs" />
+    <Compile Include="StochasticMultiBranch.cs" />
+    <Compile Include="SubScopesMixer.cs" />
+    <Compile Include="DataCollector.cs" />
+    <Compile Include="EqualToComparator.cs" />
+    <Compile Include="GreaterOrEqualThanComparator.cs" />
+    <Compile Include="GreaterThanComparator.cs" />
+    <Compile Include="LessOrEqualThanComparator.cs" />
+    <Compile Include="LessThanComparator.cs" />
+    <Compile Include="OperatorExtractor.cs" />
+    <Compile Include="ParallelProcessor.cs" />
+    <Compile Include="EmptyOperator.cs" />
+    <Compile Include="SequentialProcessor.cs" />
+    <Compile Include="SingleObjectiveEvaluatorBase.cs" />
+    <Compile Include="Sorter.cs" />
+    <Compile Include="StochasticBranch.cs" />
+    <Compile Include="SubScopesRemover.cs" />
+    <Compile Include="UnequalToComparator.cs" />
+    <Compile Include="UniformSequentialSubScopesProcessor.cs" />
+    <Compile Include="UniformParallelSubScopesProcessor.cs" />
+    <Compile Include="ParallelSubScopesProcessor.cs" />
+    <Compile Include="SequentialSubScopesProcessor.cs" />
+    <Compile Include="SubScopesCreater.cs" />
+    <Compile Include="Counter.cs" />
+    <Compile Include="HeuristicLabOperatorsPlugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="VariableInjector.cs" />
+    <Compile Include="VariableInjectorView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="VariableInjectorView.Designer.cs">
+      <DependentUpon>VariableInjectorView.cs</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Constraints\3.2\HeuristicLab.Constraints-3.2.csproj">
+      <Project>{FCD62C6F-4793-4593-AE9A-0BDCA256EE99}</Project>
+      <Name>HeuristicLab.Constraints-3.2</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core\3.2\HeuristicLab.Core-3.2.csproj">
+      <Project>{F43B59AB-2B8C-4570-BC1E-15592086517C}</Project>
+      <Name>HeuristicLab.Core-3.2</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Data\3.2\HeuristicLab.Data-3.2.csproj">
+      <Project>{F473D9AF-3F09-4296-9F28-3C65118DAFFA}</Project>
+      <Name>HeuristicLab.Data-3.2</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Properties\AssemblyInfo.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="AddVariableInfoDialog.resx">
+      <DependentUpon>AddVariableInfoDialog.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="CombinedOperatorView.resx">
+      <DependentUpon>CombinedOperatorView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd</PreBuildEvent>
+  </PropertyGroup>
+</Project>
Index: /trunk/sources/HeuristicLab.Operators/3.3/HeuristicLabOperatorsPlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/HeuristicLabOperatorsPlugin.cs	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/HeuristicLabOperatorsPlugin.cs	(revision 1670)
@@ -0,0 +1,37 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// Plugin class for HeuristicLab.Operators plugin.
+  /// </summary>
+  [ClassInfo(Name = "HeuristicLab.Operators-3.2")]
+  [PluginFile(Filename = "HeuristicLab.Operators-3.2.dll", Filetype = PluginFileType.Assembly)]
+  [Dependency(Dependency = "HeuristicLab.Core-3.2")]
+  [Dependency(Dependency = "HeuristicLab.Data-3.2")]
+  public class HeuristicLabOperatorsPlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/3.3/LessOrEqualThanComparator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/LessOrEqualThanComparator.cs	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/LessOrEqualThanComparator.cs	(revision 1670)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// Operator to check whether an item is less or equal to another one.
+  /// </summary>
+  public class LessOrEqualThanComparator : ComparatorBase {
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="LessOrEqualThanComparator"/>.
+    /// </summary>
+    public LessOrEqualThanComparator()
+      : base() {
+    }
+
+    /// <summary>
+    /// Checks whether the <paramref name="left"/> item is less or equal to the <paramref name="right"/>. 
+    /// </summary>
+    /// <param name="left">The left side of the comparison.</param>
+    /// <param name="right">The right side of the comparison.</param>
+    /// <returns><c>true</c> if the <paramref name="left"/> item is less or equal to the 
+    /// <paramref name="right"/>, <c>false</c> otherwise.</returns>
+    protected override bool Compare(IComparable left, IItem right) {
+      return left.CompareTo(right) <= 0;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/3.3/LessThanComparator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/LessThanComparator.cs	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/LessThanComparator.cs	(revision 1670)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// Operator to check whether an item is less than another one.
+  /// </summary>
+  public class LessThanComparator : ComparatorBase {
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="LessThanComparator"/>.
+    /// </summary>
+    public LessThanComparator()
+      : base() {
+    }
+
+    /// <summary>
+    /// Checks whether the <paramref name="left"/> item is less than the <paramref name="right"/>.
+    /// </summary>
+    /// <param name="left">The left side of the comparison.</param>
+    /// <param name="right">The right side of the comparison.</param>
+    /// <returns><c>true</c> if the <paramref name="left"/> item is less than the 
+    /// <paramref name="right"/>, <c>false</c> otherwise.</returns>
+    protected override bool Compare(IComparable left, IItem right) {
+      return left.CompareTo(right) < 0;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/3.3/OperatorExtractor.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/OperatorExtractor.cs	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/OperatorExtractor.cs	(revision 1670)
@@ -0,0 +1,62 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// Retrieves an operator from a specified scope and returns a successor operation with this operation
+  /// and scope.
+  /// </summary>
+  public class OperatorExtractor : OperatorBase {
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get { return @"An operator extractor retrievs an operator from the scope it is applied on and returns a successor operation containing this operator and the current scope. Lookup for the operator is done recursively.
+
+Operator extractors can be used to get those operators again that have been injected by combined operators."; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="OperatorExtractor"/> with 
+    /// one variable info (<c>Operator</c>).
+    /// </summary>
+    public OperatorExtractor()
+      : base() {
+      AddVariableInfo(new VariableInfo("Operator", "Extracted operator", typeof(IOperator), VariableKind.In));
+    }
+
+    /// <summary>
+    /// Gets an operator from the specified <paramref name="scope"/> and returns an 
+    /// <see cref="AtomicOperation"/> containing this operator and scope.
+    /// </summary>
+    /// <param name="scope">The scope where to apply the operator on.</param>
+    /// <returns>A new <see cref="AtomicOperation"/> containing the operator and the given
+    /// <paramref name="scope"/>.</returns>
+    public override IOperation Apply(IScope scope) {
+      IOperator op = GetVariableValue<IOperator>("Operator", scope, true, true);
+      return new AtomicOperation(op, scope);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/3.3/ParallelProcessor.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/ParallelProcessor.cs	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/ParallelProcessor.cs	(revision 1670)
@@ -0,0 +1,52 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// Performs <c>n</c> operators on the given scope; operations can be executed in parallel.
+  /// </summary>
+  public class ParallelProcessor : OperatorBase {
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    /// <summary>
+    /// Applies <c>n</c> operators on the given <paramref name="scope"/>.
+    /// </summary>
+    /// <param name="scope">The scope to apply the operators on.</param>
+    /// <returns>A new <see cref="CompositeOperation"/> with the <c>n</c> operators applied 
+    /// to the given <paramref name="scope"/> with the <c>ExecuteInParallel</c> set to <c>true</c>.</returns>
+    public override IOperation Apply(IScope scope) {
+      CompositeOperation next = new CompositeOperation();
+      next.ExecuteInParallel = true;
+      for (int i = 0; i < SubOperators.Count; i++)
+        next.AddOperation(new AtomicOperation(SubOperators[i], scope));
+      return next;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/3.3/ParallelSubScopesProcessor.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/ParallelSubScopesProcessor.cs	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/ParallelSubScopesProcessor.cs	(revision 1670)
@@ -0,0 +1,52 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// Performs <c>n</c> operators on <c>n</c> subscopes, operations can be executed in parallel.
+  /// </summary>
+  public class ParallelSubScopesProcessor : OperatorBase {
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    /// <summary>
+    /// Applies <c>n</c> operators on all the <c>n</c> sub scopes of the given <paramref name="scope"/>.
+    /// </summary>
+    /// <param name="scope">The scope on whose sub scopes the operators are applied.</param>
+    /// <returns>A new <see cref="CompositeOperation"/> with the <c>i</c>th operator applied
+    /// on the <c>i</c>th sub scope, the <c>ExecuteInParallel</c> flag set to <c>true</c>.</returns>
+    public override IOperation Apply(IScope scope) {
+      CompositeOperation next = new CompositeOperation();
+      next.ExecuteInParallel = true;
+      for (int i = 0; i < scope.SubScopes.Count; i++)
+        next.AddOperation(new AtomicOperation(SubOperators[i], scope.SubScopes[i]));
+      return next;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/3.3/Properties/AssemblyInfo.frame
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/Properties/AssemblyInfo.frame	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/Properties/AssemblyInfo.frame	(revision 1670)
@@ -0,0 +1,58 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using HeuristicLab.PluginInfrastructure;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Operators")]
+[assembly: AssemblyDescription("Various HeuristicLab operator classes")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("72c5cb1e-abed-4a66-b520-8a6b6ad9fba1")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.2.0.$WCREV$")]
+[assembly: AssemblyFileVersion("3.2.0.$WCREV$")]
+[assembly: AssemblyBuildDate("$WCNOW$")]
Index: /trunk/sources/HeuristicLab.Operators/3.3/ScopeCleaner.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/ScopeCleaner.cs	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/ScopeCleaner.cs	(revision 1670)
@@ -0,0 +1,49 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// Operator that removes all variables in the given scope and deletes also all subscopes.
+  /// </summary>
+  public class ScopeCleaner : OperatorBase {
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get { return @"Removes all variables in the current scope and deletes all subscopes"; }
+    }
+
+    /// <summary>
+    /// Deletes all variable and sub scopes from the given <paramref name="scope"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="IScope.Clear"/> of interface <see cref="IScope"/>.</remarks>
+    /// <param name="scope">The scope to clear.</param>
+    /// <returns><c>null</c>.</returns>
+    public override IOperation Apply(IScope scope) {
+      scope.Clear();
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/3.3/SequentialProcessor.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/SequentialProcessor.cs	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/SequentialProcessor.cs	(revision 1670)
@@ -0,0 +1,51 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// Performs <c>n</c> operators on the given scope sequentially.
+  /// </summary>
+  public class SequentialProcessor : OperatorBase {
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    /// <summary>
+    /// Applies <c>n</c> operators on the given <paramref name="scope"/>.
+    /// </summary>
+    /// <param name="scope">The scope to apply the operators on.</param>
+    /// <returns>A new <see cref="CompositeOperation"/> with the <c>n</c> operators applied 
+    /// to the given <paramref name="scope"/>.</returns>
+    public override IOperation Apply(IScope scope) {
+      CompositeOperation next = new CompositeOperation();
+      for (int i = 0; i < SubOperators.Count; i++)
+        next.AddOperation(new AtomicOperation(SubOperators[i], scope));
+      return next;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/3.3/SequentialSubScopesProcessor.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/SequentialSubScopesProcessor.cs	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/SequentialSubScopesProcessor.cs	(revision 1670)
@@ -0,0 +1,51 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// Performs <c>n</c> operators on <c>n</c> subscopes, operations must be executed sequentially.
+  /// </summary>
+  public class SequentialSubScopesProcessor : OperatorBase {
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    /// <summary>
+    /// Applies <c>n</c> operators on all the <c>n</c> sub scopes of the given <paramref name="scope"/>.
+    /// </summary>
+    /// <param name="scope">The scope on whose sub scopes the operators are applied.</param>
+    /// <returns>A new <see cref="CompositeOperation"/> with the <c>i</c>th operator applied
+    /// on the <c>i</c>th sub scope.</returns>
+    public override IOperation Apply(IScope scope) {
+      CompositeOperation next = new CompositeOperation();
+      for (int i = 0; i < scope.SubScopes.Count; i++)
+        next.AddOperation(new AtomicOperation(SubOperators[i], scope.SubScopes[i]));
+      return next;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/3.3/SingleObjectiveEvaluatorBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/SingleObjectiveEvaluatorBase.cs	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/SingleObjectiveEvaluatorBase.cs	(revision 1670)
@@ -0,0 +1,72 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// Calculates the quality of a solution candidate.
+  /// </summary>
+  public abstract class SingleObjectiveEvaluatorBase : OperatorBase {
+    /// <summary>
+    /// Initializes a new instance of <see cref="SingleObjectiveEvaluatorBase"/> with one variable info
+    /// (<c>Quality</c>).
+    /// </summary>
+    public SingleObjectiveEvaluatorBase()
+      : base() {
+      AddVariableInfo(new VariableInfo("Quality", "Quality value", typeof(DoubleData), VariableKind.New));
+    }
+
+    /// <summary>
+    /// Evaluates the quality of a solution candidate.
+    /// </summary>
+    /// <remarks>Creates a new variable with the calculated quality if it not already exists, and 
+    /// injects it in the given <paramref name="scope"/> if it is not a local one.</remarks>
+    /// <param name="scope">The scope where to evaluate the quality.</param>
+    /// <returns><c>null</c>.</returns>
+    public override IOperation Apply(IScope scope) {
+      double qualityValue = Evaluate(scope);
+      DoubleData quality = GetVariableValue<DoubleData>("Quality", scope, false, false);
+      if (quality == null) {
+        quality = new DoubleData(qualityValue);
+        IVariableInfo qualityInfo = GetVariableInfo("Quality");
+        if (qualityInfo.Local)
+          AddVariable(new Variable(qualityInfo.ActualName, quality));
+        else
+          scope.AddVariable(new Variable(scope.TranslateName(qualityInfo.FormalName), quality));
+      } else {
+        quality.Data = qualityValue;
+      }
+      return null;
+    }
+
+    /// <summary>
+    /// Calculates the quality of a solution candidate in the given <paramref name="scope"/>.
+    /// </summary>
+    /// <param name="scope">The scope where to calculate the quality.</param>
+    /// <returns>A double value that indicates the quality.</returns>
+    protected abstract double Evaluate(IScope scope);
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/3.3/Sorter.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/Sorter.cs	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/Sorter.cs	(revision 1670)
@@ -0,0 +1,79 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// Sorts all sub scopes of a given scope.
+  /// </summary>
+  public class Sorter : OperatorBase {
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="Sorter"/> with two variable infos
+    /// (<c>Descending</c> and <c>Value</c>).
+    /// </summary>
+    public Sorter()
+      : base() {
+      AddVariableInfo(new VariableInfo("Descending", "Sort in descending order", typeof(BoolData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Value", "Sorting value", typeof(DoubleData), VariableKind.In));
+    }
+
+    /// <summary>
+    /// Sorts all sub scopes of the given <paramref name="scope"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="IScope.ReorderSubScopes"/>.</remarks>
+    /// <param name="scope">The scope where to apply the sorting.</param>
+    /// <returns><c>null</c>.</returns>
+    public override IOperation Apply(IScope scope) {
+      bool descending = GetVariableValue<BoolData>("Descending", scope, true).Data;
+      double[] keys = new double[scope.SubScopes.Count];
+      int[] sequence = new int[keys.Length];
+
+      for (int i = 0; i < keys.Length; i++) {
+        keys[i] = scope.SubScopes[i].GetVariableValue<DoubleData>("Value", false).Data;
+        sequence[i] = i;
+      }
+
+      Array.Sort<double, int>(keys, sequence);
+
+      if (descending) {
+        int temp;
+        for (int i = 0; i < sequence.Length / 2; i++) {
+          temp = sequence[i];
+          sequence[i] = sequence[sequence.Length - 1 - i];
+          sequence[sequence.Length - 1 - i] = temp;
+        }
+      }
+      scope.ReorderSubScopes(sequence);
+
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/3.3/StochasticBranch.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/StochasticBranch.cs	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/StochasticBranch.cs	(revision 1670)
@@ -0,0 +1,67 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// Branch of (one or) two operators that have different probabilities to get executed.
+  /// </summary>
+  public class StochasticBranch : OperatorBase {
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="StochasticBranch"/> with two variable infos
+    /// (<c>Random</c> and <c>Probability</c>).
+    /// </summary>
+    public StochasticBranch()
+      : base() {
+      AddVariableInfo(new VariableInfo("Random", "Pseudo random number generator", typeof(IRandom), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Probability", "Probability to choose first branch", typeof(DoubleData), VariableKind.In));
+    }
+
+    /// <summary>
+    /// Applies the operator of branch one with a specific probability on the given 
+    /// <paramref name="scope"/>, or - if existent - with another probability operator of branch two.  
+    /// </summary>
+    /// <param name="scope">The scope to apply the operators on.</param>
+    /// <returns>A new <see cref="AtomicOperation"/> with either operator 1 or operator 2 applied
+    /// to the given <paramref name="scope"/> or <c>null</c>.</returns>
+    public override IOperation Apply(IScope scope) {
+      IRandom random = GetVariableValue<IRandom>("Random", scope, true);
+      DoubleData probability = GetVariableValue<DoubleData>("Probability", scope, true);
+
+      bool result = random.NextDouble() < probability.Data;
+      if ((result) && (SubOperators.Count > 0) && (SubOperators[0] != null))
+        return new AtomicOperation(SubOperators[0], scope);
+      else if ((!result) && (SubOperators.Count > 1) && (SubOperators[1] != null))
+        return new AtomicOperation(SubOperators[1], scope);
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/3.3/StochasticMultiBranch.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/StochasticMultiBranch.cs	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/StochasticMultiBranch.cs	(revision 1670)
@@ -0,0 +1,83 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// Branch of operators that have different probabilities to get executed.
+  /// </summary>
+  public class StochasticMultiBranch : OperatorBase {
+    ///<inheritdoc select="summary"/>
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="StochasticMultiBranch"/> with two variable infos
+    /// (<c>Probabilities</c> and <c>Random</c>).
+    /// </summary>
+    public StochasticMultiBranch()
+      : base() {
+      AddVariableInfo(new VariableInfo("Probabilities", "The probabilities, that define how likely each suboperator/graph is executed. This array must sum to 1", typeof(DoubleArrayData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Random", "The pseudo random-generator, used for any random-decision.", typeof(IRandom), VariableKind.In));
+    }
+
+    /// <summary>
+    /// Applies an operator of the branches to the specified <paramref name="scope"/> with a 
+    /// specific probability.
+    /// </summary>
+    /// <exception cref="InvalidOperationException">Thrown when the list of probabilites does not
+    /// match the number of operators or if there was another problem with the list of probabilities.</exception>
+    /// <param name="scope">The scope to apply the operators on.</param>
+    /// <returns>A new <see cref="AtomicOperation"/> with a specific operator, depending 
+    /// on its probability, applied on the given <paramref name="scope"/>.</returns>
+    public override IOperation Apply(IScope scope) {
+      IRandom random = GetVariableValue<IRandom>("Random", scope, true);
+      DoubleArrayData probabilities = GetVariableValue<DoubleArrayData>("Probabilities", scope, true);
+      if(probabilities.Data.Length != SubOperators.Count) {
+        throw new InvalidOperationException("StochasticMultiBranch: The list of probabilities has to match the number of operators");
+      }
+      double sum = 0;
+      foreach(double prob in probabilities.Data) {
+        sum+=prob;
+      }
+      double r = random.NextDouble()*sum;
+      sum = 0;
+      IOperator successor = null;
+      for(int i = 0; i < SubOperators.Count; i++) {
+        sum += probabilities.Data[i];
+        if(sum > r) {
+          successor = SubOperators[i];
+          break;
+        }
+      }
+      if(successor == null) {
+        throw new InvalidOperationException("StochasticMultiBranch: There was a problem with the list of probabilities");
+      }
+      return new AtomicOperation(successor, scope);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/3.3/SubScopesCreater.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/SubScopesCreater.cs	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/SubScopesCreater.cs	(revision 1670)
@@ -0,0 +1,60 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// Operator to create sub scopes in a given scope.
+  /// </summary>
+  public class SubScopesCreater : OperatorBase {
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="SubScopesCreater"/> with one variable info (<c>SubScopes</c>).
+    /// </summary>
+    public SubScopesCreater()
+      : base() {
+      AddVariableInfo(new VariableInfo("SubScopes", "Number of sub-scopes", typeof(IntData), VariableKind.In));
+    }
+
+    /// <summary>
+    /// Creates a specified number of sub scopes in the given <paramref name="scope"/>.
+    /// </summary>
+    /// <param name="scope">The scope where to create the sub scopes.</param>
+    /// <returns><c>null</c>.</returns>
+    public override IOperation Apply(IScope scope) {
+      IntData count = GetVariableValue<IntData>("SubScopes", scope, true);
+
+      for (int i = 0; i < count.Data; i++)
+        scope.AddSubScope(new Scope(i.ToString()));
+
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/3.3/SubScopesMixer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/SubScopesMixer.cs	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/SubScopesMixer.cs	(revision 1670)
@@ -0,0 +1,82 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// Mixes the sub scopes of a specified scope according to a specified number of partitions.
+  /// </summary>
+  public class SubScopesMixer : OperatorBase {
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="SubScopesMixer"/> with one variable infos 
+    /// (<c>Partitions</c>) and the <c>Local</c> flag set to <c>true</c>.
+    /// </summary>
+    public SubScopesMixer()
+      : base() {
+      AddVariableInfo(new VariableInfo("Partitions", "Number of partitions to mix", typeof(IntData), VariableKind.In));
+      GetVariableInfo("Partitions").Local = true;
+      AddVariable(new Variable("Partitions", new IntData(2)));
+    }
+
+    /// <summary>
+    /// Mixes the subscopes of the given <paramref name="scope"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="IScope.ReorderSubScopes"/>.<br/>
+    /// Mixing of sub scopes is based on the number of partitions.
+    /// <example>12 sub scopes and 3 partitions:<br/>
+    /// Partition 1 contains sub scopes 1-4, partition 2 sub scopes 5-8 and partition 3 sub scopes 9-12. <br/>
+    /// Mixing is realized by selecting at the beginning the first sub scope from partition one, then the 
+    /// first sub scope from partition 2, afterwards first sub scope from partition 3, 
+    /// then the second sub scope from the first partition and so on. <br/>
+    /// In the end the new sorting of the sub scopes is 1-5-9-2-6-10-3-7-11-4-8-12. 
+    /// </example>
+    /// </remarks>
+    /// <exception cref="ArgumentException">Thrown when the number of sub scopes cannot be divided by
+    /// the number of partitions without remainder.</exception>
+    /// <param name="scope">The scope whose sub scopes should be mixed.</param>
+    /// <returns><c>null</c>.</returns>
+    public override IOperation Apply(IScope scope) {
+      int partitions = GetVariableValue<IntData>("Partitions", scope, true).Data;
+      int[] sequence = new int[scope.SubScopes.Count];
+      if ((sequence.Length % partitions) != 0)
+        throw new ArgumentException("The number of subScopes is not divisible by the number of partitions without remainder.");
+      int partitionSize = sequence.Length / partitions;
+
+      // mix sub-scopes -> alternately take one sub-scope from each partition
+      for (int i = 0; i < partitionSize; i++) {
+        for (int j = 0; j < partitions; j++)
+          sequence[i * partitions + j] = j * partitionSize + i;
+      }
+      scope.ReorderSubScopes(sequence);
+
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/3.3/SubScopesRemover.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/SubScopesRemover.cs	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/SubScopesRemover.cs	(revision 1670)
@@ -0,0 +1,70 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// Removes one specified or - if nothing specified - all operators from the given scope.
+  /// </summary>
+  public class SubScopesRemover : OperatorBase {
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get {
+        return @"This operator either removes the subscope specified in the variable SubScopeIndex or if this variable is absent, removes all subscopes.";
+      }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="SubScopesRemover"/> with one variable info
+    /// (<c>SubScopeIndex</c>).
+    /// </summary>
+    public SubScopesRemover()
+      : base() {
+      AddVariableInfo(new VariableInfo("SubScopeIndex", "(Optional) the index of the subscope to remove", typeof(IntData), VariableKind.In));
+    }
+
+    /// <summary>
+    /// Removes one sub scope with a specified index from the given <paramref name="scope"/>, or if no
+    /// index has been specified, all sub scopes are removed.
+    /// </summary>
+    /// <exception cref="InvalidOperationException">Thrown when no sub scope with the specified index 
+    /// exists.</exception>
+    /// <param name="scope">The scope whose sub scope(s) to remove.</param>
+    /// <returns><c>null</c>.</returns>
+    public override IOperation Apply(IScope scope) {
+      IntData index = GetVariableValue<IntData>("SubScopeIndex", scope, true, false);
+      if (index == null) { // remove all scopes
+        while (scope.SubScopes.Count > 0) {
+          scope.RemoveSubScope(scope.SubScopes[0]);
+        }
+      } else {
+        if (index.Data < 0 && index.Data >= scope.SubScopes.Count) throw new InvalidOperationException("ERROR: no scope with index " + index.Data + " exists");
+        scope.RemoveSubScope(scope.SubScopes[index.Data]);
+      }
+      return null;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/3.3/UnequalToComparator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/UnequalToComparator.cs	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/UnequalToComparator.cs	(revision 1670)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// Operator to check whether two items are not equal to each other.
+  /// </summary>
+  public class UnequalToComparator : ComparatorBase {
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="UnequalToComparator"/>.
+    /// </summary>
+    public UnequalToComparator()
+      : base() {
+    }
+
+    /// <summary>
+    /// Checks whether the <paramref name="left"/> item is not equal to the <paramref name="right"/>.
+    /// </summary>
+    /// <param name="left">The left side of the comparison.</param>
+    /// <param name="right">The right side of the comparison.</param>
+    /// <returns><c>true</c> if the <paramref name="left"/> item is not equal
+    /// to the <paramref name="right"/>, <c>false</c> otherwise.</returns>
+    protected override bool Compare(IComparable left, IItem right) {
+      return left.CompareTo(right) != 0;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/3.3/UniformParallelSubScopesProcessor.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/UniformParallelSubScopesProcessor.cs	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/UniformParallelSubScopesProcessor.cs	(revision 1670)
@@ -0,0 +1,53 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// Performs the same operator on all <c>n</c> existing sub scopes of a given scope; 
+  /// operations can be executed in parallel.
+  /// </summary>
+  public class UniformParallelSubScopesProcessor : OperatorBase {
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    /// <summary>
+    /// Applies one operator on all the sub scopes of the given <paramref name="scope"/>.
+    /// </summary>
+    /// <param name="scope">The scope on whose sub scopes the operator is applied.</param>
+    /// <returns>A new <see cref="CompositeOperation"/> with one operator and all sub scopes and
+    /// the <c>ExecuteInParallel</c> flag set to <c>true</c>.</returns>
+    public override IOperation Apply(IScope scope) {
+      CompositeOperation next = new CompositeOperation();
+      next.ExecuteInParallel = true;
+      for (int i = 0; i < scope.SubScopes.Count; i++)
+        next.AddOperation(new AtomicOperation(SubOperators[0], scope.SubScopes[i]));
+      return next;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/3.3/UniformSequentialSubScopesProcessor.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/UniformSequentialSubScopesProcessor.cs	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/UniformSequentialSubScopesProcessor.cs	(revision 1670)
@@ -0,0 +1,51 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// Performs the same operator on all existing sub scopes of a given scope, 
+  /// must be executed sequentially.
+  /// </summary>
+  public class UniformSequentialSubScopesProcessor : OperatorBase {
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    /// <summary>
+    /// Applies one operator on all the sub scopes of the given <paramref name="scope"/>.
+    /// </summary>
+    /// <param name="scope">The scope on whose sub scopes the operator is applied.</param>
+    /// <returns>A new <see cref="CompositeOperation"/> with one operator and all sub scopes.</returns>
+    public override IOperation Apply(IScope scope) {
+      CompositeOperation next = new CompositeOperation();
+      for (int i = 0; i < scope.SubScopes.Count; i++)
+        next.AddOperation(new AtomicOperation(SubOperators[0], scope.SubScopes[i]));
+      return next;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/3.3/VariableInjector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/VariableInjector.cs	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/VariableInjector.cs	(revision 1670)
@@ -0,0 +1,164 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// Class to inject local variables into the scope.
+  /// </summary>
+  public class VariableInjector : OperatorBase {
+    private Dictionary<IVariable, IVariableInfo> variableVariableInfoTable;
+    private Dictionary<IVariableInfo, IVariable> variableInfoVariableTable;
+
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="VariableInjector"/>.
+    /// </summary>
+    public VariableInjector()
+      : base() {
+      variableVariableInfoTable = new Dictionary<IVariable, IVariableInfo>();
+      variableInfoVariableTable = new Dictionary<IVariableInfo, IVariable>();
+    }
+
+    /// <summary>
+    /// Clones the current instance (deep clone).
+    /// </summary>
+    /// <remarks>Deep clone performed with <see cref="Auxiliary.Clone"/> of helper class
+    /// <see cref="Auxiliary"/>.</remarks>
+    /// <param name="clonedObjects">Dictionary of all already cloned objects. (Needed to avoid cycles.)</param>
+    /// <returns>The cloned object as <see cref="VariableInjector"/>.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      VariableInjector clone = new VariableInjector();
+      clonedObjects.Add(Guid, clone);
+      clone.Name = Name;
+      foreach (IVariable variable in Variables)
+        clone.AddVariable((IVariable)Auxiliary.Clone(variable, clonedObjects));
+      return clone;
+    }
+
+    /// <summary>
+    /// Adds the specified <paramref name="variable"/> to the current instance to get injected.
+    /// </summary>
+    /// <param name="variable">The variable to add.</param>
+    /// <remarks>Calls private method <see cref="CreateVariableInfo"/> and <see cref="OperatorBase.AddVariable"/>
+    /// of base class <see cref="OperatorBase"/>.</remarks>
+    public override void AddVariable(IVariable variable) {
+      base.AddVariable(variable);
+      CreateVariableInfo(variable);
+    }
+
+    /// <summary>
+    /// Removes a variable with the specified <paramref name="name"/> from the current injector.
+    /// </summary>
+    /// <remarks>Calls private method <see cref="DeleteVariableInfo"/> and <see cref="OperatorBase.RemoveVariable"/>
+    /// of base class <see cref="OperatorBase"/>.</remarks>
+    /// <param name="name">The name of the </param>
+    public override void RemoveVariable(string name) {
+      DeleteVariableInfo(name);
+      base.RemoveVariable(name);
+    }
+
+    /// <summary>
+    /// Adds the specified variables to the given <paramref name="scope"/> (and removes them first,
+    /// if they already exist in the current scope).
+    /// </summary>
+    /// <param name="scope">The scope where to inject the variables.</param>
+    /// <returns><c>null</c>.</returns>
+    public override IOperation Apply(IScope scope) {
+      foreach (IVariable variable in Variables) {
+        if (scope.GetVariable(variable.Name) != null)
+          scope.RemoveVariable(variable.Name);
+        scope.AddVariable((IVariable)variable.Clone());
+      }
+      return null;
+    }
+
+    /// <summary>
+    /// Creates a new instance of <see cref="VariableInjectorView"/> to display the current instance.
+    /// </summary>
+    /// <returns>The created view as <see cref="VariableInjectorView"/>.</returns>
+    public override IView CreateView() {
+      return new VariableInjectorView(this);
+    }
+
+    private void CreateVariableInfo(IVariable variable) {
+      IVariableInfo info = new VariableInfo(Guid.NewGuid().ToString(), "Injected variable", variable.Value.GetType(), VariableKind.New);
+      info.ActualName = variable.Name;
+      AddVariableInfo(info);
+      variableVariableInfoTable.Add(variable, info);
+      variableInfoVariableTable.Add(info, variable);
+      info.ActualNameChanged += new EventHandler(VariableInfo_ActualNameChanged);
+      variable.NameChanged += new EventHandler(Variable_NameChanged);
+    }
+    private void DeleteVariableInfo(string name) {
+      IVariable variable = GetVariable(name);
+      if (variable != null) {
+        IVariableInfo info = variableVariableInfoTable[variable];
+        RemoveVariableInfo(info.FormalName);
+        variableVariableInfoTable.Remove(variable);
+        variableInfoVariableTable.Remove(info);
+        info.ActualNameChanged -= new EventHandler(VariableInfo_ActualNameChanged);
+        variable.NameChanged -= new EventHandler(Variable_NameChanged);
+      }
+    }
+
+    #region VariableInfo and Variable Events
+    private void VariableInfo_ActualNameChanged(object sender, EventArgs e) {
+      IVariableInfo info = (IVariableInfo)sender;
+      IVariable variable = variableInfoVariableTable[info];
+      variable.Name = info.ActualName;
+    }
+    private void Variable_NameChanged(object sender, EventArgs e) {
+      IVariable variable = (IVariable)sender;
+      IVariableInfo info = variableVariableInfoTable[variable];
+      info.ActualName = variable.Name;
+    }
+    #endregion
+
+    #region Persistence Methods
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// <note type="caution"> Variable infos are not persisted!</note>
+    /// </summary>
+    /// <remarks>Calls <see cref="OperatorBase.GetXmlNode"/> of base class <see cref="OperatorBase"/>.</remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where to save the data.</param>
+    /// <param name="persistedObjects">The dictionary of all already persisted objects. (Needed to avoid cycles.)</param>
+    /// <returns>The saved <see cref="XmlNode"/>.</returns>
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      // variable infos should not be persisted
+      XmlNode infosNode = node.SelectSingleNode("VariableInfos");
+      infosNode.RemoveAll();
+      return node;
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/3.3/VariableInjectorView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/VariableInjectorView.Designer.cs	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/VariableInjectorView.Designer.cs	(revision 1670)
@@ -0,0 +1,53 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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
+
+namespace HeuristicLab.Operators {
+  partial class VariableInjectorView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/3.3/VariableInjectorView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/VariableInjectorView.cs	(revision 1670)
+++ /trunk/sources/HeuristicLab.Operators/3.3/VariableInjectorView.cs	(revision 1670)
@@ -0,0 +1,63 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// Visual representation of <see cref="VariableInjector"/>.
+  /// </summary>
+  public partial class VariableInjectorView : OperatorBaseView {
+    /// <summary>
+    /// Gets or sets the <see cref="HeuristicLab.Operators.VariableInjector"/> to display.
+    /// </summary>
+    /// <remarks>Uses property <see cref="OperatorBaseView.Operator"/> of base class
+    /// <see cref="OperatorBaseView"/>. No own data storage present.</remarks>
+    public VariableInjector VariableInjector {
+      get { return (VariableInjector)Operator; }
+      set { base.Operator = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="VariableInjectorView"/>.
+    /// </summary>
+    public VariableInjectorView() {
+      InitializeComponent();
+      tabControl.SelectedTab = variablesTabPage;
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="VariableInjectorView"/> with the specified 
+    /// <paramref name="variableInjector"/>.
+    /// </summary>
+    /// <param name="variableInjector">The variable injector to display.</param>
+    public VariableInjectorView(VariableInjector variableInjector)
+      : this() {
+      VariableInjector = variableInjector;
+    }
+  }
+}
