Bayesian Change Point Detection (BCPD) is a method used to detect abrupt changes in a time series. It decomposes the time series into three components: trend, season, and random. BCPD is able to detect change points within both the trend and season parts of the time series. It uses a quasi RJ-MCMC method for this detection. The parameters in the trend part include the location of trend change points and the coefficients of each separated segment. The parameters in the season part include the location of season change points and the coefficients of each separated segment. The periods in different season segments can vary. The decomposition graphs show the position of seasonal and trend change points.
------

SET SCHEMA DM_PAL;

DROP TABLE PAL_BCPD_DATA_TBL;
CREATE COLUMN TABLE PAL_BCPD_DATA_TBL (
	"TIME_STAMP" INTEGER,
	"SERIES" DOUBLE
);

INSERT INTO PAL_BCPD_DATA_TBL VALUES (0, 0.0);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (1, 3.83);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (2, -5.33);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (3, -1.5);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (4, 2.33);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (5, -6.83);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (6, -3.0);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (7, 0.83);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (8, -8.33);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (9, -4.5);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (10, -0.67);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (11, -9.83);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (12, -6.0);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (13, -2.17);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (14, -11.33);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (15, -7.5);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (16, -3.67);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (17, -12.83);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (18, -9.0);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (19, -5.17);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (20, -14.33);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (21, -10.5);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (22, -6.67);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (23, -15.83);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (24, -15.83);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (25, -11.075);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (26, -12.891);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (27, -18.769);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (28, -20.585);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (29, -15.83);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (30, -11.075);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (31, -12.891);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (32, -18.769);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (33, -20.585);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (34, -15.83);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (35, -11.075);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (36, -12.891);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (37, -18.769);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (38, -20.585);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (39, -15.83);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (40, -11.075);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (41, -12.891);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (42, -18.769);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (43, -20.585);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (44, -15.83);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (45, -11.075);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (46, -12.891);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (47, -18.769);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (48, -20.585);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (49, -15.83);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (50, -11.075);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (51, -12.891);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (52, -18.769);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (53, -20.585);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (54, 20.585);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (55, 24.525);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (56, 25.52);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (57, 22.845);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (58, 18.536);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (59, 15.861);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (60, 16.856);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (61, 20.795);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (62, 24.735);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (63, 25.73);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (64, 23.055);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (65, 18.746);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (66, 16.071);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (67, 17.066);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (68, 21.005);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (69, 24.945);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (70, 25.94);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (71, 23.265);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (72, 18.956);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (73, 16.281);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (74, 17.276);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (75, 21.215);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (76, 25.155);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (77, 26.15);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (78, 23.475);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (79, 19.166);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (80, 16.491);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (81, 17.486);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (82, 21.425);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (83, 25.365);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (84, 26.36);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (85, 23.685);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (86, 19.376);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (87, 16.701);
INSERT INTO PAL_BCPD_DATA_TBL VALUES (88, 17.696);


DROP TABLE PAL_PARAMETER_TBL;
CREATE COLUMN TABLE PAL_PARAMETER_TBL (
	"PARAM_NAME" VARCHAR(100),
	"INT_VALUE" INTEGER,
	"DOUBLE_VALUE" DOUBLE,
	"STRING_VALUE" VARCHAR(100)
);

INSERT INTO PAL_PARAMETER_TBL VALUES ('TREND_ORDER', 1, NULL, NULL);
INSERT INTO PAL_PARAMETER_TBL VALUES ('MAX_TCP_NUM', 5, NULL, NULL);
INSERT INTO PAL_PARAMETER_TBL VALUES ('MAX_SCP_NUM', 5, NULL, NULL);
INSERT INTO PAL_PARAMETER_TBL VALUES ('MAX_HARMONIC_ORDER', 1, NULL, NULL);
INSERT INTO PAL_PARAMETER_TBL VALUES ('MIN_PERIOD', 1, NULL, NULL);
INSERT INTO PAL_PARAMETER_TBL VALUES ('MAX_PERIOD', 10, NULL, NULL);
INSERT INTO PAL_PARAMETER_TBL VALUES ('RANDOM_SEED', 1, NULL, NULL);
INSERT INTO PAL_PARAMETER_TBL VALUES ('MAX_ITER', 10000, NULL, NULL);
INSERT INTO PAL_PARAMETER_TBL VALUES ('INTERVAL_RATIO', NULL, 0.2, NULL);

DROP TABLE PAL_TCP_TBL;
DROP TABLE PAL_SCP_TBL;
DROP TABLE PAL_PERIODLIST_TBL;
DROP TABLE PAL_DECOMP_TBL;

CREATE COLUMN TABLE PAL_TCP_TBL (ROW_INDEX INTEGER, TCP INTEGER);
CREATE COLUMN TABLE PAL_SCP_TBL (ROW_INDEX INTEGER, SCP INTEGER);
CREATE COLUMN TABLE PAL_PERIODLIST_TBL (ROW_INDEX INTEGER, PERIOD INTEGER);
CREATE COLUMN TABLE PAL_DECOMP_TBL (ROW_INDEX INTEGER, SEASON DOUBLE, TREND DOUBLE, RANDOM DOUBLE);

DO BEGIN 
	lt_data = SELECT * FROM PAL_BCPD_DATA_TBL;
    lt_param = SELECT * FROM PAL_PARAMETER_TBL;
    CALL _SYS_AFL.PAL_BCPD (:lt_data, :lt_param, lt_tcp, lt_scp, lt_period, lt_decomp);
    INSERT INTO PAL_TCP_TBL SELECT * FROM :lt_tcp;
    INSERT INTO PAL_SCP_TBL SELECT * FROM :lt_scp;
    INSERT INTO PAL_PERIODLIST_TBL SELECT * FROM :lt_period;
    INSERT INTO PAL_DECOMP_TBL SELECT * FROM :lt_decomp;
END;

SELECT * FROM PAL_TCP_TBL;
SELECT * FROM PAL_SCP_TBL;
SELECT * FROM PAL_PERIODLIST_TBL;
SELECT * FROM PAL_DECOMP_TBL;
