def reward(g: nx.MultiGraph, edge: Tuple[int, int], const_amt: int, fee_type: str, fee: int = None) -> int: # debugging # print_flag = fee is not None u, v = edge if fee is not None: g.update_fee(u, v, fee, fee_type) else: fee = getattr(g.get_policy(u, v), fee_type) ebc = edge_betweenness(g, const_amt)[edge] # debugging # if print_flag: # print('({:>3d}, {:>3d}) fee {:>9d} ebc {:>9f} '.format( # u, v, fee, ebc), end='') return fee * ebc
def build_node(g: nx.MultiGraph, new_node: int, n: int, const_amt: int, fee_type: str) -> List: selected = [] # 2 initial edges so routes can pass through new node while len(selected) < n: max_reward = 0 best_channel = None # try all channels for node in g.nodes(): if node == new_node or node in g[new_node]: continue # create new channel g.add_edge_with_init(new_node, node, default=True) # calculate max reward reward, fee = maximise_fee( g, (new_node, node), const_amt, fee_type) # select channel if highest reward if max_reward <= reward: max_reward = reward best_channel = (node, fee) # reset graph for next channel g.remove_edge(new_node, node) if best_channel is None: raise Exception('Profit not possible.') # add selected channel and redo for next channel selected.append((new_node, best_channel[0], best_channel[1])) g.add_edge_with_init(new_node, best_channel[0], default=True) g.update_fee(new_node, best_channel[0], best_channel[1], fee_type) # return node with selected channels return selected