
/* ----------------------------------------------------------------------- */

/**
@addtogroup grp_clustered_errors

 * @file clustered_variance_coxph.sql_in
 *
 * @brief SQL functions for clustered robust cox proportional hazards regression
 * @date Oct 2013
 *
 * @sa For a brief introduction to clustered robust cox regression, see the
 *     module description \ref grp_clustered_errors
 *
 *//* ----------------------------------------------------------------------- */

m4_include(`SQLCommon.m4')

----------------------------------------------------------------------

CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.clustered_variance_coxph()
RETURNS VARCHAR AS $$
BEGIN
    RETURN MADLIB_SCHEMA.clustered_variance_coxph('');
END;
$$ LANGUAGE plpgsql IMMUTABLE
m4_ifdef(`__HAS_FUNCTION_PROPERTIES__', `CONTAINS SQL', `');

----------------------------------------------------------------------

CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.clustered_variance_coxph(
    message VARCHAR
) RETURNS VARCHAR AS $$
    PythonFunction(stats, clustered_variance_coxph, cl_coxph_help_message)
$$ LANGUAGE plpythonu IMMUTABLE
m4_ifdef(`__HAS_FUNCTION_PROPERTIES__', `CONTAINS SQL', `');

----------------------------------------------------------------------

CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.clustered_variance_coxph(
    model_table         TEXT,
    output_table        TEXT,
    clustervar          TEXT
) RETURNS VOID AS $$
    PythonFunction(stats, clustered_variance_coxph, clustered_coxph)
$$ LANGUAGE plpythonu VOLATILE
m4_ifdef(`__HAS_FUNCTION_PROPERTIES__', `MODIFIES SQL DATA', `');

----------------------------------------------------------------------

CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.coxph_a_b_transition(
    /* state */     DOUBLE PRECISION[],
    /* size */      INTEGER,
    /* status */    BOOLEAN,
    /* H values */  DOUBLE PRECISION[],
    /* S */         DOUBLE PRECISION
) RETURNS DOUBLE PRECISION[] AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE STRICT
m4_ifdef(`__HAS_FUNCTION_PROPERTIES__', `NO SQL', `');


--------------------------------

CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.coxph_a_b_merge(
    /* left state */    DOUBLE PRECISION[],
    /* right state */   DOUBLE PRECISION[]
) RETURNS DOUBLE PRECISION[] AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE STRICT
m4_ifdef(`__HAS_FUNCTION_PROPERTIES__', `NO SQL', `');


--------------------------------
DROP TYPE IF EXISTS MADLIB_SCHEMA.__coxph_a_b_result CASCADE;
CREATE TYPE MADLIB_SCHEMA.__coxph_a_b_result AS(
    a   DOUBLE PRECISION,
    b   DOUBLE PRECISION[]
);

--------------------------------

CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.coxph_a_b_final(
    /* right state */   DOUBLE PRECISION[]
) RETURNS MADLIB_SCHEMA.__coxph_a_b_result AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE STRICT
m4_ifdef(`__HAS_FUNCTION_PROPERTIES__', `NO SQL', `');


--------------------------------

DROP AGGREGATE IF EXISTS MADLIB_SCHEMA.coxph_a_b(
    /* size */      INTEGER,
    /* status */    BOOLEAN,
    /* H values */  DOUBLE PRECISION[],
    /* S */         DOUBLE PRECISION
);
CREATE AGGREGATE MADLIB_SCHEMA.coxph_a_b(
    /* size */      INTEGER,
    /* status */    BOOLEAN,
    /* H values */  DOUBLE PRECISION[],
    /* S */         DOUBLE PRECISION
) (
    stype = DOUBLE PRECISION[],
    sfunc = MADLIB_SCHEMA.coxph_a_b_transition,
    m4_ifdef(`__POSTGRESQL__', `', `PREFUNC = MADLIB_SCHEMA.coxph_a_b_merge,')
    finalfunc = MADLIB_SCHEMA.coxph_a_b_final,
    initcond = '{0,0,0,0}'
);

----------------------------------------------------------------------

CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.coxph_compute_w(
    x       DOUBLE PRECISION[],
    status  BOOLEAN,
    coef    DOUBLE PRECISION[],
    H       DOUBLE PRECISION[],
    S       DOUBLE PRECISION,
    A       DOUBLE PRECISION,
    B       DOUBLE PRECISION[]
) RETURNS DOUBLE PRECISION[] AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE
m4_ifdef(`__HAS_FUNCTION_PROPERTIES__', `NO SQL', `');

----------------------------------------------------------------------

DROP TYPE IF EXISTS MADLIB_SCHEMA.__coxph_cl_var_result CASCADE;
CREATE TYPE MADLIB_SCHEMA.__coxph_cl_var_result AS(
    std_err     DOUBLE PRECISION[],
    z_stats     DOUBLE PRECISION[],
    p_values    DOUBLE PRECISION[]
);

--------------------------------

CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.coxph_compute_clustered_stats(
    coef    DOUBLE PRECISION[],
    hessian DOUBLE PRECISION[],
    A       DOUBLE PRECISION[]
) RETURNS MADLIB_SCHEMA.__coxph_cl_var_result AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE STRICT
m4_ifdef(`__HAS_FUNCTION_PROPERTIES__', `NO SQL', `');


----------------------------------------------------------------------

CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.robust_variance_coxph(
    model_table     VARCHAR,
    output_table    VARCHAR,
    clustervar      VARCHAR
) RETURNS VOID AS $$
    PythonFunction(stats, clustered_variance_coxph, clustered_coxph)
$$ LANGUAGE plpythonu VOLATILE
m4_ifdef(`__HAS_FUNCTION_PROPERTIES__', `MODIFIES SQL DATA', `');
