100 const IndexType* processed_samples_indices,
102 const DataType confidence_level,
103 const DataType error_atol,
104 const DataType error_rtol,
115 if (num_processed_samples < min_num_samples)
118 for (j=0; j < num_inquiries; j++)
122 num_samples_used[j] = num_processed_samples;
125 return all_converged;
133 DataType mean_discrepancy;
137 DataType standard_z_score = std::sqrt(2) * \
138 static_cast<DataType>(
erf_inv(
static_cast<double>(confidence_level)));
141 for (j=0; j < num_inquiries; ++j)
144 if (converged[j] == 0)
148 for (i=0; i < num_processed_samples; ++i)
150 summand += samples[processed_samples_indices[i]][j];
152 mean = summand / num_processed_samples;
157 for (i=0; i < num_processed_samples; ++i)
159 summand += std::abs(samples[processed_samples_indices[i]][j]);
161 mean_abs = summand / num_processed_samples;
173 if (num_processed_samples > 1)
176 for (i=0; i < num_processed_samples; ++i)
178 data = samples[processed_samples_indices[i]][j];
179 mean_discrepancy = data - mean;
185 mean_discrepancy /= mean_abs;
187 summand += mean_discrepancy * mean_discrepancy;
189 std = std::sqrt(summand / (num_processed_samples - 1.0));
200 error[j] = standard_z_score * std / \
201 std::sqrt(num_processed_samples);
204 if (error[j] < std::max(error_atol, error_rtol*mean))
210 num_samples_used[j] = num_processed_samples;
216 for (j=0; j < num_inquiries; ++j)
218 if (converged[j] == 0)
226 return all_converged;
290 const DataType confidence_level,
291 const DataType outlier_significance_level,
295 const IndexType* processed_samples_indices,
307 DataType mean_discrepancy;
308 DataType outlier_half_interval;
314 DataType error_z_score = std::sqrt(2) *
erf_inv(confidence_level);
317 DataType outlier_confidence_level = 1.0 - outlier_significance_level;
320 DataType outlier_z_score = std::sqrt(2.0) * \
321 erf_inv(outlier_confidence_level);
323 for (j=0; j < num_inquiries; ++j)
326 for (i=0; i < max_num_samples; ++i)
328 outlier_indices[i] = 0;
334 for (i=0; i < num_samples_used[j]; ++i)
336 summand += samples[processed_samples_indices[i]][j];
338 mean = summand / num_samples_used[j];
342 for (i=0; i < num_samples_used[j]; ++i)
344 summand += std::abs(samples[processed_samples_indices[i]][j]);
346 mean_abs = summand / num_samples_used[j];
358 if (num_samples_used[j] > 1)
361 for (i=0; i < num_samples_used[j]; ++i)
364 samples[processed_samples_indices[i]][j] - mean;
369 mean_discrepancy /= mean_abs;
371 summand += mean_discrepancy * mean_discrepancy;
373 std = std::sqrt(summand / (num_samples_used[j] - 1.0));
384 outlier_half_interval = outlier_z_score * std;
387 for (i=0; i < num_samples_used[j]; ++i)
389 mean_discrepancy = samples[processed_samples_indices[i]][j] - mean;
390 if (std::abs(mean_discrepancy) > outlier_half_interval)
393 outlier_indices[i] = 1;
394 num_outliers[j] += 1;
400 for (i=0; i < num_samples_used[j]; ++i)
402 if (outlier_indices[i] == 0)
404 summand += samples[processed_samples_indices[i]][j];
407 mean = summand / (num_samples_used[j] - num_outliers[j]);
410 if (num_samples_used[j] > 1 + num_outliers[j])
413 for (i=0; i < num_samples_used[j]; ++i)
415 if (outlier_indices[i] == 0)
418 samples[processed_samples_indices[i]][j] - mean;
423 mean_discrepancy /= mean_abs;
425 summand += mean_discrepancy * mean_discrepancy;
429 summand/(num_samples_used[j] - num_outliers[j] - 1.0));
441 error[j] = error_z_score * std / \
442 std::sqrt(num_samples_used[j] - num_outliers[j]);
445 delete[] outlier_indices;