PageRenderTime 51ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/pymaclab/dsge/solvers/modsolvers.py

https://github.com/TomAugspurger/pymaclab
Python | 2924 lines | 2868 code | 3 blank | 53 comment | 15 complexity | 95c7bd14fdd96ba23a8aac13e0e13496 MD5 | raw file
Possible License(s): Apache-2.0

Large files files are truncated, but you can click here to view the full file

  1. '''
  2. .. module:: modsolvers
  3. :platform: Linux
  4. :synopsis: The modsolvers module is an integral part of PyMacLab and is called extensively from the DSGEmodel class in module
  5. macrolab. It contains all of the dynamic solver methods most of which make use of the DSGE models' derivatives, i.e.
  6. the computed (numerical) Jacobian and Hessian.
  7. .. moduleauthor:: Eric M. Scheffel <eric.scheffel@nottingham.edu.cn>
  8. '''
  9. from numpy import matlib as MAT
  10. from numpy import linalg as LIN
  11. from numpy.linalg import matrix_rank
  12. from .. import helpers as HLP
  13. from scipy.linalg import qz
  14. import numpy as np
  15. import pylab as P
  16. from matplotlib import pyplot as PLT
  17. import copy as COP
  18. from pymaclab.filters import hpfilter
  19. from pymaclab.filters import bkfilter
  20. from pymaclab.filters import cffilter
  21. from isolab import isolab
  22. try:
  23. import mlabraw
  24. except:
  25. pass
  26. class MODsolvers(object):
  27. def __init__(self):
  28. pass
  29. class Dynare(object):
  30. def __init__(self,attdic):
  31. self.attdic = attdic
  32. for keyo in attdic.keys():
  33. self.__setattr__(keyo,COP.deepcopy(attdic[keyo]))
  34. class PyUhlig(MODsolvers):
  35. def __init__(self,intup):
  36. self.ntup = intup[0]
  37. self.nendo = self.ntup[0]
  38. self.ncon = self.ntup[1]
  39. self.nexo = self.ntup[2]
  40. self.eqindx = intup[1]
  41. self.vreg = intup[2]
  42. self.llsys_list = intup[3]
  43. self.diffli1 = intup[4]
  44. self.diffli2 = intup[5]
  45. diffli1 = self.diffli1
  46. diffli2 = self.diffli2
  47. deteq = []
  48. for x in self.eqindx['det']:
  49. deteq.append(self.llsys_list[x])
  50. self.deteq = deteq
  51. expeq = []
  52. for x in self.eqindx['exp']:
  53. expeq.append(self.llsys_list[x])
  54. self.expeq = expeq
  55. erreq = []
  56. for x in self.eqindx['err']:
  57. erreq.append(self.llsys_list[x])
  58. self.erreq = erreq
  59. detdif1 = []
  60. detdif2 = []
  61. for x in self.eqindx['det']:
  62. detdif1.append(diffli1[x])
  63. detdif2.append(diffli2[x])
  64. expdif1 = []
  65. expdif2 = []
  66. for x in self.eqindx['exp']:
  67. expdif1.append(diffli1[x])
  68. expdif2.append(diffli2[x])
  69. errdif1 = []
  70. errdif2 = []
  71. for x in self.eqindx['err']:
  72. errdif1.append(diffli1[x])
  73. errdif2.append(diffli2[x])
  74. self.detdif1 = detdif1
  75. self.detdif2 = detdif2
  76. self.expdif1 = expdif1
  77. self.expdif2 = expdif2
  78. self.errdif1 = errdif1
  79. self.errdif2 = errdif2
  80. self.mkmats()
  81. def mkmats(self):
  82. deteq = self.deteq
  83. expeq = self.expeq
  84. erreq = self.erreq
  85. nendo = self.nendo
  86. ncon = self.ncon
  87. nexo = self.nexo
  88. vreg = self.vreg
  89. detdif1 = self.detdif1
  90. detdif2 = self.detdif2
  91. expdif1 = self.expdif1
  92. expdif2 = self.expdif2
  93. errdif1 = self.errdif1
  94. errdif2 = self.errdif2
  95. # Create argument list for matrix creation
  96. argli = [['AA',(detdif2,detdif1),deteq,(len(deteq),nendo),(None,'endo','0')],
  97. ['BB',(detdif2,detdif1),deteq,(len(deteq),nendo),(None,'endo','-1')],
  98. ['CC',(detdif2,detdif1),deteq,(len(deteq),ncon),(None,'con','0')],
  99. ['DD',(detdif2,detdif1),deteq,(len(deteq),nexo),(None,'exo','0')],
  100. ['FF',(expdif2,expdif1),expeq,(len(expeq),nendo),('0','endo','1')],
  101. ['GG',(expdif2,expdif1),expeq,(len(expeq),nendo),(None,'endo','0')],
  102. ['HH',(expdif2,expdif1),expeq,(len(expeq),nendo),(None,'endo','-1')],
  103. ['JJ',(expdif2,expdif1),expeq,(len(expeq),ncon),('0','con','1')],
  104. ['KK',(expdif2,expdif1),expeq,(len(expeq),ncon),(None,'con','0')],
  105. ['LL',(expdif2,expdif1),expeq,(len(expeq),nexo),('0','exo','1')],
  106. ['MM',(expdif2,expdif1),expeq,(len(expeq),nexo),(None,'exo','0')],
  107. ['NN',(errdif2,errdif1),erreq,(len(erreq),nexo),(None,'exo','0')]]
  108. # Create all matrices in a loop over argli
  109. for argx in argli:
  110. XX = MAT.zeros(argx[3])
  111. dic1 = dict([[x,'0'] for x in range(argx[3][1])])
  112. sXX = dict([[x,COP.deepcopy(dic1)] for x in range(len(argx[2]))])
  113. for y,x in enumerate(argx[2]):
  114. if vreg(argx[4],x,False,'max'):
  115. cont=[[z[0],z[1][1]] for z in vreg(argx[4],x,True,'min')]
  116. for z in cont:
  117. XX[y,z[1]] = argx[1][0][y][z[0]]
  118. sXX[y][z[1]] = argx[1][1][y][z[0]]
  119. exec('self.'+argx[0]+' = XX')
  120. exec('self.'+'s'+argx[0]+' = sXX')
  121. def solve(self,sol_method='do_QZ',Xi_select='all'):
  122. self.output = {}
  123. self.Xi_select = Xi_select
  124. self.sol_method = sol_method
  125. if self.sol_method == 'do_PP':
  126. self.do_PP(self.Xi_select)
  127. elif self.sol_method == 'do_QZ':
  128. self.do_QZ(self.Xi_select,Tol=1.0000e-06)
  129. self.do_QRS()
  130. def do_QZ(self,Xi_select='all',Tol=1.0000e-06):
  131. # Make uhlig matrices locally available for computations
  132. AA = self.AA
  133. BB = self.BB
  134. CC = self.CC
  135. DD = self.DD
  136. FF = self.FF
  137. GG = self.GG
  138. HH = self.HH
  139. JJ = self.JJ
  140. KK = self.KK
  141. LL = self.LL
  142. MM = self.MM
  143. NN = self.NN
  144. q_expectational_equ = np.shape(FF)[0]
  145. m_states = np.shape(FF)[1]
  146. l_equ = np.shape(CC)[0]
  147. n_endog = np.shape(CC)[1]
  148. k_exog = min(np.shape(NN))
  149. # if HLP.rank(CC) < n_endog:
  150. if matrix_rank(CC) < n_endog:
  151. raise uhlerr, 'uhlerror: Rank(CC) needs to be at least\n\
  152. equal to the number of endogenous variables'
  153. if l_equ == 0:
  154. CC_plus = LIN.pinv(CC)
  155. CC_0 = (HLP.null(CC.T)).T
  156. Psi_mat = FF
  157. Gamma_mat = -GG
  158. Theta_mat = -HH
  159. Xi_mat = \
  160. np.concatenate((Gamma_mat,Theta_mat,MAT.eye(m_states),\
  161. MAT.zeros((m_states,m_states))),1)
  162. Delta_mat = \
  163. np.concatenate((Psi_mat,MAT.zeros((m_states,m_states)),\
  164. MAT.zeros((m_states,m_states)),\
  165. MAT.zeros((m_states,m_states)),MAT.eye(m_states),1))
  166. else:
  167. CC_plus = LIN.pinv(CC)
  168. CC_0 = HLP.null(CC.T)
  169. if l_equ > n_endog:
  170. Psi_mat = \
  171. np.concatenate((MAT.zeros((l_equ-n_endog,m_states)),FF-JJ*CC_plus*AA),1)
  172. elif l_equ == n_endog:
  173. Psi_mat = np.concatenate((FF-JJ*CC_plus*AA),1)
  174. Gamma_mat = np.concatenate((CC_0*AA, JJ*CC_plus*BB-GG+KK*CC_plus*AA))
  175. Theta_mat = np.concatenate((CC_0*BB, KK*CC_plus*BB-HH))
  176. Xi_mat = \
  177. np.concatenate((\
  178. np.concatenate((Gamma_mat,Theta_mat),1),\
  179. np.concatenate((MAT.identity(m_states),MAT.zeros((m_states,m_states))),1)\
  180. ))
  181. Psi_mat = Psi_mat.reshape(m_states,m_states)
  182. Delta_mat = \
  183. np.concatenate((\
  184. np.concatenate((Psi_mat,MAT.zeros((m_states,m_states))),1),\
  185. np.concatenate((MAT.zeros((m_states,m_states)),MAT.identity(m_states)),1)\
  186. ))
  187. # (Delta_up,Xi_up,UUU,VVV)=\
  188. # HLP.qz(Delta_mat,Xi_mat,\
  189. # mode='complex',\
  190. # lapackname=lapackname,\
  191. # lapackpath=lapackpath)
  192. (Delta_up,Xi_up,UUU,VVV) = qz(Delta_mat,Xi_mat)
  193. d_Delta_up = MAT.diag(Delta_up)
  194. d_Xi_up = MAT.diag(Xi_up)
  195. Xi_eigval = MAT.zeros(N.shape(Delta_up))
  196. for i1 in range(0,N.shape(Delta_up)[0],1):
  197. Xi_eigval[i1,i1] = d_Xi_up[i1]/d_Delta_up[i1]
  198. d_Xi_eigval = np.diag(Xi_eigval)
  199. mat_tmp = MAT.zeros((N.shape(Xi_eigval)[0],3))
  200. i1=0
  201. for x in d_Xi_eigval:
  202. mat_tmp[i1,0] = d_Xi_eigval[i1]
  203. mat_tmp[i1,1] = abs(d_Xi_eigval)[i1]
  204. mat_tmp[i1,2] = i1
  205. i1=i1+1
  206. Xi_sortval = HLP.sortrows(mat_tmp,1)[:,0]
  207. # Need to do an argsort() on index column to turn to integers (Booleans) !!
  208. Xi_sortindex = HLP.sortrows(mat_tmp,1)[:,2].argsort(axis=0)
  209. Xi_sortabs = HLP.sortrows(mat_tmp,1)[:,1]
  210. # Root selection branch with Xi_select
  211. if Xi_select == 'all':
  212. Xi_select = np.arange(0,m_states,1)
  213. stake = max(abs(Xi_sortval[Xi_select])) + Tol
  214. (Delta_up,Xi_up,UUU,VVV) = self.qzdiv(stake,Delta_up,Xi_up,UUU,VVV)
  215. Lamda_mat = np.diag(Xi_sortval[Xi_select])
  216. trVVV = VVV.conjugate().T
  217. VVV_2_1 = trVVV[m_states:2*m_states,0:m_states]
  218. VVV_2_2 = trVVV[m_states:2*m_states,m_states:2*m_states]
  219. UUU_2_1 = UUU[m_states:2*m_states,0:m_states]
  220. PP = -(VVV_2_1.I*VVV_2_2)
  221. PP = np.real(PP)
  222. self.PP = PP
  223. self.CC_plus = CC_plus
  224. def do_PP(self,Xi_select='all'):
  225. # Make uhlig matrices locally available for computations
  226. AA = self.AA
  227. BB = self.BB
  228. CC = self.CC
  229. DD = self.DD
  230. FF = self.FF
  231. GG = self.GG
  232. HH = self.HH
  233. JJ = self.JJ
  234. KK = self.KK
  235. LL = self.LL
  236. MM = self.MM
  237. NN = self.NN
  238. q_expectational_equ = np.shape(FF)[0]
  239. m_states = np.shape(FF)[1]
  240. l_equ = np.shape(CC)[0]
  241. n_endog = np.shape(CC)[1]
  242. k_exog = min(N.shape(NN))
  243. # if HLP.rank(CC) < n_endog:
  244. if matrix_rank(CC) < n_endog:
  245. raise uhlerr, 'uhlerror: Rank(CC) needs to be at least\n\
  246. equal to the number of endogenous variables'
  247. if l_equ == 0:
  248. CC_plus = LIN.pinv(CC)
  249. CC_0 = (HLP.null(CC.T)).T
  250. Psi_mat = FF
  251. Gamma_mat = -GG
  252. Theta_mat = -HH
  253. Xi_mat = \
  254. np.concatenate((Gamma_mat,Theta_mat,MAT.eye(m_states),\
  255. MAT.zeros((m_states,m_states))),1)
  256. Delta_mat = \
  257. np.concatenate((Psi_mat,MAT.zeros((m_states,m_states)),\
  258. MAT.zeros((m_states,m_states)),\
  259. MAT.zeros((m_states,m_states)),MAT.eye(m_states),1))
  260. else:
  261. CC_plus = LIN.pinv(CC)
  262. CC_0 = HLP.null(CC.T)
  263. if l_equ > n_endog:
  264. Psi_mat = \
  265. np.concatenate((MAT.zeros((l_equ-n_endog,m_states)),FF-JJ*CC_plus*AA),1)
  266. elif l_equ == n_endog:
  267. Psi_mat = np.concatenate((FF-JJ*CC_plus*AA),1)
  268. Gamma_mat = np.concatenate((CC_0*AA, JJ*CC_plus*BB-GG+KK*CC_plus*AA))
  269. Theta_mat = np.concatenate((CC_0*BB, KK*CC_plus*BB-HH))
  270. Xi_mat = \
  271. np.concatenate((\
  272. np.concatenate((Gamma_mat,Theta_mat),1),\
  273. np.concatenate((MAT.eye(m_states),MAT.zeros((m_states,m_states))),1)\
  274. ))
  275. Delta_mat = \
  276. np.concatenate((\
  277. np.concatenate((Psi_mat,MAT.zeros((m_states,m_states))),1),\
  278. np.concatenate((MAT.zeros((m_states,m_states)),MAT.eye(m_states)),1)\
  279. ))
  280. (Xi_eigvec,Xi_eigval) = HLP.eig(Xi_mat,Delta_mat)
  281. tmp_mat = MAT.eye(N.rank(Xi_eigvec))
  282. for i1 in range(0,N.rank(Xi_eigvec),1):
  283. tmp_mat[i1,i1] = float(Xi_eigval[0,i1])
  284. Xi_eigval = tmp_mat
  285. # if HLP.rank(Xi_eigvec) < m_states:
  286. if matrix_rank(Xi_eigvec) < m_states:
  287. raise uhlerr, 'uhlerror: Xi_mat is not diagonalizable!\n\
  288. Cannot solve for PP. Maybe you should try the Schur-Decomposition\n\
  289. method instead, use do_QZ()!!'
  290. d_Xi_eigval = np.diag(Xi_eigval)
  291. mat_tmp = MAT.zeros((N.rank(Xi_eigval),3))
  292. i1=0
  293. for x in d_Xi_eigval:
  294. mat_tmp[i1,0] = d_Xi_eigval[i1]
  295. mat_tmp[i1,1] = abs(d_Xi_eigval[i1])
  296. mat_tmp[i1,2] = i1
  297. i1=i1+1
  298. Xi_sortval = HLP.sortrows(mat_tmp,1)[:,0]
  299. # Need to do an argsort() on index column to turn to integers (Booleans) !!
  300. Xi_sortindex = HLP.sortrows(mat_tmp,1)[:,2].argsort(axis=0)
  301. Xi_sortabs = HLP.sortrows(mat_tmp,1)[:,1]
  302. Xi_sortvec = Xi_eigvec[0:2*m_states,:].take(Xi_sortindex.T.A, axis=1)
  303. # Root selection branch with Xi_select
  304. if Xi_select == 'all':
  305. Xi_select = np.arange(0,m_states,1)
  306. #Create Lambda_mat and Omega_mat
  307. Lambda_mat = MAT.zeros((len(Xi_select),len(Xi_select)))
  308. for i1 in range(0,len(Xi_select),1):
  309. Lambda_mat[i1,i1] = Xi_sortval[Xi_select][i1]
  310. Omega_mat = Xi_sortvec[m_states:2*m_states,:].take(Xi_select, axis=1)
  311. # if HLP.rank(Omega_mat) < m_states:
  312. if matrix_rank(Omega_mat) < m_states:
  313. raise uhlerr, 'uhlerror: Omega_mat is not invertible!!\n\
  314. Therefore, solution for PP is not available'
  315. PP = Omega_mat*HLP.ctr((HLP.ctr(Omega_mat).I*HLP.ctr(Lambda_mat)))
  316. self.PP = PP
  317. self.CC_plus = CC_plus
  318. def do_QRS(self):
  319. # Make uhlig matrices locally available for computations
  320. AA = self.AA
  321. BB = self.BB
  322. CC = self.CC
  323. DD = self.DD
  324. FF = self.FF
  325. GG = self.GG
  326. HH = self.HH
  327. JJ = self.JJ
  328. KK = self.KK
  329. LL = self.LL
  330. MM = self.MM
  331. NN = self.NN
  332. PP = self.PP
  333. CC_plus = self.CC_plus
  334. (l_equ,m_states) = MAT.shape(AA)
  335. (l_equ,n_endog) = MAT.shape(CC)
  336. (l_equ,k_exog) = MAT.shape(DD)
  337. if l_equ == 0:
  338. RR = MAT.zeros((0,m_states))
  339. VV1 = MAT.kron(MAT.transpose(NN),FF)+MAT.kron(MAT.identity(k_exog),FF*PP+GG)
  340. VV2 = MAT.kron(MAT.transpose(NN),JJ)+MAT.kron(MAT.identity(k_exog),KK)
  341. VV = MAT.hstack((VV1,VV2))
  342. else:
  343. RR = -CC_plus*(AA*PP+BB)
  344. VV1 = MAT.kron(MAT.identity(k_exog),AA)
  345. VV2 = MAT.kron(MAT.identity(k_exog),CC)
  346. VV3 = MAT.kron(MAT.transpose(NN),FF)+MAT.kron(MAT.identity(k_exog),FF*PP+JJ*RR+GG)
  347. VV4 = MAT.kron(MAT.transpose(NN),JJ)+MAT.kron(MAT.identity(k_exog),KK)
  348. VV = MAT.vstack((MAT.hstack((VV1,VV2)),MAT.hstack((VV3,VV4))))
  349. self.RR = RR
  350. LLNN_plus_MM = LL*NN+MM
  351. NON = MAT.hstack((DD.flatten(1),LLNN_plus_MM.flatten(1)))
  352. try:
  353. QQSS_vec = -(VV.I*MAT.transpose(NON))
  354. except MyErr:
  355. print 'Error: Matrix VV is not invertible!'
  356. QQ = QQSS_vec[0:m_states*k_exog,:].reshape(-1,m_states).transpose()
  357. SS = QQSS_vec[(m_states*k_exog):((m_states+n_endog)*k_exog),:].reshape(-1,n_endog).transpose()
  358. WW1 = MAT.hstack((MAT.identity(m_states),MAT.zeros((m_states,k_exog))))
  359. WW2 = MAT.hstack((RR*LIN.pinv(PP),SS-RR*LIN.pinv(PP)*QQ))
  360. WW3 = MAT.hstack((MAT.zeros((k_exog,m_states)),MAT.identity(k_exog)))
  361. WW = MAT.vstack((WW1,WW2,WW3))
  362. self.WW = WW
  363. self.QQ = QQ
  364. self.SS = SS
  365. del self.CC_plus
  366. def qzdiv(self,stake,A,B,Q,Z):
  367. n = np.shape(A)[0]
  368. root = np.hstack((abs(N.mat(N.diag(A)).T),abs(N.mat(N.diag(B)).T)))
  369. index_mat = (root[:,0]<1e-13).choose(root[:,0],1)
  370. index_mat = (index_mat>1e-13).choose(root[:,0],0)
  371. root[:,0] = root[:,0]-MAT.multiply(index_mat,(root[:,0]+root[:,1]))
  372. root[:,1] = root[:,1]/root[:,0]
  373. for i1 in range(n-1,-1,-1):
  374. m='none'
  375. for i2 in range(i1,-1,-1):
  376. if root[i2,1] > stake or root[i2,1] < -0.1:
  377. m=i2
  378. break
  379. if m == 'none':
  380. return (A,B,Q,Z)
  381. else:
  382. for i3 in range(m,i1,1):
  383. (A,B,Q,Z) = self.qzswitch(i3,A,B,Q,Z)
  384. tmp = COP.deepcopy(root[i3,1])
  385. root[i3,1] = root[i3+1,1]
  386. root[i3+1,1] = tmp
  387. def qzswitch(self,i,A,B,Q,Z):
  388. a = A[i,i]
  389. d = B[i,i]
  390. b = A[i,i+1]
  391. e = B[i,i+1]
  392. c = A[i+1,i+1]
  393. f = B[i+1,i+1]
  394. wz = np.mat(N.hstack(((c*e-f*b),(c*d-f*a).conjugate().T)))
  395. xy = np.mat(N.hstack(((b*d-e*a).conjugate().T,(c*d-f*a).conjugate().T)))
  396. n = np.mat(N.sqrt(wz*wz.conjugate().T))
  397. m = np.mat(N.sqrt(xy*xy.conjugate().T))
  398. if n.all() == 0:
  399. return
  400. else:
  401. wz = np.mat(wz/n)
  402. xy = np.mat(xy/m)
  403. wz = np.vstack((wz,N.hstack((-wz[:,1].T,wz[:,0].T))))
  404. xy = np.vstack((xy,N.hstack((-xy[:,1].T,xy[:,0].T))))
  405. A[i:i+2,:] = xy*A[i:i+2,:]
  406. B[i:i+2,:] = xy*B[i:i+2,:]
  407. A[:,i:i+2] = A[:,i:i+2]*wz
  408. B[:,i:i+2] = B[:,i:i+2]*wz
  409. Z[:,i:i+2] = Z[:,i:i+2]*wz
  410. Q[i:i+2,:] = xy*Q[i:i+2,:]
  411. return (A,B,Q,Z)
  412. #----------------------------------------------------------------------------------------------------------------------
  413. class MatUhlig:
  414. def __init__(self,intup):
  415. self.ntup = intup[0]
  416. self.nendo = self.ntup[0]
  417. self.ncon = self.ntup[1]
  418. self.nexo = self.ntup[2]
  419. self.eqindx = intup[1]
  420. self.vreg = intup[2]
  421. self.llsys_list = intup[3]
  422. self.diffli1 = intup[4]
  423. self.diffli2 = intup[5]
  424. self.sess1 = intup[6]
  425. self.vardic = intup[7]
  426. diffli1 = self.diffli1
  427. diffli2 = self.diffli2
  428. deteq = []
  429. for x in self.eqindx['det']:
  430. deteq.append(self.llsys_list[x])
  431. self.deteq = deteq
  432. expeq = []
  433. for x in self.eqindx['exp']:
  434. expeq.append(self.llsys_list[x])
  435. self.expeq = expeq
  436. erreq = []
  437. for x in self.eqindx['err']:
  438. erreq.append(self.llsys_list[x])
  439. self.erreq = erreq
  440. detdif1 = []
  441. detdif2 = []
  442. for x in self.eqindx['det']:
  443. detdif1.append(diffli1[x])
  444. detdif2.append(diffli2[x])
  445. expdif1 = []
  446. expdif2 = []
  447. for x in self.eqindx['exp']:
  448. expdif1.append(diffli1[x])
  449. expdif2.append(diffli2[x])
  450. errdif1 = []
  451. errdif2 = []
  452. for x in self.eqindx['err']:
  453. errdif1.append(diffli1[x])
  454. errdif2.append(diffli2[x])
  455. self.detdif1 = detdif1
  456. self.detdif2 = detdif2
  457. self.expdif1 = expdif1
  458. self.expdif2 = expdif2
  459. self.errdif1 = errdif1
  460. self.errdif2 = errdif2
  461. self.mkmats()
  462. def mkmats(self):
  463. deteq = self.deteq
  464. expeq = self.expeq
  465. erreq = self.erreq
  466. nendo = self.nendo
  467. ncon = self.ncon
  468. nexo = self.nexo
  469. vreg = self.vreg
  470. detdif1 = self.detdif1
  471. detdif2 = self.detdif2
  472. expdif1 = self.expdif1
  473. expdif2 = self.expdif2
  474. errdif1 = self.errdif1
  475. errdif2 = self.errdif2
  476. # Create argument list for matrix creation
  477. argli = [['AA',(detdif2,detdif1),deteq,(len(deteq),nendo),(None,'endo','0')],
  478. ['BB',(detdif2,detdif1),deteq,(len(deteq),nendo),(None,'endo','-1')],
  479. ['CC',(detdif2,detdif1),deteq,(len(deteq),ncon),(None,'con','0')],
  480. ['DD',(detdif2,detdif1),deteq,(len(deteq),nexo),(None,'exo','0')],
  481. ['FF',(expdif2,expdif1),expeq,(len(expeq),nendo),('0','endo','1')],
  482. ['GG',(expdif2,expdif1),expeq,(len(expeq),nendo),(None,'endo','0')],
  483. ['HH',(expdif2,expdif1),expeq,(len(expeq),nendo),(None,'endo','-1')],
  484. ['JJ',(expdif2,expdif1),expeq,(len(expeq),ncon),('0','con','1')],
  485. ['KK',(expdif2,expdif1),expeq,(len(expeq),ncon),(None,'con','0')],
  486. ['LL',(expdif2,expdif1),expeq,(len(expeq),nexo),('0','exo','1')],
  487. ['MM',(expdif2,expdif1),expeq,(len(expeq),nexo),(None,'exo','0')],
  488. ['NN',(errdif2,errdif1),erreq,(len(erreq),nexo),(None,'exo','0')]]
  489. # Create all matrices in a loop over argli
  490. for argx in argli:
  491. XX = MAT.zeros(argx[3])
  492. dic1 = dict([[x,'0'] for x in range(argx[3][1])])
  493. sXX = dict([[x,COP.deepcopy(dic1)] for x in range(len(argx[2]))])
  494. for y,x in enumerate(argx[2]):
  495. if vreg(argx[4],x,False,'max'):
  496. cont=[[z[0],z[1][1]] for z in vreg(argx[4],x,True,'min')]
  497. for z in cont:
  498. XX[y,z[1]] = argx[1][0][y][z[0]]
  499. sXX[y][z[1]] = argx[1][1][y][z[0]]
  500. exec('self.'+argx[0]+' = XX')
  501. exec('self.'+'s'+argx[0]+' = sXX')
  502. def solve(self,sol_method='do_QZ',Xi_select='all'):
  503. # Create varnames with correct string length
  504. tmp_list =[x[1] for x in self.vardic['endo']['var']]\
  505. +[x[1] for x in self.vardic['con']['var']]\
  506. +[x[1] for x in self.vardic['exo']['var']]
  507. tmp_list2 = [[len(x),x] for x in tmp_list]
  508. tmp_list2.sort()
  509. max_len = tmp_list2[-1][0]
  510. i1=0
  511. for x in tmp_list:
  512. tmp_list[i1]=x+(max_len-len(x))*' '
  513. i1=i1+1
  514. varnstring = 'VARNAMES = ['
  515. for x in tmp_list:
  516. varnstring = varnstring + "'" +x[1]+ "'" + ','
  517. varnstring = varnstring[0:-1]+'];'
  518. # Start matlab session and calculate
  519. sess1 = self.sess1
  520. mlabraw.eval(sess1,'clear all;')
  521. mlabraw.eval(sess1,varnstring)
  522. mlabraw.put(sess1,'AA',self.AA)
  523. mlabraw.put(sess1,'BB',self.BB)
  524. mlabraw.put(sess1,'CC',self.CC)
  525. mlabraw.put(sess1,'DD',self.DD)
  526. mlabraw.put(sess1,'FF',self.FF)
  527. mlabraw.put(sess1,'GG',self.GG)
  528. mlabraw.put(sess1,'HH',self.HH)
  529. mlabraw.put(sess1,'JJ',self.JJ)
  530. mlabraw.put(sess1,'KK',self.KK)
  531. mlabraw.put(sess1,'LL',self.LL)
  532. mlabraw.put(sess1,'MM',self.MM)
  533. mlabraw.put(sess1,'NN',self.NN)
  534. mlabraw.eval(sess1,'cd '+mlabpath)
  535. mlabraw.eval(sess1,'cd Toolkit41')
  536. message = ' '*70
  537. eval_list = ['message='+"'"+message+"'",
  538. 'warnings = [];',
  539. 'options;',
  540. 'solve;']
  541. try:
  542. for x in eval_list:
  543. mlabraw.eval(sess1,x)
  544. self.PP = np.matrix(mlabraw.get(sess1,'PP'))
  545. self.QQ = np.matrix(mlabraw.get(sess1,'QQ'))
  546. self.RR = np.matrix(mlabraw.get(sess1,'RR'))
  547. self.SS = np.matrix(mlabraw.get(sess1,'SS'))
  548. self.WW = np.matrix(mlabraw.get(sess1,'WW'))
  549. except MyErr:
  550. pass
  551. finally:
  552. return
  553. #----------------------------------------------------------------------------------------------------------------------
  554. class MatKlein:
  555. def __init__(self,intup):
  556. self.sess1 = intup[-1]
  557. self.uhlig = PyUhlig(intup[:-1])
  558. self.uhlig.mkmats()
  559. self.AA = self.uhlig.AA
  560. self.BB = self.uhlig.BB
  561. self.CC = self.uhlig.CC
  562. self.DD = self.uhlig.DD
  563. self.FF = self.uhlig.FF
  564. self.GG = self.uhlig.GG
  565. self.HH = self.uhlig.HH
  566. self.JJ = self.uhlig.JJ
  567. self.KK = self.uhlig.KK
  568. self.LL = self.uhlig.LL
  569. self.MM = self.uhlig.MM
  570. self.NN = self.uhlig.NN
  571. self.mkKleinMats()
  572. self.outdic = {}
  573. def mkKleinMats(self):
  574. # Make uhlig matrices locally available for computations
  575. AA = self.AA
  576. BB = self.BB
  577. CC = self.CC
  578. DD = self.DD
  579. FF = self.FF
  580. GG = self.GG
  581. HH = self.HH
  582. JJ = self.JJ
  583. KK = self.KK
  584. LL = self.LL
  585. MM = self.MM
  586. NN = self.NN
  587. # Determine size of states, endogenous
  588. exo_st = MAT.shape(NN)[1]
  589. endo_st = MAT.shape(BB)[1]
  590. endo_cn = MAT.shape(CC)[1]
  591. n_deteq = MAT.shape(AA)[0]
  592. n_expeq = MAT.shape(JJ)[0]
  593. tot_st = exo_st+endo_st
  594. self.tstates = tot_st
  595. tot_var = tot_st+endo_cn
  596. klein_A_rtwo = MAT.hstack((LL,GG))
  597. klein_A_rtwo = MAT.hstack((klein_A_rtwo,JJ))
  598. klein_A_rtwo_rows = MAT.shape(klein_A_rtwo)[0]
  599. klein_A_rtwo_cols = MAT.shape(klein_A_rtwo)[1]
  600. klein_A_rone = MAT.zeros((exo_st,klein_A_rtwo_cols))
  601. klein_A_rone = MAT.hstack((MAT.identity(exo_st),klein_A_rone[:,exo_st:]))
  602. klein_A_rthree = MAT.hstack((MAT.zeros((n_deteq,exo_st)),AA))
  603. klein_A_rthree = MAT.hstack((klein_A_rthree,MAT.zeros((n_deteq,endo_cn))))
  604. klein_A = MAT.vstack((klein_A_rone,klein_A_rtwo))
  605. klein_A = MAT.vstack((klein_A,klein_A_rthree))
  606. klein_B_rone = MAT.zeros((exo_st,klein_A_rtwo_cols))
  607. klein_B_rone = MAT.hstack((NN,klein_B_rone[:,exo_st:]))
  608. klein_B_rtwo = MAT.hstack((-MM,-HH))
  609. klein_B_rtwo = MAT.hstack((klein_B_rtwo,-KK))
  610. klein_B_rthree = MAT.hstack((-DD,-BB))
  611. klein_B_rthree = MAT.hstack((klein_B_rthree,-CC))
  612. klein_B = MAT.vstack((klein_B_rone,klein_B_rtwo))
  613. klein_B = MAT.vstack((klein_B,klein_B_rthree))
  614. self.A = klein_A
  615. self.B = klein_B
  616. def solve(self):
  617. A = self.A
  618. B = self.B
  619. tstates = self.tstates
  620. sess1 = self.sess1
  621. mlabraw.eval(sess1,'clear all;')
  622. mlabraw.eval(sess1,'cd '+mlabpath)
  623. mlabraw.eval(sess1,'cd Klein')
  624. mlabraw.put(sess1,'AA',A)
  625. mlabraw.put(sess1,'BB',B)
  626. mlabraw.put(sess1,'tstates',tstates)
  627. try:
  628. mlabraw.eval(sess1,'[F,P,Z11]=solab(AA,BB,tstates)')
  629. self.F = np.matrix(mlabraw.get(sess1,'F'))
  630. self.P = np.matrix(mlabraw.get(sess1,'P'))
  631. self.Z11 = np.matrix(mlabraw.get(sess1,'Z11'))
  632. self.outdic['P'] = self.P
  633. self.outdic['F'] = self.F
  634. except MyErr:
  635. pass
  636. finally:
  637. return
  638. #----------------------------------------------------------------------------------------------------------------------
  639. class MatKleinD:
  640. def __init__(self,intup):
  641. self.interm3 = intup[0]
  642. self.param = intup[1]
  643. self.sstate_list = intup[2]
  644. self.varvecs = intup[3]
  645. self.vardic = intup[4]
  646. self.vardic2 = intup[5]
  647. self.shockdic = intup[6]
  648. self.shockdic2 = intup[7]
  649. self.varns = intup[8]
  650. self.re_var = intup[9]
  651. self.re_var2 = intup[10]
  652. self.ishockdic = intup[11]
  653. self.ishockdic2 = intup[12]
  654. self.sess1 = intup[13]
  655. self.sstate = intup[14]
  656. self.mkeqs()
  657. self.mkvarl()
  658. self.mkeqs2()
  659. self.mkgrad()
  660. self.mkAB()
  661. self.solab()
  662. self.mkhess()
  663. self.solab2()
  664. def mkeqs(self):
  665. list_tmp = COP.deepcopy(self.interm3)
  666. reg2 = RE.compile('\*{2,2}')
  667. reva2 = self.re_var2
  668. i1=0
  669. for x in list_tmp:
  670. list_tmp[i1]=reg2.sub('^',x.split('=')[0]).strip()
  671. for y in self.subvars(tuple(self.varvecs['e'])):
  672. while y in list_tmp[i1]:
  673. list_tmp[i1] = list_tmp[i1].replace(y,'1')
  674. i1=i1+1
  675. self.interm4 = list_tmp
  676. def mkvarl(self):
  677. varlist=[]
  678. nexost = len(self.varvecs['z'])
  679. nendost = len(self.varvecs['k'])
  680. nendocon = len(self.varvecs['y'])
  681. exost_f = makeForward(self.varvecs['z'],'1','0')
  682. for x in exost_f:
  683. varlist.append(x)
  684. for x in self.varvecs['k']:
  685. varlist.append(x)
  686. endocons_f = makeForward(self.varvecs['y'],'1','0')
  687. for x in endocons_f:
  688. varlist.append(x)
  689. exost_l = self.varvecs['z']
  690. for x in exost_l:
  691. varlist.append(x)
  692. endost_l = makeLags(self.varvecs['k'],'1')
  693. for x in endost_l:
  694. varlist.append(x)
  695. for x in self.varvecs['y']:
  696. varlist.append(x)
  697. varlist2 = list(self.subvars(tuple(varlist)))
  698. self.vlist = varlist2
  699. varlist=[]
  700. for x in self.varvecs['z']:
  701. varlist.append(x)
  702. for x in self.varvecs['k']:
  703. varlist.append(x)
  704. endocons_f = makeForward(self.varvecs['y'],'1','0')
  705. for x in endocons_f:
  706. varlist.append(x)
  707. exost_l = makeLags(self.varvecs['z'],'1')
  708. for x in exost_l:
  709. varlist.append(x)
  710. endost_l = makeLags(self.varvecs['k'],'1')
  711. for x in endost_l:
  712. varlist.append(x)
  713. for x in self.varvecs['y']:
  714. varlist.append(x)
  715. varlist2 = list(self.subvars(tuple(varlist)))
  716. self.vlist2 = varlist2
  717. def mkeqs2(self):
  718. nexost = len(self.varvecs['z'])
  719. nendost = len(self.varvecs['k'])
  720. nendocon = len(self.varvecs['y'])
  721. list_tmp1 = COP.deepcopy(self.interm4)
  722. eq_len = len(self.interm4)
  723. sub_list2 = self.vlist2
  724. sub_list = self.vlist
  725. reva2 = self.re_var2
  726. i1=0
  727. for x in list_tmp1:
  728. str_tmp1 = x[:]
  729. i2=0
  730. for y1,y2 in zip(sub_list,sub_list2):
  731. if i1 < eq_len-nexost:
  732. while reva2.search(str_tmp1) != None:
  733. ma1 = reva2.search(str_tmp1)
  734. indx1 = sub_list.index(ma1.group(0))
  735. str_tmp1 = str_tmp1.replace(ma1.group(0),'exp(x0('+str(indx1+1)+'))')[:]
  736. i2 = i2 + 1
  737. else:
  738. while reva2.search(str_tmp1) != None:
  739. ma2 = reva2.search(str_tmp1)
  740. indx2 = sub_list2.index(ma2.group(0))
  741. str_tmp1 = str_tmp1.replace(ma2.group(0),'exp(x0('+str(indx2+1)+'))')[:]
  742. i2 = i2 + 1
  743. list_tmp1[i1] = str_tmp1
  744. i1=i1+1
  745. self.interm5 = list_tmp1
  746. def mkfunc(self):
  747. rege = RE.compile('\*{2,2}')
  748. inde = ' '*2
  749. eq_len=len(self.interm5)
  750. mfile=open(path_opts['MlabPath']['path']+'/Klein/'+'mfunc.m','w')
  751. mfile.write('function y = mfunc(x0)\n')
  752. mfile.write(inde+'%Parameter Values\n')
  753. for x in self.param.items():
  754. mfile.write(inde+x[0]+'='+str(x[1])+';\n')
  755. mfile.write('\n')
  756. mfile.write(inde+'%Steady State Values\n')
  757. for x in self.sstate_list:
  758. x[0]=rege.sub('^',x[0])
  759. x[1]=rege.sub('^',x[1])
  760. mfile.write(inde+x[0]+'='+str(x[1])+';\n')
  761. mfile.write('\n')
  762. mfile.write(inde+'y=zeros('+str(eq_len)+',1);\n')
  763. mfile.write('\n')
  764. for i1,i2 in zip(range(1,eq_len+1,1),self.interm5):
  765. mfile.write(inde+'y('+str(i1)+')='+i2+';'+'\n')
  766. mfile.close()
  767. def mkgrad(self):
  768. self.mkfunc()
  769. sess1 = self.sess1
  770. sstate = self.sstate
  771. ssdic = sstate[0]
  772. ssdic.update(sstate[1])
  773. ssdic2 = {}
  774. for x in ssdic.keys():
  775. if x[-4:] == '_bar':
  776. ssdic2[x] = ssdic[x]
  777. for x in ssdic2.keys():
  778. ssdic2[x] = np.log(ssdic2[x])
  779. vlist2 = []
  780. for x in self.vlist:
  781. ma = self.re_var2.search(x)
  782. tvar = ma.group('var')
  783. tvar = tvar.upper()
  784. tvar = tvar+'_bar'
  785. vlist2.append(tvar)
  786. invec = []
  787. for x in vlist2:
  788. invec.append(ssdic2[x])
  789. mlabraw.eval(sess1,'clear all;')
  790. mlabraw.eval(sess1,'cd '+path_opts['MlabPath']['path'])
  791. mlabraw.eval(sess1,'cd Klein')
  792. mlabraw.put(sess1,'x0',invec)
  793. mlabraw.eval(sess1,"grdm=centgrad('mfunc',x0)")
  794. gradm = np.matrix(mlabraw.get(sess1,'grdm'))
  795. self.gradm = gradm
  796. def mkAB(self):
  797. nexost = len(self.varvecs['z'])
  798. nendost = len(self.varvecs['k'])
  799. nendocon = len(self.varvecs['y'])
  800. A = self.gradm[:,:nexost+nendost+nendocon]
  801. B = -self.gradm[:,nexost+nendost+nendocon:]
  802. self.AA = A
  803. self.BB = B
  804. def solab(self):
  805. A = self.AA
  806. B = self.BB
  807. tstates = len(self.varvecs['k'])+len(self.varvecs['z'])
  808. (F,P,retcon) = isolab(A,B,tstates,MAT.shape(A)[0])
  809. if MAT.sum(P.reshape(-1,1)) == 0.0:
  810. return
  811. else:
  812. self.P = np.matrix(P)
  813. self.F = np.matrix(F)
  814. def mkhess(self):
  815. self.mkfunc()
  816. sess1 = self.sess1
  817. sstate = self.sstate
  818. ssdic = sstate[0]
  819. ssdic.update(sstate[1])
  820. ssdic2 = {}
  821. for x in ssdic.keys():
  822. if x[-4:] == '_bar':
  823. ssdic2[x] = ssdic[x]
  824. for x in ssdic2.keys():
  825. ssdic2[x] = np.log(ssdic2[x])
  826. vlist2 = []
  827. for x in self.vlist:
  828. ma = self.re_var2.search(x)
  829. tvar = ma.group('var')
  830. tvar = tvar.upper()
  831. tvar = tvar+'_bar'
  832. vlist2.append(tvar)
  833. invec = []
  834. for x in vlist2:
  835. invec.append(ssdic2[x])
  836. mlabraw.eval(sess1,'clear all;')
  837. mlabraw.eval(sess1,'cd '+path_opts['MlabPath']['path'])
  838. mlabraw.eval(sess1,'cd Klein')
  839. mlabraw.put(sess1,'x0',invec)
  840. mlabraw.eval(sess1,"hessm=centhess('mfunc',x0)")
  841. hessm = np.matrix(mlabraw.get(sess1,'hessm'))
  842. self.hessm = hessm
  843. def solab2(self):
  844. sess1 = self.sess1
  845. mlabraw.eval(sess1,'clear all;')
  846. mlabraw.eval(sess1,'cd '+path_opts['MlabPath']['path'])
  847. mlabraw.eval(sess1,'cd Klein')
  848. mlabraw.put(sess1,'gradm',self.gradm)
  849. mlabraw.put(sess1,'hessm',self.hessm)
  850. #----------------------------------------------------------------------------------------------------------------------
  851. class MatWood:
  852. def __init__(self,intup):
  853. self.jAA = intup[0]
  854. self.jBB = intup[1]
  855. self.nexo = intup[2]
  856. self.ncon = intup[3]
  857. self.nendo = intup[4]
  858. self.sess1 = intup[5]
  859. self.NY = self.ncon+self.nendo
  860. self.NK = self.nendo
  861. self.NX = self.nexo
  862. self.mkwoodm()
  863. def solve(self):
  864. self.reds()
  865. self.solds()
  866. def mkwoodm(self):
  867. AA = self.jAA
  868. BB = self.jBB
  869. nendo = self.nendo
  870. nexo = self.nexo
  871. ncon = self.ncon
  872. nstates = nexo+nendo
  873. wAA = MAT.hstack((AA[:-nexo,nstates:],AA[:-nexo,nexo:nstates]))
  874. #wAA = MAT.hstack((AA[:,nstates:],AA[:,:nstates]))
  875. wBB = MAT.hstack((BB[:-nexo,nstates:],BB[:-nexo,nexo:nstates]))
  876. #wBB = MAT.hstack((BB[:,nstates:],BB[:,:nstates]))
  877. wCC = BB[:-nexo,:nexo]
  878. #wCC = MAT.zeros((ncon+nstates,1))
  879. self.wAA = wAA
  880. self.wBB = wBB
  881. self.wCC = wCC
  882. def reds(self):
  883. A = self.wAA
  884. B = self.wBB
  885. C = self.wCC
  886. NX = self.NX
  887. NK = self.NK
  888. NY = self.NY
  889. sess1 = self.sess1
  890. mlabraw.eval(sess1,'clear all;')
  891. mlabraw.eval(sess1,'cd '+mlabpath)
  892. mlabraw.eval(sess1,'cd Woodford')
  893. mlabraw.put(sess1,'wAA',A)
  894. mlabraw.put(sess1,'wBB',B)
  895. mlabraw.put(sess1,'wCC',C)
  896. mlabraw.put(sess1,'NX',NX)
  897. mlabraw.put(sess1,'NY',NY)
  898. mlabraw.put(sess1,'NK',NK)
  899. mlabraw.eval(sess1,'[Br,Cr,Lr,NF] = redsf(wAA,wBB,wCC,NY,NX,NK)')
  900. self.Br = np.matrix(mlabraw.get(sess1,'Br'))
  901. self.Cr = np.matrix(mlabraw.get(sess1,'Cr'))
  902. self.Lr = np.matrix(mlabraw.get(sess1,'Lr'))
  903. self.NF = np.matrix(mlabraw.get(sess1,'NF'))
  904. def solds(self):
  905. Br = self.Br
  906. Cr = self.Cr
  907. Lr = self.Lr
  908. NF = self.NF
  909. NX = self.NX
  910. NK = self.NK
  911. NY = self.NY
  912. sess1 = self.sess1
  913. mlabraw.eval(sess1,'clear all;')
  914. mlabraw.eval(sess1,'cd '+mlabpath)
  915. mlabraw.eval(sess1,'cd Woodford')
  916. mlabraw.put(sess1,'Br',Br)
  917. mlabraw.put(sess1,'Cr',Cr)
  918. mlabraw.put(sess1,'Lr',Lr)
  919. mlabraw.put(sess1,'NF',NF)
  920. mlabraw.put(sess1,'NX',NX)
  921. mlabraw.put(sess1,'NY',NY)
  922. mlabraw.put(sess1,'NK',NK)
  923. mlabraw.eval(sess1,'[D,F,G,H] = soldsf(Br,Cr,Lr,NY,NX,NK,NF)')
  924. self.D = np.matrix(mlabraw.get(sess1,'D'))
  925. self.F = np.matrix(mlabraw.get(sess1,'F'))
  926. self.G = np.matrix(mlabraw.get(sess1,'G'))
  927. self.H = np.matrix(mlabraw.get(sess1,'H'))
  928. #----------------------------------------------------------------------------------------------------------------------
  929. class ForKlein:
  930. def __init__(self,intup):
  931. self.uhlig = PyUhlig(intup)
  932. self.uhlig.mkmats()
  933. self.AA = self.uhlig.AA
  934. self.BB = self.uhlig.BB
  935. self.CC = self.uhlig.CC
  936. self.DD = self.uhlig.DD
  937. self.FF = self.uhlig.FF
  938. self.GG = self.uhlig.GG
  939. self.HH = self.uhlig.HH
  940. self.JJ = self.uhlig.JJ
  941. self.KK = self.uhlig.KK
  942. self.LL = self.uhlig.LL
  943. self.MM = self.uhlig.MM
  944. self.NN = self.uhlig.NN
  945. self.mkKleinMats()
  946. self.outdic = {}
  947. def mkKleinMats(self):
  948. # Make uhlig matrices locally available for computations
  949. AA = self.AA
  950. BB = self.BB
  951. CC = self.CC
  952. DD = self.DD
  953. FF = self.FF
  954. GG = self.GG
  955. HH = self.HH
  956. JJ = self.JJ
  957. KK = self.KK
  958. LL = self.LL
  959. MM = self.MM
  960. NN = self.NN
  961. # Determine size of states, endogenous
  962. exo_st = MAT.shape(NN)[1]
  963. endo_st = MAT.shape(BB)[1]
  964. endo_cn = MAT.shape(CC)[1]
  965. n_deteq = MAT.shape(AA)[0]
  966. n_expeq = MAT.shape(JJ)[0]
  967. tot_st = exo_st+endo_st
  968. self.tstates = tot_st
  969. tot_var = tot_st+endo_cn
  970. klein_A_rtwo = MAT.hstack((LL,GG))
  971. klein_A_rtwo = MAT.hstack((klein_A_rtwo,JJ))
  972. klein_A_rtwo_rows = MAT.shape(klein_A_rtwo)[0]
  973. klein_A_rtwo_cols = MAT.shape(klein_A_rtwo)[1]
  974. klein_A_rone = MAT.zeros((exo_st,klein_A_rtwo_cols))
  975. klein_A_rone = MAT.hstack((MAT.identity(exo_st),klein_A_rone[:,exo_st:]))
  976. klein_A_rthree = MAT.hstack((MAT.zeros((n_deteq,exo_st)),AA))
  977. klein_A_rthree = MAT.hstack((klein_A_rthree,MAT.zeros((n_deteq,endo_cn))))
  978. klein_A = MAT.vstack((klein_A_rone,klein_A_rtwo))
  979. klein_A = MAT.vstack((klein_A,klein_A_rthree))
  980. klein_B_rone = MAT.zeros((exo_st,klein_A_rtwo_cols))
  981. klein_B_rone = MAT.hstack((NN,klein_B_rone[:,exo_st:]))
  982. klein_B_rtwo = MAT.hstack((-MM,-HH))
  983. klein_B_rtwo = MAT.hstack((klein_B_rtwo,-KK))
  984. klein_B_rthree = MAT.hstack((-DD,-BB))
  985. klein_B_rthree = MAT.hstack((klein_B_rthree,-CC))
  986. klein_B = MAT.vstack((klein_B_rone,klein_B_rtwo))
  987. klein_B = MAT.vstack((klein_B,klein_B_rthree))
  988. self.A = klein_A
  989. self.B = klein_B
  990. def solve(self):
  991. A = self.A
  992. B = self.B
  993. tstates = MAT.shape(self.AA)[1] + MAT.shape(self.DD)[1]
  994. (F,P,retcon) = isolab(A,B,tstates,MAT.shape(A)[0])
  995. if MAT.sum(P.reshape(-1,1)) == 0.0:
  996. return
  997. else:
  998. self.P = np.matrix(P)
  999. self.F = np.matrix(F)
  1000. #----------------------------------------------------------------------------------------------------------------------
  1001. class PyKlein2D(object):
  1002. def __init__(self,intup,other=None):
  1003. if other != None:
  1004. self.other = other
  1005. self.gra = intup[0]
  1006. self.hes = intup[1]
  1007. self.nendo = intup[2]
  1008. self.nexo = intup[3]
  1009. self.ncon = intup[4]
  1010. self.sigma = intup[5]
  1011. self.A = intup[6]
  1012. self.B = intup[7]
  1013. self.vardic = intup[8]
  1014. self.vdic = intup[9]
  1015. self.modname = intup[10]
  1016. self.audic = intup[11]
  1017. self.nacon = len(self.audic['con']['var'])
  1018. self.naendo = len(self.audic['endo']['var'])
  1019. if self.vardic['other']['var']:
  1020. self.numjl = intup[12]
  1021. self.numhl = intup[13]
  1022. self.nother = intup[14]
  1023. self.oswitch = 1
  1024. kintup = (self.gra,self.nendo,
  1025. self.nexo,self.ncon,
  1026. self.sigma,self.A,self.B,
  1027. self.vardic,self.vdic,
  1028. self.modname,self.audic,
  1029. self.numjl,self.nother)
  1030. else:
  1031. self.oswitch = 0
  1032. kintup = (self.gra,self.nendo,
  1033. self.nexo,self.ncon,
  1034. self.sigma,self.A,self.B,
  1035. self.vardic,self.vdic,
  1036. self.modname,self.audic)
  1037. self.tstates = self.nendo+self.nexo
  1038. self.forkleind = ForKleinD(kintup)
  1039. self.ssigma = self.mkssigma(self.tstates,self.nexo,self.sigma)
  1040. def mkssigma(self,tstates,nexo,sigma):
  1041. ssigma = MAT.zeros((tstates,tstates))
  1042. for i in range(nexo):
  1043. ssigma[i,i] = sigma[i,i]
  1044. return ssigma
  1045. def solab2(self):
  1046. # Tracem function
  1047. def tracem(xmat):
  1048. n = MAT.shape(xmat)[1]
  1049. m = MAT.shape(xmat)[0]/n
  1050. ymat = MAT.zeros((m,1))
  1051. for i1 in xrange(int(m)):
  1052. ymat[i1,0]=MAT.trace(xmat[n*i1:i1*n+1,:n])
  1053. return ymat
  1054. ssigma = self.ssigma
  1055. pp = self.P
  1056. ff = self.F
  1057. gra = self.gra
  1058. hes = self.hes
  1059. m = self.ncon+self.nendo+self.nexo
  1060. ny = self.ncon
  1061. nx = self.tstates
  1062. f1 = gra[:,:nx]
  1063. f2 = gra[:,nx:m]
  1064. f4 = gra[:,m+nx:2*m]
  1065. mm = MAT.vstack((pp,ff*pp,MAT.eye(nx),ff))
  1066. aa1 = MAT.kron(MAT.eye(m),mm.T)*hes*mm
  1067. bb1 = MAT.kron(f1,MAT.eye(nx))
  1068. bb2 = MAT.kron(f2,MAT.eye(nx))
  1069. bb4 = MAT.kron(f4,MAT.eye(nx))
  1070. cc1 = MAT.kron(MAT.eye(ny),pp.T)
  1071. cc2 = MAT.kron(ff,MAT.eye(nx))
  1072. aa_1 = MAT.kron(MAT.eye(nx),bb4)+MAT.kron(pp.T,bb2*cc1)
  1073. aa_2 = MAT.kron(MAT.eye(nx),bb1+bb2*cc2)
  1074. aa = MAT.hstack((aa_1,aa_2))
  1075. sol = np.linalg.solve(-aa,HLP.ctr(aa1.flatten(1)))
  1076. ee = HLP.ctr(sol[:nx**2*ny].reshape(-1,nx*ny))
  1077. gg = HLP.ctr(sol[nx**2*ny:].reshape(-1,nx**2))
  1078. ma = 2.0*MAT.hstack((f1+f2*ff,f2+f4))
  1079. eyeff = MAT.vstack((MAT.eye(nx),ff,MAT.zeros((m,nx))))
  1080. ve_1 = f2*tracem(MAT.kron(MAT.eye(ny),ssigma)*ee)
  1081. ve_2 = tracem(MAT.kron(MAT.eye(m),HLP.ctr(eyeff))*hes*eyeff*ssigma)
  1082. ve = ve_1 + ve_2
  1083. kxy = -(ma.I)*ve
  1084. kx = kxy[:nx]
  1085. ky = kxy[nx:]
  1086. self.E = ee
  1087. self.G = gg
  1088. self.KX = kx
  1089. self.KY = ky
  1090. def solve(self):
  1091. self.forkleind.solve()
  1092. self.P = self.forkleind.P
  1093. self.F = self.forkleind.F
  1094. self.solab2()
  1095. def sim(self,tlen,sntup=None):
  1096. # Deals with 0-tuples
  1097. if type(sntup) != type((1,2,3)) and type(sntup) == type('abc'):
  1098. sntup = (sntup,)
  1099. # Add 1000 observations, as they will be thrown away
  1100. # Add one more observation to start first-order vector
  1101. exoli = [x[1] for x in self.vardic['exo']['var']]
  1102. indx=[]
  1103. if sntup == None:
  1104. indx = range(len(exoli))
  1105. else:
  1106. for name in sntup:
  1107. if name not in exoli:
  1108. return 'Error: '+name+' is not a valid exo variable for this model!'
  1109. else:
  1110. indx.append(exoli.index(name))
  1111. indx.sort()
  1112. ncon = self.ncon
  1113. nexo = self.nexo
  1114. nendo = self.nendo
  1115. tstates = self.tstates
  1116. tlena = 1000+tlen
  1117. sigma = self.sigma
  1118. ssigma = self.ssigma
  1119. if self.oswitch:
  1120. numjl = self.numjl
  1121. numhl = self.numhl
  1122. kx = self.KX
  1123. ky = self.KY
  1124. pp = self.P
  1125. ff = self.F
  1126. ee = self.E
  1127. gg = self.G
  1128. count = 0
  1129. for varia in MAT.diag(sigma):
  1130. if locals().has_key('ranvec'):
  1131. if count in indx:
  1132. ranvec = MAT.vstack((ranvec,N.sqrt(varia)*MAT.matrix(N.random.standard_normal(tlena))))
  1133. else:
  1134. ranvec = MAT.vstack((ranvec,MAT.zeros((1,tlena))))
  1135. else:
  1136. if count in indx:
  1137. ranvec = np.sqrt(varia)*MAT.matrix(N.random.standard_normal(tlena))
  1138. else:
  1139. ranvec = MAT.zeros((1,tlena))
  1140. count = count + 1
  1141. ranvec = MAT.vstack((ranvec,MAT.zeros((nendo,tlena))))
  1142. x_one_m1 = ranvec[:,0]
  1143. x_one_0 = pp*x_one_m1
  1144. x_two_m1 = kx + ranvec[:,0]
  1145. y_one_0 = ff*x_one_m1
  1146. y_one_m1 = MAT.zeros(y_one_0.shape)
  1147. y_two_0 = ky+0.5*MAT.kron(MAT.eye(ncon),x_one_m1.T)*ee*x_one_m1
  1148. if self.oswitch:
  1149. nother = self.nother
  1150. o_one_0 = numjl*MAT.vstack((x_one_0,y_one_0,x_one_m1,y_one_m1))
  1151. o_two_0 = numjl*MAT.vstack((x_one_0,y_one_0,x_one_m1,y_one_m1))+\
  1152. 0.5*MAT.kron(MAT.eye(nother),MAT.vstack((x_one_0,y_one_0,x_one_m1,y_one_m1)).T)*\
  1153. numhl*MAT.vstack((x_one_0,y_one_0,x_one_m1,y_one_m1))
  1154. x_one_c = COP.deepcopy(x_one_m1)
  1155. y_one_c = COP.deepcopy(y_one_0)
  1156. x_two_c = COP.deepcopy(x_two_m1)
  1157. y_two_c = COP.deepcopy(y_two_0)
  1158. if self.oswitch:
  1159. o_one_c = COP.deepcopy(o_one_0)
  1160. o_two_c = COP.deepcopy(o_two_0)
  1161. x_one = COP.deepcopy(x_one_c)
  1162. y_one = COP.deepcopy(y_one_c)
  1163. x_two = COP.deepcopy(x_two_c)
  1164. y_two = COP.deepcopy(y_two_c)
  1165. if self.oswitch:
  1166. o_one = COP.deepcopy(o_one_c)
  1167. o_two = COP.deepcopy(o_two_c)
  1168. for i1 in range(1,ranvec.shape[1],1):
  1169. x_one_n = pp*x_one_c+ranvec[:,i1]
  1170. y_one_n = ff*x_one_c
  1171. x_two_n = kx+pp*x_two_c+\
  1172. 0.5*MAT.kron(MAT.eye(tstates),x_one_c.T)*\
  1173. gg*x_one_c+ranvec[:,i1]
  1174. y_two_n = ky+ff*x_two_c+\
  1175. 0.5*MAT.kron(MAT.eye(ncon),x_one_c.T)*\
  1176. ee*x_one_c
  1177. if self.oswitch:
  1178. o_one_n = numjl*MAT.vstack((x_one_n,y_one_n,x_one_c,y_one_c))
  1179. o_two_n = numjl*MAT.vstack((x_one_n,y_one_n,x_one_c,y_one_c))+\
  1180. 0.5*MAT.kron(MAT.eye(nother),MAT.vstack((x_one_n,y_one_n,x_one_c,y_one_c)).T)*\
  1181. numhl*MAT.vstack((x_one_n,y_one_n,x_one_c,y_one_c))
  1182. x_one = MAT.hstack((x_one,x_one_c))
  1183. y_one = MAT.hstack((y_one,y_one_n))
  1184. x_two = MAT.hstack((x_two,x_two_c))
  1185. y_two = MAT.hstack((y_two,y_two_n))
  1186. if self.oswitch:
  1187. o_one = MAT.hstack((o_one,o_one_n))
  1188. o_two = MAT.hstack((o_two,o_two_n))
  1189. x_one_c = x_one_n
  1190. y_one_c = y_one_n
  1191. x_two_c = x_one_n
  1192. y_two_c = y_two_n
  1193. if self.oswitch:
  1194. o_one_c = o_one_n
  1195. o_two_c = o_two_n
  1196. # Throw away first 1000 obs
  1197. x_one = x_one[:,1000:]
  1198. y_one = y_one[:,1000:]
  1199. y_two = y_two[:,1000:]
  1200. x_two = x_two[:,1000:]
  1201. if self.oswitch:
  1202. o_one = o_one[:,1000:]
  1203. o_two = o_two[:,1000:]
  1204. self.sim_y_two = y_two
  1205. self.sim_y_one = y_one
  1206. self.sim_x_two = x_two
  1207. self.sim_x_one = x_one
  1208. self.insim = [self.sim_x_two,self.sim_y_two]
  1209. if self.oswitch:
  1210. self.sim_o_one = o_one
  1211. self.sim_o_two = o_two
  1212. self.insim = self.insim + [self.sim_o_two,]
  1213. def mkcvar(self,vname=False,insim='insim'):
  1214. # Now also produce unconditional variances, and normal. variances with v
  1215. # Check if simul data is available
  1216. if insim not in dir(self):
  1217. return "Error: Can't produce uncond. variance table without simulation data!"
  1218. exoli = [x[1] for x in self.vardic['exo']['var']]
  1219. endoli = [x[1] for x in self.vardic['endo']['var']]
  1220. stateli = exoli + endoli
  1221. conli = [x[1] for x in self.vardic['con']['var']]
  1222. alli = stateli+conli
  1223. if self.oswitch:
  1224. otherli = [x[1] for x in self.vardic['other']['var']]
  1225. alli = alli + otherli
  1226. # Check if vname is valid
  1227. if vname not in alli:
  1228. return 'Error: '+vname+' is not a valid variable for this model!'
  1229. insim = eval('self.'+insim)
  1230. osim_x = COP.deepcopy(insim[0])
  1231. osim_y = COP.deepcopy(insim[1])
  1232. nendo = self.nendo
  1233. nexo = self.nexo
  1234. ncon = self.ncon
  1235. # Now hp filter the simulations before graphing according to filtup
  1236. for i1 in xrange(osim_y.shape[0]):
  1237. yy = osim_y[i1,:].__array__().T

Large files files are truncated, but you can click here to view the full file