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/10/02 13:19:34 UTC
svn commit: r1392842 - in
/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward:
analysis/ arithmetic/ instructions/
Author: luc
Date: Tue Oct 2 11:19:33 2012
New Revision: 1392842
URL: http://svn.apache.org/viewvc?rev=1392842&view=rev
Log:
Allow instruction transformers to check conversion of any stack cell.
Modified:
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/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/DcmpTransformer.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/InvokeStaticTransformer.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=1392842&r1=1392841&r2=1392842&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 11:19:33 2012
@@ -300,21 +300,31 @@ public class MethodDifferentiator {
}
+ /** Check if a stack element has been converted to {@link DerivativeStructure}.
+ * @param insn current instruction
+ * @param index index of the stack element, 0 corresponding to top stack cell
+ * @return true if stack element has been converted to {@link DerivativeStructure}
+ */
+ public boolean stackElementIsConverted(final AbstractInsnNode insn, final int index) {
+
+ // get the frame at the start of the instruction
+ final Frame<TrackingValue> frame = frames.get(insn);
+
+ // get stack size
+ final int size = frame.getStackSize();
+
+ return converted.contains(frame.getStack(size - (index + 1)));
+
+ }
+
/** Get the replacement list for an instruction.
* @param insn instruction to replace
* @return replacement instructions list
* @exception DifferentiationException if some instruction cannot be handled
- * or if no temporary variable can be reserved
*/
private InsnList getReplacement(final AbstractInsnNode insn)
throws DifferentiationException {
- // get the frame at the start of the instruction
- final Frame<TrackingValue> frame = frames.get(insn);
- final int size = frame.getStackSize();
- final boolean stack1Converted = (size > 0) && converted.contains(frame.getStack(size - 2));
- final boolean stack0Converted = (size > 1) && converted.contains(frame.getStack(size - 1));
-
switch(insn.getOpcode()) {
case Opcodes.DLOAD :
return new DLoadTransformer().getReplacement(insn, this);
@@ -333,17 +343,17 @@ public class MethodDifferentiator {
case Opcodes.DUP2_X1 :
return new Dup2X1Transformer().getReplacement(insn, this);
case Opcodes.DUP2_X2 :
- return new Dup2X2Transformer(stack0Converted, stack1Converted).getReplacement(insn, this);
+ return new Dup2X2Transformer().getReplacement(insn, this);
case Opcodes.DADD :
- return new DAddTransformer(stack0Converted, stack1Converted).getReplacement(insn, this);
+ return new DAddTransformer().getReplacement(insn, this);
case Opcodes.DSUB :
- return new DSubTransformer(stack0Converted, stack1Converted).getReplacement(insn, this);
+ return new DSubTransformer().getReplacement(insn, this);
case Opcodes.DMUL :
- return new DMulTransformer(stack0Converted, stack1Converted).getReplacement(insn, this);
+ return new DMulTransformer().getReplacement(insn, this);
case Opcodes.DDIV :
- return new DDivTransformer(stack0Converted, stack1Converted).getReplacement(insn, this);
+ return new DDivTransformer().getReplacement(insn, this);
case Opcodes.DREM :
- return new DRemTransformer(stack0Converted, stack1Converted).getReplacement(insn, this);
+ return new DRemTransformer().getReplacement(insn, this);
case Opcodes.DNEG :
return new DNegTransformer().getReplacement(insn, this);
case Opcodes.DCONST_0 :
@@ -359,7 +369,7 @@ public class MethodDifferentiator {
return new NarrowingTransformer().getReplacement(insn, this);
case Opcodes.DCMPL :
case Opcodes.DCMPG :
- return new DcmpTransformer(stack0Converted, stack1Converted).getReplacement(insn, this);
+ return new DcmpTransformer().getReplacement(insn, this);
case Opcodes.DRETURN :
// TODO: the constructor parameter forced to true seems strange...
return new DReturnTransformer(true).getReplacement(insn, this);
@@ -381,7 +391,7 @@ public class MethodDifferentiator {
// TODO: add support for INVOKESPECIAL differentiation
throw new RuntimeException("INVOKESPECIAL not handled yet");
case Opcodes.INVOKESTATIC :
- return new InvokeStaticTransformer(stack0Converted, stack1Converted).getReplacement(insn, this);
+ return new InvokeStaticTransformer().getReplacement(insn, this);
case Opcodes.INVOKEINTERFACE :
// TODO: add support for INVOKEINTERFACE differentiation
throw new RuntimeException("INVOKEINTERFACE not handled yet");
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=1392842&r1=1392841&r2=1392842&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 11:19:33 2012
@@ -34,21 +34,6 @@ public class DAddTransformer implements
/** Name of the {@link org.apache.commons.math3.analysis.differentiation.DerivativeStructure} method corresponding to the addition. */
private static final String ADD_METHOD = "add";
- /** Indicator for top stack element conversion. */
- private final boolean stack0Converted;
-
- /** Indicator for next to top stack element conversion. */
- private final boolean stack1Converted;
-
- /** Simple constructor.
- * @param stack0Converted if true, the top level stack element has already been converted
- * @param stack1Converted if true, the next to top level stack element has already been converted
- */
- public DAddTransformer(final boolean stack0Converted, final boolean stack1Converted) {
- this.stack0Converted = stack0Converted;
- this.stack1Converted = stack1Converted;
- }
-
/** {@inheritDoc} */
public InsnList getReplacement(final AbstractInsnNode insn,
final MethodDifferentiator methodDifferentiator)
@@ -56,8 +41,8 @@ public class DAddTransformer implements
final InsnList list = new InsnList();
- if (stack1Converted) {
- if (stack0Converted) {
+ if (methodDifferentiator.stackElementIsConverted(insn, 1)) {
+ if (methodDifferentiator.stackElementIsConverted(insn, 0)) {
list.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, DS_TYPE.getInternalName(),
ADD_METHOD,
Type.getMethodDescriptor(DS_TYPE, DS_TYPE)));
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=1392842&r1=1392841&r2=1392842&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 11:19:33 2012
@@ -40,21 +40,6 @@ public class DDivTransformer implements
/** Name of the {@link org.apache.commons.math3.analysis.differentiation.DerivativeStructure} method corresponding to the multiplication. */
private static final String MULTIPLY_METHOD = "multiply";
- /** Indicator for top stack element conversion. */
- private final boolean stack0Converted;
-
- /** Indicator for next to top stack element conversion. */
- private final boolean stack1Converted;
-
- /** Simple constructor.
- * @param stack0Converted if true, the top level stack element has already been converted
- * @param stack1Converted if true, the next to top level stack element has already been converted
- */
- public DDivTransformer(final boolean stack0Converted, final boolean stack1Converted) {
- this.stack0Converted = stack0Converted;
- this.stack1Converted = stack1Converted;
- }
-
/** {@inheritDoc} */
public InsnList getReplacement(final AbstractInsnNode insn,
final MethodDifferentiator methodDifferentiator)
@@ -62,8 +47,8 @@ public class DDivTransformer implements
final InsnList list = new InsnList();
- if (stack1Converted) {
- if (stack0Converted) {
+ if (methodDifferentiator.stackElementIsConverted(insn, 1)) {
+ if (methodDifferentiator.stackElementIsConverted(insn, 0)) {
list.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, DS_TYPE.getInternalName(),
DIVIDE_METHOD,
Type.getMethodDescriptor(DS_TYPE, DS_TYPE)));
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=1392842&r1=1392841&r2=1392842&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 11:19:33 2012
@@ -34,21 +34,6 @@ public class DMulTransformer implements
/** Name of the {@link org.apache.commons.math3.analysis.differentiation.DerivativeStructure} method corresponding to the multiplication. */
private static final String MULTIPLY_METHOD = "multiply";
- /** Indicator for top stack element conversion. */
- private final boolean stack0Converted;
-
- /** Indicator for next to top stack element conversion. */
- private final boolean stack1Converted;
-
- /** Simple constructor.
- * @param stack0Converted if true, the top level stack element has already been converted
- * @param stack1Converted if true, the next to top level stack element has already been converted
- */
- public DMulTransformer(final boolean stack0Converted, final boolean stack1Converted) {
- this.stack0Converted = stack0Converted;
- this.stack1Converted = stack1Converted;
- }
-
/** {@inheritDoc} */
public InsnList getReplacement(final AbstractInsnNode insn,
final MethodDifferentiator methodDifferentiator)
@@ -56,8 +41,8 @@ public class DMulTransformer implements
final InsnList list = new InsnList();
- if (stack1Converted) {
- if (stack0Converted) {
+ if (methodDifferentiator.stackElementIsConverted(insn, 1)) {
+ if (methodDifferentiator.stackElementIsConverted(insn, 0)) {
list.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, DS_TYPE.getInternalName(),
MULTIPLY_METHOD,
Type.getMethodDescriptor(DS_TYPE, DS_TYPE)));
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=1392842&r1=1392841&r2=1392842&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 11:19:33 2012
@@ -46,21 +46,6 @@ public class DRemTransformer implements
/** Name of the {@link org.apache.commons.math3.analysis.differentiation.DerivativeStructure} method corresponding to the negation. */
private static final String NEGATE_METHOD = "negate";
- /** Indicator for top stack element conversion. */
- private final boolean stack0Converted;
-
- /** Indicator for next to top stack element conversion. */
- private final boolean stack1Converted;
-
- /** Simple constructor.
- * @param stack0Converted if true, the top level stack element has already been converted
- * @param stack1Converted if true, the next to top level stack element has already been converted
- */
- public DRemTransformer(final boolean stack0Converted, final boolean stack1Converted) {
- this.stack0Converted = stack0Converted;
- this.stack1Converted = stack1Converted;
- }
-
/** {@inheritDoc} */
public InsnList getReplacement(final AbstractInsnNode insn,
final MethodDifferentiator methodDifferentiator)
@@ -68,8 +53,8 @@ public class DRemTransformer implements
final InsnList list = new InsnList();
- if (stack1Converted) {
- if (stack0Converted) {
+ if (methodDifferentiator.stackElementIsConverted(insn, 1)) {
+ if (methodDifferentiator.stackElementIsConverted(insn, 0)) {
list.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, DS_TYPE.getInternalName(),
REMAINDER_METHOD,
Type.getMethodDescriptor(DS_TYPE, DS_TYPE)));
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=1392842&r1=1392841&r2=1392842&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 11:19:33 2012
@@ -37,21 +37,6 @@ public class DSubTransformer implements
/** Name of the {@link org.apache.commons.math3.analysis.differentiation.DerivativeStructure} method corresponding to the negation. */
private static final String NEGATE_METHOD = "negate";
- /** Indicator for top stack element conversion. */
- private final boolean stack0Converted;
-
- /** Indicator for next to top stack element conversion. */
- private final boolean stack1Converted;
-
- /** Simple constructor.
- * @param stack0Converted if true, the top level stack element has already been converted
- * @param stack1Converted if true, the next to top level stack element has already been converted
- */
- public DSubTransformer(final boolean stack0Converted, final boolean stack1Converted) {
- this.stack0Converted = stack0Converted;
- this.stack1Converted = stack1Converted;
- }
-
/** {@inheritDoc} */
public InsnList getReplacement(final AbstractInsnNode insn,
final MethodDifferentiator methodDifferentiator)
@@ -59,8 +44,8 @@ public class DSubTransformer implements
final InsnList list = new InsnList();
- if (stack1Converted) {
- if (stack0Converted) {
+ if (methodDifferentiator.stackElementIsConverted(insn, 1)) {
+ if (methodDifferentiator.stackElementIsConverted(insn, 0)) {
list.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, DS_TYPE.getInternalName(),
SUBTRACT_METHOD,
Type.getMethodDescriptor(DS_TYPE, DS_TYPE)));
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=1392842&r1=1392841&r2=1392842&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 11:19:33 2012
@@ -34,29 +34,14 @@ public class DcmpTransformer implements
/** Name of the {@link org.apache.commons.math3.analysis.differentiation.DerivativeStructure} method corresponding to the value getter. */
private static final String VALUE_GETTER_METHOD = "getValue";
- /** Indicator for top stack element conversion. */
- private final boolean stack0Converted;
-
- /** Indicator for next to top stack element conversion. */
- private final boolean stack1Converted;
-
- /** Simple constructor.
- * @param stack0Converted if true, the top level stack element has already been converted
- * @param stack1Converted if true, the next to top level stack element has already been converted
- */
- public DcmpTransformer(final boolean stack0Converted, final boolean stack1Converted) {
- this.stack0Converted = stack0Converted;
- this.stack1Converted = stack1Converted;
- }
-
/** {@inheritDoc} */
public InsnList getReplacement(final AbstractInsnNode insn,
final MethodDifferentiator methodDifferentiator)
throws DifferentiationException {
final InsnList list = new InsnList();
- if (stack1Converted) {
- if (stack0Converted) {
+ if (methodDifferentiator.stackElementIsConverted(insn, 1)) {
+ if (methodDifferentiator.stackElementIsConverted(insn, 0)) {
// operand stack initial state: ds_a, ds_b
list.add(new InsnNode(Opcodes.SWAP)); // => ds_b, ds_a
list.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, DS_TYPE.getInternalName(),
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=1392842&r1=1392841&r2=1392842&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 11:19:33 2012
@@ -29,21 +29,6 @@ import org.objectweb.asm.tree.InsnNode;
*/
public class Dup2X2Transformer implements InstructionsTransformer {
- /** Indicator for top stack element conversion. */
- private final boolean stack0Converted;
-
- /** Indicator for next to top stack element conversion. */
- private final boolean stack1Converted;
-
- /** Simple constructor.
- * @param stack0Converted if true, the top level stack element has already been converted
- * @param stack1Converted if true, the next to top level stack element has already been converted
- */
- public Dup2X2Transformer(final boolean stack0Converted, final boolean stack1Converted) {
- this.stack0Converted = stack0Converted;
- this.stack1Converted = stack1Converted;
- }
-
/** {@inheritDoc} */
public InsnList getReplacement(final AbstractInsnNode insn,
final MethodDifferentiator methodDifferentiator)
@@ -51,8 +36,8 @@ public class Dup2X2Transformer implement
final InsnList list = new InsnList();
- if (stack1Converted) {
- if (stack0Converted) {
+ if (methodDifferentiator.stackElementIsConverted(insn, 1)) {
+ if (methodDifferentiator.stackElementIsConverted(insn, 0)) {
list.add(new InsnNode(Opcodes.DUP_X1));
} else {
list.add(new InsnNode(Opcodes.DUP2_X1));
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=1392842&r1=1392841&r2=1392842&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 11:19:33 2012
@@ -33,21 +33,6 @@ import org.objectweb.asm.tree.MethodInsn
*/
public class InvokeStaticTransformer implements InstructionsTransformer {
- /** Indicator for top stack element conversion. */
- private final boolean stack0Converted;
-
- /** Indicator for next to top stack element conversion. */
- private final boolean stack1Converted;
-
- /** Simple constructor.
- * @param stack0Converted if true, the top level stack element has already been converted
- * @param stack1Converted if true, the next to top level stack element has already been converted
- */
- public InvokeStaticTransformer(final boolean stack0Converted, final boolean stack1Converted) {
- this.stack0Converted = stack0Converted;
- this.stack1Converted = stack1Converted;
- }
-
/** {@inheritDoc} */
public InsnList getReplacement(final AbstractInsnNode insn,
final MethodDifferentiator methodDifferentiator)
@@ -84,15 +69,15 @@ public class InvokeStaticTransformer imp
// special case for pow: in DerivativeStructure, it is an instance method,
// not a static method as the other two parameters functions like atan2 or hypot
- if (stack1Converted) {
- if (!stack0Converted) {
+ if (methodDifferentiator.stackElementIsConverted(insn, 1)) {
+ if (methodDifferentiator.stackElementIsConverted(insn, 0)) {
list.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL,
DS_TYPE.getInternalName(), methodInsn.name,
- Type.getMethodDescriptor(DS_TYPE, Type.DOUBLE_TYPE)));
+ Type.getMethodDescriptor(DS_TYPE, DS_TYPE)));
} else {
list.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL,
DS_TYPE.getInternalName(), methodInsn.name,
- Type.getMethodDescriptor(DS_TYPE, DS_TYPE)));
+ Type.getMethodDescriptor(DS_TYPE, Type.DOUBLE_TYPE)));
}
} else {
@@ -110,8 +95,8 @@ public class InvokeStaticTransformer imp
} else {
- if (stack1Converted) {
- if (!stack0Converted) {
+ if (methodDifferentiator.stackElementIsConverted(insn, 1)) {
+ if (!methodDifferentiator.stackElementIsConverted(insn, 0)) {
// the top level element is not a DerivativeStructure, convert it
list.add(methodDifferentiator.doubleToDerivativeStructureConversion());
}