Ticket #14434: trac_14434-doctest.patch

File trac_14434-doctest.patch, 4.4 KB (added by ncohen, 6 years ago)
  • sage/graphs/generic_graph.py

    # HG changeset patch
    # User Nathann Cohen <nathann.cohen@gmail.com>
    # Date 1370370929 -7200
    # Node ID c68e0561b7b2dc0e52dbbaa778314a2da5c1da3a
    # Parent  5c50292d1c5d93ee90297c3fdcb182bb9436819e
    Implement feedback_vertex_set for graphs -- broken doctest
    
    diff --git a/sage/graphs/generic_graph.py b/sage/graphs/generic_graph.py
    a b  
    50025002        height = p.new_variable(dim = 2)
    50035003
    50045004        # cut[e] represents whether e is in the cut
    5005         cut = p.new_variable()
     5005        cut = p.new_variable(binary = True)
    50065006
    50075007        # Reorder
    50085008        R = lambda x,y : (x,y) if x<y else (y,x)
     
    50445044                    p.add_constraint( height[(s,t)][u] - height[(s,t)][v] - cut[R(u,v)], max = 0)
    50455045                    p.add_constraint( height[(s,t)][v] - height[(s,t)][u] - cut[R(u,v)], max = 0)
    50465046
    5047 
    5048         p.set_binary(cut)       
    50495047        if value_only:
    50505048            if use_edge_labels:
    50515049                return p.solve(objective_only = True, log = verbose)
     
    50575055        cut = p.get_values(cut)
    50585056
    50595057        if self.is_directed():
    5060             return filter(lambda (u,v,l) : cut[u,v] > .5, self.edge_iterator())
    5061 
    5062         else:
    5063             return filter(lambda (u,v,l) : cut[R(u,v)] > .5, self.edge_iterator())
     5058            return filter(lambda (u,v,l) : cut[u,v] == 1, self.edge_iterator())
     5059
     5060        else:
     5061            return filter(lambda (u,v,l) : cut[R(u,v)] ==1, self.edge_iterator())
    50645062
    50655063
    50665064    def max_cut(self, value_only=True, use_edge_labels=False, vertices=False, solver=None, verbose=0):
     
    55745572        vertex_used = p.get_values(vertex_used)
    55755573        if self._directed:
    55765574            g = self.subgraph(
    5577                 vertices=(v for v in self if vertex_used[v] >= 0.5),
     5575                vertices=(v for v in self if vertex_used[v] == 1),
    55785576                edges=((u,v,l) for u, v, l in self.edges()
    5579                        if edge_used[(u,v)] >= 0.5))
     5577                       if edge_used[(u,v)] == 1))
    55805578        else:
    55815579            g = self.subgraph(
    5582                 vertices=(v for v in self if vertex_used[v] >= 0.5),
     5580                vertices=(v for v in self if vertex_used[v] == 1),
    55835581                edges=((u,v,l) for u, v, l in self.edges()
    5584                        if f_edge_used(u,v) >= 0.5))
     5582                       if f_edge_used(u,v) == 1))
    55855583        if use_edge_labels:
    55865584            return sum(map(weight, g.edge_labels())), g
    55875585        else:
     
    58605858                    # We build the DiGraph representing the current solution
    58615859                    h = DiGraph()
    58625860                    for u,v,l in g.edges():
    5863                         if p.get_values(b[u][v]) > .5:
     5861                        if p.get_values(b[u][v]) == 1:
    58645862                            h.add_edge(u,v,l)
    58655863
    58665864                    # If there is only one circuit, we are done !
     
    59115909                    # We build the DiGraph representing the current solution
    59125910                    h = Graph()
    59135911                    for u,v,l in g.edges():
    5914                         if p.get_values(B(u,v)) > .5:
     5912                        if p.get_values(B(u,v)) == 1:
    59155913                            h.add_edge(u,v,l)
    59165914
    59175915                    # If there is only one circuit, we are done !
     
    62186216        The necessary example::
    62196217
    62206218            sage: g = graphs.PetersenGraph()
    6221             sage: g.feedback_vertex_set()
    6222             [1, 3, 5]
     6219            sage: fvs = g.feedback_vertex_set()
     6220            sage: len(fvs)
     6221            3
     6222            sage: g.delete_vertices(fvs)
     6223            sage: g.is_forest()
     6224            True
    62236225
    62246226        In a digraph built from a graph, any edge is replaced by arcs going in
    62256227        the two opposite directions, thus creating a cycle of length two.
     
    63006302
    63016303                # Building the graph without the edges removed by the LP
    63026304                h = self.subgraph(vertices =
    6303                                   [v for v in self if p.get_values(b[v]) < .5])
     6305                                  [v for v in self if p.get_values(b[v]) == 0])
    63046306
    63056307                # Is the graph acyclic ?
    63066308                if self.is_directed():
     
    63286330            else:
    63296331
    63306332                # listing the edges contained in the MFVS
    6331                 return [v for v in self if p.get_values(b[v]) > .5]
     6333                return [v for v in self if p.get_values(b[v]) == 1]
    63326334
    63336335        else:
    63346336