#[derive(Debug, Clone, PartialEq)]
pub struct HybridState {
pub mode: usize,
pub continuous: Vec<f64>,
}
impl HybridState {
pub fn new(mode: usize, continuous: Vec<f64>) -> Self {
Self { mode, continuous }
}
}
#[derive(Debug, Clone)]
pub enum GuardCondition {
Always,
LinearInequality { coeffs: Vec<f64>, bound: f64 },
NonLinear(String),
}
#[derive(Debug, Clone)]
pub enum ResetMap {
Identity,
Linear { matrix: Vec<Vec<f64>> },
Constant { values: Vec<f64> },
}
#[derive(Debug, Clone)]
pub struct DiscreteTransition {
pub from_mode: usize,
pub to_mode: usize,
pub guard: GuardCondition,
pub reset: ResetMap,
}
#[derive(Debug, Clone)]
pub enum FlowType {
Linear {
a_matrix: Vec<Vec<f64>>,
b_vector: Vec<f64>,
},
Affine {
a: Vec<Vec<f64>>,
b: Vec<Vec<f64>>,
c: Vec<f64>,
},
Zero,
}
#[derive(Debug, Clone)]
pub struct ContinuousDynamics {
pub mode: usize,
pub flow: FlowType,
}
#[derive(Debug, Clone)]
pub struct Invariant {
pub mode: usize,
pub condition: GuardCondition,
}
#[derive(Debug, Clone)]
pub struct HybridAutomaton {
pub modes: Vec<String>,
pub transitions: Vec<DiscreteTransition>,
pub dynamics: Vec<ContinuousDynamics>,
pub initial_mode: usize,
pub initial_state: Vec<f64>,
}
impl HybridAutomaton {
pub fn new(
modes: Vec<String>,
transitions: Vec<DiscreteTransition>,
dynamics: Vec<ContinuousDynamics>,
initial_mode: usize,
initial_state: Vec<f64>,
) -> Self {
Self {
modes,
transitions,
dynamics,
initial_mode,
initial_state,
}
}
pub fn num_modes(&self) -> usize {
self.modes.len()
}
}
#[derive(Debug, Clone)]
pub struct ExecutionTrace {
pub states: Vec<HybridState>,
pub times: Vec<f64>,
pub transitions: Vec<Option<usize>>,
}
impl ExecutionTrace {
pub fn empty() -> Self {
Self {
states: Vec::new(),
times: Vec::new(),
transitions: Vec::new(),
}
}
pub fn jump_count(&self) -> usize {
self.transitions.iter().filter(|t| t.is_some()).count()
}
pub fn total_time(&self) -> f64 {
match (self.times.first(), self.times.last()) {
(Some(&t0), Some(&t1)) => t1 - t0,
_ => 0.0,
}
}
}
#[derive(Debug, Clone)]
pub enum SafetyProperty {
ReachabilityAvoidance { forbidden_modes: Vec<usize> },
StateBound { dim: usize, lower: f64, upper: f64 },
ModeTime { mode: usize, max_duration: f64 },
}