Skip to content

Commit 31f95ec

Browse files
committed
Temporary commit after much work on timing module
1 parent 9cf3364 commit 31f95ec

File tree

15 files changed

+505
-249
lines changed

15 files changed

+505
-249
lines changed

pymaclab/dsge/macrolab.py

Lines changed: 61 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1292,6 +1292,59 @@ def vreg(self,paratuple=(None,'all','0'),cinstring='',iter=False,info='min'):
12921292
else:
12931293
return False
12941294
###########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+
12951348
def mkjahe(self):
12961349
'''
12971350
An unparallelized method using native Python and Sympycore in oder
@@ -1308,28 +1361,9 @@ def mkjahe(self):
13081361
:return self.jBB: *(arr2d)* - attaches numerical BB matrix used in Forkleind solution method
13091362
'''
13101363
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+
13331367
inlist = exo_1+endo_1+con_1+exo_0+endo_0+con_0
13341368
intup=tuple(inlist)
13351369

@@ -1380,8 +1414,6 @@ def mkjahe(self):
13801414
locals()[x] = sympycore.Symbol(x)
13811415
for x in self.sstate.keys():
13821416
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')
13851417
for x in nlsys:
13861418
str_tmp = x[:]
13871419
list1 = self.vreg(patup,x,True,'max')
@@ -1390,18 +1422,15 @@ def mkjahe(self):
13901422
pos = y[3][0]
13911423
poe = y[3][1]
13921424
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:]
13971426
list2 = self.vreg(('{-10,10}|None','iid','{-10,10}'),str_tmp,True,'max')
13981427
if list2:
13991428
list2.reverse()
14001429
for y in list2:
14011430
pos = y[3][0]
14021431
poe = y[3][1]
14031432
vari = y[0]
1404-
str_tmp = str_tmp[:pos]+'0'+str_tmp[poe:]
1433+
str_tmp = str_tmp[:pos]+'0.0'+str_tmp[poe:]
14051434
# Now substitute out exp and log in terms of sympycore expressions
14061435
elog = re.compile('LOG\(')
14071436
while elog.search(str_tmp):
@@ -1659,44 +1688,7 @@ def mkjahepp(self):
16591688

16601689
import sympycore
16611690

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()
17001692

17011693
inlist = exo_1+endo_1+con_1+exo_0+endo_0+con_0
17021694
intup=tuple(inlist)
@@ -1734,8 +1726,6 @@ def mkjahepp(self):
17341726
locals()[x] = sympycore.Symbol(x)
17351727
for x in self.sstate.keys():
17361728
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')
17391729
for x in nlsys:
17401730
str_tmp = x[:]
17411731
list1 = self.vreg(patup,x,True,'max')
@@ -1744,10 +1734,7 @@ def mkjahepp(self):
17441734
pos = y[3][0]
17451735
poe = y[3][1]
17461736
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:]
17511738
# Take out the IID variables as they don't matter for computation of derivative matrices
17521739
list2 = self.vreg(('{-10,10}|None','iid','{-10,10}'),str_tmp,True,'max')
17531740
if list2:
@@ -1756,7 +1743,7 @@ def mkjahepp(self):
17561743
pos = y[3][0]
17571744
poe = y[3][1]
17581745
vari = y[0]
1759-
str_tmp = str_tmp[:pos]+'0'+str_tmp[poe:]
1746+
str_tmp = str_tmp[:pos] + '0.0' +str_tmp[poe:]
17601747
# Now substitute out exp and log in terms of sympycore expressions
17611748
elog = re.compile('LOG\(')
17621749
while elog.search(str_tmp):
@@ -1879,7 +1866,6 @@ def mkjaheseq(lcount,func2,jcols,symdic,tmpli,paramdic,sstate,evaldic,suba_dic,m
18791866
else:
18801867
jdicc[differo_var] = jdicc[differo_var]
18811868
###### Done ########
1882-
18831869
numj[0,y] = eval(str(jdic[y].evalf()))
18841870
if mk_hessian:
18851871
for z in range(jcols):

0 commit comments

Comments
 (0)