Esempio n. 1
0
def smallphi2(P, M, state, function, lambda1):
    # calculates \phi for a specific system and returns: [\phi, minimum partition purview, minimum partition mechanism,
    # purview]
    # I have come across the following issue- the literature does not specify the order in which the two subfactorised
    # matrices (here as left and right) should be produced to form the sigma comparable to rho
    # for example if M={1,2,3} -> {1,3} U {2}, P = {1,2} -> {1} U {2} the optimal tensor product is far from obvious
    # (to me)
    Smallphi = 100
    minpurv = {0, 1, 2}
    minmech = {0, 1, 2}
    rho = Repertoire2(P, M, state, function, lambda1)
    for i in power_set(M):
        for j in power_set(P):
            left = Repertoire2(j, i, state, function, lambda1)
            right = Repertoire2(P - j, M - i, state, function, lambda1)
            sigma = np.kron(left, right)
            if (Smallphi > D(rho, sigma)) and ([i, j] != [set(), set()]) and (
                [M - i, P - j] != [set(), set()]):
                Smallphi = D(rho, sigma)
                minpurv = j
                minmech = i
            # this i think fixes the issue mentioned above
            if P == {0, 1, 2} and j == {0, 2}:
                sigma2 = BasisShift @ sigma @ BasisShift
                if (Smallphi > D(rho, sigma2)):
                    Smallphi = D(rho, sigma2)
                    minpurv = j
                    minmech = i

    return round(Smallphi, 10), minpurv, minmech, P
Esempio n. 2
0
def ConceptStructure(lambda1, state):
    concept1 = []
    concept2 = []

    for i in power_set({0, 1, 2}):
        if i != set():
            Core = []
            Core2 = []
            for function in ['cause', 'effect']:
                Core.append(corecause(i, state[0], function[0]))
                Core2.append(corecause2(i, lambda1, state[0], function[0]))
            concept1.append([
                min(Core[0][0], Core[1][0]), Core[0][3], Core[1][3], i,
                state[0]
            ])
            concept2.append([
                min(Core2[0][0], Core2[1][0]), Core2[0][3], Core2[1][3], i,
                state[0]
            ])
            # these take the form phi, core cause, core effect, mechanism, state
    Grep1 = 0
    for j in range(len(concept1)):
        a = concept1[j][0] * Repertoire(concept1[j][1], concept1[j][3],
                                        concept1[j][4], 'c', True)
        b = concept2[j][0] * Repertoire2(concept2[j][1], concept2[j][3],
                                         concept2[j][4], 'c', lambda1, True)
        c = concept1[j][0] * Repertoire(concept1[j][2], concept1[j][3],
                                        concept1[j][4], 'e', True)
        d = concept2[j][0] * Repertoire2(concept2[j][2], concept2[j][3],
                                         concept2[j][4], 'e', lambda1, True)
        Grep1 += 0.5 * (D(a, b) + D(c, d))
        e = 1
    return Grep1
Esempio n. 3
0
def smallphi(P, M):
    Smallphi = 100
    minpurv = {1, 2, 3}
    minmech = {0, 1, 2}
    rho = Repertoire(P, M)
    for i in power_set(M):
        for j in power_set(P):

            left = Repertoire(j, i)
            right = Repertoire(P - j, M - i)
            sigma = np.kron(left, right)
            if (Smallphi > D(rho, sigma)) and ([i, j] != [set(), set()]) and ([M - i, P - j] != [set(), set()]):
                Smallphi = D(rho, sigma)
                minpurv = j
                minmech = i
    return round(Smallphi, 5), minpurv, minmech, P
Esempio n. 4
0
def smallphi2(P, M, state, function, lambda1):
    Smallphi = 1
    minpurv = {0, 1, 2}
    minmech = {0, 1, 2}
    rho = Repertoire2(P, M, state, function, lambda1)
    for i in power_set(M):
        for j in power_set(P):

            left = Repertoire2(j, i, state, function, lambda1)
            right = Repertoire2(P - j, M - i, state, function, lambda1)
            sigma = np.kron(left, right)
            if (Smallphi > D(rho, sigma)) and ([i, j] != [set(), set()]) and (
                [M - i, P - j] != [set(), set()]):
                Smallphi = D(rho, sigma)
                minpurv = j
                minmech = i
    return round(Smallphi, 15), minpurv, minmech, P
Esempio n. 5
0
def corecause2(M, lambda1, state='o', function='c'):
    placeholder = (0, 'no', 'concepts', 'here')
    for j in power_set({0, 1, 2}):

        if j != set():
            trial = smallphi2(j, M, state, function, lambda1)
            if trial[0] > placeholder[0]:
                placeholder = trial
    return placeholder
Esempio n. 6
0
def corecause(M):
    placeholder = (0, set(), set(), set())
    for j in power_set({0,1}):

        if j != set():
            trial = smallphi(j, M)
            if trial[0] > placeholder[0]:
                placeholder = trial
    return placeholder
Esempio n. 7
0
def Phi(state):
    CapitalPhi = [10, set()]
    for i in power_set({0, 1, 2}):
        if i != set() and i != {0, 1, 2}:
            Distance = [
                ConceptStructure(i, state), f"The MIP for state is {i}"
            ]
            if Distance[0] < CapitalPhi[0]:
                CapitalPhi = Distance
    return CapitalPhi
