def isThresholdContr(N, M, p, c, l, myRho, nu, cm=0):
    myShift = (1 - 2 * cm)
    xhat = scipy.optimize.minimize(meanShiftOF,
                                   0.01,
                                   args=(c, p, l, myRho),
                                   method='SLSQP',
                                   jac=None)
    mu = xhat.x
    theta = np.zeros(M)
    cgf = np.zeros(M)
    qZ = np.zeros([M, N])
    G = np.transpose(np.tile(np.random.normal(mu, 1, M), (N, 1)))
    e = np.random.normal(0, 1, [M, N])
    W = np.random.chisquare(nu, M)
    myV = W / myShift
    V = np.transpose(np.sqrt(np.tile(myV, (N, 1)) / nu))
    num = V * myT.ppf(p, nu) * np.ones((M, 1)) - np.multiply(np.sqrt(myRho), G)
    pZ = norm.cdf(np.divide(num, np.sqrt(1 - myRho)))
    for n in range(0, M):
        theta[n] = vc.getSaddlePoint(pZ[n, :], c, l, 0.0)
        qZ[n, :] = getQ(theta[n], c, pZ[n, :])
        cgf[n] = vc.computeCGF(theta[n], pZ[n, :], c)
    I = np.transpose(1 * np.less(e, norm.ppf(qZ)))
    L = np.dot(c, I)
    rnChi = np.exp(-cm * myV - (nu / 2) * np.log(myShift))
    rnMu = np.exp(-mu * G[:, 0] + 0.5 * mu**2)
    rnTwist = computeRND(theta, L, cgf)
    rn = rnChi * rnMu * rnTwist
    return I, theta, pZ, qZ, cgf, rn
def isThresholdT(N, M, p, c, l, myRho, nu, cm=0):
    myShift = (1 - 2 * cm)
    mu = getOptimalMeanShift(c, p, l, myRho)
    W = np.random.chisquare(nu, M)
    myV = W / myShift
    theta = np.zeros(M)
    cgf = np.zeros(M)
    qZ = np.zeros([M, N])
    V = np.transpose(np.sqrt(np.tile(myV, (N, 1)) / nu))
    e = np.random.normal(0, 1, [M, N])
    G = np.transpose(np.tile(np.random.normal(mu, 1, M), (N, 1)))
    num = V * (myT.ppf(p, nu) * np.ones((M, 1))) - np.sqrt(myRho) * G
    pZ = norm.cdf(np.divide(num, np.sqrt(1 - myRho)))
    for n in range(0, M):
        theta[n] = vc.getSaddlePoint(pZ[n, :], c, l, 0.0)
        qZ[n, :] = getQ(theta[n], c, pZ[n, :])
        cgf[n] = vc.computeCGF(theta[n], pZ[n, :], c)
    I = np.transpose(1 * np.less(e, norm.ppf(qZ)))
    L = np.dot(c, I)
    rnChi = np.exp(-cm * myV - (nu / 2) * np.log(myShift))
    rnMu = np.exp(-mu * G[:, 0] + 0.5 * (mu**2))
    rnTwist = computeRND(theta, L, cgf)
    rn = rnChi * rnMu * rnTwist
    tailProb = np.mean(np.multiply(L > l, rn))
    eShortfall = np.mean(np.multiply(L * (L > l), rn)) / tailProb
    return tailProb, eShortfall
def isIndDefault(N, M, p, c, l):
    U = np.random.uniform(0, 1, [M, N])
    theta = vc.getSaddlePoint(p, c, l, 0.0)
    qZ = getQ(theta, c, p)
    cgf = vc.computeCGF(theta, p, c)
    I = np.transpose(1 * np.less(U, qZ))
    L = np.dot(c, I)
    rn = computeRND(theta, L, cgf)
    tailProb = np.mean(np.multiply(L > l, rn))
    eShortfall = np.mean(np.multiply(L * (L > l), rn)) / tailProb
    return tailProb, eShortfall
def isMixture(N, M, p, c, l, p1, p2):
    theta = np.zeros(M)
    cgf = np.zeros(M)
    qS = np.zeros([M, N])
    S = np.random.gamma(p1, 1 / p1, [M])
    wS = np.transpose(np.tile(1 - p2 + p2 * S, [N, 1]))
    pS = np.tile(p, [M, 1]) * wS
    for n in range(0, M):
        theta[n] = vc.getSaddlePoint(pS[n, :], c, l, -0.2)
        qS[n, :] = getQ(theta[n], c, pS[n, :])
        cgf[n] = vc.computeCGF(theta[n], pS[n, :], c)
    I = np.transpose(1 * np.greater_equal(np.random.poisson(qS, [M, N]), 1))
    L = np.dot(c, I)
    rn = computeRND(theta, L, cgf)
    tailProb = np.mean(np.multiply(L > l, rn))
    eShortfall = np.mean(np.multiply(L * (L > l), rn)) / tailProb
    return tailProb, eShortfall
