13 m4_include(`SQLCommon.m4
')
432 DROP TYPE IF EXISTS MADLIB_SCHEMA.lincrf_result;
433 CREATE TYPE MADLIB_SCHEMA.lincrf_result AS (
434 coef DOUBLE PRECISION[],
435 log_likelihood DOUBLE PRECISION,
436 num_iterations INTEGER
439 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.lincrf_lbfgs_step_transition(
447 RETURNS DOUBLE PRECISION[]
449 LANGUAGE C IMMUTABLE;
451 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.lincrf_lbfgs_step_merge_states(
452 state1 DOUBLE PRECISION[],
453 state2 DOUBLE PRECISION[])
454 RETURNS DOUBLE PRECISION[]
456 LANGUAGE C IMMUTABLE STRICT;
458 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.lincrf_lbfgs_step_final(
459 state DOUBLE PRECISION[])
460 RETURNS DOUBLE PRECISION[]
462 LANGUAGE C IMMUTABLE STRICT;
464 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.internal_lincrf_lbfgs_converge(
465 /*+ state */ DOUBLE PRECISION[])
466 RETURNS DOUBLE PRECISION AS
468 LANGUAGE c IMMUTABLE STRICT;
471 CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.internal_lincrf_lbfgs_result(
472 /*+ state */ DOUBLE PRECISION[])
473 RETURNS MADLIB_SCHEMA.lincrf_result AS
475 LANGUAGE c IMMUTABLE STRICT;
482 CREATE AGGREGATE MADLIB_SCHEMA.lincrf_lbfgs_step(
483 /* sparse_r columns */ DOUBLE PRECISION[],
484 /* dense_m columns */ DOUBLE PRECISION[],
485 /* sparse_m columns */ DOUBLE PRECISION[],
486 /* feature size */ DOUBLE PRECISION,
487 /* tag size */ DOUBLE PRECISION,
488 /* previous_state */ DOUBLE PRECISION[]) (
490 STYPE=DOUBLE PRECISION[],
491 SFUNC=MADLIB_SCHEMA.lincrf_lbfgs_step_transition,
492 m4_ifdef(`__GREENPLUM__',`prefunc=MADLIB_SCHEMA.lincrf_lbfgs_step_merge_states,
')
493 FINALFUNC=MADLIB_SCHEMA.lincrf_lbfgs_step_final,
494 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,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, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
'
497 m4_changequote(<!,!>)
498 m4_ifdef(<!__HAS_ORDERED_AGGREGATES__!>,<!
500 m4_ifdef(<!__GREENPLUM__!>,<!ORDERED!>)
501 AGGREGATE MADLIB_SCHEMA.array_union(anyarray) (
508 -- We only need to document the last one (unfortunately, in Greenplum we have to
509 -- use
function overloading instead of
default arguments).
510 CREATE FUNCTION MADLIB_SCHEMA.compute_lincrf(
515 "featureSize" VARCHAR,
517 "maxNumIterations" INTEGER)
519 AS $$PythonFunction(crf, crf, compute_lincrf)$$
520 LANGUAGE plpythonu VOLATILE;
551 CREATE FUNCTION MADLIB_SCHEMA.lincrf(
556 "featureSize" VARCHAR,
558 "featureset" VARCHAR,
559 "crf_feature" VARCHAR,
560 "maxNumIterations" INTEGER )
561 RETURNS INTEGER AS $$
563 theIteration INTEGER;
566 SELECT MADLIB_SCHEMA.compute_lincrf($1, $2, $3, $4, $5, $6, $9)
568 -- Because of Greenplum bug MPP-10050, we have to use dynamic SQL (
using
569 -- EXECUTE) in the following
570 -- Because of Greenplum bug MPP-6731, we have to hide the tuple-returning
571 -- function in a subquery
574 INSERT INTO $sql$ || $8 || $sql$
575 SELECT f_index, f_name, feature[1], feature[2], (result).coef[f_index+1]
577 SELECT MADLIB_SCHEMA.internal_lincrf_lbfgs_result(_madlib_state) AS result
578 FROM _madlib_iterative_alg
579 WHERE _madlib_iteration = $sql$ || theIteration || $sql$
580 ) subq, $sql$ || $7 || $sql$
584 $$ LANGUAGE plpgsql VOLATILE;
586 CREATE FUNCTION MADLIB_SCHEMA.
lincrf(
591 "featureSize" VARCHAR,
593 "featureset" VARCHAR,
594 "crf_feature" VARCHAR)
596 $$SELECT MADLIB_SCHEMA.
lincrf($1, $2, $3, $4, $5, $6, $7, $8, 20);$$
597 LANGUAGE sql VOLATILE;