/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.commons.math4.legacy.analysis.function;

import org.apache.commons.math4.legacy.analysis.differentiation.DerivativeStructure;
import org.apache.commons.math4.core.jdkmath.JdkMath;
import org.junit.Assert;
import org.junit.Test;

/**
 * Test for all classes in org.apache.commons.math4.legacy.analysis.function that implement UnivariateDifferentiableFunction explicitly.
 */
public class UnivariateDifferentiableFunctionTest {

    private static final double EPS = Math.ulp(1d);

    @Test
    public void testAcos() {
        Acos acos = new Acos();
        Assert.assertEquals(JdkMath.PI/3, acos.value(0.5), EPS);
        Assert.assertEquals(JdkMath.PI/4, acos.value(Double.valueOf(1/JdkMath.sqrt(2))), EPS);
        double a = 0.5;
        Assert.assertEquals(-1/JdkMath.sqrt(1-JdkMath.pow(a,2)), acos.value(new DerivativeStructure(1,1,0,a)).getPartialDerivative(1), EPS);
    }

    @Test
    public void testAcosh() {
        Acosh acosh = new Acosh();
        Assert.assertEquals(0,acosh.value(1), EPS);
        double a = 1.2345;
        Assert.assertEquals(a,acosh.value(JdkMath.cosh(a)), EPS);
        Assert.assertEquals(1/(JdkMath.sqrt(a-1)*JdkMath.sqrt(a+1)),acosh.value(new DerivativeStructure(1,1,0,a)).getPartialDerivative(1), EPS);
    }

    @Test
    public void testAsin() {
        Asin asin = new Asin();
        double a = 1.2345;
        Assert.assertEquals(a, asin.value(JdkMath.sin(a)), EPS);
        Assert.assertEquals(1/JdkMath.sqrt(1 - JdkMath.pow(a,2)), asin.value(new DerivativeStructure(1,1,0,a)).getPartialDerivative(1), EPS);
    }

    @Test
    public void testAsinh() {
        Asinh asinh = new Asinh();
        double a = 1.2345;
        Assert.assertEquals(a, asinh.value(JdkMath.sinh(a)), EPS);
        Assert.assertEquals(1/JdkMath.sqrt(JdkMath.pow(a,2.0) + 1), asinh.value(new DerivativeStructure(1,1,0,a)).getPartialDerivative(1), EPS);
    }

    @Test
    public void testAtan() {
        Atan atan = new Atan();
        double a = 1.2345;
        Assert.assertEquals(a, atan.value(JdkMath.tan(a)), EPS);
        Assert.assertEquals(1/(JdkMath.pow(a,2.0) + 1), atan.value(new DerivativeStructure(1,1,0,a)).getPartialDerivative(1), EPS);
    }

    @Test
    public void testAtanh() {
        Atanh atanh = new Atanh();
        double a = 1.2345;
        Assert.assertEquals(a, atanh.value(JdkMath.tanh(a)), EPS);
        Assert.assertEquals(1/(1 - JdkMath.pow(a,2.0)), atanh.value(new DerivativeStructure(1,1,0,a)).getPartialDerivative(1), EPS);
    }

    @Test
    public void testCbrt() {
        Cbrt cbrt = new Cbrt();
        double a = 1.2345;
        Assert.assertEquals(a, cbrt.value(JdkMath.pow(a,3)), EPS);
        Assert.assertEquals(1.0/(3.0*JdkMath.pow(a, 2.0/3.0)), cbrt.value(new DerivativeStructure(1,1,0,a)).getPartialDerivative(1), EPS);
    }

    @Test
    public void testConstant() {
        double a = 123.456;
        Constant constantNeg1 = new Constant(-1);
        Constant constant0 = new Constant(0);
        Constant constant5 = new Constant(5);
        Assert.assertEquals(-1, constantNeg1.value(a), EPS);
        Assert.assertEquals(0, constant0.value(a), EPS);
        Assert.assertEquals(5, constant5.value(a), EPS);
        Assert.assertEquals(0, constantNeg1.value(new DerivativeStructure(1,1,0,a)).getPartialDerivative(1), EPS);
        Assert.assertEquals(0, constant0.value(new DerivativeStructure(1,1,0,a)).getPartialDerivative(1), EPS);
        Assert.assertEquals(0, constant5.value(new DerivativeStructure(1,1,0,a)).getPartialDerivative(1), EPS);
    }

    @Test
    public void testCos() {
        Cos cos = new Cos();
        double a = 0.987;
        Assert.assertEquals(a, cos.value(JdkMath.acos(a)), EPS);
        Assert.assertEquals(-JdkMath.sin(a), cos.value(new DerivativeStructure(1,1,0,a)).getPartialDerivative(1), EPS);
    }

    @Test
    public void testCosh() {
        Cosh cosh = new Cosh();
        double a = 1.2345;
        Assert.assertEquals(a, cosh.value(JdkMath.acosh(a)), EPS);
        Assert.assertEquals(JdkMath.sinh(a), cosh.value(new DerivativeStructure(1,1,0,a)).getPartialDerivative(1), EPS);
    }

