Skip to main content

Nimbus BCI: Bayesian classifiers for brain-computer interfaces

Project description

nimbus-bci

Bayesian BCI classifiers with sklearn compatibility, streaming inference, low-cost online updates (partial_fit vs full refit), measured scoring time via predict_batch · latency_ms, active-learning calibration loops, and rich diagnostics.

PyPI Python License

Documentation in this repo: Why Nimbus? (vs sklearn / pyRiemann) · NimbusBench — main conclusions · Latency (NimbusBench + in-SDK scope) · Trust, calibration, and rejection · Active-learning calibration loops · Notebooks index. Hosted docs: docs.nimbusbci.com.

Features

  • Four sklearn-compatible classifiers: three static Bayesian decoders — LDA, QDA, Softmax (Polya–Gamma) — plus NimbusSTS for latent-state / non-stationary settings (EKF-style updates, experimental)
  • sklearn-compatible API: Works with pipelines, cross-validation, and GridSearchCV
  • Streaming inference: Real-time chunk-by-chunk processing; per-call predict_batchBatchResult.latency_ms
  • Online update cost: Conjugate / variational partial_fit on Nimbus heads — measured vs batch refit in NimbusBench (main conclusions, latency scope)
  • Active learning: suggest_next_trial (BALD on LDA/QDA/Softmax), should_query streaming gate, and label-free calibration_sufficient stopping — cut cued calibration time without manual heuristics
  • Rich diagnostics: Entropy, Mahalanobis distance, calibration metrics (ECE/MCE)
  • Online learning: Update models with new data without retraining
  • BCI-specific utilities: ITR calculation, temporal aggregation, quality assessment
  • MNE-Python integration: Convert between MNE Epochs and Nimbus data formats

Installation

pip install nimbus-bci

To use the optional JAX-based softmax model:

pip install nimbus-bci[softmax]

From source:

git clone https://github.com/nimbusbci/nimbuspysdk.git
cd nimbuspysdk
pip install -e ".[all]"

Quick Start

sklearn-Compatible API (Recommended)

from nimbus_bci import NimbusLDA, NimbusQDA, NimbusSoftmax, NimbusSTS
import numpy as np

# Create and fit classifier
clf = NimbusLDA()
clf.fit(X_train, y_train)

# Predict
predictions = clf.predict(X_test)
probabilities = clf.predict_proba(X_test)

# Online learning
clf.partial_fit(X_new, y_new)

Works with sklearn Pipelines

from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import cross_val_score, GridSearchCV

# Simple pipeline
pipe = make_pipeline(StandardScaler(), NimbusLDA())
pipe.fit(X_train, y_train)

# Cross-validation
scores = cross_val_score(NimbusLDA(), X, y, cv=5)
print(f"Accuracy: {scores.mean():.2%} (+/- {scores.std():.2%})")

# Hyperparameter tuning
param_grid = {'mu_scale': [1.0, 3.0, 5.0], 'class_prior_alpha': [0.5, 1.0]}
grid = GridSearchCV(NimbusLDA(), param_grid, cv=5)
grid.fit(X, y)
print(f"Best params: {grid.best_params_}")

Streaming Inference (Real-Time BCI)

from nimbus_bci import NimbusLDA, StreamingSession
from nimbus_bci.data import BCIMetadata

# Setup
metadata = BCIMetadata(
    sampling_rate=250.0,
    paradigm="motor_imagery",
    feature_type="csp",
    n_features=16,
    n_classes=4,
    chunk_size=125,  # 500ms chunks
    temporal_aggregation="logvar",
)

# Train model
clf = NimbusLDA()
clf.fit(X_train, y_train)

# Create streaming session
session = StreamingSession(clf.model_, metadata)

# Process chunks in real-time
for chunk in eeg_stream:
    result = session.process_chunk(chunk)
    print(f"Chunk prediction: {result.prediction} ({result.confidence:.2%})")

# Finalize trial with aggregation
final = session.finalize_trial(method="weighted_vote")
print(f"Final: class {final.prediction} (entropy: {final.entropy:.2f} bits)")

For NimbusSTS specifically (stateful latent dynamics), use StreamingSessionSTS so the latent state can be propagated and updated with delayed feedback:

from nimbus_bci import NimbusSTS
from nimbus_bci.inference import StreamingSessionSTS
from nimbus_bci.data import BCIMetadata

