AbstractIntervalDerivativeMatrix.java

/*
 * Created on 2007/10/06
 * Copyright (C) 2007 Koga Laboratory. All rights reserved.
 *
 */
package org.mklab.cga.derivative;

import java.io.Writer;

import org.mklab.cga.interval.matrix.IntervalNumericalMatrix;
import org.mklab.cga.interval.scalar.IntervalNumericalScalar;
import org.mklab.nfc.matrix.AbstractNumericalMatrix;
import org.mklab.nfc.matrix.NumericalMatrix;
import org.mklab.nfc.scalar.NumericalScalar;


/**
 * {@link AbstractIntervalDerivativeNumber}を要素として持つ行列クラスです。
 * 
 * @author yano
 * @version $Revision: 1.15 $, 2007/10/06
 * @param <IDS> 区間微分スカラーの型
 * @param <IDM> 区間微分行列の型
 * @param <IS> 区間スカラーの型
 * @param <IM> 区間行列の型
 * @param <S> スカラーの型
 * @param <M> 行列の型
 */
public abstract class AbstractIntervalDerivativeMatrix<IDS extends IntervalDerivativeNumber<IDS ,IDM,IS,IM,S,M>, IDM extends IntervalDerivativeMatrix<IDS,IDM,IS,IM,S,M>, IS extends IntervalNumericalScalar<IS,IM,S,M>,  IM extends IntervalNumericalMatrix<IS,IM,S,M>, S extends NumericalScalar<S,M>, M extends NumericalMatrix<S,M> > extends AbstractNumericalMatrix<IDS,IDM> implements IntervalDerivativeMatrix<IDS,IDM,IS,IM,S,M>{

  /** シリアル番号 */
  private static final long serialVersionUID = -2028857873973993340L;

  // TODO コンストラクターをリファクタリングする


  /**
   * コンストラクター
   * 
   * @param elements 行列の成分
   */
  public AbstractIntervalDerivativeMatrix(IDS[][] elements) {
    this(elements.length, elements.length == 0 ? 0 : elements[0].length, elements);
  }

  /**
   * コンストラクター
   * 
   * @param elements 行列の成分
   */
  public AbstractIntervalDerivativeMatrix(IDS[] elements) {
    super(elements);
  }

  /**
   * コンストラクター
   * 
   * @param rowSize 行の数
   * @param columnSize 列の数
   * @param elements 行列の成分
   */
  public AbstractIntervalDerivativeMatrix(int rowSize, int columnSize, IDS[][] elements) {
    super(rowSize, columnSize, elements);
  }

  /**
   * {@inheritDoc}
   */
  public IM getX() {
    IDS[][] elements = getElements();
    IS[][] x = elements[0][0].getX().createArray(getRowSize(), getColumnSize());
    for (int i = 0; i < getRowSize(); i++) {
      for (int j = 0; j < getColumnSize(); j++) {
        x[i][j]= elements[i][j].getX();
      }
    }
    
    return x[0][0].createGrid(x);
  }

