DoubleMinimumUnknownEquation.java
/*
* Created on 2006/12/11
* Copyright (C) 2006 Koga Laboratory. All rights reserved.
*
*/
package org.mklab.tool.control.system.graph;
import java.util.ArrayList;
import java.util.List;
import org.mklab.nfc.matrix.DoubleMatrix;
import org.mklab.tool.control.system.DoubleAdjacencyMatrix;
/**
* (閉路内のノードの値を求めるために解くべき) 最小次数代数方程式の未知数に対応するノードを求めるためのクラスです。
*
* @author koga
* @version $Revision: 1.3 $, 2006/12/11
*/
public class DoubleMinimumUnknownEquation {
/** 隣接行列 */
private DoubleAdjacencyMatrix adjacencyMatrix;
/**
* 新しく生成された<code>MinimumUnknownEquation</code>オブジェクトを初期化します。
*
* @param adjacencyMatrix 隣接行列
*/
public DoubleMinimumUnknownEquation(DoubleAdjacencyMatrix adjacencyMatrix) {
this.adjacencyMatrix = adjacencyMatrix;
}
/**
* 最小次数代数方程式の未知数に対応するノードのリストのリストを返します。
*
* @return 最小次数代数方程式の未知数に対応するノードのリストのリスト
*/
public List<List<Integer>> getCuttingNodesByOutputSize() {
List<List<Integer>> localMaximumCycle = new DoubleCycleMatrix(this.adjacencyMatrix).getLocalMaximumCycles();
List<List<Integer>> cuttingNodes = new ArrayList<>();
for (List<Integer> cycle : localMaximumCycle) {
DoubleAdjacencyMatrix subGraph = this.adjacencyMatrix.getSubgraph(cycle);
DoubleMatrix minusOutputSizeMatrix = subGraph.getMinusOutputSizeMatrix();
List<Integer> subCuttingNodes = new DoubleKuruskal(minusOutputSizeMatrix).getCuttingNodes();
List<Integer> localCuttingNodes = new ArrayList<>();
for (int node : subCuttingNodes) {
localCuttingNodes.add(cycle.get(node));
}
cuttingNodes.add(localCuttingNodes);
}
return cuttingNodes;
}
/**
* 最小次数代数方程式の未知数に対応するノードのリストのリストを返します。
*
* @return 最小次数代数方程式の未知数に対応するノードのリストのリスト
*/
public List<List<Integer>> getCuttingNodes() {
List<List<Integer>> localMaximumCycle = new DoubleCycleMatrix(this.adjacencyMatrix).getLocalMaximumCycles();
List<List<Integer>> cuttingNodes = new ArrayList<>();
for (List<Integer> cycle : localMaximumCycle) {
DoubleAdjacencyMatrix subGraph = this.adjacencyMatrix.getSubgraph(cycle);
DoubleMatrix inputSizeMatrix = subGraph.getInputSizeMatrix();
List<Integer> subCuttingNodes = new DoubleDirectedCycleRemover(inputSizeMatrix).getCuttingNodes();
List<Integer> localCuttingNodes = new ArrayList<>();
for (int node : subCuttingNodes) {
localCuttingNodes.add(cycle.get(node - 1));
}
cuttingNodes.add(localCuttingNodes);
}
return cuttingNodes;
}
}