use dataloader_rs::collator::Collator;
use dataloader_rs::{DataLoader, Dataset, RandomSampler, SequentialSampler, error::Result};
struct Squares {
len: usize,
}
impl Dataset for Squares {
type Item = u64;
fn get(&self, index: usize) -> Result<u64> {
Ok((index as u64).pow(2))
}
fn len(&self) -> usize {
self.len
}
}
struct Sum;
impl Collator<u64> for Sum {
type Batch = u64;
fn collate(&self, items: Vec<u64>) -> Result<u64> {
Ok(items.into_iter().sum())
}
}
fn main() -> Result<()> {
println!("Shuffled batches of 10, 4 workers:");
let mut loader = DataLoader::builder(Squares { len: 100 })
.batch_size(10)
.sampler(RandomSampler::new(42)) .num_workers(4) .prefetch_depth(4) .drop_last(true) .build();
for epoch in 0..2 {
let first: Vec<u64> = loader.iter().next().expect("at least one batch")?;
println!(" epoch {epoch}: first batch {first:?}");
}
println!("Sums of each batch of 10, in order:");
let mut sums = DataLoader::builder(Squares { len: 100 })
.batch_size(10)
.sampler(SequentialSampler)
.collator(Sum)
.build();
let all: Vec<u64> = sums.iter().collect::<Result<_>>()?;
println!(" {all:?}");
let mut uneven = DataLoader::builder(Squares { len: 95 })
.batch_size(10)
.build();
let iter = uneven.iter();
println!(
"95 items in batches of 10: {} batches, the last one has 5 items",
iter.len()
);
drop(iter);
let mut early = DataLoader::builder(Squares { len: 100 })
.batch_size(10)
.num_workers(2)
.build();
for (count, batch) in early.iter().enumerate() {
batch?;
if count == 2 {
println!("Stopped after 3 batches; the next epoch starts at once:");
break;
}
}
println!(" {} batches in the next epoch", early.iter().count());
Ok(())
}