/* ----------------------------------------------------------------------- *//**
 *
 * @file distribution.sql_in
 *
 * @brief SQL functions for collecting distributions
 *
 *//* ----------------------------------------------------------------------- */

m4_include(`SQLCommon.m4')

CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.vectorized_distribution_transition(
    distribution    double precision[][],
    indices         integer[],
    levels          integer[]
) RETURNS double precision[][] AS
    'MODULE_PATHNAME'
LANGUAGE c IMMUTABLE
m4_ifdef(`__HAS_FUNCTION_PROPERTIES__',`NO SQL', `');

CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.vectorized_distribution_final(
    state   double precision[][]
) RETURNS double precision[][] AS
    'MODULE_PATHNAME'
LANGUAGE c IMMUTABLE STRICT
m4_ifdef(`__HAS_FUNCTION_PROPERTIES__',`NO SQL', `');

DROP AGGREGATE IF EXISTS MADLIB_SCHEMA.vectorized_distribution_agg(
    integer[], integer[]) CASCADE;
CREATE AGGREGATE MADLIB_SCHEMA.vectorized_distribution_agg(
    /* indices */   integer[],
    /* levels */    integer[]
) (
    STYPE = double precision[][],
    SFUNC = MADLIB_SCHEMA.vectorized_distribution_transition,
    m4_ifdef(`__POSTGRESQL__', `', `PREFUNC = MADLIB_SCHEMA.array_add,')
    FINALFUNC = MADLIB_SCHEMA.vectorized_distribution_final
    -- default: INITCOND = NULL
);
---------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.discrete_distribution_transition(
    distribution    double precision[],
    ind             integer,
    weight          double precision,
    level           integer
) RETURNS double precision[] AS
    'MODULE_PATHNAME'
LANGUAGE c IMMUTABLE
m4_ifdef(`__HAS_FUNCTION_PROPERTIES__',`NO SQL', `');

CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.discrete_distribution_final(
    state   double precision[]
) RETURNS double precision[] AS
    'MODULE_PATHNAME'
LANGUAGE c IMMUTABLE STRICT
m4_ifdef(`__HAS_FUNCTION_PROPERTIES__',`NO SQL', `');

DROP AGGREGATE IF EXISTS MADLIB_SCHEMA.discrete_distribution_agg(
    integer, double precision, integer) CASCADE;
CREATE AGGREGATE MADLIB_SCHEMA.discrete_distribution_agg(
    /* ind */       integer,
    /* weight */    double precision,
    /* level */     integer
) (
    STYPE = double precision[],
    SFUNC = MADLIB_SCHEMA.discrete_distribution_transition,
    m4_ifdef(`__POSTGRESQL__', `', `PREFUNC = MADLIB_SCHEMA.array_add,')
    FINALFUNC = MADLIB_SCHEMA.discrete_distribution_final
    -- default: INITCOND = NULL
);
---------------------------------------------------------------------------
