iAODE for benchmarking and continuum modeling of single-cell chromatin accessibility.
The 31 matches · 7 of them tie a paragraph to a whole file, not to given lines: weak matches, whose lines are not tinted
- [1] § Methods › iAODE training strategy and dataset splitting ↔ api/static/_next/static/chunks/e59f297117d25863.js, the whole file · a weak match · score 0.89 · negative binomial, log transformed, random seed, TF IDF, reconstruction loss, NB
- [2] § Methods › iAODE training strategy and dataset splitting ↔ frontend/out/_next/static/chunks/3eec792fef995ed6.js, the whole file · a weak match · score 0.88 · negative binomial, log transformed, random seed, TF IDF, reconstruction loss, NB
- [3] § Results › iAODE framework and standardized multi-modal benchmark resources ↔ frontend/out/_next/static/chunks/1940ffdbe51fa4eb.js, the whole file · a weak match · score 0.82 · multi modal, single cell RNA, PyTorch, scRNA, Scanpy, Explorer
- [4] § Results › iAODE framework and standardized multi-modal benchmark resources ↔ api/static/_next/static/chunks/e59f297117d25863.js, the whole file · a weak match · score 0.82 · highly variable peak, TF IDF, model training, scRNA, algorithms, static
- [5] § Results › iAODE framework and standardized multi-modal benchmark resources ↔ frontend/out/_next/static/chunks/3eec792fef995ed6.js, the whole file · a weak match · score 0.82 · highly variable peak, TF IDF, model training, scRNA, algorithms, static
- [6] § Methods › Comprehensive evaluation of continuity, embedding quality, clustering, and coupling ↔ iaode/DRE.py, lines 56–82 · score 0.82 · pairwise distance matrices, Spearman correlation, global structural preservation, Distance correlation, low dimensions, spaces
- [7] § Methods › iAODE latent ODE-VAE architecture and irecon bottleneck design ↔ iaode/module.py, lines 226–324 · score 0.78 · softmax normalized, decoder network, accessibility measurements, nature, discrete, sparse
- [8] § Results › Robustness and deployability of iAODE across hyperparameters, encoder architectures, and computational cost ↔ iaode/agent.py, lines 16–108 · score 0.71 · KL divergence weight, MLP encoders, Encoder architecture, loss weight, Computational, scATAC
- [9] § Results › Multi-scale trajectory reconstruction and biological interpretability of latent dynamics ↔ iaode/datasets.py, lines 213–281 · score 0.67 · peripheral blood mononuclear, human PBMC, cell, iAODE, space
- [10] § Results › Robustness and deployability of iAODE across hyperparameters, encoder architectures, and computational cost ↔ iaode/model.py, lines 14–64 · score 0.66 · KL divergence weight, reconstruction weight, encoder architectures, computational, iAODE, Dimensionality
- [11] § Results › Cross-modal transferability of iAODE components in the scRNA-seq modality and clustering-coupling performance ↔ iaode/BEN.py, lines 87–156 · score 0.66 · Davies Bouldin, Calinski Harabasz, t-SNE, single cell, silhouette, intrinsic
- [12] § Methods › Comprehensive evaluation of continuity, embedding quality, clustering, and coupling ↔ iaode/DRE.py, lines 230–285 · score 0.65 · co ranking matrix, low dimension, high dimension, neighbor, global, quality
- [13] § Results › Continuum and clustering benchmarks against linear dimensionality reduction and manifold-learning methods ↔ iaode/BEN.py, lines 87–156 · score 0.65 · Davies Bouldin, Calinski Harabasz, t-SNE, silhouette, UMAP, ASW
- [14] § Results › Robustness and deployability of iAODE across hyperparameters, encoder architectures, and computational cost ↔ iaode/model.py, lines 14–64 · score 0.64 · KL divergence weight, Encoder architecture, loss weight, Computational, MLP, scATAC
- [15] § Methods › Baseline models and unified implementation of regularization terms ↔ iaode/agent.py, lines 16–108 · score 0.64 · MMD weight, InfoVAE, DIP, reproduce, KL, reconstruction
- [16] § Methods › iAODE latent ODE-VAE architecture and irecon bottleneck design ↔ iaode/agent.py, lines 391–509 · score 0.62 · Transition probabilities, transition matrices, velocity fields, iAODE, latent
- [17] § Results › Topological simulations and continuum metrics on real scATAC data, behavior and hyperparameter priors ↔ iaode/LSE.py, lines 349–416 · score 0.61 · Noise Resilience, core metrics, Spectral Decay, Participation Ratio, Manifold Dimensionality, Trajectory Directionality
- [18] § Methods › iAODE latent ODE-VAE architecture and irecon bottleneck design ↔ iaode/module.py, lines 380–417 · score 0.60 · compressed representation, reconstruction loss, latent space, ZINB, module, bottleneck
- [19] § Results › Multi-scale trajectory reconstruction and biological interpretability of latent dynamics ↔ iaode/datasets.py, lines 213–281 · score 0.59 · peripheral blood mononuclear, human PBMC, cells, iAODE, space
- [20] § Methods › Comprehensive evaluation of continuity, embedding quality, clustering, and coupling ↔ iaode/DRE.py, lines 230–285 · score 0.59 · co ranking, distance correlation, high dimensional, quality, metrics
- [21] § Methods › iAODE latent ODE-VAE architecture and irecon bottleneck design ↔ examples/trajectory_inference_atac.py, lines 1–34 · score 0.58 · chromatin accessibility, velocity field, Neural ODE, scATAC, seq, iAODE
- [22] § Methods › Comprehensive evaluation of continuity, embedding quality, clustering, and coupling ↔ iaode/mixin.py, lines 311–359 · score 0.56 · normalized mutual, ARI, NMI, latent space, DAV, ASW
- [23] § Methods › iAODE latent ODE-VAE architecture and irecon bottleneck design ↔ iaode/module.py, lines 226–324 · score 0.56 · dispersion parameters, reconstruction loss, dropouts, scATAC, ZINB, peak
- [24] § Results › Component synergy and ablations in multi-scale scATAC data ↔ iaode/LSE.py, lines 418–485 · score 0.55 · Noise Resilience, Spectral Decay, Participation Ratio, Manifold Dimensionality, Trajectory Directionality, Anisotropy
- [25] § Methods › iAODE software and visualization ecosystem for training, data browsing, and continuum exploration ↔ api/static/_next/static/chunks/702abde7a71e95b7.js, the whole file · a weak match · score 0.55 · PyTorch, management, web, hosted, Pages, static
- [26] § Results › Continuum and clustering benchmarks against linear dimensionality reduction and manifold-learning methods ↔ iaode/mixin.py, lines 311–359 · score 0.55 · Davies Bouldin, Calinski Harabasz, silhouette, ASW, correlation, scores
- [27] § Results › Cross-modal transferability of iAODE components in the scRNA-seq modality and clustering-coupling performance ↔ iaode/LSE.py, lines 349–416 · score 0.54 · Noise Resilience, Spectral Decay, Participation Ratio, Manifold Dimensionality, Trajectory Directionality, Anisotropy
- [28] § Methods › Comprehensive evaluation of continuity, embedding quality, clustering, and coupling ↔ iaode/LSE.py, lines 418–485 · score 0.54 · developmental axis, noise resilience, Trajectory directionality, dominance, ratio, quality
- [29] § Methods › iAODE latent ODE-VAE architecture and irecon bottleneck design ↔ iaode/module.py, lines 327–377 · score 0.54 · chromatin accessibility, Neural ODE, latent space, scATAC, temporal, dynamics
- [30] § Methods › iAODE software and visualization ecosystem for training, data browsing, and continuum exploration ↔ frontend/out/_next/static/chunks/1940ffdbe51fa4eb.js, the whole file · a weak match · score 0.52 · PyTorch, web, hosted, Pages, static, iAODE
- [31] § Results › Robustness and deployability of iAODE across hyperparameters, encoder architectures, and computational cost ↔ iaode/BEN.py, lines 159–197 · score 0.51 · GPU memories, scVI, PoissonVI, PeakVI, architecture, epoch
Paper
Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC
The paper is loaded when this pane is shown.
The authors' code
Python · 586 lines · 19 KB · MIT · 4 matches
- # module.py
- import torch
- import torch.nn as nn
- import torch.nn.functional as F
- from torch.distributions import Normal
- from typing import Tuple, Union, Literal, Optional
- from .mixin import NODEMixin
- class Encoder(nn.Module):
- """
- Variational encoder mapping input states to latent distributions.
- Supports multiple encoder architectures:
- - 'mlp': Two-layer fully connected network (default)
- - 'mlp_residual': Multi-layer residual MLP
- - 'linear': Single-layer linear encoding
- - 'transformer': TransformerEncoder as feature extraction backbone
- Parameters
- ----------
- state_dim : int
- Dimension of input state (number of peaks for scATAC-seq)
- hidden_dim : int
- Dimension of hidden layers
- action_dim : int
- Dimension of latent space
- use_ode : bool, default=False
- Whether to use ODE for trajectory inference
- encoder_type : {'mlp', 'mlp_residual', 'linear', 'transformer'}, default='mlp'
- Type of encoder architecture
- encoder_num_layers : int, default=2
- Number of encoder layers
- encoder_n_heads : int, default=4
- Number of attention heads (for transformer only)
- encoder_d_model : int, optional
- Model dimension for transformer (defaults to hidden_dim if None)
- Input Shape
- -----------
- x : torch.Tensor
- (batch_size, state_dim) or (state_dim,)
- Single cells automatically expand to batch_size=1
- Output Shape
- ------------
- q_z : torch.Tensor
- Sampled latent vector (batch_size, action_dim)
- q_m : torch.Tensor
- Mean of latent distribution (batch_size, action_dim)
- q_s : torch.Tensor
- Log-variance of latent distribution (batch_size, action_dim)
- t : torch.Tensor, optional
- Inferred pseudotime (batch_size,), only when use_ode=True
- """
- def __init__(
- self,
- state_dim: int,
- hidden_dim: int,
- action_dim: int,
- use_ode: bool = False,
- encoder_type: Literal["mlp", "mlp_residual", "linear", "transformer"] = "mlp",
- encoder_num_layers: int = 2,
- encoder_n_heads: int = 4,
- encoder_d_model: Optional[int] = None,
- ):
- super().__init__()
- self.use_ode = use_ode
- self.encoder_type = encoder_type
- # Build encoder backbone
- if encoder_type == "mlp":
- layers: list[nn.Module] = []
- in_dim = state_dim
- for _ in range(encoder_num_layers):
- layers.append(nn.Linear(in_dim, hidden_dim))
- layers.append(nn.ReLU())
- in_dim = hidden_dim
- self.base_network = nn.Sequential(*layers)
- self.out_dim = hidden_dim
- elif encoder_type == "mlp_residual":
- self.input_proj = nn.Linear(state_dim, hidden_dim)
- blocks = []
- for _ in range(encoder_num_layers):
- blocks.append(
- nn.Sequential(
- nn.Linear(hidden_dim, hidden_dim),
- nn.ReLU(),
- )
- )
- self.res_blocks = nn.ModuleList(blocks)
- self.out_dim = hidden_dim
- elif encoder_type == "linear":
- self.base_network = nn.Sequential(
- nn.Linear(state_dim, hidden_dim),
- nn.ReLU(),
- )
- self.out_dim = hidden_dim
- elif encoder_type == "transformer":
- if encoder_d_model is None:
- encoder_d_model = hidden_dim
- self.d_model = encoder_d_model
- self.input_proj = nn.Linear(state_dim, encoder_d_model)
- encoder_layer = nn.TransformerEncoderLayer(
- d_model=encoder_d_model,
- nhead=encoder_n_heads,
- dim_feedforward=hidden_dim * 4,
- batch_first=True,
- )
- self.transformer = nn.TransformerEncoder(
- encoder_layer, num_layers=encoder_num_layers
- )
- self.pool = nn.AdaptiveAvgPool1d(1)
- self.out_dim = encoder_d_model
- else:
- raise ValueError(f"Unknown encoder_type: {encoder_type}")
- # Latent distribution parameters
- self.latent_params = nn.Linear(self.out_dim, action_dim * 2)
- # Pseudotime inference head (ODE mode)
- if use_ode:
- self.time_encoder = nn.Sequential(
- nn.Linear(self.out_dim, 1),
- nn.Sigmoid(),
- )
- self.apply(self._init_weights)
- @staticmethod
- def _init_weights(m: nn.Module) -> None:
- """Initialize network weights using Xavier initialization"""
- if isinstance(m, nn.Linear):
- nn.init.xavier_normal_(m.weight)
- nn.init.constant_(m.bias, 0.01)
- def _encode_features(self, x: torch.Tensor) -> torch.Tensor:
- """
- Encode input to hidden representation.
- Parameters
- ----------
- x : torch.Tensor
- Input tensor (batch_size, state_dim)
- Returns
- -------
- hidden : torch.Tensor
- Encoded features (batch_size, out_dim)
- """
- # Ensure batch dimension exists
- if x.dim() == 1:
- x = x.unsqueeze(0)
- if self.encoder_type in ["mlp", "linear"]:
- hidden = self.base_network(x)
- elif self.encoder_type == "mlp_residual":
- h = self.input_proj(x)
- for block in self.res_blocks:
- h = h + block(h) # Residual connection
- hidden = h
- elif self.encoder_type == "transformer":
- # Add sequence dimension: (batch, state_dim) -> (batch, 1, state_dim)
- if x.dim() == 2:
- x = x.unsqueeze(1)
- x_emb = self.input_proj(x) # (batch, seq_len, d_model)
- h = self.transformer(x_emb) # (batch, seq_len, d_model)
- # Pool over sequence dimension
- h = h.transpose(1, 2) # (batch, d_model, seq_len)
- hidden = self.pool(h).squeeze(-1) # (batch, d_model)
- else:
- raise RuntimeError("Unsupported encoder_type")
- return hidden
- def forward(
- self, x: torch.Tensor
- ) -> Union[
- Tuple[torch.Tensor, torch.Tensor, torch.Tensor],
- Tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor],
- ]:
- """
- Forward pass through encoder.
- Returns
- -------
- q_z : torch.Tensor
- Sampled latent vector
- q_m : torch.Tensor
- Latent mean
- q_s : torch.Tensor
- Latent log-variance
- t : torch.Tensor, optional
- Inferred pseudotime (only when use_ode=True)
- """
- # Extract features
- hidden = self._encode_features(x)
- # Compute latent distribution parameters
- latent_output = self.latent_params(hidden)
- q_m, q_s = torch.split(latent_output, latent_output.size(-1) // 2, dim=-1)
- # Reparameterization trick
- std = F.softplus(q_s) + 1e-6
- dist = Normal(q_m, std)
- q_z = dist.rsample()
- # Infer pseudotime (ODE mode)
- if self.use_ode:
- t = self.time_encoder(hidden).squeeze(-1)
- return q_z, q_m, q_s, t
- return q_z, q_m, q_s
- class Decoder(nn.Module):
- """
- Decoder network mapping latent vectors back to input space.
- Supports three loss modes tailored for scATAC-seq data:
- - 'mse': Mean squared error for continuous data
- - 'nb': Negative binomial for count data (recommended)
- - 'zinb': Zero-inflated negative binomial for sparse count data
- Parameters
- ----------
- state_dim : int
- Dimension of input space (number of peaks)
- hidden_dim : int
- Dimension of hidden layers
- action_dim : int
- Dimension of latent space
- loss_mode : {'mse', 'nb', 'zinb'}, default='nb'
- Type of reconstruction loss
- Notes
- -----
- For scATAC-seq data, 'nb' or 'zinb' is recommended due to the discrete,
- count-based nature of chromatin accessibility measurements.
- """
- def __init__(
- self,
- state_dim: int,
- hidden_dim: int,
- action_dim: int,
- loss_mode: Literal["mse", "nb", "zinb"] = "nb",
- ):
- super().__init__()
- self.loss_mode = loss_mode
- # Shared base network
- self.base_network = nn.Sequential(
- nn.Linear(action_dim, hidden_dim),
- nn.ReLU(),
- nn.Linear(hidden_dim, hidden_dim),
- nn.ReLU(),
- )
- # Configure output heads based on loss mode
- if loss_mode in ["nb", "zinb"]:
- # Negative binomial: dispersion parameter
- self.disp = nn.Parameter(torch.randn(state_dim))
- # Mean parameter with Softmax normalization
- mean_decoder_seq: nn.Module = nn.Sequential(
- nn.Linear(hidden_dim, state_dim),
- nn.Softmax(dim=-1)
- )
- self.mean_decoder = mean_decoder_seq
- else: # 'mse' mode
- self.mean_decoder = nn.Linear(hidden_dim, state_dim)
- # Zero-inflation parameter (ZINB only)
- if loss_mode == "zinb":
- self.dropout_decoder = nn.Linear(hidden_dim, state_dim)
- self.apply(self._init_weights)
- @staticmethod
- def _init_weights(m: nn.Module) -> None:
- """Initialize network weights"""
- if isinstance(m, nn.Linear):
- nn.init.xavier_normal_(m.weight)
- nn.init.constant_(m.bias, 0.01)
- def forward(self, x: torch.Tensor):
- """
- Forward pass through decoder.
- Parameters
- ----------
- x : torch.Tensor
- Latent vector (batch_size, action_dim)
- Returns
- -------
- For 'mse' and 'nb' modes:
- mean : torch.Tensor
- Reconstructed output (batch_size, state_dim)
- For 'zinb' mode:
- mean : torch.Tensor
- Reconstructed mean (batch_size, state_dim)
- dropout_logits : torch.Tensor
- Zero-inflation logits (batch_size, state_dim)
- """
- hidden = self.base_network(x)
- mean = self.mean_decoder(hidden)
- if self.loss_mode == "zinb":
- dropout_logits = self.dropout_decoder(hidden)
- return mean, dropout_logits
- return mean
- class LatentODEfunc(nn.Module):
- """
- Neural ODE function for latent dynamics modeling.
- Models continuous temporal dynamics in latent space for trajectory inference
- in single-cell data. The ODE function dx/dt = f(x, t) is parameterized by
- a two-layer neural network.
- Parameters
- ----------
- n_latent : int, default=10
- Dimension of latent space
- n_hidden : int, default=25
- Dimension of hidden layer
- Notes
- -----
- Used for pseudotime inference in scATAC-seq data, enabling continuous
- trajectory modeling of chromatin accessibility dynamics.
- """
- def __init__(
- self,
- n_latent: int = 10,
- n_hidden: int = 25,
- ):
- super().__init__()
- self.elu = nn.ELU()
- self.fc1 = nn.Linear(n_latent, n_hidden)
- self.fc2 = nn.Linear(n_hidden, n_latent)
- def forward(self, t: torch.Tensor, x: torch.Tensor) -> torch.Tensor:
- """
- Compute latent dynamics gradient.
- Parameters
- ----------
- t : torch.Tensor
- Time point
- x : torch.Tensor
- Latent state
- Returns
- -------
- dx_dt : torch.Tensor
- Temporal gradient in latent space
- """
- out = self.fc1(x)
- out = self.elu(out)
- out = self.fc2(out)
- return out
- class iVAE(nn.Module, NODEMixin):
- """
- Interpretable Variational Autoencoder (iVAE) with interpretable bottleneck.
- Core architecture for iAODE (interpretable Accessibility ODE VAE), designed
- for scATAC-seq data analysis. Combines VAE with information bottleneck for
- interpretable latent representations.
- Parameters
- ----------
- state_dim : int
- Dimension of input state (number of peaks)
- hidden_dim : int
- Dimension of hidden layers
- action_dim : int
- Dimension of latent space (full)
- i_dim : int
- Dimension of interpretable bottleneck
- use_ode : bool
- Whether to use Neural ODE for trajectory inference
- loss_mode : {'mse', 'nb', 'zinb'}, default='nb'
- Reconstruction loss type
- encoder_type : {'mlp', 'mlp_residual', 'linear', 'transformer'}, default='mlp'
- Encoder architecture
- encoder_num_layers : int, default=2
- Number of encoder layers
- encoder_n_heads : int, default=4
- Number of attention heads (transformer only)
- encoder_d_model : int, optional
- Transformer model dimension
- device : torch.device
- Device for computation
- Notes
- -----
- The interpretable bottleneck (i_dim) provides a compressed representation
- that balances reconstruction quality with biological interpretability.
- """
- def __init__(
- self,
- state_dim: int,
- hidden_dim: int,
- action_dim: int,
- i_dim: int,
- use_ode: bool,
- loss_mode: Literal["mse", "nb", "zinb"] = "nb",
- encoder_type: Literal["mlp", "mlp_residual", "linear", "transformer"] = "mlp",
- encoder_num_layers: int = 2,
- encoder_n_heads: int = 4,
- encoder_d_model: Optional[int] = None,
- device=torch.device("cuda")
- if torch.cuda.is_available()
- else torch.device("cpu"),
- ):
- super().__init__()
- # Initialize encoder
- self.encoder = Encoder(
- state_dim=state_dim,
- hidden_dim=hidden_dim,
- action_dim=action_dim,
- use_ode=use_ode,
- encoder_type=encoder_type,
- encoder_num_layers=encoder_num_layers,
- encoder_n_heads=encoder_n_heads,
- encoder_d_model=encoder_d_model,
- ).to(device)
- # Initialize decoder
- self.decoder = Decoder(state_dim, hidden_dim, action_dim, loss_mode).to(device)
- # Initialize ODE solver
- if use_ode:
- self.ode_solver = LatentODEfunc(action_dim)
- # Interpretable bottleneck layers
- self.latent_encoder = nn.Linear(action_dim, i_dim).to(device)
- self.latent_decoder = nn.Linear(i_dim, action_dim).to(device)
- def forward(self, x_log: torch.Tensor, x_raw: torch.Tensor = None) -> Tuple[torch.Tensor, ...]:
- """
- Forward pass through VAE.
- Parameters
- ----------
- x_log : torch.Tensor
- Log-transformed input tensor (batch_size, state_dim) for encoder stability
- x_raw : torch.Tensor, optional
- Raw count tensor (batch_size, state_dim) for NB/ZINB loss calculation.
- If None, uses x_log (for MSE mode or backward compatibility)
- Returns
- -------
- Tuple containing:
- q_z : torch.Tensor
- Sampled latent vector
- q_m : torch.Tensor
- Latent mean
- q_s : torch.Tensor
- Latent log-variance
- x_raw : torch.Tensor
- Raw counts for loss calculation
- pred_x : torch.Tensor
- Reconstructed input (direct path)
- le : torch.Tensor
- Encoded bottleneck representation
- pred_xl : torch.Tensor
- Reconstructed input (bottleneck path)
- Additional returns for ODE mode:
- q_z_ode : torch.Tensor
- ODE-evolved latent
- pred_x_ode : torch.Tensor
- ODE reconstruction
- Additional returns for ZINB mode:
- dropout_logits : torch.Tensor
- Zero-inflation parameters
- """
- # Use x_log for backward compatibility if x_raw not provided
- if x_raw is None:
- x_raw = x_log
- # Encode using log-transformed data for stability
- if self.encoder.use_ode:
- q_z, q_m, q_s, t = self.encoder(x_log)
- # Sort by pseudotime
- idxs = torch.argsort(t)
- t = t[idxs]
- q_z = q_z[idxs]
- q_m = q_m[idxs]
- q_s = q_s[idxs]
- x_raw = x_raw[idxs] # Sort raw counts to match
- # Remove duplicate time points
- unique_mask = torch.ones_like(t, dtype=torch.bool)
- unique_mask[1:] = t[1:] != t[:-1]
- t = t[unique_mask]
- q_z = q_z[unique_mask]
- q_m = q_m[unique_mask]
- q_s = q_s[unique_mask]
- x_raw = x_raw[unique_mask] # Apply mask to raw counts
- # Solve ODE from initial state
- z0 = q_z[0]
- q_z_ode = self.solve_ode(self.ode_solver, z0, t)
- # Information bottleneck paths
- le = self.latent_encoder(q_z)
- ld = self.latent_decoder(le)
- le_ode = self.latent_encoder(q_z_ode)
- ld_ode = self.latent_decoder(le_ode)
- # Decode
- if self.decoder.loss_mode == "zinb":
- pred_x, dropout_logits = self.decoder(q_z)
- pred_xl, dropout_logitsl = self.decoder(ld)
- pred_x_ode, dropout_logits_ode = self.decoder(q_z_ode)
- pred_xl_ode, dropout_logitsl_ode = self.decoder(ld_ode)
- return (
- q_z, q_m, q_s, x_raw, # Return raw counts for loss
- pred_x, dropout_logits,
- le, le_ode,
- pred_xl, dropout_logitsl,
- q_z_ode,
- pred_x_ode, dropout_logits_ode,
- pred_xl_ode, dropout_logitsl_ode,
- )
- else:
- pred_x = self.decoder(q_z)
- pred_xl = self.decoder(ld)
- pred_x_ode = self.decoder(q_z_ode)
- pred_xl_ode = self.decoder(ld_ode)
- return (
- q_z, q_m, q_s, x_raw, # Return raw counts for loss
- pred_x,
- le, le_ode,
- pred_xl,
- q_z_ode,
- pred_x_ode,
- pred_xl_ode,
- )
- else:
- q_z, q_m, q_s = self.encoder(x_log) # Encode log-transformed
- # Information bottleneck
- le = self.latent_encoder(q_z)
- ld = self.latent_decoder(le)
- # Decode
- if self.decoder.loss_mode == "zinb":
- pred_x, dropout_logits = self.decoder(q_z)
- pred_xl, dropout_logitsl = self.decoder(ld)
- return (
- q_z, q_m, q_s, x_raw, # Return raw counts for loss
- pred_x, dropout_logits,
- le,
- pred_xl, dropout_logitsl,
- )
- else:
- pred_x = self.decoder(q_z)
- pred_xl = self.decoder(ld)
- return (q_z, q_m, q_s, x_raw, pred_x, le, pred_xl) # Return raw counts for loss
module.py at commit c4fe36c, under MIT · at the source
Overview
- State Key Laboratory of Trauma and Chemical Poisoning, Institute of Combined Injury, Chongqing Engineering Research Center for Nanomedicine, College of Preventive Medicine, Army Medical University,Chongqing, China
- Department of Rehabilitation Medicine, The First Affiliated Hospital, Sun Yat-sen University,Guangzhou, China
Abstract
The abstract is not reproduced here: the paper's license (CC BY-NC-ND) does not allow it. Read it in the paper, at the publisher or on Europe PMC.
Repositories
Its files are read in the Code ↔ Paper reader above, with 31 matches between paragraphs and lines of code.
PeterPonyu/iAODE
c4fe36c079cc07895c653248076ae10ef1ec67eb, 2 September 2026Availability: 1 check, the latest on 30 September 2026: the link answers
- 30 September 2026: the link answers
86 files
- api/
__init__.py , Python, 1 line - api/
main.py , Python, 376 lines - api/
model.py , Python, 86 lines - api/
run_server.py , Python, 48 lines - api/
static/ , JavaScript, 1 line_next/ static/ chunks/ 0eb31a65052e5cd1.js - api/
static/ , JavaScript, 1 line_next/ static/ chunks/ 17722e3ac4e00587.js - api/
static/ , JavaScript, 1 line_next/ static/ chunks/ 2af9fca721db194b.js - api/
static/ , JavaScript, 1 line_next/ static/ chunks/ 30cb146bc1e6f45f.js - api/
static/ , JavaScript, 5 lines_next/ static/ chunks/ 371397db24b7d416.js - api/
static/ , JavaScript, 1 line_next/ static/ chunks/ 538cc02e54714b23.js - api/
static/ , JavaScript, 1 line_next/ static/ chunks/ 6420740671896b80.js - api/
static/ , JavaScript, 1 line, 1 match_next/ static/ chunks/ 702abde7a71e95b7.js - api/
static/ , JavaScript, 1 line_next/ static/ chunks/ 7dd66bdf8a7e5707.js - api/
static/ , JavaScript, 1 line_next/ static/ chunks/ 9ea5322c0c7643ae.js - api/
static/ , JavaScript, 1 line_next/ static/ chunks/ a6dad97d9634a72d.js - api/
static/ , JavaScript, 1 line_next/ static/ chunks/ bd2dcf98c9b362f6.js - api/
static/ , JavaScript, 5 lines_next/ static/ chunks/ d413b02c5744d4b5.js - api/
static/ , JavaScript, 1 line, 2 matches_next/ static/ chunks/ e59f297117d25863.js - api/
static/ , JavaScript, 1 line_next/ static/ chunks/ e60ef129113f6e24.js - api/
static/ , JavaScript, 1 line_next/ static/ chunks/ f80a712cac7d075b.js - api/
static/ , JavaScript, 1 line_next/ static/ chunks/ ff1a16fafef87110.js - api/
static/ , JavaScript, 3 lines_next/ static/ chunks/ turbopack-2140c654bfda73 6c.js - api/
static/ , JavaScript, 3 lines_next/ static/ chunks/ turbopack-21bc7c7bbf8a36 ed.js - api/
static/ , JavaScript, 3 lines_next/ static/ chunks/ turbopack-f6417e45629d90 9c.js - api/
static/ , JavaScript, 14 lines_next/ static/ h-icIwnaY2w5_1j1ev-Vu/ _buildManifest.js - api/
static/ , JavaScript, 1 line_next/ static/ h-icIwnaY2w5_1j1ev-Vu/ _ssgManifest.js - examples/
_example_utils.py , Python, 109 lines - examples/
atacseq_annotation.py , Python, 477 lines - examples/
basic_usage.py , Python, 323 lines - examples/
model_evaluation_atac.py , Python, 647 lines - examples/
model_evaluation_rna.py , Python, 557 lines - examples/
trajectory_inference_ata , Python, 481 lines, 1 matchc.py - examples/
trajectory_inference_rna , Python, 476 lines.py - frontend/
next-env.d.ts , TypeScript, 6 lines - frontend/
next.config.ts , TypeScript, 7 lines - frontend/
out/ , JavaScript, 1 line_next/ static/ chunks/ 17722e3ac4e00587.js - frontend/
out/ , JavaScript, 1 line, 2 matches_next/ static/ chunks/ 1940ffdbe51fa4eb.js - frontend/
out/ , JavaScript, 1 line_next/ static/ chunks/ 2af9fca721db194b.js - frontend/
out/ , JavaScript, 1 line_next/ static/ chunks/ 30cb146bc1e6f45f.js - frontend/
out/ , JavaScript, 1 line, 2 matches_next/ static/ chunks/ 3eec792fef995ed6.js - frontend/
out/ , JavaScript, 5 lines_next/ static/ chunks/ 4e70e58dbc5ad9f7.js - frontend/
out/ , JavaScript, 1 line_next/ static/ chunks/ 538cc02e54714b23.js - frontend/
out/ , JavaScript, 1 line_next/ static/ chunks/ 6420740671896b80.js - frontend/
out/ , JavaScript, 1 line_next/ static/ chunks/ 7dd66bdf8a7e5707.js - frontend/
out/ , JavaScript, 1 line_next/ static/ chunks/ 8082ab48faca5ea1.js - frontend/
out/ , JavaScript, 1 line_next/ static/ chunks/ a6dad97d9634a72d.js - frontend/
out/ , JavaScript, 1 line_next/ static/ chunks/ a7f431a8f15875a6.js - frontend/
out/ , JavaScript, 5 lines_next/ static/ chunks/ b6ba4d54482d6d59.js - frontend/
out/ , JavaScript, 1 line_next/ static/ chunks/ bd2dcf98c9b362f6.js - frontend/
out/ , JavaScript, 1 line_next/ static/ chunks/ e60ef129113f6e24.js - frontend/
out/ , JavaScript, 1 line_next/ static/ chunks/ f80a712cac7d075b.js - frontend/
out/ , JavaScript, 1 line_next/ static/ chunks/ ff1a16fafef87110.js - frontend/
out/ , JavaScript, 3 lines_next/ static/ chunks/ turbopack-8282e6c9626b9b c7.js - frontend/
out/ , JavaScript, 3 lines_next/ static/ chunks/ turbopack-cd2c7c0276ab7f ac.js - frontend/
out/ , JavaScript, 3 lines_next/ static/ chunks/ turbopack-f49393c94fc21b ff.js - frontend/
out/ , JavaScript, 14 lines_next/ static/ vJoI8SvYiLAsO6b59B71n/ _buildManifest.js - frontend/
out/ , JavaScript, 1 line_next/ static/ vJoI8SvYiLAsO6b59B71n/ _ssgManifest.js - frontend/
src/ , TypeScript, 204 lineslib/ api.ts - frontend/
src/ , TypeScript, 91 lineslib/ types.ts - generate_test_data.py, Python, 203 lines
- iaode/
BEN.py , Python, 434 lines, 3 matches - iaode/
DRE.py , Python, 429 lines, 3 matches - iaode/
LSE.py , Python, 634 lines, 4 matches - iaode/
__init__.py , Python, 104 lines - iaode/
agent.py , Python, 882 lines, 3 matches - iaode/
annotation.py , Python, 592 lines - iaode/
datasets.py , Python, 329 lines, 2 matches - iaode/
environment.py , Python, 310 lines - iaode/
mixin.py , Python, 359 lines, 2 matches - iaode/
model.py , Python, 518 lines, 2 matches - iaode/
module.py , Python, 586 lines, 4 matches - iaode/
utils.py , Python, 406 lines - notebooks/
01_basic_usage.ipynb , Jupyter, 330 lines - notebooks/
02_atacseq_annotation.ip , Jupyter, 485 linesynb - notebooks/
03_trajectory_inference_ , Jupyter, 484 linesrna.ipynb - notebooks/
04_trajectory_inference_ , Jupyter, 489 linesatac.ipynb - notebooks/
05_model_evaluation_rna. , Jupyter, 565 linesipynb - notebooks/
06_model_evaluation_atac , Jupyter, 655 lines.ipynb - scripts/
check_pages_metadata.py , Python, 44 lines - setup.py, Python, 18 lines
- start_training_ui.py, Python, 148 lines
- start_training_ui.sh, Shell, 67 lines
- tests/
test_pages_metadata.py , Python, 11 lines - tests/
test_smoke.py , Python, 21 lines - LICENSE, License, 21 lines
- README.md, Text, 650 lines
Zenodo 18453104
Availability: 1 check, the latest on 30 September 2026: the link answers (HTTP 200)
- 30 September 2026: the link answers (HTTP 200)
56 files
- api/
__init__.py , Python, 1 line - api/
main.py , Python, 378 lines - api/
model.py , Python, 86 lines - api/
run_server.py , Python, 48 lines - api/
static/ , JavaScript, 1 line_next/ static/ chunks/ 0eb31a65052e5cd1.js - api/
static/ , JavaScript, 1 line_next/ static/ chunks/ 17722e3ac4e00587.js - api/
static/ , JavaScript, 1 line_next/ static/ chunks/ 2af9fca721db194b.js - api/
static/ , JavaScript, 1 line_next/ static/ chunks/ 30cb146bc1e6f45f.js - api/
static/ , JavaScript, 5 lines_next/ static/ chunks/ 371397db24b7d416.js - api/
static/ , JavaScript, 1 line_next/ static/ chunks/ 538cc02e54714b23.js - api/
static/ , JavaScript, 1 line_next/ static/ chunks/ 6420740671896b80.js - api/
static/ , JavaScript, 1 line_next/ static/ chunks/ 702abde7a71e95b7.js - api/
static/ , JavaScript, 1 line_next/ static/ chunks/ 7dd66bdf8a7e5707.js - api/
static/ , JavaScript, 1 line_next/ static/ chunks/ 9ea5322c0c7643ae.js - api/
static/ , JavaScript, 1 line_next/ static/ chunks/ a6dad97d9634a72d.js - api/
static/ , JavaScript, 1 line_next/ static/ chunks/ bd2dcf98c9b362f6.js - api/
static/ , JavaScript, 5 lines_next/ static/ chunks/ d413b02c5744d4b5.js - api/
static/ , JavaScript, 1 line_next/ static/ chunks/ e59f297117d25863.js - api/
static/ , JavaScript, 1 line_next/ static/ chunks/ e60ef129113f6e24.js - api/
static/ , JavaScript, 1 line_next/ static/ chunks/ f80a712cac7d075b.js - api/
static/ , JavaScript, 1 line_next/ static/ chunks/ ff1a16fafef87110.js - api/
static/ , JavaScript, 3 lines_next/ static/ chunks/ turbopack-2140c654bfda73 6c.js - api/
static/ , JavaScript, 3 lines_next/ static/ chunks/ turbopack-21bc7c7bbf8a36 ed.js - api/
static/ , JavaScript, 3 lines_next/ static/ chunks/ turbopack-f6417e45629d90 9c.js - api/
static/ , JavaScript, 14 lines_next/ static/ h-icIwnaY2w5_1j1ev-Vu/ _buildManifest.js - api/
static/ , JavaScript, 1 line_next/ static/ h-icIwnaY2w5_1j1ev-Vu/ _ssgManifest.js - examples/
_example_utils.py , Python, 109 lines - examples/
atacseq_annotation.py , Python, 477 lines - examples/
basic_usage.py , Python, 323 lines - examples/
model_evaluation_atac.py , Python, 647 lines - examples/
model_evaluation_rna.py , Python, 557 lines - examples/
trajectory_inference_ata , Python, 481 linesc.py - examples/
trajectory_inference_rna , Python, 476 lines.py - generate_test_data.py, Python, 203 lines
- iaode/
BEN.py , Python, 434 lines - iaode/
DRE.py , Python, 429 lines - iaode/
LSE.py , Python, 634 lines - iaode/
__init__.py , Python, 104 lines - iaode/
agent.py , Python, 882 lines - iaode/
annotation.py , Python, 592 lines - iaode/
datasets.py , Python, 294 lines - iaode/
environment.py , Python, 310 lines - iaode/
mixin.py , Python, 359 lines - iaode/
model.py , Python, 518 lines - iaode/
module.py , Python, 586 lines - iaode/
utils.py , Python, 406 lines - notebooks/
01_basic_usage.ipynb , Jupyter, 330 lines - notebooks/
02_atacseq_annotation.ip , Jupyter, 485 linesynb - notebooks/
03_trajectory_inference_ , Jupyter, 484 linesrna.ipynb - notebooks/
04_trajectory_inference_ , Jupyter, 489 linesatac.ipynb - notebooks/
05_model_evaluation_rna. , Jupyter, 565 linesipynb - notebooks/
06_model_evaluation_atac , Jupyter, 655 lines.ipynb - setup.py, Python, 18 lines
- tests/
test_smoke.py , Python, 21 lines - LICENSE, License, 21 lines
- README.md, Text, 610 lines
figshare 31225099
Availability: 1 check, the latest on 30 September 2026: the link answers (HTTP 200)
- 30 September 2026: the link answers (HTTP 200)
Code availability statement
The paper has a code availability statement. Its license (CC BY-NC-ND) does not allow reproducing it here; in short, from what the harvester recognized in it:
- it points to the authors' code: PeterPonyu/
iAODE
Read it in the paper: doi.org/10.1038/s42003-026-09768-8.
Tracing map
Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.
What the map holds:
- 3 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 138 scripts, each with its path and the digest of its content;
- 31 matches between paragraphs of the paper and lines of the code (method lexical-v1);
- neither the text of the paper nor the code itself.
Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.
Data
Datasets cited
- peterponyu.github.io/
iaode , at peterponyu.github.io; found in the text, “iAODE software and visualization ecosystem for…”
Data availability statement
The paper has a data availability statement. Its license (CC BY-NC-ND) does not allow reproducing it here; in short, from what the harvester recognized in it:
- no repository, dataset or request procedure was recognized in it
Read it in the paper: doi.org/10.1038/s42003-026-09768-8.
Versions
The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.
Version 1, 30 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 5 authors, 2 keywords, 6 MeSH terms, 1 funder, 43 references.
Cite
This paper
Fu, Z., Chen, C., Wang, S., Wang, J., & Chen, S. (2026). iAODE for benchmarking and continuum modeling of single-cell chromatin accessibility. Communications biology, 9(1), 507. https://
BibTeX
@article{fu2026iaode,
author = {Fu, Zeyu and Chen, Chunlin and Wang, Song and Wang, Junping and Chen, Shilei},
title = {{iAODE for benchmarking and continuum modeling of single-cell chromatin accessibility}},
journal = {Communications biology},
year = {2026},
month = mar,
volume = {9},
number = {1},
pages = {507},
publisher = {Nature Publishing Group},
issn = {2399-3642},
doi = {10.1038/
url = {https://
pmid = {41775921},
pmcid = {PMC13066597}
}
RIS
TY - JOUR
AU - Fu, Zeyu
AU - Chen, Chunlin
AU - Wang, Song
AU - Wang, Junping
AU - Chen, Shilei
TI - iAODE for benchmarking and continuum modeling of single-cell chromatin accessibility
T2 - Communications biology
J2 - Commun Biol
PY - 2026
DA - 2026/
VL - 9
IS - 1
SP - 507
SN - 2399-3642
PB - Nature Publishing Group
DO - 10.1038/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1038/
"type": "article-journal",
"title": "iAODE for benchmarking and continuum modeling of single-cell chromatin accessibility",
"container-title": "Communications biology",
"author": [
{
"family": "Fu",
"given": "Zeyu"
},
{
"family": "Chen",
"given": "Chunlin"
},
{
"family": "Wang",
"given": "Song"
},
{
"family": "Wang",
"given": "Junping"
},
{
"family": "Chen",
"given": "Shilei"
}
],
"container-title-short":
"volume": "9",
"issue": "1",
"page": "507",
"DOI": "10.1038/
"PMID": "41775921",
"PMCID": "PMC13066597",
"ISSN": "2399-3642",
"publisher": "Nature Publishing Group",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
3,
3
]
]
}
}
The tracing map gets a citation of its own once an author has validated it and it has a DOI.
Similar papers
The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.
- [1] doi:10.1038/s42003-026-10462-y [code]
- SpaDC enables sequence-based integrative analysis and regulatory inference of spatial chromatin accessibility data.Journal: Communications biologyIn common: anndata, Scanpy, PyTorch, 5 other tools, genetics / omics, 5 references
- [2] doi:10.1038/s41467-026-73171-4 [code]
- Dissecting epigenetic heterogeneity in single-cell DNA methylomes with a unified framework.Journal: Nature communicationsIn common: anndata, Scanpy, PyTorch, 5 other tools, genetics / omics, 2 references
- [3] doi:10.1016/j.xgen.2026.101217 [code]
- ProtoCloud: A prototypical self-explaining model for single-cell analysis.Journal: Cell genomicsIn common: anndata, Scanpy, PyTorch, 5 other tools, genetics / omics, 2 references
- [4] doi:10.1038/s41467-026-71803-3 [code]
- Charting the transition from in vitro gliogenesis to the in vivo maturation of human glial progenitor cells transplanted into the hypomyelinated mouse brain.Journal: Nature communicationsIn common: anndata, Scanpy, PyTorch, 5 other tools, genetics / omics, 2 references
- [5] doi:10.1371/journal.pcbi.1014346 [code]
- StPedf: Cell trajectory inference of spatial transcriptomics via spatial proximity embedding and spatial density-adaptive fusion.Journal: PLoS computational biologyIn common: anndata, Scanpy, PyTorch, 5 other tools, genetics / omics, 2 references
- [6] doi:10.1038/s41467-026-74000-4 [code]
- ArchVelo: archetypal velocity modeling for single-cell multi-omic trajectories.Journal: Nature communicationsIn common: anndata, Scanpy, scikit-learn, 4 other tools, genetics / omics, 2 references
- [7] doi:10.1126/sciadv.aeb4205 [code]
- Learning stochastic dynamics and cell-fate landscapes from single-cell snapshots via optimal transport.Journal: Science advancesIn common: Scanpy, PyTorch, scikit-learn, 4 other tools, 3 references
- [8] doi:10.1016/j.celrep.2026.117110 [code]
- Single-nucleus multiome analysis in the human prefrontal cortex identifies gene expression and cis-regulatory elements associated with aging.Journal: Cell reportsIn common: anndata, Scanpy, PyTorch, 4 other tools, genetics / omics, 2 references
- [9] doi:10.1093/nar/gkag706 [code]
- scDifformer: diffusion-based post-training for virtual cell modeling across large-scale single-cell data.Journal: Nucleic acids researchIn common: anndata, Scanpy, PyTorch, 5 other tools, 2 references
- [10] doi:10.1093/nar/gkag368 [code]
- Single-cell trajectory inference for detecting transient events in biological processes.Journal: Nucleic acids researchIn common: anndata, Scanpy, scikit-learn, 4 other tools, genetics / omics, 2 references
Contribute
The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.
Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.
Claim this paper
Correct its record
Say what each link of this record is, remove the ones that are not the paper's, add the ones that are missing. The correction becomes a new version of the record, in its Versions section.
Validate its tracing map
You validate the map as this page shows it: 3 repositories of the authors' code, each at its verified commit and with its license, 138 scripts, and 31 matches between paragraphs and code (see the Code and Map sections). It then receives a DOI on Zenodo, with you (your ORCID iD) and OSCR as its creators; the code itself is not deposited.
The map's fingerprint: sha256:6c875a78ebe6e313…
Add the badge to its README
The badge links the code to this page. Copy one of these into the README of the paper's code: only you decide where it goes, and nothing is changed for you.
Markdown
[, paste the snippet at the top, then “Commit changes…” and, to review it first, “Create a new branch and start a pull request”. You open the pull request; OSCR asks for no permission.
Request its removal
To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).
Discussion, reproductions, activity
Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.
Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.
Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.
