UnitSystem.java

/**
 * $Id: UnitSystem.java,v 1.10 2008/07/16 03:51:37 koga Exp $
 *
 * Copyright (C) 2004-2005 Koga Laboratory. All rights reserved.
 */

package org.mklab.tool.control.system.math;

import org.mklab.nfc.matrix.ComplexNumericalMatrix;
import org.mklab.nfc.matrix.RealNumericalMatrix;
import org.mklab.nfc.scalar.ComplexNumericalScalar;
import org.mklab.nfc.scalar.RealNumericalScalar;


/**
 * 単位システムを表わすクラスです。
 * 
 * @author koga
 * @version $Revision: 1.10 $
 * @param <RS> type of real scalar
 * @param <RM> type of real matrix
 * @param <CS> type of complex scalar
 * @param <CM> type of complex matrix
 */
public class UnitSystem<RS extends RealNumericalScalar<RS,RM,CS,CM>, RM extends RealNumericalMatrix<RS,RM,CS,CM>, CS extends ComplexNumericalScalar<RS,RM,CS,CM>, CM extends ComplexNumericalMatrix<RS,RM,CS,CM>> extends ConstantSystem<RS,RM,CS,CM> {

  /**
   * 新しく生成された<code>UnitSystem</code>オブジェクトを初期化します。
   * 
   * @param degree 次数
   * @param sunit unit of scalar
   */
  public UnitSystem(final int degree, RS sunit) {
    super(degree, degree, sunit);
    if (degree != -1) {
      setGain(sunit.createUnitGrid(degree, degree));
    } else {
      setAutoSize(true);
    }

    if (degree == 1) {
      setExpression("1"); //$NON-NLS-1$
    } else {
      setExpression("I"); //$NON-NLS-1$
    }
  }

  /**
   * 新しく生成された<code>UnitSystem</code>オブジェクトを初期化します。
   * 
   * @param inputSize 入力サイズ
   * @param outputSize 出力サイズ
   * @param sunit unit of scalar
   */
  public UnitSystem(int inputSize, int outputSize, RS sunit) {
    super(inputSize, outputSize, sunit);
    if (inputSize != -1 || outputSize != -1) {
      setGain(sunit.createUnitGrid(inputSize, outputSize));
    } else {
      setAutoSize(true);
    }

    if (inputSize == 1 && outputSize == 1) {
      setExpression("1"); //$NON-NLS-1$
    } else {
      setExpression("I"); //$NON-NLS-1$
    }
  }

  /**
   * {@inheritDoc}
   */
  @Override
  public void setInputSize(final int inputSize) {
    if (inputSize == -1) {
      return;
    }

    super.setInputSize(inputSize);
    super.setOutputSize(inputSize);
    setGain(this.sunit.createUnitGrid(inputSize, inputSize));
  }

  /**
   * {@inheritDoc}
   */
  @Override
  public void setOutputSize(final int outputSize) {
    if (outputSize == -1) {
      return;
    }

    super.setInputSize(outputSize);
    super.setOutputSize(outputSize);
    setGain(this.sunit.createUnitGrid(outputSize, outputSize));
  }

  /**
   * {@inheritDoc}
   */
  @Override
  public ConstantSystem<RS,RM,CS,CM> multiply(ConstantSystem<RS,RM,CS,CM> opponent) {
    return opponent;
  }

  /**
   * {@inheritDoc}
   */
  @Override
  public ConstantSystem<RS,RM,CS,CM> unaryMinus() {
    return new NegativeUnitSystem<>(getInputSize(), this.sunit);
  }

  /**
   * {@inheritDoc}
   */
  @Override
  public boolean isUnit() {
    return true;
  }

  /**
   * {@inheritDoc}
   */
  @Override
  public boolean isUnitOperand() {
    return true;
  }
  
  /**
   * {@inheritDoc}
   */
  @Override
  public ConstantSystem<RS,RM,CS,CM> invertSign(){
    return unaryMinus();
  }
  
  /**
   * {@inheritDoc}
   */
  @Override
  public String toString(){
    return "I"; //$NON-NLS-1$
  }
}