#16803 closed enhancement (fixed)
Reimplement matrix_integer_dense using FLINT
Reported by:  mmasdeu  Owned by:  

Priority:  major  Milestone:  sage6.4 
Component:  linear algebra  Keywords:  flint, matrix 
Cc:  pbruin  Merged in:  
Authors:  Marc Masdeu  Reviewers:  William Stein, Jeroen Demeyer 
Report Upstream:  N/A  Work issues:  
Branch:  812a509 (Commits, GitHub, GitLab)  Commit:  
Dependencies:  Stopgaps: 
Description
In this ticket we reimplement all of matrix_integer_dense using FLINT fmpz_mat_t.
The speedup is substantial. With the new code:
sage: A = Matrix(ZZ,1000,1000,range(10^6)) sage: %time B = A*A CPU times: user 883 ms, sys: 3.33 ms, total: 887 ms Wall time: 888 ms
This takes more than 1 minute in the same computer using Sage 6.3.
Change History (98)
comment:1 Changed 8 years ago by
Branch:  → u/mmasdeu/16803matrix_integer_dense_flint 

Commit:  → a51a2fb4f4576685c13f9ec01bd252b04e6dd503 
comment:2 Changed 8 years ago by
comment:3 Changed 8 years ago by
A word of caution about algorithm defaults: FLINT should generally be faster for small input but IML/Linbox etc. probably have much better code for things like nullspace, charpoly... as soon as the matrices start to get large.
Replacing _rational_kernel_iml with _rational_kernel_flint, for example, is strange. Surely both algorithms should be available.
comment:4 Changed 8 years ago by
Commit:  a51a2fb4f4576685c13f9ec01bd252b04e6dd503 → d180ee24dc9547212762499ff271b5a119dadfa9 

comment:5 Changed 8 years ago by
I rewrote the code to have all the previous functionality available. The code compiles and passes all the doctests in the matrix/ folder. I will have it run all the doctests during the weekend.
comment:6 Changed 8 years ago by
Commit:  d180ee24dc9547212762499ff271b5a119dadfa9 → e26c3472968016bc9dcb82cca70803bbd946b886 

Branch pushed to git repo; I updated commit sha1. New commits:
e26c347  Trac 16803: Modified to pass doctests from outside matrix folder.

comment:7 Changed 8 years ago by
Commit:  e26c3472968016bc9dcb82cca70803bbd946b886 → f2ac03c5052e46df91afa80420ed2b08d43d2823 

comment:8 Changed 8 years ago by
Commit:  f2ac03c5052e46df91afa80420ed2b08d43d2823 → 166bae537c52aa4eee968275dcd2f2aef9f52a82 

comment:9 followup: 22 Changed 8 years ago by
Hi,
A first remark playing around with timings is that in sage6.3 somebody or something has definitely *completely massively screwed* up Linbox, or how Linbox is built, or how we use linbox, which was the default representation and library for arithmetic. Consider this:
sage: n=200; set_random_seed(0); a = random_matrix(ZZ,n); b = random_matrix(ZZ,n) sage: %time c=a._multiply_linbox(b) CPU times: user 326 ms, sys: 3.63 ms, total: 330 ms Wall time: 347 ms sage: %time c=a._multiply_multi_modular(b) CPU times: user 51.5 ms, sys: 1.6 ms, total: 53.1 ms Wall time: 56.1 ms sage: n=400; set_random_seed(0); a = random_matrix(ZZ,n); b = random_matrix(ZZ,n) sage: %time c=a._multiply_linbox(b) CPU times: user 5.28 s, sys: 22.8 ms, total: 5.3 s Wall time: 5.37 s sage: %time c=a._multiply_multi_modular(b) CPU times: user 230 ms, sys: 6.08 ms, total: 236 ms Wall time: 248 ms
Linbox should easily beat the multiply_multi_modular approach  that's just basically a naive version of the same thing linbox would be doing if it were properly built and linked. Instead, Linbox is massively slower. In fact, almost exactly as much slower as I would expect if the wrong BLAS were being linked. Note that I tested against the new flint backend and now a._multiply_multi_modular(b) is asymptotically similar to flint, though asymptotically (for n=2000 already), they are pretty close to the same in speed (8.55s versus 11.4s). In any case, somebody should really look into why linbox is so screwed up  we switched to it initially since it was much better than doing a._multiply_multi_modular(b) and also our own strassen implementation.
comment:10 Changed 8 years ago by
OK, I've been skeptically looking at and testing this patch much of today. I made a few tiny changes, but frankly I think this is overall AWESOME. FLINT's linear algebra seems quite good.
The following three methods are now still gone. Add them back so I can run some randomized consistency tests more easily...
a._multiply_classical a._multiply_linbox a._multiply_multi_modular
When these are added back, and I run tests of correctness by comparing with them, then I'll give this an enthusiastic positive review.
comment:11 Changed 8 years ago by
Status:  new → needs_review 

