package edu.stanford.nlp.math;
/**
* The class {@code DoubleAD} was created to extend the
* current calculations of gradient to automatically include a calculation of the
* Hessian vector product with another vector {@code v}. This is used with the
* Stochastic Meta Descent Optimization, but could be extended for use in any application
* that requires an additional order of differentiation without explicitly creating the code.
*
* @author Alex Kleeman
* @version 2006/12/06
*/
public class DoubleAD extends Number {
private static final long serialVersionUID = -5702334375099248894L;
private double val;
private double dot;
public DoubleAD() {
setval(0);
setdot(1);
}
public DoubleAD(double initVal, double initDot) {
val = initVal;
dot = initDot;
}
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if ( ! (obj instanceof DoubleAD)) {
return false;
}
DoubleAD b = (DoubleAD) obj;
return b.getval() == val && b.getdot() == dot;
}
public boolean equals(double valToCompare, double dotToCompare) {
return valToCompare == val && dotToCompare == dot;
}
public boolean equals(double valToCompare, double dotToCompare, double TOL) {
return Math.abs(valToCompare - val) < TOL && Math.abs(dotToCompare - dot) < TOL;
}
public double getval(){
return val;
}
public double getdot(){
return dot;
}
public void set(double value, double dotValue){
val = value;
dot = dotValue;
}
public void setval(double a){
val = a;
}
public void setdot(double a){
dot = a;
}
public void plusEqualsConst(double a){
setval(val + a);
}
public void plusEquals(DoubleAD a){
setval(val + a.getval() );
setdot(dot + a.getdot() );
}
public void minusEquals(DoubleAD a){
setval(val - a.getval() );
setdot(dot - a.getdot() );
}
public void minusEqualsConst(double a){
setval(val - a);
}
@Override
public double doubleValue() {
return getval();
}
@Override
public float floatValue() {
return (float) doubleValue();
}
@Override
public int intValue() {
return (int) doubleValue();
}
@Override
public long longValue() {
return (long) doubleValue();
}
@Override
public String toString() {
return "Value= " + val + "; Dot= " + dot;
}
@Override
public int hashCode() {
int result;
long temp;
temp = Double.doubleToLongBits(val);
result = (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits(dot);
result = 31 * result + (int) (temp ^ (temp >>> 32));
return result;
}
}