Hi Phil,
Le 08/10/2011 23:42, Phil Steitz a écrit :
On 10/8/11 2:24 PM, Luc Maisonobe wrote:
Phil Steitz<phil.ste...@gmail.com> a écrit :
I am getting RTE with message above when I try to run the example
under "updating the base and differentiated objects" in the docs.
Digging into the code, here are the bytecode operations that are not
supported yet:
DALOAD, DASTORE:
element access in double arrays
GETSTATIC, PUTSTATIC, GETFIELD, PUTFIELD:
field access (instance fields and class fields)
INVOKEVIRTUAL/INVOKESPECIAL/INVOKESTATIC/INVOKEINTERFACE:
method calls
NEWARRAY/ANEWARRAY/MULTIANEWARRAY:
array creation
Is this example supposed to work with the code in trunk? Also, I am
I'll look at this tomorrow, but I think for now you need to have a standalone
function, it cannot be split
as a main function calling subfunctions. The only allowed calls are the static
methods from Math/StrictMath.
I did not add our own FastMath, but it is trivial to do.
Another limitation is that your function cannot store intermediate results as
clas attributes yet.
Thanks, Luc! What I was trying to illustrate was partial
derivatives, which IIUC you need something like that example to do.
The following almost works:
public void testPartialDerivatives() throws Exception {
PartialFunction function = new PartialFunction(1);
final UnivariateDerivative derivative = new
ForwardModeAlgorithmicDifferentiator().differentiate(function);
DifferentialPair t = DifferentialPair.newVariable(1);
Assert.assertEquals(3, derivative.f(t).getFirstDerivative(), 0);
Assert.assertEquals(2, derivative.f(t).getValue(), 0);
function.setX(2);
Assert.assertEquals(4, derivative.f(t).getFirstDerivative(), 0);
Assert.assertEquals(3, derivative.f(t).getValue(), 0);
}
with
public class PartialFunction implements UnivariateDifferentiable {
private double x;
public PartialFunction(double x) {
this.x = x;
}
public void setX(double x) {
this.x = x;
}
public double getX() {
return x;
}
public double f(double y) {
return x * y + y * y;
}
}
But I end up with java.lang.VerifyError: (class:
ExampleTest$1PartialFunction$NablaForwardModeUnivariateDerivative,
method: f signature:
(Lorg/apache/commons/nabla/core/DifferentialPair;)Lorg/apache/commons/nabla/core/DifferentialPair;)
Incompatible type for getting or setting field
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2389)
at java.lang.Class.getDeclaredConstructors(Class.java:1836)
at
org.apache.commons.nabla.algorithmic.forward.ForwardModeAlgorithmicDifferentiator.differentiate(ForwardModeAlgorithmicDifferentiator.java:107)
at ExampleTest.testPartialDerivatives(ExampleTest.java:66)
This error seems to be due to the lack of support for the GETFIELD
instruction. As x is an instance field, the f method reads this field
before multiplying the result.
I have added a debug display message (to be removed later on) that
should print the generated bytecode to standard error when a VerifyError
exception occurs. It' clearly not targeted towards end users, but it
could help during development.
Luc
You can look at the junit tests for what is supported. Simple expressions,
calls to traditional functions like sin, cos, exp ...,
Simple loops and conditionals, local automatic variables should all work (I
hope ...)
Yep, I have gotten all of this to work. Even "knows" the chain rule :)
Phil
assuming
s/ForwardAlgorithmicDifferentiator/ForwardModeAlgorithmicDifferentiator
throughout. Correct?
Yes, the name was changed because a distant goal will be to also support
reverse mode, which is especially
useful when computing gradients (i.e. when one scalar function depends on many
inputs and we want all partial
derivatives).
Luc
Phil
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org