1mod 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 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 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}