Differences between revisions 23 and 24
Revision 23 as of 2009-02-05 11:17:03
Size: 17433
Comment: add a note about this page being outdated and refer back to the main Solaris porting page
Revision 24 as of 2022-04-05 02:15:00
Size: 0
Editor: mkoeppe
Comment: outdated
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
= Sage 3.2.3 on Solaris x86 build notes =

'''Note''': This page is outdated. Please check the [[solaris|main Solaris bit porting page]] for the current status.

== Build Issues ==

With gfortran 4.2.4 the root finding code in numpy is broken among other things. This causes the following problems:

 * numpy's root finding code segfaults when linked against ATLAS - no solution yet, but as a workaround build numpy without ATLAS support
 * scipy's special functions like Ei(10) cause segfaults. This might also be Solaris vs. ATLAS related.

Using gfortran 4.3.x fixes the problem.

== Fixes ==

Here are some patches for the fixes below:

 * [[attachment:3.2.3.final-solaris-fixes.patch]]
 * [[attachment:3.2.3.final-solaris-getrusage.patch]]
 * [[attachment:3.2.3.final-solaris-misc-fixes.patch]]
 * [[attachment:3.2.3.final-solaris-ell_rational_field.py-noise.patch]] (fixes the numerical noise issue)

=== Upgrade gnucrypt to 1.4.3 release to fix entropy issue ===

gnucrypt 1.4.0 needs too much entropy at startup - an upgrade to 1.4.3 fixes that. From the release notes of version 1.4.1 (2008-04-25):
{{{
  Fixed a bug introduced by 1.3.1 which led to the comsumption of far
   too much entropy for the intial seeding.
}}}

=== sage-native-execute is using bashism ===
{{{
diff -r 396119818b99 sage-native-execute
--- a/sage-native-execute Fri Jan 02 14:18:47 2009 -0800
+++ b/sage-native-execute Thu Jan 08 03:15:44 2009 -0500
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/usr/bin/env bash
 
 export LD_LIBRARY_PATH=$SAGE_ORIG_LD_LIBRARY_PATH
 if [ `uname` = 'Darwin' ]; then
}}}

=== interface/singular.py pexpect hangs ===
Singular seems to be limited to about 180 characters via the pexpect interface. Applying this patch works around that limitation by using the file interface:
{{{
diff -r e69ceb84399b sage/interfaces/singular.py
--- a/sage/interfaces/singular.py Fri Jan 02 23:01:05 2009 -0500
+++ b/sage/interfaces/singular.py Sat Jan 10 13:29:09 2009 -0500
@@ -316,7 +316,7 @@
                         restart_on_ctrlc = True,
                         verbose_start = False,
                         logfile = logfile,
- eval_using_file_cutoff=1000)
+ eval_using_file_cutoff=100)
         self.__libs = []
         self._prompt_wait = prompt
         self.__to_clear = [] # list of variable names that need to be cleared.
}}}

William commented in IRC:
{{{
[9:28pm] wstein: mabs -- that singular pexpect fix -- you should make it only happen on solaris.
[9:28pm] mabs: yes
[9:28pm] wstein: Since there could be a big performance impact on other systems.
[9:28pm] wstein: I would do that by writing
[9:28pm] wstein: eval_using_file_cutoff=None
[9:28pm] mabs: I just put up dirty fixes on the wiki page
[9:28pm] wstein: then in the first line of code set it.
[9:28pm] wstein: Or use
[9:28pm] wstein: eval_using_file_cutoff=100 if is_solaris else 1000
[9:29pm] wstein: where is_solaris is whatever code says it's solaris.
}}}

=== NaN vs. nan and Infinity vs. inf in real_double.pyx ===
{{{
**********************************************************************
File "/home/mabshoff/build-3.2.3.final/sage-3.2.3.final-fulvia/devel/sage/sage/rings/real_double.pyx", line 1311:
    sage: RDF(0).log()
Expected:
    -inf
Got:
    -Infinity
**********************************************************************
File "/home/mabshoff/build-3.2.3.final/sage-3.2.3.final-fulvia/devel/sage/sage/rings/real_double.pyx", line 1313:
    sage: RDF(-1).log()
Expected:
    nan
Got:
    -NaN
}}}
This is fixed by the following patch since we now rely on GSL again instead of the underlying libc representation:
{{{
diff -r e69ceb84399b sage/rings/real_double.pyx
--- a/sage/rings/real_double.pyx Fri Jan 02 23:01:05 2009 -0500
+++ b/sage/rings/real_double.pyx Sat Jan 10 19:05:27 2009 -0500
@@ -1283,9 +1283,9 @@
     cdef _log_base(self, double log_of_base):
         if self._value < 2:
             if self._value == 0:
- return -1./0
+ return RDF(-1)/RDF(0)
             if self._value < 0:
- return 0./0
+ return RDF(0)/RDF(0)
             _sig_on
             a = self._new_c(gsl_sf_log_1plusx(self._value - 1) / log_of_base)
             _sig_off
}}}

