DeMultiplexer.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.25 $, 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 DeMultiplexer<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 outputNumber;
/** 入力ベクトル内でのオフセット */
private int offset;
/** この分離器の属する分離器のグループ */
private DeMultiplexerGroup<RS,RM,CS,CM> group;
/**
* 新しく生成された<code>DeMultiplexer</code>オブジェクトを初期化します。
*
* @param outputSizes 各出力の大きさの配列
* @param outputNumber 出力の番号(1から始まる)
* @param sunit unit of scalar
*/
@SuppressWarnings("boxing")
public DeMultiplexer(final List<Integer> outputSizes, final int outputNumber, RS sunit) {
super(-1, -1, sunit);
setAutoSize(true);
final int outputSize = outputSizes.get(outputNumber - 1);
super.setOutputSize(outputSize);
super.setInputSize(-1);
int localOffset = 0;
for (int i = 1; i < outputNumber; i++) {
final int outSize = outputSizes.get(i - 1);
if (outSize == -1) {
localOffset = -1;
break;
}
localOffset += outSize;
}
this.outputNumber = outputNumber;
this.offset = localOffset;
setExpression("De"); //$NON-NLS-1$
}
/**
* この分離器が属する分離器のグループを設定します。
*
* @param group この分離器が属する分離器のグループを
*/
public void setGroup(final DeMultiplexerGroup<RS,RM,CS,CM> group) {
this.group = group;
}
/**
* この分離器が属する分離器のグループを返します。
*
* @return この分離器が属する分離器のグループ
*/
public DeMultiplexerGroup<RS,RM,CS,CM> getGroup() {
return this.group;
}
/**
* 出力ポートの番号を返します。
*
* @return 出力ポートの番号
*/
public int getOutputNumber() {
return this.outputNumber;
}
/**
* {@inheritDoc}
*/
@Override
public RM outputEquation( final RS t, final RM u) {
RM y = u.getRowVectors(this.offset + 1, this.offset + getOutputSize());
return y;
}
/**
* {@inheritDoc}
*/
@Override
public void setInputSize(final int inputSize) {
if (inputSize == -1) {
return;
}
super.setInputSize(inputSize);
setOffset(this.offset);
}
/**
* 入力ベクトル内でのオフセットを設定します。
*
* @param offset 入力ベクトル内でのオフセット
*/
public void setOffset(final int offset) {
this.offset = offset;
if (this.offset < 0 || getInputSize() == -1 || getOutputSize() == -1) {
return;
}
final RM K =this.sunit.createZeroGrid(getOutputSize(), getInputSize());
for (int i = 1; i <= getOutputSize(); i++) {
K.setElement(i, this.offset + i, 1);
}
setExpression(K.toString("%G").replaceAll("\\s*", "")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
setGain(K);
}
/**
* {@inheritDoc}
*/
@Override
public void setOutputSize(final int outputSize) {
if (outputSize == -1) {
return;
}
super.setOutputSize(outputSize);
this.group.deMultiplexerChanged();
setOffset(this.offset);
}
/**
* {@inheritDoc}
*/
@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);
}
/**
* {@inheritDoc}
*/
@Override
public DeMultiplexer<RS,RM,CS,CM> clone() {
final DeMultiplexer<RS,RM,CS,CM> inst = (DeMultiplexer<RS,RM,CS,CM>)super.clone();
inst.outputNumber = this.outputNumber;
inst.offset = this.offset;
inst.group = this.group;
return inst;
}
/**
* {@inheritDoc}
*/
@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;
}
DeMultiplexer<RS,RM,CS,CM> castedObj = (DeMultiplexer<RS,RM,CS,CM>)o;
return ((this.outputNumber == castedObj.outputNumber) && (this.offset == castedObj.offset) && (this.group == null ? castedObj.group == null : this.group.equals(castedObj.group)));
}
/**
* {@inheritDoc}
*/
@Override
public int hashCode() {
int hashCode = super.hashCode();
hashCode = 31 * hashCode + this.outputNumber;
hashCode = 31 * hashCode + this.offset;
hashCode = 31 * hashCode + (this.group == null ? 0 : this.group.hashCode());
return hashCode;
}
}