Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update MPFI to 1.5.1 #12171

Closed
mwhansen opened this issue Dec 17, 2011 · 88 comments
Closed

Update MPFI to 1.5.1 #12171

mwhansen opened this issue Dec 17, 2011 · 88 comments

Comments

@mwhansen
Copy link
Contributor

This is needed for #11666.

Use http://perso.telecom-paristech.fr/~flori/sage/mpfi-1.5.1.spkg

Apply first attachment: trac_12171a.patch, then attachment: trac_12171b.patch

Depends on #12131
Depends on #12353

CC: @sagetrac-cwitty @robertwb @jdemeyer @jpflori

Component: packages: standard

Keywords: sd35 sd36

Author: Mike Hansen, Paul Zimmermann, Jean-Pierre Flori

Reviewer: François Bissey

Merged: sage-5.0.beta6

Issue created by migration from https://trac.sagemath.org/ticket/12171

@mwhansen mwhansen added this to the sage-4.8 milestone Dec 17, 2011
@mwhansen mwhansen changed the title Update MPIR to 1.5.0 Update MPFI to 1.5.0 Dec 17, 2011
@mwhansen
Copy link
Contributor Author

comment:2

There is spkg at http://sage.math.washington.edu/home/mhansen/mpfi-1.5.0.spkg

@kiwifb
Copy link
Member

kiwifb commented Dec 17, 2011

comment:3

Have you checked the following doctests:

sage -t -long "devel/sage/sage/rings/qqbar.py"              
**********************************************************************
File "/usr/share/sage/devel/sage/sage/rings/qqbar.py", line 3808:
    sage: (x-2).real_exact(RR)
Expected:
    0.000000000000000
Got:
    -0.000000000000000
**********************************************************************
File "/usr/share/sage/devel/sage/sage/rings/qqbar.py", line 3810:
    sage: (x-2).real_exact(RealField(53, rnd='RNDD'))
Expected:
    0.000000000000000
Got:
    -0.000000000000000
**********************************************************************
File "/usr/share/sage/devel/sage/sage/rings/qqbar.py", line 3812:
    sage: (x-2).real_exact(RealField(53, rnd='RNDU'))
Expected:
    0.000000000000000
Got:
    -0.000000000000000
**********************************************************************
File "/usr/share/sage/devel/sage/sage/rings/qqbar.py", line 3814:
    sage: (x-2).real_exact(RealField(53, rnd='RNDZ'))
Expected:
    0.000000000000000
Got:
    -0.000000000000000
**********************************************************************
1 items had failures:
   4 of  20 in __main__.example_96
***Test Failed*** 4 failures.

and

sage -t -long "devel/sage/sage/rings/real_mpfi.pyx"         
**********************************************************************
File "/usr/share/sage/devel/sage/sage/rings/real_mpfi.pyx", line 1078:
    sage: b = R(1)/R(0); b
Expected:
    [+infinity .. +infinity]
Got:
    [-infinity .. +infinity]
**********************************************************************
File "/usr/share/sage/devel/sage/sage/rings/real_mpfi.pyx", line 1080:
    sage: loads(dumps(b)) == b
Expected:
    True
Got:
    False
**********************************************************************
File "/usr/share/sage/devel/sage/sage/rings/real_mpfi.pyx", line 1082:
    sage: b = R(-1)/R(0); b
Expected:
    [-infinity .. -infinity]
Got:
    [-infinity .. +infinity]
**********************************************************************
File "/usr/share/sage/devel/sage/sage/rings/real_mpfi.pyx", line 1084:
    sage: loads(dumps(b)) == b
Expected:
    True
Got:
    False
**********************************************************************
File "/usr/share/sage/devel/sage/sage/rings/real_mpfi.pyx", line 2360:
    sage: R(1)/R(0)
Expected:
    [+infinity .. +infinity]
Got:
    [-infinity .. +infinity]
**********************************************************************
File "/usr/share/sage/devel/sage/sage/rings/real_mpfi.pyx", line 3217:
    sage: RIF(-1, 1).min(0).endpoints()
Expected:
    (-1.00000000000000, 0.000000000000000)
Got:
    (-1.00000000000000, -0.000000000000000)
**********************************************************************
File "/usr/share/sage/devel/sage/sage/rings/real_mpfi.pyx", line 3221:
    sage: RIF(-1, 1).min(0).endpoints()