=== nan vs. NaN in complex_double.pyx ===
{{{
**********************************************************************
File "/home/mabshoff/build-3.2.3.final/sage-3.2.3.final-fulvia/devel/sage/sage/rings/complex_double.pyx", line 895:
    sage: ~(0*CDF(0,1))
Expected:
    nan + nan*I
Got:
    -NaN + NaN*I
**********************************************************************
}}}
The following terrible hack fixes that problem:
{{{
diff -r e69ceb84399b sage/rings/complex_double.pyx
--- a/sage/rings/complex_double.pyx Fri Jan 02 23:01:05 2009 -0500
+++ b/sage/rings/complex_double.pyx Sat Jan 10 19:30:41 2009 -0500
@@ -789,7 +789,8 @@
             s = s+"%s*I"%y
         if len(s) == 0:
             s = "0"
- return s
+ s_clean=s.replace("NaN","nan").replace("-nan","nan")
+ return s_clean
 
     def _latex_(self):
         """
}}}

=== Numerical noise in sage/rings/qqbar.py ===
{{{
[4:36pm] mabs: cwitty: I have another interesting bug for you:
[4:36pm] mabs: File "/home/mabshoff/build-3.2.3.final/sage-3.2.3.final-fulvia/devel/sage/sage/rings/qqbar.py", line 3826:
[4:36pm] mabs: sage: cp.complex_roots(30, 1)
[4:36pm] mabs: Expected:
[4:36pm] mabs: [1.189207115002721?,
[4:36pm] mabs: -1.189207115002721?,
[4:36pm] mabs: 1.189207115002721?*I,
[4:36pm] mabs: -1.189207115002721?*I]
[4:36pm] mabs: Got:
[4:36pm] mabs: [1.189207115002721?, -1.189207115002722?, 1.189207115002721?*I, -1.189207115002721?*I]
[4:37pm] mabs: Notice that the second and third entries are different?
[4:37pm] mabs: Ehh, the second only
[4:38pm] cwitty: Yes. It's probably not a bug; complex_roots doesn't guarantee to find the tightest possible
interval, and it depends on ATLAS which doesn't guarantee identical results.
[4:38pm] mabs: ok
[4:38pm] mabs: Should I use "..." then?
[4:38pm] cwitty: Yes.
}}}
Here is a patch for the qqbar.py issue with a little explanation:
{{{
diff -r e69ceb84399b sage/rings/qqbar.py
--- a/sage/rings/qqbar.py Fri Jan 02 23:01:05 2009 -0500
+++ b/sage/rings/qqbar.py Sat Jan 10 19:47:10 2009 -0500
@@ -3823,9 +3823,13 @@
         EXAMPLES:
             sage: x = polygen(ZZ)
             sage: cp = AA.common_polynomial(x^4 - 2)
+
+ Note that the precision is not guaraneteed to find the tightest possible interval
+ since complex_roots() depends on the underlying BLAS implementation.
+
             sage: cp.complex_roots(30, 1)
             [1.189207115002721?,
- -1.189207115002721?,
+ -1.18920711500272...?,
              1.189207115002721?*I,
              -1.189207115002721?*I]
         """
}}}

 * Other fixes to the Sage library: 3.2.3.final-solaris-fixes.patch, 3.2.3.final-solaris-getrusage-.patch

=== sympow FPU 53 bit control word setup ===

Sympow only works when the FPU control word is set to 53 bit rounding precision. The following code is a x86 compatible version of fpu.c of Sympow:
{{{
void fpu_53bits()
{
printf("Setting cpu control word\n");
 unsigned short _ncw = (0x027f);
__asm__ __volatile__ ("fldcw %0" : : "m" (*&_ncw));
}
}}}
Note that this needs to be guarded by the usual flags for x86 and amd64 Solaris. The complete list of fixes required:

 * add i86pc
 * make x86 check independent of Linux or add Solaris/x86 specific fpu.c section
 * -O3 to -O1 seems to core dump on Solaris/x86, -O0 seems to work

This fixes two doctests:
{{{
        sage -t "devel/sage/sage/modular/abvar/abvar.py"
        sage -t "devel/sage/sage/lfunctions/sympow.py"
}}}

