TrialCEBRA
[English | 中文]
Trial-aware contrastive learning for CEBRA. Pass 3-D epoch-format data (ntrial, ntime, nneuro) — trial boundaries are respected automatically.
Installation
Step 1 — Install PyTorch from pytorch.org.
Step 2
pip install TrialCEBRA
Quick Start
import numpy as np
from trial_cebra import TrialCEBRA
X = np.random.randn(40, 50, 64).astype(np.float32) # (ntrial, ntime, nneuro)
y = np.random.randn(40, 16).astype(np.float32) # (ntrial, stim_dim)
model = TrialCEBRA(
model_architecture = "offset10-model",
conditional = "delta",
time_offsets = 5,
delta = 0.3,
output_dimension = 3,
max_iterations = 1000,
batch_size = 512,
)
model.fit(X, y)
emb = model.transform(X) # (ntrial, ntime, 3) — shape preserved
2-D flat input (N, nneuro) falls back to native CEBRA behavior unchanged.
Conditionals
conditional |
Trial selection | Within-trial | y shape |
|---|---|---|---|
"time" |
Uniform random | ±time_offsets window |
not required |
"delta" |
Gaussian similarity on y | Uniform (free) | (ntrial, nd) or (ntrial, ntime, nd) |
"time_delta" |
Joint argmin across trials | ±time_offsets window |
(ntrial, ntime, nd) |
Pass a discrete integer label (e.g. y_disc of dtype int64) alongside a continuous label to enable class-conditional trial selection for "delta".
Key Parameters
TrialCEBRA(
conditional = "delta", # "time" | "delta" | "time_delta"
time_offsets = 10, # half-width of within-trial time window
delta = 0.1, # Gaussian noise std for trial similarity
sample_fix_trial = False, # True: fix trial pairing at init
sample_exclude_intrial = True, # True: positives always from a different trial
sample_prior = "balanced", # "balanced" (default) or "uniform"
output_dimension = 3,
# ... all other cebra.CEBRA kwargs accepted
)
After fit, the distribution is accessible at model.distribution_.
Transform
transform() preserves input dimensionality:
emb = model.transform(X) # (ntrial, ntime, 3) if X is (ntrial, ntime, nneuro)
emb = model.transform(X_flat) # (N, 3) if X_flat is (N, nneuro)
emb = model.transform_epochs(X) # strict 3-D variant — raises if X.ndim != 3
Metrics
All metric methods accept epoch-format (ntrial, ntime, nneuro) data directly:
loss = model.infonce_loss(X, y)
gof = model.goodness_of_fit_score(X, y)
hist = model.goodness_of_fit_history() # training curve, no X needed
# Consistency score: accepts 3-D embedding lists
emb1 = model.transform(X1) # (ntrial, ntime, 3)
emb2 = model.transform(X2)
scores, pairs, ids = TrialCEBRA.consistency_score(
[emb1, emb2], between="runs"
)
# between-datasets: pass labels=(ntrial, ntime) or (ntrial*ntime,)
scores, pairs, ids = TrialCEBRA.consistency_score(
[emb1, emb2],
between="datasets",
labels=[y1, y2],
dataset_ids=["mouse1", "mouse2"],
)
Decoders
CEBRA decoders (KNNDecoder, L1LinearRegressor) are standalone sklearn estimators that expect 2-D input. Flatten the embedding first:
import cebra
emb = model.transform(X) # (ntrial, ntime, 3)
emb_flat = emb.reshape(-1, emb.shape[-1]) # (ntrial*ntime, 3)
y_flat = y.reshape(-1) # (ntrial*ntime,)
decoder = cebra.KNNDecoder()
decoder.fit(emb_flat, y_flat)
score = decoder.score(emb_flat, y_flat)
Multi-session
Pass X as a list of epoch arrays (one per session):
X = [
np.random.randn(30, 100, 64).astype(np.float32), # session 0
np.random.randn(25, 80, 48).astype(np.float32), # session 1
]
y_cont = [np.random.randn(30, 100, 16).astype(np.float32),
np.random.randn(25, 80, 16).astype(np.float32)]
y_disc = [np.zeros((30, 100), dtype=np.int64),
np.zeros((25, 80), dtype=np.int64)]
model = TrialCEBRA(conditional="delta", output_dimension=3, max_iterations=1000)
model.fit(X, y_disc, y_cont)
"delta" and "time_delta" are supported for multi-session; "time" raises NotImplementedError.
Contributing
uv sync --dev
uv run pre-commit install --hook-type pre-commit --hook-type pre-push
uv run pytest tests/ -v
Release: git tag vX.X.X && git push origin vX.X.X.
Metadata
Release files for TrialCEBRA 0.0.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| trialcebra-0.0.5.tar.gz | 3.1 MB | Without provenance | Details for trialcebra-0.0.5.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| trialcebra-0.0.5-py3-none-any.whl | Python 3 | none | any | Details for trialcebra-0.0.5-py3-none-any.whl |
Total release size: 3.1 MB
Release files / trialcebra-0.0.5.tar.gz
| Download URL | trialcebra-0.0.5.tar.gz |
|---|---|
| Size | 3.1 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3355e80853719a4db38c8948a9d17c3389752d0534d67bfeb1436a68366a9938
|
|
BLAKE2b-256 checksum How to use checksums |
9bc9ff493e646cc6a7faac0eb928a9accd2e7662c7030c2e1c4c46b9c5278265
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / trialcebra-0.0.5-py3-none-any.whl
| Download URL | trialcebra-0.0.5-py3-none-any.whl |
|---|---|
| Size | 33.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
39e34b5b46c4922cb188c0a12af9810b42dd5e1beb455b57498df1725ca6c030
|
|
BLAKE2b-256 checksum How to use checksums |
94cb6ac5aa2dc1d79bf85e18858002747084c260ec40748a6b2c506f268a948a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for TrialCEBRA 0.0.5
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.