@@ -76,11 +76,11 @@ def __init__(self, information, technology, preferences):
76
76
uc = np .hstack ((np .eye (self .nc ), np .zeros ((self .nc , self .ng ))))
77
77
ug = np .hstack ((np .zeros ((self .ng , self .nc )), np .eye (self .ng )))
78
78
phiin = np .linalg .inv (np .hstack ((self .phic , self .phig )))
79
- phiinc = uc . dot ( phiin )
80
- b11 = - self .thetah . dot ( phiinc ). dot ( self .phii )
81
- a1 = self .thetah . dot ( phiinc ). dot ( self .gamma )
82
- a12 = np .vstack ((self .thetah . dot ( phiinc ). dot (
83
- self .ud ) , np .zeros ((self .nk , self .nz ))))
79
+ phiinc = uc @ phiin
80
+ b11 = - self .thetah @ phiinc @ self .phii
81
+ a1 = self .thetah @ phiinc @ self .gamma
82
+ a12 = np .vstack ((self .thetah @ phiinc @
83
+ self .ud , np .zeros ((self .nk , self .nz ))))
84
84
85
85
# === Creation of the A Matrix for the state transition of the LQ problem === #
86
86
@@ -100,11 +100,11 @@ def __init__(self, information, technology, preferences):
100
100
101
101
# === Define R,W and Q for the payoff function of the LQ problem === #
102
102
103
- self .H = np .hstack ((self .llambda , self .pih . dot ( uc ). dot ( phiin ). dot ( self .gamma ) , self .pih . dot (
104
- uc ). dot ( phiin ). dot ( self .ud ) - self .ub , - self .pih . dot ( uc ). dot ( phiin ). dot ( self .phii ) ))
105
- self .G = ug . dot ( phiin ). dot (
103
+ self .H = np .hstack ((self .llambda , self .pih @ uc @ phiin @ self .gamma , self .pih @
104
+ uc @ phiin @ self .ud - self .ub , - self .pih @ uc @ phiin @ self .phii ))
105
+ self .G = ( ug @ phiin @
106
106
np .hstack ((np .zeros ((self .nd , self .nh )), self .gamma , self .ud , - self .phii )))
107
- self .S = (self .G .T . dot ( self .G ) + self .H .T . dot ( self .H ) ) / 2
107
+ self .S = (self .G .T @ self .G + self .H .T @ self .H ) / 2
108
108
109
109
self .nx = self .nh + self .nk + self .nz
110
110
self .n = self .ni + self .nh + self .nk + self .nz
@@ -122,7 +122,7 @@ def __init__(self, information, technology, preferences):
122
122
123
123
# === Construct output matrices for our economy using the solution to the LQ problem === #
124
124
125
- self .A0 = self .A - self .B . dot ( self .F )
125
+ self .A0 = self .A - self .B @ self .F
126
126
127
127
self .Sh = self .A0 [0 :self .nh , 0 :self .nx ]
128
128
self .Sk = self .A0 [self .nh :self .nh + self .nk , 0 :self .nx ]
@@ -131,12 +131,12 @@ def __init__(self, information, technology, preferences):
131
131
self .Si = - self .F
132
132
self .Sd = np .hstack ((np .zeros ((self .nd , self .nh + self .nk )), self .ud ))
133
133
self .Sb = np .hstack ((np .zeros ((self .nb , self .nh + self .nk )), self .ub ))
134
- self .Sc = uc . dot ( phiin ). dot (- self .phii . dot ( self .Si ) +
135
- self .gamma . dot ( self .Sk1 ) + self .Sd )
136
- self .Sg = ug . dot ( phiin ). dot (- self .phii . dot ( self .Si ) +
137
- self .gamma . dot ( self .Sk1 ) + self .Sd )
138
- self .Ss = self .llambda . dot ( np .hstack ((np .eye (self .nh ), np .zeros (
139
- (self .nh , self .nk + self .nz ))))) + self .pih . dot ( self .Sc )
134
+ self .Sc = uc @ phiin @ (- self .phii @ self .Si +
135
+ self .gamma @ self .Sk1 + self .Sd )
136
+ self .Sg = ug @ phiin @ (- self .phii @ self .Si +
137
+ self .gamma @ self .Sk1 + self .Sd )
138
+ self .Ss = self .llambda @ np .hstack ((np .eye (self .nh ), np .zeros (
139
+ (self .nh , self .nk + self .nz )))) + self .pih @ self .Sc
140
140
141
141
# === Calculate eigenvalues of A0 === #
142
142
self .A110 = self .A0 [0 :self .nh + self .nk , 0 :self .nh + self .nk ]
@@ -146,14 +146,14 @@ def __init__(self, information, technology, preferences):
146
146
# === Construct matrices for Lagrange Multipliers === #
147
147
148
148
self .Mk = - 2 * self .beta .item () * (np .hstack ((np .zeros ((self .nk , self .nh )), np .eye (
149
- self .nk ), np .zeros ((self .nk , self .nz ))))). dot ( self .P ). dot ( self .A0 )
149
+ self .nk ), np .zeros ((self .nk , self .nz ))))) @ self .P @ self .A0
150
150
self .Mh = - 2 * self .beta .item () * (np .hstack ((np .eye (self .nh ), np .zeros (
151
- (self .nh , self .nk )), np .zeros ((self .nh , self .nz ))))). dot ( self .P ). dot ( self .A0 )
151
+ (self .nh , self .nk )), np .zeros ((self .nh , self .nz ))))) @ self .P @ self .A0
152
152
self .Ms = - (self .Sb - self .Ss )
153
- self .Md = - (np .linalg .inv (np .vstack ((self .phic .T , self .phig .T ))). dot (
154
- np .vstack ((self .thetah .T . dot ( self .Mh ) + self .pih .T . dot ( self .Ms ) , - self .Sg ) )))
155
- self .Mc = - (self .thetah .T . dot ( self .Mh ) + self .pih .T . dot ( self .Ms ) )
156
- self .Mi = - (self .thetak .T . dot ( self .Mk ) )
153
+ self .Md = - (np .linalg .inv (np .vstack ((self .phic .T , self .phig .T ))) @
154
+ np .vstack ((self .thetah .T @ self .Mh + self .pih .T @ self .Ms , - self .Sg )))
155
+ self .Mc = - (self .thetah .T @ self .Mh + self .pih .T @ self .Ms )
156
+ self .Mi = - (self .thetak .T @ self .Mk )
157
157
158
158
def compute_steadystate (self , nnc = 2 ):
159
159
"""
@@ -168,13 +168,13 @@ def compute_steadystate(self, nnc=2):
168
168
zx = np .eye (self .A0 .shape [0 ])- self .A0
169
169
self .zz = nullspace (zx )
170
170
self .zz /= self .zz [nnc ]
171
- self .css = self .Sc . dot ( self .zz )
172
- self .sss = self .Ss . dot ( self .zz )
173
- self .iss = self .Si . dot ( self .zz )
174
- self .dss = self .Sd . dot ( self .zz )
175
- self .bss = self .Sb . dot ( self .zz )
176
- self .kss = self .Sk . dot ( self .zz )
177
- self .hss = self .Sh . dot ( self .zz )
171
+ self .css = self .Sc @ self .zz
172
+ self .sss = self .Ss @ self .zz
173
+ self .iss = self .Si @ self .zz
174
+ self .dss = self .Sd @ self .zz
175
+ self .bss = self .Sb @ self .zz
176
+ self .kss = self .Sk @ self .zz
177
+ self .hss = self .Sh @ self .zz
178
178
179
179
def compute_sequence (self , x0 , ts_length = None , Pay = None ):
180
180
"""
@@ -195,14 +195,14 @@ def compute_sequence(self, x0, ts_length=None, Pay=None):
195
195
lq = LQ (self .Q , self .R , self .A , self .B ,
196
196
self .C , N = self .W , beta = self .beta )
197
197
xp , up , wp = lq .compute_sequence (x0 , ts_length )
198
- self .h = self .Sh . dot ( xp )
199
- self .k = self .Sk . dot ( xp )
200
- self .i = self .Si . dot ( xp )
201
- self .b = self .Sb . dot ( xp )
202
- self .d = self .Sd . dot ( xp )
203
- self .c = self .Sc . dot ( xp )
204
- self .g = self .Sg . dot ( xp )
205
- self .s = self .Ss . dot ( xp )
198
+ self .h = self .Sh @ xp
199
+ self .k = self .Sk @ xp
200
+ self .i = self .Si @ xp
201
+ self .b = self .Sb @ xp
202
+ self .d = self .Sd @ xp
203
+ self .c = self .Sc @ xp
204
+ self .g = self .Sg @ xp
205
+ self .s = self .Ss @ xp
206
206
207
207
# === Value of J-period risk-free bonds === #
208
208
# === See p.145: Equation (7.11.2) === #
@@ -212,12 +212,12 @@ def compute_sequence(self, x0, ts_length=None, Pay=None):
212
212
self .R2_Price = np .empty ((ts_length + 1 , 1 ))
213
213
self .R5_Price = np .empty ((ts_length + 1 , 1 ))
214
214
for i in range (ts_length + 1 ):
215
- self .R1_Price [i , 0 ] = self .beta * e1 . dot ( self .Mc ). dot ( np .linalg .matrix_power (
216
- self .A0 , 1 )). dot ( xp [:, i ]) / e1 . dot ( self .Mc ). dot ( xp [:, i ])
217
- self .R2_Price [i , 0 ] = self .beta ** 2 * e1 . dot ( self .Mc ). dot (
218
- np .linalg .matrix_power (self .A0 , 2 )). dot ( xp [:, i ]) / e1 . dot ( self .Mc ). dot ( xp [:, i ])
219
- self .R5_Price [i , 0 ] = self .beta ** 5 * e1 . dot ( self .Mc ). dot (
220
- np .linalg .matrix_power (self .A0 , 5 )). dot ( xp [:, i ]) / e1 . dot ( self .Mc ). dot ( xp [:, i ])
215
+ self .R1_Price [i , 0 ] = self .beta * e1 @ self .Mc @ np .linalg .matrix_power (
216
+ self .A0 , 1 ) @ xp [:, i ] / ( e1 @ self .Mc @ xp [:, i ])
217
+ self .R2_Price [i , 0 ] = self .beta ** 2 * ( e1 @ self .Mc @
218
+ np .linalg .matrix_power (self .A0 , 2 ) @ xp [:, i ]) / ( e1 @ self .Mc @ xp [:, i ])
219
+ self .R5_Price [i , 0 ] = self .beta ** 5 * ( e1 @ self .Mc @
220
+ np .linalg .matrix_power (self .A0 , 5 ) @ xp [:, i ]) / ( e1 @ self .Mc @ xp [:, i ])
221
221
222
222
# === Gross rates of return on 1-period risk-free bonds === #
223
223
self .R1_Gross = 1 / self .R1_Price
@@ -231,20 +231,20 @@ def compute_sequence(self, x0, ts_length=None, Pay=None):
231
231
# === Value of asset whose payout vector is Pay*xt === #
232
232
# See p.145: Equation (7.11.1)
233
233
if isinstance (Pay , np .ndarray ) == True :
234
- self .Za = Pay .T . dot ( self .Mc )
234
+ self .Za = Pay .T @ self .Mc
235
235
self .Q = solve_discrete_lyapunov (
236
236
self .A0 .T * self .beta ** 0.5 , self .Za )
237
237
self .q = self .beta / (1 - self .beta ) * \
238
- np .trace (self .C .T . dot ( self .Q ). dot ( self .C ) )
238
+ np .trace (self .C .T @ self .Q @ self .C )
239
239
self .Pay_Price = np .empty ((ts_length + 1 , 1 ))
240
240
self .Pay_Gross = np .empty ((ts_length + 1 , 1 ))
241
241
self .Pay_Gross [0 , 0 ] = np .nan
242
242
for i in range (ts_length + 1 ):
243
- self .Pay_Price [i , 0 ] = (xp [:, i ].T . dot ( self .Q ). dot (
244
- xp [:, i ]) + self .q ) / e1 . dot ( self .Mc ). dot ( xp [:, i ])
243
+ self .Pay_Price [i , 0 ] = (xp [:, i ].T @ self .Q @
244
+ xp [:, i ] + self .q ) / ( e1 @ self .Mc @ xp [:, i ])
245
245
for i in range (ts_length ):
246
246
self .Pay_Gross [i + 1 , 0 ] = self .Pay_Price [i + 1 ,
247
- 0 ] / (self .Pay_Price [i , 0 ] - Pay . dot ( xp [:, i ]) )
247
+ 0 ] / (self .Pay_Price [i , 0 ] - Pay @ xp [:, i ])
248
248
return
249
249
250
250
def irf (self , ts_length = 100 , shock = None ):
@@ -276,22 +276,22 @@ def irf(self, ts_length=100, shock=None):
276
276
self .b_irf = np .empty ((ts_length , self .nb ))
277
277
278
278
for i in range (ts_length ):
279
- self .c_irf [i , :] = self .Sc . dot (
280
- np .linalg .matrix_power (self .A0 , i )). dot ( self .C ). dot ( shock ).T
281
- self .s_irf [i , :] = self .Ss . dot (
282
- np .linalg .matrix_power (self .A0 , i )). dot ( self .C ). dot ( shock ).T
283
- self .i_irf [i , :] = self .Si . dot (
284
- np .linalg .matrix_power (self .A0 , i )). dot ( self .C ). dot ( shock ).T
285
- self .k_irf [i , :] = self .Sk . dot (
286
- np .linalg .matrix_power (self .A0 , i )). dot ( self .C ). dot ( shock ).T
287
- self .h_irf [i , :] = self .Sh . dot (
288
- np .linalg .matrix_power (self .A0 , i )). dot ( self .C ). dot ( shock ).T
289
- self .g_irf [i , :] = self .Sg . dot (
290
- np .linalg .matrix_power (self .A0 , i )). dot ( self .C ). dot ( shock ).T
291
- self .d_irf [i , :] = self .Sd . dot (
292
- np .linalg .matrix_power (self .A0 , i )). dot ( self .C ). dot ( shock ).T
293
- self .b_irf [i , :] = self .Sb . dot (
294
- np .linalg .matrix_power (self .A0 , i )). dot ( self .C ). dot ( shock ).T
279
+ self .c_irf [i , :] = ( self .Sc @
280
+ np .linalg .matrix_power (self .A0 , i ) @ self .C @ shock ).T
281
+ self .s_irf [i , :] = ( self .Ss @
282
+ np .linalg .matrix_power (self .A0 , i ) @ self .C @ shock ).T
283
+ self .i_irf [i , :] = ( self .Si @
284
+ np .linalg .matrix_power (self .A0 , i ) @ self .C @ shock ).T
285
+ self .k_irf [i , :] = ( self .Sk @
286
+ np .linalg .matrix_power (self .A0 , i ) @ self .C @ shock ).T
287
+ self .h_irf [i , :] = ( self .Sh @
288
+ np .linalg .matrix_power (self .A0 , i ) @ self .C @ shock ).T
289
+ self .g_irf [i , :] = ( self .Sg @
290
+ np .linalg .matrix_power (self .A0 , i ) @ self .C @ shock ).T
291
+ self .d_irf [i , :] = ( self .Sd @
292
+ np .linalg .matrix_power (self .A0 , i ) @ self .C @ shock ).T
293
+ self .b_irf [i , :] = ( self .Sb @
294
+ np .linalg .matrix_power (self .A0 , i ) @ self .C @ shock ).T
295
295
296
296
return
297
297
@@ -305,13 +305,13 @@ def canonical(self):
305
305
Ac2 = np .hstack ((np .zeros ((self .nz , self .nh )), self .a22 ))
306
306
Ac = np .vstack ((Ac1 , Ac2 ))
307
307
Bc = np .vstack ((self .thetah , np .zeros ((self .nz , self .nc ))))
308
- Rc1 = np .hstack ((self .llambda .T . dot ( self .llambda ) , -
309
- self .llambda .T . dot ( self .ub ) ))
310
- Rc2 = np .hstack ((- self .ub .T . dot ( self .llambda ) , self .ub .T . dot ( self .ub ) ))
308
+ Rc1 = np .hstack ((self .llambda .T @ self .llambda , -
309
+ self .llambda .T @ self .ub ))
310
+ Rc2 = np .hstack ((- self .ub .T @ self .llambda , self .ub .T @ self .ub ))
311
311
Rc = np .vstack ((Rc1 , Rc2 ))
312
- Qc = self .pih .T . dot ( self .pih )
312
+ Qc = self .pih .T @ self .pih
313
313
Nc = np .hstack (
314
- (self .pih .T . dot ( self .llambda ) , - self .pih .T . dot ( self .ub ) ))
314
+ (self .pih .T @ self .llambda , - self .pih .T @ self .ub ))
315
315
316
316
lq_aux = LQ (Qc , Rc , Ac , Bc , N = Nc , beta = self .beta )
317
317
@@ -320,9 +320,9 @@ def canonical(self):
320
320
self .F_b = F1 [:, 0 :self .nh ]
321
321
self .F_f = F1 [:, self .nh :]
322
322
323
- self .pihat = np .linalg .cholesky (self .pih .T . dot (
324
- self .pih ) + self .beta . dot ( self .thetah .T ). dot ( P1 [0 :self .nh , 0 :self .nh ]). dot ( self .thetah )).T
325
- self .llambdahat = self .pihat . dot ( self .F_b )
326
- self .ubhat = - self .pihat . dot ( self .F_f )
323
+ self .pihat = np .linalg .cholesky (( self .pih .T @
324
+ self .pih ) + ( self .beta @ self .thetah .T @ P1 [0 :self .nh , 0 :self .nh ] @ self .thetah )).T
325
+ self .llambdahat = self .pihat @ self .F_b
326
+ self .ubhat = - self .pihat @ self .F_f
327
327
328
328
return
0 commit comments