The content discusses the use of Factorized Polynomial Regression Models (FPRM) in recommender systems. FPRM is a more general approach than traditional matrix factorization as it can incorporate additional side features related to users and items. These side features can include global side features, user side features, and item side features. Categorical features are transformed into binary vectors. The FPRM model represents users, items, and side features using weights and latent factors. These parameters are trained using stochastic gradient descent (SGD) and can be optimized using variations such as momentum, Nesterov accelerated gradient (NAG), and Adagrad. The PAL framework also implements the Hogwild! algorithm for parallelizing SGD. The content also mentions the null handling procedures for the PAL_FRM and PAL_FRM_PREDICT functions.
------

SET SCHEMA "DM_PAL";

DROP TABLE PAL_FRM_DATA_TBL;
CREATE COLUMN TABLE PAL_FRM_DATA_TBL ("ID" INTEGER, "USER" NVARCHAR(100), "MOVIE" NVARCHAR(100), "TIMESTAMP" INTEGER, "RATING" DOUBLE); -- DATA table has an ID column, we will set HAS_ID = 1 to ignore it
INSERT INTO PAL_FRM_DATA_TBL VALUES (1, 'A', 'Movie1', 3, 4.8);
INSERT INTO PAL_FRM_DATA_TBL VALUES (2, 'A', 'Movie2', 3, 4.0);
INSERT INTO PAL_FRM_DATA_TBL VALUES (3, 'A', 'Movie4', 1, 4.0);
INSERT INTO PAL_FRM_DATA_TBL VALUES (4, 'A', 'Movie5', 2, 4.0);
INSERT INTO PAL_FRM_DATA_TBL VALUES (5, 'A', 'Movie6', 3, 4.8);
INSERT INTO PAL_FRM_DATA_TBL VALUES (6, 'A', 'Movie8', 2, 3.8);
INSERT INTO PAL_FRM_DATA_TBL VALUES (7, 'A', 'Bad_Movie', 1, 2.5);
INSERT INTO PAL_FRM_DATA_TBL VALUES (8, 'B', 'Movie2', 3, 4.8);
INSERT INTO PAL_FRM_DATA_TBL VALUES (9, 'B', 'Movie3', 2, 4.8);
INSERT INTO PAL_FRM_DATA_TBL VALUES (10, 'B', 'Movie4', 2, 5.0);
INSERT INTO PAL_FRM_DATA_TBL VALUES (11, 'B', 'Movie5', 4, 5.0);
INSERT INTO PAL_FRM_DATA_TBL VALUES (12, 'B', 'Movie7', 1, 3.5);
INSERT INTO PAL_FRM_DATA_TBL VALUES (13, 'B', 'Movie8', 2, 4.8);
INSERT INTO PAL_FRM_DATA_TBL VALUES (14, 'B', 'Bad_Movie', 3, 2.8);
INSERT INTO PAL_FRM_DATA_TBL VALUES (15, 'C', 'Movie1', 2, 4.1);
INSERT INTO PAL_FRM_DATA_TBL VALUES (16, 'C', 'Movie2', 4, 4.2);
INSERT INTO PAL_FRM_DATA_TBL VALUES (17, 'C', 'Movie4', 3, 4.2);
INSERT INTO PAL_FRM_DATA_TBL VALUES (18, 'C', 'Movie5', 1, 4.0);
INSERT INTO PAL_FRM_DATA_TBL VALUES (19, 'C', 'Movie6', 4, 4.2);
INSERT INTO PAL_FRM_DATA_TBL VALUES (20, 'C', 'Movie7', 3, 3.2);
INSERT INTO PAL_FRM_DATA_TBL VALUES (21, 'C', 'Movie8', 1, 3.0);
INSERT INTO PAL_FRM_DATA_TBL VALUES (22, 'C', 'Bad_Movie', 2, 2.5);
INSERT INTO PAL_FRM_DATA_TBL VALUES (23, 'D', 'Movie1', 3, 4.5);
INSERT INTO PAL_FRM_DATA_TBL VALUES (24, 'D', 'Movie3', 2, 3.5);
INSERT INTO PAL_FRM_DATA_TBL VALUES (25, 'D', 'Movie4', 2, 4.5);
INSERT INTO PAL_FRM_DATA_TBL VALUES (26, 'D', 'Movie6', 2, 3.9);
INSERT INTO PAL_FRM_DATA_TBL VALUES (27, 'D', 'Movie7', 4, 3.5);
INSERT INTO PAL_FRM_DATA_TBL VALUES (28, 'D', 'Movie8', 3, 3.5);
INSERT INTO PAL_FRM_DATA_TBL VALUES (29, 'D', 'Bad_Movie', 3, 2.5);
INSERT INTO PAL_FRM_DATA_TBL VALUES (30, 'E', 'Movie1', 2, 4.5);
INSERT INTO PAL_FRM_DATA_TBL VALUES (31, 'E', 'Movie2', 2, 4.0);
INSERT INTO PAL_FRM_DATA_TBL VALUES (32, 'E', 'Movie3', 2, 3.5);
INSERT INTO PAL_FRM_DATA_TBL VALUES (33, 'E', 'Movie4', 4, 4.5);
INSERT INTO PAL_FRM_DATA_TBL VALUES (34, 'E', 'Movie5', 3, 4.5);
INSERT INTO PAL_FRM_DATA_TBL VALUES (35, 'E', 'Movie6', 2, 4.2);
INSERT INTO PAL_FRM_DATA_TBL VALUES (36, 'E', 'Movie7', 4, 3.5);
INSERT INTO PAL_FRM_DATA_TBL VALUES (37, 'E', 'Movie8', 3, 3.5);

