Giter Site home page Giter Site logo

sagemath / sage Goto Github PK

View Code? Open in Web Editor NEW
1.1K 8.0 405.0 388.01 MB

Main repository of SageMath. Now open for Issues and Pull Requests.

Home Page: https://www.sagemath.org

License: Other

Shell 0.32% Emacs Lisp 0.01% Makefile 0.05% M4 0.43% Python 71.37% CMake 0.01% C 0.20% HTML 0.79% Dockerfile 0.02% CSS 0.01% JavaScript 0.01% TeX 0.01% Cython 24.85% C++ 1.67% GAP 0.04% MATLAB 0.03% Ruby 0.01% Smarty 0.01% Gnuplot 0.20% Common Lisp 0.01%

sage's Introduction

"Creating a Viable Open Source Alternative to Magma, Maple, Mathematica, and MATLAB"

Sage is open source mathematical software released under the GNU General Public Licence GPLv2+, and includes packages that have compatible software licenses. People all around the globe have contributed to the development of Sage. Full documentation is available online.

Table of Contents

Getting Started

Those who are impatient may use prebuilt Sage available online from any of

Binder   Gitpod Ready-to-Code   Open in GitHub Codespaces

without local installation. Otherwise read on.

The Sage Installation Guide provides a decision tree that guides you to the type of installation that will work best for you. This includes building from source, obtaining Sage from a package manager, using a container image, or using Sage in the cloud.

This README contains self-contained instructions for building Sage from source. This requires you to clone the git repository (as described in this README) or download the sources in the form of a tarball.

If you have questions or encounter problems, please do not hesitate to email the sage-support mailing list or ask on the Ask Sage questions and answers site.

Supported Platforms

Sage attempts to support all major Linux distributions, recent versions of macOS, and Windows (using Windows Subsystem for Linux or virtualization).

Detailed information on supported platforms for a specific version of Sage can be found in the section Availability and installation help of the release tour for this version.

We highly appreciate contributions to Sage that fix portability bugs and help port Sage to new platforms; let us know at the sage-devel mailing list.

[Windows] Preparing the Platform

The preferred way to run Sage on Windows is using Windows Subsystem for Linux (WSL). Follow the official WSL setup guide to install Ubuntu (or another Linux distribution). Make sure you allocate WSL sufficient RAM; 5GB is known to work, while 2GB might be not enough for building Sage from source. Then all instructions for installation in Linux apply.

As an alternative, you can also run Linux on Windows using Docker (see below) or other virtualization solutions.

[macOS] Preparing the Platform

  • If your Mac uses the Apple Silicon (M1, M2, M3; arm64) architecture and you set up your Mac by transferring files from an older Mac, make sure that the directory /usr/local does not contain an old copy of Homebrew (or other software) for the x86_64 architecture that you may have copied over. Note that Homebrew for the M1 is installed in /opt/homebrew, not /usr/local.

  • If you wish to use conda, please see the section on conda in the Sage Installation Manual for guidance.

  • Otherwise, we strongly recommend to use Homebrew ("the missing package manager for macOS") from https://brew.sh/, which provides the gfortran compiler and many libraries.

  • Otherwise, if you do not wish to install Homebrew, you will need to install the latest version of Xcode Command Line Tools. Open a terminal window and run xcode-select --install; then click "Install" in the pop-up window. If the Xcode Command Line Tools are already installed, you may want to check if they need to be updated by typing softwareupdate -l.

Instructions to Build from Source

Like many other software packages, Sage is built from source using ./configure, followed by make. However, we strongly recommend to read the following step-by-step instructions for building Sage.

The instructions cover all of Linux, macOS, and WSL.

