Giter VIP home page Giter VIP logo

glucat's Introduction

README for GluCat 0.12.1 with PyClical

GluCat is a library of C++ template classes for calculations with the universal Clifford algebras over the real field. The dimension of the algebras you can use is limited only by computer word size. Unlike some software packages for Clifford algebras, the maximum signature is fixed by default or by user defined template parameter values, and calculations are performed in the appropriate subalgebra.

GluCat classes are meant to be used as numeric classes with other template libraries. To do this, GluCat classes need to look and behave like floating point numeric types such as float and double. The GluCat classes do this by providing a definition for std::numeric_limits<>, most or all the expected operators like +, -, *, /, and functions like sqrt(). In use with other template libraries, you will need to look out for the differences between GluCat classes and floating point numeric types. Two key differences are that Clifford algebras do not have a total ordering, and that multiplication in Clifford algebras is not necessarily commutative. A third difference is that not all non-zero elements of a Clifford algebra have a multiplicative inverse.

PyClical is a Python extension module that is designed to make it easy for you to use Python to perform computations in Clifford algebras, and to implement algorithms and programs that use these computations. The syntax and semantics of the main index_set and clifford classes in PyClical is designed to be as similar as possible to that of the GluCat template classes index_set<> and matrix_multi, so that you should be able to use PyClical to teach yourself how to use calculations in Clifford algebras, and then transfer that knowledge to your ability to use GluCat template classes in C++.

Before you go any further

To make the best use of the GluCat template library and the PyClical extension module, you will need to become familiar with Geometric Algebra and Clifford algebras in general. The AUTHORS.md file includes lists of recommended web pages, books, and software that can help you to learn about Clifford algebras. Here is a short list to get you started.

You should also install PyClical and run the tutorials. Once you have run the PyClical tutorials, run the PyClical demos and look at the sample demo output. Now examine the C++ code for the GluCat tests, as well as the sample output. Finally, look at Glucat API documentation. Instructions for each of these steps are given below.

Getting started

To use the software to its full potential, you will want to:

  1. Download and update the software,
  2. Understand the source code directory structure,
  3. Resolve dependencies, install and test the software,
  4. Use the PyClical extension module with Python,
  5. Write C++ programs that use GluCat classes,
  6. Compile and run C++ programs that use GluCat classes, and finally,
  7. Help to improve the software by requesting features, filing bug reports and writing your own source code patches.

These tasks are treated in some detail below.

1 Downloading and updating the software

You can download new versions of GluCat from http://sourceforge.net/projects/glucat/files/ or alternatively, use the Git version: From SourceForge: http://sourceforge.net/p/glucat/git/ci/master/tree/ From GitHub: https://github.com/penguian/glucat For more on installing from Git, see INSTALL.md.

2 Understanding the source code directory structure

GluCat is a C++ template library, similar to the C++ Standard Library or the Boost uBLAS Library (uBLAS). It consists of source code header files, a suite of test routines, and the PyClical Python extension module and associated files.

Once you have downloaded, unzipped and untarred the GluCat source code, you should have a directory, glucat-xxx, where xxx is the version number. Under glucat-xxx you should see a number of directories, including ./admin, ./doc, ./gfft_test, ./glucat, ./m4, ./products, ./pyclical, ./squaring, ./test, ./test_runtime, ./testxx, and ./transforms.

The ./glucat directory contains all the header files that define the GluCat C++ template library.

The ./pyclical directory contains the C++ and Cython source code for the PyClical Python extension module, as well as a subdirectory ./pyclical/demos containing Python source code for the PyClical demos and tutorials, and sample demo output.

The ./admin and ./m4 directories are part of the autotools infrastructure for building GluCat, and should normally be left unchanged.

The ./doc directory contains documentation. Currently only the GluCat API Reference Manual can be found here, under ./doc/api.

The ./gfft_test, ./products, ./squaring and ./transform directories contain the C++ source code for timing tests for GluCat.

The ./test and ./testxx directories contain the C++ source code for programming examples and regression tests for GluCat.

The ./test_runtime directory contains regression test input and sample output for the GluCat timing and regression tests.

3 Resolving dependencies, installing and testing the software

Detailed instructions for these tasks are included in the ./INSTALL.md file in the same directory that contains this README.md file.

4 Using the PyClical extension module with Python

