117 {{0, 0, 35.0}, { 10, 0, 1.5}, 0, 6e9, RMa, O2ILH::LOW, -93.0, 4.0},
118 {{0, 0, 35.0}, { 100, 0, 1.5}, 0, 6e9, RMa, O2ILH::LOW, -112.0, 4.0},
119 {{0, 0, 10.0}, { 50, 15, 1.5}, 0, 6e9, RMa, O2ILH::LOW, -97.0, 1.0},
120 {{0, 0, 10.0}, {1000, 0, 1.5}, 0, 6e9, RMa, O2ILH::LOW, -110.0, 1.0},
121 {{0, 0, 25.0}, { 10, 0, 1.5}, 0, 6e9, UMa, O2ILH::LOW, -101.0, 5.0},
122 {{0, 0, 25.0}, { 100, 0, 1.5}, 0, 6e9, UMa, O2ILH::LOW, -125.0, 5.0},
123 {{0, 0, 10.0}, { 50, 15, 1.5}, 0, 6e9, UMa, O2ILH::LOW, -96.0, 1.0},
124 {{0, 0, 10.0}, {1000, 0, 1.5}, 0, 6e9, UMa, O2ILH::LOW, -117.0, 1.0},
125 {{0, 0, 10.0}, { 10, 0, 1.5}, 0, 6e9, UMi, O2ILH::LOW, -96.0, 5.0},
126 {{0, 0, 10.0}, { 100, 0, 1.5}, 0, 6e9, UMi, O2ILH::LOW, -127.0, 5.0},
127 {{0, 0, 10.0}, { 50, 15, 1.5}, 0, 6e9, UMi, O2ILH::LOW, -99.0, 1.0},
128 {{0, 0, 10.0}, {1000, 0, 1.5}, 0, 6e9, UMi, O2ILH::LOW, -119.0, 1.0},
130 {{0, 0, 35.0}, { 10, 0, 1.5}, 0, 6e9, RMa, O2ILH::HIGH, -93.0, 4.0},
131 {{0, 0, 35.0}, { 100, 0, 1.5}, 0, 6e9, RMa, O2ILH::HIGH, -112.0, 4.0},
132 {{0, 0, 10.0}, { 50, 15, 1.5}, 0, 6e9, RMa, O2ILH::HIGH, -97.0, 1.0},
133 {{0, 0, 10.0}, {1000, 0, 1.5}, 0, 6e9, RMa, O2ILH::HIGH, -110.0, 1.0},
134 {{0, 0, 25.0}, { 10, 0, 1.5}, 0, 6e9, UMa, O2ILH::HIGH, -101.0, 5.0},
135 {{0, 0, 25.0}, { 100, 0, 1.5}, 0, 6e9, UMa, O2ILH::HIGH, -125.0, 5.0},
136 {{0, 0, 10.0}, { 50, 15, 1.5}, 0, 6e9, UMa, O2ILH::HIGH, -96.0, 1.0},
137 {{0, 0, 10.0}, {1000, 0, 1.5}, 0, 6e9, UMa, O2ILH::HIGH, -117.0, 1.0},
138 {{0, 0, 10.0}, { 10, 0, 1.5}, 0, 6e9, UMi, O2ILH::HIGH, -95.0, 5.0},
139 {{0, 0, 10.0}, { 100, 0, 1.5}, 0, 6e9, UMi, O2ILH::HIGH, -127.0, 5.0},
140 {{0, 0, 10.0}, { 50, 15, 1.5}, 0, 6e9, UMi, O2ILH::HIGH, -99.0, 1.0},
141 {{0, 0, 10.0}, {1000, 0, 1.5}, 0, 6e9, UMi, O2ILH::HIGH, -119.0, 1.0},
143 {{0, 0, 35.0}, { 10, 0, 1.5}, 30, 6e9, RMa, O2ILH::HIGH, -94.0, 4.0},
144 {{0, 0, 35.0}, { 100, 0, 1.5}, 30, 6e9, RMa, O2ILH::HIGH, -112.0, 4.0},
145 {{0, 0, 10.0}, { 50, 15, 1.5}, 30, 6e9, RMa, O2ILH::HIGH, -106.0, 1.0},
146 {{0, 0, 10.0}, {1000, 0, 1.5}, 30, 6e9, RMa, O2ILH::HIGH, -119.0, 1.0},
147 {{0, 0, 25.0}, { 10, 0, 1.5}, 30, 6e9, UMa, O2ILH::HIGH, -101.0, 5.0},
148 {{0, 0, 25.0}, { 100, 0, 1.5}, 30, 6e9, UMa, O2ILH::HIGH, -125.0, 5.0},
149 {{0, 0, 10.0}, { 50, 15, 1.5}, 30, 6e9, UMa, O2ILH::HIGH, -105.0, 5.0},
150 {{0, 0, 10.0}, {1000, 0, 1.5}, 30, 6e9, UMa, O2ILH::HIGH, -126.0, 5.0},
151 {{0, 0, 10.0}, { 10, 0, 1.5}, 30, 6e9, UMi, O2ILH::HIGH, -95.0, 5.0},
152 {{0, 0, 10.0}, { 100, 0, 1.5}, 30, 6e9, UMi, O2ILH::HIGH, -127.0, 5.0},
153 {{0, 0, 10.0}, { 50, 15, 1.5}, 30, 6e9, UMi, O2ILH::HIGH, -108.0, 5.0},
154 {{0, 0, 10.0}, {1000, 0, 1.5}, 30, 6e9, UMi, O2ILH::HIGH, -128.0, 5.0},
156 {{0, 0, 35.0}, { 10, 0, 1.5}, 0, 5e9, RMa, O2ILH::HIGH, -97.0, 1.0},
157 {{0, 0, 35.0}, { 100, 0, 1.5}, 0, 5e9, RMa, O2ILH::HIGH, -115.0, 1.0},
158 {{0, 0, 10.0}, { 50, 15, 1.5}, 0, 5e9, RMa, O2ILH::HIGH, -96.0, 1.0},
159 {{0, 0, 10.0}, {1000, 0, 1.5}, 0, 5e9, RMa, O2ILH::HIGH, -108.0, 1.0},
160 {{0, 0, 25.0}, { 10, 0, 1.5}, 0, 5e9, UMa, O2ILH::HIGH, -108.0, 3.0},
161 {{0, 0, 25.0}, { 100, 0, 1.5}, 0, 5e9, UMa, O2ILH::HIGH, -132.0, 3.0},
162 {{0, 0, 10.0}, { 50, 15, 1.5}, 0, 5e9, UMa, O2ILH::HIGH, -94.0, 1.0},
163 {{0, 0, 10.0}, {1000, 0, 1.5}, 0, 5e9, UMa, O2ILH::HIGH, -117.0, 1.0},
164 {{0, 0, 10.0}, { 10, 0, 1.5}, 0, 5e9, UMi, O2ILH::HIGH, -103.0, 3.0},
165 {{0, 0, 10.0}, { 100, 0, 1.5}, 0, 5e9, UMi, O2ILH::HIGH, -134.0, 3.0},
166 {{0, 0, 10.0}, { 50, 15, 1.5}, 0, 5e9, UMi, O2ILH::HIGH, -98.0, 1.0},
167 {{0, 0, 10.0}, {1000, 0, 1.5}, 0, 5e9, UMi, O2ILH::HIGH, -119.0, 1.0},
169 {{0, 0, 35.0}, { 10, 0, 1.5}, 30, 5e9, RMa, O2ILH::HIGH, -97.0, 1.0},
170 {{0, 0, 35.0}, { 100, 0, 1.5}, 30, 5e9, RMa, O2ILH::HIGH, -115.0, 1.0},
171 {{0, 0, 10.0}, { 50, 15, 1.5}, 30, 5e9, RMa, O2ILH::HIGH, -104.0, 1.0},
172 {{0, 0, 10.0}, {1000, 0, 1.5}, 30, 5e9, RMa, O2ILH::HIGH, -117.0, 1.0},
173 {{0, 0, 25.0}, { 10, 0, 1.5}, 30, 5e9, UMa, O2ILH::HIGH, -108.0, 1.0},
174 {{0, 0, 25.0}, { 100, 0, 1.5}, 30, 5e9, UMa, O2ILH::HIGH, -132.0, 1.0},
175 {{0, 0, 10.0}, { 50, 15, 1.5}, 30, 5e9, UMa, O2ILH::HIGH, -104.0, 1.0},
176 {{0, 0, 10.0}, {1000, 0, 1.5}, 30, 5e9, UMa, O2ILH::HIGH, -126.0, 1.0},
177 {{0, 0, 10.0}, { 10, 0, 1.5}, 30, 5e9, UMi, O2ILH::HIGH, -102.0, 1.0},
178 {{0, 0, 10.0}, { 100, 0, 1.5}, 30, 5e9, UMi, O2ILH::HIGH, -134.0, 1.0},
179 {{0, 0, 10.0}, { 50, 15, 1.5}, 30, 5e9, UMi, O2ILH::HIGH, -106.0, 1.0},
180 {{0, 0, 10.0}, {1000, 0, 1.5}, 30, 5e9, UMi, O2ILH::HIGH, -128.0, 1.0},
191 building->SetNRoomsX(1);
192 building->SetNRoomsY(1);
193 building->SetNFloors(2);
194 building->SetBoundaries(
Box(0.0, 100.0, 0.0, 10.0, 0.0, 5.0));
206 nodes.Get(0)->AggregateObject(a);
207 nodes.Get(1)->AggregateObject(b);
211 a->AggregateObject(buildingInfoA);
212 buildingInfoA->MakeConsistent(a);
214 b->AggregateObject(buildingInfoB);
215 buildingInfoB->MakeConsistent(b);
221 a->SetPosition(testVector.m_positionA);
222 b->SetPosition(testVector.m_positionB);
223 bcv->SetVelocity({testVector.m_ueVelocity, 0, 0});
224 bool isAIndoor = buildingInfoA->IsIndoor();
225 bool isBIndoor = buildingInfoB->IsIndoor();
228 cond->SetO2iLowHighCondition(testVector.m_o2iLossType);
229 if (!isAIndoor && !isBIndoor)
238 propModelFactory.
SetTypeId(testVector.m_propModel);
245 std::vector<double> samples(10000);
246 for (
auto& sample : samples)
254 auto getMeanAndStddev = [](
const std::vector<double>& vec) {
256 double sum = std::accumulate(vec.begin(), vec.end(), 0.0);
257 double mean = sum / vec.size();
260 double sq_sum = std::inner_product(vec.begin(), vec.end(), vec.begin(), 0.0);
261 double stddev = std::sqrt((sq_sum / vec.size()) - mean * mean);
262 return std::make_pair(mean, stddev);
265 auto chi2 = [](std::vector<double>& vecTested,
266 std::vector<double>& vecReference) ->
const double {
267 std::sort(vecTested.begin(), vecTested.end());
268 std::sort(vecReference.begin(), vecReference.end());
270 for (std::size_t i = 0; i < vecTested.size(); ++i)
272 if (vecReference[i] == 0)
274 throw std::domain_error(
"Expected value at index " + std::to_string(i) +
277 double diff = vecTested[i] - vecReference[i];
278 chi2 += (diff * diff) / vecReference[i];
280 chi2 /= vecTested.size();
285 n->SetStdDev(testVector.m_expectedStddev);
286 n->SetAttribute(
"Mean",
DoubleValue(testVector.m_expectedMean));
287 std::vector<double> reference(10000);
288 std::transform(reference.begin(), reference.end(), reference.begin(), [n](
auto& a) {
289 return a = n->GetValue();
291 auto chi = chi2(samples, reference);
292 auto [mean, stddev] = getMeanAndStddev(samples);
296 << i <<
", expected mean=" << testVector.m_expectedMean
297 <<
" and stddev=" << testVector.m_expectedStddev
298 <<
", got mean=" << mean <<
" and stddev=" << stddev
299 <<
". Chi-squared is higher than threshold: " << chi);