More details, providing a background for these instructions, can be found in the section Install from Source Code in the Installation Guide.

  1. Decide on the source/build directory (SAGE_ROOT):

    • On personal computers, any subdirectory of your :envvar:HOME directory should do.

    • For example, you could use SAGE_ROOT=~/sage/sage, which we will use as the running example below.

    • You need at least 10 GB of free disk space.

    • The full path to the source directory must contain no spaces.

    • After starting the build, you cannot move the source/build directory without breaking things.

    • You may want to avoid slow filesystems such as network file systems (NFS) and the like.

    • [macOS] macOS allows changing directories without using exact capitalization. Beware of this convenience when compiling for macOS. Ignoring exact capitalization when changing into :envvar:SAGE_ROOT can lead to build errors for dependencies requiring exact capitalization in path names.

  2. Clone the sources with git:

    • To check that git is available, open a terminal and enter the following command at the shell prompt ($):

        $ git --version
        git version 2.42.0
      

      The exact version does not matter, but if this command gives an error, install git using your package manager, using one of these commands:

        $ sudo pacman -S git                          # on Arch Linux
        $ sudo apt-get update && apt-get install git  # on Debian/Ubuntu
        $ sudo yum install git                        # on Fedora/Redhat/CentOS
        $ sudo zypper install git                     # on openSUSE
        $ sudo xbps-install git                       # on Void Linux
      
    • Create the directory where SAGE_ROOT should be established:

        $ mkdir -p ~/sage
        $ cd ~/sage
      
    • Clone the Sage git repository:

        $ git clone -c core.symlinks=true --filter blob:none  \
                    --origin upstream --branch develop --tags \
                    https://github.com/sagemath/sage.git
      

      This command obtains the most recent development release. Replace --branch develop by --branch master to select the most recent stable release instead.

      This will create the subdirectory ~/sage/sage. (See the section Setting up git and the following sections in the Sage Developer's Guide for more information.)

    • Change into the created subdirectory:

        $ cd sage
      
    • [Windows] The Sage source tree contains symbolic links, and the build will not work if Windows line endings rather than UNIX line endings are used.

      Therefore it is recommended (but not necessary) to use the WSL version of git.

  3. Install system packages.

    Either refer for this to the section on installation from source in the Sage Installation Manual for compilations of system packages that you can install. When done, skip to step 7 (bootstrapping).

    Alternatively, follow the more fine-grained approach below.

  4. [Linux, WSL] Install the required minimal build prerequisites:

    • Compilers: gcc, gfortran, g++ (GCC versions from 8.4.0 to 13.x and recent versions of Clang (LLVM) are supported). See build/pkgs/gcc/SPKG.rst and build/pkgs/gfortran/SPKG.rst for a discussion of suitable compilers.

    • Build tools: GNU make, GNU m4, perl (including ExtUtils::MakeMaker), ranlib, git, tar, bc. See build/pkgs/_prereq/SPKG.rst for more details.

    • Python 3.4 or later, or Python 2.7, a full installation including urllib; but ideally version 3.9.x, 3.10.x, 3.11.x, 3.12.x, which will avoid having to build Sage's own copy of Python 3. See build/pkgs/python3/SPKG.rst for more details.

    We have collected lists of system packages that provide these build prerequisites. See, in the folder build/pkgs/_prereq/distros, the files arch.txt, debian.txt (also for Ubuntu, Linux Mint, etc.), fedora.txt (also for Red Hat, CentOS), opensuse.txt, slackware.txt, and void.txt, or visit https://doc.sagemath.org/html/en/reference/spkg/_prereq.html#spkg-prereq

  5. Optional: It is recommended that you have both LaTeX and the ImageMagick tools (e.g. the "convert" command) installed since some plotting functionality benefits from them.

  6. [Development] If you plan to do Sage development or otherwise work with ticket branches and not only releases, install the bootstrapping prerequisites. See the files in the folder build/pkgs/_bootstrap/distros, or visit https://doc.sagemath.org/html/en/reference/spkg/_bootstrap.html#spkg-bootstrap

  7. Bootstrap the source tree using the following command:

    $ make configure
    

    (If the bootstrapping prerequisites are not installed, this command will download a package providing pre-built bootstrap output instead.)

  8. Sanitize the build environment. Use the command

    $ env
    

    to inspect the current environment variables, in particular PATH, PKG_CONFIG_PATH, LD_LIBRARY_PATH, CFLAGS, CPPFLAGS, CXXFLAGS, and LDFLAGS (if set).

    Remove items from these (colon-separated) environment variables that Sage should not use for its own build. In particular, remove items if they refer to a previous Sage installation.

    • [WSL] In particular, WSL imports many items from the Windows PATH variable into the Linux environment, which can lead to confusing build errors. These items typically start with /mnt/c. It is best to remove all of them from the environment variables. For example, you can set PATH using the command:

        $ export PATH=/usr/sbin/:/sbin/:/bin/:/usr/lib/wsl/lib/
      
    • [macOS with homebrew] Set required environment variables for the build:

        $ source ./.homebrew-build-env
      

      This is to make some of Homebrew's packages (so-called keg-only packages) available for the build. Run it once to apply the suggestions for the current terminal session. You may need to repeat this command before you rebuild Sage from a new terminal session, or after installing additional homebrew packages. (You can also add it to your shell profile so that it gets run automatically in all future sessions.)

  9. Optionally, decide on the installation prefix (SAGE_LOCAL):

    • Traditionally, and by default, Sage is installed into the subdirectory hierarchy rooted at SAGE_ROOT/local/.

    • This can be changed using ./configure --prefix=SAGE_LOCAL, where SAGE_LOCAL is the desired installation prefix, which must be writable by the user.

      If you use this option in combination with --disable-editable, you can delete the entire Sage source tree after completing the build process. What is installed in SAGE_LOCAL will be a self-contained installation of Sage.

    • Note that in Sage's build process, make builds and installs (make install is a no-op). Therefore the installation hierarchy must be writable by the user.

    • See the Sage Installation Manual for options if you want to install into shared locations such as /usr/local/. Do not attempt to build Sage as root.

  10. Optionally, review the configuration options, which includes many optional packages:

    $ ./configure --help
    

    Notable options for Sage developers are the following:

    • Use the option --config-cache to have configure keep a disk cache of configuration values. This gives a nice speedup when trying out ticket branches that make package upgrades, which involves automatic re-runs of the configuration step.

    • Use the option --enable-ccache to have Sage install and use the optional package ccache, which is preconfigured to keep a disk cache of object files created from source files. This can give a great speedup when switching between different branches, at the expense of disk space use.

  11. Optional, but highly recommended: Set some environment variables to customize the build.

    For example, the MAKE environment variable controls whether to run several jobs in parallel. On a machine with 4 processors, say, typing export MAKE="make -j4" will configure the build script to perform a parallel compilation of Sage using 4 jobs. On some powerful machines, you might even consider -j16, as building with more jobs than CPU cores can speed things up further.

    To reduce the terminal output during the build, type export V=0. (V stands for "verbosity".)

    Some environment variables deserve a special mention: CC, CXX and FC. These variables defining your compilers can be set at configuration time and their values will be recorded for further use at build time and runtime.

    For an in-depth discussion of more environment variables for building Sage, see the installation guide.

  12. Type ./configure, followed by any options that you wish to use. For example, to build Sage with gf2x package supplied by Sage, use ./configure --with-system-gf2x=no.

    At the end of a successful ./configure run, you may see messages recommending to install extra system packages using your package manager.

    For a large list of Sage packages, Sage is able to detect whether an installed system package is suitable for use with Sage; in that case, Sage will not build another copy from source.

    Sometimes, the messages will recommend to install packages that are already installed on your system. See the earlier configure messages or the file config.log for explanation. Also, the messages may recommend to install packages that are actually not available; only the most recent releases of your distribution will have all of these recommended packages.

  13. Optional: If you choose to install the additional system packages, a re-run of ./configure will test whether the versions installed are usable for Sage; if they are, this will reduce the compilation time and disk space needed by Sage. The usage of packages may be adjusted by ./configure parameters (check again the output of ./configure --help).

  14. Type make. That's it! Everything is automatic and non-interactive.

    If you followed the above instructions, in particular regarding the installation of system packages recommended by the output of ./configure (step 11), and regarding the parallel build (step 10), building Sage takes less than one hour on a modern computer. (Otherwise, it can take much longer.)

    The build should work fine on all fully supported platforms. If it does not, we want to know!

  15. Type ./sage to try it out. In Sage, try for example 2 + 2, plot(x^2), plot3d(lambda x, y: x*y, (-1, 1), (-1, 1)) to test a simple computation and plotting in 2D and 3D. Type Ctrl+D or quit to quit Sage.

  16. Optional: Type make ptestlong to test all examples in the documentation (over 200,000 lines of input!) -- this takes from 10 minutes to several hours. Don't get too disturbed if there are 2 to 3 failures, but always feel free to email the section of logs/ptestlong.log that contains errors to the sage-support mailing list. If there are numerous failures, there was a serious problem with your build.

  17. The HTML version of the documentation is built during the compilation process of Sage and resides in the directory local/share/doc/sage/html/. You may want to bookmark it in your browser.

  18. Optional: If you want to build the PDF version of the documentation, run make doc-pdf (this requires LaTeX to be installed).

  19. Optional: Install optional packages of interest to you: get a list by typing ./sage --optional or by visiting the packages documentation page.

  20. Optional: Create a symlink to the installed sage script in a directory in your PATH, for example /usr/local. This will allow you to start Sage by typing sage from anywhere rather than having to either type the full path or navigate to the Sage directory and type ./sage. This can be done by running:

    $ sudo ln -s $(./sage -sh -c 'ls $SAGE_ROOT/venv/bin/sage') /usr/local/bin
    
  21. Optional: Set up SageMath as a Jupyter kernel in an existing Jupyter notebook or JupyterLab installation, as described in the section Launching SageMath in the Sage Installation Guide.

Alternative Installation using PyPI

For installing Sage in a Python environment from PyPI, Sage provides the pip-installable package sagemath-standard.

Unless you need to install Sage into a specific existing environment, we recommend to create and activate a fresh virtual environment, for example ~/sage-venv/:

        $ python3 -m venv ~/sage-venv
        $ source ~/sage-venv/bin/activate

As the first installation step, install sage_conf, which builds various prerequisite packages in a subdirectory of ~/.sage/:

        (sage-venv) $ python3 -m pip install -v sage_conf

After a successful installation, a wheelhouse provides various Python packages. You can list the wheels using the command:

        (sage-venv) $ ls $(sage-config SAGE_SPKG_WHEELS)

If this gives an error saying that sage-config is not found, check any messages that the pip install command may have printed. You may need to adjust your PATH, for example by:

        $ export PATH="$(python3 -c 'import sysconfig; print(sysconfig.get_path("scripts", "posix_user"))'):$PATH"

Now install the packages from the wheelhouse and the sage_setup package, and finally install the Sage library:

        (sage-venv) $ python3 -m pip install $(sage-config SAGE_SPKG_WHEELS)/*.whl sage_setup
        (sage-venv) $ python3 -m pip install --no-build-isolation -v sagemath-standard

The above instructions install the latest stable release of Sage. To install the latest development version instead, add the switch --pre to all invocations of python3 -m pip install.

NOTE: PyPI has various other pip-installable packages with the word "sage" in their names. Some of them are maintained by the SageMath project, some are provided by SageMath users for various purposes, and others are entirely unrelated to SageMath. Do not use the packages sage and sagemath. For a curated list of packages, see the chapter Packages and Features of the Sage Reference Manual.

SageMath Docker images

Docker Status

SageMath is available on Docker Hub and can be downloaded by:

docker pull sagemath/sagemath

Currently, only stable versions are kept up to date.

Troubleshooting

If you have problems building Sage, check the Sage Installation Guide, as well as the version-specific Sage Installation FAQ in the Sage Release Tour corresponding to the version that you are installing.

Please do not hesitate to ask for help in the SageMath forum or the sage-support mailing list. The Troubleshooting section in the Sage Installation Guide provides instructions on what information to provide so that we can provide help more effectively.

Contributing to Sage

If you'd like to contribute to Sage, we strongly recommend that you read the Developer's Guide.

Sage has significant components written in the following languages: C/C++, Python, Cython, Common Lisp, Fortran, and a bit of Perl.

Directory Layout

Simplified directory layout (only essential files/directories):

SAGE_ROOT                 Root directory (create by git clone)
├── build
│   └── pkgs              Every package is a subdirectory here
│       ├── 4ti2/
│       …
│       └── zlib/
├── configure             Top-level configure script
├── COPYING.txt           Copyright information
├── pkgs                  Source trees of Python distribution packages
│   ├── sage-conf
│   │   ├── sage_conf.py
│   │   └── setup.py
│   ├── sage-docbuild
│   │   ├── sage_docbuild/
│   │   └── setup.py
│   ├── sage-setup
│   │   ├── sage_setup/
│   │   └── setup.py
│   ├── sage-sws2rst
│   │   ├── sage_sws2rst/
│   │   └── setup.py
│   └── sagemath-standard
│       ├── bin/
│       ├── sage -> ../../src/sage
│       └── setup.py
├── local  (SAGE_LOCAL)   Installation hierarchy for non-Python packages
│   ├── bin               Executables
│   ├── include           C/C++ headers
│   ├── lib               Shared libraries, architecture-dependent data
│   ├── share             Databases, architecture-independent data, docs
│   │   └── doc           Viewable docs of Sage and of some components
│   └── var
│       ├── lib/sage
│       │   ├── installed/
│       │   │             Records of installed non-Python packages
│       │   ├── scripts/  Scripts for uninstalling installed packages
│       │   └── venv-python3.9  (SAGE_VENV)
│       │       │         Installation hierarchy (virtual environment)
│       │       │         for Python packages
│       │       ├── bin/  Executables and installed scripts
│       │       ├── lib/python3.9/site-packages/
│       │       │         Python modules/packages are installed here
│       │       └── var/lib/sage/
│       │           └── wheels/
│       │                 Python wheels for all installed Python packages
│       │
│       └── tmp/sage/     Temporary files when building Sage
├── logs
│   ├── install.log       Full install log
│   └── pkgs              Build logs of individual packages
│       ├── alabaster-0.7.12.log
│       …
│       └── zlib-1.2.11.log
├── m4                    M4 macros for generating the configure script
│   └── *.m4
├── Makefile              Running "make" uses this file
├── prefix -> SAGE_LOCAL  Convenience symlink to the installation tree
├── README.md             This file
├── sage                  Script to start Sage
├── src                   Monolithic Sage library source tree
│   ├── bin/              Scripts that Sage uses internally
│   ├── doc/              Sage documentation sources
│   └── sage/             The Sage library source code
├── upstream              Source tarballs of packages
│   ├── Babel-2.9.1.tar.gz
│   …
│   └── zlib-1.2.11.tar.gz
├── venv -> SAGE_VENV     Convenience symlink to the virtual environment
└── VERSION.txt

For more details see our Developer's Guide.

Build System

This is a brief summary of the Sage software distribution's build system. There are two components to the full Sage system--the Sage Python library and its associated user interfaces, and the larger software distribution of Sage's main dependencies (for those dependencies not supplied by the user's system).

Sage's Python library is built and installed using a setup.py script as is standard for Python packages (Sage's setup.py is non-trivial, but not unusual).

Most of the rest of the build system is concerned with building all of Sage's dependencies in the correct order in relation to each other. The dependencies included by Sage are referred to as SPKGs (i.e. "Sage Packages") and are listed under build/pkgs.

The main entrypoint to Sage's build system is the top-level Makefile at the root of the source tree. Unlike most normal projects that use autoconf (Sage does as well, as described below), this Makefile is not generated. Instead, it contains a few high-level targets and targets related to bootstrapping the system. Nonetheless, we still run make <target> from the root of the source tree--targets not explicitly defined in the top-level Makefile are passed through to another Makefile under build/make/Makefile.

The latter build/make/Makefile is generated by an autoconf-generated configure script, using the template in build/make/Makefile.in. This includes rules for building the Sage library itself (make sagelib), and for building and installing each of Sage's dependencies (e.g. make gf2x).

The configure script itself, if it is not already built, can be generated by running the bootstrap script (the latter requires GNU autotools being installed). The top-level Makefile also takes care of this automatically.

To summarize, running a command like make python3 at the top-level of the source tree goes something like this:

  1. make python3
  2. run ./bootstrap if configure needs updating
  3. run ./configure with any previously configured options if build/make/Makefile needs updating
  4. change directory into build/make and run the install script--this is little more than a front-end to running make -f build/make/Makefile python3, which sets some necessary environment variables and logs some information
  5. build/make/Makefile contains the actual rule for building python3; this includes building all of python3's dependencies first (and their dependencies, recursively); the actual package installation is performed with the sage-spkg program

Relocation

It is not supported to move the SAGE_ROOT or SAGE_LOCAL directory after building Sage. If you do move the directories, you will have to run make distclean and build Sage again from scratch.

For a system-wide installation, you have to build Sage as a "normal" user and then as root you can change permissions. See the Installation Guide for further information.

Redistribution

Your local Sage install is almost exactly the same as any "developer" install. You can make changes to documentation, source, etc., and very easily package the complete results up for redistribution just like we do.

  1. To make a binary distribution with your currently installed packages, visit sagemath/binary-pkg.

  2. To make your own source tarball of Sage, type:

    $ make dist
    

    The result is placed in the directory dist/.

Changes to Included Software

All software included with Sage is copyrighted by the respective authors and released under an open source license that is GPL version 3 or later compatible. See COPYING.txt for more details.

Sources are in unmodified (as far as possible) tarballs in the upstream/ directory. The remaining description, version information, patches, and build scripts are in the accompanying build/pkgs/<packagename> directory. This directory is part of the Sage git repository.

Copyright (C) 2005-2024 The Sage Development Team

https://www.sagemath.org

sage's People

Contributors

behackl avatar cheuberg avatar darijgr avatar dcoudert avatar dimpase avatar dkrenn avatar egourgoulhon avatar embray avatar fchapoton avatar jdemeyer avatar jhpalmieri avatar jm58660 avatar johncremona avatar kwankyu avatar mantepse avatar mezzarobba avatar mkoeppe avatar mwhansen avatar nathanncohen avatar nthiery avatar orlitzky avatar robertwb avatar roed314 avatar rwst avatar saraedum avatar tobiasdiez avatar tscrim avatar vbraun avatar videlec avatar williamstein avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

sage's Issues

modular forms -- missing q_eigenform functionality

q_eigenform on old factors doesn't work:

sage: M = ModularSymbols(63,2,sign=1).cuspidal_subspace()
sage: M[2].q_eigenform()
Traceback (most recent call last):
    M[2].q_eigenform()
...
AttributeError: 'ModularSymbolsAmbient_wt2_g0' object has no attribute 'subspace_generated_by_images'

Component: basic arithmetic

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

[fixed?] Factoring for a subspace of ModularSymbols in general

   sage: M = ModularSymbols(Gamma0(22),2,sign=1)
   sage: M1 = M.decomposition()[1]
   sage: M1
   Modular Symbols subspace of dimension 2 of Modular Symbols space of dimension 5 for Gamma_0(22) of weight 2 with sign 1 over Rational Field
   sage: M1.is_simple() ## throws a TypeError

In fact, I can find lots of examples where this happens: levels 6, 7, 8, and 9 with weight 24 all have subspaces which crash is_simple.

I don't really know if this qualifies as "critical," but it seems more than just "annoying." Maybe the page name should be clarified (at least to me)?

-- Craig Citro

Component: modular forms

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

coercion issues

From David Harvey:
Further to our discussion of a few days ago, I found something quite confusing, not sure what the correct behaviour should be.
 
sage: poly_ring1.<gen1> = PolynomialRing(QQ)
sage: poly_ring2.<gen2> = PolynomialRing(QQ)
sage: huge_ring.<x> = PolynomialRing(poly_ring1)
sage: huge_ring(gen1)
 gen1
sage: huge_ring(gen2)
 x
 
In the first example gen1 is getting coerced into a constant polynomial because it belongs to the coefficient ring, and in the second example it's "renaming the variable". I suppose that makes sense, although I'm a bit uneasy about the second one.
 
BUT it's not consistent with the behaviour for power series:
 
sage: power_ring1.<gen1> = PowerSeriesRing(QQ)
sage: power_ring2.<gen2> = PowerSeriesRing(QQ)
sage: huge_power_ring.<x> = PowerSeriesRing(power_ring1)
sage: huge_power_ring(gen1)
 x
sage: huge_power_ring(gen2)
 x
 
Is this a bug?

Response: from william: "Yes"

Component: basic arithmetic

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

possible bug with p-adic number constructor

I'm not sure if this is a bug, but it sure is confusing to me.

sage: K = pAdicField(5, 10)
sage: K(1/2, prec=20)
 3 + 2*5 + 2*5^2 + 2*5^3 + 2*5^4 + 2*5^5 + 2*5^6 + 2*5^7 + 2*5^8 + 2*5^9 + O(5^10)

The field's default precision seems to override the precision explicitly requested in the constructor. I can vaguely see how this might make sense, but it gets extremely confusing when you don't even supply the default precision:

sage: K = pAdicField(5)
sage: K(1/2, prec=30)
 3 + 2*5 + 2*5^2 + 2*5^3 + 2*5^4 + 2*5^5 + 2*5^6 + 2*5^7 + 2*5^8 + 2*5^9 + 2*5^10 + 2*5^11 + 2*5^12 + 2*5^13 + 2*5^14 + 2*5^15 + 2*5^16 + 2*5^17 + 2*5^18 + 2*5^19 + O(5^20)

I think it would be better if the precision requested in the constructor was always honoured, assuming that the input data had enough precision in the first place to support it (which in this case it does, being a Rational number).

Component: basic arithmetic

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

Integer and Rational classes need nth_root and exact_power functions

It would be useful for Integer and Rational classes to have:

(1) nth_root: this would wrap GMP's mpz_root.
(2) exact_power: would accept a rational number as an index, and work out which root to take. For example

(-8/27).exact_power(2/3) == 4/9

I had to take an exact 6th root of a rational in some code the other day and it was painful going via real numbers, worrying about bits of precision and all that.

Component: basic arithmetic

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

full keyboard mode for notebook

Currently I need to switch between my keyboard and mouse a lot to operate the notebook, especially when using it for development. For example, I would like to be able to restart the server without going for the mouse. There should be a way of assigning keyboard shortcuts.

Component: notebook

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

update M2 to the 1.1 release

due to an upcoming release of M2 update to current svn as recommened by the M2 developers.

This used to be:

This is on a minimal Ubuntu install without the system-wide readline-dev package.
SAGE's M2 build script should use SAGE's readline, but it isn't.

configure: error: missing library: readline
{'_': './spkg-install', 'CPPFLAGS': '-I/home/was/s/local/include  ', 'SAGE_LOCAL': '/home/was/s/local', '__sage__': '', 'PYTHONHOME': '/home/was/s/local', 'SSH_CLIENT': '192.168.3.1 51123 22', 'LOGNAME': 'was', 'USER': 'was', 'HOME': '/home/was', 'PATH': '/home/was/s/spkg/build/macaulay2-2006-08-26:/home/was/s:/home/was/s/local/bin:/home/was/s:/home/was/s/local/bin:/home/was/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11:/usr/games', 'LD_LIBRARY_PATH': '/home/was/s/local/lib:/home/was/s/local/lib:', 'LANG': 'en_US.UTF-8', 'TERM': 'xterm-color', 'SHELL': '/bin/bash', 'LIBRARY_PATH': '/home/was/s/local/lib:/home/was/s/local/lib:', 'LANGUAGE': 'en', 'LN': 'ln', 'SAGE_STARTUP_FILE': '/home/was/.sage//init.sage', 'UNAME': 'Linux', 'EDITOR': 'vi', 'LDFLAGS': '-L/home/was/s/local/lib/ ', 'GP_DATA_DIR': '/home/was/s/local/share/pari', 'TOUCH': 'touch', 'RM': 'rm', 'LESSOPEN': '| /usr/bin/lesspipe %s', 'SAGE_STARTUP_COMMAND': '\nfrom sage.all import *;import os; os.chdir("/home/was/s");import sage.misc.interpreter;from sage.misc.interpreter import attached_files;_=sage.misc.interpreter.load_startup_file("/home/was/.sage//init.sage");\n', 'CUR': '/home/was/s/spkg/build', 'CC': 'gcc', 'PYTHONPATH': ':/home/was/s/local/lib/python2.4', 'MKDIR': 'mkdir', 'LD': 'ld', 'SAGE_DATA': '/home/was/s/data', 'DYLD_LIBRARY_PATH': '/home/was/s/local/lib:/home/was/s/local/lib::/home/was/s/local/lib::', 'SAGE64': 'no', 'AS': 'as', 'AR': 'ar', 'RANLIB': 'ranlib', 'CP': 'cp', 'SAGE_ROOT': '/home/was/s', 'SSH_CONNECTION': '192.168.3.1 51123 192.168.3.3 22', 'LESSCLOSE': '/usr/bin/lesspipe %s %s', 'CXX': 'g++', 'SSH_TTY': '/dev/pts/0', 'OLDPWD': '/home/was/s/spkg/build', 'SAGE_SERVER': 'http://modular.math.washington.edu/sage/packages', 'CHMOD': 'chmod', 'HISTCONTROL': 'ignoredups', 'SHLVL': '4', 'PWD': '/home/was/s/spkg/build/macaulay2-2006-08-26', 'MV': 'mv', 'SHAREDFLAGS': '-fPIC', 'DOT_SAGE': '/home/was/.sage/', 'MAIL': '/var/mail/was', 'LS_COLORS': 'no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.avi=01;35:*.fli=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.flac=01;35:*.mp3=01;35:*.mpc=01;35:*.ogg=01;35:*.wav=01;35:', 'MAKE': 'make', 'SAGE_PACKAGES': '/home/was/s/spkg'}
Error configuring M2

real    16m57.258s
user    0m31.322s
sys     2m51.991s
sage: An error occured while installing macaulay2-2006-08-26
Please email William Stein <[email protected]> explaining the
problem and send him /home/was/s/install.log
If you want to try to fix the problem, *don't* just cd to
/home/was/s/spkg/build/macaulay2-2006-08-26 and type 'make'.
Instead (using bash) type "source local/bin/sage-env" from the directory
/home/was/s
in order to set all environment variables correctly, then cd to
/home/was/s/spkg/build/macaulay2-2006-08-26

Component: packages: experimental

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

weird power series behavior

sage: R.<m> = LaurentSeriesRing(QQ)
   sage: S.<t> = LaurentSeriesRing(pAdicField(11))
   sage: S(m^(-2) + 10*m + m^2 + O(m^3))
   t^1 + 10*t^3 + t^4 + O(t^5) + 10*t^4 + 10*t^3 + t^4 + O(t^5) + t^5 + 10*t^3 + t^4 + O(t^5) + O(t^6 + 10*t^3 + t^4 + O(t^5))

Huh?

Component: basic arithmetic

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

Pari stack overflow

Once the Pari stack overflows, subsequent sage commands which use the Pari library do not work.

Ifti.


burhanud@sage:~$ sage
--------------------------------------------------------
| SAGE Version 1.3.7.1, Build Date: 2006-09-10-2157    |
| Distributed under the GNU General Public License V2. |
--------------------------------------------------------


sage: E = EllipticCurve([0,0,0,-307*1907,0])

sage: E.Lseries_deriv_at1()
---------------------------------------------------------------------------
exceptions.RuntimeError                              Traceback (most
recent call last)

/home/burhanud/<ipython console>

/home/was/sage/local/lib/python2.4/site-packages/sage/schemes/elliptic_curves/ell_rational_field.py
in Lseries_deriv_at1(self, k)
   1724         # Compute z = e^(-2pi/sqrt(N))
   1725         pi = 3.14159265358979323846
-> 1726         v = transcendental.exponential_integral_1(2*pi/sqrtN, k)
   1727         L = 2*float(sum([ (v[n-1] * an[n])/n for n in
xrange(1,k+1)]))
   1728         error = 2*exp(-2*pi*(k+1)/sqrtN)/(1-exp(-2*pi/sqrtN))

/home/was/sage/local/lib/python2.4/site-packages/sage/functions/transcendental.py
in exponential_integral_1(x, n)
     83         return float(pari(x).eint1())
     84     else:
---> 85         return [float(z) for z in pari(x).eint1(n)]
     86
     87 def gamma(s):

/home/burhanud/gen.pyx in gen._pari_trap()

RuntimeError: The PARI stack overflowed.  Use pari.allocatemem() to double
the stack.

sage: factor(4)
---------------------------------------------------------------------------
exceptions.RuntimeError                              Traceback (most
recent call last)

/home/burhanud/<ipython console>

/home/was/sage/local/lib/python2.4/site-packages/sage/rings/arith.py in
factor(n, proof, int_, algorithm, verbose)
   1244     if algorithm == 'pari':
   1245         return factorization.Factorization(__factor_using_pari(n,
-> 1246                                    int_=int_,
debug_level=verbose), unit)
   1247     elif algorithm == 'kash':
   1248         F = kash.eval('Factorization(%s)'%n)

/home/was/sage/local/lib/python2.4/site-packages/sage/rings/arith.py in
__factor_using_pari(n, int_, debug_level)
   1168         import sage.rings.integer_ring
   1169         Z = sage.rings.integer_ring.IntegerRing()
-> 1170     prev = pari.get_debug_level()
   1171     pari.set_debug_level(debug_level)
   1172     F = pari(n).factor()

/home/burhanud/gen.pyx in gen.PariInstance.get_debug_level()

/home/burhanud/gen.pyx in gen.PariInstance.default()

/home/burhanud/gen.pyx in gen._pari_trap()

RuntimeError: The PARI stack overflowed.  Use pari.allocatemem() to double
the stack.

sage: factor(4, algorithm='kash')
 2^2

Component: basic arithmetic

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

modular symbols -- crash when computing an eigenform

sage: M = ModularSymbols(12,4,sign=1).cuspidal_submodule()

sage: M.decomposition()[1].q_eigenform(10)
Traceback (most recent call last):
...
TypeError: Unable to coerce x (=[   0    1   -1    0 -7/2  7/2  3/2 -3/2    0]) to a morphism in Set of Morphisms from Modular Symbols subspace of dimension 1 of Modular Symbols space of dimension 9 for Gamma_0(12) of weight 4 with sign 1 over Rational Field to Modular Symbols space of dimension 9 for Gamma_0(12) of weight 4 with sign 1 over Rational Field in Category of sets

Component: basic arithmetic

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

PowerSeriesRing(QQ, 10) raises unhelpful exception

PowerSeriesRing(QQ, 10) crashes SAGE:

Traceback (most recent call last):
PowerSeriesRing(QQ, 10)
File "/home/server/", line 1, in ?

File "/sage/local/lib/python2.4/site-packages/sage/rings/power_series_ring.py",
line 44, in PowerSeriesRing
R = PowerSeriesRing_over_field(base_ring, name, default_prec)
File "/sage/local/lib/python2.4/site-packages/sage/rings/power_series_ring.py",
line 171, in __init__
PowerSeriesRing_generic.init(self, base_ring, name, default_prec)
File "/sage/local/lib/python2.4/site-packages/sage/rings/power_series_ring.py",
line 63, in __init__
self.__generator = self.__power_series_class(self, [0,1], check=True,
is_gen=True)
File
"/sage/local/lib/python2.4/site-packages/sage/rings/power_series_ring_element.py",
line 506, in __init__
f = R(f, check=check)
File "/sage/local/lib/python2.4/site-packages/sage/rings/multi_polynomial_ring.py",
line 481, in __call__
c = self.base_ring()(x)
File "/sage/local/lib/python2.4/site-packages/sage/rings/rational_field.py", line
155, in __call__
return sage.rings.rational.Rational(x, base)
File "rational.pyx", line 105, in rational.Rational.init
File "rational.pyx", line 183, in rational.Rational.__set_value
TypeError: Unable to coerce [0, 1] (<type 'list'>) to Rational

Component: basic arithmetic

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

p-adic integers class

from David Harvey:
I'm kind of on the run, but I just remembered it would be good to have a pAdicInteger class. Just like we have PowerSeries vs LaurentSeries, and Integer vs Rational, it would be good to have pAdicInteger and pAdicField. Basically the idea is that it doesn't have to keep track of ordp, which currently slows down certain operations a lot (like when I convert an integer to a padic, it has to compute ordp). Essentially it would be like Integers(p^n) but with a floating precision. A very natural application would be the padic sigma stuff I'm working on now.

I can't implement it and send you a patch due to time constraints, but perhaps if you like the idea you can add it to the roadmap.

Component: basic arithmetic

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

doctest failure in functions/special.py

sage -t -optional devel/sage-darcs/sage/functions/special.py*******************************************************\


File "special.py", line 756:
sage: inverse_jacobi("sn",0.47,1/2)
Exception raised:
Traceback (most recent call last):
File "/home/was/sage/local/lib/python2.4/doctest.py", line 1243, in __run
compileflags, 1) in test.globs
File "<doctest main.example13[1]>", line 1, in ?
inverse_jacobi("sn",RealNumber('0.47'),Integer(1)/Integer(2))###line 756:
sage: inverse_jacobi("sn",0.47,1/2)
File "/home/was/sage/local/lib/python2.4/site-packages/sage/functions/special.py", line 785, in inverse_jacob
i
return eval(maxima.eval("inverse_jacobi_sn(%s,%s)"%(RR(x),RR(m))))
File "", line 1
^[[
^
SyntaxError: invalid syntax


File "special.py", line 758:
sage: inverse_jacobi("sn",0.4707504,1/2)
Exception raised:

Component: basic arithmetic

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

customize preparsing

I made the suggested changes and everything works fine.

Thank you for replying so quickly.

I think that modifying the preparser to meet different needs
sounds like a good idea as long as the underlying code didn't
have to change.

WAIT ! -- good point. In fact, there is code in the SAGE library
that assumes that the preparser replaces ^'s by **'s. If you
do exactly what I suggested, you could get subtle bugs in certain
places involved in moving expressions between GAP/Singular and SAGE
that use the SAGE preparser.
So at least don't make those changes to preparse.py.

It's fine to make the changes to integer.pyx that defines __xor__,
and certainly you'll find that useful.

For now, the best thing for you to do might be to start SAGE with

sage -ipython 

to get SAGE with no preparsing at all.

The solution to all this is probably to make the interactive preparser
customizable and make those customizations only apply to the
interactive preparser. (I.e., the preparser will have a context as input,
one for the interactive session, and the other used internally by
the library). One could also have a context set at the top of a .sage
file.

Sorry for the confusion.

william

Component: basic arithmetic

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

command line option parsing

We should improve and/or modernize and/or revise Sage's command-line parsing.

Two ideas, which could be debated endlessly and could also be implemented independently of each other:

  • use Python's argparse module to handle the parsing, rather than a shell script
  • change Sage's options from flags to subcommands: sage --package ... would be changed to sage package ..., etc. (comment:56 and comment:57 list some possibilities)

Depends on #9958

CC: @kini @saraedum @gvol

Component: user interface

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

sin(integer) precision issue

I don't like how SAGE works for this (see below) (example from Fateman's mathematica review):

  sage: sin(3141592653589793238.0)   # very good
  -0.4463151633593201122015 
  sage: float(sin(3141592653589793238))   # very bad
  -0.64165348191050475

The problem is that SAGE is using the Python math library, which is the C library, which has
precision issues. The fix is to change sin(integer) to use mpfr.

Component: basic arithmetic

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

doc generation script typos

  • Paisa Seeluangsawat:
> There are typos in the docs.  They tend to get functions'
> optional arguments mixed up.  For an example, compare
>
> 
> http://modular.math.washington.edu/sage/doc/html/ref/module-sage.rings.multi-polynomial-ring.html
>
>     MPolynomialRing(base_ring, [n=False], [names=degrevlex],
>       [order=None], [macaulay2=1])
>
> with
>
>     $SAGE_ROOT/local/lib/python2.4/site-packages/sage/rings/
>
>     def MPolynomialRing(base_ring, n=1, names=None,
>                         order='degrevlex', macaulay2=False):

That's really weird. Many thanks for pointing out the problem.
That documentation is generated from the source code, so I'll investigate
the script that does the generation. Again, thanks for the bug
report.

Component: user interface

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

Notebook locking

Currently it is possible to run two SAGE notebooks on the same directory,
which is potentially VERY VERY bad. It would be better if when a SAGE
notebook server starts up it checks for the presence of a lock file. This
file would contain the pid of a running SAGE notebook process -- if the file
and that process exist, then the notebook won't start. When the notebook
finishes it should delete that lock file.

Component: notebook

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

confusing behaviour of pAdicField with series_print == False

The following behaviour, while strictly speaking not incorrect, is quite confusing:

sage: K = pAdicField(5, series_print=False)
sage:  K(37, prec=1)
 5^0 * (37 + O(5^1))

Really, it should be reducing 37 mod 5 when you do the conversion, or at the very least when you print it out, otherwise you don't realise that 37 + O(5) and 7 + O(5) are really the same thing. (This caused me a few hours of head-scratching today because I thought that two things didn't agree when actually they did.)

If you use the default series_print=True, then this doesn't happen:

sage: K = pAdicField(5)
sage:  K(37, prec=1)
 2 + O(5)

Component: basic arithmetic

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

spkg-install for singular

On Tue, 12 Sep 2006 17:32:37 -0700, Rob Gross [email protected] wrote:

I finally found my error, by deleting every alias and environment
variable in turn and seeing if I could then build sage successfully
from scratch. I'm still not sure why defining the environment
variable TMPDIR as /tmp caused a problem, but it did. TMPDIR defaults
to /tmp anyway, according to "man ar" which is why I'm a bit confused
why it caused a problem.

I can't remember why I had bothered to define TMPDIR in the first
place, but there must have been some other build at some other time
that needed it to be defined.

Thanks for all of your help. I suppose that adding a check to make
sure that no one else commits this particular act of stupidity might
be a good idea, but it's impossible to guess at all of the potential
things that could go wrong.--Rob

I can put "unset TMPDIR" in the spkg-install file for singular. I'm
really glad you tracked this down precisely!

William

Component: packages: standard

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

make it easy to turn off preparser

It's "from sage.all import *". But then I'm being dumb, since that
just turns the preparser back on.

The preparser in SAGE is activated in misc/interpreter.py in this line:

# Rebind this to be the new IPython prefilter:
InteractiveShell.prefilter = sage_prefilter

If you comment that one line out, then restart SAGE (with sage -br) you'll
get a SAGE that has no preparsing at all by default. Yet all the library
code
should work fine and you have the sage library functions available by
default.

That sounds reasonable. I undid the preparser.py change and commented out the
suggested line in interpreter.py. With a few basic tests everything seems OK.

I guess the default int is now a Python int, but that is okay for what I'm working on
right now.

Thanks for sorting this out.

Component: basic arithmetic

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

install guide -- add more about colinux

tried the CoLinux one and made it work after some settings on the
network connections. Some explanation of that in the documentatio
could be useful. Everything is working fine now and I think the
notebook interface is really useful.

There is a lot about the ntework connection setting stuff in the README
file that comes with the colinux install. I'll add it to the SAGE
install guide.

Component: basic arithmetic

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

failures building optional packages

  • Building optional packages under OS X Intel (status report on 08-25-06 by William Stein)
    Everything works except the following --
    * dvipng doesn't build (but shouldn't be needed, since this comes with tex)
    * RealLib3 -- fails with "LongFloat.cpp:6:20: error: malloc.h: No such file or directory"
    * numpy-2006-08-16.spkg -- fails with "KeyError: 'linker_exe'"
    * scipy-2006-08-16.spkg -- depends on numpy
    * soya-0.11.2.p0.spkg -- fails to find GL/glew.h (soya is probably very hard to build in OSX...)

Component: basic arithmetic

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

preparser issues

To: "Kyle Schalm" <[email protected]>, [email protected]
Subject: Re: [SAGEdev] long string parsing bug in 1.3.2.2

The SAGE pre-parser currently works on single lines only -- it doesn't
take into account multi-line blocks.  This is more a
not-implemented-error than a bug.  Many thanks for sending this email
though, since it's an excellent test case:
mm.sage:
---------------------
"""
load with
 
sage: load "/Users/kyle/Documents/math/scripts/mm.sage"
"""
---------------------

Component: user interface

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

gap boolean values don't coerce back

(KiranKedlaya) GAP boolean values do not automatically coerce back to SAGE, e.g.,

sage: if gap("2+2=4"):
   .....:     pass

returns an error, whereas

sage: if sage_eval(gap("2+2=4")):
   .....:     pass

does not. A more serious instance of this is:

sage: G = SymmetricGroup(8)
sage: A = AlternatingGroup(8)
sage: if (G._gap_().IsSubgroup(A)):
   .....:     print 1

Component: basic arithmetic

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

NTL modulus not reset correctly

 sage: x = PolynomialRing(Integers(100)).gen()
 sage: p = 3*x
 sage: q = 7*x
 sage: y = PolynomialRing(Integers(8)).gen()
 sage: p + q
   2*x
 sage: p + q
   10*x

I think what's happening is the following. The first p+q calls Polynomial_dense_mod_n.add(). This function does not reset the NTL modulus correctly before calling ntl_ZZ_pX.add(), hence the first bogus answer. Then Polynomial_dense_mod_n.add() calls PolynomialRing_dense_mod_n.call(), which does reset the NTL modulus.

Component: basic arithmetic

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

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.