Abcdchk.java

/*
 * $Id: Abcdchk.java,v 1.13 2008/07/17 07:30:03 koga Exp $
 *
 * Copyright (C) 2004 Koga Laboratory. All rights reserved.
 */
package org.mklab.tool.control;

import org.mklab.nfc.matrix.Matrix;
import org.mklab.nfc.scalar.Scalar;


/**
 * システム行列の大きさが整合しているか判定するクラスです。
 * 
 * <p>Check the dimensions of the system matrices
 * 
 * @author koga
 * @version $Revision: 1.13 $
 */
public class Abcdchk {

  /**
   * 行列A, B, C, Dの大きさが整合しているか判定します。
   * 
   * <p>整合していれば空文字列、整合していなければエラーメッセージを返します。
   * 
   * @param <S> スカラーの型
   * @param <M> 行列の型
   * 
   * @param nargs 引数の数
   * @param A A
   * @param B B
   * @param C C
   * @param D D
   * @return error message
   */
  @SuppressWarnings("boxing")
  private static <S extends Scalar<S, M>, M extends Matrix<S, M>> String abcdchk(int nargs, M A, M B, M C, M D) {
    int mb = 0;
    int nb = 0;
    int mc = 0;
    int nc = 0;
    int md = 0;
    int nd = 0;

    int ma = A.getRowSize();
    int na = A.getColumnSize();

    if (ma != na) {
      return String.format(Messages.getString("Abcdchk.0"), ma, na); //$NON-NLS-1$
    }
    if (nargs > 1) {
      mb = B.getRowSize();
      nb = B.getColumnSize();
      if (ma != mb) {
        return String.format(Messages.getString("Abcdchk.1"), ma, na, mb, nb); //$NON-NLS-1$
      }
    }
    if (nargs > 2) {
      mc = C.getRowSize();
      nc = C.getColumnSize();
      if (nc != ma) {
        return String.format(Messages.getString("Abcdchk.2"), ma, na, mc, nc); //$NON-NLS-1$
      }
    }
    if (nargs > 3) {
      md = D.getRowSize();
      nd = D.getColumnSize();
      if (md != mc) {
        return String.format(Messages.getString("Abcdchk.3"), mc, nc, md, nd); //$NON-NLS-1$
      }
      if (nd != nb) {
        return String.format(Messages.getString("Abcdchk.4"), mb, nb, md, nd); //$NON-NLS-1$
      }
    }

    return ""; //$NON-NLS-1$
  }

  /**
   * 行列A, B, C, Dの大きさが整合しているか判定します。
   * 
   * <p>整合していれば空文字列、整合していなければエラーメッセージを返します。
   * 
   * @param <S> スカラーの型
   * @param <M> 行列の型
   * @param A A行列
   * @param B B行列
   * @param C C行列
   * @param D D行列
   * @return エラーメッセージ (error message)
   */
  public static <S extends Scalar<S, M>, M extends Matrix<S, M>> String abcdchk(M A, M B, M C, M D) {
    return abcdchk(4, A, B, C, D);
  }

  /**
   * 行列A, B, Cの大きさが整合しているか判定します。
   * 
   * <p>整合していれば空文字列、整合していなければエラーメッセージを返します。
   * 
   * @param <S> スカラーの型
   * @param <M> 行列の型
   * @param A A行列
   * @param B B行列
   * @param C C行列
   * @return エラーメッセージ (error message)
   */
  public static <S extends Scalar<S, M>, M extends Matrix<S, M>> String abcdchk(M A, M B, M C) {
    return abcdchk(3, A, B, C, null);
  }

  /**
   * 行列AとBの大きさが整合しているか判定します。
   * 
   * <p>整合していれば空文字列、整合していなければエラーメッセージを返します。
   * 
   * @param <S> スカラーの型
   * @param <M> 行列の型
   * @param A A行列
   * @param B B行列
   * @return エラーメッセージ (error message)
   */
  public static <S extends Scalar<S, M>, M extends Matrix<S, M>> String abcdchk(M A, M B) {
    return abcdchk(2, A, B, null, null);
  }

  /**
   * 行列Aの大きさが整合しているか判定します。
   * 
   * <p>整合していれば空文字列、整合していなければエラーメッセージを返します。
   * 
   * @param <S> スカラーの型
   * @param <M> 行列の型
   * @param A A行列
   * @return エラーメッセージ (error message)
   */
  public static <S extends Scalar<S, M>, M extends Matrix<S, M>> String abcdchk(M A) {
    return abcdchk(1, A, null, null, null);
  }
}