Java Clean Architecture Masterclass

Java Clean Architecture Masterclass28-29 May

Join

JetBrains Research DOI Gradle build Maven Central

KMath

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 a 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 extension module.

Documentation site

Publications and talks

Goal

Non-goals

Contributing

The project requires a lot of additional work. The most important thing we need is 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 good first issue label.

Project roadmap will be available at GitHub Projects.

Features and stability

KMath is a modular library. Different modules provide different features with different API stability guarantees. All core modules are released with the same version, but with different API change policy. The features are described in module definitions below. The module stability could have the following levels:

Modules

benchmarks

Maturity: EXPERIMENTAL

kmath-ast

Maturity: EXPERIMENTAL

Features:

kmath-commons

Commons math binding for kmath

Maturity: EXPERIMENTAL

kmath-complex

Complex numbers and quaternions.

Maturity: PROTOTYPE

Features:

kmath-core

Core classes, algebra definitions, basic linear algebra

Maturity: DEVELOPMENT

Features:

kmath-coroutines

Maturity: EXPERIMENTAL

kmath-dimensions

A proof of concept module for adding type-safe dimensions to structures

Maturity: PROTOTYPE

kmath-ejml

Maturity: PROTOTYPE

Features:

kmath-for-real

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.

Maturity: EXPERIMENTAL

Features:

kmath-functions

Functions, integration and interpolation

Maturity: EXPERIMENTAL

Features:

kmath-geometry

Maturity: PROTOTYPE

kmath-histograms

Maturity: PROTOTYPE

kmath-jupyter

Maturity: PROTOTYPE

kmath-kotlingrad

Kotlin∇ integration module

Maturity: EXPERIMENTAL

Features:

kmath-memory

An API and basic implementation for arranging objects in a continuous memory block.

Maturity: DEVELOPMENT

kmath-multik

JetBrains Multik connector

Maturity: PROTOTYPE

kmath-ojalgo

Ojalgo bindings for kmath

Maturity: PROTOTYPE

kmath-optimization

Maturity: EXPERIMENTAL

kmath-stat

Maturity: EXPERIMENTAL

kmath-symja

Symja integration module

Maturity: PROTOTYPE

kmath-tensorflow

Google tensorflow connector

Maturity: PROTOTYPE

kmath-tensors

Maturity: PROTOTYPE

Features:

kmath-viktor

Binding for https://github.com/JetBrains-Research/viktor

Maturity: DEPRECATED

test-utils

Maturity: EXPERIMENTAL

Multi-platform support

KMath is developed as a multi-platform library, which means that most of the interfaces are declared in common source sets like common source sets 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, Kotlin/JVM is the primary platform, however, Kotlin/Native, Kotlin/JS and Kotlin/Wasm contributions and feedback are also welcome.

Performance

Performance of mathematical operations is hard to achieve without a lot of effort. KMath focus is to provide a reasonable performance for common cases, out of the box and good interoperability with optimized libraries for edge cases. For example, one could prototype an algorithm using KMath core implementations and then use Multik or Ojalgo for performance-critical parts just by adding a dependency and algebra context switch.

As for core implementations, we expect to focus on creating a 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.

Requirements

KMath currently relies on JDK 21 for compilation and execution of Kotlin-JVM part.

Repositories

Intermediate releases are published to Kotlin.Link repository.

repositories {
    maven("https://repo.kotlin.link")
}

dependencies {
    api("space.kscience:kmath-core:$version")
    // api("space.kscience:kmath-core-jvm:$version") for jvm-specific version
}

Join libs.tech

...and unlock some superpowers

GitHub

We won't share your data with anyone else.