Return-Path: Delivered-To: apmail-commons-commits-archive@minotaur.apache.org Received: (qmail 49485 invoked from network); 1 Feb 2011 12:01:33 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 1 Feb 2011 12:01:33 -0000 Received: (qmail 77148 invoked by uid 500); 1 Feb 2011 12:01:33 -0000 Delivered-To: apmail-commons-commits-archive@commons.apache.org Received: (qmail 76809 invoked by uid 500); 1 Feb 2011 12:01:29 -0000 Mailing-List: contact commits-help@commons.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@commons.apache.org Delivered-To: mailing list commits@commons.apache.org Received: (qmail 76802 invoked by uid 99); 1 Feb 2011 12:01:28 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 01 Feb 2011 12:01:28 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 01 Feb 2011 12:01:25 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 599B723889CB; Tue, 1 Feb 2011 12:01:04 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1066018 - in /commons/proper/math/trunk/src: main/java/org/apache/commons/math/analysis/function/StepFunction.java test/java/org/apache/commons/math/analysis/function/StepFunctionTest.java Date: Tue, 01 Feb 2011 12:01:04 -0000 To: commits@commons.apache.org From: erans@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20110201120104.599B723889CB@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: erans Date: Tue Feb 1 12:01:03 2011 New Revision: 1066018 URL: http://svn.apache.org/viewvc?rev=1066018&view=rev Log: MATH-503 Step function. Added: commons/proper/math/trunk/src/main/java/org/apache/commons/math/analysis/function/StepFunction.java (with props) commons/proper/math/trunk/src/test/java/org/apache/commons/math/analysis/function/StepFunctionTest.java (with props) Added: commons/proper/math/trunk/src/main/java/org/apache/commons/math/analysis/function/StepFunction.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/analysis/function/StepFunction.java?rev=1066018&view=auto ============================================================================== --- commons/proper/math/trunk/src/main/java/org/apache/commons/math/analysis/function/StepFunction.java (added) +++ commons/proper/math/trunk/src/main/java/org/apache/commons/math/analysis/function/StepFunction.java Tue Feb 1 12:01:03 2011 @@ -0,0 +1,89 @@ +/* + * 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.analysis.function; + +import java.util.Arrays; +import org.apache.commons.math.analysis.UnivariateRealFunction; +import org.apache.commons.math.exception.DimensionMismatchException; +import org.apache.commons.math.exception.NullArgumentException; +import org.apache.commons.math.exception.NoDataException; +import org.apache.commons.math.util.MathUtils; + +/** + * + * Step function. + * + * @version $Revision$ $Date$ + * @since 3.0 + */ +public class StepFunction implements UnivariateRealFunction { + /** Abscissae. */ + private final double[] abscissa; + /** Ordinates. */ + private final double[] ordinate; + + /** + * Builds a step function from a list of abscissae and the corresponding + * ordinates. + * + * @param x Abscissae. + * @param y Ordinates. + * @throws org.apache.commons.math.exception.NonMonotonousSequenceException + * if the {@code x} array is not sorted in strictly increasing order. + * @throws NullArgumentException if {@code x} or {@code y} are {@code null}. + * @throws NoDataException if {@code x} or {@code y} are zero-length. + */ + public StepFunction(double[] x, + double[] y) { + if (x == null || + y == null) { + throw new NullArgumentException(); + } + if (x.length == 0 || + y.length == 0) { + throw new NoDataException(); + } + if (y.length != x.length) { + throw new DimensionMismatchException(y.length, x.length); + } + MathUtils.checkOrder(x); + + abscissa = MathUtils.copyOf(x); + ordinate = MathUtils.copyOf(y); + } + + /** {@inheritDoc} */ + public double value(double x) { + int index = Arrays.binarySearch(abscissa, x); + double fx = 0; + + if (index < -1) { + // "x" is between "abscissa[-index-2]" and "abscissa[-index-1]". + fx = ordinate[-index-2]; + } else if (index >= 0) { + // "x" is exactly "abscissa[index]". + fx = ordinate[index]; + } else { + // Otherwise, "x" is smaller than the first value in "abscissa" + // (hence the returned value should be "ordinate[0]"). + fx = ordinate[0]; + } + + return fx; + } +} Propchange: commons/proper/math/trunk/src/main/java/org/apache/commons/math/analysis/function/StepFunction.java ------------------------------------------------------------------------------ svn:eol-style = native Added: commons/proper/math/trunk/src/test/java/org/apache/commons/math/analysis/function/StepFunctionTest.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math/analysis/function/StepFunctionTest.java?rev=1066018&view=auto ============================================================================== --- commons/proper/math/trunk/src/test/java/org/apache/commons/math/analysis/function/StepFunctionTest.java (added) +++ commons/proper/math/trunk/src/test/java/org/apache/commons/math/analysis/function/StepFunctionTest.java Tue Feb 1 12:01:03 2011 @@ -0,0 +1,95 @@ +/* + * 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.analysis.function; + +import org.apache.commons.math.analysis.UnivariateRealFunction; +import org.apache.commons.math.exception.DimensionMismatchException; +import org.apache.commons.math.exception.NonMonotonousSequenceException; +import org.apache.commons.math.exception.NullArgumentException; +import org.apache.commons.math.exception.NoDataException; + +import org.junit.Assert; +import org.junit.Test; + +/** + * Test for class {@link StepFunction}. + */ +public class StepFunctionTest { + private final double EPS = Math.ulp(1d); + + @Test + public void testPreconditions() { + try { + final UnivariateRealFunction f = new StepFunction(null, + new double[] {0, -1, -2}); + } catch (NullArgumentException e) { + // Expected. + } + try { + final UnivariateRealFunction f = new StepFunction(new double[] {0, 1}, + null); + } catch (NullArgumentException e) { + // Expected. + } + + try { + final UnivariateRealFunction f = new StepFunction(new double[] {0}, + new double[] {}); + } catch (NoDataException e) { + // Expected. + } + + try { + final UnivariateRealFunction f = new StepFunction(new double[] {}, + new double[] {0}); + } catch (NoDataException e) { + // Expected. + } + + try { + final UnivariateRealFunction f = new StepFunction(new double[] {0, 1}, + new double[] {0, -1, -2}); + } catch (DimensionMismatchException e) { + // Expected. + } + + try { + final UnivariateRealFunction f = new StepFunction(new double[] {1, 0, 1}, + new double[] {0, -1, -2}); + } catch (NonMonotonousSequenceException e) { + // Expected. + } + } + + @Test + public void testSomeValues() { + final double[] x = { -2, -0.5, 0, 1.9, 7.4, 21.3 }; + final double[] y = { 4, -1, -5.5, 0.4, 5.8, 51.2 }; + + final UnivariateRealFunction f = new StepFunction(x, y); + + Assert.assertEquals(4, f.value(Double.NEGATIVE_INFINITY), EPS); + Assert.assertEquals(4, f.value(-10), EPS); + Assert.assertEquals(-1, f.value(-0.4), EPS); + Assert.assertEquals(-5.5, f.value(0), EPS); + Assert.assertEquals(0.4, f.value(2), EPS); + Assert.assertEquals(5.8, f.value(10), EPS); + Assert.assertEquals(51.2, f.value(30), EPS); + Assert.assertEquals(51.2, f.value(Double.POSITIVE_INFINITY), EPS); + } +} Propchange: commons/proper/math/trunk/src/test/java/org/apache/commons/math/analysis/function/StepFunctionTest.java ------------------------------------------------------------------------------ svn:eol-style = native