# NOTE: contains only one test, _est_cont_fit, that is renamed so that
#       the test runner does not run it
# I put this here for the record and for the case when someone wants to
# verify the quality of fit
# with current parameters: relatively small sample size, default starting values
#       Ran 84 tests in 401.797s
#       FAILED (failures=15)


import numpy as np
from scipy import stats

from .distparams import distcont

# this is not a proper statistical test for convergence, but only
# verifies that the estimate and true values do not differ by too much
n_repl1 = 1000  # sample size for first run
n_repl2 = 5000  # sample size for second run, if first run fails
thresh_percent = 0.25  # percent of true parameters for fail cut-off
thresh_min = 0.75  # minimum difference estimate - true to fail test

# distcont = [['genextreme', (3.3184017469423535,)]]


def _est_cont_fit():
    # this tests the closeness of the estimated parameters to the true
    # parameters with fit method of continuous distributions
    # Note: is slow, some distributions do not converge with sample size <= 10000

    for distname, arg in distcont:
        yield check_cont_fit, distname, arg


def check_cont_fit(distname, arg):
    distfn = getattr(stats, distname)
    rvs = distfn.rvs(size=n_repl1, *arg)
    est = distfn.fit(rvs)  # ,*arg) # start with default values

    truearg = np.hstack([arg, [0.0, 1.0]])
    diff = est - truearg

    txt = ""
    diffthreshold = np.max(
        np.vstack(
            [
                truearg * thresh_percent,
                np.ones(distfn.numargs + 2) * thresh_min,
            ]
        ),
        0,
    )
    # threshold for location
    diffthreshold[-2] = np.max(
        [np.abs(rvs.mean()) * thresh_percent, thresh_min]
    )

    if np.any(np.isnan(est)):
        raise AssertionError("nan returned in fit")
    else:
        if np.any((np.abs(diff) - diffthreshold) > 0.0):
            ##            txt = 'WARNING - diff too large with small sample'
            ##            print 'parameter diff =', diff - diffthreshold, txt
            rvs = np.concatenate(
                [rvs, distfn.rvs(size=n_repl2 - n_repl1, *arg)]
            )
            est = distfn.fit(rvs)  # ,*arg)
            truearg = np.hstack([arg, [0.0, 1.0]])
            diff = est - truearg
            if np.any((np.abs(diff) - diffthreshold) > 0.0):
                txt = "parameter: %s\n" % str(truearg)
                txt += "estimated: %s\n" % str(est)
                txt += "diff     : %s\n" % str(diff)
                raise AssertionError(
                    "fit not very good in %s\n" % distfn.name + txt
                )


if __name__ == "__main__":
    import pytest

    pytest.main([__file__, "-vvs", "-x", "--pdb"])