  /**
   * {@inheritDoc}
   */
  public IM getDX() {
    IDS[][] elements = getElements();
    IS[][] dx = elements[0][0].getDX().createArray(getRowSize(), getColumnSize());
    for (int i = 0; i < getRowSize(); i++) {
      for (int j = 0; j < getColumnSize(); j++) {
        dx[i][j]= elements[i][j].getDX();
      }
    }
    
    return dx[0][0].createGrid(dx);
  }

//  /**
//   * コンストラクター
//   * 
//   * @param matrix 行列の成分
//   */
//  public AbstractIntervalDerivativeMatrix(IM matrix) {
//    super(matrix.getRowSize(), matrix.getColumnSize());
//
//    IDS[][] derivatives = new AbstractIntervalDerivative[matrix.getRowSize()][matrix.getColumnSize()];
//    for (int row = 1; row <= matrix.getRowSize(); row++) {
//      for (int col = 1; col <= matrix.getColumnSize(); col++) {
//        derivatives[row - 1][col - 1] = new AbstractIntervalDerivative<>(matrix.getElement(row, col));
//      }
//    }
//    setElements(derivatives);
//  }

//  /**
//   * コンストラクター
//   * 
//   * @param matrix 行列
//   * @param unit 単位
//   */
//  public AbstractIntervalDerivativeMatrix(M matrix, M unit) {
//    super(matrix.getRowSize(), matrix.getColumnSize());
//
//    boolean isVariable = unit.isUnit();
//
//    S scalar = unit.getElement(1, 1);
//    IDS[][] derivatives = new AbstractIntervalDerivative[matrix.getRowSize()][matrix.getColumnSize()];
//    for (int row = 1; row <= matrix.getRowSize(); row++) {
//      for (int col = 1; col <= matrix.getColumnSize(); col++) {
//        if (isVariable) {
//          derivatives[row - 1][col - 1] = new AbstractIntervalDerivative<>(matrix.getElement(row, col), scalar.createUnit());
//        } else {
//          derivatives[row - 1][col - 1] = new AbstractIntervalDerivative<>(matrix.getElement(row, col));
//        }
//      }
//    }
//    setElements(derivatives);
//  }

//  /**
//   * コンストラクター
//   * 
//   * @param matrix 行列の成分
//   */
//  public AbstractIntervalDerivativeMatrix(DoubleMatrix matrix) {
//    super(matrix.getRowSize(), matrix.getColumnSize());
//
//    IDS[][] derivatives = new AbstractIntervalDerivative[matrix.getRowSize()][matrix.getColumnSize()];
//    for (int row = 1; row <= matrix.getRowSize(); row++) {
//      for (int col = 1; col <= matrix.getColumnSize(); col++) {
//        derivatives[row - 1][col - 1] = new AbstractIntervalDerivative<>(matrix.getDoubleElement(row, col));
//      }
//    }
//    setElements(derivatives);
//  }
//
//  /**
//   * コンストラクター
//   * 
//   * @param matrix 行列
//   * @param unit 単位
//   */
//  public AbstractIntervalDerivativeMatrix(DoubleMatrix matrix, DoubleMatrix unit) {
//    super(matrix.getRowSize(), matrix.getColumnSize());
//
//    boolean isVariable = unit.isUnit();
//    IDS[][] derivatives = new AbstractIntervalDerivative[matrix.getRowSize()][matrix.getColumnSize()];
//    for (int row = 1; row <= matrix.getRowSize(); row++) {
//      for (int col = 1; col <= matrix.getColumnSize(); col++) {
//        if (isVariable) {
//          derivatives[row - 1][col - 1] = new AbstractIntervalDerivative<>(matrix.getDoubleElement(row, col), 1);
//        } else {
//          derivatives[row - 1][col - 1] = new AbstractIntervalDerivative<>(matrix.getDoubleElement(row, col));
//        }
//      }
//    }
//    setElements(derivatives);
//  }

//  /**
//   * コンストラクター
//   * 
//   * @param matrix 区間行列
//   */
//  public AbstractIntervalDerivativeMatrix(IM matrix) {
//    super(matrix.getRowSize(), matrix.getColumnSize());
//
//    IDS[][] derivatives = new AbstractIntervalDerivative[matrix.getRowSize()][matrix.getColumnSize()];
//    for (int row = 1; row <= matrix.getRowSize(); row++) {
//      for (int col = 1; col <= matrix.getColumnSize(); col++) {
//        derivatives[row - 1][col - 1] = new AbstractIntervalDerivative<>(matrix.getElement((row - 1) * matrix.getColumnSize() + (col - 1) % matrix.getColumnSize() + 1));
//      }
//    }
//    setElements(derivatives);
//  }

//  /**
//   * コンストラクター
//   * 
//   * @param matrix 区間行列
//   * @param unit 単位
//   */
//  public AbstractIntervalDerivativeMatrix(IM matrix, Matrix unit) {
//    super(matrix.getRowSize(), matrix.getColumnSize());
//
//    IS u = matrix.getElement(1, 1).createUnit();
//
//    IDS[][] derivatives = new AbstractIntervalDerivative[matrix.getRowSize()][matrix.getColumnSize()];
//    boolean isVariable = unit.isUnit();
//    for (int row = 1; row <= matrix.getRowSize(); row++) {
//      for (int col = 1; col <= matrix.getColumnSize(); col++) {
//        if (isVariable) {
//          derivatives[row - 1][col - 1] = new AbstractIntervalDerivative<>(matrix.getElement((row - 1) * matrix.getColumnSize() + (col - 1) % matrix.getColumnSize() + 1), u.create(1));
//        } else {
//          derivatives[row - 1][col - 1] = new AbstractIntervalDerivative<>(matrix.getElement((row - 1) * matrix.getColumnSize() + (col - 1) % matrix.getColumnSize() + 1));
//        }
//      }
//    }
//
//    setElements(derivatives);
//  }

//  /**
//   * 自身との除算を求めます。
//   * 
//   * @param value 割る値
//   * @return 自身との除算
//   */
//  // TODO 親クラスのメソッドでテストを通るようにして、このクラスから削除する
//  public IDM divide(IDS value) {
//    return divideElementWise(value);
//  }

//  /**
//   * 自身と成分ごとの除算を求めます。
//   * 
//   * @param value 割る値
//   * @return 自身と成分ごとの除算の結果
//   */
//  // TODO 引数を行列にする
//  // TODO 親クラスのメソッドでテストを通るようにして、このクラスから削除する
//  public IDM divideElementWise(IDS value) {
//    IDS[][] ans = new AbstractIntervalDerivative[getRowSize()][getColumnSize()];
//
//    final IDS[][] elements = getElements();
//
//    for (int i = 0; i < getRowSize(); i++) {
//      IDS[] a1i = elements[i];
//      IDS[] ansi = ans[i];
//      for (int j = 0; j < getColumnSize(); j++) {
//        ansi[j] = a1i[j].divide(value);
//      }
//    }
//    return new AbstractIntervalDerivativeMatrix(ans);
//  }

  /**
   * {@inheritDoc}
   */
  @Override
  public void printElements(Writer writer) {
    super.printElements(writer);
    // TODO
  }

  /**
   * {@inheritDoc}
   */
  @Override
  public void printElements(Writer writer, int maxColumnSize) {
    super.printElements(writer, maxColumnSize);
    // TODO
  }

}