@@ -327,13 +327,14 @@ def populate_component_properties(self):
327
327
328
328
if self .innovations :
329
329
self .param_names += [f"sigma_{ self .name } " ]
330
+ self .shock_names = [f"{ self .name } [{ name } ]" for name in self .observed_state_names ]
330
331
self .param_info [f"sigma_{ self .name } " ] = {
331
332
"shape" : () if k_endog == 1 else (k_endog ,),
332
333
"constraints" : "Positive" ,
333
334
"dims" : None if k_endog == 1 else (f"endog_{ self .name } " ,),
334
335
}
335
- self . param_dims [ f"sigma_ { self . name } " ] = ( f"endog_ { self . name } " ,)
336
- self . shock_names = [f"{ self .name } [ { name } ]" for name in self .observed_state_names ]
336
+ if k_endog > 1 :
337
+ self . param_dims [f"sigma_ { self .name } " ] = ( f"endog_ { self .name } " ,)
337
338
338
339
def make_symbolic_graph (self ) -> None :
339
340
k_states = self .k_states // self .k_endog
@@ -507,7 +508,7 @@ def make_symbolic_graph(self) -> None:
507
508
self .ssm ["design" , :, :] = pt .linalg .block_diag (* [Z for _ in range (k_endog )])
508
509
509
510
init_state = self .make_and_register_variable (
510
- f"{ self .name } " , shape = (n_coefs ,) if k_endog == 1 else (k_endog , n_coefs )
511
+ f"params_ { self .name } " , shape = (n_coefs ,) if k_endog == 1 else (k_endog , n_coefs )
511
512
)
512
513
513
514
init_state_idx = np .concatenate (
@@ -536,19 +537,30 @@ def make_symbolic_graph(self) -> None:
536
537
def populate_component_properties (self ):
537
538
k_endog = self .k_endog
538
539
n_coefs = self .n_coefs
539
- k_states = self .k_states // k_endog
540
540
541
541
self .state_names = [
542
542
f"{ f } _{ self .name } _{ i } [{ obs_state_name } ]"
543
543
for obs_state_name in self .observed_state_names
544
544
for i in range (self .n )
545
545
for f in ["Cos" , "Sin" ]
546
546
]
547
- self .param_names = [f"{ self .name } " ]
547
+ # determine which state names correspond to parameters
548
+ # all endog variables use same state structure, so we just need
549
+ # the first n_coefs state names (which may be less than total if saturated)
550
+ param_state_names = [f"{ f } _{ self .name } _{ i } " for i in range (self .n ) for f in ["Cos" , "Sin" ]][
551
+ :n_coefs
552
+ ]
553
+
554
+ self .param_names = [f"params_{ self .name } " ]
555
+
556
+ self .param_dims = {
557
+ f"params_{ self .name } " : (f"state_{ self .name } " ,)
558
+ if k_endog == 1
559
+ else (f"endog_{ self .name } " , f"state_{ self .name } " )
560
+ }
548
561
549
- self .param_dims = {self .name : (f"state_{ self .name } " ,)}
550
562
self .param_info = {
551
- f"{ self .name } " : {
563
+ f"params_ { self .name } " : {
552
564
"shape" : (n_coefs ,) if k_endog == 1 else (k_endog , n_coefs ),
553
565
"constraints" : None ,
554
566
"dims" : (f"state_{ self .name } " ,)
@@ -557,23 +569,22 @@ def populate_component_properties(self):
557
569
}
558
570
}
559
571
560
- # Regardless of whether the fourier basis are saturated, there will always be one symbolic state per basis.
561
- # That's why the self.states is just a simple loop over everything. But when saturated, one of those states
562
- # doesn't have an associated **parameter**, so the coords need to be adjusted to reflect this.
563
- init_state_idx = np .concatenate (
564
- [
565
- np .arange (k_states * i , (i + 1 ) * k_states , dtype = int )[:n_coefs ]
566
- for i in range (k_endog )
567
- ],
568
- axis = 0 ,
572
+ self .coords = (
573
+ {f"state_{ self .name } " : param_state_names }
574
+ if k_endog == 1
575
+ else {
576
+ f"endog_{ self .name } " : self .observed_state_names ,
577
+ f"state_{ self .name } " : param_state_names ,
578
+ }
569
579
)
570
- self .coords = {f"state_{ self .name } " : [self .state_names [i ] for i in init_state_idx ]}
571
580
572
581
if self .innovations :
573
- self .shock_names = self .state_names .copy ()
574
582
self .param_names += [f"sigma_{ self .name } " ]
583
+ self .shock_names = [f"{ self .name } [{ name } ]" for name in self .observed_state_names ]
575
584
self .param_info [f"sigma_{ self .name } " ] = {
576
- "shape" : () if k_endog == 1 else (k_endog , n_coefs ),
585
+ "shape" : () if k_endog == 1 else (k_endog ,),
577
586
"constraints" : "Positive" ,
578
587
"dims" : None if k_endog == 1 else (f"endog_{ self .name } " ,),
579
588
}
589
+ if k_endog > 1 :
590
+ self .param_dims [f"sigma_{ self .name } " ] = (f"endog_{ self .name } " ,)
0 commit comments