Difference between revisions of "Main Page"

From Eigen
Jump to: navigation, search
(Core Team Mailing list)
Line 170: Line 170:
 
== Core Team Mailing list ==
 
== Core Team Mailing list ==
  
This '''private''' mailing list should only be used for matters that need to be discussed privately. It is read by Benoît and Gaël.
+
This '''private''' mailing list should only be used for matters that need to be discussed privately. It is read by Benoît and Gaël. For all Eigen development discussion, use the public [[#Mailing list|Eigen mailing list]].
  
 
Its address is '''eigen-core-team''' at the same lists server as for the [[#Mailing list|Eigen mailing list]].
 
Its address is '''eigen-core-team''' at the same lists server as for the [[#Mailing list|Eigen mailing list]].

Revision as of 14:25, 12 February 2010

Date: February 12, 2010

Eigen 2.0.12 released!

For details, see the ChangeLog.

Date: November 25, 2009

Eigen 3.0 plans announced.

Even the first beta of Eigen 3.0 is still far away. It is not yet time to port your code to it.

Overview

Eigen is a C++ template library for linear algebra: vectors, matrices, and related algorithms. It is:

  • Versatile. (See modules and tutorial). Eigen handles, without code duplication, and in a completely integrated way:
    • both fixed-size and dynamic-size matrices and vectors.
    • both dense and sparse (the latter is still experimental) matrices and vectors.
    • both plain matrices/vectors and abstract expressions.
    • both column-major (the default) and row-major matrix storage.
    • both basic matrix/vector manipulation and many more advanced, specialized modules providing algorithms for linear algebra, geometry, quaternions, or advanced array manipulation.
    • various numeric types out of the box, including std::complex numbers, while being easy to extend to custom numeric types.
  • Fast. (See benchmark).
    • Expression templates allow to intelligently remove temporaries and enable lazy evaluation, when that is appropriate -- Eigen takes care of this automatically and handles aliasing too in most cases.
    • Explicit vectorization is performed for the SSE (2 and later) and AltiVec instruction sets, with graceful fallback to non-vectorized code. Expression templates allow to perform these optimizations globally for whole expressions.
    • With fixed-size objects, dynamic memory allocation is avoided, and the loops are unrolled when that makes sense.
    • For large matrices, special attention is paid to cache-friendliness.
  • Elegant. (See API showcase). The API is extremely clean and expressive, thanks to expression templates. Implementing an algorithm on top of Eigen feels like just copying pseudocode. You can use complex expressions and still rely on Eigen to produce optimized code: there is no need for you to manually decompose expressions into small steps.
  • Compiler-friendy. Eigen has very reasonable compilation times at least with GCC, compared to other C++ libraries based on expression templates and heavy metaprogramming. Eigen is also standard C++ and supports various compilers.

FAQ

Frequently asked questions are on that page.

We have a special Licensing FAQ too.

Documentation

The documentation is here. This is for the stable version.

It includes a Tutorial.

Here is the documentation of the unstable development branch.

To learn about the internals of Eigen, read this example and check out this page about some of Eigen's internal mechanisms: EigenInternals.

Requirements

Eigen doesn't have any dependencies other than the C++ standard library.

We use the CMake build system, but only to build the documentation and unit-tests, and to automate installation. If you just want to use Eigen, you can use the header files right away. There is no binary library to link to, and no configured header file. Eigen is a pure template library defined in the headers.

Download

The latest stable release is Eigen 2.0.12. Get it here: tar.bz2, tar.gz, zip.

Past releases, including beta and RC releases can be found on this page.

You can download snapshots directly from our repository, though of course you can't expect as much stability as in releases.

  • Latest source code from the stable tree, or 2.0 branch: tar.bz2, tar.gz, zip.
  • Latest source code from the unstable tree, or development branch: tar.bz2, tar.gz, zip.

You can browse the source code.

The SCM tool used for Eigen development is Mercurial also known as "hg".

To check out the Eigen repository, do:

hg clone https://bitbucket.org/eigen/eigen/

After you have run this command, you have a eigen/ directory defaulting to the development branch (heading toward the next major version, 3.0).

If instead you want the 2.0 branch, enter the eigen/ directory and do:

hg up 2.0

If instead you want the 2.0.12 tag, enter the eigen/ directory and do:

hg up 2.0.12

For more information about using Mercurial with Eigen, see this page.

License

Eigen is Free Software. It is licensed under the LGPL3+. As an alternative license choice, Eigen is also licensed under the GPL2+.

Virtually any software may use Eigen. For example, closed-source software may use Eigen without having to disclose its own source code. Many proprietary and closed-source software projects are using Eigen right now, as well as many BSD-licensed projects.

See the Licensing FAQ for more information, and do not hesitate to contact us if you have any questions.

Compiler support

Eigen is standard C++98 and so should theoretically be compatible with any compliant compiler. Whenever we use some non-standard feature, that is optional and can be disabled.

Eigen is being successfully used with the following compilers:

  • GCC, version 3.3 and newer. Very good performance with GCC 4.2 and newer.
  • MSVC (Visual Studio), 2005 and newer. Vectorization is enabled with 2008 and newer, which also gives good performance.
  • ICC (Intel compiler), recent versions. Very good performance.
  • MinGW, recent versions. Performance is poor because MinGW uses GCC 3. This problem will go away whenever MinGW upgrades to GCC 4. If this is an important issue for you, you can try the unofficial drop-in replacements for gcc4 in mingw. In gentoo, the mingw32 cross-compiler targeting windows is using the latest gcc (currently 4.4). Please also note that the compiler bundled with the latest Qt SDK for windows is gcc 4.4 and hence is ok.
  • The Sun compiler is supported in the development branch (this compiler is not fully compliant with c++ standards)
  • QNX's QCC compiler (requires Eigen 2.0.12 or newer).

Here are some comments about GCC compiler flags.

  • At least some optimization is mandatory to get even remotely decent speed. -O1 gives something decent for a debug mode, at 30-60% of the optimal speed. -O2 generally gives optimal speed. -O3 does not have much advantages over -O2, in our experience.
  • Debugging info with -g (equivalently -g2) can increase dramatically the executable file's size. This is always the case, but even more so with Eigen.
  • Disabling asserts, by defining -DNDEBUG or -DEIGEN_NO_DEBUG, improves performance in some cases.
  • Vectorization is automatically enabled if a SIMD instruction set is enabled by the compiler. On the x86 platform, SSE2 is not enabled by default and you need to pass the -msse2 option.

Concerning clang/llvm, we do test from times to times but this new C++ compiler is not yet able to compile Eigen.

Projects using Eigen

Science

Robotics and engineering

Computer Graphics

  • VcgLib, an opensource C++ template library for the manipulation and processing of triangle and tetrahedral meshes. (switched from home made math classes)
  • MeshLab, an opensource software for the processing and editing of unstructured 3D triangular meshes and point cloud. (switched from vcglib's math classes)
  • Expe, an experimental framework for the rapid prototyping of graphics applications. No release yet, but it uses 90% of Eigen's features. (switched from home made math classes).
  • libmv, an opensource structure from motion library. (switched from FLENS)

KDE (our origins!)

  • Gluon, a high-level KDE game development library.
  • Step, an educational physics simulator.
  • Koffice2 (KDE's office suite), in particular Krita, the painting and image editing module. Eigen is also used a bit by KSpread, the spreadsheet module, for matrix functions such as MINVERSE, MMULT, MDETERM.
  • Kalzium uses Eigen indirectly through the aforementioned Avogadro library.
  • the Mandelbrot wallpaper plugin, some screensavers, kgllib, solidkreator, etc.

If you are aware of some interesting projects using Eigen, please send us a message or directly edit this wiki page !

Get support

Need help using Eigen? Try this:

Bug reports

For bug reports and feature requests, please use the issue tracker.

Mailing list

The Eigen mailing list is where the discussion of Eigen development happens. It is public and has public archives.

Its address is eigen@lists.tuxfamily.org

Important: You must subscribe before you may post. Sorry, this is our only way to prevent spam.

  • To subscribe, send a mail with subject subscribe to eigen-request@lists.tuxfamily.org
  • To unsubscribe, send a mail with subject unsubscribe to eigen-request@lists.tuxfamily.org

Important: After you sent your subscription request, you will receive a confirmation e-mail. Check your spam folder, as these confirmation e-mails are often filtered as spam!

If you need to write privately to some of the main Eigen developers, use the Core Team Mailing list.

Core Team Mailing list

This private mailing list should only be used for matters that need to be discussed privately. It is read by Benoît and Gaël. For all Eigen development discussion, use the public Eigen mailing list.

Its address is eigen-core-team at the same lists server as for the Eigen mailing list.

No need to subscribe (actually, subscription is closed).

Only use it for stuff that needs to be discussed privately. A typical use case is if you would like to offer development/consulting contracts to Eigen developers, and don't know whom to write to. You can then write to eigen-core-team, and we'll be able to recommend to you some Eigen developer(s) specially qualified for the task. You can of course write directly to any Eigen developer, there is no requirement of any sort to go through eigen-core-team. But we can help you get in touch with the right person, we can advise you on how to make things work best with the Eigen project and community, and we always appreciate being informed.

IRC Channel

Our IRC channel is #eigen on irc.freenode.net.

Everybody's welcome to discuss Eigen-related topics or just chat. Some quick Eigen development chat happens over IRC, but the main place for Eigen development discussion remains the Eigen mailing list. Some user support also happens over IRC, but the main place for Eigen user support is the Users Forum.

Credits

The Eigen project was started by Benoît Jacob (founder) and Gaël Guennebaud (guru). Many other people have since contributed their talents to help make Eigen successful. In alphabetical order:

David Benjamin Artwork: the owls
Armin Berres Lots of fixes (compilation warnings and errors)
Mark Borgerding FFT module
Thomas Capricelli Migration to mercurial, Non-linear optimization and numerical differentiation, cron-job to update the online dox
Andrew Coles Fixes (including a compilation error)
Christian Ehrlicher MSVC compilation fix
Daniel Gomez Ferro Improvements in Sparse and in matrix product
Rohit Garg Vectorized quaternion and cross products, improved integer product
Mathieu Gautier QuaternionMap and related improvements
Gaël Guennebaud Core developer
Marcus D. Hanwell CMake improvements. Marcus is a developer at Kitware!
Hauke Heibel Lots of increasingly 'core' things
Benoît Jacob Core developer
Marijn Kruisselbrink CMake fixes
Moritz Lenz Allow solving transposed problem with SuperLU
Konstantinos A. Margaritis AltiVec vectorization
Ricard Marxer Reverse, redux improvements, the count() method, some dox
Vincenzo Di Massa CMake fix
Christian Mayer Early code review and input in technical/design discussions
Frank Meier-Dörnberg MSVC compatibility fixes
Keir Mierle LDLT decomposition and other improvements
Laurent Montel CMake improvements. Laurent is (with Alexander) one of the CMake gurus at KDE!
Alexander Neundorf CMake improvements. Alexander is (with Laurent) one of the CMake gurus at KDE!
Jitse Niesen Matrix exponential, improved tutorial
Jos van den Oever Compilation fix
Michael Olbrich Early patches, including the initial loop meta-unroller.
Stjepan Rajko MSVC compatibility fix
Jure Repinc CMake fixes
Kenneth Frank Riddile Lots of Windows/MSVC compatibility fixes
Peter Román support for SuperLU's ILU factorization
Guillaume Saupin Skyline matrices
Benjamin Schindler gdb pretty printers
Alex Stapleton Help with tough C++ questions
Anthony Truchet Bugfix in QTransform and QMatrix support
James Richard Tyrer CMake fix
Rhys Ulerich Pkg-config support
Ingmar Vanhassel CMake fix
Scott Wheeler Documentation improvements
Urs Wolfer Fixed a serious warning
Manuel Yguel Bug fixes and work on inverse-with-check


Eigen is also using code that we copied from other sources. They are acknowledged in our sources and in the Mercurial history, but let's also mention them here:

Intel Corporation SSE code for 4x4 matrix inversion taken from here.
Julien Pommier SSE implementation of exp,log,cos,sin math functions from GMM++
Minpack authors Algorithms for non linear optimization.

Special thanks to Tuxfamily for the wonderful quality of their services!