Expected:
    (-1.00000000000000, 0.000000000000000)
Got:
    (-1.00000000000000, -0.000000000000000)
**********************************************************************
3 items had failures:
   4 of  18 in __main__.example_29
   1 of   8 in __main__.example_55
   2 of   9 in __main__.example_80
***Test Failed*** 7 failures.

I did those test about one year ago cschwan/sage-on-gentoo#30 so some things have probably changed a little bit but I expect you'll have to patch sage.

@zimmermann6
Copy link

comment:4

by the way, MPFI 1.5.0 fixes a limitation to 1000 characters in mpfi_set_str, which can be
demonstrated by the following test:

sage: R = RealIntervalField(53)
sage: R("1" * 1000)
1.111111111111112?e999

which failed previously. Maybe add a test for that?

Paul

@zimmermann6
Copy link

comment:5

two doctests are failing:

        sage -t  devel/sage-11666/sage/rings/qqbar.py # 4 doctests failed
        sage -t  devel/sage-11666/sage/rings/real_mpfi.pyx # 7 doctests failed

The issues are +0.0 versus -0.0, and also 1/0 which now gives [-Inf, +Inf]
instead of [+Inf, +Inf].

Paul

@zimmermann6
Copy link

comment:6

there is one important change in MPFI 1.5.0 which might cause the failures: mpfi_set_ui on
input 0 gives [+0.0,-0.0] instead of [+0.0,+0.0] previously. I will ask upstream why:

sage: R=RealIntervalField(53)
sage: a=R(0)
sage: a.lower(), a.upper()
(0.000000000000000, -0.000000000000000)

More annoying is the following, which I believe is a bug in MPFI 1.5.0:

sage: a=R(infinity)
sage: a.lower(), a.upper()
(+infinity, +infinity)
sage: b=1/a
sage: b.lower(), b.upper()
(0.000000000000000, -0.000000000000000)

(I would expect b=[+0.0,+0.0].)

Paul

@mwhansen
Copy link
Contributor Author

Changed keywords from none to sd35

@zimmermann6
Copy link

comment:8

the detailed failures (on a 32-bit computer) are:


macaron% ./sage -t devel/sage-12171/sage/rings/real_mpfi.pyx 
sage -t  "devel/sage-12171/sage/rings/real_mpfi.pyx"        
**********************************************************************
File "/localdisk/tmp/sage-4.7.2/devel/sage-12171/sage/rings/real_mpfi.pyx", line 4142:
    sage: 0 in (RealField(2000)(-19/3).gamma() - RealIntervalField(1000)(-19/3).gamma())
Expected:
    True
Got:
    False
**********************************************************************
File "/localdisk/tmp/sage-4.7.2/devel/sage-12171/sage/rings/real_mpfi.pyx", line 1082:
    sage: b = R(1)/R(0); b
Expected:
    [+infinity .. +infinity]
Got:
    [-infinity .. +infinity]
**********************************************************************
File "/localdisk/tmp/sage-4.7.2/devel/sage-12171/sage/rings/real_mpfi.pyx", line 1084:
    sage: loads(dumps(b)) == b
Expected:
    True
Got:
    False
**********************************************************************
File "/localdisk/tmp/sage-4.7.2/devel/sage-12171/sage/rings/real_mpfi.pyx", line 1086:
    sage: b = R(-1)/R(0); b
Expected:
    [-infinity .. -infinity]
Got:
    [-infinity .. +infinity]

**********************************************************************
File "/localdisk/tmp/sage-4.7.2/devel/sage-12171/sage/rings/real_mpfi.pyx", line 1088:
    sage: loads(dumps(b)) == b
Expected:
    True
Got:
    False
**********************************************************************
File "/localdisk/tmp/sage-4.7.2/devel/sage-12171/sage/rings/real_mpfi.pyx", line 2364:
    sage: R(1)/R(0)
Expected:
    [+infinity .. +infinity]
Got:
    [-infinity .. +infinity]
**********************************************************************
File "/localdisk/tmp/sage-4.7.2/devel/sage-12171/sage/rings/real_mpfi.pyx", line 3221:
    sage: RIF(-1, 1).min(0).endpoints()
Expected:
    (-1.00000000000000, 0.000000000000000)
