def weighted_random_walk(self, start, transaction): walker_on = start visible_transactions, not_visible_transactions = self.get_visible_transactions( transaction) valid_tips = self.get_valid_tips(visible_transactions, not_visible_transactions) #If only genesis a valid tip, approve genesis if (valid_tips == [walker_on]): return walker_on while (walker_on not in valid_tips): approvers = list(self.DG.predecessors(walker_on)) visible_approvers = common_elements(approvers, visible_transactions) transition_probabilities = self.calc_transition_probabilities( visible_approvers) #Choose with transition probabilities walker_on = np.random.choice(visible_approvers, p=transition_probabilities) return walker_on
def weighted_random_walk(self, transaction, valid_tips, initial_walker_on): #Start walk at genesis walker_on = initial_walker_on # #Start walk at genesis # walker_on = self.transactions[0] #If only genesis a valid tip, approve genesis if (valid_tips == [walker_on]): return walker_on while (walker_on not in valid_tips): approvers = list(self.DG.predecessors(walker_on)) visible_approvers = common_elements( approvers, transaction.agent.visible_transactions) transition_probabilities = self.calc_transition_probabilities_multiple_agents( visible_approvers, transaction.agent) #Choose with transition probabilities walker_on = np.random.choice(visible_approvers, p=transition_probabilities) return walker_on
def unweighted_random_walk(self, transaction, valid_tips): #Start walk at genesis walker_on = self.transactions[0] #If only genesis a valid tip, approve genesis if (valid_tips == [walker_on]): return walker_on while (walker_on not in valid_tips): approvers = list(self.DG.predecessors(walker_on)) visible_approvers = common_elements( approvers, transaction.agent.visible_transactions) walker_on = np.random.choice(visible_approvers) return walker_on
def random_walk(self, start, transaction): walker_on = start visible_transactions, not_visible_transactions = self.get_visible_transactions(transaction) valid_tips = self.get_valid_tips(visible_transactions, not_visible_transactions) #If only genesis a valid tip, approve genesis if (valid_tips == [walker_on]): return walker_on while (walker_on not in valid_tips): approvers = list(self.DG.predecessors(walker_on)) visible_approvers = common_elements(approvers, visible_transactions) walker_on = random.choice(visible_approvers) return walker_on
def calc_exit_probabilities_multiple_agents(self, incoming_transaction): for agent in self.agents: #Reset exit probability of all transactions to 0%, just needed when run multiple times throughout simulation for transaction in self.DG.nodes: transaction.exit_probability_multiple_agents[agent] = 0 #Set genesis to 100% self.transactions[0].exit_probability_multiple_agents[agent] = 1 #Determine visible transaction for t + 1, so that all transactions (h = 1) are included self.get_visible_transactions( incoming_transaction.arrival_time + self.latency, agent) #Start at genesis, tips in the end sorted = list(reversed(list(nx.topological_sort(self.DG)))) #Calculate exit probabilities for transaction in sorted: for agent in self.agents: if (transaction in agent.visible_transactions): #Get visible direct approvers and transition probabilities to walk to them approvers = list(self.DG.predecessors(transaction)) visible_approvers = common_elements( approvers, agent.visible_transactions) transition_probabilities = self.calc_transition_probabilities_multiple_agents( visible_approvers, agent) #For every visible direct approver update the exit probability by adding the exit probability #of the current transaction times the transition probabilitiy of walking to the approver for (approver, transition_probability) in zip( visible_approvers, transition_probabilities): approver.exit_probability_multiple_agents[agent] += ( transaction.exit_probability_multiple_agents[agent] * transition_probability)