DoubleMultiplexer.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.DoubleMatrix;
/**
* 多重器を表わすクラスです。
*
* @author koga
* @version $Revision: 1.26 $, 2007/01/28
*/
public class DoubleMultiplexer extends DoubleConstantSystem {
/** 入力ポートの番号 */
private int inputNumber;
/** 出力ベクトル内でのオフセット */
private int offset;
/** この多重器が属する多重器のグループ */
private DoubleMultiplexerGroup group;
/**
* 新しく生成された<code>Multiplexer</code>オブジェクトを初期化します。
*
* @param inputSizes 各入力の大きさのリスト
* @param inputNumber 入力の番号(1から始まる)
*/
@SuppressWarnings("boxing")
public DoubleMultiplexer(final List<Integer> inputSizes, final int inputNumber) {
super(-1, -1);
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 DoubleMultiplexerGroup group) {
this.group = group;
}
/**
* この多重器が属する多重器のグループを返します。
*
* @return この多重器が属する多重器のグループ
*/
public DoubleMultiplexerGroup 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 DoubleMatrix K = new DoubleMatrix(getOutputSize(), getInputSize());
for (int i = 1; i <= getInputSize() && (this.offset + i) <= getOutputSize(); i++) {
K.setElement(this.offset + i, i, 1);
}
setExpression(K.toMmString("%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 DoubleMatrix outputEquation( final double t, final DoubleMatrix u) {
final DoubleMatrix y = new DoubleMatrix(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 DoubleConstantSystem multiply(final DoubleConstantSystem opponent) {
if (opponent instanceof DoubleMultiplexer || opponent instanceof DoubleDeMultiplexer) {
final DoubleMatrix gain = getGain().multiply(opponent.getGain());
if (gain.isUnit()) {
return new DoubleUnitSystem(gain.getRowSize());
}
if (gain.unaryMinus().isUnit()) {
return new DoubleNegativeUnitSystem(gain.getRowSize());
}
}
return super.multiply(opponent);
}
/**
* @see org.mklab.tool.control.system.math.ConstantSystem#clone()
*/
@Override
public DoubleMultiplexer clone() {
final DoubleMultiplexer inst = (DoubleMultiplexer)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;
}
DoubleMultiplexer castedObj = (DoubleMultiplexer)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;
}
}