## Appendix A
### Greedy Gaussian Segmentation  
Regime Classes--Greedy Gaussian Segmentation  
GGS separates regimes by maximising the loglikelihood that cross-sectional samples \(X_{t}\) indexed at time \(t\) are treated as independent samples and that samples from regimes before and after a structural breakpoint \(\tau_{j}\) are from different multivariate Gaussian distributions. Estimated covariance parameters are estimated with regularisation. For derivations and further details, please refer to the original paper by [PERSON] et al. [20]. The GGS algorithm aims to segment the \(N_{X}\)-variate time series \(\{X_{t}\}_{i=0}^{T}\) into \(J\) optimal segments marked by time-indexed breakpoints \(\{\tau_{j}\}_{j=0}^{J}\), \(\tau_{0}=0,\tau_{j}=T\). The key subroutine for carrying this out is to insert a new breakpoint \(\tau\) to optimally split an existing segment \(X_{\tau_{j-1}},X_{\tau_{j}}\) into two segments. ```
Inputs:Single regime \(\{X_{t}\}_{t=\gamma_{j-1}}^{\gamma_{j}}\), empirical regime mean and covariance \(\mu_{j},\Sigma_{j}\), regularisation parameter \(\lambda\) Outputs:optimal breakpoint \(\tau^{*}\) in the interval \(\left(\tau_{j-1},\tau_{j}\right)\) init \(\mu_{\tau_{left}^{*}}\gets 0,\mu_{\tau_{right}^{*}}\leftarrow\tau_{j}, \Sigma_{\tau_{left}^{*}}\leftarrow\lambda\mathbb{I},\Sigma_{\tau_{right}^{*}} \leftarrow\Sigma_{j}+\lambda\mathbb{I}\) for\(t=\tau_{j-1}+1\)to \(\tau_{j}-1\):do  Update \(\mu_{t_{left}},\mu_{t_{right}},\Sigma_{t_{left}},\Sigma_{t_{right}}\)  Calculate \(\xi_{t}=\xi_{\tau_{j-1},t}+\xi_{t,\tau_{j}}\) return\(\tau^{*}\) that maximises \(\xi_{t}\)
```  
**Algorithm A2**Split interval [20]  
```
Inputs:Multivariate time series: \(\{X_{t}\}_{t=0}^{T}\), maximum number of breakpoints: \(J^{\max}\) Outputs:optimal breakpoints \(\tau_{1},\ldots,\tau_{l},\tau_{j}=T\) init \(\tau_{0}=0,\tau_{1}=T\) for\(J=1\)to\(J^{\max}\):do // Add New Breakpoint: // Check which regime \(C_{j}\) being split improves likelihood for\(j=1\)to\(J\):do \(\left(\tau,\xi_{j}^{increase}\right)\leftarrow\text{Split}(\tau_{j-1},\tau_{j})\) // best new breakpoint \(\tau^{*}\) in regime \(j\) Store \(\tau^{*}\leftarrow\max\tau\) corresponding to \(\max\xi_{j}^{increase}\) over loop // there is at least \(J=2\) regimes but cannot improve likelihood if\(\max\xi_{j}^{increase}<0\)and \(J\geq 2\)then return\(\tau_{1},\ldots,\tau_{l}\) // there is only 1 regime and cannot improve likelihood elseif\(\max\xi_{j}^{increase}<0\)and \(J=1\)then returnnull breakpoint set  Insert new breakpoint \(\tau^{*}\) resulting in \(\max\xi_{j}^{increase}\) value  Relabel breakpoints \(0=\tau_{0}<\tau_{1}<\ldots\tau_{l-1}<\tau_{j}=T\) // Adjust breakpoints: whilenot stationary:do for\(j=1,\ldots,l\)do \(\left(\tilde{\tau}_{j},\xi_{j}^{increase}\right)=\text{Split}(\tau_{j-1},\tau_{j +1})\) if\(\tilde{\tau}_{j}\
eq\tau_{j}\)then // reassign breakpoint location for\(\tau_{j}\) if moving optimal \(\tau_{j}\leftarrow\tilde{\tau}_{j}\) return\(\tau_{0},\ldots,\tau_{l}\)
```  
**Algorithm A3**Greedy Gaussian Segmentation [20]  
Let \(\tau^{*}\in\mathbb{N}\) be the time index such that the expression:  
\[\xi^{increase}=\xi(\tau_{j-1},\tau^{*})+\xi(\tau^{*},\tau_{j})-\xi(\tau_{j-1}, \tau_{j})\] (A20)  
is maximised for \(\tau^{*}\in\left(\tau_{j-1},\tau_{j}\right)\), where \(\xi(r,s)\) is a contributing term to the overall loglikelihood for inserting \(J\) breakpoints in the time interval \([0,T]\). [PERSON] et al.