from pprint import pformat
from re import sub


class DensityRatio:
    """Density Ratio."""
    def __init__(self, method, alpha, theta, lambda_, alpha_PE, alpha_KL, kernel_info, compute_density_ratio):
        self.method = method
        self.alpha = alpha
        self.theta = theta
        self.lambda_ = lambda_
        self.alpha_PE = alpha_PE
        self.alpha_KL = alpha_KL
        self.kernel_info = kernel_info
        self.compute_density_ratio = compute_density_ratio

    def __str__(self):
        return """
Method: %(method)s

Alpha: %(alpha)s

Kernel Information:
%(kernel_info)s

Kernel Weights (theta):
  %(theta)s

Regularization Parameter (lambda): %(lambda_)s

Alpha-Relative PE-Divergence: %(alpha_PE)s

Alpha-Relative KL-Divergence: %(alpha_KL)s

Function to Estimate Density Ratio:
  compute_density_ratio(x)
  
"""[1:-1] % dict(method=self.method, kernel_info=self.kernel_info, alpha=self.alpha, theta=my_format(self.theta), lambda_=self.lambda_, alpha_PE=self.alpha_PE, alpha_KL=self.alpha_KL)


class KernelInfo:
    """Kernel Information."""
    def __init__(self, kernel_type, kernel_num, sigma, centers):
        self.kernel_type = kernel_type
        self.kernel_num = kernel_num
        self.sigma = sigma
        self.centers = centers

    def __str__(self):
        return """
  Kernel type: %(kernel_type)s
  Number of kernels: %(kernel_num)s
  Bandwidth(sigma): %(sigma)s
  Centers: %(centers)s
"""[1:-1] % dict(kernel_type=self.kernel_type, kernel_num=self.kernel_num, sigma=self.sigma, centers=my_format(self.centers))


def my_format(str):
    return sub(r"\s+" , " ", (pformat(str).split("\n")[0] + ".."))
