def cost_function(x):
        (a, b, c, d, e, f) = x
        v = a * 10**(-b)
        K_r_0 = c * 10**(-d)
        K_d_0 = e * 10**(-f)
        time_sim, cases_sim, healthy_sim, recovered_sim, deaths_sim \
            = calculate_epidemic(
                C=0, v=v, x_n=x_n, y_n=y_n, t_final=max(time_number_days),
                K_r_0=K_r_0, K_r_minus=0,
                K_d_0=K_d_0, K_d_plus=0)
        interp_cases = interpolate.interp1d(time_sim,
                                            cases_sim,
                                            fill_value='extrapolate')
        interp_deaths = interpolate.interp1d(time_sim,
                                             deaths_sim,
                                             fill_value='extrapolate')
        fitness = 0
        N = 0

        for i in range(len(time_number_days)):
            fitness += (
                abs(deaths_ref[i] - interp_deaths(time_number_days[i])) /
                max(deaths_ref))
            fitness += (abs(cases_ref[i] - interp_cases(time_number_days[i])) /
                        max(cases_ref))
            N += 2

        fitness /= N
        print("Fit mean difference: " + str(fitness), end='\r')

        return fitness
def fit_country(country, save_to_json=False):
    def cost_function(x):
        (a, b, c, d, e, f) = x
        v = a * 10**(-b)
        K_r_0 = c * 10**(-d)
        K_d_0 = e * 10**(-f)
        time_sim, cases_sim, healthy_sim, recovered_sim, deaths_sim \
            = calculate_epidemic(
                C=0, v=v, x_n=x_n, y_n=y_n, t_final=max(time_number_days),
                K_r_0=K_r_0, K_r_minus=0,
                K_d_0=K_d_0, K_d_plus=0)
        interp_cases = interpolate.interp1d(time_sim,
                                            cases_sim,
                                            fill_value='extrapolate')
        interp_deaths = interpolate.interp1d(time_sim,
                                             deaths_sim,
                                             fill_value='extrapolate')
        fitness = 0
        N = 0

        for i in range(len(time_number_days)):
            fitness += (
                abs(deaths_ref[i] - interp_deaths(time_number_days[i])) /
                max(deaths_ref))
            fitness += (abs(cases_ref[i] - interp_cases(time_number_days[i])) /
                        max(cases_ref))
            N += 2

        fitness /= N
        print("Fit mean difference: " + str(fitness), end='\r')

        return fitness

    x_n = 1e5  # initial healthy population arbitrary

    time, time_number_days, cases_ref, deaths_ref = get_data(country)

    y_n = cases_ref[0]
    x0 = (2.78, 6.08, 25, 1.9, 1, 2)
    print('Fitting...')
    res = scipy.optimize.minimize(cost_function, x0, method="Nelder-Mead")
    x_opt = res.x
    print('-' * 50)
    (a, b, c, d, e, f) = x_opt
    v = a * 10**(-b)
    K_r_0 = c * 10**(-d)
    K_d_0 = e * 10**(-f)
    print("Fit mean difference: " + "{:.2%}".format(res.fun))
    print("K_c = %.2e" % v)
    print("K_r = %.2e" % K_r_0)
    print("K_d = %.2e" % K_d_0)
    time_sim, cases_sim, healthy_sim, recovered_sim, deaths_sim \
        = calculate_epidemic(
            C=0, v=v, x_n=x_n, y_n=y_n, t_final=60, K_r_0=K_r_0, K_r_minus=0,
            K_d_0=K_d_0, K_d_plus=0)

    if save_to_json is True:
        print("Saving...")
        save_data(country, time, time_sim, cases_sim, deaths_sim)
    return time_sim, cases_sim, healthy_sim, recovered_sim, deaths_sim