/*
* File: WolfeConditionsTest.java
* Authors: Kevin R. Dixon
* Company: Sandia National Laboratories
* Project: Cognitive Foundry
*
* Copyright Jun 27, 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 java.util.Random;
import junit.framework.TestCase;
/**
* JUnit tests for class WolfeConditionsTest
* @author Kevin R. Dixon
*/
public class WolfeConditionsTest
extends TestCase
{
private Random random = new Random( 0 );
/**
* Entry point for JUnit tests for class WolfeConditionsTest
* @param testName name of this test
*/
public WolfeConditionsTest(
String testName)
{
super(testName);
}
public InputOutputSlopeTriplet createTriplet()
{
return new InputOutputSlopeTriplet(
random.nextDouble(), random.nextDouble(), -random.nextDouble() );
}
public WolfeConditions createWolfe()
{
double curvatureCondition = random.nextDouble();
double slopeCondition = curvatureCondition / 2.0;
return new WolfeConditions(
this.createTriplet(), slopeCondition, curvatureCondition );
}
public void testConstructors()
{
System.out.println( "Constructors" );
WolfeConditions wolfe = this.createWolfe();
assertNotNull( wolfe.getOriginalPoint() );
WolfeConditions w2 = new WolfeConditions( wolfe );
assertNotNull( w2 );
assertNotSame( wolfe, w2 );
assertNotNull( w2.getOriginalPoint() );
assertNotSame( wolfe.getOriginalPoint(), w2.getOriginalPoint() );
assertEquals( wolfe.getCurvatureCondition(), w2.getCurvatureCondition() );
assertEquals( wolfe.getSlopeCondition(), w2.getSlopeCondition() );
}
/**
* Test of clone method, of class WolfeConditions.
*/
public void testClone()
{
System.out.println( "clone" );
WolfeConditions wolfe = this.createWolfe();
WolfeConditions w2 = wolfe.clone();
assertNotNull( w2 );
assertNotSame( wolfe, w2 );
assertNotNull( w2.getOriginalPoint() );
assertNotSame( wolfe.getOriginalPoint(), w2.getOriginalPoint() );
assertEquals( wolfe.getCurvatureCondition(), w2.getCurvatureCondition() );
assertEquals( wolfe.getSlopeCondition(), w2.getSlopeCondition() );
}
/**
* Test of evaluate method, of class WolfeConditions.
*/
public void testEvaluate()
{
System.out.println( "evaluate" );
WolfeConditions instance = this.createWolfe();
assertFalse( instance.evaluate( instance.getOriginalPoint() ) );
InputOutputSlopeTriplet trialPoint = new InputOutputSlopeTriplet(
instance.getOriginalPoint().getInput(),
instance.getOriginalPoint().getOutput(),
-instance.getSlopeCondition() );
assertTrue( instance.evaluate( trialPoint ) );
instance.getOriginalPoint().setSlope( 0.0 );
try
{
instance.evaluate( trialPoint );
fail( "Original slope must be < 0.0" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
}
/**
* Test of evaluateGoldsteinCondition method, of class WolfeConditions.
*/
public void testEvaluateGoldsteinCondition()
{
System.out.println( "evaluateGoldsteinCondition" );
WolfeConditions instance = this.createWolfe();
assertTrue( instance.evaluateGoldsteinCondition( instance.getOriginalPoint() ) );
InputOutputSlopeTriplet trialPoint = new InputOutputSlopeTriplet(
instance.getOriginalPoint().getInput()+1.0,
instance.getOriginalPoint().getOutput()+1.0,
-instance.getSlopeCondition() );
assertFalse( instance.evaluateGoldsteinCondition( trialPoint ) );
}
/**
* Test of evaluateStrictCurvatureCondition method, of class WolfeConditions.
*/
public void testEvaluateStrictCurvatureCondition_double()
{
System.out.println( "evaluateStrictCurvatureCondition" );
WolfeConditions instance = this.createWolfe();
assertFalse( instance.evaluateStrictCurvatureCondition( instance.getOriginalPoint().getSlope() ) );
InputOutputSlopeTriplet trialPoint = new InputOutputSlopeTriplet(
instance.getOriginalPoint().getInput()+1.0,
instance.getOriginalPoint().getOutput()+1.0,
-instance.getSlopeCondition() );
assertTrue( instance.evaluateStrictCurvatureCondition( trialPoint.getSlope() ) );
}
/**
* Test of getOriginalPoint method, of class WolfeConditions.
*/
public void testGetOriginalPoint()
{
System.out.println( "getOriginalPoint" );
InputOutputSlopeTriplet o = this.createTriplet();
double c = random.nextDouble();
double s = c/2.0;
WolfeConditions wolfe = new WolfeConditions( o, s, c );
assertSame( o, wolfe.getOriginalPoint() );
}
/**
* Test of setOriginalPoint method, of class WolfeConditions.
*/
public void testSetOriginalPoint()
{
System.out.println( "setOriginalPoint" );
InputOutputSlopeTriplet o = this.createTriplet();
double c = random.nextDouble();
double s = c/2.0;
WolfeConditions wolfe = new WolfeConditions( o, s, c );
assertSame( o, wolfe.getOriginalPoint() );
wolfe.setOriginalPoint( null );
assertNull( wolfe.getOriginalPoint() );
wolfe.setOriginalPoint( o );
assertSame( o, wolfe.getOriginalPoint() );
}
/**
* Test of getSlopeCondition method, of class WolfeConditions.
*/
public void testGetSlopeCondition()
{
System.out.println( "getSlopeCondition" );
InputOutputSlopeTriplet o = this.createTriplet();
double c = random.nextDouble();
double s = c/2.0;
WolfeConditions wolfe = new WolfeConditions( o, s, c );
assertEquals( s, wolfe.getSlopeCondition() );
try
{
wolfe = new WolfeConditions( o, s, s );
fail( "Slope condition must be < curvature condition" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
}
/**
* Test of setSlopeCondition method, of class WolfeConditions.
*/
public void testSetSlopeCondition()
{
System.out.println( "setSlopeCondition" );
InputOutputSlopeTriplet o = this.createTriplet();
double c = random.nextDouble();
double s = c/2.0;
WolfeConditions wolfe = new WolfeConditions( o, s, c );
assertEquals( s, wolfe.getSlopeCondition() );
double s2 = s/2.0;
wolfe.setSlopeCondition( s2 );
assertEquals( s2, wolfe.getSlopeCondition() );
try
{
wolfe.setSlopeCondition( 0.0 );
fail( "slopeCondition must be (0,1)" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
try
{
wolfe.setSlopeCondition( 1.0 );
fail( "slopeCondition must be (0,1)" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
}
/**
* Test of getCurvatureCondition method, of class WolfeConditions.
*/
public void testGetCurvatureCondition()
{
System.out.println( "getCurvatureCondition" );
InputOutputSlopeTriplet o = this.createTriplet();
double c = random.nextDouble();
double s = c/2.0;
WolfeConditions wolfe = new WolfeConditions( o, s, c );
assertEquals( c, wolfe.getCurvatureCondition() );
try
{
wolfe = new WolfeConditions( o, s, s );
fail( "Slope condition must be < curvature condition" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
}
/**
* Test of setCurvatureCondition method, of class WolfeConditions.
*/
public void testSetCurvatureCondition()
{
System.out.println( "setCurvatureCondition" );
InputOutputSlopeTriplet o = this.createTriplet();
double c = random.nextDouble();
double s = c/2.0;
WolfeConditions wolfe = new WolfeConditions( o, s, c );
assertEquals( s, wolfe.getSlopeCondition() );
double c2 = 1.0 - 0.5*(1.0-c);
wolfe.setCurvatureCondition( c2 );
assertEquals( c2, wolfe.getCurvatureCondition() );
try
{
wolfe.setCurvatureCondition( 0.0 );
fail( "curvatureCondition must be (0,1)" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
try
{
wolfe.setCurvatureCondition( 1.0 );
fail( "curvatureCondition must be (0,1)" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
}
}