MCPcopy Create free account
hub / github.com/PDAL/PDAL / merge

Method merge

filters/StatsFilter.cpp:153–192  ·  view source on GitHub ↗

Math comes from https://prod.sandia.gov/techlib-noauth/access-control.cgi/2008/086212.pdf (Pebay paper from Sandia labs, 2008)

Source from the content-addressed store, hash-verified

151// Math comes from https://prod.sandia.gov/techlib-noauth/access-control.cgi/2008/086212.pdf
152// (Pebay paper from Sandia labs, 2008)
153bool Summary::merge(const Summary& s)
154{
155 if ((m_name != s.m_name) || (m_enumerate != s.m_enumerate) || (m_advanced != s.m_advanced))
156 return false;
157
158 double n1 = (double)m_cnt;
159 double n2 = (double)s.m_cnt;
160 double n = n1 + n2;
161 double nsq = n * n;
162 double n1n2 = n1 * n2;
163 double n1sq = n1 * n1;
164 double n2sq = n2 * n2;
165 double ncube = n * n * n;
166 double deltaMean = s.M1 - M1;
167
168 if (n == 0)
169 return true;
170
171 double m1 = M1 + s.m_cnt * deltaMean / n;
172 double m2 = M2 + s.M2 + n1n2 * std::pow(deltaMean, 2) / n;
173 double m3 = M3 + s.M3 + n1n2 * (n1 - n2) * std::pow(deltaMean, 3) / nsq +
174 3 * (n1 * s.M2 - n2 * M2) * deltaMean / n;
175 double m4 = M4 + s.M4 +
176 n1n2 * (n1sq - n1n2 + n2sq) * std::pow(deltaMean, 4) / ncube +
177 6 * (n1sq * s.M2 + n2sq * M2) * std::pow(deltaMean, 2) / nsq +
178 4 * (n1 * s.M3 - n2 * M3) * deltaMean / n;
179
180 M1 = m1;
181 M2 = m2;
182 M3 = m3;
183 M4 = m4;
184 m_min = (std::min)(m_min, s.m_min);
185 m_max = (std::max)(m_max, s.m_max);
186 m_cnt = s.m_cnt + m_cnt;
187 m_data.insert(m_data.begin(), s.m_data.begin(), s.m_data.end());
188 for (auto p : s.m_values)
189 m_values[p.first] += p.second;
190
191 return true;
192}
193
194} // namespace stats
195

Callers 1

TESTFunction · 0.45

Calls 3

insertMethod · 0.45
beginMethod · 0.45
endMethod · 0.45

Tested by 1

TESTFunction · 0.36