• Home
  • History
  • Annotate
Name Date Size #Lines LOC

..03-May-2022-

.github/H19-Nov-2021-63

applications/H03-May-2022-12,9208,173

benchmark/H19-Nov-2021-3,5502,322

bin/H03-May-2022-1,007864

c_api/H19-Nov-2021-2,7672,277

deprecated/universal/posit/H19-Nov-2021-2,3792,007

docker/H19-Nov-2021-300219

docs/H03-May-2022-8,5658,481

education/H19-Nov-2021-3,7002,571

include/H03-May-2022-61,38144,974

mixedprecision/H19-Nov-2021-1,218880

playground/H03-May-2022-992686

tests/H19-Nov-2021-51,27135,354

tools/H19-Nov-2021-2,6862,236

validation/H19-Nov-2021-233188

.dockerignoreH A D19-Nov-2021286 1815

.gitignoreH A D19-Nov-2021323 3021

.readthedocs.yamlH A D19-Nov-2021167 139

CITATION.cffH A D19-Nov-20211.5 KiB5756

CODE-OF-CONDUCT.mdH A D19-Nov-20213.2 KiB4728

CONTRIBUTORS.mdH A D19-Nov-20211.7 KiB6140

CommandLineTools.mdH A D19-Nov-202119.1 KiB415369

DockerfileH A D19-Nov-20215.7 KiB11494

Dockerfile.testH A D19-Nov-20214.6 KiB10382

LICENSEH A D19-Nov-20211.1 KiB2217

PURPOSE.mdH A D19-Nov-2021849 1210

README.mdH A D19-Nov-202126.5 KiB454330

UNIVERSALConfig.cmakeH A D19-Nov-2021294 87

appveyor_disabled.ymlH A D19-Nov-2021784 3936

build_test_container.shH A D19-Nov-202182 51

codeship-services.ymlH A D19-Nov-202168 54

codeship-steps.ymlH A D19-Nov-2021141 76

ideaH A D19-Nov-2021595 108

skeleton.cppH A D19-Nov-20211.2 KiB4031

README.md

