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// }