DoubleReachableMatrix.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.DoubleMatrix;
import org.mklab.nfc.matrix.FundamentalArray;
import org.mklab.tool.control.system.DoubleSystemOperator;


/**
 * 可到達行列(Reachable Matrix)を表すクラスです。
 * 
 * @author koga
 * @version $Revision: 1.7 $, 2006/11/05
 */
public class DoubleReachableMatrix {

  /** 可到達情報を表わす行列 */
  private BooleanMatrix reachableMatrix;

  /**
   * 新しく生成された<code>ReachableMatrix</code>オブジェクトを初期化します。
   * 
   * @param connectionMatrix 連結情報を表わす行列
   */
  public DoubleReachableMatrix(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 DoubleReachableMatrix(final FundamentalArray<DoubleSystemOperator,?> adjacencyMatrix) {
    this(new DoubleConnectionMatrix(adjacencyMatrix).getBooleanMatrix());
  }

  /**
   * 新しく生成された<code>ReachableMatrix</code>オブジェクトを初期化します。
   * 
   * @param adjacencyMatrix 隣接行列
   */
  public DoubleReachableMatrix(final DoubleMatrix adjacencyMatrix) {
    this(new DoubleConnectionMatrix(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 DoubleReachableMatrix other = (DoubleReachableMatrix)obj;
    if (this.reachableMatrix == null) {
      if (other.reachableMatrix != null) {
        return false;
      }
    } else if (!this.reachableMatrix.equals(other.reachableMatrix)) {
      return false;
    }
    return true;
  }
}