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;
}
}