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_lstm_model_arch::{DailyLSTMModel, DailyLSTMModelConfig};
pub fn save_daily_lstm_model<B: Backend, P: AsRef<Path>>(
model: &DailyLSTMModel<B>,
path: P,
config: &DailyLSTMModelConfig,
) -> 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_daily_lstm_config(config, config_path)?;
Ok(())
}
pub fn load_daily_lstm_model<B: Backend, P: AsRef<Path>>(
config: &DailyLSTMModelConfig,
path: P,
device: &B::Device,
) -> Result<DailyLSTMModel<B>> {
let model = config.init(device);
Ok(model)
}
#[derive(Serialize, Deserialize)]
struct SerializableLSTMConfig {
input_size: usize,
hidden_size: usize,
output_size: usize,
dropout_rate: f64,
}
impl From<&DailyLSTMModelConfig> for SerializableLSTMConfig {
fn from(config: &DailyLSTMModelConfig) -> Self {
Self {
input_size: config.input_size,
hidden_size: config.hidden_size,
output_size: config.output_size,
dropout_rate: config.dropout_rate,
}
}
}
impl From<SerializableLSTMConfig> for DailyLSTMModelConfig {
fn from(config: SerializableLSTMConfig) -> 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_lstm_config<P: AsRef<Path>>(
config: &DailyLSTMModelConfig,
path: P,
) -> Result<()> {
let serializable_config = SerializableLSTMConfig::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_daily_lstm_config<P: AsRef<Path>>(path: P) -> Result<DailyLSTMModelConfig> {
let config_json = fs::read_to_string(path)?;
let serializable_config: SerializableLSTMConfig = serde_json::from_str(&config_json)?;
let config = DailyLSTMModelConfig::from(serializable_config);
Ok(config)
}