def isThreshold(N, M, p, c, l, myRho, nu, shiftMean, isT, invVector=0):
    mu = 0.0
    gamma = 0.0
    if shiftMean == 1:
        mu = getOptimalMeanShift(c, p, l, myRho)
    theta = np.zeros(M)
    cgf = np.zeros(M)
    qZ = np.zeros([M, N])
    G = np.transpose(np.tile(np.random.normal(mu, 1, M), (N, 1)))
    e = np.random.normal(0, 1, [M, N])
    if isT == 1:
        gamma = -2
        W = np.random.chisquare(nu, M)
        myV = W / (1 - 2 * gamma)
        V = np.transpose(np.sqrt(np.tile(myV, (N, 1)) / nu))
        num = (1 / V) * myT.ppf(p, nu) * np.ones(
            (M, 1)) - np.multiply(np.sqrt(myRho), G)
        pZ = norm.cdf(np.divide(num, np.sqrt(1 - myRho)))
    elif isT == 2:
        V = np.transpose(
            np.sqrt(np.tile(np.random.gamma(nu, 1 / nu, M), (N, 1))))
        num = (1 / V) * invVector * np.ones(
            (M, 1)) - np.multiply(np.sqrt(myRho), G)
        pZ = norm.cdf(np.divide(num, np.sqrt(1 - myRho)))
    else:
        pZ = th.computeP(p, myRho, G)
    for n in range(0, M):
        theta[n] = vc.getSaddlePoint(pZ[n, :], c, l, 0.0)
        qZ[n, :] = getQ(theta[n], c, pZ[n, :])
        cgf[n] = vc.computeCGF(theta[n], pZ[n, :], c)
    I = np.transpose(1 * np.less(e, norm.ppf(qZ)))
    L = np.dot(c, I)
    if isT == 1:
        rnChi = np.exp(-gamma * myV - (nu / 2) * np.log(1 - 2 * gamma))
    else:
        rnChi = np.ones(M)
    if shiftMean == 1:
        rn = computeRND(theta, L, cgf) * np.exp(-mu * G[:, 0] + 0.5 *
                                                (mu**2)) * rnChi
    else:
        rn = computeRND(theta, L, cgf) * rnChi
    tailProb = np.mean(np.multiply(L > l, rn))
    eShortfall = np.mean(np.multiply(L * (L > l), rn)) / tailProb
    return tailProb, eShortfall
def isThresholdSimple(N, M, p, c, l, myRho):
    mu = getOptimalMeanShift(c, p, l, myRho)
    theta = np.zeros(M)
    cgf = np.zeros(M)
    qZ = np.zeros([M, N])
    e = np.random.normal(0, 1, [M, N])
    G = np.transpose(np.tile(np.random.normal(mu, 1, M), (N, 1)))
    num = (norm.ppf(p) * np.ones((M, 1))) - np.sqrt(myRho) * G
    pZ = norm.cdf(np.divide(num, np.sqrt(1 - myRho)))
    for n in range(0, M):
        theta[n] = vc.getSaddlePoint(pZ[n, :], c, l, 0.0)
        qZ[n, :] = getQ(theta[n], c, pZ[n, :])
        cgf[n] = vc.computeCGF(theta[n], pZ[n, :], c)
    I = np.transpose(1 * np.less(e, norm.ppf(qZ)))
    L = np.dot(c, I)
    rn = np.exp(-mu * G[:, 0] + 0.5 * (mu**2)) * computeRND(theta, L, cgf)
    tailProb = np.mean(np.multiply(L > l, rn))
    eShortfall = np.mean(np.multiply(L * (L > l), rn)) / tailProb
    return tailProb, eShortfall
def meanShiftOF(mu, c, p, l, myRho):
    pZ = th.computeP(p, myRho, mu)
    theta = vc.getSaddlePoint(pZ, c, l, 0.0)
    f_l = -theta * l + vc.computeCGF(theta, pZ, c)
    return -(f_l - 0.5 * np.dot(mu, mu))