comment:12 Changed 8 years ago by
Status:  needs_review → needs_work 

comment:13 Changed 8 years ago by
Commit:  166bae537c52aa4eee968275dcd2f2aef9f52a82 → 5f21e3dbfda7a126d4ba388681c75f7c559a1e24 

comment:14 Changed 8 years ago by
Commit:  5f21e3dbfda7a126d4ba388681c75f7c559a1e24 → a13b79c9decdba47551a70f2ce1822a4e7e082bd 

Branch pushed to git repo; I updated commit sha1. New commits:
a13b79c  Fixed errors, all doctests pass now.

comment:15 Changed 8 years ago by
Status:  needs_work → needs_review 

I have added the three functions back, and run the long tests in sage/matrix/.
comment:16 Changed 8 years ago by
MAJOR PROBLEM! Now that multiply_multi_modular is back, I wrote code to do some random testing of correctness. I did not find situations where things are wrong... however, I quickly ran into major trouble because this ticket introduces a huge memory leak. I just defined two matrices and multiplied them a few hundred times, and had major ram problems. In particular, in sage6.3 (without this branch):
sage: get_memory_usage() 1047.1875 sage: for i in range(50): ....: a=random_matrix(ZZ,300); del a ....: sage: get_memory_usage() 1047.1875
With this ticket:
sage: get_memory_usage() 2132.09765625 sage: for i in range(50): a=random_matrix(ZZ,300); del a ....: sage: get_memory_usage() 2231.3203125
Conclusion: making nontrivial use of the code on this ticket will very quickly use up all RAM on your computer.
So... needs work until that is fixed.
comment:17 Changed 8 years ago by
Commit:  a13b79c9decdba47551a70f2ce1822a4e7e082bd → 0d37b701fbd845ee36fdaa6dcf62bae71bf4d6af 

Branch pushed to git repo; I updated commit sha1. New commits:
0d37b70  Fixed memory leak.

comment:18 Changed 8 years ago by
I don't think the changeset with name "Fixed memory leak" fixes the memory leak, at least not for matrix multiplication. I'm not sure if you're done yet. With your fix, if you run the functions test1
, test2
or test3
in the script 20140829180550stupidtest.sage
below, then the memory usage (print out second) grows quite rapidly and doesn't go down. Doing the same thing in sage6.3 results in almost no leakage of the heap. In particular, with your patch after running those 3 tests I ended up with over 2GB extra memory used (oer startup), even after doing import gc; gc.collect()
. Doing the identical thing with sage6.3 uses only a few MB's.
def t0(n): a = random_matrix(ZZ,n) b = random_matrix(ZZ,n) assert a*b == a*b def t(n): a = random_matrix(ZZ,n) b = random_matrix(ZZ,n) assert a*b == a._multiply_multi_modular(b) def test1(): for n in range(1,50): print n, get_memory_usage() set_random_seed(0) for i in range(100): t(n) def test2(): for n in range(51,150): print n, get_memory_usage() set_random_seed(0) for i in range(10): t(n) def t2(n): a = random_matrix(ZZ,n,2*n) b = random_matrix(ZZ,2*n,n) at = a.transpose() bt = b.transpose() assert a*b == a._multiply_multi_modular(b) assert bt*at == bt._multiply_multi_modular(at) def test3(): for n in range(1,50): print n, get_memory_usage() set_random_seed(0) for i in range(50): t2(n)
comment:19 Changed 8 years ago by
Just from a quick glance at the code, it looks like _lift_crt doesn't mpz_clear out tmp.
comment:20 Changed 8 years ago by
Commit:  0d37b701fbd845ee36fdaa6dcf62bae71bf4d6af → f6ac760964f32d4e1105a541333e4df38a22aecd 

