commons-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From l..@apache.org
Subject svn commit: r1391536 - /commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/analysis/MethodDifferentiator.java
Date Fri, 28 Sep 2012 16:40:50 GMT
Author: luc
Date: Fri Sep 28 16:40:50 2012
New Revision: 1391536

URL: http://svn.apache.org/viewvc?rev=1391536&view=rev
Log:
Update differentiation of constant methods.

Constant methods do not depend on the input parameter.

Modified:
    commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/analysis/MethodDifferentiator.java

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=1391536&r1=1391535&r2=1391536&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
Fri Sep 28 16:40:50 2012
@@ -227,21 +227,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 InsnList();
-                        list.add(new VarInsnNode(Opcodes.ALOAD, 1));
-                        list.add(new MethodInsnNode(Opcodes.INVOKESTATIC,
-                                                    Type.getInternalName(DerivativeStructure.class),
-                                                    "getFreeParameters",
-                                                    Type.getMethodDescriptor(Type.INT_TYPE)));
-                        list.add(new VarInsnNode(Opcodes.ALOAD, 1));
-                        list.add(new MethodInsnNode(Opcodes.INVOKESTATIC,
-                                                    Type.getInternalName(DerivativeStructure.class),
-                                                    "getOrder",
-                                                    Type.getMethodDescriptor(Type.INT_TYPE)));
-                        list.add(new MethodInsnNode(Opcodes.INVOKESTATIC,
-                                                    Type.getInternalName(DerivativeStructure.class),
-                                                    "<init>",
-                                                    Type.getMethodDescriptor(dsType, Type.INT_TYPE,
Type.INT_TYPE)));
+                        final InsnList list = convertDoubleToDerivativeStructure(1);
                         list.add(new InsnNode(Opcodes.ARETURN));
                         method.instructions.insert(insn, list);
                         method.instructions.remove(insn);
@@ -456,6 +442,44 @@ public class MethodDifferentiator {
 
     }
 
+    /** Create an instruction set converting a double into a constant {@link DerivativeStructure}.
+     * @param dsIndex index of the {@link DerivativeStructure} input variable
+     * @return instructions instructions converting the double into a {@link DerivativeStructure}
+     */
+    private InsnList convertDoubleToDerivativeStructure(final int dsIndex) {
+
+        final InsnList list = new InsnList();
+
+        // 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, dsIndex));                            //
=> 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
+
+        return list;
+
+    }
+
     /** Get the replacement list for an instruction.
      * @param insn instruction to replace
      * @return replacement instructions list



Mime
View raw message