Online Bayesian Change Point Detection (OnlineBCPD) is a method of online learning that continuously detects change points in incoming data. It uses causal predictive filtering to generate accurate distributions of future data based on past observations. This allows it to determine the exact position of change points or the probability of each time step being a change point. Unlike the offline version, OnlineBCPD does not rely on decomposition-based methods.
------

SET SCHEMA DM_PAL;

DROP TABLE PAL_ONLINE_BCPD_DATA_TBL;
CREATE COLUMN TABLE PAL_ONLINE_BCPD_DATA_TBL ("TIMESTAMP" INTEGER, "Y" DOUBLE);

----------------------- first run ------------------------------------
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (0, 10.42493405);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (1, 8.94386084);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (2, 9.11572192);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (3, 9.17946682);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (4, 9.53324699);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (5, 9.46962137);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (6, 9.81696916);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (7, 9.49802322);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (8, 10.48156282);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (9, 8.92201745);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (10, 9.30757129);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (11, 9.99704509);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (12, 8.9834754);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (13, 10.56947665);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (14, 9.20230684);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (15, 9.53051802);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (16, 9.32981842);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (17, 9.38746945);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (18, 9.86918752);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (19, 10.07433313);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (20, 9.36983432);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (21, 10.45570875);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (22, 9.77227027);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (23, 9.35569118);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (24, 9.35977052);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (25, 9.82279237);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (26, 9.93551206);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (27, 9.82017479);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (28, -15.71515274);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (29, -15.58654124);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (30, -15.28297248);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (31, -17.85080158);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (32, -18.277881);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (33, -15.97301583);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (34, -16.70173896);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (35, -17.07498221);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (36, -14.23073668);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (37, -16.93035542);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (38, -15.57166321);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (39, -17.7200683);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (40, -15.74905358);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (41, -17.50864792);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (42, -15.63466234);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (43, -15.6380366);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (44, -17.99124459);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (45, -15.41031108);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (46, -15.54203995);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (47, -15.908129);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (48, -16.24160879);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (49, -14.25553011);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (50, -13.37089312);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (51, -14.55209207);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (52, -14.32659962);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (53, -13.41518447);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (54, -13.40716758);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (55, -13.70049752);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (56, -14.97310396);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (57, -13.1749954);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (58, -14.26574249);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (59, -14.39144937);

DROP TABLE PAL_ONLINE_BCPD_MODEL_TBL;
CREATE COLUMN TABLE PAL_ONLINE_BCPD_MODEL_TBL (
	"ID"   INTEGER,
	"ALPHA" DOUBLE,
	"BETA"  DOUBLE,
	"KAPPA" DOUBLE,
	"MU"    DOUBLE,
	"PROB"  DOUBLE
);

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 ('THRESHOLD', NULL,        0.5,   NULL);
INSERT INTO PAL_PARAMETER_TBL VALUES ('DELAY',        5,       NULL,   NULL);
INSERT INTO PAL_PARAMETER_TBL VALUES ('PRUNE',        1,       NULL,   NULL);

DROP TABLE PAL_ONLINE_BCPD_CP_TBL;
CREATE COLUMN TABLE PAL_ONLINE_BCPD_CP_TBL (ID INTEGER, POSITION INTEGER, PROBABILITY DOUBLE);

DO BEGIN 
	lt_data  = SELECT * FROM PAL_ONLINE_BCPD_DATA_TBL;
	lt_model = SELECT * FROM PAL_ONLINE_BCPD_MODEL_TBL;
    	lt_param = SELECT * FROM PAL_PARAMETER_TBL;
   	CALL _SYS_AFL.PAL_ONLINE_BCPD (:lt_data, :lt_model, :lt_param, lt_out_model, lt_cp);

	TRUNCATE TABLE PAL_ONLINE_BCPD_MODEL_TBL;
	TRUNCATE TABLE PAL_ONLINE_BCPD_CP_TBL;
	INSERT INTO PAL_ONLINE_BCPD_MODEL_TBL SELECT * FROM :lt_out_model;
	INSERT INTO PAL_ONLINE_BCPD_CP_TBL    SELECT * FROM :lt_cp;
END;

SELECT * FROM PAL_ONLINE_BCPD_MODEL_TBL;
SELECT * FROM PAL_ONLINE_BCPD_CP_TBL;
----------------------- second run ------------------------------------
TRUNCATE TABLE PAL_ONLINE_BCPD_DATA_TBL;
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (60, -13.85545588);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (61, -13.21785347);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (62, -13.99568127);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (63, -14.1745645);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (64, -13.61761617);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (65, -12.6770854);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (66, -14.7524888);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (67, -14.07877778);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (68, 24.63360416);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (69, 25.90989795);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (70, 25.21448161);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (71, 24.88162198);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (72, 25.6508076);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (73, 25.27387217);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (74, 25.23195676);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (75, 25.17773311);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (76, 25.72653204);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (77, 25.40448774);
INSERT INTO PAL_ONLINE_BCPD_DATA_TBL VALUES (78, 26.00679551);

DO BEGIN 
	lt_data  = SELECT * FROM PAL_ONLINE_BCPD_DATA_TBL;
	lt_model = SELECT * FROM PAL_ONLINE_BCPD_MODEL_TBL;
   	lt_param = SELECT * FROM PAL_PARAMETER_TBL;
   	CALL _SYS_AFL.PAL_ONLINE_BCPD (:lt_data, :lt_model, :lt_param, lt_out_model, lt_cp);

	TRUNCATE TABLE PAL_ONLINE_BCPD_MODEL_TBL;
	TRUNCATE TABLE PAL_ONLINE_BCPD_CP_TBL;
	INSERT INTO PAL_ONLINE_BCPD_MODEL_TBL SELECT * FROM :lt_out_model;
	INSERT INTO PAL_ONLINE_BCPD_CP_TBL    SELECT * FROM :lt_cp;
END;

SELECT * FROM PAL_ONLINE_BCPD_MODEL_TBL;
SELECT * FROM PAL_ONLINE_BCPD_CP_TBL;
