syd-format 0.1.0

binary format for chess game tree
#[cfg(feature = "hll")]
use crate::hyperloglog::HyperLogLog;

#[cfg(feature = "positionstats")]
use crate::position::Position;

#[cfg(feature = "positionstats")]
pub struct Stats{
    #[cfg(feature = "hll")]
    pub hll: HyperLogLog,
    pub cntpos: u64,
    pub bounds: [u64; 3],
    pub depth: [u64; 256/3+1],
}

#[cfg(feature = "positionstats")]
impl Stats {
    pub fn new() -> Self {
        Self {
            #[cfg(feature = "hll")]
            hll: HyperLogLog::new(),
            cntpos: 0,
            bounds: [0; 3],
            depth: [0; 256/3+1],
        }
    }
    pub fn update(&mut self, pos: &Position) {
        #[cfg(feature = "hll")]
        {
            self.hll.add(pos.hash);
        }
        self.cntpos += 1;
        self.bounds[pos.bound as usize] += 1;
        self.depth[pos.depth as usize] += 1;
    }
    pub fn print(&self) {
        println!("nbpos = {}", self.cntpos);
        #[cfg(feature = "hll")]
        {
            let cnt = self.hll.count();
            println!("unique pos = {} ({:.2}%)", cnt, 100.0 * cnt as f64 / self.cntpos as f64);
        }
        println!("exact      = {} ({:.2}%)", self.bounds[0], self.bounds[0] as f64 * 100.0 / self.cntpos as f64);
        println!("lowerbound = {} ({:.2}%)", self.bounds[1], self.bounds[1] as f64 * 100.0 / self.cntpos as f64);
        println!("upperbound = {} ({:.2}%)", self.bounds[2], self.bounds[2] as f64 * 100.0 / self.cntpos as f64);
        print!("depth distrib = [");
        for dcnt in self.depth {
            print!("{} ", dcnt);
        }
        print!("]\ndepth distrib = [");
        for dcnt in self.depth {
            print!("{:.2}% ", dcnt as f64 * 100.0 / self.cntpos as f64);
        }
        println!("]");
    }
}

#[cfg(feature = "readerstats")]
pub struct ReaderStat {
    degrees: [u64; 256],
    nodes: u64,
    bm_continued: u64,
    compressed_size: u64,
}

#[cfg(feature = "readerstats")]
impl ReaderStat {
    pub fn new() -> Self {
        Self {
            degrees: [0; 256],
            nodes: 0,
            bm_continued: 0,
            compressed_size: 0,
        }
    }
    pub fn update(&mut self, deg: usize, is_bm_continued: bool, size_move: u64) {
        self.degrees[deg] += 1;
        self.nodes += 1;
        self.bm_continued += is_bm_continued as u64;
        self.compressed_size += size_move;
    }
    pub fn print(&self) {
        println!("degrees: [");
        print!("\t");
        for cnt in self.degrees {
            print!("{} ", cnt);
        }
        println!("\n]");
        println!("degrees%: [");
        print!("\t");
        for cnt in self.degrees {
            print!("{:.2} ", cnt as f64 * 100.0 / self.nodes as f64);
        }
        println!("\n]");
        println!("{} / {} ({:.2}%)", self.bm_continued, self.nodes, self.bm_continued as f64 * 100.0 / self.nodes as f64);
        println!("{} / {} ({:.2}%)", self.bm_continued, self.nodes-self.degrees[0], self.bm_continued as f64 * 100.0 / (self.nodes-self.degrees[0]) as f64);
        println!("{:.2} B/pos (compressed)", self.compressed_size as f64 / (self.nodes as f64 * 8.0));
    }
}