Skip to main content

Fixed-size C++23 Kalman filters with nanobind Python bindings

Project description

fast-kalman

fast-kalman is a fixed-size C++23 Kalman filtering library with nanobind Python bindings.

A Kalman filter estimates hidden state from noisy measurements by combining a model prediction with observed data. It is commonly used for tracking, sensor fusion, smoothing financial indicators, and any small state-space model where you need a fast estimate plus uncertainty. This library implements several Kalman filter variants for tiny dimensions, with explicit P, Q, and R covariance matrices and no dependency on a matrix library.

The focus is speed for small fixed-size problems. In the included nx=2,nz=1 benchmark on this machine:

  • the direct C++ kalman::LinearKalmanFilter is about 110x faster than OpenCV's native cv::KalmanFilter
  • the Python kalman.LinearKalmanFilter binding is about 3.3x faster than OpenCV's C++-backed cv2.KalmanFilter
  • the Python update_many(...) path runs linear updates at about 240 ns per measurement by keeping the loop in C++

Install

Python

Install from PyPI:

python -m pip install fast-kalman

Then import the package as kalman.

Build and install from this source tree:

python -m pip install .

For development and tests:

python -m pip install -e ".[test,benchmark]"
pytest tests

Build a wheel without asking pip to resolve already-installed runtime dependencies:

python -m pip wheel . --no-build-isolation --no-deps -w dist

The Python package is built with scikit-build-core and nanobind. Runtime dimensions are accepted from 1 through 8 for Python constructors.

Release Builds

Build and upload the source distribution without Docker:

