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.
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_batch→BatchResult.latency_ms - Online update cost: Conjugate / variational
partial_fiton Nimbus heads — measured vs batch refit in NimbusBench (main conclusions, latency scope) - Active learning:
suggest_next_trial(BALD on LDA/QDA/Softmax),should_querystreaming gate, and label-freecalibration_sufficientstopping — 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
NimbusSTSfor 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()learnsclasses_from your provided labels.predict()returns labels in the original label space (elements ofclasses_).
- Model-snapshot inference (
NimbusModel+predict_batch/StreamingSession):- predictions are returned in the model’s label_base convention (
label_baseis stored inmodel.params). - use
nimbus_bci.data.labels_to_zero_indexed(...)for metrics/aggregation that require 0-indexed labels.
- predictions are returned in the model’s label_base convention (
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)whenXrows are ordered in time.
- call
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_fitmatches 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_fitvs 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
NimbusSoftmaxand 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]) allinstalls 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:
-
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. -
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
- Email hello@nimbusbci.com with your use case
- Receive a license agreement and API key (if applicable)
- 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
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f7c3a35c689cea2d4e2dd01a3f81dbcd0870a908affbba9b88f80ca13efee181
|
|
| MD5 |
b7649c3a87e7d1725bb5057675509026
|
|
| BLAKE2b-256 |
759af29f39cd58fb1a9da97f1fdf22d6f2e320331f405e3ba0f378da0181f42b
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4a9004600493b14a688c74f97f863cd63fafb26b212100249b94efe3bbbc332c
|
|
| MD5 |
7e141e0e2cd4161aa2a3631d84e12062
|
|
| BLAKE2b-256 |
265d9e02157e02eb0a9ffa146589bef00a870f7c4cb2fd3923a76c72c0e9b50c
|
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
- Download URL: nimbus_bci-0.4.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 3.1 MB
- Tags: CPython 3.13, manylinux: glibc 2.17+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9556162d0aa44989e8fd2316add47e47a600f6767eb01da2e7e44efa989c1d12
|
|
| MD5 |
0019c8fcaa37709f24303af5f920c0c9
|
|
| BLAKE2b-256 |
a59b887eaa391abaa1070de063a9ed65067bc4c5bc4d39d98dfdbb130d303291
|
File details
Details for the file nimbus_bci-0.4.2-cp313-cp313-macosx_11_0_arm64.whl.
File metadata
- Download URL: nimbus_bci-0.4.2-cp313-cp313-macosx_11_0_arm64.whl
- Upload date:
- Size: 530.4 kB
- Tags: CPython 3.13, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
670b44f99a57c77b563ec1b781ca1d9242f1196495a758fa7f1404b48dd5668a
|
|
| MD5 |
143158f129ebd57fee1e0b8c5f3f924a
|
|
| BLAKE2b-256 |
1e6f9b7948ca87f666dc6491ea062131de6c9a026a22b871f2716d6125f110e9
|
File details
Details for the file nimbus_bci-0.4.2-cp313-cp313-macosx_10_13_x86_64.whl.
File metadata
- Download URL: nimbus_bci-0.4.2-cp313-cp313-macosx_10_13_x86_64.whl
- Upload date:
- Size: 546.3 kB
- Tags: CPython 3.13, macOS 10.13+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e86ed585f56c6ffe954b577a6be463be3dc7f92090374e336bf194b4e5626457
|
|
| MD5 |
56fcb4c1ed247f5ffb64d5c04ecf3b0b
|
|
| BLAKE2b-256 |
9456e83f453560e9e4f7a44abbfba553e3b6db90404b8c7eeb1be7f257852c88
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b787262877b8a4d8bc9287c1c05db120519fa8af6bc8cd10f5565df1cbbf96b8
|
|
| MD5 |
0c5264b3cc5129db637caac1898ca9e5
|
|
| BLAKE2b-256 |
1e45c91fb3ad9fc037146635ae3f19d0c5dd9afc5deb554c861293bc4ced87f2
|
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
- Download URL: nimbus_bci-0.4.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 3.2 MB
- Tags: CPython 3.12, manylinux: glibc 2.17+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
55706db179b0fa93a4b1e8bce1427731b22e7d198037f50941b55385b8f8f4c7
|
|
| MD5 |
ce2f6700872a73cd595f76d1cbd01ad0
|
|
| BLAKE2b-256 |
9f57506ee016a6db35dd41cfae26c2ce3f5e232ff3adeb52e658d3647e834f54
|
File details
Details for the file nimbus_bci-0.4.2-cp312-cp312-macosx_11_0_arm64.whl.
File metadata
- Download URL: nimbus_bci-0.4.2-cp312-cp312-macosx_11_0_arm64.whl
- Upload date:
- Size: 533.6 kB
- Tags: CPython 3.12, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c4aa6cf440e84efde452e04894dda30de789b747fafa9f7edacd234ff5b7a24e
|
|
| MD5 |
0be5bb09f979a5426f07a613e1499d43
|
|
| BLAKE2b-256 |
a7f6e382b502b2aa3b0ce39fd688f8152893fd6bb9b6c65a73fc759f21d2043c
|
File details
Details for the file nimbus_bci-0.4.2-cp312-cp312-macosx_10_13_x86_64.whl.
File metadata
- Download URL: nimbus_bci-0.4.2-cp312-cp312-macosx_10_13_x86_64.whl
- Upload date:
- Size: 549.4 kB
- Tags: CPython 3.12, macOS 10.13+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9d6dd7203e474f6b41b1138eab1c383e82f77b22541686d0ebbae08a63f03afb
|
|
| MD5 |
d6166835dba066d57b4463dceee0d780
|
|
| BLAKE2b-256 |
0c8224f6bedae2d1817eb6f417dc9900580f94638bd1b4faf997703e895870e7
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a8de18adcacd2b813192c7e366281d37459fbea1d46d8b921e83d3fcfea859a5
|
|
| MD5 |
9e4cbfe2c0b1dd78eeb60c5be23bca6c
|
|
| BLAKE2b-256 |
a93269cece26eac74e0bd6f83862b041f00166709f307021965450b095575fd2
|
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
- Download URL: nimbus_bci-0.4.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 3.2 MB
- Tags: CPython 3.11, manylinux: glibc 2.17+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9c2fd501852bb7b009591fbf6deaaee3b2cfcd15ff3c69680460fb262ede146a
|
|
| MD5 |
4bab1cbde87c666e7808020b64f0d3f6
|
|
| BLAKE2b-256 |
1f73cdeb7632d0070d0efaea685791ca22d5ac01da3b9a4f59ade782f9708d33
|
File details
Details for the file nimbus_bci-0.4.2-cp311-cp311-macosx_11_0_arm64.whl.
File metadata
- Download URL: nimbus_bci-0.4.2-cp311-cp311-macosx_11_0_arm64.whl
- Upload date:
- Size: 543.0 kB
- Tags: CPython 3.11, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b60f964484856b4a2a9312982c939af4ccc7522252740a400c5d63d3fbf16cdb
|
|
| MD5 |
80f1f13f8e793c633bfbc19a1e09bec5
|
|
| BLAKE2b-256 |
b0028e697520b624a16724a1ebd81925e7a5da4861c38a7b2cc63de23a13b484
|
File details
Details for the file nimbus_bci-0.4.2-cp311-cp311-macosx_10_9_x86_64.whl.
File metadata
- Download URL: nimbus_bci-0.4.2-cp311-cp311-macosx_10_9_x86_64.whl
- Upload date:
- Size: 579.6 kB
- Tags: CPython 3.11, macOS 10.9+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9b73be028c69022690655480887a7c1674b69c2b854788656dae490730d01980
|
|
| MD5 |
2a73dc0f0adb67cda106739b8e2936cb
|
|
| BLAKE2b-256 |
7e9e0a0b72adf580ed7cd426b81bd025e5b6f413b7799c39aa1894aab4d16c78
|