use bonsai_rs::sanity_sc_rs::gpu::sanity_gpu_select;
use cubecl::Runtime;
use std::time::Instant;
use crate::prelude::*;
use crate::single_cell::mc_analysis::as_csc;
use crate::single_cell::mc_analysis::bonsai_mc::{mc_count_chunk, mc_totals};
use crate::single_cell::sc_analysis::bonsai::{
BonsaiScParams, BonsaiScResult, SANITY_GENE_CHUNK, chunk_sanity_params, keep_for_bonsai,
run_bonsai_sc, stream_chunks, stream_sanity,
};
use crate::single_cell::sc_data::data_io::SingleCellReading;
pub fn sanity_bonsai_sc_gpu<R, G, C>(
gene_reader: &G,
cell_reader: &C,
cell_indices: &[usize],
gene_indices: &[usize],
params: &BonsaiScParams,
device: R::Device,
verbosity: Verbosity,
) -> Result<BonsaiScResult, BixverseErrors>
where
R: Runtime,
G: SingleCellReading,
C: SingleCellReading,
{
let started = Instant::now();
let client = R::client(&device);
let sanity_params = chunk_sanity_params(params);
let keep = keep_for_bonsai(params);
let post = stream_sanity(
gene_reader,
cell_reader,
cell_indices,
gene_indices,
SANITY_GENE_CHUNK,
verbosity,
|counts, totals| {
Ok(sanity_gpu_select(
counts,
totals,
Some(sanity_params),
&client,
&keep,
)?)
},
)?;
let t_sanity = started.elapsed().as_secs_f64();
let mut res = run_bonsai_sc(post, gene_indices.len(), params, verbosity)?;
res.timings.insert(0, ("sanity".to_string(), t_sanity));
Ok(res)
}
pub fn sanity_bonsai_mc_gpu<R: Runtime>(
counts: &CompressedSparseData2<u32, f32>,
gene_indices: &[usize],
params: &BonsaiScParams,
device: R::Device,
verbosity: Verbosity,
) -> Result<BonsaiScResult, BixverseErrors> {
let started = Instant::now();
let client = R::client(&device);
let csc = as_csc(counts);
let totals = mc_totals(&csc);
let sanity_params = chunk_sanity_params(params);
let keep = keep_for_bonsai(params);
let post = stream_chunks(
gene_indices,
SANITY_GENE_CHUNK,
&totals,
verbosity,
|genes| mc_count_chunk(&csc, genes),
|chunk, totals| {
Ok(sanity_gpu_select(
chunk,
totals,
Some(sanity_params),
&client,
&keep,
)?)
},
)?;
let t_sanity = started.elapsed().as_secs_f64();
let mut res = run_bonsai_sc(post, gene_indices.len(), params, verbosity)?;
res.timings.insert(0, ("sanity".to_string(), t_sanity));
Ok(res)
}