Index: /trunk/sources/HeuristicLab.Constraints/3.3/AllSubOperatorsTypeConstraint.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/AllSubOperatorsTypeConstraint.cs	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/AllSubOperatorsTypeConstraint.cs	(revision 1671)
@@ -0,0 +1,162 @@
+#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;
+using System.Xml;
+using System.Diagnostics;
+
+namespace HeuristicLab.Constraints {
+  /// <summary>
+  /// Constraint where all sub-operators have to be elements of a pre-defined group.
+  /// </summary>
+  public class AllSubOperatorsTypeConstraint : ConstraintBase {
+
+    private SubOperatorTypeConstraint groupConstraint;
+    /// <summary>
+    /// Gets all allowed sub-operators.
+    /// </summary>
+    public IList<IOperator> AllowedSubOperators {
+      get {
+        return groupConstraint.AllowedSubOperators;
+      }
+    }
+
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get { return "All sub-operators have to be elements of a pre-defined group."; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="AllSubOperatorsTypeConstraint"/>.
+    /// </summary>
+    public AllSubOperatorsTypeConstraint()
+      : base() {
+      groupConstraint = new SubOperatorTypeConstraint();
+    }
+
+    /// <summary>
+    /// Adds the given operator to the constraint.
+    /// </summary>
+    /// <remarks>Calls <see cref="ItemBase.FireChanged"/> of base class 
+    /// <see cref="ConstraintBase"/>.</remarks>
+    /// <param name="op">The operator to add.</param>
+    public void AddOperator(IOperator op) {
+      groupConstraint.AddOperator(op);
+      FireChanged();
+    }
+
+    /// <summary>
+    /// Removes the given operator from the contraint.
+    /// </summary>
+    /// <remarks>Calls <see cref="ItemBase.FireChanged"/> of base class 
+    /// <see cref="ConstraintBase"/>.</remarks>
+    /// <param name="op">The operator to remove.</param>
+    public void RemoveOperator(IOperator op) {
+      groupConstraint.RemoveOperator(op);
+      FireChanged();
+    }
+
+    /// <summary>
+    /// Checks whether the given element fulfills the current constraint.
+    /// </summary>
+    /// <param name="data">The item to check.</param>
+    /// <returns><c>true</c> if the constraint could be fulfilled, <c>false</c> otherwise.</returns>
+    public override bool Check(IItem data) {
+      IOperator op = data as IOperator;
+      if(data == null) return false;
+
+      for(int i = 0; i < op.SubOperators.Count; i++) {
+        groupConstraint.SubOperatorIndex.Data = i;
+        if(groupConstraint.Check(data) == false) {
+          return false;
+        }
+      }
+      return true;
+    }
+
+    /// <summary>
+    /// Empties the current instance.
+    /// </summary>
+    public void Clear() {
+      groupConstraint.Clear();
+    }
+
+    /// <summary>
+    /// Clones the current instance (deep clone).
+    /// </summary>
+    /// <remarks>Deep clone through <see cref="Auxiliary.Clone"/> method of helper class 
+    /// <see cref="Auxiliary"/>.</remarks>
+    /// <param name="clonedObjects">Dictionary of all already clone objects. (Needed to avoid cycles.)</param>
+    /// <returns>The cloned object as <see cref="AllSubOperatorsTypeConstraint"/>.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      AllSubOperatorsTypeConstraint clone = new AllSubOperatorsTypeConstraint();
+      clonedObjects.Add(Guid, clone);
+      clone.groupConstraint = (SubOperatorTypeConstraint)Auxiliary.Clone(groupConstraint, clonedObjects);
+      return clone;
+    }
+
+    /// <summary>
+    /// Creates a new instance of <see cref="AllSubOperatorsTypeConstraintView"/> to represent the current 
+    /// instance visually.
+    /// </summary>
+    /// <returns>The created view as <see cref="AllSubOperatorsTypeConstraintView"/>.</returns>
+    public override IView CreateView() {
+      return new AllSubOperatorsTypeConstraintView(groupConstraint);
+    }
+
+    #region persistence
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>The sub-operators are saved as a child node with tag name 
+    /// <c>SubOperatorsGroupConstraint</c>.</remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where the data is saved.</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 subOperatorsNode = PersistenceManager.Persist("SubOperatorsGroupConstraint", groupConstraint, document, persistedObjects);
+      node.AppendChild(subOperatorsNode);
+
+      return node;
+    }
+
+    /// <summary>
+    /// Loads the persisted constraint from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>The constraint must be saved in a specific way, see <see cref="GetXmlNode"/> for 
+    /// more information.</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the instance 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);
+      groupConstraint = (SubOperatorTypeConstraint)PersistenceManager.Restore(node.SelectSingleNode("SubOperatorsGroupConstraint"), restoredObjects);
+    }
+    #endregion persistence
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/3.3/AllSubOperatorsTypeConstraintView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/AllSubOperatorsTypeConstraintView.Designer.cs	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/AllSubOperatorsTypeConstraintView.Designer.cs	(revision 1671)
@@ -0,0 +1,113 @@
+#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.Constraints {
+  partial class AllSubOperatorsTypeConstraintView {
+    /// <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.groupBox = new System.Windows.Forms.GroupBox();
+      this.listView = new System.Windows.Forms.ListView();
+      this.removeButton = new System.Windows.Forms.Button();
+      this.groupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // groupBox
+      // 
+      this.groupBox.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.groupBox.Controls.Add(this.listView);
+      this.groupBox.Location = new System.Drawing.Point(0, 0);
+      this.groupBox.Name = "groupBox";
+      this.groupBox.Size = new System.Drawing.Size(463, 305);
+      this.groupBox.TabIndex = 0;
+      this.groupBox.TabStop = false;
+      this.groupBox.Text = "Allowed sub-operators";
+      // 
+      // listView
+      // 
+      this.listView.AllowDrop = true;
+      this.listView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.listView.Location = new System.Drawing.Point(3, 16);
+      this.listView.Name = "listView";
+      this.listView.Size = new System.Drawing.Size(457, 286);
+      this.listView.TabIndex = 1;
+      this.listView.UseCompatibleStateImageBehavior = false;
+      this.listView.View = System.Windows.Forms.View.List;
+      this.listView.SelectedIndexChanged += new System.EventHandler(this.listView_SelectedIndexChanged);
+      this.listView.DragDrop += new System.Windows.Forms.DragEventHandler(this.listView_DragDrop);
+      this.listView.DragEnter += new System.Windows.Forms.DragEventHandler(this.listView_DragEnter);
+      this.listView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.listView_KeyDown);
+      this.listView.DragOver += new System.Windows.Forms.DragEventHandler(this.listView_DragOver);
+      // 
+      // removeButton
+      // 
+      this.removeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.removeButton.Location = new System.Drawing.Point(3, 311);
+      this.removeButton.Name = "removeButton";
+      this.removeButton.Size = new System.Drawing.Size(75, 23);
+      this.removeButton.TabIndex = 0;
+      this.removeButton.Text = "Remove";
+      this.removeButton.UseVisualStyleBackColor = true;
+      this.removeButton.Click += new System.EventHandler(this.removeButton_Click);
+      // 
+      // AllSubOperatorsTypeConstraintView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.removeButton);
+      this.Controls.Add(this.groupBox);
+      this.Name = "AllSubOperatorsTypeConstraintView";
+      this.Size = new System.Drawing.Size(463, 337);
+      this.groupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.GroupBox groupBox;
+    private System.Windows.Forms.Button removeButton;
+    private System.Windows.Forms.ListView listView;
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/3.3/AllSubOperatorsTypeConstraintView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/AllSubOperatorsTypeConstraintView.cs	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/AllSubOperatorsTypeConstraintView.cs	(revision 1671)
@@ -0,0 +1,166 @@
+#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.Constraints {
+  /// <summary>
+  /// The visual representation of the <see cref="AllSubOperatorsTypeConstraint"/>.
+  /// </summary>
+  public partial class AllSubOperatorsTypeConstraintView : ViewBase {
+    private SubOperatorTypeConstraint constraint = new SubOperatorTypeConstraint();
+
+    /// <summary>
+    /// Gets or sets the SubOperatorTypeConstraint to display.
+    /// </summary>
+    public SubOperatorTypeConstraint Constraint {
+      get { return constraint; }
+      set { 
+        constraint = value;
+        UpdateAllowedOperatorsList();
+      }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="AllSubOperatorsTypeConstraintView"/>.
+    /// </summary>
+    public AllSubOperatorsTypeConstraintView() {
+      InitializeComponent();
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="AllSubOperatorsTypeConstraintView"/> with
+    /// the given <paramref name="constraint"/> to display.
+    /// </summary>
+    /// <param name="constraint">The constraint that should be displayed.</param>
+    public AllSubOperatorsTypeConstraintView(SubOperatorTypeConstraint constraint) {
+      this.constraint = constraint;
+      InitializeComponent();
+    }
+
+    private void UpdateAllowedOperatorsList() {
+      listView.Clear();
+      foreach(IOperator op in constraint.AllowedSubOperators) {
+        ListViewItem item = new ListViewItem();
+        item.Name = op.Name;
+        item.Text = op.Name;
+        item.Tag = op;
+        listView.Items.Add(item);
+      }
+      Refresh();
+    }
+
+    private void op_NameChanged(object sender, EventArgs e) {
+      IOperator srcOp = (IOperator)sender;
+
+      foreach(ListViewItem item in listView.Items) {
+        if(item.Tag == srcOp) {
+          item.Text = srcOp.Name;
+          item.Name = srcOp.Name;
+          break;
+        }
+      }
+      Refresh();
+    }
+
+    #region Key Events
+    private void listView_KeyDown(object sender, KeyEventArgs e) {
+      if(e.KeyCode == Keys.Delete) {
+        while(listView.SelectedIndices.Count > 0) {
+          constraint.RemoveOperator((IOperator)listView.SelectedItems[0].Tag);
+          listView.Items.RemoveAt(listView.SelectedIndices[0]);
+        }
+      }
+    }
+    #endregion
+
+    #region Drag Events
+    private void listView_DragDrop(object sender, DragEventArgs e) {
+      if(e.Effect != DragDropEffects.None) {
+        if(e.Data.GetDataPresent("IOperator")) {
+          IOperator op = (IOperator)e.Data.GetData("IOperator");
+          ListViewItem item = new ListViewItem();
+          item.Tag = op;
+          item.Name = op.Name;
+          item.Text = op.Name;
+          listView.Items.Add(item);
+          constraint.AddOperator(op);
+          op.NameChanged += new EventHandler(op_NameChanged);
+          listView.SelectedIndices.Clear();
+        }
+      }
+    }
+
+    private void listView_DragEnter(object sender, DragEventArgs e) {
+      this.FindForm().BringToFront();
+      this.Focus();
+      e.Effect = DragDropEffects.None;
+      if(e.Data.GetDataPresent("IOperator")) {
+        IOperator op = (IOperator)e.Data.GetData("IOperator");
+        if(!ListContains(op)) {
+          e.Effect = DragDropEffects.Copy;
+        }
+      }
+    }
+
+    private void listView_DragOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      if(e.Data.GetDataPresent("IOperator")) {
+        IOperator op = (IOperator)e.Data.GetData("IOperator");
+        if(!ListContains(op)) {
+          e.Effect = DragDropEffects.Copy;
+        }
+      }
+    }
+    #endregion
+
+    #region button events
+    private void removeButton_Click(object sender, EventArgs e) {
+      while(listView.SelectedIndices.Count > 0) {
+        constraint.RemoveOperator((IOperator)listView.SelectedItems[0].Tag);
+        listView.Items.RemoveAt(listView.SelectedIndices[0]);
+      }
+    }
+    #endregion
+
+    private bool ListContains(IOperator op) {
+      foreach(ListViewItem item in listView.Items) {
+        if(item.Tag == op) return true;
+      }
+      return false;
+    }
+
+    private void listView_SelectedIndexChanged(object sender, EventArgs e) {
+      if(listView.SelectedItems.Count > 0) {
+        removeButton.Enabled = true;
+      } else {
+        removeButton.Enabled = false;
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/3.3/AllSubOperatorsTypeConstraintView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/AllSubOperatorsTypeConstraintView.resx	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/AllSubOperatorsTypeConstraintView.resx	(revision 1671)
@@ -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.Constraints/3.3/AndConstraint.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/AndConstraint.cs	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/AndConstraint.cs	(revision 1671)
@@ -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.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Constraints {
+  /// <summary>
+  /// Constraint where all sub-constraints must be <c>true</c>.
+  /// </summary>
+  public class AndConstraint : ConstraintBase, IViewable {
+    private ItemList<IConstraint> clauses;
+    /// <summary>
+    /// Gets or sets the sub-constraints.
+    /// </summary>
+    /// <remarks>Calls <see cref="ItemBase.OnChanged"/> of base class 
+    /// <see cref="ConstraintBase"/> in the setter.</remarks>
+    public ItemList<IConstraint> Clauses {
+      get { return clauses; }
+      set {
+        clauses = value;
+        OnChanged();
+      }
+    }
+
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get {
+        return "To return true, all subconstraints have to be true";
+      }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="AndConstraint"/>.
+    /// </summary>
+    public AndConstraint() {
+      clauses = new ItemList<IConstraint>();
+    }
+
+    /// <summary>
+    /// Checks whether the given element fulfills the current constraint.
+    /// </summary>
+    /// <param name="data">The item to check.</param>
+    /// <returns><c>true</c> if the constraint could be fulfilled, <c>false</c> otherwise.</returns>
+    public override bool Check(IItem data) {
+      bool result = true;
+      for (int i = 0 ; i < clauses.Count ; i++) {
+        result = clauses[i].Check(data);
+        if (!result) return false;
+      }
+      return result;
+    }
+
+    /// <summary>
+    /// Creates a new instance of <see cref="AndConstraintView"/> to represent the current 
+    /// instance visually.
+    /// </summary>
+    /// <returns>The created view as <see cref="AndConstraintView"/>.</returns>
+    public override IView CreateView() {
+      return new AndConstraintView(this);
+    }
+
+    /// <summary>
+    /// Clones the current instance (deep clone).
+    /// </summary>
+    /// <remarks>Deep clone through <see cref="Auxiliary.Clone"/> method of helper class 
+    /// <see cref="Auxiliary"/>.</remarks>
+    /// <param name="clonedObjects">Dictionary of all already clone objects. (Needed to avoid cycles.)</param>
+    /// <returns>The cloned object as <see cref="AndConstraint"/>.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      AndConstraint clone = new AndConstraint();
+      clonedObjects.Add(Guid, clone);
+      clone.Clauses = (ItemList<IConstraint>)Auxiliary.Clone(Clauses, clonedObjects);
+      return clone;
+    }
+
+    #region persistence
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>The sub-constraints are saved as a child node with tag name 
+    /// <c>Clauses</c>.</remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where the data is saved.</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 clausesNode = PersistenceManager.Persist("Clauses", Clauses, document, persistedObjects);
+      node.AppendChild(clausesNode);
+
+      return node;
+    }
+
+    /// <summary>
+    /// Loads the persisted constraint from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>The constraint must be saved in a specific way, see <see cref="GetXmlNode"/> for 
+    /// more information.</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the instance 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);
+      clauses = (ItemList<IConstraint>)PersistenceManager.Restore(node.SelectSingleNode("Clauses"), restoredObjects);
+    }
+    #endregion persistence
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/3.3/AndConstraintView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/AndConstraintView.Designer.cs	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/AndConstraintView.Designer.cs	(revision 1671)
@@ -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
+
+namespace HeuristicLab.Constraints {
+  partial class AndConstraintView {
+    /// <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();
+      }
+      if (AndConstraint != null) AndConstraint.Changed -= new System.EventHandler(AndConstraint_Changed);
+      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.clausesItemListView = new HeuristicLab.Data.ItemListView<HeuristicLab.Core.IConstraint>();
+      this.SuspendLayout();
+      // 
+      // clausesItemListView
+      // 
+      this.clausesItemListView.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.clausesItemListView.Caption = "View";
+      this.clausesItemListView.Location = new System.Drawing.Point(0, 0);
+      this.clausesItemListView.Name = "clausesItemListView";
+      this.clausesItemListView.Size = new System.Drawing.Size(338, 238);
+      this.clausesItemListView.TabIndex = 0;
+      // 
+      // AndConstraintView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.clausesItemListView);
+      this.Name = "AndConstraintView";
+      this.Size = new System.Drawing.Size(344, 244);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private HeuristicLab.Data.ItemListView<HeuristicLab.Core.IConstraint> clausesItemListView;
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/3.3/AndConstraintView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/AndConstraintView.cs	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/AndConstraintView.cs	(revision 1671)
@@ -0,0 +1,99 @@
+#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;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Constraints {
+  /// <summary>
+  /// The visual representation of an <see cref="AndConstraint"/>.
+  /// </summary>
+  public partial class AndConstraintView : ViewBase {
+    /// <summary>
+    /// Gets or sets the AndConstraint to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>.</remarks>
+    /// No own data storage present. 
+    public AndConstraint AndConstraint {
+      get { return (AndConstraint)Item; }
+      set { base.Item = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="AndConstraintView"/>.
+    /// </summary>
+    public AndConstraintView() {
+      InitializeComponent();
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="AndConstraintView"/> with the given 
+    /// <paramref name="andConstraint"/> to display.
+    /// </summary>
+    /// <param name="andConstraint">The constraint to represent visually.</param>
+    public AndConstraintView(AndConstraint andConstraint)
+      : this() {
+      AndConstraint = andConstraint;
+    }
+
+    /// <summary>
+    /// Removes the eventhandler from the underlying <see cref="AndConstraint"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.
+    /// </remarks>
+    protected override void RemoveItemEvents() {
+      AndConstraint.Changed -= new EventHandler(AndConstraint_Changed);
+      base.RemoveItemEvents();
+    }
+    /// <summary>
+    /// Adds an eventhandler to the underlying <see cref="AndConstraint"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.
+    /// </remarks>
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      AndConstraint.Changed += new EventHandler(AndConstraint_Changed);
+    }
+
+    /// <summary>
+    /// Updates all controls with the latest values.
+    /// </summary>
+    protected override void UpdateControls() {
+      if (AndConstraint == null) {
+        clausesItemListView.Enabled = false;
+        clausesItemListView.ItemList = null;
+      } else {
+        clausesItemListView.ItemList = AndConstraint.Clauses;
+        clausesItemListView.Enabled = true;
+      }
+    }
+
+    void AndConstraint_Changed(object sender, EventArgs e) {
+      Refresh();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/3.3/AndConstraintView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/AndConstraintView.resx	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/AndConstraintView.resx	(revision 1671)
@@ -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.Constraints/3.3/ConstraintBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/ConstraintBase.cs	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/ConstraintBase.cs	(revision 1671)
@@ -0,0 +1,45 @@
+#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.Constraints {
+  /// <summary>
+  /// Base class for all constraints.
+  /// </summary>
+  public abstract class ConstraintBase : ItemBase, IConstraint {
+    /// <inheritdoc select="summary"/>
+    public virtual string Description {
+      get { return "No constraint description available."; }
+    }
+
+    /// <summary>
+    /// Checks whether the given data fulfills the current constraint.
+    /// </summary>
+    /// <param name="data">The item to check.</param>
+    /// <returns><c>true</c> if the constraint could be fulfilled, <c>false</c> otherwise.</returns>
+    public abstract bool Check(IItem data);
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/3.3/DoubleBoundedConstraint.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/DoubleBoundedConstraint.cs	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/DoubleBoundedConstraint.cs	(revision 1671)
@@ -0,0 +1,263 @@
+#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;
+using System.Globalization;
+
+namespace HeuristicLab.Constraints {
+  /// <summary>
+  /// Constraint where a double value is limited by a one or two sided boundary.
+  /// </summary>
+  public class DoubleBoundedConstraint : ConstraintBase {
+    private double lowerBound;
+    /// <summary>
+    /// Gets or sets the lower bound of the limit.
+    /// </summary>
+    /// <remarks>Calls <see cref="ItemBase.OnChanged"/> of base class <see cref="ConstraintBase"/>
+    /// in the setter.</remarks>
+    public double LowerBound {
+      get { return lowerBound; }
+      set {
+        lowerBound = value;
+        OnChanged();
+      }
+    }
+    private bool lowerBoundIncluded;
+    /// <summary>
+    /// Gets or sets the boolean flag whether the lower bound should be included.
+    /// </summary>
+    /// <remarks>Calls <see cref="ItemBase.OnChanged"/> of base class <see cref="ConstraintBase"/>
+    /// in the setter.</remarks>
+    public bool LowerBoundIncluded {
+      get { return lowerBoundIncluded; }
+      set {
+        lowerBoundIncluded = value;
+        OnChanged();
+      }
+    }
+    private bool lowerBoundEnabled;
+    /// <summary>
+    /// Gets or sets the boolean flag whether the lower bound should be enabled.
+    /// </summary>
+    /// <remarks>Calls <see cref="ItemBase.OnChanged"/> of base class <see cref="ConstraintBase"/>
+    /// in the setter.</remarks>
+    public bool LowerBoundEnabled {
+      get { return lowerBoundEnabled; }
+      set {
+        lowerBoundEnabled = value;
+        OnChanged();
+      }
+    }
+    private double upperBound;
+    /// <summary>
+    /// Gets or sets the upper bound of the limit.
+    /// </summary>
+    /// <remarks>Calls <see cref="ItemBase.OnChanged"/> of base class <see cref="ConstraintBase"/>
+    /// in the setter.</remarks>
+    public double UpperBound {
+      get { return upperBound; }
+      set {
+        upperBound = value;
+        OnChanged();
+      }
+    }
+    private bool upperBoundIncluded;
+    /// <summary>
+    /// Gets or sets the boolean flag whether the upper bound should be included.
+    /// </summary>
+    /// <remarks>Calls <see cref="ItemBase.OnChanged"/> of base class <see cref="ConstraintBase"/>
+    /// in the setter.</remarks>
+    public bool UpperBoundIncluded {
+      get { return upperBoundIncluded; }
+      set {
+        upperBoundIncluded = value;
+        OnChanged();
+      }
+    }
+    private bool upperBoundEnabled;
+    /// <summary>
+    /// Gets or sets the boolean flag whether the upper bound should be enabled.
+    /// </summary>
+    /// <remarks>Calls <see cref="ItemBase.OnChanged"/> of base class <see cref="ConstraintBase"/>
+    /// in the setter.</remarks>
+    public bool UpperBoundEnabled {
+      get { return upperBoundEnabled; }
+      set {
+        upperBoundEnabled = value;
+        OnChanged();
+      }
+    }
+
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get { return "The double is limited one or two sided by a lower and/or upper boundary"; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="DoubleBoundedConstraint"/>.
+    /// </summary>
+    public DoubleBoundedConstraint()
+      : this(double.MinValue, double.MaxValue) {
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="DoubleBoundedConstraint"/> with the two given boundaries.
+    /// </summary>
+    /// <param name="lowerBound">The lower bound of the constraint.</param>
+    /// <param name="upperBound">The upper bound of the constraint.</param>
+    public DoubleBoundedConstraint(double lowerBound, double upperBound)
+      : this(lowerBound, true, upperBound, true) {
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="DoubleBoundedConstraint"/> with the given parameters.
+    /// </summary>
+    /// <param name="lowerBound">The lower bound of the constraint.</param>
+    /// <param name="lowerBoundIncluded">Boolean flag whether the lower bound should be included.</param>
+    /// <param name="upperBound">The upper bound of the constraint.</param>
+    /// <param name="upperBoundIncluded">Boolean flag whether the upper bound should be included.</param>
+    public DoubleBoundedConstraint(double lowerBound, bool lowerBoundIncluded, double upperBound, bool upperBoundIncluded)
+      : base() {
+      this.lowerBound = lowerBound;
+      this.lowerBoundIncluded = lowerBoundIncluded;
+      this.lowerBoundEnabled = true;
+      this.upperBound = upperBound;
+      this.upperBoundIncluded = upperBoundIncluded;
+      this.upperBoundEnabled = true;
+    }
+
+
+    /// <summary>
+    /// Checks whether the given element fulfills the current constraint.
+    /// </summary>
+    /// <param name="data">The item to check.</param>
+    /// <returns><c>true</c> if the constraint could be fulfilled, <c>false</c> otherwise.</returns>
+    public override bool Check(IItem data) {
+      ConstrainedDoubleData d = (data as ConstrainedDoubleData);
+      if (d == null) return false;
+      if (LowerBoundEnabled && ((LowerBoundIncluded && d.CompareTo(LowerBound) < 0)
+        || (!LowerBoundIncluded && d.CompareTo(LowerBound) <= 0))) return false;
+      if (UpperBoundEnabled && ((UpperBoundIncluded && d.CompareTo(UpperBound) > 0)
+        || (!UpperBoundIncluded && d.CompareTo(UpperBound) >= 0))) return false;
+      return true;
+    }
+
+    /// <summary>
+    /// Creates a new instance of <see cref="DoubleBoundedConstraintView"/> to represent the current 
+    /// instance visually.
+    /// </summary>
+    /// <returns>The created view as <see cref="DoubleBoundedConstraintView"/>.</returns>
+    public override IView CreateView() {
+      return new DoubleBoundedConstraintView(this);
+    }
+
+    /// <summary>
+    /// Clones the current instance (deep clone).
+    /// </summary>
+    /// <param name="clonedObjects">Dictionary of all already clone objects. (Needed to avoid cycles.)</param>
+    /// <returns>The cloned object as <see cref="DoubleBoundedConstraint"/>.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      DoubleBoundedConstraint clone = new DoubleBoundedConstraint();
+      clonedObjects.Add(Guid, clone);
+      clone.upperBound = UpperBound;
+      clone.upperBoundIncluded = UpperBoundIncluded;
+      clone.upperBoundEnabled = UpperBoundEnabled;
+      clone.lowerBound = LowerBound;
+      clone.lowerBoundIncluded = LowerBoundIncluded;
+      clone.lowerBoundEnabled = LowerBoundEnabled;
+      return clone;
+    }
+
+    #region persistence
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>The properties of the current instance are saved as attributes with special tag names.</remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where the data is saved.</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);
+      XmlAttribute lb = document.CreateAttribute("LowerBound");
+      lb.Value = LowerBound.ToString("r", CultureInfo.InvariantCulture);
+      XmlAttribute lbi = document.CreateAttribute("LowerBoundIncluded");
+      lbi.Value = lowerBoundIncluded.ToString();
+      XmlAttribute lbe = document.CreateAttribute("LowerBoundEnabled");
+      lbe.Value = lowerBoundEnabled.ToString();
+      XmlAttribute ub = document.CreateAttribute("UpperBound");
+      ub.Value = upperBound.ToString("r", CultureInfo.InvariantCulture);
+      XmlAttribute ubi = document.CreateAttribute("UpperBoundIncluded");
+      ubi.Value = upperBoundIncluded.ToString();
+      XmlAttribute ube = document.CreateAttribute("UpperBoundEnabled");
+      ube.Value = upperBoundEnabled.ToString();
+      node.Attributes.Append(lb);
+      if (!lowerBoundIncluded) node.Attributes.Append(lbi);
+      if (!lowerBoundEnabled) node.Attributes.Append(lbe);
+      node.Attributes.Append(ub);
+      if (!upperBoundIncluded) node.Attributes.Append(ubi);
+      if (!upperBoundEnabled) node.Attributes.Append(ube);
+      return node;
+    }
+
+    /// <summary>
+    /// Loads the persisted constraint from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>The constraint must be saved in a specific way, see <see cref="GetXmlNode"/> for 
+    /// more information.</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the instance 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);
+      lowerBound = double.Parse(node.Attributes["LowerBound"].Value, CultureInfo.InvariantCulture);
+      if (node.Attributes["LowerBoundIncluded"] != null) {
+        lowerBoundIncluded = bool.Parse(node.Attributes["LowerBoundIncluded"].Value);
+      } else {
+        lowerBoundIncluded = true;
+      }
+      if (node.Attributes["LowerBoundEnabled"] != null) {
+        lowerBoundEnabled = bool.Parse(node.Attributes["LowerBoundEnabled"].Value);
+      } else {
+        lowerBoundEnabled = true;
+      }
+
+      upperBound = double.Parse(node.Attributes["UpperBound"].Value, CultureInfo.InvariantCulture);
+      if (node.Attributes["UpperBoundIncluded"] != null) {
+        upperBoundIncluded = bool.Parse(node.Attributes["UpperBoundIncluded"].Value);
+      } else {
+        upperBoundIncluded = true;
+      }
+      if (node.Attributes["UpperBoundEnabled"] != null) {
+        upperBoundEnabled = bool.Parse(node.Attributes["UpperBoundEnabled"].Value);
+      } else {
+        upperBoundEnabled = true;
+      }
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/3.3/DoubleBoundedConstraintView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/DoubleBoundedConstraintView.Designer.cs	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/DoubleBoundedConstraintView.Designer.cs	(revision 1671)
@@ -0,0 +1,148 @@
+#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.Constraints {
+  partial class DoubleBoundedConstraintView {
+    /// <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();
+      }
+      if (DoubleBoundedConstraint != null) DoubleBoundedConstraint.Changed -= new System.EventHandler(DoubleBoundedConstraint_Changed);
+      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.lbEnabledCheckBox = new System.Windows.Forms.CheckBox();
+      this.ubEnabledCheckBox = new System.Windows.Forms.CheckBox();
+      this.lbIncludedCheckBox = new System.Windows.Forms.CheckBox();
+      this.ubIncludedCheckBox = new System.Windows.Forms.CheckBox();
+      this.lbTextBox = new System.Windows.Forms.TextBox();
+      this.ubTextBox = new System.Windows.Forms.TextBox();
+      this.SuspendLayout();
+      // 
+      // lbEnabledCheckBox
+      // 
+      this.lbEnabledCheckBox.AutoSize = true;
+      this.lbEnabledCheckBox.CheckAlign = System.Drawing.ContentAlignment.MiddleRight;
+      this.lbEnabledCheckBox.Location = new System.Drawing.Point(3, 6);
+      this.lbEnabledCheckBox.Name = "lbEnabledCheckBox";
+      this.lbEnabledCheckBox.Size = new System.Drawing.Size(91, 17);
+      this.lbEnabledCheckBox.TabIndex = 20;
+      this.lbEnabledCheckBox.Text = "Lower bound:";
+      this.lbEnabledCheckBox.UseVisualStyleBackColor = true;
+      this.lbEnabledCheckBox.CheckedChanged += new System.EventHandler(this.lbEnabledCheckBox_CheckedChanged);
+      // 
+      // ubEnabledCheckBox
+      // 
+      this.ubEnabledCheckBox.AutoSize = true;
+      this.ubEnabledCheckBox.CheckAlign = System.Drawing.ContentAlignment.MiddleRight;
+      this.ubEnabledCheckBox.Location = new System.Drawing.Point(3, 29);
+      this.ubEnabledCheckBox.Name = "ubEnabledCheckBox";
+      this.ubEnabledCheckBox.Size = new System.Drawing.Size(91, 17);
+      this.ubEnabledCheckBox.TabIndex = 21;
+      this.ubEnabledCheckBox.Text = "Upper bound:";
+      this.ubEnabledCheckBox.UseVisualStyleBackColor = true;
+      this.ubEnabledCheckBox.CheckedChanged += new System.EventHandler(this.ubEnabledCheckBox_CheckedChanged);
+      // 
+      // lbIncludedCheckBox
+      // 
+      this.lbIncludedCheckBox.AutoSize = true;
+      this.lbIncludedCheckBox.Location = new System.Drawing.Point(189, 6);
+      this.lbIncludedCheckBox.Name = "lbIncludedCheckBox";
+      this.lbIncludedCheckBox.Size = new System.Drawing.Size(73, 17);
+      this.lbIncludedCheckBox.TabIndex = 22;
+      this.lbIncludedCheckBox.Text = "Included?";
+      this.lbIncludedCheckBox.UseVisualStyleBackColor = true;
+      this.lbIncludedCheckBox.CheckedChanged += new System.EventHandler(this.lbIncludedCheckBox_CheckedChanged);
+      // 
+      // ubIncludedCheckBox
+      // 
+      this.ubIncludedCheckBox.AutoSize = true;
+      this.ubIncludedCheckBox.Location = new System.Drawing.Point(189, 29);
+      this.ubIncludedCheckBox.Name = "ubIncludedCheckBox";
+      this.ubIncludedCheckBox.Size = new System.Drawing.Size(73, 17);
+      this.ubIncludedCheckBox.TabIndex = 23;
+      this.ubIncludedCheckBox.Text = "Included?";
+      this.ubIncludedCheckBox.UseVisualStyleBackColor = true;
+      this.ubIncludedCheckBox.CheckedChanged += new System.EventHandler(this.ubIncludedCheckBox_CheckedChanged);
+      // 
+      // lbTextBox
+      // 
+      this.lbTextBox.Location = new System.Drawing.Point(100, 4);
+      this.lbTextBox.Name = "lbTextBox";
+      this.lbTextBox.Size = new System.Drawing.Size(83, 20);
+      this.lbTextBox.TabIndex = 24;
+      this.lbTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+      this.lbTextBox.Validated += new System.EventHandler(this.lbTextBox_Validated);
+      this.lbTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.lbTextBox_Validating);
+      // 
+      // ubTextBox
+      // 
+      this.ubTextBox.Location = new System.Drawing.Point(100, 27);
+      this.ubTextBox.Name = "ubTextBox";
+      this.ubTextBox.Size = new System.Drawing.Size(83, 20);
+      this.ubTextBox.TabIndex = 25;
+      this.ubTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+      this.ubTextBox.Validated += new System.EventHandler(this.ubTextBox_Validated);
+      this.ubTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.ubTextBox_Validating);
+      // 
+      // DoubleBoundedConstraintView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.ubTextBox);
+      this.Controls.Add(this.lbTextBox);
+      this.Controls.Add(this.ubIncludedCheckBox);
+      this.Controls.Add(this.lbIncludedCheckBox);
+      this.Controls.Add(this.ubEnabledCheckBox);
+      this.Controls.Add(this.lbEnabledCheckBox);
+      this.Name = "DoubleBoundedConstraintView";
+      this.Size = new System.Drawing.Size(263, 51);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.CheckBox lbEnabledCheckBox;
+    private System.Windows.Forms.CheckBox ubEnabledCheckBox;
+    private System.Windows.Forms.CheckBox lbIncludedCheckBox;
+    private System.Windows.Forms.CheckBox ubIncludedCheckBox;
+    private System.Windows.Forms.TextBox lbTextBox;
+    private System.Windows.Forms.TextBox ubTextBox;
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/3.3/DoubleBoundedConstraintView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/DoubleBoundedConstraintView.cs	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/DoubleBoundedConstraintView.cs	(revision 1671)
@@ -0,0 +1,163 @@
+#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;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Constraints {
+  /// <summary>
+  /// The visual representation of a <see cref="DoubleBoundedConstraint"/>.
+  /// </summary>
+  public partial class DoubleBoundedConstraintView : ViewBase {
+    /// <summary>
+    /// Gets or sets the DoubleBoundedConstraint to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>.
+    /// No own data storage present.</remarks>
+    public DoubleBoundedConstraint DoubleBoundedConstraint {
+      get { return (DoubleBoundedConstraint)Item; }
+      set { base.Item = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="DoubleBoundedConstraintView"/>.
+    /// </summary>
+    public DoubleBoundedConstraintView() {
+      InitializeComponent();
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="DoubleBoundedConstraintView"/> with the given
+    /// <paramref name="doubleBoundedConstraint"/> to display.
+    /// </summary>
+    /// <param name="doubleBoundedConstraint">The constraint to represent visually.</param>
+    public DoubleBoundedConstraintView(DoubleBoundedConstraint doubleBoundedConstraint)
+      : this() {
+      DoubleBoundedConstraint = doubleBoundedConstraint;
+    }
+
+    /// <summary>
+    /// Removes the eventhandler from the underlying <see cref="DoubleBoundedConstraint"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.
+    /// </remarks>
+    protected override void RemoveItemEvents() {
+      DoubleBoundedConstraint.Changed -= new EventHandler(DoubleBoundedConstraint_Changed); 
+      base.RemoveItemEvents();
+    }
+
+    /// <summary>
+    /// Adds an eventhandler to the underlying <see cref="DoubleBoundedConstraint"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.
+    /// </remarks>
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      DoubleBoundedConstraint.Changed += new EventHandler(DoubleBoundedConstraint_Changed);
+    }
+
+    /// <summary>
+    /// Updates all controls with the latest values.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.UpdateControls"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (DoubleBoundedConstraint == null) {
+        lbTextBox.Enabled = false;
+        lbTextBox.Text = "";
+        lbIncludedCheckBox.Enabled = false;
+        lbEnabledCheckBox.Checked = false;
+
+        ubTextBox.Enabled = false;
+        ubTextBox.Text = "";
+        ubIncludedCheckBox.Checked = false;
+        ubEnabledCheckBox.Enabled = false;
+      } else {
+        lbTextBox.Text = DoubleBoundedConstraint.LowerBound.ToString("r");
+        lbTextBox.Enabled = DoubleBoundedConstraint.LowerBoundEnabled;
+        lbIncludedCheckBox.Checked = DoubleBoundedConstraint.LowerBoundIncluded;
+        lbIncludedCheckBox.Enabled = true;
+        lbEnabledCheckBox.Checked = DoubleBoundedConstraint.LowerBoundEnabled;
+        lbEnabledCheckBox.Enabled = true;
+
+        ubTextBox.Text = DoubleBoundedConstraint.UpperBound.ToString("r");
+        ubTextBox.Enabled = DoubleBoundedConstraint.UpperBoundEnabled;
+        ubIncludedCheckBox.Checked = DoubleBoundedConstraint.UpperBoundIncluded;
+        ubIncludedCheckBox.Enabled = true;
+        ubEnabledCheckBox.Checked = DoubleBoundedConstraint.UpperBoundEnabled;
+        ubEnabledCheckBox.Enabled = true;
+      }
+    }
+
+    void DoubleBoundedConstraint_Changed(object sender, EventArgs e) {
+      Refresh();
+    }
+
+    private void lbEnabledCheckBox_CheckedChanged(object sender, EventArgs e) {
+      DoubleBoundedConstraint.LowerBoundEnabled = lbEnabledCheckBox.Checked;
+      lbTextBox.Enabled = lbEnabledCheckBox.Checked;
+      lbIncludedCheckBox.Enabled = lbEnabledCheckBox.Checked;
+    }
+
+    private void ubEnabledCheckBox_CheckedChanged(object sender, EventArgs e) {
+      DoubleBoundedConstraint.UpperBoundEnabled = ubEnabledCheckBox.Checked;
+      ubTextBox.Enabled = ubEnabledCheckBox.Checked;
+      ubIncludedCheckBox.Enabled = ubEnabledCheckBox.Checked;
+    }
+
+    private void lbIncludedCheckBox_CheckedChanged(object sender, EventArgs e) {
+      DoubleBoundedConstraint.LowerBoundIncluded = lbIncludedCheckBox.Checked;
+    }
+
+    private void ubIncludedCheckBox_CheckedChanged(object sender, EventArgs e) {
+      DoubleBoundedConstraint.UpperBoundIncluded = ubIncludedCheckBox.Checked;
+    }
+
+    private void lbTextBox_Validating(object sender, CancelEventArgs e) {
+      double result;
+      if (!double.TryParse(lbTextBox.Text, out result)) {
+        e.Cancel = true;
+      } 
+    }
+
+    private void ubTextBox_Validating(object sender, CancelEventArgs e) {
+      double result;
+      if (!double.TryParse(ubTextBox.Text, out result)) {
+        e.Cancel = true;
+      } 
+    }
+
+    private void lbTextBox_Validated(object sender, EventArgs e) {
+      DoubleBoundedConstraint.LowerBound = double.Parse(lbTextBox.Text);
+    }
+
+    private void ubTextBox_Validated(object sender, EventArgs e) {
+      DoubleBoundedConstraint.UpperBound = double.Parse(ubTextBox.Text);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/3.3/DoubleBoundedConstraintView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/DoubleBoundedConstraintView.resx	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/DoubleBoundedConstraintView.resx	(revision 1671)
@@ -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.Constraints/3.3/HeuristicLab.Constraints-3.2.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/HeuristicLab.Constraints-3.2.csproj	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/HeuristicLab.Constraints-3.2.csproj	(revision 1671)
@@ -0,0 +1,232 @@
+﻿<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>{FCD62C6F-4793-4593-AE9A-0BDCA256EE99}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Constraints</RootNamespace>
+    <AssemblyName>HeuristicLab.Constraints-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>
+  </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.Constraints-3.2.XML</DocumentationFile>
+  </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.Constraints-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.Constraints-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="AllSubOperatorsTypeConstraint.cs" />
+    <Compile Include="AllSubOperatorsTypeConstraintView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="AllSubOperatorsTypeConstraintView.designer.cs">
+      <DependentUpon>AllSubOperatorsTypeConstraintView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="AndConstraint.cs" />
+    <Compile Include="AndConstraintView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="AndConstraintView.Designer.cs">
+      <DependentUpon>AndConstraintView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ConstraintBase.cs" />
+    <Compile Include="DoubleBoundedConstraint.cs" />
+    <Compile Include="DoubleBoundedConstraintView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="DoubleBoundedConstraintView.Designer.cs">
+      <DependentUpon>DoubleBoundedConstraintView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="IntBoundedConstraint.cs" />
+    <Compile Include="IntBoundedConstraintView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="IntBoundedConstraintView.Designer.cs">
+      <DependentUpon>IntBoundedConstraintView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="IsIntegerConstraint.cs" />
+    <Compile Include="ItemTypeConstraint.cs" />
+    <Compile Include="ItemTypeConstraintView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ItemTypeConstraintView.Designer.cs">
+      <DependentUpon>ItemTypeConstraintView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="NotConstraint.cs" />
+    <Compile Include="NotConstraintView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="NotConstraintView.Designer.cs">
+      <DependentUpon>NotConstraintView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="NumberOfSubOperatorsConstraint.cs" />
+    <Compile Include="NumberOfSubOperatorsConstraintView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="NumberOfSubOperatorsConstraintView.Designer.cs">
+      <DependentUpon>NumberOfSubOperatorsConstraintView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="OrConstraint.cs" />
+    <Compile Include="OrConstraintView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="OrConstraintView.Designer.cs">
+      <DependentUpon>OrConstraintView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="SubOperatorsConstraintAnalyser.cs" />
+    <Compile Include="SubOperatorsTypeConstraint.cs" />
+    <Compile Include="SubOperatorsTypeConstraintView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="SubOperatorsTypeConstraintView.designer.cs">
+      <DependentUpon>SubOperatorsTypeConstraintView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="HeuristicLabConstraintsPlugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="VariableComparisonConstraint.cs" />
+    <Compile Include="VariableComparisonConstraintView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="VariableComparisonConstraintView.Designer.cs">
+      <DependentUpon>VariableComparisonConstraintView.cs</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <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="AllSubOperatorsTypeConstraintView.resx">
+      <DependentUpon>AllSubOperatorsTypeConstraintView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="AndConstraintView.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>AndConstraintView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="DoubleBoundedConstraintView.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>DoubleBoundedConstraintView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="IntBoundedConstraintView.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>IntBoundedConstraintView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ItemTypeConstraintView.resx">
+      <DependentUpon>ItemTypeConstraintView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="NotConstraintView.resx">
+      <DependentUpon>NotConstraintView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="NumberOfSubOperatorsConstraintView.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>NumberOfSubOperatorsConstraintView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="OrConstraintView.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>OrConstraintView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="SubOperatorsTypeConstraintView.resx">
+      <DependentUpon>SubOperatorsTypeConstraintView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="VariableComparisonConstraintView.resx">
+      <DependentUpon>VariableComparisonConstraintView.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.Constraints/3.3/HeuristicLabConstraintsPlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/HeuristicLabConstraintsPlugin.cs	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/HeuristicLabConstraintsPlugin.cs	(revision 1671)
@@ -0,0 +1,38 @@
+#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.Constraints {
+  /// <summary>
+  /// Plugin class for HeuristicLab.Constraints plugin.
+  /// </summary>
+  [ClassInfo(Name = "HeuristicLab.Constraints-3.2")]
+  [PluginFile(Filename = "HeuristicLab.Constraints-3.2.dll", Filetype = PluginFileType.Assembly)]
+  [Dependency(Dependency = "HeuristicLab.Core-3.2")]
+  [Dependency(Dependency = "HeuristicLab.Data-3.2")]
+  [Dependency(Dependency = "HeuristicLab.Operators-3.2")]
+  public class HeuristicLabConstraintsPlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/3.3/IntBoundedConstraint.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/IntBoundedConstraint.cs	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/IntBoundedConstraint.cs	(revision 1671)
@@ -0,0 +1,249 @@
+#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.Constraints {
+  /// <summary>
+  /// Constraint where an integer value is limited by a one or two sided boundary.
+  /// </summary>
+  public class IntBoundedConstraint : ConstraintBase {
+    private int lowerBound;
+    /// <summary>
+    /// Gets or sets the lower bound of the limit.
+    /// </summary>
+    /// <remarks>Calls <see cref="ItemBase.OnChanged"/> of base class <see cref="ConstraintBase"/>
+    /// in the setter.</remarks>
+    public int LowerBound {
+      get { return lowerBound; }
+      set {
+        lowerBound = value;
+        OnChanged();
+      }
+    }
+    private bool lowerBoundIncluded;
+    /// <summary>
+    /// Gets or sets the boolean flag whether the lower bound should be included.
+    /// </summary>
+    /// <remarks>Calls <see cref="ItemBase.OnChanged"/> of base class <see cref="ConstraintBase"/>
+    /// in the setter.</remarks>
+    public bool LowerBoundIncluded {
+      get { return lowerBoundIncluded; }
+      set {
+        lowerBoundIncluded = value;
+        OnChanged();
+      }
+    }
+    private bool lowerBoundEnabled;
+    /// <summary>
+    /// Gets or sets the boolean flag whether the lower bound should be enabled.
+    /// </summary>
+    /// <remarks>Calls <see cref="ItemBase.OnChanged"/> of base class <see cref="ConstraintBase"/>
+    /// in the setter.</remarks>
+    public bool LowerBoundEnabled {
+      get { return lowerBoundEnabled; }
+      set {
+        lowerBoundEnabled = value;
+        OnChanged();
+      }
+    }
+    private int upperBound;
+    /// <summary>
+    /// Gets or sets the upper bound of the limit.
+    /// </summary>
+    /// <remarks>Calls <see cref="ItemBase.OnChanged"/> of base class <see cref="ConstraintBase"/>
+    /// in the setter.</remarks>
+    public int UpperBound {
+      get { return upperBound; }
+      set {
+        upperBound = value;
+        OnChanged();
+      }
+    }
+    private bool upperBoundIncluded;
+    /// <summary>
+    /// Gets or sets the boolean flag whether the upper bound should be included.
+    /// </summary>
+    /// <remarks>Calls <see cref="ItemBase.OnChanged"/> of base class <see cref="ConstraintBase"/>
+    /// in the setter.</remarks>
+    public bool UpperBoundIncluded {
+      get { return upperBoundIncluded; }
+      set {
+        upperBoundIncluded = value;
+        OnChanged();
+      }
+    }
+    private bool upperBoundEnabled;
+    /// <summary>
+    /// Gets or sets the boolean flag whether the upper bound should be enabled.
+    /// </summary>
+    /// <remarks>Calls <see cref="ItemBase.OnChanged"/> of base class <see cref="ConstraintBase"/>
+    /// in the setter.</remarks>
+    public bool UpperBoundEnabled {
+      get { return upperBoundEnabled; }
+      set {
+        upperBoundEnabled = value;
+        OnChanged();
+      }
+    }
+
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get { return "The integer is limited one or two sided by a lower and/or upper boundary"; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="IntBoundedConstraint"/>.
+    /// </summary>
+    public IntBoundedConstraint()
+      : this(int.MinValue, int.MaxValue) {
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="IntBoundedConstraint"/> with the two given boundaries.
+    /// </summary>
+    /// <param name="low">The lower bound of the constraint.</param>
+    /// <param name="high">The upper bound of the constraint.</param>
+    public IntBoundedConstraint(int low, int high) : base() {
+      lowerBound = low;
+      lowerBoundIncluded = false;
+      lowerBoundEnabled = true;
+      upperBound = high;
+      upperBoundIncluded = false;
+      upperBoundEnabled = true;
+    }
+
+    /// <summary>
+    /// Checks whether the given element fulfills the current constraint.
+    /// </summary>
+    /// <param name="data">The item to check.</param>
+    /// <returns><c>true</c> if the constraint could be fulfilled, <c>false</c> otherwise.</returns>
+    public override bool Check(IItem data) {
+      ConstrainedIntData d = (data as ConstrainedIntData);
+      if (d == null) return false;
+      if (LowerBoundEnabled && ((LowerBoundIncluded && d.CompareTo(LowerBound) < 0)
+        || (!LowerBoundIncluded && d.CompareTo(LowerBound) <= 0))) return false;
+      if (UpperBoundEnabled && ((UpperBoundIncluded && d.CompareTo(UpperBound) > 0)
+        || (!UpperBoundIncluded && d.CompareTo(UpperBound) >= 0))) return false;
+      return true;
+    }
+
+    /// <summary>
+    /// Creates a new instance of <see cref="IntBoundedConstraintView"/> to represent the current 
+    /// instance visually.
+    /// </summary>
+    /// <returns>The created view as <see cref="IntBoundedConstraintView"/>.</returns>
+    public override IView CreateView() {
+      return new IntBoundedConstraintView(this);
+    }
+
+    /// <summary>
+    /// Clones the current instance (deep clone).
+    /// </summary>
+    /// <param name="clonedObjects">Dictionary of all already clone objects. (Needed to avoid cycles.)</param>
+    /// <returns>The cloned object as <see cref="IntBoundedConstraint"/>.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      IntBoundedConstraint clone = new IntBoundedConstraint();
+      clonedObjects.Add(Guid, clone);
+      clone.upperBound = UpperBound;
+      clone.upperBoundIncluded = UpperBoundIncluded;
+      clone.upperBoundEnabled = UpperBoundEnabled;
+      clone.lowerBound = LowerBound;
+      clone.lowerBoundIncluded = LowerBoundIncluded;
+      clone.lowerBoundEnabled = LowerBoundEnabled;
+      return clone;
+    }
+
+    #region persistence
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>The properties of the current instance are saved as attributes with special tag names.</remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where the data is saved.</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);
+      XmlAttribute lb = document.CreateAttribute("LowerBound");
+      lb.Value = LowerBound + "";
+      XmlAttribute lbi = document.CreateAttribute("LowerBoundIncluded");
+      lbi.Value = lowerBoundIncluded + "";
+      XmlAttribute lbe = document.CreateAttribute("LowerBoundEnabled");
+      lbe.Value = lowerBoundEnabled + "";
+      XmlAttribute ub = document.CreateAttribute("UpperBound");
+      ub.Value = upperBound + "";
+      XmlAttribute ubi = document.CreateAttribute("UpperBoundIncluded");
+      ubi.Value = upperBoundIncluded + "";
+      XmlAttribute ube = document.CreateAttribute("UpperBoundEnabled");
+      ube.Value = upperBoundEnabled + "";
+      node.Attributes.Append(lb);
+      if (!lowerBoundIncluded) node.Attributes.Append(lbi);
+      if (!lowerBoundEnabled) node.Attributes.Append(lbe);
+      node.Attributes.Append(ub);
+      if (!upperBoundIncluded) node.Attributes.Append(ubi);
+      if (!upperBoundEnabled) node.Attributes.Append(ube);
+      return node;
+    }
+
+    /// <summary>
+    /// Loads the persisted constraint from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>The constraint must be saved in a specific way, see <see cref="GetXmlNode"/> for 
+    /// more information.</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the instance 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);
+      lowerBound = int.Parse(node.Attributes["LowerBound"].Value);
+      if (node.Attributes["LowerBoundIncluded"] != null) {
+        lowerBoundIncluded = bool.Parse(node.Attributes["LowerBoundIncluded"].Value);
+      } else {
+        lowerBoundIncluded = true;
+      }
+      if (node.Attributes["LowerBoundEnabled"] != null) {
+        lowerBoundEnabled = bool.Parse(node.Attributes["LowerBoundEnabled"].Value);
+      } else {
+        lowerBoundEnabled = true;
+      }
+
+      upperBound = int.Parse(node.Attributes["UpperBound"].Value);
+      if (node.Attributes["UpperBoundIncluded"] != null) {
+        upperBoundIncluded = bool.Parse(node.Attributes["UpperBoundIncluded"].Value);
+      } else {
+        upperBoundIncluded = true;
+      }
+      if (node.Attributes["UpperBoundEnabled"] != null) {
+        upperBoundEnabled = bool.Parse(node.Attributes["UpperBoundEnabled"].Value);
+      } else {
+        upperBoundEnabled = true;
+      }
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/3.3/IntBoundedConstraintView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/IntBoundedConstraintView.Designer.cs	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/IntBoundedConstraintView.Designer.cs	(revision 1671)
@@ -0,0 +1,149 @@
+#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.Constraints {
+  partial class IntBoundedConstraintView {
+    /// <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();
+      }
+      if (IntBoundedConstraint != null) IntBoundedConstraint.Changed -= new System.EventHandler(IntBoundedConstraint_Changed);
+      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.lbEnabledCheckBox = new System.Windows.Forms.CheckBox();
+      this.ubEnabledCheckBox = new System.Windows.Forms.CheckBox();
+      this.lbIncludedCheckBox = new System.Windows.Forms.CheckBox();
+      this.ubIncludedCheckBox = new System.Windows.Forms.CheckBox();
+      this.lbTextBox = new System.Windows.Forms.TextBox();
+      this.ubTextBox = new System.Windows.Forms.TextBox();
+      this.SuspendLayout();
+      // 
+      // lbEnabledCheckBox
+      // 
+      this.lbEnabledCheckBox.AutoSize = true;
+      this.lbEnabledCheckBox.CheckAlign = System.Drawing.ContentAlignment.MiddleRight;
+      this.lbEnabledCheckBox.Location = new System.Drawing.Point(4, 4);
+      this.lbEnabledCheckBox.Name = "lbEnabledCheckBox";
+      this.lbEnabledCheckBox.Size = new System.Drawing.Size(91, 17);
+      this.lbEnabledCheckBox.TabIndex = 0;
+      this.lbEnabledCheckBox.Text = "Lower bound:";
+      this.lbEnabledCheckBox.UseVisualStyleBackColor = true;
+      this.lbEnabledCheckBox.CheckedChanged += new System.EventHandler(this.lbEnabledCheckBox_CheckedChanged);
+      // 
+      // ubEnabledCheckBox
+      // 
+      this.ubEnabledCheckBox.AutoSize = true;
+      this.ubEnabledCheckBox.CheckAlign = System.Drawing.ContentAlignment.MiddleRight;
+      this.ubEnabledCheckBox.Location = new System.Drawing.Point(4, 27);
+      this.ubEnabledCheckBox.Name = "ubEnabledCheckBox";
+      this.ubEnabledCheckBox.Size = new System.Drawing.Size(91, 17);
+      this.ubEnabledCheckBox.TabIndex = 1;
+      this.ubEnabledCheckBox.Text = "Upper bound:";
+      this.ubEnabledCheckBox.UseVisualStyleBackColor = true;
+      this.ubEnabledCheckBox.CheckedChanged += new System.EventHandler(this.ubEnabledCheckBox_CheckedChanged);
+      // 
+      // lbIncludedCheckBox
+      // 
+      this.lbIncludedCheckBox.AutoSize = true;
+      this.lbIncludedCheckBox.Location = new System.Drawing.Point(207, 4);
+      this.lbIncludedCheckBox.Name = "lbIncludedCheckBox";
+      this.lbIncludedCheckBox.Size = new System.Drawing.Size(73, 17);
+      this.lbIncludedCheckBox.TabIndex = 2;
+      this.lbIncludedCheckBox.Text = "Included?";
+      this.lbIncludedCheckBox.UseVisualStyleBackColor = true;
+      this.lbIncludedCheckBox.CheckedChanged += new System.EventHandler(this.lbIncludedCheckBox_CheckedChanged);
+      // 
+      // ubIncludedCheckBox
+      // 
+      this.ubIncludedCheckBox.AutoSize = true;
+      this.ubIncludedCheckBox.Location = new System.Drawing.Point(207, 27);
+      this.ubIncludedCheckBox.Name = "ubIncludedCheckBox";
+      this.ubIncludedCheckBox.Size = new System.Drawing.Size(73, 17);
+      this.ubIncludedCheckBox.TabIndex = 3;
+      this.ubIncludedCheckBox.Text = "Included?";
+      this.ubIncludedCheckBox.UseVisualStyleBackColor = true;
+      this.ubIncludedCheckBox.CheckedChanged += new System.EventHandler(this.ubIncludedCheckBox_CheckedChanged);
+      // 
+      // lbTextBox
+      // 
+      this.lbTextBox.Location = new System.Drawing.Point(101, 2);
+      this.lbTextBox.Name = "lbTextBox";
+      this.lbTextBox.Size = new System.Drawing.Size(100, 20);
+      this.lbTextBox.TabIndex = 4;
+      this.lbTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+      this.lbTextBox.Validated += new System.EventHandler(this.lbTextBox_Validated);
+      this.lbTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.lbTextBox_Validating);
+      // 
+      // ubTextBox
+      // 
+      this.ubTextBox.Location = new System.Drawing.Point(101, 25);
+      this.ubTextBox.Name = "ubTextBox";
+      this.ubTextBox.Size = new System.Drawing.Size(100, 20);
+      this.ubTextBox.TabIndex = 5;
+      this.ubTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+      this.ubTextBox.Validated += new System.EventHandler(this.ubTextBox_Validated);
+      this.ubTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.ubTextBox_Validating);
+      // 
+      // IntBoundedConstraintView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.ubTextBox);
+      this.Controls.Add(this.lbTextBox);
+      this.Controls.Add(this.ubIncludedCheckBox);
+      this.Controls.Add(this.lbIncludedCheckBox);
+      this.Controls.Add(this.ubEnabledCheckBox);
+      this.Controls.Add(this.lbEnabledCheckBox);
+      this.Name = "IntBoundedConstraintView";
+      this.Size = new System.Drawing.Size(280, 52);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.CheckBox lbEnabledCheckBox;
+    private System.Windows.Forms.CheckBox ubEnabledCheckBox;
+    private System.Windows.Forms.CheckBox lbIncludedCheckBox;
+    private System.Windows.Forms.CheckBox ubIncludedCheckBox;
+    private System.Windows.Forms.TextBox lbTextBox;
+    private System.Windows.Forms.TextBox ubTextBox;
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/3.3/IntBoundedConstraintView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/IntBoundedConstraintView.cs	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/IntBoundedConstraintView.cs	(revision 1671)
@@ -0,0 +1,163 @@
+#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;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Constraints {
+  /// <summary>
+  /// The visual representation of an <see cref="IntBoundedConstraint"/>.
+  /// </summary>
+  public partial class IntBoundedConstraintView : ViewBase {
+    /// <summary>
+    /// Gets or sets the the IntBoundedConstraint to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>.
+    /// No own data storage present.</remarks>
+    public IntBoundedConstraint IntBoundedConstraint {
+      get { return (IntBoundedConstraint)Item; }
+      set { base.Item = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="IntBoundedConstraintView"/>.
+    /// </summary>
+    public IntBoundedConstraintView() {
+      InitializeComponent();
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="IntBoundedConstraintView"/> with the given
+    /// <paramref name="intBoundedConstraint"/> to display.
+    /// </summary>
+    /// <param name="intBoundedConstraint">The constraint to represent visually.</param>
+    public IntBoundedConstraintView(IntBoundedConstraint intBoundedConstraint)
+      : this() {
+      IntBoundedConstraint = intBoundedConstraint;
+    }
+
+    /// <summary>
+    /// Removes the eventhandler from the underlying <see cref="IntBoundedConstraint"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.
+    /// </remarks>
+    protected override void RemoveItemEvents() {
+      IntBoundedConstraint.Changed -= new EventHandler(IntBoundedConstraint_Changed);
+      base.RemoveItemEvents();
+    }
+
+    /// <summary>
+    /// Adds an eventhandler to the underlying <see cref="IntBoundedConstraint"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.
+    /// </remarks>
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      IntBoundedConstraint.Changed += new EventHandler(IntBoundedConstraint_Changed);
+    }
+
+    /// <summary>
+    /// Updates all controls with the latest values.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.UpdateControls"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (IntBoundedConstraint == null) {
+        lbTextBox.Enabled = false;
+        lbTextBox.Text = "";
+        lbIncludedCheckBox.Enabled = false;
+        lbEnabledCheckBox.Checked = false;
+
+        ubTextBox.Enabled = false;
+        ubTextBox.Text = "";
+        ubIncludedCheckBox.Enabled = false;
+        ubEnabledCheckBox.Checked = false;
+      } else {
+        lbTextBox.Text = IntBoundedConstraint.LowerBound + "";
+        lbTextBox.Enabled = IntBoundedConstraint.LowerBoundEnabled;
+        lbIncludedCheckBox.Checked = IntBoundedConstraint.LowerBoundIncluded;
+        lbIncludedCheckBox.Enabled = true;
+        lbEnabledCheckBox.Checked = IntBoundedConstraint.LowerBoundEnabled;
+        lbEnabledCheckBox.Enabled = true;
+
+        ubTextBox.Text = IntBoundedConstraint.UpperBound + "";
+        ubTextBox.Enabled = IntBoundedConstraint.UpperBoundEnabled;
+        ubIncludedCheckBox.Checked = IntBoundedConstraint.UpperBoundIncluded;
+        ubIncludedCheckBox.Enabled = true;
+        ubEnabledCheckBox.Checked = IntBoundedConstraint.UpperBoundEnabled;
+        ubEnabledCheckBox.Enabled = true;
+      }
+    }
+
+    void IntBoundedConstraint_Changed(object sender, EventArgs e) {
+      Refresh();
+    }
+
+    private void lbEnabledCheckBox_CheckedChanged(object sender, EventArgs e) {
+      IntBoundedConstraint.LowerBoundEnabled = lbEnabledCheckBox.Checked;
+      lbTextBox.Enabled = lbEnabledCheckBox.Checked;
+      lbIncludedCheckBox.Enabled = lbEnabledCheckBox.Checked;
+    }
+
+    private void ubEnabledCheckBox_CheckedChanged(object sender, EventArgs e) {
+      IntBoundedConstraint.UpperBoundEnabled = ubEnabledCheckBox.Checked;
+      ubTextBox.Enabled = ubEnabledCheckBox.Checked;
+      ubIncludedCheckBox.Enabled = ubEnabledCheckBox.Checked;
+    }
+
+    private void lbIncludedCheckBox_CheckedChanged(object sender, EventArgs e) {
+      IntBoundedConstraint.LowerBoundIncluded = lbIncludedCheckBox.Checked;
+    }
+
+    private void ubIncludedCheckBox_CheckedChanged(object sender, EventArgs e) {
+      IntBoundedConstraint.UpperBoundIncluded = ubIncludedCheckBox.Checked;
+    }
+
+    private void lbTextBox_Validating(object sender, CancelEventArgs e) {
+      int result;
+      if (!int.TryParse(lbTextBox.Text, out result)) {
+        e.Cancel = true;
+      }
+    }
+
+    private void lbTextBox_Validated(object sender, EventArgs e) {
+      IntBoundedConstraint.LowerBound = int.Parse(lbTextBox.Text);
+    }
+
+    private void ubTextBox_Validating(object sender, CancelEventArgs e) {
+      int result;
+      if (!int.TryParse(ubTextBox.Text, out result)) {
+        e.Cancel = true;
+      }
+    }
+
+    private void ubTextBox_Validated(object sender, EventArgs e) {
+      IntBoundedConstraint.UpperBound = int.Parse(ubTextBox.Text);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/3.3/IntBoundedConstraintView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/IntBoundedConstraintView.resx	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/IntBoundedConstraintView.resx	(revision 1671)
@@ -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.Constraints/3.3/IsIntegerConstraint.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/IsIntegerConstraint.cs	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/IsIntegerConstraint.cs	(revision 1671)
@@ -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.Constraints {
+  /// <summary>
+  /// Constraint that allows only integer values.
+  /// </summary>
+  public class IsIntegerConstraint : ConstraintBase{
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get { return "Allows only integer values."; }
+    }
+
+    /// <summary>
+    /// Checks whether the given element fulfills the current constraint.
+    /// </summary>
+    /// <param name="item">The item to check.</param>
+    /// <returns><c>true</c> if the constraint could be fulfilled, <c>false</c> otherwise.</returns>
+    public override bool Check(IItem item) {
+      // ConstrainedIntData is always integer => just return true
+      if(item is ConstrainedIntData)
+        return true;
+
+      // if we have an item of ConstrainedDoubleData then we check if it is integer or not
+      if(item is ConstrainedDoubleData) {
+        ConstrainedDoubleData d = (ConstrainedDoubleData)item;
+        if(d.Data == Math.Truncate(d.Data)) {
+          return true;
+        } else {
+          return false;
+        }
+      }
+
+      // assume that all other data types are never integer
+      return false;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/3.3/ItemTypeConstraint.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/ItemTypeConstraint.cs	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/ItemTypeConstraint.cs	(revision 1671)
@@ -0,0 +1,142 @@
+#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.Constraints {
+  /// <summary>
+  /// Constraint that limits the type of a given item.
+  /// </summary>
+  /// <remarks>If the item is a <see cref="ConstrainedItemList"/>, any containing elements are limited to 
+  /// the type and not the <see cref="ConstrainedItemList"/> itself.</remarks>
+  public class ItemTypeConstraint : ConstraintBase {
+    private Type type;
+    /// <summary>
+    /// Gets or sets the type to which the items should be limited.
+    /// </summary>
+    /// <remarks>Calls <see cref="ItemBase.OnChanged"/> of base class <see cref="ConstraintBase"/>
+    /// in the setter.</remarks>
+    public Type Type {
+      get { return type; }
+      set {
+        type = value;
+        OnChanged();
+      }
+    }
+
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get {
+        return @"The ItemTypeConstraint limits the type of a given item.
+If the item is a ConstrainedItemList, any containing elements are limited to the type and not the ConstrainedItemList itself.";
+      }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ItemTypeConstraint"/> with the <c>Type</c> property
+    /// set to <see cref="ItemBase"/> as default.
+    /// </summary>
+    public ItemTypeConstraint() {
+      type = typeof(ItemBase);
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ItemTypeConstraint"/> with the given <paramref name="type"/>.
+    /// </summary>
+    /// <param name="type">The type the items should be limited to.</param>
+    public ItemTypeConstraint(Type type) {
+      this.type = type;
+    }
+
+    /// <summary>
+    /// Checks whether the given element fulfills the current constraint.
+    /// </summary>
+    /// <param name="data">The item to check.</param>
+    /// <returns><c>true</c> if the constraint could be fulfilled, <c>false</c> otherwise.</returns>
+    public override bool Check(IItem data) {
+      ConstrainedItemList list = (data as ConstrainedItemList);
+      if (list != null) {
+        for (int i = 0; i < list.Count; i++)
+          if (!list[i].GetType().Equals(type)) return false;
+        return true;
+      }
+      return data.GetType().Equals(type);
+    }
+
+    /// <summary>
+    /// Creates a new instance of <see cref="ItemTypeConstraintView"/> to represent the current 
+    /// instance visually.
+    /// </summary>
+    /// <returns>The created view as <see cref="ItemTypeConstraintView"/>.</returns>
+    public override IView CreateView() {
+      return new ItemTypeConstraintView(this);
+    }
+
+    #region clone & persistence
+    /// <summary>
+    /// Clones the current instance (deep clone).
+    /// </summary>
+    /// <param name="clonedObjects">Dictionary of all already clone objects. (Needed to avoid cycles.)</param>
+    /// <returns>The cloned object as <see cref="ItemTypeConstraint"/>.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      ItemTypeConstraint clone = new ItemTypeConstraint(type);
+      clonedObjects.Add(Guid, clone);
+      return clone;
+    }
+
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>The type of the current instance is saved as attribute with tag name <c>ItemType</c>.</remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where the data is saved.</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);
+      XmlAttribute itemTypeAttribute = document.CreateAttribute("ItemType");
+      itemTypeAttribute.Value = PersistenceManager.BuildTypeString(Type);
+      node.Attributes.Append(itemTypeAttribute);
+      return node;
+    }
+
+    /// <summary>
+    /// Loads the persisted constraint from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>The constraint must be saved in a specific way, see <see cref="GetXmlNode"/> for 
+    /// more information.</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the instance 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);
+      XmlAttribute itemTypeAttribute = node.Attributes["ItemType"];
+      type = Type.GetType(itemTypeAttribute.Value);
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/3.3/ItemTypeConstraintView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/ItemTypeConstraintView.Designer.cs	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/ItemTypeConstraintView.Designer.cs	(revision 1671)
@@ -0,0 +1,98 @@
+#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.Constraints {
+  partial class ItemTypeConstraintView {
+    /// <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.typeTextBox = new System.Windows.Forms.TextBox();
+      this.setButton = new System.Windows.Forms.Button();
+      this.typeLabel = new System.Windows.Forms.Label();
+      this.SuspendLayout();
+      // 
+      // typeTextBox
+      // 
+      this.typeTextBox.Location = new System.Drawing.Point(45, 3);
+      this.typeTextBox.Name = "typeTextBox";
+      this.typeTextBox.Size = new System.Drawing.Size(189, 20);
+      this.typeTextBox.TabIndex = 0;
+      // 
+      // setButton
+      // 
+      this.setButton.Location = new System.Drawing.Point(240, 1);
+      this.setButton.Name = "setButton";
+      this.setButton.Size = new System.Drawing.Size(44, 23);
+      this.setButton.TabIndex = 1;
+      this.setButton.Text = "Set";
+      this.setButton.UseVisualStyleBackColor = true;
+      this.setButton.Click += new System.EventHandler(this.setButton_Click);
+      // 
+      // typeLabel
+      // 
+      this.typeLabel.AutoSize = true;
+      this.typeLabel.Location = new System.Drawing.Point(5, 6);
+      this.typeLabel.Name = "typeLabel";
+      this.typeLabel.Size = new System.Drawing.Size(34, 13);
+      this.typeLabel.TabIndex = 2;
+      this.typeLabel.Text = "Type:";
+      // 
+      // ItemTypeConstraintView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.typeLabel);
+      this.Controls.Add(this.setButton);
+      this.Controls.Add(this.typeTextBox);
+      this.Name = "ItemTypeConstraintView";
+      this.Size = new System.Drawing.Size(287, 26);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TextBox typeTextBox;
+    private System.Windows.Forms.Button setButton;
+    private System.Windows.Forms.Label typeLabel;
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/3.3/ItemTypeConstraintView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/ItemTypeConstraintView.cs	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/ItemTypeConstraintView.cs	(revision 1671)
@@ -0,0 +1,112 @@
+#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;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Constraints {
+  /// <summary>
+  /// The visual representation of an <see cref="ItemTypeConstraint"/>.
+  /// </summary>
+  public partial class ItemTypeConstraintView : ViewBase {
+    /// <summary>
+    /// Gets or sets the ItemTypeConstraint to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>.
+    /// No own data storage present.</remarks>
+    private ItemTypeConstraint ItemTypeConstraint {
+      get { return (ItemTypeConstraint)base.Item; }
+      set { base.Item = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ItemTypeConstraintView"/>.
+    /// </summary>
+    public ItemTypeConstraintView() {
+      InitializeComponent();
+      typeTextBox.Enabled = false;
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ItemTypeConstraintView"/> with the given 
+    /// <paramref name="itemTypeConstraint"/> to display.
+    /// </summary>
+    /// <param name="itemTypeConstraint">The constraint to represent visually.</param>
+    public ItemTypeConstraintView(ItemTypeConstraint itemTypeConstraint)
+      : this() {
+      ItemTypeConstraint = itemTypeConstraint;
+    }
+
+    /// <summary>
+    /// Removes the eventhandler from the underlying <see cref="ItemTypeConstraint"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.
+    /// </remarks>
+    protected override void RemoveItemEvents() {
+      ItemTypeConstraint.Changed -= new EventHandler(ItemTypeConstraint_Changed);
+      base.RemoveItemEvents();
+    }
+
+    /// <summary>
+    /// Adds an eventhandler to the underlying <see cref="ItemTypeConstraint"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.
+    /// </remarks>
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      ItemTypeConstraint.Changed += new EventHandler(ItemTypeConstraint_Changed);
+    }
+
+    void ItemTypeConstraint_Changed(object sender, EventArgs e) {
+      Refresh();
+    }
+
+    /// <summary>
+    /// Updates all controls with the latest values.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.UpdateControls"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (ItemTypeConstraint == null) {
+        setButton.Enabled = false;
+      } else {
+        typeTextBox.Text = ItemTypeConstraint.Type.ToString();
+        setButton.Enabled = true;
+      }
+    }
+
+    private void setButton_Click(object sender, EventArgs e) {
+      using (ChooseTypeDialog dialog = new ChooseTypeDialog()) {
+        dialog.Caption = "Set Item Type";
+        if (dialog.ShowDialog(this) == DialogResult.OK) {
+          ItemTypeConstraint.Type = dialog.Type;
+        }
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/3.3/ItemTypeConstraintView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/ItemTypeConstraintView.resx	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/ItemTypeConstraintView.resx	(revision 1671)
@@ -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.Constraints/3.3/NotConstraint.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/NotConstraint.cs	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/NotConstraint.cs	(revision 1671)
@@ -0,0 +1,127 @@
+#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.Constraints {
+  /// <summary>
+  /// Constraint where its sub-constraint must be false to be true.
+  /// </summary>
+  public class NotConstraint : ConstraintBase {
+    private ConstraintBase subConstraint;
+    /// <summary>
+    /// Gets or sets the sub-constraint.
+    /// </summary>
+    /// <remarks>Calls <see cref="ItemBase.OnChanged"/> of base class 
+    /// <see cref="ConstraintBase"/> in the setter.</remarks>
+    public ConstraintBase SubConstraint {
+      get { return subConstraint; }
+      set {
+        subConstraint = value;
+        OnChanged();
+      }
+    }
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get {
+        return "Requires that a constraint must be false to be true";
+      }
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="NotConstraint"/>.
+    /// </summary>
+    public NotConstraint()
+      : base() {
+    }
+
+    /// <summary>
+    /// Checks whether the given element fulfills the current constraint.
+    /// </summary>
+    /// <param name="data">The item to check.</param>
+    /// <returns><c>true</c> if the constraint could be fulfilled, <c>false</c> otherwise.</returns>
+    public override bool Check(IItem data) {
+      return (subConstraint == null) || (!subConstraint.Check(data));
+    }
+
+    /// <summary>
+    /// Creates a new instance of <see cref="NotConstraintView"/> to represent the current 
+    /// instance visually.
+    /// </summary>
+    /// <returns>The created view as <see cref="NotConstraintView"/>.</returns>
+    public override IView CreateView() {
+      return new NotConstraintView(this);
+    }
+
+    /// <summary>
+    /// Clones the current instance (deep clone).
+    /// </summary>
+    /// <param name="clonedObjects">Dictionary of all already clone objects. (Needed to avoid cycles.)</param>
+    /// <returns>The cloned object as <see cref="NotConstraint"/>.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      NotConstraint clone = new NotConstraint();
+      clonedObjects.Add(Guid, clone);
+      if (subConstraint != null)
+        clone.SubConstraint = (ConstraintBase)SubConstraint.Clone();
+      return clone;
+    }
+
+    #region persistence
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>The sub-constraint is saved as a child node with tag name 
+    /// <c>SubConstraint</c>.</remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where the data is saved.</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);
+      if (subConstraint != null) {
+        XmlNode sub = PersistenceManager.Persist("SubConstraint", SubConstraint, document, persistedObjects);
+        node.AppendChild(sub);
+      }
+      return node;
+    }
+
+    /// <summary>
+    /// Loads the persisted constraint from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>The constraint must be saved in a specific way, see <see cref="GetXmlNode"/> for 
+    /// more information.</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the instance 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 subNode =  node.SelectSingleNode("SubConstraint");
+      if(subNode!=null) 
+        subConstraint = (ConstraintBase)PersistenceManager.Restore(subNode, restoredObjects);
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/3.3/NotConstraintView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/NotConstraintView.Designer.cs	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/NotConstraintView.Designer.cs	(revision 1671)
@@ -0,0 +1,89 @@
+#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.Constraints {
+  partial class NotConstraintView {
+    /// <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.subConstraintViewBase = new HeuristicLab.Core.ViewBase();
+      this.subConstraintComboBox = new System.Windows.Forms.ComboBox();
+      this.SuspendLayout();
+      // 
+      // subConstraintViewBase
+      // 
+      this.subConstraintViewBase.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.subConstraintViewBase.Caption = "View";
+      this.subConstraintViewBase.Location = new System.Drawing.Point(0, 30);
+      this.subConstraintViewBase.Name = "subConstraintViewBase";
+      this.subConstraintViewBase.Size = new System.Drawing.Size(260, 206);
+      this.subConstraintViewBase.TabIndex = 0;
+      // 
+      // subConstraintComboBox
+      // 
+      this.subConstraintComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.subConstraintComboBox.FormattingEnabled = true;
+      this.subConstraintComboBox.Location = new System.Drawing.Point(0, 3);
+      this.subConstraintComboBox.Name = "subConstraintComboBox";
+      this.subConstraintComboBox.Size = new System.Drawing.Size(260, 21);
+      this.subConstraintComboBox.TabIndex = 1;
+      this.subConstraintComboBox.SelectedIndexChanged += new System.EventHandler(this.subConstraintComboBox_SelectedIndexChanged);
+      // 
+      // NotConstraintView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.subConstraintComboBox);
+      this.Controls.Add(this.subConstraintViewBase);
+      this.Name = "NotConstraintView";
+      this.Size = new System.Drawing.Size(263, 239);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private HeuristicLab.Core.ViewBase subConstraintViewBase;
+    private System.Windows.Forms.ComboBox subConstraintComboBox;
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/3.3/NotConstraintView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/NotConstraintView.cs	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/NotConstraintView.cs	(revision 1671)
@@ -0,0 +1,152 @@
+#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.PluginInfrastructure;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Constraints {
+  /// <summary>
+  /// Visual representation of a <see cref="NotConstraint"/>.
+  /// </summary>
+  public partial class NotConstraintView : ViewBase {
+    private Type[] itemTypes;
+
+    /// <summary>
+    /// Gets or sets the NotConstraint to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>.
+    /// No own data storage present.<br/>
+    /// Calls <see cref="ViewBase.Refresh"/> in the setter.</remarks>
+    public NotConstraint NotConstraint {
+      get { return (NotConstraint)Item; }
+      set {
+        base.Item = value;
+        UpdateSubConstraintComboBox();
+        Refresh();
+      }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="NotConstraintView"/>.
+    /// </summary>
+    public NotConstraintView() {
+      InitializeComponent();
+      DiscoveryService discoveryService = new DiscoveryService();
+      itemTypes = discoveryService.GetTypes(typeof(ConstraintBase));
+      for (int i = 0; i < itemTypes.Length; i++) {
+        subConstraintComboBox.Items.Add(itemTypes[i].Name);
+      }
+      subConstraintComboBox.SelectedIndex = 0;
+      subConstraintComboBox.Enabled = false;
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="NotConstraintView"/> with the given
+    /// <paramref name="notConstraint"/> to display.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.Refresh"/> in the setter.</remarks>
+    /// <param name="notConstraint">The constraint to represent visually.</param>
+    public NotConstraintView(NotConstraint notConstraint)
+      : this() {
+      NotConstraint = notConstraint;
+      UpdateSubConstraintComboBox();
+      Refresh();
+    }
+
+    /// <summary>
+    /// Removes the eventhandler from the underlying <see cref="NotConstraint"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.
+    /// </remarks>
+    protected override void RemoveItemEvents() {
+      NotConstraint.Changed -= new EventHandler(NotConstraint_Changed);
+      base.RemoveItemEvents();
+    }
+    /// <summary>
+    /// Adds an eventhandler to the underlying <see cref="NotConstraint"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.
+    /// </remarks>
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      NotConstraint.Changed += new EventHandler(NotConstraint_Changed);
+    }
+
+    /// <summary>
+    /// Updates all controls with the latest values.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.UpdateControls"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (NotConstraint == null) {
+        subConstraintComboBox.Enabled = false;
+        subConstraintViewBase.Enabled = false;
+      } else {
+        if (subConstraintViewBase != null && Controls.Contains(subConstraintViewBase)) {
+          Controls.Remove(subConstraintViewBase);
+          subConstraintViewBase.Dispose();
+        }
+        subConstraintViewBase = (ViewBase)NotConstraint.SubConstraint.CreateView();
+        if (subConstraintViewBase != null) {
+          subConstraintViewBase.Anchor = (AnchorStyles)(AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right);
+          subConstraintViewBase.Location = new Point(0, 30);
+          subConstraintViewBase.Name = "subConstraintViewBase";
+          subConstraintViewBase.Size = new Size(Width, Height - 30);
+          Controls.Add(subConstraintViewBase);
+        }
+        subConstraintComboBox.Enabled = true;
+        subConstraintViewBase.Enabled = true;
+      }
+    }
+
+    private void subConstraintComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      if (NotConstraint != null) {
+        try {
+          NotConstraint.SubConstraint = (ConstraintBase)Activator.CreateInstance(itemTypes[subConstraintComboBox.SelectedIndex]);
+        } catch (Exception) {
+          NotConstraint.SubConstraint = null;
+        }
+      }
+    }
+
+    private void NotConstraint_Changed(object sender, EventArgs e) {
+      Refresh();
+      UpdateSubConstraintComboBox();
+    }
+
+
+    private void UpdateSubConstraintComboBox() {
+      subConstraintComboBox.SelectedIndexChanged -= new EventHandler(subConstraintComboBox_SelectedIndexChanged);
+      for (int i = 0 ; i < itemTypes.Length ; i++)
+        if (itemTypes[i].Name.Equals(NotConstraint.SubConstraint.GetType().Name))
+          subConstraintComboBox.SelectedIndex = i;
+      subConstraintComboBox.SelectedIndexChanged += new EventHandler(subConstraintComboBox_SelectedIndexChanged);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/3.3/NotConstraintView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/NotConstraintView.resx	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/NotConstraintView.resx	(revision 1671)
@@ -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.Constraints/3.3/NumberOfSubOperatorsConstraint.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/NumberOfSubOperatorsConstraint.cs	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/NumberOfSubOperatorsConstraint.cs	(revision 1671)
@@ -0,0 +1,145 @@
+#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 System.Diagnostics;
+using HeuristicLab.Data;
+using System.Xml;
+
+namespace HeuristicLab.Constraints {
+  /// <summary>
+  /// Constraint where the number of sub-operators must be within a specific range.
+  /// </summary>
+  public class NumberOfSubOperatorsConstraint : ConstraintBase {
+    private IntData minOperators;
+    private IntData maxOperators;
+
+    /// <summary>
+    /// Gets the maximum number of sub-operators.
+    /// </summary>
+    public IntData MaxOperators {
+      get { return maxOperators; }
+    }
+
+    /// <summary>
+    /// Gets the minimum number of sub-operators.
+    /// </summary>
+    public IntData MinOperators {
+      get { return minOperators; }
+    }
+
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get { return "Number of sub-operators has to be between " + MinOperators.ToString() + " and " + MaxOperators.ToString() + "."; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="NumberOfSubOperatorsConstraint"/>.
+    /// </summary>
+    public NumberOfSubOperatorsConstraint()
+      : this(0,0) {
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="NumberOfSubOperatorsConstraint"/> with the minimum and 
+    /// the maximum number of sub-operators.
+    /// </summary>
+    /// <param name="min">The minimum number of sub-operators.</param>
+    /// <param name="max">The maximum number of sub-operators.</param>
+    public NumberOfSubOperatorsConstraint(int min, int max) : base() {
+      minOperators = new IntData(min);
+      maxOperators = new IntData(max);
+    }
+
+    /// <summary>
+    /// Checks whether the given element fulfills the current constraint.
+    /// </summary>
+    /// <param name="data">The item to check.</param>
+    /// <returns><c>true</c> if the constraint could be fulfilled, <c>false</c> otherwise.</returns>
+    public override bool Check(IItem data) {
+      IOperator op = data as IOperator;
+      if (data == null) return false;
+
+      return (op.SubOperators.Count >= minOperators.Data && op.SubOperators.Count <= maxOperators.Data);
+    }
+
+    /// <summary>
+    /// Clones the current instance (deep clone).
+    /// </summary>
+    /// <param name="clonedObjects">Dictionary of all already clone objects. (Needed to avoid cycles.)</param>
+    /// <returns>The cloned object as <see cref="AndConstraint"/>.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      NumberOfSubOperatorsConstraint clone = new NumberOfSubOperatorsConstraint();
+      clonedObjects.Add(Guid, clone);
+      clone.maxOperators.Data = maxOperators.Data;
+      clone.minOperators.Data = minOperators.Data;
+      return clone;
+    }
+
+    /// <summary>
+    /// Creates a new instance of <see cref="NumberOfSubOperatorsConstraintView"/> to represent the current 
+    /// instance visually.
+    /// </summary>
+    /// <returns>The created view as <see cref="NumberOfSubOperatorsConstraintView"/>.</returns>
+    public override IView CreateView() {
+      return new NumberOfSubOperatorsConstraintView(this);
+    }
+
+    #region persistence
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>The minimum and the maximum number of sub-operators are saved as child nodes with tag
+    /// names <c>min</c> and <c>max</c>.</remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where the data is saved.</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 minNode = PersistenceManager.Persist("min", minOperators, document, persistedObjects);
+      XmlNode maxNode = PersistenceManager.Persist("max", maxOperators, document, persistedObjects);
+      node.AppendChild(minNode);
+      node.AppendChild(maxNode);
+      return node;
+    }
+
+    /// <summary>
+    /// Loads the persisted constraint from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>The constraint must be saved in a specific way, see <see cref="GetXmlNode"/> for 
+    /// more information.</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the instance 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);
+      minOperators = (IntData)PersistenceManager.Restore(node.SelectSingleNode("min"), restoredObjects);
+      maxOperators = (IntData)PersistenceManager.Restore(node.SelectSingleNode("max"), restoredObjects);
+    }
+    #endregion persistence
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/3.3/NumberOfSubOperatorsConstraintView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/NumberOfSubOperatorsConstraintView.Designer.cs	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/NumberOfSubOperatorsConstraintView.Designer.cs	(revision 1671)
@@ -0,0 +1,111 @@
+#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.Constraints {
+  partial class NumberOfSubOperatorsConstraintView {
+    /// <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.minDataView = new HeuristicLab.Data.IntDataView();
+      this.maxDataView = new HeuristicLab.Data.IntDataView();
+      this.minLabel = new System.Windows.Forms.Label();
+      this.maxLabel = new System.Windows.Forms.Label();
+      this.SuspendLayout();
+      // 
+      // minDataView
+      // 
+      this.minDataView.Caption = "View";
+      this.minDataView.IntData = null;
+      this.minDataView.Location = new System.Drawing.Point(36, 3);
+      this.minDataView.Name = "minDataView";
+      this.minDataView.Size = new System.Drawing.Size(265, 26);
+      this.minDataView.TabIndex = 0;
+      // 
+      // maxDataView
+      // 
+      this.maxDataView.Caption = "View";
+      this.maxDataView.IntData = null;
+      this.maxDataView.Location = new System.Drawing.Point(36, 32);
+      this.maxDataView.Name = "maxDataView";
+      this.maxDataView.Size = new System.Drawing.Size(265, 26);
+      this.maxDataView.TabIndex = 1;
+      // 
+      // minLabel
+      // 
+      this.minLabel.AutoSize = true;
+      this.minLabel.Location = new System.Drawing.Point(3, 3);
+      this.minLabel.Name = "minLabel";
+      this.minLabel.Size = new System.Drawing.Size(27, 13);
+      this.minLabel.TabIndex = 2;
+      this.minLabel.Text = "Min:";
+      // 
+      // maxLabel
+      // 
+      this.maxLabel.AutoSize = true;
+      this.maxLabel.Location = new System.Drawing.Point(3, 32);
+      this.maxLabel.Name = "maxLabel";
+      this.maxLabel.Size = new System.Drawing.Size(30, 13);
+      this.maxLabel.TabIndex = 3;
+      this.maxLabel.Text = "Max:";
+      // 
+      // NumberOfSubOperatorsConstraintView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.maxLabel);
+      this.Controls.Add(this.minLabel);
+      this.Controls.Add(this.maxDataView);
+      this.Controls.Add(this.minDataView);
+      this.Name = "NumberOfSubOperatorsConstraintView";
+      this.Size = new System.Drawing.Size(306, 61);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private HeuristicLab.Data.IntDataView minDataView;
+    private HeuristicLab.Data.IntDataView maxDataView;
+    private System.Windows.Forms.Label minLabel;
+    private System.Windows.Forms.Label maxLabel;
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/3.3/NumberOfSubOperatorsConstraintView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/NumberOfSubOperatorsConstraintView.cs	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/NumberOfSubOperatorsConstraintView.cs	(revision 1671)
@@ -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;
+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.Constraints {
+  /// <summary>
+  /// Visual representation of a <see cref="NumberOfSubOperatorsConstraint"/>.
+  /// </summary>
+  public partial class NumberOfSubOperatorsConstraintView : ViewBase {
+    private NumberOfSubOperatorsConstraint constraint;
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="NumberOfSubOperatorsConstraintView"/>.
+    /// </summary>
+    public NumberOfSubOperatorsConstraintView() {
+      InitializeComponent();
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="NumberOfSubOperatorsConstraintView"/>
+    /// with the given <paramref name="constraint"/> to display.
+    /// </summary>
+    /// <param name="constraint">The constraint to represent visually.</param>
+    public NumberOfSubOperatorsConstraintView(NumberOfSubOperatorsConstraint constraint) {
+      InitializeComponent();
+      this.constraint = constraint;
+
+      minDataView.IntData = constraint.MinOperators;
+      maxDataView.IntData = constraint.MaxOperators;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/3.3/NumberOfSubOperatorsConstraintView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/NumberOfSubOperatorsConstraintView.resx	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/NumberOfSubOperatorsConstraintView.resx	(revision 1671)
@@ -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.Constraints/3.3/OrConstraint.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/OrConstraint.cs	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/OrConstraint.cs	(revision 1671)
@@ -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.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Constraints {
+  /// <summary>
+  /// Constraint where at least one sub-constraint must be true.
+  /// </summary>
+  public class OrConstraint : ConstraintBase, IViewable {
+    private ItemList<IConstraint> clauses;
+    /// <summary>
+    /// Gets or sets the sub-constraints.
+    /// </summary>
+    /// <remarks>Calls <see cref="ItemBase.OnChanged"/> of base class 
+    /// <see cref="ConstraintBase"/> in the setter.</remarks>
+    public ItemList<IConstraint> Clauses {
+      get { return clauses; }
+      set {
+        clauses = value;
+        OnChanged();
+      }
+    }
+
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get {
+        return "To return true, at least one subconstraint has to be true";
+      }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="OrConstraint"/>.
+    /// </summary>
+    public OrConstraint() {
+      clauses = new ItemList<IConstraint>();
+    }
+
+    /// <summary>
+    /// Checks whether the given element fulfills the current constraint.
+    /// </summary>
+    /// <param name="data">The item to check.</param>
+    /// <returns><c>true</c> if the constraint could be fulfilled, <c>false</c> otherwise.</returns>
+    public override bool Check(IItem data) {
+      bool result = false;
+      for (int i = 0 ; i < clauses.Count ; i++) {
+        result = clauses[i].Check(data);
+        if (result) return true;
+      }
+      return result;
+    }
+
+    /// <summary>
+    /// Creates a new instance of <see cref="OrConstraintView"/> to represent the current 
+    /// instance visually.
+    /// </summary>
+    /// <returns>The created view as <see cref="OrConstraintView"/>.</returns>
+    public override IView CreateView() {
+      return new OrConstraintView(this);
+    }
+
+    /// <summary>
+    /// Clones the current instance (deep clone).
+    /// </summary>
+    /// <remarks>Deep clone through <see cref="Auxiliary.Clone"/> method of helper class 
+    /// <see cref="Auxiliary"/>.</remarks>
+    /// <param name="clonedObjects">Dictionary of all already clone objects. (Needed to avoid cycles.)</param>
+    /// <returns>The cloned object as <see cref="OrConstraint"/>.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      OrConstraint clone = new OrConstraint();
+      clonedObjects.Add(Guid, clone);
+      clone.Clauses = (ItemList<IConstraint>)Auxiliary.Clone(Clauses, clonedObjects);
+      return clone;
+    }
+
+    #region persistence
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>The sub-constraints are saved as a child node with tag name 
+    /// <c>Clauses</c>.</remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where the data is saved.</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 clausesNode = PersistenceManager.Persist("Clauses", Clauses, document, persistedObjects);
+      node.AppendChild(clausesNode);
+
+      return node;
+    }
+
+    /// <summary>
+    /// Loads the persisted constraint from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>The constraint must be saved in a specific way, see <see cref="GetXmlNode"/> for 
+    /// more information.</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the instance 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);
+      clauses = (ItemList<IConstraint>)PersistenceManager.Restore(node.SelectSingleNode("Clauses"), restoredObjects);
+    }
+    #endregion persistence
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/3.3/OrConstraintView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/OrConstraintView.Designer.cs	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/OrConstraintView.Designer.cs	(revision 1671)
@@ -0,0 +1,77 @@
+#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.Constraints {
+  partial class OrConstraintView {
+    /// <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();
+      }
+      if (OrConstraint != null) OrConstraint.Changed -= new System.EventHandler(OrConstraint_Changed);
+      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.clausesItemListView = new HeuristicLab.Data.ItemListView<HeuristicLab.Core.IConstraint>();
+      this.SuspendLayout();
+      // 
+      // clausesItemListView
+      // 
+      this.clausesItemListView.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.clausesItemListView.Caption = "View";
+      this.clausesItemListView.Location = new System.Drawing.Point(0, 0);
+      this.clausesItemListView.Name = "clausesItemListView";
+      this.clausesItemListView.Size = new System.Drawing.Size(475, 284);
+      this.clausesItemListView.TabIndex = 0;
+      // 
+      // OrConstraintView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.clausesItemListView);
+      this.Name = "OrConstraintView";
+      this.Size = new System.Drawing.Size(478, 292);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private HeuristicLab.Data.ItemListView<HeuristicLab.Core.IConstraint> clausesItemListView;
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/3.3/OrConstraintView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/OrConstraintView.cs	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/OrConstraintView.cs	(revision 1671)
@@ -0,0 +1,94 @@
+#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;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Constraints {
+  /// <summary>
+  /// Visual representation of an <see cref="OrConstraint"/>.
+  /// </summary>
+  public partial class OrConstraintView : ViewBase {
+    private OrConstraint OrConstraint {
+      get { return (OrConstraint)Item; }
+      set { base.Item = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="OrConstraintView"/>.
+    /// </summary>
+    public OrConstraintView() {
+      InitializeComponent();
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="OrConstraintView"/> with the given
+    /// <paramref name="orConstraint"/> to display.
+    /// </summary>
+    /// <param name="orConstraint">The constraint to represent visually.</param>
+    public OrConstraintView(OrConstraint orConstraint)
+      : this() {
+      OrConstraint = orConstraint;
+    }
+
+    /// <summary>
+    /// Removes the eventhandler from the underlying <see cref="OrConstraint"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.
+    /// </remarks>
+    protected override void RemoveItemEvents() {
+      OrConstraint.Changed -= new EventHandler(OrConstraint_Changed);
+      base.RemoveItemEvents();
+    }
+    /// <summary>
+    /// Adds an eventhandler to the underlying <see cref="OrConstraint"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.
+    /// </remarks>
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      OrConstraint.Changed += new EventHandler(OrConstraint_Changed);
+    }
+
+    /// <summary>
+    /// Updates all controls with the latest values.
+    /// </summary>    
+    protected override void UpdateControls() {
+      if (OrConstraint == null) {
+        clausesItemListView.Enabled = false;
+        clausesItemListView.ItemList = null;
+      } else {
+        clausesItemListView.ItemList = OrConstraint.Clauses;
+        clausesItemListView.Enabled = true;
+      }
+    }
+
+    private void OrConstraint_Changed(object sender, EventArgs e) {
+      Refresh();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/3.3/OrConstraintView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/OrConstraintView.resx	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/OrConstraintView.resx	(revision 1671)
@@ -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.Constraints/3.3/Properties/AssemblyInfo.frame
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/Properties/AssemblyInfo.frame	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/Properties/AssemblyInfo.frame	(revision 1671)
@@ -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.Constraints")]
+[assembly: AssemblyDescription("Classes of the HeuristicLab constraints framework")]
+[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("97a3c082-71d3-429a-8cb0-91d85949b240")]
+
+// 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.Constraints/3.3/SubOperatorsConstraintAnalyser.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/SubOperatorsConstraintAnalyser.cs	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/SubOperatorsConstraintAnalyser.cs	(revision 1671)
@@ -0,0 +1,186 @@
+#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.Constraints;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Constraints {
+  /// <summary>
+  /// Analyzes the sub-operators for specific constraints.
+  /// </summary>
+  public class SubOperatorsConstraintAnalyser {
+    private ICollection<IOperator> allPossibleOperators;
+
+    /// <summary>
+    /// Gets or sets all possible operators. 
+    /// </summary>
+    public ICollection<IOperator> AllPossibleOperators {
+      get { return allPossibleOperators; }
+      set { allPossibleOperators = value; }
+    }
+    
+    /// <summary>
+    /// Gets all operators that fulfill the expression of the constraints of the given operator. 
+    /// </summary>
+    /// <param name="op">The operator whose constraints to check.</param>
+    /// <param name="childIndex">The index of the child.</param>
+    /// <returns>All allowed operators.</returns>
+    public IList<IOperator> GetAllowedOperators(IOperator op, int childIndex) {
+      AndConstraint andConstraint = new AndConstraint();
+      foreach (IConstraint constraint in op.Constraints) {
+        andConstraint.Clauses.Add(constraint);
+      }
+
+      return GetAllowedOperators(andConstraint, childIndex);
+    }
+
+    private IList<IOperator> GetAllowedOperators(IConstraint constraint, int childIndex) {
+      // manual dispatch on dynamic type
+      if (constraint is AndConstraint)
+        return GetAllowedOperators((AndConstraint)constraint, childIndex);
+      else if (constraint is OrConstraint)
+        return GetAllowedOperators((OrConstraint)constraint, childIndex);
+      else if (constraint is NotConstraint)
+        return GetAllowedOperators((NotConstraint)constraint, childIndex);
+      else if (constraint is AllSubOperatorsTypeConstraint)
+        return GetAllowedOperators((AllSubOperatorsTypeConstraint)constraint, childIndex);
+      else if (constraint is SubOperatorTypeConstraint)
+        return GetAllowedOperators((SubOperatorTypeConstraint)constraint, childIndex);
+      else return new List<IOperator>(allPossibleOperators); // ignore all other constraints
+    }
+
+    #region static set management methods
+    // better to use HashSets from .NET 3.5
+    // however we would need to switch the whole Constraints project to .NET 3.5 for that
+    private static IList<IOperator> Intersect(ICollection<IOperator> a, ICollection<IOperator> b) {
+      if (a.Count > b.Count) {
+        return Intersect(b, a);
+      }
+
+      List<IOperator> intersection = new List<IOperator>(a.Count);
+
+      foreach (IOperator element in a) {
+        if (InSet(element, b)) {
+          intersection.Add(element);
+        }
+      }
+      return intersection;
+    }
+
+    private static IList<IOperator> Union(ICollection<IOperator> a, ICollection<IOperator> b) {
+      List<IOperator> union = new List<IOperator>(a);
+      foreach (IOperator candidateElement in b) {
+        if (!InSet(candidateElement, union)) {
+          union.Add(candidateElement);
+        }
+      }
+
+      return union;
+    }
+
+    private static IList<IOperator> Substract(ICollection<IOperator> minuend, ICollection<IOperator> subtrahend) {
+      List<IOperator> difference = new List<IOperator>();
+      foreach (IOperator element in minuend) {
+        if (!InSet(element, subtrahend)) {
+          difference.Add(element);
+        }
+      }
+
+      return difference;
+    }
+
+    private static bool InSet(IOperator op, ICollection<IOperator> set) {
+      foreach (IOperator element in set) {
+        if (element == op)
+          return true;
+      }
+      return false;
+    }
+    #endregion
+
+    /// <summary>
+    /// Gets all allowed operators that fulfill the expression of the given <c>AndConstraint</c>.
+    /// </summary>
+    /// <param name="constraint">The constraint that must be fulfilled.</param>
+    /// <param name="childIndex">The index of the child.</param>
+    /// <returns>All allowed operators.</returns>
+    public IList<IOperator> GetAllowedOperators(AndConstraint constraint, int childIndex) {
+      IList<IOperator> allowedOperators = new List<IOperator>(allPossibleOperators);
+      // keep only the intersection of all subconstraints
+      foreach (ConstraintBase clause in constraint.Clauses) {
+        allowedOperators = Intersect(allowedOperators, GetAllowedOperators(clause, childIndex));
+      }
+      return allowedOperators;
+    }
+
+    /// <summary>
+    /// Gets all allowed operators that fulfill the expression of the given <c>OrConstraint</c>.
+    /// </summary>
+    /// <param name="constraint">The constraint that must be fulfilled.</param>
+    /// <param name="childIndex">The index of the child.</param>
+    /// <returns>All allowed operators.</returns>
+    public IList<IOperator> GetAllowedOperators(OrConstraint constraint, int childIndex) {
+      IList<IOperator> allowedOperators = new List<IOperator>();
+      foreach (ConstraintBase clause in constraint.Clauses) {
+        allowedOperators = Union(allowedOperators, GetAllowedOperators(clause, childIndex));
+      }
+      return allowedOperators;
+    }
+
+    /// <summary>
+    /// Gets all allowed operators that fulfill the expression of the given <c>NotConstraint</c>.
+    /// </summary>
+    /// <param name="constraint">The constraint that must be fulfilled.</param>
+    /// <param name="childIndex">The index of the child.</param>
+    /// <returns>All allowed operators.</returns>
+    public IList<IOperator> GetAllowedOperators(NotConstraint constraint, int childIndex) {
+      return Substract(allPossibleOperators, GetAllowedOperators(constraint.SubConstraint, childIndex));
+    }
+
+    /// <summary>
+    /// Gets all allowed operators that fulfill the expression of the given <c>AllSubOperatorsTypeConstraint</c>.
+    /// </summary>
+    /// <param name="constraint">The constraint that must be fulfilled.</param>
+    /// <param name="childIndex">The index of the child.</param>
+    /// <returns>All allowed operators.</returns>
+    public IList<IOperator> GetAllowedOperators(AllSubOperatorsTypeConstraint constraint, int childIndex) {
+      return Intersect(allPossibleOperators, constraint.AllowedSubOperators);
+    }
+
+    /// <summary>
+    /// Gets all allowed operators that fulfill the expression of the given <c>SubOperatorTypeConstraint</c>.
+    /// </summary>
+    /// <param name="constraint">The constraint that must be fulfilled.</param>
+    /// <param name="childIndex">The index of the child.</param>
+    /// <returns>All allowed operators.</returns>
+    public IList<IOperator> GetAllowedOperators(SubOperatorTypeConstraint constraint, int childIndex) {
+      if (childIndex != constraint.SubOperatorIndex.Data) {
+        return new List<IOperator>(allPossibleOperators);
+      } else {
+        return Intersect(allPossibleOperators, constraint.AllowedSubOperators);
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/3.3/SubOperatorsTypeConstraint.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/SubOperatorsTypeConstraint.cs	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/SubOperatorsTypeConstraint.cs	(revision 1671)
@@ -0,0 +1,191 @@
+#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;
+using System.Diagnostics;
+using System.Xml;
+
+namespace HeuristicLab.Constraints {
+  /// <summary>
+  /// Constraint where the sub-operator at a specific index has to be an element of a pre-defined group.
+  /// </summary>
+  public class SubOperatorTypeConstraint : ConstraintBase {
+    private IntData subOperatorIndex;
+    /// <summary>
+    /// Gets the index of the sub-operator.
+    /// </summary>
+    public IntData SubOperatorIndex {
+      get { return subOperatorIndex; }
+    }
+
+    private List<IOperator> subOperators;
+    /// <summary>
+    /// Gets all allowed sub-operators.
+    /// </summary>
+    public IList<IOperator> AllowedSubOperators {
+      get {
+        return subOperators.AsReadOnly();
+      }
+    }
+
+    ///<inheritdoc select="summary"/>
+    public override string Description {
+      get { return "The sub-operator at a specific index has to be an element of a pre-defined group."; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="SubOperatorTypeConstraint"/>.
+    /// </summary>
+    public SubOperatorTypeConstraint()
+      : base() {
+      subOperatorIndex = new IntData(0);
+      subOperators = new List<IOperator>();
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="SubOperatorTypeConstraint"/> with the given
+    /// <paramref name="index"/>.
+    /// </summary>
+    /// <param name="index">The index of the sub-operator.</param>
+    public SubOperatorTypeConstraint(int index) : base() {
+      subOperatorIndex = new IntData(index);
+      subOperators = new List<IOperator>();
+    }
+
+    /// <summary>
+    /// Adds the given operator to the list of sub-operators.
+    /// </summary>
+    /// <remarks>Calls <see cref="ItemBase.FireChanged"/> of base class <see cref="ConstraintBase"/>.</remarks>
+    /// <param name="op">The operator to add.</param>
+    public void AddOperator(IOperator op) {
+      if(!subOperators.Contains(op)) {
+        subOperators.Add(op);
+        FireChanged();
+      }
+    }
+
+    /// <summary>
+    /// Removes the given operator from the list of sub-operators.
+    /// </summary>
+    /// <remarks>Calls <see cref="ItemBase.FireChanged"/> of base class <see cref="ConstraintBase"/>.</remarks>
+    /// <param name="op">The operator to remove.</param>
+    public void RemoveOperator(IOperator op) {
+      if(subOperators.Contains(op)) {
+        subOperators.Remove(op);
+        FireChanged();
+      }
+    }
+
+    /// <summary>
+    /// Empties the list of sub-operators.
+    /// </summary>
+    public void Clear() {
+      subOperators.Clear();
+    }
+
+    /// <summary>
+    /// Checks whether the given element fulfills the current constraint.
+    /// </summary>
+    /// <param name="data">The item to check.</param>
+    /// <returns><c>true</c> if the constraint could be fulfilled, <c>false</c> otherwise.</returns>
+    public override bool Check(IItem data) {
+      IOperator op = data as IOperator;
+      if(data == null) return false;
+
+      if(op.SubOperators.Count <= subOperatorIndex.Data) {
+        return false;
+      }
+      return subOperators.Contains(op.SubOperators[subOperatorIndex.Data]);
+    }
+
+    /// <summary>
+    /// Clones the current instance (deep clone).
+    /// </summary>
+    /// <remarks>Deep clone through <see cref="Auxiliary.Clone"/> method of helper class 
+    /// <see cref="Auxiliary"/>.</remarks>
+    /// <param name="clonedObjects">Dictionary of all already clone objects. (Needed to avoid cycles.)</param>
+    /// <returns>The cloned object as <see cref="SubOperatorTypeConstraint"/>.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      SubOperatorTypeConstraint clone = new SubOperatorTypeConstraint();
+      clonedObjects.Add(Guid, clone);
+      clone.subOperatorIndex.Data = subOperatorIndex.Data;
+      foreach(IOperator op in subOperators) {
+        clone.AddOperator((IOperator)Auxiliary.Clone(op, clonedObjects));
+      }
+      return clone;
+    }
+
+    /// <summary>
+    /// Creates a new instance of <see cref="SubOperatorsTypeConstraintView"/> to represent the current 
+    /// instance visually.
+    /// </summary>
+    /// <returns>The created view as <see cref="SubOperatorsTypeConstraintView"/>.</returns>
+    public override IView CreateView() {
+      return new SubOperatorsTypeConstraintView(this);
+    }
+
+    #region persistence
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>The index and the list of sub-operators are saved as child nodes with tag names 
+    /// <c>SubOperatorIndex</c> and <c>AllowedSubOperators</c>.</remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where the data is saved.</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 indexNode = PersistenceManager.Persist("SubOperatorIndex", subOperatorIndex, document, persistedObjects);
+      node.AppendChild(indexNode);
+      XmlNode listNode = document.CreateNode(XmlNodeType.Element, "AllowedSubOperators", document.NamespaceURI);
+      foreach(IOperator op in subOperators) {
+        XmlNode opNode = PersistenceManager.Persist(op, document, persistedObjects);
+        listNode.AppendChild(opNode);
+      }
+      node.AppendChild(listNode);
+      return node;
+    }
+
+    /// <summary>
+    /// Loads the persisted constraint from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>The constraint must be saved in a specific way, see <see cref="GetXmlNode"/> for 
+    /// more information.</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the instance 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);
+      subOperatorIndex = (IntData)PersistenceManager.Restore(node.SelectSingleNode("SubOperatorIndex"), restoredObjects);
+      subOperators = new List<IOperator>();
+      foreach(XmlNode childNode in node.SelectSingleNode("AllowedSubOperators").ChildNodes) {
+        subOperators.Add((IOperator)PersistenceManager.Restore(childNode, restoredObjects));
+      }
+    }
+    #endregion persistence
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/3.3/SubOperatorsTypeConstraintView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/SubOperatorsTypeConstraintView.Designer.cs	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/SubOperatorsTypeConstraintView.Designer.cs	(revision 1671)
@@ -0,0 +1,101 @@
+#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.Constraints {
+  partial class SubOperatorsTypeConstraintView {
+    /// <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.indexDataView = new HeuristicLab.Data.IntDataView();
+      this.indexLabel = new System.Windows.Forms.Label();
+      this.allSubOperatorsTypeConstraintView = new HeuristicLab.Constraints.AllSubOperatorsTypeConstraintView();
+      this.SuspendLayout();
+      // 
+      // indexDataView
+      // 
+      this.indexDataView.Caption = "View";
+      this.indexDataView.IntData = null;
+      this.indexDataView.Location = new System.Drawing.Point(109, 3);
+      this.indexDataView.Name = "indexDataView";
+      this.indexDataView.Size = new System.Drawing.Size(265, 26);
+      this.indexDataView.TabIndex = 1;
+      // 
+      // indexLabel
+      // 
+      this.indexLabel.AutoSize = true;
+      this.indexLabel.Location = new System.Drawing.Point(4, 4);
+      this.indexLabel.Name = "indexLabel";
+      this.indexLabel.Size = new System.Drawing.Size(99, 13);
+      this.indexLabel.TabIndex = 2;
+      this.indexLabel.Text = "Sub-operator index:";
+      // 
+      // allSubOperatorsTypeConstraintView
+      // 
+      this.allSubOperatorsTypeConstraintView.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.allSubOperatorsTypeConstraintView.Caption = "View";
+      this.allSubOperatorsTypeConstraintView.Location = new System.Drawing.Point(0, 35);
+      this.allSubOperatorsTypeConstraintView.Name = "allSubOperatorsTypeConstraintView";
+      this.allSubOperatorsTypeConstraintView.Size = new System.Drawing.Size(492, 337);
+      this.allSubOperatorsTypeConstraintView.TabIndex = 3;
+      // 
+      // SubOperatorsTypeConstraintView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.allSubOperatorsTypeConstraintView);
+      this.Controls.Add(this.indexLabel);
+      this.Controls.Add(this.indexDataView);
+      this.Name = "SubOperatorsTypeConstraintView";
+      this.Size = new System.Drawing.Size(496, 377);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private HeuristicLab.Data.IntDataView indexDataView;
+    private System.Windows.Forms.Label indexLabel;
+    private AllSubOperatorsTypeConstraintView allSubOperatorsTypeConstraintView;
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/3.3/SubOperatorsTypeConstraintView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/SubOperatorsTypeConstraintView.cs	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/SubOperatorsTypeConstraintView.cs	(revision 1671)
@@ -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;
+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.Constraints {
+  /// <summary>
+  /// The visual representation of a <see cref="SubOperatorTypeConstraint"/>.
+  /// </summary>
+  public partial class SubOperatorsTypeConstraintView : ViewBase {
+    private SubOperatorTypeConstraint constraint;
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="SubOperatorsTypeConstraintView"/>.
+    /// </summary>
+    public SubOperatorsTypeConstraintView() {
+      InitializeComponent();
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="SubOperatorTypeConstraint"/> with the given
+    /// <paramref name="constraint"/> to display.
+    /// </summary>
+    /// <param name="constraint">The constraint to represent visually.</param>
+    public SubOperatorsTypeConstraintView(SubOperatorTypeConstraint constraint) {
+      InitializeComponent();
+
+      this.constraint = constraint;
+      allSubOperatorsTypeConstraintView.Constraint = constraint;
+      indexDataView.IntData = constraint.SubOperatorIndex;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/3.3/SubOperatorsTypeConstraintView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/SubOperatorsTypeConstraintView.resx	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/SubOperatorsTypeConstraintView.resx	(revision 1671)
@@ -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.Constraints/3.3/VariableComparisonConstraint.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/VariableComparisonConstraint.cs	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/VariableComparisonConstraint.cs	(revision 1671)
@@ -0,0 +1,181 @@
+#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.Constraints {
+  /// <summary>
+  /// Constraint that compares variables in a <see cref="ConstrainedItemList"/>.
+  /// </summary>
+  public class VariableComparisonConstraint : ConstraintBase {
+    private StringData leftVarName;
+    /// <summary>
+    /// Gets or sets the variable name of the left item to compare.
+    /// </summary>
+    public StringData LeftVarName {
+      get { return leftVarName; }
+      set { leftVarName = value; }
+    }
+
+    private StringData rightVarName;
+    /// <summary>
+    /// Gets or sets the variable name of the right item to compare.
+    /// </summary>
+    public StringData RightVarName {
+      get { return rightVarName; }
+      set { rightVarName = value; }
+    }
+
+    private IntData comparer;
+    /// <summary>
+    /// Gets or sets the comparer.
+    /// </summary>
+    public IntData Comparer {
+      get { return comparer; }
+      set { comparer = value; }
+    }
+
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get {
+        return @"Compares variables in a ConstrainedItemList";
+      }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="VariableComparisonConstraint"/>.
+    /// </summary>
+    public VariableComparisonConstraint() {
+      leftVarName = new StringData();
+      rightVarName = new StringData();
+      comparer = new IntData(-1);
+    }
+
+    /// <summary>
+    /// Checks whether the given element fulfills the current constraint.
+    /// </summary>
+    /// <exception cref="InvalidOperationException">Thrown when the data is no <c>ConstrainedItemList</c>.</exception>
+    /// <exception cref="InvalidCastException">Thrown when the left varible is not of type <c>IComparable</c>.</exception>
+    /// <exception cref="InvalidOperationException">Thrown when the comparer is undefined.</exception>
+    /// <param name="data">The item to check.</param>
+    /// <returns><c>true</c> if the constraint could be fulfilled, <c>false</c> otherwise.</returns>
+    public override bool Check(IItem data) {
+      ConstrainedItemList list = (data as ConstrainedItemList);
+      if (list == null) throw new InvalidOperationException("ERROR in VariableComparisonConstraint: Can only be applied on ConstrainedItemLists");
+      IComparable left = null;
+      IItem right = null;
+      foreach (IItem item in list) {
+        Variable tmp = (item as Variable);
+        if (tmp != null && tmp.Name.Equals(leftVarName.Data)) {
+          left = (tmp.Value as IComparable);
+          if (left == null) throw new InvalidCastException("ERROR in VariableComparisonConstraint: Value of the variable on the left side needs to be of type IComparable");
+        } else if (tmp != null && tmp.Name.Equals(rightVarName.Data)) {
+          right = tmp.Value;
+        }
+      }
+      if (left != null && right != null) {
+        switch (comparer.Data) {
+          case 0:
+            return left.CompareTo(right) < 0;
+          case 1:
+            return left.CompareTo(right) <= 0;
+          case 2:
+            return left.CompareTo(right) == 0;
+          case 3:
+            return left.CompareTo(right) >= 0;
+          case 4:
+            return left.CompareTo(right) > 0;
+          default:
+            throw new InvalidOperationException("ERROR in VariableComparisonConstraint: Comparer undefined");
+        }
+      }
+      return true;
+    }
+
+    /// <summary>
+    /// Creates a new instance of <see cref="VariableComparisonConstraintView"/> to represent the current 
+    /// instance visually.
+    /// </summary>
+    /// <returns>The created view as <see cref="VariableComparisonConstraintView"/>.</returns>
+    public override IView CreateView() {
+      return new VariableComparisonConstraintView(this);
+    }
+
+    #region clone & persistence
+    /// <summary>
+    /// Clones the current instance (deep clone).
+    /// </summary>
+    /// <remarks>Deep clone through <see cref="Auxiliary.Clone"/> method of helper class 
+    /// <see cref="Auxiliary"/>.</remarks>
+    /// <param name="clonedObjects">Dictionary of all already clone objects. (Needed to avoid cycles.)</param>
+    /// <returns>The cloned object as <see cref="VariableComparisonConstraint"/>.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      VariableComparisonConstraint clone = new VariableComparisonConstraint();
+      clonedObjects.Add(Guid, clone);
+      clone.LeftVarName = (StringData)Auxiliary.Clone(LeftVarName, clonedObjects);
+      clone.RightVarName = (StringData)Auxiliary.Clone(RightVarName, clonedObjects);
+      clone.Comparer = (IntData)Auxiliary.Clone(Comparer, clonedObjects);
+      return clone;
+    }
+
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>The variable names and the comparer are saved as child nodes with tag names
+    /// <c>LeftVarName</c>, <c>RightVarName</c> and <c>Comparer</c>.</remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where the data is saved.</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 leftNode = PersistenceManager.Persist("LeftVarName", LeftVarName, document, persistedObjects);
+      node.AppendChild(leftNode);
+      XmlNode rightNode = PersistenceManager.Persist("RightVarName", RightVarName, document, persistedObjects);
+      node.AppendChild(rightNode);
+      XmlNode comparerNode = PersistenceManager.Persist("Comparer", Comparer, document, persistedObjects);
+      node.AppendChild(comparerNode);
+      return node;
+    }
+
+    /// <summary>
+    /// Loads the persisted constraint from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>The constraint must be saved in a specific way, see <see cref="GetXmlNode"/> for 
+    /// more information.</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the instance 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);
+      leftVarName = (StringData)PersistenceManager.Restore(node.SelectSingleNode("LeftVarName"), restoredObjects);
+      rightVarName = (StringData)PersistenceManager.Restore(node.SelectSingleNode("RightVarName"), restoredObjects);
+      comparer = (IntData)PersistenceManager.Restore(node.SelectSingleNode("Comparer"), restoredObjects);
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/3.3/VariableComparisonConstraintView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/VariableComparisonConstraintView.Designer.cs	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/VariableComparisonConstraintView.Designer.cs	(revision 1671)
@@ -0,0 +1,196 @@
+#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.Constraints {
+  partial class VariableComparisonConstraintView {
+    /// <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.label1 = new System.Windows.Forms.Label();
+      this.comparerGroupBox = new System.Windows.Forms.GroupBox();
+      this.greaterRadioButton = new System.Windows.Forms.RadioButton();
+      this.greaterOrEqualRadioButton = new System.Windows.Forms.RadioButton();
+      this.equalRadioButton = new System.Windows.Forms.RadioButton();
+      this.lessOrEqualRadioButton = new System.Windows.Forms.RadioButton();
+      this.lessRadioButton = new System.Windows.Forms.RadioButton();
+      this.label2 = new System.Windows.Forms.Label();
+      this.rightVarNameStringDataView = new HeuristicLab.Data.StringDataView();
+      this.leftVarNameStringDataView = new HeuristicLab.Data.StringDataView();
+      this.comparerGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(3, 5);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(25, 13);
+      this.label1.TabIndex = 0;
+      this.label1.Text = "Left";
+      // 
+      // comparerGroupBox
+      // 
+      this.comparerGroupBox.Controls.Add(this.greaterRadioButton);
+      this.comparerGroupBox.Controls.Add(this.greaterOrEqualRadioButton);
+      this.comparerGroupBox.Controls.Add(this.equalRadioButton);
+      this.comparerGroupBox.Controls.Add(this.lessOrEqualRadioButton);
+      this.comparerGroupBox.Controls.Add(this.lessRadioButton);
+      this.comparerGroupBox.Location = new System.Drawing.Point(3, 54);
+      this.comparerGroupBox.Name = "comparerGroupBox";
+      this.comparerGroupBox.Size = new System.Drawing.Size(141, 137);
+      this.comparerGroupBox.TabIndex = 4;
+      this.comparerGroupBox.TabStop = false;
+      this.comparerGroupBox.Text = "Comparer";
+      // 
+      // greaterRadioButton
+      // 
+      this.greaterRadioButton.AutoSize = true;
+      this.greaterRadioButton.Location = new System.Drawing.Point(9, 111);
+      this.greaterRadioButton.Name = "greaterRadioButton";
+      this.greaterRadioButton.Size = new System.Drawing.Size(31, 17);
+      this.greaterRadioButton.TabIndex = 4;
+      this.greaterRadioButton.Text = ">";
+      this.greaterRadioButton.UseVisualStyleBackColor = true;
+      this.greaterRadioButton.CheckedChanged += new System.EventHandler(this.anyRadioButton_CheckedChanged);
+      // 
+      // greaterOrEqualRadioButton
+      // 
+      this.greaterOrEqualRadioButton.AutoSize = true;
+      this.greaterOrEqualRadioButton.Location = new System.Drawing.Point(9, 88);
+      this.greaterOrEqualRadioButton.Name = "greaterOrEqualRadioButton";
+      this.greaterOrEqualRadioButton.Size = new System.Drawing.Size(37, 17);
+      this.greaterOrEqualRadioButton.TabIndex = 3;
+      this.greaterOrEqualRadioButton.Text = ">=";
+      this.greaterOrEqualRadioButton.UseVisualStyleBackColor = true;
+      this.greaterOrEqualRadioButton.CheckedChanged += new System.EventHandler(this.anyRadioButton_CheckedChanged);
+      // 
+      // equalRadioButton
+      // 
+      this.equalRadioButton.AutoSize = true;
+      this.equalRadioButton.Location = new System.Drawing.Point(9, 65);
+      this.equalRadioButton.Name = "equalRadioButton";
+      this.equalRadioButton.Size = new System.Drawing.Size(31, 17);
+      this.equalRadioButton.TabIndex = 2;
+      this.equalRadioButton.Text = "=";
+      this.equalRadioButton.UseVisualStyleBackColor = true;
+      this.equalRadioButton.CheckedChanged += new System.EventHandler(this.anyRadioButton_CheckedChanged);
+      // 
+      // lessOrEqualRadioButton
+      // 
+      this.lessOrEqualRadioButton.AutoSize = true;
+      this.lessOrEqualRadioButton.Location = new System.Drawing.Point(9, 42);
+      this.lessOrEqualRadioButton.Name = "lessOrEqualRadioButton";
+      this.lessOrEqualRadioButton.Size = new System.Drawing.Size(37, 17);
+      this.lessOrEqualRadioButton.TabIndex = 1;
+      this.lessOrEqualRadioButton.Text = "<=";
+      this.lessOrEqualRadioButton.UseVisualStyleBackColor = true;
+      this.lessOrEqualRadioButton.CheckedChanged += new System.EventHandler(this.anyRadioButton_CheckedChanged);
+      // 
+      // lessRadioButton
+      // 
+      this.lessRadioButton.AutoSize = true;
+      this.lessRadioButton.Location = new System.Drawing.Point(9, 19);
+      this.lessRadioButton.Name = "lessRadioButton";
+      this.lessRadioButton.Size = new System.Drawing.Size(31, 17);
+      this.lessRadioButton.TabIndex = 0;
+      this.lessRadioButton.Text = "<";
+      this.lessRadioButton.UseVisualStyleBackColor = true;
+      this.lessRadioButton.CheckedChanged += new System.EventHandler(this.anyRadioButton_CheckedChanged);
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(3, 31);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(32, 13);
+      this.label2.TabIndex = 2;
+      this.label2.Text = "Right";
+      // 
+      // rightVarNameStringDataView
+      // 
+      this.rightVarNameStringDataView.Caption = "View";
+      this.rightVarNameStringDataView.Location = new System.Drawing.Point(44, 28);
+      this.rightVarNameStringDataView.Name = "rightVarNameStringDataView";
+      this.rightVarNameStringDataView.Size = new System.Drawing.Size(100, 20);
+      this.rightVarNameStringDataView.StringData = null;
+      this.rightVarNameStringDataView.TabIndex = 3;
+      // 
+      // leftVarNameStringDataView
+      // 
+      this.leftVarNameStringDataView.Caption = "View";
+      this.leftVarNameStringDataView.Location = new System.Drawing.Point(44, 2);
+      this.leftVarNameStringDataView.Name = "leftVarNameStringDataView";
+      this.leftVarNameStringDataView.Size = new System.Drawing.Size(100, 20);
+      this.leftVarNameStringDataView.StringData = null;
+      this.leftVarNameStringDataView.TabIndex = 1;
+      // 
+      // VariableComparisonConstraintView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.leftVarNameStringDataView);
+      this.Controls.Add(this.rightVarNameStringDataView);
+      this.Controls.Add(this.label2);
+      this.Controls.Add(this.comparerGroupBox);
+      this.Controls.Add(this.label1);
+      this.Name = "VariableComparisonConstraintView";
+      this.Size = new System.Drawing.Size(147, 193);
+      this.comparerGroupBox.ResumeLayout(false);
+      this.comparerGroupBox.PerformLayout();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.GroupBox comparerGroupBox;
+    private System.Windows.Forms.RadioButton greaterRadioButton;
+    private System.Windows.Forms.RadioButton greaterOrEqualRadioButton;
+    private System.Windows.Forms.RadioButton equalRadioButton;
+    private System.Windows.Forms.RadioButton lessOrEqualRadioButton;
+    private System.Windows.Forms.RadioButton lessRadioButton;
+    private System.Windows.Forms.Label label2;
+    private HeuristicLab.Data.StringDataView rightVarNameStringDataView;
+    private HeuristicLab.Data.StringDataView leftVarNameStringDataView;
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/3.3/VariableComparisonConstraintView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/VariableComparisonConstraintView.cs	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/VariableComparisonConstraintView.cs	(revision 1671)
@@ -0,0 +1,145 @@
+#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;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Constraints {
+  /// <summary>
+  /// Visual representation of a <see cref="VariableComparisonConstraint"/>.
+  /// </summary>
+  public partial class VariableComparisonConstraintView : ViewBase {
+    /// <summary>
+    /// Gets or sets the VariableComparisonConstraint to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>.
+    /// No own data storage present.</remarks>
+    public VariableComparisonConstraint VariableComparisonConstraint {
+      get { return (VariableComparisonConstraint)base.Item; }
+      set { base.Item = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="VariableComparisonConstraintView"/>.
+    /// </summary>
+    public VariableComparisonConstraintView() {
+      InitializeComponent();
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="VariableComparisonConstraintView"/> with the given
+    /// <paramref name="variableComparisonConstraint"/> to display.
+    /// </summary>
+    /// <param name="variableComparisonConstraint">The constraint to represent visually.</param>
+    public VariableComparisonConstraintView(VariableComparisonConstraint variableComparisonConstraint)
+      : this() {
+      VariableComparisonConstraint = variableComparisonConstraint;
+    }
+
+    /// <summary>
+    /// Removes the eventhandler from the underlying <see cref="VariableComparisonConstraint"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.
+    /// </remarks>
+    protected override void RemoveItemEvents() {
+      VariableComparisonConstraint.Changed -= new EventHandler(VariableComparisonConstraint_Changed);
+      base.RemoveItemEvents();
+    }
+
+    /// <summary>
+    /// Adds an eventhandler to the underlying <see cref="VariableComparisonConstraint"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.
+    /// </remarks>
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      VariableComparisonConstraint.Changed += new EventHandler(VariableComparisonConstraint_Changed);
+    }
+
+    void VariableComparisonConstraint_Changed(object sender, EventArgs e) {
+      Refresh();
+    }
+
+    /// <summary>
+    /// Updates all controls with the latest values.
+    /// </summary> 
+    /// <remarks>Calls <see cref="ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.
+    /// </remarks>
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (VariableComparisonConstraint == null) {
+        leftVarNameStringDataView.Enabled = false;
+        leftVarNameStringDataView.StringData = null;
+        rightVarNameStringDataView.Enabled = false;
+        rightVarNameStringDataView.StringData = null;
+        comparerGroupBox.Enabled = false;
+      } else {
+        leftVarNameStringDataView.StringData = VariableComparisonConstraint.LeftVarName;
+        leftVarNameStringDataView.Enabled = true;
+        rightVarNameStringDataView.StringData = VariableComparisonConstraint.RightVarName;
+        rightVarNameStringDataView.Enabled = true;
+        comparerGroupBox.Enabled = true;
+        switch (VariableComparisonConstraint.Comparer.Data) {
+          case 0:
+            lessRadioButton.Checked = true;
+            break;
+          case 1:
+            lessOrEqualRadioButton.Checked = true;
+            break;
+          case 2:
+            equalRadioButton.Checked = true;
+            break;
+          case 3:
+            greaterOrEqualRadioButton.Checked = true;
+            break;
+          case 4:
+            greaterRadioButton.Checked = true;
+            break;
+        }
+      }
+    }
+
+    private void anyRadioButton_CheckedChanged(object sender, EventArgs e) {
+      if (VariableComparisonConstraint != null) {
+        if (((RadioButton)sender).Checked && ((RadioButton)sender).Name.StartsWith("lessOrEqual")) {
+          VariableComparisonConstraint.Comparer.Data = 1;
+        } else if (((RadioButton)sender).Checked && ((RadioButton)sender).Name.StartsWith("less")) {
+          VariableComparisonConstraint.Comparer.Data = 0;
+        } else if (((RadioButton)sender).Checked && ((RadioButton)sender).Name.StartsWith("greaterOrEqual")) {
+          VariableComparisonConstraint.Comparer.Data = 3;
+        } else if (((RadioButton)sender).Checked && ((RadioButton)sender).Name.StartsWith("greater")) {
+          VariableComparisonConstraint.Comparer.Data = 4;
+        } else if (((RadioButton)sender).Checked && ((RadioButton)sender).Name.StartsWith("equal")) {
+          VariableComparisonConstraint.Comparer.Data = 2;
+        } else if (((RadioButton)sender).Checked) {
+          Auxiliary.ShowErrorMessageBox("Unknown radio button selected: " + ((RadioButton)sender).Name.ToString());
+        }
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Constraints/3.3/VariableComparisonConstraintView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Constraints/3.3/VariableComparisonConstraintView.resx	(revision 1671)
+++ /trunk/sources/HeuristicLab.Constraints/3.3/VariableComparisonConstraintView.resx	(revision 1671)
@@ -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>
