DoubleNegativeUnitSystem.java

/*
 * Created on 2007/10/17
 * Copyright (C) 2007 Koga Laboratory. All rights reserved.
 *
 */
package org.mklab.tool.control.system.math;

import org.mklab.nfc.matrix.DoubleMatrix;


/**
 * マイナスの単位システムを表わすクラスです。
 * 
 * @author Anan
 * @version $Revision: 1.6 $, 2007/10/17
 */
public class DoubleNegativeUnitSystem extends DoubleConstantSystem {

  /**
   * 新しく生成された<code>UnitSystem</code>オブジェクトを初期化します。
   * 
   * @param degree 次数
   */
  public DoubleNegativeUnitSystem(final int degree) {
    super(degree, degree);
    if (degree != -1) {
      setGain(DoubleMatrix.unit(degree, degree).unaryMinus());
    } else {
      setAutoSize(true);
    }
    setNegative(false);
    if (degree == 1) {
      setExpression("-1"); //$NON-NLS-1$
    } else {
      setExpression("-I"); //$NON-NLS-1$
    }
  }

  //  /**
  //   * 数式を設定します。
  //   * 
  //   * @param size 大きさ
  //   */
  //  private void setUnitExpression(final int size) {
  //    if (size == 1) {
  //      setExpression("1"); //$NON-NLS-1$
  //    } else {
  //      setExpression("I(" + size + ")"); //$NON-NLS-1$ //$NON-NLS-2$
  //    }
  //  }

  /**
   * @see org.mklab.tool.control.system.SystemOperator#setInputSize(int)
   */
  @Override
  public void setInputSize(final int inputSize) {
    if (inputSize == -1) {
      return;
    }

    super.setInputSize(inputSize);
    super.setOutputSize(inputSize);
    setGain(DoubleMatrix.unit(inputSize, inputSize).unaryMinus());
    //setUnitExpression(inputSize);
  }

  /**
   * @see org.mklab.tool.control.system.math.ConstantSystem#multiply(org.mklab.tool.control.system.math.ConstantSystem)
   */
  @Override
  public DoubleConstantSystem multiply(DoubleConstantSystem opponent) {
    if (opponent instanceof DoubleNegativeUnitSystem) {
      return new DoubleUnitSystem(getInputSize());
    }

    //return super.multiply(opponent);
    return opponent.unaryMinus();
  }

  /**
   * @see org.mklab.tool.control.system.LinearSystemOperator#unaryMinus()
   */
  @Override
  public DoubleConstantSystem unaryMinus() {
    return new DoubleUnitSystem(getInputSize());
  }

  /**
   * @see org.mklab.tool.control.system.SystemOperator#setOutputSize(int)
   */
  @Override
  public void setOutputSize(final int outputSize) {
    if (outputSize == -1) {
      return;
    }

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

  /**
   * @see org.mklab.tool.control.system.math.ConstantSystem#isNegativeUnit()
   */
  @Override
  public boolean isNegativeUnit() {
    return true;
  }

  /**
   * @see org.mklab.tool.control.system.math.ConstantSystem#isNegativeUnitOperand()
   */
  @Override
  public boolean isNegativeUnitOperand() {
    return true;
  }
  
  /**
   * {@inheritDoc}
   */
  @Override
  public DoubleConstantSystem invertSign(){
    return unaryMinus();
  }
  
  /**
   * {@inheritDoc}
   */
  @Override
  public String toString(){
    return "-I"; //$NON-NLS-1$
  }
}