Add ability to save/resume a simulation to a state file
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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 {
|
||||||
|
Reference in New Issue
Block a user