metadata = BCIMetadata(
    sampling_rate=250.0,
    paradigm="motor_imagery",
    feature_type="csp",
    n_features=16,
    n_classes=2,
    chunk_size=125,
    temporal_aggregation="mean",
)

clf = NimbusSTS().fit(X_train, y_train)
session = StreamingSessionSTS(clf, metadata)

result = session.process_chunk(chunk)  # propagates state by default
session.provide_feedback(label=0)      # when label arrives later

Active Learning (Calibration Loop)

Cut cued-calibration time by labeling only the trials the model is genuinely uncertain about, and stop automatically when the posterior settles:

from nimbus_bci import NimbusLDA
from nimbus_bci.active_learning import (
    suggest_next_trial,
    calibration_sufficient,
)

clf = NimbusLDA().fit(X_seed, y_seed)   # small initial cued batch
prev = clf.get_model()

for _ in range(max_rounds):
    # Rank the unlabeled pool by BALD informativeness, label the top 4.
    ranked = suggest_next_trial(
        clf, X_pool, strategy="bald", n=4, num_posterior_samples=64,
    )
    X_new, y_new = collect_labels_for(ranked.indices)   # cue + record
    clf.partial_fit(X_new, y_new)

    # Label-free stopping: when predict_proba over the pool stops moving,
    # more cues will not change predictions much.
    status = calibration_sufficient(
        clf, X_pool,
        criterion="posterior_stability",
        previous=prev, threshold=0.02,
    )
    if status.is_sufficient:
        break
    prev = clf.get_model()

Strategies (entropy, margin, least_confidence, bald) and stopping criteria (posterior_stability, expected_info_gain) are all model-agnostic. STS gets posterior_stability for free; BALD-based features on STS are deferred to v1.1. Full recipe in docs/active_learning.md.

Batch Inference with Diagnostics

from nimbus_bci import predict_batch
from nimbus_bci.data import BCIData, BCIMetadata

# Create BCI data container
metadata = BCIMetadata(
    sampling_rate=250.0,
    paradigm="motor_imagery",
    feature_type="csp",
    n_features=16,
    n_classes=4,
)
data = BCIData(features, metadata, labels)

# Run batch inference with full diagnostics
result = predict_batch(model, data)

print(f"Mean entropy: {result.mean_entropy:.2f} bits")
print(f"Balance: {result.balance:.2%}")
if result.calibration is not None:
    print(f"ECE: {result.calibration.ece:.3f}")
print(f"Latency: {result.latency_ms:.1f}ms")

latency_ms is the SDK’s measured wall time for this predict_batch call (not your full acquisition→feature pipeline). Online update cost vs batch refit is in NimbusBench (main conclusions, Latency & performance).

MNE-Python Integration

import mne
from nimbus_bci import NimbusLDA
from nimbus_bci.compat import from_mne_epochs, extract_csp_features

# Load and preprocess with MNE
raw = mne.io.read_raw_gdf("motor_imagery.gdf")
events = mne.find_events(raw)
epochs = mne.Epochs(raw, events, tmin=0, tmax=4, baseline=None, preload=True)
epochs.filter(8, 30)  # Mu + Beta bands

# Extract CSP features
csp_features, csp = extract_csp_features(epochs, n_components=8)

# Train Nimbus classifier
clf = NimbusLDA()
clf.fit(csp_features, epochs.events[:, 2])

Available Classifiers

Classifier Description Best For
NimbusLDA Bayesian LDA with shared covariance Fast, when classes have similar shapes
NimbusQDA Bayesian QDA with class-specific covariances Complex class distributions
NimbusSoftmax Bayesian logistic regression (Polya-Gamma VI) Non-Gaussian decision boundaries
NimbusSTS Structural time series classifier (latent state + EKF-style inference) Non-stationary settings, drifting class boundaries (experimental)

Choosing the Right Classifier

Quick Decision Guide

