本文整理汇总了Python中sage.graphs.graph.Graph.set_embedding方法的典型用法代码示例。如果您正苦于以下问题:Python Graph.set_embedding方法的具体用法?Python Graph.set_embedding怎么用?Python Graph.set_embedding使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类sage.graphs.graph.Graph
的用法示例。
在下文中一共展示了Graph.set_embedding方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: to_undirected_graph
# 需要导入模块: from sage.graphs.graph import Graph [as 别名]
# 或者: from sage.graphs.graph.Graph import set_embedding [as 别名]
def to_undirected_graph(self):
r"""
Return the undirected graph obtained from the tree nodes and edges.
The graph is endowed with an embedding, so that it will be displayed
correctly.
EXAMPLES::
sage: t = OrderedTree([])
sage: t.to_undirected_graph()
Graph on 1 vertex
sage: t = OrderedTree([[[]],[],[]])
sage: t.to_undirected_graph()
Graph on 5 vertices
If the tree is labelled, we use its labelling to label the graph. This
will fail if the labels are not all distinct.
Otherwise, we use the graph canonical labelling which means that
two different trees can have the same graph.
EXAMPLES::
sage: t = OrderedTree([[[]],[],[]])
sage: t.canonical_labelling().to_undirected_graph()
Graph on 5 vertices
TESTS::
sage: t.canonical_labelling().to_undirected_graph() == t.to_undirected_graph()
False
sage: OrderedTree([[],[]]).to_undirected_graph() == OrderedTree([[[]]]).to_undirected_graph()
True
sage: OrderedTree([[],[],[]]).to_undirected_graph() == OrderedTree([[[[]]]]).to_undirected_graph()
False
"""
from sage.graphs.graph import Graph
g = Graph()
if self in LabelledOrderedTrees():
relabel = False
else:
self = self.canonical_labelling()
relabel = True
roots = [self]
g.add_vertex(name=self.label())
emb = {self.label(): []}
while roots:
node = roots.pop()
children = reversed([child.label() for child in node])
emb[node.label()].extend(children)
for child in node:
g.add_vertex(name=child.label())
emb[child.label()] = [node.label()]
g.add_edge(child.label(), node.label())
roots.append(child)
g.set_embedding(emb)
if relabel:
g = g.canonical_label()
return g
示例2: _contour_and_graph_from_word
# 需要导入模块: from sage.graphs.graph import Graph [as 别名]
# 或者: from sage.graphs.graph.Graph import set_embedding [as 别名]
def _contour_and_graph_from_word(w):
r"""
Return the contour word and the graph of inner vertices of the tree
associated with the word `w`.
INPUT:
- `w` -- a word in `0` and `1` as given by :func:`_auxiliary_random_word`
This word must satisfy the conditions described in Proposition 4.2 of
[PS2006]_ (see :func:`_auxiliary_random_word`).
OUTPUT:
a pair ``(seq, G)`` where:
- ``seq`` is a sequence of pairs (label, integer) representing the
contour walk along the tree associated with `w`
- ``G`` is the tree obtained by restriction to the set of inner vertices
The underlying bijection from words to trees is given by lemma 4.1
in [PS2006]_. It maps the admissible words to planar trees where
every inner vertex has two leaves.
In the word `w`, the letter `1` means going away from the root ("up") from
an inner vertex to another inner vertex. The letter `0` denotes all other
steps of the discovery, i.e. either discovering a leaf vertex or going
toward the root ("down"). Thus, the length of `w` is twice the number of
edges between inner vertices, plus the number of leaves.
Inner vertices are tagged with 'in' and leaves are tagged with
'lf'. Inner vertices are moreover labelled by integers, and leaves
by the label of the neighbor inner vertex.
EXAMPLES::
sage: from sage.graphs.generators.random import _contour_and_graph_from_word
sage: seq, G = _contour_and_graph_from_word([1,0,0,0,0,0])
sage: seq
[('in', 0),
('in', 1),
('lf', 1),
('in', 1),
('lf', 1),
('in', 1),
('in', 0),
('lf', 0),
('in', 0),
('lf', 0)]
sage: G
Graph on 2 vertices
sage: from sage.graphs.generators.random import _auxiliary_random_word
sage: seq, G = _contour_and_graph_from_word(_auxiliary_random_word(20))
sage: G.is_tree()
True
sage: longw = [1,1,0,1,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0]
sage: seq, G = _contour_and_graph_from_word(longw)
sage: G.get_embedding()
{0: [1], 1: [0, 2], 2: [1, 3, 4], 3: [2], 4: [2, 5, 6], 5: [4], 6: [4]}
"""
index = 0 # numbering of inner vertices
word = [("in", 0)] # initial vertex is inner
leaf_stack = [0, 0] # stack of leaves still to be created
inner_stack = [0] # stack of active inner nodes
edges = []
embedding = {0: []} # records the planar embedding of the tree
for x in w:
if x == 1: # going up to a new inner vertex
index += 1
embedding[index] = inner_stack[-1:]
embedding[inner_stack[-1]].append(index)
leaf_stack.extend([index, index])
inner_stack.append(index)
edges.append(inner_stack[-2:])
word.append(("in", index))
else:
if leaf_stack and inner_stack[-1] == leaf_stack[-1]: # up and down to a new leaf
leaf_stack.pop()
word.extend([("lf", inner_stack[-1]), ("in", inner_stack[-1])])
else: # going down to a known inner vertex
inner_stack.pop()
word.append(("in", inner_stack[-1]))
G = Graph(edges, format="list_of_edges")
G.set_embedding(embedding)
return word[:-1], G