from elastic_net_optimizer_fista import _elastic_net_fista_train
from elastic_net_optimizer_igd import _elastic_net_igd_train
import plpy

# ========================================================================


def _elastic_net_gaussian_fista_train(schema_madlib, tbl_source, col_ind_var,
                                      col_dep_var, tbl_result, tbl_summary, lambda_value, alpha,
                                      normalization, optimizer_params, max_iter,
                                      tolerance, outstr_array, grouping_str,
                                      grouping_col, **kwargs):
    """
    Use FISTA to solve linear models
    """
    return _elastic_net_fista_train(schema_madlib,
                                    "__gaussian_fista_step",
                                    "__gaussian_fista_state_diff",
                                    "gaussian",
                                    tbl_source, col_ind_var,
                                    col_dep_var, tbl_result, tbl_summary,
                                    lambda_value, alpha,
                                    normalization, optimizer_params, max_iter,
                                    tolerance, outstr_array, grouping_str,
                                    grouping_col, **kwargs)

# ========================================================================


def _elastic_net_gaussian_igd_train(schema_madlib, tbl_source, col_ind_var,
                                    col_dep_var, tbl_result, tbl_summary, lambda_value, alpha,
                                    normalization, optimizer_params, max_iter,
                                    tolerance, outstr_array, grouping_str,
                                    grouping_col, **kwargs):
    """
    Use IGD to solve linear models
    """
    return _elastic_net_igd_train(schema_madlib,
                                  "__gaussian_igd_step",
                                  "__gaussian_igd_state_diff",
                                  "gaussian",
                                  tbl_source, col_ind_var,
                                  col_dep_var, tbl_result, tbl_summary,
                                  lambda_value, alpha,
                                  normalization, optimizer_params, max_iter,
                                  tolerance, outstr_array, grouping_str,
                                  grouping_col, **kwargs)

# ========================================================================


def _elastic_net_binomial_fista_train(schema_madlib, tbl_source, col_ind_var,
                                      col_dep_var, tbl_result, tbl_summary, lambda_value, alpha,
                                      normalization, optimizer_params, max_iter,
                                      tolerance, outstr_array, grouping_str,
                                      grouping_col, **kwargs):
    """
    Use FISTA to solve linear models
    """
    return _elastic_net_fista_train(schema_madlib,
                                    "__binomial_fista_step",
                                    "__binomial_fista_state_diff",
                                    "binomial",
                                    tbl_source, col_ind_var,
                                    col_dep_var, tbl_result, tbl_summary,
                                    lambda_value, alpha,
                                    normalization, optimizer_params, max_iter,
                                    tolerance, outstr_array, grouping_str,
                                    grouping_col, **kwargs)

# ========================================================================


def _elastic_net_binomial_igd_train(schema_madlib, tbl_source, col_ind_var,
                                    col_dep_var, tbl_result, tbl_summary, lambda_value, alpha,
                                    normalization, optimizer_params, max_iter,
                                    tolerance, outstr_array, grouping_str,
                                    grouping_col, **kwargs):
    """
    Use IGD to solve linear models
    """
    return _elastic_net_igd_train(schema_madlib,
                                  "__binomial_igd_step",
                                  "__binomial_igd_state_diff",
                                  "binomial",
                                  tbl_source, col_ind_var,
                                  col_dep_var, tbl_result, tbl_summary,
                                  lambda_value, alpha,
                                  normalization, optimizer_params, max_iter,
                                  tolerance, outstr_array, grouping_str,
                                  grouping_col, **kwargs)
