Sage: Ticket #8922: induced subgraph search
https://trac.sagemath.org/ticket/8922
<p>
This patch add to Sage the method Graph.induced_subgraph_search which looks for a given graph as an induced subgraph of "self".
</p>
<p>
This is done through exhaustive search, using a very basic new graph class hand-made to efficiently stand such repetitive operations !
</p>
<p>
I tried to document the code so that it could be somewhat easy to review, but feel free to ask any question about it ! :-)
</p>
<p>
<strong>Apply:</strong>
</p>
<ol><li><a class="closed ticket" href="https://trac.sagemath.org/ticket/7529" title="enhancement: Maximum Average Degree of a graph (closed: fixed)">#7529</a>
</li><li><a class="ext-link" href="http://trac.sagemath.org/sage_trac/attachment/ticket/8922/trac_8922.patch"><span class="icon"></span>trac_8922.patch</a>
</li><li><a class="ext-link" href="http://trac.sagemath.org/sage_trac/attachment/ticket/8922/trac_8922-reviewer.patch"><span class="icon"></span>trac_8922-reviewer.patch</a>
</li></ol>en-usSagehttps://trac.sagemath.org/chrome/site/logo_sagemath_trac.png
https://trac.sagemath.org/ticket/8922
Trac 1.1.6ncohenFri, 07 May 2010 19:01:52 GMTstatus changed
https://trac.sagemath.org/ticket/8922#comment:1
https://trac.sagemath.org/ticket/8922#comment:1
<ul>
<li><strong>status</strong>
changed from <em>new</em> to <em>needs_review</em>
</li>
</ul>
TicketncohenThu, 20 May 2010 20:06:06 GMTpriority changed
https://trac.sagemath.org/ticket/8922#comment:2
https://trac.sagemath.org/ticket/8922#comment:2
<ul>
<li><strong>priority</strong>
changed from <em>major</em> to <em>critical</em>
</li>
</ul>
TicketncohenTue, 25 May 2010 23:39:59 GMT
https://trac.sagemath.org/ticket/8922#comment:3
https://trac.sagemath.org/ticket/8922#comment:3
<p>
Updated ! Changes :
</p>
<ul><li>it took me some time, but I tested the new graph classes <a class="missing wiki">StaticDenseGraph?</a> this patch introduced against the already implemented <a class="missing wiki">DenseGraph?</a>.... Which turned out to be more efficient.. So this new class has disappeared, and the new code is now written into the usual Sage files instead of new ones
</li></ul><ul><li>a -- very nasty -- memory leak -- now fixed
</li></ul><ul><li>add functions to test for induced as well as non-induced subgraphs, as it is the same.. Also works with <a class="missing wiki">DiGraphs?</a>, by the way !
</li></ul><p>
And once this patch will be merged into Sage... I will have many other things to write on top of it :-)
</p>
<p>
Nathann
</p>
TicketmvnguWed, 26 May 2010 00:05:51 GMTauthor set
https://trac.sagemath.org/ticket/8922#comment:4
https://trac.sagemath.org/ticket/8922#comment:4
<ul>
<li><strong>author</strong>
set to <em>Nathann Cohen</em>
</li>
</ul>
<p>
Replying to <a class="ticket" href="https://trac.sagemath.org/ticket/8922#comment:3" title="Comment 3">ncohen</a>:
</p>
<blockquote class="citation">
<ul><li>it took me some time, but I tested the new graph classes <a class="missing wiki">StaticDenseGraph?</a> this patch introduced against the already implemented <a class="missing wiki">DenseGraph?</a>.... Which turned out to be more efficient.. So this new class has disappeared, and the new code is now written into the usual Sage files instead of new ones
</li></ul></blockquote>
<p>
I have been reviewing your previous patch for over two days and went the same route as you have done in your current patch. That is, I rewrote your StaticDenseGraph to use the C graph based DenseGraph class, as it is very efficient in terms of storage. The reason why I have not uploaded my reviewer patch is that I was thinking about and playing with how to make the method <code>adjacency_list</code> more efficient in terms of storage. An array of ints is wasteful for the intended purpose, when a bitset is more suited to the purpose. What has been bugging me is trying to get my bitset implementation of <code>adjacency_list</code> to compile and work.
<br /><br />
</p>
<blockquote class="citation">
<ul><li>a -- very nasty -- memory leak -- now fixed
</li></ul></blockquote>
<p>
Again, I went the same route in my reviewer patch.
<br /><br />
</p>
<blockquote class="citation">
<ul><li>add functions to test for induced as well as non-induced subgraphs, as it is the same.. Also works with <a class="missing wiki">DiGraphs?</a>, by the way !
</li></ul></blockquote>
<p>
Again, I went the same route in my reviewer patch.
<br /><br />
</p>
<p>
Seems like you anticipated my changes. Anyway, I'll have a careful look at your updated patch.
</p>
TicketncohenWed, 26 May 2010 04:31:50 GMT
https://trac.sagemath.org/ticket/8922#comment:5
https://trac.sagemath.org/ticket/8922#comment:5
<p>
Hello !!
</p>
<p>
Well, first thank you for your work on this patch... I know it's a bit heavy all at once, and I hope the comments were clear enough :-)
</p>
<p>
About the <code></code>adjacency_list<code></code> method : I was more worried about speed than storage, but anyway <a class="missing wiki">DenseGraph?</a> were faster than my matrix of integers.. Don't you think working on integers as it is done inside of <a class="missing wiki">DenseGraph?</a> could be more efficient than it currently is ? I have never used operations such as << and >> as it is done in <a class="missing wiki">DenseGraph?</a>, but I thought it would be the next step if one wanted to improve the speed for a bit. I'll trust you on this one !
</p>
<p>
I also took some notes for future improvements... For example several tricks to reduce the number of attempts, or the initial graph, but I intended to wait for this patch to be merged before adding them. It will be easier to read in another one anyway :-)
</p>
<p>
Thank you again
</p>
<p>
Nathann
</p>
TicketmvnguSat, 29 May 2010 11:23:33 GMTdescription changed
https://trac.sagemath.org/ticket/8922#comment:6
https://trac.sagemath.org/ticket/8922#comment:6
<ul>
<li><strong>description</strong>
modified (<a href="/ticket/8922?action=diff&version=6">diff</a>)
</li>
</ul>
TicketmvnguTue, 01 Jun 2010 18:49:46 GMTstatus changed
https://trac.sagemath.org/ticket/8922#comment:7
https://trac.sagemath.org/ticket/8922#comment:7
<ul>
<li><strong>status</strong>
changed from <em>needs_review</em> to <em>needs_work</em>
</li>
</ul>
<p>
I applied patches in the order suggested in the ticket description. Running doctests on the whole graph theory module resulted in these failures. This failure results from ncohen's updated patch, which does not update the doctests:
</p>
<pre class="wiki">sage -t -long "devel/sage-main/sage/graphs/generic_graph_pyx.pyx"
**********************************************************************
File "/dev/shm/mvngu/sandbox/sage-4.4.3.alpha0.sandbox0/devel/sage-main/sage/graphs/generic_graph_pyx.pyx", line 491:
sage: from sage.graphs.induced_subgraphs.induced_subgraphs import find_induced
Exception raised:
Traceback (most recent call last):
File "/dev/shm/mvngu/sandbox/sage-4.4.3.alpha0.sandbox0/local/bin/ncadoctest.py", line 1231, in run_one_test
self.run_one_example(test, example, filename, compileflags)
File "/dev/shm/mvngu/sandbox/sage-4.4.3.alpha0.sandbox0/local/bin/sagedoctest.py", line 38, in run_one_example
OrigDocTestRunner.run_one_example(self, test, example, filename, compileflags)
File "/dev/shm/mvngu/sandbox/sage-4.4.3.alpha0.sandbox0/local/bin/ncadoctest.py", line 1172, in run_one_example
compileflags, 1) in test.globs
File "<doctest __main__.example_10[2]>", line 1, in <module>
from sage.graphs.induced_subgraphs.induced_subgraphs import find_induced###line 491:
sage: from sage.graphs.induced_subgraphs.induced_subgraphs import find_induced
ImportError: No module named induced_subgraphs.induced_subgraphs
**********************************************************************
File "/dev/shm/mvngu/sandbox/sage-4.4.3.alpha0.sandbox0/devel/sage-main/sage/graphs/generic_graph_pyx.pyx", line 492:
sage: find_induced(graphs.PetersenGraph(), graphs.PathGraph(5))
Exception raised:
Traceback (most recent call last):
File "/dev/shm/mvngu/sandbox/sage-4.4.3.alpha0.sandbox0/local/bin/ncadoctest.py", line 1231, in run_one_test
self.run_one_example(test, example, filename, compileflags)
File "/dev/shm/mvngu/sandbox/sage-4.4.3.alpha0.sandbox0/local/bin/sagedoctest.py", line 38, in run_one_example
OrigDocTestRunner.run_one_example(self, test, example, filename, compileflags)
File "/dev/shm/mvngu/sandbox/sage-4.4.3.alpha0.sandbox0/local/bin/ncadoctest.py", line 1172, in run_one_example
compileflags, 1) in test.globs
File "<doctest __main__.example_10[3]>", line 1, in <module>
find_induced(graphs.PetersenGraph(), graphs.PathGraph(Integer(5)))###line 492:
sage: find_induced(graphs.PetersenGraph(), graphs.PathGraph(5))
NameError: name 'find_induced' is not defined
**********************************************************************
File "/dev/shm/mvngu/sandbox/sage-4.4.3.alpha0.sandbox0/devel/sage-main/sage/graphs/generic_graph_pyx.pyx", line 497:
sage: find_induced(graphs.PetersenGraph(), graphs.ClawGraph())
Exception raised:
Traceback (most recent call last):
File "/dev/shm/mvngu/sandbox/sage-4.4.3.alpha0.sandbox0/local/bin/ncadoctest.py", line 1231, in run_one_test
self.run_one_example(test, example, filename, compileflags)
File "/dev/shm/mvngu/sandbox/sage-4.4.3.alpha0.sandbox0/local/bin/sagedoctest.py", line 38, in run_one_example
OrigDocTestRunner.run_one_example(self, test, example, filename, compileflags)
File "/dev/shm/mvngu/sandbox/sage-4.4.3.alpha0.sandbox0/local/bin/ncadoctest.py", line 1172, in run_one_example
compileflags, 1) in test.globs
File "<doctest __main__.example_10[4]>", line 1, in <module>
find_induced(graphs.PetersenGraph(), graphs.ClawGraph())###line 497:
sage: find_induced(graphs.PetersenGraph(), graphs.ClawGraph())
NameError: name 'find_induced' is not defined
**********************************************************************
File "/dev/shm/mvngu/sandbox/sage-4.4.3.alpha0.sandbox0/devel/sage-main/sage/graphs/generic_graph_pyx.pyx", line 502:
sage: find_induced(graphs.PetersenGraph(), graphs.PathGraph(6))
Exception raised:
Traceback (most recent call last):
File "/dev/shm/mvngu/sandbox/sage-4.4.3.alpha0.sandbox0/local/bin/ncadoctest.py", line 1231, in run_one_test
self.run_one_example(test, example, filename, compileflags)
File "/dev/shm/mvngu/sandbox/sage-4.4.3.alpha0.sandbox0/local/bin/sagedoctest.py", line 38, in run_one_example
OrigDocTestRunner.run_one_example(self, test, example, filename, compileflags)
File "/dev/shm/mvngu/sandbox/sage-4.4.3.alpha0.sandbox0/local/bin/ncadoctest.py", line 1172, in run_one_example
compileflags, 1) in test.globs
File "<doctest __main__.example_10[5]>", line 1, in <module>
find_induced(graphs.PetersenGraph(), graphs.PathGraph(Integer(6)))###line 502:
sage: find_induced(graphs.PetersenGraph(), graphs.PathGraph(6))
NameError: name 'find_induced' is not defined
</pre><p>
This is a known failure:
</p>
<pre class="wiki">sage -t -long "devel/sage-main/sage/graphs/generic_graph.py"
**********************************************************************
File "/dev/shm/mvngu/sandbox/sage-4.4.3.alpha0.sandbox0/devel/sage-main/sage/graphs/generic_graph.py", line 10754:
sage: print G.graphviz_string(labels="latex",edge_labels=True)
Expected:
digraph {
node [shape="plaintext"];
"2/3" [label=" ", texlbl="$\frac{2}{3}$"];
"1/3" [label=" ", texlbl="$\frac{1}{3}$"];
"1/2" [label=" ", texlbl="$\frac{1}{2}$"];
"1" [label=" ", texlbl="$1$"];
"1/4" [label=" ", texlbl="$\frac{1}{4}$"];
"4/5" [label=" ", texlbl="$\frac{4}{5}$"];
"-4" [label=" ", texlbl="$-4$"];
"2" [label=" ", texlbl="$2$"];
"-2" [label=" ", texlbl="$-2$"];
"-1/2" [label=" ", texlbl="$-\frac{1}{2}$"];
"-1" [label=" ", texlbl="$-1$"];
<BLANKLINE>
"1/2" -> "-2" [label=" ", texlbl="$x \ {\mapsto}\ \frac{-1}{x}$"];
"1/2" -> "2/3" [label=" ", texlbl="$x \ {\mapsto}\ \frac{1}{x + 1}$"];
"1" -> "-1" [label=" ", texlbl="$x \ {\mapsto}\ \frac{-1}{x}$"];
"1" -> "1/2" [label=" ", texlbl="$x \ {\mapsto}\ \frac{1}{x + 1}$"];
"1/4" -> "-4" [label=" ", texlbl="$x \ {\mapsto}\ \frac{-1}{x}$"];
"1/4" -> "4/5" [label=" ", texlbl="$x \ {\mapsto}\ \frac{1}{x + 1}$"];
"2" -> "-1/2" [label=" ", texlbl="$x \ {\mapsto}\ \frac{-1}{x}$"];
"2" -> "1/3" [label=" ", texlbl="$x \ {\mapsto}\ \frac{1}{x + 1}$"];
}
Got:
digraph {
node [shape="plaintext"];
"2/3" [label=" ", texlbl="$\frac{2}{3}$"];
"1/3" [label=" ", texlbl="$\frac{1}{3}$"];
"1/2" [label=" ", texlbl="$\frac{1}{2}$"];
"1" [label=" ", texlbl="$1$"];
"1/4" [label=" ", texlbl="$\frac{1}{4}$"];
"4/5" [label=" ", texlbl="$\frac{4}{5}$"];
"-4" [label=" ", texlbl="$-4$"];
"2" [label=" ", texlbl="$2$"];
"-2" [label=" ", texlbl="$-2$"];
"-1/2" [label=" ", texlbl="$-\frac{1}{2}$"];
"-1" [label=" ", texlbl="$-1$"];
<BLANKLINE>
"1/2" -> "-2" [label=" ", texlbl="$x \ {\mapsto}\ \frac{1}{x}$"];
"1/2" -> "2/3" [label=" ", texlbl="$x \ {\mapsto}\ \frac{1}{x + 1}$"];
"1" -> "-1" [label=" ", texlbl="$x \ {\mapsto}\ \frac{1}{x}$"];
"1" -> "1/2" [label=" ", texlbl="$x \ {\mapsto}\ \frac{1}{x + 1}$"];
"1/4" -> "-4" [label=" ", texlbl="$x \ {\mapsto}\ \frac{1}{x}$"];
"1/4" -> "4/5" [label=" ", texlbl="$x \ {\mapsto}\ \frac{1}{x + 1}$"];
"2" -> "-1/2" [label=" ", texlbl="$x \ {\mapsto}\ \frac{1}{x}$"];
"2" -> "1/3" [label=" ", texlbl="$x \ {\mapsto}\ \frac{1}{x + 1}$"];
}
</pre><p>
This one should be optional, I think, and results from <a class="closed ticket" href="https://trac.sagemath.org/ticket/8166" title="enhancement: Expose max_weight_matching from NetworkX (closed: fixed)">#8166</a>:
</p>
<pre class="wiki">File "/dev/shm/mvngu/sandbox/sage-4.4.3.alpha0.sandbox0/devel/sage-main/sage/graphs/generic_graph.py", line 4213:
sage: g.matching(algorithm="LP", value_only=True)
Exception raised:
Traceback (most recent call last):
File "/dev/shm/mvngu/sandbox/sage-4.4.3.alpha0.sandbox0/local/bin/ncadoctest.py", line 1231, in run_one_test
self.run_one_example(test, example, filename, compileflags)
File "/dev/shm/mvngu/sandbox/sage-4.4.3.alpha0.sandbox0/local/bin/sagedoctest.py", line 38, in run_one_example
OrigDocTestRunner.run_one_example(self, test, example, filename, compileflags)
File "/dev/shm/mvngu/sandbox/sage-4.4.3.alpha0.sandbox0/local/bin/ncadoctest.py", line 1172, in run_one_example
compileflags, 1) in test.globs
File "<doctest __main__.example_70[5]>", line 1, in <module>
g.matching(algorithm="LP", value_only=True)###line 4213:
sage: g.matching(algorithm="LP", value_only=True)
File "/dev/shm/mvngu/sandbox/sage-4.4.3.alpha0.sandbox0/local/lib/python/site-packages/sage/graphs/generic_graph.py", line 4264, in matching
return p.solve(objective_only=True, solver=solver, log=verbose)
File "mip.pyx", line 1051, in sage.numerical.mip.MixedIntegerLinearProgram.solve (sage/numerical/mip.c:7884)
ValueError: There does not seem to be any (Mixed) Integer Linear Program solver installed. Please visit http://www.sagemath.org/doc/constructions/linear_programming.html to learn more about the solvers available.
</pre>
TicketncohenTue, 01 Jun 2010 19:11:37 GMTstatus changed
https://trac.sagemath.org/ticket/8922#comment:8
https://trac.sagemath.org/ticket/8922#comment:8
<ul>
<li><strong>status</strong>
changed from <em>needs_work</em> to <em>needs_review</em>
</li>
</ul>
<p>
Sorry for that Minh :-/
</p>
<p>
Here is an updated patch... God, I'm eager to have all these dependencies merged into Sage !
</p>
<p>
Nathann
</p>
TicketncohenTue, 01 Jun 2010 19:11:51 GMTattachment set
https://trac.sagemath.org/ticket/8922
https://trac.sagemath.org/ticket/8922
<ul>
<li><strong>attachment</strong>
set to <em>trac_8922.patch</em>
</li>
</ul>
TicketjasonFri, 04 Jun 2010 21:54:22 GMT
https://trac.sagemath.org/ticket/8922#comment:9
https://trac.sagemath.org/ticket/8922#comment:9
<p>
It looks like everything in the dependencies except this patch is now reviewed. Minh, are you reviewing this patch as well?
</p>
TicketmvnguFri, 04 Jun 2010 21:56:11 GMT
https://trac.sagemath.org/ticket/8922#comment:10
https://trac.sagemath.org/ticket/8922#comment:10
<p>
Replying to <a class="ticket" href="https://trac.sagemath.org/ticket/8922#comment:9" title="Comment 9">jason</a>:
</p>
<blockquote class="citation">
<p>
Minh, are you reviewing this patch as well?
</p>
</blockquote>
<p>
Yes. I'm finalizing a reviewer patch.
</p>
TicketmvnguSat, 05 Jun 2010 01:08:28 GMTattachment set
https://trac.sagemath.org/ticket/8922
https://trac.sagemath.org/ticket/8922
<ul>
<li><strong>attachment</strong>
set to <em>trac_8922-reviewer.patch</em>
</li>
</ul>
TicketmvnguSat, 05 Jun 2010 01:16:12 GMTdescription changed; reviewer set
https://trac.sagemath.org/ticket/8922#comment:11
https://trac.sagemath.org/ticket/8922#comment:11
<ul>
<li><strong>reviewer</strong>
set to <em>Minh Van Nguyen</em>
</li>
<li><strong>description</strong>
modified (<a href="/ticket/8922?action=diff&version=11">diff</a>)
</li>
</ul>
<p>
Changes in reviewer patch:
</p>
<ul><li>Move the method <code>adjacency_sequence()</code> to the class <code>CGraph</code>, as I think that method is useful for both dense and sparse graphs.
</li><li>Clean-up coding style in accordance with PEP 008.
</li><li>In describing the algorithm used in <code>subgraph_search()</code> of the module <code>generic_graph_pyx.pyx</code>, you have the formula:
<pre class="wiki">`\binom k!{|V(G)|}{k}`
</pre>That won't typeset in LaTeX as you expected. Do you mean this?
<pre class="wiki">`k! \binom{|V(G)|}{k}`
</pre>I have used the latter formula in my reviewer patch. Please correct me if I'm wrong.
</li><li>Unit tests for the <code>cdef</code> functions <code>vectors_equal()</code> and <code>vectors_inferior()</code>, and the method <code>adjacency_sequence()</code>. These functions/methods are defined using <code>cdef</code> and the doctest coverage script don't pick them up in its analysis. However, I still think it's important to provide unit tests for such functions/methods.
</li><li>Amalgamate the methods <code>induced_subgraph_search()</code> and <code>subgraph_search()</code>. Their definitions are almost identical, except for the keyword <code>induced</code>. The combined method is defined to take the boolean keyword <code>induced</code> and pass it on to the relevant method.
</li></ul><p>
Another pair of eyes is needed to look over my reviewer patch.
</p>
TicketjasonSat, 05 Jun 2010 02:16:52 GMT
https://trac.sagemath.org/ticket/8922#comment:12
https://trac.sagemath.org/ticket/8922#comment:12
<p>
Wow, your reviewer patch is twice the size of the original patch!
</p>
TicketncohenSat, 05 Jun 2010 09:03:21 GMT
https://trac.sagemath.org/ticket/8922#comment:13
https://trac.sagemath.org/ticket/8922#comment:13
<p>
Hello !!
</p>
<p>
First, I want to thank you for the amount of time your must have spent on this :-)
</p>
<blockquote class="citation">
<ul><li>Move the method <code>adjacency_sequence()</code> to the class <code>CGraph</code>, as I think that method is useful for both dense and sparse graphs.
</li></ul></blockquote>
<p>
It can be, though systematically testing adjacencies (and most importantly -- non-adjacencies) in sparse graph can be a problem... Perhaps we will have to split this function in two copies, one for each class, one day or another. I have been talking with Alexandre Blondin Masse who could need such a feature for Sparse graphs :-)
</p>
<blockquote class="citation">
<ul><li>In describing the algorithm used in <code>subgraph_search()</code> of the module <code>generic_graph_pyx.pyx</code>, you have the formula:
<pre class="wiki">`\binom k!{|V(G)|}{k}`
</pre>That won't typeset in LaTeX as you expected. Do you mean this?
<pre class="wiki">`k! \binom{|V(G)|}{k}`
</pre></li></ul></blockquote>
<p>
Indeed
</p>
<blockquote class="citation">
<blockquote>
<p>
I have used the latter formula in my reviewer patch. Please correct me if I'm wrong.
</p>
</blockquote>
</blockquote>
<p>
You almost never are :-)
</p>
<blockquote class="citation">
<ul><li>Unit tests for the <code>cdef</code> functions <code>vectors_equal()</code> and <code>vectors_inferior()</code>, and the method <code>adjacency_sequence()</code>. These functions/methods are defined using <code>cdef</code> and the doctest coverage script don't pick them up in its analysis. However, I still think it's important to provide unit tests for such functions/methods.
</li></ul></blockquote>
<p>
Well, if there is anything wrong in these functions your tests will show it, though given their length I wouldn't have thought necessary to add such tests.... Are you doubting Cython itself ? :-)
</p>
<blockquote class="citation">
<ul><li>Amalgamate the methods <code>induced_subgraph_search()</code> and <code>subgraph_search()</code>. Their definitions are almost identical, except for the keyword <code>induced</code>. The combined method is defined to take the boolean keyword <code>induced</code> and pass it on to the relevant method.
</li></ul></blockquote>
<p>
I was thinking of someone working on induced subgraphs, and not seeing any occurence of this word among the functions.... But he will get interested in subgraph search sooner or later ;-)
</p>
<blockquote class="citation">
<p>
Another pair of eyes is needed to look over my reviewer patch.
</p>
</blockquote>
<p>
I already spent some time over it, and agreed with what I saw.... Considering its length, I may do this once or twice again before setting it to "positive review". and... Thank you again :-)
</p>
<p>
Nathann
</p>
TicketncohenSat, 05 Jun 2010 10:58:29 GMTstatus changed
https://trac.sagemath.org/ticket/8922#comment:14
https://trac.sagemath.org/ticket/8922#comment:14
<ul>
<li><strong>status</strong>
changed from <em>needs_review</em> to <em>positive_review</em>
</li>
</ul>
<p>
Agreeeeeeed !! I expect this function to receive a lot of improvements in future patches :-)
</p>
<p>
Nathann
</p>
TicketmhansenSun, 06 Jun 2010 07:14:21 GMTstatus changed; resolution, merged set
https://trac.sagemath.org/ticket/8922#comment:15
https://trac.sagemath.org/ticket/8922#comment:15
<ul>
<li><strong>status</strong>
changed from <em>positive_review</em> to <em>closed</em>
</li>
<li><strong>resolution</strong>
set to <em>fixed</em>
</li>
<li><strong>merged</strong>
set to <em>sage-4.4.4.alpha0</em>
</li>
</ul>
Ticket