DoubleDeMultiplexerGroup.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;


/**
 * 分離器のグループを表すクラスです。
 * 
 * @author Koga Laboratory
 * @version $Revision: 1.2 $, 2007/08/03
 */
public class DoubleDeMultiplexerGroup {

  /** グループに属する分離器 */
  private Map<Integer, DoubleDeMultiplexer> deMultiplexers = new TreeMap<>();

  /**
   * 分離器をグループに追加します。
   * 
   * @param deMultiplexer グループに追加する分離器
   */
  @SuppressWarnings("boxing")
  public void add(final DoubleDeMultiplexer deMultiplexer) {
    this.deMultiplexers.put(deMultiplexer.getOutputNumber(), deMultiplexer);
  }

  /**
   * 指定された分離器をグループから削除します。
   * 
   * @param deMultiplexer グループから削除する分離器
   */
  @SuppressWarnings("boxing")
  public void remove(final DoubleDeMultiplexer deMultiplexer) {
    this.deMultiplexers.remove(deMultiplexer.getOutputNumber());
  }

  /**
   * グループに属する分離器を返します。
   * 
   * @return グループに属する分離器
   */
  public List<DoubleDeMultiplexer> getDeMultiplexers() {
    return new ArrayList<>(this.deMultiplexers.values());
  }

  /**
   * グループ内の分離器の入力ベクトル内でのオフセットが決定されているか判定します。
   * 
   * @return グループ内の分離器の入力ベクトル内でのオフセットが決定されていればtrue、そうでなければfalse
   */
  private boolean isOffsetDefined() {
    for (final DoubleDeMultiplexer dmux : new ArrayList<>(this.deMultiplexers.values())) {
      if (dmux.getOutputSize() == -1) {
        return false;
      }
    }

    return true;
  }

  /**
   * グループに属する分離器の出力数の変化に対応して、各分離器の入力ベクトル内でのオフセットを変更します。
   */
  public void deMultiplexerChanged() {
    if (isOffsetDefined() == false) {
      return;
    }

    for (final DoubleDeMultiplexer deMultiplexer : new ArrayList<>(this.deMultiplexers.values())) {
      deMultiplexer.setOffset(getOffset(deMultiplexer));
    }
  }

  /**
   * 分離器の入力ベクトル内でのオフセットを返します。
   * 
   * @param deMultiplexer 対象となる分離器
   * @return 分離器の入力ベクトル内でのオフセット
   */
  public int getOffset(final DoubleDeMultiplexer deMultiplexer) {
    if (this.deMultiplexers.containsValue(deMultiplexer) == false) {
      return -1;
    }

    int offset = 0;
    for (final DoubleDeMultiplexer dmux : new ArrayList<>(this.deMultiplexers.values())) {
      if (dmux == deMultiplexer) {
        break;
      }
      if (dmux.getOutputSize() == -1) {
        return -1;
      }

      offset += dmux.getOutputSize();
    }
    return offset;
  }
}