use crate::latent::Continuous;
use crate::{
Conditioning, Error, GenerationParams, Latent, LatentGenerator, Result, Seed, SeedPolicy,
Temperature,
};
pub fn generate_grid<G: LatentGenerator<Continuous>>(
generator: &G,
conditionings: &[Conditioning],
seeds: &[Seed],
params: &GenerationParams,
) -> Result<Vec<Vec<Latent<Continuous>>>> {
if conditionings.is_empty() {
return Err(Error::validation(
"bakeoff grid needs at least one conditioning",
));
}
if seeds.is_empty() {
return Err(Error::validation("bakeoff grid needs at least one seed"));
}
let temperature = params
.seed
.temperature()
.unwrap_or_else(|| Temperature::new(1.0).expect("1.0 is a valid temperature"));
let mut grid = Vec::with_capacity(conditionings.len());
for conditioning in conditionings {
let mut row = Vec::with_capacity(seeds.len());
for &seed in seeds {
let cell_params = GenerationParams {
seed: SeedPolicy::Seeded { seed, temperature },
..*params
};
row.push(generator.generate(conditioning, &cell_params)?);
}
grid.push(row);
}
Ok(grid)
}