Author: luc
Date: Tue Oct  2 15:14:19 2012
New Revision: 1392960

URL: http://svn.apache.org/viewvc?rev=1392960&view=rev
Log:
Allow all instructions transformers to access a reference
DerivativeStructure.

Modified:
    
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/analysis/ClassDifferentiator.java
    
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/analysis/InstructionsTransformer.java
    
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/analysis/MethodDifferentiator.java
    
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/arithmetic/DAddTransformer.java
    
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/arithmetic/DDivTransformer.java
    
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/arithmetic/DMulTransformer.java
    
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/arithmetic/DNegTransformer.java
    
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/arithmetic/DRemTransformer.java
    
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/arithmetic/DSubTransformer.java
    
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/DLoadTransformer.java
    
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/DReturnTransformer.java
    
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/DStoreTransformer.java
    
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/DcmpTransformer.java
    
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/Dup2Transformer.java
    
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/Dup2X1Transformer.java
    
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/Dup2X2Transformer.java
    
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/GetFieldTransformer.java
    
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/InvokeStaticTransformer.java
    
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/NarrowingTransformer.java
    
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/Pop2Transformer.java
    
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/WideningTransformer.java

Modified: 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/analysis/ClassDifferentiator.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/analysis/ClassDifferentiator.java?rev=1392960&r1=1392959&r2=1392960&view=diff
==============================================================================
--- 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/analysis/ClassDifferentiator.java
 (original)
+++ 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/analysis/ClassDifferentiator.java
 Tue Oct  2 15:14:19 2012
@@ -148,7 +148,8 @@ public class ClassDifferentiator {
 
                 final MethodDifferentiator differentiator =
                         new MethodDifferentiator(mathClasses, classNode.name);
-                differentiator.differentiate(primitiveNode.name, method);
+                differentiator.differentiate(primitiveNode.name, method,
+                                             
Type.getMethodType(derivativeDesc));
                 classNode.methods.add(method);
 
             }

Modified: 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/analysis/InstructionsTransformer.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/analysis/InstructionsTransformer.java?rev=1392960&r1=1392959&r2=1392960&view=diff
==============================================================================
--- 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/analysis/InstructionsTransformer.java
 (original)
+++ 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/analysis/InstructionsTransformer.java
 Tue Oct  2 15:14:19 2012
@@ -35,12 +35,14 @@ public interface InstructionsTransformer
     /** Get the replacement instructions.
      * @param original original instruction
      * @param methodDifferentiator method differentiator driving this 
transformer
+     * @param dsIndex index of a reference {@link DerivativeStructure 
derivative structure} variable
      * @return replacement instructions
      * @exception DifferentiationException if the method differentiator cannot 
provide
      * a temporary variable
      */
     InsnList getReplacement(AbstractInsnNode original,
-                            MethodDifferentiator methodDifferentiator)
+                            MethodDifferentiator methodDifferentiator,
+                            int dsIndex)
         throws DifferentiationException;
 
 }

Modified: 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/analysis/MethodDifferentiator.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/analysis/MethodDifferentiator.java?rev=1392960&r1=1392959&r2=1392960&view=diff
==============================================================================
--- 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/analysis/MethodDifferentiator.java
 (original)
+++ 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/analysis/MethodDifferentiator.java
 Tue Oct  2 15:14:19 2012
@@ -96,15 +96,6 @@ public class MethodDifferentiator {
         this.successors   = new IdentityHashMap<AbstractInsnNode, 
Set<AbstractInsnNode>>();
     }
 
-    /** Get the index of the input {@link DerivativeStructure derivative 
structure} variable.
-     * @return index of the input {@link DerivativeStructure derivative 
structure} variable
-     */
-    public int getInputDSIndex() {
-        // TODO: this should be improved in the general case,
-        // as we are not sure the variable will always remain at index 1
-        return 1;
-    }
-
     /** Get the name of the derived class.
      * @return name of the derived class
      */