The PyClical Python extension module is written in C++ and Cython, and is defined in the files pyclical/glucat.pxd, pyclical/PyClical.h, pyclical/PyClical.pxd, and pyclical/PyClical.pyx. PyClical is designed to be installed using make. For details on building PyClical, see the ./INSTALL.md file.

The following instructions assume that you have already installed PyClical. If you have only run make within the PyClical directory, but have not yet installed PyClical, then, assuming you are using the bash interpreter on Linux, you will need to set the PYTHONPATH environment variable so that Python can find your newly built copy of PyClical. If the make has succeeded, you should have the file ./pyclical/PyClical.so. Set PYTHONPATH to include the full ./pyclical directory path name before any other path names. For example:

  export PYTHONPATH=/home/leopardi/src/glucat/pyclical:$PYTHONPATH

or you can change the PYTHONPATH variable for just one command, e.g.

  PYTHONPATH=/home/leopardi/src/glucat/pyclical:$PYTHONPATH python3

PyClical is designed to be used within a Python environment. You will usually need to run a Python IDE or interpreter, such as IDLE, ipython3 or python3. The following instructions use the standard python3 interpreter.

To use the capabilities of PyClical from within Python, you must either import the PyClical extension module or import objects from this module. The simplest way to do this is to use the following Python statement:

>>> from PyClical import *

Probably the easiest way to get familiar with PyClical is to make a copy of the pyclical/demos directory and run the tutorials and demos. By default, the pyclical/demos directory installs into /usr/local/share/pyclical/demos.

For example, assuming you are using the Bash shell on Linux, and have installed PyClical, use the following commands:

% cp /usr/local/share/pyclical/demos /path/to/my/demos
% cd /path/to/my/demos
% python3 pyclical_tutorials.py

where you must replace /path/to/my/demos with the real pathname you want to use.

The pyclical_tutorials program starts by displaying

    Currently available PyClical tutorials:

    0.0 Notation.
    0.1 Index sets.
    0.2 Operations.
    0.3 Algebraic functions.
    0.4 Square root and transcendental functions.
    1.0 Plane geometry.
    1.1 Complex numbers.
    1.2 Space geometry and vector algebra.
    1.3 Electromagnetism and Lorentz transformations.
    1.4 The fourth dimension.
    1.5 Conformal Geometric Algebra.
    2.0 Exterior product.

    Enter the number for the tutorial you want to run, or Q to quit:

Just enter one of the numbers, e.g. 0.0, or Q to quit. At any point in an individual tutorial, you can interrupt by entering CTRL-c.

If you are running Linux or a Unix equivalent, the following should also work:

% cd /path/to/my/demos
% chmod +x pyclical_tutorials.py
% ./pyclical_tutorials.py

For more usage examples, see the example Python files clifford_demo.py, pyclical_demo.py, plotting_demo.py, plotting_demo_dialog.py, plotting_demo_mayavi.py, and sqrt_log_demo.py, and the example output files pyclical_demo.out and sqrt_log_demo.out.

To run clifford_demo.py, pyclical_demo.py, or sqrt_log_demo.py, use the following commands:

% cd /path/to/my/demos
% python3 $DEMO.py

where $DEMO is one of clifford_demo, pyclical_demo or sqrt_log_demo.

If you are running Linux or a Unix equivalent, the following should also work:

% cd /path/to/my/demos
% chmod +x $DEMO.py
% ./$DEMO.py

To run plotting_demo.py, run ipython3 --pylab and enter the following command at the IPython prompt:

In [1]: %run plotting_demo

This demo uses Matplotlib to produce a number of plots.

