DoubleMultiplexerGroup.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 DoubleMultiplexerGroup {

  /** グループに属する多重器 */
  private Map<Integer, DoubleMultiplexer> multiplexers = new TreeMap<>();

  /**
   * 多重器をグループに追加します。
   * 
   * @param multiplexer グループに追加する多重器
   */
  @SuppressWarnings("boxing")
  public void add(final DoubleMultiplexer multiplexer) {
    this.multiplexers.put(multiplexer.getInputNumber(), multiplexer);
  }

  /**
   * グループに属する多重器を返します。
   * 
   * @return グループに属する多重器
   */
  public List<DoubleMultiplexer> getMultiplexers() {
    return new ArrayList<>(this.multiplexers.values());
  }

  /**
   * 指定された多重器をグループから削除します。
   * 
   * @param multiplexer グループから削除する多重器
   */
  @SuppressWarnings("boxing")
  public void remove(final DoubleMultiplexer multiplexer) {
    this.multiplexers.remove(multiplexer.getInputNumber());
  }

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

    return true;
  }

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

    for (final DoubleMultiplexer multiplexer : new ArrayList<>(this.multiplexers.values())) {
      multiplexer.setOffset(getOffset(multiplexer));
    }
  }

  /**
   * 多重器の出力ベクトル内でのオフセットを返します。
   * 
   * @param multiplexer 対象となる多重器
   * @return 多重器の出力ベクトル内でのオフセット
   */
  public int getOffset(final DoubleMultiplexer multiplexer) {
    if (this.multiplexers.containsValue(multiplexer) == false) {
      return -1;
    }

    int offset = 0;
    for (final DoubleMultiplexer mux : new ArrayList<>(this.multiplexers.values())) {
      if (mux == multiplexer) {
        break;
      }
      if (mux.getInputSize() == -1) {
        return -1;
      }

      offset += mux.getInputSize();
    }
    return offset;
  }
}