Math comes from https://prod.sandia.gov/techlib-noauth/access-control.cgi/2008/086212.pdf (Pebay paper from Sandia labs, 2008)
| 151 | // Math comes from https://prod.sandia.gov/techlib-noauth/access-control.cgi/2008/086212.pdf |
| 152 | // (Pebay paper from Sandia labs, 2008) |
| 153 | bool 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 |