comment:21 followup: 24 Changed 8 years ago by
Thanks Fredrik, I fixed that (although it was not the only problem, by far).
The previous commit was not finished yet (sorry for the confusing commit message). I believe that now the memory leaks are gone (at least those that were detected by William's tests). The main problem was that the get_unsafe_mpz function was initializing the value that it modifies in place, and all functions calling it were also mpz_init'ing it as well. All should be good now.
comment:22 followup: 23 Changed 8 years ago by
Replying to was:
A first remark playing around with timings is that in sage6.3 somebody or something has definitely *completely massively screwed* up Linbox, or how Linbox is built, or how we use linbox, which was the default representation and library for arithmetic.
Are you sure this isn't an imaginary slowdown? Just for fun, I installed some old versions of Sage on boxen and executed the command
$ time ./sage c '_ = Matrix(ZZ,1000,1000,range(10^6))^5'
I tested Sage versions 2.9(*), 2.11(*), 3.0.6, 3.2.3, 4.1, 4.5, 4.7, 5.0, 5.12, 6.1.1, 6.3 and the above command always took about 12 minutes. Note that boxen is not an idle machine, so it's difficult to get accurate timings, but there is certainly no massive slowdown.
(*) For these versions, ATLAS didn't compile so I used the ATLAS package from Sage 3.0.6.
comment:23 Changed 8 years ago by
Replying to jdemeyer:
Replying to was:
A first remark playing around with timings is that in sage6.3 somebody or something has definitely *completely massively screwed* up Linbox, or how Linbox is built, or how we use linbox, which was the default representation and library for arithmetic.
Are you sure this isn't an imaginary slowdown? Just for fun, I installed some old versions of Sage on boxen and executed the command
$ time ./sage c '_ = Matrix(ZZ,1000,1000,range(10^6))^5'I tested Sage versions 2.9(*), 2.11(*), 3.0.6, 3.2.3, 4.1, 4.5, 4.7, 5.0, 5.12, 6.1.1, 6.3 and the above command always took about 12 minutes. Note that boxen is not an idle machine, so it's difficult to get accurate timings, but there is certainly no massive slowdown.
(*) For these versions, ATLAS didn't compile so I used the ATLAS package from Sage 3.0.6.
Thanks for testing. I wouldn't be at all surprised if the problem was introduced quite a long time ago  I haven't benchmarked sage linear algebra at all since around the time when Clement was my postdoc (about 20072008), and at that time definitely a properly built linbox provided the fastest matrix multiply (and many other things). It might still today  I don't know.
comment:24 Changed 8 years ago by
Replying to mmasdeu:
Thanks Fredrik, I fixed that (although it was not the only problem, by far).
The previous commit was not finished yet (sorry for the confusing commit message). I believe that now the memory leaks are gone (at least those that were detected by William's tests). The main problem was that the get_unsafe_mpz function was initializing the value that it modifies in place, and all functions calling it were also mpz_init'ing it as well. All should be good now.
Marc  can you update the code in our SD61 project in sagetestmarc so I can test this out. I tried what was there, and it leaked like a sieve.
comment:25 Changed 8 years ago by
It just finished compiling now. I got tired of bugfixing in the cloud (some things are better done in private), and worked from my local copy in the last bit.
comment:26 Changed 8 years ago by
Reviewers:  → William Stein 

Status:  needs_review → positive_review 
OK, I'm now officially thrilled/very happy by this code :)
comment:28 Changed 8 years ago by
Status:  positive_review → needs_work 

comment:29 Changed 8 years ago by
Branch:  u/mmasdeu/16803matrix_integer_dense_flint → u/jdemeyer/ticket/16803 

Created:  Aug 12, 2014, 4:39:14 PM → Aug 12, 2014, 4:39:14 PM 
Modified:  Sep 5, 2014, 11:03:05 AM → Sep 5, 2014, 11:03:05 AM 
comment:30 Changed 8 years ago by
Commit:  f6ac760964f32d4e1105a541333e4df38a22aecd → 2e66cee05777a1565f8aa012730df777f798cb0f 

Merged with
git merge ticket/16583 X theirs
Compiles fine, not tested again.
New commits:
3bda21c  cleanup of fmpz_t and fmpz_poly_t to avoid Cython warnings about referencing before assignment

dfc8ce1  silence Cython warning about complicated declaration

8bb6b48  merge

14e730e  Merge with 6.4.beta1

18a4842  trac #16583, oops, correcting wrong merge

c416fee  Remove stuff which is not needed

b3d6aa2  Further cleanup

20c767c  Fix include of fmpq_poly.pxi in Cython doctest

2e66cee  Merge branch 'ticket/16583' into ticket/16803

comment:31 Changed 8 years ago by
Status:  needs_work → positive_review 

comment:32 Changed 8 years ago by
Branch:  u/jdemeyer/ticket/16803 → u/mmasdeu/ticket/16803 

Commit:  2e66cee05777a1565f8aa012730df777f798cb0f → 22e6896aadf0d6f99aeebc29041d6fd247569738 
Status:  positive_review → needs_review 
I have just realized that (in a bad design choice) I was initializing allocating _rows and _entries for every single matrix created, which is not very efficient. Now it is only done when needed (i.e. when calling _init_linbox()). Changes are minimal, and I ran the tests (long version) in /matrix/ for safety, but I will resubmit for review.
New commits:
22e6896  Trac 16803: Initialize _rows and _entries only when needed (to save memory).

comment:33 Changed 8 years ago by
Be more careful about freeing. Right now, in all cases, you do
sage_free(self._rows) sage_free(self._entries)
You're depending on self._rows being automatically initialized to NULL (?), and sage_free doing the right thing when passed NULL. Maybe that works, but I would be more comfortable if it was explicit, e.g., put self._rows=NULL and only free self._rows if not NULL (or check the source code and see whether it already works that way).
comment:34 Changed 8 years ago by
Commit:  22e6896aadf0d6f99aeebc29041d6fd247569738 → 70afcd6d8a4092515da48e2e33d7024a80c8ec8e 

Branch pushed to git repo; I updated commit sha1. New commits:
70afcd6  Trac 16803: free _rows and _entries only when needed.

comment:35 Changed 8 years ago by
comment:36 followup: 37 Changed 8 years ago by
Its safe to call sage_free
with NULL
, but an unintialized pointer can have a nonnull value. You should explicitly set all pointers to NULL in __cinit__
.
comment:37 Changed 8 years ago by
Status:  needs_review → positive_review 

Replying to vbraun:
Its safe to call
sage_free
withNULL
, but an unintialized pointer can have a nonnull value. You should explicitly set all pointers to NULL in__cinit__
.
Thanks for clarifying this. The change he made does explicitly set pointers to NULL now, but it also checks for NULL before calling sage_free. He should probably change that part back.
Anyway, positive review.
comment:38 Changed 8 years ago by
Commit:  70afcd6d8a4092515da48e2e33d7024a80c8ec8e → 5dd0b79e71c51367c1602cb70e0d92291e12e931 

Status:  positive_review → needs_review 
Branch pushed to git repo; I updated commit sha1 and set ticket back to needs_review. New commits:
5dd0b79  Trac 16803: No need to check for uninitialized pointers, so reverting

comment:40 Changed 8 years ago by
The commit is ok but the commit message is wrong ;) You initialize it to NULL, thats the whole point.
comment:42 Changed 8 years ago by
Status:  positive_review → needs_work 

Conflicts with #15946, please fix.
comment:43 Changed 8 years ago by
Branch:  u/mmasdeu/ticket/16803 → u/jdemeyer/ticket/16803 

Modified:  Sep 6, 2014, 11:04:18 AM → Sep 6, 2014, 11:04:18 AM 
comment:44 Changed 8 years ago by
Commit:  5dd0b79e71c51367c1602cb70e0d92291e12e931 → 6d819238634f4ca885827df0ce217344899d415b 

I merged with #15946, but that revealed some genuine bugs with this ticket, hang on...
New commits:
6fc03e3  Get rid of mpz_t_offset hacks

4a5d820  Merge branch 'ticket/16910' into HEAD

d76f8e7  Fix mpz_t, mpq_t, mpf_t declarations

a52cff2  Use mpz_srcptr for padics pow_computer

6d81923  Merge branch 'ticket/15946' into ticket/16803

comment:45 Changed 8 years ago by
Commit:  6d819238634f4ca885827df0ce217344899d415b → 0c75c2ba9475a2eb02807387375b88140d1137c3 

Branch pushed to git repo; I updated commit sha1. New commits:
0c75c2b  Remove unused _lift_crt_rr_with_lcm() function

comment:46 Changed 8 years ago by
Still needs work because of
sage t src/sage/combinat/q_analogues.py ********************************************************************** File "src/sage/combinat/q_analogues.py", line 200, in sage.combinat.q_analogues.q_binomial Failed example: q_binomial(4,2,matrix([[2,1],[1,3]])) Exception raised: Traceback (most recent call last): File "/usr/local/src/sagegit/local/lib/python2.7/sitepackages/sage/doctest/forker.py", line 480, in _run self.compile_and_execute(example, compiler, test.globs) File "/usr/local/src/sagegit/local/lib/python2.7/sitepackages/sage/doctest/forker.py", line 843, in compile_and_execute exec compiled in globs File "<doctest sage.combinat.q_analogues.q_binomial[14]>", line 1, in <module> q_binomial(Integer(4),Integer(2),matrix([[Integer(2),Integer(1)],[Integer(1),Integer(3)]])) File "/usr/local/src/sagegit/local/lib/python2.7/sitepackages/sage/combinat/q_analogues.py", line 308, in q_binomial return numerat/denomin File "element.pyx", line 2743, in sage.structure.element.Matrix.__div__ (build/cythonized/sage/structure/element.c:20137) File "matrix_integer_dense.pyx", line 923, in sage.matrix.matrix_integer_dense.Matrix_integer_dense._matrix_times_matrix_ (build/cythonized/sage/matrix/matrix_integer_dense.c:11570) File "c_lib.pyx", line 97, in sage.ext.c_lib.sig_raise_exception (build/cythonized/sage/ext/c_lib.c:1208) SignalError: Segmentation fault **********************************************************************
Given that this test also fails (not with a segfault though) in the patchbot, I guess the merging isn't to blame.
Please fix this...
comment:47 Changed 8 years ago by
Branch:  u/jdemeyer/ticket/16803 → u/mmasdeu/168032 

Commit:  0c75c2ba9475a2eb02807387375b88140d1137c3 → fcb36b1e57fc645c0372617711b2a9ec0423b77f 
Status:  needs_work → needs_review 
I have fixed this by changing the code of sage.structure.element.Matrix.div, which was assuming that the _matrix_times_matrix method of matrix.matrix_integer_dense would know how to deal with matrices over the rationals. This is a lowlevel private function which doesn't do type checking, which I think is the right thing to do.
What the current patch does is, when writing something like A/B for matrices A and B, to take the denominator out of ~B, multiply and then put it back. I have run make ptest and all passed except for some that have nothing to do with matrices, for example this one:
sage t src/sage/rings/integer.pyx ********************************************************************** File "src/sage/rings/integer.pyx", line 1954, in sage.rings.integer.Integer.__pow__ Failed example: 2^(2^632) Expected: Traceback (most recent call last): ... MemoryError: failed to allocate 1152921504606847008 bytes Got: Fatal Python error: Insufficient memory Traceback (most recent call last): File "/usr/local/sage/sage6.3.beta6/local/lib/python2.7/sitepackages/sage/doctest/forker.py", line 480, in _run self.execute(example, compiled, test.globs) File "/usr/local/sage/sage6.3.beta6/local/lib/python2.7/sitepackages/sage/doctest/forker.py", line 839, in execute exec compiled in globs File "<doctest sage.rings.integer.Integer.__pow__[27]>", line 1, in <module> Integer(2)**(Integer(2)**Integer(63)Integer(2)) File "integer.pyx", line 1999, in sage.rings.integer.Integer.__pow__ (build/cythonized/sage/rings/integer.c:14710) File "c_lib.pyx", line 85, in sage.ext.c_lib.sig_raise_exception (build/cythonized/sage/ext/c_lib.c:1040) RuntimeError: Aborted **********************************************************************
comment:48 Changed 8 years ago by
Status:  needs_review → needs_work 

The patchbot reports a segmentation fault in matrix_integer_dense.pyx
, which is likely due to this ticket.
comment:49 Changed 8 years ago by
I cannot reproduce it. And I don't know where the error comes from, other than the coercion model not checking for types before calling the lowlevel functions...
~/sagetestmarc$ ./sage t long src/sage/modular/modform/ambient_R.py Running doctests with ID 20140909084858b66cd1ea. Doctesting 1 file. sage t long warnlong 26.1 src/sage/modular/modform/ambient_R.py [26 tests, 29.09 s]  All tests passed!  Total time for all tests: 29.2 seconds cpu time: 27.7 seconds cumulative wall time: 29.1 seconds
comment:50 Changed 8 years ago by
Your last fix is almost certainly going to break over other rings. In any case, this change requires extra doctests over other rings.
I would advise the following: the matrix division coercion model bug is independent of this ticket. I recommend you to create a new ticket for that and make this ticket depend on that.
comment:51 followup: 53 Changed 8 years ago by
Status:  needs_work → needs_review 

I propose the following, which I think is a good solution (especially since the plan is to move matrices over rationals also to FLINT).
def __div__(left,right): return left * (~right)
I have tried this and it passes the tests. I will push the code in a minute.
comment:52 Changed 8 years ago by
Branch:  u/mmasdeu/168032 → u/mmasdeu/16803matflint3 

Commit:  fcb36b1e57fc645c0372617711b2a9ec0423b77f → 4cf706d0974ffc39af15e4b24b6e77b8bc984d53 
Last 10 new commits:
7069aec  Further cleanup

f1756fb  Fix include of fmpq_poly.pxi in Cython doctest

78d9bfc  Trac 16803: Initialize _rows and _entries only when needed (to save memory).

42243b2  Trac 16803: free _rows and _entries only when needed.

902fcc5  Trac 16803: No need to check for uninitialized pointers, so reverting

1df2b4d  Get rid of mpz_t_offset hacks

dc9ef8c  Fix mpz_t, mpq_t, mpf_t declarations

c2d5546  Use mpz_srcptr for padics pow_computer

d1635d4  Remove unused _lift_crt_rr_with_lcm() function

4cf706d  Trac 16803: fixed __div__ function.

comment:53 Changed 8 years ago by
Status:  needs_review → needs_work 

Replying to mmasdeu:
I propose the following, which I think is a good solution (especially since the plan is to move matrices over rationals also to FLINT).
def __div__(left,right): return left * (~right)I have tried this and it passes the tests.
You need to add more doctests to this __div__
function.
comment:54 Changed 8 years ago by
Commit:  4cf706d0974ffc39af15e4b24b6e77b8bc984d53 → 59d2a7b11c45338c59b5ed16c09167c2dec6809d 

Branch pushed to git repo; I updated commit sha1. New commits:
59d2a7b  Trac 16803: added doctests to __div__ function in structure/element.pyx

comment:56 Changed 8 years ago by
Reviewers:  William Stein → William Stein, Jeroen Demeyer 

Status:  needs_review → needs_work 
I really think more doctests are needed, also over rings which are not ZZ
or QQ
(see also comment 50). Perhaps GF(3)
and RDF
and ZZ['t']
to have some wider coverage?
And you should use the :trac:`16803`
syntax to refer to Trac tickets (but given that this ticket has nothing to do with division of matrices, perhaps it makes more sense to just remove that comment).
comment:58 Changed 8 years ago by
Commit:  59d2a7b11c45338c59b5ed16c09167c2dec6809d → 6095b103e1bf20752a58926a63a492bbf81cb004 

Branch pushed to git repo; I updated commit sha1. New commits:
6095b10  Added more tests.

comment:59 Changed 8 years ago by
Commit:  6095b103e1bf20752a58926a63a492bbf81cb004 → f9974ba608c96861627c3f01cc58c5030536e9bd 

Branch pushed to git repo; I updated commit sha1. New commits:
f9974ba  And some more.

comment:61 Changed 8 years ago by
Status:  needs_work → needs_review 

comment:62 Changed 8 years ago by
Status:  needs_review → needs_work 

In the last patches, you messed up the indentation from 4 to 3 spaces.
comment:63 Changed 8 years ago by
Commit:  f9974ba608c96861627c3f01cc58c5030536e9bd → 17bb2b784da9b2cecc40e8593fb32047ed6ae9cb 

Branch pushed to git repo; I updated commit sha1. New commits:
17bb2b7  Fixed wrong indentation.

comment:65 Changed 8 years ago by
Status:  needs_review → needs_work 

I think this still leaks memory.
The following command works without this patch, but fails with this patch:
( ulimit v 2000000; ./sage t long src/sage/combinat/root_system/branching_rules.py )
comment:66 Changed 8 years ago by
Commit:  17bb2b784da9b2cecc40e8593fb32047ed6ae9cb → cd815217e562f84118f53458b18cfd9b68c975a2 

comment:67 Changed 8 years ago by
Status:  needs_work → needs_review 

The bug reported in comment:65 may be related to an issue with infinite recursion. I traced it down to the modification of the div function. With the current patch the command in comment:65 works, and all the tests in sage/structure and sage/matrix pass. I am now running make ptest and will report if something arises.
comment:68 Changed 8 years ago by
Branch:  u/mmasdeu/16803matflint3 → u/mmasdeu/16803matflint4 

Commit:  cd815217e562f84118f53458b18cfd9b68c975a2 → 6359d72733219492dccba27caf10a04b909eda97 
I have rebased it again. It looks like some other code is a moving target and it is hard to keep pace...
Last 10 new commits:
2b87370  Trac 16803: No need to check for uninitialized pointers, so reverting

50cb2ae  Fix mpz_t, mpq_t, mpf_t declarations

e52c1ff  Remove unused _lift_crt_rr_with_lcm() function

fa5a4af  Trac 16803: fixed __div__ function.

1b86766  Trac 16803: added doctests to __div__ function in structure/element.pyx

3c6f808  Added more tests.

d87e348  And some more.

5b8ee2d  Fixed wrong indentation.

eab8a1e  Fixed bug introduced in outside package.

6359d72  Fixed compilation errors.

comment:69 Changed 8 years ago by
Status:  needs_review → positive_review 

Since test pass, and the issues Jereon found were addressed, I'm switching this back to positive review.
comment:70 Changed 8 years ago by
Status:  positive_review → needs_work 

This still fails, I'm pretty sure just or your branch as well:
sage t long warnlong 70.7 src/sage/structure/element.pyx ********************************************************************** File "src/sage/structure/element.pyx", line 2770, in sage.structure.element.Matrix.__div__ Failed example: a / b Expected: [0.159090909091 0.295454545455] [ 2.86363636364 0.681818181818] Got: [0.15909090909090906 0.29545454545454547] [ 2.863636363636364 0.6818181818181817] ********************************************************************** 1 item had failures: 1 of 22 in sage.structure.element.Matrix.__div__ [455 tests, 1 failure, 38.78 s]
comment:71 Changed 8 years ago by
Commit:  6359d72733219492dccba27caf10a04b909eda97 → 6757e11b36f7bc647eae1adcf636bed76fb3e85d 

Branch pushed to git repo; I updated commit sha1. New commits:
6757e11  Trac 16803: Fix a doctest for RDF matrices.

comment:72 Changed 8 years ago by
If I am not mistaken, it is the current output which is correct (I checked with Magma also). I had myself added this doctest last week, sorry!
comment:73 Changed 8 years ago by
Status:  needs_work → positive_review 

comment:74 Changed 8 years ago by
Numerical noise on 32bit, should be marked with a suitable # rel tol
sage t long src/sage/structure/element.pyx ********************************************************************** File "src/sage/structure/element.pyx", line 2770, in sage.structure.element.Matrix.__div__ Failed example: a / b Expected: [0.15909090909090906 0.29545454545454547] [ 2.863636363636364 0.6818181818181817] Got: [ 0.1590909090909091 0.29545454545454547] [ 2.863636363636364 0.6818181818181815] ********************************************************************** 1 item had failures:
comment:75 Changed 8 years ago by
Status:  positive_review → needs_work 

comment:76 Changed 8 years ago by
Commit:  6757e11b36f7bc647eae1adcf636bed76fb3e85d → 812a5099731dd5e819ebce0b19ee744de439a6ea 

Branch pushed to git repo; I updated commit sha1. New commits:
812a509  Trac 16803: Added rel tol to doctest.

comment:78 Changed 8 years ago by
Status:  needs_work → needs_review 

comment:79 Changed 8 years ago by
Status:  needs_review → positive_review 

Linear algebra should really give the right answer to a few ulp, and not just 1e10. But the test is about testing that the division operator works, so ok.
comment:80 Changed 8 years ago by
Branch:  u/mmasdeu/16803matflint4 → 812a5099731dd5e819ebce0b19ee744de439a6ea 

Resolution:  → fixed 
Status:  positive_review → closed 
comment:81 Changed 8 years ago by
Commit:  812a5099731dd5e819ebce0b19ee744de439a6ea 

comment:82 Changed 8 years ago by
Did any of the reviewers (Volker?) actually read the code on this ticket? I've started doing this and there are many things to be improved... perhaps this ticket was merged too fast.
comment:83 Changed 8 years ago by
Is it perfect? No. But better than before? IMHO yes. Faster? For sure.
comment:84 followup: 85 Changed 8 years ago by
Replying to jdemeyer:
Did any of the reviewers (Volker?) actually read the code on this ticket? I've started doing this and there are many things to be improved...
I certainly read the version of the code 5 weeks ago, and had many, many, many suggestions for improvement, found numerous major bugs, etc.
perhaps this ticket was merged too fast.
One has to balance that with the fact that for whatever reason, without this ticket a vast range of linear algebra in Sage is so utterly orders of magnitude too slow, as to make it painful and useless for research work. This new code is dramatically faster than before.
comment:85 followup: 86 Changed 8 years ago by
Replying to was:
This new code is dramatically faster than before.
I only hope we're not trading correctness for speed.
comment:86 followups: 88 89 Changed 8 years ago by
Replying to jdemeyer:
Replying to was:
This new code is dramatically faster than before.
I only hope we're not trading correctness for speed.
Well when I looked over the code 5 weeks ago there are numerous memory leaks and other causes for concern (e.g., unitialized memory assumed to be 0). But those were I think all addressed. Did you find anything that is actually incorrect? Or does the overall code just make you unhappy and nervous? Or are you not happy building on FLINT?
comment:87 Changed 8 years ago by
I just have to add jdemeyer that I'm really glad you're looking at this too, since you have an amazing eye for quality (similar to your recent remarks about the pexpect interfaces).
comment:88 Changed 8 years ago by
Replying to was:
Did you find anything that is actually incorrect?
The segmentation fault in _lmul_
, which is the reason for creating #17090.
Or does the overall code just make you unhappy and nervous?
When looking at this code, there are some sloppy things (like why is the _det_pari()
function duplicated?). Overall, I have less faith in sloppy code than clear code.
Or are you not happy building on FLINT?
That's not the problem. In general, I think it's good to rely on external packages if they do a good job (which seems to be the case here).
comment:90 Changed 8 years ago by
What's with the changes in padics in this ticket? Surely, yet another mistake...
comment:92 followup: 93 Changed 8 years ago by
I must say that IMO some of the comments (82 and 90) made above are not very constructive. jdemeyer questions the thoroughness of the reviewing process, while clearly he himself didn't read the comments at the beginning of the ticket (at least those that refer to the convenience of leaving in the legacy functions).
After the experience with this ticket I feel less inclined to take on the analogous job for matrix_rational_dense. Sorry!
comment:93 followup: 94 Changed 8 years ago by
Replying to mmasdeu:
I must say that IMO some of the comments (82 and 90) made above are not very constructive.
82 was made out of frustration by seeing so many things here which are dubious. So okay, that's not constructive.
However in 90, I noticed a mistake, mentioned it in the comment and fixed it in #17090. How is that not constructive?
while clearly he himself didn't read the comments at the beginning of the ticket (at least those that refer to the convenience of leaving in the legacy functions).
That's true, but after William Stein's comment, I have fixed that back in #17090.
I feel less inclined to take on the analogous job for matrix_rational_dense.
Please don't. I think it's absolutely good to improve matrices like you did here. The fact that I am making so many comments and creating followup tickets means that I care. I make mistakes, you make mistakes, that's normal and that's why have this review process.
My only complaint (and I still stand behind this) is that this ticket was given positive_review too soon. Ideally, those 3 followup tickets should have been reviewer patches on this ticket.
comment:94 followups: 95 96 97 Changed 8 years ago by
Replying to jdemeyer:
82 was made out of frustration by seeing so many things here which are dubious. So okay, that's not constructive.
I can understand your frustration. But the bar is high enough (python + cython + sage oddities + legacy code + git + trac, and I am probably missing something here) that makes it very hard for people to contribute, and these comments do not help. But I take your last comment in good faith :).
Also, if there are other things that are dubious please share them because I (and possibly others!) would like to learn from it.
However in 90, I noticed a mistake, mentioned it in the comment and fixed it in #17090. How is that not constructive?
Surely I did not go and touch padics for no reason. These changes weren't there in the first version of the my patch, and I had to add them because during the time it took to from the first version until this ticket got closed other changes were being merged, and these made the patch to stop compiling. Changing those lines in padics is how I managed to fix it, but the hackish idea was not mine, I saw it used elsewhere. I appreciate you having fixed it back.
comment:95 Changed 8 years ago by
Replying to mmasdeu:
Surely I did not go and touch padics for no reason. These changes weren't there in the first version of the my patch, and I had to add them because during the time it took to from the first version until this ticket got closed other changes were being merged, and these made the patch to stop compiling.
I think you simply did something compiling Sage, because those changes to padics are totally unrelated to matrices. I cannot imagine how the change to matrices could break building padics or vice versa. And indeed, I simply undid the changes in #17090 without any bad consequences.
comment:96 Changed 8 years ago by
Replying to mmasdeu:
Replying to jdemeyer:
82 was made out of frustration by seeing so many things here which are dubious. So okay, that's not constructive.
I can understand your frustration. But the bar is high enough (python + cython + sage oddities + legacy code + git + trac, and I am probably missing something here) that makes it very hard for people to contribute, and these comments do not help. But I take your last comment in good faith :).
Marc  don't you want to be a bad ass computer programmer, in addition to mathematician? Just redo matrix_rational_dense, and you'll be way closer :)
comment:97 followup: 98 Changed 8 years ago by
Replying to mmasdeu:
Also, if there are other things that are dubious please share them because I (and possibly others!) would like to learn from it.
Well, you can look at the followup tickets #17090 and #17094 and see what I changed (and preferably review those tickets).
Some general things which haven't been mentioned yet:
 cleanup your code when you change things: when you remove code, try to remove everything related to the old code. When you change code, the old structure might not be applicable anymore, so refactor if needed (e.g. the sepatate branch for
n <= 4
indeterminant()
no longer serves any purpose)  also fix documentation: when you change something, also change the corresponding documentation. When you copy/paste something, be sure to update documentation and doctests (see the various
set_unsafe
methods).  don't add unneeded import statements or includes, those add needless extra dependencies. Like, why did you add
include "sage/libs/ntl/decl.pxi"
in several places when you don't use any NTL code?  try to use correct formatting: spacing, indentation, docstring formatting (this was mostly good, but a bit messed up in
src/module_list.py
). If anything, this makes your code look more professional and less sloppy.  don't use
assert
for checking user input: useassert
for when you know that something is true (but want to check just in case), not when you need to check that something is true.
comment:98 Changed 8 years ago by
Replying to jdemeyer:
Thanks! These comments are helpful indeed.
William  I rather try to be a better mathematician...it has the advantage that although you get constantly evaluated, the evaluations are mostly anonymous :). But that was in my todo list. And it still is, despite my previous comments in this ticket!
By the way, after rebasing it does not compile. I will fix it tomorrow hopefully.