Multiplexer.java
/*
* Created on 2007/01/28
* Copyright (C) 2007 Koga Laboratory. All rights reserved.
*
*/
package org.mklab.tool.control.system.math;
import java.util.List;
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.26 $, 2007/01/28
* @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 Multiplexer<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> {
/** 入力ポートの番号 */
private int inputNumber;
/** 出力ベクトル内でのオフセット */
private int offset;
/** この多重器が属する多重器のグループ */
private MultiplexerGroup<RS,RM,CS,CM> group;
/**
* 新しく生成された<code>Multiplexer</code>オブジェクトを初期化します。
*
* @param inputSizes 各入力の大きさのリスト
* @param inputNumber 入力の番号(1から始まる)
* @param sunit unit of scalar
*/
@SuppressWarnings("boxing")
public Multiplexer(final List<Integer> inputSizes, final int inputNumber, RS sunit) {
super(-1, -1, sunit);
setAutoSize(true);
final int inputSize = inputSizes.get(inputNumber - 1);
super.setInputSize(inputSize);
super.setOutputSize(-1);
int localOffset = 0;
for (int i = 1; i < inputNumber; i++) {
final Integer inSize = inputSizes.get(i - 1);
if (inSize == -1) {
localOffset = -1;
break;
}
localOffset += inSize;
}
this.inputNumber = inputNumber;
this.offset = localOffset;
setExpression("Mu"); //$NON-NLS-1$
}
/**
* この多重器が属する多重器のグループを設定します。
*
* @param group この多重器が属する多重器のグループ
*/
public void setGroup(final MultiplexerGroup<RS,RM,CS,CM> group) {
this.group = group;
}
/**
* この多重器が属する多重器のグループを返します。
*
* @return この多重器が属する多重器のグループ
*/
public MultiplexerGroup<RS,RM,CS,CM> getGroup() {
return this.group;
}
/**
* 入力ポートの番号を返します。
*
* @return 入力ポートの番号
*/
public int getInputNumber() {
return this.inputNumber;
}
/**
* @see org.mklab.tool.control.system.SystemOperator#setOutputSize(int)
*/
@Override
public void setOutputSize(final int outputSize) {
if (outputSize == -1) {
return;
}
super.setOutputSize(outputSize);
setOffset(this.offset);
}
/**
* 出力ベクトル内でのオフセットを設定します。
*
* @param offset 出力ベクトル内でのオフセット
*/
public void setOffset(final int offset) {
this.offset = offset;
if (offset == -1 || getInputSize() == -1 || getOutputSize() == -1) {
return;
}
final RM K = this.sunit.createZeroGrid(getOutputSize(), getInputSize());
for (int i = 1; i <= getInputSize() && (this.offset + i) <= getOutputSize(); i++) {
K.setElement(this.offset + i, i, 1);
}
setExpression(K.toString("%G").replaceAll("\\s*", "")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
setGain(K);
}
/**
* @see org.mklab.tool.control.system.SystemOperator#setInputSize(int)
*/
@Override
public void setInputSize(final int inputSize) {
if (inputSize == -1) {
return;
}
super.setInputSize(inputSize);
this.group.multiplexerChanged();
setOffset(this.offset);
}
/**
* {@inheritDoc}
*/
@Override
public RM outputEquation( final RS t, RM u) {
final RM y = u.createZero(getOutputSize(), 1);
y.setRowVectors(this.offset + 1, this.offset + u.length(), u);
return y;
}
/**
* @see org.mklab.tool.control.system.math.ConstantSystem#multiply(org.mklab.tool.control.system.math.ConstantSystem)
*/
@Override
public ConstantSystem<RS,RM,CS,CM> multiply(final ConstantSystem<RS,RM,CS,CM> opponent) {
if (opponent instanceof Multiplexer || opponent instanceof DeMultiplexer) {
final RM gain = getGain().multiply(opponent.getGain());
if (gain.isUnit()) {
return new UnitSystem<>(gain.getRowSize(), this.sunit);
}
if (gain.unaryMinus().isUnit()) {
return new NegativeUnitSystem<>(gain.getRowSize(), this.sunit);
}
}
return super.multiply(opponent);
}
/**
* @see org.mklab.tool.control.system.math.ConstantSystem#clone()
*/
@Override
public Multiplexer<RS,RM,CS,CM> clone() {
final Multiplexer<RS,RM,CS,CM> inst = (Multiplexer<RS,RM,CS,CM>)super.clone();
inst.inputNumber = this.inputNumber;
inst.offset = this.offset;
inst.group = this.group;
return inst;
}
/**
* @see org.mklab.tool.control.system.math.ConstantSystem#equals(java.lang.Object)
*/
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!super.equals(o)) {
return false;
}
if (o == null) {
return false;
}
if (o.getClass() != getClass()) {
return false;
}
Multiplexer<RS,RM,CS,CM> castedObj = (Multiplexer<RS,RM,CS,CM>)o;
return ((this.inputNumber == castedObj.inputNumber) && (this.offset == castedObj.offset) && (this.group == null ? castedObj.group == null : this.group.equals(castedObj.group)));
}
/**
* @see org.mklab.tool.control.system.math.ConstantSystem#hashCode()
*/
@Override
public int hashCode() {
int hashCode = super.hashCode();
hashCode = 31 * hashCode + this.inputNumber;
hashCode = 31 * hashCode + this.offset;
hashCode = 31 * hashCode + (this.group == null ? 0 : this.group.hashCode());
return hashCode;
}
}