Skip to main content

Very fast Kalman filters.

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).

Python state helpers:

  • q_over_r_for_window(window) converts an EMA-style window length to the scalar random-walk Q / R ratio.
  • filter_object.slow_down(factor) scales Q down by q_over_r_for_window(factor).
  • filter_object.speed_up(factor) applies the reciprocal scaling to Q. Calling kf.slow_down(n) followed by kf.speed_up(n) restores the original Q values, up to floating point roundoff.
  • filter_object.first_value(value) resets the current state estimate without changing P, Q, R, or other tuning matrices. Scalar values are accepted; when fewer values than the state dimension are supplied, remaining state entries are reset to 0.0.
  • filter_object.params reconstructs constructor arguments from the current live filter state. For example, clone = kalman.LinearKalmanFilter(*kf.params) creates a copy of a currently winning linear filter without tracking the original arguments separately.
  • Python filter objects are pickleable and restore through the public Python constructors.

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.4.tar.gz (56.2 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.4-cp314-cp314t-musllinux_1_2_x86_64.whl (2.3 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ x86-64

fast_kalman-0.2.4-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.2 MB view details)

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

fast_kalman-0.2.4-cp314-cp314-musllinux_1_2_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

fast_kalman-0.2.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.1 MB view details)

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

fast_kalman-0.2.4-cp313-cp313-musllinux_1_2_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

fast_kalman-0.2.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.1 MB view details)

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

fast_kalman-0.2.4-cp312-cp312-musllinux_1_2_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

fast_kalman-0.2.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.1 MB view details)

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

fast_kalman-0.2.4-cp311-cp311-musllinux_1_2_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

fast_kalman-0.2.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.1 MB view details)

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

fast_kalman-0.2.4-cp310-cp310-musllinux_1_2_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

fast_kalman-0.2.4-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.1 MB view details)

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

fast_kalman-0.2.4-cp39-cp39-musllinux_1_2_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.9musllinux: musl 1.2+ x86-64

fast_kalman-0.2.4-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.1 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.4.tar.gz.

File metadata

  • Download URL: fast_kalman-0.2.4.tar.gz
  • Upload date:
  • Size: 56.2 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.4.tar.gz
Algorithm Hash digest
SHA256 9019161387efbaa27124a5a7f8dae38063f0b6df6b1e63177bcd6908af9f9c8e
MD5 422504f9215c0f924ae608eb92268ec0
BLAKE2b-256 e8cb208940b3e99cbe427a1484ea6c7f34f1d4a7bc663979d558412c4c29ae90

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fast_kalman-0.2.4-cp314-cp314t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 9e1daefce5a3840a0b990baf1c3f056c4067a42f195ee875e4252c868ae2ea7d
MD5 8b813e1b9d106bdbbe6f411ba7740f15
BLAKE2b-256 28c604e645dbccb55e2f768f0607f136e4486608bb8a17589e664ff728d7f990

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fast_kalman-0.2.4-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 cfe983348c2bc221179258f032e3a5cc048038f11d3de57b90169320efeaea6b
MD5 bae087243196b2cf62e3437af3c7e377
BLAKE2b-256 40f062cc4e8c4859894ba1e505abf5400d940ea20c1e230a596457d99ca5bfb6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fast_kalman-0.2.4-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 ee35a0c57fb2118c3bd76f3f35282b5731c459c46f74205d7d37bef7a2e73ca9
MD5 91f396154124262543a7a35ebb6ff088
BLAKE2b-256 d4bc4fd7ec84a0d20dbeb482e6d92743a724f6fb90a7bef1e4f602af95d43b3f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fast_kalman-0.2.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e5ef2c8f574ca226b892eb4a7080af067816210d51b104d696d2954e4ff56d25
MD5 0222e70d84f7a9155b09801c0c0e6db3
BLAKE2b-256 5a39773fae5bfbabb4f39bdd12211690ebc92f429db165ea286f80a139f39f09

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fast_kalman-0.2.4-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 4f39be506d4ef9005297e3f778d48c61b6da90be3be5a7c3e7ede6d1c5e7a77c
MD5 e15e35e8cff725957e9d715b843d5e2b
BLAKE2b-256 4e5c956e39020a970c5fe50b4d886a53b207b861159ad0b35c1aa7e42109080f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fast_kalman-0.2.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ef3a01b74f58449bb6bcb9af6e5078265092e29c240ca7eddd2a454adafeed6f
MD5 29370d04b4676bc6cd9637513066d54d
BLAKE2b-256 8520e9c0d53355835c7b06e74069d0a04a1e2ed65807208179583233b76ced9a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fast_kalman-0.2.4-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 3d03715621aaf7fb45d354a7a6c21a21b59229d24e63302ab55c64ed4a373135
MD5 a73d5b58766a549a9b200ed0260761d6
BLAKE2b-256 7d1aa4a0afb7195aa21b7cee518a283903e767c49be2a1d318d55dafa0debe50

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fast_kalman-0.2.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8a19cac82afd1f8322967f3b74bad98dfadcae00045f3ee63f9c13fdb407001f
MD5 958ad769fb6c01bb05022f84902fee6c
BLAKE2b-256 8a143fbce38b6906204c4159c9991e0aa7df9f3bc2cc323b66bd3ae18f122aec

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fast_kalman-0.2.4-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 4982ab36d4c6a091d93cd259d20501efc9456e130aa42f993ae8144446f708da
MD5 6d8c4103d22a4e4186d1beac372f2e2d
BLAKE2b-256 e665a72df9756e00cac840996dce1482ffa489720c78fb684bffdddaa1ff6d39

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fast_kalman-0.2.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f15d4e20e4e22b88100f64582cd6e5784801ee7ba819d034a5a29d6b2b1e366e
MD5 8ecd84fda88378870d89630c8d079cc9
BLAKE2b-256 7befab4ee8618a2e4f1b180335535053cc450b28ca56e604d0aef4a838aa3414

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fast_kalman-0.2.4-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 59f1e5bee9305c4f42b7c07eb4e16ac439ef531853aa86863cfed4a7b579aae4
MD5 e36dee19912e51af55c3cb75ecb4ae40
BLAKE2b-256 4a5eb0952c1f70566343ae80782ae33be2b950eddd97b3ed92a57da80b63e206

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fast_kalman-0.2.4-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7a823cac6d7b0ff31c4b12bc09fd1cf2e88471b4e57727b8a39a29bf7388c643
MD5 f7e86fbe5f05560eb0501a0bb93c747f
BLAKE2b-256 40f73322a060dbb413badbf0837ab23ff1544cce09e657142142625d1275ebfc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fast_kalman-0.2.4-cp39-cp39-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 3e47c235c6a37767b5ac20b9d8667a34c943c0dceebc936055ceebdead117acb
MD5 40e720eaa93a93513a5c6dcf086966f6
BLAKE2b-256 9140ddce87fb2788858a79722bb061d33b6baf3c7e8289120e4b4878fdb7df47

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for fast_kalman-0.2.4-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d12afad87966ec064bfd4e8e533936fa2e4bd250ede1e6c3e8addf48e8bb70fe
MD5 abdb9f11388d94d6c8a5e5a72e2a3894
BLAKE2b-256 35a21d2aedf990d80171816b1c52fc027a3b3651f6381dc50f7468c0c3ea693d

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