Skip to content

Commit db4d42e

Browse files
authored
Merge pull request #702 from beomki-yeo/record-convergence-iteration
Record the number of iterations from Ridders algorithm
2 parents c926d73 + 7ec89bd commit db4d42e

File tree

1 file changed

+35
-9
lines changed

1 file changed

+35
-9
lines changed

tests/integration_tests/cpu/propagator/jacobian_validation.cpp

+35-9
Original file line numberDiff line numberDiff line change
@@ -571,7 +571,9 @@ bound_track_parameters<transform3_type>::covariance_type directly_differentiate(
571571
const scalar detector_length, const field_t& field,
572572
const scalar overstep_tolerance, const scalar on_surface_tolerance,
573573
const scalar rk_tolerance, const scalar constraint_step,
574-
const std::array<scalar, 5u> hs, std::array<bool, 25>& convergence) {
574+
const std::array<scalar, 5u> hs,
575+
std::array<unsigned int, 5u>& num_iterations,
576+
std::array<bool, 25>& convergence) {
575577

576578
// Return Jacobian
577579
bound_covariance_type differentiated_jacobian;
@@ -610,6 +612,7 @@ bound_track_parameters<transform3_type>::covariance_type directly_differentiate(
610612
ridder.run(nvec1, nvec2, delta, p, i, differentiated_jacobian);
611613

612614
if (ridder.is_complete()) {
615+
num_iterations[i] = p;
613616
break;
614617
}
615618
}
@@ -684,6 +687,7 @@ void evaluate_jacobian_difference(
684687
std::ofstream& file, scalar& ref_rel_diff, bool use_field_gradient,
685688
bool do_inspect, const bool use_precal_values = false,
686689
[[maybe_unused]] bound_covariance_type precal_diff_jacobi = {},
690+
[[maybe_unused]] std::array<unsigned int, 5u> precal_num_iterations = {},
687691
[[maybe_unused]] std::array<bool, 25u> precal_convergence = {}) {
688692

689693
const auto phi0 = track.phi();
@@ -735,22 +739,29 @@ void evaluate_jacobian_difference(
735739
<< "," << final_param.phi() << "," << final_param.theta() << ","
736740
<< final_param.qop() << ",";
737741

738-
std::array<bool, 25u> convergence;
739742
bound_covariance_type differentiated_jacobian;
743+
std::array<unsigned int, 5u> num_iterations;
744+
std::array<bool, 25u> convergence;
740745

741746
if (use_precal_values) {
742-
convergence = precal_convergence;
743747
differentiated_jacobian = precal_diff_jacobi;
748+
num_iterations = precal_num_iterations;
749+
convergence = precal_convergence;
744750
} else {
745751
differentiated_jacobian = directly_differentiate<propagator_t, field_t>(
746752
trk_count, reference_param, det, detector_length, field,
747753
overstep_tolerance, on_surface_tolerance, rk_tolerance_dis,
748-
constraint_step, hs, convergence);
754+
constraint_step, hs, num_iterations, convergence);
749755
}
750756

751757
bool total_convergence =
752758
(std::count(convergence.begin(), convergence.end(), false) == 0);
753759

760+
// Ridders number of iterations
761+
for (unsigned int i = 0; i < 5u; i++) {
762+
file << num_iterations[i] << ",";
763+
}
764+
754765
// Convergence
755766
file << total_convergence << ",";
756767
for (unsigned int i = 0; i < 25u; i++) {
@@ -1098,7 +1109,7 @@ void evaluate_jacobian_difference_helix(
10981109
* ****************************/
10991110

11001111
bound_covariance_type differentiated_jacobian;
1101-
1112+
std::array<unsigned int, 5u> num_iterations;
11021113
std::array<bool, 25u> convergence;
11031114

11041115
for (unsigned int i = 0u; i < 5u; i++) {
@@ -1128,6 +1139,7 @@ void evaluate_jacobian_difference_helix(
11281139
ridder.run(nvec1, nvec2, delta, p, i, differentiated_jacobian);
11291140

11301141
if (ridder.is_complete()) {
1142+
num_iterations[i] = p;
11311143
break;
11321144
}
11331145
}
@@ -1151,6 +1163,11 @@ void evaluate_jacobian_difference_helix(
11511163
<< getter::element(bound_vec, e_bound_theta, 0u) << ","
11521164
<< getter::element(bound_vec, e_bound_qoverp, 0u) << ",";
11531165

1166+
// Ridders number of iterations
1167+
for (unsigned int i = 0; i < 5u; i++) {
1168+
file << num_iterations[i] << ",";
1169+
}
1170+
11541171
// Convergence
11551172
file << total_convergence << ",";
11561173
for (unsigned int i = 0; i < 25u; i++) {
@@ -1224,6 +1241,13 @@ void setup_csv_header_jacobian(std::ofstream& file) {
12241241
// Final Parameter at the destination surface
12251242
file << "l0_F,l1_F,phi_F,theta_F,qop_F,";
12261243

1244+
// Number of iterations to complete the numerical differentiation
1245+
file << "num_iterations_l0,"
1246+
<< "num_iterations_l1,"
1247+
<< "num_iterations_phi,"
1248+
<< "num_iterations_theta,"
1249+
<< "num_iterations_qop,";
1250+
12271251
// Convergence
12281252
file << "total_convergence,";
12291253
file << "dl0dl0_C,dl0dl1_C,dl0dphi_C,dl0dtheta_C,dl0dqop_C,";
@@ -1767,13 +1791,14 @@ int main(int argc, char** argv) {
17671791

17681792
if (rk_tolerance_iterate_mode) {
17691793

1794+
std::array<unsigned int, 5u> num_iterations;
17701795
std::array<bool, 25u> convergence;
17711796
auto differentiated_jacobian =
17721797
directly_differentiate<inhom_field_rect_propagator_t>(
17731798
track_count, rect_bparam, rect_det_w_mat,
17741799
detector_length, inhom_bfield, overstep_tol,
17751800
on_surface_tol, rk_tol_dis, constraint_step_size,
1776-
h_sizes_rect, convergence);
1801+
h_sizes_rect, num_iterations, convergence);
17771802

17781803
for (std::size_t i = 0u; i < log10_tols.size(); i++) {
17791804

@@ -1784,7 +1809,7 @@ int main(int argc, char** argv) {
17841809
std::pow(10.f, log10_tols[i]), rk_tol_dis,
17851810
constraint_step_size, h_sizes_rect, rect_files[i],
17861811
ref_rel_diff, true, do_inspect, true,
1787-
differentiated_jacobian, convergence);
1812+
differentiated_jacobian, num_iterations, convergence);
17881813

17891814
dqopdqop_rel_diffs_rect[i].push_back(ref_rel_diff);
17901815
}
@@ -1848,13 +1873,14 @@ int main(int argc, char** argv) {
18481873

18491874
if (rk_tolerance_iterate_mode) {
18501875

1876+
std::array<unsigned int, 5u> num_iterations;
18511877
std::array<bool, 25u> convergence;
18521878
auto differentiated_jacobian =
18531879
directly_differentiate<inhom_field_wire_propagator_t>(
18541880
track_count, wire_bparam, wire_det_w_mat,
18551881
detector_length, inhom_bfield, overstep_tol,
18561882
on_surface_tol, rk_tol_dis, constraint_step_size,
1857-
h_sizes_wire, convergence);
1883+
h_sizes_wire, num_iterations, convergence);
18581884

18591885
for (std::size_t i = 0u; i < log10_tols.size(); i++) {
18601886
// Wire Inhomogeneous field with Material
@@ -1864,7 +1890,7 @@ int main(int argc, char** argv) {
18641890
std::pow(10.f, log10_tols[i]), rk_tol_dis,
18651891
constraint_step_size, h_sizes_wire, wire_files[i],
18661892
ref_rel_diff, true, do_inspect, true,
1867-
differentiated_jacobian, convergence);
1893+
differentiated_jacobian, num_iterations, convergence);
18681894

18691895
dqopdqop_rel_diffs_wire[i].push_back(ref_rel_diff);
18701896
}

0 commit comments

Comments
 (0)