def meetFriend_nomem(A, s, max_rounds, eps=1e-6, conv_stop=True): '''Simulates the Friedkin-Johnsen (Kleinberg) Model. Runs a maximum of max_rounds rounds of the "Meeting a Friend" model. If the model converges sooner, the function returns. The stubborness matrix of the model is extracted from the diagonal of matrix A. This function does not save the opinions overtime and cannot generate a plot. However it uses very little memory and is useful for determining the final opinions and the convergence time of the model. Args: A (NxN numpy array): Adjacency matrix (its diagonal is the stubborness) s (1xN numpy array): Initial opinions (intrinsic beliefs) vector max_rounds (int): Maximum number of rounds to simulate eps (double): Maximum difference between rounds before we assume that the model has converged (default: 1e-6) plot (bool): Plot preference (default: False) conv_stop (bool): Stop the simulation if the model has converged (default: True) Returns: t, z where t is the convergence time and z the vector of the final opinions. ''' N, z, max_rounds = preprocessArgs(s, max_rounds) z_prev = z.copy() if np.size(np.nonzero(A.sum(axis=1))) != N: raise ValueError("Matrix A has one or more zero rows") for t in trange(1, max_rounds): # Update the opinion for each node for i in range(N): r_i = rchoice(A[i, :]) if r_i == i: op = s[i] else: op = z_prev[r_i] z[i] = (op + t * z_prev[i]) / (t + 1) if conv_stop and \ norm(z - z_prev, np.inf) < eps: print('Meet a Friend converged after {t} rounds'.format(t=t)) break z_prev = z.copy() return t, z
def meetFriend_nomem(A, s, max_rounds, eps=1e-6, conv_stop=True): '''Simulates the Friedkin-Johnsen (Kleinberg) Model. Runs a maximum of max_rounds rounds of the "Meeting a Friend" model. If the model converges sooner, the function returns. The stubborness matrix of the model is extracted from the diagonal of matrix A. This function does not save the opinions overtime and cannot generate a plot. However it uses very little memory and is useful for determining the final opinions and the convergence time of the model. Args: A (NxN numpy array): Adjacency matrix (its diagonal is the stubborness) s (1xN numpy array): Initial opinions (intrinsic beliefs) vector max_rounds (int): Maximum number of rounds to simulate eps (double): Maximum difference between rounds before we assume that the model has converged (default: 1e-6) plot (bool): Plot preference (default: False) conv_stop (bool): Stop the simulation if the model has converged (default: True) Returns: t, z where t is the convergence time and z the vector of the final opinions. ''' N, z, max_rounds = preprocessArgs(s, max_rounds) z_prev = z.copy() if np.size(np.nonzero(A.sum(axis=1))) != N: raise ValueError("Matrix A has one or more zero rows") for t in trange(1, max_rounds): # Update the opinion for each node for i in range(N): r_i = rchoice(A[i, :]) if r_i == i: op = s[i] else: op = z_prev[r_i] z[i] = (op + t*z_prev[i]) / (t+1) if conv_stop and \ norm(z - z_prev, np.inf) < eps: print('Meet a Friend converged after {t} rounds'.format(t=t)) break z_prev = z.copy() return t, z
def create_token(self): iv, pt = util.rbytes(16), util.rchoice(self.secrets) return iv + util.AesCbcCipher(self.key, iv).encrypt(pt)
def meetFriend(A, s, max_rounds, eps=1e-6, plot=False, conv_stop=True, save=False): '''Simulates the Friedkin-Johnsen (Kleinberg) Model. Runs a maximum of max_rounds rounds of the "Meeting a Friend" model. If the model converges sooner, the function returns. The stubborness matrix of the model is extracted from the diagonal of matrix A. Args: A (NxN numpy array): Adjacency matrix (its diagonal is the stubborness) s (1xN numpy array): Initial opinions (intrinsic beliefs) vector max_rounds (int): Maximum number of rounds to simulate eps (double): Maximum difference between rounds before we assume that the model has converged (default: 1e-6) plot (bool): Plot preference (default: False) conv_stop (bool): Stop the simulation if the model has converged (default: True) save (bool): Save the simulation data into text files Returns: A txN vector of the opinions of the nodes over time ''' N, z, max_rounds = preprocessArgs(s, max_rounds) z_prev = z.copy() opinions = np.zeros((max_rounds, N)) opinions[0, :] = s # Cannot allow zero rows because rchoice() will fail if np.size(np.nonzero(A.sum(axis=1))) != N: raise ValueError("Matrix A has one or more zero rows") for t in trange(1, max_rounds): # Update the opinion for each node for i in range(N): r_i = rchoice(A[i, :]) if r_i == i: op = s[i] else: op = z_prev[r_i] z[i] = (op + t * z_prev[i]) / (t + 1) z_prev = z opinions[t, :] = z if conv_stop and \ norm(opinions[t - 1, :] - opinions[t, :], np.inf) < eps: print('Meet a Friend converged after {t} rounds'.format(t=t)) break if plot: plotOpinions(opinions[0:t + 1, :], 'Meet a friend') if save: timeStr = datetime.now().strftime("%m%d%H%M") simid = 'mf' + timeStr saveModelData(simid, N=N, max_rounds=max_rounds, eps=eps, rounds_run=t + 1, A=A, s=s, opinions=opinions[0:t + 1, :]) return opinions[0:t + 1, :]
def meetFriend(A, s, max_rounds, eps=1e-6, plot=False, conv_stop=True, save=False): '''Simulates the Friedkin-Johnsen (Kleinberg) Model. Runs a maximum of max_rounds rounds of the "Meeting a Friend" model. If the model converges sooner, the function returns. The stubborness matrix of the model is extracted from the diagonal of matrix A. Args: A (NxN numpy array): Adjacency matrix (its diagonal is the stubborness) s (1xN numpy array): Initial opinions (intrinsic beliefs) vector max_rounds (int): Maximum number of rounds to simulate eps (double): Maximum difference between rounds before we assume that the model has converged (default: 1e-6) plot (bool): Plot preference (default: False) conv_stop (bool): Stop the simulation if the model has converged (default: True) save (bool): Save the simulation data into text files Returns: A txN vector of the opinions of the nodes over time ''' N, z, max_rounds = preprocessArgs(s, max_rounds) z_prev = z.copy() opinions = np.zeros((max_rounds, N)) opinions[0, :] = s # Cannot allow zero rows because rchoice() will fail if np.size(np.nonzero(A.sum(axis=1))) != N: raise ValueError("Matrix A has one or more zero rows") for t in trange(1, max_rounds): # Update the opinion for each node for i in range(N): r_i = rchoice(A[i, :]) if r_i == i: op = s[i] else: op = z_prev[r_i] z[i] = (op + t*z_prev[i]) / (t+1) z_prev = z opinions[t, :] = z if conv_stop and \ norm(opinions[t - 1, :] - opinions[t, :], np.inf) < eps: print('Meet a Friend converged after {t} rounds'.format(t=t)) break if plot: plotOpinions(opinions[0:t+1, :], 'Meet a friend') if save: timeStr = datetime.now().strftime("%m%d%H%M") simid = 'mf' + timeStr saveModelData(simid, N=N, max_rounds=max_rounds, eps=eps, rounds_run=t+1, A=A, s=s, opinions=opinions[0:t+1, :]) return opinions[0:t+1, :]