use std::panic::RefUnwindSafe;
use crate::examples::*;
use crate::grid::*;
use crate::cats::Colour;
use crate::cats::Transformation;
pub fn check_examples(ex: &Examples, func: &dyn Fn(&Example) -> bool) -> bool {
for e in &ex.examples {
if !func(e) {
return false;
}
}
true
}
pub fn check_input_grids(ex: &Examples, func: &dyn Fn(&Grid) -> bool) -> bool {
for e in &ex.examples {
if !func(&e.input.grid) {
return false;
}
}
true
}
pub fn check_output_grids(ex: &Examples, func: &dyn Fn(&Grid) -> bool) -> bool {
for e in &ex.examples {
if !func(&e.output.grid) {
return false;
}
}
true
}
pub fn experiment_grid(ex: &Examples, file: &str, experiment: usize, _trans: Transformation, func: &(dyn Fn(&Grid, &Grid, &mut usize) -> Grid + RefUnwindSafe)) -> Vec<Grid> {
let mut n = usize::MAX;
for (attempts, e) in ex.examples.iter().enumerate() {
let grid = &e.input.grid;
let target = &e.output.grid;
if target.size() == 0 {
return ex.tests.iter().map(|_| Grid::trivial()).collect::<Vec<_>>();
}
loop {
if n == 0 {
return ex.tests.iter().map(|_| Grid::trivial()).collect::<Vec<_>>();
} else {
let ans = func(grid, target, &mut n);
if ans.equals(target) != Colour::Same {
if n == usize::MAX {
if attempts > 0 && (experiment < 100000 || attempts > 1) {
println!("{file} {experiment:<4}: {attempts} worked out of {}", ex.examples.len());
}
return ex.tests.iter().map(|_| Grid::trivial()).collect::<Vec<_>>();
}
n -= 1;
} else {
break;
}
}
}
}
ex.tests.iter().map(|test| {
let ans = func(&test.input.grid, &ex.examples[0].output.grid, &mut n);
ans
})
.collect()
}
pub fn experiment_example(ex: &Examples, file: &str, experiment: usize, _trans: Transformation, func: &(dyn Fn(&Example) -> Grid + RefUnwindSafe)) -> Vec<Grid> {
for (attempts, e) in ex.examples.iter().enumerate() {
let target = &e.output.grid;
let ans = func(e);
if ans == Grid::trivial() || ans.equals(target) != Colour::Same {
if attempts > 0 && (experiment < 100000 || attempts > 1) {
println!("{file} {experiment:<4}: {attempts} worked out of {}", ex.examples.len());
}
return ex.tests.iter().map(|_| Grid::trivial()).collect::<Vec<_>>();
}
}
ex.tests.iter().map(|test| {
let ans = func(test);
ans
})
.collect()
}
pub fn experiment_colours(ex: &Examples, func: &(dyn Fn(&Example, Colour) -> Grid + RefUnwindSafe)) -> Vec<Grid> {
const COLOURS: &[Colour] = Colour::base_colours();
'outer:
for colour in COLOURS {
for e in ex.examples.iter() {
let target = &e.output.grid;
let ans = func(e, *colour);
if ans == Grid::trivial() || ans.equals(target) != Colour::Same {
continue 'outer;
}
}
let ans = ex.tests.iter().map(|test| {
let ans = func(test, *colour);
ans
})
.collect();
return ans;
}
ex.tests.iter().map(|_| Grid::trivial()).collect::<Vec<_>>()
}