    @Test
    public void testExp() {
        Exp exp= new Exp();
        double a = 1.2345;
        Assert.assertEquals(a, exp.value(JdkMath.log(a)), EPS);
        Assert.assertEquals(exp.value(a), exp.value(new DerivativeStructure(1,1,0,a)).getPartialDerivative(1), EPS);
    }

    @Test
    public void testExpm1() {
        Expm1 expm1 = new Expm1();
        double a = 1.2345;
        Assert.assertEquals(a-1, expm1.value(JdkMath.log(a)), EPS);
        Assert.assertEquals(JdkMath.exp(a), expm1.value(new DerivativeStructure(1,1,0,a)).getPartialDerivative(1), EPS);
    }

    @Test
    public void testIdentity() {
        Identity identity = new Identity();
        double a = 123.456;
        Assert.assertEquals(a, identity.value(a), EPS);
        Assert.assertEquals(1, identity.value(new DerivativeStructure(1,1,0,a)).getPartialDerivative(1), EPS);
    }

    @Test
    public void testInverse() {
        Inverse inverse = new Inverse();
        double a = 123.456;
        Assert.assertEquals(1/a, inverse.value(a), EPS);
        Assert.assertEquals(-1/JdkMath.pow(a,2), inverse.value(new DerivativeStructure(1,1,0,a)).getPartialDerivative(1), EPS);
    }

    @Test
    public void testLog() {
        double a = 123.456;
        Log log = new Log();
        Assert.assertEquals(Math.log(a), log.value(a), EPS);
        Assert.assertEquals(1/a,log.value(new DerivativeStructure(1,1,0,a)).getPartialDerivative(1), EPS);
    }

    @Test
    public void testLog10() {
        Log10 log10 = new Log10();
        double a =1.2345;
        Assert.assertEquals(a, log10.value(JdkMath.pow(10, a)), EPS);
        Assert.assertEquals(1/(a*JdkMath.log(10)), log10.value(new DerivativeStructure(1,1,0,a)).getPartialDerivative(1), EPS);
    }

    @Test
    public void testLog1p() {
        Log1p log1p = new Log1p();
        double a = 1.2345;
        Assert.assertEquals(a+1,JdkMath.exp(log1p.value(a)), EPS);
        Assert.assertEquals(1/(1+a), log1p.value(new DerivativeStructure(1,1,0,a)).getPartialDerivative(1), EPS);
    }

    @Test
    public void testMinus() {
        Minus minus = new Minus();
        double a = 123.456;
        Assert.assertEquals(-a, minus.value(a), EPS);
        Assert.assertEquals(-1, minus.value(new DerivativeStructure(1,1,0,a)).getPartialDerivative(1), EPS);
    }

    @Test
    public void testPower() {
        Power squared = new Power(2);
        Power power2_5 = new Power(2.5);
        double a = 123.456;
        Assert.assertEquals(JdkMath.pow(a,2), squared.value(a), EPS);
        Assert.assertEquals(JdkMath.pow(a, 2.5), power2_5.value(a), EPS);
        Assert.assertEquals(2*a, squared.value(new DerivativeStructure(1,1,0,a)).getPartialDerivative(1), EPS);
        Assert.assertEquals(2.5*JdkMath.pow(a,1.5), power2_5.value(new DerivativeStructure(1,1,0,a)).getPartialDerivative(1), EPS);
    }

    @Test
    public void testSin() {
        Sin sin = new Sin();
        double a = 0.987;
        Assert.assertEquals(a, sin.value(JdkMath.asin(a)), EPS);
        Assert.assertEquals(JdkMath.cos(a), sin.value(new DerivativeStructure(1,1,0,a)).getPartialDerivative(1), EPS);
    }

    @Test
    public void testSinh() {
        Sinh sinh = new Sinh();
        double a = 1.2345;
        Assert.assertEquals(a, sinh.value(JdkMath.asinh(a)), EPS);
        Assert.assertEquals(JdkMath.cosh(a), sinh.value(new DerivativeStructure(1,1,0,a)).getPartialDerivative(1), EPS);
    }

    @Test
    public void testTan() {
        Tan tan = new Tan();
        double a = 0.987;
        Assert.assertEquals(a, tan.value(JdkMath.atan(a)), EPS);
        Assert.assertEquals(1/(JdkMath.pow(JdkMath.cos(a),2)), tan.value(new DerivativeStructure(1,1,0,a)).getPartialDerivative(1), EPS);
    }

    @Test
    public void testTanh() {
        Tanh tanh = new Tanh();
        double a = 0.987;
        Assert.assertEquals(a, tanh.value(JdkMath.atanh(a)), EPS);
        Assert.assertEquals(1/JdkMath.pow(JdkMath.cosh(a),2), tanh.value(new DerivativeStructure(1,1,0,a)).getPartialDerivative(1), EPS);
    }

}