Esempio n. 8
0
def corecause2(M, state='o', function='c', lambda1=set()):
    # this loops through all the possible purviews of a mechanism to find its core cause
    # returns [\phi, minimum partition purview, minimum partition mechanism, purview]
    placeholder = (0, 'no', 'concepts', 'here')
    for j in power_set({0, 1, 2}):

        if j != set():
            trial = smallphi2(j, M, state, function, lambda1)
            if trial[0] > placeholder[0]:
                placeholder = trial
    return placeholder
Esempio n. 9
0
def ConceptStructure3(lambda1, state):
    # to avoid creating classes i never actually create the Concept structure for a particular set up
    # the first loop calculates the triple of [\phi, core cause, core effect] and attaches necessary
    # information for the calculation of \Phi
    concept1 = []
    concept2 = []

    for i in power_set({0, 1, 2}):
        if i != set():
            Core = []
            Core2 = []
            for function in ['cause', 'effect']:
                Core.append(corecause2(i, state, function[0]))
                Core2.append(corecause2(i, state, function[0], lambda1))
            concept1.append(
                [min(Core[0][0], Core[1][0]), Core[0][3], Core[1][3], i])
            concept2.append(
                [min(Core2[0][0], Core2[1][0]), Core2[0][3], Core2[1][3], i])
    return concept1
Esempio n. 10
0
def ConceptStructure(lambda1, state):
    # to avoid creating classes i never actually create the Concept structure for a particular set up
    # the first loop calculates the triple of [\phi, core cause, core effect] and attaches necessary
    # information for the calculation of \Phi
    concept1 = []
    concept2 = []

    for i in power_set({0, 1, 2}):
        if i != set():
            Core = []
            Core2 = []
            for function in ['cause', 'effect']:
                Core.append(corecause2(i, state[0], function[0]))
                Core2.append(corecause2(i, state[0], function[0], lambda1))
            concept1.append([
                min(Core[0][0], Core[1][0]), Core[0][3], Core[1][3], i,
                state[0]
            ])
            concept2.append([
                min(Core2[0][0], Core2[1][0]), Core2[0][3], Core2[1][3], i,
                state[0]
            ])
            # these take the form \phi, core cause, core effect, mechanism, state
    # this returns Grep1- the value of D(C(U),C(U_p)) for the p being lambda given as the input
    # if speed is required in future we could halve computation time by calculating C(U) just once but for now its fast
    # enough not to warrant bothering
    Grep1 = 0
    for j in range(len(concept1)):
        a = concept1[j][0] * Repertoire2(concept1[j][1], concept1[j][3],
                                         concept1[j][4], 'c', set(), True)
        b = concept2[j][0] * Repertoire2(concept2[j][1], concept2[j][3],
                                         concept2[j][4], 'c', lambda1, True)
        c = concept1[j][0] * Repertoire2(concept1[j][2], concept1[j][3],
                                         concept1[j][4], 'e', set(), True)
        d = concept2[j][0] * Repertoire2(concept2[j][2], concept2[j][3],
                                         concept2[j][4], 'e', lambda1, True)
        Grep1 += 0.5 * (D(a, b) + D(c, d))
    return Grep1
Esempio n. 11
0
                                        concept1[j][4], 'e', True)
        d = concept2[j][0] * Repertoire2(concept2[j][2], concept2[j][3],
                                         concept2[j][4], 'e', lambda1, True)
        Grep1 += 0.5 * (D(a, b) + D(c, d))
        e = 1
    return Grep1


# for i in power_set({0,1,2}):
#     print([ConceptStructure(i, 'o'), i])

concept1 = []
concept2 = []
for state in ['zero']:
    for function in ['cause', 'effect']:
        for i in power_set({0, 1, 2}):
            if i != set():
                Core = corecause(i, state[0], function[0])
                Core2 = corecause(i, 'o', function[0])
                concept1.append([Core[0], Core[3], i, state[0], function[0]])
                concept2.append([Core2[0], Core2[3], i, 'o', function[0]])
                # these take the form phi, core cause, mechanism, state, function
Grep1 = 0
for j in range(len(concept1)):
    a = concept1[j][0] * Repertoire(concept1[j][1], concept1[j][2],
                                    concept1[j][3], concept1[j][4], True)
    b = concept2[j][0] * Repertoire(concept2[j][1], concept2[j][2],
                                    concept2[j][3], concept2[j][4], True)
    Grep1 += 0.5 * D(a, b)
    e = 1
print(Grep1)
Esempio n. 12
0
    minmech = {0, 1, 2}
    rho = Repertoire(P, M)
    for i in power_set(M):
        for j in power_set(P):

            left = Repertoire(j, i)
            right = Repertoire(P - j, M - i)
            sigma = np.kron(left, right)
            if (Smallphi > D(rho, sigma)) and ([i, j] != [set(), set()]) and ([M - i, P - j] != [set(), set()]):
                Smallphi = D(rho, sigma)
                minpurv = j
                minmech = i
    return round(Smallphi, 5), minpurv, minmech, P


def corecause(M):
    placeholder = (0, set(), set(), set())
    for j in power_set({0,1}):

        if j != set():
            trial = smallphi(j, M)
            if trial[0] > placeholder[0]:
                placeholder = trial
    return placeholder


for i in power_set({0, 1}):
    if i != set():
        print([corecause(i), i])
# Repertoire({1,3},{1})
print(smallphi({0},{1}))