DROP TABLE PAL_FRM_USER_INFORMATION_TBL;
CREATE COLUMN TABLE PAL_FRM_USER_INFORMATION_TBL ("USER" NVARCHAR(100), "USER_SIDE_FEATURE" DOUBLE);
-- There is no side information for user provided. --

DROP TABLE PAL_FRM_ITEM_INFORMATION_TBL;
CREATE COLUMN TABLE PAL_FRM_ITEM_INFORMATION_TBL ("MOVIE" VARCHAR(100), "GENRES" NVARCHAR(100));
INSERT INTO PAL_FRM_ITEM_INFORMATION_TBL VALUES ('Movie1', 'Sci-Fi');
INSERT INTO PAL_FRM_ITEM_INFORMATION_TBL VALUES ('Movie2', 'Drama,Romance');
INSERT INTO PAL_FRM_ITEM_INFORMATION_TBL VALUES ('Movie3', 'Drama,Sci-Fi');
INSERT INTO PAL_FRM_ITEM_INFORMATION_TBL VALUES ('Movie4', 'Crime,Drama');
INSERT INTO PAL_FRM_ITEM_INFORMATION_TBL VALUES ('Movie5', 'Crime,Drama');
INSERT INTO PAL_FRM_ITEM_INFORMATION_TBL VALUES ('Movie6', 'Sci-Fi');
INSERT INTO PAL_FRM_ITEM_INFORMATION_TBL VALUES ('Movie7', 'Crime,Drama');
INSERT INTO PAL_FRM_ITEM_INFORMATION_TBL VALUES ('Movie8', 'Sci-Fi,Thriller');
INSERT INTO PAL_FRM_ITEM_INFORMATION_TBL VALUES ('Bad_Movie', 'Romance,Thriller');

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 ('HAS_ID', 1, NULL, NULL); -- ignore the first column in DATA table
INSERT INTO PAL_PARAMETER_TBL VALUES ('CATEGORICAL_VARIABLE', NULL, NULL, 'TIMESTAMP'); -- column TIMESTAMP is categorical
INSERT INTO PAL_PARAMETER_TBL VALUES ('FACTOR_NUMBER', 2, NULL, NULL);
INSERT INTO PAL_PARAMETER_TBL VALUES ('METHOD', 3, NULL, NULL);-- use ADAGRAD method
INSERT INTO PAL_PARAMETER_TBL VALUES ('LEARNING_RATE', NULL, 0, NULL);
INSERT INTO PAL_PARAMETER_TBL VALUES ('MAX_ITERATION', 100, NULL, NULL);
INSERT INTO PAL_PARAMETER_TBL VALUES ('THREAD_RATIO', NULL, 0.5, NULL);
INSERT INTO PAL_PARAMETER_TBL VALUES ('SEED', 1, NULL, NULL);

DROP TABLE PAL_FRM_MODEL_METADATA_TBL;
DROP TABLE PAL_FRM_MODEL_TBL;
DROP TABLE PAL_FRM_MODEL_FACTORS_TBL;
CREATE COLUMN TABLE PAL_FRM_MODEL_METADATA_TBL ("ROW_INDEX" INTEGER, "METADATA_CONTENT" NVARCHAR(5000));
CREATE COLUMN TABLE PAL_FRM_MODEL_TBL ("ID" INTEGER, "MAP" NVARCHAR(1000), "WEIGHT" DOUBLE);
CREATE COLUMN TABLE PAL_FRM_MODEL_FACTORS_TBL ("FACTOR_ID" INTEGER, "FACTOR" DOUBLE);

do begin
	LT_DATA_TAB = select * from PAL_FRM_DATA_TBL;
	LT_USER_INFO_TAB = select * from PAL_FRM_USER_INFORMATION_TBL;
	LT_ITER_INFO_TAB = select * from PAL_FRM_ITEM_INFORMATION_TBL;
	LT_PARAM_TAB = select * from PAL_PARAMETER_TBL;
	CALL _SYS_AFL.PAL_FRM (:LT_DATA_TAB, :LT_USER_INFO_TAB, :LT_ITER_INFO_TAB, :LT_PARAM_TAB, LT_METADATA_TAB, LT_MODEL_TAB, LT_FACTORS_TAB, LT_INFO_TAB, LT_STAT_TAB, LT_CV_TAB);
	insert into PAL_FRM_MODEL_METADATA_TBL select * from :LT_METADATA_TAB;
	insert into PAL_FRM_MODEL_TBL select * from :LT_MODEL_TAB;
	insert into PAL_FRM_MODEL_FACTORS_TBL select * from :LT_FACTORS_TAB;
	select * from :LT_METADATA_TAB;
	select * from :LT_MODEL_TAB;
	select * from :LT_FACTORS_TAB;
	select * from :LT_INFO_TAB;
	select * from :LT_STAT_TAB;
	select * from :LT_CV_TAB;
end;

