#!/usr/bin/python
##############################################################################
# Institute for the Design of Advanced Energy Systems Process Systems
# Engineering Framework (IDAES PSE Framework) Copyright (c) 2018-2019, by the
# software owners: The Regents of the University of California, through
# Lawrence Berkeley National Laboratory,  National Technology & Engineering
# Solutions of Sandia, LLC, Carnegie Mellon University, West Virginia
# University Research Corporation, et al. All rights reserved.
#
# Please see the files COPYRIGHT.txt and LICENSE.txt for full copyright and
# license information, respectively. Both files are also available online
# at the URL "https://github.com/IDAES/idaes-pse".
##############################################################################
import numpy as np
import sys


def sixcamel(*x):
    x1, x2 = x
    t1 = np.multiply(4.0 - 2.1 * np.power(x1, 2) + np.divide(np.power(x1, 4), 3.0),
                     np.power(x1, 2))
    t2 = np.multiply(4 * np.power(x2, 2) - 4,
                     np.power(x2, 2))
    z = t1 + np.multiply(x1, x2) + t2
    return z


def ackley(*x):
    import numpy as np
    x1, x2 = x
    a = 20
    b = 0.2
    c = 2 * 3.14159
    z = -a * np.exp(-b * np.sqrt(0.5 * (x1**2 + x2**2))) \
        - np.exp(0.5 * (np.cos(c * x1) + np.cos(c * x2))) + a + np.exp(1)
    return z


def branin(*x):
    import numpy as np
    x1, x2 = x
    pi = 3.14159
    z = (x2 - (5.1 / (4 * pi**2)) * x1**2 + (5 / pi) * x1 - 6)**2  \
        + 10 * (1 - (1 / (8 * pi)) * np.cos(x1) + 10) + np.random.normal(0, 0.1)
    return z


if __name__ == '__main__':
    sys.stdout.write(' ALAMOpy example functions ')
    sys.stdout.write(' call functions with : ')
    sys.stdout.write(' examples.<name>')
    sys.stdout.write(' <name> = branin ')
    sys.stdout.write('          sixcamel ')
    sys.stdout.write('          ackley ')
