diff --git a/ogcore/pensions.py b/ogcore/pensions.py index 17a4da179..6cb0f055a 100644 --- a/ogcore/pensions.py +++ b/ogcore/pensions.py @@ -424,8 +424,6 @@ def deriv_NDC(r, w, e, Y, per_rmn, p): d_theta_empty = np.zeros(per_rmn) delta_ret_amount = delta_ret(r, Y, p) g_ndc_amount = g_ndc(r, Y, p) - print("g_ndc = ", g_ndc_amount) - print("delta_ret = ", delta_ret_amount) d_theta = deriv_NDC_loop( w, e, @@ -579,9 +577,7 @@ def deriv_PS_loop(w, e, S, S_ret, per_rmn, d_theta, vpoint, factor): @numba.jit -def deriv_NDC_loop( - w, e, per_rmn, S, S_ret, tau_p, g_ndc_value, delta_ret_value, d_theta -): +def deriv_NDC_loop(w, e, per_rmn, S, S_ret, tau_p, g_ndc_value, delta_ret_value, d_theta): for s in range((S - per_rmn), S_ret): d_theta[s - (S - per_rmn)] = ( tau_p diff --git a/tests/test_pensions.py b/tests/test_pensions.py index 0d7d678db..130b3e274 100644 --- a/tests/test_pensions.py +++ b/tests/test_pensions.py @@ -374,3 +374,168 @@ def test_deriv_NDC(args, d_NDC_expected): d_NDC = pensions.deriv_NDC(r, w, e, Y, per_rmn, p) assert np.allclose(d_NDC, d_NDC_expected) + + + + + +################pension benefit: DB############ +demographics_ndc = deepcopy(demographics) +households_pb = deepcopy(households) +pensions_db = deepcopy(pensions_class) +pensions_db.pension_system = 'DB' +households_pb.S = 7 +households_pb.S_ret = 4 +w_db = np.array([1.2, 1.1, 1.21, 1.0, 1.01, 0.99, 0.8]) +e_db = np.array([1.1, 1.11, 0.9, 0.87, 0.87, 0.7, 0.6]) +n_db = np.array([0.4, 0.45, 0.4, 0.42, 0.3, 0.2, 0.2]) +pensions_db.last_career_yrs = 3 +pensions_db.yr_contr = S_ret +pensions_db.rep_rate_py = 0.2 +Y = None +j_ind = 1 +firms.g_y = 0.03 +factor = 2 +omegas = None +lambdas = 1 +pension_expected_db = [0, 0, 0, 0, 0.337864778, 0.327879365, 0.318189065] +classes_pb = (demographics_ndc, households_pb, firms, pensions_db) +args_pb = (w_db, e_db, n_db, r, Y, lambdas, j_ind, factor) + +################pension benefit: NDC############ +households_ndc = deepcopy(households) +pensions_ndc = deepcopy(pensions_class) +pensions_ndc.pension_system = 'NDC' +pensions_ndc.ndc_growth_rate = 'LR GDP' +pensions_ndc.dir_growth_rate = 'r' +households_ndc.S = 4 +households_ndc.S_ret = 2 +w_ndc = np.array([1.2, 1.1, 1.21, 1]) +e_ndc = np.array([1.1, 1.11, 0.9, 0.87]) +n_ndc = np.array([0.4, 0.45, 0.4, 0.3]) +Y = None +j_ind = 1 +firms.g_y = 0.03 +demographics_ndc.g_n_SS = 0.0 +r = 0.03 +factor = 2 +pensions_ndc.tau_p = 0.3 +pensions_ndc.k_ret = 0.4615 +demographics_ndc.mort_rates_SS = np.array([0.01, 0.05, 0.3, 0.4, 1]) +omegas = None +lambdas = 1 +pension_expected_ndc = [0, 0, 0.279756794, 0.271488732] +classes_ndc = (demographics_ndc, households_ndc, firms, pensions_ndc) +args_ndc = (w_ndc, e_ndc, n_ndc, r, Y, lambdas, j_ind, factor) + +################pension benefit: PS############ +demographics_ppb = deepcopy(demographics) +households_ppb = deepcopy(households) +pensions_ppb = deepcopy(pensions_class) +pensions_ppb.pension_system = 'PS' +households_ppb.S = 7 +households_ppb.S_ret = 4 +w_ppb = np.array([1.2, 1.1, 1.21, 1.0, 1.01, 0.99, 0.8]) +e_ppb = np.array([1.1, 1.11, 0.9, 0.87, 0.87, 0.7, 0.6]) +n_ppb = np.array([0.4, 0.45, 0.4, 0.42, 0.3, 0.2, 0.2]) +omegas = (1/households_ppb.S) * np.ones(households_ppb.S) +demographics_ppb.omega_SS = omegas +pensions_ppb.vpoint = 0.4 +factor = 2 +Y = None +lambdas = 1 +j_ind = 1 +firms.g_y = 0.03 +pension_expected_ppb = [0, 0, 0, 0, 0.004164689, 0.004041603, 0.003922156] +classes_ppb = (demographics_ppb, households_ppb, firms, pensions_ppb) +args_ppb = (w_db, e_db, n_db, r, Y, lambdas, j_ind, factor) + +test_data = [(classes_pb, args_pb, pension_expected_db), + (classes_ndc, args_ndc, pension_expected_ndc), + (classes_ppb, args_ppb, pension_expected_ppb)] + +@pytest.mark.parametrize('classes,args,pension_expected', test_data, + ids=['DB', 'NDC', 'PS']) +def test_pension_benefit(classes, args, pension_expected): + ''' + Test of pensions.get_pension_benefit + ''' + + demographics_ndc, households, firms, pensions = classes + w, e, n, r, Y, lambdas, j_ind, factor = args + + pension = pensions.pension_benefit( + demographics_ndc, households, firms, w, e, n, r, + Y, lambdas, j_ind, factor) + assert (np.allclose(pension, pension_expected)) +############SS or complete lifetimes############ +households_pl1 = deepcopy(households) +pensions_pl1 = deepcopy(pensions_class) +households_pl1.S = 3 +households_pl1.S_ret = 2 +per_rmn = households_pl1.S +w = np.array([1.2, 1.1, 1.21]) +e = np.array([1.1, 1.11, 0.9]) +firms.g_y = 0.03 +demographics.g_n_SS = 0.0 +pensions_pl1.ndc_growth_rate = 'LR GDP' +pensions_pl1.dir_growth_rate = 'r' +r = 0.02 +pensions_pl1.tau_p = 0.3 +pensions_pl1.k_ret = 0.4615 +pensions_pl1.delta_ret = 1.857010214 +pensions_pl1.g_ndc = firms.g_y + demographics.g_n_SS +demographics.mort_rates_SS = np.array([0.1, 0.2, 0.4, 1.0]) +deriv_NDC_loop_expected1 = np.array([0.757437326, 0.680222841, 0.0]) +d_theta_empty = np.zeros_like(w) + +#args3 = (pensions_pl1, households_pl1, w, e, per_rmn) +args3 = (w, e, per_rmn, households_pl1.S, households_pl1.S_ret, firms.g_y, + pensions_pl1.tau_p, pensions_pl1.g_ndc, pensions_pl1.delta_ret, + d_theta_empty) + +################Incomplete lifetimes################# +households_pl2 = deepcopy(households) +pensions_pl2 = deepcopy(pensions_class) +households_pl2.S = 4 +households_pl2.S_ret = 2 +per_rmn = 3 +#w = np.array([1.2, 1.1, 1.21, 1.25]) +#e = np.array([1.1, 1.11, 0.9, 1.0]) +w = np.array([1.1, 1.21, 1.25]) +e = np.array([1.11, 0.9, 1.0]) +firms.g_y = 0.04 +demographics.g_n_SS = 0.0 +pensions_pl2.ndc_growth_rate = 'LR GDP' +pensions_pl2.dir_growth_rate = 'r' +#r = np.array([0.05, 0.03, 0.04, 0.03]) +r = np.array([0.03, 0.04, 0.03]) +pensions_pl2.tau_p = 0.3 +pensions_pl2.k_ret = 0.4615 +pensions_pl2.delta_ret = 1.083288196 +pensions_pl2.g_ndc = firms.g_y + demographics.g_n_SS +#demographics.mort_rates_SS = np.array([0.1, 0.2, 0.4, 1.0]) +demographics.mort_rates_SS = np.array([0.2, 0.4, 1.0]) +deriv_NDC_loop_expected2 = np.array([0.396808466, 0.0, 0.0]) +#d_theta_empty = np.zeros_like(w) +d_theta_empty = np.zeros(per_rmn) +args4 = (w, e, per_rmn, households_pl2.S, households_pl2.S_ret, firms.g_y, + pensions_pl2.tau_p, pensions_pl2.g_ndc, pensions_pl2.delta_ret, + d_theta_empty) + +test_data = [(args3, deriv_NDC_loop_expected1), + (args4, deriv_NDC_loop_expected2)] + +@pytest.mark.parametrize('args,deriv_NDC_loop_expected', test_data, + ids=['SS', 'incomplete']) +def test_deriv_NDC_loop(args, deriv_NDC_loop_expected): + """ + Test of the pensions.deriv_NDC_loop() function. + """ + (w, e, per_rmn, households.S, households.S_ret, firms.g_y, pensions_pl2.tau_p, + pensions_pl2.g_ndc, pensions_pl2.delta_ret, d_theta_empty) = args + + deriv_NDC_loop = pensions.deriv_NDC_loop( + w, e, per_rmn, households.S, households.S_ret, firms.g_y, + pensions_pl2.tau_p, pensions_pl2.g_ndc, pensions_pl2.delta_ret, + d_theta_empty) \ No newline at end of file