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
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
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
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
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
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
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
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
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
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
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)
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}))