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