@@ -116,13 +107,16 @@ public class MethodDifferentiator {
      * Differentiate a method.
      * @param primitiveName primitive class name
      * @param method method to differentiate (<em>will</em> be modified)
+     * @param derivedMethodType type of the derived method
      * @exception DifferentiationException if method cannot be differentiated
      */
-    public void differentiate(final String primitiveName, final MethodNode 
method)
+    public void differentiate(final String primitiveName, final MethodNode 
method,
+                              final Type derivedMethodType)
         throws DifferentiationException {
         try {
 
-            final Type dsType = Type.getType(DerivativeStructure.class);
+            final int     dsIndex  = method.maxLocals;
+            final boolean isStatic = (method.access & Opcodes.ACC_STATIC) != 0;
 
             // analyze the original code, tracing values production/consumption
             final FlowAnalyzer analyzer =
@@ -150,7 +144,7 @@ public class MethodDifferentiator {
                 for (final Iterator<AbstractInsnNode> i = 
method.instructions.iterator(); i.hasNext();) {
                     final AbstractInsnNode insn = i.next();
                     if (insn.getOpcode() == Opcodes.DRETURN) {
-                        final InsnList list = new 
DReturnTransformer(false).getReplacement(insn, this);
+                        final InsnList list = new 
DReturnTransformer(false).getReplacement(insn, this, dsIndex);
                         method.instructions.insert(insn, list);
                         method.instructions.remove(insn);
                     }
@@ -160,7 +154,7 @@ public class MethodDifferentiator {
 
                 // perform the code changes
                 for (final AbstractInsnNode insn : changes) {
-                    method.instructions.insert(insn, getReplacement(insn));
+                    method.instructions.insert(insn, getReplacement(insn, 
method.maxLocals));
                     method.instructions.remove(insn);
                 }
 
@@ -171,9 +165,13 @@ public class MethodDifferentiator {
 
             }
 
+            // insert the preservation of the reference derivative structure
+            
method.instructions.insert(preserveReferenceDerivativeStructure(derivedMethodType,
 isStatic, dsIndex));
+
             // set the method properties
-            method.desc    = Type.getMethodDescriptor(dsType, dsType);
-            method.access |= Opcodes.ACC_SYNTHETIC;
+            method.desc      = derivedMethodType.getDescriptor();
+            method.access   |= Opcodes.ACC_SYNTHETIC;
+            method.maxLocals = dsIndex + 1;
 
         } catch (AnalyzerException ae) {
             ae.printStackTrace(System.err);
@@ -325,60 +323,61 @@ public class MethodDifferentiator {
 
     /** Get the replacement list for an instruction.
      * @param insn instruction to replace
+     * @param dsIndex index of a reference {@link DerivativeStructure 
derivative structure} variable
      * @return replacement instructions list
      * @exception DifferentiationException if some instruction cannot be 
handled
      */
-    private InsnList getReplacement(final AbstractInsnNode insn)
+    private InsnList getReplacement(final AbstractInsnNode insn, final int 
dsIndex)
         throws DifferentiationException {
 
         switch(insn.getOpcode()) {
             case Opcodes.DLOAD :
-                return new DLoadTransformer().getReplacement(insn, this);
+                return new DLoadTransformer().getReplacement(insn, this, 
dsIndex);
             case Opcodes.DALOAD :
                 // TODO: add support for DALOAD differentiation
                 throw new RuntimeException("DALOAD not handled yet");
             case Opcodes.DSTORE :
-                return new DStoreTransformer().getReplacement(insn, this);
+                return new DStoreTransformer().getReplacement(insn, this, 
dsIndex);
             case Opcodes.DASTORE :
                 // TODO: add support for DASTORE differentiation
                 throw new RuntimeException("DASTORE not handled yet");
             case Opcodes.DUP2 :
-                return new Dup2Transformer().getReplacement(insn, this);
+                return new Dup2Transformer().getReplacement(insn, this, 
dsIndex);
             case Opcodes.POP2 :
-                return new Pop2Transformer().getReplacement(insn, this);
+                return new Pop2Transformer().getReplacement(insn, this, 
dsIndex);
             case Opcodes.DUP2_X1 :
-                return new Dup2X1Transformer().getReplacement(insn, this);
+                return new Dup2X1Transformer().getReplacement(insn, this, 
dsIndex);
             case Opcodes.DUP2_X2 :
-                return new Dup2X2Transformer().getReplacement(insn, this);
+                return new Dup2X2Transformer().getReplacement(insn, this, 
dsIndex);
             case Opcodes.DADD :
-                return new DAddTransformer().getReplacement(insn, this);
+                return new DAddTransformer().getReplacement(insn, this, 
dsIndex);
             case Opcodes.DSUB :
-                return new DSubTransformer().getReplacement(insn, this);
+                return new DSubTransformer().getReplacement(insn, this, 
dsIndex);
             case Opcodes.DMUL :
-                return new DMulTransformer().getReplacement(insn, this);
+                return new DMulTransformer().getReplacement(insn, this, 
dsIndex);
             case Opcodes.DDIV :
-                return new DDivTransformer().getReplacement(insn, this);
+                return new DDivTransformer().getReplacement(insn, this, 
dsIndex);
             case Opcodes.DREM :
-                return new DRemTransformer().getReplacement(insn, this);
+                return new DRemTransformer().getReplacement(insn, this, 
dsIndex);
             case Opcodes.DNEG :
-                return new DNegTransformer().getReplacement(insn, this);
+                return new DNegTransformer().getReplacement(insn, this, 
dsIndex);
             case Opcodes.DCONST_0 :
             case Opcodes.DCONST_1 :
             case Opcodes.LDC :
             case Opcodes.I2D :
             case Opcodes.L2D :
             case Opcodes.F2D :
-                return new WideningTransformer().getReplacement(insn, this);
+                return new WideningTransformer().getReplacement(insn, this, 
dsIndex);
             case Opcodes.D2I :
             case Opcodes.D2L :
             case Opcodes.D2F :
-                return new NarrowingTransformer().getReplacement(insn, this);
+                return new NarrowingTransformer().getReplacement(insn, this, 
dsIndex);
             case Opcodes.DCMPL :
             case Opcodes.DCMPG :
-                return new DcmpTransformer().getReplacement(insn, this);
+                return new DcmpTransformer().getReplacement(insn, this, 
dsIndex);
             case Opcodes.DRETURN :
                 // TODO: the constructor parameter forced to true seems 
strange...
-                return new DReturnTransformer(true).getReplacement(insn, this);
+                return new DReturnTransformer(true).getReplacement(insn, this, 
dsIndex);
             case Opcodes.GETSTATIC :
                 // TODO: add support for GETSTATIC differentiation
                 throw new RuntimeException("GETSTATIC not handled yet");
@@ -386,7 +385,7 @@ public class MethodDifferentiator {
                 // TODO: add support for PUTSTATIC differentiation
                 throw new RuntimeException("PUTSTATIC not handled yet");
             case Opcodes.GETFIELD :
-                return new GetFieldTransformer().getReplacement(insn, this);
+                return new GetFieldTransformer().getReplacement(insn, this, 
dsIndex);
             case Opcodes.PUTFIELD :
                 // TODO: add support for PUTFIELD differentiation
                 throw new RuntimeException("PUTFIELD not handled yet");
@@ -397,7 +396,7 @@ public class MethodDifferentiator {
                 // TODO: add support for INVOKESPECIAL differentiation
                 throw new RuntimeException("INVOKESPECIAL not handled yet");
             case Opcodes.INVOKESTATIC :
-                return new InvokeStaticTransformer().getReplacement(insn, 
this);
+                return new InvokeStaticTransformer().getReplacement(insn, 
this, dsIndex);
             case Opcodes.INVOKEINTERFACE :
                 // TODO: add support for INVOKEINTERFACE differentiation
                 throw new RuntimeException("INVOKEINTERFACE not handled yet");
@@ -427,10 +426,40 @@ public class MethodDifferentiator {
         return mathClasses.contains(name);
     }
 
+    /** Create instructions to preserve a reference {@link 
DerivativeStructure} variable.
+     * @param derivedMethodType type of the derived method
+     * @param isStatic if true, the method is a static method
+     * @param dsIndex index of the reference {@link DerivativeStructure 
derivative structure} variable
+     * @return list of conversion instructions
+     */
+    public InsnList preserveReferenceDerivativeStructure(final Type 
derivedMethodType,
+                                                         final boolean 
isStatic, final int dsIndex) {
+
+        final Type dsType = Type.getType(DerivativeStructure.class);
+        final Type[] parameterTypes = derivedMethodType.getArgumentTypes();
+        for (int i = 0; i < parameterTypes.length; ++i) {
+            if (parameterTypes[i].equals(dsType)) {
+                // we have found the first derivative structure parameter
+
+                // preserve the parameter as a new variable
+                final InsnList list = new InsnList();
+                list.add(new VarInsnNode(Opcodes.ALOAD, isStatic ? i : (i + 
1)));
+                list.add(new VarInsnNode(Opcodes.ASTORE, dsIndex));
+                return list;
+            }
+
+        }
+
+        // this should never happen as we build class that do use 
DerivativeStructure
+        throw DifferentiationException.createInternalError(null);
+
+    }
+
     /** Create instructions to convert a double on top of stack to a {@link 
DerivativeStructure}.
+     * @param dsIndex index of a reference {@link DerivativeStructure 
derivative structure} variable
      * @return list of conversion instructions
      */
-    public InsnList doubleToDerivativeStructureConversion() {
+    public InsnList doubleToDerivativeStructureConversion(final int dsIndex) {
 
         final InsnList list = new InsnList();
 
@@ -440,7 +469,7 @@ public class MethodDifferentiator {
         list.add(new InsnNode(Opcodes.DUP_X2));                                
      // => y_ds d y_ds
         list.add(new InsnNode(Opcodes.DUP_X2));                                
      // => y_ds y_ds d y_ds
         list.add(new InsnNode(Opcodes.POP));                                   
      // => y_ds y_ds d
-        list.add(new VarInsnNode(Opcodes.ALOAD, getInputDSIndex()));           
      // => y_ds y_ds d x_ds
+        list.add(new VarInsnNode(Opcodes.ALOAD, dsIndex));                     
      // => y_ds y_ds d x_ds
         list.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL,
                                     
Type.getInternalName(DerivativeStructure.class),
                                     "getFreeParameters",

Modified: 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/arithmetic/DAddTransformer.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/arithmetic/DAddTransformer.java?rev=1392960&r1=1392959&r2=1392960&view=diff
==============================================================================
--- 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/arithmetic/DAddTransformer.java
 (original)
+++ 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/arithmetic/DAddTransformer.java
 Tue Oct  2 15:14:19 2012
@@ -36,7 +36,8 @@ public class DAddTransformer implements 
 
     /** {@inheritDoc} */
     public InsnList getReplacement(final AbstractInsnNode insn,
-                                   final MethodDifferentiator 
methodDifferentiator)
+                                   final MethodDifferentiator 
methodDifferentiator,
+                                   final int dsIndex)
         throws DifferentiationException {
 
         final InsnList list = new InsnList();

Modified: 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/arithmetic/DDivTransformer.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/arithmetic/DDivTransformer.java?rev=1392960&r1=1392959&r2=1392960&view=diff
==============================================================================
--- 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/arithmetic/DDivTransformer.java
 (original)
+++ 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/arithmetic/DDivTransformer.java
 Tue Oct  2 15:14:19 2012
@@ -42,7 +42,8 @@ public class DDivTransformer implements 
 
     /** {@inheritDoc} */
     public InsnList getReplacement(final AbstractInsnNode insn,
-                                   final MethodDifferentiator 
methodDifferentiator)
+                                   final MethodDifferentiator 
methodDifferentiator,
+                                   final int dsIndex)
         throws DifferentiationException {
 
         final InsnList list = new InsnList();

Modified: 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/arithmetic/DMulTransformer.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/arithmetic/DMulTransformer.java?rev=1392960&r1=1392959&r2=1392960&view=diff
==============================================================================
--- 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/arithmetic/DMulTransformer.java
 (original)
+++ 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/arithmetic/DMulTransformer.java
 Tue Oct  2 15:14:19 2012
@@ -36,7 +36,8 @@ public class DMulTransformer implements 
 
     /** {@inheritDoc} */
     public InsnList getReplacement(final AbstractInsnNode insn,
-                                   final MethodDifferentiator 
methodDifferentiator)
+                                   final MethodDifferentiator 
methodDifferentiator,
+                                   final int dsIndex)
         throws DifferentiationException {
 
         final InsnList list = new InsnList();

Modified: 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/arithmetic/DNegTransformer.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/arithmetic/DNegTransformer.java?rev=1392960&r1=1392959&r2=1392960&view=diff
==============================================================================
--- 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/arithmetic/DNegTransformer.java
 (original)
+++ 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/arithmetic/DNegTransformer.java
 Tue Oct  2 15:14:19 2012
@@ -38,7 +38,8 @@ public class DNegTransformer implements 
 
     /** {@inheritDoc} */
     public InsnList getReplacement(final AbstractInsnNode insn,
-                                   final MethodDifferentiator 
methodDifferentiator)
+                                   final MethodDifferentiator 
methodDifferentiator,
+                                   final int dsIndex)
         throws DifferentiationException {
 
         final InsnList list = new InsnList();

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=1392960&r1=1392959&r2=1392960&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
 Tue Oct  2 15:14:19 2012
@@ -48,7 +48,8 @@ public class DRemTransformer implements 
 
     /** {@inheritDoc} */
     public InsnList getReplacement(final AbstractInsnNode insn,
-                                   final MethodDifferentiator 
methodDifferentiator)
+                                   final MethodDifferentiator 
methodDifferentiator,
+                                   final int dsIndex)
         throws DifferentiationException {
 
         final InsnList list = new InsnList();

Modified: 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/arithmetic/DSubTransformer.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/arithmetic/DSubTransformer.java?rev=1392960&r1=1392959&r2=1392960&view=diff
==============================================================================
--- 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/arithmetic/DSubTransformer.java
 (original)
+++ 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/arithmetic/DSubTransformer.java
 Tue Oct  2 15:14:19 2012
@@ -39,7 +39,8 @@ public class DSubTransformer implements 
 
     /** {@inheritDoc} */
     public InsnList getReplacement(final AbstractInsnNode insn,
-                                   final MethodDifferentiator 
methodDifferentiator)
+                                   final MethodDifferentiator 
methodDifferentiator,
+                                   final int dsIndex)
         throws DifferentiationException {
 
         final InsnList list = new InsnList();

Modified: 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/DLoadTransformer.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/DLoadTransformer.java?rev=1392960&r1=1392959&r2=1392960&view=diff
==============================================================================
--- 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/DLoadTransformer.java
 (original)
+++ 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/DLoadTransformer.java
 Tue Oct  2 15:14:19 2012
@@ -40,7 +40,8 @@ public class DLoadTransformer implements
 
     /** {@inheritDoc} */
     public InsnList getReplacement(final AbstractInsnNode insn,
-                                   final MethodDifferentiator 
methodDifferentiator)
+                                   final MethodDifferentiator 
methodDifferentiator,
+                                   final int dsIndex)
         throws DifferentiationException {
         final int var = ((VarInsnNode) insn).var;
         final InsnList list = new InsnList();

Modified: 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/DReturnTransformer.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/DReturnTransformer.java?rev=1392960&r1=1392959&r2=1392960&view=diff
==============================================================================
--- 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/DReturnTransformer.java
 (original)
+++ 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/DReturnTransformer.java
 Tue Oct  2 15:14:19 2012
@@ -45,14 +45,15 @@ public class DReturnTransformer implemen
 
     /** {@inheritDoc} */
     public InsnList getReplacement(final AbstractInsnNode insn,
-                                   final MethodDifferentiator 
methodDifferentiator)
+                                   final MethodDifferentiator 
methodDifferentiator,
+                                   final int dsIndex)
         throws DifferentiationException {
 
         final InsnList list = new InsnList();
 
         if (!stack0Converted) {
             // add conversion for top level stack element
-            
list.add(methodDifferentiator.doubleToDerivativeStructureConversion());
+            
list.add(methodDifferentiator.doubleToDerivativeStructureConversion(dsIndex));
         }
 
         // add the return instruction for a reference type

Modified: 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/DStoreTransformer.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/DStoreTransformer.java?rev=1392960&r1=1392959&r2=1392960&view=diff
==============================================================================
--- 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/DStoreTransformer.java
 (original)
+++ 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/DStoreTransformer.java
 Tue Oct  2 15:14:19 2012
@@ -40,7 +40,8 @@ public class DStoreTransformer implement
 
     /** {@inheritDoc} */
     public InsnList getReplacement(final AbstractInsnNode insn,
-                                   final MethodDifferentiator 
methodDifferentiator)
+                                   final MethodDifferentiator 
methodDifferentiator,
+                                   final int dsIndex)
         throws DifferentiationException {
         final int var = ((VarInsnNode) insn).var;
         final InsnList list = new InsnList();

Modified: 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/DcmpTransformer.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/DcmpTransformer.java?rev=1392960&r1=1392959&r2=1392960&view=diff
==============================================================================
--- 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/DcmpTransformer.java
 (original)
+++ 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/DcmpTransformer.java
 Tue Oct  2 15:14:19 2012
@@ -36,7 +36,8 @@ public class DcmpTransformer implements 
 
     /** {@inheritDoc} */
     public InsnList getReplacement(final AbstractInsnNode insn,
-                                   final MethodDifferentiator 
methodDifferentiator)
+                                   final MethodDifferentiator 
methodDifferentiator,
+                                   final int dsIndex)
         throws DifferentiationException {
         final InsnList list = new InsnList();
 

Modified: 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/Dup2Transformer.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/Dup2Transformer.java?rev=1392960&r1=1392959&r2=1392960&view=diff
==============================================================================
--- 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/Dup2Transformer.java
 (original)
+++ 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/Dup2Transformer.java
 Tue Oct  2 15:14:19 2012
@@ -40,7 +40,8 @@ public class Dup2Transformer implements 
 
     /** {@inheritDoc} */
     public InsnList getReplacement(final AbstractInsnNode insn,
-                                   final MethodDifferentiator 
methodDifferentiator)
+                                   final MethodDifferentiator 
methodDifferentiator,
+                                   final int dsIndex)
         throws DifferentiationException {
 
         final InsnList list = new InsnList();

Modified: 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/Dup2X1Transformer.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/Dup2X1Transformer.java?rev=1392960&r1=1392959&r2=1392960&view=diff
==============================================================================
--- 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/Dup2X1Transformer.java
 (original)
+++ 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/Dup2X1Transformer.java
 Tue Oct  2 15:14:19 2012
@@ -40,7 +40,8 @@ public class Dup2X1Transformer implement
 
     /** {@inheritDoc} */
     public InsnList getReplacement(final AbstractInsnNode insn,
-                                   final MethodDifferentiator 
methodDifferentiator)
+                                   final MethodDifferentiator 
methodDifferentiator,
+                                   final int dsIndex)
         throws DifferentiationException {
 
         final InsnList list = new InsnList();

Modified: 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/Dup2X2Transformer.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/Dup2X2Transformer.java?rev=1392960&r1=1392959&r2=1392960&view=diff
==============================================================================
--- 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/Dup2X2Transformer.java
 (original)
+++ 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/Dup2X2Transformer.java
 Tue Oct  2 15:14:19 2012
@@ -31,7 +31,8 @@ public class Dup2X2Transformer implement
 
     /** {@inheritDoc} */
     public InsnList getReplacement(final AbstractInsnNode insn,
-                                   final MethodDifferentiator 
methodDifferentiator)
+                                   final MethodDifferentiator 
methodDifferentiator,
+                                   final int dsIndex)
         throws DifferentiationException {
 
         final InsnList list = new InsnList();

Modified: 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/GetFieldTransformer.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/GetFieldTransformer.java?rev=1392960&r1=1392959&r2=1392960&view=diff
==============================================================================
--- 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/GetFieldTransformer.java
 (original)
+++ 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/GetFieldTransformer.java
 Tue Oct  2 15:14:19 2012
@@ -44,7 +44,8 @@ public class GetFieldTransformer impleme
 
     /** {@inheritDoc} */
     public InsnList getReplacement(final AbstractInsnNode insn,
-                                   final MethodDifferentiator 
methodDifferentiator)
+                                   final MethodDifferentiator 
methodDifferentiator,
+                                   final int dsIndex)
         throws DifferentiationException {
 
         final FieldInsnNode fieldInsn = (FieldInsnNode) insn;

Modified: 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/InvokeStaticTransformer.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/InvokeStaticTransformer.java?rev=1392960&r1=1392959&r2=1392960&view=diff
==============================================================================
--- 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/InvokeStaticTransformer.java
 (original)
+++ 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/InvokeStaticTransformer.java
 Tue Oct  2 15:14:19 2012
@@ -35,7 +35,8 @@ public class InvokeStaticTransformer imp
 
     /** {@inheritDoc} */
     public InsnList getReplacement(final AbstractInsnNode insn,
-                                   final MethodDifferentiator 
methodDifferentiator)
+                                   final MethodDifferentiator 
methodDifferentiator,
+                                   final int dsIndex)
         throws DifferentiationException {
 
         final MethodInsnNode methodInsn = (MethodInsnNode) insn;
@@ -82,10 +83,10 @@ public class InvokeStaticTransformer imp
                 } else {
 
                     // initial stack state: x, ds_y
-                    list.add(new InsnNode(Opcodes.DUP_X2));                    
             // => ds_y, x, ds_y
-                    list.add(new InsnNode(Opcodes.POP));                       
             // => ds_y, x
-                    
list.add(methodDifferentiator.doubleToDerivativeStructureConversion()); // => 
ds_y, ds_x
-                    list.add(new InsnNode(Opcodes.SWAP));                      
             // => ds_x, ds_y
+                    list.add(new InsnNode(Opcodes.DUP_X2));                    
                    // => ds_y, x, ds_y
+                    list.add(new InsnNode(Opcodes.POP));                       
                    // => ds_y, x
+                    
list.add(methodDifferentiator.doubleToDerivativeStructureConversion(dsIndex)); 
// => ds_y, ds_x
+                    list.add(new InsnNode(Opcodes.SWAP));                      
                    // => ds_x, ds_y
 
                     // call the static two parameters method for 
DerivativeStructure
                     list.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL,
@@ -98,14 +99,14 @@ public class InvokeStaticTransformer imp
                 if (methodDifferentiator.stackElementIsConverted(insn, 1)) {
                     if (!methodDifferentiator.stackElementIsConverted(insn, 
0)) {
                         // the top level element is not a DerivativeStructure, 
convert it
-                        
list.add(methodDifferentiator.doubleToDerivativeStructureConversion());
+                        
list.add(methodDifferentiator.doubleToDerivativeStructureConversion(dsIndex));
                     }
                 } else {
                     // initial stack state: x, ds_y
-                    list.add(new InsnNode(Opcodes.DUP_X2));                    
             // => ds_y, x, ds_y
-                    list.add(new InsnNode(Opcodes.POP));                       
             // => ds_y, x
-                    
list.add(methodDifferentiator.doubleToDerivativeStructureConversion()); // => 
ds_y, ds_x
-                    list.add(new InsnNode(Opcodes.SWAP));                      
             // => ds_x, ds_y
+                    list.add(new InsnNode(Opcodes.DUP_X2));                    
                    // => ds_y, x, ds_y
+                    list.add(new InsnNode(Opcodes.POP));                       
                    // => ds_y, x
+                    
list.add(methodDifferentiator.doubleToDerivativeStructureConversion(dsIndex)); 
// => ds_y, ds_x
+                    list.add(new InsnNode(Opcodes.SWAP));                      
                    // => ds_x, ds_y
                 }
 
                 // call the static two parameters method for 
DerivativeStructure

Modified: 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/NarrowingTransformer.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/NarrowingTransformer.java?rev=1392960&r1=1392959&r2=1392960&view=diff
==============================================================================
--- 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/NarrowingTransformer.java
 (original)
+++ 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/NarrowingTransformer.java
 Tue Oct  2 15:14:19 2012
@@ -39,7 +39,8 @@ public class NarrowingTransformer implem
 
     /** {@inheritDoc} */
     public InsnList getReplacement(final AbstractInsnNode insn,
-                                   final MethodDifferentiator 
methodDifferentiator)
+                                   final MethodDifferentiator 
methodDifferentiator,
+                                   final int dsIndex)
         throws DifferentiationException {
 
         final InsnList list = new InsnList();

Modified: 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/Pop2Transformer.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/Pop2Transformer.java?rev=1392960&r1=1392959&r2=1392960&view=diff
==============================================================================
--- 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/Pop2Transformer.java
 (original)
+++ 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/Pop2Transformer.java
 Tue Oct  2 15:14:19 2012
@@ -40,7 +40,8 @@ public class Pop2Transformer implements 
 
     /** {@inheritDoc} */
     public InsnList getReplacement(final AbstractInsnNode insn,
-                                   final MethodDifferentiator 
methodDifferentiator)
+                                   final MethodDifferentiator 
methodDifferentiator,
+                                   final int dsIndex)
         throws DifferentiationException {
 
         final InsnList list = new InsnList();

Modified: 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/WideningTransformer.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/WideningTransformer.java?rev=1392960&r1=1392959&r2=1392960&view=diff
==============================================================================
--- 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/WideningTransformer.java
 (original)
+++ 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/WideningTransformer.java
 Tue Oct  2 15:14:19 2012
@@ -16,19 +16,14 @@
  */
 package org.apache.commons.nabla.forward.instructions;
 
-import org.apache.commons.math3.analysis.differentiation.DerivativeStructure;
 import org.apache.commons.nabla.DifferentiationException;
 import org.apache.commons.nabla.forward.analysis.InstructionsTransformer;
 import org.apache.commons.nabla.forward.analysis.MethodDifferentiator;
 import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
 import org.objectweb.asm.tree.AbstractInsnNode;
 import org.objectweb.asm.tree.InsnList;
 import org.objectweb.asm.tree.InsnNode;
 import org.objectweb.asm.tree.LdcInsnNode;
-import org.objectweb.asm.tree.MethodInsnNode;
-import org.objectweb.asm.tree.TypeInsnNode;
-import org.objectweb.asm.tree.VarInsnNode;
 
 /** Differentiation transformer for promoting a double on the stack
  * to a derivative structure.
@@ -43,7 +38,8 @@ public class WideningTransformer impleme
 
     /** {@inheritDoc} */
     public InsnList getReplacement(final AbstractInsnNode insn,
-                                   final MethodDifferentiator 
methodDifferentiator)
+                                   final MethodDifferentiator 
methodDifferentiator,
+                                   final int dsIndex)
         throws DifferentiationException {
 
         final InsnList list = new InsnList();
@@ -55,31 +51,8 @@ public class WideningTransformer impleme
             list.add(new InsnNode(insn.getOpcode()));
         }
 
-        // operand stack initial state: d
-        list.add(new TypeInsnNode(Opcodes.NEW,
-                                  
Type.getInternalName(DerivativeStructure.class)));      // => d y_ds
-        list.add(new InsnNode(Opcodes.DUP_X2));                                
           // => y_ds d y_ds
-        list.add(new InsnNode(Opcodes.DUP_X2));                                
           // => y_ds y_ds d y_ds
-        list.add(new InsnNode(Opcodes.POP));                                   
           // => y_ds y_ds d
-        list.add(new VarInsnNode(Opcodes.ALOAD, 
methodDifferentiator.getInputDSIndex())); // => y_ds y_ds d x_ds
-        list.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL,
-                                    
Type.getInternalName(DerivativeStructure.class),
-                                    "getFreeParameters",
-                                    Type.getMethodDescriptor(Type.INT_TYPE))); 
           // => y_ds y_ds d params
-        list.add(new VarInsnNode(Opcodes.ALOAD, 1));                           
           // => y_ds y_ds d params x_ds
-        list.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL,
-                                    
Type.getInternalName(DerivativeStructure.class),
-                                    "getOrder",
-                                    Type.getMethodDescriptor(Type.INT_TYPE))); 
           // => y_ds y_ds d params order
-        list.add(new InsnNode(Opcodes.DUP2_X2));                               
           // => y_ds y_ds params order d params order
-        list.add(new InsnNode(Opcodes.POP2));                                  
           // => y_ds y_ds params order d
-        list.add(new MethodInsnNode(Opcodes.INVOKESPECIAL,
-                                    
Type.getInternalName(DerivativeStructure.class),
-                                    "<init>",
-                                    Type.getMethodDescriptor(Type.VOID_TYPE,
-                                                             Type.INT_TYPE,
-                                                             Type.INT_TYPE,
-                                                             
Type.DOUBLE_TYPE)));         // => y_ds
+        // convert the double element
+        
list.add(methodDifferentiator.doubleToDerivativeStructureConversion(dsIndex));
 
         return list;
 


Reply via email to