NegativeUnitSystem.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.ComplexNumericalMatrix;
import org.mklab.nfc.matrix.RealNumericalMatrix;
import org.mklab.nfc.scalar.ComplexNumericalScalar;
import org.mklab.nfc.scalar.RealNumericalScalar;


/**
 * マイナスの単位システムを表わすクラスです。
 * 
 * @author Anan
 * @version $Revision: 1.6 $, 2007/10/17
  * @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 NegativeUnitSystem<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 NegativeUnitSystem(final int degree, RS sunit) {
    super(degree, degree, sunit);
    if (degree != -1) {
      setGain(sunit.createUnitGrid(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(this.sunit.createUnitGrid(inputSize, inputSize).unaryMinus());
    //setUnitExpression(inputSize);
  }

  /**
   * @see org.mklab.tool.control.system.math.ConstantSystem#multiply(org.mklab.tool.control.system.math.ConstantSystem)
   */
  @Override
  public ConstantSystem<RS,RM,CS,CM> multiply(ConstantSystem<RS,RM,CS,CM> opponent) {
    if (opponent instanceof NegativeUnitSystem) {
      return new UnitSystem<>(getInputSize(), this.sunit);
    }

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

  /**
   * @see org.mklab.tool.control.system.LinearSystemOperator#unaryMinus()
   */
  @Override
  public ConstantSystem<RS,RM,CS,CM> unaryMinus() {
    return new UnitSystem<>(getInputSize(), this.sunit);
  }

  /**
   * @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(this.sunit.createUnitGrid(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 ConstantSystem<RS,RM,CS,CM> invertSign(){
    return unaryMinus();
  }
  
  /**
   * {@inheritDoc}
   */
  @Override
  public String toString(){
    return "-I"; //$NON-NLS-1$
  }
}