18
18
from pymc_experimental .statespace .utils .constants import (
19
19
ALL_STATE_AUX_DIM ,
20
20
ALL_STATE_DIM ,
21
+ AR_PARAM_DIM ,
21
22
LONG_MATRIX_NAMES ,
22
23
OBS_STATE_DIM ,
23
24
POSITION_DERIVATIVE_NAMES ,
25
+ TIME_DIM ,
24
26
)
25
27
26
28
_log = logging .getLogger ("pymc.experimental.statespace" )
@@ -786,7 +788,7 @@ def populate_component_properties(self):
786
788
self .state_names = [name for name , mask in zip (name_slice , self ._order_mask ) if mask ]
787
789
self .param_dims = {"initial_trend" : ("trend_state" ,)}
788
790
self .coords = {"trend_state" : self .state_names }
789
- self .param_info = {"initial_trend" : {"shape" : (self .k_states ,), "constraints" : " None" }}
791
+ self .param_info = {"initial_trend" : {"shape" : (self .k_states ,), "constraints" : None }}
790
792
791
793
if self .k_posdef > 0 :
792
794
self .param_names += ["sigma_trend" ]
@@ -871,7 +873,11 @@ def populate_component_properties(self):
871
873
self .param_names = [f"sigma_{ self .name } " ]
872
874
self .param_dims = {f"sigma_{ self .name } " : (OBS_STATE_DIM ,)}
873
875
self .param_info = {
874
- f"sigma_{ self .name } " : {"shape" : (1 ,), "constraints" : "Positive" , "dims" : "None" }
876
+ f"sigma_{ self .name } " : {
877
+ "shape" : (1 ,),
878
+ "constraints" : "Positive" ,
879
+ "dims" : (OBS_STATE_DIM ,),
880
+ }
875
881
}
876
882
877
883
def make_symbolic_graph (self ) -> None :
@@ -959,11 +965,15 @@ def populate_component_properties(self):
959
965
self .state_names = [f"L{ i + 1 } .data" for i in range (self .k_states )]
960
966
self .shock_names = [f"{ self .name } _innovation" ]
961
967
self .param_names = ["ar_params" , "sigma_ar" ]
962
- self .param_dims = {"ar_params" : ("ar_lags" ,)}
963
- self .coords = {"ar_lags" : self .ar_lags }
968
+ self .param_dims = {"ar_params" : (AR_PARAM_DIM ,)}
969
+ self .coords = {AR_PARAM_DIM : self .ar_lags . tolist () }
964
970
965
971
self .param_info = {
966
- "ar_params" : {"shape" : (self .k_states ,), "constraints" : "None" , "dims" : "(ar_lags, )" },
972
+ "ar_params" : {
973
+ "shape" : (self .k_states ,),
974
+ "constraints" : None ,
975
+ "dims" : (AR_PARAM_DIM ,),
976
+ },
967
977
"sigma_ar" : {"shape" : (1 ,), "constraints" : "Positive" , "dims" : None },
968
978
}
969
979
@@ -1133,19 +1143,19 @@ def populate_component_properties(self):
1133
1143
self .param_info = {
1134
1144
f"{ self .name } _coefs" : {
1135
1145
"shape" : (self .k_states ,),
1136
- "constraints" : " None" ,
1137
- "dims" : f"( { self .name } _state, )" ,
1146
+ "constraints" : None ,
1147
+ "dims" : ( f" { self .name } _state" ,) ,
1138
1148
}
1139
1149
}
1140
- self .param_dims = {f"{ self .name } _coefs" : (f"{ self .name } _periods " ,)}
1150
+ self .param_dims = {f"{ self .name } _coefs" : (f"{ self .name } _state " ,)}
1141
1151
self .coords = {f"{ self .name } _state" : self .state_names }
1142
1152
1143
1153
if self .innovations :
1144
1154
self .param_names += [f"sigma_{ self .name } " ]
1145
1155
self .param_info [f"sigma_{ self .name } " ] = {
1146
1156
"shape" : (1 ,),
1147
1157
"constraints" : "Positive" ,
1148
- "dims" : " None" ,
1158
+ "dims" : None ,
1149
1159
}
1150
1160
self .shock_names = [f"{ self .name } " ]
1151
1161
@@ -1270,27 +1280,27 @@ def populate_component_properties(self):
1270
1280
self .state_names = [f"{ self .name } _{ f } _{ i } " for i in range (self .n ) for f in ["Cos" , "Sin" ]]
1271
1281
self .param_names = [f"{ self .name } " ]
1272
1282
1273
- self .param_dims = {self .name : (f"{ self .name } _initial_state " ,)}
1283
+ self .param_dims = {self .name : (f"{ self .name } _state " ,)}
1274
1284
self .param_info = {
1275
1285
f"{ self .name } " : {
1276
1286
"shape" : (self .k_states - int (self .last_state_not_identified ),),
1277
- "constraints" : " None" ,
1278
- "dims" : f"( { self .name } _initial_state, )" ,
1287
+ "constraints" : None ,
1288
+ "dims" : ( f" { self .name } _state" ,) ,
1279
1289
}
1280
1290
}
1281
1291
1282
1292
init_state_idx = np .arange (self .k_states , dtype = int )
1283
1293
if self .last_state_not_identified :
1284
1294
init_state_idx = init_state_idx [:- 1 ]
1285
- self .coords = {f"{ self .name } _initial_state " : [self .state_names [i ] for i in init_state_idx ]}
1295
+ self .coords = {f"{ self .name } _state " : [self .state_names [i ] for i in init_state_idx ]}
1286
1296
1287
1297
if self .innovations :
1288
1298
self .shock_names = self .state_names .copy ()
1289
1299
self .param_names += [f"sigma_{ self .name } " ]
1290
1300
self .param_info [f"sigma_{ self .name } " ] = {
1291
1301
"shape" : (1 ,),
1292
1302
"constraints" : "Positive" ,
1293
- "dims" : " None" ,
1303
+ "dims" : None ,
1294
1304
}
1295
1305
1296
1306
@@ -1421,10 +1431,12 @@ def __init__(
1421
1431
def make_symbolic_graph (self ) -> None :
1422
1432
self .ssm ["design" , 0 , slice (0 , self .k_states , 2 )] = 1
1423
1433
self .ssm ["selection" , :, :] = np .eye (self .k_states )
1434
+ self .param_dims = {self .name : (f"{ self .name } _state" ,)}
1435
+ self .coords = {f"{ self .name } _state" : self .state_names }
1424
1436
1425
- init_state = self .make_and_register_variable (f"{ self .name } " , shape = (1 ,))
1437
+ init_state = self .make_and_register_variable (f"{ self .name } " , shape = (self . k_states ,))
1426
1438
1427
- self .ssm ["initial_state" , 0 ] = init_state
1439
+ self .ssm ["initial_state" , : ] = init_state
1428
1440
1429
1441
if self .estimate_cycle_length :
1430
1442
lamb = self .make_and_register_variable (f"{ self .name } _length" , shape = (1 ,))
@@ -1440,18 +1452,18 @@ def make_symbolic_graph(self) -> None:
1440
1452
self .ssm ["transition" , :, :] = T
1441
1453
1442
1454
if self .innovations :
1443
- sigma_season = self .make_and_register_variable (f"sigma_{ self .name } " , shape = (1 ,))
1444
- self .ssm ["state_cov" , :, :] = pt .eye (self .k_posdef ) * sigma_season
1455
+ sigma_cycle = self .make_and_register_variable (f"sigma_{ self .name } " , shape = (1 ,))
1456
+ self .ssm ["state_cov" , :, :] = pt .eye (self .k_posdef ) * sigma_cycle
1445
1457
1446
1458
def populate_component_properties (self ):
1447
1459
self .state_names = [f"{ self .name } _{ f } " for f in ["Sin" , "Cos" ]]
1448
1460
self .param_names = [f"{ self .name } " ]
1449
1461
1450
1462
self .param_info = {
1451
1463
f"{ self .name } " : {
1452
- "shape" : (1 ,),
1453
- "constraints" : " None" ,
1454
- "dims" : None ,
1464
+ "shape" : (2 ,),
1465
+ "constraints" : None ,
1466
+ "dims" : ( f" { self . name } _state" ,) ,
1455
1467
}
1456
1468
}
1457
1469
@@ -1476,7 +1488,7 @@ def populate_component_properties(self):
1476
1488
self .param_info [f"sigma_{ self .name } " ] = {
1477
1489
"shape" : (1 ,),
1478
1490
"constraints" : "Positive" ,
1479
- "dims" : " None" ,
1491
+ "dims" : None ,
1480
1492
}
1481
1493
self .shock_names = self .state_names .copy ()
1482
1494
@@ -1551,15 +1563,16 @@ def populate_component_properties(self) -> None:
1551
1563
1552
1564
self .param_names = [f"beta_{ self .name } " , f"data_{ self .name } " ]
1553
1565
self .param_dims = {
1554
- f"beta_{ self .name } " : "exog_state" ,
1555
- f"data_{ self .name } " : ("time" , "exog_state" ),
1566
+ f"beta_{ self .name } " : ( "exog_state" ,) ,
1567
+ f"data_{ self .name } " : (TIME_DIM , "exog_state" ),
1556
1568
}
1569
+
1557
1570
self .param_info = {
1558
- f"beta_{ self .name } " : {"shape" : (1 ,), "constraints" : " None" , "dims" : ("exog_state" ,)},
1571
+ f"beta_{ self .name } " : {"shape" : (1 ,), "constraints" : None , "dims" : ("exog_state" ,)},
1559
1572
f"data_{ self .name } " : {
1560
1573
"shape" : (None , self .k_states ),
1561
- "constraints" : " None" ,
1562
- "dims" : ("time" , "exog_state" ),
1574
+ "constraints" : None ,
1575
+ "dims" : (TIME_DIM , "exog_state" ),
1563
1576
},
1564
1577
}
1565
1578
self .coords = {f"exog_state" : self .state_names }
0 commit comments