Author: luc
Date: Thu Aug 16 10:06:16 2012
New Revision: 1373775

URL: http://svn.apache.org/viewvc?rev=1373775&view=rev
Log:
Added abs to DerivativeStructure.

We handle +0.0/-0.0 correctly, i.e. we flip derivatives sign when value
is negative zero.

Modified:
    
commons/proper/math/trunk/src/main/java/org/apache/commons/math3/analysis/differentiation/DerivativeStructure.java
    
commons/proper/math/trunk/src/test/java/org/apache/commons/math3/analysis/differentiation/DerivativeStructureTest.java

Modified: 
commons/proper/math/trunk/src/main/java/org/apache/commons/math3/analysis/differentiation/DerivativeStructure.java
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/analysis/differentiation/DerivativeStructure.java?rev=1373775&r1=1373774&r2=1373775&view=diff
==============================================================================
--- 
commons/proper/math/trunk/src/main/java/org/apache/commons/math3/analysis/differentiation/DerivativeStructure.java
 (original)
+++ 
commons/proper/math/trunk/src/main/java/org/apache/commons/math3/analysis/differentiation/DerivativeStructure.java
 Thu Aug 16 10:06:16 2012
@@ -355,6 +355,18 @@ public class DerivativeStructure impleme
         return ds;
     }
 
+    /** absolute value.
+     * @return abs(this)
+     */
+    public DerivativeStructure abs() {
+        if (Double.doubleToLongBits(data[0]) < 0) {
+            // we use the bits representation to also handle -0.0
+            return negate();
+        } else {
+            return this;
+        }
+    }
+
     /** {@inheritDoc} */
     public DerivativeStructure reciprocal() {
         final DerivativeStructure result = new DerivativeStructure(compiler);

Modified: 
commons/proper/math/trunk/src/test/java/org/apache/commons/math3/analysis/differentiation/DerivativeStructureTest.java
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math3/analysis/differentiation/DerivativeStructureTest.java?rev=1373775&r1=1373774&r2=1373775&view=diff
==============================================================================
--- 
commons/proper/math/trunk/src/test/java/org/apache/commons/math3/analysis/differentiation/DerivativeStructureTest.java
 (original)
+++ 
commons/proper/math/trunk/src/test/java/org/apache/commons/math3/analysis/differentiation/DerivativeStructureTest.java
 Thu Aug 16 10:06:16 2012
@@ -732,6 +732,27 @@ public class DerivativeStructureTest {
     }
 
     @Test
+    public void testAbs() {
+
+        DerivativeStructure minusOne = new DerivativeStructure(1, 1, 0, -1.0);
+        Assert.assertEquals(+1.0, minusOne.abs().getPartialDerivative(0), 
1.0e-15);
+        Assert.assertEquals(-1.0, minusOne.abs().getPartialDerivative(1), 
1.0e-15);
+
+        DerivativeStructure plusOne = new DerivativeStructure(1, 1, 0, +1.0);
+        Assert.assertEquals(+1.0, plusOne.abs().getPartialDerivative(0), 
1.0e-15);
+        Assert.assertEquals(+1.0, plusOne.abs().getPartialDerivative(1), 
1.0e-15);
+
+        DerivativeStructure minusZero = new DerivativeStructure(1, 1, 0, -0.0);
+        Assert.assertEquals(+0.0, minusZero.abs().getPartialDerivative(0), 
1.0e-15);
+        Assert.assertEquals(-1.0, minusZero.abs().getPartialDerivative(1), 
1.0e-15);
+
+        DerivativeStructure plusZero = new DerivativeStructure(1, 1, 0, +0.0);
+        Assert.assertEquals(+0.0, plusZero.abs().getPartialDerivative(0), 
1.0e-15);
+        Assert.assertEquals(+1.0, plusZero.abs().getPartialDerivative(1), 
1.0e-15);
+
+    }
+
+    @Test
     public void testField() {
         for (int maxOrder = 1; maxOrder < 5; ++maxOrder) {
             DerivativeStructure x = new DerivativeStructure(3, maxOrder, 0, 
1.0);


Reply via email to