pub mod bipartite;
pub mod coarsening_map;
pub mod delta_topic;
pub mod dyn_decoder;
pub mod gaussian_nb;
pub mod joint_topic;
pub mod masked_etm;
pub mod nb_mixture;
pub mod poisson;
pub mod query_decoder;
pub mod topic;
pub use bipartite::{
BipartiteDecoder, BipartiteLikelihood, BlockModelMultinomial, GaussianLikelihood, NbLikelihood,
PoissonLikelihood, SymmetricMultinomial,
};
pub use delta_topic::DeltaTopicDecoder;
pub use dyn_decoder::{create_dyn_decoder, DynDecoderModuleT};
pub use gaussian_nb::GaussianNbDecoder;
pub use joint_topic::JointTopicDecoder;
pub use masked_etm::{EmbeddedNbTopicDecoder, MaskedNbTarget};
pub use nb_mixture::NbMixtureTopicDecoder;
pub use poisson::PoissonDecoder;
pub use topic::{MultinomTopicDecoder, NbTopicDecoder};
pub(crate) fn gene_slices(n_features: usize, chunk: usize) -> impl Iterator<Item = (usize, usize)> {
let chunk = chunk.max(1);
(0..n_features)
.step_by(chunk)
.map(move |start| (start, chunk.min(n_features - start)))
}