Free cookie consent management tool by TermsFeed Policy Generator

source: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueTypeMatrixConverter.cs @ 18043

Last change on this file since 18043 was 18043, checked in by dpiringe, 3 years ago

#3026

  • code cleanup
File size: 4.6 KB
RevLine 
[17263]1using System;
2using HeuristicLab.Data;
3using HeuristicLab.Core;
[18036]4using System.Reflection;
[17263]5
[17284]6namespace HeuristicLab.JsonInterface {
[17394]7  public class IntMatrixConverter : ValueTypeMatrixConverter<IntMatrix, int> {
8    public override int Priority => 1;
[17828]9
[17417]10    public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) {
11      IntMatrix mat = item as IntMatrix;
12      IntMatrixJsonItem d = data as IntMatrixJsonItem;
13      CopyMatrixData(mat, d.Value);
14    }
15
16    public override IJsonItem Extract(IItem value, IJsonItemConverter root) =>
17      new IntMatrixJsonItem() {
[17483]18        Name = value.ItemName,
[17433]19        Description = value.ItemDescription,
[17420]20        Value = Transform((IntMatrix)value),
[17473]21        Minimum = int.MinValue,
22        Maximum = int.MaxValue
[17417]23      };
[17394]24  }
25
26  public class DoubleMatrixConverter : ValueTypeMatrixConverter<DoubleMatrix, double> {
27    public override int Priority => 1;
[17417]28
29    public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) {
30      DoubleMatrix mat = item as DoubleMatrix;
[17471]31      DoubleMatrixJsonItem d = data as DoubleMatrixJsonItem;
[17417]32      CopyMatrixData(mat, d.Value);
33    }
34
35    public override IJsonItem Extract(IItem value, IJsonItemConverter root) =>
[17471]36      new DoubleMatrixJsonItem() {
[17483]37        Name = value.ItemName,
[17433]38        Description = value.ItemDescription,
[17420]39        Value = Transform((DoubleMatrix)value),
[17473]40        Minimum = double.MinValue,
41        Maximum = double.MaxValue,
[17451]42        RowNames = ((DoubleMatrix)value).RowNames,
43        ColumnNames = ((DoubleMatrix)value).ColumnNames
[17417]44      };
[17394]45  }
46
47  public class PercentMatrixConverter : ValueTypeMatrixConverter<PercentMatrix, double> {
48    public override int Priority => 2;
[17417]49
50    public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) {
51      PercentMatrix mat = item as PercentMatrix;
52      DoubleMatrixJsonItem d = data as DoubleMatrixJsonItem;
53      CopyMatrixData(mat, d.Value);
54    }
55
56    public override IJsonItem Extract(IItem value, IJsonItemConverter root) =>
57      new DoubleMatrixJsonItem() {
[17483]58        Name = value.ItemName,
[17433]59        Description = value.ItemDescription,
[17420]60        Value = Transform((PercentMatrix)value),
[17473]61        Minimum = 0.0d,
62        Maximum = 1.0d
[17417]63      };
[17394]64  }
65
66  public class BoolMatrixConverter : ValueTypeMatrixConverter<BoolMatrix, bool> {
67    public override int Priority => 1;
[17417]68
69    public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) {
70      BoolMatrix mat = item as BoolMatrix;
71      BoolMatrixJsonItem d = data as BoolMatrixJsonItem;
72      CopyMatrixData(mat, d.Value);
73    }
74
75    public override IJsonItem Extract(IItem value, IJsonItemConverter root) =>
76      new BoolMatrixJsonItem() {
[17473]77        Name = value.ItemName,
[17433]78        Description = value.ItemDescription,
[17473]79        Value = Transform((BoolMatrix)value)
[17417]80      };
[17394]81  }
82
83  public abstract class ValueTypeMatrixConverter<MatrixType, T> : BaseConverter
[17263]84    where MatrixType : ValueTypeMatrix<T>
85    where T : struct
86  {
[17828]87    public override bool CanConvertType(Type t) =>
[17843]88      typeof(MatrixType).IsAssignableFrom(t);
[17828]89
[17266]90    #region Helper
[17828]91    /// <summary>
92    /// Copies the data into the matrix object. Uses reflection to set the
93    /// row and column size of the matrix, because it is not possible to
94    /// create a new matrix at this point and there exists no public resize method.
95    /// </summary>
96    /// <param name="matrix"></param>
97    /// <param name="data"></param>
[17417]98    protected void CopyMatrixData(MatrixType matrix, T[][] data) {
[17451]99      var cols = data.Length;
100      var rows = data.Length > 0 ? data[0].Length : 0;
[17374]101
[18036]102
103      // matrix
104      var t = matrix.GetType();
105      var matrixInfo = matrix.GetType().GetField("matrix", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
106      matrixInfo.SetValue(matrix, new T[rows, cols]);
107      /*
[17417]108      var rowInfo = matrix.GetType().GetProperty("Rows");
[18036]109      rowInfo.SetValue(matrix, rows); // TODO
[17417]110      var colInfo = matrix.GetType().GetProperty("Columns");
111      colInfo.SetValue(matrix, cols);
[18036]112      */
[17379]113
[18036]114
[17417]115      for (int x = 0; x < rows; ++x) {
116        for (int y = 0; y < cols; ++y) {
[17451]117          matrix[x, y] = data[y][x];
[17263]118        }
119      }
120    }
[17417]121
122    protected T[][] Transform(MatrixType matrix) {
[17451]123      T[][] m = new T[matrix.Columns][];
124      for (int column = 0; column < matrix.Columns; ++column) {
125        m[column] = new T[matrix.Rows];
126        for (int row = 0; row < matrix.Rows; ++row) {
127          m[column][row] = matrix[row, column];
[17417]128        }
129      }
130      return m;
131    }
[17266]132    #endregion
[17263]133  }
134}
Note: See TracBrowser for help on using the repository browser.