DeMultiplexerGroup.java
/*
* Created on 2007/08/03
* Copyright (C) 2007 Koga Laboratory. All rights reserved.
*
*/
package org.mklab.tool.control.system.math;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
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 Laboratory
* @version $Revision: 1.2 $, 2007/08/03
* @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 DeMultiplexerGroup<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>> {
/** グループに属する分離器 */
private Map<Integer, DeMultiplexer<RS,RM,CS,CM>> deMultiplexers = new TreeMap<>();
/**
* 分離器をグループに追加します。
*
* @param deMultiplexer グループに追加する分離器
*/
@SuppressWarnings("boxing")
public void add(final DeMultiplexer<RS,RM,CS,CM> deMultiplexer) {
this.deMultiplexers.put(deMultiplexer.getOutputNumber(), deMultiplexer);
}
/**
* 指定された分離器をグループから削除します。
*
* @param deMultiplexer グループから削除する分離器
*/
@SuppressWarnings("boxing")
public void remove(final DeMultiplexer<RS,RM,CS,CM> deMultiplexer) {
this.deMultiplexers.remove(deMultiplexer.getOutputNumber());
}
/**
* グループに属する分離器を返します。
*
* @return グループに属する分離器
*/
public List<DeMultiplexer<RS,RM,CS,CM>> getDeMultiplexers() {
return new ArrayList<>(this.deMultiplexers.values());
}
/**
* グループ内の分離器の入力ベクトル内でのオフセットが決定されているか判定します。
*
* @return グループ内の分離器の入力ベクトル内でのオフセットが決定されていればtrue、そうでなければfalse
*/
private boolean isOffsetDefined() {
for (final DeMultiplexer<RS,RM,CS,CM> dmux : new ArrayList<>(this.deMultiplexers.values())) {
if (dmux.getOutputSize() == -1) {
return false;
}
}
return true;
}
/**
* グループに属する分離器の出力数の変化に対応して、各分離器の入力ベクトル内でのオフセットを変更します。
*/
public void deMultiplexerChanged() {
if (isOffsetDefined() == false) {
return;
}
for (final DeMultiplexer<RS,RM,CS,CM> deMultiplexer : new ArrayList<>(this.deMultiplexers.values())) {
deMultiplexer.setOffset(getOffset(deMultiplexer));
}
}
/**
* 分離器の入力ベクトル内でのオフセットを返します。
*
* @param deMultiplexer 対象となる分離器
* @return 分離器の入力ベクトル内でのオフセット
*/
public int getOffset(final DeMultiplexer<RS,RM,CS,CM> deMultiplexer) {
if (this.deMultiplexers.containsValue(deMultiplexer) == false) {
return -1;
}
int offset = 0;
for (final DeMultiplexer<RS,RM,CS,CM> dmux : new ArrayList<>(this.deMultiplexers.values())) {
if (dmux == deMultiplexer) {
break;
}
if (dmux.getOutputSize() == -1) {
return -1;
}
offset += dmux.getOutputSize();
}
return offset;
}
}