13 m4_include(`SQLCommon.m4
') --'
439 ------------------------------------------------------------------------
465 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.elastic_net_train (
471 alpha DOUBLE PRECISION,
472 lambda_value DOUBLE PRECISION,
476 optimizer_params TEXT,
479 tolerance DOUBLE PRECISION
482 $$ LANGUAGE plpythonu;
484 ------------------------------------------------------------------------
485 -- Overloaded functions
486 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.elastic_net_train (
492 alpha DOUBLE PRECISION,
493 lambda_value DOUBLE PRECISION,
494 standardization BOOLEAN,
495 grouping_columns TEXT,
497 optimizer_params TEXT,
502 PERFORM MADLIB_SCHEMA.elastic_net_train($1, $2, $3, $4, $5, $6, $7, $8,
503 $9, $10, $11, $12, $13, 1e-6);
505 $$ LANGUAGE plpgsql VOLATILE;
507 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.elastic_net_train (
513 alpha DOUBLE PRECISION,
514 lambda_value DOUBLE PRECISION,
515 standardization BOOLEAN,
516 grouping_columns TEXT,
518 optimizer_params TEXT,
522 PERFORM MADLIB_SCHEMA.elastic_net_train($1, $2, $3, $4, $5, $6, $7, $8,
523 $9, $10, $11, $12, 10000);
525 $$ LANGUAGE plpgsql VOLATILE;
527 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.elastic_net_train (
533 alpha DOUBLE PRECISION,
534 lambda_value DOUBLE PRECISION,
535 standardization BOOLEAN,
536 grouping_columns TEXT,
538 optimizer_params TEXT
541 PERFORM MADLIB_SCHEMA.elastic_net_train($1, $2, $3, $4, $5, $6, $7, $8,
544 $$ LANGUAGE plpgsql VOLATILE;
546 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.elastic_net_train (
552 alpha DOUBLE PRECISION,
553 lambda_value DOUBLE PRECISION,
554 standardization BOOLEAN,
555 grouping_columns TEXT,
559 PERFORM MADLIB_SCHEMA.elastic_net_train($1, $2, $3, $4, $5, $6, $7, $8,
560 $9, $10, NULL::TEXT);
562 $$ LANGUAGE plpgsql VOLATILE;
564 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.elastic_net_train (
570 alpha DOUBLE PRECISION,
571 lambda_value DOUBLE PRECISION,
572 standardization BOOLEAN,
573 grouping_columns TEXT
576 PERFORM MADLIB_SCHEMA.elastic_net_train($1, $2, $3, $4, $5, $6, $7, $8,
579 $$ LANGUAGE plpgsql VOLATILE;
581 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.elastic_net_train (
587 alpha DOUBLE PRECISION,
588 lambda_value DOUBLE PRECISION,
589 standardization BOOLEAN
592 PERFORM MADLIB_SCHEMA.elastic_net_train($1, $2, $3, $4, $5, $6, $7, $8,
595 $$ LANGUAGE plpgsql VOLATILE;
597 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.elastic_net_train (
603 alpha DOUBLE PRECISION,
604 lambda_value DOUBLE PRECISION
607 PERFORM MADLIB_SCHEMA.elastic_net_train($1, $2, $3, $4, $5, $6, $7, True);
609 $$ LANGUAGE plpgsql VOLATILE;
611 ------------------------------------------------------------------------
616 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.elastic_net_train ()
618 PythonFunction(elastic_net, elastic_net, elastic_net_help)
619 $$ LANGUAGE plpythonu;
621 ------------------------------------------------------------------------
630 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.elastic_net_train (
631 family_or_optimizer TEXT
633 PythonFunction(elastic_net, elastic_net, elastic_net_help)
634 $$ LANGUAGE plpythonu;
636 ------------------------------------------------------------------------
637 ------------------------------------------------------------------------
638 ------------------------------------------------------------------------
648 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.elastic_net_predict (
654 PythonFunction(elastic_net, elastic_net, elastic_net_predict_all)
655 $$ LANGUAGE plpythonu;
657 ------------------------------------------------------------------------
670 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.elastic_net_predict (
672 coefficients DOUBLE PRECISION[],
673 intercept DOUBLE PRECISION,
674 ind_var DOUBLE PRECISION[]
675 ) RETURNS DOUBLE PRECISION AS $$
678 binomial_result BOOLEAN;
680 family_name := lower(regress_family);
682 IF family_name =
'gaussian' OR family_name =
'linear' THEN
683 RETURN MADLIB_SCHEMA.elastic_net_gaussian_predict(coefficients, intercept, ind_var);
686 IF family_name =
'binomial' OR family_name =
'logistic' THEN
687 binomial_result := MADLIB_SCHEMA.elastic_net_binomial_predict(coefficients, intercept, ind_var);
688 IF binomial_result THEN
695 RAISE EXCEPTION
'This regression family is not supported!';
697 $$ LANGUAGE plpgsql IMMUTABLE STRICT;
699 ------------------------------------------------------------------------
710 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.elastic_net_gaussian_predict (
711 coefficients DOUBLE PRECISION[],
712 intercept DOUBLE PRECISION,
713 ind_var DOUBLE PRECISION[]
714 ) RETURNS DOUBLE PRECISION AS
715 'MODULE_PATHNAME',
'__elastic_net_gaussian_predict'
716 LANGUAGE C IMMUTABLE STRICT;
718 ------------------------------------------------------------------------
728 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.elastic_net_binomial_predict (
729 coefficients DOUBLE PRECISION[],
730 intercept DOUBLE PRECISION,
731 ind_var DOUBLE PRECISION[]
733 'MODULE_PATHNAME',
'__elastic_net_binomial_predict'
734 LANGUAGE C IMMUTABLE STRICT;
736 ------------------------------------------------------------------------
746 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.elastic_net_binomial_prob (
747 coefficients DOUBLE PRECISION[],
748 intercept DOUBLE PRECISION,
749 ind_var DOUBLE PRECISION[]
750 ) RETURNS DOUBLE PRECISION AS
751 'MODULE_PATHNAME',
'__elastic_net_binomial_prob'
752 LANGUAGE C IMMUTABLE STRICT;
754 ------------------------------------------------------------------------
756 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.__elastic_net_binomial_loglikelihood (
757 coefficients DOUBLE PRECISION[],
758 intercept DOUBLE PRECISION,
760 ind_var DOUBLE PRECISION[]
761 ) RETURNS DOUBLE PRECISION AS
762 'MODULE_PATHNAME',
'__elastic_net_binomial_loglikelihood'
763 LANGUAGE C IMMUTABLE STRICT;
765 ------------------------------------------------------------------------
766 -- Compute the solution
for just one step ------------------------------
767 ------------------------------------------------------------------------
769 CREATE TYPE MADLIB_SCHEMA.__elastic_net_result AS (
770 intercept DOUBLE PRECISION,
771 coefficients DOUBLE PRECISION[],
772 lambda_value DOUBLE PRECISION
775 ------------------------------------------------------------------------
779 CREATE FUNCTION MADLIB_SCHEMA.__gaussian_igd_transition (
780 state DOUBLE PRECISION[],
781 ind_var DOUBLE PRECISION[],
782 dep_var DOUBLE PRECISION,
783 pre_state DOUBLE PRECISION[],
784 lambda DOUBLE PRECISION,
785 alpha DOUBLE PRECISION,
787 stepsize DOUBLE PRECISION,
789 xmean DOUBLE PRECISION[],
790 ymean DOUBLE PRECISION,
791 step_decay DOUBLE PRECISION
792 ) RETURNS DOUBLE PRECISION[]
793 AS
'MODULE_PATHNAME',
'gaussian_igd_transition'
794 LANGUAGE C IMMUTABLE;
798 CREATE FUNCTION MADLIB_SCHEMA.__gaussian_igd_merge (
799 state1 DOUBLE PRECISION[],
800 state2 DOUBLE PRECISION[]
801 ) RETURNS DOUBLE PRECISION[] AS
802 'MODULE_PATHNAME',
'gaussian_igd_merge'
803 LANGUAGE C IMMUTABLE STRICT;
807 CREATE FUNCTION MADLIB_SCHEMA.__gaussian_igd_final (
808 state DOUBLE PRECISION[]
809 ) RETURNS DOUBLE PRECISION[] AS
810 'MODULE_PATHNAME',
'gaussian_igd_final'
811 LANGUAGE C IMMUTABLE STRICT;
816 CREATE AGGREGATE MADLIB_SCHEMA.__gaussian_igd_step(
829 SType = DOUBLE PRECISION[],
830 SFunc = MADLIB_SCHEMA.__gaussian_igd_transition,
831 m4_ifdef(`GREENPLUM
', `prefunc = MADLIB_SCHEMA.__gaussian_igd_merge,')
832 FinalFunc = MADLIB_SCHEMA.__gaussian_igd_final,
833 InitCond = '{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
'
836 CREATE AGGREGATE MADLIB_SCHEMA.__gaussian_igd_step_single_seg (
837 /* ind_var */ DOUBLE PRECISION[],
838 /* dep_var */ DOUBLE PRECISION,
839 /* pre_state */ DOUBLE PRECISION[],
840 /* lambda */ DOUBLE PRECISION,
841 /* alpha */ DOUBLE PRECISION,
842 /* dimension */ INTEGER,
843 /* stepsize */ DOUBLE PRECISION,
844 /* total_rows */ INTEGER,
845 /* xmeans */ DOUBLE PRECISION[],
846 /* ymean */ DOUBLE PRECISION,
847 /* step_decay */ DOUBLE PRECISION
849 SType = DOUBLE PRECISION[],
850 SFunc = MADLIB_SCHEMA.__gaussian_igd_transition,
851 -- m4_ifdef(`GREENPLUM', `prefunc = MADLIB_SCHEMA.__gaussian_igd_merge,
')
852 FinalFunc = MADLIB_SCHEMA.__gaussian_igd_final,
853 InitCond = '{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
'
858 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.__gaussian_igd_state_diff (
859 state1 DOUBLE PRECISION[],
860 state2 DOUBLE PRECISION[]
861 ) RETURNS DOUBLE PRECISION AS
862 'MODULE_PATHNAME
', '__gaussian_igd_state_diff
'
863 LANGUAGE C IMMUTABLE STRICT;
867 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.__gaussian_igd_result (
868 in_state DOUBLE PRECISION[],
869 feature_sq DOUBLE PRECISION[],
870 threshold DOUBLE PRECISION,
871 tolerance DOUBLE PRECISION
872 ) RETURNS MADLIB_SCHEMA.__elastic_net_result AS
873 'MODULE_PATHNAME
', '__gaussian_igd_result
'
874 LANGUAGE C IMMUTABLE STRICT;
876 ------------------------------------------------------------------------
880 CREATE FUNCTION MADLIB_SCHEMA.__gaussian_fista_transition (
881 state DOUBLE PRECISION[],
882 ind_var DOUBLE PRECISION[],
883 dep_var DOUBLE PRECISION,
884 pre_state DOUBLE PRECISION[],
885 lambda DOUBLE PRECISION,
886 alpha DOUBLE PRECISION,
889 max_stepsize DOUBLE PRECISION,
890 eta DOUBLE PRECISION,
891 use_active_set INTEGER,
893 random_stepsize INTEGER
894 ) RETURNS DOUBLE PRECISION[]
895 AS 'MODULE_PATHNAME
', 'gaussian_fista_transition
'
896 LANGUAGE C IMMUTABLE;
900 CREATE FUNCTION MADLIB_SCHEMA.__gaussian_fista_merge (
901 state1 DOUBLE PRECISION[],
902 state2 DOUBLE PRECISION[]
903 ) RETURNS DOUBLE PRECISION[] AS
904 'MODULE_PATHNAME
', 'gaussian_fista_merge
'
905 LANGUAGE C IMMUTABLE STRICT;
909 CREATE FUNCTION MADLIB_SCHEMA.__gaussian_fista_final (
910 state DOUBLE PRECISION[]
911 ) RETURNS DOUBLE PRECISION[] AS
912 'MODULE_PATHNAME
', 'gaussian_fista_final
'
913 LANGUAGE C IMMUTABLE STRICT;
916 Perform one iteration step of FISTA for linear models
918 CREATE AGGREGATE MADLIB_SCHEMA.__gaussian_fista_step(
919 /* ind_var */ DOUBLE PRECISION[],
920 /* dep_var */ DOUBLE PRECISION,
921 /* pre_state */ DOUBLE PRECISION[],
922 /* lambda */ DOUBLE PRECISION,
923 /* alpha */ DOUBLE PRECISION,
924 /* dimension */ INTEGER,
925 /* total_rows */ INTEGER,
926 /* max_stepsize */ DOUBLE PRECISION,
927 /* eta */ DOUBLE PRECISION,
928 /* use_active_set */ INTEGER,
929 /* is_active */ INTEGER,
930 /* random_stepsize */ INTEGER
932 SType = DOUBLE PRECISION[],
933 SFunc = MADLIB_SCHEMA.__gaussian_fista_transition,
934 m4_ifdef(`GREENPLUM', `prefunc = MADLIB_SCHEMA.__gaussian_fista_merge,
')
935 FinalFunc = MADLIB_SCHEMA.__gaussian_fista_final,
936 InitCond = '{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
'
941 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.__gaussian_fista_state_diff (
942 state1 DOUBLE PRECISION[],
943 state2 DOUBLE PRECISION[]
944 ) RETURNS DOUBLE PRECISION AS
945 'MODULE_PATHNAME
', '__gaussian_fista_state_diff
'
946 LANGUAGE C IMMUTABLE STRICT;
950 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.__gaussian_fista_result (
951 in_state DOUBLE PRECISION[]
952 ) RETURNS MADLIB_SCHEMA.__elastic_net_result AS
953 'MODULE_PATHNAME
', '__gaussian_fista_result
'
954 LANGUAGE C IMMUTABLE STRICT;
956 ------------------------------------------------------------------------
957 ------------------------------------------------------------------------
958 ------------------------------------------------------------------------
962 CREATE FUNCTION MADLIB_SCHEMA.__binomial_igd_transition (
963 state DOUBLE PRECISION[],
964 ind_var DOUBLE PRECISION[],
966 pre_state DOUBLE PRECISION[],
967 lambda DOUBLE PRECISION,
968 alpha DOUBLE PRECISION,
970 stepsize DOUBLE PRECISION,
972 xmean DOUBLE PRECISION[],
973 ymean DOUBLE PRECISION,
974 step_decay DOUBLE PRECISION
975 ) RETURNS DOUBLE PRECISION[]
976 AS 'MODULE_PATHNAME
', 'binomial_igd_transition
'
977 LANGUAGE C IMMUTABLE;
981 CREATE FUNCTION MADLIB_SCHEMA.__binomial_igd_merge (
982 state1 DOUBLE PRECISION[],
983 state2 DOUBLE PRECISION[]
984 ) RETURNS DOUBLE PRECISION[] AS
985 'MODULE_PATHNAME
', 'binomial_igd_merge
'
986 LANGUAGE C IMMUTABLE STRICT;
990 CREATE FUNCTION MADLIB_SCHEMA.__binomial_igd_final (
991 state DOUBLE PRECISION[]
992 ) RETURNS DOUBLE PRECISION[] AS
993 'MODULE_PATHNAME
', 'binomial_igd_final
'
994 LANGUAGE C IMMUTABLE STRICT;
997 * Perform one iteration step of IGD for linear models
999 CREATE AGGREGATE MADLIB_SCHEMA.__binomial_igd_step(
1000 /* ind_var */ DOUBLE PRECISION[],
1001 /* dep_var */ BOOLEAN,
1002 /* pre_state */ DOUBLE PRECISION[],
1003 /* lambda */ DOUBLE PRECISION,
1004 /* alpha */ DOUBLE PRECISION,
1005 /* dimension */ INTEGER,
1006 /* stepsize */ DOUBLE PRECISION,
1007 /* total_rows */ INTEGER,
1008 /* xmeans */ DOUBLE PRECISION[],
1009 /* ymean */ DOUBLE PRECISION,
1010 /* step_decay */ DOUBLE PRECISION
1012 SType = DOUBLE PRECISION[],
1013 SFunc = MADLIB_SCHEMA.__binomial_igd_transition,
1014 m4_ifdef(`GREENPLUM', `prefunc = MADLIB_SCHEMA.__binomial_igd_merge,
')
1015 FinalFunc = MADLIB_SCHEMA.__binomial_igd_final,
1016 InitCond = '{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
'
1019 CREATE AGGREGATE MADLIB_SCHEMA.__binomial_igd_step_single_seg (
1020 /* ind_var */ DOUBLE PRECISION[],
1021 /* dep_var */ BOOLEAN,
1022 /* pre_state */ DOUBLE PRECISION[],
1023 /* lambda */ DOUBLE PRECISION,
1024 /* alpha */ DOUBLE PRECISION,
1025 /* dimension */ INTEGER,
1026 /* stepsize */ DOUBLE PRECISION,
1027 /* total_rows */ INTEGER,
1028 /* xmeans */ DOUBLE PRECISION[],
1029 /* ymean */ DOUBLE PRECISION,
1030 /* step_decay */ DOUBLE PRECISION
1032 SType = DOUBLE PRECISION[],
1033 SFunc = MADLIB_SCHEMA.__binomial_igd_transition,
1034 -- m4_ifdef(`GREENPLUM', `prefunc = MADLIB_SCHEMA.__binomial_igd_merge,
')
1035 FinalFunc = MADLIB_SCHEMA.__binomial_igd_final,
1036 InitCond = '{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
'
1041 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.__binomial_igd_state_diff (
1042 state1 DOUBLE PRECISION[],
1043 state2 DOUBLE PRECISION[]
1044 ) RETURNS DOUBLE PRECISION AS
1045 'MODULE_PATHNAME
', '__binomial_igd_state_diff
'
1046 LANGUAGE C IMMUTABLE STRICT;
1050 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.__binomial_igd_result (
1051 in_state DOUBLE PRECISION[],
1052 feature_sq DOUBLE PRECISION[],
1053 threshold DOUBLE PRECISION,
1054 tolerance DOUBLE PRECISION
1055 ) RETURNS MADLIB_SCHEMA.__elastic_net_result AS
1056 'MODULE_PATHNAME
', '__binomial_igd_result
'
1057 LANGUAGE C IMMUTABLE STRICT;
1059 ------------------------------------------------------------------------
1061 /* Binomial FISTA */
1063 CREATE FUNCTION MADLIB_SCHEMA.__binomial_fista_transition (
1064 state DOUBLE PRECISION[],
1065 ind_var DOUBLE PRECISION[],
1067 pre_state DOUBLE PRECISION[],
1068 lambda DOUBLE PRECISION,
1069 alpha DOUBLE PRECISION,
1072 max_stepsize DOUBLE PRECISION,
1073 eta DOUBLE PRECISION,
1074 use_active_set INTEGER,
1076 random_stepsize INTEGER
1077 ) RETURNS DOUBLE PRECISION[]
1078 AS 'MODULE_PATHNAME
', 'binomial_fista_transition
'
1079 LANGUAGE C IMMUTABLE;
1083 CREATE FUNCTION MADLIB_SCHEMA.__binomial_fista_merge (
1084 state1 DOUBLE PRECISION[],
1085 state2 DOUBLE PRECISION[]
1086 ) RETURNS DOUBLE PRECISION[] AS
1087 'MODULE_PATHNAME
', 'binomial_fista_merge
'
1088 LANGUAGE C IMMUTABLE STRICT;
1092 CREATE FUNCTION MADLIB_SCHEMA.__binomial_fista_final (
1093 state DOUBLE PRECISION[]
1094 ) RETURNS DOUBLE PRECISION[] AS
1095 'MODULE_PATHNAME
', 'binomial_fista_final
'
1096 LANGUAGE C IMMUTABLE STRICT;
1099 Perform one iteration step of FISTA for linear models
1101 CREATE AGGREGATE MADLIB_SCHEMA.__binomial_fista_step(
1102 /* ind_var */ DOUBLE PRECISION[],
1103 /* dep_var */ BOOLEAN,
1104 /* pre_state */ DOUBLE PRECISION[],
1105 /* lambda */ DOUBLE PRECISION,
1106 /* alpha */ DOUBLE PRECISION,
1107 /* dimension */ INTEGER,
1108 /* total_rows */ INTEGER,
1109 /* max_stepsize */ DOUBLE PRECISION,
1110 /* eta */ DOUBLE PRECISION,
1111 /* use_active_set */ INTEGER,
1112 /* is_active */ INTEGER,
1113 /* random_stepsize */ INTEGER
1115 SType = DOUBLE PRECISION[],
1116 SFunc = MADLIB_SCHEMA.__binomial_fista_transition,
1117 m4_ifdef(`GREENPLUM', `prefunc = MADLIB_SCHEMA.__binomial_fista_merge,
')
1118 FinalFunc = MADLIB_SCHEMA.__binomial_fista_final,
1119 InitCond = '{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
'
1124 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.__binomial_fista_state_diff (
1125 state1 DOUBLE PRECISION[],
1126 state2 DOUBLE PRECISION[]
1127 ) RETURNS DOUBLE PRECISION AS
1128 'MODULE_PATHNAME
', '__binomial_fista_state_diff
'
1129 LANGUAGE C IMMUTABLE STRICT;
1133 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.__binomial_fista_result (
1134 in_state DOUBLE PRECISION[]
1135 ) RETURNS MADLIB_SCHEMA.__elastic_net_result AS
1136 'MODULE_PATHNAME
', '__binomial_fista_result
'
1137 LANGUAGE C IMMUTABLE STRICT;