Add ability to save/resume a simulation to a state file

This commit is contained in:
2021-06-14 21:04:08 -07:00
parent 3249ecd412
commit aa5d38b0fb
2 changed files with 22 additions and 3 deletions

View File

@@ -7,7 +7,7 @@ use crate::sim::{GenericSim, SimState};
use crate::stim::AbstractStimulus; use crate::stim::AbstractStimulus;
use log::{info, trace}; use log::{info, trace};
use serde::Serialize; use serde::{Deserialize, Serialize};
use std::path::PathBuf; use std::path::PathBuf;
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
use std::sync::mpsc::{sync_channel, SyncSender, Receiver}; use std::sync::mpsc::{sync_channel, SyncSender, Receiver};
@@ -106,7 +106,21 @@ impl<R: Real, M: Material<R> + Send + Sync + 'static> Driver<R, M> {
impl<R: Real + Send + Sync + Serialize, M: Material<R> + Serialize + Send + Sync + 'static> Driver<R, M> { impl<R: Real + Send + Sync + Serialize, M: Material<R> + Serialize + Send + Sync + 'static> Driver<R, M> {
pub fn add_serializer_renderer(&mut self, out_base: &str, step_frequency: u64) { 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); 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<R, M> Driver<R, M>
where
R: Real + Send + Sync + Serialize + for<'a> Deserialize<'a>,
M: Material<R> + 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);
} }
} }

View File

@@ -13,7 +13,7 @@ use imageproc::{pixelops, drawing};
use rayon::prelude::*; use rayon::prelude::*;
use serde::{Serialize, Deserialize}; use serde::{Serialize, Deserialize};
use std::fs::File; use std::fs::File;
use std::io::{BufWriter, Write as _}; use std::io::{BufReader, BufWriter, Write as _};
use std::path::PathBuf; use std::path::PathBuf;
use std::sync::{Mutex, RwLock}; use std::sync::{Mutex, RwLock};
use y4m; use y4m;
@@ -699,6 +699,11 @@ impl SerializerRenderer {
//serde_cbor::to_writer(out, &snap).unwrap(); //serde_cbor::to_writer(out, &snap).unwrap();
bincode::serialize_into(out, &frame).unwrap(); bincode::serialize_into(out, &frame).unwrap();
} }
pub fn try_load<S: GenericSim + for <'a> Deserialize<'a>>(&self) -> Option<SerializedFrame<S>> {
let mut reader = BufReader::new(File::open(&*self.fmt_str).ok()?);
bincode::deserialize_from(&mut reader).ok()
}
} }
impl<S: GenericSim + Serialize> Renderer<S> for SerializerRenderer { impl<S: GenericSim + Serialize> Renderer<S> for SerializerRenderer {