Got:
    (-1.00000000000000, -0.000000000000000)
**********************************************************************
File "/localdisk/tmp/sage-4.7.2/devel/sage-12171/sage/rings/real_mpfi.pyx", line 3225:
    sage: RIF(-1, 1).min(0).endpoints()
Expected:
    (-1.00000000000000, 0.000000000000000)
Got:
    (-1.00000000000000, -0.000000000000000)

**********************************************************************
4 items had failures:
   1 of  19 in __main__.example_117
   4 of  19 in __main__.example_29
   1 of   9 in __main__.example_55
   2 of  10 in __main__.example_80
***Test Failed*** 8 failures.
For whitespace errors, see the file /users/caramel/zimmerma/.sage//tmp/real_mpfi_8949.py
         [8.1 s]

and:


macaron% ./sage -t devel/sage-12171/sage/rings/qqbar.py 
sage -t  "devel/sage-12171/sage/rings/qqbar.py"             
**********************************************************************
File "/localdisk/tmp/sage-4.7.2/devel/sage-12171/sage/rings/qqbar.py", line 4003:
    sage: (x-2).real_exact(RR)
Expected:
    0.000000000000000
Got:
    -0.000000000000000
**********************************************************************
File "/localdisk/tmp/sage-4.7.2/devel/sage-12171/sage/rings/qqbar.py", line 4005:
    sage: (x-2).real_exact(RealField(53, rnd='RNDD'))
Expected:
    0.000000000000000
Got:
    -0.000000000000000
**********************************************************************
File "/localdisk/tmp/sage-4.7.2/devel/sage-12171/sage/rings/qqbar.py", line 4007:
    sage: (x-2).real_exact(RealField(53, rnd='RNDU'))
Expected:
    0.000000000000000
Got:
    -0.000000000000000
**********************************************************************
File "/localdisk/tmp/sage-4.7.2/devel/sage-12171/sage/rings/qqbar.py", line 4009:
    sage: (x-2).real_exact(RealField(53, rnd='RNDZ'))

Expected:
    0.000000000000000
Got:
    -0.000000000000000
**********************************************************************
1 items had failures:
   4 of  21 in __main__.example_101
***Test Failed*** 4 failures.

Paul

@zimmermann6
Copy link

comment:9

the first issue with gamma seems to be due to that bug in Sage:

sage: RealIntervalField(54)(-19/3) > 1.462
True

(works for precision 53 or less).

Paul

@zimmermann6
Copy link

comment:10

I got a message from the developers of the Sollya package who say that they had similar
problems when upgrading to MPFI 1.5.0. Their solution was to write a wrapper around
MPFI to give sense to intervals like [+Inf,+Inf].

Paul

@zimmermann6
Copy link

comment:11

the problem from comment [comment:9] seems to only apply on 32-bit machines. I'll first try to
solve problems on 64-bit. There is one strange thing with the patch applied:

sage: x = AA(2).sqrt()^2
sage: (x-2).real_exact(RR)
0.000000000000000
sage: x.real_exact(RR)
2.00000000000000
sage: (x-2).real_exact(RR)
-0.000000000000000

The MPFI developers claim that in MPFI 1.5 the sign of 0 is irrelevant, but this is still a
non-deterministic issue.

Paul

@zimmermann6
Copy link

Attachment: trac_12171a.patch.gz

@zimmermann6
Copy link

comment:12

the attached trac_12171a.patch fixes all issues but two on 64-bit. The remaining issues
are related to loads(dumps(b)) == b:

File "/usr/local/sage-4.7.2/sage/devel/sage-12171/sage/rings/real_mpfi.pyx", line 1084:
    sage: loads(dumps(b)) == b
Expected:
    True
Got:
    False
**********************************************************************
File "/usr/local/sage-4.7.2/sage/devel/sage-12171/sage/rings/real_mpfi.pyx", line 1088:
    sage: loads(dumps(b)) == b
Expected:
    True
Got:
    False

I see in real_mpfi.pyx that other similar tests are failing and were rewritten in a
different way:

sage: R = RealIntervalField(4000)
sage: s = 1/R(3)
sage: t = loads(dumps(s))
sage: (t.upper(), t.lower()) == (s.upper(), s.lower())
True

Indeed t==s fails:

