DoubleDeMultiplexer.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.25 $, 2007/01/28
*/
public class DoubleDeMultiplexer extends DoubleConstantSystem {
/** 出力ポートの番号 */
private int outputNumber;
/** 入力ベクトル内でのオフセット */
private int offset;
/** この分離器の属する分離器のグループ */
private DoubleDeMultiplexerGroup group;
/**
* 新しく生成された<code>DeMultiplexer</code>オブジェクトを初期化します。
*
* @param outputSizes 各出力の大きさの配列
* @param outputNumber 出力の番号(1から始まる)
*/
@SuppressWarnings("boxing")
public DoubleDeMultiplexer(final List<Integer> outputSizes, final int outputNumber) {
super(-1, -1);
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 DoubleDeMultiplexerGroup group) {
this.group = group;
}
/**
* この分離器が属する分離器のグループを返します。
*
* @return この分離器が属する分離器のグループ
*/
public DoubleDeMultiplexerGroup getGroup() {
return this.group;
}
/**
* 出力ポートの番号を返します。
*
* @return 出力ポートの番号
*/
public int getOutputNumber() {
return this.outputNumber;
}
/**
* {@inheritDoc}
*/
@Override
public DoubleMatrix outputEquation( final double t, final DoubleMatrix u) {
DoubleMatrix 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 DoubleMatrix K = new DoubleMatrix(getOutputSize(), getInputSize());
for (int i = 1; i <= getOutputSize(); i++) {
K.setElement(i, this.offset + i, 1);
}
setExpression(K.toMmString("%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 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);
}
/**
* {@inheritDoc}
*/
@Override
public DoubleDeMultiplexer clone() {
final DoubleDeMultiplexer inst = (DoubleDeMultiplexer)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;
}
DoubleDeMultiplexer castedObj = (DoubleDeMultiplexer)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;
}
}