MinimumUnknownEquation.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.ComplexNumericalMatrix;
import org.mklab.nfc.matrix.RealNumericalMatrix;
import org.mklab.nfc.scalar.ComplexNumericalScalar;
import org.mklab.nfc.scalar.RealNumericalScalar;
import org.mklab.tool.control.system.AdjacencyMatrix;


/**
 * (閉路内のノードの値を求めるために解くべき) 最小次数代数方程式の未知数に対応するノードを求めるためのクラスです。
 * 
 * @author koga
 * @version $Revision: 1.3 $, 2006/12/11
 * @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 MinimumUnknownEquation<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 AdjacencyMatrix<RS,RM,CS,CM> adjacencyMatrix;

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

  /**
   * 最小次数代数方程式の未知数に対応するノードのリストのリストを返します。
   * 
   * @return 最小次数代数方程式の未知数に対応するノードのリストのリスト
   */
  public List<List<Integer>> getCuttingNodesByOutputSize() {
    List<List<Integer>> localMaximumCycle = new CycleMatrix<>(this.adjacencyMatrix).getLocalMaximumCycles();

    List<List<Integer>> cuttingNodes = new ArrayList<>();

    for (List<Integer> cycle : localMaximumCycle) {
      AdjacencyMatrix<RS,RM,CS,CM> subGraph = this.adjacencyMatrix.getSubgraph(cycle);
      RM minusOutputSizeMatrix = subGraph.getMinusOutputSizeMatrix();
      List<Integer> subCuttingNodes = new Kuruskal<>(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 CycleMatrix<>(this.adjacencyMatrix).getLocalMaximumCycles();

    List<List<Integer>> cuttingNodes = new ArrayList<>();

    for (List<Integer> cycle : localMaximumCycle) {
      AdjacencyMatrix<RS,RM,CS,CM> subGraph = this.adjacencyMatrix.getSubgraph(cycle);
      RM inputSizeMatrix = subGraph.getInputSizeMatrix();
      List<Integer> subCuttingNodes = new DirectedCycleRemover<>(inputSizeMatrix).getCuttingNodes();

      List<Integer> localCuttingNodes = new ArrayList<>();
      for (int node : subCuttingNodes) {
        localCuttingNodes.add(cycle.get(node - 1));
      }

      cuttingNodes.add(localCuttingNodes);
    }

    return cuttingNodes;
  }
}