Index: /trunk/sources/HeuristicLab.CEDMA.Charting/3.3/BubbleChart.cs
===================================================================
--- /trunk/sources/HeuristicLab.CEDMA.Charting/3.3/BubbleChart.cs	(revision 2324)
+++ /trunk/sources/HeuristicLab.CEDMA.Charting/3.3/BubbleChart.cs	(revision 2325)
@@ -137,6 +137,6 @@
         } else if (matrix.MultiDimensionalCategoricalVariables.Contains(xDimension)) {
           var path = xDimension.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries).Select(x => x.Trim());
-          IEnumerable<MatrixRow> subRows = (IEnumerable<MatrixRow>)r.Get(path.ElementAt(0));
-          foreach (MatrixRow subRow in subRows) {
+          IEnumerable<MatrixRow<string, object>> subRows = (IEnumerable<MatrixRow<string,object>>)r.Get(path.ElementAt(0));
+          foreach (MatrixRow<string, object> subRow in subRows) {
             if (subRow.Get(path.ElementAt(1)) != null) {
               xs.Add(matrix.IndexOfCategoricalValue(xDimension, subRow.Get(path.ElementAt(1))) + r.YJitter * xJitterFactor);
@@ -146,6 +146,6 @@
         } else if (matrix.MultiDimensionalOrdinalVariables.Contains(xDimension)) {
           var path = xDimension.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries).Select(x => x.Trim());
-          IEnumerable<MatrixRow> subRows = (IEnumerable<MatrixRow>)r.Get(path.ElementAt(0));
-          foreach (MatrixRow subRow in subRows) {
+          IEnumerable<MatrixRow<string, object>> subRows = (IEnumerable<MatrixRow<string, object>>)r.Get(path.ElementAt(0));
+          foreach (MatrixRow<string,object> subRow in subRows) {
             if (subRow.Get(path.ElementAt(1)) != null) {
               xs.Add(Convert.ToDouble(subRow.Get(path.ElementAt(1))) + r.XJitter * xJitterFactor);
@@ -162,6 +162,6 @@
         } else if (matrix.MultiDimensionalCategoricalVariables.Contains(yDimension)) {
           var path = yDimension.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries).Select(x => x.Trim());
-          IEnumerable<MatrixRow> subRows = (IEnumerable<MatrixRow>)r.Get(path.ElementAt(0));
-          foreach (MatrixRow subRow in subRows) {
+          IEnumerable<MatrixRow<string,object>> subRows = (IEnumerable<MatrixRow<string,object>>)r.Get(path.ElementAt(0));
+          foreach (MatrixRow<string,object> subRow in subRows) {
             if (subRow.Get(path.ElementAt(1)) != null) {
               ys.Add(matrix.IndexOfCategoricalValue(yDimension, subRow.Get(path.ElementAt(1))) + r.YJitter * yJitterFactor);
@@ -171,6 +171,6 @@
         } else if (matrix.MultiDimensionalOrdinalVariables.Contains(yDimension)) {
           var path = yDimension.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries).Select(x => x.Trim());
-          IEnumerable<MatrixRow> subRows = (IEnumerable<MatrixRow>)r.Get(path.ElementAt(0));
-          foreach (MatrixRow subRow in subRows) {
+          IEnumerable<MatrixRow<string, object>> subRows = (IEnumerable<MatrixRow<string, object>>)r.Get(path.ElementAt(0));
+          foreach (MatrixRow<string,object> subRow in subRows) {
             if (subRow.Get(path.ElementAt(1)) != null) {
               ys.Add(Convert.ToDouble(subRow.Get(path.ElementAt(1))) + r.YJitter * yJitterFactor);
Index: /trunk/sources/HeuristicLab.CEDMA.Charting/3.3/VisualMatrix.cs
===================================================================
--- /trunk/sources/HeuristicLab.CEDMA.Charting/3.3/VisualMatrix.cs	(revision 2324)
+++ /trunk/sources/HeuristicLab.CEDMA.Charting/3.3/VisualMatrix.cs	(revision 2325)
@@ -9,5 +9,5 @@
   public class VisualMatrix : ItemBase {
     private Dictionary<string, Dictionary<object, double>> categoricalValueIndices;
-    private Matrix matrix;
+    private Matrix<string,object> matrix;
 
     public VisualMatrix() {
@@ -19,5 +19,5 @@
       this.categoricalValueIndices = new Dictionary<string, Dictionary<object, double>>();    }
 
-    public VisualMatrix(Matrix matrix, IEnumerable<string> categoricalVariables, IEnumerable<string> ordinalVariables,
+    public VisualMatrix(Matrix<string,object> matrix, IEnumerable<string> categoricalVariables, IEnumerable<string> ordinalVariables,
       IEnumerable<string> multiDimensionalCategoricalVariables, IEnumerable<string> multiDimensionalOrdinalVariables)
       : this() {
@@ -25,5 +25,5 @@
       this.matrix.Changed += new EventHandler(MatrixChanged);
 
-      foreach (MatrixRow row in matrix.GetRows())
+      foreach (MatrixRow<string,object> row in matrix.GetRows())
         rows.Add(new VisualMatrixRow(row));
 
Index: /trunk/sources/HeuristicLab.CEDMA.Charting/3.3/VisualMatrixRow.cs
===================================================================
--- /trunk/sources/HeuristicLab.CEDMA.Charting/3.3/VisualMatrixRow.cs	(revision 2324)
+++ /trunk/sources/HeuristicLab.CEDMA.Charting/3.3/VisualMatrixRow.cs	(revision 2325)
@@ -27,5 +27,5 @@
     }
 
-    public VisualMatrixRow(MatrixRow row)
+    public VisualMatrixRow(MatrixRow<string,object> row)
       : this() {
       foreach (KeyValuePair<string, object> value in row.Values)
Index: /trunk/sources/HeuristicLab.CEDMA.Core/3.3/Console.cs
===================================================================
--- /trunk/sources/HeuristicLab.CEDMA.Core/3.3/Console.cs	(revision 2324)
+++ /trunk/sources/HeuristicLab.CEDMA.Core/3.3/Console.cs	(revision 2325)
@@ -56,6 +56,6 @@
     }
 
-    private Matrix matrix;
-    public Matrix Matrix {
+    private Matrix<string,object> matrix;
+    public Matrix<string,object> Matrix {
       get {
         if (matrix == null) LoadResults();
@@ -82,18 +82,18 @@
 
     private void LoadResults() {
-      matrix = new Matrix();
+      matrix = new Matrix<string,object>();
       DatabaseService db = new DatabaseService(sqlServerCompactConnectionString + database);
       db.Connect();
 
       foreach (var model in db.GetAllModels()) {
-        MatrixRow row = new MatrixRow();
+        MatrixRow<string, object> row = new MatrixRow<string, object>();
         foreach (var modelResult in db.GetModelResults(model)) {
           row.Set(modelResult.Result.Name, modelResult.Value);
         }
-        Dictionary<HeuristicLab.Modeling.Database.IVariable, MatrixRow> inputVariableResultsEntries =
-          new Dictionary<HeuristicLab.Modeling.Database.IVariable, MatrixRow>();
+        Dictionary<HeuristicLab.Modeling.Database.IVariable, MatrixRow<string, object>> inputVariableResultsEntries =
+          new Dictionary<HeuristicLab.Modeling.Database.IVariable, MatrixRow<string, object>>();
         foreach (IInputVariableResult inputVariableResult in db.GetInputVariableResults(model)) {
           if (!inputVariableResultsEntries.ContainsKey(inputVariableResult.Variable)) {
-            inputVariableResultsEntries[inputVariableResult.Variable] = new MatrixRow();
+            inputVariableResultsEntries[inputVariableResult.Variable] = new MatrixRow<string, object>();
             inputVariableResultsEntries[inputVariableResult.Variable].Set("InputVariableName", inputVariableResult.Variable.Name);
           }
Index: /trunk/sources/HeuristicLab.SparseMatrix/3.2/Matrix.cs
===================================================================
--- /trunk/sources/HeuristicLab.SparseMatrix/3.2/Matrix.cs	(revision 2324)
+++ /trunk/sources/HeuristicLab.SparseMatrix/3.2/Matrix.cs	(revision 2325)
@@ -25,24 +25,24 @@
 
 namespace HeuristicLab.SparseMatrix {   
-  public class Matrix : ItemBase {
+  public class Matrix<KeyType,ValueType> : ItemBase {
     public Matrix() {
-      this.rows = new List<MatrixRow>();
+      this.rows = new List<MatrixRow<KeyType,ValueType>>();
     }
 
-    public Matrix(IEnumerable<MatrixRow> rows)
+    public Matrix(IEnumerable<MatrixRow<KeyType,ValueType>> rows)
       : this() {
       this.rows.AddRange(rows);
     }
 
-    private List<MatrixRow> rows;
-    public ReadOnlyCollection<MatrixRow> GetRows() {
+    private List<MatrixRow<KeyType, ValueType>> rows;
+    public ReadOnlyCollection<MatrixRow<KeyType, ValueType>> GetRows() {
       return rows.AsReadOnly();
     }
 
-    public void AddRow(MatrixRow row) {
+    public void AddRow(MatrixRow<KeyType, ValueType> row) {
       this.rows.Add(row);
     }
 
-    public void RemoveRow(MatrixRow row) {
+    public void RemoveRow(MatrixRow<KeyType, ValueType> row) {
       this.rows.Remove(row);
     }
Index: /trunk/sources/HeuristicLab.SparseMatrix/3.2/MatrixRow.cs
===================================================================
--- /trunk/sources/HeuristicLab.SparseMatrix/3.2/MatrixRow.cs	(revision 2324)
+++ /trunk/sources/HeuristicLab.SparseMatrix/3.2/MatrixRow.cs	(revision 2325)
@@ -23,20 +23,24 @@
 
 namespace HeuristicLab.SparseMatrix {
-  public class MatrixRow {
-    private Dictionary<string, object> values;
+  public class MatrixRow<KeyType, ValueType> {
+    private Dictionary<KeyType, ValueType> values;
     public MatrixRow() {
-      values = new Dictionary<string, object>();
-    } 
-
-    public void Set(string name, object value) {
-      values.Add(name, value);
+      values = new Dictionary<KeyType, ValueType>();
     }
 
-    public object Get(string name) {
-      if (name == null || !values.ContainsKey(name)) return null;
-      return values[name];
+    public void Set(KeyType key, ValueType value) {
+      values.Add(key, value);
     }
 
-    public IEnumerable<KeyValuePair<string, object>> Values {
+    public bool ContainsKey(KeyType key) {
+      return values.ContainsKey(key);
+    }
+
+    public ValueType Get(KeyType key) {
+      if (key == null || !values.ContainsKey(key)) return default(ValueType);
+      return values[key];
+    }
+
+    public IEnumerable<KeyValuePair<KeyType, ValueType>> Values {
       get { return values; }
     }
