immutable MultivariateTestFunction{T <: Function}
    f::T
    name::String
    x1s::Vector{Float64}
    x2s::Vector{Float64}
end

# Test cases generating as follows
# using Distributions
# repr(rand(Cauchy(0, 10), 5))

test_funcs = (
    MultivariateTestFunction(
        x -> sin(x[1]) + cos(x[2]),
        "x -> sin(x[1]) + cos(x[2])",
        [62.1908, 7.19278, 32.4944, -10.0597, 1.23525],
        [1.91818, -96.7718, -54.5914, 105.894, -2.74696],
    ),
    MultivariateTestFunction(
        x -> sin(x[1]) + 2 * sin(x[2]),
        "x -> sin(x[1]) + 2 * sin(x[2])",
        [-3.54442, 7.14114, -50.0388 , -5.73865, -8.88167],
        [-5.33968, -5.38714, -24.4391, -16.1525, -18.9814],
    ),
    MultivariateTestFunction(
        x -> x[1]^2 + x[2]^2,
        "x -> x[1]^2 + x[2]^2",
        [5.50783, -3.14069, 5.6383, 188.917, 98.7357],
        [6.71689, -15.1161, -19.7469, -2.62965, -14.9729],
    ),
    MultivariateTestFunction(
        x -> (1.0 - x[1])^2 + (2.0 - x[2])^2,
        "x -> (1.0 - x[1])^2 + (2.0 - x[2])^2",
        [5.66663, 22.7718, -13.5606, 9.80007, 0.0533083],
        [-11.0918, 1.55486, -133.914, -45.432, -19.3287],
    ),
    MultivariateTestFunction(
        x -> (1.0 - x[1])^2 + 100.0 * (x[2] - x[1]^2)^2,
        "x -> (1.0 - x[1])^2 + 100.0 * (x[2] - x[1]^2)^2",
        [25.9188, 35.6369, -17.8868, 47.76, 18.5091],
        [19.2642, -0.886276, 9.51653, 47.9309, -3.34237],
    ),
    MultivariateTestFunction(
        x -> 1 / (1 + exp(-(x[1] + x[2]))),
        "x -> 1 / (1 + exp(-(x[1] + x[2])))",
        [7.88823, -98.6984, 3.51154, -39.7024, 6.60017],
        [-55.2978, -212.439, 5.52012, 44.009, -10.9622],
    ),
    MultivariateTestFunction(
        x -> log(x[1]) + log(x[2]),
        "x -> log(x[1]) + log(x[2])",
        [7.88823, 98.6984, 3.51154, 39.7024, 6.60017],
        [55.2978, 212.439, 5.52012, 44.009, 10.9622],
    ),
)
