radiate_gp/regression/regression.rs
1use super::{DataSet, Loss};
2use crate::{Eval, EvalMut, Graph, GraphEvaluator, Op, Tree};
3
4pub struct Regression {
5 data_set: DataSet,
6 loss: Loss,
7}
8
9impl Regression {
10 pub fn new(sample_set: DataSet, loss: Loss) -> Self {
11 Regression {
12 data_set: sample_set,
13 loss,
14 }
15 }
16}
17
18impl Eval<Graph<Op<f32>>, f32> for Regression {
19 fn eval(&self, graph: &Graph<Op<f32>>) -> f32 {
20 let mut evaluator = GraphEvaluator::new(graph);
21
22 self.loss
23 .calculate(&self.data_set, &mut |input| evaluator.eval_mut(input))
24 }
25}
26
27impl Eval<Tree<Op<f32>>, f32> for Regression {
28 fn eval(&self, tree: &Tree<Op<f32>>) -> f32 {
29 self.loss
30 .calculate(&self.data_set, &mut |input| vec![tree.eval(input)])
31 }
32}
33
34impl Eval<Vec<Tree<Op<f32>>>, f32> for Regression {
35 fn eval(&self, program: &Vec<Tree<Op<f32>>>) -> f32 {
36 self.loss
37 .calculate(&self.data_set, &mut |input| program.eval(input))
38 }
39}
40
41// use std::{marker::PhantomData, sync::Arc};
42
43// pub struct RegressionProblem<C, T, G>
44// where
45// C: Chromosome,
46// T: Clone,
47// G: Codex<C, T>,
48// {
49// data_set: DataSet,
50// loss: Loss,
51// codex: Arc<G>,
52// _marker: PhantomData<C>,
53// _marker2: PhantomData<T>,
54// }
55
56// impl<C, T, G> RegressionProblem<C, T, G>
57// where
58// C: Chromosome,
59// T: Clone,
60// G: Codex<C, T>,
61// {
62// pub fn new(data_set: DataSet, loss: Loss, codex: G) -> Self {
63// RegressionProblem {
64// data_set,
65// loss,
66// codex: Arc::new(codex),
67// _marker: PhantomData,
68// _marker2: PhantomData,
69// }
70// }
71// }
72
73// impl Problem<GraphChromosome<Op<f32>>, Graph<Op<f32>>>
74// for RegressionProblem<GraphChromosome<Op<f32>>, Graph<Op<f32>>, GraphCodex<Op<f32>>>
75// {
76// fn encode(&self) -> Genotype<GraphChromosome<Op<f32>>> {
77// self.codex.encode()
78// }
79
80// fn decode(&self, genotype: &Genotype<GraphChromosome<Op<f32>>>) -> Graph<Op<f32>> {
81// self.codex.decode(genotype)
82// }
83
84// fn eval(&self, individual: &Genotype<GraphChromosome<Op<f32>>>) -> Score {
85// let chrome = individual.iter().next().unwrap();
86// let mut evaluator = GraphEvaluator::new(&chrome);
87
88// self.loss
89// .calculate(&self.data_set, &mut |input| evaluator.eval_mut(input))
90// .into()
91// }
92// }