Author: luc Date: Fri Apr 25 00:25:58 2008 New Revision: 651514 URL: http://svn.apache.org/viewvc?rev=651514&view=rev Log: added a way to handle errors in user-defined switching functions previously, only the function evaluation could trigger errors, not the other functions of the interface
Added: commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/ode/SwitchException.java (with props) Modified: commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/ode/SwitchState.java commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/ode/SwitchingFunction.java commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/ode/SwitchingFunctionsHandler.java commons/proper/math/branches/MATH_2_0/src/site/xdoc/changes.xml commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/ode/HighamHall54IntegratorTest.java Added: commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/ode/SwitchException.java URL: http://svn.apache.org/viewvc/commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/ode/SwitchException.java?rev=651514&view=auto ============================================================================== --- commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/ode/SwitchException.java (added) +++ commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/ode/SwitchException.java Fri Apr 25 00:25:58 2008 @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.commons.math.ode; + +import org.apache.commons.math.MathException; + +/** + * This exception is made available to users to report + * the error conditions that are triggered by [EMAIL PROTECTED] SwitchingFunction} + * @version $Revision: 620312 $ $Date: 2008-02-10 20:28:59 +0100 (dim., 10 févr. 2008) $ + * @since 2.0 + */ +public class SwitchException extends MathException { + + /** Serialization UID. */ + private static final long serialVersionUID = -3662133702316614545L; + + /** Simple constructor. + * Build an exception by translating and formating a message + * @param specifier format specifier (to be translated) + * @param parts to insert in the format (no translation) + */ + public SwitchException(String specifier, Object[] parts) { + super(specifier, parts); + } + + /** + * Create an exception with a given root cause. + * @param cause the exception or error that caused this exception to be thrown + */ + public SwitchException(Throwable cause) { + super(cause); + } + +} Propchange: commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/ode/SwitchException.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/ode/SwitchState.java URL: http://svn.apache.org/viewvc/commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/ode/SwitchState.java?rev=651514&r1=651513&r2=651514&view=diff ============================================================================== --- commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/ode/SwitchState.java (original) +++ commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/ode/SwitchState.java Fri Apr 25 00:25:58 2008 @@ -42,7 +42,7 @@ class SwitchState implements Serializable { /** Serializable version identifier. */ - private static final long serialVersionUID = -7307007422156119622L; + private static final long serialVersionUID = -7307007422156119622L; /** Switching function. */ private SwitchingFunction function; @@ -50,10 +50,10 @@ /** Maximal time interval between switching function checks. */ private double maxCheckInterval; - /** Convergence threshold for event localisation. */ + /** Convergence threshold for event localization. */ private double convergence; - /** Upper limit in the iteration count for event localisation. */ + /** Upper limit in the iteration count for event localization. */ private int maxIterationCount; /** Time at the beginning of the step. */ @@ -115,11 +115,11 @@ * beginning of the step * @param y0 array containing the current value of the state vector * at the beginning of the step - * @exception FunctionEvaluationException if the switching function + * @exception SwitchException if the switching function * value cannot be evaluated at the beginning of the step */ public void reinitializeBegin(double t0, double[] y0) - throws FunctionEvaluationException { + throws SwitchException { this.t0 = t0; g0 = function.g(t0, y0); g0Positive = (g0 >= 0); @@ -132,12 +132,12 @@ * rejected) * @exception DerivativeException if the interpolator fails to * compute the function somewhere within the step - * @exception FunctionEvaluationException if the switching function + * @exception SwitchException if the switching function * cannot be evaluated * @exception ConvergenceException if an event cannot be located */ public boolean evaluateStep(final StepInterpolator interpolator) - throws DerivativeException, FunctionEvaluationException, ConvergenceException { + throws DerivativeException, SwitchException, ConvergenceException { try { @@ -169,6 +169,8 @@ return function.g(t, interpolator.getInterpolatedState()); } catch (DerivativeException e) { throw new FunctionEvaluationException(t, e); + } catch (SwitchException e) { + throw new FunctionEvaluationException(t, e); } } }); @@ -205,10 +207,12 @@ } catch (FunctionEvaluationException e) { Throwable cause = e.getCause(); - if ((cause != null) && (cause instanceof DerivativeException)) { - throw (DerivativeException) cause; - } - throw e; + if ((cause != null) && (cause instanceof DerivativeException)) { + throw (DerivativeException) cause; + } else if ((cause != null) && (cause instanceof SwitchException)) { + throw (SwitchException) cause; + } + throw new SwitchException(e); } } @@ -227,11 +231,10 @@ * end of the step * @param y array containing the current value of the state vector * at the end of the step - * @exception FunctionEvaluationException if the value of the switching + * @exception SwitchException if the value of the switching * function cannot be evaluated */ - public void stepAccepted(double t, double[] y) - throws FunctionEvaluationException { + public void stepAccepted(double t, double[] y) throws SwitchException { t0 = t; g0 = function.g(t, y); @@ -261,8 +264,10 @@ * @param y array were to put the desired state vector at the beginning * of the next step * @return true if the integrator should reset the derivatives too + * @exception SwitchException if the state cannot be reseted by the switching + * function */ - public boolean reset(double t, double[] y) { + public boolean reset(double t, double[] y) throws SwitchException { if (! pendingEvent) { return false; Modified: commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/ode/SwitchingFunction.java URL: http://svn.apache.org/viewvc/commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/ode/SwitchingFunction.java?rev=651514&r1=651513&r2=651514&view=diff ============================================================================== --- commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/ode/SwitchingFunction.java (original) +++ commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/ode/SwitchingFunction.java Fri Apr 25 00:25:58 2008 @@ -19,8 +19,6 @@ import java.io.Serializable; -import org.apache.commons.math.FunctionEvaluationException; - /** This interface represents a switching function. * * <p>A switching function allows to handle discrete events in @@ -93,10 +91,9 @@ * @param t current value of the independent <i>time</i> variable * @param y array containing the current value of the state vector * @return value of the g function - * @exception FunctionEvaluationException if the value of the function - * cannot be evaluated + * @exception SwitchException if the switching function cannot be evaluated */ - public double g(double t, double[] y) throws FunctionEvaluationException; + public double g(double t, double[] y) throws SwitchException; /** Handle an event and choose what to do next. @@ -131,8 +128,9 @@ * @return indication of what the integrator should do next, this * value must be one of [EMAIL PROTECTED] #STOP}, [EMAIL PROTECTED] #RESET_STATE}, * [EMAIL PROTECTED] #RESET_DERIVATIVES} or [EMAIL PROTECTED] #CONTINUE} + * @exception SwitchException if the event occurrence triggers an error */ - public int eventOccurred(double t, double[] y); + public int eventOccurred(double t, double[] y) throws SwitchException; /** Reset the state prior to continue the integration. @@ -148,7 +146,8 @@ * @param t current value of the independent <i>time</i> variable * @param y array containing the current value of the state vector * the new state should be put in the same array + * @exception SwitchException if the state cannot be reseted */ - public void resetState(double t, double[] y); + public void resetState(double t, double[] y) throws SwitchException; } Modified: commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/ode/SwitchingFunctionsHandler.java URL: http://svn.apache.org/viewvc/commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/ode/SwitchingFunctionsHandler.java?rev=651514&r1=651513&r2=651514&view=diff ============================================================================== --- commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/ode/SwitchingFunctionsHandler.java (original) +++ commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/ode/SwitchingFunctionsHandler.java Fri Apr 25 00:25:58 2008 @@ -17,15 +17,14 @@ package org.apache.commons.math.ode; -import org.apache.commons.math.ConvergenceException; -import org.apache.commons.math.FunctionEvaluationException; - import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.List; +import org.apache.commons.math.ConvergenceException; + /** This class handles several [EMAIL PROTECTED] SwitchingFunction switching * functions} during integration. * @@ -147,8 +146,8 @@ return first != null; - } catch (FunctionEvaluationException fee) { - throw new IntegratorException(fee); + } catch (SwitchException se) { + throw new IntegratorException(se); } catch (ConvergenceException ce) { throw new IntegratorException(ce); } @@ -180,8 +179,8 @@ for (Iterator iter = functions.iterator(); iter.hasNext();) { ((SwitchState) iter.next()).stepAccepted(t, y); } - } catch (FunctionEvaluationException fee) { - throw new IntegratorException(fee); + } catch (SwitchException se) { + throw new IntegratorException(se); } } @@ -204,15 +203,21 @@ * @param y array were to put the desired state vector at the beginning * of the next step * @return true if the integrator should reset the derivatives too + * @exception IntegratorException if one of the switching functions + * that should reset the state fails to do it */ - public boolean reset(double t, double[] y) { - boolean resetDerivatives = false; - for (Iterator iter = functions.iterator(); iter.hasNext();) { - if (((SwitchState) iter.next()).reset(t, y)) { - resetDerivatives = true; + public boolean reset(double t, double[] y) throws IntegratorException { + try { + boolean resetDerivatives = false; + for (Iterator iter = functions.iterator(); iter.hasNext();) { + if (((SwitchState) iter.next()).reset(t, y)) { + resetDerivatives = true; + } + } + return resetDerivatives; + } catch (SwitchException se) { + throw new IntegratorException(se); } - } - return resetDerivatives; } /** Switching functions. */ Modified: commons/proper/math/branches/MATH_2_0/src/site/xdoc/changes.xml URL: http://svn.apache.org/viewvc/commons/proper/math/branches/MATH_2_0/src/site/xdoc/changes.xml?rev=651514&r1=651513&r2=651514&view=diff ============================================================================== --- commons/proper/math/branches/MATH_2_0/src/site/xdoc/changes.xml (original) +++ commons/proper/math/branches/MATH_2_0/src/site/xdoc/changes.xml Fri Apr 25 00:25:58 2008 @@ -35,11 +35,16 @@ <document> <properties> - <title> -Commons Math Release Notes</title> + <title>Commons Math Release Notes</title> </properties> <body> <release version="2.0" date="TBD" description="TBD"> + <action dev="luc" type="add" > + Switching functions can now throw dedicated SwitchException from all their + method. At upper call level, the various ODE integrators handle these new + exceptions and wrap them into IntegratorException instances, hence the + integrators methods signature did not change. + </action> <action dev="luc" type="add" issue="MATH-202"> Added the getSwitchingFunctions and clearSwitchingFunctions to the FirstOrderIntegrator interface and all its implementations Modified: commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/ode/HighamHall54IntegratorTest.java URL: http://svn.apache.org/viewvc/commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/ode/HighamHall54IntegratorTest.java?rev=651514&r1=651513&r2=651514&view=diff ============================================================================== --- commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/ode/HighamHall54IntegratorTest.java (original) +++ commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/ode/HighamHall54IntegratorTest.java Fri Apr 25 00:25:58 2008 @@ -17,17 +17,11 @@ package org.apache.commons.math.ode; -import org.apache.commons.math.ConvergenceException; -import org.apache.commons.math.FunctionEvaluationException; -import org.apache.commons.math.ode.DerivativeException; -import org.apache.commons.math.ode.FirstOrderIntegrator; -import org.apache.commons.math.ode.HighamHall54Integrator; -import org.apache.commons.math.ode.IntegratorException; -import org.apache.commons.math.ode.StepHandler; -import org.apache.commons.math.ode.StepInterpolator; -import org.apache.commons.math.ode.SwitchingFunction; +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; -import junit.framework.*; +import org.apache.commons.math.ConvergenceException; public class HighamHall54IntegratorTest extends TestCase { @@ -185,11 +179,12 @@ public int eventOccurred(double t, double[] y) { return SwitchingFunction.CONTINUE; } - public double g(double t, double[] y) throws FunctionEvaluationException { + public double g(double t, double[] y) throws SwitchException { double middle = (pb.getInitialTime() + pb.getFinalTime()) / 2; double offset = t - middle; if (offset > 0) { - throw new FunctionEvaluationException(t); + throw new SwitchException("Evaluation failed for argument = {0}", + new Object[] { new Double(t) }); } return offset; }