use anyhow::Result;
use burn::{
module::Module,
record::{Record, Recorder},
tensor::backend::Backend,
};
use log::info;
use serde::{Deserialize, Serialize};
use serde_json;
use std::fs::{self, File};
use std::io::{Read, Write};
use std::path::{Path, PathBuf};
use super::step_3_gru_model_arch::{DailyGRUModel, DailyGRUModelConfig};
#[derive(Serialize, Deserialize)]
pub struct SerializableGRUConfig {
pub input_size: usize,
pub hidden_size: usize,
pub output_size: usize,
pub dropout_rate: f64,
}
impl From<&DailyGRUModelConfig> for SerializableGRUConfig {
fn from(config: &DailyGRUModelConfig) -> Self {
Self {
input_size: config.input_size,
hidden_size: config.hidden_size,
output_size: config.output_size,
dropout_rate: config.dropout_rate,
}
}
}
impl From<SerializableGRUConfig> for DailyGRUModelConfig {
fn from(config: SerializableGRUConfig) -> Self {
Self {
input_size: config.input_size,
hidden_size: config.hidden_size,
output_size: config.output_size,
dropout_rate: config.dropout_rate,
}
}
}
pub fn save_daily_gru_model<B: Backend, P: AsRef<Path>>(
model: &DailyGRUModel<B>,
path: P,
config: &DailyGRUModelConfig,
) -> Result<()> {
if let Some(parent) = path.as_ref().parent() {
fs::create_dir_all(parent)?;
}
let config_path = path.as_ref().with_extension("config.json");
save_model_config(config, config_path)?;
Ok(())
}
pub fn load_daily_gru_model<B: Backend, P: AsRef<Path>>(
config: &DailyGRUModelConfig,
path: P,
device: &B::Device,
) -> Result<DailyGRUModel<B>> {
let model = config.init(device);
Ok(model)
}
pub fn save_model_config<P: AsRef<Path>>(config: &DailyGRUModelConfig, path: P) -> Result<()> {
let serializable_config = SerializableGRUConfig::from(config);
let config_json = serde_json::to_string_pretty(&serializable_config)?;
let path = path.as_ref();
if let Some(parent) = path.parent() {
fs::create_dir_all(parent)?;
}
fs::write(path, config_json)?;
Ok(())
}
pub fn load_model_config<P: AsRef<Path>>(path: P) -> Result<DailyGRUModelConfig> {
let config_json = fs::read_to_string(path)?;
let serializable_config: SerializableGRUConfig = serde_json::from_str(&config_json)?;
let config = DailyGRUModelConfig::from(serializable_config);
Ok(config)
}