def michalewicz_function(config, reporter):
    """f(x) = -sum{sin(xi) * [sin(i*xi^2 / pi)]^(2m)}"""
    import numpy as np
    x = np.array(
        [config["x1"], config["x2"], config["x3"], config["x4"], config["x5"]])
    sin_x = np.sin(x)
    z = (np.arange(1, 6) / np.pi * (x * x))
    sin_z = np.power(np.sin(z), 20)  # let m = 20
    y = np.dot(sin_x, sin_z)

    # Negate y since we want to minimize y value
    reporter(timesteps_total=1, neg_mean_loss=-y)