The Distribution Fitting algorithm aims to find the best probability distribution that fits a variable based on a series of measurements. PAL offers several supported probability distributions, such as Normal, Gamma, Weibull, Exponential, Poisson, and Uniform. PAL can calculate the optimized parameters of the chosen distribution to fit the observed variable. PAL supports two interfaces for distribution fitting: PAL_DISTRIBUTION_FIT for un-censored data and PAL_DISTRIBUTION_FIT_CENSORED for censored data. The algorithm uses maximum likelihood and median rank estimation methods to find the optimized parameters. The maximum likelihood method supports all distribution types for un-censored data and Weibull distribution fitting for a mixture of left, right, and interval censored data. The median rank method only supports Weibull distribution fitting for right-censored and un-censored data.
------

SET SCHEMA DM_PAL;

DROP TABLE PAL_DISTRIBUTION_FIT_DATA_TBL;
CREATE COLUMN TABLE PAL_DISTRIBUTION_FIT_DATA_TBL ("DATA" DOUBLE);
INSERT INTO PAL_DISTRIBUTION_FIT_DATA_TBL VALUES (71);
INSERT INTO PAL_DISTRIBUTION_FIT_DATA_TBL VALUES (83);
INSERT INTO PAL_DISTRIBUTION_FIT_DATA_TBL VALUES (92);
INSERT INTO PAL_DISTRIBUTION_FIT_DATA_TBL VALUES (104);
INSERT INTO PAL_DISTRIBUTION_FIT_DATA_TBL VALUES (120);
INSERT INTO PAL_DISTRIBUTION_FIT_DATA_TBL VALUES (134);
INSERT INTO PAL_DISTRIBUTION_FIT_DATA_TBL VALUES (138);
INSERT INTO PAL_DISTRIBUTION_FIT_DATA_TBL VALUES (146);
INSERT INTO PAL_DISTRIBUTION_FIT_DATA_TBL VALUES (181);
INSERT INTO PAL_DISTRIBUTION_FIT_DATA_TBL VALUES (191);
INSERT INTO PAL_DISTRIBUTION_FIT_DATA_TBL VALUES (206);
INSERT INTO PAL_DISTRIBUTION_FIT_DATA_TBL VALUES (226);
INSERT INTO PAL_DISTRIBUTION_FIT_DATA_TBL VALUES (276);
INSERT INTO PAL_DISTRIBUTION_FIT_DATA_TBL VALUES (283);
INSERT INTO PAL_DISTRIBUTION_FIT_DATA_TBL VALUES (291);
INSERT INTO PAL_DISTRIBUTION_FIT_DATA_TBL VALUES (332);
INSERT INTO PAL_DISTRIBUTION_FIT_DATA_TBL VALUES (351);
INSERT INTO PAL_DISTRIBUTION_FIT_DATA_TBL VALUES (401);
INSERT INTO PAL_DISTRIBUTION_FIT_DATA_TBL VALUES (466);

DROP TABLE PAL_DISTRIBUTION_FIT_PARAMETER_TBL;
CREATE COLUMN TABLE PAL_DISTRIBUTION_FIT_PARAMETER_TBL ("PARAM_NAME" VARCHAR(256), "INT_VALUE" INTEGER, "DOUBLE_VALUE" DOUBLE, "STRING_VALUE" VARCHAR(1000));

INSERT INTO PAL_DISTRIBUTION_FIT_PARAMETER_TBL VALUES ('DISTRIBUTIONNAME', NULL, NULL, 'WEIBULL');
INSERT INTO PAL_DISTRIBUTION_FIT_PARAMETER_TBL VALUES ('OPTIMAL_METHOD', 0, NULL, NULL);

DROP TABLE PAL_DISTRIBUTION_FIT_RESULT_TBL;
CREATE COLUMN TABLE PAL_DISTRIBUTION_FIT_RESULT_TBL ("NAME" NVARCHAR(100), "VALUE" NVARCHAR(100));

DROP TABLE PAL_DISTRIBUTION_FIT_STATISTICS_TBL;
CREATE COLUMN TABLE PAL_DISTRIBUTION_FIT_STATISTICS_TBL ("STAT_NAME" NVARCHAR(100), "STAT_VALUE" DOUBLE);

DO BEGIN
  lt_data = SELECT * FROM PAL_DISTRIBUTION_FIT_DATA_TBL;
  lt_param = SELECT * FROM PAL_DISTRIBUTION_FIT_PARAMETER_TBL;
  CALL _SYS_AFL.PAL_DISTRIBUTION_FIT (:lt_data, :lt_param, lt_result, lt_statistics);
  INSERT INTO PAL_DISTRIBUTION_FIT_RESULT_TBL SELECT * FROM :lt_result;
  INSERT INTO PAL_DISTRIBUTION_FIT_STATISTICS_TBL SELECT * FROM :lt_statistics;
END;

SELECT * FROM PAL_DISTRIBUTION_FIT_RESULT_TBL;
SELECT * FROM PAL_DISTRIBUTION_FIT_STATISTICS_TBL;
