@@ -1292,6 +1292,59 @@ def vreg(self,paratuple=(None,'all','0'),cinstring='',iter=False,info='min'):
1292
1292
else :
1293
1293
return False
1294
1294
###########ANALYTIC AND NUMERICAL JACOBIAN AND HESSIAN METHODS############
1295
+
1296
+ def def_differ_periods (self ):
1297
+ vtiming = deepcopy (self .vtiming )
1298
+ # Timing assumptions, first for exogenous variables
1299
+ # For past
1300
+ if vtiming ['exo' ][0 ] < 0 :
1301
+ exo_0 = [x [0 ].split ('(' )[0 ]+ '(t-' + str (abs (vtiming ['exo' ][0 ]))+ ')' for x in self .vardic ['exo' ]['var' ]]
1302
+ elif vtiming ['exo' ][0 ] == 0 :
1303
+ exo_0 = [x [0 ].split ('(' )[0 ]+ '(t)' for x in self .vardic ['exo' ]['var' ]]
1304
+ elif vtiming ['exo' ][0 ] > 0 :
1305
+ exo_0 = ['E(t)|' + x [0 ].split ('(' )[0 ]+ '(t+' + str (vtiming ['exo' ][0 ])+ ')' for x in self .vardic ['exo' ]['var' ]]
1306
+ # For future
1307
+ if vtiming ['exo' ][1 ] < 0 :
1308
+ exo_1 = [x [0 ].split ('(' )[0 ]+ '(t-' + str (abs (vtiming ['exo' ][1 ]))+ ')' for x in self .vardic ['exo' ]['var' ]]
1309
+ elif vtiming ['exo' ][1 ] == 0 :
1310
+ exo_1 = [x [0 ].split ('(' )[0 ]+ '(t)' for x in self .vardic ['exo' ]['var' ]]
1311
+ elif vtiming ['exo' ][1 ] > 0 :
1312
+ exo_1 = ['E(t)|' + x [0 ].split ('(' )[0 ]+ '(t+' + str (vtiming ['exo' ][1 ])+ ')' for x in self .vardic ['exo' ]['var' ]]
1313
+
1314
+ # Timing assumptions, endogenous variables
1315
+ # For past
1316
+ if vtiming ['endo' ][0 ] < 0 :
1317
+ endo_0 = [x [0 ].split ('(' )[0 ]+ '(t-' + str (abs (vtiming ['endo' ][0 ]))+ ')' for x in self .vardic ['endo' ]['var' ]]
1318
+ elif vtiming ['endo' ][0 ] == 0 :
1319
+ endo_0 = [x [0 ].split ('(' )[0 ]+ '(t)' for x in self .vardic ['endo' ]['var' ]]
1320
+ elif vtiming ['endo' ][0 ] > 0 :
1321
+ endo_0 = [x [0 ].split ('(' )[0 ]+ '(t+' + str (vtiming ['endo' ][0 ])+ ')' for x in self .vardic ['endo' ]['var' ]]
1322
+ # For future, BE CAREFUL, no expectations term on variables with (t+1) for endo
1323
+ if vtiming ['endo' ][1 ] < 0 :
1324
+ endo_1 = [x [0 ].split ('(' )[0 ]+ '(t-' + str (abs (vtiming ['endo' ][1 ]))+ ')' for x in self .vardic ['endo' ]['var' ]]
1325
+ elif vtiming ['endo' ][1 ] == 0 :
1326
+ endo_1 = [x [0 ].split ('(' )[0 ]+ '(t)' for x in self .vardic ['endo' ]['var' ]]
1327
+ elif vtiming ['endo' ][1 ] > 0 :
1328
+ endo_1 = [x [0 ].split ('(' )[0 ]+ '(t+' + str (vtiming ['endo' ][1 ])+ ')' for x in self .vardic ['endo' ]['var' ]]
1329
+
1330
+ # Timing assumptions, control variables
1331
+ # For past
1332
+ if vtiming ['con' ][0 ] < 0 :
1333
+ con_0 = [x [0 ].split ('(' )[0 ]+ '(t-' + str (abs (vtiming ['con' ][0 ]))+ ')' for x in self .vardic ['con' ]['var' ]]
1334
+ elif vtiming ['con' ][0 ] == 0 :
1335
+ con_0 = [x [0 ].split ('(' )[0 ]+ '(t)' for x in self .vardic ['con' ]['var' ]]
1336
+ if vtiming ['con' ][0 ] > 0 :
1337
+ con_0 = ['E(t)|' + x [0 ].split ('(' )[0 ]+ '(t+' + str (vtiming ['con' ][0 ])+ ')' for x in self .vardic ['con' ]['var' ]]
1338
+ # For future
1339
+ if vtiming ['con' ][1 ] < 0 :
1340
+ con_1 = [x [0 ].split ('(' )[0 ]+ '(t-' + str (abs (vtiming ['con' ][1 ]))+ ')' for x in self .vardic ['con' ]['var' ]]
1341
+ elif vtiming ['con' ][1 ] == 0 :
1342
+ con_1 = [x [0 ].split ('(' )[0 ]+ '(t)' for x in self .vardic ['con' ]['var' ]]
1343
+ elif vtiming ['con' ][1 ] > 0 :
1344
+ con_1 = ['E(t)|' + x [0 ].split ('(' )[0 ]+ '(t+' + str (vtiming ['con' ][1 ])+ ')' for x in self .vardic ['con' ]['var' ]]
1345
+
1346
+ return exo_0 ,exo_1 ,endo_0 ,endo_1 ,con_0 ,con_1
1347
+
1295
1348
def mkjahe (self ):
1296
1349
'''
1297
1350
An unparallelized method using native Python and Sympycore in oder
@@ -1308,28 +1361,9 @@ def mkjahe(self):
1308
1361
:return self.jBB: *(arr2d)* - attaches numerical BB matrix used in Forkleind solution method
1309
1362
'''
1310
1363
mk_hessian = self ._mk_hessian
1311
-
1312
-
1313
- #### WARNING #######
1314
- # If timing assumptions are changed here then we also need to modify them in
1315
- # dsge_parser in methods mkaug1 and mkaug2 !!!!
1316
- ####################
1317
- '''
1318
- exo_1 = ['E(t)|'+x[0].split('(')[0]+'(t+1)' for x in self.vardic['exo']['var']]
1319
- endo_1 = [x[0].split('(')[0]+'(t)' for x in self.vardic['endo']['var']]
1320
- con_1 = ['E(t)|'+x[0].split('(')[0]+'(t+1)' for x in self.vardic['con']['var']]
1321
- exo_0 = [x[0] for x in self.vardic['exo']['var']]
1322
- endo_0 = [x[0].split('(')[0]+'(t-1)' for x in self.vardic['endo']['var']]
1323
- con_0 = [x[0] for x in self.vardic['con']['var']]
1324
- '''
1325
-
1326
- exo_1 = [x [0 ].split ('(' )[0 ]+ '(t)' for x in self .vardic ['exo' ]['var' ]]
1327
- endo_1 = [x [0 ].split ('(' )[0 ]+ '(t)' for x in self .vardic ['endo' ]['var' ]]
1328
- con_1 = ['E(t)|' + x [0 ].split ('(' )[0 ]+ '(t+1)' for x in self .vardic ['con' ]['var' ]]
1329
- exo_0 = [x [0 ].split ('(' )[0 ]+ '(t-1)' for x in self .vardic ['exo' ]['var' ]]
1330
- endo_0 = [x [0 ].split ('(' )[0 ]+ '(t-1)' for x in self .vardic ['endo' ]['var' ]]
1331
- con_0 = [x [0 ] for x in self .vardic ['con' ]['var' ]]
1332
-
1364
+
1365
+ exo_0 ,exo_1 ,endo_0 ,endo_1 ,con_0 ,con_1 = self .def_differ_periods ()
1366
+
1333
1367
inlist = exo_1 + endo_1 + con_1 + exo_0 + endo_0 + con_0
1334
1368
intup = tuple (inlist )
1335
1369
@@ -1380,8 +1414,6 @@ def mkjahe(self):
1380
1414
locals ()[x ] = sympycore .Symbol (x )
1381
1415
for x in self .sstate .keys ():
1382
1416
locals ()[x ] = sympycore .Symbol (x )
1383
- # This is for the superfluous variables we don't want to differentiate for
1384
- locals ()['XXXXXXXXXX' ] = sympycore .Symbol ('XXXXXXXXXX' )
1385
1417
for x in nlsys :
1386
1418
str_tmp = x [:]
1387
1419
list1 = self .vreg (patup ,x ,True ,'max' )
@@ -1390,18 +1422,15 @@ def mkjahe(self):
1390
1422
pos = y [3 ][0 ]
1391
1423
poe = y [3 ][1 ]
1392
1424
vari = y [0 ]
1393
- # We test for key because some variables will not matter in differentiation
1394
- # This is the case with vars like E(t)|z(t+1) which are F00001
1395
- if dicli .has_key (vari ): str_tmp = str_tmp [:pos ] + dicli [vari ] + str_tmp [poe :]
1396
- else : str_tmp = str_tmp [:pos ] + 'XXXXXXXXXX' + str_tmp [poe :]
1425
+ str_tmp = str_tmp [:pos ] + dicli [vari ] + str_tmp [poe :]
1397
1426
list2 = self .vreg (('{-10,10}|None' ,'iid' ,'{-10,10}' ),str_tmp ,True ,'max' )
1398
1427
if list2 :
1399
1428
list2 .reverse ()
1400
1429
for y in list2 :
1401
1430
pos = y [3 ][0 ]
1402
1431
poe = y [3 ][1 ]
1403
1432
vari = y [0 ]
1404
- str_tmp = str_tmp [:pos ]+ '0' + str_tmp [poe :]
1433
+ str_tmp = str_tmp [:pos ]+ '0.0 ' + str_tmp [poe :]
1405
1434
# Now substitute out exp and log in terms of sympycore expressions
1406
1435
elog = re .compile ('LOG\(' )
1407
1436
while elog .search (str_tmp ):
@@ -1659,44 +1688,7 @@ def mkjahepp(self):
1659
1688
1660
1689
import sympycore
1661
1690
1662
- ###################### TIMING DEFINITIONS #########################
1663
- vtiming = deepcopy (self .vtiming )
1664
- # Timing assumptions, first for exogenous variables
1665
- # For past
1666
- if vtiming ['exo' ][0 ] == - 1 :
1667
- exo_0 = [x [0 ].split ('(' )[0 ]+ '(t-1)' for x in self .vardic ['exo' ]['var' ]]
1668
- elif vtiming ['exo' ][0 ] == 0 :
1669
- exo_0 = [x [0 ].split ('(' )[0 ]+ '(t)' for x in self .vardic ['exo' ]['var' ]]
1670
- # For future
1671
- if vtiming ['exo' ][1 ] == 0 :
1672
- exo_1 = [x [0 ].split ('(' )[0 ]+ '(t)' for x in self .vardic ['exo' ]['var' ]]
1673
- elif vtiming ['exo' ][1 ] == 1 :
1674
- exo_1 = ['E(t)|' + x [0 ].split ('(' )[0 ]+ '(t+1)' for x in self .vardic ['exo' ]['var' ]]
1675
-
1676
- # Timing assumptions, endogenous variables
1677
- # For past
1678
- if vtiming ['endo' ][0 ] == - 1 :
1679
- endo_0 = [x [0 ].split ('(' )[0 ]+ '(t-1)' for x in self .vardic ['endo' ]['var' ]]
1680
- elif vtiming ['endo' ][0 ] == 0 :
1681
- endo_0 = [x [0 ].split ('(' )[0 ]+ '(t)' for x in self .vardic ['endo' ]['var' ]]
1682
- # For future
1683
- if vtiming ['endo' ][1 ] == 0 :
1684
- endo_1 = [x [0 ].split ('(' )[0 ]+ '(t)' for x in self .vardic ['endo' ]['var' ]]
1685
- elif vtiming ['endo' ][1 ] == 1 :
1686
- endo_1 = ['E(t)|' + x [0 ].split ('(' )[0 ]+ '(t+1)' for x in self .vardic ['endo' ]['var' ]]
1687
-
1688
- # Timing assumptions, control variables
1689
- # For past
1690
- if vtiming ['con' ][0 ] == - 1 :
1691
- con_0 = [x [0 ].split ('(' )[0 ]+ '(t-1)' for x in self .vardic ['con' ]['var' ]]
1692
- elif vtiming ['con' ][0 ] == 0 :
1693
- con_0 = [x [0 ].split ('(' )[0 ]+ '(t)' for x in self .vardic ['con' ]['var' ]]
1694
- # For future
1695
- if vtiming ['con' ][1 ] == 0 :
1696
- con_1 = [x [0 ].split ('(' )[0 ]+ '(t)' for x in self .vardic ['con' ]['var' ]]
1697
- elif vtiming ['con' ][1 ] == 1 :
1698
- con_1 = ['E(t)|' + x [0 ].split ('(' )[0 ]+ '(t+1)' for x in self .vardic ['con' ]['var' ]]
1699
- ########################## DONE ##############################
1691
+ exo_0 ,exo_1 ,endo_0 ,endo_1 ,con_0 ,con_1 = self .def_differ_periods ()
1700
1692
1701
1693
inlist = exo_1 + endo_1 + con_1 + exo_0 + endo_0 + con_0
1702
1694
intup = tuple (inlist )
@@ -1734,8 +1726,6 @@ def mkjahepp(self):
1734
1726
locals ()[x ] = sympycore .Symbol (x )
1735
1727
for x in self .sstate .keys ():
1736
1728
locals ()[x ] = sympycore .Symbol (x )
1737
- # This is for the superfluous variables we don't want to differentiate for
1738
- locals ()['XXXXXXXXXX' ] = sympycore .Symbol ('XXXXXXXXXX' )
1739
1729
for x in nlsys :
1740
1730
str_tmp = x [:]
1741
1731
list1 = self .vreg (patup ,x ,True ,'max' )
@@ -1744,10 +1734,7 @@ def mkjahepp(self):
1744
1734
pos = y [3 ][0 ]
1745
1735
poe = y [3 ][1 ]
1746
1736
vari = y [0 ]
1747
- # We test for key because some variables will not matter in differentiation
1748
- # This is the case with vars like E(t)|z(t+1) which are F00001
1749
- if dicli .has_key (vari ): str_tmp = str_tmp [:pos ] + dicli [vari ] + str_tmp [poe :]
1750
- else : str_tmp = str_tmp [:pos ] + 'XXXXXXXXXX' + str_tmp [poe :]
1737
+ str_tmp = str_tmp [:pos ] + dicli [vari ] + str_tmp [poe :]
1751
1738
# Take out the IID variables as they don't matter for computation of derivative matrices
1752
1739
list2 = self .vreg (('{-10,10}|None' ,'iid' ,'{-10,10}' ),str_tmp ,True ,'max' )
1753
1740
if list2 :
@@ -1756,7 +1743,7 @@ def mkjahepp(self):
1756
1743
pos = y [3 ][0 ]
1757
1744
poe = y [3 ][1 ]
1758
1745
vari = y [0 ]
1759
- str_tmp = str_tmp [:pos ]+ '0' + str_tmp [poe :]
1746
+ str_tmp = str_tmp [:pos ] + '0.0' + str_tmp [poe :]
1760
1747
# Now substitute out exp and log in terms of sympycore expressions
1761
1748
elog = re .compile ('LOG\(' )
1762
1749
while elog .search (str_tmp ):
@@ -1879,7 +1866,6 @@ def mkjaheseq(lcount,func2,jcols,symdic,tmpli,paramdic,sstate,evaldic,suba_dic,m
1879
1866
else :
1880
1867
jdicc [differo_var ] = jdicc [differo_var ]
1881
1868
###### Done ########
1882
-
1883
1869
numj [0 ,y ] = eval (str (jdic [y ].evalf ()))
1884
1870
if mk_hessian :
1885
1871
for z in range (jcols ):
0 commit comments