2020-01-12 10:49:42 +03:00
|
|
|
[![JetBrains Research](https://jb.gg/badges/research.svg)](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub)
|
|
|
|
[![DOI](https://zenodo.org/badge/129486382.svg)](https://zenodo.org/badge/latestdoi/129486382)
|
2019-02-22 13:52:35 +03:00
|
|
|
|
2020-01-12 10:49:42 +03:00
|
|
|
![Gradle build](https://github.com/mipt-npm/kmath/workflows/Gradle%20build/badge.svg)
|
2019-12-08 10:59:49 +03:00
|
|
|
|
2020-09-20 22:39:27 +03:00
|
|
|
Bintray: [ ![Download](https://api.bintray.com/packages/mipt-npm/kscience/kmath-core/images/download.svg) ](https://bintray.com/mipt-npm/kscience/kmath-core/_latestVersion)
|
2020-01-12 10:49:42 +03:00
|
|
|
|
2020-07-27 00:03:22 +03:00
|
|
|
Bintray-dev: [ ![Download](https://api.bintray.com/packages/mipt-npm/dev/kmath-core/images/download.svg) ](https://bintray.com/mipt-npm/dev/kmath-core/_latestVersion)
|
2019-09-17 08:55:21 +03:00
|
|
|
|
2018-08-03 09:31:24 +03:00
|
|
|
# KMath
|
2020-10-29 11:39:53 +03:00
|
|
|
|
|
|
|
Could be pronounced as `key-math`. The Kotlin MATHematics library was initially intended as a Kotlin-based analog to
|
|
|
|
Python's NumPy library. Later we found that kotlin is much more flexible language and allows superior architecture
|
|
|
|
designs. In contrast to `numpy` and `scipy` it is modular and has a lightweight core. The `numpy`-like experience could
|
|
|
|
be achieved with [kmath-for-real](/kmath-for-real) extension module.
|
2018-08-03 09:31:24 +03:00
|
|
|
|
2020-09-26 12:15:11 +03:00
|
|
|
## Publications and talks
|
2020-10-29 11:39:53 +03:00
|
|
|
|
2020-08-29 10:39:04 +03:00
|
|
|
* [A conceptual article about context-oriented design](https://proandroiddev.com/an-introduction-context-oriented-programming-in-kotlin-2e79d316b0a2)
|
|
|
|
* [Another article about context-oriented design](https://proandroiddev.com/diving-deeper-into-context-oriented-programming-in-kotlin-3ecb4ec38814)
|
|
|
|
* [ACAT 2019 conference paper](https://aip.scitation.org/doi/abs/10.1063/1.5130103)
|
|
|
|
|
2019-12-08 10:59:49 +03:00
|
|
|
# Goal
|
2020-10-29 11:39:53 +03:00
|
|
|
|
|
|
|
* Provide a flexible and powerful API to work with mathematics abstractions in Kotlin-multiplatform (JVM, JS and Native).
|
2019-12-08 10:59:49 +03:00
|
|
|
* Provide basic multiplatform implementations for those abstractions (without significant performance optimization).
|
|
|
|
* Provide bindings and wrappers with those abstractions for popular optimized platform libraries.
|
|
|
|
|
|
|
|
## Non-goals
|
2020-10-29 11:39:53 +03:00
|
|
|
|
|
|
|
* Be like NumPy. It was the idea at the beginning, but we decided that we can do better in terms of API.
|
|
|
|
* Provide the best performance out of the box. We have specialized libraries for that. Need only API wrappers for them.
|
2019-12-08 10:59:49 +03:00
|
|
|
* Cover all cases as immediately and in one bundle. We will modularize everything and add new features gradually.
|
2020-10-29 11:39:53 +03:00
|
|
|
* Provide specialized behavior in the core. API is made generic on purpose, so one needs to specialize for types, like
|
|
|
|
for `Double` in the core. For that we will have specialization modules like `for-real`, which will give better
|
|
|
|
experience for those, who want to work with specific types.
|
2019-12-08 10:59:49 +03:00
|
|
|
|
2018-08-03 09:31:24 +03:00
|
|
|
## Features
|
|
|
|
|
2020-10-29 11:39:53 +03:00
|
|
|
Current feature list is [here](/docs/features.md)
|
2019-02-22 13:52:35 +03:00
|
|
|
|
2018-08-03 09:31:24 +03:00
|
|
|
* **Algebra**
|
2020-10-29 11:39:53 +03:00
|
|
|
* Algebraic structures like rings, spaces and fields (**TODO** add example to wiki)
|
2018-12-28 07:06:01 +03:00
|
|
|
* Basic linear algebra operations (sums, products, etc.), backed by the `Space` API.
|
2020-10-29 11:39:53 +03:00
|
|
|
* Complex numbers backed by the `Field` API (meaning they will be usable in any structure like vectors and
|
|
|
|
N-dimensional arrays).
|
2019-02-22 13:52:35 +03:00
|
|
|
* Advanced linear algebra operations like matrix inversion and LU decomposition.
|
|
|
|
|
2019-06-08 16:52:42 +03:00
|
|
|
* **Array-like structures** Full support of many-dimensional array-like structures
|
2019-02-22 13:52:35 +03:00
|
|
|
including mixed arithmetic operations and function operations over arrays and numbers (with the added benefit of static type checking).
|
2018-08-03 09:31:24 +03:00
|
|
|
|
2020-10-29 11:39:53 +03:00
|
|
|
* **Expressions** By writing a single mathematical expression once, users will be able to apply different types of
|
|
|
|
objects to the expression by providing a context. Expressions can be used for a wide variety of purposes from high
|
|
|
|
performance calculations to code generation.
|
2018-08-25 20:58:26 +03:00
|
|
|
|
2019-02-22 13:52:35 +03:00
|
|
|
* **Histograms** Fast multi-dimensional histograms.
|
|
|
|
|
2019-06-08 16:52:42 +03:00
|
|
|
* **Streaming** Streaming operations on mathematical objects and objects buffers.
|
2018-08-24 21:11:59 +03:00
|
|
|
|
2019-12-09 19:57:26 +03:00
|
|
|
* **Type-safe dimensions** Type-safe dimensions for matrix operations.
|
|
|
|
|
2020-10-29 11:39:53 +03:00
|
|
|
* **Commons-math wrapper** It is planned to gradually wrap most parts of
|
|
|
|
[Apache commons-math](http://commons.apache.org/proper/commons-math/) library in Kotlin code and maybe rewrite some
|
|
|
|
parts to better suit the Kotlin programming paradigm, however there is no established roadmap for that. Feel free to
|
|
|
|
submit a feature request if you want something to be implemented first.
|
2020-10-19 22:51:33 +03:00
|
|
|
|
2019-02-22 13:52:35 +03:00
|
|
|
## Planned features
|
2018-08-24 21:11:59 +03:00
|
|
|
|
2018-09-30 17:25:11 +03:00
|
|
|
* **Messaging** A mathematical notation to support multi-language and multi-node communication for mathematical tasks.
|
2018-08-24 21:11:59 +03:00
|
|
|
|
2019-02-22 13:52:35 +03:00
|
|
|
* **Array statistics**
|
|
|
|
|
|
|
|
* **Integration** Univariate and multivariate integration framework.
|
|
|
|
|
|
|
|
* **Probability and distributions**
|
|
|
|
|
|
|
|
* **Fitting** Non-linear curve fitting facilities
|
|
|
|
|
2020-09-21 15:47:47 +03:00
|
|
|
## Modules
|
|
|
|
|
2020-09-26 12:15:11 +03:00
|
|
|
<hr/>
|
|
|
|
|
|
|
|
* ### [examples](examples)
|
|
|
|
>
|
|
|
|
>
|
|
|
|
> **Maturity**: EXPERIMENTAL
|
|
|
|
<hr/>
|
|
|
|
|
|
|
|
* ### [kmath-ast](kmath-ast)
|
|
|
|
>
|
|
|
|
>
|
|
|
|
> **Maturity**: EXPERIMENTAL
|
|
|
|
<hr/>
|
|
|
|
|
|
|
|
* ### [kmath-commons](kmath-commons)
|
|
|
|
>
|
|
|
|
>
|
|
|
|
> **Maturity**: EXPERIMENTAL
|
|
|
|
<hr/>
|
|
|
|
|
|
|
|
* ### [kmath-core](kmath-core)
|
|
|
|
> Core classes, algebra definitions, basic linear algebra
|
|
|
|
>
|
|
|
|
> **Maturity**: DEVELOPMENT
|
|
|
|
>
|
|
|
|
> **Features:**
|
|
|
|
> - [algebras](kmath-core/src/commonMain/kotlin/kscience/kmath/operations/Algebra.kt) : Algebraic structures: contexts and elements
|
|
|
|
> - [nd](kmath-core/src/commonMain/kotlin/kscience/kmath/structures/NDStructure.kt) : Many-dimensional structures
|
|
|
|
> - [buffers](kmath-core/src/commonMain/kotlin/kscience/kmath/structures/Buffers.kt) : One-dimensional structure
|
|
|
|
> - [expressions](kmath-core/src/commonMain/kotlin/kscience/kmath/expressions) : Functional Expressions
|
|
|
|
> - [domains](kmath-core/src/commonMain/kotlin/kscience/kmath/domains) : Domains
|
2020-10-28 09:16:21 +03:00
|
|
|
> - [autodif](kmath-core/src/commonMain/kotlin/kscience/kmath/expressions/SimpleAutoDiff.kt) : Automatic differentiation
|
2020-09-26 12:15:11 +03:00
|
|
|
|
|
|
|
<hr/>
|
|
|
|
|
|
|
|
* ### [kmath-coroutines](kmath-coroutines)
|
|
|
|
>
|
|
|
|
>
|
|
|
|
> **Maturity**: EXPERIMENTAL
|
|
|
|
<hr/>
|
|
|
|
|
|
|
|
* ### [kmath-dimensions](kmath-dimensions)
|
|
|
|
>
|
|
|
|
>
|
|
|
|
> **Maturity**: EXPERIMENTAL
|
|
|
|
<hr/>
|
|
|
|
|
2020-10-19 22:51:33 +03:00
|
|
|
* ### [kmath-ejml](kmath-ejml)
|
|
|
|
>
|
|
|
|
>
|
|
|
|
> **Maturity**: EXPERIMENTAL
|
|
|
|
<hr/>
|
|
|
|
|
2020-09-26 12:15:11 +03:00
|
|
|
* ### [kmath-for-real](kmath-for-real)
|
2020-11-29 13:32:20 +03:00
|
|
|
> Extension module that should be used to achieve numpy-like behavior.
|
|
|
|
All operations are specialized to work with `Double` numbers without declaring algebraic contexts.
|
|
|
|
One can still use generic algebras though.
|
2020-09-26 12:15:11 +03:00
|
|
|
>
|
|
|
|
> **Maturity**: EXPERIMENTAL
|
2020-11-29 13:32:20 +03:00
|
|
|
>
|
|
|
|
> **Features:**
|
|
|
|
> - [RealVector](kmath-for-real/src/commonMain/kotlin/kscience/kmath/real/RealVector.kt) : Numpy-like operations for Buffers/Points
|
|
|
|
> - [RealMatrix](kmath-for-real/src/commonMain/kotlin/kscience/kmath/real/RealMatrix.kt) : Numpy-like operations for 2d real structures
|
|
|
|
> - [grids](kmath-for-real/src/commonMain/kotlin/kscience/kmath/structures/grids.kt) : Uniform grid generators
|
|
|
|
|
2020-09-26 12:15:11 +03:00
|
|
|
<hr/>
|
|
|
|
|
|
|
|
* ### [kmath-functions](kmath-functions)
|
|
|
|
>
|
|
|
|
>
|
|
|
|
> **Maturity**: EXPERIMENTAL
|
|
|
|
<hr/>
|
|
|
|
|
|
|
|
* ### [kmath-geometry](kmath-geometry)
|
|
|
|
>
|
|
|
|
>
|
|
|
|
> **Maturity**: EXPERIMENTAL
|
|
|
|
<hr/>
|
|
|
|
|
|
|
|
* ### [kmath-histograms](kmath-histograms)
|
|
|
|
>
|
|
|
|
>
|
|
|
|
> **Maturity**: EXPERIMENTAL
|
|
|
|
<hr/>
|
|
|
|
|
2020-11-29 13:32:20 +03:00
|
|
|
* ### [kmath-kotlingrad](kmath-kotlingrad)
|
|
|
|
>
|
|
|
|
>
|
|
|
|
> **Maturity**: EXPERIMENTAL
|
|
|
|
<hr/>
|
|
|
|
|
2020-09-26 12:15:11 +03:00
|
|
|
* ### [kmath-memory](kmath-memory)
|
|
|
|
>
|
|
|
|
>
|
|
|
|
> **Maturity**: EXPERIMENTAL
|
|
|
|
<hr/>
|
|
|
|
|
2020-10-29 11:39:53 +03:00
|
|
|
* ### [kmath-nd4j](kmath-nd4j)
|
|
|
|
> ND4J NDStructure implementation and according NDAlgebra classes
|
|
|
|
>
|
|
|
|
> **Maturity**: EXPERIMENTAL
|
|
|
|
>
|
|
|
|
> **Features:**
|
2020-11-29 13:32:20 +03:00
|
|
|
> - [nd4jarraystructure](kmath-nd4j/src/commonMain/kotlin/kscience/kmath/operations/Algebra.kt) : NDStructure wrapper for INDArray
|
2020-10-29 11:39:53 +03:00
|
|
|
> - [nd4jarrayrings](kmath-nd4j/src/commonMain/kotlin/kscience/kmath/structures/NDStructure.kt) : Rings over Nd4jArrayStructure of Int and Long
|
|
|
|
> - [nd4jarrayfields](kmath-nd4j/src/commonMain/kotlin/kscience/kmath/structures/Buffers.kt) : Fields over Nd4jArrayStructure of Float and Double
|
|
|
|
|
|
|
|
<hr/>
|
|
|
|
|
2020-10-28 09:16:21 +03:00
|
|
|
* ### [kmath-stat](kmath-stat)
|
2020-09-26 12:15:11 +03:00
|
|
|
>
|
|
|
|
>
|
|
|
|
> **Maturity**: EXPERIMENTAL
|
|
|
|
<hr/>
|
|
|
|
|
|
|
|
* ### [kmath-viktor](kmath-viktor)
|
|
|
|
>
|
|
|
|
>
|
|
|
|
> **Maturity**: EXPERIMENTAL
|
|
|
|
<hr/>
|
2020-09-25 10:13:38 +03:00
|
|
|
|
2020-09-21 15:47:47 +03:00
|
|
|
|
2018-08-03 09:31:24 +03:00
|
|
|
## Multi-platform support
|
2018-12-28 07:06:01 +03:00
|
|
|
|
2020-10-29 11:39:53 +03:00
|
|
|
KMath is developed as a multi-platform library, which means that most of the interfaces are declared in the
|
|
|
|
[common source sets](/kmath-core/src/commonMain) and implemented there wherever it is possible. In some cases, features
|
|
|
|
are delegated to platform-specific implementations even if they could be provided in the common module for performance
|
|
|
|
reasons. Currently, the Kotlin/JVM is the primary platform, however Kotlin/Native and Kotlin/JS contributions and
|
|
|
|
feedback are also welcome.
|
2018-08-03 09:31:24 +03:00
|
|
|
|
|
|
|
## Performance
|
2018-12-28 07:06:01 +03:00
|
|
|
|
2020-10-29 11:39:53 +03:00
|
|
|
Calculation performance is one of major goals of KMath in the future, but in some cases it is impossible to achieve
|
|
|
|
both performance and flexibility.
|
|
|
|
|
|
|
|
We expect to focus on creating convenient universal API first and then work on increasing performance for specific
|
|
|
|
cases. We expect the worst KMath benchmarks will perform better than native Python, but worse than optimized
|
|
|
|
native/SciPy (mostly due to boxing operations on primitive numbers). The best performance of optimized parts could be
|
|
|
|
better than SciPy.
|
2018-08-03 09:31:24 +03:00
|
|
|
|
2020-10-29 11:39:53 +03:00
|
|
|
### Repositories
|
2018-09-30 17:18:04 +03:00
|
|
|
|
2020-10-29 11:39:53 +03:00
|
|
|
Release artifacts are accessible from bintray with following configuration (see documentation of
|
|
|
|
[Kotlin Multiplatform](https://kotlinlang.org/docs/reference/multiplatform.html) for more details):
|
2018-09-30 17:18:04 +03:00
|
|
|
|
|
|
|
```kotlin
|
2020-10-29 11:39:53 +03:00
|
|
|
repositories {
|
2020-09-20 22:39:27 +03:00
|
|
|
maven("https://dl.bintray.com/mipt-npm/kscience")
|
2019-12-08 10:59:49 +03:00
|
|
|
}
|
2018-12-28 07:06:01 +03:00
|
|
|
|
2020-10-29 11:39:53 +03:00
|
|
|
dependencies {
|
2020-11-29 13:32:20 +03:00
|
|
|
api("kscience.kmath:kmath-core:0.2.0-dev-4")
|
|
|
|
// api("kscience.kmath:kmath-core-jvm:0.2.0-dev-4") for jvm-specific version
|
2019-12-08 10:59:49 +03:00
|
|
|
}
|
2018-09-30 17:18:04 +03:00
|
|
|
```
|
|
|
|
|
2020-06-23 10:46:27 +03:00
|
|
|
Gradle `6.0+` is required for multiplatform artifacts.
|
2019-02-22 13:52:35 +03:00
|
|
|
|
2020-10-29 11:39:53 +03:00
|
|
|
#### Development
|
|
|
|
|
|
|
|
Development builds are uploaded to the separate repository:
|
2019-02-22 13:52:35 +03:00
|
|
|
|
|
|
|
```kotlin
|
2020-10-29 11:39:53 +03:00
|
|
|
repositories {
|
2019-12-08 10:59:49 +03:00
|
|
|
maven("https://dl.bintray.com/mipt-npm/dev")
|
2019-02-22 13:52:35 +03:00
|
|
|
}
|
|
|
|
```
|
2018-08-03 09:31:24 +03:00
|
|
|
|
|
|
|
## Contributing
|
2018-12-28 07:06:01 +03:00
|
|
|
|
2020-10-29 11:39:53 +03:00
|
|
|
The project requires a lot of additional work. The most important thing we need is a feedback about what features are
|
|
|
|
required the most. Feel free to create feature requests. We are also welcome to code contributions,
|
|
|
|
especially in issues marked with
|
|
|
|
[waiting for a hero](https://github.com/mipt-npm/kmath/labels/waiting%20for%20a%20hero) label.
|