Long-term time series forecasting is a predictive analysis approach that focuses on making predictions for extended periods into the future. Traditional time series forecasting algorithms may encounter issues when predicting far into the future, but this function integrates cutting-edge neural networks specifically designed for long-term forecasting. The function offers four distinct neural networks: NLinear, DLinear, XLinear, and SCINet, each with their own unique features and capabilities.
------

SET SCHEMA DM_PAL;

DROP TABLE PAL_LTSF_DATA_TBL;
CREATE COLUMN TABLE PAL_LTSF_DATA_TBL (
	TIME_STAMP INTEGER,
	TARGET DOUBLE,
	FEAT1 INTEGER,
	FEAT2 DOUBLE,
	FEAT3 VARCHAR(2),
	FEAT4 DOUBLE
);

INSERT INTO PAL_LTSF_DATA_TBL VALUES (1,  129.0, -16,  -4.0, 'SE', 1.79);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (2,  148.0, -15,  -4.0, 'SE', 2.68);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (3,  159.0, -11,  -5.0, 'SE', 3.57);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (4,  181.0,  -7,  -5.0, 'SE', 5.36); 
INSERT INTO PAL_LTSF_DATA_TBL VALUES (5,  138.0,  -7,  -5.0, 'SE', 6.25); 
INSERT INTO PAL_LTSF_DATA_TBL VALUES (6,  109.0,  -7,  -6.0, 'SE', 7.14); 
INSERT INTO PAL_LTSF_DATA_TBL VALUES (7,  105.0,  -7,  -6.0, 'SE', 8.93); 
INSERT INTO PAL_LTSF_DATA_TBL VALUES (8,  124.0,  -7,  -5.0, 'SE', 10.72);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (9,  120.0,  -8,  -6.0, 'SE', 12.51);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (10, 132.0,  -7,  -5.0, 'SE', 14.3);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (11, 140.0,  -7,  -5.0, 'SE', 17.43);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (12, 152.0,  -8,  -5.0, 'SE', 20.56);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (13, 148.0,  -8,  -5.0, 'SE', 23.69);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (14, 164.0,  -8,  -5.0, 'SE', 27.71);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (15, 158.0,  -9,  -5.0, 'SE', 31.73);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (16, 154.0,  -9,  -5.0, 'SE', 35.75);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (17, 159.0,  -9,  -5.0, 'SE', 37.54);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (18, 164.0,  -8,  -5.0, 'SE', 39.33);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (19, 170.0,  -8,  -5.0, 'SE', 42.46);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (20, 149.0,  -8,  -5.0, 'SE', 44.25);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (21, 154.0,  -7,  -5.0, 'SE', 46.04);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (22, 164.0,  -7,  -5.0, 'SE', 49.17);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (23, 156.0,  -8,  -6.0, 'SE', 52.3);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (24, 126.0,  -8,  -6.0, 'SE', 55.43);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (25,  90.0,  -7,  -6.0, 'SE', 58.56);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (26,  63.0,  -8,  -6.0, 'SE', 61.69);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (27,  65.0,  -8,  -7.0, 'SE', 65.71);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (28,  55.0,  -8,  -7.0, 'SE', 68.84);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (29,  65.0,  -8,  -7.0, 'SE', 72.86);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (30,  83.0,  -9,  -8.0, 'SE', 76.88);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (31,  91.0, -10,  -8.0, 'SE', 80.9); 
INSERT INTO PAL_LTSF_DATA_TBL VALUES (32,  86.0, -10,  -9.0, 'SE', 84.92); 
INSERT INTO PAL_LTSF_DATA_TBL VALUES (33,  82.0, -10,  -9.0, 'SE', 89.84); 
INSERT INTO PAL_LTSF_DATA_TBL VALUES (34,  86.0, -11,  -9.0, 'SE', 93.86); 
INSERT INTO PAL_LTSF_DATA_TBL VALUES (35,  78.0, -11,  -9.0, 'SE', 97.88); 
INSERT INTO PAL_LTSF_DATA_TBL VALUES (36,  98.0, -11,  -9.0, 'SE', 102.8);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (37, 107.0, -11,  -9.0, 'SE', 105.93);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (38,  90.0, -11,  -9.0, 'SE', 111.74);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (39,  96.0, -11,  -9.0, 'SE', 116.66);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (40,  95.0, -11,  -9.0, 'SE', 121.58);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (41,  86.0, -11,  -9.0, 'SE', 124.71);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (42,  70.0, -11,  -9.0, 'SE', 127.84);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (43,  61.0, -11,  -9.0, 'cv', 0.89);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (44,  53.0, -11,  -9.0, 'cv', 1.78);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (45,  71.0, -10,  -9.0, 'NW', 4.02);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (46,  72.0, -11, -10.0, 'NW', 7.15);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (47,  76.0, -11,  -9.0, 'NW', 11.17);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (48,  73.0, -12, -11.0, 'NW', 14.3);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (49,  79.0, -14, -12.0, 'NW', 16.09);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (50,  58.0, -16,  -9.0, 'NW', 21.9);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (51,  25.0, -17, -10.0, 'NW', 29.95);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (52,  26.0, -18, -11.0, 'NW', 39.78);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (53,  28.0, -19, -11.0, 'NW', 48.72);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (54,  26.0, -20, -12.0, 'NW', 55.87);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (55,  20.0, -21, -12.0, 'NW', 64.81);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (56,  29.0, -21, -13.0, 'NW', 73.75);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (57,  26.0, -22, -13.0, 'NW', 80.9);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (58,  27.0, -22, -13.0, 'NW', 90.73);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (59,  27.0, -22, -12.0, 'NW', 100.56);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (60,  25.0, -23, -12.0, 'NW', 108.61);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (61,  29.0, -21, -11.0, 'NW', 117.55);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (62,  32.0, -20, -10.0, 'NW', 127.38);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (63,  28.0, -21, -10.0, 'NW', 136.32);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (64,  29.0, -21,  -9.0, 'NW', 145.26);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (65,  30.0, -21,  -9.0, 'NW', 152.41);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (66,  30.0, -20, -11.0, 'NW', 159.56);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (67,  28.0, -23, -11.0, 'NW', 165.37);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (68,  26.0, -21, -12.0, 'NW', 171.18);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (69,  31.0, -24, -12.0, 'NW', 180.12);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (70,  33.0, -24, -13.0, 'NW', 187.27);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (71,  29.0, -24, -13.0, 'NW', 195.32);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (72,  31.0, -26, -15.0, 'NW', 198.45);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (73,  30.0, -26, -17.0, 'NW', 201.58);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (74,  34.0, -26, -18.0, 'NW', 205.6);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (75,  27.0, -26, -19.0, 'NW', 208.73);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (76,  25.0, -27, -18.0, 'NW', 213.65);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (77,  28.0, -27, -19.0, 'NW', 218.57);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (78,  28.0, -27, -16.0, 'NE', 4.92);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (79,  27.0, -26, -16.0, 'NE', 8.05);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (80,  27.0, -27, -16.0, 'NE', 13.86);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (81,  27.0, -26, -16.0, 'NE', 18.78);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (82,  29.0, -26, -15.0, 'NE', 24.59);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (83,  36.0, -25, -14.0, 'NE', 29.51);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (84,  30.0, -25, -13.0, 'NE', 34.43);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (85,  27.0, -25, -12.0, 'NE', 39.35);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (86,  39.0, -24, -11.0, 'NE', 41.14);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (87,  41.0, -22, -11.0, 'cv', 0.89);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (88,  33.0, -23, -11.0, 'NW', 1.79);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (89,  50.0, -24, -11.0, 'NW', 3.58);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (90,  56.0, -23, -11.0, 'NW', 5.37);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (91,  59.0, -23, -11.0, 'NW', 7.16);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (92,  60.0, -22, -13.0, 'NW', 10.29);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (93,  84.0, -22, -12.0, 'NW', 13.42);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (94, 106.0, -24, -18.0, 'NW', 16.55);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (95,  66.0, -22, -13.0, 'NW', 20.57);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (96,  50.0, -22, -16.0, 'NW', 23.7);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (97,  56.0, -25, -17.0, 'NW', 26.83);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (98,  77.0, -25, -14.0, 'NE', 4.02);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (99,  50.0, -26, -14.0, 'NE', 8.04);
INSERT INTO PAL_LTSF_DATA_TBL VALUES (100, 44.0, -26, -14.0, 'NE', 13.85);

