DoubleUserDefinedDiscreteSink.java
- /*
- * Created on 2007/07/16
- * Copyright (C) 2007 Koga Laboratory. All rights reserved.
- *
- */
- package org.mklab.tool.control.system.sink;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- import java.util.Set;
- import org.mklab.nfc.matrix.DoubleMatrix;
- import org.mklab.nfc.nleq.NonLinearEquationSolver;
- import org.mklab.nfc.ode.EquationSolver;
- import org.mklab.nfc.ode.SolverStopException;
- 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.11 $, 2007/07/16
- */
- public class DoubleUserDefinedDiscreteSink extends DoubleDiscreteSink implements UserDefinedSystem {
- /** システムの出力方程式を定義したクラス */
- private Class<?> systemKlass;
- /** システムの初期化処理を定義したメソッド */
- private Method initializeFunction;
- /** システムの更新処理を定義したメソッド */
- private Method updateFunction;
- /** システムの出力方程式を定義したメソッド */
- private Method outputFunction;
- /** メソッドの定義してあるオブジェクト。nullの場合は静的メソッドを呼び出します。 */
- private Object obj;
- /**
- * 新しく生成された<code>UserDefinedDiscreteSink</code>オブジェクトを初期化します。
- *
- * @param obj メソッドの定義してあるオブジェクト。nullの場合は静的メソッドを呼び出します。
- */
- public DoubleUserDefinedDiscreteSink(Object obj) {
- super();
- this.obj = obj;
- }
- /**
- * 新しく生成された<code>UserDefinedDiscreteSink</code>オブジェクトを初期化します。
- */
- public DoubleUserDefinedDiscreteSink() {
- this(null);
- }
- /**
- * {@inheritDoc}
- */
- @Override
- public DoubleMatrix outputEquation(int k, DoubleMatrix u) throws SolverStopException {
- // 方程式のソルバーが仮の値で計算しているか判定します
- final boolean solverTrial = EquationSolver.isTrial() || NonLinearEquationSolver.isTrial();
- if (solverTrial) {
- return u;
- }
- try {
- this.outputFunction.invoke(this.obj, Integer.valueOf(k), u);
- } catch (IllegalArgumentException e) {
- throw new SolverStopException(e);
- } catch (IllegalAccessException e) {
- throw new SolverStopException(e);
- } catch (InvocationTargetException e) {
- throw new SolverStopException(e.getTargetException());
- }
- return new DoubleMatrix(getInputSize(), 1);
- }
- /**
- * @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;
- }
- /**
- * システムの出力方程式を定義したメソッドを設定します。
- *
- * @param method システムの出力方程式を定義したメソッド
- * @throws SecurityException メソッドにアクセスする権利が無い場合
- */
- public void setOutputFunction(Method method) throws SecurityException {
- this.outputFunction = method;
- this.outputFunction.setAccessible(true);
- }
- /**
- * @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#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#update()
- */
- public void update() throws ParameterException {
- try {
- if (this.updateFunction != null) {
- this.updateFunction.invoke(this.obj);
- }
- } 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);
- }
- }
- /**
- * @see org.mklab.tool.control.system.discrete.BaseDiscreteStaticSystem#initialize()
- */
- @Override
- public void initialize() {
- super.initialize();
- try {
- if (this.initializeFunction != null) {
- this.initializeFunction.invoke(this.obj);
- }
- } catch (IllegalArgumentException e) {
- throw new RuntimeException(e);
- } catch (IllegalAccessException e) {
- throw new RuntimeException(e);
- } catch (InvocationTargetException e) {
- throw new RuntimeException(e.getTargetException());
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
- }