/*
* File: DirectionalVectorToDifferentiableScalarFunction.java
* Authors: Kevin R. Dixon
* Company: Sandia National Laboratories
* Project: Cognitive Foundry
*
* Copyright Mar 16, 2008, Sandia Corporation.
* Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
* license for use of this work by or on behalf of the U.S. Government.
* Export of this program may require a license from the United States
* Government. See CopyrightHistory.txt for complete details.
*
*/
package gov.sandia.cognition.learning.algorithm.minimization.line;
import gov.sandia.cognition.annotation.CodeReview;
import gov.sandia.cognition.learning.data.DefaultInputOutputPair;
import gov.sandia.cognition.learning.data.InputOutputPair;
import gov.sandia.cognition.math.DifferentiableEvaluator;
import gov.sandia.cognition.math.matrix.Vector;
/**
* Creates a truly differentiable scalar function from a differentiable Vector
* function, instead of using a forward-differences approximation to the
* derivative like DirectionalVectorToScalarFunction does.
* @author Kevin R. Dixon
* @since 2.1
*/
@CodeReview(
reviewer="Kevin R. Dixon",
date="2009-07-06",
changesNeeded=false,
comments={
"Made clone() call super.clone().",
"Created test class.",
"Class looks fine."
}
)
public class DirectionalVectorToDifferentiableScalarFunction
extends DirectionalVectorToScalarFunction
{
/**
* Last gradient information
*/
private InputOutputPair<Vector,Vector> lastGradient;
/**
* Creates a new instance of DirectionalVectorToDifferentiableScalarFunction
*
* @param vectorScalarFunction
* Function that maps a Vector onto a Double
* @param vectorOffset offset vector from which to scale along
* direction to evaluate vectorFunction
* @param direction Direction to optimize along
*/
public DirectionalVectorToDifferentiableScalarFunction(
DifferentiableEvaluator<? super Vector, ? extends Double, Vector> vectorScalarFunction,
Vector vectorOffset,
Vector direction )
{
super( vectorScalarFunction, vectorOffset, direction );
}
@Override
public DirectionalVectorToDifferentiableScalarFunction clone()
{
DirectionalVectorToDifferentiableScalarFunction clone =
(DirectionalVectorToDifferentiableScalarFunction) super.clone();
clone.setLastGradient(null);
return clone;
}
@SuppressWarnings("unchecked")
@Override
public double differentiate(
double input )
{
Vector vectorInput = this.computeVector( input );
Vector vectorDerivative =
((DifferentiableEvaluator<? super Vector, ? extends Double, Vector>) this.getVectorScalarFunction()).differentiate( vectorInput );
double slope = this.getDirection().dotProduct( vectorDerivative );
this.setLastGradient( new DefaultInputOutputPair<Vector, Vector>(
vectorInput, vectorDerivative ) );
return slope;
}
/**
* Getter for lastGradient
* @return
* Last gradient information
*/
public InputOutputPair<Vector, Vector> getLastGradient()
{
return this.lastGradient;
}
/**
* Setter for lastGradient
* @param lastGradient
* Last gradient information
*/
public void setLastGradient(
InputOutputPair<Vector, Vector> lastGradient )
{
this.lastGradient = lastGradient;
}
}