Is your data stationary (distributions don't change over time)?

  • Yes → Use static models (LDA/QDA/Softmax)
  • No → Use NimbusSTS for temporal adaptation

For stationary data:

  • Classes have similar covariance?NimbusLDA (fastest)
  • Classes have different shapes?NimbusQDA
  • Non-Gaussian boundaries?NimbusSoftmax

For non-stationary data:

  • Gradual drift (fatigue, electrode shift)?NimbusSTS
  • Multi-day sessions with state transfer?NimbusSTS
  • Delayed feedback paradigms?NimbusSTS

Detailed Comparison

Scenario Recommended Model Why?
Stable offline datasets NimbusLDA Fastest, closed-form solution
P300 spelling (stable) NimbusLDA or NimbusQDA Event-related, stationary
SSVEP NimbusLDA Highly stationary frequency response
Motor Imagery (short sessions) NimbusLDA or NimbusQDA Stationary within session
Motor Imagery (long sessions, fatigue) NimbusSTS Tracks drift due to fatigue
Multi-day experiments NimbusSTS State transfer across sessions
Electrode repositioning NimbusSTS Adapts to impedance changes
Closed-loop with delayed feedback NimbusSTS Explicit state propagation
Asynchronous BCI (idle vs active) NimbusSTS Models engagement state
Neurofeedback training NimbusSTS Tracks learning-induced changes
Long calibration sessions, want to cut label cost Any head + suggest_next_trial(strategy="bald") Pool-based BALD on the conjugate posterior; LDA/QDA/Softmax in v1
Don't know when to stop calibrating Any head + calibration_sufficient Label-free posterior_stability works for STS too

NimbusSTS Example (Temporal Adaptation)

from nimbus_bci import NimbusSTS

# Train on calibration data
clf = NimbusSTS(transition_cov=0.05, num_steps=50)
clf.fit(X_calibration, y_calibration)

# Online session with delayed feedback
for x_trial, y_feedback in online_trials:
    # 1. Propagate state forward (no label needed)
    clf.propagate_state()
    
    # 2. Make prediction
    prediction = clf.predict(x_trial)
    
    # ... user performs action, feedback arrives later ...
    
    # 3. Update with true label
    clf.partial_fit(x_trial, y_feedback)

# Multi-day state transfer
z_day1, P_day1 = clf.get_latent_state()

# Day 2: Initialize with Day 1 state (increased uncertainty)
clf_day2 = NimbusSTS()
clf_day2.fit(X_day2_calib, y_day2_calib)
clf_day2.set_latent_state(z_day1 * 0.5, P_day1 * 2.0)

Label Conventions (Important)

Nimbus supports common EEG/BCI labeling patterns:

  • BCIData labels: can be any non-negative integer codes (e.g., MNE event IDs like 769/770), as long as the number of unique labels does not exceed BCIMetadata.n_classes.
  • sklearn estimators (NimbusLDA, NimbusQDA, NimbusSoftmax, NimbusSTS):
    • fit() learns classes_ from your provided labels.
    • predict() returns labels in the original label space (elements of classes_).
  • Model-snapshot inference (NimbusModel + predict_batch / StreamingSession):
    • predictions are returned in the model’s label_base convention (label_base is stored in model.params).
    • use nimbus_bci.data.labels_to_zero_indexed(...) for metrics/aggregation that require 0-indexed labels.

NimbusSTS Sequence Semantics (Important)

NimbusSTS has a latent state. For correctness and sklearn compatibility:

  • NimbusSTS.predict_proba(X) treats rows as conditionally independent by default.
  • For time-ordered evaluation, propagate explicitly:
    • call clf.propagate_state() between trials/chunks, or
    • use the functional API nimbus_sts_predict_proba(model, X, evolve_state=True) when X rows are ordered in time.

Metrics & Diagnostics

from nimbus_bci import (
    compute_entropy,            # Prediction uncertainty
    compute_calibration_metrics,  # ECE, MCE
    calculate_itr,              # Information Transfer Rate
    assess_trial_quality,       # Quality checks
)

# Entropy (uncertainty)
entropy = compute_entropy(posterior)  # bits

# Calibration
calib = compute_calibration_metrics(predictions, confidences, labels)
print(f"ECE: {calib.ece:.3f}, MCE: {calib.mce:.3f}")

# ITR
itr = calculate_itr(accuracy=0.85, n_classes=4, trial_duration=4.0)
print(f"ITR: {itr:.1f} bits/min")

Normalization

Critical for cross-session BCI performance:

from nimbus_bci import estimate_normalization_params, apply_normalization

# Estimate from training data
params = estimate_normalization_params(X_train, method="zscore")

# Apply to all data
X_train_norm = apply_normalization(X_train, params)
X_test_norm = apply_normalization(X_test, params)  # Same params!

Benchmarks

Reproducible MOABB runs live in the separately installable [nimbusbench/](nimbusbench/README.md) package (install, CLI, checked-in CSVs, benchmark_summary.md).

Read in order: Main conclusions (what to take away) → Pinned headline table (numbers + CSV paths) → Limitations. Statistics: benchmark_preregistration.md. What each model track may claim: benchmark_claims.md.

At a glance (IV-2b / Lee2019 unless noted)

  • S3: partial_fit matches Nimbus batch refit in eval accuracy; mean head-only update time ~8–10× lower than sklearn batch refit on the same stream (see table + latency for E2E scope).
  • S4: Report effective ITR together with accept rate and accuracy on accepted (LOFO / non-oracle).
  • S5: Lee2019 — positive mean lift for partial_fit vs static on accuracy and effective ITR; Physionet is supporting; report heterogeneity where summaries include it.
  • S1 / S2: Preregistered small-label and tail metrics only—not a universal “beats sklearn” claim.

Regenerate numbers with python -m nimbusbench summarize --input … next to the CSVs; do not copy stale figures from prose.

Quick demo (no MOABB download): notebooks/s3_update_latency_head_vs_sklearn.ipynb - same-accuracy partial_fit vs Nimbus refit + ~8–10× head update vs sklearn refit from the checked-in S3 CSV.

Project Structure

nimbus_bci/
├── models/              # Classifiers
│   ├── nimbus_lda/     # LDA (shared covariance)
│   ├── nimbus_qda/     # QDA (class-specific covariances)
│   └── nimbus_softmax/ # Softmax (Polya-Gamma)
├── data/               # Data contracts (BCIData, BCIMetadata)
├── inference/          # Batch and streaming inference
├── metrics/            # Diagnostics, calibration, ITR
├── utils/              # Normalization, aggregation
└── compat/             # sklearn/MNE compatibility

Functional API (Backward Compatible)

The original functional API is still available:

from nimbus_bci import (
    nimbus_lda_fit, nimbus_lda_predict, nimbus_lda_update,
    nimbus_qda_fit, nimbus_qda_predict,
    nimbus_softmax_fit, nimbus_softmax_predict,
    nimbus_save, nimbus_load,
)

# Fit model
model = nimbus_lda_fit(X, y, n_classes=4, label_base=0, ...)

# Predict
probs = nimbus_lda_predict_proba(model, X_test)

# Update (online learning)
model = nimbus_lda_update(model, X_new, y_new)

# Save/load
nimbus_save(model, "model.npz")
model = nimbus_load("model.npz")

# Legacy trusted artifacts that contain object-serialized params
# require explicit opt-in:
legacy_model = nimbus_load("legacy-model.npz", trusted=True)

Testing

pip install -e ".[dev]"
pytest -v

Requirements

Core (installed with pip install nimbus-bci):

  • Python ≥ 3.11
  • NumPy ≥ 1.26
  • scikit-learn ≥ 1.4
  • SciPy ≥ 1.17.1

Optional extras:

  • JAX ≥ 0.4.25 — required for NimbusSoftmax and the softmax functional API (pip install nimbus-bci[softmax])
  • MNE ≥ 1.6 — EEG integration (pip install nimbus-bci[mne])
  • matplotlib ≥ 3.8 — visualization (pip install nimbus-bci[viz])
  • all installs all optional extras above (pip install nimbus-bci[all])

License

This Software is proprietary — Nimbus BCI Inc. retains all rights — and is licensed under two tracks:

  1. No-cost Non-Commercial License (self-executing, no registration required). Anyone may install, use, modify, and redistribute the Software (and their own derivative works) for non-commercial research, scholarship, teaching, or personal learning — including at universities, government labs, and non-profit research organizations. Modifications and non-commercial distribution (e.g., forks, public reproducibility archives) are permitted, provided derivative works keep this LICENSE.txt and link back to nimbusbci.com. A non-commercial patent grant is included. Citation is strongly requested (it's how a small team sustains no-cost academic access) but is not a legal condition — you don't lose your license by forgetting a BibTeX entry. See CITATION.cff.

  2. Paid Commercial License. Any use inside a for-profit company, in a paid product or service, for sponsored/fee-for-service research, or for internal business operations requires a separate written commercial license. Tiers below.

Tier Use Case
Startup Companies < $1M revenue
Commercial Full production rights
Enterprise Unlimited deployments + SLA
OEM/Embedded Medical devices, FDA support, white-label redistribution

Full terms: LICENSE.txt. If you are unsure which track applies to your use case, contact hello@nimbusbci.com.

How to cite

If you use the Nimbus BCI Python SDK in your research, please cite it (see CITATION.cff):

@software{nimbus_bci_pysdk,
  author       = {{Nimbus BCI Inc.}},
  title        = {Nimbus BCI Python SDK: Bayesian classifiers for brain-computer interfaces},
  year         = {2026},
  version      = {0.4.2},
  url          = {https://nimbusbci.com},
  note         = {Replace the version above with the version you installed.}
}

Request a commercial license

  1. Email hello@nimbusbci.com with your use case
  2. Receive a license agreement and API key (if applicable)
  3. Install and start building

Website: https://nimbusbci.com


© 2024-2026 Nimbus BCI Inc. — The AI Engine for Brain-Computer Interfaces.

License: Proprietary with a no-cost Non-Commercial License for academic and non-commercial use (citation requested, not required). See License below and LICENSE.txt.

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

nimbus_bci-0.4.2.tar.gz (133.3 kB view details)

Uploaded Source

Built Distributions

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

nimbus_bci-0.4.2-cp313-cp313-win_amd64.whl (482.1 kB view details)

Uploaded CPython 3.13Windows x86-64

nimbus_bci-0.4.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (3.1 MB view details)

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

nimbus_bci-0.4.2-cp313-cp313-macosx_11_0_arm64.whl (530.4 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

nimbus_bci-0.4.2-cp313-cp313-macosx_10_13_x86_64.whl (546.3 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

nimbus_bci-0.4.2-cp312-cp312-win_amd64.whl (485.8 kB view details)

Uploaded CPython 3.12Windows x86-64

nimbus_bci-0.4.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (3.2 MB view details)

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

nimbus_bci-0.4.2-cp312-cp312-macosx_11_0_arm64.whl (533.6 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

nimbus_bci-0.4.2-cp312-cp312-macosx_10_13_x86_64.whl (549.4 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

nimbus_bci-0.4.2-cp311-cp311-win_amd64.whl (503.9 kB view details)

Uploaded CPython 3.11Windows x86-64

nimbus_bci-0.4.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (3.2 MB view details)

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

nimbus_bci-0.4.2-cp311-cp311-macosx_11_0_arm64.whl (543.0 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

nimbus_bci-0.4.2-cp311-cp311-macosx_10_9_x86_64.whl (579.6 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

File details

Details for the file nimbus_bci-0.4.2.tar.gz.

File metadata

  • Download URL: nimbus_bci-0.4.2.tar.gz
  • Upload date:
  • Size: 133.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for nimbus_bci-0.4.2.tar.gz
Algorithm Hash digest
SHA256 f7c3a35c689cea2d4e2dd01a3f81dbcd0870a908affbba9b88f80ca13efee181
MD5 b7649c3a87e7d1725bb5057675509026
BLAKE2b-256 759af29f39cd58fb1a9da97f1fdf22d6f2e320331f405e3ba0f378da0181f42b

See more details on using hashes here.

File details

Details for the file nimbus_bci-0.4.2-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: nimbus_bci-0.4.2-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 482.1 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for nimbus_bci-0.4.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 4a9004600493b14a688c74f97f863cd63fafb26b212100249b94efe3bbbc332c
MD5 7e141e0e2cd4161aa2a3631d84e12062
BLAKE2b-256 265d9e02157e02eb0a9ffa146589bef00a870f7c4cb2fd3923a76c72c0e9b50c

See more details on using hashes here.

File details

Details for the file nimbus_bci-0.4.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for nimbus_bci-0.4.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9556162d0aa44989e8fd2316add47e47a600f6767eb01da2e7e44efa989c1d12
MD5 0019c8fcaa37709f24303af5f920c0c9
BLAKE2b-256 a59b887eaa391abaa1070de063a9ed65067bc4c5bc4d39d98dfdbb130d303291

See more details on using hashes here.

File details

Details for the file nimbus_bci-0.4.2-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for nimbus_bci-0.4.2-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 670b44f99a57c77b563ec1b781ca1d9242f1196495a758fa7f1404b48dd5668a
MD5 143158f129ebd57fee1e0b8c5f3f924a
BLAKE2b-256 1e6f9b7948ca87f666dc6491ea062131de6c9a026a22b871f2716d6125f110e9

See more details on using hashes here.

File details

Details for the file nimbus_bci-0.4.2-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for nimbus_bci-0.4.2-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 e86ed585f56c6ffe954b577a6be463be3dc7f92090374e336bf194b4e5626457
MD5 56fcb4c1ed247f5ffb64d5c04ecf3b0b
BLAKE2b-256 9456e83f453560e9e4f7a44abbfba553e3b6db90404b8c7eeb1be7f257852c88

See more details on using hashes here.

File details

Details for the file nimbus_bci-0.4.2-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: nimbus_bci-0.4.2-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 485.8 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for nimbus_bci-0.4.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 b787262877b8a4d8bc9287c1c05db120519fa8af6bc8cd10f5565df1cbbf96b8
MD5 0c5264b3cc5129db637caac1898ca9e5
BLAKE2b-256 1e45c91fb3ad9fc037146635ae3f19d0c5dd9afc5deb554c861293bc4ced87f2

See more details on using hashes here.

File details

Details for the file nimbus_bci-0.4.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for nimbus_bci-0.4.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 55706db179b0fa93a4b1e8bce1427731b22e7d198037f50941b55385b8f8f4c7
MD5 ce2f6700872a73cd595f76d1cbd01ad0
BLAKE2b-256 9f57506ee016a6db35dd41cfae26c2ce3f5e232ff3adeb52e658d3647e834f54

See more details on using hashes here.

File details

Details for the file nimbus_bci-0.4.2-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for nimbus_bci-0.4.2-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c4aa6cf440e84efde452e04894dda30de789b747fafa9f7edacd234ff5b7a24e
MD5 0be5bb09f979a5426f07a613e1499d43
BLAKE2b-256 a7f6e382b502b2aa3b0ce39fd688f8152893fd6bb9b6c65a73fc759f21d2043c

See more details on using hashes here.

File details

Details for the file nimbus_bci-0.4.2-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for nimbus_bci-0.4.2-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 9d6dd7203e474f6b41b1138eab1c383e82f77b22541686d0ebbae08a63f03afb
MD5 d6166835dba066d57b4463dceee0d780
BLAKE2b-256 0c8224f6bedae2d1817eb6f417dc9900580f94638bd1b4faf997703e895870e7

See more details on using hashes here.

File details

Details for the file nimbus_bci-0.4.2-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: nimbus_bci-0.4.2-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 503.9 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for nimbus_bci-0.4.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 a8de18adcacd2b813192c7e366281d37459fbea1d46d8b921e83d3fcfea859a5
MD5 9e4cbfe2c0b1dd78eeb60c5be23bca6c
BLAKE2b-256 a93269cece26eac74e0bd6f83862b041f00166709f307021965450b095575fd2

See more details on using hashes here.

File details

Details for the file nimbus_bci-0.4.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for nimbus_bci-0.4.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9c2fd501852bb7b009591fbf6deaaee3b2cfcd15ff3c69680460fb262ede146a
MD5 4bab1cbde87c666e7808020b64f0d3f6
BLAKE2b-256 1f73cdeb7632d0070d0efaea685791ca22d5ac01da3b9a4f59ade782f9708d33

See more details on using hashes here.

File details

Details for the file nimbus_bci-0.4.2-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for nimbus_bci-0.4.2-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b60f964484856b4a2a9312982c939af4ccc7522252740a400c5d63d3fbf16cdb
MD5 80f1f13f8e793c633bfbc19a1e09bec5
BLAKE2b-256 b0028e697520b624a16724a1ebd81925e7a5da4861c38a7b2cc63de23a13b484

See more details on using hashes here.

File details

Details for the file nimbus_bci-0.4.2-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for nimbus_bci-0.4.2-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 9b73be028c69022690655480887a7c1674b69c2b854788656dae490730d01980
MD5 2a73dc0f0adb67cda106739b8e2936cb
BLAKE2b-256 7e9e0a0b72adf580ed7cd426b81bd025e5b6f413b7799c39aa1894aab4d16c78

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