def simulateCorrelatedTransitionData(K, N, T, Pin, wStart, myRho):
    Q = cumulateTransitionMatrix(K, Pin)
    Delta = transformCumulativeTransitionMatrix(K, Q)
    Y = np.zeros([N, T])  # latent variables
    X = np.zeros([N, T])  # credit states
    allP = np.zeros([N, T])  # default probabilities
    Xlast = mc.initializeCounterparties(N, wStart)  # initial states
    X0 = Xlast
    Plast = Pin[(Xlast - 1).astype(int), -1]
    for t in range(0, T):
        Y[:, t] = th.getY(N, 1, Plast, myRho)
        for n in range(0, N):
            if Xlast[n] == 4:
                X[n, t] = 4
                continue
            else:
                X[n, t] = migrateRating(Xlast[n], Delta, Y[n, t])
        allP[:, t] = Pin[(Xlast - 1).astype(int), -1]
        Plast = allP[:, t]
        Xlast = X[:, t]
    return X, Y, Delta, allP, X0
def createRatingData2r(K, N, T, P, wStart, rStart, myRho, nu, isT):
    Q = cumulateTransitionMatrix(K, P)
    Delta = transformCumulativeTransitionMatrix(K, Q)
    rId = initializeRegion2r(N, rStart).astype(int)
    Y = np.zeros([N, T])  # latent variables
    X = np.zeros([N, T])  # credit states
    allP = np.zeros([N, T])  # default probabilities
    Xlast = mc.initializeCounterparties(N, wStart)  # initial states
    X0 = Xlast
    Plast = P[(Xlast - 1).astype(int), -1]
    for t in range(0, T):
        Y[:, t] = th.getY2r(N, 1, Plast, myRho, rId, nu, P, isT)
        for n in range(0, N):
            if Xlast[n] == 4:
                X[n, t] = 4
                continue
            else:
                X[n, t] = migrateRating(Xlast[n], Delta, Y[n, t])
        allP[:, t] = P[(Xlast - 1).astype(int), -1]
        Plast = allP[:, t]
        Xlast = X[:, t]
    return X, Y, Delta, allP, X0, rId