rm -rf dist
python -m build --sdist
python -m twine check dist/*
python -m twine upload dist/fast_kalman-*.tar.gz

Build public binary wheels with cibuildwheel. On Linux, cibuildwheel runs manylinux/musllinux builds in containers, so Docker or Podman must be installed and running:

docker --version
python -m cibuildwheel --platform linux --output-dir wheelhouse
python -m twine check wheelhouse/*
python -m twine upload wheelhouse/*

With Podman:

CIBW_CONTAINER_ENGINE=podman python -m cibuildwheel --platform linux --output-dir wheelhouse

Only upload wheelhouse/* after cibuildwheel succeeds and the directory contains .whl files. A local linux_x86_64 wheel from python -m build is useful for testing, but manylinux/musllinux wheels from cibuildwheel are the right Linux binary artifacts for PyPI.

C++

Build and install as a CMake package:

cmake -S . -B build/cpp -DCMAKE_BUILD_TYPE=Release
cmake --build build/cpp
cmake --install build/cpp --prefix /path/to/prefix

Consume from another CMake project:

find_package(kalman REQUIRED)
target_link_libraries(my_target PRIVATE kalman::kalman)

The C++ API is template-based:

#include <kalman/kalman.hpp>

auto kf = kalman::make_constant_velocity_1d(
    100.0, 0.0, 1.0,
    10.0, 10.0,
    1e-4, 1e-3,
    0.25);

auto stats = kf.update(kalman::Vec<1>{100.5});

Nonlinear C++ model functions are template callables. Pass lambdas or functor objects; the core API does not use function pointers or std::function for transition, measurement, Jacobian, innovation, or retract callbacks.

Python Quick Start

import kalman

kf = kalman.LinearKalmanFilter(2, 1)
kf.x = [100.0, 0.0]
kf.P = [10.0, 0.0, 0.0, 10.0]
kf.F = [1.0, 1.0, 0.0, 1.0]
kf.Q = [1e-4, 0.0, 0.0, 1e-3]
kf.H = [1.0, 0.0]
kf.R = [0.25]

stats = kf.update([100.5])
batch = kf.update_many([100.5, 101.0, 101.5, 102.0])

Compiled nonlinear model example:

rb = kalman.RangeBearingEKF2D()
rb.dt = 1.0
rb.landmark_x = 0.0
rb.landmark_y = 0.0
rb.x = [1.0, 1.0, 0.1, 0.0]
rb.P = [1.0, 0.0, 0.0, 0.0,
        0.0, 1.0, 0.0, 0.0,
        0.0, 0.0, 1.0, 0.0,
        0.0, 0.0, 0.0, 1.0]
rb.Q = [1e-3, 0.0, 0.0, 0.0,
        0.0, 1e-3, 0.0, 0.0,
        0.0, 0.0, 1e-3, 0.0,
        0.0, 0.0, 0.0, 1e-3]
rb.R = [0.1, 0.0, 0.0, 0.1]

stats = rb.update_many([[1.5, 0.8], [1.6, 0.75]])

Filter Catalog

All matrices are row-major flat arrays in Python. In C++, vectors and matrices are kalman::Vec<N> and kalman::Mat<R, C> backed by std::array<double, N>.

Shared defaults:

  • kDefaultEps = 1e-15
  • kDefaultJitter = 1e-12
  • kDefaultVarianceFloor = 1e-15

Update methods return UpdateStats<NX, NZ> in C++ and a dictionary in Python:

  • innovation: residual vector
  • S: innovation covariance
  • K: Kalman gain
  • nis: normalized innovation squared
  • ok: whether the update succeeded numerically

LinearKalmanFilter<NX, NZ>

Standard linear covariance-form Kalman filter.

State and options:

  • x: state vector, length NX
  • P: state covariance, NX x NX
  • F: transition matrix, NX x NX
  • Q: process noise covariance, NX x NX
  • H: measurement matrix, NZ x NX
  • R: measurement noise covariance, NZ x NZ
  • last: last UpdateStats

Methods:

  • predict()
  • C++ only: predict(B, u) for control input
  • correct(z, eps=kDefaultEps)
  • update(z, eps=kDefaultEps)
  • correct_many(measurements, return_stats=False, eps=kDefaultEps)
  • update_many(measurements, return_stats=False, eps=kDefaultEps)
  • correct_scalar(z, h, r, eps=kDefaultEps) when NZ == 1

Convenience constructors:

  • make_scalar_random_walk(initial_value, initial_variance, process_variance, measurement_variance)
  • make_constant_velocity_1d(initial_position, initial_velocity, dt, position_variance, velocity_variance, process_position_variance, process_velocity_variance, measurement_variance)
  • make_constant_acceleration_1d(initial_position, initial_velocity, initial_acceleration, dt, position_variance, velocity_variance, acceleration_variance, process_position_variance, process_velocity_variance, process_acceleration_variance, measurement_variance)

Automatic tuning:

  • tools/tune_linear_kalman.py estimates x, P, F, Q, H, and R from a numeric text stream.
  • Python: LinearKalmanTuner(nx, nz, dt=1.0, model="auto", min_variance=1e-12, forgetting=0.75) keeps state across batches and returns a LinearKalmanTuning namedtuple ordered for LinearKalmanFilter(*params).

ExtendedKalmanFilter<NX, NZ>

Extended Kalman filter for nonlinear transition and measurement models with caller-supplied Jacobians.

State and options:

  • x, P, Q, R, last

Methods:

  • predict(transition, transition_jacobian)
  • correct(z, measurement, measurement_jacobian, eps=kDefaultEps)
  • Python: update_many(measurements, transition, transition_jacobian, measurement, measurement_jacobian, return_stats=False, eps=kDefaultEps)

Python callbacks receive NumPy arrays and may return NumPy arrays or flat sequences. C++ callables are template parameters and can be inlined.

Automatic tuning:

  • Python: ExtendedKalmanTuner(nx, nz, dt=1.0, model="auto", min_variance=1e-12, forgetting=0.75) estimates initial Euclidean x, P, Q, and R and returns an ExtendedKalmanTuning namedtuple ordered for ExtendedKalmanFilter(*params). The nonlinear transition and measurement callbacks remain caller-supplied.

IteratedExtendedKalmanFilter<NX, NZ>

Iterated EKF correction for measurement models that benefit from repeated linearization.

State and options:

  • x, P, Q, R, last

Methods:

  • predict(transition, transition_jacobian)
  • correct(z, measurement, measurement_jacobian, max_iterations=5, tolerance=1e-10, eps=kDefaultEps)
  • Python: update_many(measurements, transition, transition_jacobian, measurement, measurement_jacobian, max_iterations=5, tolerance=1e-10, return_stats=False, eps=kDefaultEps)

Automatic tuning:

  • Python: IteratedExtendedKalmanTuner(nx, nz, dt=1.0, model="auto", min_variance=1e-12, forgetting=0.75) returns IteratedExtendedKalmanTuning ordered for IteratedExtendedKalmanFilter(*params). Tune max_iterations and tolerance separately for accuracy/latency.

UnscentedKalmanFilter<NX, NZ>

Unscented Kalman filter using Cholesky-generated sigma points.

State and options:

  • x, P, Q, R, last
  • alpha, beta, kappa through UnscentedParameters
  • defaults: alpha = 1e-3, beta = 2.0, kappa = 0.0
  • C++ helpers: lambda(), scale(), wm(i), wc(i), sigma_points(...)

Methods:

  • predict(transition, jitter=kDefaultJitter)
  • correct(z, measurement, jitter=kDefaultJitter, eps=kDefaultEps)
  • Python: update_many(measurements, transition, measurement, return_stats=False, jitter=kDefaultJitter, eps=kDefaultEps)
  • Python batch sigma-point API:
    • predict_batch(transition_batch, jitter=kDefaultJitter)
    • correct_batch(z, measurement_batch, jitter=kDefaultJitter, eps=kDefaultEps)
    • update_many_batch(measurements, transition_batch, measurement_batch, return_stats=False, jitter=kDefaultJitter, eps=kDefaultEps)

transition_batch receives a (2 * NX + 1, NX) NumPy array and returns the propagated sigma points with the same shape. measurement_batch receives a (2 * NX + 1, NX) array and returns (2 * NX + 1, NZ).

Automatic tuning:

  • Python: UnscentedKalmanTuner(nx, nz, alpha=1e-3, beta=2.0, kappa=0.0, dt=1.0, model="auto", min_variance=1e-12, forgetting=0.75) returns UnscentedKalmanTuning ordered for UnscentedKalmanFilter(*params). Validate alpha, beta, and kappa against innovation behavior and held-out data.

InvariantExtendedKalmanFilter<ErrorN, NZ, StateT>

C++ invariant-error EKF shell for non-Euclidean state spaces.

State and options:

  • state: user-supplied state type
  • P, Q, R, last

Methods:

  • predict(propagate, error_transition)
  • correct(z, measurement, error_jacobian, innovation, retract, eps=kDefaultEps)

This intentionally requires caller-supplied propagation, error transition, innovation, and retract operations. There is no fake universal IEKF for all state spaces.

Automatic tuning:

  • No general automatic tuner. Tune the error-state Q and measurement R for the chosen manifold and sensor model.

EnsembleKalmanFilter<NX, NZ, EnsembleSize>

Ensemble Kalman filter. The current Python binding exposes EnsembleSize == 8; C++ supports any compile-time ensemble size of at least 2.

State and options:

  • members: ensemble members
  • x: ensemble mean
  • P: ensemble covariance
  • R: measurement noise covariance
  • last

Methods:

  • recompute_mean_covariance()
  • predict(transition)
  • C++: predict(transition, process_noise)
  • C++: correct(z, measurement, observation_noise, eps=kDefaultEps)
  • correct_deterministic(z, measurement, eps=kDefaultEps)
  • Python: update_many(measurements, transition, measurement, return_stats=False, eps=kDefaultEps)
  • Python batch member API:
    • predict_batch(transition_batch)
    • correct_deterministic_batch(z, measurement_batch, eps=kDefaultEps)
    • update_many_batch(measurements, transition_batch, measurement_batch, return_stats=False, eps=kDefaultEps)

transition_batch receives an (8, NX) NumPy array and returns (8, NX). measurement_batch receives (8, NX) and returns (8, NZ).

Automatic tuning:

  • Python: EnsembleKalmanTuner(nx, nz, ensemble_size=8, dt=1.0, model="auto", min_variance=1e-12, forgetting=0.75) estimates member initialization and R, returning EnsembleKalmanTuning ordered for EnsembleKalmanFilter(*params).

AdaptiveKalmanFilter<NX, NZ>

Adaptive wrapper around LinearKalmanFilter that can update R and optionally Q from innovation statistics.

State and options:

  • kf: underlying linear filter in C++
  • Python exposes x, P, F, Q, H, R
  • forgetting: exponential forgetting factor, default 0.98
  • min_variance: variance floor, default 1e-12
  • adapt_R: adapt measurement noise, default true
  • diagonal_R_only: keep only diagonal R, default true
  • adapt_Q_from_state_correction: heuristic Q adaptation, default false
  • innovation_covariance_ema, initialized

Methods:

  • predict()
  • correct(z, eps=kDefaultEps)
  • update(z, eps=kDefaultEps)
  • correct_many(measurements, return_stats=False, eps=kDefaultEps)
  • update_many(measurements, return_stats=False, eps=kDefaultEps)

Automatic tuning:

  • This filter self-tunes online. Use LinearKalmanTuner or tools/tune_linear_kalman.py for initial F, H, P, Q, and R, then let the adaptive filter refine R online if the innovation statistics are stable.

RangeBearingEKF2D

Python-facing compiled nonlinear EKF model for high-throughput range/bearing tracking without Python model callbacks.

Model:

  • state: [x, y, vx, vy]
  • measurement: [range, bearing]
  • constant-velocity prediction
  • configurable landmark at (landmark_x, landmark_y)

State and options:

  • dt
  • landmark_x, landmark_y
  • x, P, Q, R, last

Methods:

  • predict()
  • measurement(x)
  • measurement_jacobian(x)
  • correct(z, eps=kDefaultEps)
  • update(z, eps=kDefaultEps)
  • update_many(measurements, return_stats=False, eps=kDefaultEps)

Automatic tuning:

  • Python: RangeBearingEKF2DTuner(nx=4, nz=2, dt=1.0, landmark_x=0.0, landmark_y=0.0, min_variance=1e-12, forgetting=0.75) estimates x, P, Q, and R from [range, bearing] batches and returns RangeBearingEKF2DTuning ordered for RangeBearingEKF2D(*params).

Tuning From Data

tools/tune_linear_kalman.py estimates starting linear-filter parameters from a numeric text stream:

tools/tune_linear_kalman.py prices.txt --nx 2 --nz 1 --dt 1.0
tools/tune_linear_kalman.py samples.txt --nx 4 --nz 2 --format json

The script accepts commas, spaces, or newlines. Values are grouped by --nz. With --model auto, it chooses these layouts:

  • nx == nz: random walk
  • nx == 2 * nz: constant velocity
  • nx == 3 * nz: constant acceleration
  • otherwise: generic identity transition

It prints row-major F, H, P, Q, and R, plus Python setup and C++ convenience-constructor arguments when applicable. Treat the output as initial tuning values; validate against held-out data and inspect innovations or NIS before shipping.

Python also exposes stateful tuning classes for library use. Each update(...) call takes one independent batch of observations, such as one day's samples. The tuner refines its internal estimate across calls, but it does not assume that the last sample from one batch is continuous with the first sample from the next batch.

import kalman

tuner = kalman.LinearKalmanTuner(2, 1, dt=1.0)
params = tuner.update(day_1_prices)
params = tuner.update(day_2_prices)
kf = kalman.LinearKalmanFilter(*params)

Available tuners:

  • LinearKalmanTuner -> LinearKalmanTuning(nx, nz, x, P, F, Q, H, R)
  • ExtendedKalmanTuner -> ExtendedKalmanTuning(nx, nz, x, P, Q, R)
  • IteratedExtendedKalmanTuner -> IteratedExtendedKalmanTuning(nx, nz, x, P, Q, R)
  • UnscentedKalmanTuner -> UnscentedKalmanTuning(nx, nz, x, P, Q, R, alpha, beta, kappa)
  • EnsembleKalmanTuner -> EnsembleKalmanTuning(nx, nz, ensemble_size, members, R)
  • RangeBearingEKF2DTuner -> RangeBearingEKF2DTuning(dt, landmark_x, landmark_y, x, P, Q, R)

There is no AdaptiveKalmanTuner because AdaptiveKalmanFilter is the self-tuning variant.

Benchmarks

Run both benchmark layers:

python -m pip install -e ".[benchmark]"
benchmarks/benchmark_python_filters.py --nx 2 --nz 1
benchmarks/benchmark_cpp_core.py --nx 2 --nz 1

benchmark_python_filters.py measures the nanobind API, including Python callback overhead, update_many(...), UKF sigma-point batch callbacks, EnKF member batch callbacks, and compiled model wrappers. When cv2 is installed, it compares the matching linear predict/correct workload against OpenCV's C++-backed cv2.KalmanFilter.

benchmark_cpp_core.py generates and compiles a small C++ benchmark binary. It measures the direct template API with inlinable lambdas/functors and covers the C++-only invariant EKF. When OpenCV development files are available through pkg-config opencv4, it also benchmarks native cv::KalmanFilter.

Latest local nx=2,nz=1 run:

Python layer

Workload Implementation ns/update
linear update kalman.LinearKalmanFilter 987
linear update cv2.KalmanFilter 3231
linear update_many kalman.LinearKalmanFilter 240
adaptive update kalman.AdaptiveKalmanFilter 1090
adaptive update_many kalman.AdaptiveKalmanFilter 350
EKF NumPy callbacks kalman.ExtendedKalmanFilter 7503
EKF update_many kalman.ExtendedKalmanFilter 6056
iterated EKF callbacks kalman.IteratedExtendedKalmanFilter 14550
iterated EKF update_many kalman.IteratedExtendedKalmanFilter 13436
UKF per-sigma callbacks kalman.UnscentedKalmanFilter 21861
UKF batched sigma callbacks kalman.UnscentedKalmanFilter 7203
UKF update_many_batch kalman.UnscentedKalmanFilter 5867
EnKF per-member callbacks kalman.EnsembleKalmanFilter 34177
EnKF batched member callbacks kalman.EnsembleKalmanFilter 7513
EnKF update_many_batch kalman.EnsembleKalmanFilter 6719
compiled range/bearing EKF update_many kalman.RangeBearingEKF2D 570

C++ layer

Workload Implementation ns/update
linear update kalman::LinearKalmanFilter 29.7
linear update cv::KalmanFilter 3265
scalar hot path kalman::LinearKalmanFilter 37.4
EKF kalman::ExtendedKalmanFilter 44.1
iterated EKF kalman::IteratedExtendedKalmanFilter 187.9
UKF kalman::UnscentedKalmanFilter 296.5
invariant EKF kalman::InvariantExtendedKalmanFilter 64.5
EnKF, size 8 kalman::EnsembleKalmanFilter 137.9
adaptive update kalman::AdaptiveKalmanFilter 119.3

Benchmark context matters. These numbers are for tiny fixed dimensions, release builds, and local hardware. Run the scripts on your target machine before making production latency claims.

Reference Tests

Run Python reference tests against FilterPy:

python -m pip install -e ".[test]"
pytest tests

FilterPy is used as the comparison implementation because it is a widely used pure-Python/NumPy Kalman filtering package with explicit matrix state, predict, and update operations that map directly to this library's linear filter API.

License

fast-kalman is licensed under the Apache License, Version 2.0. See LICENSE for the full text.

Numerical Notes

This is a covariance-form implementation using Joseph-form covariance updates. It has hard-coded inverse paths for 1x1, 2x2, and 3x3; larger dimensions use a small fixed-size Gauss-Jordan inverse path. UKF sigma points use Cholesky with jitter.

For poorly conditioned models or maximum numerical stability, square-root filter variants are the likely next upgrade.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fast_kalman-0.2.2.tar.gz (52.0 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

fast_kalman-0.2.2-cp314-cp314t-musllinux_1_2_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ x86-64

fast_kalman-0.2.2-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

fast_kalman-0.2.2-cp314-cp314-musllinux_1_2_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

fast_kalman-0.2.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

fast_kalman-0.2.2-cp313-cp313-musllinux_1_2_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

fast_kalman-0.2.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

fast_kalman-0.2.2-cp312-cp312-musllinux_1_2_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

fast_kalman-0.2.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

fast_kalman-0.2.2-cp311-cp311-musllinux_1_2_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

fast_kalman-0.2.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

fast_kalman-0.2.2-cp310-cp310-musllinux_1_2_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

fast_kalman-0.2.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

fast_kalman-0.2.2-cp39-cp39-musllinux_1_2_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.9musllinux: musl 1.2+ x86-64

fast_kalman-0.2.2-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

File details

Details for the file fast_kalman-0.2.2.tar.gz.

File metadata

  • Download URL: fast_kalman-0.2.2.tar.gz
  • Upload date:
  • Size: 52.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for fast_kalman-0.2.2.tar.gz
Algorithm Hash digest
SHA256 86d4236dcdffcf1abe66297b9b6e71c2b2fc6b57923469143e90771a1123121b
MD5 46c5bddcc1984396e76236d239c4cfe6
BLAKE2b-256 528840c5cceadfd0ea77c4ea25835b39328f7bdf211d1db352bf78591f8b9d17

See more details on using hashes here.

File details

Details for the file fast_kalman-0.2.2-cp314-cp314t-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for fast_kalman-0.2.2-cp314-cp314t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 372db9352aedc1aac905d0ade4b9e2a501a40865f8fd45663e8bedd5914c7666
MD5 e2e0057ba734b0a9ff70d8e9d9546bb9
BLAKE2b-256 8f9e246dd144010c58b331fa74d72498bb365946e9733ebce112c1993fd7eda6

See more details on using hashes here.

File details

Details for the file fast_kalman-0.2.2-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for fast_kalman-0.2.2-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 941d8de2acf66133cd7522e49ad0e3e00aa2ab21ef910cb4be6b2c0d903f8a31
MD5 9b5387a7ae16f78cd1bc5769db22bd8d
BLAKE2b-256 1d98dbb11689351f23778fe88897c661b089e23243ac8ecc5bd18436209daf17

See more details on using hashes here.

File details

Details for the file fast_kalman-0.2.2-cp314-cp314-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for fast_kalman-0.2.2-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 2e56e670cde3cf43ef666cf349b28201ead254f82a9772f64f29682f902951f9
MD5 bb5da329e9583b6c5e7d2173dc3c750f
BLAKE2b-256 3326e75818ae52ec978b32576dd9eddc1098d4f92671fb5e41de471290572348

See more details on using hashes here.

File details

Details for the file fast_kalman-0.2.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for fast_kalman-0.2.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c50719bdb07747b2c8f4f9bd71961a831164ded2e599fa2fb0df2117ebb558f1
MD5 8c4ff2362a7a920dcc14a03293d9765f
BLAKE2b-256 656f937aa09fa232acf96b59d8fbf4821d6f5bd7c19b150f2948b683058b610d

See more details on using hashes here.

File details

Details for the file fast_kalman-0.2.2-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for fast_kalman-0.2.2-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 d059191c65bed3344a8ca0cbc21e60d6c0f782e70aec169b0eb2e97fa2358f3a
MD5 b8212b110e6075c3da2d506a2c350dd6
BLAKE2b-256 7ccaf6259284511a8ab931801c6c59fcc23cbd95041c614b6843f4b7aaf5c526

See more details on using hashes here.

File details

Details for the file fast_kalman-0.2.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for fast_kalman-0.2.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 51465a5082bf7c81eaabcc9bca58f72d91afd4525f90d0b5003fdc20909cc9b0
MD5 73a5ade1d19379cff75485fd13aaf803
BLAKE2b-256 2e6e7dba68db244cbabbf7638e8c61351fce063da60d494e72b201afec9b820c

See more details on using hashes here.

File details

Details for the file fast_kalman-0.2.2-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for fast_kalman-0.2.2-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 5e04c7ffc5a40ba7885480a6cbc985f882623556c5410ece362180645dd82d7b
MD5 1c4017afb43bd2fee88f54772cc537be
BLAKE2b-256 33922535db4d621add444a8465cbcf4643f9b215f5921dd8fad5413e86915928

See more details on using hashes here.

File details

Details for the file fast_kalman-0.2.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for fast_kalman-0.2.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 04c361db8398f965109ab0e280009c1b0d7a8074ab2693afeae8fd3048c6e9cb
MD5 668209a4fc75fdaffba52500eb52718f
BLAKE2b-256 6ba3bc7225503517c4af54406cc05a27889f2444c8278d22c22035f136aa82f9

See more details on using hashes here.

File details

Details for the file fast_kalman-0.2.2-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for fast_kalman-0.2.2-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 d51e323eba021ab61816f26cb112a87bdf57d91c039c81a5896c81642f77f8db
MD5 c85f83e7d0825d98613d3a154834cc63
BLAKE2b-256 4d7614418cebc3bd8398edc4c61d827a56108073971b05b6b4e81d8d419eeb60

See more details on using hashes here.

File details

Details for the file fast_kalman-0.2.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for fast_kalman-0.2.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5115ecc616081f604e368e1a034cbc90f264e5053183fcec6f0a165e2fe65558
MD5 93210e0601950451636f8719db6d0081
BLAKE2b-256 3070712f7a8ddb071117de9acc9231500cb1346957a5f6f8400956c879cde3d3

See more details on using hashes here.

File details

Details for the file fast_kalman-0.2.2-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for fast_kalman-0.2.2-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 30666550016725d00429ab715a7cbd4191421148aba71da52e9c283cbb90cebf
MD5 2927dce671aa8a6aa3d4bb55c1b7195d
BLAKE2b-256 f0705b92359ea6bde3cb7ec1229bea9982e782a7d85f0286b3805d1433ed0cb0

See more details on using hashes here.

File details

Details for the file fast_kalman-0.2.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for fast_kalman-0.2.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 86267ea4685383b9ae27d009b4afcd9cb7e6ce2b3559b3f3bfc33cb789637768
MD5 2be6f3ef09266e876f9977857d2398bd
BLAKE2b-256 e2b9063f2ca5116c05d8c5a483722aa6801e80e643d35e2a501e731b77cd3d1d

See more details on using hashes here.

File details

Details for the file fast_kalman-0.2.2-cp39-cp39-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for fast_kalman-0.2.2-cp39-cp39-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 258b60fca457071565f90e1352fe30db1358d08b1644c93d4c651ba3fbcf4acd
MD5 44f35c800960f8ce5680f7e2f0b91235
BLAKE2b-256 a6d4627bfbb3be486a1cfc01e5931c94b97ac9ff76806ef8e4ce5f97a0289a20

See more details on using hashes here.

File details

Details for the file fast_kalman-0.2.2-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for fast_kalman-0.2.2-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 aae73cacda85907eec075fdcced869d750ea29a2036be755b689caa32d86c330
MD5 d01e9dbde8f635e88b587d24af03d8d0
BLAKE2b-256 d3b04aa3b4317c687a76c31c4785326c9bcca23da6db8e9542f8fbf6594e3699

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page