use super::types::ProdigalError;
use crate::types::Training;
use std::io::{Read, Write};
use std::path::Path;
pub struct TrainingData {
pub(crate) inner: Box<Training>,
}
impl TrainingData {
pub fn load(path: impl AsRef<Path>) -> Result<Self, ProdigalError> {
let mut file = std::fs::File::open(path)?;
let mut inner = Box::new(unsafe { std::mem::zeroed::<Training>() });
let size = std::mem::size_of::<Training>();
let buf = unsafe {
std::slice::from_raw_parts_mut(&mut *inner as *mut Training as *mut u8, size)
};
file.read_exact(buf)?;
Ok(TrainingData { inner })
}
pub fn save(&self, path: impl AsRef<Path>) -> Result<(), ProdigalError> {
let mut file = std::fs::File::create(path)?;
let size = std::mem::size_of::<Training>();
let buf = unsafe {
std::slice::from_raw_parts(&*self.inner as *const Training as *const u8, size)
};
file.write_all(buf)?;
Ok(())
}
pub fn gc(&self) -> f64 {
self.inner.gc
}
pub fn translation_table(&self) -> i32 {
self.inner.trans_table
}
pub fn uses_sd(&self) -> bool {
self.inner.uses_sd != 0
}
}
impl Clone for TrainingData {
fn clone(&self) -> Self {
TrainingData {
inner: self.inner.clone(),
}
}
}