try to check trace of states rather than trace of events

This commit is contained in:
Joeri Exelmans 2025-11-05 09:30:58 +01:00
parent 808672d884
commit 3efb84e0e7
5 changed files with 30 additions and 74 deletions

4
Cargo.lock generated
View file

@ -41,7 +41,7 @@ dependencies = [
[[package]] [[package]]
name = "argus" name = "argus"
version = "0.1.4" version = "0.1.4"
source = "git+https://deemz.org/git/research/argus.git?branch=dev#654a0521f7020b059e134a477f280a8a5a98a490" source = "git+https://deemz.org/git/research/argus.git?rev=654a0521f7020b059e134a477f280a8a5a98a490#654a0521f7020b059e134a477f280a8a5a98a490"
dependencies = [ dependencies = [
"argus-derive", "argus-derive",
"chumsky", "chumsky",
@ -58,7 +58,7 @@ dependencies = [
[[package]] [[package]]
name = "argus-derive" name = "argus-derive"
version = "0.1.2" version = "0.1.2"
source = "git+https://deemz.org/git/research/argus.git?branch=dev#654a0521f7020b059e134a477f280a8a5a98a490" source = "git+https://deemz.org/git/research/argus.git?rev=654a0521f7020b059e134a477f280a8a5a98a490#654a0521f7020b059e134a477f280a8a5a98a490"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",

View file

@ -6,7 +6,7 @@ version = "0.1.4" # follows argus version
crate-type = ["cdylib"] crate-type = ["cdylib"]
[dependencies] [dependencies]
argus = { git = "https://deemz.org/git/research/argus.git", branch = "dev" } argus = { git = "https://deemz.org/git/research/argus.git", rev="654a0521f7020b059e134a477f280a8a5a98a490" }
js-sys = "0.3.82" js-sys = "0.3.82"
serde = { version = "1.0.228", features = ["derive"] } serde = { version = "1.0.228", features = ["derive"] }
serde-wasm-bindgen = "0.6.5" serde-wasm-bindgen = "0.6.5"

View file

@ -293,6 +293,10 @@ function __wbg_get_imports() {
const ret = arg0.done; const ret = arg0.done;
return ret; return ret;
}; };
imports.wbg.__wbg_entries_e171b586f8f6bdbf = function(arg0) {
const ret = Object.entries(arg0);
return ret;
};
imports.wbg.__wbg_get_7bed016f185add81 = function(arg0, arg1) { imports.wbg.__wbg_get_7bed016f185add81 = function(arg0, arg1) {
const ret = arg0[arg1 >>> 0]; const ret = arg0[arg1 >>> 0];
return ret; return ret;

Binary file not shown.

View file

@ -16,30 +16,17 @@ use serde::{Serialize, Deserialize};
use serde_wasm_bindgen::{from_value, to_value}; use serde_wasm_bindgen::{from_value, to_value};
use std::time::Duration; use std::time::Duration;
// #[wasm_bindgen]
// pub struct WrappedExpr {
// expr: Expr,
// }
// #[wasm_bindgen]
// pub fn parse_str(s: &str) -> WrappedExpr {
// let expr = argus::parse_str(s);
// return WrappedExpr{
// expr: expr.expect("fuck!!!!"),
// };
// }
struct TraceMap<'a> { struct TraceMap<'a> {
events: HashMap<&'a str, Signal<bool>>, traces: HashMap<&'a str, Signal<f64>>,
} }
impl<'a> Trace for TraceMap<'a> { impl<'a> Trace for TraceMap<'a> {
fn signal_names(&self) -> Vec<&str> { fn signal_names(&self) -> Vec<&str> {
self.events.keys().cloned().collect() self.traces.keys().cloned().collect()
} }
fn get<T: 'static>(&self, name: &str) -> Option<&Signal<T>> { fn get<T: 'static>(&self, name: &str) -> Option<&Signal<T>> {
let sig: &dyn AnySignal = match self.events.get(name) { let sig: &dyn AnySignal = match self.traces.get(name) {
Some(signal) => signal, Some(signal) => signal,
None => return None, None => return None,
}; };
@ -47,42 +34,12 @@ impl<'a> Trace for TraceMap<'a> {
} }
} }
// type MyTrace = Vec<TraceItem>
// struct MyResult {
// ok: ,
// }
// pub struct DefaultFalse;
// use argus::signals::{InterpolationMethod, Sample};
// use argus::core::utils::Neighborhood;
// impl InterpolationMethod<bool> for DefaultFalse {
// fn at(a: &super::Sample<bool>, b: &super::Sample<bool>, time: std::time::Duration) -> Option<bool> {
// if time == a.time {
// Some(a.value)
// }
// else if time == b.time {
// Some(b.value)
// }
// else {
// Some(false)
// }
// }
// fn find_intersection(_a: &Neighborhood<bool>, _b: &Neighborhood<bool>) -> Option<Sample<bool>> {
// None
// }
// }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
pub struct StateBuddyTraceEntry { pub struct StateBuddyTraceEntry {
simtime: f64, simtime: f64,
inputEvent: String, state: HashMap<String, f64>,
outputEvents: Vec<String>, // inputEvent: String,
// outputEvents: Vec<String>,
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
@ -90,43 +47,38 @@ pub struct StateBuddyTrace {
entries: Vec<StateBuddyTraceEntry>, entries: Vec<StateBuddyTraceEntry>,
} }
// #[wasm_bindgen]
// impl StateBuddyTrace {
// #[wasm_bindgen(constructor)]
// pub fn new(entries: &Vec<StateBuddyTraceEntry>) {
// StateBuddyTrace{entries}
// }
// }
#[wasm_bindgen] #[wasm_bindgen]
pub fn eval_boolean(s: &str, js_trace: JsValue) -> JsValue { pub fn eval_boolean(s: &str, js_trace: JsValue) -> JsValue {
// convert input (a sequence of state-objects) to a Trace that argus accepts:
let trace: StateBuddyTrace = match from_value(js_trace) { let trace: StateBuddyTrace = match from_value(js_trace) {
Ok(trace) => trace, Ok(trace) => trace,
Err(e) => return JsValue::from_str("failed to parse JSON"), Err(e) => return JsValue::from_str("failed to parse JSON"),
}; };
let mut traceMap = HashMap::<&str, Signal<bool>>::new(); let mut traceMap = HashMap::<&str, Signal<f64>>::new();
for entry in &trace.entries { for entry in &trace.entries {
let value = traceMap.entry(entry.inputEvent.as_str()).or_insert_with(|| Signal::<bool>::Sampled { for (prop, val) in &entry.state {
values: vec![], let signal = traceMap.entry(prop.as_str()).or_insert_with(|| Signal::<f64>::Sampled {
time_points: vec![], values: vec![],
}); time_points: vec![],
if let Signal::<bool>::Sampled { values, time_points } = value { });
values.push(true); if let Signal::<f64>::Sampled { values, time_points } = signal {
time_points.push(Duration::from_millis(entry.simtime as u64)); values.push(*val);
} time_points.push(Duration::from_millis(entry.simtime as u64));
else { }
return JsValue::from_str("this should never happen"); else {
return JsValue::from_str("this should never happen");
}
} }
} }
// parse property string
let parse_result = argus::parse_str(s); let parse_result = argus::parse_str(s);
let expr = match parse_result { let expr = match parse_result {
Ok(expr) => expr, Ok(expr) => expr,
Err(e) => return JsValue::from_str("failed to parse expression"), Err(e) => return JsValue::from_str("failed to parse expression"),
}; };
// evaluate property on trace
let eval_result = match expr { let eval_result = match expr {
Expr::Bool(bool_expr) => BooleanSemantics::eval::<interpolation::Constant>(&bool_expr, &TraceMap{events: traceMap}), Expr::Bool(bool_expr) => BooleanSemantics::eval::<interpolation::Constant>(&bool_expr, &TraceMap{traces: traceMap}),
_ => return JsValue::from_str("expected boolean expression (this should never happen)"), _ => return JsValue::from_str("expected boolean expression (this should never happen)"),
}; };
let mut result = Vec::<StateBuddyEvalResultEntry>::new(); let mut result = Vec::<StateBuddyEvalResultEntry>::new();