def collapse_diamond(N, M, v): """ Collapse the middle two states. @param N: population size @param M: index to state vector @param v: a distribution over a 3-simplex @return: a distribution over a 2-simplex """ k = 4 nstates_collapsed = multinomstate.get_nstates(N, k-1) M_collapsed = np.array(list(multinomstate.gen_states(N, k-1)), dtype=int) T_collapsed = multinomstate.get_inverse_map(M_collapsed) v_collapsed = np.zeros(nstates_collapsed) for i, bigstate in enumerate(M): AB, Ab, aB, ab = bigstate.tolist() Ab_aB = Ab + aB j = T_collapsed[AB, Ab_aB, ab] v_collapsed[j] += v[i] return v_collapsed
def collapse_diamond(N, M, v): """ Collapse the middle two states. @param N: population size @param M: index to state vector @param v: a distribution over a 3-simplex @return: a distribution over a 2-simplex """ k = 4 nstates_collapsed = multinomstate.get_nstates(N, k - 1) M_collapsed = np.array(list(multinomstate.gen_states(N, k - 1)), dtype=int) T_collapsed = multinomstate.get_inverse_map(M_collapsed) v_collapsed = np.zeros(nstates_collapsed) for i, bigstate in enumerate(M): AB, Ab, aB, ab = bigstate.tolist() Ab_aB = Ab + aB j = T_collapsed[AB, Ab_aB, ab] v_collapsed[j] += v[i] return v_collapsed
def collapse_side(N, M, v): """ Collapse two pairs of states. @param N: population size @param M: index to state vector @param v: a distribution over a 3-simplex @return: a distribution over a 1-simplex """ k = 4 nstates_collapsed = multinomstate.get_nstates(N, k-2) M_collapsed = np.array(list(multinomstate.gen_states(N, k-2)), dtype=int) T_collapsed = multinomstate.get_inverse_map(M_collapsed) v_collapsed = np.zeros(nstates_collapsed) for i, bigstate in enumerate(M): AB, Ab, aB, ab = bigstate.tolist() AB_Ab = AB + Ab aB_ab = aB + ab j = T_collapsed[AB_Ab, aB_ab] v_collapsed[j] += v[i] return v_collapsed
def collapse_side(N, M, v): """ Collapse two pairs of states. @param N: population size @param M: index to state vector @param v: a distribution over a 3-simplex @return: a distribution over a 1-simplex """ k = 4 nstates_collapsed = multinomstate.get_nstates(N, k - 2) M_collapsed = np.array(list(multinomstate.gen_states(N, k - 2)), dtype=int) T_collapsed = multinomstate.get_inverse_map(M_collapsed) v_collapsed = np.zeros(nstates_collapsed) for i, bigstate in enumerate(M): AB, Ab, aB, ab = bigstate.tolist() AB_Ab = AB + Ab aB_ab = aB + ab j = T_collapsed[AB_Ab, aB_ab] v_collapsed[j] += v[i] return v_collapsed
def do_full_simplex_then_collapse(mutrate, popsize): #mutrate = 0.01 #mutrate = 0.2 #mutrate = 10 #mutrate = 100 #mutrate = 1 N = popsize k = 4 M = np.array(list(multinomstate.gen_states(N, k)), dtype=int) T = multinomstate.get_inverse_map(M) # Create the joint site pair mutation rate matrix. R = mutrate * wrightcore.create_mutation(M, T) # Create the joint site pair drift transition matrix. lmcs = wrightcore.get_lmcs(M) lps = wrightcore.create_selection_neutral(M) log_drift = wrightcore.create_neutral_drift(lmcs, lps, M) # Define the drift and mutation transition matrices. P_drift = np.exp(log_drift) P_mut = scipy.linalg.expm(R) # Define the composite per-generation transition matrix. P = np.dot(P_mut, P_drift) # Solve a system of equations to find the stationary distribution. v = MatrixUtil.get_stationary_distribution(P) for state, value in zip(M, v): print state, value # collapse the two middle states nstates_collapsed = multinomstate.get_nstates(N, k-1) M_collapsed = np.array(list(multinomstate.gen_states(N, k-1)), dtype=int) T_collapsed = multinomstate.get_inverse_map(M_collapsed) v_collapsed = np.zeros(nstates_collapsed) for i, bigstate in enumerate(M): AB, Ab, aB, ab = bigstate.tolist() Ab_aB = Ab + aB j = T_collapsed[AB, Ab_aB, ab] v_collapsed[j] += v[i] for state, value in zip(M_collapsed, v_collapsed): print state, value # draw an equilateral triangle #drawtri(M_collapsed, T_collapsed, v_collapsed) #test_mesh() return M_collapsed, T_collapsed, v_collapsed
def do_full_simplex_then_collapse(mutrate, popsize): #mutrate = 0.01 #mutrate = 0.2 #mutrate = 10 #mutrate = 100 #mutrate = 1 N = popsize k = 4 M = np.array(list(multinomstate.gen_states(N, k)), dtype=int) T = multinomstate.get_inverse_map(M) # Create the joint site pair mutation rate matrix. R = mutrate * wrightcore.create_mutation(M, T) # Create the joint site pair drift transition matrix. lmcs = wrightcore.get_lmcs(M) lps = wrightcore.create_selection_neutral(M) log_drift = wrightcore.create_neutral_drift(lmcs, lps, M) # Define the drift and mutation transition matrices. P_drift = np.exp(log_drift) P_mut = scipy.linalg.expm(R) # Define the composite per-generation transition matrix. P = np.dot(P_mut, P_drift) # Solve a system of equations to find the stationary distribution. v = MatrixUtil.get_stationary_distribution(P) for state, value in zip(M, v): print state, value # collapse the two middle states nstates_collapsed = multinomstate.get_nstates(N, k - 1) M_collapsed = np.array(list(multinomstate.gen_states(N, k - 1)), dtype=int) T_collapsed = multinomstate.get_inverse_map(M_collapsed) v_collapsed = np.zeros(nstates_collapsed) for i, bigstate in enumerate(M): AB, Ab, aB, ab = bigstate.tolist() Ab_aB = Ab + aB j = T_collapsed[AB, Ab_aB, ab] v_collapsed[j] += v[i] for state, value in zip(M_collapsed, v_collapsed): print state, value # draw an equilateral triangle #drawtri(M_collapsed, T_collapsed, v_collapsed) #test_mesh() return M_collapsed, T_collapsed, v_collapsed