sage: t == s
False

Should I also rewrite the 2 failing tests like this? What is the reason for the failures?

Paul

@zimmermann6
Copy link

comment:13

Should I also rewrite the 2 failing tests like this? What is the reason for the failures?

Robert, Mike, are you there?

Paul

@zimmermann6
Copy link

comment:14

Jeroen, since I got no answer to my question I ask you: do you have an idea how to proceed?

Paul

@mwhansen
Copy link
Contributor Author

comment:15

Hi Paul, sorry for the delay; I've been busy with traveling back to the states / the holidays. I'll look into why these are failing today. I started while I was in Warwick, but didn't make much progress.

@kiwifb
Copy link
Member

kiwifb commented Dec 31, 2011

comment:17

Replying to @zimmermann6:

I see in real_mpfi.pyx that other similar tests are failing and were rewritten in a
different way:

sage: R = RealIntervalField(4000)
sage: s = 1/R(3)
sage: t = loads(dumps(s))
sage: (t.upper(), t.lower()) == (s.upper(), s.lower())
True

Indeed t==s fails:

sage: t == s
False

Should I also rewrite the 2 failing tests like this? What is the reason for the failures?

This is quite strange I cannot think of a reason this would fail unless the "==" operator is doing something slightly wrong or something unexpected.

@zimmermann6
Copy link

comment:18

ok I understand why the following "fails":

sage: R = RealIntervalField(100)
sage: s = 1/R(3)
sage: t = loads(dumps(s))
sage: t == s
False

In the real_mpfi.pyx file, it is said that s cmp t returns True if a cmp b is true for any
element a in s and any element b in t. Obviously when cmp is == and t is the same interval as s
this can hold only when both are the same point interval. Thus to check if s and t are the same
interval, we should write:

sage: (t.upper(), t.lower()) == (s.upper(), s.lower())
True

Paul

@zimmermann6
Copy link

this patch should be applied after trac_12171a.patch

@zimmermann6
Copy link

comment:19

Attachment: trac_12171b.patch.gz

the second patch attached fixes the remaining failing tests. Ready for review.

Paul

@zimmermann6

This comment has been minimized.

@zimmermann6
Copy link

comment:63

Francois,

I just built Sage 5.0.beta1 on another 64 bit linux (Core2 under Ubuntu 10.10) and got:

tarte% ./sage
----------------------------------------------------------------------
| Sage Version 5.0.beta1, Release Date: 2012-01-22                   |
| Type notebook() for the GUI, and license() for information.        |
----------------------------------------------------------------------
**********************************************************************
*                                                                    *
* Warning: this is a prerelease version, and it may be unstable.     *
*                                                                    *
**********************************************************************
sage: RealIntervalField(53)(-1) > RR(1)
False
sage: RealIntervalField(54)(-1) > RR(1)
True

Paul

@kiwifb
Copy link
Member

kiwifb commented Jan 28, 2012

comment:64

This is way more subtle than I thought then. I did my tests without #11666, did you use #11666 as well as this one?

@zimmermann6
Copy link

comment:65

Francois,

no, I didn't use #11666. Can anybody reproduce the problem I have (cf #12353)?
Anyway I believe this is independent from this ticket, since it already happened before
(e.g., in Sage 4.7.2). Thus it should not prevent a positive review, if this is the only
remaining issue, and we should solve #12353 independently.

Paul

@jdemeyer
Copy link

comment:66

Everything I said was without #11666.

@kiwifb
Copy link
Member

kiwifb commented Jan 30, 2012

comment:67

Replying to @zimmermann6:

Francois,

no, I didn't use #11666. Can anybody reproduce the problem I have (cf #12353)?
Anyway I believe this is independent from this ticket, since it already happened before
(e.g., in Sage 4.7.2). Thus it should not prevent a positive review, if this is the only
remaining issue, and we should solve #12353 independently.

I can reproduce it on OS X 10.5.8 (32bit) and linux on ppc64, but not on linux x86_64. You are probably right that's an orthogonal problem if it can happen as well in the current version of sage.

@zimmermann6
Copy link

comment:68