To run plotting_demo_mayavi.py, first ensure that you have Mayavi2 and wxPython installed and working. (See http://code.enthought.com/projects/mayavi/ and http://www.wxpython.org/ ) Then run ipython3 and enter the following command at the ipython3 prompt:

In [1]: %run plotting_demo_mayavi

This demo uses Matplotlib to produce a number of plots. With Mayavi and wxPython, these plots are displayed in interactive windows, you can rotate, zoom and pan them. See (e.g.) http://mayavi.sourceforge.net/docs/guide/ch03s04.html

You can also run the Mayavi plotting demo from a graphical user interface. To do this, run ./plotting_demo_dialog.py.

The tutorials and demos are also accompanied by a corresponding set of Jupyter notebooks. To build the notebooks, see INSTALL.md. To run the notebooks, assuming that you have a copy of the notebooks in the directory /path/to/my/demos, you have ipython3 installed, you have installed PyClical, or set PYTHONPATH appropriately, and you are able to use Jupyter notebooks via a web browser, use the following commands:

% cd /path/to/my/demos
% jupyter notebook

Your web browser should open a new window or tab, displaying a page that lists all of the available tutorials and demos as notebooks. To select a notebook, click on the corresponding name in the list.

5 Writing C++ programs that use GluCat classes

Once you have familiarized yourself with Clifford algebras and have tried using PyClical, take a good look at the test C++ code in ./test00 to ./test17 and the test output in ./test_runtime.

A good way to begin writing your own C++ code using GluCat is to start with the programming example code in ./test01. The file test01/peg01.cpp includes test/driver.h and test01/peg01.h.

The key lines of code in test/driver.h are:

 #include "glucat/glucat.h"
 #include "glucat/glucat_imp.h"
 #include "test/tuning.h"

The first line includes "glucat/glucat.h", a convenience header that includes all the GluCat declarations.

The second line includes "glucat/glucat_imp.h", a convenience header that includes all the GluCat definitions.

The third line includes "test/tuning.h", a convenience header that defines specific instances of tuning<> for use as Tune_P, the tuning policy class. This class is used as a template parameter in in the template classes framed_multi<> and matrix_multi<>. The tuning<> template class is defined in "glucat/tuning.h". See this file and "test/tuning.h" for examples of values that you can use for the template parameters of tuning<> for use as Tune_P.

The key line of code in test01/peg01.h is:

 using namespace glucat;

Glucat defines and uses the ``glucat::namespace. You can use names from this namespace by using theglucat::` prefix or by the `using` declaration above.

To obtain detailed information on the GluCat namespaces, classes and functions, see the Doxygen documentation in doc/api/GluCat-API-reference-manual.pdf (PDF) and doc/api/html/ (HTML). By default, this documentation is installed in the directories /usr/local/doc/glucat/api/pdf and /usr/local/doc/glucat/api/html respectively.

5.1 Truncation

Because the transform from framed_multi<> to matrix_multi<> may involve many multiplications and additions, rounding errors can accumulate and result in one or more non-zero matrix entries where exact arithmetic would have yielded zero. Similarly, the inverse transform from matrix_multi<> to framed_multi<> can result in small non-zero terms which would be zero in exact arithmetic.

The clifford_algebra::truncated() member function returns the multivector *this with all relatively small terms set to zero. The function compares the absolute value of each term to the largest absolute value of any term, and sets to zero any term whose relative absolute value is smaller than the given limit. The default limit is std::numeric_limits<Scalar_T>::epsilon(). The truncated() matrix function operates similarly to set relatively small matrix entries to zero.

5.1.1 Printing uses truncation

Printing using operator<<() uses truncation to suppress the printing of relatively small terms. Depending on the floating point format used, the truncation used is calculated using the floating point precision as follows.

scientific:

  truncation = 10 ** -(precision+1)

fixed:

  truncation = (10 ** -precision) / max_abs

This has the effect of deleting all terms whose absolute value is less than 10 ** -precision.

hexfloat:

  truncation = default_truncation

default:

  truncation = 10 ** -precision

See (e.g.) https://www.cplusplus.com/reference/ios/ios_base/precision/ and see ./test17 for examples.

6 Compiling and running C++ programs that use GluCat classes

You can use the Makefile for ./test01 as the starting point for your own Makefile. Your Makefile needs to pass the appropriate flags to your compiler.

  • Make sure that the header installation directory is in your include path. The default header installation directory is /usr/local/include/.

  • GluCat uses preprocessor defines to control header files. See "To Configure" in the ./INSTALL.md file for details of these preprocessor defines.

7 Helping to improve the software

To request features, file bug reports or submit source code patches:

The fastest way to ask for help with GluCat or to submit patches is to send an email to the project manager ( Paul Leopardi < [email protected] > ).

The SourceForge page http://sourceforge.net/projects/glucat/support also provides project forums, project mailing lists and project trackers.

The GitHub project page at https://github.com/penguian/glucat provides a convenient interface that allows you to fork the code and create pull requests.

If you are thinking of writing patches, please try to match the programming style used in the relevant source files, and be aware of the coding standards used, as listed below.

Coding standards

The headers are split into declarations and definitions. The software was developed using the GNU g++ compiler. Separate compilation is possible, if you include both the declarations and definitions in each compilation unit, but compilation is slow and the resulting binary is large.

The code follows many, but not all of the guidelines in the GNU C++ Standard Library Style Guidelines at https://gcc.gnu.org/onlinedocs/libstdc++/manual/source_code_style.html

The code also follows much of Scott Meyers' advice from "Effective C++", Second Edition.

Some code conventions are:

  • name_t: The name of a type, either global or local to a class.
  • Sentence_Case_T: The name of a type used as a template parameter.
  • Other_Sentence_Case: Other template parameters, including template template parameters.
  • ALL_CAPS_WITH_UNDERSCORES: A global constant defined in <glucat/global.h>

glucat's People

Contributors

penguian avatar drewitz avatar

Stargazers

 avatar Drewbot avatar  avatar Everton Jr. avatar  avatar Morgan Hough avatar Alexander Hirner avatar ANDONG HUANG avatar VirtLands avatar Jenny Squibb avatar Utensil avatar Michael Tesch avatar Toan Tran avatar  avatar Hugo Hadfield avatar  avatar Slavomir Kaslev avatar Barthez avatar salotz avatar

Watchers

James Cloos avatar  avatar Hugo Hadfield avatar Drewbot avatar  avatar

glucat's Issues

Properly cope with missing Cython

Some related issues:

  1. The check for Cython in ./configure should check for the Python 3 version of Cython, independently the of Linux distribution.
  2. When Cython is not available, building pyclical relies on the existence of pyclical/PyClical_nocython.cpp, but this file is not in the Git repository. Therefore building from a Git clone depends on Cython being available, and fails otherwise.
  3. Running make dist can fail if pyclical/PyClical_nocython.cpp does not already exist, even if Cython is available. Instead, it should create pyclical/PyClical_nocython.cpp.

Deprecate some configuration options

The following options to ./configure are essentially superceded and should be deprecated for the next release (0.10.1 ?) and removed in the following release, with an accompanying simplification of the source code.

  --enable-check-isnan    check for NaN values at various places in the code [default=yes]

In practice, this type of checking has not slowed execution speed by much. Also, the code now also checks for Inf in various places and it its not clear how this option should be changed to cope with check for Inf. The option should be removed, and the checks for Inf and NaN should always be performed.

  --with-stdlib[=ARG]     C++ standard library to use
                          (libcxx|libstdcxx)
                          [default=libstdcxx]

This option is currently applied only to Clang++ and only when the option libcxx is chosen. The default for recent Clang++ versions is to use libc++ rather than libstdc++. In other words, contrary to the INSTALL documentation, this option has no effect. It is not clear at this stage what value would be added by allowing Clang++ to use libstdc++. The option should be removed, since it has no effect anyway.

  --with-map[=ARG]        type of map to use
                          (map|stdunordered)
                          [default=stdunordered]

In practice, the hash function used with famed_multi has worked reasonably well, and has been asymptotically faster than just using std::map. The option should be removed, and std::unordered_map should always be used, with the exception of cases where ordering is needed, such as printing.

  --with-pool-alloc       use Boost Pool allocator
                          [default=no]

The use of the Boost pool allocator only affects std::map, and the code performs adequately without it. The option should be removed, and the Boost pool allocator should no longer be used.

  --with-dense-mat        uses dense matrices [default=yes]

While the code works with sparse matrices, in practice the uBLAS sparse implementation is too slow for general arithmetic operations, while multi-gigabyte memory spaces are now common. The option should be removed, and matrices should be dense, with the exception of the matrices used for the basis element cache.

  --with-random[=ARG]     type of random number generator to use
                          (std|gsl) [default=std]

The C++11 standard random number generators essentially supercede the GSL random number generators. The option should be removed, and the standard random number generators should always be used.

Internationalize

The current code is entirely written and documented in English. It needs an internationalization framework and translations if it is ever to be available in other languages.

Add multivector isinf to match isnan

The clifford_algebra template class has an isnan member function, which returns true if the coefficient of any term is NaN as per traits_t::isNaN. Add the corresponding isinf member function using traits_t::isInf.

Write a user manual

The code has INSTALL, README and TODO files, as well as Doxygen documentation, programming examples, and Python help and tutorials. One thing that is still missing is a manual written from a user's perspective. The existing documentation, examples and tutorials provide good starting materials for such a manual. My Masters thesis from UNSW in 2002 could also provide introductory and supporting material.

Port build system from Autotools to CMake

Even though the build system of GluCat has recently been overhauled, it still uses Autotools. Since (as a separate issue) a port from uBLAS to Armadillo is being considered, this could be an opportunity to port the build system to CMake. This could have other advantages, including an opportunity to refactor the test and example programs. Another possible longer term advantage would be to enable a port to Windows.

See: StackOverflow: "Tutorial for converting autotools to cmake", StackOverflow: "Linking to Armadillo libraries with CMake".

Fix clang-tidy bugprone issues

Running clang-tidy with bugprone-* checks, except for bugprone-reserved-identifier and `bugprone-easily-swappable-parameters' results in:

leopardi@pensieri:~/sync/src/glucat/git/glucat$ clang-tidy.sh 'bugprone-*,-bugprone-reserved-identifier,-bugprone-easily-swappable-parameters'
245 warnings generated.
./glucat/framed_multi_imp.h:297:9: warning: repeated branch in conditional chain [bugprone-branch-clone]
        return false;
        ^
./glucat/framed_multi_imp.h:297:21: note: end of the original
        return false;
                    ^
./glucat/framed_multi_imp.h:299:9: note: clone 1 starts here
        return false;
        ^
./glucat/index_set_imp.h:71:38: warning: either cast from 'int' to 'glucat::set_value_t' (aka 'unsigned long') is ineffective, or there is loss of precision before the conversion [bugprone-misplaced-widening-cast]
    if (!prechecked && folded_val >= set_value_t(1 << frm.count()))
                                     ^
./glucat/index_set_imp.h:1007:3: warning: operator=() does not handle self-assignment properly [bugprone-unhandled-self-assignment]
  operator= (const reference& j) -> reference&
  ^
Suppressed 232 warnings (232 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.

Fix these issues.

Port linear algebra from uBLAS to Blaze

GluCat uses uBLAS for linear algebra, except for finding eigenvalues, where it uses Boost Bindings. The two different libraries use different matrix formats. Also, uBLAS is quite slow, especially for algorithms such as the addition of compressed matrices. Perhaps Blaze would be better?

Support Intel OneAPI compilers

Intel now has an icpx C++ compiler based on Clang, as well as icpc, which it now calls "Classic". Bring the configuration and build system up to date to support these as well as current GCC and Clang compilers. Check backward compatibility.

Port linear algebra from uBLAS to Armadillo

GluCat uses uBLAS for linear algebra, except for finding eigenvalues, where it uses Boost Bindings. The two different libraries uses different matrix formats. Also, uBLAS is quite slow, especially for algorithms such as the addition of compressed matrices. Perhaps Armadillo would be better?

Make headers more self-contained

Some of the Glucat headers are not self-contained. For example, compiling the following code in framed_multi.cpp:

#include "glucat/framed_multi.h"
int main(int argc, char ** argv)
{ return 0; }

using

g++ -std=c++11 -std=c++11 -DHAVE_CONFIG_H -I. -I..  -I. -I..     -Wall -g -O3  -march=native -finline-limit=8000 --param large-function-insns=8000 --param max-inline-insns-auto=8000 --param max-inline-insns-single=8000 --param inline-unit-growth=200 --param large-function-growth=200 -funroll-loops -fvariable-expansion-in-unroller -DNDEBUG -D_GLUCAT_USE_STD_UNORDERED_MAP -D_GLUCAT_USE_DENSE_MATRICES -D_GLUCAT_CHECK_ISNAN -Wno-unused-local-typedefs -Wno-deprecated-register -fno-check-new -DHAVE_BITS_WORDSIZE_H -D_GLUCAT_HAVE_BOOST_SERIALIZATION_ARRAY_WRAPPER_H -fexceptions -MT framed_multi.o -MD -MP -MF .deps/framed_multi.Tpo -c -o framed_multi.o framed_multi.cpp

results in

In file included from framed_multi.cpp:32:
../glucat/framed_multi.h:118:56: error: ISO C++ forbids declaration of ‘type name’ with no type [-fpermissive]
  118 |   operator<< (std::ostream& os, const std::pair< const index_set<LO,HI>, Scalar_T >& term) -> std::ostream&;
      |                                                        ^~~~~~~~~
../glucat/framed_multi.h:118:83: error: wrong number of template arguments (1, should be 2)
  118 |   operator<< (std::ostream& os, const std::pair< const index_set<LO,HI>, Scalar_T >& term) -> std::ostream&;
      |                                                                                   ^
In file included from /usr/include/c++/11/bits/stl_algobase.h:64,
                 from /usr/include/c++/11/bits/char_traits.h:39,
                 from /usr/include/c++/11/string:40,
                 from ../glucat/errors.h:34,
                 from ../glucat/framed_multi.h:35,
                 from framed_multi.cpp:32:
/usr/include/c++/11/bits/stl_pair.h:211:12: note: provided for ‘template<class _T1, class _T2> struct std::pair’
  211 |     struct pair
      |            ^~~~
[...]

See (e.g.) https://www.modernescpp.com/index.php/c-core-guidelines-the-remaining-rules-to-source-files

For now, the headers that use Tune_P will still need to depend on the user or tests defining this type. This will be treated in a separate issue.

Make promotion monotonic

Ensure that numeric_traits<Scalar_T>::promoted::type always has at least as many mantissa bits as Scalar_T, and numeric_traits<Scalar_T>::demoted::type has at most as many mantissa bits as Scalar_T.

See https://en.cppreference.com/w/cpp/language/types . The C++ float and double types are usually based on the IEEE 754 32 bit and 64 bit floating point standards. In contrast, the long double type can be anywhere from 64 bits (as IEEE 754 64 bit floating point) to 128 bits (as IEEE 754 128 bit floating point). The 128 bit format has a precision of 113 bits, but the dd_real format has a precision of only 106 bits.

If long double has the same number of mantissa bits as double, promote as: float -> double -> dd_real -> qd_real, long double -> dd_real, and demote as: qd_real -> dd_real -> double -> float, long double -> float.

If long double has more mantissa bits than dd_real, promote as: float -> double -> dd_real -> long double -> qd_real, and demote as: qd_real -> long double -> dd_real -> double -> float.

Otherwise, continue to promote as: float -> double -> long double -> dd_real -> qd_real, and demote as: qd_real -> dd_real -> long double -> double -> float.

Bring up to date

Ensure that the C++ code, Python, Markdown and Doxygen documentation work with current versions of these tools.

Use truncation in transforms and printing

  • In the transform from framed_multi to matrix_multi, use default truncation on the framed_multi input.
  • In the inverse transform from matrix_multi to framed_multi, use default truncation on the framed_multi output.
  • When printing, truncate appropriate to precision.

Remove deprecated configuration options

Following on from Issue #40 , remove the configuration options that are now deprecated, remove the associated tests, and remove the associated #define macro names and #if defined branches, to declutter the configuration, code, and tests.

Make default truncation depend on scalar type

Rather than having a single default truncation for all multivector classes, make it depend on the scalar type. Specifically, set the default truncation as follows:

default_truncation = std::numeric_limits<Scalar_T>::epsilon()

Migrate PyClical to Python 3

PyClical and its tutorials and demonstrations currently target Python 2.7. Python 2 is no longer supported. Use all necessary tools to migrate all Cython and Python files and associated setup, build, make files, etc. to Python 3.

Update test results and documentation for version 0.9.0

The test results and documentation need to be updated to reflect current compilers, tools, etc. in preparation for the release of version 0.9.0.

Testing should use as many compilers and versions as is feasible, since the C++ header code now needs C++11.

Add Blaze as an option for finding eigenvalues

GluCat uses uBLAS for linear algebra, except for finding eigenvalues, where it uses Boost Bindings. The two different libraries use different matrix formats. Also, uBLAS is quite slow, especially for algorithms such as the addition of compressed matrices. Perhaps Blaze would be better for finding eigenvalues? First step is to add it as an option alongside Boost Bindings.

Use current toolchains

Make minimal changes to the code, and some changes to the configuration, so that Glucat and PyClical compile and work with current Boost, Numeric Bindings, and QD, and compile with current GCC, Clang and Intel compilers.

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.