;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2019 Andreas Enge ;;; Copyright © 2019 Nicolas Goaziou ;;; Copyright © 2019, 2020 Tobias Geerinckx-Rice ;;; Copyright © 2020 Jakub Kądziołka ;;; Copyright © 2021 Efraim Flashner ;;; Copyright © 2023 vicvbcun ;;; ;;; This file is part of GNU Guix. ;;; ;;; GNU Guix is free software; you can redistribute it and/or modify it ;;; under the terms of the GNU General Public License as published by ;;; the Free Software Foundation; either version 3 of the License, or (at ;;; your option) any later version. ;;; ;;; GNU Guix is distributed in the hope that it will be useful, but ;;; WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;; GNU General Public License for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with GNU Guix. If not, see . (define-module (gnu packages sagemath) #:use-module ((guix licenses) #:prefix license:) #:use-module (guix build-system copy) #:use-module (guix build-system gnu) #:use-module (guix build-system python) #:use-module (guix build-system pyproject) #:use-module (guix build-system trivial) #:use-module (guix download) #:use-module (guix gexp) #:use-module (guix git-download) #:use-module (guix packages) #:use-module (guix utils) #:use-module (gnu packages) #:use-module (gnu packages algebra) #:use-module (gnu packages autotools) #:use-module (gnu packages base) #:use-module (gnu packages bdw-gc) #:use-module (gnu packages boost) #:use-module (gnu packages commencement) #:use-module (gnu packages compression) #:use-module (gnu packages freedesktop) #:use-module (gnu packages gd) #:use-module (gnu packages graph) #:use-module (gnu packages graphics) #:use-module (gnu packages guile) #:use-module (gnu packages image) #:use-module (gnu packages lisp) #:use-module (gnu packages m4) #:use-module (gnu packages maths) #:use-module (gnu packages multiprecision) #:use-module (gnu packages pkg-config) #:use-module (gnu packages popt) #:use-module (gnu packages python) #:use-module (gnu packages python-science) #:use-module (gnu packages python-xyz) #:use-module (gnu packages sqlite)) (define-public python-cypari2 (package (name "python-cypari2") (version "2.1.2") (source (origin (method url-fetch) (uri (pypi-uri "cypari2" version)) (sha256 (base32 "0ymc4i9y60aazscc1blivirkr1rflzz6akkmvfzyn5l7mgnlbk83")))) (build-system python-build-system) (native-inputs (list python-cython)) (propagated-inputs (list python-cysignals)) (inputs (list gmp pari-gp)) (home-page "https://cypari2.readthedocs.io/") (synopsis "Python interface to the number theory library libpari") (description "Cypari2 provides a Python interface to the number theory library PARI/GP. It has been spun off from the SageMath mathematics software system, but it can be used independently.") (license license:gpl2+))) (define-public cliquer (package (name "cliquer") (version "1.22") ;; The original source package is available from the home page and ;; has not seen any release since 2010; it comes with only a Makefile ;; without an "install" target. Instead, we use an autotoolized ;; fork (source (origin (method git-fetch) (uri (git-reference (url "https://github.com/dimpase/autocliquer") (commit (string-append "v" version)))) (file-name (git-file-name name version)) (sha256 (base32 "00gcmrhi2fjn8b246w5a3b0pl7p6haxy5wjvd9kcqib1xanz59z4")))) (build-system gnu-build-system) (native-inputs (list autoconf automake libtool)) (synopsis "C routines for finding cliques in weighted graphs") (description "Cliquer is a set of reentrant C routines for finding cliques in a weighted or unweighted graph. It uses an exact branch-and-bound algorithm. It can search for maximum or maximum-weight cliques or cliques with size or weight within a given range, restrict the search to maximal cliques, store cliques in memory and call a user-defined function for every found clique.") (license license:gpl2+) (home-page "https://users.aalto.fi/~pat/cliquer.html"))) (define-public libbraiding (package (name "libbraiding") (version "1.0") (source (origin (method git-fetch) (uri (git-reference (url (string-append "https://github.com/miguelmarco/" name)) (commit version))) (file-name (git-file-name name version)) (sha256 (base32 "0l68rikfr7k2l547gb3pp3g8cj5zzxwipm79xrb5r8ffj466ydxg")))) (build-system gnu-build-system) (native-inputs (list autoconf automake libtool)) (synopsis "Computations with braid groups") (description "libbraiding performs computations with braid groups, in particular it computes normal forms of group elements.") (license license:gpl2+) (home-page "https://github.com/miguelmarco/libbraiding"))) (define-public libhomfly (package (name "libhomfly") (version "1.02r6") (source (origin (method git-fetch) (uri (git-reference (url (string-append "https://github.com/miguelmarco/" name)) (commit version))) (file-name (git-file-name name version)) (sha256 (base32 "0sv3cwrf9v9sb5a8wbhjmarxvya13ma3j8y8592f9ymxlk5y0ldk")))) (build-system gnu-build-system) (native-inputs (list autoconf automake libtool)) (inputs (list libgc)) (synopsis "Computation of homfly polynomials of links") (description "libhomfly computes homfly polynomials of links, represented as strings.") (license license:public-domain) (home-page "https://github.com/miguelmarco/libhomfly"))) (define-public pynac (package (name "pynac") (version "0.7.26") (source (origin (method git-fetch) (uri (git-reference (url "https://github.com/pynac/pynac/") (commit (string-append "pynac-" version)))) (file-name (git-file-name name version)) (sha256 (base32 "09d2p74x1arkydlxy6pw4p4byi7r8q7f29w373h4d8a215kadc6d")))) (build-system gnu-build-system) (native-inputs (list autoconf automake libtool pkg-config)) (inputs (list flint gmp python singular)) (synopsis "Sage fork of GiNaC") (description "Pynac is a derivative of the C++ library GiNaC, which allows manipulation of symbolic expressions. It currently provides the backend for symbolic expressions in Sage. The main difference between Pynac and GiNaC is that Pynac relies on Sage to provide the operations on numerical types, while GiNaC depends on CLN for this purpose.") (license license:gpl2+) (home-page "http://pynac.org/"))) ;; Sage has become upstream of the following package. (define-public zn-poly (package (name "zn-poly") (version "0.9.2") (source (origin (method git-fetch) (uri (git-reference (url (string-append "https://gitlab.com/sagemath/" "zn_poly.git/")) (commit version))) (file-name (git-file-name "zn_poly" version)) (sha256 (base32 "1wbc3apxcldxfcw1dnwnn7fvlfb6bwvlr8glvgv6hf79p9r2s4j0")))) (build-system gnu-build-system) (native-inputs `(("python" ,python-2))) (inputs (list gmp)) (arguments `(#:phases (modify-phases %standard-phases (replace 'configure ;; The configure script chokes on --enable-fast-install. (lambda* (#:key inputs outputs #:allow-other-keys) (invoke "./configure" (string-append "--prefix=" (assoc-ref outputs "out")) "--cflags=-O3 -fPIC"))) (add-before 'build 'prepare-build (lambda _ (setenv "CC" "gcc") #t)) (add-after 'build 'build-so (lambda _ (invoke "make" "libzn_poly.so"))) (add-after 'install 'install-so (lambda* (#:key outputs #:allow-other-keys) (let* ((out (assoc-ref outputs "out")) (lib (string-append out "/lib")) (soname (string-append "libzn_poly-" ,version ".so")) (target (string-append lib "/" soname))) (install-file "libzn_poly.a" lib) (install-file soname lib) (symlink target (string-append lib "/libzn_poly.so")) (symlink target (string-append lib "/libzn_poly-" ,(version-major+minor version) ".so"))) #t))))) (synopsis "Arithmetic for polynomials over Z/NZ") (description "zn_poly implements the arithmetic of polynomials the coefficients of which are modular integers.") (license (list license:gpl2 license:gpl3)) ; dual licensed (home-page "https://gitlab.com/sagemath/zn_poly"))) (define-public brial (package (name "brial") (version "1.2.8") (source (origin (method git-fetch) (uri (git-reference (url "https://github.com/BRiAl/BRiAl/") (commit version))) (file-name (git-file-name name version)) (sha256 (base32 "0qhgckd4fvbs40jw14mvw89rccv94d3df27kipd27hxd4cx7y80y")))) (build-system gnu-build-system) (native-inputs (list autoconf automake libtool pkg-config)) (inputs (list boost libpng m4ri)) (arguments ;; We are missing the boost unit test framework. `(#:tests? #f #:configure-flags (list "--without-boost-unit-test-framework"))) (synopsis "Arithmetic of polynomials over boolean rings") (description "BRiAl is the successor to PolyBoRi maintained by the Sage community. Its core is a C++ library, which provides high-level data types for Boolean polynomials and monomials, exponent vectors, as well as for the underlying polynomial rings and subsets of the powerset of the Boolean variables. As a unique approach, binary decision diagrams are used as internal storage type for polynomial structures.") (license license:gpl2+) (home-page "https://github.com/BRiAl/BRiAl/"))) (define-public lcalc (package (name "lcalc") (version "2.0.5") (source (origin (method git-fetch) (uri (git-reference (url "https://gitlab.com/sagemath/lcalc") (commit version))) (file-name (git-file-name name version)) (sha256 (base32 "1rwyx292y3jbsp88wagn9nhl9z7wsnl2yrs5imxkbxq87pnrj5a7")))) (build-system gnu-build-system) (arguments (list #:configure-flags '(list "--with-pari"))) (inputs (list pari-gp)) (native-inputs (list autoconf automake libtool pkg-config gengetopt)) (home-page "https://gitlab.com/sagemath/lcalc") (synopsis "C++ library for computing with L-functions") (description "Lcalc computes L-functions, in particular the Riemann zeta function, Dirichlet L-functions and L-functions attached to elliptic curves and modular forms.") (license license:gpl2+))) (define-public ratpoints (package (name "ratpoints") (version "2.1.3") (source (origin (method url-fetch) (uri (string-append "http://www.mathe2.uni-bayreuth.de/stoll/programs/" "ratpoints-" version ".tar.gz")) (sha256 (base32 "0zhad84sfds7izyksbqjmwpfw4rvyqk63yzdjd3ysd32zss5bgf4")) (patches ;; Taken from ;; (search-patches "ratpoints-sturm_and_rp_private.patch")))) (build-system gnu-build-system) (arguments `(#:test-target "test" #:make-flags (list (string-append "INSTALL_DIR=" (assoc-ref %outputs "out")) "CCFLAGS=-fPIC") #:phases (modify-phases %standard-phases (delete 'configure) ;no configure script (add-before 'install 'create-install-directories (lambda* (#:key outputs #:allow-other-keys) (let ((out (assoc-ref outputs "out"))) (mkdir-p out) (with-directory-excursion out (for-each (lambda (d) (mkdir-p d)) '("bin" "include" "lib")))) #t))))) (inputs (list gmp)) (home-page "http://www.mathe2.uni-bayreuth.de/stoll/programs/") (synopsis "Find rational points on hyperelliptic curves") (description "Ratpoints tries to find all rational points within a given height bound on a hyperelliptic curve in a very efficient way, by using an optimized quadratic sieve algorithm.") (license license:gpl2+))) (define-public sagemath-data-combinatorial-designs (package (name "sagemath-data-combinatorial-designs") (version "20140630") (source (origin (method url-fetch) (uri (string-append "mirror://sagemath/spkg/upstream/combinatorial_designs/combinatorial_designs-" version ".tar.bz2")) (sha256 (base32 "0bj8ngiq59hipa6izi6g5ph5akmy4cbk0vlsb0wa67f7grnnqj69")))) (build-system copy-build-system) (arguments '(#:install-plan '(("." "share/combinatorial_designs/")))) (home-page "https://www.sagemath.org") (synopsis "Data for Combinatorial Designs") (description "This package data for combinatorial designs. It currently contains: @itemize @item The table of @acronym{MOLS, Mutually orthogonal Latin squares} from the Handbook of Combinatorial Designs, 2ed. @end itemize") (license license:public-domain))) (define-public sagemath-data-conway-polynomials (let ((install-py (origin (method url-fetch) (uri "https://raw.githubusercontent.com/sagemath/sage/9.8/build/pkgs/conway_polynomials/spkg-install.py") (sha256 (base32 "1bwnqasnyv793hxg29viing4dnliz29grkhldsirq19d509yk1fs"))))) (package (name "sagemath-data-conway-polynomials") (version "0.5") (source (origin (method url-fetch) (uri (string-append "mirror://sagemath/spkg/upstream/conway_polynomials/conway_polynomials-" version ".tar.bz2")) (sha256 (base32 "05zb1ly9x2bbscqv0jgc45g48xx77mfs7qdbqhn4ihmihn57iwnq")))) (build-system trivial-build-system) (arguments (list #:modules '((guix build utils)) #:builder #~(begin (use-modules (guix build utils)) (setenv "PATH" (string-join (list #+(file-append bzip2 "/bin") #+(file-append tar "/bin") #+(file-append python "/bin")) ":")) ;; the output directory (setenv "SAGE_SHARE" (string-append #$output "/share")) (setenv "PYTHONPATH" (getcwd)) (invoke "tar" "-xvf" #$source) (symlink (string-append "conway_polynomials-" #$version) "src") (invoke "python3" #$install-py)))) (home-page "https://www.math.rwth-aachen.de/~Frank.Luebeck/data/ConwayPol/index.html") (synopsis "Tables of Conway polynomials over finite fields") (description synopsis) (license #f)))) (define-public sagemath-data-elliptic-curves (let ((install-py-origin (origin (method url-fetch) (uri "https://raw.githubusercontent.com/sagemath/sage/9.8/build/pkgs/elliptic_curves/spkg-install.py") (sha256 (base32 "116g684i6mvs11fvb6fzfsr4fn903axn31vigdyb8bgpf8l4hvc5"))))) (package (name "sagemath-data-elliptic-curves") (version "0.8.1") (source (origin (method url-fetch) (uri (string-append "mirror://sagemath/spkg/upstream/elliptic_curves/elliptic_curves-" version ".tar.bz2")) (sha256 (base32 "0l7xh4abw5sb4d37r0ylr3vwb88fpx2zrvfm5ql0c7yrv5q59fjz")))) (build-system trivial-build-system) (arguments (list #:modules '((guix build utils)) #:builder #~(begin (use-modules (guix build utils)) (setenv "PATH" (string-join (list #+(file-append bzip2 "/bin") #+(file-append tar "/bin") #+(file-append python "/bin")) ":")) ;; the output directory (setenv "SAGE_SHARE" (string-append #$output "/share")) (setenv "PYTHONPATH" (getcwd)) (invoke "tar" "-xvf" #$source) (symlink (string-append "elliptic_curves-" #$version) "src") (invoke "python3" (assoc-ref %build-inputs "install-py"))))) (inputs `(("install-py" ,install-py-origin))) (home-page "https://johncremona.github.io/ecdata/") (synopsis "Databases of elliptic curves") (description synopsis) (license #f)))) (define-public sagemath-data-graphs (package (name "sagemath-data-graphs") (version "20210214") (source (origin (method url-fetch) (uri (string-append "mirror://sagemath/spkg/upstream/graphs/graphs-" version ".tar.bz2")) (sha256 (base32 "0h9p5wrxips51x6vpfiiaqzp9j004nwppzc9qc2iaqakk06pq8q7")))) (build-system copy-build-system) (arguments '(#:install-plan '(("." "share/graphs")))) (home-page "https://www.sagemath.org") (synopsis "Database of graphs") (description "This package contains databases of graphs. It also includes the @acronym{ISGCI, Information System on Graph Classes and their Inclusions} database.") (license #f))) (define-public sagemath-data-polytopes-db (package (name "sagemath-data-polytopes-db") (version "20170220") (source (origin (method url-fetch) (uri (string-append "mirror://sagemath/spkg/upstream/polytopes_db/polytopes_db-" version ".tar.bz2")) (sha256 (base32 "1q0cd811ilhax4dsj9y5p7z8prlalqr7k9mzq178c03frbgqny6b")))) (build-system copy-build-system) (arguments '(#:install-plan '(("." "share/reflexive_polytopes")))) (home-page "https://www.sagemath.org") (synopsis "Lists of 2- and 3-dimensional reflexive polytopes") (description synopsis) (license #f))) (define-public python-sagemath-standard (package (name "python-sagemath-standard") (version "10.0") (source (origin (method git-fetch) (uri (git-reference (url "https://github.com/sagemath/sage") (commit version))) (file-name (git-file-name name version)) (sha256 (base32 "01nfpp3zh43kil7pqyrdvxyawmny0sc656kbg833c2l1y6iwppyc")))) (build-system pyproject-build-system) (arguments (list #:tests? #f ; tests are run in the `sagemath' package #:phases #~(modify-phases %standard-phases (add-after 'unpack 'prepare-build (lambda _ (setenv "SAGE_NUM_THREADS" (number->string (parallel-job-count))) (setenv "SAGE_VENV" #$output) (setenv "PYTHONPATH" (string-append (getcwd) "/pkgs/sage-setup")) ;; broken symlink we don't need (delete-file "pkgs/sage-conf/bin/sage-env-config") (delete-file "pkgs/sage-conf_pypi/sage_root/configure") ;; Run this before 'ensure-no-mtimes-pre-1980 so that there ;; are no broken symlinks (with-directory-excursion "build/pkgs/sagelib" (let ((original-path (getenv "PATH"))) (setenv "PATH" (string-append original-path ":../../bin")) (invoke "sh" "./bootstrap") (setenv "PATH" original-path))))) (add-before 'build 'cd-to-src (lambda _ (chdir "pkgs/sagemath-standard"))) ;; `setuptools' replaces shebangs that match `#!.*python.*' by ;; the intepreter running it. Unfortunately this also matches ;; `sage-python'. But using `sage-python' prevents a weird bug ;; where python's `multiprocessing.resource_tracker' would ;; execute `sage-runtests' instead of `python'. (add-after 'install 'fix-shebangs (lambda _ (let* ((bin (string-append #$output "/bin")) (sage-python (string-append bin "/sage-python"))) (substitute* (find-files bin ;; don't touch these to prevent cycles ;; sage-num-threads.py -> sage-env -> sage ;; sage-venv-config -> sage-python -> sage (negate (file-name-predicate (string-join '("^sage-coverage$" "^sage-num-threads\\.py$" "^sage-venv-config$") "|")))) ;; be careful that we don't substitute the newline ;; character (("^#!.*python-toolchain[^\n]*") (string-append "#!" sage-python)))))) (add-after 'install 'remove-unnecessary-scripts (lambda _ (for-each delete-file (find-files (string-append #$output "/bin") "^sage-rebase")))) (replace 'wrap (lambda* (#:key inputs #:allow-other-keys) (let* ((python-path (search-path-as-string->list (getenv "GUIX_PYTHONPATH"))) (python (dirname (search-input-file inputs "/bin/python3"))) (coreutils (dirname (search-input-file inputs "/bin/readlink"))) (sed (dirname (search-input-file inputs "/bin/sed"))) (xdg-open (dirname (search-input-file inputs "/bin/xdg-open"))) (maxima-version #$(package-version (this-package-input "maxima"))) (maxima-fas (search-input-file inputs (string-append "/lib/maxima/" maxima-version "/binary-ecl/maxima.fas"))) (combinatorial-design (search-input-directory inputs "/share/combinatorial_designs")) (conway-polynomials (search-input-directory inputs "/share/conway_polynomials")) (ellcurve (search-input-directory inputs "/share/ellcurves")) (cremona-mini (search-input-directory inputs "/share/cremona")) (graphs (search-input-directory inputs "/share/graphs")) (polytope (search-input-directory inputs "/share/reflexive_polytopes")) (gap-lib (search-input-directory inputs "/lib/gap")) (gap-share (search-input-directory inputs "/share/gap"))) ;; wrap everything possible, all things with shebang ;; #!*/sage-* are still covered, as sage-* itself will be ;; wrapped (for-each (lambda (file) (false-if-exception (wrap-script file `("GUIX_PYTHONPATH" = ,python-path) `("PATH" prefix (,(string-append #$output "/bin") ,coreutils ,python ,sed ,xdg-open)) `("MAXIMA_FAS" = (,maxima-fas)) `("COMBINATORIAL_DESIGN_DATA_DIR" = (,combinatorial-design)) `("CONWAY_POLYNOMIALS_DATA_DIR" = (,conway-polynomials)) `("ELLCURVE_DATA_DIR" = (,ellcurve)) `("CREMONA_MINI_DATA_DIR" = (,cremona-mini)) `("GRAPHS_DATA_DIR" = (,graphs)) `("POLYTOPE_DATA_DIR" = (,polytope)) `("GAP_LIB_DIR" = (,gap-lib)) `("GAP_SHARE_DIR" = (,gap-share))))) (find-files (string-append #$output "/bin"))))))))) (inputs (list arb boost brial cliquer coreutils edge-addition-planarity-suite gd givaro glpk gmp guile-3.0 ; for wrap-script iml libbraiding libhomfly linbox m4ri m4rie mpc mpfi python-cypari2 python-gmpy2 python-jinja2 python-jupyter-core python-memory-allocator python-numpy python-pplpy rw sagemath-data-combinatorial-designs sagemath-data-conway-polynomials sagemath-data-elliptic-curves sagemath-data-graphs sagemath-data-polytopes-db sed symmetrica xdg-utils zlib)) (native-inputs (list m4 pkg-config python-cython)) (propagated-inputs (list cddlib ecl ; also buildtime eclib ; also buildtime flint ; also buildtime gap ; also buildtime gfan giac ; also buildtime gmp-ecm ; also buildtime gsl ; also buildtime lcalc ; also buildtime maxima mpfr nauty ntl ; also buildtime openblas ; also buildtime palp pari-gp ; also buildtime pkg-config ; also buildtime (native) python-fpylll python-ipython python-ipywidgets python-lrcalc python-networkx python-pkgconfig python-primecountpy python-scipy python-sympy singular ; also buildtime sqlite sympow tachyon)) (home-page "https://www.sagemath.org") (synopsis "Python-based computer algebra system") (description "SageMath is a free open-source mathematics software system licensed under the GPL. It builds on top of many existing open-source packages: NumPy, SciPy, matplotlib, Sympy, Maxima, GAP, FLINT, R and many more. Access their combined power through a common, Python-based language or directly via interfaces or wrappers.") (license license:gpl3))) (define-public sagemath (package (inherit python-sagemath-standard) (name "sagemath") (arguments (list #:phases #~(modify-phases %standard-phases (add-after 'unpack 'prepare (lambda _ (setenv "HOME" (string-append (getenv "TMPDIR") "/home")) (mkdir-p (getenv "HOME")) (chdir "src") ;; prevent paging for `sage/repl/ipython_tests.py' (setenv "TERM" "dumb") ;; for `sage --sh' in `sage/tests/cmdline.py' (setenv "SHELL" (which "bash")) (for-each delete-file '("sage/repl/ipython_kernel/install.py" ; needs threejs ;; works in a container "sage/typeset/ascii_art.py" "sage/interfaces/gap_workspace.py" "sage/misc/sage_ostools.pyx" ; checks for /bin/sh "sage/repl/ipython_tests.py" ;; downgrade to 5.45 may fix this: ;; https://github.com/sagemath/sage/issues/33718 ;; https://sourceforge.net/p/maxima/bugs/3964/ "sage/calculus/calculus.py" "sage/interfaces/maxima_lib.py" "sage/functions/exp_integral.py" ; correct, but different form "sage/symbolic/integration/integral.py" ; correct, but exact not floating point "sage/symbolic/relation.py" ; order in minimum different "sage/repl/ipython_kernel/kernel.py" ; deprecation warnings triggered ; by `python-pydevd' ;; TODO "sage/env.py" ; maybe try updating `python-pkgconfig'? "sage/interacts/test_jupyter.rst" ; maybe `python-ipywidgets' is too old? )))) (replace 'check (lambda* (#:key inputs tests? #:allow-other-keys) (when tests? (invoke (search-input-file inputs "/bin/sage") "-t" "--nthreads" (number->string (parallel-job-count)) ;; the file / directory we want to test "sage")))) (delete 'build) (replace 'install (lambda* (#:key inputs #:allow-other-keys) (let ((target (string-append #$output "/bin")) (source (search-input-file inputs "/bin/sage"))) (mkdir-p target) (symlink source (string-append target "/sage")))))))) (inputs (list python-sagemath-standard)) (native-inputs (list python-sagemath-standard gcc-toolchain gfortran-toolchain))))