since this ticket got a positive review at comment [comment:49], and the doctest
failure at comment [comment:50] is a separate issue (#12353) I put this back as "needs review".

Paul

@jdemeyer
Copy link

comment:69

If nothing on this ticket changed, I guess we're back to positive review with a dependency on #12353.

@jdemeyer
Copy link

Changed dependencies from #12131 to #12131, #12353

@zimmermann6
Copy link

comment:70

Replying to @jdemeyer:

If nothing on this ticket changed, I guess we're back to positive review with a dependency on #12353.

great! I'm working in #12353.

Paul

@zimmermann6
Copy link

comment:71

Jeroen, now that #12353 has been fixed, you can merge this one too.

Paul

@jdemeyer
Copy link

comment:72

Replying to @zimmermann6:

Jeroen, now that #12353 has been fixed, you can merge this one too.

Don't worry, it's on my radar and should be merged in sage-5.0.beta5 if no further problems arise.

@jdemeyer
Copy link

comment:73

In spkg-install, you should unset RM as old Sage versions set RM=rm which breaks libtool. For example, when upgrading from sage-4.5.3:

/bin/bash ../libtool --tag=CC   --mode=link gcc  -O2 -g -fPIC  -L/mnt/usb1/scratch/buildbot/sage/sage-1/sage_upgrade/build/sage-4.5.3-5.0.beta5/local/lib -L/mnt/usb1/scratch/buildbot/sage/sage-1/sage_upgrade/build/sage-4.5.3-5.0.beta5/local/lib  -o libmpfi.la -rpath /mnt/usb1/scratch/buildbot/sage/sage-1/sage_upgrade/build/sage-4.5.3-5.0.beta5/local/lib abs.lo acos.lo acosh.lo add.lo add_d.lo add_fr.lo add_q.lo add_si.lo add_ui.lo add_z.lo alea.lo asin.lo asinh.lo atan2.lo atan.lo atanh.lo bisect.lo blow.lo cbrt.lo clear.lo cmp.lo cmp_sym_pi.lo constants.lo cos.lo cosh.lo csc.lo csch.lo cot.lo coth.lo d_div.lo d_sub.lo diam.lo div.lo div_2exp.lo div_2si.lo div_2ui.lo div_d.lo div_fr.lo div_q.lo div_si.lo div_ui.lo div_z.lo error.lo exp.lo exp2.lo expm1.lo fr_div.lo fr_sub.lo get_endpoints.lo get_fr.lo get_d.lo get_prec.lo get_version.lo has_zero.lo hypot.lo increase.lo init.lo intersect.lo interv_d.lo interv_fr.lo interv_q.lo interv_si.lo interv_ui.lo interv_z.lo inp_str.lo inv.lo is_empty.lo is_inside.lo log.lo log10.lo log1p.lo log2.lo mag.lo mid.lo mig.lo mul.lo mul_2exp.lo mul_2si.lo mul_2ui.lo mul_d.lo mul_fr.lo mul_q.lo mul_si.lo mul_ui.lo mul_z.lo neg.lo out_str.lo predicates.lo print_binary.lo put.lo put_d.lo put_fr.lo put_q.lo put_si.lo put_ui.lo put_z.lo q_div.lo q_sub.lo quadrant.lo revert_if_needed.lo round_prec.lo sec.lo sech.lo set.lo set_d.lo set_fr.lo set_prec.lo set_q.lo set_si.lo set_str.lo set_ui.lo set_z.lo si_div.lo si_sub.lo sign.lo sin.lo sinh.lo sqr.lo sqrt.lo sub.lo sub_d.lo sub_fr.lo sub_q.lo sub_si.lo sub_ui.lo sub_z.lo swap.lo tan.lo tanh.lo ui_div.lo ui_sub.lo union.lo urandom.lo z_div.lo z_sub.lo  -lmpfr -lgmp
libtool: link: gcc -shared  -fPIC -DPIC  .libs/abs.o .libs/acos.o .libs/acosh.o .libs/add.o .libs/add_d.o .libs/add_fr.o .libs/add_q.o .libs/add_si.o .libs/add_ui.o .libs/add_z.o .libs/alea.o .libs/asin.o .libs/asinh.o .libs/atan2.o .libs/atan.o .libs/atanh.o .libs/bisect.o .libs/blow.o .libs/cbrt.o .libs/clear.o .libs/cmp.o .libs/cmp_sym_pi.o .libs/constants.o .libs/cos.o .libs/cosh.o .libs/csc.o .libs/csch.o .libs/cot.o .libs/coth.o .libs/d_div.o .libs/d_sub.o .libs/diam.o .libs/div.o .libs/div_2exp.o .libs/div_2si.o .libs/div_2ui.o .libs/div_d.o .libs/div_fr.o .libs/div_q.o .libs/div_si.o .libs/div_ui.o .libs/div_z.o .libs/error.o .libs/exp.o .libs/exp2.o .libs/expm1.o .libs/fr_div.o .libs/fr_sub.o .libs/get_endpoints.o .libs/get_fr.o .libs/get_d.o .libs/get_prec.o .libs/get_version.o .libs/has_zero.o .libs/hypot.o .libs/increase.o .libs/init.o .libs/intersect.o .libs/interv_d.o .libs/interv_fr.o .libs/interv_q.o .libs/interv_si.o .libs/interv_ui.o .libs/interv_z.o .libs/inp_str.o .libs/inv.o .libs/is_empty.o .libs/is_inside.o .libs/log.o .libs/log10.o .libs/log1p.o .libs/log2.o .libs/mag.o .libs/mid.o .libs/mig.o .libs/mul.o .libs/mul_2exp.o .libs/mul_2si.o .libs/mul_2ui.o .libs/mul_d.o .libs/mul_fr.o .libs/mul_q.o .libs/mul_si.o .libs/mul_ui.o .libs/mul_z.o .libs/neg.o .libs/out_str.o .libs/predicates.o .libs/print_binary.o .libs/put.o .libs/put_d.o .libs/put_fr.o .libs/put_q.o .libs/put_si.o .libs/put_ui.o .libs/put_z.o .libs/q_div.o .libs/q_sub.o .libs/quadrant.o .libs/revert_if_needed.o .libs/round_prec.o .libs/sec.o .libs/sech.o .libs/set.o .libs/set_d.o .libs/set_fr.o .libs/set_prec.o .libs/set_q.o .libs/set_si.o .libs/set_str.o .libs/set_ui.o .libs/set_z.o .libs/si_div.o .libs/si_sub.o .libs/sign.o .libs/sin.o .libs/sinh.o .libs/sqr.o .libs/sqrt.o .libs/sub.o .libs/sub_d.o .libs/sub_fr.o .libs/sub_q.o .libs/sub_si.o .libs/sub_ui.o .libs/sub_z.o .libs/swap.o .libs/tan.o .libs/tanh.o .libs/ui_div.o .libs/ui_sub.o .libs/union.o .libs/urandom.o .libs/z_div.o .libs/z_sub.o   -Wl,-rpath -Wl,/mnt/usb1/scratch/buildbot/sage/sage-1/sage_upgrade/build/sage-4.5.3-5.0.beta5/local/lib -Wl,-rpath -Wl,/mnt/usb1/scratch/buildbot/sage/sage-1/sage_upgrade/build/sage-4.5.3-5.0.beta5/local/lib -L/mnt/usb1/scratch/buildbot/sage/sage-1/sage_upgrade/build/sage-4.5.3-5.0.beta5/local/lib /mnt/usb1/scratch/buildbot/sage/sage-1/sage_upgrade/build/sage-4.5.3-5.0.beta5/local/lib/libmpfr.so /mnt/usb1/scratch/buildbot/sage/sage-1/sage_upgrade/build/sage-4.5.3-5.0.beta5/local/lib/libgmp.so  -O2   -Wl,-soname -Wl,libmpfi.so.0 -o .libs/libmpfi.so.0.0.0
libtool: link: (cd ".libs" && rm "libmpfi.so.0" && ln -s "libmpfi.so.0.0.0" "libmpfi.so.0")
rm: cannot remove `libmpfi.so.0': No such file or directory
make[2]: *** [libmpfi.la] Error 1

@jpflori
Copy link

jpflori commented Feb 22, 2012

comment:74

An updated package is available at the same address.

I also added a mecurial tag for mpfi-1.5.1.

@vbraun
Copy link
Member

vbraun commented Feb 22, 2012

Changed keywords from sd35 to sd35 sd36

@vbraun
Copy link
Member

vbraun commented Feb 22, 2012

comment:75

Looks good!

@jdemeyer
Copy link

Merged: sage-5.0.beta6

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

7 participants