=== Numerical Noise in point counting code (schemes/elliptic_curves/ell_rational_field.py) ===

The problem is that the inital bound is different:
{{{
< initial bound 2.62270974833656e117
---
> initial bound 2.62270974833657e117
}}}
In its full glory:
{{{
sage -t "devel/sage/sage/schemes/elliptic_curves/ell_rational_field.py"
**********************************************************************
File "/home/mabshoff/build-3.2.3.final/sage-3.2.3.final-fulvia/devel/sage/sage/schemes/elliptic_curves/ell_rational_field.py", line 4640:
    sage: a=E.S_integral_points(S=[2,3], mw_base=[P1,P2,P3], verbose=True);a
Expected:
    max_S: 3 len_S: 3 len_tors: 1
    lambda 0.485997517468...
    k1,k2,k3,k4 6.68597129142710e234 1.31952866480763 3.31908110593519e9 2.42767548272846e17
    mw_base [(1 : -1 : 1), (2 : 0 : 1), (0 : -3 : 1)]
    mw_base_log [0.667789378224099, 0.552642660712417, 0.818477222895703]
    mp [5, 7]
    mw_base_p_log [[2^2 + 2^3 + 2^6 + 2^7 + 2^8 + 2^9 + 2^14 + 2^15 + 2^18 + 2^19 + O(2^20), 2^2 + 2^3 + 2^5 + 2^6 + 2^9 + 2^11 + 2^12 + 2^14 + 2^15 + 2^16 + 2^18 + O(2^20), 2 + 2^3 + 2^6 + 2^7 + 2^8 + 2^9 + 2^11 + 2^12 + 2^13 + 2^16 + 2^17 + 2^19 + O(2^20)], [2*3^2 + 2*3^5 + 2*3^6 + 2*3^7 + 3^8 + 3^9 + 2*3^10 + 3^12 + 2*3^14 + 3^15 + 3^17 + 2*3^19 + O(3^20), 2*3 + 2*3^2 + 2*3^3 + 2*3^4 + 2*3^6 + 2*3^7 + 2*3^8 + 3^10 + 2*3^12 + 3^13 + 2*3^14 + 3^15 + 3^18 + O(3^20), 3 + 3^2 + 2*3^3 + 3^6 + 2*3^7 + 2*3^8 + 3^9 + 2*3^11 + 2*3^12 + 2*3^13 + 3^15 + 2*3^16 + 3^18 + 2*3^19 + O(3^20)]]
    k5,k6,k7 0.321154513240... 1.55246328915... 0.161999172489...
    initial bound 2.62270974833657e117
    bound_list [58, 58, 58]
    bound_list [8, 9, 9]
    bound_list [8, 7, 7]
    bound_list [8, 7, 7]
    starting search of points using coefficient bound 8
    x-coords of S-integral points via linear combination of mw_base and torsion:
    [-3, -26/9, -8159/2916, -2759/1024, -151/64, -1343/576, -2, -7/4, -1, -47/256, 0, 1/4, 4/9, 9/16, 58/81, 7/9, 6169/6561, 1, 17/16, 2, 33/16, 172/81, 9/4, 25/9, 3, 31/9, 4, 25/4, 1793/256, 8, 625/64, 11, 14, 21, 37, 52, 6142/81, 93, 4537/36, 342, 406, 816, 207331217/4096]
    starting search of extra S-integer points with absolute value bounded by 3.89321964979420
    x-coords of points with bounded absolute value
    [-3, -2, -1, 0, 1, 2]
    Total number of S-integral points: 43
    [(-3 : 0 : 1), (-26/9 : 28/27 : 1), (-8159/2916 : 233461/157464 : 1), (-2759/1024 : 60819/32768 : 1), (-151/64 : 1333/512 : 1), (-1343/576 : 36575/13824 : 1), (-2 : 3 : 1), (-7/4 : 25/8 : 1), (-1 : 3 : 1), (-47/256 : 9191/4096 : 1), (0 : 2 : 1), (1/4 : 13/8 : 1), (4/9 : 35/27 : 1), (9/16 : 69/64 : 1), (58/81 : 559/729 : 1), (7/9 : 17/27 : 1), (6169/6561 : 109871/531441 : 1), (1 : 0 : 1), (17/16 : -25/64 : 1), (2 : 0 : 1), (33/16 : 17/64 : 1), (172/81 : 350/729 : 1), (9/4 : 7/8 : 1), (25/9 : 64/27 : 1), (3 : 3 : 1), (31/9 : 116/27 : 1), (4 : 6 : 1), (25/4 : 111/8 : 1), (1793/256 : 68991/4096 : 1), (8 : 21 : 1), (625/64 : 14839/512 : 1), (11 : 35 : 1), (14 : 51 : 1), (21 : 95 : 1), (37 : 224 : 1), (52 : 374 : 1), (6142/81 : 480700/729 : 1), (93 : 896 : 1), (4537/36 : 305425/216 : 1), (342 : 6324 : 1), (406 : 8180 : 1), (816 : 23309 : 1), (207331217/4096 : 2985362173625/262144 : 1)]
Got:
    max_S: 3 len_S: 3 len_tors: 1
    lambda 0.485997517468082
    k1,k2,k3,k4 6.68597129142710e234 1.31952866480763 3.31908110593519e9 2.42767548272846e17
    mw_base [(1 : -1 : 1), (2 : 0 : 1), (0 : -3 : 1)]
    mw_base_log [0.667789378224099, 0.552642660712417, 0.818477222895703]
    mp [5, 7]
    mw_base_p_log [[2^2 + 2^3 + 2^6 + 2^7 + 2^8 + 2^9 + 2^14 + 2^15 + 2^18 + 2^19 + O(2^20), 2^2 + 2^3 + 2^5 + 2^6 + 2^9 + 2^11 + 2^12 + 2^14 + 2^15 + 2^16 + 2^18 + O(2^20), 2 + 2^3 + 2^6 + 2^7 + 2^8 + 2^9 + 2^11 + 2^12 + 2^13 + 2^16 + 2^17 + 2^19 + O(2^20)], [2*3^2 + 2*3^5 + 2*3^6 + 2*3^7 + 3^8 + 3^9 + 2*3^10 + 3^12 + 2*3^14 + 3^15 + 3^17 + 2*3^19 + O(3^20), 2*3 + 2*3^2 + 2*3^3 + 2*3^4 + 2*3^6 + 2*3^7 + 2*3^8 + 3^10 + 2*3^12 + 3^13 + 2*3^14 + 3^15 + 3^18 + O(3^20), 3 + 3^2 + 2*3^3 + 3^6 + 2*3^7 + 2*3^8 + 3^9 + 2*3^11 + 2*3^12 + 2*3^13 + 3^15 + 2*3^16 + 3^18 + 2*3^19 + O(3^20)]]
    k5,k6,k7 0.321154513240167 1.55246328915541 0.161999172489361
    initial bound 2.62270974833656e117
    bound_list [58, 58, 58]
    bound_list [8, 9, 9]
    bound_list [8, 7, 7]
    bound_list [8, 7, 7]
    starting search of points using coefficient bound 8
    x-coords of S-integral points via linear combination of mw_base and torsion:
    [-3, -26/9, -8159/2916, -2759/1024, -151/64, -1343/576, -2, -7/4, -1, -47/256, 0, 1/4, 4/9, 9/16, 58/81, 7/9, 6169/6561, 1, 17/16, 2, 33/16, 172/81, 9/4, 25/9, 3, 31/9, 4, 25/4, 1793/256, 8, 625/64, 11, 14, 21, 37, 52, 6142/81, 93, 4537/36, 342, 406, 816, 207331217/4096]
    starting search of extra S-integer points with absolute value bounded by 3.89321964979420
    x-coords of points with bounded absolute value
    [-3, -2, -1, 0, 1, 2]
    Total number of S-integral points: 43
    [(-3 : 0 : 1), (-26/9 : 28/27 : 1), (-8159/2916 : 233461/157464 : 1), (-2759/1024 : 60819/32768 : 1), (-151/64 : 1333/512 : 1), (-1343/576 : 36575/13824 : 1), (-2 : 3 : 1), (-7/4 : 25/8 : 1), (-1 : 3 : 1), (-47/256 : 9191/4096 : 1), (0 : 2 : 1), (1/4 : 13/8 : 1), (4/9 : 35/27 : 1), (9/16 : 69/64 : 1), (58/81 : 559/729 : 1), (7/9 : 17/27 : 1), (6169/6561 : 109871/531441 : 1), (1 : 0 : 1), (17/16 : -25/64 : 1), (2 : 0 : 1), (33/16 : 17/64 : 1), (172/81 : 350/729 : 1), (9/4 : 7/8 : 1), (25/9 : 64/27 : 1), (3 : 3 : 1), (31/9 : 116/27 : 1), (4 : 6 : 1), (25/4 : 111/8 : 1), (1793/256 : 68991/4096 : 1), (8 : 21 : 1), (625/64 : 14839/512 : 1), (11 : 35 : 1), (14 : 51 : 1), (21 : 95 : 1), (37 : 224 : 1), (52 : 374 : 1), (6142/81 : 480700/729 : 1), (93 : 896 : 1), (4537/36 : 305425/216 : 1), (342 : 6324 : 1), (406 : 8180 : 1), (816 : 23309 : 1), (207331217/4096 : 2985362173625/262144 : 1)]
**********************************************************************
}}}

