Skip to content

Commit

Permalink
add another test
Browse files Browse the repository at this point in the history
  • Loading branch information
jdebacker committed Jul 8, 2024
1 parent 40af2ed commit eda9ef2
Show file tree
Hide file tree
Showing 2 changed files with 166 additions and 5 deletions.
6 changes: 1 addition & 5 deletions ogcore/pensions.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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
Expand Down
165 changes: 165 additions & 0 deletions tests/test_pensions.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)

0 comments on commit eda9ef2

Please sign in to comment.