ReachableMatrix.java

/*
 * Created on 2006/11/05
 * Copyright (C) 2006 Koga Laboratory. All rights reserved.
 *
 */
package org.mklab.tool.control.system.graph;

import org.mklab.nfc.matrix.BooleanMatrix;
import org.mklab.nfc.matrix.ComplexNumericalMatrix;
import org.mklab.nfc.matrix.FundamentalArray;
import org.mklab.nfc.matrix.RealNumericalMatrix;
import org.mklab.nfc.scalar.ComplexNumericalScalar;
import org.mklab.nfc.scalar.RealNumericalScalar;
import org.mklab.tool.control.system.SystemOperator;


/**
 * 可到達行列(Reachable Matrix)を表すクラスです。
 * 
 * @author koga
 * @version $Revision: 1.7 $, 2006/11/05
 * @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 ReachableMatrix<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 BooleanMatrix reachableMatrix;

  /**
   * 新しく生成された<code>ReachableMatrix</code>オブジェクトを初期化します。
   * 
   * @param connectionMatrix 連結情報を表わす行列
   */
  public ReachableMatrix(final BooleanMatrix connectionMatrix) {
    BooleanMatrix k = connectionMatrix;
    BooleanMatrix r = k;
    for (int i = 1; i < connectionMatrix.getRowSize() - 1; i++) {
      k = k.multiply(connectionMatrix);
      r = r.add(k);
    }

    this.reachableMatrix = r;
  }

  /**
   * 新しく生成された<code>ReachableMatrix</code>オブジェクトを初期化します。
   * 
   * @param adjacencyMatrix 隣接行列
   */
  public ReachableMatrix(final FundamentalArray<SystemOperator<RS,RM,CS,CM>,?> adjacencyMatrix) {
    this(new ConnectionMatrix<>(adjacencyMatrix).getBooleanMatrix());
  }

  /**
   * 新しく生成された<code>ReachableMatrix</code>オブジェクトを初期化します。
   * 
   * @param adjacencyMatrix 隣接行列
   */
  public ReachableMatrix(final RM adjacencyMatrix) {
    this(new ConnectionMatrix<>(adjacencyMatrix).getBooleanMatrix());
  }

  /**
   * 可到達情報を表わす行列を返します。
   * 
   * @return 可到達情報を表わす行列
   */
  public BooleanMatrix getBooleanMatrix() {
    return this.reachableMatrix.createClone();
  }

  /**
   * 行列の次数を返します。
   * 
   * @return 行列の次数
   */
  public int getSize() {
    return this.reachableMatrix.getRowSize();
  }

  /**
   * @see java.lang.Object#hashCode()
   */
  @Override
  public int hashCode() {
    final int PRIME = 31;
    int result = 1;
    result = PRIME * result + ((this.reachableMatrix == null) ? 0 : this.reachableMatrix.hashCode());
    return result;
  }

  /**
   * @see java.lang.Object#equals(java.lang.Object)
   */
  @Override
  public boolean equals(Object obj) {
    if (this == obj) {
      return true;
    }
    if (obj == null) {
      return false;
    }
    if (getClass() != obj.getClass()) {
      return false;
    }
    final ReachableMatrix<RS,RM,CS,CM> other = (ReachableMatrix<RS,RM,CS,CM>)obj;
    if (this.reachableMatrix == null) {
      if (other.reachableMatrix != null) {
        return false;
      }
    } else if (!this.reachableMatrix.equals(other.reachableMatrix)) {
      return false;
    }
    return true;
  }
}