def add_edge_weights( self, potential_graph: nx.DiGraph(), weights: Optional[Dict[int, Dict[int, str]]] = None, missing_state_indicator: int = -1, ) -> nx.DiGraph: """Annotates edges with the weight. Given a graph where nodes are iterable entities containing character states, annotated edges with respect to the number of mutations. If a prior dictionary is passed into the constructor, the log likelihood of the mutations is added instead. These values are stored in the `weight` attribute of the networkx graph. Args: potential_graph: Potential graph weights: Weights to use when comparing states between characters missing_state_indicator: Variable to indicate missing state information. Returns: The potential graph with edge weights added, stored in the `weight` attribute. """ weighted_graph = potential_graph.copy() for u, v in weighted_graph.edges(): weighted_graph[u][v][ "weight"] = dissimilarity_functions.weighted_hamming_distance( list(u), list(v), missing_state_indicator, weights) return weighted_graph
def test_weighted_hamming_distance_priors_sq_inverse(self): dissimilarity = dissimilarity_functions.weighted_hamming_distance( self.s1, self.s2, weights=self.sqiweights) expected_dissimilarity = np.sum([ np.sqrt(1 / self.priors[0][1]), np.sqrt(1 / self.priors[5][2]) + np.sqrt(1 / self.priors[5][3]), ]) self.assertEqual(dissimilarity, expected_dissimilarity / 5)
def test_weighted_hamming_distance_priors_negative_log(self): dissimilarity = dissimilarity_functions.weighted_hamming_distance( self.s1, self.s2, weights=self.nlweights) expected_dissimilarity = np.sum([ -np.log(self.priors[0][1]), -(np.log(self.priors[5][2]) + np.log(self.priors[5][3])), ]) self.assertEqual(dissimilarity, expected_dissimilarity / 5)
def test_weighted_hamming_distance_all_missing(self): dissimilarity = dissimilarity_functions.weighted_hamming_distance( self.s1, self.all_missing, weights=self.nlweights) self.assertEqual(dissimilarity, 0)
def test_weighted_hamming_distance_no_priors(self): dissimilarity = dissimilarity_functions.weighted_hamming_distance( self.s1, self.s2) self.assertEqual(dissimilarity, 3 / 5)
def test_weighted_hamming_distance_identical(self): dissimilarity = dissimilarity_functions.weighted_hamming_distance( self.s1, self.s1) self.assertEqual(dissimilarity, 0)