1use crate::{FactorGene, FactorKind, PgmChromosome, VarId, VarSpec};
2use radiate_core::{Codec, Genotype};
3use std::sync::Arc;
4
5#[derive(Clone)]
6pub struct PgmCodec {
7 pub vars: Arc<[VarSpec]>,
8 pub num_factors: usize,
9 pub max_scope: usize,
10}
11
12impl PgmCodec {
13 pub fn new(cards: &[usize], num_factors: usize, max_scope: usize) -> Self {
14 let vars = cards
15 .iter()
16 .enumerate()
17 .map(|(id, &card)| VarSpec {
18 id: VarId(id as u32),
19 card,
20 })
21 .collect::<Arc<[VarSpec]>>();
22
23 Self {
24 vars,
25 num_factors,
26 max_scope,
27 }
28 }
29}
30
31impl Codec<PgmChromosome, PgmChromosome> for PgmCodec {
32 fn encode(&self) -> Genotype<PgmChromosome> {
33 let num_vars = self.vars.len();
34
35 let mut factors = Vec::with_capacity(self.num_factors);
36 for _ in 0..self.num_factors {
37 let scope = super::sample_scope(num_vars, self.max_scope);
38 let shape = super::logp_table_shape(&self.vars, &scope);
39 let params = super::init_logp_table(&shape);
40
41 println!("factor scope: {:?}", params);
42
43 factors.push(FactorGene {
44 scope,
45 kind: FactorKind::Logp,
46 shape: shape.clone(),
47 params,
48 });
49 }
50
51 Genotype::from(PgmChromosome {
52 vars: self.vars.clone(),
53 factors,
54 })
55 }
56
57 fn decode(&self, genotype: &Genotype<PgmChromosome>) -> PgmChromosome {
58 genotype[0].clone()
59 }
60}