UserDefinedDiscreteLinearDynamicSystem.java

/*
 * Created on 2008/07/01
 * Copyright (C) 2008 Koga Laboratory. All rights reserved.
 *
 */
package org.mklab.tool.control.system.discrete;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Set;

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.LinearSystem;
import org.mklab.tool.control.system.ParameterUtil;
import org.mklab.tool.control.system.UserDefinedSystem;
import org.mklab.tool.control.system.parameter.NoSuchParameterException;
import org.mklab.tool.control.system.parameter.ParameterException;


/**
 * ユーザ定義離散時間線形システムを表すクラスです。
 * 
 * @author koga
 * @version $Revision: 1.6 $, 2008/07/01
 * @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 UserDefinedDiscreteLinearDynamicSystem<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>> extends DiscreteLinearDynamicSystem<RS,RM,CS,CM> implements UserDefinedSystem {

  /** システムを定義したクラス */
  private Class<?> systemKlass;

  /** システムの初期化処理を定義したメソッド */
  private Method initializeFunction;

  /** システムの更新処理を定義したメソッド */
  private Method updateFunction;

  /**
   * 新しく生成された<code>UserDefinedContinuousLinearDynamicSystem</code>オブジェクトを初期化します。
   * @param sunit unit of scalar
   */
  public UserDefinedDiscreteLinearDynamicSystem(RS sunit) {
    super(sunit);
  }

  /**
   * 新しく生成された<code>UserDefinedContinuousLinearDynamicSystem</code>オブジェクトを初期化します。
   * 
   * @param sys システム
   * @param sunit unit of scalar
   */
  public UserDefinedDiscreteLinearDynamicSystem(LinearSystem<RS,RM,CS,CM> sys, RS sunit) {
    super(sys, sunit);
  }

  /**
   * 新しく生成された<code>UserDefinedContinuousLinearDynamicSystem</code>オブジェクトを初期化します。
   * 
   * @param A A行列
   * @param B B行列
   * @param C C行列
   * @param D D行列
   * @param sunit unit of scalar
   */
  public UserDefinedDiscreteLinearDynamicSystem(RM A, RM B, RM C, RM D, RS sunit) {
    super(A, B, C, D, sunit);
  }

  /**
   * @see org.mklab.tool.control.system.UserDefinedSystem#getParameterValue(java.lang.String)
   */
  public Object getParameterValue(String name) throws NoSuchParameterException {
    return ParameterUtil.getValue(this.systemKlass, name);
  }

  /**
   * @see org.mklab.tool.control.system.UserDefinedSystem#getParameterNames()
   */
  public Set<String> getParameterNames() throws NoSuchParameterException {
    return ParameterUtil.getParameterNames(this.systemKlass);
  }

  /**
   * @see org.mklab.tool.control.system.UserDefinedSystem#setParameterValue(java.lang.String, java.lang.Object)
   */
  public void setParameterValue(String name, Object value) throws NoSuchParameterException {
    ParameterUtil.setValue(this.systemKlass, name, value);
  }

  /**
   * @see org.mklab.tool.control.system.UserDefinedSystem#containParameter(java.lang.String)
   */
  public boolean containParameter(String name) {
    return ParameterUtil.contains(this.systemKlass, name);
  }

  /**
   * @see org.mklab.tool.control.system.UserDefinedSystem#setSystemClass(java.lang.Class)
   */
  public void setSystemClass(final Class<?> klass) {
    this.systemKlass = klass;
  }

  /**
   * @see org.mklab.tool.control.system.UserDefinedSystem#getSystemClass()
   */
  public Class<?> getSystemClass() {
    return this.systemKlass;
  }

  /**
   * @see org.mklab.tool.control.system.UserDefinedSystem#setInitializeFunction(java.lang.reflect.Method)
   */
  public void setInitializeFunction(final Method method) throws SecurityException {
    this.initializeFunction = method;
    this.initializeFunction.setAccessible(true);
  }

  /**
   * @see org.mklab.tool.control.system.UserDefinedSystem#setUpdateFunction(java.lang.reflect.Method)
   */
  public void setUpdateFunction(final Method method) throws SecurityException {
    this.updateFunction = method;
    this.updateFunction.setAccessible(true);
  }

  /**
   * @see org.mklab.tool.control.system.UserDefinedSystem#update()
   */
  public void update() throws ParameterException {
    try {
      this.updateFunction.invoke(null);
    } catch (IllegalArgumentException e) {
      throw new ParameterException(e);
    } catch (IllegalAccessException e) {
      throw new ParameterException(e);
    } catch (InvocationTargetException e) {
      throw new ParameterException(e.getTargetException());
    } catch (Exception e) {
      throw new ParameterException(e);
    }
  }
}