-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsimulate_nltax.py
130 lines (82 loc) · 3.57 KB
/
simulate_nltax.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
import numpy as np
import time
import subprocess
from SCEconomy_nltax import Economy, split_shock
import pickle
if __name__ == '__main__':
path_to_shock = './tmp/data_i_s'
from markov import calc_trans, Stationary
num_pop = 100_000
sim_time = 3_000
data_i_s = np.ones((num_pop, sim_time), dtype = int)
#need to set initial state for zp
data_i_s[:, 0] = 7
# prob = np.load('./input_data/transition_matrix.npy')
prob = np.load('./DeBacker/prob_epsz.npy')
np.random.seed(0)
data_rand = np.random.rand(num_pop, sim_time)
calc_trans(data_i_s, data_rand, prob)
data_i_s = data_i_s[:, 2000:]
np.save(path_to_shock + '.npy' , data_i_s)
import sys
args = sys.argv
num_core = int(args[1])
def curvedspace(begin, end, curve, num=100):
import numpy as np
ans = np.linspace(0, (end - begin)**(1.0/curve), num) ** (curve) + begin
ans[-1] = end #so that the last element is exactly end
return ans
# additional info
agrid2 = curvedspace(0., 200., 2., 40)
kapgrid2 = curvedspace(0., 3., 2., 30)
zgrid2 = np.load('./input_data/zgrid.npy') ** 2.0
p_, rc_, ome_, varpi_ = 1.4511445940193992, 0.053393961117462245, 0.4627459750781605, 0.6056020599342775
split_shock(path_to_shock, 100_000, num_core)
###end defining additional parameters#
print('Solving the model with the given prices...')
print('Do not simulate more than one models at the same time...')
alpha = 0.3
theta = 0.41
ynb_p_gdp = 0.25
xnb_p_gdp = 0.105
g_p_gdp = 0.13
pure_sweat_share = 0.10 #target
s_emp_share = 0.30 #target
yc_init = 0.8679
# yc_init = 0.76
path_to_data_i_s = './tmp/data_i_s'
taub = np.array([0.80*0.137, 0.80*0.185, 0.80*0.202, 0.89*0.238, 0.89 * 0.266, 0.89 * 0.28])
psib = np.array([0.12543758, 0.13944768, 0.15, 0.20772159, 0.3213201, 0.40113872])
GDP_implied = (1.-alpha + s_emp_share/(1. - s_emp_share)*(1.-theta))/((1.-alpha)*(1. - ynb_p_gdp) - pure_sweat_share)*yc_init
econ = Economy(alpha = alpha, theta = theta, yn = ynb_p_gdp*GDP_implied, xnb = xnb_p_gdp*GDP_implied, g = g_p_gdp*GDP_implied,
scaling_n = GDP_implied, scaling_b = GDP_implied,
agrid = agrid2, kapgrid = kapgrid2, zgrid = zgrid2, rho = 0.01, upsilon = 0.50, prob = prob, la = 0.7,
taub = taub, psib = psib, taup = 0.2,
ome = ome_, varpi = varpi_, path_to_data_i_s = path_to_shock)
econ.set_prices(p = p_, rc = rc_)
with open('econ.pickle', mode='wb') as f: pickle.dump(econ, f)
t0 = time.time()
#don't forget to replace import argument
result = subprocess.run(['mpiexec', '-n', str(num_core), 'python', 'SCEconomy_nltax.py'], stdout=subprocess.PIPE)
t1 = time.time()
detailed_output_file = './log/test.txt'
f = open(detailed_output_file, 'ab') #use byte mode
f.write(result.stdout)
f.close()
with open('econ.pickle', mode='rb') as f: econ = pickle.load(f)
p = econ.p
rc = econ.rc
moms = econ.moms
dist = np.sqrt(moms[0]**2.0 + moms[1]**2.0)
if p != p_ or rc != rc_:
print('err: input prices and output prices do not coincide.')
print('p = ', p, ', p_ = ', p_)
print('rc = ', rc, ', rc_ = ', rc_)
#calc main moments
econ.print_parameters()
###calculate other important variables###
econ.calc_sweat_eq_value()
econ.calc_age()
econ.simulate_other_vars()
econ.calc_moments()
econ.save_result()