Skip to main content

fmi_schema/fmi3/
mod.rs

1//! FMI3.0 schema definitions
2//!
3//! This module contains the definitions of the FMI3.0 XML schema.
4
5mod annotation;
6mod build_description;
7mod interface_type;
8mod model_description;
9mod terminals_and_icons;
10mod r#type;
11mod unit;
12mod variable;
13mod variable_dependency;
14
15pub use annotation::{Annotation, Fmi3Annotations as Annotations};
16pub use build_description::*;
17pub use interface_type::*;
18pub use model_description::*;
19pub use terminals_and_icons::*;
20pub use r#type::*;
21pub use unit::*;
22pub use variable::*;
23pub use variable_dependency::*;
24
25use crate::variable_counts::{Counts, VariableCounts};
26
27impl crate::traits::DefaultExperiment for Fmi3ModelDescription {
28    fn start_time(&self) -> Option<f64> {
29        self.default_experiment
30            .as_ref()
31            .and_then(|de| de.start_time)
32    }
33
34    fn stop_time(&self) -> Option<f64> {
35        self.default_experiment.as_ref().and_then(|de| de.stop_time)
36    }
37
38    fn tolerance(&self) -> Option<f64> {
39        self.default_experiment.as_ref().and_then(|de| de.tolerance)
40    }
41
42    fn step_size(&self) -> Option<f64> {
43        self.default_experiment.as_ref().and_then(|de| de.step_size)
44    }
45}
46
47impl VariableCounts for ModelVariables {
48    fn model_counts(&self) -> Counts {
49        use variable::Variable;
50
51        // Count variables by type
52        let mut num_real_vars = 0;
53        let mut num_bool_vars = 0;
54        let mut num_integer_vars = 0;
55        let mut num_string_vars = 0;
56
57        for var in &self.variables {
58            match var {
59                Variable::Float32(_) | Variable::Float64(_) => num_real_vars += 1,
60                Variable::Boolean(_) => num_bool_vars += 1,
61                Variable::Int8(_)
62                | Variable::UInt8(_)
63                | Variable::Int16(_)
64                | Variable::UInt16(_)
65                | Variable::Int32(_)
66                | Variable::UInt32(_)
67                | Variable::Int64(_)
68                | Variable::UInt64(_) => num_integer_vars += 1,
69                Variable::String(_) => num_string_vars += 1,
70                Variable::Binary(_) | Variable::Clock(_) => {}
71            }
72        }
73
74        let cts = Counts {
75            num_real_vars,
76            num_bool_vars,
77            num_integer_vars,
78            num_string_vars,
79            num_enum_vars: 0,
80            ..Default::default()
81        };
82
83        // Count by variability and causality
84        self.iter_abstract().fold(cts, |mut cts, var| {
85            match var.variability() {
86                Variability::Constant => {
87                    cts.num_constants += 1;
88                }
89                Variability::Continuous => {
90                    cts.num_continuous += 1;
91                }
92                Variability::Discrete => {
93                    cts.num_discrete += 1;
94                }
95                _ => {}
96            }
97            match var.causality() {
98                Causality::CalculatedParameter => {
99                    cts.num_calculated_parameters += 1;
100                }
101                Causality::Parameter => {
102                    cts.num_parameters += 1;
103                }
104                Causality::Input => {
105                    cts.num_inputs += 1;
106                }
107                Causality::Output => {
108                    cts.num_outputs += 1;
109                }
110                Causality::Local => {
111                    cts.num_local += 1;
112                }
113                Causality::Independent => {
114                    cts.num_independent += 1;
115                }
116                _ => {}
117            }
118            cts
119        })
120    }
121}