You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by lu...@apache.org on 2012/09/28 18:43:48 UTC

svn commit: r1391540 - in /commons/sandbox/nabla/trunk/src: main/java/org/apache/commons/nabla/forward/arithmetic/DRemTransformer.java test/java/org/apache/commons/nabla/forward/arithmetic/DRemGeneratorTest.java

Author: luc
Date: Fri Sep 28 16:43:47 2012
New Revision: 1391540

URL: http://svn.apache.org/viewvc?rev=1391540&view=rev
Log:
Fixed DREM transform.

The computation was wrong when first argument was a double and second
argument was a DerivativeStructure.

Modified:
    commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/arithmetic/DRemTransformer.java
    commons/sandbox/nabla/trunk/src/test/java/org/apache/commons/nabla/forward/arithmetic/DRemGeneratorTest.java

Modified: commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/arithmetic/DRemTransformer.java
URL: http://svn.apache.org/viewvc/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/arithmetic/DRemTransformer.java?rev=1391540&r1=1391539&r2=1391540&view=diff
==============================================================================
--- commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/arithmetic/DRemTransformer.java (original)
+++ commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/arithmetic/DRemTransformer.java Fri Sep 28 16:43:47 2012
@@ -76,21 +76,23 @@ public class DRemTransformer implements 
             list.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, DS_TYPE.getInternalName(),
                                         "getValue",
                                         Type.getMethodDescriptor(Type.DOUBLE_TYPE)));          // => ds_b, b0
-            list.add(new VarInsnNode(Opcodes.DLOAD,  tmp1));                                   // => ds_b, b0, a
-            list.add(new InsnNode(Opcodes.DUP2_X2));                                           // => ds_b, a, b0, a
-            list.add(new InsnNode(Opcodes.POP2));                                              // => ds_b, a, b0
-            list.add(new InsnNode(Opcodes.DREM));                                              // => ds_b, q=a%b0
-
-            // TODO: the remaining computation is WRONG!
-
-            list.add(new InsnNode(Opcodes.DNEG));                                              // => ds_b, -q
+            list.add(new InsnNode(Opcodes.DUP2));                                              // => ds_b, b0, b0
+            list.add(new VarInsnNode(Opcodes.DLOAD,  tmp1));                                   // => ds_b, b0, b0, a
+            list.add(new InsnNode(Opcodes.DUP2_X2));                                           // => ds_b, b0, a, b0, a
+            list.add(new InsnNode(Opcodes.POP2));                                              // => ds_b, b0, a, b0
+            list.add(new InsnNode(Opcodes.DREM));                                              // => ds_b, b0, a%b0
+            list.add(new VarInsnNode(Opcodes.DLOAD,  tmp1));                                   // => ds_b, b0, a%b0, a
+            list.add(new InsnNode(Opcodes.DSUB));                                              // => ds_b, b0, a%b0-a
+            list.add(new InsnNode(Opcodes.DUP2_X2));                                           // => ds_b, a%b0-a, b0, a%b0-a
+            list.add(new InsnNode(Opcodes.POP2));                                              // => ds_b, a%b0-a, b0
+            list.add(new InsnNode(Opcodes.DDIV));                                              // => ds_b, q=(a%b0-a)/b0
             list.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, DS_TYPE.getInternalName(),
                                         "multiply",
-                                        Type.getMethodDescriptor(DS_TYPE, Type.DOUBLE_TYPE))); // => -q*b
-            list.add(new VarInsnNode(Opcodes.DLOAD,  tmp1));                                   // => -q*b, a
+                                        Type.getMethodDescriptor(DS_TYPE, Type.DOUBLE_TYPE))); // => q*b
+            list.add(new VarInsnNode(Opcodes.DLOAD,  tmp1));                                   // => q*b, a
             list.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, DS_TYPE.getInternalName(),
                                         "add",
-                                        Type.getMethodDescriptor(DS_TYPE, Type.DOUBLE_TYPE))); // => a-q*b
+                                        Type.getMethodDescriptor(DS_TYPE, Type.DOUBLE_TYPE))); // => a+q*b
 
         }
 

Modified: commons/sandbox/nabla/trunk/src/test/java/org/apache/commons/nabla/forward/arithmetic/DRemGeneratorTest.java
URL: http://svn.apache.org/viewvc/commons/sandbox/nabla/trunk/src/test/java/org/apache/commons/nabla/forward/arithmetic/DRemGeneratorTest.java?rev=1391540&r1=1391539&r2=1391540&view=diff
==============================================================================
--- commons/sandbox/nabla/trunk/src/test/java/org/apache/commons/nabla/forward/arithmetic/DRemGeneratorTest.java (original)
+++ commons/sandbox/nabla/trunk/src/test/java/org/apache/commons/nabla/forward/arithmetic/DRemGeneratorTest.java Fri Sep 28 16:43:47 2012
@@ -34,7 +34,7 @@ public class DRemGeneratorTest extends A
         checkReference(new ReferenceFunction() {
             public double value(double t) { return 5 % t; }
             public double firstDerivative(double t) { return ((5 % t) - 5) / t; }
-        }, 0.5, 10, 30, 1e-15);
+        }, 0.5, 10, 30, 5e-16);
     }
 
     @Test