DoubleUserDefinedDiscreteSink.java

  1. /*
  2.  * Created on 2007/07/16
  3.  * Copyright (C) 2007 Koga Laboratory. All rights reserved.
  4.  *
  5.  */
  6. package org.mklab.tool.control.system.sink;

  7. import java.lang.reflect.InvocationTargetException;
  8. import java.lang.reflect.Method;
  9. import java.util.Set;

  10. import org.mklab.nfc.matrix.DoubleMatrix;
  11. import org.mklab.nfc.nleq.NonLinearEquationSolver;
  12. import org.mklab.nfc.ode.EquationSolver;
  13. import org.mklab.nfc.ode.SolverStopException;
  14. import org.mklab.tool.control.system.ParameterUtil;
  15. import org.mklab.tool.control.system.UserDefinedSystem;
  16. import org.mklab.tool.control.system.parameter.NoSuchParameterException;
  17. import org.mklab.tool.control.system.parameter.ParameterException;


  18. /**
  19.  * ユーザ定義離散信号吸収システムを表わすクラスです。
  20.  *
  21.  * @author koga
  22.  * @version $Revision: 1.11 $, 2007/07/16
  23.  */
  24. public class DoubleUserDefinedDiscreteSink extends DoubleDiscreteSink implements UserDefinedSystem {

  25.   /** システムの出力方程式を定義したクラス */
  26.   private Class<?> systemKlass;

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

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

  31.   /** システムの出力方程式を定義したメソッド */
  32.   private Method outputFunction;

  33.   /** メソッドの定義してあるオブジェクト。nullの場合は静的メソッドを呼び出します。 */
  34.   private Object obj;

  35.   /**
  36.    * 新しく生成された<code>UserDefinedDiscreteSink</code>オブジェクトを初期化します。
  37.    *
  38.    * @param obj メソッドの定義してあるオブジェクト。nullの場合は静的メソッドを呼び出します。
  39.    */
  40.   public DoubleUserDefinedDiscreteSink(Object obj) {
  41.     super();
  42.     this.obj = obj;
  43.   }

  44.   /**
  45.    * 新しく生成された<code>UserDefinedDiscreteSink</code>オブジェクトを初期化します。
  46.    */
  47.   public DoubleUserDefinedDiscreteSink() {
  48.     this(null);
  49.   }

  50.   /**
  51.    * {@inheritDoc}
  52.    */
  53.   @Override
  54.   public DoubleMatrix outputEquation(int k, DoubleMatrix u) throws SolverStopException {
  55.     // 方程式のソルバーが仮の値で計算しているか判定します
  56.     final boolean solverTrial = EquationSolver.isTrial() || NonLinearEquationSolver.isTrial();

  57.     if (solverTrial) {
  58.       return u;
  59.     }

  60.     try {
  61.       this.outputFunction.invoke(this.obj, Integer.valueOf(k), u);
  62.     } catch (IllegalArgumentException e) {
  63.       throw new SolverStopException(e);
  64.     } catch (IllegalAccessException e) {
  65.       throw new SolverStopException(e);
  66.     } catch (InvocationTargetException e) {
  67.       throw new SolverStopException(e.getTargetException());
  68.     }

  69.     return new DoubleMatrix(getInputSize(), 1);
  70.   }

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

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

  83.   /**
  84.    * システムの出力方程式を定義したメソッドを設定します。
  85.    *
  86.    * @param method システムの出力方程式を定義したメソッド
  87.    * @throws SecurityException メソッドにアクセスする権利が無い場合
  88.    */
  89.   public void setOutputFunction(Method method) throws SecurityException {
  90.     this.outputFunction = method;
  91.     this.outputFunction.setAccessible(true);
  92.   }

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

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

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

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

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

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

  131.   /**
  132.    * @see org.mklab.tool.control.system.UserDefinedSystem#update()
  133.    */
  134.   public void update() throws ParameterException {
  135.     try {
  136.       if (this.updateFunction != null) {
  137.         this.updateFunction.invoke(this.obj);
  138.       }
  139.     } catch (IllegalArgumentException e) {
  140.       throw new ParameterException(e);
  141.     } catch (IllegalAccessException e) {
  142.       throw new ParameterException(e);
  143.     } catch (InvocationTargetException e) {
  144.       throw new ParameterException(e.getTargetException());
  145.     } catch (Exception e) {
  146.       throw new ParameterException(e);
  147.     }
  148.   }

  149.   /**
  150.    * @see org.mklab.tool.control.system.discrete.BaseDiscreteStaticSystem#initialize()
  151.    */
  152.   @Override
  153.   public void initialize() {
  154.     super.initialize();
  155.     try {
  156.       if (this.initializeFunction != null) {
  157.         this.initializeFunction.invoke(this.obj);
  158.       }
  159.     } catch (IllegalArgumentException e) {
  160.       throw new RuntimeException(e);
  161.     } catch (IllegalAccessException e) {
  162.       throw new RuntimeException(e);
  163.     } catch (InvocationTargetException e) {
  164.       throw new RuntimeException(e.getTargetException());
  165.     } catch (Exception e) {
  166.       throw new RuntimeException(e);
  167.     }
  168.   }
  169. }