from pyscript import document
from scipy.stats import norm
from math import exp, sqrt, fabs
import numpy as np

def cumnorm(x):
    # Cumulative normal distribution function
    return norm.cdf(x)

def bivarcumnorm(a, b, r):
    x = [0.04691008, 0.23076534, 0.5, 0.76923466, 0.95308992]
    W = [0.018854042, 0.038088059, 0.0452707394, 0.038088059, 0.018854042]

    h1 = a
    h2 = b
    h12 = (h1 * h1 + h2 * h2) / 2
    LH = 0

    if abs(r) >= 0.7:
        r2 = 1 - r * r
        r3 = sqrt(r2)
        if r < 0:
            h2 = -h2
        h3 = h1 * h2
        h7 = exp(-h3 / 2)

        if abs(r) < 1:
            h6 = abs(h1 - h2)
            h5 = h6 * h6 / 2
            h6 /= r3
            AA = 0.5 - h3 / 8
            ab = 3 - 2 * AA * h5
            LH = 0.13298076 * h6 * ab * (1 - cumnorm(h6)) - exp(-h5 / r2) * (ab + AA * r2) * 0.053051647
            
            for i in range(5):
                r1 = r3 * x[i]
                rr = r1 * r1
                r2 = sqrt(1 - rr)
                if h7 == 0:
                    h8 = 0
                else:
                    h8 = exp(-h3 / (1 + r2)) / r2 / h7
                LH -= W[i] * exp(-h5 / rr) * (h8 - 1 - AA * rr)

        result = LH * r3 * h7 + cumnorm(min(h1, h2))

        if r < 0:
            result = cumnorm(h1) - result

    else:
        h3 = h1 * h2
        if r != 0:
            for i in range(5):
                r1 = r * x[i]
                r2 = 1 - r1 * r1
                LH += W[i] * exp((r1 * h3 - h12) / r2) / sqrt(r2)
        result = cumnorm(h1) * cumnorm(h2) + r * LH

    return result


def default_correlation(asset_corr, pd):
    a=norm.ppf(pd)
    p_joint = bivarcumnorm(a, a, asset_corr)
    default_corr = round((p_joint - pd * pd) / (pd * (1 - pd)),4)
    return default_corr

def Default_Auf(event):
    input_text1 = document.querySelector("#pd")
    input_text2 = document.querySelector("#assetcorr")
    pd=float(input_text1.value)
    asset_corr=float(input_text2.value)
    output_div=document.querySelector("#output")
    a=str(default_correlation(asset_corr,pd))
    output_div.innerText=a
