try to check trace of states rather than trace of events
This commit is contained in:
parent
808672d884
commit
3efb84e0e7
5 changed files with 30 additions and 74 deletions
4
Cargo.lock
generated
4
Cargo.lock
generated
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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.
94
src/lib.rs
94
src/lib.rs
|
|
@ -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();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue