From aa5d38b0fb8f5178ca7b887da45b84bd1d017ccd Mon Sep 17 00:00:00 2001 From: Colin Date: Mon, 14 Jun 2021 21:04:08 -0700 Subject: [PATCH] Add ability to save/resume a simulation to a state file --- src/driver.rs | 18 ++++++++++++++++-- src/render.rs | 7 ++++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/driver.rs b/src/driver.rs index fbf7cd6..9b1e717 100644 --- a/src/driver.rs +++ b/src/driver.rs @@ -7,7 +7,7 @@ use crate::sim::{GenericSim, SimState}; use crate::stim::AbstractStimulus; use log::{info, trace}; -use serde::Serialize; +use serde::{Deserialize, Serialize}; use std::path::PathBuf; use std::sync::{Arc, Mutex}; use std::sync::mpsc::{sync_channel, SyncSender, Receiver}; @@ -106,7 +106,21 @@ impl + Send + Sync + 'static> Driver { impl + Serialize + Send + Sync + 'static> Driver { pub fn add_serializer_renderer(&mut self, out_base: &str, step_frequency: u64) { let fmt_str = format!("{out_base}{{step_no}}.bc", out_base=out_base); - self.add_renderer(render::SerializerRenderer::new_static(&*fmt_str), out_base, step_frequency); + self.add_renderer(render::SerializerRenderer::new_static(&*fmt_str), &*fmt_str, step_frequency); + } +} + +impl Driver +where + R: Real + Send + Sync + Serialize + for<'a> Deserialize<'a>, + M: Material + Serialize + for<'a> Deserialize<'a> + Send + Sync + 'static, +{ + pub fn add_state_file(&mut self, state_file: &str, snapshot_frequency: u64) { + let ser = render::SerializerRenderer::new(state_file); + if let Some(state) = ser.try_load() { + self.state = state.state; + } + self.add_renderer(ser, state_file, snapshot_frequency); } } diff --git a/src/render.rs b/src/render.rs index 796b20d..353c453 100644 --- a/src/render.rs +++ b/src/render.rs @@ -13,7 +13,7 @@ use imageproc::{pixelops, drawing}; use rayon::prelude::*; use serde::{Serialize, Deserialize}; use std::fs::File; -use std::io::{BufWriter, Write as _}; +use std::io::{BufReader, BufWriter, Write as _}; use std::path::PathBuf; use std::sync::{Mutex, RwLock}; use y4m; @@ -699,6 +699,11 @@ impl SerializerRenderer { //serde_cbor::to_writer(out, &snap).unwrap(); bincode::serialize_into(out, &frame).unwrap(); } + + pub fn try_load Deserialize<'a>>(&self) -> Option> { + let mut reader = BufReader::new(File::open(&*self.fmt_str).ok()?); + bincode::deserialize_from(&mut reader).ok() + } } impl Renderer for SerializerRenderer {