DoubleUnitSystem.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.DoubleMatrix;


/**
 * 単位システムを表わすクラスです。
 * 
 * @author koga
 * @version $Revision: 1.10 $
 */
public class DoubleUnitSystem extends DoubleConstantSystem {

  /**
   * 新しく生成された<code>UnitSystem</code>オブジェクトを初期化します。
   * 
   * @param degree 次数
   */
  public DoubleUnitSystem(final int degree) {
    super(degree, degree);
    if (degree != -1) {
      setGain(DoubleMatrix.unit(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 出力サイズ
   */
  public DoubleUnitSystem(int inputSize, int outputSize) {
    super(inputSize, outputSize);
    if (inputSize != -1 || outputSize != -1) {
      setGain(DoubleMatrix.unit(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(DoubleMatrix.unit(inputSize, inputSize));
  }

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

    super.setInputSize(outputSize);
    super.setOutputSize(outputSize);
    setGain(DoubleMatrix.unit(outputSize, outputSize));
  }

  /**
   * {@inheritDoc}
   */
  @Override
  public DoubleConstantSystem multiply(DoubleConstantSystem opponent) {
    return opponent;
  }

  /**
   * {@inheritDoc}
   */
  @Override
  public DoubleConstantSystem unaryMinus() {
    return new DoubleNegativeUnitSystem(getInputSize());
  }

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

  /**
   * {@inheritDoc}
   */
  @Override
  public boolean isUnitOperand() {
    return true;
  }
  
  /**
   * {@inheritDoc}
   */
  @Override
  public DoubleConstantSystem invertSign(){
    return unaryMinus();
  }
  
  /**
   * {@inheritDoc}
   */
  @Override
  public String toString(){
    return "I"; //$NON-NLS-1$
  }
}