/*
* File: LeakyRectifiedLinearFunctionTest.java
* Authors: Justin Basilico
* Project: Cognitive Foundry
*
* Copyright 2014 Cognitive Foundry. All rights reserved.
*/
package gov.sandia.cognition.learning.function.scalar;
import gov.sandia.cognition.math.DifferentiableUnivariateScalarFunction;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Unit tests for class {@link LeakyRectifiedLinearFunctionTest}.
*
* @author Justin Basilico
* @since 3.4.0
*/
public class LeakyRectifiedLinearFunctionTest
extends DifferentiableUnivariateScalarFunctionTestHarness
{
/**
* Creates a new test.
*
* @param testName
* The name of this test.
*/
public LeakyRectifiedLinearFunctionTest(
final String testName)
{
super(testName);
}
@Override
public DifferentiableUnivariateScalarFunction createInstance()
{
return new LeakyRectifiedLinearFunction(this.RANDOM.nextDouble());
}
/**
* Test of constructors, of class LeakyRectifiedLinearFunction.
*/
@Test
@Override
public void testConstructors()
{
double leakage = LeakyRectifiedLinearFunction.DEFAULT_LEAKAGE;
LeakyRectifiedLinearFunction instance = new LeakyRectifiedLinearFunction();
assertEquals(leakage, instance.getLeakage(), 0.0);
leakage = this.RANDOM.nextDouble();
instance = new LeakyRectifiedLinearFunction(leakage);
assertEquals(leakage, instance.getLeakage(), 0.0);
}
/**
* Test of clone method, of class LeakyRectifiedLinearFunction.
*/
@Test
public void testClone()
{
LeakyRectifiedLinearFunction instance = new LeakyRectifiedLinearFunction();
LeakyRectifiedLinearFunction clone = instance.clone();
assertNotSame(instance, clone);
assertNotNull(clone);
assertNotSame(clone, instance.clone());
}
/**
* Test of evaluate method, of class LeakyRectifiedLinearFunction.
*/
@Test
public void testEvaluate()
{
LeakyRectifiedLinearFunction instance = new LeakyRectifiedLinearFunction();
assertEquals(0.0, instance.evaluate(0.0), 0.0);
assertEquals(0.1, instance.evaluate(0.1), 0.0);
assertEquals(2.0, instance.evaluate(2.0), 0.0);
assertEquals(123.0, instance.evaluate(123.0), 0.0);
assertEquals(-0.001, instance.evaluate(-0.1), 0.0);
assertEquals(-0.02, instance.evaluate(-2.0), 0.0);
assertEquals(-1.23, instance.evaluate(-123.0), 0.0);
instance.setLeakage(0.001);
assertEquals(0.0, instance.evaluate(0.0), 0.0);
assertEquals(123.0, instance.evaluate(123.0), 0.0);
assertEquals(-0.123, instance.evaluate(-123.0), 0.0);
}
/**
* Test of differentiate method, of class LeakyRectifiedLinearFunction.
*/
@Test
public void testDifferentiate()
{
LeakyRectifiedLinearFunction instance = new LeakyRectifiedLinearFunction();
assertEquals(0.01, instance.differentiate(0.0), 0.0);
assertEquals(1.0, instance.differentiate(0.1), 0.0);
assertEquals(1.0, instance.differentiate(2.0), 0.0);
assertEquals(1.0, instance.differentiate(123.0), 0.0);
assertEquals(0.01, instance.differentiate(-0.1), 0.0);
assertEquals(0.01, instance.differentiate(-2.0), 0.0);
assertEquals(0.01, instance.differentiate(-123.0), 0.0);
double leakage = this.RANDOM.nextDouble();
instance.setLeakage(leakage);
assertEquals(leakage, instance.differentiate(0.0), 0.0);
assertEquals(1.0, instance.differentiate(123.0), 0.0);
assertEquals(leakage, instance.differentiate(-123.0), 0.0);
}
/**
* Test of getLeakage method, of class LeakyRectifiedLinearFunction.
*/
@Test
public void testGetLeakage()
{
this.testSetLeakage();
}
/**
* Test of setLeakage method, of class LeakyRectifiedLinearFunction.
*/
@Test
public void testSetLeakage()
{
double leakage = LeakyRectifiedLinearFunction.DEFAULT_LEAKAGE;
LeakyRectifiedLinearFunction instance = new LeakyRectifiedLinearFunction();
assertEquals(leakage, instance.getLeakage(), 0.0);
double[] goodValues = { 0.0, 0.001, 0.5, 1.0, this.RANDOM.nextDouble() };
for (double value : goodValues)
{
leakage = value;
instance.setLeakage(leakage);
assertEquals(leakage, instance.getLeakage(), 0.0);
}
double[] badValues = { -0.1, 1.1, -this.RANDOM.nextDouble(),
Double.NaN, Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY };
for (double badValue : badValues)
{
boolean exceptionThrown = false;
try
{
instance.setLeakage(badValue);
}
catch (IllegalArgumentException e)
{
exceptionThrown = true;
}
finally
{
assertTrue( "" + badValue, exceptionThrown);
}
assertEquals(leakage, instance.getLeakage(), 0.0);
}
}
}