1# Universal: a header-only C++ template library for universal number arithmetic
2
3[![Codacy Badge](https://api.codacy.com/project/badge/Grade/25452f0319d34bc2a553cd1857d7dfae)](https://app.codacy.com/gh/stillwater-sc/universal?utm_source=github.com&utm_medium=referral&utm_content=stillwater-sc/universal&utm_campaign=Badge_Grade_Dashboard)
4[![Awesome Cpp](https://awesome.re/mentioned-badge.svg)](https://github.com/fffaraz/awesome-cpp#math)
5[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fstillwater-sc%2Funiversal.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Fstillwater-sc%2Funiversal?ref=badge_shield)
6[ ![Codeship Status for stillwater-sc/universal](https://app.codeship.com/projects/22533f00-252a-0136-2ba6-6657a5454f61/status?branch=master)](https://app.codeship.com/projects/286490)
7[![Coverage Status](https://coveralls.io/repos/github/stillwater-sc/universal/badge.svg?branch=master)](https://coveralls.io/github/stillwater-sc/universal?branch=master)
8
9The goal of the Universal Numbers Library is to offer applications alternatives to IEEE floating-point that are more efficient and mathematically robust.
10
11The motivation to find improvements to IEEE floating-point had been brewing in the HPC community since the late 90's as most algorithms became memory bound and computational scientists were looking for alternatives that provided more granularity in precision and dynamic range. Even though the inefficiency of IEEE floating-point had been measured and agreed upon in the HPC community, it was the commercial demands of Deep Learning that provided the incentive to replace IEEE-754 with alternatives, such as half-floats, and bfloats. These alternatives are tailored to the application and yield speed-ups of two to three orders of magnitude, making rapid innovation in AI possible.
12
13The Universal library is a ready-to-use header-only library that provides plug-in replacement for native types, and provides a low-friction environment to start exploring alternatives to IEEE floating-point in your own algorithms.
14
15The basic use pattern is as simple as:
16
17```code
18#include <universal/number/posit/posit>
19
20template<typename Real>
21Real MyKernel(const Real& a, const Real& b) {
22    return a * b;  // replace this with your kernel computation
23}
24
25constexpr double pi = 3.14159265358979323846;
26
27int main() {
28    using Real = sw::universal::posit<32,2>;
29
30    Real a = sqrt(2);
31    Real b = pi;
32    std::cout << "Result: " << MyKernel(a, b) << std::endl;
33
34}
35```
36
37The library contains integers, decimals, fixed-points, rationals, linear floats, tapered floats, logarithmic, interval and adaptive-precision integers and floats. There are example number system skeletons to get you started quickly if you desire to add your own, which is highly encouraged.
38
39## Communication channels
40
41* [GitHub Issue](https://github.com/stillwater-sc/universal/issues): bug reports,
42  feature requests, etc.
43* [Forum](https://groups.google.com/u/1/g/unum-computing): discussion of alternatives to IEEE-754 for computational science.
44* [Slack](https://fptalks.slack.com): online chats, discussions,
45  and collaboration with other users, researchers and developers.
46
47## Citation
48
49Please cite [our work](https://arxiv.org/abs/2012.11011) if you use _Universal_.
50
51```bib
52@article{Omtzigt2020,
53    author    = {E. Theodore L. Omtzigt and Peter Gottschling and Mark Seligman and William Zorn},
54    title     = {{Universal Numbers Library}: design and implementation of a high-performance reproducible number systems library},
55    journal   = {arXiv:2012.11011},
56    year      = {2020},
57}
58```
59
60## Quick start
61
62If you just want to experiment with the number system tools and test suites, and don't want to bother cloning and building the source code, there is a Docker container to get started:
63
64```text
65> docker pull stillwater/universal
66> docker run -it --rm stillwater/universal bash
67stillwater@b3e6708fd732:~/universal/build$ ls
68CMakeCache.txt       Makefile      cmake-uninstall.cmake  playground  universal-config-version.cmake
69CMakeFiles           applications  cmake_install.cmake    tests       universal-config.cmake
70CTestTestfile.cmake  c_api         education              tools       universal-targets.cmake
71```
72
73## How to build
74
75If you do want to work with the code, the universal numbers software library is built using cmake version v3.18.
76Install the latest [cmake](https://cmake.org/download).
77There are interactive installers for MacOS and Windows.
78For Linux, a portable approach downloads the shell archive and installs it at /usr/local:
79
80```text
81> wget https://github.com/Kitware/CMake/releases/download/v3.18.2/cmake-3.18.2-Linux-x86_64.sh
82> sudo sh cmake-3.18.2-Linux-x86_64.sh --prefix=/usr/local --exclude-subdir
83```
84
85For Ubuntu, snap will install the latest cmake, and would be the preferred method:
86
87```text
88> sudo snap install cmake --classic
89```
90
91The Universal library is a pure C++ template library without any further dependencies, even for the regression test suites,
92to enable hassle-free installation and use.
93
94Simply clone the github repo, and you are ready to build the different components of the Universal library.
95The library contains tools to work with integers, decimals, fixed-points, floats, posits, valids, and logarithmic
96number systems. It contains educational programs that showcase simple use cases to familiarize yourself with
97different number systems, and application examples to highlight the use of different number systems to gain performance
98or numerical accuracy. Finally, each number system offers its own verification suite.
99
100The easiest way to become familiar with all the options in the build process is to fire up the CMake GUI
101(or ccmake if you are on a headless server). The cmake output will summarize which options have been set.
102The output will looks something like this:
103
104```text
105$ git clone https://github.com/stillwater-sc/universal
106$ cd universal
107$ mkdir build
108$ cd build
109$ cmake ..
110```
111
112The build options are enabled/disabled as follows:
113
114```text
115> cmake -DBUILD_EDUCATION=OFF -DBUILD_NUMBER_POSITS=ON ..
116
117```
118
119After building, issue the command _make test_ to run the complete test suite of all the enabled components,
120as a regression capability when you are modifying the source code. This will take touch all the corners of the code.
121
122```text
123> git clone https://github.com/stillwater-sc/universal
124> cd universal
125> mkdir build
126> cd build
127> cmake ..
128> make -j $(nproc)
129> make test
130```
131
132For Windows and Visual Studio, there are `CMakePredefinedTargets` that accomplish the same tasks:
133
134```text
135    - ALL_BUILD will compile all the projects
136    - INSTALL   will install the Universal library
137    - RUN_TESTS will run all tests
138```
139
140![visual-studio-project](docs/img/visual-studio-project.png)
141
142# Installation and usage
143
144After cloning the library, building and testing it in your environment, you can install it via:
145
146```text
147> cd universal/build
148> cmake .. -DCMAKE_INSTALL_PREFIX:PATH=/your/installation/path
149> cmake --build . --config Release --target install -- -j $(nproc)
150```
151
152or manually via the Makefile target in the build directory:
153
154```text
155> make -j $(nproc) install
156```
157
158The default install directory is `/usr/local` under Linux.  There is also an uninstall
159
160```text
161> make uninstall
162```
163
164If you want to use the number systems provided by Universal in your own project,
165you can use the following CMakeLists.txt structure:
166
167```code
168project("my-numerical-experiment")
169
170find_package(UNIVERSAL CONFIG REQUIRED)
171
172add_executable(${PROJECT_NAME} src/mymain.cpp)
173target_link_libraries(${PROJECT_NAME} UNIVERSAL::UNIVERSAL)
174```
175
176## Controlling the build to include different components
177
178The default build configuration will build the command line tools, a playground, educational and application examples.
179If you want to build the full regression suite across all the number systems, use the following cmake command:
180
181```text
182cmake -DBUILD_ALL=ON ..
183```
184
185For performance, the build configuration can enable specific x86 instruction sets (SSE/AVX/AVX2). For example, if your processor supports the AVX2 instruction set, you can build the test suites and educational examples with the AVX2 flag turned on. This typically yields a 20% performance boost.
186
187```text
188cmake -DBUILD_ALL=on -DUSE_AVX2=ON ..
189```
190
191The library builds a set of useful command utilities to inspect native IEEE float/double/long double numbers as well as
192the custom number systems provided by Universal. Assuming you have build and installed the library, the commands are
193
194```text
195    ieee           -- show the components (sign, scale, fraction) of the full set of IEEE floating point values
196    signedint      -- show the components (sign, scale, fraction) of a signed integer value
197    unsignedint    -- show the components (sign, scale, fraction) of an unsigned integer value
198    float          -- show the components (sign, scale, fraction) of a float value
199    double         -- show the components (sign, scale, fraction) of a double value
200    longdouble     -- show the components (sign, scale, fraction) of a long double value
201    fixpnt         -- show the components (sign, scale, fraction) of a fixed-point value
202    posit          -- show the components (sign, scale, fraction) of a posit value
203    lns            -- show the components (sign, scale, fraction) of a logarithmic number system value
204
205    float2posit    -- show the conversion process of a Real value to a posit
206
207    propenv        -- show the properties of the execution (==compiler) environment that built the library
208    propp          -- show numerical properties of a posit environment including the associated quire
209    propq          -- show numerical properties of a quire
210```
211
212For example:
213
214```text
215$ ieee 1.234567890123456789012
216compiler              : 7.5.0
217float precision       : 23 bits
218double precision      : 52 bits
219long double precision : 63 bits
220
221Decimal representations
222input value:             1.23456789012
223      float:                1.23456788
224     double:        1.2345678901199999
225long double:    1.23456789011999999999
226
227Hex representations
228input value:             1.23456789012
229      float:                1.23456788    hex: 0.7f.1e0652
230     double:        1.2345678901199999    hex: 0.3ff.3c0ca428c1d2b
231long double:    1.23456789011999999999    hex: 0.3fff.1e06521460e95b9a
232
233Binary representations:
234      float:                1.23456788    bin: 0.01111111.00111100000011001010010
235     double:        1.2345678901199999    bin: 0.01111111111.0011110000001100101001000010100011000001110100101011
236long double:    1.23456789011999999999    bin: 0.011111111111111.001111000000110010100100001010001100000111010010101101110011010
237
238Native triple representations (sign, scale, fraction):
239      float:                1.23456788    triple: (+,0,00111100000011001010010)
240     double:        1.2345678901199999    triple: (+,0,0011110000001100101001000010100011000001110100101011)
241long double:    1.23456789011999999999    triple: (+,0,001111000000110010100100001010001100000111010010101101110011010)
242
243Universal triple representation (sign, scale, fraction):
244input value:             1.23456789012
245      float:                1.23456788    triple: (+,0,00111100000011001010010)
246     double:        1.2345678901199999    triple: (+,0,0011110000001100101001000010100011000001110100101011)
247long double:    1.23456789011999999999    triple: (+,0,001111000000110010100100001010001100000111010010101101110011010)
248      exact: TBD
249```
250
251This _ieee_ command is very handy to quickly determine how your development environment represents (truncates) a specific value.
252
253The specific commands _float_, _double_, and _longdouble_ focus on float, double, and long double representations respectively.
254
255There is also a command _posit_ to help you visualize and compare the posit component fields for a given value, for example:
256
257```text
258$ posit 1.234567890123456789012
259posit< 8,0> = s0 r10 e f01000 qNE v1.25
260posit< 8,1> = s0 r10 e0 f0100 qNE v1.25
261posit< 8,2> = s0 r10 e00 f010 qNE v1.25
262posit< 8,3> = s0 r10 e000 f01 qNE v1.25
263posit<16,1> = s0 r10 e0 f001111000001 qNE v1.234619140625
264posit<16,2> = s0 r10 e00 f00111100000 qNE v1.234375
265posit<16,3> = s0 r10 e000 f0011110000 qNE v1.234375
266posit<32,1> = s0 r10 e0 f0011110000001100101001000011 qNE v1.2345678918063641
267posit<32,2> = s0 r10 e00 f001111000000110010100100001 qNE v1.2345678880810738
268posit<32,3> = s0 r10 e000 f00111100000011001010010001 qNE v1.2345678955316544
269posit<48,1> = s0 r10 e0 f00111100000011001010010000101000110001011010 qNE v1.2345678901234578
270posit<48,2> = s0 r10 e00 f0011110000001100101001000010100011000101101 qNE v1.2345678901234578
271posit<48,3> = s0 r10 e000 f001111000000110010100100001010001100010110 qNE v1.2345678901233441
272posit<64,1> = s0 r10 e0 f001111000000110010100100001010001100010110011111101100000000 qNE v1.2345678901234567
273posit<64,2> = s0 r10 e00 f00111100000011001010010000101000110001011001111110110000000 qNE v1.2345678901234567
274posit<64,3> = s0 r10 e000 f0011110000001100101001000010100011000101100111111011000000 qNE v1.2345678901234567
275```
276
277The fields are prefixed by their first characters, for example, "posit<16,2> = s0 r10 e00 f00111100000 qNE v1.234375"
278
279-   sign     field = s0, indicating a positive number
280-   regime   field = r10, indicates the first positive regime, named regime 0
281-   exponent field = e00, indicates two bits of exponent, both 0
282-   fraction field = f00111100000, a full set of fraction bits
283
284The field values are followed by a quadrant descriptor and a value representation in decimal:
285
286-   qNE            = North-East Quadrant, representing a number in the range "[1, maxpos]"
287-   v1.234375      = the value representation of the posit projection
288
289
290The positive regime for a posit shows a very specific structure, as can be seen in the image blow:
291![regime structure](docs/img/positive_regimes.png)
292
293## Motivation
294
295Modern AI applications have demonstrated the inefficiencies of the IEEE floating point format. Both Google and Microsoft have jettisonned IEEE floating point for their AI cloud services to gain two orders of magnitude better performance. Similarly, AI applications for mobile and embedded applications are shifting away from IEEE floating point. But, AI applications are hardly the only applications that expose the limitations of floating point. Cloud scale, IoT, embedded, control, and HPC applications are also limited by the inefficiencies of the IEEE floating point format. A simple change to a new number system can improve scale and cost of these appliations by orders of magnitude.
296
297When performance and/or power efficiency are differentiating attributes for the use case, the complexity of IEEE floats simply can't compete with number systems that are tailored to the needs of the application.
298
299## Advantages of posits: better, faster, cheaper, and more power efficient
300
301The core limitations of IEEE floating point are caused by two key problems of the format:
302
303-   inefficient representation of the reals
304-   irreproducibility in the context of concurrency
305
306The complete list of issues that are holding back IEEE floating point formats:
307
3081.   **Wasted Bit Patterns**
309    -   32-bit IEEE floating point has around eight million ways to represent NaN (Not-A-Number), while 64-bit floating point has two quadrillion, that is approximately 2.251x10^15 to be more exact. A NaN is an exception value to represent undefined or invalid results, such as the result of a division by zero.
3102.   **Mathematically Incorrect**
311    -   The format specifies two zeroes, a negative and positive zero, which have different behaviors.
312    -   Loss of associative and distributive law due to rounding after each operation. This loss of associative and distributive arithmetic behavior creates irreproducible result of concurrent programs that use IEEE floating point. This is particularly problematic for embedded and control applications.
3133.   **Overflows to ± inf and underflows to 0**
314    -   Overflowing to ± inf increases the relative error by an infinite factor, while underflowing to 0 loses sign information.
3154.   **Unused dynamic range**
316    -   The dynamic range of double precision floats is a whopping 2^2047, whereas most numerical software is architected to operate around 1.0.
3175.   **Complicated Circuitry**
318    -   Denormalized floating point numbers have a hidden bit of 0 instead of 1. This creates
319a host of special handling requirements that complicate compliant hardware implementations.
3206.   **No Gradual Overflow and Fixed Accuracy**
321    -   If accuracy is defined as the number of significand bits, IEEE floating point have fixed accuracy for all numbers except denormalized numbers because the number of signficand digits is fixed. Denormalized numbers are characterized by a decreased number of significand digits when the value approaches zero as a result of having a zero hidden bit. Denormalized numbers fill the underflow gap (i.e.  the gap between zero and the least non-zero values). The counterpart for gradual underflow is gradual overflow which does not exist in IEEE floating points.
322
323In contrast, the _posit_ number system is designed to be efficient, symmetric, and mathematically correct in any concurrency environment.
324
3251.   **Economical**
326    -   No bit patterns are redundant. There is one representation for infinity denoted as ± inf and zero.  All other bit patterns are valid distinct non-zero real numbers. ± inf serves as a replacement for NaN.
3272.   **Mathematical Elegant**
328    -   There is only one representation for zero, and the encoding is symmetric around 1.0. Associative and distributive laws are supported through deferred rounding via the quire, enabling reproducible linear algebra algorithms in any concurrency environment.
3293.   **Tapered Accuracy**
330    -   Tapered accuracy is when values with small exponent have more digits of accuracy and values with large exponents have fewer digits of accuracy. This concept was first introduced by Morris (1971) in his paper ”Tapered Floating Point: A New Floating-Point Representation”.
3314.   **Parameterized precision and dynamic range**
332    -   posits are defined by a size, _nbits_, and the number of exponent bits, _es_. This enables system designers the freedom to pick the right precision and dynamic range required for the application. For example, for AI applications we may pick 5 or 6 bit posits without any exponent bits to improve performance. For embedded DSP applications, such as 5G base stations, we may select a 16 bit posit with 1 exponent bit to improve performance per Watt.
3335.   **Simpler Circuitry**
334    -   There are only two special cases, Not a Real and Zero. No denormalized numbers, overflow, or underflow.
335
336## Goals of the library
337
338The _Universal_ library started as a bit-level arithmetic reference implementation of the evolving unum Type III (posit and valid) standard.
339However, the demands for supporting number systems, such as adaptive-precision integers to solve large factorials, adaptive-precision
340floats to act as Oracles, or comparing linear and tapered floats provided the opportunity to create a complete platform for
341numerical analysis and computational mathematics. With this _Universal_ platform we enable a new direction for optimization of algorithms
342to take advantage of mixed-precision to maximize performance and/or minimize energy demands. Energy efficiency is going to be the
343key differentiator for embedded intelligence applications.
344
345As a reference library, _Universal_ offers an xtensive test infrastructure to validate number system arithmetic operations, and there is
346a host of utilities to inspect the internal encodings and operations of the different number systems.
347
348The design space for custom arithmetic is vast, and any contribution to expand the capability of the _Universal_ library is encouraged.
349
350## Contributing to universal
351
352We are happy to accept pull requests via GitHub. The only requirement is that the entire regression test suite passes.
353
354[![Stargazers over time](https://starchart.cc/stillwater-sc/universal.svg)](https://starchart.cc/stillwater-sc/universal)
355
356## Verification Suite
357
358Normally, the verification suite is run as part of the _make test_ command in the build directory. However, it is possible to run specific components of the test suite, for example, to validate algorithmic changes to more complex arithmetic functions, such as square root, exponent, logarithm, and trigonometric functions.
359
360Here is an example:
361
362```text
363>:~/dev/universal/build$ make posit_32bit_posit
364Scanning dependencies of target posit_32bit_posit
365[100%] Building CXX object tests/posit/CMakeFiles/posit_32bit_posit.dir/32bit_posit.cpp.o
366[100%] Linking CXX executable posit_32bit_posit
367[100%] Built target posit_32bit_posit
368>:~/dev/universal/build$ tests/posit/posit_32bit_posit
369Standard posit<32,2> configuration tests
370 posit< 32,2> useed scale     4     minpos scale       -120     maxpos scale        120
371
372Arithmetic tests 200000 randoms each
373 posit<32,2> addition       PASS
374 posit<32,2> subtraction    PASS
375 posit<32,2> multiplication PASS
376 posit<32,2> division       PASS
377```
378
379## Structure of the tree
380
381The universal library contains a set of functional groups to deal with different number systems. In the examples shown above, we have seen the ".../universal/include/universal/posit" group and its test suite, ".../universal/tests/posit".
382
383Here is a complete list:
384
385- *universal/number/integer* - arbitrary configuration fixed-size integer
386- *universal/number/fixpnt* - arbitrary configuration fixed-size fixed-point number system
387- *universal/number/areal* - arbitrary configuration fixed-size linear floating-point
388- *universal/number/posit* - arbitrary configuration fixed-size posit number system
389- *universal/number/valid* - arbitrary configuration fixed-size valid number system
390- *universal/number/quire* - arbitrary configuration fixed-size super accumulator number system (add/sub/abs/sqrt)
391- *universal/number/unum* - flexible configuration unum Type 1 number system
392- *universal/number/unum2* - flexible configuration unum Type 2 number system
393- *universal/number/lns* - logarithmic number system
394- *universal/number/float* - contains the implementation of the IEEE floating point augmentations for reproducible computation
395- *universal/number/decimal* - adaptive-precision decimal
396- *universal/number/rational* - adaptive-precision rational number system
397- *universal/number/adaptiveint* - adaptive-precision binary integer
398- *universal/number/adaptivefloat* - adaptive-precision linear floating-point
399- *universal/number/adaptiveposit* - adaptive-precision tapered floating-point
400
401And each of these functionality groups have an associated test suite located in ".../universal/tests/..."
402
403## Background information
404
405Universal numbers, unums for short, are for expressing real numbers, and ranges of real numbers.
406There are two modes of operation, selectable by the programmer, _posit_ mode, and _valid_ mode.
407
408In _posit_ mode, a unum behaves much like a floating-point number of fixed size,
409rounding to the nearest expressible value if the result of a calculation is not expressible exactly.
410A posit offers more accuracy and a larger dynamic range than floats with the same number of bits.
411
412In _valid_ mode, a unum represents a range of real numbers and can be used to rigorously bound answers
413much like interval arithmetic does.
414
415Posit configurations have a very specific relationship to one another. When expanding a posit,
416the new value falls 'between' the old values of the smaller posit. The new value is the arithmetic mean
417of the two numbers if the expanding bit is a fraction bit, and it is the geometric mean of the two numbers
418if the expanding bit is a regime or exponent bit.
419This [page](docs/PositRefinementViz.md) shows a visualization of the expansion of _posit<2,0>_ to _posit<7,1>_:
420
421## Public Domain and community resources
422
423The unum format is a public domain specification, and there are a collection of web resources that
424manage information and discussions around the use of unums.
425
426[Posit Hub](https://posithub.org)
427
428[Unum-computing Google Group](https://groups.google.com/forum/#!forum/unum-computing)
429
430## Projects that leverage posits
431
432[Matrix Template Library](http://simunova.com/#en-mtl4-index-html)
433
434The Matrix Template Library incorporates modern C++ programming techniques to provide an easy and intuitive interface to users while enabling optimal performance. The natural mathematical notation in MTL4 empowers all engineers and scientists to implement their algorithms and models in minimal time. All technical aspects are encapsulated in the library. Think of it as MATLAB for applications.
435
436[G+SMO](http://gs.jku.at/gismo)
437
438G+Smo (Geometry + Simulation Modules, pronounced "gismo") is a new open-source C++ library that brings together mathematical tools for geometric design and numerical simulation. It is developed mainly by researchers and PhD students. It implements the relatively new paradigm of isogeometric analysis, which suggests the use of a unified framework in the design and analysis pipeline. G+Smo is an object-oriented, cross-platform, template C++ library and follows the generic programming principle, with a focus on both efficiency and ease of use. The library is partitioned into smaller entities, called modules. Examples of available modules include the dimension-independent NURBS module, the data fitting and solid segmentation module, the PDE discretization module and the adaptive spline module, based on hierarchical splines of arbitrary dimension and polynomial degree.
439
440[FEniCS](https://fenicsproject.org/)
441
442FEniCS is a popular open-source (LGPLv3) computing platform for solving partial differential equations (PDEs). FEniCS enables users to quickly translate scientific models into efficient finite element code. With the high-level Python and C++ interfaces to FEniCS, it is easy to get started, but FEniCS offers also powerful capabilities for more experienced programmers. FEniCS runs on a multitude of platforms ranging from laptops to high-performance clusters.
443
444
445[ODEINT-v2](http://headmyshoulder.github.io/odeint-v2/)
446
447Odeint is a modern C++ library for numerically solving Ordinary Differential Equations. It is developed in a generic way using Template Metaprogramming which leads to extraordinary high flexibility at top performance. The numerical algorithms are implemented independently of the underlying arithmetics. This results in an incredible applicability of the library, especially in non-standard environments. For example, odeint supports matrix types, arbitrary precision arithmetics and even can be easily run on CUDA GPUs.
448
449Several AI and Deep Learning libraries are being reengineered to enable the use of posits for both training and inference. They will be announced as they are released.
450
451
452## License
453[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fstillwater-sc%2Funiversal.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fstillwater-sc%2Funiversal?ref=badge_large)
454