DROP TABLE PAL_PARAMETER_TBL;
CREATE COLUMN TABLE PAL_PARAMETER_TBL (PARAM_NAME VARCHAR(256), INT_VALUE INTEGER, DOUBLE_VALUE DOUBLE, STRING_VALUE VARCHAR(1000));
INSERT INTO PAL_PARAMETER_TBL VALUES ('NETWORK_TYPE',         2,    Null,   Null);
INSERT INTO PAL_PARAMETER_TBL VALUES ('TRAIN_LENGTH',        32,    Null,   Null);
INSERT INTO PAL_PARAMETER_TBL VALUES ('FORECAST_LENGTH',     16,    Null,   Null);
INSERT INTO PAL_PARAMETER_TBL VALUES ('BATCH_SIZE',           8,    Null,   Null);
INSERT INTO PAL_PARAMETER_TBL VALUES ('NUM_EPOCHS',           2,    Null,   Null);
INSERT INTO PAL_PARAMETER_TBL VALUES ('ADJUST_LEARNING_RATE', 1,    Null,   Null);
INSERT INTO PAL_PARAMETER_TBL VALUES ('RANDOM_SEED',          1,    Null,   Null);
INSERT INTO PAL_PARAMETER_TBL VALUES ('LEARNING_RATE',     Null,   0.005,   Null);

DROP TABLE PAL_LTSF_MODEL_TBL;
CREATE COLUMN TABLE PAL_LTSF_MODEL_TBL ( 
	ROW_INDEX INTEGER,
	MODEL_CONTENT NVARCHAR(5000)
);

DROP TABLE PAL_LTSF_LOSS_TBL; 
CREATE COLUMN TABLE PAL_LTSF_LOSS_TBL ( 
	EPOCH INTEGER,
    BATCH NVARCHAR(5000),
	LOSS DOUBLE
);


DO BEGIN
	lt_data = SELECT * FROM PAL_LTSF_DATA_TBL;
	lt_param = SELECT * FROM PAL_PARAMETER_TBL;
	CALL _SYS_AFL.PAL_LTSF_TRAIN (:lt_data, :lt_param, lt_loss, lt_model);
	INSERT INTO PAL_LTSF_LOSS_TBL SELECT * FROM :lt_loss;
	INSERT INTO PAL_LTSF_MODEL_TBL SELECT * FROM :lt_model;
END;

select * from PAL_LTSF_LOSS_TBL;
select * from PAL_LTSF_MODEL_TBL;