== Doctest Failures/Leads for other Bugs ==

 * More details coming soon - about 30 doctests failed, but about 15 to 20 are fixable with little effort

=== axes.py: name 'NaN' is not defined ===

We are seeing three doctest failures in

 * sage -t "devel/sage/sage/symbolic/expression.pyx"
 * sage -t "devel/sage/sage/coding/code_bounds.py"
 * sage -t "devel/sage/sage/plot/plot.py"
{{{
File "/home/mabshoff/build-3.2.3.final/sage-3.2.3.final-fulvia/devel/sage/sage/plot/plot.py", line 1557:
    sage: plot(x^(1/3), (x,-1,1))
Exception raised:
    Traceback (most recent call last):
      File "/home/mabshoff/build-3.2.3.final/sage-3.2.3.final-fulvia/local/bin/ncadoctest.py", line 1231, in run_one_test
        self.run_one_example(test, example, filename, compileflags)
      File "/home/mabshoff/build-3.2.3.final/sage-3.2.3.final-fulvia/local/bin/sagedoctest.py", line 38, in run_one_example
        OrigDocTestRunner.run_one_example(self, test, example, filename, compileflags)
      File "/home/mabshoff/build-3.2.3.final/sage-3.2.3.final-fulvia/local/bin/ncadoctest.py", line 1172, in run_one_example
        compileflags, 1) in test.globs
      File "<doctest __main__.example_36[33]>", line 1, in <module>
        plot(x**(Integer(1)/Integer(3)), (x,-Integer(1),Integer(1)))###line 1557:
    sage: plot(x^(1/3), (x,-1,1))
      File "sage_object.pyx", line 92, in sage.structure.sage_object.SageObject.__repr__ (sage/structure/sage_object.c:1082)
      File "/home/mabshoff/build-3.2.3.final/sage-3.2.3.final-fulvia/local/lib/python2.5/site-packages/sage/plot/plot.py", line 712, in _repr_
        self.show()
      File "/home/mabshoff/build-3.2.3.final/sage-3.2.3.final-fulvia/local/lib/python2.5/site-packages/sage/plot/plot.py", line 1066, in show
        hgridlinesstyle=hgridlinesstyle)
      File "/home/mabshoff/build-3.2.3.final/sage-3.2.3.final-fulvia/local/lib/python2.5/site-packages/sage/plot/plot.py", line 1317, in save
        xmin, xmax, ymin, ymax = sage_axes.add_xy_axes(subplot, xmin, xmax, ymin, ymax)
      File "/home/mabshoff/build-3.2.3.final/sage-3.2.3.final-fulvia/local/lib/python2.5/site-packages/sage/plot/axes.py", line 325, in add_xy_axes
        x_axis_ypos, ystep, ytslminor, ytslmajor = self._find_axes(ymin, ymax)
      File "/home/mabshoff/build-3.2.3.final/sage-3.2.3.final-fulvia/local/lib/python2.5/site-packages/sage/plot/axes.py", line 241, in _find_axes
        tslmajor, oppaxis, step = self._tasteful_ticks(minval, maxval)
      File "/home/mabshoff/build-3.2.3.final/sage-3.2.3.final-fulvia/local/lib/python2.5/site-packages/sage/plot/axes.py", line 131, in _tasteful_ticks
        d0 = eval(sl[0])
      File "<string>", line 1, in <module>
    NameError: name 'NaN' is not defined
}}}
The following code snippet illustrates the problem:
{{{
#include "stdio.h"
#include "math.h"

int main () {
 printf("pow: %d\n",pow(-0.5, 0.33333));
}
}}}
It returns 1 on Linux, 0 on Solaris - see "man pow" on Solaris 10:
{{{
     These functions compute the value of x raised to the power
     y, x**y. If x is negative, y must be an integer value.
}}}

Thanks to Carl Witty for helping this track down.

Note that a potential solution to this problem is to check out what python does for pow().

== Other Annoyances ==

 * -sdist as well as -bdist is seriously broken with BSD-ish shell utils installed in the default path on Solaris