Skip to main content

radiate_pgm/
codec.rs

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}