def __init__(self, graph, init_embedding=None, radius=None, fit_radius=False): self.graph = graph n = self.graph.number_of_nodes() self.fit_radius = fit_radius if self.fit_radius: self.__expected_vector_size = 2 * n + 1 else: self.__expected_vector_size = 2 * n # initialize embedding if radius is None: radius = 2 * np.log(n) self.embedding = { 'vertices': {}, 'radius': radius, } def gen_random_coordinates(v): r = 2*np.log(float(n) / self.graph.degree(v)) phi = np.random.uniform(0.0, 2*np.pi) return (r, phi) def delta_phi(r, R): # compute \Delta\phi from equality # \cosh(R) = \cosh^2(r) - \sinh^2(r) * \cos(\Delta\phi) cos_delta_phi = (np.cosh(r)**2 - np.cosh(R)) / np.sinh(r)**2 cos_delta_phi = max(-1., min(1., cos_delta_phi)) return np.arccos(cos_delta_phi) if init_embedding is not None: init_embedding_fringe = fringe(self.graph, init_embedding.embedding['vertices']) for v in self.graph.nodes(): if v in init_embedding.embedding['vertices']: self.embedding['vertices'][v] = init_embedding.embedding['vertices'][v] #elif any([_n in init_embedding.embedding['vertices'] for _n in self.graph.neighbors(v)]): elif v in init_embedding_fringe: neigh = list(set(self.graph.neighbors(v)) & set(init_embedding.embedding['vertices']))[0] r_n, phi_n = init_embedding.embedding['vertices'][neigh] delta_phi_n = delta_phi(r_n, radius) r_random, phi_zzz = gen_random_coordinates(v) phi_random_with_delta = np.random.uniform(4*np.pi + phi_n - delta_phi_n, 4*np.pi + phi_n + delta_phi_n) self.embedding['vertices'][v] = (r_random, phi_random_with_delta) else: self.embedding['vertices'][v] = gen_random_coordinates(v) else: for v in self.graph.nodes(): self.embedding['vertices'][v] = gen_random_coordinates(v) self._vertex2index = {} for i, v in enumerate(sorted(self.embedding['vertices'])): self._vertex2index[v] = i
def graph_specific(graph, proper=False, fringe=1): """ Returns a list of hyponym nodes in the fringe (all if None). """ if fringe: nodes = graph.fringe(fringe) else: nodes = graph.nodes if graph.root: nodes = filter(lambda n: n.is_a(graph.root, direct=False), nodes) else: nodes = filter(lambda n: n.has_rule("is-a", direct=True), nodes) if proper: nodes = filter(lambda n: n in graph.proper_nouns(), nodes) return nodes