The following instructions explain how to install libsingular and enabling polymake to access Singular. Please tell us about any obstacles you might encounter.
Note: If you have trouble compiling Singular, you can find the latest singular commit that jenkins has tested at 7161cff604.
For Developers: See Jenkins for the latest working Singular and polymake git revisions.
To install libsingular you'll need to do the following:
git clone https://github.com/Singular/Sources cd Sources git checkout spielwiese
/usr/local
by default.
./autogen.sh ./configure --disable-static --prefix=/some/custom/prefix make make install
Warning: If your gcc is version 6 (or newer) please add the following variables to the configure
command:
CFLAGS="-fno-delete-null-pointer-checks" CXXFLAGS="-fno-delete-null-pointer-checks"
bin
, lib
and some other folders in the prefix.
Next you need to compile polymake with libsingular:
./configure --with-singular="/some/custom/prefix" make
For installing libsingular on Mac OS and using it with polymake you first need a suitable c++-compiler. Currently, the only known compiler that works both for libsingular and polymake is g++-fsf-4.7 that comes with fink (apple's system gcc probably compiles libsingular, but not polymake, and a recent svn snapshot of clang compiles polymake, but the configure script of libsingular does not work well with clang). Note that you will have to compile both polymake and libsingular with the same compiler!
You need gcc,g++, and the gmp from the fink distribution (this is for Mac OS 10.8, please check the correct names for other versions).
fink install gcc47-compiler gcc47-shlibs gmp5 gmp5-shlibs libgmpxx5-shlibs
Next you need the singular sources. Create a directory for singular and switch to this directory. Then
git clone https://github.com/Singular/Sources cd Sources git checkout master
We need to create some symbolic links so that singular finds the gmp. In the following “x86_64Mac-darwin” is assumed to be the output of the shell script “singuname.sh”, please check this with
./singuname.sh
and replace the string in the following commands if necessary. Also, “/sw” is assumed to be the root of your fink installation. Replace if necessary.
mkdir -p x86_64Mac-darwin/include mkdir -p x86_64Mac-darwin/lib ln -s /sw/include/gmp.h x86_64Mac-darwin/include/ ln -s /sw/lib/libgmp.dylib x86_64Mac-darwin/lib/
We also need to set some flags:
export CC="/sw/bin/gcc-fsf-4.7 -fpic -DPIC -DLIBSINGULAR" export CXX=/sw/bin/g++-fsf-4.7" -fpic -DPIC -DLIBSINGULAR" export CFLAGS="-g -I/sw/include" export CXXFLAGS="-g -I/sw/include"
We also have to edit one file in the Singular tree: In the file “ntl/include/NTL/tools.h” please add the line
#define NTL_STD_CXX
at the top.
Now we can compile libsingular
./configure --without-dynamic-kernel --without-MP make install-libsingular
Finally, we have to fix the name of the produced libsingular, so that polymake can find it during loading:
install_name_tool -id <path_to_singular>/Sources/x86_64Mac-darwin/lib/libsingular.dylib x86_64Mac-darwin/lib/libsingular.dylib
Note that <path_to_singular> should be the full path (starting with “/”) to the directory you created in the beginning, i.e. “<path_to_singular>/Sources/x86_64Mac-darwin/lib/libsingular.dylib” should be the full path for libsingular.dylib
Now you can compile polymake with singular. Switch to the polymake root directory. Currently you also have to fix the configure script of polymake: In the file “ext/singular/configure.pl” replace “$Config::Config{dlext}” by “dylib” (twice). This will be fixed in the next beta release. Now call
./configure CC=/sw/bin/gcc-fsf-4.7 CXX=/sw/bin/g++-fsf-4.7 --with-singular=<path_to_singular>/Sources/x86_64Mac-darwin make
Depending on your local installation you might need to add further switches.
Now you should be able to access Singular from within polymake. You can try it out by executing the following in polymake:
application "ideal"; $r=new Ring(qw(x y z)); ($x,$y,$z)=$r->variables; $p1=($x^3)-1; $p2=($x^2)-1; $p3=($y^5); $i = new Ideal(GENERATORS=>[$p1,$p2,$p3]); print $i->RADICAL->GENERATORS; print $i->DIM; $q1 = $x+($y^2); $q2 = ($y^2); $j = new Ideal(GENERATORS=>[$q1,$q2]); print $j->GROEBNER(ORDER=>"lex")->BASIS; print $j->GROEBNER(ORDER=>"lex")->INITIAL_IDEAL->GENERATORS; print $j->GROEBNER(ORDER=>"dp")->BASIS; print $j->GROEBNER(ORDER=>"dp")->reduce($p1); print $j->GROEBNER(ORDER=>"dp")->reduce($q1); $m = new Matrix([1,1,1],[0,1,1],[0,0,1]); print $j->GROEBNER(ORDER_MATRIX=>$m)->BASIS;